Support regex based window matching.
This commit is contained in:
parent
9965ef273f
commit
f9d91b4053
@ -11,6 +11,9 @@ class Block(BaseModel):
|
||||
kill: bool = False
|
||||
delay: int = 0
|
||||
|
||||
class Config:
|
||||
extra = 'forbid'
|
||||
|
||||
|
||||
class Config(BaseModel):
|
||||
blackblocks: List[Block]
|
||||
@ -38,3 +41,6 @@ class State(BaseModel):
|
||||
active_blackblocks: List[Block] = []
|
||||
active_whiteblocks: List[Block] = []
|
||||
inactive_blackblocks: List[Block] = []
|
||||
|
||||
class Config:
|
||||
extra = 'forbid'
|
||||
|
@ -1,7 +1,8 @@
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import pwd
|
||||
import re
|
||||
import sys
|
||||
import antidrift.xwindow as xwindow
|
||||
from antidrift.config import Config, State, Block
|
||||
from gi.repository import GLib, Gio
|
||||
@ -175,14 +176,32 @@ def window_is_blocked(state: State, silent: bool = False) -> bool:
|
||||
window = xwindow.XWindow()
|
||||
if not window.keywords:
|
||||
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 k in b.keywords:
|
||||
if k in window.keywords and b.kill:
|
||||
if keyword_matches_window(k, window) and b.kill:
|
||||
window.kill()
|
||||
xwindow.notify(f"Kill for {k} on {b.name}.")
|
||||
logging.warning(f"Kill for [red]{k}[/red] on [red]{b.name}[/red].")
|
||||
return True
|
||||
elif k in window.keywords:
|
||||
elif keyword_matches_window(k, window):
|
||||
if not silent:
|
||||
xwindow.notify(f"{window.name[:30]} blocked by {b.name}.")
|
||||
logging.warning(f"[red]{window.name[:50]}[/red] "
|
||||
@ -194,7 +213,7 @@ def window_is_blocked(state: State, silent: bool = False) -> bool:
|
||||
return False
|
||||
for w in whiteblocks:
|
||||
for k in w.keywords:
|
||||
if k in window.keywords:
|
||||
if keyword_matches_window(k, window):
|
||||
if not silent:
|
||||
logging.debug(f"[pale_green3]{window.name[:30]}[/pale_green3] "
|
||||
f"allowed by [sky_blue3]{w.name}[/sky_blue3].")
|
||||
|
@ -32,7 +32,7 @@ class XWindow:
|
||||
self._run(["windowquit", self.window])
|
||||
|
||||
def kill(self):
|
||||
self._run(["windowclose", self.window])
|
||||
self._run(["windowkill", self.window])
|
||||
|
||||
|
||||
def notify(message: str) -> None:
|
||||
|
Loading…
Reference in New Issue
Block a user