diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2017-12-11 19:21:38 +0100 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2018-02-07 16:11:55 -0500 |
commit | 2584254c1844f6fc41b6e0aa25c2405bfb5678d7 (patch) | |
tree | bb9b68a9f7e4ba05b822d67c3911d6cb8a8c181b | |
parent | 601c5fd7346d20a4d64cd0d47a6da1d4606e6185 (diff) | |
download | gtk+-2584254c1844f6fc41b6e0aa25c2405bfb5678d7.tar.gz |
WIP: gtk: Add GtkEventControllerKey
This event controller is meant to replace usage from key-press/release-event
handlers all through.
-rw-r--r-- | gtk/gtk.h | 1 | ||||
-rw-r--r-- | gtk/gtkeventcontrollerkey.c | 123 | ||||
-rw-r--r-- | gtk/gtkeventcontrollerkey.h | 50 | ||||
-rw-r--r-- | gtk/meson.build | 3 |
4 files changed, 177 insertions, 0 deletions
@@ -93,6 +93,7 @@ #include <gtk/gtkentrycompletion.h> #include <gtk/gtkenums.h> #include <gtk/gtkeventcontroller.h> +#include <gtk/gtkeventcontrollerkey.h> #include <gtk/gtkeventcontrollermotion.h> #include <gtk/gtkeventcontrollerscroll.h> #include <gtk/gtkexpander.h> diff --git a/gtk/gtkeventcontrollerkey.c b/gtk/gtkeventcontrollerkey.c new file mode 100644 index 0000000000..64a1fb8137 --- /dev/null +++ b/gtk/gtkeventcontrollerkey.c @@ -0,0 +1,123 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2017, Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + * Author(s): Carlos Garnacho <carlosg@gnome.org> + */ + +#include "config.h" + +#include "gtkintl.h" +#include "gtkprivate.h" +#include "gtkwidget.h" +#include "gtkeventcontrollerprivate.h" +#include "gtkeventcontrollerkey.h" +#include "gtkbindings.h" + +#include <gdk/gdk.h> + +struct _GtkEventControllerKey +{ + GtkEventController parent_instance; +}; + +struct _GtkEventControllerKeyClass +{ + GtkEventControllerClass parent_class; +}; + +enum { + KEY_PRESSED, + KEY_RELEASED, + N_SIGNALS +}; + +static guint signals[N_SIGNALS] = { 0 }; + +G_DEFINE_TYPE (GtkEventControllerKey, gtk_event_controller_key, + GTK_TYPE_EVENT_CONTROLLER) + +static gboolean +gtk_event_controller_key_handle_event (GtkEventController *controller, + const GdkEvent *event) +{ + GdkEventType event_type = gdk_event_get_event_type (event); + gboolean handled; + GdkModifierType state; + guint16 keycode; + guint keyval; + + if (event_type != GDK_KEY_PRESS && event_type != GDK_KEY_RELEASE) + return FALSE; + + gdk_event_get_state (event, &state); + gdk_event_get_keycode (event, &keycode); + gdk_event_get_keyval (event, &keyval); + + if (event_type == GDK_KEY_PRESS) + { + g_signal_emit (controller, signals[KEY_PRESSED], 0, + keyval, keycode, state, &handled); + } + else if (event_type == GDK_KEY_RELEASE) + { + g_signal_emit (controller, signals[KEY_RELEASED], 0, + keyval, keycode, state, &handled); + } + else + handled = TRUE; + + if (!handled) + handled = gtk_bindings_activate_event (G_OBJECT (gtk_event_controller_get_widget (controller)), + (GdkEventKey *)event); + + return handled; +} + +static void +gtk_event_controller_key_class_init (GtkEventControllerKeyClass *klass) +{ + GtkEventControllerClass *controller_class = GTK_EVENT_CONTROLLER_CLASS (klass); + + controller_class->handle_event = gtk_event_controller_key_handle_event; + + signals[KEY_PRESSED] = + g_signal_new (I_("key-pressed"), + GTK_TYPE_EVENT_CONTROLLER_KEY, + G_SIGNAL_RUN_LAST, + 0, _gtk_boolean_handled_accumulator, NULL, NULL, + G_TYPE_BOOLEAN, 3, G_TYPE_UINT, G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE); + signals[KEY_RELEASED] = + g_signal_new (I_("key-released"), + GTK_TYPE_EVENT_CONTROLLER_KEY, + G_SIGNAL_RUN_LAST, + 0, _gtk_boolean_handled_accumulator, NULL, NULL, + G_TYPE_BOOLEAN, 3, G_TYPE_UINT, G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE); +} + +static void +gtk_event_controller_key_init (GtkEventControllerKey *controller) +{ +} + +GtkEventController * +gtk_event_controller_key_new (GtkWidget *widget) +{ + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); + + return g_object_new (GTK_TYPE_EVENT_CONTROLLER_KEY, + "widget", widget, + NULL); +} diff --git a/gtk/gtkeventcontrollerkey.h b/gtk/gtkeventcontrollerkey.h new file mode 100644 index 0000000000..470c35aa34 --- /dev/null +++ b/gtk/gtkeventcontrollerkey.h @@ -0,0 +1,50 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2017, Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + * Author(s): Carlos Garnacho <carlosg@gnome.org> + */ + +#ifndef __GTK_EVENT_CONTROLLER_KEY_H__ +#define __GTK_EVENT_CONTROLLER_KEY_H__ + +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#error "Only <gtk/gtk.h> can be included directly." +#endif + +#include <gdk/gdk.h> +#include <gtk/gtkeventcontroller.h> + +G_BEGIN_DECLS + +#define GTK_TYPE_EVENT_CONTROLLER_KEY (gtk_event_controller_key_get_type ()) +#define GTK_EVENT_CONTROLLER_KEY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_EVENT_CONTROLLER_KEY, GtkEventControllerKey)) +#define GTK_EVENT_CONTROLLER_KEY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_EVENT_CONTROLLER_KEY, GtkEventControllerKeyClass)) +#define GTK_IS_EVENT_CONTROLLER_KEY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_EVENT_CONTROLLER_KEY)) +#define GTK_IS_EVENT_CONTROLLER_KEY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_EVENT_CONTROLLER_KEY)) +#define GTK_EVENT_CONTROLLER_KEY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_EVENT_CONTROLLER_KEY, GtkEventControllerKeyClass)) + +typedef struct _GtkEventControllerKey GtkEventControllerKey; +typedef struct _GtkEventControllerKeyClass GtkEventControllerKeyClass; + +GDK_AVAILABLE_IN_ALL +GType gtk_event_controller_key_get_type (void) G_GNUC_CONST; + +GDK_AVAILABLE_IN_ALL +GtkEventController *gtk_event_controller_key_new (GtkWidget *widget); + +G_END_DECLS + +#endif /* __GTK_EVENT_CONTROLLER_KEY_H__ */ diff --git a/gtk/meson.build b/gtk/meson.build index b0888d5365..66b5d20726 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -201,6 +201,8 @@ gtk_public_sources = files([ 'gtkentrybuffer.c', 'gtkentrycompletion.c', 'gtkeventcontroller.c', + 'gtkeventcontrollerkey.c', + 'gtkeventcontrollerlegacy.c', 'gtkeventcontrollermotion.c', 'gtkeventcontrollerscroll.c', 'gtkexpander.c', @@ -432,6 +434,7 @@ gtk_public_headers = files([ 'gtkentrycompletion.h', 'gtkenums.h', 'gtkeventcontroller.h', + 'gtkeventcontrollerkey.h', 'gtkeventcontrollerscroll.h', 'gtkeventcontrollermotion.h', 'gtkexpander.h', |