[balsa/wip/gtk4: 136/351] Implement LibBalsaAddressViewEntry
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa/wip/gtk4: 136/351] Implement LibBalsaAddressViewEntry
- Date: Wed, 23 May 2018 21:28:22 +0000 (UTC)
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]