summaryrefslogtreecommitdiff
path: root/gtk/gtkcolorsel.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-06-25 07:10:40 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-06-25 07:10:40 +0000
commit9b356ea0d8ee1992ad9b3559aadad0c4e2b56f2c (patch)
tree2b22564953b69dff46505860a4918ac10c467e3b /gtk/gtkcolorsel.c
parenteffe3785cf61084d9f7e9427cea0999bb4a32473 (diff)
downloadgtk+-9b356ea0d8ee1992ad9b3559aadad0c4e2b56f2c.tar.gz
Add a GrabBroken event to GDK, and a grab-broken-event signal to
2005-06-25 Matthias Clasen <mclasen@redhat.com> Add a GrabBroken event to GDK, and a grab-broken-event signal to GtkWidget. (#107320, Simon Cooke, initial patch by John Ehresman) * gdk/gdkevents.h: Add a GDK_GRAB_BROKEN event type, define a GdkEventGrabBroken event struct. * gdk/win32/gdkevents-win32.c (gdk_event_translate): Generate GrabBroken events in response to WM_KILLFOCUS. * gdk/x11/gdkmain-x11.c: Generate GrabBroken events when a grab is broken by the window becoming unviewable, or by another grab from the same client. * gtk/gtkwidget.h (GtkWidgetClass): Add grab_broken_event. * gtk/gtkwidget.c (gtk_widget_event_internal): Translate GrabBroken events into grab_broken_event signals. * gtk/gtkmain.c (gtk_main_do_event): Propagate GrabBroken events. * gtk/gtkmenushell.c (gtk_menu_shell_grab_broken): Deactivate the menu when the grab is broken. * gtk/gtkcolorsel.c (gtk_color_selection_grab_broken): Stop the color picker if the grab is broken. * gtk/gtkpaned.c (gtk_paned_grab_broken): Stop the drag if the grab is broken.
Diffstat (limited to 'gtk/gtkcolorsel.c')
-rw-r--r--gtk/gtkcolorsel.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c
index e0199f3586..92bd24f9fc 100644
--- a/gtk/gtkcolorsel.c
+++ b/gtk/gtkcolorsel.c
@@ -139,6 +139,8 @@ struct _ColorSelectionPrivate
/* Window for grabbing on */
GtkWidget *dropper_grab_widget;
+ guint32 grab_time;
+ gboolean has_grab;
/* Connection to settings */
gulong settings_connection;
@@ -162,6 +164,8 @@ static void gtk_color_selection_get_property (GObject *object
static void gtk_color_selection_realize (GtkWidget *widget);
static void gtk_color_selection_unrealize (GtkWidget *widget);
static void gtk_color_selection_show_all (GtkWidget *widget);
+static gboolean gtk_color_selection_grab_broken (GtkWidget *widget,
+ GdkEventGrabBroken *event);
static void gtk_color_selection_set_palette_color (GtkColorSelection *colorsel,
gint index,
@@ -1248,14 +1252,27 @@ shutdown_eyedropper (GtkWidget *widget)
GtkColorSelection *colorsel;
ColorSelectionPrivate *priv;
GdkDisplay *display = gtk_widget_get_display (widget);
- guint32 time = gtk_get_current_event_time ();
colorsel = GTK_COLOR_SELECTION (widget);
priv = colorsel->private_data;
- gdk_display_keyboard_ungrab (display, time);
- gdk_display_pointer_ungrab (display, time);
- gtk_grab_remove (priv->dropper_grab_widget);
+ if (priv->has_grab)
+ {
+ gdk_display_keyboard_ungrab (display, priv->grab_time);
+ gdk_display_pointer_ungrab (display, priv->grab_time);
+ gtk_grab_remove (priv->dropper_grab_widget);
+
+ priv->has_grab = FALSE;
+ }
+}
+
+static gboolean
+gtk_color_selection_grab_broken (GtkWidget *widget,
+ GdkEventGrabBroken *event)
+{
+ shutdown_eyedropper (widget);
+
+ return TRUE;
}
static void
@@ -1410,6 +1427,7 @@ get_screen_color (GtkWidget *button)
GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (button));
GdkCursor *picker_cursor;
GdkGrabStatus grab_status;
+ guint32 time = gtk_get_current_event_time ();
if (priv->dropper_grab_widget == NULL)
{
@@ -1419,11 +1437,14 @@ get_screen_color (GtkWidget *button)
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK);
gtk_widget_show (priv->dropper_grab_widget);
+
+ gdk_window_set_user_data (priv->dropper_grab_widget->window, colorsel);
+ gdk_window_reparent (priv->dropper_grab_widget->window,
+ GTK_WIDGET (colorsel)->window, 0, 0);
}
if (gdk_keyboard_grab (priv->dropper_grab_widget->window,
- FALSE,
- gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
+ FALSE, time) != GDK_GRAB_SUCCESS)
return;
picker_cursor = make_picker_cursor (screen);
@@ -1432,16 +1453,18 @@ get_screen_color (GtkWidget *button)
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK,
NULL,
picker_cursor,
- gtk_get_current_event_time ());
+ time);
gdk_cursor_unref (picker_cursor);
if (grab_status != GDK_GRAB_SUCCESS)
{
- gdk_display_keyboard_ungrab (gtk_widget_get_display (button), GDK_CURRENT_TIME);
+ gdk_display_keyboard_ungrab (gtk_widget_get_display (button), time);
return;
}
gtk_grab_add (priv->dropper_grab_widget);
+ priv->grab_time = time;
+ priv->has_grab = TRUE;
g_signal_connect (priv->dropper_grab_widget, "button_press_event",
G_CALLBACK (mouse_press), colorsel);
@@ -1843,6 +1866,7 @@ gtk_color_selection_class_init (GtkColorSelectionClass *klass)
widget_class->realize = gtk_color_selection_realize;
widget_class->unrealize = gtk_color_selection_unrealize;
widget_class->show_all = gtk_color_selection_show_all;
+ widget_class->grab_broken_event = gtk_color_selection_grab_broken;
g_object_class_install_property (gobject_class,
PROP_HAS_OPACITY_CONTROL,