Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6e62736

Browse files
author
Steve Chaplin
committed
'SC'
svn path=/trunk/matplotlib/; revision=1558
1 parent ac3ad96 commit 6e62736

5 files changed

Lines changed: 55 additions & 86 deletions

File tree

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
New entries should be added at the top
22

3+
2005-07-24 backend_gtk.py: modify print_figure() use own pixmap, fixing
4+
problems where print_figure() overwrites the display pixmap.
5+
return False from all button/key etc events - to allow the event
6+
to propagate further - SC
7+
38
2005-07-23 backend_gtk.py: change expose_event from using set_back_pixmap();
49
clear() to draw_drawable() - SC
510

lib/matplotlib/backends/backend_gdk.py

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ class RendererGDK(RendererBase):
7070
rotated = {} # a map from text prop tups to rotated text pixbufs
7171

7272
def __init__(self, gtkDA, dpi):
73-
# gtkDA is used in '<widget>.create_pango_layout(s)' (and cmap line
74-
# below) only
73+
# widget gtkDA is used for:
74+
# '<widget>.create_pango_layout(s)'
75+
# cmap line below)
7576
self.gtkDA = gtkDA
7677
self.dpi = dpi
7778
self._cmap = gtkDA.get_colormap()
@@ -456,45 +457,20 @@ def new_figure_manager(num, *args, **kwargs):
456457
return manager
457458

458459

459-
class FigureCanvasGDK(FigureCanvasBase):
460+
class FigureCanvasGDK (FigureCanvasBase):
460461
def __init__(self, figure):
461462
FigureCanvasBase.__init__(self, figure)
462-
self._pixmap_width = -1
463-
self._pixmap_height = -1
464463

465464
self._renderer_init()
466465

467466
def _renderer_init(self):
468467
self._renderer = RendererGDK (gtk.DrawingArea(), self.figure.dpi)
469468

470-
471-
def _render_figure(self, width, height):
472-
"""Render the figure to a gdk.Pixmap, is used for
473-
- rendering the pixmap to display (pylab.draw)
474-
- rendering the pixmap to save to a file (pylab.savefig)
475-
"""
476-
if _debug: print 'FigureCanvasGDK.%s' % fn_name()
477-
create_pixmap = False
478-
if width > self._pixmap_width:
479-
# increase the pixmap in 10%+ (rather than 1 pixel) steps
480-
self._pixmap_width = max (int (self._pixmap_width * 1.1), width)
481-
create_pixmap = True
482-
483-
if height > self._pixmap_height:
484-
self._pixmap_height = max (int (self._pixmap_height * 1.1), height)
485-
create_pixmap = True
486-
487-
if create_pixmap:
488-
if _debug: print 'FigureCanvasGTK.%s new pixmap' % fn_name()
489-
self._pixmap = gtk.gdk.Pixmap (None, self._pixmap_width,
490-
self._pixmap_height, depth=24)
491-
# gtk backend must use self.window
492-
self._renderer.set_pixmap (self._pixmap)
493-
469+
def _render_figure(self, pixmap, width, height):
470+
self._renderer.set_pixmap (pixmap)
494471
self._renderer.set_width_height (width, height)
495472
self.figure.draw (self._renderer)
496473

497-
498474
def print_figure(self, filename, dpi=150, facecolor='w', edgecolor='w',
499475
orientation='portrait'):
500476
root, ext = os.path.splitext(filename)
@@ -510,13 +486,14 @@ def print_figure(self, filename, dpi=150, facecolor='w', edgecolor='w',
510486
ext = ext.lower()
511487
if ext in ('jpg', 'png'): # native printing
512488
width, height = self.get_width_height()
513-
self._render_figure(width, height)
489+
pixmap = gtk.gdk.Pixmap (None, width, height, depth=24)
490+
self._render_figure(pixmap, width, height)
514491

515492
# jpg colors don't match the display very well, png colors match
516493
# better
517494
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 0, 8,
518495
width, height)
519-
pixbuf.get_from_drawable(self._pixmap, self._renderer._cmap,
496+
pixbuf.get_from_drawable(pixmap, pixmap.get_colormap(),
520497
0, 0, 0, 0, width, height)
521498

522499
# pixbuf.save() recognises 'jpeg' not 'jpg'

lib/matplotlib/backends/backend_gtk.py

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def fn_name(): return sys._getframe(1).f_code.co_name
2020
from matplotlib._pylab_helpers import Gcf
2121
from 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
2424
from matplotlib.cbook import is_string_like, enumerate
2525
from matplotlib.figure import Figure
2626
from 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

390397
class FigureManagerGTK(FigureManagerBase):
391398
"""

lib/matplotlib/backends/backend_gtkagg.py

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,9 @@ def configure_event(self, widget, event=None):
6666
if DEBUG: print 'FigureCanvasGTKAgg.configure_event end'
6767
return True
6868

69-
70-
def _render_figure(self, width, height):
71-
"""Render the figure to a gdk.Pixmap, used by expose_event().
72-
"""
73-
if DEBUG: print 'FigureCanvasGTKAgg._render_figure'
74-
create_pixmap = False
75-
if width > self._pixmap_width:
76-
# increase the pixmap in 10%+ (rather than 1 pixel) steps
77-
self._pixmap_width = max (int (self._pixmap_width * 1.1), width)
78-
create_pixmap = True
79-
80-
if height > self._pixmap_height:
81-
self._pixmap_height = max (int (self._pixmap_height * 1.1), height)
82-
create_pixmap = True
83-
84-
if create_pixmap:
85-
if DEBUG: print 'FigureCanvasGTK._render_figure new pixmap'
86-
self._pixmap = gtk.gdk.Pixmap (self.window, self._pixmap_width,
87-
self._pixmap_height)
88-
69+
def _render_figure(self, pixmap, width, height):
8970
FigureCanvasAgg.draw(self)
90-
agg_to_gtk_drawable(self._pixmap, self.renderer._renderer, None)
71+
agg_to_gtk_drawable(pixmap, self.renderer._renderer, None)
9172

9273
def blit(self, bbox=None):
9374
agg_to_gtk_drawable(self._pixmap, self.renderer._renderer, bbox)

lib/matplotlib/backends/backend_gtkcairo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
GTK+ Matplotlib interface using Cairo (not GDK) drawing operations.
33
Author: Steve Chaplin
44
"""
5-
import cairo
65
import cairo.gtk
76

8-
from matplotlib.backends.backend_gtk import *
97
from matplotlib.backends.backend_cairo import RendererCairo
8+
from matplotlib.backends.backend_gtk import *
109

1110

1211
backend_version = 'PyGTK(%d.%d.%d),Pycairo(%d.%d.%d)' % (gtk.pygtk_version + cairo.version_info)

0 commit comments

Comments
 (0)