summaryrefslogtreecommitdiff
path: root/gtk/gtkpaned.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/gtkpaned.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/gtkpaned.c')
-rw-r--r--gtk/gtkpaned.c41
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;
}