Support regex based window matching.
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -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].")
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user