Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/server/window/filters.py : 30%
Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2# This file is part of Xpra.
3# Copyright (C) 2010-2018 Antoine Martin <antoine@xpra.org>
4# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
5# later version. See the file COPYING for details.
7from xpra.log import Logger
8log = Logger("filters")
11class WindowPropertyFilter:
12 def __init__(self, property_name, value, recurse=False):
13 self.property_name = property_name
14 self.value = value
15 self.recurse = recurse
17 def get_window(self, window):
18 return window
20 def get_window_value(self, window):
21 return window.get_property(self.property_name)
23 def matches(self, window):
24 try:
25 w = self.get_window(window)
26 log("get_window(%s)=%s", window, w)
27 v = self.get_window_value(w)
28 log("%s.matches(%s) %s(..)=%s", self, w, self.get_window_value, v)
29 except Exception:
30 log("%s.matches(%s) %s(..) error:", self, w, self.get_window_value, exc_info=True)
31 return False
32 e = self.evaluate(v)
33 log("%s.evaluate(%s)=%s (window(%s)=%s)", self, v, e, window, w)
34 return e
36 def evaluate(self, window_value):
37 raise NotImplementedError()
40class WindowPropertyIn(WindowPropertyFilter):
42 def evaluate(self, window_value):
43 vtypes = set([type(x) for x in self.value])
44 if len(vtypes)==1 and list(vtypes)[0]==str:
45 #coerce value to match:
46 window_value = str(window_value)
47 return window_value in self.value
49 def __repr__(self):
50 return "WindowPropertyIn(%s=%s, recurse=%s)" % (self.property_name, self.value, self.recurse)
53class WindowPropertyNotIn(WindowPropertyIn):
55 def evaluate(self, window_value):
56 return not(super().evaluate(window_value))
58 def __repr__(self):
59 return "WindowPropertyNotIn(%s=%s, recurse=%s)" % (self.property_name, self.value, self.recurse)
62def get_window_filter(object_name, property_name, operator, value):
63 oname = object_name.lower()
64 if oname not in ("window", "window-parent"):
65 raise ValueError("invalid object name '%s'" % object_name)
66 recurse = oname=="window-parent"
67 if operator=="=":
68 window_filter = WindowPropertyIn(property_name, [value], recurse)
69 elif operator=="!=":
70 window_filter = WindowPropertyNotIn(property_name, [value], recurse)
71 else:
72 raise ValueError("invalid window filter operator: %s" % operator)
73 log("get_window_filter%s=%s", (object_name, property_name, operator, value), window_filter)
74 return window_filter