Support regex based window matching.

This commit is contained in:
2022-07-24 11:44:18 -04:00
parent 9965ef273f
commit f9d91b4053
3 changed files with 30 additions and 5 deletions

View File

@@ -11,6 +11,9 @@ class Block(BaseModel):
kill: bool = False kill: bool = False
delay: int = 0 delay: int = 0
class Config:
extra = 'forbid'
class Config(BaseModel): class Config(BaseModel):
blackblocks: List[Block] blackblocks: List[Block]
@@ -38,3 +41,6 @@ class State(BaseModel):
active_blackblocks: List[Block] = [] active_blackblocks: List[Block] = []
active_whiteblocks: List[Block] = [] active_whiteblocks: List[Block] = []
inactive_blackblocks: List[Block] = [] inactive_blackblocks: List[Block] = []
class Config:
extra = 'forbid'

View File

@@ -1,7 +1,8 @@
import logging import logging
import os import os
import sys
import pwd import pwd
import re
import sys
import antidrift.xwindow as xwindow import antidrift.xwindow as xwindow
from antidrift.config import Config, State, Block from antidrift.config import Config, State, Block
from gi.repository import GLib, Gio from gi.repository import GLib, Gio
@@ -175,14 +176,32 @@ def window_is_blocked(state: State, silent: bool = False) -> bool:
window = xwindow.XWindow() window = xwindow.XWindow()
if not window.keywords: if not window.keywords:
return False return False
def keyword_matches_window(keyword: str, window: xwindow.XWindow):
if keyword.startswith('/') and keyword.endswith('/'):
try:
r = re.compile(keyword[1:-1], re.IGNORECASE)
if r.findall(window.name):
return True
else:
return False
except re.error:
m = f'Invalid regex [red3]{keyword}[/red3].'
logging.warning(m)
return False
else:
if k in window.keywords:
return True
return False
for b in blackblocks: for b in blackblocks:
for k in b.keywords: for k in b.keywords:
if k in window.keywords and b.kill: if keyword_matches_window(k, window) and b.kill:
window.kill() window.kill()
xwindow.notify(f"Kill for {k} on {b.name}.") xwindow.notify(f"Kill for {k} on {b.name}.")
logging.warning(f"Kill for [red]{k}[/red] on [red]{b.name}[/red].") logging.warning(f"Kill for [red]{k}[/red] on [red]{b.name}[/red].")
return True return True
elif k in window.keywords: elif keyword_matches_window(k, window):
if not silent: if not silent:
xwindow.notify(f"{window.name[:30]} blocked by {b.name}.") xwindow.notify(f"{window.name[:30]} blocked by {b.name}.")
logging.warning(f"[red]{window.name[:50]}[/red] " logging.warning(f"[red]{window.name[:50]}[/red] "
@@ -194,7 +213,7 @@ def window_is_blocked(state: State, silent: bool = False) -> bool:
return False return False
for w in whiteblocks: for w in whiteblocks:
for k in w.keywords: for k in w.keywords:
if k in window.keywords: if keyword_matches_window(k, window):
if not silent: if not silent:
logging.debug(f"[pale_green3]{window.name[:30]}[/pale_green3] " logging.debug(f"[pale_green3]{window.name[:30]}[/pale_green3] "
f"allowed by [sky_blue3]{w.name}[/sky_blue3].") f"allowed by [sky_blue3]{w.name}[/sky_blue3].")

View File

@@ -32,7 +32,7 @@ class XWindow:
self._run(["windowquit", self.window]) self._run(["windowquit", self.window])
def kill(self): def kill(self):
self._run(["windowclose", self.window]) self._run(["windowkill", self.window])
def notify(message: str) -> None: def notify(message: str) -> None: