static void gimp_pick_button_clicked (GtkButton *gtk_button) { GimpPickButton *button = GIMP_PICK_BUTTON (gtk_button); GtkWidget *widget; guint32 timestamp; if (! button->cursor) button->cursor = make_cursor (gtk_widget_get_display (GTK_WIDGET (gtk_button))); if (! button->grab_widget) { button->grab_widget = gtk_invisible_new (); gtk_widget_add_events (button->grab_widget, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); gtk_widget_show (button->grab_widget); } widget = button->grab_widget; timestamp = gtk_get_current_event_time (); if (gdk_keyboard_grab (gtk_widget_get_window (widget), FALSE, timestamp) != GDK_GRAB_SUCCESS) { g_warning ("Failed to grab keyboard to do eyedropper"); return; } if (gdk_pointer_grab (gtk_widget_get_window (widget), FALSE, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK, NULL, button->cursor, timestamp) != GDK_GRAB_SUCCESS) { gdk_display_keyboard_ungrab (gtk_widget_get_display (widget), timestamp); g_warning ("Failed to grab pointer to do eyedropper"); return; } gtk_grab_add (widget); g_signal_connect (widget, "button-press-event", G_CALLBACK (gimp_pick_button_mouse_press), button); g_signal_connect (widget, "key-press-event", G_CALLBACK (gimp_pick_button_key_press), button); }
/* entry point to this file, called from gimppickbutton.c */ void _gimp_pick_button_default_pick (GimpPickButton *button) { GdkDisplay *display; GtkWidget *widget; if (! button->priv->cursor) button->priv->cursor = make_cursor (gtk_widget_get_display (GTK_WIDGET (button))); if (! button->priv->grab_widget) { button->priv->grab_widget = gtk_invisible_new (); gtk_widget_add_events (button->priv->grab_widget, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK); gtk_widget_show (button->priv->grab_widget); } widget = button->priv->grab_widget; display = gtk_widget_get_display (widget); if (gdk_seat_grab (gdk_display_get_default_seat (display), gtk_widget_get_window (widget), GDK_SEAT_CAPABILITY_ALL, FALSE, button->priv->cursor, NULL, NULL, NULL) != GDK_GRAB_SUCCESS) { g_warning ("Failed to grab seat to do eyedropper"); return; } gtk_grab_add (widget); g_signal_connect (widget, "button-press-event", G_CALLBACK (gimp_pick_button_mouse_press), button); g_signal_connect (widget, "key-press-event", G_CALLBACK (gimp_pick_button_key_press), button); }