Support regex based window matching.

This commit is contained in:
Felix Martin 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
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'

View File

@ -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].")

View File

@ -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: