After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 675809 - Crash when clicking xrefs
Crash when clicking xrefs
Status: RESOLVED FIXED
Product: gtk+
Classification: Platform
Component: Widget: Other
unspecified
Other Linux
: Normal normal
: ---
Assigned To: gtk-bugs
gtk-bugs
Depends on:
Blocks:
 
 
Reported: 2012-05-10 14:19 UTC by Bastien Nocera
Modified: 2012-05-15 17:25 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
gdk: Don't crash when resetting cursor (954 bytes, patch)
2012-05-10 14:25 UTC, Bastien Nocera
none Details | Review
gdk: Don't crash when resetting cursor (972 bytes, patch)
2012-05-10 14:30 UTC, Bastien Nocera
none Details | Review

Description Bastien Nocera 2012-05-10 14:19:42 UTC
In gnome-control-center master, the panels are within a Clutter GTK+ stage, and clicking on a "link button" to go from one panel to another produces this crash.

1. Open gnome-control-center
2. Open the Wacom panel (if you don't have any wacom devices)
3. Click "Bluetooth Settings"

  • #0 ??
  • #1 update_cursor
    at gdkwindow.c line 7808
  • #2 gdk_window_set_cursor_internal
    at gdkwindow.c line 6742
  • #3 gdk_window_set_cursor
    at gdkwindow.c line 6817
  • #4 set_hand_cursor
    at gtklinkbutton.c line 396
  • #5 gtk_link_button_unrealize
    at gtklinkbutton.c line 406
  • #6 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #7 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #8 _g_closure_invoke_va
    at gclosure.c line 840
  • #9 g_signal_emit_valist
    at gsignal.c line 3207
  • #10 g_signal_emit
    at gsignal.c line 3352
  • #11 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #12 gtk_box_forall
    at gtkbox.c line 1863
  • #13 gtk_container_forall
    at gtkcontainer.c line 2057
  • #14 gtk_widget_real_unrealize
    at gtkwidget.c line 10434
  • #15 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #16 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #17 _g_closure_invoke_va
    at gclosure.c line 840
  • #18 g_signal_emit_valist
    at gsignal.c line 3207
  • #19 g_signal_emit
    at gsignal.c line 3352
  • #20 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #21 gtk_notebook_forall
    at gtknotebook.c line 4483
  • #22 gtk_container_forall
    at gtkcontainer.c line 2057
  • #23 gtk_widget_real_unrealize
    at gtkwidget.c line 10434
  • #24 gtk_notebook_unrealize
    at gtknotebook.c line 1922
  • #25 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #26 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #27 _g_closure_invoke_va
    at gclosure.c line 840
  • #28 g_signal_emit_valist
    at gsignal.c line 3207
  • #29 g_signal_emit
    at gsignal.c line 3352
  • #30 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #31 gtk_bin_forall
    at gtkbin.c line 170
  • #32 gtk_container_forall
    at gtkcontainer.c line 2057
  • #33 gtk_widget_real_unrealize
    at gtkwidget.c line 10434
  • #34 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #35 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #36 _g_closure_invoke_va
    at gclosure.c line 840
  • #37 g_signal_emit_valist
    at gsignal.c line 3207
  • #38 g_signal_emit
    at gsignal.c line 3352
  • #39 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #40 gtk_bin_forall
    at gtkbin.c line 170
  • #41 gtk_container_forall
    at gtkcontainer.c line 2057
  • #42 gtk_widget_real_unrealize
    at gtkwidget.c line 10434
  • #43 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #44 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #45 _g_closure_invoke_va
    at gclosure.c line 840
  • #46 g_signal_emit_valist
    at gsignal.c line 3207
  • #47 g_signal_emit
    at gsignal.c line 3352
  • #48 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #49 gtk_bin_forall
    at gtkbin.c line 170
  • #50 gtk_container_forall
    at gtkcontainer.c line 2057
  • #51 gtk_widget_real_unrealize
    at gtkwidget.c line 10434
  • #52 gtk_clutter_offscreen_unrealize
    at ./gtk-clutter-offscreen.c line 173
  • #53 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #54 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #55 _g_closure_invoke_va
    at gclosure.c line 840
  • #56 g_signal_emit_valist
    at gsignal.c line 3207
  • #57 g_signal_emit
    at gsignal.c line 3352
  • #58 gtk_widget_unrealize
    at gtkwidget.c line 4483
  • #59 gtk_clutter_actor_unrealize
    at ./gtk-clutter-actor.c line 166
  • #60 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #61 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #62 _g_closure_invoke_va
    at gclosure.c line 840
  • #63 g_signal_emit_valist
    at gsignal.c line 3207
  • #64 g_signal_emit
    at gsignal.c line 3352
  • #65 unrealize_actor_before_children_cb
    at ./clutter-actor.c line 1910
  • #66 _clutter_actor_traverse_depth
    at ./clutter-actor.c line 16083
  • #67 _clutter_actor_traverse_depth
    at ./clutter-actor.c line 16095
  • #68 _clutter_actor_traverse
    at ./clutter-actor.c line 16144
  • #69 clutter_actor_unrealize_not_hiding
    at ./clutter-actor.c line 1955
  • #70 clutter_actor_update_map_state
    at ./clutter-actor.c line 1351
  • #71 clutter_actor_remove_child_internal
    at ./clutter-actor.c line 3897
  • #72 clutter_actor_iter_remove
    at ./clutter-actor.c line 17034
  • #73 cc_notebook_remove_page
    at cc-notebook.c line 442
  • #74 _shell_set_active_panel_from_id
    at gnome-control-center.c line 958
  • #75 cc_shell_set_active_panel_from_id
    at cc-shell.c line 206
  • #76 cc_wacom_panel_switch_to_panel
    at cc-wacom-panel.c line 298
  • #77 link_activated
    at cc-wacom-panel.c line 286
  • #78 _gtk_marshal_BOOLEAN__VOID
    at gtkmarshalers.c line 1992
  • #79 g_closure_invoke
    at gclosure.c line 777
  • #80 signal_emit_unlocked_R
    at gsignal.c line 3547
  • #81 g_signal_emit_valist
    at gsignal.c line 3306
  • #82 g_signal_emit
    at gsignal.c line 3352
  • #83 gtk_link_button_clicked
    at gtklinkbutton.c line 576
  • #84 g_cclosure_marshal_VOID__VOIDv
    at gmarshal.c line 115
  • #85 g_type_class_meta_marshalv
    at gclosure.c line 997
  • #86 _g_closure_invoke_va
    at gclosure.c line 840
  • #87 g_signal_emit_valist
    at gsignal.c line 3207
  • #88 g_signal_emit
    at gsignal.c line 3352
  • #89 gtk_button_clicked
    at gtkbutton.c line 1333
  • #90 gtk_real_button_released
    at gtkbutton.c line 1989
  • #91 g_cclosure_marshal_VOID__VOID
    at gmarshal.c line 85
  • #92 g_type_class_meta_marshal
    at gclosure.c line 970
  • #93 g_closure_invoke
    at gclosure.c line 777
  • #94 signal_emit_unlocked_R
    at gsignal.c line 3477
  • #95 g_signal_emit_valist
    at gsignal.c line 3296
  • #96 g_signal_emit
    at gsignal.c line 3352
  • #97 gtk_button_button_release
    at gtkbutton.c line 1824
  • #98 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 85
  • #99 g_type_class_meta_marshal
    at gclosure.c line 970
  • #100 g_closure_invoke
    at gclosure.c line 777
  • #101 signal_emit_unlocked_R
    at gsignal.c line 3585
  • #102 g_signal_emit_valist
    at gsignal.c line 3306
  • #103 g_signal_emit
    at gsignal.c line 3352
  • #104 gtk_widget_event_internal
    at gtkwidget.c line 6289
  • #105 gtk_widget_event
    at gtkwidget.c line 5946
  • #106 propagate_event_up
    at gtkmain.c line 2391
  • #107 propagate_event
    at gtkmain.c line 2491
  • #108 gtk_propagate_event
    at gtkmain.c line 2526
  • #109 gtk_main_do_event
    at gtkmain.c line 1714
  • #110 _gdk_event_emit
    at gdkevents.c line 69
  • #111 gdk_event_source_dispatch
    at gdkeventsource.c line 358
  • #112 g_main_dispatch
    at gmain.c line 2539
  • #113 g_main_context_dispatch
    at gmain.c line 3075
  • #114 g_main_context_iterate
    at gmain.c line 3146
  • #115 g_main_context_iteration
    at gmain.c line 3207
  • #116 g_application_run
    at gapplication.c line 1571
  • #117 main
    at control-center.c line 207


7804	  /* Set all cursors on toplevel, otherwise its tricky to keep track of
7805	   * which native window has what cursor set. */
7806	  toplevel = get_event_toplevel (pointer_window);
7807	  impl_class = GDK_WINDOW_IMPL_GET_CLASS (toplevel->impl);
7808	  impl_class->set_device_cursor (toplevel, device, cursor);

(gdb) p impl_class
$1 = (GdkWindowImplClass *) 0xc18630
(gdb) p impl_class->set_device_cursor
$2 = (void (*)(GdkWindow *, GdkDevice *, GdkCursor *)) 0

Doing "if (impl_class->set_device_cursor)" before should be enough to fix it.
Comment 1 Bastien Nocera 2012-05-10 14:25:05 UTC
Created attachment 213810 [details] [review]
gdk: Don't crash when resetting cursor

In Clutter-gtk, which doesn't seem to implement the
set_device_cursor() vfunc.
Comment 2 Emmanuele Bassi (:ebassi) 2012-05-10 14:29:43 UTC
the issue is that GdkOffscreenWindow, which is used by GtkClutterActor to embed widgets, does not implement set_device_cursor(). somebody has to perform a check for set_device_cursor() or for GDK_IS_OFFSCREEN_WINDOW.
Comment 3 Bastien Nocera 2012-05-10 14:30:35 UTC
Created attachment 213812 [details] [review]
gdk: Don't crash when resetting cursor

When the toplevel is a GdkOffscreenWindow which doesn't
implement the set_device_cursor() vfunc.
Comment 4 Bastien Nocera 2012-05-10 14:31:22 UTC
Comment on attachment 213810 [details] [review]
gdk: Don't crash when resetting cursor

Fix the commit message to mention GdkOffscreenWindow, not clutter-gtk.
Comment 5 Bastien Nocera 2012-05-15 17:25:13 UTC
Implemented a dummy function in the GdkOffscreenWindow implementation instead.