Hide keyboard shortcuts

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. 

6 

7from xpra.log import Logger 

8log = Logger("filters") 

9 

10 

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 

16 

17 def get_window(self, window): 

18 return window 

19 

20 def get_window_value(self, window): 

21 return window.get_property(self.property_name) 

22 

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 

35 

36 def evaluate(self, window_value): 

37 raise NotImplementedError() 

38 

39 

40class WindowPropertyIn(WindowPropertyFilter): 

41 

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 

48 

49 def __repr__(self): 

50 return "WindowPropertyIn(%s=%s, recurse=%s)" % (self.property_name, self.value, self.recurse) 

51 

52 

53class WindowPropertyNotIn(WindowPropertyIn): 

54 

55 def evaluate(self, window_value): 

56 return not(super().evaluate(window_value)) 

57 

58 def __repr__(self): 

59 return "WindowPropertyNotIn(%s=%s, recurse=%s)" % (self.property_name, self.value, self.recurse) 

60 

61 

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