From e84ef2f86d5005d6b7c298be37fd25c527d1a6fe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 19 May 2009 05:04:04 +0200 Subject: Switching over to some autogenerated menu files instead of our test ones. --- libdbusmenu-gtk/Makefile.am | 4 ++-- libdbusmenu-gtk/menu.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-gtk/menu.h | 33 ++++++++++++++++++++++++++++++ libdbusmenu-gtk/test.c | 4 ---- libdbusmenu-gtk/test.h | 2 -- 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 libdbusmenu-gtk/menu.c create mode 100644 libdbusmenu-gtk/menu.h delete mode 100644 libdbusmenu-gtk/test.c delete mode 100644 libdbusmenu-gtk/test.h (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index 1e36228..364da62 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -8,10 +8,10 @@ lib_LTLIBRARIES = \ libdbusmenu_gtkincludedir=$(includedir)/libdbusmenu-0.1/libdbusmenu-gtk/ libdbusmenu_gtkinclude_HEADERS = \ - test.h + menu.h libdbusmenu_gtk_la_SOURCES = \ - test.c + menu.c libdbusmenu_gtk_la_LDFLAGS = \ -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \ diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c new file mode 100644 index 0000000..3e0a006 --- /dev/null +++ b/libdbusmenu-gtk/menu.c @@ -0,0 +1,49 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +typedef struct _MenuPrivate MenuPrivate; + +struct _MenuPrivate +{ +}; + +#define MENU_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), MENU_TYPE, MenuPrivate)) + +static void menu_class_init (MenuClass *klass); +static void menu_init (Menu *self); +static void menu_dispose (GObject *object); +static void menu_finalize (GObject *object); + +G_DEFINE_TYPE (Menu, menu, GTK_TYPE_MENU); + +static void +menu_class_init (MenuClass *klass) +{ +GObjectClass *object_class = G_OBJECT_CLASS (klass); + +g_type_class_add_private (klass, sizeof (MenuPrivate)); + +object_class->dispose = menu_dispose; +object_class->finalize = menu_finalize; +} + +static void +menu_init (Menu *self) +{ +} + +static void +menu_dispose (GObject *object) +{ +G_OBJECT_CLASS (menu_parent_class)->dispose (object); +} + +static void +menu_finalize (GObject *object) +{ +G_OBJECT_CLASS (menu_parent_class)->finalize (object); +} diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h new file mode 100644 index 0000000..783737a --- /dev/null +++ b/libdbusmenu-gtk/menu.h @@ -0,0 +1,33 @@ +#ifndef __MENU_H__ +#define __MENU_H__ + +#include +#include + +G_BEGIN_DECLS + +#define MENU_TYPE (menu_get_type ()) +#define MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MENU_TYPE, Menu)) +#define MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MENU_TYPE, MenuClass)) +#define IS_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MENU_TYPE)) +#define IS_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MENU_TYPE)) +#define MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MENU_TYPE, MenuClass)) + +typedef struct _Menu Menu; +typedef struct _MenuClass MenuClass; + +struct _MenuClass +{ +GtkMenuClass parent_class; +}; + +struct _Menu +{ +GtkMenu parent; +}; + +GType menu_get_type (void); + +G_END_DECLS + +#endif diff --git a/libdbusmenu-gtk/test.c b/libdbusmenu-gtk/test.c deleted file mode 100644 index 8ebb3f7..0000000 --- a/libdbusmenu-gtk/test.c +++ /dev/null @@ -1,4 +0,0 @@ - -void mysymbol (void) { - return; -} diff --git a/libdbusmenu-gtk/test.h b/libdbusmenu-gtk/test.h deleted file mode 100644 index ad000af..0000000 --- a/libdbusmenu-gtk/test.h +++ /dev/null @@ -1,2 +0,0 @@ - -void mysymbol (void); -- cgit v1.2.3 From f9ea57e39f9025dc93642fe306fd36c9ee61b28e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 19 May 2009 05:11:04 +0200 Subject: Getting the libs into the gtk library --- libdbusmenu-gtk/Makefile.am | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index 364da62..e73c8c1 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -19,10 +19,11 @@ libdbusmenu_gtk_la_LDFLAGS = \ -export-symbols-regex "^[^_].*" libdbusmenu_gtk_la_CFLAGS = \ - $(LIBDBUSMENU_GTK_CFLAGS) + $(DBUSMENUGTK_CFLAGS) libdbusmenu_gtk_la_LIBADD = \ - $(LIBDBUSMENU_GTK_LIBS) + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGTK_LIBS) pkgconfig_DATA = dbusmenu-gtk.pc pkgconfigdir = $(libdir)/pkgconfig -- cgit v1.2.3 From e0a30604a2d4b4ecbdd968f91971030a41066323 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 19 May 2009 05:11:37 +0200 Subject: Include the header too --- libdbusmenu-gtk/menu.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 3e0a006..420414a 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -4,6 +4,8 @@ #include +#include "menu.h" + typedef struct _MenuPrivate MenuPrivate; struct _MenuPrivate -- cgit v1.2.3 From 3cd0f472e1e79d185681b87dced59559de9df4ff Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 20 May 2009 11:31:54 +0200 Subject: Cleaning up the name space and making it clear where we are. Now we have an object --- libdbusmenu-gtk/menu.c | 46 +++++++++++++++++++++++++++------------------- libdbusmenu-gtk/menu.h | 33 +++++++++++++++------------------ 2 files changed, 42 insertions(+), 37 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 420414a..8e4f53b 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -6,46 +6,54 @@ #include "menu.h" -typedef struct _MenuPrivate MenuPrivate; +typedef struct _DbusmenuGtkMenuPrivate DbusmenuGtkMenuPrivate; -struct _MenuPrivate +struct _DbusmenuGtkMenuPrivate { }; -#define MENU_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), MENU_TYPE, MenuPrivate)) +#define DBUSMENU_GTKMENU_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuPrivate)) -static void menu_class_init (MenuClass *klass); -static void menu_init (Menu *self); -static void menu_dispose (GObject *object); -static void menu_finalize (GObject *object); +static void dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass); +static void dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self); +static void dbusmenu_gtkmenu_dispose (GObject *object); +static void dbusmenu_gtkmenu_finalize (GObject *object); -G_DEFINE_TYPE (Menu, menu, GTK_TYPE_MENU); +G_DEFINE_TYPE (DbusmenuGtkMenu, dbusmenu_gtkmenu, GTK_TYPE_MENU); static void -menu_class_init (MenuClass *klass) +dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) { -GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); -g_type_class_add_private (klass, sizeof (MenuPrivate)); + g_type_class_add_private (klass, sizeof (DbusmenuGtkMenuPrivate)); -object_class->dispose = menu_dispose; -object_class->finalize = menu_finalize; + object_class->dispose = dbusmenu_gtkmenu_dispose; + object_class->finalize = dbusmenu_gtkmenu_finalize; + + return; } static void -menu_init (Menu *self) +dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) { + + return; } static void -menu_dispose (GObject *object) +dbusmenu_gtkmenu_dispose (GObject *object) { -G_OBJECT_CLASS (menu_parent_class)->dispose (object); + + G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->dispose (object); + return; } static void -menu_finalize (GObject *object) +dbusmenu_gtkmenu_finalize (GObject *object) { -G_OBJECT_CLASS (menu_parent_class)->finalize (object); + + G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->finalize (object); + return; } diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h index 783737a..6d9c6ff 100644 --- a/libdbusmenu-gtk/menu.h +++ b/libdbusmenu-gtk/menu.h @@ -1,32 +1,29 @@ -#ifndef __MENU_H__ -#define __MENU_H__ +#ifndef __DBUSMENU_GTKMENU_H__ +#define __DBUSMENU_GTKMENU_H__ #include #include G_BEGIN_DECLS -#define MENU_TYPE (menu_get_type ()) -#define MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MENU_TYPE, Menu)) -#define MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MENU_TYPE, MenuClass)) -#define IS_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MENU_TYPE)) -#define IS_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MENU_TYPE)) -#define MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MENU_TYPE, MenuClass)) +#define DBUSMENU_GTKMENU_TYPE (dbusmenu_gtkmenu_get_type ()) +#define DBUSMENU_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenu)) +#define DBUSMENU_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) +#define DBUSMENU_IS_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_GTKMENU_TYPE)) +#define DBUSMENU_IS_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKMENU_TYPE)) +#define DBUSMENU_GTKMENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) -typedef struct _Menu Menu; -typedef struct _MenuClass MenuClass; - -struct _MenuClass -{ -GtkMenuClass parent_class; +typedef struct _DbusmenuGtkMenuClass DbusmenuGtkMenuClass; +struct _DbusmenuGtkMenuClass { + GtkMenuClass parent_class; }; -struct _Menu -{ -GtkMenu parent; +typedef struct _DbusmenuGtkMenu DbusmenuGtkMenu; +struct _DbusmenuGtkMenu { + GtkMenu parent; }; -GType menu_get_type (void); +GType dbusmenu_gtkmenu_get_type (void); G_END_DECLS -- cgit v1.2.3 From 63544bc682361f1cd022d53032c2d1d92476cc31 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 20 May 2009 11:58:28 +0200 Subject: Building up a client, but that required a couple of properties. Bigger commit than I'd like. --- libdbusmenu-gtk/menu.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 8e4f53b..a049b62 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -5,21 +5,38 @@ #include #include "menu.h" +#include "libdbusmenu-glib/client.h" +/* Properties */ +enum { + PROP_0, + PROP_DBUSOBJECT, + PROP_DBUSNAME +}; + +/* Private */ typedef struct _DbusmenuGtkMenuPrivate DbusmenuGtkMenuPrivate; +struct _DbusmenuGtkMenuPrivate { + DbusmenuClient * client; -struct _DbusmenuGtkMenuPrivate -{ + gchar * dbus_object; + gchar * dbus_name; }; #define DBUSMENU_GTKMENU_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuPrivate)) +/* Prototypes */ static void dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass); static void dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self); static void dbusmenu_gtkmenu_dispose (GObject *object); static void dbusmenu_gtkmenu_finalize (GObject *object); +static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec); +static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec); +/* Internal */ +static void build_client (DbusmenuGtkMenu * self); +/* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkMenu, dbusmenu_gtkmenu, GTK_TYPE_MENU); static void @@ -31,6 +48,19 @@ dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) object_class->dispose = dbusmenu_gtkmenu_dispose; object_class->finalize = dbusmenu_gtkmenu_finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + + g_object_class_install_property (object_class, PROP_DBUSOBJECT, + g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_OBJECT, "DBus Object we represent", + "The Object on the client that we're getting our data from.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DBUSNAME, + g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_NAME, "DBus Client we connect to", + "Name of the DBus client we're connecting to.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); return; } @@ -38,6 +68,12 @@ dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) static void dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) { + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + + priv->client = NULL; + + priv->dbus_object = NULL; + priv->dbus_name = NULL; return; } @@ -45,6 +81,12 @@ dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) static void dbusmenu_gtkmenu_dispose (GObject *object) { + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + + if (priv->client != NULL) { + g_object_unref(G_OBJECT(priv->client)); + priv->client = NULL; + } G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->dispose (object); return; @@ -53,7 +95,75 @@ dbusmenu_gtkmenu_dispose (GObject *object) static void dbusmenu_gtkmenu_finalize (GObject *object) { + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + + g_free(priv->dbus_object); + priv->dbus_object = NULL; + + g_free(priv->dbus_name); + priv->dbus_name = NULL; G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->finalize (object); return; } + +static void +set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + + switch (id) { + case PROP_DBUSNAME: + priv->dbus_name = g_value_dup_string(value); + if (priv->dbus_name != NULL && priv->dbus_object != NULL) { + build_client(DBUSMENU_GTKMENU(obj)); + } + break; + case PROP_DBUSOBJECT: + priv->dbus_object = g_value_dup_string(value); + if (priv->dbus_name != NULL && priv->dbus_object != NULL) { + build_client(DBUSMENU_GTKMENU(obj)); + } + break; + default: + g_warning("Unknown property %d.", id); + return; + } + + return; +} + +static void +get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + + switch (id) { + case PROP_DBUSNAME: + g_value_set_string(value, priv->dbus_name); + break; + case PROP_DBUSOBJECT: + g_value_set_string(value, priv->dbus_object); + break; + default: + g_warning("Unknown property %d.", id); + return; + } + + return; +} + +/* Internal Functions */ + +static void +build_client (DbusmenuGtkMenu * self) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + + if (priv->client == NULL) { + priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); + } + + return; +} + -- cgit v1.2.3 From 1df52c61f44b049b9e023a139a558b9e835ad5f7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 20 May 2009 12:11:32 +0200 Subject: A new function. Literally. --- libdbusmenu-gtk/menu.c | 21 +++++++++++++++++++++ libdbusmenu-gtk/menu.h | 1 + 2 files changed, 22 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index a049b62..773d57a 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -167,3 +167,24 @@ build_client (DbusmenuGtkMenu * self) return; } +/* Public API */ + +/** + dbusmenu_gtkmenu_new: + @dbus_name: Name of the #DbusmenuServer on DBus + @dbus_name: Name of the object on the #DbusmenuServer + + Creates a new #DbusmenuGtkMenu object and creates a #DbusmenuClient + that connects across DBus to a #DbusmenuServer. + + Return value: A new #DbusmenuGtkMenu sync'd with a server +*/ +DbusmenuGtkMenu * +dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object) +{ + return g_object_new(DBUSMENU_GTKMENU_TYPE, + DBUSMENU_CLIENT_PROP_DBUS_OBJECT, dbus_object, + DBUSMENU_CLIENT_PROP_DBUS_NAME, dbus_name, + NULL); +} + diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h index 6d9c6ff..96dcca2 100644 --- a/libdbusmenu-gtk/menu.h +++ b/libdbusmenu-gtk/menu.h @@ -24,6 +24,7 @@ struct _DbusmenuGtkMenu { }; GType dbusmenu_gtkmenu_get_type (void); +DbusmenuGtkMenu * dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object); G_END_DECLS -- cgit v1.2.3 From 039c05e5e8961e1eac265a7a073526a2257d6665 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 20 May 2009 12:17:25 +0200 Subject: Comments on the structures along with some reserved entries. --- libdbusmenu-gtk/menu.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h index 96dcca2..34def17 100644 --- a/libdbusmenu-gtk/menu.h +++ b/libdbusmenu-gtk/menu.h @@ -13,11 +13,29 @@ G_BEGIN_DECLS #define DBUSMENU_IS_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKMENU_TYPE)) #define DBUSMENU_GTKMENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) +/** + DbusmenuGtkMenuClass: + @parent_class: #GtkMenuClass + @reserved1: Reserved for future use. + @reserved2: Reserved for future use. + @reserved3: Reserved for future use. + @reserved4: Reserved for future use. +*/ typedef struct _DbusmenuGtkMenuClass DbusmenuGtkMenuClass; struct _DbusmenuGtkMenuClass { GtkMenuClass parent_class; + + /* Reserved */ + void (*reserved1) (void); + void (*reserved2) (void); + void (*reserved3) (void); + void (*reserved4) (void); }; +/** + DbusmenuGtkMenu: + @parent: #GtkMenu +*/ typedef struct _DbusmenuGtkMenu DbusmenuGtkMenu; struct _DbusmenuGtkMenu { GtkMenu parent; -- cgit v1.2.3 From c5a17e6a710ffadb20cdd65a9f42a2a1299424a4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 20 May 2009 12:41:18 +0200 Subject: Adding in some section documentation describing the menu item --- libdbusmenu-gtk/menu.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h index 34def17..dd5bdd1 100644 --- a/libdbusmenu-gtk/menu.h +++ b/libdbusmenu-gtk/menu.h @@ -44,6 +44,31 @@ struct _DbusmenuGtkMenu { GType dbusmenu_gtkmenu_get_type (void); DbusmenuGtkMenu * dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object); +/** + SECTION:gtkmenu + @short_description: A GTK Menu Object that syncronizes over DBus + @stability: Unstable + @include: libdbusmenu-gtk/menu.h + + In general, this is just a #GtkMenu, why else would you care? Oh, + because this menu is created by someone else on a server that exists + on the other side of DBus. You need a #DbusmenuServer to be able + push the data into this menu. + + The first thing you need to know is how to find that #DbusmenuServer + on DBus. This involves both the DBus name and the DBus object that + the menu interface can be found on. Those two value should be set + when creating the object using dbusmenu_gtkmenu_new(). They are then + stored on two properties #DbusmenuGtkMenu:dbus-name and #DbusmenuGtkMenu:dbus-object. + + After creation the #DbusmenuGtkMenu it will continue to keep in + synchronization with the #DbusmenuServer object across Dbus. If the + number of entries change, the menus change, if they change thier + properties change, they update in the items. All of this should + be handled transparently to the user of this object. + + TODO: Document properties. +*/ G_END_DECLS #endif -- cgit v1.2.3 From 43b314cee39228e8d4c46fe3705f8cb927474977 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 22 May 2009 11:07:59 +0200 Subject: Adding a connection in for processing layout changes --- libdbusmenu-gtk/menu.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 773d57a..52ebd1a 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -155,6 +155,19 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal Functions */ +/* Processing the layout being updated and handling + that and making it into a menu */ +void +process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) +{ + + + return; +} + + +/* Builds the client and connects all of the signals + up for it so that it's happy-happy */ static void build_client (DbusmenuGtkMenu * self) { @@ -162,6 +175,10 @@ build_client (DbusmenuGtkMenu * self) if (priv->client == NULL) { priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); + + /* Register for layout changes, this should come after the + creation of the client pulls it from DBus */ + g_signal_connect(G_OBJECT(priv->client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(process_layout_change), self); } return; -- cgit v1.2.3 From 96513ce9369857b857dd74072b9316b49e6f2f9e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 24 May 2009 19:05:32 +0200 Subject: Starting the processing of changing the layout from the server --- libdbusmenu-gtk/menu.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 52ebd1a..814aaca 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -155,12 +155,87 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal Functions */ +static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; +static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; + +static void +menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) +{ + + + +} + +static void +connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) +{ + g_object_ref(gmi); + g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref); + + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + + return; +} + +static void +process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) +{ + gpointer unknown_menuitem = g_object_get_data(G_OBJECT(mi), data_menuitem); + if (unknown_menuitem == NULL) { + /* Oh, a virgin DbusmenuMenuitem, let's fix that. */ + GtkWidget * menuitem = gtk_menu_item_new(); + connect_menuitem(mi, GTK_MENU_ITEM(menuitem)); + unknown_menuitem = menuitem; + gtk_menu_shell_append(GTK_MENU_SHELL(parentmenu), menuitem); + } + + GList * children = dbusmenu_menuitem_get_children(mi); + if (children == NULL) { + /* If there are no children to process we are + done and we can move along */ + return; + } + + /* Phase 0: Make a submenu if we don't have one */ + gpointer unknown_menu = g_object_get_data(G_OBJECT(mi), data_menu); + if (unknown_menu == NULL) { + GtkWidget * gtkmenu = gtk_menu_new(); + g_object_ref(gtkmenu); + g_object_set_data_full(G_OBJECT(mi), data_menu, gtkmenu, g_object_unref); + unknown_menu = gtkmenu; + gtk_menuitem_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); + gtk_widget_show(gtkmenu); + } + + /* Phase 1: Add missing children */ + GList * child = NULL; + for (child = children; child != NULL; child = g_list_next(child)) { + + } + + /* Phase 2: Delete removed children */ + + + /* Phase 3: Profit! */ + return; +} + /* Processing the layout being updated and handling that and making it into a menu */ -void +static void process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) { + DbusmenuMenuitem * root = dbusmenu_client_get_root(client); + GList * children = dbusmenu_menuitem_get_children(root); + if (children == NULL) { + return; + } + + GList * child = NULL; + for (child = children; child != NULL; child = g_list_next(child)) { + process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(gtkmenu)); + } return; } -- cgit v1.2.3 From bd52d2d670eb6881fda44ca1ae4e0c85c44d59fc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 24 May 2009 19:19:35 +0200 Subject: Passing back the menuitem getting clicked on. --- libdbusmenu-gtk/menu.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 814aaca..90cf2e2 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -158,6 +158,13 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; +static gboolean +menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) +{ + dbusmenu_menuitem_activate(mi); + return TRUE; +} + static void menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) { @@ -173,6 +180,7 @@ connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); return; } -- cgit v1.2.3 From 6c7818f652ef2f56b48e87da059593e340063047 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 24 May 2009 20:24:34 +0200 Subject: Using a weak ref to handle the deletion stuff. --- libdbusmenu-gtk/menu.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 90cf2e2..9bb23a8 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -156,7 +156,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal Functions */ static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; -static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; +static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; static gboolean menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) @@ -168,9 +168,19 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) static void menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) { + if (g_strcmp0(prop, "label")) { + gtk_menu_item_set_label(gmi, value); + gtk_widget_show(GTK_WIDGET(gmi)); + } + return; +} - +static void +destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) +{ + g_object_destory(G_OBJECT(udata)); + return; } static void @@ -179,9 +189,11 @@ connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) g_object_ref(gmi); g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); + g_object_weak_ref(G_OBJECT(mi), destoryed_dbusmenuitem_cb, gmi); + return; } @@ -218,11 +230,13 @@ process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) /* Phase 1: Add missing children */ GList * child = NULL; for (child = children; child != NULL; child = g_list_next(child)) { - + process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(unknown_menu)); } /* Phase 2: Delete removed children */ - + /* Actually, we don't need to do this because of the weak + reference that we've added above. When the DbusmenuMenuitem + gets destroyed it takes its GtkMenuItem with it. Bye bye. */ /* Phase 3: Profit! */ return; -- cgit v1.2.3 From a3e5b5d4e8b5f0919039a94d9e05b484dc8b0c67 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 24 May 2009 21:28:21 +0200 Subject: Switching to a unref and no ref for the tracking of GTK Menu Item. Also add better warnings. --- libdbusmenu-gtk/Makefile.am | 2 +- libdbusmenu-gtk/menu.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index e73c8c1..80e6058 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -19,7 +19,7 @@ libdbusmenu_gtk_la_LDFLAGS = \ -export-symbols-regex "^[^_].*" libdbusmenu_gtk_la_CFLAGS = \ - $(DBUSMENUGTK_CFLAGS) + $(DBUSMENUGTK_CFLAGS) -Wall -Werror libdbusmenu_gtk_la_LIBADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 9bb23a8..26543be 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -179,14 +179,13 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenu static void destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) { - g_object_destory(G_OBJECT(udata)); + g_object_unref(G_OBJECT(udata)); return; } static void connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) { - g_object_ref(gmi); g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); @@ -223,7 +222,7 @@ process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) g_object_ref(gtkmenu); g_object_set_data_full(G_OBJECT(mi), data_menu, gtkmenu, g_object_unref); unknown_menu = gtkmenu; - gtk_menuitem_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); gtk_widget_show(gtkmenu); } -- cgit v1.2.3 From 1f574297a0c846edb0cf84107de4b13247f28036 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 25 May 2009 14:26:05 +0200 Subject: Bother, truth is so fickle in that it is so binary in wanting correctness. --- libdbusmenu-gtk/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 26543be..3919314 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -168,7 +168,7 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) static void menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) { - if (g_strcmp0(prop, "label")) { + if (!g_strcmp0(prop, "label")) { gtk_menu_item_set_label(gmi, value); gtk_widget_show(GTK_WIDGET(gmi)); } -- cgit v1.2.3 From 3b4051390bfb7e150f552da448e00dece4fbdf2f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 25 May 2009 17:17:34 +0200 Subject: Tracking destruction --- libdbusmenu-gtk/menu.c | 1 + 1 file changed, 1 insertion(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 3919314..9ad1bcf 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -179,6 +179,7 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenu static void destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) { + g_debug("DbusmenuMenuitem was destroyed"); g_object_unref(G_OBJECT(udata)); return; } -- cgit v1.2.3 From 1891e81fa2c10654d2e0707f48d510ab8543675b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 25 May 2009 23:21:28 +0200 Subject: Switching so that we're destroying the widget instead of object unref'ing the widget. --- libdbusmenu-gtk/menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 9ad1bcf..aa8dc10 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -180,14 +180,14 @@ static void destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) { g_debug("DbusmenuMenuitem was destroyed"); - g_object_unref(G_OBJECT(udata)); + gtk_widget_destroy(GTK_WIDGET(udata)); return; } static void connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) { - g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref); + g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); -- cgit v1.2.3 From 30a97d87f44f64c5a533b244b7e77bb01787ea53 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 25 May 2009 23:21:54 +0200 Subject: Debug fix --- libdbusmenu-gtk/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index aa8dc10..dd2df37 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -179,7 +179,7 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenu static void destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) { - g_debug("DbusmenuMenuitem was destroyed"); + /* g_debug("DbusmenuMenuitem was destroyed"); */ gtk_widget_destroy(GTK_WIDGET(udata)); return; } -- cgit v1.2.3 From 757ec5c8852ca964f25326e96c66c0e44c8614b8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 5 Jun 2009 15:59:00 -0500 Subject: Getting distcheck to pass by getting the header files from the -glib branch of things. --- libdbusmenu-gtk/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index 80e6058..831719c 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -19,7 +19,7 @@ libdbusmenu_gtk_la_LDFLAGS = \ -export-symbols-regex "^[^_].*" libdbusmenu_gtk_la_CFLAGS = \ - $(DBUSMENUGTK_CFLAGS) -Wall -Werror + $(DBUSMENUGTK_CFLAGS) -I$(srcdir)/.. -Wall -Werror libdbusmenu_gtk_la_LIBADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ -- cgit v1.2.3 From 42d9d2bc32f243be4b6dda12708afca5c61aad98 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 18 Jun 2009 13:56:38 -0500 Subject: Putting LGPL headers on these. --- libdbusmenu-gtk/menu.c | 28 ++++++++++++++++++++++++++++ libdbusmenu-gtk/menu.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index dd2df37..4074947 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -1,3 +1,31 @@ +/* +A library to take the object model made consistent by libdbusmenu-glib +and visualize it in GTK. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/libdbusmenu-gtk/menu.h b/libdbusmenu-gtk/menu.h index dd5bdd1..73804c5 100644 --- a/libdbusmenu-gtk/menu.h +++ b/libdbusmenu-gtk/menu.h @@ -1,3 +1,31 @@ +/* +A library to take the object model made consistent by libdbusmenu-glib +and visualize it in GTK. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + #ifndef __DBUSMENU_GTKMENU_H__ #define __DBUSMENU_GTKMENU_H__ -- cgit v1.2.3 From 1a450e2613d2b1c604df5c0c83786a679eda0268 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Jun 2009 16:51:28 -0500 Subject: Okay, being a little funny with how these things are playing out. Missing subversion's crazy everything is a copy semantics right now. It works well for stuff like this. --- libdbusmenu-gtk/client.c | 332 +++++++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-gtk/client.h | 102 +++++++++++++++ libdbusmenu-gtk/menu.c | 111 +--------------- 3 files changed, 438 insertions(+), 107 deletions(-) create mode 100644 libdbusmenu-gtk/client.c create mode 100644 libdbusmenu-gtk/client.h (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c new file mode 100644 index 0000000..4074947 --- /dev/null +++ b/libdbusmenu-gtk/client.c @@ -0,0 +1,332 @@ +/* +A library to take the object model made consistent by libdbusmenu-glib +and visualize it in GTK. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "menu.h" +#include "libdbusmenu-glib/client.h" + +/* Properties */ +enum { + PROP_0, + PROP_DBUSOBJECT, + PROP_DBUSNAME +}; + +/* Private */ +typedef struct _DbusmenuGtkMenuPrivate DbusmenuGtkMenuPrivate; +struct _DbusmenuGtkMenuPrivate { + DbusmenuClient * client; + + gchar * dbus_object; + gchar * dbus_name; +}; + +#define DBUSMENU_GTKMENU_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuPrivate)) + +/* Prototypes */ +static void dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass); +static void dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self); +static void dbusmenu_gtkmenu_dispose (GObject *object); +static void dbusmenu_gtkmenu_finalize (GObject *object); +static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec); +static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec); +/* Internal */ +static void build_client (DbusmenuGtkMenu * self); + +/* GObject Stuff */ +G_DEFINE_TYPE (DbusmenuGtkMenu, dbusmenu_gtkmenu, GTK_TYPE_MENU); + +static void +dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (DbusmenuGtkMenuPrivate)); + + object_class->dispose = dbusmenu_gtkmenu_dispose; + object_class->finalize = dbusmenu_gtkmenu_finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + + g_object_class_install_property (object_class, PROP_DBUSOBJECT, + g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_OBJECT, "DBus Object we represent", + "The Object on the client that we're getting our data from.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_DBUSNAME, + g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_NAME, "DBus Client we connect to", + "Name of the DBus client we're connecting to.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + return; +} + +static void +dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + + priv->client = NULL; + + priv->dbus_object = NULL; + priv->dbus_name = NULL; + + return; +} + +static void +dbusmenu_gtkmenu_dispose (GObject *object) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + + if (priv->client != NULL) { + g_object_unref(G_OBJECT(priv->client)); + priv->client = NULL; + } + + G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->dispose (object); + return; +} + +static void +dbusmenu_gtkmenu_finalize (GObject *object) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + + g_free(priv->dbus_object); + priv->dbus_object = NULL; + + g_free(priv->dbus_name); + priv->dbus_name = NULL; + + G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->finalize (object); + return; +} + +static void +set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + + switch (id) { + case PROP_DBUSNAME: + priv->dbus_name = g_value_dup_string(value); + if (priv->dbus_name != NULL && priv->dbus_object != NULL) { + build_client(DBUSMENU_GTKMENU(obj)); + } + break; + case PROP_DBUSOBJECT: + priv->dbus_object = g_value_dup_string(value); + if (priv->dbus_name != NULL && priv->dbus_object != NULL) { + build_client(DBUSMENU_GTKMENU(obj)); + } + break; + default: + g_warning("Unknown property %d.", id); + return; + } + + return; +} + +static void +get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + + switch (id) { + case PROP_DBUSNAME: + g_value_set_string(value, priv->dbus_name); + break; + case PROP_DBUSOBJECT: + g_value_set_string(value, priv->dbus_object); + break; + default: + g_warning("Unknown property %d.", id); + return; + } + + return; +} + +/* Internal Functions */ + +static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; +static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; + +static gboolean +menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) +{ + dbusmenu_menuitem_activate(mi); + return TRUE; +} + +static void +menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) +{ + if (!g_strcmp0(prop, "label")) { + gtk_menu_item_set_label(gmi, value); + gtk_widget_show(GTK_WIDGET(gmi)); + } + + return; +} + +static void +destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) +{ + /* g_debug("DbusmenuMenuitem was destroyed"); */ + gtk_widget_destroy(GTK_WIDGET(udata)); + return; +} + +static void +connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) +{ + g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); + + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); + + g_object_weak_ref(G_OBJECT(mi), destoryed_dbusmenuitem_cb, gmi); + + return; +} + +static void +process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) +{ + gpointer unknown_menuitem = g_object_get_data(G_OBJECT(mi), data_menuitem); + if (unknown_menuitem == NULL) { + /* Oh, a virgin DbusmenuMenuitem, let's fix that. */ + GtkWidget * menuitem = gtk_menu_item_new(); + connect_menuitem(mi, GTK_MENU_ITEM(menuitem)); + unknown_menuitem = menuitem; + gtk_menu_shell_append(GTK_MENU_SHELL(parentmenu), menuitem); + } + + GList * children = dbusmenu_menuitem_get_children(mi); + if (children == NULL) { + /* If there are no children to process we are + done and we can move along */ + return; + } + + /* Phase 0: Make a submenu if we don't have one */ + gpointer unknown_menu = g_object_get_data(G_OBJECT(mi), data_menu); + if (unknown_menu == NULL) { + GtkWidget * gtkmenu = gtk_menu_new(); + g_object_ref(gtkmenu); + g_object_set_data_full(G_OBJECT(mi), data_menu, gtkmenu, g_object_unref); + unknown_menu = gtkmenu; + gtk_menu_item_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); + gtk_widget_show(gtkmenu); + } + + /* Phase 1: Add missing children */ + GList * child = NULL; + for (child = children; child != NULL; child = g_list_next(child)) { + process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(unknown_menu)); + } + + /* Phase 2: Delete removed children */ + /* Actually, we don't need to do this because of the weak + reference that we've added above. When the DbusmenuMenuitem + gets destroyed it takes its GtkMenuItem with it. Bye bye. */ + + /* Phase 3: Profit! */ + return; +} + +/* Processing the layout being updated and handling + that and making it into a menu */ +static void +process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) +{ + DbusmenuMenuitem * root = dbusmenu_client_get_root(client); + + GList * children = dbusmenu_menuitem_get_children(root); + if (children == NULL) { + return; + } + + GList * child = NULL; + for (child = children; child != NULL; child = g_list_next(child)) { + process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(gtkmenu)); + } + + return; +} + + +/* Builds the client and connects all of the signals + up for it so that it's happy-happy */ +static void +build_client (DbusmenuGtkMenu * self) +{ + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + + if (priv->client == NULL) { + priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); + + /* Register for layout changes, this should come after the + creation of the client pulls it from DBus */ + g_signal_connect(G_OBJECT(priv->client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(process_layout_change), self); + } + + return; +} + +/* Public API */ + +/** + dbusmenu_gtkmenu_new: + @dbus_name: Name of the #DbusmenuServer on DBus + @dbus_name: Name of the object on the #DbusmenuServer + + Creates a new #DbusmenuGtkMenu object and creates a #DbusmenuClient + that connects across DBus to a #DbusmenuServer. + + Return value: A new #DbusmenuGtkMenu sync'd with a server +*/ +DbusmenuGtkMenu * +dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object) +{ + return g_object_new(DBUSMENU_GTKMENU_TYPE, + DBUSMENU_CLIENT_PROP_DBUS_OBJECT, dbus_object, + DBUSMENU_CLIENT_PROP_DBUS_NAME, dbus_name, + NULL); +} + diff --git a/libdbusmenu-gtk/client.h b/libdbusmenu-gtk/client.h new file mode 100644 index 0000000..73804c5 --- /dev/null +++ b/libdbusmenu-gtk/client.h @@ -0,0 +1,102 @@ +/* +A library to take the object model made consistent by libdbusmenu-glib +and visualize it in GTK. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of either or both of the following licenses: + +1) the GNU Lesser General Public License version 3, as published by the +Free Software Foundation; and/or +2) the GNU Lesser General Public License version 2.1, as published by +the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR +PURPOSE. See the applicable version of the GNU Lesser General Public +License for more details. + +You should have received a copy of both the GNU Lesser General Public +License version 3 and version 2.1 along with this program. If not, see + +*/ + +#ifndef __DBUSMENU_GTKMENU_H__ +#define __DBUSMENU_GTKMENU_H__ + +#include +#include + +G_BEGIN_DECLS + +#define DBUSMENU_GTKMENU_TYPE (dbusmenu_gtkmenu_get_type ()) +#define DBUSMENU_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenu)) +#define DBUSMENU_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) +#define DBUSMENU_IS_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_GTKMENU_TYPE)) +#define DBUSMENU_IS_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKMENU_TYPE)) +#define DBUSMENU_GTKMENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) + +/** + DbusmenuGtkMenuClass: + @parent_class: #GtkMenuClass + @reserved1: Reserved for future use. + @reserved2: Reserved for future use. + @reserved3: Reserved for future use. + @reserved4: Reserved for future use. +*/ +typedef struct _DbusmenuGtkMenuClass DbusmenuGtkMenuClass; +struct _DbusmenuGtkMenuClass { + GtkMenuClass parent_class; + + /* Reserved */ + void (*reserved1) (void); + void (*reserved2) (void); + void (*reserved3) (void); + void (*reserved4) (void); +}; + +/** + DbusmenuGtkMenu: + @parent: #GtkMenu +*/ +typedef struct _DbusmenuGtkMenu DbusmenuGtkMenu; +struct _DbusmenuGtkMenu { + GtkMenu parent; +}; + +GType dbusmenu_gtkmenu_get_type (void); +DbusmenuGtkMenu * dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object); + +/** + SECTION:gtkmenu + @short_description: A GTK Menu Object that syncronizes over DBus + @stability: Unstable + @include: libdbusmenu-gtk/menu.h + + In general, this is just a #GtkMenu, why else would you care? Oh, + because this menu is created by someone else on a server that exists + on the other side of DBus. You need a #DbusmenuServer to be able + push the data into this menu. + + The first thing you need to know is how to find that #DbusmenuServer + on DBus. This involves both the DBus name and the DBus object that + the menu interface can be found on. Those two value should be set + when creating the object using dbusmenu_gtkmenu_new(). They are then + stored on two properties #DbusmenuGtkMenu:dbus-name and #DbusmenuGtkMenu:dbus-object. + + After creation the #DbusmenuGtkMenu it will continue to keep in + synchronization with the #DbusmenuServer object across Dbus. If the + number of entries change, the menus change, if they change thier + properties change, they update in the items. All of this should + be handled transparently to the user of this object. + + TODO: Document properties. +*/ +G_END_DECLS + +#endif diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 4074947..e67d3a5 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -183,114 +183,11 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal Functions */ -static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; -static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; - -static gboolean -menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) -{ - dbusmenu_menuitem_activate(mi); - return TRUE; -} - -static void -menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) -{ - if (!g_strcmp0(prop, "label")) { - gtk_menu_item_set_label(gmi, value); - gtk_widget_show(GTK_WIDGET(gmi)); - } - - return; -} - -static void -destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) -{ - /* g_debug("DbusmenuMenuitem was destroyed"); */ - gtk_widget_destroy(GTK_WIDGET(udata)); - return; -} - -static void -connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) -{ - g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); - - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); - g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); - - g_object_weak_ref(G_OBJECT(mi), destoryed_dbusmenuitem_cb, gmi); - - return; -} - static void -process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) -{ - gpointer unknown_menuitem = g_object_get_data(G_OBJECT(mi), data_menuitem); - if (unknown_menuitem == NULL) { - /* Oh, a virgin DbusmenuMenuitem, let's fix that. */ - GtkWidget * menuitem = gtk_menu_item_new(); - connect_menuitem(mi, GTK_MENU_ITEM(menuitem)); - unknown_menuitem = menuitem; - gtk_menu_shell_append(GTK_MENU_SHELL(parentmenu), menuitem); - } - - GList * children = dbusmenu_menuitem_get_children(mi); - if (children == NULL) { - /* If there are no children to process we are - done and we can move along */ - return; - } - - /* Phase 0: Make a submenu if we don't have one */ - gpointer unknown_menu = g_object_get_data(G_OBJECT(mi), data_menu); - if (unknown_menu == NULL) { - GtkWidget * gtkmenu = gtk_menu_new(); - g_object_ref(gtkmenu); - g_object_set_data_full(G_OBJECT(mi), data_menu, gtkmenu, g_object_unref); - unknown_menu = gtkmenu; - gtk_menu_item_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); - gtk_widget_show(gtkmenu); - } - - /* Phase 1: Add missing children */ - GList * child = NULL; - for (child = children; child != NULL; child = g_list_next(child)) { - process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(unknown_menu)); - } - - /* Phase 2: Delete removed children */ - /* Actually, we don't need to do this because of the weak - reference that we've added above. When the DbusmenuMenuitem - gets destroyed it takes its GtkMenuItem with it. Bye bye. */ - - /* Phase 3: Profit! */ - return; +root_changed (void) { + /* stub */ } -/* Processing the layout being updated and handling - that and making it into a menu */ -static void -process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) -{ - DbusmenuMenuitem * root = dbusmenu_client_get_root(client); - - GList * children = dbusmenu_menuitem_get_children(root); - if (children == NULL) { - return; - } - - GList * child = NULL; - for (child = children; child != NULL; child = g_list_next(child)) { - process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(gtkmenu)); - } - - return; -} - - /* Builds the client and connects all of the signals up for it so that it's happy-happy */ static void @@ -299,11 +196,11 @@ build_client (DbusmenuGtkMenu * self) DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); if (priv->client == NULL) { - priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); + priv->client = dbusmenu_gtkclient_new(priv->dbus_name, priv->dbus_object); /* Register for layout changes, this should come after the creation of the client pulls it from DBus */ - g_signal_connect(G_OBJECT(priv->client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(process_layout_change), self); + g_signal_connect(G_OBJECT(priv->client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(root_changed), self); } return; -- cgit v1.2.3 From 97e210b1ec378e4e895e35035ec85146de62de2a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Jun 2009 16:54:05 -0500 Subject: Switching some of the client naming stuff to make everything stick together. --- libdbusmenu-gtk/client.h | 38 ++++++++++++++++++++------------------ libdbusmenu-gtk/menu.c | 3 ++- 2 files changed, 22 insertions(+), 19 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.h b/libdbusmenu-gtk/client.h index 73804c5..d208d16 100644 --- a/libdbusmenu-gtk/client.h +++ b/libdbusmenu-gtk/client.h @@ -26,31 +26,33 @@ License version 3 and version 2.1 along with this program. If not, see */ -#ifndef __DBUSMENU_GTKMENU_H__ -#define __DBUSMENU_GTKMENU_H__ +#ifndef __DBUSMENU_GTKCLIENT_H__ +#define __DBUSMENU_GTKCLIENT_H__ #include #include G_BEGIN_DECLS -#define DBUSMENU_GTKMENU_TYPE (dbusmenu_gtkmenu_get_type ()) -#define DBUSMENU_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenu)) -#define DBUSMENU_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) -#define DBUSMENU_IS_GTKMENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_GTKMENU_TYPE)) -#define DBUSMENU_IS_GTKMENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKMENU_TYPE)) -#define DBUSMENU_GTKMENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuClass)) +#define DBUSMENU_GTKCLIENT_TYPE (dbusmenu_gtkmenu_get_type ()) +#define DBUSMENU_GTKCLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClient)) +#define DBUSMENU_GTKCLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientClass)) +#define DBUSMENU_IS_GTKCLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_GTKCLIENT_TYPE)) +#define DBUSMENU_IS_GTKCLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKCLIENT_TYPE)) +#define DBUSMENU_GTKCLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientClass)) + +#define DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED "root-changed" /** - DbusmenuGtkMenuClass: + DbusmenuGtkClientClass: @parent_class: #GtkMenuClass @reserved1: Reserved for future use. @reserved2: Reserved for future use. @reserved3: Reserved for future use. @reserved4: Reserved for future use. */ -typedef struct _DbusmenuGtkMenuClass DbusmenuGtkMenuClass; -struct _DbusmenuGtkMenuClass { +typedef struct _DbusmenuGtkClientClass DbusmenuGtkClientClass; +struct _DbusmenuGtkClientClass { GtkMenuClass parent_class; /* Reserved */ @@ -61,16 +63,16 @@ struct _DbusmenuGtkMenuClass { }; /** - DbusmenuGtkMenu: + DbusmenuGtkClient: @parent: #GtkMenu */ -typedef struct _DbusmenuGtkMenu DbusmenuGtkMenu; -struct _DbusmenuGtkMenu { +typedef struct _DbusmenuGtkClient DbusmenuGtkClient; +struct _DbusmenuGtkClient { GtkMenu parent; }; -GType dbusmenu_gtkmenu_get_type (void); -DbusmenuGtkMenu * dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object); +GType dbusmenu_gtkclient_get_type (void); +DbusmenuGtkClient * dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object); /** SECTION:gtkmenu @@ -87,9 +89,9 @@ DbusmenuGtkMenu * dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object); on DBus. This involves both the DBus name and the DBus object that the menu interface can be found on. Those two value should be set when creating the object using dbusmenu_gtkmenu_new(). They are then - stored on two properties #DbusmenuGtkMenu:dbus-name and #DbusmenuGtkMenu:dbus-object. + stored on two properties #DbusmenuGtkClient:dbus-name and #DbusmenuGtkClient:dbus-object. - After creation the #DbusmenuGtkMenu it will continue to keep in + After creation the #DbusmenuGtkClient it will continue to keep in synchronization with the #DbusmenuServer object across Dbus. If the number of entries change, the menus change, if they change thier properties change, they update in the items. All of this should diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index e67d3a5..4b88f67 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -34,6 +34,7 @@ License version 3 and version 2.1 along with this program. If not, see #include "menu.h" #include "libdbusmenu-glib/client.h" +#include "client.h" /* Properties */ enum { @@ -45,7 +46,7 @@ enum { /* Private */ typedef struct _DbusmenuGtkMenuPrivate DbusmenuGtkMenuPrivate; struct _DbusmenuGtkMenuPrivate { - DbusmenuClient * client; + DbusmenuGtkClient * client; gchar * dbus_object; gchar * dbus_name; -- cgit v1.2.3 From ef09b6addc6fe5df82f3fded6f7b4b86377ef37f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Jun 2009 22:58:59 -0500 Subject: Okay, now we're rebuilding this client thingy. --- libdbusmenu-gtk/client.c | 70 ++++++++++++++++++++++++------------------------ libdbusmenu-gtk/client.h | 12 ++++++--- 2 files changed, 43 insertions(+), 39 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 4074947..8ee1718 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -43,39 +43,39 @@ enum { }; /* Private */ -typedef struct _DbusmenuGtkMenuPrivate DbusmenuGtkMenuPrivate; -struct _DbusmenuGtkMenuPrivate { +typedef struct _DbusmenuGtkClientPrivate DbusmenuGtkClientPrivate; +struct _DbusmenuGtkClientPrivate { DbusmenuClient * client; gchar * dbus_object; gchar * dbus_name; }; -#define DBUSMENU_GTKMENU_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKMENU_TYPE, DbusmenuGtkMenuPrivate)) +#define DBUSMENU_GTKCLIENT_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientPrivate)) /* Prototypes */ -static void dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass); -static void dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self); -static void dbusmenu_gtkmenu_dispose (GObject *object); -static void dbusmenu_gtkmenu_finalize (GObject *object); +static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass); +static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self); +static void dbusmenu_gtkclient_dispose (GObject *object); +static void dbusmenu_gtkclient_finalize (GObject *object); static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec); static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec); /* Internal */ -static void build_client (DbusmenuGtkMenu * self); +static void build_client (DbusmenuGtkClient * self); /* GObject Stuff */ -G_DEFINE_TYPE (DbusmenuGtkMenu, dbusmenu_gtkmenu, GTK_TYPE_MENU); +G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); static void -dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) +dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (DbusmenuGtkMenuPrivate)); + g_type_class_add_private (klass, sizeof (DbusmenuGtkClientPrivate)); - object_class->dispose = dbusmenu_gtkmenu_dispose; - object_class->finalize = dbusmenu_gtkmenu_finalize; + object_class->dispose = dbusmenu_gtkclient_dispose; + object_class->finalize = dbusmenu_gtkclient_finalize; object_class->set_property = set_property; object_class->get_property = get_property; @@ -94,9 +94,9 @@ dbusmenu_gtkmenu_class_init (DbusmenuGtkMenuClass *klass) } static void -dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) +dbusmenu_gtkclient_init (DbusmenuGtkClient *self) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(self); priv->client = NULL; @@ -107,23 +107,23 @@ dbusmenu_gtkmenu_init (DbusmenuGtkMenu *self) } static void -dbusmenu_gtkmenu_dispose (GObject *object) +dbusmenu_gtkclient_dispose (GObject *object) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(object); if (priv->client != NULL) { g_object_unref(G_OBJECT(priv->client)); priv->client = NULL; } - G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->dispose (object); + G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->dispose (object); return; } static void -dbusmenu_gtkmenu_finalize (GObject *object) +dbusmenu_gtkclient_finalize (GObject *object) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(object); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(object); g_free(priv->dbus_object); priv->dbus_object = NULL; @@ -131,26 +131,26 @@ dbusmenu_gtkmenu_finalize (GObject *object) g_free(priv->dbus_name); priv->dbus_name = NULL; - G_OBJECT_CLASS (dbusmenu_gtkmenu_parent_class)->finalize (object); + G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->finalize (object); return; } static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(obj); switch (id) { case PROP_DBUSNAME: priv->dbus_name = g_value_dup_string(value); if (priv->dbus_name != NULL && priv->dbus_object != NULL) { - build_client(DBUSMENU_GTKMENU(obj)); + build_client(DBUSMENU_GTKCLIENT(obj)); } break; case PROP_DBUSOBJECT: priv->dbus_object = g_value_dup_string(value); if (priv->dbus_name != NULL && priv->dbus_object != NULL) { - build_client(DBUSMENU_GTKMENU(obj)); + build_client(DBUSMENU_GTKCLIENT(obj)); } break; default: @@ -164,7 +164,7 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(obj); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(obj); switch (id) { case PROP_DBUSNAME: @@ -273,7 +273,7 @@ process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) /* Processing the layout being updated and handling that and making it into a menu */ static void -process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) +process_layout_change (DbusmenuClient * client, DbusmenuGtkClient * gtkmenu) { DbusmenuMenuitem * root = dbusmenu_client_get_root(client); @@ -294,9 +294,9 @@ process_layout_change (DbusmenuClient * client, DbusmenuGtkMenu * gtkmenu) /* Builds the client and connects all of the signals up for it so that it's happy-happy */ static void -build_client (DbusmenuGtkMenu * self) +build_client (DbusmenuGtkClient * self) { - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(self); + DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(self); if (priv->client == NULL) { priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); @@ -312,19 +312,19 @@ build_client (DbusmenuGtkMenu * self) /* Public API */ /** - dbusmenu_gtkmenu_new: + dbusmenu_gtkclient_new: @dbus_name: Name of the #DbusmenuServer on DBus @dbus_name: Name of the object on the #DbusmenuServer - Creates a new #DbusmenuGtkMenu object and creates a #DbusmenuClient + Creates a new #DbusmenuGtkClient object and creates a #DbusmenuClient that connects across DBus to a #DbusmenuServer. - Return value: A new #DbusmenuGtkMenu sync'd with a server + Return value: A new #DbusmenuGtkClient sync'd with a server */ -DbusmenuGtkMenu * -dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object) +DbusmenuGtkClient * +dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object) { - return g_object_new(DBUSMENU_GTKMENU_TYPE, + return g_object_new(DBUSMENU_GTKCLIENT_TYPE, DBUSMENU_CLIENT_PROP_DBUS_OBJECT, dbus_object, DBUSMENU_CLIENT_PROP_DBUS_NAME, dbus_name, NULL); diff --git a/libdbusmenu-gtk/client.h b/libdbusmenu-gtk/client.h index d208d16..96846a4 100644 --- a/libdbusmenu-gtk/client.h +++ b/libdbusmenu-gtk/client.h @@ -31,17 +31,18 @@ License version 3 and version 2.1 along with this program. If not, see #include #include +#include G_BEGIN_DECLS -#define DBUSMENU_GTKCLIENT_TYPE (dbusmenu_gtkmenu_get_type ()) +#define DBUSMENU_GTKCLIENT_TYPE (dbusmenu_gtkclient_get_type ()) #define DBUSMENU_GTKCLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClient)) #define DBUSMENU_GTKCLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientClass)) #define DBUSMENU_IS_GTKCLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_GTKCLIENT_TYPE)) #define DBUSMENU_IS_GTKCLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_GTKCLIENT_TYPE)) #define DBUSMENU_GTKCLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientClass)) -#define DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED "root-changed" +#define DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED DBUSMENU_CLIENT_SIGNAL_ROOT_CHANGED /** DbusmenuGtkClientClass: @@ -53,7 +54,10 @@ G_BEGIN_DECLS */ typedef struct _DbusmenuGtkClientClass DbusmenuGtkClientClass; struct _DbusmenuGtkClientClass { - GtkMenuClass parent_class; + DbusmenuClientClass parent_class; + + /* Signals */ + void (*root_changed) (DbusmenuMenuitem * newroot); /* Reserved */ void (*reserved1) (void); @@ -68,7 +72,7 @@ struct _DbusmenuGtkClientClass { */ typedef struct _DbusmenuGtkClient DbusmenuGtkClient; struct _DbusmenuGtkClient { - GtkMenu parent; + DbusmenuClient parent; }; GType dbusmenu_gtkclient_get_type (void); -- cgit v1.2.3 From c6967512647c4282ce740ca6e1899e06f1a91453 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Jun 2009 23:05:44 -0500 Subject: Getting rid of code. We don't need properties or to build a cleint. I mean, we are one :) --- libdbusmenu-gtk/Makefile.am | 4 ++ libdbusmenu-gtk/client.c | 128 ++------------------------------------------ 2 files changed, 8 insertions(+), 124 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/Makefile.am b/libdbusmenu-gtk/Makefile.am index 831719c..c375428 100644 --- a/libdbusmenu-gtk/Makefile.am +++ b/libdbusmenu-gtk/Makefile.am @@ -8,9 +8,13 @@ lib_LTLIBRARIES = \ libdbusmenu_gtkincludedir=$(includedir)/libdbusmenu-0.1/libdbusmenu-gtk/ libdbusmenu_gtkinclude_HEADERS = \ + client.h \ menu.h libdbusmenu_gtk_la_SOURCES = \ + client.h \ + client.c \ + menu.h \ menu.c libdbusmenu_gtk_la_LDFLAGS = \ diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 8ee1718..6263cea 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -32,37 +32,13 @@ License version 3 and version 2.1 along with this program. If not, see #include -#include "menu.h" -#include "libdbusmenu-glib/client.h" - -/* Properties */ -enum { - PROP_0, - PROP_DBUSOBJECT, - PROP_DBUSNAME -}; - -/* Private */ -typedef struct _DbusmenuGtkClientPrivate DbusmenuGtkClientPrivate; -struct _DbusmenuGtkClientPrivate { - DbusmenuClient * client; - - gchar * dbus_object; - gchar * dbus_name; -}; - -#define DBUSMENU_GTKCLIENT_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_GTKCLIENT_TYPE, DbusmenuGtkClientPrivate)) +#include "client.h" /* Prototypes */ static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass); static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self); static void dbusmenu_gtkclient_dispose (GObject *object); static void dbusmenu_gtkclient_finalize (GObject *object); -static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec); -static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec); -/* Internal */ -static void build_client (DbusmenuGtkClient * self); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -72,23 +48,8 @@ dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (DbusmenuGtkClientPrivate)); - object_class->dispose = dbusmenu_gtkclient_dispose; object_class->finalize = dbusmenu_gtkclient_finalize; - object_class->set_property = set_property; - object_class->get_property = get_property; - - g_object_class_install_property (object_class, PROP_DBUSOBJECT, - g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_OBJECT, "DBus Object we represent", - "The Object on the client that we're getting our data from.", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (object_class, PROP_DBUSNAME, - g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_NAME, "DBus Client we connect to", - "Name of the DBus client we're connecting to.", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); return; } @@ -96,12 +57,6 @@ dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass) static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self) { - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(self); - - priv->client = NULL; - - priv->dbus_object = NULL; - priv->dbus_name = NULL; return; } @@ -109,78 +64,21 @@ dbusmenu_gtkclient_init (DbusmenuGtkClient *self) static void dbusmenu_gtkclient_dispose (GObject *object) { - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(object); - - if (priv->client != NULL) { - g_object_unref(G_OBJECT(priv->client)); - priv->client = NULL; - } G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->dispose (object); return; } +static void process_layout_change (DbusmenuClient * client, DbusmenuGtkClient * gtkmenu); + static void dbusmenu_gtkclient_finalize (GObject *object) { - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(object); - - g_free(priv->dbus_object); - priv->dbus_object = NULL; - - g_free(priv->dbus_name); - priv->dbus_name = NULL; - + process_layout_change(NULL, NULL); G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->finalize (object); return; } -static void -set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) -{ - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(obj); - - switch (id) { - case PROP_DBUSNAME: - priv->dbus_name = g_value_dup_string(value); - if (priv->dbus_name != NULL && priv->dbus_object != NULL) { - build_client(DBUSMENU_GTKCLIENT(obj)); - } - break; - case PROP_DBUSOBJECT: - priv->dbus_object = g_value_dup_string(value); - if (priv->dbus_name != NULL && priv->dbus_object != NULL) { - build_client(DBUSMENU_GTKCLIENT(obj)); - } - break; - default: - g_warning("Unknown property %d.", id); - return; - } - - return; -} - -static void -get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) -{ - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(obj); - - switch (id) { - case PROP_DBUSNAME: - g_value_set_string(value, priv->dbus_name); - break; - case PROP_DBUSOBJECT: - g_value_set_string(value, priv->dbus_object); - break; - default: - g_warning("Unknown property %d.", id); - return; - } - - return; -} - /* Internal Functions */ static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; @@ -291,24 +189,6 @@ process_layout_change (DbusmenuClient * client, DbusmenuGtkClient * gtkmenu) } -/* Builds the client and connects all of the signals - up for it so that it's happy-happy */ -static void -build_client (DbusmenuGtkClient * self) -{ - DbusmenuGtkClientPrivate * priv = DBUSMENU_GTKCLIENT_GET_PRIVATE(self); - - if (priv->client == NULL) { - priv->client = dbusmenu_client_new(priv->dbus_name, priv->dbus_object); - - /* Register for layout changes, this should come after the - creation of the client pulls it from DBus */ - g_signal_connect(G_OBJECT(priv->client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(process_layout_change), self); - } - - return; -} - /* Public API */ /** -- cgit v1.2.3 From d4503d1336b547db4b8cbdd8de75c01898eceff5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Jun 2009 09:22:00 -0500 Subject: Major reshuffling, not quite done, but compiles. --- libdbusmenu-gtk/client.c | 93 +++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 53 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 6263cea..9657c28 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -39,6 +39,10 @@ static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass); static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self); static void dbusmenu_gtkclient_dispose (GObject *object); static void dbusmenu_gtkclient_finalize (GObject *object); +static void new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata); +static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpointer userdata); +static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata); +static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, gpointer userdata); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -57,7 +61,7 @@ dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass) static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self) { - + g_signal_connect(G_OBJECT(self), DBUSMENU_CLIENT_SIGNAL_NEW_MENUITEM, G_CALLBACK(new_menuitem), NULL); return; } @@ -69,12 +73,10 @@ dbusmenu_gtkclient_dispose (GObject *object) return; } -static void process_layout_change (DbusmenuClient * client, DbusmenuGtkClient * gtkmenu); - static void dbusmenu_gtkclient_finalize (GObject *object) { - process_layout_change(NULL, NULL); + G_OBJECT_CLASS (dbusmenu_gtkclient_parent_class)->finalize (object); return; } @@ -84,6 +86,8 @@ dbusmenu_gtkclient_finalize (GObject *object) static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem"; static const gchar * data_menu = "dbusmenugtk-data-gtkmenu"; +/* This is the call back for the GTK widget for when it gets + clicked on by the user to send it back across the bus. */ static gboolean menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) { @@ -91,6 +95,8 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi) return TRUE; } +/* Whenever we have a property change on a DbusmenuMenuitem + we need to be responsive to that. */ static void menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi) { @@ -102,6 +108,9 @@ menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenu return; } +/* Call back that happens when the DbusmenuMenuitem + is destroyed. We're making sure to clean up everything + else down the pipe. */ static void destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) { @@ -110,85 +119,63 @@ destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) return; } +/* This takes a new DbusmenuMenuitem and attaches the + various things that we need to make it work in a + GTK World. */ static void -connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi) +new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) { + GtkWidget * gmi = gtk_menu_item_new(); + + /* Attach these two */ g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); + /* DbusmenuMenuitem signals */ g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(new_child), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(delete_child), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(move_child), NULL); + + /* GtkMenuitem signals */ g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); + /* Life insurance */ g_object_weak_ref(G_OBJECT(mi), destoryed_dbusmenuitem_cb, gmi); return; } static void -process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu) +new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpointer userdata) { - gpointer unknown_menuitem = g_object_get_data(G_OBJECT(mi), data_menuitem); - if (unknown_menuitem == NULL) { - /* Oh, a virgin DbusmenuMenuitem, let's fix that. */ - GtkWidget * menuitem = gtk_menu_item_new(); - connect_menuitem(mi, GTK_MENU_ITEM(menuitem)); - unknown_menuitem = menuitem; - gtk_menu_shell_append(GTK_MENU_SHELL(parentmenu), menuitem); - } - - GList * children = dbusmenu_menuitem_get_children(mi); - if (children == NULL) { - /* If there are no children to process we are - done and we can move along */ - return; - } + gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); + if (ann_menu == NULL) { + /* Oh, we don't have a submenu, build one! */ - /* Phase 0: Make a submenu if we don't have one */ - gpointer unknown_menu = g_object_get_data(G_OBJECT(mi), data_menu); - if (unknown_menu == NULL) { - GtkWidget * gtkmenu = gtk_menu_new(); - g_object_ref(gtkmenu); - g_object_set_data_full(G_OBJECT(mi), data_menu, gtkmenu, g_object_unref); - unknown_menu = gtkmenu; - gtk_menu_item_set_submenu(GTK_MENU_ITEM(unknown_menuitem), gtkmenu); - gtk_widget_show(gtkmenu); } - /* Phase 1: Add missing children */ - GList * child = NULL; - for (child = children; child != NULL; child = g_list_next(child)) { - process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(unknown_menu)); - } + return; +} - /* Phase 2: Delete removed children */ - /* Actually, we don't need to do this because of the weak - reference that we've added above. When the DbusmenuMenuitem - gets destroyed it takes its GtkMenuItem with it. Bye bye. */ +static void +delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata) +{ - /* Phase 3: Profit! */ return; } -/* Processing the layout being updated and handling - that and making it into a menu */ static void -process_layout_change (DbusmenuClient * client, DbusmenuGtkClient * gtkmenu) +move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, gpointer userdata) { - DbusmenuMenuitem * root = dbusmenu_client_get_root(client); - - GList * children = dbusmenu_menuitem_get_children(root); - if (children == NULL) { + gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); + if (ann_menu == NULL) { + g_warning("Moving a child when we don't have a submenu!"); return; } - GList * child = NULL; - for (child = children; child != NULL; child = g_list_next(child)) { - process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(gtkmenu)); - } - return; } - /* Public API */ /** -- cgit v1.2.3 From 8d75067ada03ed13fcb183987f8392c18afd4992 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Jun 2009 21:27:10 -0500 Subject: Handling the differing signals to set things up with the various gtk widgets --- libdbusmenu-gtk/client.c | 41 ++++++++++++++++++++++++++++++++++++++--- libdbusmenu-gtk/client.h | 1 + 2 files changed, 39 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 9657c28..99e41bf 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -125,7 +125,16 @@ destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem) static void new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) { - GtkWidget * gmi = gtk_menu_item_new(); + gpointer ann_mi = g_object_get_data(G_OBJECT(mi), data_menuitem); + GtkMenuItem * gmi = GTK_MENU_ITEM(ann_mi); + + if (gmi != NULL) { + /* It's possible we've already been looked at, that's + okay, but we can just ignore this signal then. */ + return; + } + + gmi = GTK_MENU_ITEM(gtk_menu_item_new()); /* Attach these two */ g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); @@ -149,17 +158,34 @@ static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpointer userdata) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); - if (ann_menu == NULL) { + GtkMenu * menu = GTK_MENU(ann_menu); + if (menu == NULL) { /* Oh, we don't have a submenu, build one! */ + menu = GTK_MENU(gtk_menu_new()); + g_object_set_data(G_OBJECT(mi), data_menu, menu); - } + GtkMenuItem * parent = dbusmenu_gtkclient_menuitem_get (mi); + gtk_menu_item_set_submenu(parent, GTK_WIDGET(menu)); + } + GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get (child); + gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(childmi), position); + return; } static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata) { + if (g_list_length(dbusmenu_menuitem_get_children(mi)) == 0) { + gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); + GtkMenu * menu = GTK_MENU(ann_menu); + + if (menu != NULL) { + gtk_widget_destroy(GTK_WIDGET(menu)); + g_object_set_data(G_OBJECT(mi), data_menu, NULL); + } + } return; } @@ -173,6 +199,9 @@ move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint ol return; } + GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get (child); + gtk_menu_reorder_child(GTK_MENU(ann_menu), GTK_WIDGET(childmi), new); + return; } @@ -197,3 +226,9 @@ dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object) NULL); } +GtkMenuItem * +dbusmenu_gtkclient_menuitem_get (DbusmenuMenuitem * item) +{ + return GTK_MENU_ITEM(g_object_get_data(G_OBJECT(item), data_menuitem)); +} + diff --git a/libdbusmenu-gtk/client.h b/libdbusmenu-gtk/client.h index 96846a4..3c0117a 100644 --- a/libdbusmenu-gtk/client.h +++ b/libdbusmenu-gtk/client.h @@ -77,6 +77,7 @@ struct _DbusmenuGtkClient { GType dbusmenu_gtkclient_get_type (void); DbusmenuGtkClient * dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object); +GtkMenuItem * dbusmenu_gtkclient_menuitem_get (DbusmenuMenuitem * item); /** SECTION:gtkmenu -- cgit v1.2.3 From 04a9be5019d23590111030196d41fc08ac9cc146 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Jun 2009 21:37:54 -0500 Subject: Some comments for the gtk-doc stuff --- libdbusmenu-gtk/client.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 99e41bf..eae304f 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -226,6 +226,15 @@ dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object) NULL); } +/** + dbusmenu_gtkclient_menuitem_get: + @item: #DbusmenuMenuitem to get associated #GtkMenuItem on. + + This grabs the #GtkMenuItem that is associated with the + #DbusmenuMenuitem. + + Return value: The #GtkMenuItem that can be played with. +*/ GtkMenuItem * dbusmenu_gtkclient_menuitem_get (DbusmenuMenuitem * item) { -- cgit v1.2.3 From 7dca1c307d2fecb14308f4f31a7bec4c86cc38cc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 15:18:11 -0500 Subject: Adding the client to the child related functions --- libdbusmenu-gtk/client.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index eae304f..7ba710f 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -40,9 +40,9 @@ static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self); static void dbusmenu_gtkclient_dispose (GObject *object); static void dbusmenu_gtkclient_finalize (GObject *object); static void new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata); -static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpointer userdata); -static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata); -static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, gpointer userdata); +static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, DbusmenuGtkClient * gtkclient); +static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient); +static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -140,10 +140,10 @@ new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) g_object_set_data(G_OBJECT(mi), data_menuitem, gmi); /* DbusmenuMenuitem signals */ - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(new_child), NULL); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(delete_child), NULL); - g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(move_child), NULL); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(new_child), client); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(delete_child), client); + g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(move_child), client); /* GtkMenuitem signals */ g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi); @@ -155,7 +155,7 @@ new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) } static void -new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpointer userdata) +new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, DbusmenuGtkClient * gtkclient) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); GtkMenu * menu = GTK_MENU(ann_menu); @@ -175,7 +175,7 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, gpoi } static void -delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata) +delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient) { if (g_list_length(dbusmenu_menuitem_get_children(mi)) == 0) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); @@ -191,7 +191,7 @@ delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, gpointer userdata } static void -move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, gpointer userdata) +move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); if (ann_menu == NULL) { -- cgit v1.2.3 From 1e11dbfb9f51114ae1f1fe9fc2d25a507f54738a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 15:24:54 -0500 Subject: Making it so that we don't have any gtk events or handling of the root node. It's a special node, we need to leave it alone. --- libdbusmenu-gtk/client.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 7ba710f..64cb709 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -154,9 +154,17 @@ new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) return; } +static gboolean +is_root (DbusmenuGtkClient * gtkclient, DbusmenuMenuitem * mi) +{ + return mi == dbusmenu_client_get_root(DBUSMENU_CLIENT(gtkclient)); +} + static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, DbusmenuGtkClient * gtkclient) { + if (is_root(gtkclient, mi)) { return; } + gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); GtkMenu * menu = GTK_MENU(ann_menu); if (menu == NULL) { @@ -170,6 +178,7 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, Dbus GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get (child); gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(childmi), position); + gtk_widget_show(GTK_WIDGET(menu)); return; } @@ -177,6 +186,8 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, Dbus static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient) { + if (is_root(gtkclient, mi)) { return; } + if (g_list_length(dbusmenu_menuitem_get_children(mi)) == 0) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); GtkMenu * menu = GTK_MENU(ann_menu); @@ -193,6 +204,8 @@ delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient) { + if (is_root(gtkclient, mi)) { return; } + gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); if (ann_menu == NULL) { g_warning("Moving a child when we don't have a submenu!"); -- cgit v1.2.3 From 7fde2d3d2d3b1437eea4695d5164d92b0d845b5c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 15:38:16 -0500 Subject: Make it so that getting the menuitem will create it in cases where it's not created. This removes the chance of a race between the various functions. --- libdbusmenu-gtk/client.c | 20 +++++++++++++++----- libdbusmenu-gtk/client.h | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 64cb709..f715e35 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -172,11 +172,11 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, Dbus menu = GTK_MENU(gtk_menu_new()); g_object_set_data(G_OBJECT(mi), data_menu, menu); - GtkMenuItem * parent = dbusmenu_gtkclient_menuitem_get (mi); + GtkMenuItem * parent = dbusmenu_gtkclient_menuitem_get(gtkclient, mi); gtk_menu_item_set_submenu(parent, GTK_WIDGET(menu)); } - GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get (child); + GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get(gtkclient, child); gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(childmi), position); gtk_widget_show(GTK_WIDGET(menu)); @@ -212,7 +212,7 @@ move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint ol return; } - GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get (child); + GtkMenuItem * childmi = dbusmenu_gtkclient_menuitem_get(gtkclient, child); gtk_menu_reorder_child(GTK_MENU(ann_menu), GTK_WIDGET(childmi), new); return; @@ -241,6 +241,7 @@ dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object) /** dbusmenu_gtkclient_menuitem_get: + @client: A #DbusmenuGtkClient with the item in it. @item: #DbusmenuMenuitem to get associated #GtkMenuItem on. This grabs the #GtkMenuItem that is associated with the @@ -249,8 +250,17 @@ dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object) Return value: The #GtkMenuItem that can be played with. */ GtkMenuItem * -dbusmenu_gtkclient_menuitem_get (DbusmenuMenuitem * item) +dbusmenu_gtkclient_menuitem_get (DbusmenuGtkClient * client, DbusmenuMenuitem * item) { - return GTK_MENU_ITEM(g_object_get_data(G_OBJECT(item), data_menuitem)); + g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), NULL); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(item), NULL); + + GtkMenuItem * mi = GTK_MENU_ITEM(g_object_get_data(G_OBJECT(item), data_menuitem)); + if (mi == NULL) { + new_menuitem(DBUSMENU_CLIENT(client), item, NULL); + mi = GTK_MENU_ITEM(g_object_get_data(G_OBJECT(item), data_menuitem)); + } + + return mi; } diff --git a/libdbusmenu-gtk/client.h b/libdbusmenu-gtk/client.h index 3c0117a..a549fe0 100644 --- a/libdbusmenu-gtk/client.h +++ b/libdbusmenu-gtk/client.h @@ -77,7 +77,7 @@ struct _DbusmenuGtkClient { GType dbusmenu_gtkclient_get_type (void); DbusmenuGtkClient * dbusmenu_gtkclient_new (gchar * dbus_name, gchar * dbus_object); -GtkMenuItem * dbusmenu_gtkclient_menuitem_get (DbusmenuMenuitem * item); +GtkMenuItem * dbusmenu_gtkclient_menuitem_get (DbusmenuGtkClient * client, DbusmenuMenuitem * item); /** SECTION:gtkmenu -- cgit v1.2.3 From a901ed8e2d0f3dd55fb8628766cc1a8194d5b468 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 16:20:53 -0500 Subject: Fleshing out the root changed function, but that's led to another couple that need to get figured out as well. --- libdbusmenu-gtk/menu.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 4b88f67..28a446b 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -185,8 +185,43 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal Functions */ static void -root_changed (void) { - /* stub */ +root_child_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, DbusmenuGtkMenu * menu) +{ + + return; +} + +static void +root_child_moved (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newposition, guint oldposition, DbusmenuGtkMenu * menu) +{ + + return; +} + +static void +root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGtkMenu * menu) { + if (newroot == NULL) { + gtk_widget_hide(GTK_WIDGET(menu)); + return; + } + + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(root_child_added), menu); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(root_child_moved), menu); + + GList * child = NULL; + guint count = 0; + for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child)) { + gtk_menu_append(menu, GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(client, child->data))); + count++; + } + + if (count > 0) { + gtk_widget_show(GTK_WIDGET(menu)); + } else { + gtk_widget_hide(GTK_WIDGET(menu)); + } + + return; } /* Builds the client and connects all of the signals -- cgit v1.2.3 From ac451d87b9ccaf3f9377a5c8957dea5cc3724b41 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 16:28:09 -0500 Subject: Okay, now we have these guys doing something, let's roll. --- libdbusmenu-gtk/menu.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 28a446b..731f92d 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -187,14 +187,26 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static void root_child_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, DbusmenuGtkMenu * menu) { - + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); + gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child)), position); + gtk_widget_show(GTK_WIDGET(menu)); return; } static void root_child_moved (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newposition, guint oldposition, DbusmenuGtkMenu * menu) { + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); + gtk_menu_reorder_child(GTK_MENU(menu), GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child)), newposition); + return; +} +static void +root_child_delete (DbusmenuMenuitem * root, DbusmenuMenuitem * child, DbusmenuGtkMenu * menu) +{ + if (g_list_length(dbusmenu_menuitem_get_children(root)) == 0) { + gtk_widget_hide(GTK_WIDGET(menu)); + } return; } @@ -205,8 +217,9 @@ root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGt return; } - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(root_child_added), menu); - g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(root_child_moved), menu); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(root_child_added), menu); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(root_child_moved), menu); + g_signal_connect(G_OBJECT(newroot), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(root_child_delete), menu); GList * child = NULL; guint count = 0; -- cgit v1.2.3 From 026f38b57f213644c101b1c0166adf0d5995a245 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 25 Jun 2009 16:44:08 -0500 Subject: Some debug messages and a forcing the initial root reset at the start. --- libdbusmenu-gtk/menu.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index 731f92d..a59421a 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -187,6 +187,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static void root_child_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, DbusmenuGtkMenu * menu) { + g_debug("Root new child"); DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child)), position); gtk_widget_show(GTK_WIDGET(menu)); @@ -196,6 +197,7 @@ root_child_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint posit static void root_child_moved (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newposition, guint oldposition, DbusmenuGtkMenu * menu) { + g_debug("Root child moved"); DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); gtk_menu_reorder_child(GTK_MENU(menu), GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child)), newposition); return; @@ -204,6 +206,7 @@ root_child_moved (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint newpo static void root_child_delete (DbusmenuMenuitem * root, DbusmenuMenuitem * child, DbusmenuGtkMenu * menu) { + g_debug("Root child deleted"); if (g_list_length(dbusmenu_menuitem_get_children(root)) == 0) { gtk_widget_hide(GTK_WIDGET(menu)); } @@ -212,6 +215,7 @@ root_child_delete (DbusmenuMenuitem * root, DbusmenuMenuitem * child, DbusmenuGt static void root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGtkMenu * menu) { + g_debug("Root changed"); if (newroot == NULL) { gtk_widget_hide(GTK_WIDGET(menu)); return; @@ -250,6 +254,8 @@ build_client (DbusmenuGtkMenu * self) /* Register for layout changes, this should come after the creation of the client pulls it from DBus */ g_signal_connect(G_OBJECT(priv->client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(root_changed), self); + + root_changed(priv->client, dbusmenu_client_get_root(DBUSMENU_CLIENT(priv->client)), self); } return; -- cgit v1.2.3 From eea69ca7f7a48ff17a02adee6a2640663b9c0245 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 26 Jun 2009 12:53:15 -0500 Subject: Removing the old is_root and now using the new property on the menuitems for that task. --- libdbusmenu-gtk/client.c | 12 +++--------- libdbusmenu-gtk/menu.c | 1 - 2 files changed, 3 insertions(+), 10 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index f715e35..a236123 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -154,16 +154,10 @@ new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata) return; } -static gboolean -is_root (DbusmenuGtkClient * gtkclient, DbusmenuMenuitem * mi) -{ - return mi == dbusmenu_client_get_root(DBUSMENU_CLIENT(gtkclient)); -} - static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, DbusmenuGtkClient * gtkclient) { - if (is_root(gtkclient, mi)) { return; } + if (dbusmenu_menuitem_get_root(mi)) { return; } gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); GtkMenu * menu = GTK_MENU(ann_menu); @@ -186,7 +180,7 @@ new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position, Dbus static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient) { - if (is_root(gtkclient, mi)) { return; } + if (dbusmenu_menuitem_get_root(mi)) { return; } if (g_list_length(dbusmenu_menuitem_get_children(mi)) == 0) { gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); @@ -204,7 +198,7 @@ delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient) { - if (is_root(gtkclient, mi)) { return; } + if (dbusmenu_menuitem_get_root(mi)) { return; } gpointer ann_menu = g_object_get_data(G_OBJECT(mi), data_menu); if (ann_menu == NULL) { diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index a59421a..b54df7b 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -215,7 +215,6 @@ root_child_delete (DbusmenuMenuitem * root, DbusmenuMenuitem * child, DbusmenuGt static void root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGtkMenu * menu) { - g_debug("Root changed"); if (newroot == NULL) { gtk_widget_hide(GTK_WIDGET(menu)); return; -- cgit v1.2.3 From 39ba33c8902b87bd42bf764bf3fb7d7385034ad4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 26 Jun 2009 13:40:04 -0500 Subject: Wait for the signal about the root changing instead of forcing it here. It'll have to change from the beginning state that we just had it in. And since we're singled threaded ther was no way for it to change in those few lines of code. --- libdbusmenu-gtk/menu.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'libdbusmenu-gtk') diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index b54df7b..bc7458c 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -253,8 +253,6 @@ build_client (DbusmenuGtkMenu * self) /* Register for layout changes, this should come after the creation of the client pulls it from DBus */ g_signal_connect(G_OBJECT(priv->client), DBUSMENU_GTKCLIENT_SIGNAL_ROOT_CHANGED, G_CALLBACK(root_changed), self); - - root_changed(priv->client, dbusmenu_client_get_root(DBUSMENU_CLIENT(priv->client)), self); } return; -- cgit v1.2.3