[balsa/wip/gtk4: 288/351] address-view: Use a GtkEventControllerKey
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa/wip/gtk4: 288/351] address-view: Use a GtkEventControllerKey
- Date: Wed, 23 May 2018 21:41:11 +0000 (UTC)
commit 2bad82c524724ec7da16a85140e1767523eeb5e6
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Wed Apr 25 16:14:11 2018 -0400
address-view: Use a GtkEventControllerKey
…to catch escape-key presses, instead of a GtkBindingSet.
libbalsa/address-view.c | 119 +++++++++++++----------------------------------
1 files changed, 32 insertions(+), 87 deletions(-)
---
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index 01941e2..6d8cd3e 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -40,86 +40,6 @@
#include "address-book.h"
#include "misc.h"
-/*************************************************************
- *
- * LibBalsaAddressViewEntry
- *
- * Subclass of GtkEntry with a key-binding for GDK_KEY_Escape
- *
- ************************************************************/
-typedef struct {
- GtkEntry parent;
-
- LibBalsaAddressView *address_view;
-} LibBalsaAddressViewEntry;
-
-typedef struct {
- GtkEntryClass parent_class;
-} LibBalsaAddressViewEntryClass;
-
-static void lbav_popup_completions(LibBalsaAddressViewEntry * entry);
-
-/*
- * GObject class boilerplate
- */
-
-enum {
- POPUP_COMPLETIONS,
- ENTRY_LAST_SIGNAL
-};
-
-static guint address_view_entry_signals[ENTRY_LAST_SIGNAL] = { 0 };
-
-static void
-libbalsa_address_view_entry_init(LibBalsaAddressViewEntry * entry)
-{
-}
-
-static GType libbalsa_address_view_entry_get_type(void);
-
-G_DEFINE_TYPE(LibBalsaAddressViewEntry, libbalsa_address_view_entry, GTK_TYPE_ENTRY)
-
-static void
-libbalsa_address_view_entry_class_init(LibBalsaAddressViewEntryClass * klass)
-{
- GtkBindingSet *binding_set;
-
- /**
- * LibBalsaAddressViewEntry::popup-completions:
- * @entry: the object which received the signal
- *
- * The ::popup-completions signal is bound to the Esc key.
- **/
- address_view_entry_signals[POPUP_COMPLETIONS] =
- g_signal_new_class_handler("popup-completions",
- G_OBJECT_CLASS_TYPE(klass),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
- G_CALLBACK(lbav_popup_completions),
- NULL, NULL, NULL,
- G_TYPE_NONE, 0);
-
- binding_set = gtk_binding_set_by_class(klass);
- gtk_binding_entry_add_signal(binding_set,
- GDK_KEY_Escape, 0,
- "popup-completions", 0);
-}
-
-static GtkWidget *
-libbalsa_address_view_entry_new(LibBalsaAddressView * address_view)
-{
- LibBalsaAddressViewEntry *entry;
-
- entry = g_object_new(libbalsa_address_view_entry_get_type(), NULL);
- entry->address_view = address_view;
-
- return (GtkWidget *) entry;
-}
-
-/*************************************************************
- *
- * LibBalsaAddressView
- *
- ************************************************************/
struct _LibBalsaAddressView {
GtkGrid parent;
@@ -133,6 +53,8 @@ struct _LibBalsaAddressView {
gchar *domain;
+ GtkEventController *key_controller;
+
/*
* Ephemera
*/
@@ -169,6 +91,7 @@ libbalsa_address_view_finalize(GObject * object)
LibBalsaAddressView *address_view = LIBBALSA_ADDRESS_VIEW(object);
g_free(address_view->domain);
+ g_object_unref(address_view->key_controller);
G_OBJECT_CLASS(libbalsa_address_view_parent_class)->finalize(object);
}
@@ -270,6 +193,13 @@ static gboolean lbav_completion_match_selected_cb(GtkEntryCompletion * completio
static void lbav_entry_changed_cb(GtkEntry * entry, LibBalsaAddressView * address_view);
+static gboolean lbav_key_pressed_cb(GtkEventControllerKey *key_controller,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ gpointer user_data);
+
+
static void lbav_insert_text_cb(GtkEditable * editable,
const gchar * text,
gint length,
@@ -607,7 +537,7 @@ lbav_insert_row(LibBalsaAddressView * address_view, gint row,
/*
* Attach an entry for the address
*/
- entry = libbalsa_address_view_entry_new(address_view);
+ entry = gtk_entry_new();
gtk_widget_set_hexpand(entry, TRUE);
completion = gtk_entry_completion_new();
@@ -631,6 +561,9 @@ lbav_insert_row(LibBalsaAddressView * address_view, gint row,
G_CALLBACK(lbav_entry_activated), address_view);
g_signal_connect(entry, "changed",
G_CALLBACK(lbav_entry_changed_cb), address_view);
+ address_view->key_controller = gtk_event_controller_key_new(entry);
+ g_signal_connect(address_view->key_controller, "key-pressed",
+ G_CALLBACK(lbav_key_pressed_cb), address_view);
g_signal_connect(entry, "insert-text",
G_CALLBACK(lbav_insert_text_cb), address_view);
g_signal_connect_after(entry, "notify::has-focus",
@@ -855,21 +788,31 @@ lbav_entry_changed_cb(GtkEntry * entry, LibBalsaAddressView * address_view)
}
/*
- * Class method for LibBalsaAddressViewEntry::popup-completions
+ * Callback for the entry's "key-pressed" event
*/
-static void
-lbav_popup_completions(LibBalsaAddressViewEntry * view_entry)
+static gboolean
+lbav_key_pressed_cb(GtkEventControllerKey *key_controller,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
+ gpointer user_data)
{
- LibBalsaAddressView *address_view = view_entry->address_view;
- GtkEntry *entry = (GtkEntry *) view_entry;
+ LibBalsaAddressView *address_view = user_data;
+ GtkWidget *widget;
+ GtkEntry *entry;
GtkEntryCompletion *completion;
+ if (keyval != GDK_KEY_Escape)
+ return FALSE;
+
if (address_view->last_was_escape) {
address_view->last_was_escape = FALSE;
- return;
+ return FALSE;
}
address_view->last_was_escape = TRUE;
+ widget = gtk_event_controller_get_widget((GtkEventController *) key_controller);
+ entry = GTK_ENTRY(widget);
completion = gtk_entry_get_completion(entry);
g_signal_handlers_block_by_func(entry, lbav_entry_changed_cb,
address_view);
@@ -878,6 +821,8 @@ lbav_popup_completions(LibBalsaAddressViewEntry * view_entry)
g_signal_emit_by_name(entry, "changed");
g_signal_handlers_unblock_by_func(entry, lbav_entry_changed_cb,
address_view);
+
+ return TRUE;
}
/*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]