@@ -20,7 +20,7 @@ def fn_name(): return sys._getframe(1).f_code.co_name
2020from matplotlib ._pylab_helpers import Gcf
2121from matplotlib .backend_bases import RendererBase , GraphicsContextBase , \
2222 FigureManagerBase , FigureCanvasBase , NavigationToolbar2 , cursors
23- from matplotlib .backends .backend_gdk import RendererGDK
23+ from matplotlib .backends .backend_gdk import RendererGDK , FigureCanvasGDK
2424from matplotlib .cbook import is_string_like , enumerate
2525from matplotlib .figure import Figure
2626from matplotlib .font_manager import fontManager
@@ -91,7 +91,7 @@ def new_figure_manager(num, *args, **kwargs):
9191 return manager
9292
9393
94- class FigureCanvasGTK (gtk .DrawingArea , FigureCanvasBase ):
94+ class FigureCanvasGTK (gtk .DrawingArea , FigureCanvasBase ):
9595 keyvald = {65507 : 'control' ,
9696 65505 : 'shift' ,
9797 65513 : 'alt' ,
@@ -104,7 +104,6 @@ class FigureCanvasGTK(gtk.DrawingArea, FigureCanvasBase):
104104 65364 : 'down' ,
105105 }
106106
107-
108107 def __init__ (self , figure ):
109108 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
110109 FigureCanvasBase .__init__ (self , figure )
@@ -148,29 +147,34 @@ def button_press_event(self, widget, event):
148147 # flipy so y=0 is bottom of canvas
149148 y = self .figure .bbox .height () - event .y
150149 FigureCanvasBase .button_press_event (self , x , y , event .button )
151- #return True
152- return False
150+
151+ return False # finish event propagation?
153152
154153 def button_release_event (self , widget , event ):
155154 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
156155 x = event .x
157156 # flipy so y=0 is bottom of canvas
158157 y = self .figure .bbox .height () - event .y
159158 FigureCanvasBase .button_release_event (self , x , y , event .button )
160- return True
159+
160+ return False # finish event propagation?
161161
162162 def key_press_event (self , widget , event ):
163163 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
164164 key = self ._get_key (event )
165165 if _debug : print "hit" , key
166166 FigureCanvasBase .key_press_event (self , key )
167167
168+ return False # finish event propagation?
169+
168170 def key_release_event (self , widget , event ):
169171 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
170172 key = self ._get_key (event )
171173 if _debug : print "release" , key
172174 FigureCanvasBase .key_release_event (self , key )
173175
176+ return False # finish event propagation?
177+
174178 def motion_notify_event (self , widget , event ):
175179 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
176180 if event .is_hint :
@@ -185,8 +189,9 @@ def motion_notify_event(self, widget, event):
185189
186190 if state :
187191 FigureCanvasBase .motion_notify_event (self , x , y )
188- return True
189192
193+ return False # finish event propagation?
194+
190195 def _get_key (self , event ):
191196 if self .keyvald .has_key (event .keyval ):
192197 key = self .keyvald [event .keyval ]
@@ -214,7 +219,7 @@ def configure_event(self, widget, event):
214219 self .figure .set_figsize_inches (w / dpi , h / dpi )
215220
216221 self ._need_redraw = True
217- return True
222+ return False # finish event propagation?
218223
219224
220225 def draw (self ):
@@ -241,12 +246,10 @@ def _renderer_init(self):
241246 self ._renderer = RendererGDK (self , self .figure .dpi )
242247
243248
244- def _render_figure (self , width , height ):
245- """Render the figure to a gdk.Pixmap, used by expose_event().
246- Is used for
247- - rendering the pixmap to display (pylab.draw)
248- - rendering the pixmap to save to a file (pylab.savefig)
249- Should not be overridden by GTK backends
249+ def _pixmap_prepare (self , width , height ):
250+ """
251+ Make sure _._pixmap is at least width, height,
252+ create new pixmap if necessary
250253 """
251254 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
252255
@@ -266,35 +269,37 @@ def _render_figure(self, width, height):
266269 if _debug : print 'FigureCanvasGTK.%s new pixmap' % fn_name ()
267270 self ._pixmap = gdk .Pixmap (self .window , self ._pixmap_width ,
268271 self ._pixmap_height )
269- self ._renderer .set_pixmap (self ._pixmap )
270272
273+
274+ def _render_figure (self , pixmap , width , height ):
275+ """used by GTK and GTKcairo. GTKAgg overrides
276+ """
277+ self ._renderer .set_pixmap (pixmap )
271278 self ._renderer .set_width_height (width , height )
272279 self .figure .draw (self ._renderer )
273-
280+
274281
275282 def expose_event (self , widget , event ):
276- """Expose_event for all GTK backends
277- Should not be overridden.
283+ """Expose_event for all GTK backends. Should not be overridden.
278284 """
279285 if _debug : print 'FigureCanvasGTK.%s' % fn_name ()
280286
281- if not GTK_WIDGET_DRAWABLE (self ):
282- return False # finish event propagation?
287+ if GTK_WIDGET_DRAWABLE (self ):
288+ if self ._need_redraw :
289+ x , y , w , h = self .allocation
290+ self ._pixmap_prepare (w , h )
291+ self ._render_figure (self ._pixmap , w , h )
292+ self ._need_redraw = False
283293
284- if self ._need_redraw :
285- x , y , w , h = self .allocation
286- self ._render_figure (w , h )
287- self ._need_redraw = False
288-
289- x , y , w , h = event .area
290- self .window .draw_drawable (self .style .fg_gc [self .state ], self ._pixmap ,
291- x , y , x , y , w , h )
294+ x , y , w , h = event .area
295+ self .window .draw_drawable (self .style .fg_gc [self .state ],
296+ self ._pixmap , x , y , x , y , w , h )
292297 return False # finish event propagation?
293298
294299
295300 def print_figure (self , filename , dpi = 150 , facecolor = 'w' , edgecolor = 'w' ,
296301 orientation = 'portrait' ):
297- # TODO - use gdk print figure ?
302+ # TODO - use gdk/cairo/agg print_figure ?
298303 root , ext = os .path .splitext (filename )
299304 ext = ext [1 :]
300305 if ext == '' :
@@ -319,13 +324,14 @@ def print_figure(self, filename, dpi=150, facecolor='w', edgecolor='w',
319324 ext = ext .lower ()
320325 if ext in ('jpg' , 'png' ): # native printing
321326 width , height = self .get_width_height ()
322- self ._render_figure (width , height )
327+ pixmap = gdk .Pixmap (self .window , width , height )
328+ self ._render_figure (pixmap , width , height )
323329
324330 # jpg colors don't match the display very well, png colors match
325331 # better
326332 pixbuf = gdk .Pixbuf (gdk .COLORSPACE_RGB , 0 , 8 ,
327333 width , height )
328- pixbuf .get_from_drawable (self . _pixmap , self . _pixmap .get_colormap (),
334+ pixbuf .get_from_drawable (pixmap , pixmap .get_colormap (),
329335 0 , 0 , 0 , 0 , width , height )
330336
331337 # pixbuf.save() recognises 'jpeg' not 'jpg'
@@ -386,6 +392,7 @@ def print_figure(self, filename, dpi=150, facecolor='w', edgecolor='w',
386392 self .figure .set_edgecolor (origedgecolor )
387393 self .figure .set_figsize_inches (origWIn , origHIn )
388394 self .figure .set_canvas (self )
395+
389396
390397class FigureManagerGTK (FigureManagerBase ):
391398 """
0 commit comments