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# This file is part of Xpra. 

2# Copyright (C) 2012 Serviware (Arthur Huillet, <ahuillet@serviware.com>) 

3# Copyright (C) 2012-2020 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 collections import namedtuple 

8 

9from xpra.client.gtk3.gtk3_client_window import GTK3ClientWindow 

10from xpra.gtk_common.gtk_util import set_visual 

11from xpra.util import typedict 

12from xpra.log import Logger 

13 

14log = Logger("opengl", "window") 

15 

16Rectangle = namedtuple("Rectangle", "x,y,width,height") 

17DrawEvent = namedtuple("DrawEvent", "area") 

18 

19 

20class GLClientWindowBase(GTK3ClientWindow): 

21 

22 def __repr__(self): 

23 return "GLClientWindow(%s : %s)" % (self._id, self._backing) 

24 

25 def get_backing_class(self): 

26 raise NotImplementedError() 

27 

28 def is_GL(self): 

29 return True 

30 

31 def spinner(self, ok): 

32 b = self._backing 

33 log("spinner(%s) opengl window %s: backing=%s", ok, self._id, b) 

34 if not b: 

35 return 

36 b.paint_spinner = self.can_have_spinner() and not ok 

37 log("spinner(%s) backing=%s, paint_screen=%s, paint_spinner=%s", ok, b._backing, b.paint_screen, b.paint_spinner) 

38 if b._backing and b.paint_screen: 

39 w, h = self.get_size() 

40 self.repaint(0, 0, w, h) 

41 

42 

43 def remove_backing(self): 

44 b = self._backing 

45 if b: 

46 self._backing = None 

47 b.paint_screen = False 

48 b.close() 

49 glarea = b._backing 

50 if glarea: 

51 try: 

52 self.remove(glarea) 

53 except: 

54 pass 

55 

56 def magic_key(self, *args): 

57 b = self._backing 

58 if self.border: 

59 self.border.toggle() 

60 if b: 

61 with b.gl_context(): 

62 b.gl_init() 

63 b.present_fbo(0, 0, *b.size) 

64 self.repaint(0, 0, *self._size) 

65 log("gl magic_key%s border=%s, backing=%s", args, self.border, b) 

66 

67 

68 def set_alpha(self): 

69 GTK3ClientWindow.set_alpha(self) 

70 rgb_formats = self._client_properties.setdefault("encodings.rgb_formats", []) 

71 #gl_window_backing supports BGR(A) too: 

72 if "RGBA" in rgb_formats: 

73 rgb_formats.append("BGRA") 

74 if "RGB" in rgb_formats: 

75 rgb_formats.append("BGR") 

76 #TODO: we could handle BGRX as BGRA too... 

77 #rgb_formats.append("BGRX") 

78 

79 def do_configure_event(self, event): 

80 log("GL do_configure_event(%s)", event) 

81 GTK3ClientWindow.do_configure_event(self, event) 

82 self._backing.paint_screen = True 

83 

84 def destroy(self): 

85 self.remove_backing() 

86 super().destroy() 

87 

88 def new_backing(self, bw, bh): 

89 widget = super().new_backing(bw, bh) 

90 if self.drawing_area: 

91 self.remove(self.drawing_area) 

92 set_visual(widget, self._has_alpha) 

93 widget.show() 

94 self.init_widget_events(widget) 

95 if self.drawing_area and self.size_constraints: 

96 #apply min size to the drawing_area: 

97 thints = typedict(self.size_constraints) 

98 minsize = thints.intpair("minimum-size", (0, 0)) 

99 self.drawing_area.set_size_request(*minsize) 

100 self.add(widget) 

101 self.drawing_area = widget 

102 #maybe redundant?: 

103 self.apply_geometry_hints(self.geometry_hints) 

104 

105 def draw_widget(self, widget, context): 

106 log("draw_widget(%s, %s)", widget, context) 

107 if not self.get_mapped(): 

108 return False 

109 backing = self._backing 

110 if not backing: 

111 return False 

112 backing.draw_fbo(context) 

113 return True