aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-08-25 13:19:05 -0500
committerTed Gould <ted@gould.cx>2010-08-25 13:19:05 -0500
commit3bd4b8dce9460159945a9cc24f0bc8aba7e62898 (patch)
treed94605af07736d1eb037a64c106c2705db319634
parentced95a80cc2cf2664c171879069b5c9753379dd9 (diff)
parent15501ea22301d17dc7d193f1ece226ee657e59c3 (diff)
downloadlibdbusmenu-3bd4b8dce9460159945a9cc24f0bc8aba7e62898.tar.gz
libdbusmenu-3bd4b8dce9460159945a9cc24f0bc8aba7e62898.tar.bz2
libdbusmenu-3bd4b8dce9460159945a9cc24f0bc8aba7e62898.zip
Sync to trunk
-rw-r--r--configure.ac6
-rw-r--r--libdbusmenu-glib/client.c5
-rw-r--r--libdbusmenu-glib/menuitem.c36
-rw-r--r--libdbusmenu-glib/menuitem.h11
-rw-r--r--libdbusmenu-glib/server.c4
-rw-r--r--libdbusmenu-gtk/client.c39
-rw-r--r--tests/test-gtk-submenu-client.c9
-rw-r--r--tests/test-gtk-submenu-server.c17
8 files changed, 104 insertions, 23 deletions
diff --git a/configure.ac b/configure.ac
index 5419c4c..a5c8248 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,11 +1,11 @@
-AC_INIT(libdbusmenu, 0.3.10, ted@canonical.com)
+AC_INIT(libdbusmenu, 0.3.11, ted@canonical.com)
AC_COPYRIGHT([Copyright 2009,2010 Canonical])
AC_PREREQ(2.62)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(libdbusmenu, 0.3.10, [-Wno-portability])
+AM_INIT_AUTOMAKE(libdbusmenu, 0.3.11, [-Wno-portability])
AM_MAINTAINER_MODE
@@ -99,7 +99,7 @@ AC_PATH_PROG([VALA_API_GEN], [vapigen])
###########################
LIBDBUSMENU_CURRENT=1
-LIBDBUSMENU_REVISION=12
+LIBDBUSMENU_REVISION=13
LIBDBUSMENU_AGE=0
AC_SUBST(LIBDBUSMENU_CURRENT)
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c
index cc91b32..d88478c 100644
--- a/libdbusmenu-glib/client.c
+++ b/libdbusmenu-glib/client.c
@@ -605,6 +605,8 @@ get_properties_globber (DbusmenuClient * client, gint id, const gchar ** propert
static void
item_activated (DBusGProxy * proxy, gint id, guint timestamp, DbusmenuClient * client)
{
+ g_return_if_fail(DBUSMENU_IS_CLIENT(client));
+
DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client);
if (priv->root == NULL) {
@@ -1270,7 +1272,8 @@ parse_layout (DbusmenuClient * client, const gchar * layout)
xmlDocPtr xmldoc;
- xmldoc = xmlReadMemory(layout, g_utf8_strlen(layout, 16*1024), "dbusmenu.xml", NULL, 0);
+ /* No one should need more characters than this! */
+ xmldoc = xmlReadMemory(layout, g_utf8_strlen(layout, 1024*1024), "dbusmenu.xml", NULL, 0);
xmlNodePtr root = xmlDocGetRootElement(xmldoc);
diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c
index 623539c..ea69776 100644
--- a/libdbusmenu-glib/menuitem.c
+++ b/libdbusmenu-glib/menuitem.c
@@ -70,6 +70,7 @@ enum {
CHILD_REMOVED,
CHILD_MOVED,
REALIZED,
+ SHOW_TO_USER,
LAST_SIGNAL
};
@@ -211,6 +212,22 @@ dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass)
NULL, NULL,
_dbusmenu_menuitem_marshal_VOID__VOID,
G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ DbusmenuMenuitem::show-to-user:
+ @arg0: The #DbusmenuMenuitem which should be shown.
+ @arg1: Timestamp the event happened at
+
+ Signaled when the application would like the visualization
+ of this menu item shown to the user. This usually requires
+ going over the bus to get it done.
+ */
+ signals[SHOW_TO_USER] = g_signal_new(DBUSMENU_MENUITEM_SIGNAL_SHOW_TO_USER,
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(DbusmenuMenuitemClass, show_to_user),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__UINT,
+ G_TYPE_NONE, 1, G_TYPE_UINT, G_TYPE_NONE);
g_object_class_install_property (object_class, PROP_ID,
g_param_spec_int(PROP_ID_S, "ID for the menu item",
@@ -1349,3 +1366,22 @@ dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_a
return;
}
+
+/**
+ dbusmenu_menuitem_show_to_user:
+ @mi: #DbusmenuMenuitem to show
+ @timestamp: The time that the user requested it to be shown
+
+ Signals that this menu item should be shown to the user. If this is
+ server side the server will then take it and send it over the
+ bus.
+*/
+void
+dbusmenu_menuitem_show_to_user (DbusmenuMenuitem * mi, guint timestamp)
+{
+ g_return_if_fail(DBUSMENU_IS_MENUITEM(mi));
+
+ g_signal_emit(G_OBJECT(mi), signals[SHOW_TO_USER], 0, timestamp, TRUE);
+
+ return;
+}
diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h
index e17d851..9be938b 100644
--- a/libdbusmenu-glib/menuitem.h
+++ b/libdbusmenu-glib/menuitem.h
@@ -49,6 +49,7 @@ G_BEGIN_DECLS
#define DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED "child-moved"
#define DBUSMENU_MENUITEM_SIGNAL_REALIZED "realized"
#define DBUSMENU_MENUITEM_SIGNAL_REALIZED_ID (g_signal_lookup(DBUSMENU_MENUITEM_SIGNAL_REALIZED, DBUSMENU_TYPE_MENUITEM))
+#define DBUSMENU_MENUITEM_SIGNAL_SHOW_TO_USER "show-to-user"
#define DBUSMENU_MENUITEM_PROP_TYPE "type"
#define DBUSMENU_MENUITEM_PROP_VISIBLE "visible"
@@ -124,10 +125,7 @@ typedef void (*dbusmenu_menuitem_buildxml_slot_t) (DbusmenuMenuitem * mi, GPtrAr
* @buildxml: Virtual function that appends the strings required to represent this menu item in the menu XML file.
* @handle_event: This function is to override how events are handled by subclasses. Look at #dbusmenu_menuitem_handle_event for lots of good information.
* @send_about_to_show: Virtual function that notifies server that the client is about to show a menu.
- * @reserved1: Reserved for future use.
- * @reserved2: Reserved for future use.
- * @reserved3: Reserved for future use.
- * @reserved4: Reserved for future use.
+ * @show_to_user: Slot for #DbusmenuMenuitem::show-to-user.
*/
typedef struct _DbusmenuMenuitemClass DbusmenuMenuitemClass;
struct _DbusmenuMenuitemClass
@@ -147,7 +145,8 @@ struct _DbusmenuMenuitemClass
void (*handle_event) (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp);
void (*send_about_to_show) (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data);
- void (*reserved1) (void);
+ void (*show_to_user) (DbusmenuMenuitem * mi, guint timestamp, gpointer cb_data);
+ /* void (*reserved1) (void); */
/* void (*reserved2) (void); */
/* void (*reserved3) (void); */
/* void (*reserved4) (void); -- realized, realloc when bumping lib version */
@@ -192,6 +191,8 @@ void dbusmenu_menuitem_foreach (DbusmenuMenuitem * mi, void (*func) (DbusmenuMen
void dbusmenu_menuitem_handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp);
void dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data);
+void dbusmenu_menuitem_show_to_user (DbusmenuMenuitem * mi, guint timestamp);
+
/**
* SECTION:menuitem
* @short_description: A lowlevel represenation of a menuitem
diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c
index d1b4888..26e7a0d 100644
--- a/libdbusmenu-glib/server.c
+++ b/libdbusmenu-glib/server.c
@@ -410,7 +410,7 @@ menuitem_child_moved (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, guint
/* Called when a menu item emits its activated signal so it
gets passed across the bus. */
static void
-menuitem_activated (DbusmenuMenuitem * mi, guint timestamp, DbusmenuServer * server)
+menuitem_shown (DbusmenuMenuitem * mi, guint timestamp, DbusmenuServer * server)
{
g_signal_emit(G_OBJECT(server), signals[ITEM_ACTIVATION], 0, dbusmenu_menuitem_get_id(mi), timestamp, TRUE);
return;
@@ -425,7 +425,7 @@ menuitem_signals_create (DbusmenuMenuitem * mi, gpointer data)
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(menuitem_child_removed), data);
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_MOVED, G_CALLBACK(menuitem_child_moved), data);
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menuitem_property_changed), data);
- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(menuitem_activated), data);
+ g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_SHOW_TO_USER, G_CALLBACK(menuitem_shown), data);
return;
}
diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c
index da81544..44f95fe 100644
--- a/libdbusmenu-gtk/client.c
+++ b/libdbusmenu-gtk/client.c
@@ -434,6 +434,33 @@ new_menuitem (DbusmenuClient * client, DbusmenuMenuitem * mi, gpointer userdata)
return;
}
+/* Goes through the tree of items and ensure's that all the items
+ above us are also displayed. */
+static void
+activate_helper (GtkMenuShell * shell)
+{
+ if (shell == NULL) {
+ return;
+ }
+
+ if (GTK_IS_MENU(shell)) {
+ GtkWidget * attach = gtk_menu_get_attach_widget(GTK_MENU(shell));
+
+ if (attach != NULL) {
+ GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(attach));
+
+ if (parent != NULL) {
+ if (GTK_IS_MENU(parent)) {
+ activate_helper(GTK_MENU_SHELL(parent));
+ }
+ gtk_menu_shell_select_item(GTK_MENU_SHELL(parent), attach);
+ }
+ }
+ }
+
+ return;
+}
+
/* Signaled when we should show a menuitem at request of the application
that it is in. */
static void
@@ -445,16 +472,8 @@ item_activate (DbusmenuClient * client, DbusmenuMenuitem * mi, guint timestamp,
return;
}
- GtkWidget * parent = gtk_widget_get_parent(GTK_WIDGET(pmenu));
- if (parent == NULL) {
- g_warning("Activated menu item's menu doesn't have a parent? ID: %d", dbusmenu_menuitem_get_id(mi));
- return;
- }
-
- if (!gtk_widget_mnemonic_activate(parent, FALSE)) {
- g_warning("Unable to activate item: %d", dbusmenu_menuitem_get_id(mi));
- return;
- }
+ activate_helper(GTK_MENU_SHELL(pmenu));
+ gtk_menu_shell_select_first(GTK_MENU_SHELL(pmenu), FALSE);
return;
}
diff --git a/tests/test-gtk-submenu-client.c b/tests/test-gtk-submenu-client.c
index 2e1ef7a..ec46122 100644
--- a/tests/test-gtk-submenu-client.c
+++ b/tests/test-gtk-submenu-client.c
@@ -102,6 +102,12 @@ timer_func (gpointer data)
}
passed = TRUE;
+ return FALSE;
+}
+
+gboolean
+finished_func (gpointer user_data)
+{
g_main_loop_quit(mainloop);
return FALSE;
}
@@ -127,7 +133,8 @@ main (int argc, char ** argv)
gtk_window_set_title(GTK_WINDOW(window), "libdbusmenu-gtk test");
gtk_widget_show(window);
- g_timeout_add_seconds(1, timer_func, menuitem);
+ g_timeout_add_seconds(2, timer_func, menuitem);
+ g_timeout_add_seconds(6, finished_func, menuitem);
g_debug("Entering Mainloop");
mainloop = g_main_loop_new(NULL, FALSE);
diff --git a/tests/test-gtk-submenu-server.c b/tests/test-gtk-submenu-server.c
index ba3993e..11cede0 100644
--- a/tests/test-gtk-submenu-server.c
+++ b/tests/test-gtk-submenu-server.c
@@ -39,6 +39,17 @@ timer_func (gpointer data)
return FALSE;
}
+static gboolean
+show_item (gpointer pmi)
+{
+ DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(pmi);
+ g_debug("Showing item");
+
+ dbusmenu_menuitem_show_to_user(mi, 0);
+
+ return FALSE;
+}
+
DbusmenuMenuitem *
add_item(DbusmenuMenuitem * parent, const char * label)
{
@@ -81,12 +92,16 @@ main (int argc, char ** argv)
add_item(item, "1.2");
add_item(item, "1.3");
+ g_timeout_add_seconds(2, show_item, item);
+
item = add_item(root, "Folder 2");
add_item(item, "2.1");
add_item(item, "2.2");
add_item(item, "2.3");
- g_timeout_add_seconds(3, timer_func, NULL);
+ g_timeout_add_seconds(4, show_item, item);
+
+ g_timeout_add_seconds(6, timer_func, NULL);
mainloop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(mainloop);