Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/client/gl/gtk3/gl_client_window.py : 64%
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.
7from collections import namedtuple
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
14log = Logger("opengl", "window")
16Rectangle = namedtuple("Rectangle", "x,y,width,height")
17DrawEvent = namedtuple("DrawEvent", "area")
20class GLClientWindowBase(GTK3ClientWindow):
22 def __repr__(self):
23 return "GLClientWindow(%s : %s)" % (self._id, self._backing)
25 def get_backing_class(self):
26 raise NotImplementedError()
28 def is_GL(self):
29 return True
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)
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
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)
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")
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
84 def destroy(self):
85 self.remove_backing()
86 super().destroy()
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)
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