From 747e75bb9124f0f133a260c35036d2df17830cf0 Mon Sep 17 00:00:00 2001 From: C. Scott Ananian Date: Thu, 03 Nov 2011 22:48:37 +0000 Subject: GTK3 fixes for tawindow.py --- diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index f79bfe1..0c0d490 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -87,7 +87,10 @@ class TurtleArtWindow(): if type(canvas_window) == Gtk.DrawingArea: self.interactive_mode = True self.window = canvas_window - self.window.set_flags(Gtk.CAN_FOCUS) + if hasattr(self.window, 'set_can_focus'): + self.window.set_can_focus(True) # GTK3/GTK2 + else: + self.window.set_flags(Gtk.CAN_FOCUS) # before GTK2.22 self.window.show_all() if self.parent is not None: self.parent.show_all() @@ -347,7 +350,10 @@ class TurtleArtWindow(): self.window.add_events(Gdk.EventMask.POINTER_MOTION_MASK) self.window.add_events(Gdk.EventMask.KEY_PRESS_MASK) # self.window.connect('realize', self.do_realize) - self.window.connect("expose-event", self._expose_cb) + try: + self.window.connect("draw", self._draw_cb) # GTK3 + except: + self.window.connect("expose-event", self._expose_cb) # GTK2 self.window.connect("button-press-event", self._buttonpress_cb) self.window.connect("button-release-event", self._buttonrelease_cb) self.window.connect("motion-notify-event", self._move_cb) @@ -409,12 +415,27 @@ class TurtleArtWindow(): return len(self.just_blocks()) == 1 def _expose_cb(self, win=None, event=None): - """ Repaint """ + """ Repaint (GTK2) """ self.do_expose_event(event) return True + def _draw_cb(self, win=None, cr=None): + """ Repaint (GTK3) """ + self.do_draw_event(cr) + return True + + def do_draw_event(self, cr): + # GTK3 draw event has properly clipped cairo context already + if self.turtle_canvas is not None: + cr.set_source_surface(self.turtle_canvas) + cr.paint() + + # Refresh sprite list + self.sprite_list.redraw_sprites(cr=cr) + # Handle the expose-event by drawing def do_expose_event(self, event=None): + # for GTK2 expose event we need to create cairo context & clip it # Create the cairo context cr = self.window.window.cairo_create() @@ -428,12 +449,7 @@ class TurtleArtWindow(): event.area.width, event.area.height) cr.clip() - if self.turtle_canvas is not None: - cr.set_source_surface(self.turtle_canvas) - cr.paint() - - # Refresh sprite list - self.sprite_list.redraw_sprites(cr=cr) + self.do_draw_event(cr) def eraser_button(self): """ Eraser_button (hide status block when clearing the screen.) """ -- cgit v0.9.1