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:
commit
4201a57a83
@ -47,6 +47,8 @@ struct _GtkEventControllerKey
|
||||
GtkIMContext *im_context;
|
||||
GHashTable *pressed_keys;
|
||||
|
||||
GdkModifierType state;
|
||||
|
||||
const GdkEvent *current_event;
|
||||
};
|
||||
|
||||
@ -87,10 +89,10 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
|
||||
{
|
||||
GtkEventControllerKey *key = GTK_EVENT_CONTROLLER_KEY (controller);
|
||||
GdkEventType event_type = gdk_event_get_event_type (event);
|
||||
gboolean handled;
|
||||
GdkModifierType state;
|
||||
guint16 keycode;
|
||||
guint keyval;
|
||||
gboolean handled = FALSE;
|
||||
|
||||
if (event_type == GDK_FOCUS_CHANGE)
|
||||
{
|
||||
@ -112,23 +114,15 @@ gtk_event_controller_key_handle_event (GtkEventController *controller,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!gdk_event_get_state (event, &state) || !event->key.is_modifier)
|
||||
return FALSE;
|
||||
|
||||
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)
|
||||
g_signal_emit (controller, signals[MODIFIERS], 0, state, &handled);
|
||||
else
|
||||
handled = TRUE;
|
||||
gboolean unused;
|
||||
|
||||
if (handled == TRUE)
|
||||
{
|
||||
key->current_event = NULL;
|
||||
return TRUE;
|
||||
}
|
||||
key->state = state;
|
||||
g_signal_emit (controller, signals[MODIFIERS], 0, state, &unused);
|
||||
}
|
||||
|
||||
gdk_event_get_keycode (event, &keycode);
|
||||
@ -206,11 +200,11 @@ gtk_event_controller_key_class_init (GtkEventControllerKeyClass *klass)
|
||||
GTK_TYPE_EVENT_CONTROLLER_KEY,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
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_signal_set_va_marshaller (signals[KEY_RELEASED],
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
_gtk_marshal_BOOLEAN__UINT_UINT_FLAGSv);
|
||||
_gtk_marshal_VOID__UINT_UINT_FLAGSv);
|
||||
|
||||
signals[MODIFIERS] =
|
||||
g_signal_new (I_("modifiers"),
|
||||
|
@ -115,6 +115,7 @@ VOID:STRING,UINT,FLAGS
|
||||
VOID:STRING,UINT,FLAGS,UINT
|
||||
VOID:UINT,FLAGS,BOXED
|
||||
VOID:UINT,UINT
|
||||
VOID:UINT,UINT,FLAGS
|
||||
VOID:UINT,STRING
|
||||
VOID:UINT,BOXED,UINT,FLAGS,FLAGS
|
||||
VOID:UINT,OBJECT,UINT,FLAGS,FLAGS
|
||||
|
@ -7206,6 +7206,10 @@ static gboolean
|
||||
gtk_widget_real_key_press_event (GtkWidget *widget,
|
||||
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);
|
||||
}
|
||||
|
||||
@ -7213,6 +7217,10 @@ static gboolean
|
||||
gtk_widget_real_key_release_event (GtkWidget *widget,
|
||||
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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user