Crash on CanvasGroup destruction



Hi,

(Please Cc: me the replies, as I'm not on the list. If it's not the
correct list, please point me to the correct one.)

The following code snippet creates a Gtk window, with a root canvas
inside it. Then, a subclass (called Player) creates a CanvasGroup
inside this root canvas. This CanvasGroup simply contains a RichText
item. A timer is set up, and the role of the method called by the timer
is to update the text displayed by the RichText item, and to increment
the counter. When this counter reaches 10, it detroys the CanvasGroup
in order to delete the RichText from the interface.

Unfortunately, the Python interpreter segfaults once the CanvasGroup
has been destroyed. The stack trace is the following:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1210565984 (LWP 21630)]
gnome_canvas_request_update (canvas=0x0) at gnome-canvas.c:3494
3494            GNOME_CANVAS_GET_CLASS (canvas)->request_update (canvas);
(gdb) bt
#0  gnome_canvas_request_update (canvas=0x0) at gnome-canvas.c:3494
#1  0xb7137ca6 in request_update (data=0x8298c88) at gnome-canvas-rich-text.c:1683
#2  0xb7aa4451 in g_idle_dispatch (source=0x82fe610, callback=0x8298c88, user_data=0x8298c88) at gmain.c:3796
#3  0xb7aa5e2c in IA__g_main_context_dispatch (context=0x81dd0e8) at gmain.c:1916
#4  0xb7aa9176 in g_main_context_iterate (context=0x81dd0e8, block=1, dispatch=1, self=0x825a120)
    at gmain.c:2547
#5  0xb7aa9537 in IA__g_main_loop_run (loop=0x82ab960) at gmain.c:2751
#6  0xb77474e1 in IA__gtk_main () at gtkmain.c:1003
#7  0xb79dc7d3 in init_gtk () from /var/lib/python-support/python2.4/gtk-2.0/gtk/_gtk.so
#8  0x080b9170 in PyEval_EvalFrame ()
#9  0x080ba675 in PyEval_EvalCodeEx ()
#10 0x080ba6d9 in PyEval_EvalCode ()
#11 0x080dd007 in PyRun_FileExFlags ()
#12 0x080dd204 in PyRun_SimpleFileExFlags ()
#13 0x08055ba8 in Py_Main ()
#14 0x08055032 in main ()

It seems that Gtk tries to update the deleted CanvasGroup.

Attached is the Python code demonstrating the problem. Before
executing, one needs to patch python-gnome2, in order to add the
get_buffer() method of the RichText class. Patch is attached to this
mail.

Am I mis-using GnomeCanvas ? Or is this a bug ?

Thanks for your help !

Sincerly,

Thomas
-- 
PETAZZONI Thomas - thomas petazzoni enix org 
http://{thomas,sos,kos}.enix.org - Jabber: thomas petazzoni jabber dk
http://{agenda,livret}dulibre.org - http://www.toulibre.org
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
import pygtk
import gtk
import gobject
import gnomecanvas


class Player:
  def __init__(self, rootitem):
    self.count = 0

    self.canvas = rootitem.add(gnomecanvas.CanvasGroup)

    self.label = self.canvas.add(
      gnomecanvas.CanvasRichText,
      x = 100,
      y = 0,
      width = 190,
      height = 100,
      anchor = gtk.ANCHOR_N,
      editable = False,
      cursor_visible = False,
      justification = gtk.JUSTIFY_CENTER
    )
    self.buffer = self.label.get_buffer()
    self.tag = self.buffer.create_tag("toto", font = "Sans 12", foreground = "black",
                                      editable = False, editable_set = True)

    self.update_position()
    gobject.timeout_add(500, self.update_position)

  def stop(self):
    if self.canvas == None:
      return
    self.canvas.destroy()
    self.canvas = None

  def update_position(self):
    self.buffer.delete(self.buffer.get_bounds()[0], self.buffer.get_bounds()[1])
    if self.count > 10:
      self.stop()
      return False
    self.count += 1
    self.buffer.insert_with_tags(self.buffer.get_start_iter(),
                                 "Blabla %d" % (self.count), self.tag)
    return True

# create a new window
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(800,600)
canvas = gnomecanvas.Canvas()
canvas.set_size_request(800, 600)
canvas.set_scroll_region(0,0, 800, 600)
window.add(canvas)
rootitem = canvas.root()
player = Player(rootitem)
window.show_all()
gtk.main()
This patch is needed to add the binding for the
GnomeCanvasRichText.get_buffer() method. It applies on top on gnome-python
2.12.3.

diff -ru gnome-python-2.12.3/gnomecanvas/canvas.defs gnome-python-2.12.3.new/gnomecanvas/canvas.defs
--- gnome-python-2.12.3/gnomecanvas/canvas.defs	2005-06-08 12:00:08.000000000 +0200
+++ gnome-python-2.12.3.new/gnomecanvas/canvas.defs	2006-06-18 13:47:45.000000000 +0200
@@ -389,6 +389,12 @@
   )
 )
 
+(define-method get_buffer
+  (of-object "GnomeCanvasRichText")
+  (c-name "gnome_canvas_rich_text_get_buffer")
+  (return-type "GtkTextBuffer*")
+)
+
 (define-method scroll_to
   (of-object "GnomeCanvas")
   (c-name "gnome_canvas_scroll_to")
Seulement dans gnome-python-2.12.3.new/: patch-stamp

Attachment: signature.asc
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]