diff options
author | Tristan Van Berkom <tvb@src.gnome.org> | 2008-04-02 06:03:31 +0000 |
---|---|---|
committer | Tristan Van Berkom <tvb@src.gnome.org> | 2008-04-02 06:03:31 +0000 |
commit | 097a7dacf7ab488ba893995379697d1e5f0902b9 (patch) | |
tree | 92d9e34652fe10fe743a74339de68d40a54778d5 | |
parent | 744a528262ba5ef273c8c820034ad5289ae41796 (diff) | |
download | glade-097a7dacf7ab488ba893995379697d1e5f0902b9.tar.gz |
Implemented loading of accelerators.
* gladeui/glade-gtk.c: Implemented loading of accelerators.
svn path=/branches/builder/; revision=1757
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | gladeui/glade-property-class.h | 7 | ||||
-rw-r--r-- | gladeui/glade-property.c | 5 | ||||
-rw-r--r-- | plugins/gtk+/glade-accels.h | 6 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk.c | 125 |
5 files changed, 131 insertions, 14 deletions
@@ -7,6 +7,8 @@ Moved all accelerater code out of the core and into the plugin, still working on loading glade files with the new parser... + * gladeui/glade-gtk.c: Implemented loading of accelerators. + 2008-04-01 Tristan Van Berkom <tvb@gnome.org> * gladeui/glade-widget.[ch], gladeui/glade-widget-adaptor.[ch], diff --git a/gladeui/glade-property-class.h b/gladeui/glade-property-class.h index 90c0d583..88c500b2 100644 --- a/gladeui/glade-property-class.h +++ b/gladeui/glade-property-class.h @@ -19,7 +19,6 @@ G_BEGIN_DECLS #define GPC_PROPERTY_NAMELEN 512 /* Enough space for a property name I think */ typedef struct _GladePropertyClass GladePropertyClass; -typedef struct _GladeAccelInfo GladeAccelInfo; /** * GPCType: @@ -37,12 +36,6 @@ typedef enum { GPC_ACCEL_PROPERTY } GPCType; -struct _GladeAccelInfo { - guint key; - GdkModifierType modifiers; - gchar *signal; -}; - struct _GladePropertyClass { GPCType type; /* A symbolic type used to load/save properties differently diff --git a/gladeui/glade-property.c b/gladeui/glade-property.c index 21b93fa5..52e0c0d9 100644 --- a/gladeui/glade-property.c +++ b/gladeui/glade-property.c @@ -393,7 +393,7 @@ glade_property_write_impl (GladeProperty *property, name = g_strdup (property->klass->id); } - /* convert the value of this property to a string */ + /* XXX ??? convert the value of this property to a string */ if (property->klass->type == GPC_ACCEL_PROPERTY || (value = glade_widget_adaptor_string_from_value (GLADE_WIDGET_ADAPTOR (property->klass->handle), @@ -1245,9 +1245,6 @@ glade_property_read (GladeProperty *property, g_return_val_if_fail (pclass != NULL, NULL); g_return_val_if_fail (node != NULL, NULL); - g_print ("glade_property_read for property '%s', nodename %s\n", - pclass->id, glade_xml_node_get_name (node)); - /* This code should work the same for <packing> and <widget> */ if (!(glade_xml_node_verify_silent (node, GLADE_XML_TAG_PACKING) || glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET))) diff --git a/plugins/gtk+/glade-accels.h b/plugins/gtk+/glade-accels.h index 91d31359..afe1bf61 100644 --- a/plugins/gtk+/glade-accels.h +++ b/plugins/gtk+/glade-accels.h @@ -15,7 +15,13 @@ typedef struct _GladeKey GladeKey; typedef struct _GladeParamSpecAccel GladeParamSpecAccel; +typedef struct _GladeAccelInfo GladeAccelInfo; +struct _GladeAccelInfo { + guint key; + GdkModifierType modifiers; + gchar *signal; +}; struct _GladeKey { guint value; diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c index fe02b451..8f34b7e8 100644 --- a/plugins/gtk+/glade-gtk.c +++ b/plugins/gtk+/glade-gtk.c @@ -243,20 +243,139 @@ glade_gtk_stop_emission_POINTER (gpointer instance, gpointer dummy, gpointer dat } /* ----------------------------- GtkWidget ------------------------------ */ +#define GLADE_TAG_ACCEL "accelerator" +#define GLADE_TAG_ACCEL_KEY "key" +#define GLADE_TAG_ACCEL_MODIFIERS "modifiers" +#define GLADE_TAG_ACCEL_SIGNAL "signal" + +static GdkModifierType +glade_gtk_parse_modifiers (const gchar *string) +{ + const gchar *pos = string; + GdkModifierType modifiers = 0; + + while (pos[0]) + { + if (!strncmp(pos, "GDK_", 4)) { + pos += 4; + if (!strncmp(pos, "SHIFT_MASK", 10)) { + modifiers |= GDK_SHIFT_MASK; + pos += 10; + } else if (!strncmp(pos, "LOCK_MASK", 9)) { + modifiers |= GDK_LOCK_MASK; + pos += 9; + } else if (!strncmp(pos, "CONTROL_MASK", 12)) { + modifiers |= GDK_CONTROL_MASK; + pos += 12; + } else if (!strncmp(pos, "MOD", 3) && + !strncmp(pos+4, "_MASK", 5)) { + switch (pos[3]) { + case '1': + modifiers |= GDK_MOD1_MASK; break; + case '2': + modifiers |= GDK_MOD2_MASK; break; + case '3': + modifiers |= GDK_MOD3_MASK; break; + case '4': + modifiers |= GDK_MOD4_MASK; break; + case '5': + modifiers |= GDK_MOD5_MASK; break; + } + pos += 9; + } else if (!strncmp(pos, "BUTTON", 6) && + !strncmp(pos+7, "_MASK", 5)) { + switch (pos[6]) { + case '1': + modifiers |= GDK_BUTTON1_MASK; break; + case '2': + modifiers |= GDK_BUTTON2_MASK; break; + case '3': + modifiers |= GDK_BUTTON3_MASK; break; + case '4': + modifiers |= GDK_BUTTON4_MASK; break; + case '5': + modifiers |= GDK_BUTTON5_MASK; break; + } + pos += 12; + } else if (!strncmp(pos, "RELEASE_MASK", 12)) { + modifiers |= GDK_RELEASE_MASK; + pos += 12; + } else + pos++; + } else + pos++; + } + return modifiers; +} + +static void +glade_gtk_widget_read_accels (GladeWidget *widget, + GladeXmlNode *node) +{ + GladeProperty *property; + GladeXmlNode *prop; + GladeAccelInfo *ainfo; + GValue *value = NULL; + GList *accels = NULL; + + for (prop = glade_xml_node_get_children (node); + prop; prop = glade_xml_node_next (prop)) + { + gchar *key, *modifiers, *signal; + + + if (!glade_xml_node_verify_silent (prop, GLADE_TAG_ACCEL)) + continue; + + /* Get from xml... */ + key = glade_xml_get_property_string_required + (prop, GLADE_TAG_ACCEL_KEY, NULL); + signal = glade_xml_get_property_string_required + (prop, GLADE_TAG_ACCEL_MODIFIERS, NULL); + modifiers = glade_xml_get_property_string (prop, GLADE_TAG_ACCEL_MODIFIERS); + + /* translate to GladeAccelInfo... */ + ainfo = g_new0 (GladeAccelInfo, 1); + ainfo->key = gdk_keyval_from_name(key); + ainfo->signal = signal; /* take string ownership... */ + ainfo->modifiers = glade_gtk_parse_modifiers (modifiers); + + + accels = g_list_prepend (accels, ainfo); + g_free (modifiers); + } + + if (accels) + { + value = g_new0 (GValue, 1); + g_value_init (value, GLADE_TYPE_ACCEL_GLIST); + g_value_take_boxed (value, accels); + + property = glade_widget_get_property (widget, "accelerator"); + glade_property_set_value (property, value); + + g_value_unset (value); + g_free (value); + } +} + + void glade_gtk_widget_read_widget (GladeWidgetAdaptor *adaptor, GladeWidget *widget, GladeXmlNode *node) { /* This code should work the same for <packing> and <widget> */ - if (!glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET)) + if (!glade_xml_node_verify (node, GLADE_XML_TAG_WIDGET)) return; - /* First chain up.. */ + /* First chain up and read in all the normal properties.. */ GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node); + /* Read in accelerators */ + glade_gtk_widget_read_accels (widget, node); - /* Read in atk properties and accelerators */ + /* Read in atk props */ } |