Merge branch 'wip/carlosg/key-controller-fixes' into 'gtk-3-24'

key controller fixes

See merge request GNOME/gtk!1144
This commit is contained in:
Emmanuele Bassi 2019-10-21 22:33:55 +00:00
commit 4201a57a83
3 changed files with 19 additions and 16 deletions

View File

@ -47,6 +47,8 @@ struct _GtkEventControllerKey
GtkIMContext *im_context; GtkIMContext *im_context;
GHashTable *pressed_keys; GHashTable *pressed_keys;
GdkModifierType state;
const GdkEvent *current_event; const GdkEvent *current_event;
}; };
@ -87,10 +89,10 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
{ {
GtkEventControllerKey *key = GTK_EVENT_CONTROLLER_KEY (controller); GtkEventControllerKey *key = GTK_EVENT_CONTROLLER_KEY (controller);
GdkEventType event_type = gdk_event_get_event_type (event); GdkEventType event_type = gdk_event_get_event_type (event);
gboolean handled;
GdkModifierType state; GdkModifierType state;
guint16 keycode; guint16 keycode;
guint keyval; guint keyval;
gboolean handled = FALSE;
if (event_type == GDK_FOCUS_CHANGE) if (event_type == GDK_FOCUS_CHANGE)
{ {
@ -112,23 +114,15 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
return TRUE; return TRUE;
} }
if (!gdk_event_get_state (event, &state) || !event->key.is_modifier)
return FALSE;
key->current_event = event; key->current_event = event;
if (event->key.is_modifier) gdk_event_get_state (event, &state);
if (key->state != state)
{ {
if (event_type == GDK_KEY_PRESS) gboolean unused;
g_signal_emit (controller, signals[MODIFIERS], 0, state, &handled);
else
handled = TRUE;
if (handled == TRUE) key->state = state;
{ g_signal_emit (controller, signals[MODIFIERS], 0, state, &unused);
key->current_event = NULL;
return TRUE;
}
} }
gdk_event_get_keycode (event, &keycode); gdk_event_get_keycode (event, &keycode);
@ -206,11 +200,11 @@ gtk_event_controller_key_class_init (GtkEventControllerKeyClass *klass)
GTK_TYPE_EVENT_CONTROLLER_KEY, GTK_TYPE_EVENT_CONTROLLER_KEY,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL,
_gtk_marshal_BOOLEAN__UINT_UINT_FLAGS, _gtk_marshal_VOID__UINT_UINT_FLAGS,
G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE); G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE);
g_signal_set_va_marshaller (signals[KEY_RELEASED], g_signal_set_va_marshaller (signals[KEY_RELEASED],
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
_gtk_marshal_BOOLEAN__UINT_UINT_FLAGSv); _gtk_marshal_VOID__UINT_UINT_FLAGSv);
signals[MODIFIERS] = signals[MODIFIERS] =
g_signal_new (I_("modifiers"), g_signal_new (I_("modifiers"),

View File

@ -115,6 +115,7 @@ VOID:STRING,UINT,FLAGS
VOID:STRING,UINT,FLAGS,UINT VOID:STRING,UINT,FLAGS,UINT
VOID:UINT,FLAGS,BOXED VOID:UINT,FLAGS,BOXED
VOID:UINT,UINT VOID:UINT,UINT
VOID:UINT,UINT,FLAGS
VOID:UINT,STRING VOID:UINT,STRING
VOID:UINT,BOXED,UINT,FLAGS,FLAGS VOID:UINT,BOXED,UINT,FLAGS,FLAGS
VOID:UINT,OBJECT,UINT,FLAGS,FLAGS VOID:UINT,OBJECT,UINT,FLAGS,FLAGS

View File

@ -7206,6 +7206,10 @@ static gboolean
gtk_widget_real_key_press_event (GtkWidget *widget, gtk_widget_real_key_press_event (GtkWidget *widget,
GdkEventKey *event) GdkEventKey *event)
{ {
if (_gtk_widget_run_controllers (widget, (GdkEvent *) event,
GTK_PHASE_BUBBLE))
return GDK_EVENT_STOP;
return gtk_bindings_activate_event (G_OBJECT (widget), event); return gtk_bindings_activate_event (G_OBJECT (widget), event);
} }
@ -7213,6 +7217,10 @@ static gboolean
gtk_widget_real_key_release_event (GtkWidget *widget, gtk_widget_real_key_release_event (GtkWidget *widget,
GdkEventKey *event) GdkEventKey *event)
{ {
if (_gtk_widget_run_controllers (widget, (GdkEvent *) event,
GTK_PHASE_BUBBLE))
return GDK_EVENT_STOP;
return gtk_bindings_activate_event (G_OBJECT (widget), event); return gtk_bindings_activate_event (G_OBJECT (widget), event);
} }