[balsa/wip/gtk4: 136/351] Implement LibBalsaAddressViewEntry



commit c2ab1d17f7af04c927c9cfd08d8aed38490ad4eb
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Fri Jan 26 09:59:45 2018 -0500

    Implement LibBalsaAddressViewEntry
    
    Implement LibBalsaAddressViewEntry as a subclass of GtkEntry. It has a
    "popup-completions" signal bound to the Esc key, so that we can avoid
    connecting to the "key-press-event" signal.

 libbalsa/address-view.c |  106 ++++++++++++++++++++++++++++++++++++++--------
 libbalsa/address-view.h |   27 ++----------
 2 files changed, 91 insertions(+), 42 deletions(-)
---
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index 848f529..fb384f2 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -40,6 +40,86 @@
 #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;
 
@@ -190,10 +270,6 @@ 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(GtkEntry * entry,
-                                    GdkEvent * event,
-                                    LibBalsaAddressView * address_view);
-
 static void lbav_insert_text_cb(GtkEditable * editable,
                                 const gchar * text,
                                 gint length,
@@ -528,7 +604,7 @@ lbav_insert_row(LibBalsaAddressView * address_view, gint row,
     /*
      * Attach an entry for the address
      */
-    entry = gtk_entry_new();
+    entry = libbalsa_address_view_entry_new(address_view);
     gtk_widget_set_hexpand(entry, TRUE);
 
     completion = gtk_entry_completion_new();
@@ -552,8 +628,6 @@ 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);
-    g_signal_connect(entry, "key-press-event",
-                     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",
@@ -777,22 +851,18 @@ lbav_entry_changed_cb(GtkEntry * entry, LibBalsaAddressView * address_view)
 }
 
 /*
- *     Callback for the entry's "key-pressed" event
+ *     Class method for LibBalsaAddressViewEntry::popup-completions
  */
-static gboolean
-lbav_key_pressed_cb(GtkEntry * entry,
-                    GdkEvent * event,
-                    LibBalsaAddressView * address_view)
+static void
+lbav_popup_completions(LibBalsaAddressViewEntry * view_entry)
 {
+    LibBalsaAddressView *address_view = view_entry->address_view;
+    GtkEntry *entry = (GtkEntry *) view_entry;
     GtkEntryCompletion *completion;
-    guint keyval;
-
-    if (!gdk_event_get_keyval(event, &keyval) || keyval != GDK_KEY_Escape)
-        return GDK_EVENT_PROPAGATE;
 
     if (address_view->last_was_escape) {
         address_view->last_was_escape = FALSE;
-        return GDK_EVENT_PROPAGATE;
+        return;
     }
     address_view->last_was_escape = TRUE;
 
@@ -804,8 +874,6 @@ lbav_key_pressed_cb(GtkEntry * entry,
     g_signal_emit_by_name(entry, "changed");
     g_signal_handlers_unblock_by_func(entry, lbav_entry_changed_cb,
                                       address_view);
-
-    return GDK_EVENT_STOP;
 }
 
 /*
diff --git a/libbalsa/address-view.h b/libbalsa/address-view.h
index 5ceb041..9391823 100644
--- a/libbalsa/address-view.h
+++ b/libbalsa/address-view.h
@@ -26,30 +26,10 @@
 #include <gmime/gmime.h>
 
 G_BEGIN_DECLS
-#define LIBBALSA_TYPE_ADDRESS_VIEW                              \
-    (libbalsa_address_view_get_type())
-#define LIBBALSA_ADDRESS_VIEW(obj)                              \
-    (G_TYPE_CHECK_INSTANCE_CAST((obj),                          \
-                                LIBBALSA_TYPE_ADDRESS_VIEW,     \
-                                LibBalsaAddressView))
-#define LIBBALSA_ADDRESS_VIEW_CLASS(klass)                      \
-    (G_TYPE_CHECK_CLASS_CAST((klass),                           \
-                             LIBBALSA_TYPE_ADDRESS_VIEW,        \
-                             LibBalsaAddressViewClass))
-#define LIBBALSA_IS_ADDRESS_VIEW(obj)                           \
-    (G_TYPE_CHECK_INSTANCE_TYPE((obj),                          \
-                                LIBBALSA_TYPE_ADDRESS_VIEW))
-#define LIBBALSA_IS_ADDRESS_VIEW_CLASS(klass)                   \
-    (G_TYPE_CHECK_CLASS_TYPE((klass),                           \
-                             LIBBALSA_TYPE_ADDRESS_VIEW))
-#define LIBBALSA_ADDRESS_VIEW_GET_CLASS(obj)                    \
-    (G_TYPE_INSTANCE_GET_CLASS((obj),                           \
-                               LIBBALSA_TYPE_ADDRESS_VIEW,      \
-                               LibBalsaAddressViewClass))
-typedef struct _LibBalsaAddressView LibBalsaAddressView;
-typedef struct _LibBalsaAddressViewClass LibBalsaAddressViewClass;
 
-GType libbalsa_address_view_get_type(void) G_GNUC_CONST;
+#define LIBBALSA_TYPE_ADDRESS_VIEW (libbalsa_address_view_get_type())
+G_DECLARE_FINAL_TYPE(LibBalsaAddressView, libbalsa_address_view,
+                     LIBBALSA, ADDRESS_VIEW, GtkGrid)
 
 LibBalsaAddressView *libbalsa_address_view_new(const gchar * const *types,
                                                guint n_types,
@@ -84,4 +64,5 @@ void libbalsa_address_view_set_close_icon(GdkPixbuf * close_icon);
 void libbalsa_address_view_set_drop_down_icon(GdkPixbuf * drop_down_icon);
 
 G_END_DECLS
+
 #endif                          /* __LIBBALSA_ADDRESS_VIEW_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]