From 53b477561da7b49fcf208cf615a42e3b0820c0b8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 13 Apr 2009 16:23:09 -0500 Subject: Putting in more gobject based examples and getting all the libraries tied in to make them work. --- .bzrignore | 1 + configure.ac | 15 ++++++++++++++ libdbusmenu-glib/Makefile.am | 8 ++++---- libdbusmenu-glib/menuitem.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-glib/menuitem.h | 33 ++++++++++++++++++++++++++++++ libdbusmenu-glib/test.c | 4 ---- libdbusmenu-glib/test.h | 2 -- 7 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 libdbusmenu-glib/menuitem.c create mode 100644 libdbusmenu-glib/menuitem.h delete mode 100644 libdbusmenu-glib/test.c delete mode 100644 libdbusmenu-glib/test.h diff --git a/.bzrignore b/.bzrignore index 76220ec..cd6e8f9 100644 --- a/.bzrignore +++ b/.bzrignore @@ -15,3 +15,4 @@ libdbusmenu-qt/.libs libdbusmenu-qt/dbusmenu-qt.pc libdbusmenu-qt/libdbusmenu-qt.la libdbusmenu-qt/libdbusmenu_qt_la-test.lo +libdbusmenu-glib/libdbusmenu_glib_la-menuitem.lo diff --git a/configure.ac b/configure.ac index 9a4ecbe..47f750a 100644 --- a/configure.ac +++ b/configure.ac @@ -19,6 +19,21 @@ AC_PROG_LIBTOOL AC_SUBST(VERSION) AC_CONFIG_MACRO_DIR([m4]) +########################### +# Dependencies - GLib +########################### + +GLIB_REQUIRED_VERSION=2.18 +DBUS_REQUIRED_VERSION=0.76 +XML_REQUIRED_VERSION=2.6 + +PKG_CHECK_MODULES(DBUSMENUGLIB, glib-2.0 >= $GLIB_REQUIRED_VERSION + dbus-glib-1 >= $DBUS_REQUIRED_VERSION + libxml-2.0 >= $XML_REQUIRED_VERSION) + +AC_SUBST(DBUSMENUGLIB_CFLAGS) +AC_SUBST(DBUSMENUGLIB_LIBS) + ########################### # Lib versioning ########################### diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index c94231b..758de05 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -8,10 +8,10 @@ lib_LTLIBRARIES = \ libdbusmenu_glibincludedir=$(includedir)/libdbusmenu-0.1/libdbusmenu-glib/ libdbusmenu_glibinclude_HEADERS = \ - test.h + menuitem.h libdbusmenu_glib_la_SOURCES = \ - test.c + menuitem.c libdbusmenu_glib_la_LDFLAGS = \ -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \ @@ -19,10 +19,10 @@ libdbusmenu_glib_la_LDFLAGS = \ -export-symbols-regex "^[^_].*" libdbusmenu_glib_la_CFLAGS = \ - $(LIBDBUSMENU_GLIB_CFLAGS) + $(DBUSMENUGLIB_CFLAGS) libdbusmenu_glib_la_LIBADD = \ - $(LIBDBUSMENU_GLIB_LIBS) + $(DBUSMENUGLIB_LIBS) pkgconfig_DATA = dbusmenu-glib.pc pkgconfigdir = $(libdir)/pkgconfig diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c new file mode 100644 index 0000000..080372a --- /dev/null +++ b/libdbusmenu-glib/menuitem.c @@ -0,0 +1,48 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "menuitem.h" + +typedef struct _DbusmenuMenuitemPrivate DbusmenuMenuitemPrivate; + +struct _DbusmenuMenuitemPrivate +{ +}; + +#define DBUSMENU_MENUITEM_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemPrivate)) + +static void dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass); +static void dbusmenu_menuitem_init (DbusmenuMenuitem *self); +static void dbusmenu_menuitem_dispose (GObject *object); +static void dbusmenu_menuitem_finalize (GObject *object); + +G_DEFINE_TYPE (DbusmenuMenuitem, dbusmenu_menuitem, G_TYPE_OBJECT); + +static void +dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) +{ +GObjectClass *object_class = G_OBJECT_CLASS (klass); + +g_type_class_add_private (klass, sizeof (DbusmenuMenuitemPrivate)); + +object_class->dispose = dbusmenu_menuitem_dispose; +object_class->finalize = dbusmenu_menuitem_finalize; +} + +static void +dbusmenu_menuitem_init (DbusmenuMenuitem *self) +{ +} + +static void +dbusmenu_menuitem_dispose (GObject *object) +{ +G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->dispose (object); +} + +static void +dbusmenu_menuitem_finalize (GObject *object) +{ +G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->finalize (object); +} diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h new file mode 100644 index 0000000..4e87ba5 --- /dev/null +++ b/libdbusmenu-glib/menuitem.h @@ -0,0 +1,33 @@ +#ifndef __DBUSMENU_MENUITEM_H__ +#define __DBUSMENU_MENUITEM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define DBUSMENU_MENUITEM_TYPE (dbusmenu_menuitem_get_type ()) +#define DBUSMENU_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitem)) +#define DBUSMENU_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemClass)) +#define DBUSMENU_IS_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_MENUITEM_TYPE)) +#define DBUSMENU_IS_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_MENUITEM_TYPE)) +#define DBUSMENU_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemClass)) + +typedef struct _DbusmenuMenuitem DbusmenuMenuitem; +typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass; + +struct _DbusmenuMenuitemClass +{ +GObjectClass parent_class; +}; + +struct _DbusmenuMenuitem +{ +GObject parent; +}; + +GType dbusmenu_menuitem_get_type (void); + +G_END_DECLS + +#endif diff --git a/libdbusmenu-glib/test.c b/libdbusmenu-glib/test.c deleted file mode 100644 index 8ebb3f7..0000000 --- a/libdbusmenu-glib/test.c +++ /dev/null @@ -1,4 +0,0 @@ - -void mysymbol (void) { - return; -} diff --git a/libdbusmenu-glib/test.h b/libdbusmenu-glib/test.h deleted file mode 100644 index ad000af..0000000 --- a/libdbusmenu-glib/test.h +++ /dev/null @@ -1,2 +0,0 @@ - -void mysymbol (void); -- cgit v1.2.3 From 2cd914b84826b3ca7229a3b1d2c2613a25076858 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 13 Apr 2009 16:50:50 -0500 Subject: Designing some API baby --- libdbusmenu-glib/menuitem.h | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index 4e87ba5..3e57a51 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -16,18 +16,44 @@ G_BEGIN_DECLS typedef struct _DbusmenuMenuitem DbusmenuMenuitem; typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass; +#define DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED "property-changed" +#define DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED "item-activated" + struct _DbusmenuMenuitemClass { -GObjectClass parent_class; + GObjectClass parent_class; + + /* Signals */ + void (*property_changed) (gchar * property); + void (*item_activated) (void); + + /* Virtual functions */ + void (*buildxml) (GPtrArray ** stringarray); + + void (*reserved1) (void); + void (*reserved2) (void); + void (*reserved3) (void); + void (*reserved4) (void); }; struct _DbusmenuMenuitem { -GObject parent; + GObject parent; }; GType dbusmenu_menuitem_get_type (void); +GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi); +guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent); + +gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); +gboolean dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); +gboolean dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position); + +gboolean dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * property, const gchar * value); +const gchar * dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar * property); +gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property); + G_END_DECLS #endif -- cgit v1.2.3 From 0fd3f0a9812693dc73c67a5de6e4ce101f736acf Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 14 Apr 2009 23:35:56 -0500 Subject: Building the DBus bindings --- .bzrignore | 2 ++ libdbusmenu-glib/Makefile.am | 23 +++++++++++++- libdbusmenu-glib/dbus-menu.xml | 70 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 libdbusmenu-glib/dbus-menu.xml diff --git a/.bzrignore b/.bzrignore index cd6e8f9..1ecdd00 100644 --- a/.bzrignore +++ b/.bzrignore @@ -16,3 +16,5 @@ libdbusmenu-qt/dbusmenu-qt.pc libdbusmenu-qt/libdbusmenu-qt.la libdbusmenu-qt/libdbusmenu_qt_la-test.lo libdbusmenu-glib/libdbusmenu_glib_la-menuitem.lo +dbusmenu-client.h +dbusmenu-server.h diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 758de05..59a6e8c 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -1,6 +1,7 @@ EXTRA_DIST = \ - dbusmenu-glib.pc.in + dbusmenu-glib.pc.in \ + dbus-menu.xml lib_LTLIBRARIES = \ libdbusmenu-glib.la @@ -11,6 +12,8 @@ libdbusmenu_glibinclude_HEADERS = \ menuitem.h libdbusmenu_glib_la_SOURCES = \ + dbusmenu-server.h \ + dbusmenu-client.h \ menuitem.c libdbusmenu_glib_la_LDFLAGS = \ @@ -27,3 +30,21 @@ libdbusmenu_glib_la_LIBADD = \ pkgconfig_DATA = dbusmenu-glib.pc pkgconfigdir = $(libdir)/pkgconfig +BUILT_SOURCES = \ + dbusmenu-client.h \ + dbusmenu-server.h + +dbusmenu-server.h: dbus-menu.xml + dbus-binding-tool \ + --prefix=_dbusmenu_server \ + --mode=glib-server \ + --output=dbusmenu-server.h \ + $(srcdir)/dbus-menu.xml + +dbusmenu-client.h: dbus-menu.xml + dbus-binding-tool \ + --prefix=_dbusmenu_client \ + --mode=glib-client \ + --output=dbusmenu-client.h \ + $(srcdir)/dbus-menu.xml + diff --git a/libdbusmenu-glib/dbus-menu.xml b/libdbusmenu-glib/dbus-menu.xml new file mode 100644 index 0000000..7c41ac2 --- /dev/null +++ b/libdbusmenu-glib/dbus-menu.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From ab032f25b52b507873dcaf7779013be048bb2a31 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 15 Apr 2009 09:04:57 -0500 Subject: Adding basic client and server objects. --- .bzrignore | 2 ++ libdbusmenu-glib/Makefile.am | 11 +++++++-- libdbusmenu-glib/client.c | 53 +++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-glib/client.h | 31 +++++++++++++++++++++++++ libdbusmenu-glib/server.c | 54 ++++++++++++++++++++++++++++++++++++++++++++ libdbusmenu-glib/server.h | 31 +++++++++++++++++++++++++ 6 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 libdbusmenu-glib/client.c create mode 100644 libdbusmenu-glib/client.h create mode 100644 libdbusmenu-glib/server.c create mode 100644 libdbusmenu-glib/server.h diff --git a/.bzrignore b/.bzrignore index 1ecdd00..981c365 100644 --- a/.bzrignore +++ b/.bzrignore @@ -18,3 +18,5 @@ libdbusmenu-qt/libdbusmenu_qt_la-test.lo libdbusmenu-glib/libdbusmenu_glib_la-menuitem.lo dbusmenu-client.h dbusmenu-server.h +libdbusmenu_glib_la-client.lo +libdbusmenu_glib_la-server.lo diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 59a6e8c..e248403 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -9,12 +9,19 @@ lib_LTLIBRARIES = \ libdbusmenu_glibincludedir=$(includedir)/libdbusmenu-0.1/libdbusmenu-glib/ libdbusmenu_glibinclude_HEADERS = \ - menuitem.h + menuitem.h \ + server.h \ + client.h libdbusmenu_glib_la_SOURCES = \ dbusmenu-server.h \ dbusmenu-client.h \ - menuitem.c + menuitem.h \ + menuitem.c \ + server.h \ + server.c \ + client.h \ + client.c libdbusmenu_glib_la_LDFLAGS = \ -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \ diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c new file mode 100644 index 0000000..85b02c4 --- /dev/null +++ b/libdbusmenu-glib/client.c @@ -0,0 +1,53 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "client.h" + +typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; + +struct _DbusmenuClientPrivate +{ +}; + +#define DBUSMENU_CLIENT_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_CLIENT_TYPE, DbusmenuClientPrivate)) + +static void dbusmenu_client_class_init (DbusmenuClientClass *klass); +static void dbusmenu_client_init (DbusmenuClient *self); +static void dbusmenu_client_dispose (GObject *object); +static void dbusmenu_client_finalize (GObject *object); + +G_DEFINE_TYPE (DbusmenuClient, dbusmenu_client, G_TYPE_OBJECT); + +static void +dbusmenu_client_class_init (DbusmenuClientClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (DbusmenuClientPrivate)); + + object_class->dispose = dbusmenu_client_dispose; + object_class->finalize = dbusmenu_client_finalize; + + return; +} + +static void +dbusmenu_client_init (DbusmenuClient *self) +{ +} + +static void +dbusmenu_client_dispose (GObject *object) +{ + G_OBJECT_CLASS (dbusmenu_client_parent_class)->dispose (object); + return; +} + +static void +dbusmenu_client_finalize (GObject *object) +{ + G_OBJECT_CLASS (dbusmenu_client_parent_class)->finalize (object); + return; +} diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h new file mode 100644 index 0000000..861e3b5 --- /dev/null +++ b/libdbusmenu-glib/client.h @@ -0,0 +1,31 @@ +#ifndef __DBUSMENU_CLIENT_H__ +#define __DBUSMENU_CLIENT_H__ + +#include +#include + +G_BEGIN_DECLS + +#define DBUSMENU_CLIENT_TYPE (dbusmenu_client_get_type ()) +#define DBUSMENU_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_CLIENT_TYPE, DbusmenuClient)) +#define DBUSMENU_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_CLIENT_TYPE, DbusmenuClientClass)) +#define DBUSMENU_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_CLIENT_TYPE)) +#define DBUSMENU_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_CLIENT_TYPE)) +#define DBUSMENU_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_CLIENT_TYPE, DbusmenuClientClass)) + +typedef struct _DbusmenuClient DbusmenuClient; +typedef struct _DbusmenuClientClass DbusmenuClientClass; + +struct _DbusmenuClientClass { + GObjectClass parent_class; +}; + +struct _DbusmenuClient { + GObject parent; +}; + +GType dbusmenu_client_get_type (void); + +G_END_DECLS + +#endif diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c new file mode 100644 index 0000000..6b3f751 --- /dev/null +++ b/libdbusmenu-glib/server.c @@ -0,0 +1,54 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "server.h" + +typedef struct _DbusmenuServerPrivate DbusmenuServerPrivate; + +struct _DbusmenuServerPrivate +{ +}; + +#define DBUSMENU_SERVER_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_SERVER_TYPE, DbusmenuServerPrivate)) + +static void dbusmenu_server_class_init (DbusmenuServerClass *klass); +static void dbusmenu_server_init (DbusmenuServer *self); +static void dbusmenu_server_dispose (GObject *object); +static void dbusmenu_server_finalize (GObject *object); + +G_DEFINE_TYPE (DbusmenuServer, dbusmenu_server, G_TYPE_OBJECT); + +static void +dbusmenu_server_class_init (DbusmenuServerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (DbusmenuServerPrivate)); + + object_class->dispose = dbusmenu_server_dispose; + object_class->finalize = dbusmenu_server_finalize; + + return; +} + +static void +dbusmenu_server_init (DbusmenuServer *self) +{ + return; +} + +static void +dbusmenu_server_dispose (GObject *object) +{ + G_OBJECT_CLASS (dbusmenu_server_parent_class)->dispose (object); + return; +} + +static void +dbusmenu_server_finalize (GObject *object) +{ + G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object); + return; +} diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h new file mode 100644 index 0000000..b47a5e9 --- /dev/null +++ b/libdbusmenu-glib/server.h @@ -0,0 +1,31 @@ +#ifndef __DBUSMENU_SERVER_H__ +#define __DBUSMENU_SERVER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define DBUSMENU_SERVER_TYPE (dbusmenu_server_get_type ()) +#define DBUSMENU_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_SERVER_TYPE, DbusmenuServer)) +#define DBUSMENU_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_SERVER_TYPE, DbusmenuServerClass)) +#define DBUSMENU_IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_SERVER_TYPE)) +#define DBUSMENU_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_SERVER_TYPE)) +#define DBUSMENU_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_SERVER_TYPE, DbusmenuServerClass)) + +typedef struct _DbusmenuServer DbusmenuServer; +typedef struct _DbusmenuServerClass DbusmenuServerClass; + +struct _DbusmenuServerClass { + GObjectClass parent_class; +}; + +struct _DbusmenuServer { + GObject parent; +}; + +GType dbusmenu_server_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From c3daa4a615df4952ead91bbd0b1d138a8df48cfd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 15 Apr 2009 09:27:11 -0500 Subject: Linking in the dbus prototypes generated by the dbus tools. --- libdbusmenu-glib/client.c | 1 + libdbusmenu-glib/server.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 85b02c4..434b22e 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -3,6 +3,7 @@ #endif #include "client.h" +#include "dbusmenu-client.h" typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 6b3f751..da34709 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -4,6 +4,14 @@ #include "server.h" +/* DBus Prototypes */ +static gboolean _dbusmenu_server_get_property (void); +static gboolean _dbusmenu_server_get_properties (void); +static gboolean _dbusmenu_server_call (void); +static gboolean _dbusmenu_server_list_properties (void); + +#include "dbusmenu-server.h" + typedef struct _DbusmenuServerPrivate DbusmenuServerPrivate; struct _DbusmenuServerPrivate @@ -52,3 +60,33 @@ dbusmenu_server_finalize (GObject *object) G_OBJECT_CLASS (dbusmenu_server_parent_class)->finalize (object); return; } + +/* DBus Prototypes */ +static gboolean +_dbusmenu_server_get_property (void) +{ + + return TRUE; +} + +static gboolean +_dbusmenu_server_get_properties (void) +{ + + return TRUE; +} + +static gboolean +_dbusmenu_server_call (void) +{ + + return TRUE; +} + +static gboolean +_dbusmenu_server_list_properties (void) +{ + + return TRUE; +} + -- cgit v1.2.3 From 701d32624ece7c6b4bb4bfc2c8d24109b06bde75 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 15 Apr 2009 10:23:52 -0500 Subject: Building an API, woo hoo --- libdbusmenu-glib/client.h | 6 +++++- libdbusmenu-glib/server.h | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index 861e3b5..a926cc6 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -4,6 +4,8 @@ #include #include +#include "menuitem.h" + G_BEGIN_DECLS #define DBUSMENU_CLIENT_TYPE (dbusmenu_client_get_type ()) @@ -24,7 +26,9 @@ struct _DbusmenuClient { GObject parent; }; -GType dbusmenu_client_get_type (void); +GType dbusmenu_client_get_type (void); +DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object); +DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client); G_END_DECLS diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index b47a5e9..2d81587 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -4,6 +4,8 @@ #include #include +#include "menuitem.h" + G_BEGIN_DECLS #define DBUSMENU_SERVER_TYPE (dbusmenu_server_get_type ()) @@ -24,7 +26,9 @@ struct _DbusmenuServer { GObject parent; }; -GType dbusmenu_server_get_type (void); +GType dbusmenu_server_get_type (void); +DbusmenuServer * dbusmenu_server_new (const gchar * object); +void dbusmenu_server_set_root (DbusmenuServer * server, DbusmenuMenuitem * root); G_END_DECLS -- cgit v1.2.3 From c317346bb949b4ad8b87082668e93535d7ae47ae Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 10:14:39 -0500 Subject: Changing the TYPE to make more sense and installing the dbus profile --- libdbusmenu-glib/server.c | 9 ++++++++- libdbusmenu-glib/server.h | 12 ++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index da34709..149f2a0 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -16,10 +16,11 @@ typedef struct _DbusmenuServerPrivate DbusmenuServerPrivate; struct _DbusmenuServerPrivate { + DbusmenuMenuitem * root; }; #define DBUSMENU_SERVER_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_SERVER_TYPE, DbusmenuServerPrivate)) +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_SERVER, DbusmenuServerPrivate)) static void dbusmenu_server_class_init (DbusmenuServerClass *klass); static void dbusmenu_server_init (DbusmenuServer *self); @@ -38,12 +39,18 @@ dbusmenu_server_class_init (DbusmenuServerClass *klass) object_class->dispose = dbusmenu_server_dispose; object_class->finalize = dbusmenu_server_finalize; + dbus_g_object_type_install_info(DBUSMENU_TYPE_SERVER, &dbus_glib__dbusmenu_server_object_info); + return; } static void dbusmenu_server_init (DbusmenuServer *self) { + DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(self); + + priv->root = NULL; + return; } diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index 2d81587..a39b3b8 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -8,12 +8,12 @@ G_BEGIN_DECLS -#define DBUSMENU_SERVER_TYPE (dbusmenu_server_get_type ()) -#define DBUSMENU_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_SERVER_TYPE, DbusmenuServer)) -#define DBUSMENU_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_SERVER_TYPE, DbusmenuServerClass)) -#define DBUSMENU_IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_SERVER_TYPE)) -#define DBUSMENU_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_SERVER_TYPE)) -#define DBUSMENU_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_SERVER_TYPE, DbusmenuServerClass)) +#define DBUSMENU_TYPE_SERVER (dbusmenu_server_get_type ()) +#define DBUSMENU_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_TYPE_SERVER, DbusmenuServer)) +#define DBUSMENU_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_TYPE_SERVER, DbusmenuServerClass)) +#define DBUSMENU_IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_TYPE_SERVER)) +#define DBUSMENU_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_SERVER)) +#define DBUSMENU_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_SERVER, DbusmenuServerClass)) typedef struct _DbusmenuServer DbusmenuServer; typedef struct _DbusmenuServerClass DbusmenuServerClass; -- cgit v1.2.3 From 702c3dc2dc729fd5af401ceffe6f1a9ae0276921 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 10:15:27 -0500 Subject: Changing the type name to make more sense --- libdbusmenu-glib/client.c | 2 +- libdbusmenu-glib/client.h | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 434b22e..fc60101 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -12,7 +12,7 @@ struct _DbusmenuClientPrivate }; #define DBUSMENU_CLIENT_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_CLIENT_TYPE, DbusmenuClientPrivate)) +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_CLIENT, DbusmenuClientPrivate)) static void dbusmenu_client_class_init (DbusmenuClientClass *klass); static void dbusmenu_client_init (DbusmenuClient *self); diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index a926cc6..d54b9d7 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -8,12 +8,12 @@ G_BEGIN_DECLS -#define DBUSMENU_CLIENT_TYPE (dbusmenu_client_get_type ()) -#define DBUSMENU_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_CLIENT_TYPE, DbusmenuClient)) -#define DBUSMENU_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_CLIENT_TYPE, DbusmenuClientClass)) -#define DBUSMENU_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_CLIENT_TYPE)) -#define DBUSMENU_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_CLIENT_TYPE)) -#define DBUSMENU_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_CLIENT_TYPE, DbusmenuClientClass)) +#define DBUSMENU_TYPE_CLIENT (dbusmenu_client_get_type ()) +#define DBUSMENU_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_TYPE_CLIENT, DbusmenuClient)) +#define DBUSMENU_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_TYPE_CLIENT, DbusmenuClientClass)) +#define DBUSMENU_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_TYPE_CLIENT)) +#define DBUSMENU_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_CLIENT)) +#define DBUSMENU_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_CLIENT, DbusmenuClientClass)) typedef struct _DbusmenuClient DbusmenuClient; typedef struct _DbusmenuClientClass DbusmenuClientClass; -- cgit v1.2.3 From c6483c1852a4bf840b7609eb7872f46a73cb1638 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 11:01:31 -0500 Subject: Putting in the public interfaces --- libdbusmenu-glib/server.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 149f2a0..7115eaa 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -68,7 +68,7 @@ dbusmenu_server_finalize (GObject *object) return; } -/* DBus Prototypes */ +/* DBus interface */ static gboolean _dbusmenu_server_get_property (void) { @@ -97,3 +97,30 @@ _dbusmenu_server_list_properties (void) return TRUE; } +/* Public Interface */ +DbusmenuServer * +dbusmenu_server_new (const gchar * object) +{ + if (object == NULL) { + object = "/org/freedesktop/dbusmenu"; + } + + DbusmenuServer * self = g_object_new(DBUSMENU_TYPE_SERVER, + "dbus-object-name", object, + NULL); + + return self; +} + +void +dbusmenu_server_set_root (DbusmenuServer * self, DbusmenuMenuitem * root) +{ + GValue rootvalue = {0}; + g_value_init(&rootvalue, G_TYPE_POINTER); + g_value_set_pointer(&rootvalue, root); + g_object_set_property(G_OBJECT(self), "root-node", &rootvalue); + return; +} + + + -- cgit v1.2.3 From 1c3341e725030bd50bc953f3dead9782bf0e3871 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 11:26:18 -0500 Subject: Adding in the server signals --- .bzrignore | 3 +++ libdbusmenu-glib/Makefile.am | 16 ++++++++++++- libdbusmenu-glib/server-marshal.list | 1 + libdbusmenu-glib/server.c | 45 ++++++++++++++++++++++++++++++++---- libdbusmenu-glib/server.h | 15 ++++++++++++ 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 libdbusmenu-glib/server-marshal.list diff --git a/.bzrignore b/.bzrignore index 981c365..97954e9 100644 --- a/.bzrignore +++ b/.bzrignore @@ -20,3 +20,6 @@ dbusmenu-client.h dbusmenu-server.h libdbusmenu_glib_la-client.lo libdbusmenu_glib_la-server.lo +server-marshal.c +server-marshal.h +libdbusmenu_glib_la-server-marshal.lo diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index e248403..2bc23ec 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -20,6 +20,8 @@ libdbusmenu_glib_la_SOURCES = \ menuitem.c \ server.h \ server.c \ + server-marshal.h \ + server-marshal.c \ client.h \ client.c @@ -39,7 +41,9 @@ pkgconfigdir = $(libdir)/pkgconfig BUILT_SOURCES = \ dbusmenu-client.h \ - dbusmenu-server.h + dbusmenu-server.h \ + server-marshal.h \ + server-marshal.c dbusmenu-server.h: dbus-menu.xml dbus-binding-tool \ @@ -55,3 +59,13 @@ dbusmenu-client.h: dbus-menu.xml --output=dbusmenu-client.h \ $(srcdir)/dbus-menu.xml +server-marshal.h: $(srcdir)/server-marshal.list + glib-genmarshal --header \ + --prefix=_dbusmenu_server_marshal $(srcdir)/server-marshal.list \ + > server-marshal.h + +server-marshal.c: $(srcdir)/server-marshal.list + glib-genmarshal --body \ + --prefix=_dbusmenu_server_marshal $(srcdir)/server-marshal.list \ + > server-marshal.c + diff --git a/libdbusmenu-glib/server-marshal.list b/libdbusmenu-glib/server-marshal.list new file mode 100644 index 0000000..950fc9d --- /dev/null +++ b/libdbusmenu-glib/server-marshal.list @@ -0,0 +1 @@ +VOID: UINT, STRING, STRING diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 7115eaa..39e70d2 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -3,6 +3,7 @@ #endif #include "server.h" +#include "server-marshal.h" /* DBus Prototypes */ static gboolean _dbusmenu_server_get_property (void); @@ -12,17 +13,31 @@ static gboolean _dbusmenu_server_list_properties (void); #include "dbusmenu-server.h" +/* Privates, I'll show you mine... */ typedef struct _DbusmenuServerPrivate DbusmenuServerPrivate; struct _DbusmenuServerPrivate { DbusmenuMenuitem * root; + gchar * dbusobject; }; #define DBUSMENU_SERVER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_SERVER, DbusmenuServerPrivate)) -static void dbusmenu_server_class_init (DbusmenuServerClass *klass); +/* Signals */ +enum { + ID_PROP_UPDATE, + ID_UPDATE, + LAYOUT_UPDATE, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/* Properties */ + +static void dbusmenu_server_class_init (DbusmenuServerClass *class); static void dbusmenu_server_init (DbusmenuServer *self); static void dbusmenu_server_dispose (GObject *object); static void dbusmenu_server_finalize (GObject *object); @@ -30,15 +45,37 @@ static void dbusmenu_server_finalize (GObject *object); G_DEFINE_TYPE (DbusmenuServer, dbusmenu_server, G_TYPE_OBJECT); static void -dbusmenu_server_class_init (DbusmenuServerClass *klass) +dbusmenu_server_class_init (DbusmenuServerClass *class) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (class); - g_type_class_add_private (klass, sizeof (DbusmenuServerPrivate)); + g_type_class_add_private (class, sizeof (DbusmenuServerPrivate)); object_class->dispose = dbusmenu_server_dispose; object_class->finalize = dbusmenu_server_finalize; + signals[ID_PROP_UPDATE] = g_signal_new(DBUSMENU_SERVER_SIGNAL_ID_PROP_UPDATE, + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(DbusmenuServerClass, id_prop_update), + NULL, NULL, + _dbusmenu_server_marshal_VOID__UINT_STRING_STRING, + G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING); + signals[ID_UPDATE] = g_signal_new(DBUSMENU_SERVER_SIGNAL_ID_UPDATE, + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(DbusmenuServerClass, id_update), + NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); + signals[LAYOUT_UPDATE] = g_signal_new(DBUSMENU_SERVER_SIGNAL_LAYOUT_UPDATE, + G_TYPE_FROM_CLASS(class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(DbusmenuServerClass, layout_update), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + dbus_g_object_type_install_info(DBUSMENU_TYPE_SERVER, &dbus_glib__dbusmenu_server_object_info); return; diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index a39b3b8..45a47e1 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -15,11 +15,26 @@ G_BEGIN_DECLS #define DBUSMENU_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_SERVER)) #define DBUSMENU_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_SERVER, DbusmenuServerClass)) +#define DBUSMENU_SERVER_SIGNAL_ID_PROP_UPDATE "id-prop-update" +#define DBUSMENU_SERVER_SIGNAL_ID_UPDATE "id-update" +#define DBUSMENU_SERVER_SIGNAL_LAYOUT_UPDATE "layout-update" + typedef struct _DbusmenuServer DbusmenuServer; typedef struct _DbusmenuServerClass DbusmenuServerClass; struct _DbusmenuServerClass { GObjectClass parent_class; + + /* Signals */ + void (*id_prop_update)(guint id, gchar * property, gchar * value); + void (*id_update)(guint id); + void (*layout_update)(void); + + /* Reserved */ + void (*dbusmenu_server_reserved1)(void); + void (*dbusmenu_server_reserved2)(void); + void (*dbusmenu_server_reserved3)(void); + void (*dbusmenu_server_reserved4)(void); }; struct _DbusmenuServer { -- cgit v1.2.3 From 8f11b51313d3ca8a514b563c8a475f869c143f5f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 11:46:16 -0500 Subject: Changing the menuitem type --- libdbusmenu-glib/menuitem.c | 2 +- libdbusmenu-glib/menuitem.h | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 080372a..c57acaa 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -10,7 +10,7 @@ struct _DbusmenuMenuitemPrivate }; #define DBUSMENU_MENUITEM_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemPrivate)) +(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemPrivate)) static void dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass); static void dbusmenu_menuitem_init (DbusmenuMenuitem *self); diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index 3e57a51..e5d2b92 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -6,12 +6,12 @@ G_BEGIN_DECLS -#define DBUSMENU_MENUITEM_TYPE (dbusmenu_menuitem_get_type ()) -#define DBUSMENU_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitem)) -#define DBUSMENU_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemClass)) -#define DBUSMENU_IS_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_MENUITEM_TYPE)) -#define DBUSMENU_IS_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_MENUITEM_TYPE)) -#define DBUSMENU_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_MENUITEM_TYPE, DbusmenuMenuitemClass)) +#define DBUSMENU_TYPE_MENUITEM (dbusmenu_menuitem_get_type ()) +#define DBUSMENU_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitem)) +#define DBUSMENU_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemClass)) +#define DBUSMENU_IS_MENUITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DBUSMENU_TYPE_MENUITEM)) +#define DBUSMENU_IS_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_MENUITEM)) +#define DBUSMENU_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemClass)) typedef struct _DbusmenuMenuitem DbusmenuMenuitem; typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass; -- cgit v1.2.3 From ce53e610ceaefd14e1eb32509499cb984f7d189f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 11:46:35 -0500 Subject: Adding in some server properties --- libdbusmenu-glib/server.c | 17 +++++++++++++++++ libdbusmenu-glib/server.h | 3 +++ 2 files changed, 20 insertions(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 39e70d2..31956c2 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -36,6 +36,11 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; /* Properties */ +enum { + PROP_0, + PROP_DBUS_OBJECT, + PROP_ROOT_NODE +}; static void dbusmenu_server_class_init (DbusmenuServerClass *class); static void dbusmenu_server_init (DbusmenuServer *self); @@ -76,6 +81,18 @@ dbusmenu_server_class_init (DbusmenuServerClass *class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_object_class_install_property (object_class, PROP_DBUS_OBJECT, + g_param_spec_string(DBUSMENU_SERVER_PROP_DBUS_OBJECT, "DBus object path", + "The object that represents this set of menus on DBus", + "/org/freedesktop/dbusmenu", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_ROOT_NODE, + g_param_spec_object(DBUSMENU_SERVER_PROP_ROOT_NODE, "Root menu node", + "The base object of the menus that are served", + DBUSMENU_TYPE_MENUITEM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + dbus_g_object_type_install_info(DBUSMENU_TYPE_SERVER, &dbus_glib__dbusmenu_server_object_info); return; diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index 45a47e1..a9822ea 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -19,6 +19,9 @@ G_BEGIN_DECLS #define DBUSMENU_SERVER_SIGNAL_ID_UPDATE "id-update" #define DBUSMENU_SERVER_SIGNAL_LAYOUT_UPDATE "layout-update" +#define DBUSMENU_SERVER_PROP_DBUS_OBJECT "dbus-object" +#define DBUSMENU_SERVER_PROP_ROOT_NODE "root-node" + typedef struct _DbusmenuServer DbusmenuServer; typedef struct _DbusmenuServerClass DbusmenuServerClass; -- cgit v1.2.3 From 5e4f14e71580c3d1d551b8bd92fc225ede4a0561 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 11:52:15 -0500 Subject: Oops, forgot layout. That's make the dbus folks angry. --- libdbusmenu-glib/server.c | 8 +++++++- libdbusmenu-glib/server.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 31956c2..7e8999d 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -39,7 +39,8 @@ static guint signals[LAST_SIGNAL] = { 0 }; enum { PROP_0, PROP_DBUS_OBJECT, - PROP_ROOT_NODE + PROP_ROOT_NODE, + PROP_LAYOUT }; static void dbusmenu_server_class_init (DbusmenuServerClass *class); @@ -92,6 +93,11 @@ dbusmenu_server_class_init (DbusmenuServerClass *class) "The base object of the menus that are served", DBUSMENU_TYPE_MENUITEM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_LAYOUT, + g_param_spec_string(DBUSMENU_SERVER_PROP_LAYOUT, "XML Layout of the menus", + "A simple XML string that describes the layout of the menus", + "", + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); dbus_g_object_type_install_info(DBUSMENU_TYPE_SERVER, &dbus_glib__dbusmenu_server_object_info); diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index a9822ea..f2324fd 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -21,6 +21,7 @@ G_BEGIN_DECLS #define DBUSMENU_SERVER_PROP_DBUS_OBJECT "dbus-object" #define DBUSMENU_SERVER_PROP_ROOT_NODE "root-node" +#define DBUSMENU_SERVER_PROP_LAYOUT "layout" typedef struct _DbusmenuServer DbusmenuServer; typedef struct _DbusmenuServerClass DbusmenuServerClass; -- cgit v1.2.3 From 4d73ec986ea8f7bcdceac7dcfd2ffefcd0c63e7f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 12:03:44 -0500 Subject: Adding in basic set and get functions for the properties --- libdbusmenu-glib/server.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 7e8999d..ef24c86 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -43,10 +43,13 @@ enum { PROP_LAYOUT }; +/* Prototype */ static void dbusmenu_server_class_init (DbusmenuServerClass *class); static void dbusmenu_server_init (DbusmenuServer *self); static void dbusmenu_server_dispose (GObject *object); static void dbusmenu_server_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); G_DEFINE_TYPE (DbusmenuServer, dbusmenu_server, G_TYPE_OBJECT); @@ -59,6 +62,8 @@ dbusmenu_server_class_init (DbusmenuServerClass *class) object_class->dispose = dbusmenu_server_dispose; object_class->finalize = dbusmenu_server_finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; signals[ID_PROP_UPDATE] = g_signal_new(DBUSMENU_SERVER_SIGNAL_ID_PROP_UPDATE, G_TYPE_FROM_CLASS(class), @@ -128,6 +133,42 @@ dbusmenu_server_finalize (GObject *object) return; } +static void +set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) +{ + switch (id) { + case PROP_DBUS_OBJECT: + break; + case PROP_ROOT_NODE: + break; + case PROP_LAYOUT: + break; + default: + g_return_if_reached(); + break; + } + + return; +} + +static void +get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) +{ + switch (id) { + case PROP_DBUS_OBJECT: + break; + case PROP_ROOT_NODE: + break; + case PROP_LAYOUT: + break; + default: + g_return_if_reached(); + break; + } + + return; +} + /* DBus interface */ static gboolean _dbusmenu_server_get_property (void) -- cgit v1.2.3 From 67dfe0a32531fccc566dba9079673009d6c7f5c1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 12:39:26 -0500 Subject: Okay, now we're getting and setting properties. Fleshing out these functions. --- libdbusmenu-glib/menuitem.h | 2 ++ libdbusmenu-glib/server.c | 51 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index e5d2b92..a820d4b 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -54,6 +54,8 @@ gboolean dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * pr const gchar * dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar * property); gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property); +void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray ** array); + G_END_DECLS #endif diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index ef24c86..70a1482 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -115,6 +115,7 @@ dbusmenu_server_init (DbusmenuServer *self) DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(self); priv->root = NULL; + priv->dbusobject = NULL; return; } @@ -136,13 +137,30 @@ dbusmenu_server_finalize (GObject *object) static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) { + DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(obj); + switch (id) { case PROP_DBUS_OBJECT: + g_return_if_fail(priv->dbusobject == NULL); + priv->dbusobject = g_value_dup_string(value); + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + dbus_g_connection_register_g_object(connection, + priv->dbusobject, + obj); break; case PROP_ROOT_NODE: + if (priv->root != NULL) { + g_object_unref(G_OBJECT(priv->root)); + priv->root = NULL; + } + priv->root = DBUSMENU_MENUITEM(g_value_get_pointer(value)); + if (priv->root != NULL) { + g_object_ref(G_OBJECT(priv->root)); + } break; case PROP_LAYOUT: - break; + /* Can't set this, fall through to error */ + g_warning("Can not set property: layout"); default: g_return_if_reached(); break; @@ -151,16 +169,45 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) return; } +static void +xmlarray_foreach_free (gpointer arrayentry, gpointer userdata) +{ + if (arrayentry != NULL) { + g_free(arrayentry); + } + + return; +} + static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) { + DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(obj); + switch (id) { case PROP_DBUS_OBJECT: + g_value_set_string(value, priv->dbusobject); break; case PROP_ROOT_NODE: + g_value_set_pointer(value, priv->root); break; - case PROP_LAYOUT: + case PROP_LAYOUT: { + GPtrArray * xmlarray = g_ptr_array_new(); + g_ptr_array_add(xmlarray, g_strdup("")); + if (priv->root != NULL) { + dbusmenu_menuitem_buildxml(priv->root, &xmlarray); + } + g_ptr_array_add(xmlarray, g_strdup("")); + g_ptr_array_add(xmlarray, NULL); + + /* build string */ + gchar * finalstring = g_strjoinv("\n", (gchar **)xmlarray->pdata); + g_value_take_string(value, finalstring); + + g_ptr_array_foreach(xmlarray, xmlarray_foreach_free, NULL); + g_ptr_array_free(xmlarray, TRUE); break; + } default: g_return_if_reached(); break; -- cgit v1.2.3 From 50f2ad0a5e649d43acdcdf06c0453f7a5733e953 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 12:53:30 -0500 Subject: Adding in all the public functions as real functions and implementing a couple of children related ones. --- libdbusmenu-glib/menuitem.c | 101 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 7 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index c57acaa..5d22b32 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -3,46 +3,133 @@ #endif #include "menuitem.h" +/* Private */ typedef struct _DbusmenuMenuitemPrivate DbusmenuMenuitemPrivate; - struct _DbusmenuMenuitemPrivate { + GList * children; }; #define DBUSMENU_MENUITEM_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemPrivate)) +/* Prototypes */ static void dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass); static void dbusmenu_menuitem_init (DbusmenuMenuitem *self); static void dbusmenu_menuitem_dispose (GObject *object); static void dbusmenu_menuitem_finalize (GObject *object); +/* GObject stuff */ G_DEFINE_TYPE (DbusmenuMenuitem, dbusmenu_menuitem, G_TYPE_OBJECT); static void dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) { -GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); -g_type_class_add_private (klass, sizeof (DbusmenuMenuitemPrivate)); + g_type_class_add_private (klass, sizeof (DbusmenuMenuitemPrivate)); -object_class->dispose = dbusmenu_menuitem_dispose; -object_class->finalize = dbusmenu_menuitem_finalize; + object_class->dispose = dbusmenu_menuitem_dispose; + object_class->finalize = dbusmenu_menuitem_finalize; } static void dbusmenu_menuitem_init (DbusmenuMenuitem *self) { + return; } static void dbusmenu_menuitem_dispose (GObject *object) { -G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->dispose (object); + + G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->dispose (object); + return; } static void dbusmenu_menuitem_finalize (GObject *object) { -G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->finalize (object); + + G_OBJECT_CLASS (dbusmenu_menuitem_parent_class)->finalize (object); + return; +} + +/* Public interface */ +GList * +dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi) +{ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL); + + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + return priv->children; +} + +guint +dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent) +{ + /* TODO: I'm not too happy returning zeros here. But that's all I've got */ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), 0); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(parent), 0); + + GList * childs = dbusmenu_menuitem_get_children(parent); + guint count = 0; + for ( ; childs != NULL; childs = childs->next) { + if (childs->data == mi) break; + } + + if (childs == NULL) return 0; + + return count; +} + +gboolean +dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) +{ + + return FALSE; } + +gboolean +dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) +{ + + return FALSE; +} + +gboolean +dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position) +{ + + + return FALSE; +} + +gboolean +dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * property, const gchar * value) +{ + + return FALSE; +} + +const gchar * +dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar * property) +{ + + return NULL; +} + +gboolean +dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property) +{ + + return FALSE; +} + +void +dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray ** array) +{ + + return; +} + -- cgit v1.2.3 From c3d826854d0dd3b27b5591d03e70d2c1d903bb37 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 12:57:03 -0500 Subject: Putting in IDs --- libdbusmenu-glib/menuitem.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 5d22b32..f6cd99e 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -7,6 +7,7 @@ typedef struct _DbusmenuMenuitemPrivate DbusmenuMenuitemPrivate; struct _DbusmenuMenuitemPrivate { + guint id; GList * children; }; @@ -33,9 +34,16 @@ dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) object_class->finalize = dbusmenu_menuitem_finalize; } +static guint menuitem_next_id = 1; + static void dbusmenu_menuitem_init (DbusmenuMenuitem *self) { + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(self); + + priv->id = menuitem_next_id++; + priv->children = NULL; + return; } -- cgit v1.2.3 From 00eafa4bed235caacd87bc119433577c0e1fa7a9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 13:07:25 -0500 Subject: Okay, let's build some XML --- libdbusmenu-glib/menuitem.c | 14 +++++++++++++- libdbusmenu-glib/menuitem.h | 4 ++-- libdbusmenu-glib/server.c | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index f6cd99e..3aa39c6 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -135,8 +135,20 @@ dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property) } void -dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray ** array) +dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array) { + g_return_if_fail(DBUSMENU_IS_MENUITEM(mi)); + + GList * children = dbusmenu_menuitem_get_children(mi); + if (children == NULL) { + g_ptr_array_add(array, g_strdup_printf("", dbusmenu_menuitem_get_id(mi))); + } else { + g_ptr_array_add(array, g_strdup_printf("", dbusmenu_menuitem_get_id(mi))); + for ( ; children != NULL; children = children->next) { + dbus_menuitem_buildxml(DBUSMENU_MENUITEM(children->data), array); + } + g_ptr_array_add(array, g_strdup("")); + } return; } diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index a820d4b..15a07a5 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -28,7 +28,7 @@ struct _DbusmenuMenuitemClass void (*item_activated) (void); /* Virtual functions */ - void (*buildxml) (GPtrArray ** stringarray); + void (*buildxml) (GPtrArray * stringarray); void (*reserved1) (void); void (*reserved2) (void); @@ -54,7 +54,7 @@ gboolean dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * pr const gchar * dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar * property); gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property); -void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray ** array); +void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array); G_END_DECLS diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 70a1482..d8c87bf 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -195,7 +195,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) GPtrArray * xmlarray = g_ptr_array_new(); g_ptr_array_add(xmlarray, g_strdup("")); if (priv->root != NULL) { - dbusmenu_menuitem_buildxml(priv->root, &xmlarray); + dbusmenu_menuitem_buildxml(priv->root, xmlarray); } g_ptr_array_add(xmlarray, g_strdup("")); g_ptr_array_add(xmlarray, NULL); -- cgit v1.2.3 From 4cf3e30cfa9bace377649683d7c4e76c634b02e8 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 15:39:11 -0500 Subject: No warnings, put them in now I had to fix them --- libdbusmenu-glib/Makefile.am | 2 +- libdbusmenu-glib/menuitem.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/Makefile.am b/libdbusmenu-glib/Makefile.am index 2bc23ec..b273555 100644 --- a/libdbusmenu-glib/Makefile.am +++ b/libdbusmenu-glib/Makefile.am @@ -31,7 +31,7 @@ libdbusmenu_glib_la_LDFLAGS = \ -export-symbols-regex "^[^_].*" libdbusmenu_glib_la_CFLAGS = \ - $(DBUSMENUGLIB_CFLAGS) + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror libdbusmenu_glib_la_LIBADD = \ $(DBUSMENUGLIB_LIBS) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 3aa39c6..4187adc 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -32,6 +32,8 @@ dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) object_class->dispose = dbusmenu_menuitem_dispose; object_class->finalize = dbusmenu_menuitem_finalize; + + return; } static guint menuitem_next_id = 1; @@ -64,6 +66,13 @@ dbusmenu_menuitem_finalize (GObject *object) } /* Public interface */ +guint +dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) +{ + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + return priv->id; +} + GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi) { @@ -145,7 +154,7 @@ dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array) } else { g_ptr_array_add(array, g_strdup_printf("", dbusmenu_menuitem_get_id(mi))); for ( ; children != NULL; children = children->next) { - dbus_menuitem_buildxml(DBUSMENU_MENUITEM(children->data), array); + dbusmenu_menuitem_buildxml(DBUSMENU_MENUITEM(children->data), array); } g_ptr_array_add(array, g_strdup("")); } -- cgit v1.2.3 From 8fa3697487b63874cc60446c6674f77b62ee7414 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 16:03:57 -0500 Subject: Adding in tests dictory, a test, and making it compile --- .bzrignore | 3 +++ Makefile.am | 2 +- configure.ac | 1 + libdbusmenu-glib/menuitem.c | 6 ++++++ libdbusmenu-glib/menuitem.h | 3 +++ tests/Makefile.am | 24 ++++++++++++++++++++++++ tests/glib-server-nomenu.c | 18 ++++++++++++++++++ 7 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/Makefile.am create mode 100644 tests/glib-server-nomenu.c diff --git a/.bzrignore b/.bzrignore index 97954e9..7728c51 100644 --- a/.bzrignore +++ b/.bzrignore @@ -23,3 +23,6 @@ libdbusmenu_glib_la-server.lo server-marshal.c server-marshal.h libdbusmenu_glib_la-server-marshal.lo +.deps +.libs +glib-server-nomenu diff --git a/Makefile.am b/Makefile.am index 2527ed6..6f3f6f1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,3 +1,3 @@ -SUBDIRS = libdbusmenu-glib libdbusmenu-gtk libdbusmenu-qt +SUBDIRS = libdbusmenu-glib libdbusmenu-gtk libdbusmenu-qt tests diff --git a/configure.ac b/configure.ac index 47f750a..96b23fc 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,7 @@ libdbusmenu-gtk/Makefile libdbusmenu-gtk/dbusmenu-gtk.pc libdbusmenu-qt/Makefile libdbusmenu-qt/dbusmenu-qt.pc +tests/Makefile ]) ########################### diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 4187adc..b2f64f6 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -66,6 +66,12 @@ dbusmenu_menuitem_finalize (GObject *object) } /* Public interface */ +DbusmenuMenuitem * +dbusmenu_menuitem_new (void) +{ + return g_object_new(DBUSMENU_TYPE_MENUITEM, NULL); +} + guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) { diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index 15a07a5..daeee50 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -43,6 +43,9 @@ struct _DbusmenuMenuitem GType dbusmenu_menuitem_get_type (void); +DbusmenuMenuitem * dbusmenu_menuitem_new (void); +guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi); + GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi); guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent); diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..3c58cf0 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,24 @@ + +libexec_PROGRAMS = \ + glib-server-nomenu + +glib_server_nomenu_SOURCES = \ + glib-server-nomenu.c + +glib_server_nomenu_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +glib_server_nomenu_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) + + + + +examplesdir = $(docdir)/examples/ + +examples_DATA = \ + $(glib_server_nomenu_SOURCES) + +EXTRA_DIST = $(examples_DATA) diff --git a/tests/glib-server-nomenu.c b/tests/glib-server-nomenu.c new file mode 100644 index 0000000..36aac3e --- /dev/null +++ b/tests/glib-server-nomenu.c @@ -0,0 +1,18 @@ +#include + +#include +#include + +int +main (int argc, char ** argv) +{ + g_type_init(); + + DbusmenuServer * server = dbusmenu_server_new("/org/test"); + DbusmenuMenuitem * menuitem = dbusmenu_menuitem_new(); + dbusmenu_server_set_root(server, menuitem); + + g_main_loop_run(g_main_loop_new(NULL, FALSE)); + + return 0; +} -- cgit v1.2.3 From 907a7e88717a2f511fac3f0781ddf2aa0a767129 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 16:45:13 -0500 Subject: Fixing the properties --- libdbusmenu-glib/server.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index d8c87bf..cd2ab5c 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -153,7 +153,7 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) g_object_unref(G_OBJECT(priv->root)); priv->root = NULL; } - priv->root = DBUSMENU_MENUITEM(g_value_get_pointer(value)); + priv->root = DBUSMENU_MENUITEM(g_value_get_object(value)); if (priv->root != NULL) { g_object_ref(G_OBJECT(priv->root)); } @@ -189,7 +189,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) g_value_set_string(value, priv->dbusobject); break; case PROP_ROOT_NODE: - g_value_set_pointer(value, priv->root); + g_value_set_object(value, priv->root); break; case PROP_LAYOUT: { GPtrArray * xmlarray = g_ptr_array_new(); @@ -254,7 +254,7 @@ dbusmenu_server_new (const gchar * object) } DbusmenuServer * self = g_object_new(DBUSMENU_TYPE_SERVER, - "dbus-object-name", object, + DBUSMENU_SERVER_PROP_DBUS_OBJECT, object, NULL); return self; @@ -264,9 +264,9 @@ void dbusmenu_server_set_root (DbusmenuServer * self, DbusmenuMenuitem * root) { GValue rootvalue = {0}; - g_value_init(&rootvalue, G_TYPE_POINTER); - g_value_set_pointer(&rootvalue, root); - g_object_set_property(G_OBJECT(self), "root-node", &rootvalue); + g_value_init(&rootvalue, G_TYPE_OBJECT); + g_value_set_object(&rootvalue, root); + g_object_set_property(G_OBJECT(self), DBUSMENU_SERVER_PROP_ROOT_NODE, &rootvalue); return; } -- cgit v1.2.3 From 29e7e02e7f006cde4a5f142fe656ac6936fd6976 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 16 Apr 2009 17:19:51 -0500 Subject: A couple of debug strings and then making it so that if there is a root menu, it's at the root of the XML data instead of having a root wrapped around it. --- libdbusmenu-glib/server.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index cd2ab5c..13eb240 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -173,6 +173,7 @@ static void xmlarray_foreach_free (gpointer arrayentry, gpointer userdata) { if (arrayentry != NULL) { + /* g_debug("Freeing pointer: %s", (gchar *)arrayentry); */ g_free(arrayentry); } @@ -193,16 +194,17 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) break; case PROP_LAYOUT: { GPtrArray * xmlarray = g_ptr_array_new(); - g_ptr_array_add(xmlarray, g_strdup("")); - if (priv->root != NULL) { + if (priv->root == NULL) { + g_ptr_array_add(xmlarray, g_strdup("")); + } else { dbusmenu_menuitem_buildxml(priv->root, xmlarray); } - g_ptr_array_add(xmlarray, g_strdup("")); g_ptr_array_add(xmlarray, NULL); /* build string */ - gchar * finalstring = g_strjoinv("\n", (gchar **)xmlarray->pdata); + gchar * finalstring = g_strjoinv("", (gchar **)xmlarray->pdata); g_value_take_string(value, finalstring); + /* g_debug("Final string: %s", finalstring); */ g_ptr_array_foreach(xmlarray, xmlarray_foreach_free, NULL); g_ptr_array_free(xmlarray, TRUE); -- cgit v1.2.3 From 70ed48c403fd63620320aa8c3924568a4a7c0289 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Apr 2009 17:14:07 -0500 Subject: Starting to flesh out the client a little bit --- libdbusmenu-glib/client.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index fc60101..65871fc 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -9,6 +9,11 @@ typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; struct _DbusmenuClientPrivate { + DbusmenuMenuitem * root; + + DBusGProxy * menuproxy; + DBusGProxy * propproxy; + DBusGProxyCall * layoutcall; }; #define DBUSMENU_CLIENT_GET_PRIVATE(o) \ @@ -37,6 +42,14 @@ dbusmenu_client_class_init (DbusmenuClientClass *klass) static void dbusmenu_client_init (DbusmenuClient *self) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(self); + + priv->root = NULL; + priv->menuproxy = NULL; + priv->propproxy = NULL; + priv->layoutcall = NULL; + + return; } static void @@ -52,3 +65,53 @@ dbusmenu_client_finalize (GObject *object) G_OBJECT_CLASS (dbusmenu_client_parent_class)->finalize (object); return; } + +/* Internal funcs */ + +/* When we have a name and an object, build the two proxies and get the + first version of the layout */ +static void +build_proxies (DbusmenuClient * client) +{ + + +} + +/* When the layout property returns, here's where we take care of that. */ +static void +update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) +{ + + +} + +/* Call the property on the server we're connected to and set it up to + be async back to _update_layout_cb */ +static void +update_layout (DbusmenuClient * client) +{ + + +} + +/* Public API */ +DbusmenuClient * +dbusmenu_client_new (const gchar * name, const gchar * object) +{ + DbusmenuClient * self = g_object_new(DBUSMENU_TYPE_CLIENT, "name", name, "object", object, NULL); + + return self; +} + +DbusmenuMenuitem * +dbusmenu_client_get_root (DbusmenuClient * client) +{ + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + + if (priv->layoutcall != NULL) { + /* Oh, we're in the middle of getting it */ + /* TODO: Wait here */ + } + + return priv->root; +} -- cgit v1.2.3 From 60f782f81da8eafc9fed93046a51ba8371a58595 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 15:16:37 -0500 Subject: Adding in properties. --- libdbusmenu-glib/client.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 65871fc..dab07a6 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -5,11 +5,21 @@ #include "client.h" #include "dbusmenu-client.h" +/* Properties */ +enum { + PROP_0, + PROP_DBUSOBJECT, + PROP_DBUSNAME +}; + typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; struct _DbusmenuClientPrivate { DbusmenuMenuitem * root; + + gchar * dbus_object; + gchar * dbus_name; DBusGProxy * menuproxy; DBusGProxy * propproxy; @@ -23,6 +33,8 @@ static void dbusmenu_client_class_init (DbusmenuClientClass *klass); static void dbusmenu_client_init (DbusmenuClient *self); static void dbusmenu_client_dispose (GObject *object); static void dbusmenu_client_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); G_DEFINE_TYPE (DbusmenuClient, dbusmenu_client, G_TYPE_OBJECT); @@ -35,6 +47,19 @@ dbusmenu_client_class_init (DbusmenuClientClass *klass) object_class->dispose = dbusmenu_client_dispose; object_class->finalize = dbusmenu_client_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("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("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; } @@ -45,6 +70,10 @@ dbusmenu_client_init (DbusmenuClient *self) DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(self); priv->root = NULL; + + priv->dbus_object = NULL; + priv->dbus_name = NULL; + priv->menuproxy = NULL; priv->propproxy = NULL; priv->layoutcall = NULL; @@ -66,6 +95,20 @@ dbusmenu_client_finalize (GObject *object) return; } +static void +set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) +{ + + return; +} + +static void +get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) +{ + + return; +} + /* Internal funcs */ /* When we have a name and an object, build the two proxies and get the -- cgit v1.2.3 From 65273b8464d57c4792c144b080174ba0e48a41e1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 15:28:29 -0500 Subject: Addign in the get and set properties. --- libdbusmenu-glib/client.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index dab07a6..a88d8e8 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -29,13 +29,17 @@ struct _DbusmenuClientPrivate #define DBUSMENU_CLIENT_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_CLIENT, DbusmenuClientPrivate)) +/* GObject Stuff */ static void dbusmenu_client_class_init (DbusmenuClientClass *klass); static void dbusmenu_client_init (DbusmenuClient *self); static void dbusmenu_client_dispose (GObject *object); static void dbusmenu_client_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); +/* Private Funcs */ +static void build_proxies (DbusmenuClient * client); +/* Build a type */ G_DEFINE_TYPE (DbusmenuClient, dbusmenu_client, G_TYPE_OBJECT); static void @@ -98,6 +102,25 @@ dbusmenu_client_finalize (GObject *object) static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_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_proxies(DBUSMENU_CLIENT(obj)); + } + break; + case PROP_DBUSOBJECT: + priv->dbus_object = g_value_dup_string(value); + if (priv->dbus_name != NULL && priv->dbus_object != NULL) { + build_proxies(DBUSMENU_CLIENT(obj)); + } + break; + default: + g_warning("Unknown property %d.", id); + return; + } return; } @@ -105,6 +128,19 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_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; } @@ -133,7 +169,7 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) static void update_layout (DbusmenuClient * client) { - + update_layout_cb(NULL, NULL, NULL); } @@ -142,6 +178,7 @@ DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object) { DbusmenuClient * self = g_object_new(DBUSMENU_TYPE_CLIENT, "name", name, "object", object, NULL); + update_layout(self); return self; } -- cgit v1.2.3 From ba49215a4853010d670d20b1db4c29669cd220b4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 15:55:54 -0500 Subject: Creating a lifecycle for our dbus proxies. We created them, so we must destroy them as well. --- libdbusmenu-glib/client.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index a88d8e8..cfa87a2 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -21,6 +21,7 @@ struct _DbusmenuClientPrivate gchar * dbus_object; gchar * dbus_name; + DBusGConnection * session_bus; DBusGProxy * menuproxy; DBusGProxy * propproxy; DBusGProxyCall * layoutcall; @@ -78,6 +79,7 @@ dbusmenu_client_init (DbusmenuClient *self) priv->dbus_object = NULL; priv->dbus_name = NULL; + priv->session_bus = NULL; priv->menuproxy = NULL; priv->propproxy = NULL; priv->layoutcall = NULL; @@ -88,6 +90,22 @@ dbusmenu_client_init (DbusmenuClient *self) static void dbusmenu_client_dispose (GObject *object) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(object); + + if (priv->layoutcall != NULL) { + dbus_g_proxy_cancel_call(priv->propproxy, priv->layoutcall); + priv->layoutcall = NULL; + } + if (priv->menuproxy != NULL) { + g_object_unref(G_OBJECT(priv->menuproxy)); + priv->menuproxy = NULL; + } + if (priv->propproxy != NULL) { + g_object_unref(G_OBJECT(priv->propproxy)); + priv->propproxy = NULL; + } + priv->session_bus = NULL; + G_OBJECT_CLASS (dbusmenu_client_parent_class)->dispose (object); return; } @@ -152,8 +170,42 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static void build_proxies (DbusmenuClient * client) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + GError * error = NULL; + + g_return_if_fail(priv->dbus_object != NULL); + g_return_if_fail(priv->dbus_name != NULL); + + priv->session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + if (error != NULL) { + g_error("Unable to get session bus: %s", error->message); + g_error_free(error); + return; + } + priv->propproxy = dbus_g_proxy_new_for_name_owner(priv->session_bus, + priv->dbus_name, + priv->dbus_object, + DBUS_INTERFACE_PROPERTIES, + &error); + if (error != NULL) { + g_error("Unable to get property proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message); + g_error_free(error); + return; + } + + priv->menuproxy = dbus_g_proxy_new_for_name_owner(priv->session_bus, + priv->dbus_name, + priv->dbus_object, + "org.freedesktop.dbusmenu", + &error); + if (error != NULL) { + g_error("Unable to get dbusmenu proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message); + g_error_free(error); + return; + } + return; } /* When the layout property returns, here's where we take care of that. */ @@ -169,8 +221,18 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) static void update_layout (DbusmenuClient * client) { - update_layout_cb(NULL, NULL, NULL); + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + dbus_g_proxy_begin_call (priv->propproxy, + "Get", + update_layout_cb, + client, + NULL, + G_TYPE_STRING, "org.freedesktop.dbusmenu", + G_TYPE_STRING, "layout", + G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); + + return; } /* Public API */ -- cgit v1.2.3 From 6cb2ab7e906e2225091d9a45d5cbd9040fbbb908 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 16:18:57 -0500 Subject: Handling all the DBus-isms of getting the property, now passing up the stack to a parse function which will actually take care of the data. --- libdbusmenu-glib/client.c | 54 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index cfa87a2..320165a 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -113,6 +113,11 @@ dbusmenu_client_dispose (GObject *object) static void dbusmenu_client_finalize (GObject *object) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(object); + + g_free(priv->dbus_name); + g_free(priv->dbus_object); + G_OBJECT_CLASS (dbusmenu_client_parent_class)->finalize (object); return; } @@ -208,12 +213,37 @@ build_proxies (DbusmenuClient * client) return; } +/* Take the layout passed to us over DBus and turn it into + a set of beautiful objects */ +static void +parse_layout (DbusmenuClient * client, const gchar * layout) +{ + + + return; +} + /* When the layout property returns, here's where we take care of that. */ static void update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) { + DbusmenuClient * client = DBUSMENU_CLIENT(data); + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + GError * error = NULL; + GValue value = {0}; + + g_value_init(&value, G_TYPE_STRING); + + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { + g_warning("Getting layout failed on client %s object %s: %s", priv->dbus_name, priv->dbus_object, error->message); + g_error_free(error); + return; + } + const gchar * xml = g_value_get_string(&value); + parse_layout(client, xml); + return; } /* Call the property on the server we're connected to and set it up to @@ -223,14 +253,18 @@ update_layout (DbusmenuClient * client) { DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); - dbus_g_proxy_begin_call (priv->propproxy, - "Get", - update_layout_cb, - client, - NULL, - G_TYPE_STRING, "org.freedesktop.dbusmenu", - G_TYPE_STRING, "layout", - G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); + if (priv->layoutcall != NULL) { + return; + } + + priv->layoutcall = dbus_g_proxy_begin_call (priv->propproxy, + "Get", + update_layout_cb, + client, + NULL, + G_TYPE_STRING, "org.freedesktop.dbusmenu", + G_TYPE_STRING, "layout", + G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); return; } @@ -251,8 +285,8 @@ dbusmenu_client_get_root (DbusmenuClient * client) DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); if (priv->layoutcall != NULL) { - /* Oh, we're in the middle of getting it */ - /* TODO: Wait here */ + /* Will end the current call and block on it's completion */ + update_layout_cb(priv->propproxy, priv->layoutcall, client); } return priv->root; -- cgit v1.2.3 From a641c011fd1a697b08b26284a4ed5ec02e0bd13d Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 16:36:43 -0500 Subject: Getting up to the XML level. Whoo, up the protocol stack we go. --- libdbusmenu-glib/client.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 320165a..f0eb408 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -2,6 +2,9 @@ #include "config.h" #endif +#include +#include + #include "client.h" #include "dbusmenu-client.h" @@ -213,13 +216,33 @@ build_proxies (DbusmenuClient * client) return; } +/* Parse recursively through the XML and make it into + objects as need be */ +static gboolean +parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent) +{ + + return FALSE; +} + /* Take the layout passed to us over DBus and turn it into a set of beautiful objects */ static void parse_layout (DbusmenuClient * client, const gchar * layout) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + + xmlDocPtr xmldoc; + xmldoc = xmlReadMemory(layout, g_utf8_strlen(layout, 16*1024), "dbusmenu.xml", NULL, 0); + xmlNodePtr root = xmlDocGetRootElement(xmldoc); + + if (!parse_layout_xml(root, priv->root, NULL)) { + g_warning("Unable to parse layout on client %s object %s", priv->dbus_name, priv->dbus_object); + } + + xmlFreeDoc(xmldoc); return; } @@ -243,6 +266,9 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) const gchar * xml = g_value_get_string(&value); parse_layout(client, xml); + + priv->layoutcall = NULL; + return; } -- cgit v1.2.3 From 16e308694476a616ecea6a9e44b0713906832785 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 27 Apr 2009 17:13:34 -0500 Subject: Okay, it think we're syncing the two XML hierarchies. Whew. --- libdbusmenu-glib/client.c | 52 ++++++++++++++++++++++++++++++++++++++++++--- libdbusmenu-glib/menuitem.h | 2 ++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index f0eb408..d49b8db 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -216,13 +216,58 @@ build_proxies (DbusmenuClient * client) return; } +/* Get the ID attribute of the node, parse it and + return it. Also we're checking to ensure the node + is a 'menu' here. */ +static guint +parse_node_get_id (xmlNodePtr node) +{ + if (g_strcmp0((gchar *)node->name, "menu") != 0) { + /* This kills some nodes early */ + return 0; + } + + xmlAttrPtr attrib; + for (attrib = node->properties; node != NULL; node = node->next) { + if (g_strcmp0((gchar *)node->name, "id") == 0) { + if (node->children != NULL) { + return (guint)g_ascii_strtoull((gchar *)attrib->children->content, NULL, 10); + } + break; + } + } + + return 0; +} + /* Parse recursively through the XML and make it into objects as need be */ -static gboolean +static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent) { + guint id = parse_node_get_id(node); + if (item == NULL || dbusmenu_menuitem_get_id(item) != id) { + if (item != NULL) { + if (parent != NULL) { + dbusmenu_menuitem_child_delete(parent, item); + } + g_object_unref(G_OBJECT(item)); + } + + /* Build a new item */ + item = dbusmenu_menuitem_new_with_id(id); + } + + xmlNodePtr children; + guint position; + for (children = node->children, position = 0; children != NULL; children = children->next, position++) { + guint childid = parse_node_get_id(children); + DbusmenuMenuitem * childmi = dbusmenu_menuitem_child_find(item, childid); + childmi = parse_layout_xml(children, childmi, item); + dbusmenu_menuitem_child_add_position(item, childmi, position); + } - return FALSE; + return item; } /* Take the layout passed to us over DBus and turn it into @@ -238,7 +283,8 @@ parse_layout (DbusmenuClient * client, const gchar * layout) xmlNodePtr root = xmlDocGetRootElement(xmldoc); - if (!parse_layout_xml(root, priv->root, NULL)) { + priv->root = parse_layout_xml(root, priv->root, NULL); + if (priv->root == NULL) { g_warning("Unable to parse layout on client %s object %s", priv->dbus_name, priv->dbus_object); } diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index daeee50..c4057dd 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -44,6 +44,7 @@ struct _DbusmenuMenuitem GType dbusmenu_menuitem_get_type (void); DbusmenuMenuitem * dbusmenu_menuitem_new (void); +DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (guint id); guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi); GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi); @@ -52,6 +53,7 @@ guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); gboolean dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); gboolean dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position); +DbusmenuMenuitem * dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id); gboolean dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * property, const gchar * value); const gchar * dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar * property); -- cgit v1.2.3 From 74daa57d491aff78857a554ddb8c190c70a5e269 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 08:51:49 -0500 Subject: Putting in placeholders for the functions that got prototyped last revision --- libdbusmenu-glib/menuitem.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index b2f64f6..6fdc7d2 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -72,6 +72,13 @@ dbusmenu_menuitem_new (void) return g_object_new(DBUSMENU_TYPE_MENUITEM, NULL); } +DbusmenuMenuitem * +dbusmenu_menuitem_new_with_id (guint id) +{ + + return NULL; +} + guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) { @@ -128,6 +135,13 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * return FALSE; } +DbusmenuMenuitem * +dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id) +{ + + return NULL; +} + gboolean dbusmenu_menuitem_property_set (DbusmenuMenuitem * mi, const gchar * property, const gchar * value) { -- cgit v1.2.3 From fee7a8e7b7e8a9c1d6d549de1137a85c4a7421db Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 15:34:47 -0500 Subject: Starting to build a layout test. We're compiling again. --- .bzrignore | 1 + tests/Makefile.am | 14 +++++++++- tests/test-glib-layout-client.c | 0 tests/test-glib-layout-server.c | 61 +++++++++++++++++++++++++++++++++++++++++ tests/test-glib-layout.h | 58 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 tests/test-glib-layout-client.c create mode 100644 tests/test-glib-layout-server.c create mode 100644 tests/test-glib-layout.h diff --git a/.bzrignore b/.bzrignore index 7728c51..13bd161 100644 --- a/.bzrignore +++ b/.bzrignore @@ -26,3 +26,4 @@ libdbusmenu_glib_la-server-marshal.lo .deps .libs glib-server-nomenu +test-glib-layout-server diff --git a/tests/Makefile.am b/tests/Makefile.am index 3c58cf0..f00a7e7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,6 +1,7 @@ libexec_PROGRAMS = \ - glib-server-nomenu + glib-server-nomenu \ + test-glib-layout-server glib_server_nomenu_SOURCES = \ glib-server-nomenu.c @@ -13,6 +14,17 @@ glib_server_nomenu_LDADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ $(DBUSMENUGLIB_LIBS) +test_glib_layout_server_SOURCES = \ + test-glib-layout-server.c + +test_glib_layout_server_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +test_glib_layout_server_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) + diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c new file mode 100644 index 0000000..e69de29 diff --git a/tests/test-glib-layout-server.c b/tests/test-glib-layout-server.c new file mode 100644 index 0000000..6ec9b0c --- /dev/null +++ b/tests/test-glib-layout-server.c @@ -0,0 +1,61 @@ + +#include + +#include +#include + +#include "test-glib-layout.h" + + +static DbusmenuMenuitem * +layout2menuitem (layout_t * layout) +{ + if (layout == NULL || layout->id == 0) return NULL; + + DbusmenuMenuitem * local = dbusmenu_menuitem_new_with_id(layout->id); + + if (layout->submenu != NULL) { + guint count; + for (count = 0; layout->submenu[count].id != 0; count++) { + DbusmenuMenuitem * child = layout2menuitem(&layout->submenu[count]); + if (child != NULL) { + dbusmenu_menuitem_child_append(local, child); + } + } + } + + return local; +} + +static guint layouton = 0; +static DbusmenuServer * server = NULL; +static GMainLoop * mainloop = NULL; + +static gboolean +timer_func (gpointer data) +{ + if (layouts[layouton].id == 0) { + g_main_loop_quit(mainloop); + return FALSE; + } + + dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton++])); + + return TRUE; +} + +int +main (int argc, char ** argv) +{ + g_type_init(); + + server = dbusmenu_server_new("/org/test"); + + timer_func(NULL); + g_timeout_add(100, timer_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + return 0; +} diff --git a/tests/test-glib-layout.h b/tests/test-glib-layout.h new file mode 100644 index 0000000..d315e90 --- /dev/null +++ b/tests/test-glib-layout.h @@ -0,0 +1,58 @@ + +typedef struct _layout_t layout_t; +struct _layout_t { + guint id; + layout_t * submenu; +}; + +layout_t submenu_2[] = { + {id: 2, submenu: NULL}, + {id: 3, submenu: NULL}, + {id: 0, submenu: NULL} +}; +layout_t submenu_3_1[] = { + {id: 3, submenu: NULL}, + {id: 4, submenu: NULL}, + {id: 5, submenu: NULL}, + {id: 0, submenu: NULL} +}; +layout_t submenu_3_2[] = { + {id: 7, submenu: NULL}, + {id: 8, submenu: NULL}, + {id: 9, submenu: NULL}, + {id: 0, submenu: NULL} +}; +layout_t submenu_3[] = { + {id: 2, submenu: submenu_3_1}, + {id: 6, submenu: submenu_3_2}, + {id: 0, submenu: NULL} +}; +layout_t submenu_4_1[] = { + {id: 6, submenu: NULL}, + {id: 0, submenu: NULL} +}; +layout_t submenu_4_2[] = { + {id: 5, submenu: submenu_4_1}, + {id: 0, submenu: NULL} +}; +layout_t submenu_4_3[] = { + {id: 4, submenu: submenu_4_2}, + {id: 0, submenu: NULL} +}; +layout_t submenu_4_4[] = { + {id: 3, submenu: submenu_4_3}, + {id: 0, submenu: NULL} +}; +layout_t submenu_4_5[] = { + {id: 2, submenu: submenu_4_4}, + {id: 0, submenu: NULL} +}; + +layout_t layouts[] = { + {id: 5, submenu: NULL}, + {id: 1, submenu: submenu_2}, + {id: 1, submenu: submenu_3}, + {id: 1, submenu: submenu_4_5}, + {id: 0, submenu: NULL} +}; + -- cgit v1.2.3 From f7c32c45fc4c9dff6822b10698c7b4d740c92ca0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 15:39:58 -0500 Subject: Messages and slowing down a touch --- tests/test-glib-layout-server.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test-glib-layout-server.c b/tests/test-glib-layout-server.c index 6ec9b0c..d6f9f3d 100644 --- a/tests/test-glib-layout-server.c +++ b/tests/test-glib-layout-server.c @@ -38,8 +38,10 @@ timer_func (gpointer data) g_main_loop_quit(mainloop); return FALSE; } + g_debug("Updating to Layout %d", layouton); - dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton++])); + dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton])); + layouton++; return TRUE; } @@ -52,10 +54,12 @@ main (int argc, char ** argv) server = dbusmenu_server_new("/org/test"); timer_func(NULL); - g_timeout_add(100, timer_func, NULL); + g_timeout_add(250, timer_func, NULL); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); + g_debug("Quiting"); + return 0; } -- cgit v1.2.3 From a10757b066e0291cde11136c2b33b5b6ebcccad5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 15:52:40 -0500 Subject: Adding a little flesh to the client --- .bzrignore | 1 + tests/Makefile.am | 12 ++++++++++++ tests/test-glib-layout-client.c | 42 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/.bzrignore b/.bzrignore index 13bd161..36595be 100644 --- a/.bzrignore +++ b/.bzrignore @@ -27,3 +27,4 @@ libdbusmenu_glib_la-server-marshal.lo .libs glib-server-nomenu test-glib-layout-server +test-glib-layout-client diff --git a/tests/Makefile.am b/tests/Makefile.am index f00a7e7..a80f1d1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,6 +1,7 @@ libexec_PROGRAMS = \ glib-server-nomenu \ + test-glib-layout-client \ test-glib-layout-server glib_server_nomenu_SOURCES = \ @@ -25,6 +26,17 @@ test_glib_layout_server_LDADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ $(DBUSMENUGLIB_LIBS) +test_glib_layout_client_SOURCES = \ + test-glib-layout-client.c + +test_glib_layout_client_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +test_glib_layout_client_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) + diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index e69de29..814f019 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -0,0 +1,42 @@ +#include + +#include +#include + +#include "test-glib-layout.h" + +static guint layouton = 0; +static GMainLoop * mainloop = NULL; +static gboolean passed = TRUE; + +static gboolean +timer_func (gpointer data) +{ + g_debug("Death timer. Oops. Got to: %d", layouton); + passed = FALSE; + g_main_loop_quit(mainloop); + return FALSE; +} + +int +main (int argc, char ** argv) +{ + g_type_init(); + + DbusmenuClient * client = dbusmenu_client_new(":1", "/org/test"); + dbusmenu_client_get_root(client); + + timer_func(NULL); + g_timeout_add_seconds(2, timer_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + if (passed) { + g_debug("Quiting"); + return 0; + } else { + g_debug("Quiting as we're a failure"); + return 0; + } +} -- cgit v1.2.3 From 640720591a52701b852564fba3e0df3bd3c56e40 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 15:53:57 -0500 Subject: Oops can't call the kill function first --- tests/test-glib-layout-client.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 814f019..b2687e3 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -26,7 +26,6 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new(":1", "/org/test"); dbusmenu_client_get_root(client); - timer_func(NULL); g_timeout_add_seconds(2, timer_func, NULL); mainloop = g_main_loop_new(NULL, FALSE); -- cgit v1.2.3 From bc2a1a314b64960eda857284bc0149193433a0a1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 16:01:16 -0500 Subject: Fix property names. --- libdbusmenu-glib/client.c | 9 ++++++--- libdbusmenu-glib/client.h | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index d49b8db..f00c185 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -59,12 +59,12 @@ dbusmenu_client_class_init (DbusmenuClientClass *klass) object_class->get_property = get_property; g_object_class_install_property (object_class, PROP_DBUSOBJECT, - g_param_spec_string("dbus-object", "DBus Object we represent", + 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("dbus-name", "DBus Client we connect to", + 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)); @@ -345,7 +345,10 @@ update_layout (DbusmenuClient * client) DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object) { - DbusmenuClient * self = g_object_new(DBUSMENU_TYPE_CLIENT, "name", name, "object", object, NULL); + DbusmenuClient * self = g_object_new(DBUSMENU_TYPE_CLIENT, + DBUSMENU_CLIENT_PROP_DBUS_NAME, name, + DBUSMENU_CLIENT_PROP_DBUS_OBJECT, object, + NULL); update_layout(self); return self; diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index d54b9d7..bc4559a 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -15,6 +15,9 @@ G_BEGIN_DECLS #define DBUSMENU_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_CLIENT)) #define DBUSMENU_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_CLIENT, DbusmenuClientClass)) +#define DBUSMENU_CLIENT_PROP_DBUS_NAME "dbus-name" +#define DBUSMENU_CLIENT_PROP_DBUS_OBJECT "dbus-object" + typedef struct _DbusmenuClient DbusmenuClient; typedef struct _DbusmenuClientClass DbusmenuClientClass; -- cgit v1.2.3 From 3701dfcaab6465a1aff34f1030cba8d559e271d3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 16:11:02 -0500 Subject: Fixing address --- tests/test-glib-layout-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index b2687e3..2a1f583 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -23,7 +23,7 @@ main (int argc, char ** argv) { g_type_init(); - DbusmenuClient * client = dbusmenu_client_new(":1", "/org/test"); + DbusmenuClient * client = dbusmenu_client_new(":1.1", "/org/test"); dbusmenu_client_get_root(client); g_timeout_add_seconds(2, timer_func, NULL); -- cgit v1.2.3 From 5157797cfa9ebe345c1adbe5cd1de589f6e0c787 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 16:16:17 -0500 Subject: Making sure to clear the call on error too. --- libdbusmenu-glib/client.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index f00c185..d38ade3 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -306,6 +306,7 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { g_warning("Getting layout failed on client %s object %s: %s", priv->dbus_name, priv->dbus_object, error->message); + priv->layoutcall = NULL; g_error_free(error); return; } -- cgit v1.2.3 From f1a04e66561c54fc3120239e2ee5a0240ab50656 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 28 Apr 2009 16:41:39 -0500 Subject: This doesn't crash, not a good sign for using DBus --- tests/test-glib-layout-client.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 2a1f583..e6fc1ba 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -24,13 +24,14 @@ main (int argc, char ** argv) g_type_init(); DbusmenuClient * client = dbusmenu_client_new(":1.1", "/org/test"); - dbusmenu_client_get_root(client); - g_timeout_add_seconds(2, timer_func, NULL); + g_timeout_add_seconds(2, timer_func, client); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); + g_object_unref(G_OBJECT(client)); + if (passed) { g_debug("Quiting"); return 0; -- cgit v1.2.3 From 22e6abdd0a1bea1ee257da6eeb767228aeff212c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:07:16 +0100 Subject: Some timers to get things lined up correctly and other little cleanups to stop breaking this. --- tests/test-glib-layout-client.c | 4 +++- tests/test-glib-layout-server.c | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index e6fc1ba..bc8eb2c 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -23,7 +23,9 @@ main (int argc, char ** argv) { g_type_init(); - DbusmenuClient * client = dbusmenu_client_new(":1.1", "/org/test"); + g_usleep(10000); + + DbusmenuClient * client = dbusmenu_client_new(":1.0", "/org/test"); g_timeout_add_seconds(2, timer_func, client); diff --git a/tests/test-glib-layout-server.c b/tests/test-glib-layout-server.c index d6f9f3d..8539a2b 100644 --- a/tests/test-glib-layout-server.c +++ b/tests/test-glib-layout-server.c @@ -1,6 +1,10 @@ #include +#include +#include +#include + #include #include @@ -51,10 +55,12 @@ main (int argc, char ** argv) { g_type_init(); + g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); + server = dbusmenu_server_new("/org/test"); timer_func(NULL); - g_timeout_add(250, timer_func, NULL); + g_timeout_add(2500, timer_func, NULL); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From eec69c6d029f32cff471508598a3404542a2b1b7 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:08:06 +0100 Subject: A small script to run the test easily --- tests/test.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 tests/test.sh diff --git a/tests/test.sh b/tests/test.sh new file mode 100755 index 0000000..ea31515 --- /dev/null +++ b/tests/test.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +echo dbus-test-runner -d /usr/share/dbus-test-runner/session.conf --task ./test-glib-layout-client --task ./test-glib-layout-server +dbus-test-runner -d /usr/share/dbus-test-runner/session.conf --task ./test-glib-layout-client --task ./test-glib-layout-server -- cgit v1.2.3 From be1fc6d8f33b6bb949b304b1535d3dcfee7fc617 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:08:26 +0100 Subject: Don't init the value, as DBus will do that. --- libdbusmenu-glib/client.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index d38ade3..5c8111b 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -302,8 +302,6 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) GError * error = NULL; GValue value = {0}; - g_value_init(&value, G_TYPE_STRING); - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { g_warning("Getting layout failed on client %s object %s: %s", priv->dbus_name, priv->dbus_object, error->message); priv->layoutcall = NULL; -- cgit v1.2.3 From 1db35e5c72fe9f51406043b8a51b4450953fd3c1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:36:04 +0100 Subject: Adding the layout into the error message. --- libdbusmenu-glib/client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 5c8111b..a9c7419 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -285,7 +285,7 @@ parse_layout (DbusmenuClient * client, const gchar * layout) priv->root = parse_layout_xml(root, priv->root, NULL); if (priv->root == NULL) { - g_warning("Unable to parse layout on client %s object %s", priv->dbus_name, priv->dbus_object); + g_warning("Unable to parse layout on client %s object %s: %s", priv->dbus_name, priv->dbus_object, layout); } xmlFreeDoc(xmldoc); -- cgit v1.2.3 From dcca29ed8812682d7fb0bbbd224c4c5eff16c9a6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:39:05 +0100 Subject: More time --- tests/test-glib-layout-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index bc8eb2c..7f3f52f 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -23,7 +23,7 @@ main (int argc, char ** argv) { g_type_init(); - g_usleep(10000); + g_usleep(500000); DbusmenuClient * client = dbusmenu_client_new(":1.0", "/org/test"); -- cgit v1.2.3 From bd8dca841ba20362b9d50693b01f4e78bc7cf721 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 14:59:10 +0100 Subject: Debug comments --- libdbusmenu-glib/server.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 13eb240..7d080f5 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -156,6 +156,8 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) priv->root = DBUSMENU_MENUITEM(g_value_get_object(value)); if (priv->root != NULL) { g_object_ref(G_OBJECT(priv->root)); + } else { + g_debug("Setting root node to NULL"); } break; case PROP_LAYOUT: @@ -195,6 +197,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) case PROP_LAYOUT: { GPtrArray * xmlarray = g_ptr_array_new(); if (priv->root == NULL) { + g_debug("Getting layout without root node!"); g_ptr_array_add(xmlarray, g_strdup("")); } else { dbusmenu_menuitem_buildxml(priv->root, xmlarray); @@ -204,7 +207,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* build string */ gchar * finalstring = g_strjoinv("", (gchar **)xmlarray->pdata); g_value_take_string(value, finalstring); - /* g_debug("Final string: %s", finalstring); */ + g_debug("Final string: %s", finalstring); g_ptr_array_foreach(xmlarray, xmlarray_foreach_free, NULL); g_ptr_array_free(xmlarray, TRUE); -- cgit v1.2.3 From 8d5e953b1f49a698a8636ad6856684360180be66 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 4 May 2009 15:06:06 +0100 Subject: more debugging --- libdbusmenu-glib/server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 7d080f5..a0f7225 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -268,6 +268,7 @@ dbusmenu_server_new (const gchar * object) void dbusmenu_server_set_root (DbusmenuServer * self, DbusmenuMenuitem * root) { + g_debug("Setting root object: 0x%X", (unsigned int)root); GValue rootvalue = {0}; g_value_init(&rootvalue, G_TYPE_OBJECT); g_value_set_object(&rootvalue, root); -- cgit v1.2.3 From 626927e3c09cfdc4d376c95e91752fa88cc0799e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 17:29:36 +0100 Subject: Implement the new_with_id function by making the id a property and building some set_ and get_ --- libdbusmenu-glib/menuitem.c | 62 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 6fdc7d2..c571fd4 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -11,6 +11,12 @@ struct _DbusmenuMenuitemPrivate GList * children; }; +/* Properties */ +enum { + PROP_0, + PROP_ID, +}; + #define DBUSMENU_MENUITEM_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemPrivate)) @@ -19,6 +25,8 @@ static void dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass); static void dbusmenu_menuitem_init (DbusmenuMenuitem *self); static void dbusmenu_menuitem_dispose (GObject *object); static void dbusmenu_menuitem_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); /* GObject stuff */ G_DEFINE_TYPE (DbusmenuMenuitem, dbusmenu_menuitem, G_TYPE_OBJECT); @@ -32,6 +40,14 @@ dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) object_class->dispose = dbusmenu_menuitem_dispose; object_class->finalize = dbusmenu_menuitem_finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + + g_object_class_install_property (object_class, PROP_ID, + g_param_spec_uint("id", "ID for the menu item", + "This is a unique indentifier for the menu item.", + 0, 30000, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); return; } @@ -43,7 +59,7 @@ dbusmenu_menuitem_init (DbusmenuMenuitem *self) { DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(self); - priv->id = menuitem_next_id++; + priv->id = 0; priv->children = NULL; return; @@ -65,6 +81,41 @@ dbusmenu_menuitem_finalize (GObject *object) return; } +static void +set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) +{ + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(obj); + + switch (id) { + case PROP_ID: + priv->id = g_value_get_uint(value); + if (priv->id > menuitem_next_id) { + menuitem_next_id = priv->id; + } + break; + } + + return; +} + +static void +get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) +{ + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(obj); + + switch (id) { + case PROP_ID: + if (priv->id == 0) { + priv->id = menuitem_next_id++; + } + g_value_set_uint(value, priv->id); + break; + } + + return; +} + + /* Public interface */ DbusmenuMenuitem * dbusmenu_menuitem_new (void) @@ -75,15 +126,16 @@ dbusmenu_menuitem_new (void) DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (guint id) { - - return NULL; + return g_object_new(DBUSMENU_TYPE_MENUITEM, "id", id, NULL); } guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) { - DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); - return priv->id; + GValue retval = {0}; + g_value_init(&retval, G_TYPE_UINT); + g_object_get_property(G_OBJECT(mi), "id", &retval); + return g_value_get_uint(&retval); } GList * -- cgit v1.2.3 From 125df5401f1977f01b189b9ba598f898202d2727 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 17:29:53 +0100 Subject: Debugging message. --- tests/test-glib-layout-server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test-glib-layout-server.c b/tests/test-glib-layout-server.c index 8539a2b..2e71e84 100644 --- a/tests/test-glib-layout-server.c +++ b/tests/test-glib-layout-server.c @@ -28,6 +28,7 @@ layout2menuitem (layout_t * layout) } } + g_debug("Layout to menu return: 0x%X", (unsigned int)local); return local; } -- cgit v1.2.3 From 327bb967f21c472bd01783e1eaa6ef791826cccb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 18:24:33 +0100 Subject: Adding in signals to get the update from the server updating the layout. And parsing it. --- libdbusmenu-glib/client.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index a9c7419..143e4be 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -41,7 +41,13 @@ static void dbusmenu_client_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); /* Private Funcs */ +static void layout_update (DBusGProxy * proxy, DbusmenuClient * client); static void build_proxies (DbusmenuClient * client); +static guint parse_node_get_id (xmlNodePtr node); +static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent); +static void parse_layout (DbusmenuClient * client, const gchar * layout); +static void update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data); +static void update_layout (DbusmenuClient * client); /* Build a type */ G_DEFINE_TYPE (DbusmenuClient, dbusmenu_client, G_TYPE_OBJECT); @@ -173,6 +179,14 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Internal funcs */ +/* Annoying little wrapper to make the right function update */ +static void +layout_update (DBusGProxy * proxy, DbusmenuClient * client) +{ + update_layout(client); + return; +} + /* When we have a name and an object, build the two proxies and get the first version of the layout */ static void @@ -213,6 +227,9 @@ build_proxies (DbusmenuClient * client) return; } + dbus_g_proxy_add_signal(priv->menuproxy, "LayoutUpdate", G_TYPE_INVALID); + dbus_g_proxy_connect_signal(priv->menuproxy, "LayoutUpdate", G_CALLBACK(layout_update), client, NULL); + return; } -- cgit v1.2.3 From 59a21ee084758c2ba4774a86767f8c593ff94f72 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 18:25:20 +0100 Subject: Extending time a little bit --- tests/test-glib-layout-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 7f3f52f..850b17c 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -27,7 +27,7 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new(":1.0", "/org/test"); - g_timeout_add_seconds(2, timer_func, client); + g_timeout_add_seconds(6, timer_func, client); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 8b7a878309959f34b08b321f0f04457a31f52826 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 18:48:58 +0100 Subject: Adding in a signal for the layout being updated --- libdbusmenu-glib/client.c | 25 +++++++++++++++++++++++++ libdbusmenu-glib/client.h | 10 ++++++++++ 2 files changed, 35 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 143e4be..bb2f588 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -15,6 +15,14 @@ enum { PROP_DBUSNAME }; +/* Signals */ +enum { + LAYOUT_UPDATED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; struct _DbusmenuClientPrivate @@ -64,6 +72,22 @@ dbusmenu_client_class_init (DbusmenuClientClass *klass) object_class->set_property = set_property; object_class->get_property = get_property; + /** + DbusmenuClient::layout-update: + @arg0: The #DbusmenuClient object + + Tells that the layout has been updated and parsed by + this object and is ready for grabbing by the calling + application. + */ + signals[LAYOUT_UPDATED] = g_signal_new(DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (DbusmenuClientClass, layout_updated), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, G_TYPE_NONE); + 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.", @@ -330,6 +354,7 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) parse_layout(client, xml); priv->layoutcall = NULL; + g_signal_emit(G_OBJECT(client), signals[LAYOUT_UPDATED], 0, TRUE); return; } diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index bc4559a..d4c5ee9 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -15,6 +15,8 @@ G_BEGIN_DECLS #define DBUSMENU_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_CLIENT)) #define DBUSMENU_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_CLIENT, DbusmenuClientClass)) +#define DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED "layout-updated" + #define DBUSMENU_CLIENT_PROP_DBUS_NAME "dbus-name" #define DBUSMENU_CLIENT_PROP_DBUS_OBJECT "dbus-object" @@ -23,6 +25,14 @@ typedef struct _DbusmenuClientClass DbusmenuClientClass; struct _DbusmenuClientClass { GObjectClass parent_class; + + void (*layout_updated)(void); + + /* Reserved for future use */ + void (*reserved1) (void); + void (*reserved2) (void); + void (*reserved3) (void); + void (*reserved4) (void); }; struct _DbusmenuClient { -- cgit v1.2.3 From e91e2504652a59870ac5e439fcdf0b452fd87d70 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 18:58:23 +0100 Subject: Loving the signal handling --- tests/test-glib-layout-client.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 850b17c..0a8aa13 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -9,6 +9,12 @@ static guint layouton = 0; static GMainLoop * mainloop = NULL; static gboolean passed = TRUE; +static void +layout_updated (DbusmenuClient * client, gpointer data) +{ + g_debug("Layout Updated"); +} + static gboolean timer_func (gpointer data) { @@ -26,6 +32,7 @@ main (int argc, char ** argv) g_usleep(500000); DbusmenuClient * client = dbusmenu_client_new(":1.0", "/org/test"); + g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); g_timeout_add_seconds(6, timer_func, client); -- cgit v1.2.3 From 5fe27cb6243602bb1ca2d2ee77a8e4db1c4efdd5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 19:04:55 +0100 Subject: Heh, turns out to recieve a signal you have to send it. --- libdbusmenu-glib/server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index a0f7225..53ff69b 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -159,6 +159,7 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) } else { g_debug("Setting root node to NULL"); } + g_signal_emit(obj, signals[LAYOUT_UPDATE], 0, TRUE); break; case PROP_LAYOUT: /* Can't set this, fall through to error */ -- cgit v1.2.3 From 17c8844b6418c3fe7c63b946dc184b819b7f469c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 19:53:59 +0100 Subject: Doing some layout parsing for fun and profit. --- tests/test-glib-layout-client.c | 44 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 0a8aa13..8f9b7eb 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -9,10 +9,52 @@ static guint layouton = 0; static GMainLoop * mainloop = NULL; static gboolean passed = TRUE; +static gboolean +verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) +{ + if (layout->id != dbusmenu_menuitem_get_id(mi)) { + return FALSE; + } + + GList * children = dbusmenu_menuitem_get_children(mi); + + if (children == NULL && layout->submenu == NULL) { + return TRUE; + } + if (children == NULL || layout->submenu == NULL) { + return FALSE; + } + + guint i = 0; + for (i = 0; children != NULL && layout[i].id != 0; children = g_list_next(children), i++) { + if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout[i])) { + return FALSE; + } + } + + if (children != NULL || layout[i].id != 0) { + return FALSE; + } + + return TRUE; +} + static void layout_updated (DbusmenuClient * client, gpointer data) { g_debug("Layout Updated"); + + DbusmenuMenuitem * menuroot = dbusmenu_client_get_root(client); + layout_t * layout = &layouts[layouton]; + + if (!verify_root_to_layout(menuroot, layout)) { + g_debug("Failed layout: %d", layouton); + passed = FALSE; + } + + layouton++; + + return; } static gboolean @@ -34,7 +76,7 @@ main (int argc, char ** argv) DbusmenuClient * client = dbusmenu_client_new(":1.0", "/org/test"); g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL); - g_timeout_add_seconds(6, timer_func, client); + g_timeout_add_seconds(10, timer_func, client); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); -- cgit v1.2.3 From 8b68de6ce69edd4bdef028f6941a9286ec14e191 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 5 May 2009 23:03:55 +0100 Subject: A ton more debugging messages to know where it failed --- tests/test-glib-layout-client.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 8f9b7eb..3620bb7 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -13,6 +13,7 @@ static gboolean verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) { if (layout->id != dbusmenu_menuitem_get_id(mi)) { + g_debug("Failed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi)); return FALSE; } @@ -22,6 +23,11 @@ verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) return TRUE; } if (children == NULL || layout->submenu == NULL) { + if (children == NULL) { + g_debug("Failed as there are no children but we have submenus"); + } else { + g_debug("Failed as we have children but no submenu"); + } return FALSE; } @@ -32,11 +38,16 @@ verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) } } - if (children != NULL || layout[i].id != 0) { - return FALSE; + if (children == NULL && layout[i].id == 0) { + return TRUE; } - return TRUE; + if (children != NULL) { + g_debug("Failed as there are still children but no submenus"); + } else { + g_debug("Failed as there are still submenus but no children"); + } + return FALSE; } static void -- cgit v1.2.3 From 071c8b6d09ee51fc8f7d7514d74f031e6f6a048a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 6 May 2009 07:37:12 +0100 Subject: Debugging messages and switching the ID gathering function around. --- libdbusmenu-glib/client.c | 16 ++++++++++++---- libdbusmenu-glib/menuitem.c | 4 +++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index bb2f588..d8bacea 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -265,19 +265,21 @@ parse_node_get_id (xmlNodePtr node) { if (g_strcmp0((gchar *)node->name, "menu") != 0) { /* This kills some nodes early */ + g_warning("XML Node is not 'menu' it is '%s'", node->name); return 0; } xmlAttrPtr attrib; - for (attrib = node->properties; node != NULL; node = node->next) { - if (g_strcmp0((gchar *)node->name, "id") == 0) { - if (node->children != NULL) { + for (attrib = node->properties; attrib != NULL; attrib = attrib->next) { + if (g_strcmp0((gchar *)attrib->name, "id") == 0) { + if (attrib->children != NULL) { return (guint)g_ascii_strtoull((gchar *)attrib->children->content, NULL, 10); } break; } } + g_warning("Unable to find an ID on the node"); return 0; } @@ -287,7 +289,7 @@ static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent) { guint id = parse_node_get_id(node); - if (item == NULL || dbusmenu_menuitem_get_id(item) != id) { + if (item == NULL || dbusmenu_menuitem_get_id(item) != id || id == 0) { if (item != NULL) { if (parent != NULL) { dbusmenu_menuitem_child_delete(parent, item); @@ -295,6 +297,11 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa g_object_unref(G_OBJECT(item)); } + if (id == 0) { + g_warning("ID from XML file is zero"); + return NULL; + } + /* Build a new item */ item = dbusmenu_menuitem_new_with_id(id); } @@ -354,6 +361,7 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) parse_layout(client, xml); priv->layoutcall = NULL; + g_debug("Root is now: 0x%X", (unsigned int)priv->root); g_signal_emit(G_OBJECT(client), signals[LAYOUT_UPDATED], 0, TRUE); return; diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index c571fd4..0aff2d8 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -126,7 +126,9 @@ dbusmenu_menuitem_new (void) DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (guint id) { - return g_object_new(DBUSMENU_TYPE_MENUITEM, "id", id, NULL); + DbusmenuMenuitem * mi = g_object_new(DBUSMENU_TYPE_MENUITEM, "id", id, NULL); + g_debug("New Menuitem id %d goal id %d", dbusmenu_menuitem_get_id(mi), id); + return mi; } guint -- cgit v1.2.3 From 616007d3189fddf8e490b9e589bb2eeb0b486ae9 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 6 May 2009 08:23:19 +0100 Subject: Fleshing out the children management --- libdbusmenu-glib/menuitem.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 0aff2d8..9ccef96 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -170,28 +170,37 @@ dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { - - return FALSE; + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + priv->children = g_list_append(priv->children, child); + return TRUE; } gboolean dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { - - return FALSE; + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + priv->children = g_list_remove(priv->children, child); + return TRUE; } gboolean dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position) { - - - return FALSE; + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + priv->children = g_list_insert(priv->children, child, position); + return TRUE; } DbusmenuMenuitem * dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id) { + GList * childs = dbusmenu_menuitem_get_children(mi); + for ( ; childs == NULL; childs = g_list_next(childs)) { + DbusmenuMenuitem * lmi = DBUSMENU_MENUITEM(childs->data); + if (id == dbusmenu_menuitem_get_id(lmi)) { + return lmi; + } + } return NULL; } -- cgit v1.2.3 From ac5c4fd2498a7e711fc190f591b6fba71397b74f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 8 May 2009 16:24:02 -0500 Subject: Checking for a NULL child more vigorously --- libdbusmenu-glib/menuitem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 9ccef96..2cf4b85 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -195,6 +195,8 @@ DbusmenuMenuitem * dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id) { GList * childs = dbusmenu_menuitem_get_children(mi); + if (childs == NULL) return NULL; + for ( ; childs == NULL; childs = g_list_next(childs)) { DbusmenuMenuitem * lmi = DBUSMENU_MENUITEM(childs->data); if (id == dbusmenu_menuitem_get_id(lmi)) { -- cgit v1.2.3 From 643a87c6cbad706f74f31b8dd3e15897b9c682cc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Fri, 8 May 2009 16:24:18 -0500 Subject: More debugging --- libdbusmenu-glib/client.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index d8bacea..c432f7d 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -273,7 +273,9 @@ parse_node_get_id (xmlNodePtr node) for (attrib = node->properties; attrib != NULL; attrib = attrib->next) { if (g_strcmp0((gchar *)attrib->name, "id") == 0) { if (attrib->children != NULL) { - return (guint)g_ascii_strtoull((gchar *)attrib->children->content, NULL, 10); + guint id = (guint)g_ascii_strtoull((gchar *)attrib->children->content, NULL, 10); + g_debug ("Found ID: %d", id); + return id; } break; } @@ -289,6 +291,7 @@ static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent) { guint id = parse_node_get_id(node); + g_debug("Looking at node with id: %d", id); if (item == NULL || dbusmenu_menuitem_get_id(item) != id || id == 0) { if (item != NULL) { if (parent != NULL) { @@ -309,6 +312,7 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa xmlNodePtr children; guint position; for (children = node->children, position = 0; children != NULL; children = children->next, position++) { + g_debug("Looking at child: %d", position); guint childid = parse_node_get_id(children); DbusmenuMenuitem * childmi = dbusmenu_menuitem_child_find(item, childid); childmi = parse_layout_xml(children, childmi, item); @@ -358,6 +362,7 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) } const gchar * xml = g_value_get_string(&value); + g_debug("Got layout string: %s", xml); parse_layout(client, xml); priv->layoutcall = NULL; -- cgit v1.2.3 From f2cd48dd391855a6f4304038459effd5c6463884 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sat, 9 May 2009 14:42:08 -0500 Subject: Debug message --- tests/test-glib-layout-client.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 3620bb7..6086c7f 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -12,6 +12,8 @@ static gboolean passed = TRUE; static gboolean verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) { + g_debug("Verifying ID: %d", layout->id); + if (layout->id != dbusmenu_menuitem_get_id(mi)) { g_debug("Failed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi)); return FALSE; -- cgit v1.2.3 From 3c7a5751473ef1c92de1aff135dd055bda05257e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 10 May 2009 22:15:37 -0500 Subject: Fixing going into the recursive submenus --- tests/test-glib-layout-client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 6086c7f..2099cd5 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -35,7 +35,7 @@ verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) guint i = 0; for (i = 0; children != NULL && layout[i].id != 0; children = g_list_next(children), i++) { - if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout[i])) { + if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout->submenu[i])) { return FALSE; } } -- cgit v1.2.3 From 65e3edf11624283530ba8de1e7c68244b04f9ea6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Sun, 10 May 2009 22:26:25 -0500 Subject: Looking at submenus instead of the current array as we should have been originally. Oops. --- tests/test-glib-layout-client.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 2099cd5..6c012a5 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -34,20 +34,20 @@ verify_root_to_layout(DbusmenuMenuitem * mi, layout_t * layout) } guint i = 0; - for (i = 0; children != NULL && layout[i].id != 0; children = g_list_next(children), i++) { + for (i = 0; children != NULL && layout->submenu[i].id != 0; children = g_list_next(children), i++) { if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout->submenu[i])) { return FALSE; } } - if (children == NULL && layout[i].id == 0) { + if (children == NULL && layout->submenu[i].id == 0) { return TRUE; } if (children != NULL) { - g_debug("Failed as there are still children but no submenus"); + g_debug("Failed as there are still children but no submenus. (ID: %d)", layout->id); } else { - g_debug("Failed as there are still submenus but no children"); + g_debug("Failed as there are still submenus but no children. (ID: %d)", layout->id); } return FALSE; } -- cgit v1.2.3 From 87fea6b9f16b49d3ad1b6801e53fd89f516b2973 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 12:12:10 -0500 Subject: Allowing people to take children. --- libdbusmenu-glib/menuitem.c | 21 +++++++++++++++++++++ libdbusmenu-glib/menuitem.h | 1 + 2 files changed, 22 insertions(+) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 2cf4b85..985de95 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -149,6 +149,27 @@ dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi) return priv->children; } +/** + dbusmenu_menuitem_take_children: + @mi: The #DbusmenMenuitem to take the children from. + + While the name sounds devious that's exactly what this function + does. It takes the list of children from the @mi and clears the + internal list. The calling function is no in charge of the ref's + on the children it has taken. A lot of responsibility involved + in taking children. +*/ +GList * +dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi) +{ + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL); + + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + GList * children = priv->children; + priv->children = NULL; + return children; +} + guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent) { diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index c4057dd..b7d767c 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -48,6 +48,7 @@ DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (guint id); guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi); GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi); +GList * dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi); guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent); gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child); -- cgit v1.2.3 From 29457ef539de25ce80f8bdb1d6ca0796fc5f1122 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 12:46:30 -0500 Subject: Taking the children, and trying to reuse them if possible. Sometimes that doesn't work out and we have to put one down. It's always sad to loose one, but sometimes it has to happen. --- libdbusmenu-glib/client.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index c432f7d..1a35868 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -311,14 +311,34 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa xmlNodePtr children; guint position; + GList * oldchildren = dbusmenu_menuitem_take_children(item); + for (children = node->children, position = 0; children != NULL; children = children->next, position++) { g_debug("Looking at child: %d", position); guint childid = parse_node_get_id(children); - DbusmenuMenuitem * childmi = dbusmenu_menuitem_child_find(item, childid); + DbusmenuMenuitem * childmi = NULL; + + GList * childsearch = NULL; + for (childsearch = oldchildren; childsearch != NULL; childsearch = g_list_next(childsearch)) { + DbusmenuMenuitem * cs_mi = DBUSMENU_MENUITEM(childsearch->data); + if (childid == dbusmenu_menuitem_get_id(cs_mi)) { + oldchildren = g_list_remove(oldchildren, cs_mi); + childmi = cs_mi; + break; + } + } + childmi = parse_layout_xml(children, childmi, item); dbusmenu_menuitem_child_add_position(item, childmi, position); } + GList * oldchildleft = NULL; + for (oldchildleft = oldchildren; oldchildleft != NULL; oldchildleft = g_list_next(oldchildleft)) { + DbusmenuMenuitem * oldmi = DBUSMENU_MENUITEM(oldchildleft->data); + g_object_unref(G_OBJECT(oldmi)); + } + g_list_free(oldchildren); + return item; } -- cgit v1.2.3 From ccd39004abc4c5ade0103a6cf17144443745f2cf Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 13:29:10 -0500 Subject: Moving the glib layout test into the make file --- tests/Makefile.am | 8 ++++++++ tests/test.sh | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) delete mode 100755 tests/test.sh diff --git a/tests/Makefile.am b/tests/Makefile.am index a80f1d1..4f52706 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,3 +1,8 @@ +check: tests + +DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.conf + +tests: test-glib-layout libexec_PROGRAMS = \ glib-server-nomenu \ @@ -15,6 +20,9 @@ glib_server_nomenu_LDADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ $(DBUSMENUGLIB_LIBS) +test-glib-layout: test-glib-layout-client test-glib-layout-server + $(DBUS_RUNNER) --task ./test-glib-layout-client --task ./test-glib-layout-server + test_glib_layout_server_SOURCES = \ test-glib-layout-server.c diff --git a/tests/test.sh b/tests/test.sh deleted file mode 100755 index ea31515..0000000 --- a/tests/test.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo dbus-test-runner -d /usr/share/dbus-test-runner/session.conf --task ./test-glib-layout-client --task ./test-glib-layout-server -dbus-test-runner -d /usr/share/dbus-test-runner/session.conf --task ./test-glib-layout-client --task ./test-glib-layout-server -- cgit v1.2.3 From afa84740cda0f8d24288a783c57283b75bb32bcf Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 14:06:08 -0500 Subject: Making nice friendly names. --- tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 4f52706..ca0bd77 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -21,7 +21,7 @@ glib_server_nomenu_LDADD = \ $(DBUSMENUGLIB_LIBS) test-glib-layout: test-glib-layout-client test-glib-layout-server - $(DBUS_RUNNER) --task ./test-glib-layout-client --task ./test-glib-layout-server + $(DBUS_RUNNER) --task ./test-glib-layout-client --task-name Client --task ./test-glib-layout-server --task-name Server --ignore-return test_glib_layout_server_SOURCES = \ test-glib-layout-server.c -- cgit v1.2.3 From 4a07417b44809c7444fdde2ed611161e2b8e5c05 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 16:32:15 -0500 Subject: Object documentation. No gtk-doc yet, but getting ready. --- libdbusmenu-glib/menuitem.h | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index b7d767c..732a7a6 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -13,12 +13,22 @@ G_BEGIN_DECLS #define DBUSMENU_IS_MENUITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DBUSMENU_TYPE_MENUITEM)) #define DBUSMENU_MENUITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemClass)) -typedef struct _DbusmenuMenuitem DbusmenuMenuitem; -typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass; #define DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED "property-changed" #define DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED "item-activated" +/** + DbusmenuMenuitemClass: + @property_changed: Slot for #DbusmenuMenuitem::property-changed. + @item_activated: Slot for #DbusmenuMenuitem::item-activated. + @buildxml: Virtual function that appends the strings required + to represent this menu item in the menu XML file. + @reserved1: Reserved for future use. + @reserved2: Reserved for future use. + @reserved3: Reserved for future use. + @reserved4: Reserved for future use. +*/ +typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass; struct _DbusmenuMenuitemClass { GObjectClass parent_class; @@ -36,6 +46,17 @@ struct _DbusmenuMenuitemClass void (*reserved4) (void); }; +/** + DbusmenuMenuitem: + + This is the #GObject based object that represents a menu + item. It gets created the same on both the client and + the server side and libdbusmenu-glib does the work of making + this object model appear on both sides of DBus. Simple + really, though through updates and people coming on and off + the bus it can lead to lots of fun complex scenarios. +*/ +typedef struct _DbusmenuMenuitem DbusmenuMenuitem; struct _DbusmenuMenuitem { GObject parent; @@ -62,6 +83,25 @@ gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array); +/** + SECTION:menuitem + @short_description: A lowlevel represenation of a menuitem + @stability: Unstable + @include: libdbusmenu-glib/menuitem.h + + A #DbusmenuMenuitem is the lowest level of represenation of a + single item in a menu. It gets created on the server side + and copied over to the client side where it gets rendered. As + the server starts to change it, and grow it, and do all kinds + of fun stuff that information is transfered over DBus and the + client updates it's understanding of the object model. + + Most people using either the client or the server should be + able to deal mostly with #DbusmenuMenuitem objects. These + are simple, but then they can be attached to more complex + objects and handled appropriately. +*/ + G_END_DECLS #endif -- cgit v1.2.3 From 1dee09e4f2b42b3104293f52e6008341905b1127 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 16:58:01 -0500 Subject: Function documentation. --- libdbusmenu-glib/menuitem.c | 115 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 985de95..151a837 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -4,6 +4,16 @@ #include "menuitem.h" /* Private */ +/** + DbusmenuMenuitemPrivate: + @id: The ID of this menu item + @children: A list of #DbusmenuMenuitem objects that are + children to this one. + + These are the little secrets that we don't want getting + out of data that we have. They can still be gotten using + accessor functions, but are protected appropriately. +*/ typedef struct _DbusmenuMenuitemPrivate DbusmenuMenuitemPrivate; struct _DbusmenuMenuitemPrivate { @@ -117,12 +127,28 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) /* Public interface */ + +/** + dbusmenu_menuitem_new: + + Create a new #DbusmenuMenuitem with all default values. + + Return value: A newly allocated #DbusmenuMenuitem. +*/ DbusmenuMenuitem * dbusmenu_menuitem_new (void) { return g_object_new(DBUSMENU_TYPE_MENUITEM, NULL); } +/** + dbusmenu_menuitem_new_with_id: + @id: ID to use for this menuitem + + This creates a blank #DbusmenuMenuitem with a specific ID. + + Return value: A newly allocated #DbusmenuMenuitem. +*/ DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (guint id) { @@ -131,6 +157,14 @@ dbusmenu_menuitem_new_with_id (guint id) return mi; } +/** + dbusmenu_menuitem_get_id: + @mi: The #DbusmenuMenuitem to query. + + Gets the unique ID for @mi. + + Return value: The ID of the @mi. +*/ guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) { @@ -140,6 +174,16 @@ dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) return g_value_get_uint(&retval); } +/** + dbusmenu_menuitem_get_children: + @mi: The #DbusmenuMenuitem to query. + + Returns simply the list of children that this menu item + has. The list is valid until another child related function + is called, where it might be changed. + + Return value: A #GList of pointers to #DbusmenuMenuitem objects. +*/ GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi) { @@ -158,6 +202,8 @@ dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi) internal list. The calling function is no in charge of the ref's on the children it has taken. A lot of responsibility involved in taking children. + + Return value: A #GList of pointers to #DbusmenuMenuitem objects. */ GList * dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi) @@ -170,6 +216,17 @@ dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi) return children; } +/** + dbusmenu_menuitem_get_position: + @mi: The #DbusmenuMenuitem to find the position of + @parent: The #DbusmenuMenuitem who's children contain @mi + + This function returns the position of the menu item @mi + in the children of @parent. It will return zero if the + menu item can't be found. + + Return value: The position of @mi in the children of @parent. +*/ guint dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent) { @@ -178,8 +235,9 @@ dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent g_return_val_if_fail(DBUSMENU_IS_MENUITEM(parent), 0); GList * childs = dbusmenu_menuitem_get_children(parent); + if (childs == NULL) return 0; guint count = 0; - for ( ; childs != NULL; childs = childs->next) { + for ( ; childs != NULL; childs = childs->next, count++) { if (childs->data == mi) break; } @@ -188,6 +246,16 @@ dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent return count; } +/** + dbusmenu_menuitem_child_append: + @mi: The #DbusmenuMenuitem which will become a new parent + @child: The #DbusmenMenuitem that will be a child + + This function adds @child to the list of children on @mi at + the end of that list. + + Return value: Whether the child has been added successfully. +*/ gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { @@ -196,6 +264,17 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) return TRUE; } +/** + dbusmenu_menuitem_child_delete: + @mi: The #DbusmenuMenuitem which has @child as a child + @child: The child #DbusmenuMenuitem that you want to no longer + be a child of @mi. + + This function removes @child from the children list of @mi. It does + not call #g_object_unref on @child. + + Return value: If we were able to delete @child. +*/ gboolean dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { @@ -204,6 +283,18 @@ dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) return TRUE; } +/** + dbusmenu_menuitem_child_add_position: + @mi: The #DbusmenuMenuitem that we're adding the child @child to. + @child: The #DbusmenuMenuitem to make a child of @mi. + @position: Where in @mi object's list of chidren @child should be placed. + + Puts @child in the list of children for @mi at the location + specified in @position. If there is not enough entires available + then @child will be placed at the end of the list. + + Return value: Whether @child was added successfully. +*/ gboolean dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position) { @@ -212,6 +303,17 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * return TRUE; } +/** + dbusmenu_menuitem_child_find: + @mi: The #DbusmenuMenuitem who's children to look on + @id: The ID of the child that we're looking for. + + Search the children of @mi to find one with the ID of @id. + If it doesn't exist then we return #NULL. + + Return value: The menu item with the ID @id or #NULL if it + can't be found. +*/ DbusmenuMenuitem * dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id) { @@ -249,6 +351,17 @@ dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property) return FALSE; } +/** + dbusmenu_menuitem_buildxml: + @mi: #DbusmenuMenuitem to represent in XML + @array: A list of string that will be turned into an XML file + + This function will add strings to the array @array. It will put + at least one entry if this menu item has no children. If it has + children it will put two for this entry, one representing the + start tag and one that is a closing tag. It will allow it's + children to place their own tags in the array in between those two. +*/ void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array) { -- cgit v1.2.3 From d758a842a491f7518b349767dc7fde8fcc64933b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 11 May 2009 17:19:39 -0500 Subject: Object and section docs. --- libdbusmenu-glib/client.h | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index d4c5ee9..002e0e5 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -20,9 +20,20 @@ G_BEGIN_DECLS #define DBUSMENU_CLIENT_PROP_DBUS_NAME "dbus-name" #define DBUSMENU_CLIENT_PROP_DBUS_OBJECT "dbus-object" -typedef struct _DbusmenuClient DbusmenuClient; -typedef struct _DbusmenuClientClass DbusmenuClientClass; +/** + DbusmenuClientClass: + @parent_class: #GObjectClass + @layout_updated: Slot for #DbusmenuClient::layout-updated. + @reserved1: Reserved for future use. + @reserved2: Reserved for future use. + @reserved3: Reserved for future use. + @reserved4: Reserved for future use. + A simple class that takes all of the information from a + #DbusmenuServer over DBus and makes the same set of + #DbusmenuMenuitem objects appear on the other side. +*/ +typedef struct _DbusmenuClientClass DbusmenuClientClass; struct _DbusmenuClientClass { GObjectClass parent_class; @@ -35,6 +46,14 @@ struct _DbusmenuClientClass { void (*reserved4) (void); }; +/** + DbusmenuClient: + @parent: #GObject. + + The client for a #DbusmenuServer creating a shared + object set of #DbusmenuMenuitem objects. +*/ +typedef struct _DbusmenuClient DbusmenuClient; struct _DbusmenuClient { GObject parent; }; @@ -43,6 +62,27 @@ GType dbusmenu_client_get_type (void); DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object); DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client); +/** + SECTION:client + @short_description: The catcher of all the server traffic + @stability: Unstable + @include: libdbusmenu-glib/client.h + + The client exists as a mirror to the server. For most folks + all they will do with a client is set it up to connect to + a server and then watch as the menu items on their side + of the bus change. This is all they should need to know about + the client, that it magically makes their menuitems dance. + + It does this by setting up signal watchers and adjusting + the menuitems appropriately. Most users should watch the + menu items and the signal #DbusmenuClient::layout-changed for + larger events so that they can be optimized. It is possible + with that signal that even the root node would change. If + that doesn't happen the normal signals on the individual + nodes should be enough for most users. +*/ + G_END_DECLS #endif -- cgit v1.2.3 From bbeb7864cc36c0c50a94361ae6edfe3c83bb56c3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 08:38:58 -0500 Subject: Put the GPL v3 on these tests --- tests/glib-server-nomenu.c | 21 +++++++++++++++++++++ tests/test-glib-layout-client.c | 21 +++++++++++++++++++++ tests/test-glib-layout-server.c | 20 ++++++++++++++++++++ tests/test-glib-layout.h | 20 ++++++++++++++++++++ 4 files changed, 82 insertions(+) diff --git a/tests/glib-server-nomenu.c b/tests/glib-server-nomenu.c index 36aac3e..e5ea159 100644 --- a/tests/glib-server-nomenu.c +++ b/tests/glib-server-nomenu.c @@ -1,3 +1,24 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, 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 GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + #include #include diff --git a/tests/test-glib-layout-client.c b/tests/test-glib-layout-client.c index 6c012a5..7a53443 100644 --- a/tests/test-glib-layout-client.c +++ b/tests/test-glib-layout-client.c @@ -1,3 +1,24 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, 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 GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + #include #include diff --git a/tests/test-glib-layout-server.c b/tests/test-glib-layout-server.c index 2e71e84..e69c6b2 100644 --- a/tests/test-glib-layout-server.c +++ b/tests/test-glib-layout-server.c @@ -1,3 +1,23 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, 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 GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ #include diff --git a/tests/test-glib-layout.h b/tests/test-glib-layout.h index d315e90..a13125d 100644 --- a/tests/test-glib-layout.h +++ b/tests/test-glib-layout.h @@ -1,3 +1,23 @@ +/* +A test for libdbusmenu to ensure its quality. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, 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 GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ typedef struct _layout_t layout_t; struct _layout_t { -- cgit v1.2.3 From a2f612da2fe73e6e22abf2fadbe18d4a12e52b1f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 08:51:39 -0500 Subject: Add in the LGPL 2.1/3 text to the tops of the files. --- libdbusmenu-glib/client.c | 28 ++++++++++++++++++++++++++++ libdbusmenu-glib/client.h | 28 ++++++++++++++++++++++++++++ libdbusmenu-glib/menuitem.c | 28 ++++++++++++++++++++++++++++ libdbusmenu-glib/menuitem.h | 28 ++++++++++++++++++++++++++++ libdbusmenu-glib/server.c | 28 ++++++++++++++++++++++++++++ libdbusmenu-glib/server.h | 28 ++++++++++++++++++++++++++++ 6 files changed, 168 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 1a35868..c25f5f2 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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-glib/client.h b/libdbusmenu-glib/client.h index 002e0e5..d591ebb 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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_CLIENT_H__ #define __DBUSMENU_CLIENT_H__ diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 151a837..6360079 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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-glib/menuitem.h b/libdbusmenu-glib/menuitem.h index 732a7a6..a604e7a 100644 --- a/libdbusmenu-glib/menuitem.h +++ b/libdbusmenu-glib/menuitem.h @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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_MENUITEM_H__ #define __DBUSMENU_MENUITEM_H__ diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 53ff69b..9d217c8 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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-glib/server.h b/libdbusmenu-glib/server.h index f2324fd..de5f9eb 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -1,3 +1,31 @@ +/* +A library to communicate a menu object set accross DBus and +track updates and maintain consistency. + +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_SERVER_H__ #define __DBUSMENU_SERVER_H__ -- cgit v1.2.3 From 0b3833cbe0a21ced36de5ec90437949385f5d5a4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 09:08:06 -0500 Subject: Public API functions documentation --- libdbusmenu-glib/client.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index c25f5f2..44312a8 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -52,7 +52,6 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; typedef struct _DbusmenuClientPrivate DbusmenuClientPrivate; - struct _DbusmenuClientPrivate { DbusmenuMenuitem * root; @@ -444,6 +443,19 @@ update_layout (DbusmenuClient * client) } /* Public API */ +/** + dbusmenu_client_new: + @name: The DBus name for the server to connect to + @object: The object on the server to monitor + + This function creates a new client that connects to a specific + server on DBus. That server is at a specific location sharing + a known object. The interface is assumed by the code to be + the DBus menu interface. The newly created client will start + sending out events as it syncs up with the server. + + Return value: A brand new #DbusmenuClient +*/ DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object) { @@ -456,6 +468,21 @@ dbusmenu_client_new (const gchar * name, const gchar * object) return self; } +/** + dbusmenu_client_get_root: + @client: The #DbusmenuClient to get the root node from + + Grabs the root node for the specified client @client. This + function may block. It will block if there is currently a + call to update the layout, it will block on that layout + updated and then return the newly updated layout. Chances + are that this update is in the queue for the mainloop as + it would have been requested some time ago, but in theory + it could block longer. + + Return value: A #DbusmenuMenuitem representing the root of + menu on the server. +*/ DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client) { -- cgit v1.2.3 From b259f290c45dba356179f1089f5740ee04feb24c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 10:31:59 -0500 Subject: Object docs --- libdbusmenu-glib/server.h | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/server.h b/libdbusmenu-glib/server.h index de5f9eb..2c6c817 100644 --- a/libdbusmenu-glib/server.h +++ b/libdbusmenu-glib/server.h @@ -51,9 +51,20 @@ G_BEGIN_DECLS #define DBUSMENU_SERVER_PROP_ROOT_NODE "root-node" #define DBUSMENU_SERVER_PROP_LAYOUT "layout" -typedef struct _DbusmenuServer DbusmenuServer; +/** + DbusmenuServerClass: + @parent_class: #GObjectClass + @id_prop_update: Slot for #DbusmenuServer::id-prop-update. + @id_update: Slot for #DbusmenuServer::id-update. + @layout_update: Slot for #DbusmenuServer::layout-update. + @dbusmenu_server_reserved1: Reserved for future use. + @dbusmenu_server_reserved2: Reserved for future use. + @dbusmenu_server_reserved3: Reserved for future use. + @dbusmenu_server_reserved4: Reserved for future use. + + The class implementing the virtual functions for #DbusmenuServer. +*/ typedef struct _DbusmenuServerClass DbusmenuServerClass; - struct _DbusmenuServerClass { GObjectClass parent_class; @@ -69,6 +80,14 @@ struct _DbusmenuServerClass { void (*dbusmenu_server_reserved4)(void); }; +/** + DbusmenuServer: + @parent: #GObject + + A server which represents a sharing of a set of + #DbusmenuMenuitems across DBus to a #DbusmenuClient. +*/ +typedef struct _DbusmenuServer DbusmenuServer; struct _DbusmenuServer { GObject parent; }; @@ -77,6 +96,25 @@ GType dbusmenu_server_get_type (void); DbusmenuServer * dbusmenu_server_new (const gchar * object); void dbusmenu_server_set_root (DbusmenuServer * server, DbusmenuMenuitem * root); +/** + SECIONT:server + @short_description: The server signals changed and + updates on a tree of #DbusmenuMenuitem objecs. + @stability: Unstable + @include: libdbusmenu-glib/server.h + + A #DbusmenuServer is the object that represents the local + tree of #DbusmenuMenuitem objects on DBus. It watches the + various signals that those objects emit and correctly + represents them across DBus to a #DbusmenuClient so that + the same tree can be maintained in another process. + + The server needs to have the root set of #DbusmenuMenuitem + objects set via #dbusmenu_server_set_root but it will query + all of the objects in that tree automatically. After setting + the root there should be no other maintence required by + users of the server class. +*/ G_END_DECLS #endif -- cgit v1.2.3 From 4ce51aa8712d1543eb0a28a6f41ee4750977918a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 10:38:36 -0500 Subject: Public API docs --- libdbusmenu-glib/server.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 9d217c8..bb5bd8d 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -280,6 +280,17 @@ _dbusmenu_server_list_properties (void) } /* Public Interface */ +/** + dbusmenu_server_new: + @object: The object name to show for this menu structure + on DBus. May be NULL. + + Creates a new #DbusmenuServer object with a specific object + path on DBus. If @object is set to NULL the default object + name of "/org/freedesktop/dbusmenu" will be used. + + Return value: A brand new #DbusmenuServer +*/ DbusmenuServer * dbusmenu_server_new (const gchar * object) { @@ -294,6 +305,15 @@ dbusmenu_server_new (const gchar * object) return self; } +/** + dbusmenu_server_set_root: + @self: The #DbusmenuServer object to set the root on + @root: The new root #DbusmenuMenuitem tree + + This function contains all of the #GValue wrapping + required to set the property #DbusmenuServer:root-node + on the server @self. +*/ void dbusmenu_server_set_root (DbusmenuServer * self, DbusmenuMenuitem * root) { -- cgit v1.2.3 From f03389ffed8da78a4ae5b48473313fc75a522d44 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 11:01:27 -0500 Subject: Checking parameter. Found by Cody Russell. --- libdbusmenu-glib/client.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 44312a8..b0b1157 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -486,6 +486,8 @@ dbusmenu_client_new (const gchar * name, const gchar * object) DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client) { + g_return_val_if_fail(DBUSMENU_IS_CLIENT(client), NULL); + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); if (priv->layoutcall != NULL) { -- cgit v1.2.3 From f50b255c3993dd990606c1d17721788c4f4e1ef4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 11:02:59 -0500 Subject: Checking incomming objects on the server --- libdbusmenu-glib/server.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index bb5bd8d..3db6db0 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -317,6 +317,9 @@ dbusmenu_server_new (const gchar * object) void dbusmenu_server_set_root (DbusmenuServer * self, DbusmenuMenuitem * root) { + g_return_if_fail(DBUSMENU_IS_SERVER(self)); + g_return_if_fail(DBUSMENU_IS_MENUITEM(root)); + g_debug("Setting root object: 0x%X", (unsigned int)root); GValue rootvalue = {0}; g_value_init(&rootvalue, G_TYPE_OBJECT); -- cgit v1.2.3 From 53b4a13ca4541bcdf85ca3ee28cb6ffc81e6f5b0 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 12 May 2009 11:07:00 -0500 Subject: Checking parameters on MI functions. --- libdbusmenu-glib/menuitem.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 6360079..0894d2c 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -196,6 +196,8 @@ dbusmenu_menuitem_new_with_id (guint id) guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi) { + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), 0); + GValue retval = {0}; g_value_init(&retval, G_TYPE_UINT); g_object_get_property(G_OBJECT(mi), "id", &retval); @@ -287,6 +289,9 @@ dbusmenu_menuitem_get_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * parent gboolean dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), FALSE); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); priv->children = g_list_append(priv->children, child); return TRUE; @@ -306,6 +311,9 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) gboolean dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) { + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), FALSE); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); priv->children = g_list_remove(priv->children, child); return TRUE; @@ -326,6 +334,9 @@ dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) gboolean dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint position) { + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), FALSE); + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); + DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); priv->children = g_list_insert(priv->children, child, position); return TRUE; @@ -345,6 +356,8 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * DbusmenuMenuitem * dbusmenu_menuitem_child_find (DbusmenuMenuitem * mi, guint id) { + g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL); + GList * childs = dbusmenu_menuitem_get_children(mi); if (childs == NULL) return NULL; -- cgit v1.2.3