summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tvb@src.gnome.org>2008-04-02 06:03:31 +0000
committerTristan Van Berkom <tvb@src.gnome.org>2008-04-02 06:03:31 +0000
commit097a7dacf7ab488ba893995379697d1e5f0902b9 (patch)
tree92d9e34652fe10fe743a74339de68d40a54778d5
parent744a528262ba5ef273c8c820034ad5289ae41796 (diff)
downloadglade-097a7dacf7ab488ba893995379697d1e5f0902b9.tar.gz
Implemented loading of accelerators.
* gladeui/glade-gtk.c: Implemented loading of accelerators. svn path=/branches/builder/; revision=1757
-rw-r--r--ChangeLog2
-rw-r--r--gladeui/glade-property-class.h7
-rw-r--r--gladeui/glade-property.c5
-rw-r--r--plugins/gtk+/glade-accels.h6
-rw-r--r--plugins/gtk+/glade-gtk.c125
5 files changed, 131 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 04963d49..ab16c12b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 */
}