Thread: [Goocanvas-devel] bug?
Status: Beta
Brought to you by:
dachaplin
From: <z....@gm...> - 2008-05-21 19:36:42
|
Dear list, I have 2 callback functions, first of them remove previously created ellipse from a goocanvas, 2nd function creates that ellipse and places it on the canvas. Everything works just fine if I remove(or not let it pop up by pressing right mouse button) the GtkDialog widget (lines 34-47). Once this dialog has poped up everything stops working properly - I can't anylonger remove ellipse from the canvas, and when I add a new ellipse its drawn upon already existing one... what's wrong here? static gboolean cryoprobe_clicked(GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, gpointer data) { Surgery *s = (Surgery *) data; /* right clicked */ if (3 == event->button) { goo_canvas_item_remove(item); // s->getParameters->removeControlpoint(imageNumber, event->x, event->y); } return TRUE; } static gboolean image_clicked(GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, gpointer data) { Surgery *s = (Surgery *) data; GooCanvasItem *ellipse; GtkWidget *dialog; /* left clicked */ if (1 == event->button) { ellipse = goo_canvas_ellipse_new(item, event->x, event->y, 5, 5, "fill-color", "red", NULL); g_signal_connect(ellipse, "button_press_event", (GtkSignalFunc)(controlpoint_clicked), s); // s->getParameters->addControlpoint(imageNumber, event->x, event->y); } /* middle clicked */ if (2 == event->button) { ellipse = goo_canvas_ellipse_new(item, event->x, event->y, 5, 5, "fill-color", "green", NULL); g_signal_connect(ellipse, "button_press_event", (GtkSignalFunc)(thermosensor_clicked), s); // s->getParameters->addControlpoint(imageNumber, event->x, event->y); } /* right clicked */ if (3 == event->button) { dialog = gtk_dialog_new_with_buttons("Adding cryoprobe...", GTK_WINDOW (s->getGui()->mainWindow), GTK_DIALOG_MODAL, GTK_STOCK_ADD, 1, GTK_STOCK_CANCEL, 2, GTK_STOCK_CLEAR, 3, NULL); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case 1: g_print("boom 1\n"); break; case 2: g_print("boom 2\n"); break; case 3: g_print("boom 3\n"); break; } gtk_widget_destroy (dialog); ellipse = goo_canvas_ellipse_new(item, event->x, event->y, 5, 5, "fill-color", "blue", NULL); g_signal_connect(ellipse, "button_press_event", (GtkSignalFunc)(cryoprobe_clicked), s); // s->getParameters->addControlpoint(imageNumber, event->x, event->y); } return TRUE; } |
From: Damon C. <da...@ka...> - 2008-05-21 20:14:38
|
On Wed, 2008-05-21 at 22:36 +0300, z....@gm... wrote: > Dear list, > > I have 2 callback functions, first of them remove previously created > ellipse from a goocanvas, 2nd function creates that ellipse and places > it on the canvas. Everything works just fine if I remove(or not let it > pop up by pressing right mouse button) the GtkDialog widget (lines > 34-47). Once this dialog has poped up everything stops working > properly - I can't anylonger remove ellipse from the canvas, and when > I add a new ellipse its drawn upon already existing one... what's > wrong here? I can't immediately spot a problem in the code. It's difficult to tell where the problem is. It might not be in GooCanvas. If you could create a small program that demonstrates the problem I'd have a look at it. Damon |
From: <z....@gm...> - 2008-05-22 18:42:44
Attachments:
testcanvas.cpp
|
Hi Damon, here is my small test case - just change the #define inside to point to an image file... first try pressing only left and middle mouse buttons in order to create/remove ellipse and then try to press right button in order to call the dialog and see what happens with callbacks... thank you in advance Zeev Pekar On Wed, May 21, 2008 at 11:14 PM, Damon Chaplin <da...@ka...> wrote: > > On Wed, 2008-05-21 at 22:36 +0300, z....@gm... wrote: >> Dear list, >> >> I have 2 callback functions, first of them remove previously created >> ellipse from a goocanvas, 2nd function creates that ellipse and places >> it on the canvas. Everything works just fine if I remove(or not let it >> pop up by pressing right mouse button) the GtkDialog widget (lines >> 34-47). Once this dialog has poped up everything stops working >> properly - I can't anylonger remove ellipse from the canvas, and when >> I add a new ellipse its drawn upon already existing one... what's >> wrong here? > > I can't immediately spot a problem in the code. It's difficult to tell > where the problem is. It might not be in GooCanvas. > > If you could create a small program that demonstrates the problem I'd > have a look at it. > > Damon > > |
From: Damon C. <da...@ka...> - 2008-05-23 11:29:05
|
On Thu, 2008-05-22 at 21:42 +0300, z....@gm... wrote: > Hi Damon, > > here is my small test case - just change the #define inside to point > to an image file... > first try pressing only left and middle mouse buttons in order to > create/remove ellipse > and then try to press right button in order to call the dialog and see > what happens with callbacks... Yes, I can reproduce it. The problem is because of implicit pointer grabs. When items receive a button press event they add an implicit pointer grab, so that all pointer events go to them until the button is released (just like GTK+ widgets). However, you popped up a dialog which overrides the pointer grab, so the item never received the button release, and never released the pointer grab. So it continued to get all the pointer events, and stopped the other items from getting button press events. There are 2 ways you can fix it: 1) Pop up the dialog when the mouse button is released, instead of when it is pressed. 2) Call this before popping up the dialog: goo_canvas_pointer_ungrab (goo_canvas_item_get_canvas (target), target, event->time); That should clear the implicit pointer grab (it works for me). I'm not sure if there is a way to avoid this issue in GooCanvas. I'll have a think about it. Damon |