Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/client/gl/gtk3/gl_drawing_area.py : 94%
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) 2017 Antoine Martin <antoine@xpra.org>
3# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
4# later version. See the file COPYING for details.
6import sys
7from gi.repository import GLib, Gtk, Gdk
9from xpra.client.gl.gl_window_backing_base import GLWindowBackingBase
10from xpra.platform.gl_context import GLContext
11from xpra.log import Logger
13if not GLContext:
14 raise ImportError("no OpenGL context implementation for %s" % sys.platform)
16log = Logger("opengl", "paint")
19class GLDrawingArea(GLWindowBackingBase):
21 def __repr__(self):
22 return "GLDrawingArea(%s, %s, %s)" % (self.wid, self.size, self.pixel_format)
24 def idle_add(self, *args, **kwargs):
25 GLib.idle_add(*args, **kwargs)
27 def init_gl_config(self):
28 self.context = GLContext(self._alpha_enabled) #pylint: disable=not-callable
29 self.window_context = None
31 def is_double_buffered(self):
32 return self.context.is_double_buffered()
34 def init_backing(self):
35 da = Gtk.DrawingArea()
36 #da.connect('configure_event', self.on_configure_event)
37 #da.connect('draw', self.on_draw)
38 #double-buffering is enabled by default anyway, so this is redundant:
39 #da.set_double_buffered(True)
40 da.set_size_request(*self.size)
41 da.set_events(da.get_events() | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_HINT_MASK)
42 da.show()
43 self._backing = da
45 def get_bit_depth(self, pixel_depth=0):
46 return pixel_depth or self.context.get_bit_depth() or 24
48 def gl_context(self):
49 b = self._backing
50 if not b:
51 return None
52 gdk_window = b.get_window()
53 assert gdk_window
54 self.window_context = self.context.get_paint_context(gdk_window)
55 return self.window_context
57 def do_gl_show(self, rect_count):
58 if self.is_double_buffered():
59 # Show the backbuffer on screen
60 log("%s.do_gl_show(%s) swapping buffers now", rect_count, self)
61 self.window_context.swap_buffers()
62 else:
63 #glFlush was enough
64 pass
66 def close_gl_config(self):
67 c = self.context
68 if c:
69 self.context = None
70 c.destroy()
72 def draw_fbo(self, _context):
73 w, h = self.size
74 with self.gl_context():
75 self.gl_init()
76 self.present_fbo(0, 0, w, h)