From c03700734ee4fe5caa0e602bfe261acad96511db Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 6 Feb 2004 23:37:00 +0000 Subject: [PATCH] Add change notification for GtkAccelMap, by on-demand instantiating a Sat Feb 7 00:06:44 2004 Matthias Clasen * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, by on-demand instantiating a singleton object with a "changed" signal. * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller for GtkAccelMap::changed. --- ChangeLog | 9 +++ ChangeLog.pre-2-10 | 9 +++ ChangeLog.pre-2-4 | 9 +++ ChangeLog.pre-2-6 | 9 +++ ChangeLog.pre-2-8 | 9 +++ docs/reference/ChangeLog | 9 +++ docs/reference/gtk/gtk-sections.txt | 11 +++ docs/reference/gtk/gtk.types | 1 + gtk/gtkaccelmap.c | 101 +++++++++++++++++++++++++++- gtk/gtkaccelmap.h | 14 ++++ gtk/gtkmarshalers.list | 1 + 11 files changed, 179 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 170ea80b4..6da0977d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sat Feb 7 00:06:44 2004 Matthias Clasen + + * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, + by on-demand instantiating a singleton object with a "changed" + signal. + + * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller + for GtkAccelMap::changed. + Fri Feb 6 23:08:29 2004 Matthias Clasen * gtk/gtktextbtree.c (_gtk_text_btree_check): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 170ea80b4..6da0977d3 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,12 @@ +Sat Feb 7 00:06:44 2004 Matthias Clasen + + * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, + by on-demand instantiating a singleton object with a "changed" + signal. + + * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller + for GtkAccelMap::changed. + Fri Feb 6 23:08:29 2004 Matthias Clasen * gtk/gtktextbtree.c (_gtk_text_btree_check): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 170ea80b4..6da0977d3 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,12 @@ +Sat Feb 7 00:06:44 2004 Matthias Clasen + + * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, + by on-demand instantiating a singleton object with a "changed" + signal. + + * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller + for GtkAccelMap::changed. + Fri Feb 6 23:08:29 2004 Matthias Clasen * gtk/gtktextbtree.c (_gtk_text_btree_check): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 170ea80b4..6da0977d3 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,12 @@ +Sat Feb 7 00:06:44 2004 Matthias Clasen + + * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, + by on-demand instantiating a singleton object with a "changed" + signal. + + * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller + for GtkAccelMap::changed. + Fri Feb 6 23:08:29 2004 Matthias Clasen * gtk/gtktextbtree.c (_gtk_text_btree_check): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 170ea80b4..6da0977d3 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,12 @@ +Sat Feb 7 00:06:44 2004 Matthias Clasen + + * gtk/gtkaccelmap.[hc]: Add change notification for GtkAccelMap, + by on-demand instantiating a singleton object with a "changed" + signal. + + * gtk/gtkmarshalers.list (VOID:STRING,UINT,FLAGS): Add marshaller + for GtkAccelMap::changed. + Fri Feb 6 23:08:29 2004 Matthias Clasen * gtk/gtktextbtree.c (_gtk_text_btree_check): diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index f874c5358..cf17da0d9 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,12 @@ +Sat Feb 7 00:38:23 2004 Matthias Clasen + + * gtk/gtk-sections.txt: Add GtkAccelMap, gtk_accel_map_get, + and a bunch of standard and private accel map symbols. + +Sat Feb 7 00:38:03 2004 Matthias Clasen + + * gtk/gtk.types: Add gtk_accel_map_get_type. + Sun Feb 1 00:37:44 2004 Matthias Clasen * gtk/tmpl/gtkobject.sgml: Remove misleading documentation for diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index e7fcd110b..ea0902f9f 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -45,6 +45,7 @@ GTK_ACCEL_GROUP_GET_CLASS
gtkaccelmap Accelerator Maps +GtkAccelMap GtkAccelMapForeach gtk_accel_map_add_entry gtk_accel_map_lookup_entry @@ -57,6 +58,16 @@ gtk_accel_map_save_fd gtk_accel_map_load_scanner gtk_accel_map_add_filter gtk_accel_map_foreach_unfiltered +gtk_accel_map_get + +GTK_TYPE_ACCEL_MAP +GTK_IS_ACCEL_MAP +GTK_ACCEL_MAP_CLASS +GTK_IS_ACCEL_MAP_CLASS +GTK_ACCEL_MAP_GET_CLASS +GtkAccelMapClass + +gtk_accel_map_get_type
diff --git a/docs/reference/gtk/gtk.types b/docs/reference/gtk/gtk.types index f9305e53e..29c23751d 100644 --- a/docs/reference/gtk/gtk.types +++ b/docs/reference/gtk/gtk.types @@ -1,6 +1,7 @@ #include gtk_accel_group_get_type +gtk_accel_map_get_type gtk_accel_label_get_type gtk_accessible_get_type gtk_action_get_type diff --git a/gtk/gtkaccelmap.c b/gtk/gtkaccelmap.c index e385447b0..80c8fdd7d 100644 --- a/gtk/gtkaccelmap.c +++ b/gtk/gtkaccelmap.c @@ -21,6 +21,7 @@ #include "gtkaccelmap.h" +#include "gtkmarshalers.h" #include "gtkwindow.h" /* in lack of GtkAcceleratable */ #include @@ -36,6 +37,16 @@ /* --- structures --- */ +struct _GtkAccelMap +{ + GObject parent_instance; +}; + +struct _GtkAccelMapClass +{ + GObjectClass parent_class; +}; + typedef struct { const gchar *accel_path; guint accel_key; @@ -47,11 +58,21 @@ typedef struct { GSList *groups; } AccelEntry; +/* --- signals --- */ +enum { + CHANGED, + LAST_SIGNAL +}; /* --- variables --- */ -static GHashTable *accel_entry_ht = NULL; /* accel_path -> AccelEntry */ -static GSList *accel_filters = NULL; -static GHookList *change_hooks = NULL; + +static GHashTable *accel_entry_ht = NULL; /* accel_path -> AccelEntry */ +static GSList *accel_filters = NULL; +static gulong accel_map_signals[LAST_SIGNAL] = { 0, }; +static GtkAccelMap *accel_map; + +/* --- prototypes --- */ +static void do_accel_map_changed (AccelEntry *entry); /* --- functions --- */ static guint @@ -163,6 +184,8 @@ gtk_accel_map_add_entry (const gchar *accel_path, entry->changed = FALSE; entry->lock_count = 0; g_hash_table_insert (accel_entry_ht, entry, entry); + + do_accel_map_changed (entry); } } @@ -242,6 +265,8 @@ internal_change_entry (const gchar *accel_path, entry->accel_key = accel_key; entry->accel_mods = accel_mods; entry->changed = TRUE; + + do_accel_map_changed (entry); } return TRUE; } @@ -268,6 +293,8 @@ internal_change_entry (const gchar *accel_path, entry->accel_key = accel_key; entry->accel_mods = accel_mods; entry->changed = TRUE; + + do_accel_map_changed (entry); } return TRUE; } @@ -379,6 +406,8 @@ internal_change_entry (const gchar *accel_path, /* unref accel groups */ for (slist = group_list; slist; slist = slist->next) g_object_unref (slist->data); + + do_accel_map_changed (entry); } g_slist_free (replace_list); g_slist_free (group_list); @@ -900,3 +929,69 @@ gtk_accel_map_unlock_path (const gchar *accel_path) entry->lock_count -= 1; } +G_DEFINE_TYPE (GtkAccelMap, gtk_accel_map, G_TYPE_OBJECT); + +static void +gtk_accel_map_class_init (GtkAccelMapClass *accel_map_class) +{ + /** + * GtkAccelMap::changed: + * @object: the global accel map object + * @accel_path: the path of the accelerator that changed + * @accel_key: the key value for the new accelerator + * @accel_mods: the modifier mask for the new accelerator + * + * Notifies of a change in the global accelerator map. + * The path is also used as the detail for the signal, + * so it is possible to connect to + * changed::accel_path. + * + * Since: 2.4 + */ + accel_map_signals[CHANGED] = g_signal_new ("changed", + G_TYPE_FROM_CLASS (accel_map_class), + G_SIGNAL_DETAILED|G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + _gtk_marshal_VOID__STRING_UINT_FLAGS, + G_TYPE_NONE, 3, + G_TYPE_STRING, G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE); +} + +static void +gtk_accel_map_init (GtkAccelMap *accel_map) +{ +} + +/** + * gtk_accel_map_get: + * + * Gets the singleton global #GtkAccelMap object. This object + * is useful only for notification of changes to the accelerator + * map via the ::changed signal; it isn't a parameter to the + * other accelerator map functions. + * + * Return value: the global #GtkAccelMap object + * + * Since: 2.4 + **/ +GtkAccelMap * +gtk_accel_map_get (void) +{ + if (!accel_map) + accel_map = g_object_new (GTK_TYPE_ACCEL_MAP, NULL); + + return accel_map; +} + +static void +do_accel_map_changed (AccelEntry *entry) +{ + if (accel_map) + g_signal_emit (accel_map, + accel_map_signals[CHANGED], + g_quark_from_string (entry->accel_path), + entry->accel_path, + entry->accel_key, + entry->accel_mods); +} diff --git a/gtk/gtkaccelmap.h b/gtk/gtkaccelmap.h index 9601b4bc4..bec1b9f74 100644 --- a/gtk/gtkaccelmap.h +++ b/gtk/gtkaccelmap.h @@ -24,6 +24,16 @@ G_BEGIN_DECLS +/* --- global GtkAccelMap object --- */ +#define GTK_TYPE_ACCEL_MAP (gtk_accel_map_get_type ()) +#define GTK_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_CAST ((accel_map), GTK_TYPE_ACCEL_MAP, GtkAccelMap)) +#define GTK_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass)) +#define GTK_IS_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_TYPE ((accel_map), GTK_TYPE_ACCEL_MAP)) +#define GTK_IS_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_MAP)) +#define GTK_ACCEL_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass)) + +typedef struct _GtkAccelMap GtkAccelMap; +typedef struct _GtkAccelMapClass GtkAccelMapClass; /* --- notifier --- */ typedef void (*GtkAccelMapForeach) (gpointer data, @@ -59,6 +69,10 @@ void gtk_accel_map_add_filter (const gchar *filter_pattern); void gtk_accel_map_foreach_unfiltered (gpointer data, GtkAccelMapForeach foreach_func); +/* --- notification --- */ +GType gtk_accel_map_get_type (void); +GtkAccelMap *gtk_accel_map_get (void); + /* --- internal API --- */ void _gtk_accel_map_init (void); diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list index f897caef2..9d5bc9be6 100644 --- a/gtk/gtkmarshalers.list +++ b/gtk/gtkmarshalers.list @@ -87,6 +87,7 @@ VOID:POINTER,UINT VOID:STRING VOID:STRING,STRING VOID:STRING,INT,POINTER +VOID:STRING,UINT,FLAGS VOID:UINT,FLAGS,BOXED VOID:UINT,UINT VOID:UINT,STRING -- 2.43.2