diff options
author | Matthias Clasen <mclasen@redhat.com> | 2005-06-25 07:10:40 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2005-06-25 07:10:40 +0000 |
commit | 9b356ea0d8ee1992ad9b3559aadad0c4e2b56f2c (patch) | |
tree | 2b22564953b69dff46505860a4918ac10c467e3b /gtk/gtkpaned.c | |
parent | effe3785cf61084d9f7e9427cea0999bb4a32473 (diff) | |
download | gtk+-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/gtkpaned.c')
-rw-r--r-- | gtk/gtkpaned.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index dcf838efb1..f0fb5f6eab 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -99,6 +99,8 @@ static gboolean gtk_paned_motion (GtkWidget *widget, GdkEventMotion *event); static gboolean gtk_paned_focus (GtkWidget *widget, GtkDirectionType direction); +static gboolean gtk_paned_grab_broken (GtkWidget *widget, + GdkEventGrabBroken *event); static void gtk_paned_add (GtkContainer *container, GtkWidget *widget); static void gtk_paned_remove (GtkContainer *container, @@ -127,7 +129,7 @@ static gboolean gtk_paned_accept_position (GtkPaned *paned); static gboolean gtk_paned_cancel_position (GtkPaned *paned); static gboolean gtk_paned_toggle_handle_focus (GtkPaned *paned); -static GType gtk_paned_child_type (GtkContainer *container); +static GType gtk_paned_child_type (GtkContainer *container); static GtkContainerClass *parent_class = NULL; @@ -135,6 +137,7 @@ struct _GtkPanedPrivate { GtkWidget *saved_focus; GtkPaned *first_paned; + guint32 grab_time; }; GType @@ -219,6 +222,7 @@ gtk_paned_class_init (GtkPanedClass *class) widget_class->button_press_event = gtk_paned_button_press; widget_class->button_release_event = gtk_paned_button_release; widget_class->motion_notify_event = gtk_paned_motion; + widget_class->grab_broken_event = gtk_paned_grab_broken; container_class->add = gtk_paned_add; container_class->remove = gtk_paned_remove; @@ -882,18 +886,20 @@ gtk_paned_button_press (GtkWidget *widget, if (!paned->in_drag && (event->window == paned->handle) && (event->button == 1)) { - paned->in_drag = TRUE; - /* We need a server grab here, not gtk_grab_add(), since * we don't want to pass events on to the widget's children */ - gdk_pointer_grab (paned->handle, FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, - event->time); + if (gdk_pointer_grab (paned->handle, FALSE, + GDK_POINTER_MOTION_HINT_MASK + | GDK_BUTTON1_MOTION_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_ENTER_NOTIFY_MASK + | GDK_LEAVE_NOTIFY_MASK, + NULL, NULL, + event->time) != GDK_GRAB_SUCCESS) + return FALSE; + + paned->in_drag = TRUE; + paned->priv->grab_time = event->time; if (paned->orientation == GTK_ORIENTATION_HORIZONTAL) paned->drag_pos = event->y; @@ -907,6 +913,17 @@ gtk_paned_button_press (GtkWidget *widget, } static gboolean +gtk_paned_grab_broken (GtkWidget *widget, + GdkEventGrabBroken *event) +{ + GtkPaned *paned = GTK_PANED (widget); + + paned->in_drag = FALSE; + paned->drag_pos = -1; + paned->position_set = TRUE; +} + +static gboolean gtk_paned_button_release (GtkWidget *widget, GdkEventButton *event) { @@ -918,7 +935,7 @@ gtk_paned_button_release (GtkWidget *widget, paned->drag_pos = -1; paned->position_set = TRUE; gdk_display_pointer_ungrab (gtk_widget_get_display (widget), - event->time); + paned->priv->grab_time); return TRUE; } |