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.
This commit is contained in:
committed by
Matthias Clasen
parent
effe3785cf
commit
9b356ea0d8
@ -137,6 +137,20 @@ gdk_x11_convert_grab_status (gint status)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
generate_grab_broken_event (GdkWindow *window,
|
||||
gboolean keyboard)
|
||||
{
|
||||
GdkEvent event;
|
||||
|
||||
event.type = GDK_GRAB_BROKEN;
|
||||
event.grab_broken.window = window;
|
||||
event.grab_broken.send_event = 0;
|
||||
event.grab_broken.keyboard = keyboard;
|
||||
|
||||
gdk_event_put (&event);
|
||||
}
|
||||
|
||||
/*
|
||||
*--------------------------------------------------------------
|
||||
* gdk_pointer_grab
|
||||
@ -237,6 +251,10 @@ gdk_pointer_grab (GdkWindow * window,
|
||||
if (return_val == GrabSuccess)
|
||||
{
|
||||
GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window));
|
||||
if (display_x11->pointer_xgrab_window != NULL)
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->pointer_xgrab_window),
|
||||
FALSE);
|
||||
|
||||
display_x11->pointer_xgrab_window = (GdkWindowObject *)window;
|
||||
display_x11->pointer_xgrab_serial = serial;
|
||||
display_x11->pointer_xgrab_owner_events = owner_events;
|
||||
@ -334,6 +352,11 @@ gdk_keyboard_grab (GdkWindow * window,
|
||||
if (return_val == GrabSuccess)
|
||||
{
|
||||
GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (gdk_drawable_get_display (window));
|
||||
|
||||
if (display_x11->keyboard_xgrab_window != NULL)
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->keyboard_xgrab_window),
|
||||
TRUE);
|
||||
|
||||
display_x11->keyboard_xgrab_window = (GdkWindowObject *)window;
|
||||
display_x11->keyboard_xgrab_serial = serial;
|
||||
display_x11->keyboard_xgrab_owner_events = owner_events;
|
||||
@ -405,7 +428,11 @@ _gdk_xgrab_check_unmap (GdkWindow *window,
|
||||
tmp = tmp->parent;
|
||||
|
||||
if (tmp)
|
||||
display_x11->pointer_xgrab_window = NULL;
|
||||
{
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->pointer_xgrab_window),
|
||||
FALSE);
|
||||
display_x11->pointer_xgrab_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (display_x11->keyboard_xgrab_window &&
|
||||
@ -419,7 +446,11 @@ _gdk_xgrab_check_unmap (GdkWindow *window,
|
||||
tmp = tmp->parent;
|
||||
|
||||
if (tmp)
|
||||
display_x11->keyboard_xgrab_window = NULL;
|
||||
{
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->keyboard_xgrab_window),
|
||||
TRUE);
|
||||
display_x11->keyboard_xgrab_window = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -436,10 +467,18 @@ _gdk_xgrab_check_destroy (GdkWindow *window)
|
||||
GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (gdk_drawable_get_display (window));
|
||||
|
||||
if ((GdkWindowObject *)window == display_x11->pointer_xgrab_window)
|
||||
display_x11->pointer_xgrab_window = NULL;
|
||||
{
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->pointer_xgrab_window),
|
||||
FALSE);
|
||||
display_x11->pointer_xgrab_window = NULL;
|
||||
}
|
||||
|
||||
if ((GdkWindowObject *)window == display_x11->keyboard_xgrab_window)
|
||||
display_x11->keyboard_xgrab_window = NULL;
|
||||
{
|
||||
generate_grab_broken_event (GDK_WINDOW (display_x11->keyboard_xgrab_window),
|
||||
TRUE);
|
||||
display_x11->keyboard_xgrab_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user