From c454880a0cdda2cb8f8ff9c3c91b847e4cf3969f Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Tue, 2 Mar 2004 00:04:36 +0000 Subject: [PATCH] expose gtk_bindings_activate_event(), changed callers. Mon Mar 1 23:52:15 2004 Tim Janik * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed callers. * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose the key event propagation mechanism used for focus widgets. (gtk_window_key_release_event): use the same key event propagation logic as gtk_window_key_press_event(). --- ChangeLog | 10 ++++ ChangeLog.pre-2-10 | 10 ++++ ChangeLog.pre-2-4 | 10 ++++ ChangeLog.pre-2-6 | 10 ++++ ChangeLog.pre-2-8 | 10 ++++ gtk/gtkbindings.c | 6 +-- gtk/gtkbindings.h | 2 +- gtk/gtkmenushell.c | 2 +- gtk/gtkwidget.c | 4 +- gtk/gtkwindow.c | 122 ++++++++++++++++++++++++++------------------- gtk/gtkwindow.h | 2 + 11 files changed, 129 insertions(+), 59 deletions(-) diff --git a/ChangeLog b/ChangeLog index 18664d8df0..20c3324310 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Mar 1 23:52:15 2004 Tim Janik + + * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed + callers. + + * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose + the key event propagation mechanism used for focus widgets. + (gtk_window_key_release_event): use the same key event propagation logic + as gtk_window_key_press_event(). + 2004-03-01 Simon Budig * gdk/x11/gdkinput-x11.c: X11 R6.4 specifies 15 events diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 18664d8df0..20c3324310 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Mon Mar 1 23:52:15 2004 Tim Janik + + * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed + callers. + + * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose + the key event propagation mechanism used for focus widgets. + (gtk_window_key_release_event): use the same key event propagation logic + as gtk_window_key_press_event(). + 2004-03-01 Simon Budig * gdk/x11/gdkinput-x11.c: X11 R6.4 specifies 15 events diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 18664d8df0..20c3324310 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Mon Mar 1 23:52:15 2004 Tim Janik + + * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed + callers. + + * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose + the key event propagation mechanism used for focus widgets. + (gtk_window_key_release_event): use the same key event propagation logic + as gtk_window_key_press_event(). + 2004-03-01 Simon Budig * gdk/x11/gdkinput-x11.c: X11 R6.4 specifies 15 events diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 18664d8df0..20c3324310 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Mon Mar 1 23:52:15 2004 Tim Janik + + * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed + callers. + + * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose + the key event propagation mechanism used for focus widgets. + (gtk_window_key_release_event): use the same key event propagation logic + as gtk_window_key_press_event(). + 2004-03-01 Simon Budig * gdk/x11/gdkinput-x11.c: X11 R6.4 specifies 15 events diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 18664d8df0..20c3324310 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Mon Mar 1 23:52:15 2004 Tim Janik + + * gtk/gtkbindings.[hc]: expose gtk_bindings_activate_event(), changed + callers. + + * gtk/gtkwindow.[hc]: added gtk_window_propagate_key_event() to expose + the key event propagation mechanism used for focus widgets. + (gtk_window_key_release_event): use the same key event propagation logic + as gtk_window_key_press_event(). + 2004-03-01 Simon Budig * gdk/x11/gdkinput-x11.c: X11 R6.4 specifies 15 events diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c index b5cacbea3d..9deafaed74 100644 --- a/gtk/gtkbindings.c +++ b/gtk/gtkbindings.c @@ -1102,7 +1102,7 @@ gtk_bindings_activate (GtkObject *object, } /** - * _gtk_bindings_activate_event: + * gtk_bindings_activate_event: * @object: a #GtkObject (generally must be a widget) * @event: a #GdkEventKey * @@ -1112,8 +1112,8 @@ gtk_bindings_activate (GtkObject *object, * Return value: %TRUE if a matching key binding was found **/ gboolean -_gtk_bindings_activate_event (GtkObject *object, - GdkEventKey *event) +gtk_bindings_activate_event (GtkObject *object, + GdkEventKey *event) { GSList *entries = NULL; GdkDisplay *display; diff --git a/gtk/gtkbindings.h b/gtk/gtkbindings.h index 5d45495822..2d57d5b049 100644 --- a/gtk/gtkbindings.h +++ b/gtk/gtkbindings.h @@ -136,7 +136,7 @@ void gtk_binding_entry_add_signall (GtkBindingSet *binding_set, guint gtk_binding_parse_binding (GScanner *scanner); -gboolean _gtk_bindings_activate_event (GtkObject *object, +gboolean gtk_bindings_activate_event (GtkObject *object, GdkEventKey *event); void _gtk_binding_reset_parsed (void); diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index b907091523..b5e57c21f1 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -580,7 +580,7 @@ gtk_menu_shell_key_press (GtkWidget *widget, if (!menu_shell->active_menu_item && menu_shell->parent_menu_shell) return gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent *)event); - if (_gtk_bindings_activate_event (GTK_OBJECT (widget), event)) + if (gtk_bindings_activate_event (GTK_OBJECT (widget), event)) return TRUE; toplevel = gtk_widget_get_toplevel (widget); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 80be7ebff4..a50b1e8501 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3303,14 +3303,14 @@ static gboolean gtk_widget_real_key_press_event (GtkWidget *widget, GdkEventKey *event) { - return _gtk_bindings_activate_event (GTK_OBJECT (widget), event); + return gtk_bindings_activate_event (GTK_OBJECT (widget), event); } static gboolean gtk_widget_real_key_release_event (GtkWidget *widget, GdkEventKey *event) { - return _gtk_bindings_activate_event (GTK_OBJECT (widget), event); + return gtk_bindings_activate_event (GTK_OBJECT (widget), event); } static gboolean diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 034edf240a..81b5b37909 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4183,53 +4183,75 @@ _gtk_window_query_nonaccels (GtkWindow *window, return FALSE; } +/** + * gtk_window_propagate_key_event: + * @window: a #GtkWindow + * @event: a #GdkEventKey + * + * Propagate a key press or release event to the focus widget and + * up the focus container chain until a widget handles @event. + * This is normally called by the default ::key_press_event and + * ::key_release_event handlers for toplevel windows, + * however in some cases it may be useful to call this directly when + * overriding the standard key handling for a toplevel window. + * + * Return value: %TRUE if a widget in the focus chain handled the event. + **/ +gboolean +gtk_window_propagate_key_event (GtkWindow *window, + GdkEventKey *event) +{ + gboolean handled = FALSE; + GtkWidget *widget, *focus; + + g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); + + widget = GTK_WIDGET (window); + focus = window->focus_widget; + if (focus) + g_object_ref (focus); + + while (!handled && + focus && focus != widget && + gtk_widget_get_toplevel (focus) == widget) + { + GtkWidget *parent; + + if (GTK_WIDGET_IS_SENSITIVE (focus)) + handled = gtk_widget_event (focus, (GdkEvent*) event); + + parent = focus->parent; + if (parent) + g_object_ref (parent); + + g_object_unref (focus); + + focus = parent; + } + + if (focus) + g_object_unref (focus); + + return handled; +} + static gint gtk_window_key_press_event (GtkWidget *widget, GdkEventKey *event) { - GtkWindow *window; - GtkWidget *focus; - gboolean handled; + GtkWindow *window = GTK_WINDOW (widget); + gboolean handled = FALSE; - window = GTK_WINDOW (widget); - - handled = FALSE; - - /* Check for mnemonics and accelerators - */ + /* handle mnemonics and accelerators */ if (!handled) handled = gtk_window_activate_key (window, event); + /* handle focus widget key events */ if (!handled) - { - focus = window->focus_widget; - if (focus) - g_object_ref (focus); - - while (!handled && - focus && focus != widget && - gtk_widget_get_toplevel (focus) == widget) - { - GtkWidget *parent; - - if (GTK_WIDGET_IS_SENSITIVE (focus)) - handled = gtk_widget_event (focus, (GdkEvent*) event); - - parent = focus->parent; - if (parent) - g_object_ref (parent); - - g_object_unref (focus); - - focus = parent; - } - - if (focus) - g_object_unref (focus); - } + handled = gtk_window_propagate_key_event (window, event); /* Chain up, invokes binding set */ - if (!handled && GTK_WIDGET_CLASS (parent_class)->key_press_event) + if (!handled) handled = GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event); return handled; @@ -4239,20 +4261,16 @@ static gint gtk_window_key_release_event (GtkWidget *widget, GdkEventKey *event) { - GtkWindow *window; - gint handled; - - window = GTK_WINDOW (widget); - handled = FALSE; - if (window->focus_widget && - window->focus_widget != widget && - GTK_WIDGET_SENSITIVE (window->focus_widget)) - { - handled = gtk_widget_event (window->focus_widget, (GdkEvent*) event); - } + GtkWindow *window = GTK_WINDOW (widget); + gboolean handled = FALSE; - if (!handled && GTK_WIDGET_CLASS (parent_class)->key_release_event) - handled = GTK_WIDGET_CLASS (parent_class)->key_release_event (widget, event); + /* handle focus widget key events */ + if (!handled) + handled = gtk_window_propagate_key_event (window, event); + + /* Chain up, invokes binding set */ + if (!handled) + handled = GTK_WIDGET_CLASS (parent_class)->key_press_event (widget, event); return handled; } @@ -7068,9 +7086,9 @@ gtk_window_free_key_hash (GtkWindow *window) /** * gtk_window_activate_key: - * @window: a #GtkWindow - * @event: a #GdkEventKey - * + * @window: a #GtkWindow + * @event: a #GdkEventKey + * * Activates mnemonics and accelerators for this #GtkWindow. This is normally * called by the default ::key_press_event handler for toplevel windows, * however in some cases it may be useful to call this directly when diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index 0b0c163b42..da6b67a80b 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -287,6 +287,8 @@ GdkModifierType gtk_window_get_mnemonic_modifier (GtkWindow *window); gboolean gtk_window_activate_key (GtkWindow *window, GdkEventKey *event); +gboolean gtk_window_propagate_key_event (GtkWindow *window, + GdkEventKey *event); void gtk_window_present (GtkWindow *window); void gtk_window_iconify (GtkWindow *window);