diff options
-rw-r--r-- | xlib.py | 33 |
1 files changed, 25 insertions, 8 deletions
@@ -34,6 +34,7 @@ class Listener(Thread): self.NET_WM_NAME = self.disp.intern_atom('_NET_WM_NAME')
self.WM_CLASS = self.disp.intern_atom('WM_CLASS')
+ self.WM_NAME = self.disp.intern_atom('WM_NAME')
self.NET_ACTIVE_WINDOW = self.disp.intern_atom('_NET_ACTIVE_WINDOW')
component.handle(Debug("Waiting for xlib event"))
self.running = True
@@ -45,18 +46,29 @@ class Listener(Thread): component.handle(Debug( str(e) ))
print(e)
- def handle_event(self, root, event):
+ def get_property_value(self, window, property_):
+ """ Return the requested property for the given window, or None if the
+ property is not defined. """
+ prop_name = window.get_full_property(property_, 0)
+ if prop_name is not None:
+ return str(prop_name.value).lower()
+ return None
+
+
+ def handle_event(self, root, _event):
try:
- window_id_property = root.get_full_property(self.NET_ACTIVE_WINDOW, Xlib.X.AnyPropertyType)
+ window_id_property = root.get_full_property(
+ self.NET_ACTIVE_WINDOW,
+ Xlib.X.AnyPropertyType
+ )
if window_id_property is None:
return
window_id = window_id_property.value[0]
window = self.disp.create_resource_object('window', window_id)
- window_prop = window.get_full_property(self.NET_WM_NAME, 0)
- if window_prop is None:
- return
- window_name = str(window_prop.value).lower()
- class_name = str(window.get_full_property(self.WM_CLASS, 0).value).lower()
+
+ window_name = self.get_property_value(window, self.NET_WM_NAME) \
+ or self.get_property_value(window, self.WM_NAME)
+ class_name = self.get_property_value(window, self.WM_CLASS)
except Xlib.error.XError:
return
@@ -73,7 +85,8 @@ class Listener(Thread): # Ignore the default layout
if pattern == "default":
continue
- if not (pattern.lstrip() in window_name or pattern.lstrip() in class_name):
+ if not ((window_name is not None and pattern.lstrip() in window_name)
+ or (class_name is not None and pattern.lstrip() in class_name)):
continue
code = self.mapping[pattern]
# We found something. At this point, even if we do not update
@@ -89,6 +102,8 @@ class Listener(Thread): # same as the current one, we break the loop in order to
# prevent another layer to update.
break
+ if not found:
+ print(f"Mapping '{window_name}' / '{class_name}' to default")
if not found and self.last_code != "default":
default = self.mapping.get("default", None)
if default is None:
@@ -99,4 +114,6 @@ class Listener(Thread): def stop(self) -> None:
+ """ Stop the thread properly.
+ """
self.running = False
|