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) 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. 

5 

6import sys 

7from gi.repository import GLib, Gtk, Gdk 

8 

9from xpra.client.gl.gl_window_backing_base import GLWindowBackingBase 

10from xpra.platform.gl_context import GLContext 

11from xpra.log import Logger 

12 

13if not GLContext: 

14 raise ImportError("no OpenGL context implementation for %s" % sys.platform) 

15 

16log = Logger("opengl", "paint") 

17 

18 

19class GLDrawingArea(GLWindowBackingBase): 

20 

21 def __repr__(self): 

22 return "GLDrawingArea(%s, %s, %s)" % (self.wid, self.size, self.pixel_format) 

23 

24 def idle_add(self, *args, **kwargs): 

25 GLib.idle_add(*args, **kwargs) 

26 

27 def init_gl_config(self): 

28 self.context = GLContext(self._alpha_enabled) #pylint: disable=not-callable 

29 self.window_context = None 

30 

31 def is_double_buffered(self): 

32 return self.context.is_double_buffered() 

33 

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 

44 

45 def get_bit_depth(self, pixel_depth=0): 

46 return pixel_depth or self.context.get_bit_depth() or 24 

47 

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 

56 

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 

65 

66 def close_gl_config(self): 

67 c = self.context 

68 if c: 

69 self.context = None 

70 c.destroy() 

71 

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)