aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Kerr <charles.kerr@canonical.com>2013-06-20 15:44:36 +0000
committerTarmac <Unknown>2013-06-20 15:44:36 +0000
commite8778d504b94e4ced9edb1f18dbae14c2e4c5387 (patch)
tree4b20999b080df3d79f73033b6ec82745a5f718cf
parentfe87e9ce239632185946c47e41d117a571de5fb8 (diff)
parent0e81d534211cd7e0b5cbff8f3d4211705d7c6a63 (diff)
downloadlibdbusmenu-e8778d504b94e4ced9edb1f18dbae14c2e4c5387.tar.gz
libdbusmenu-e8778d504b94e4ced9edb1f18dbae14c2e4c5387.tar.bz2
libdbusmenu-e8778d504b94e4ced9edb1f18dbae14c2e4c5387.zip
Fix a bug caused by keeping signals connected to menuitems that we're not using anymore. Fixes: https://bugs.launchpad.net/bugs/1154701.
Approved by PS Jenkins bot, Ted Gould.
-rw-r--r--libdbusmenu-gtk/parser.c82
-rw-r--r--tests/Makefile.am444
-rw-r--r--tests/test-glib-simple-items.c2
-rw-r--r--tests/test-gtk-remove-server.c118
-rw-r--r--tests/test-gtk-reorder-server.c2
5 files changed, 299 insertions, 349 deletions
diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c
index 6244b07..b09e984 100644
--- a/libdbusmenu-gtk/parser.c
+++ b/libdbusmenu-gtk/parser.c
@@ -273,10 +273,47 @@ dbusmenu_gtk_parse_menu_structure (GtkWidget * widget)
DbusmenuMenuitem *
dbusmenu_gtk_parse_get_cached_item (GtkWidget * widget)
{
- if (!GTK_IS_MENU_ITEM(widget)) {
- return NULL;
- }
- return DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM));
+ GObject * o = NULL;
+ DbusmenuMenuitem * ret = NULL;
+
+ if (GTK_IS_MENU_ITEM (widget))
+ o = g_object_get_data (G_OBJECT(widget), CACHED_MENUITEM);
+
+ if (o && DBUSMENU_IS_MENUITEM(o))
+ ret = DBUSMENU_MENUITEM (o);
+
+ return ret;
+}
+
+/* remove our dbusmenuitem's hooks to a GtkWidget,
+ such as when either of them are being destroyed */
+static void
+disconnect_from_widget (GtkWidget * widget)
+{
+ ParserData * pdata = parser_data_get_from_widget (widget);
+
+ if (pdata && pdata->widget)
+ {
+ GObject * o;
+
+ g_assert (pdata->widget == widget);
+
+ /* stop listening to signals from the widget */
+ o = G_OBJECT (pdata->widget);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_notify_handler_id);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_add_handler_id);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_accel_handler_id);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_toggle_handler_id);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_visible_handler_id);
+ dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_screen_changed_handler_id);
+
+ /* clear the menuitem's widget pointer */
+ g_object_remove_weak_pointer (o, (gpointer*)&pdata->widget);
+ pdata->widget = NULL;
+
+ /* clear the widget's menuitem pointer */
+ g_object_set_data(o, CACHED_MENUITEM, NULL);
+ }
}
static void
@@ -297,17 +334,7 @@ parser_data_free (ParserData * pdata)
}
if (pdata->widget != NULL) {
- GObject * o = G_OBJECT(pdata->widget);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_notify_handler_id);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_add_handler_id);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_accel_handler_id);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_toggle_handler_id);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_visible_handler_id);
- dbusmenu_gtk_clear_signal_handler (o, &pdata->widget_screen_changed_handler_id);
- g_object_remove_weak_pointer(o, (gpointer*)&pdata->widget);
-
- /* since the DbusmenuMenuitem is being destroyed, uncache it from the GtkWidget */
- g_object_steal_data(o, CACHED_MENUITEM);
+ disconnect_from_widget (pdata->widget);
}
if (pdata->settings != NULL) {
@@ -379,7 +406,7 @@ new_menuitem (GtkWidget * widget)
pdata->widget = widget;
g_object_add_weak_pointer(G_OBJECT (widget), (gpointer*)&pdata->widget);
- g_object_set_data(G_OBJECT(widget), CACHED_MENUITEM, item);
+ g_object_set_data_full(G_OBJECT(widget), CACHED_MENUITEM, g_object_ref(item), g_object_unref);
return item;
}
@@ -1387,24 +1414,19 @@ item_inserted_cb (GtkContainer *menu,
/* A child item was removed from a menu we're watching. */
static void
-item_removed_cb (GtkContainer *menu, GtkWidget *widget, gpointer data)
+item_removed_cb (GtkContainer *parent_w, GtkWidget *child_w, gpointer data)
{
- gpointer pmi = g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM);
- if (pmi == NULL) {
- return;
- }
+ DbusmenuMenuitem * child_mi;
- DbusmenuMenuitem * child = DBUSMENU_MENUITEM(pmi);
-
- pmi = g_object_get_data(G_OBJECT(menu), CACHED_MENUITEM);
- if (pmi == NULL) {
- return;
- }
+ if ((child_mi = dbusmenu_gtk_parse_get_cached_item (child_w)))
+ {
+ DbusmenuMenuitem * parent_mi;
- DbusmenuMenuitem * parent = DBUSMENU_MENUITEM(pmi);
+ if ((parent_mi = dbusmenu_gtk_parse_get_cached_item (GTK_WIDGET(parent_w))))
+ dbusmenu_menuitem_child_delete (parent_mi, child_mi);
- dbusmenu_menuitem_child_delete(parent, child);
- return;
+ disconnect_from_widget (child_w);
+ }
}
static gboolean
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 69b9f26..c1918eb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,4 +1,3 @@
-
DBUS_RUNNER=dbus-test-runner --max-wait=0
CLEANFILES=
@@ -29,6 +28,7 @@ TESTS += \
test-gtk-label \
test-gtk-shortcut \
test-gtk-reorder \
+ test-gtk-remove \
test-gtk-parser-test
# Not working with GTK3 and a critical grab that is in
# the GTK3 code.
@@ -81,6 +81,7 @@ check_PROGRAMS += \
test-gtk-label-server \
test-gtk-shortcut-client \
test-gtk-shortcut-server \
+ test-gtk-remove-server \
test-gtk-reorder-server \
test-gtk-submenu-server \
test-gtk-submenu-client \
@@ -92,6 +93,22 @@ XVFB_RUN=". $(srcdir)/run-xvfb.sh"
# for the GI tests, prefer/use the typelibs from the local build tree
TESTS_ENVIRONMENT = env GI_TYPELIB_PATH=$(top_builddir)/libdbusmenu-glib:$(top_builddir)/libdbusmenu-gtk:$(GI_TYPELIB_PATH)
+############################################
+# Shared vars for the dbusmenu-glib tests
+############################################
+
+DBUSMENU_GLIB_TEST_CFLAGS = \
+ -Wall -Werror \
+ -DG_DISABLE_DEPRECATED \
+ -I$(top_srcdir) \
+ $(DBUSMENUTESTS_CFLAGS) \
+ $(DBUSMENUGLIB_CFLAGS)
+
+DBUSMENU_GLIB_TEST_LDADD = \
+ $(top_builddir)/libdbusmenu-glib/libdbusmenu-glib.la \
+ $(DBUSMENUGLIB_LIBS) \
+ $(DBUSMENUTESTS_LIBS)
+
######################
# JSON Loader lib
######################
@@ -113,18 +130,11 @@ libdbusmenu_jsonloader_la_LDFLAGS = \
-export-symbols-regex "^[^_].*"
libdbusmenu_jsonloader_la_CFLAGS = \
- $(DBUSMENUGLIB_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- -I $(srcdir)/.. \
- -Wall \
- -Werror \
- -DG_DISABLE_DEPRECATED \
+ $(DBUSMENU_GLIB_TEST_CFLAGS) \
-DG_LOG_DOMAIN="\"LIBDBUSMENU-JSONLOADER\""
libdbusmenu_jsonloader_la_LIBADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+ $(DBUSMENU_GLIB_TEST_LDADD)
pkgconfig_DATA = dbusmenu-jsonloader-0.4.pc
pkgconfigdir = $(libdir)/pkgconfig
@@ -133,16 +143,9 @@ pkgconfigdir = $(libdir)/pkgconfig
# Test GLib server
######################
-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)
+glib_server_nomenu_SOURCES = glib-server-nomenu.c
+glib_server_nomenu_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+glib_server_nomenu_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test Glib Layout
@@ -155,29 +158,13 @@ test-glib-layout: test-glib-layout-client test-glib-layout-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-glib-layout-client --task-name Client --task ./test-glib-layout-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_glib_layout_server_SOURCES = \
- test-glib-layout.h \
- test-glib-layout-server.c
+test_glib_layout_server_SOURCES = test-glib-layout.h test-glib-layout-server.c
+test_glib_layout_server_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_layout_server_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_layout_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_layout_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
-
-test_glib_layout_client_SOURCES = \
- test-glib-layout.h \
- 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)
+test_glib_layout_client_SOURCES = test-glib-layout.h test-glib-layout-client.c
+test_glib_layout_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_layout_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test Glib Events
@@ -190,27 +177,13 @@ test-glib-events: test-glib-events-client test-glib-events-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-glib-events-client --task-name Client --task ./test-glib-events-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_glib_events_server_SOURCES = \
- test-glib-events-server.c
-
-test_glib_events_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_events_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
-
-test_glib_events_client_SOURCES = \
- test-glib-events-client.c
+test_glib_events_server_SOURCES = test-glib-events-server.c
+test_glib_events_server_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_events_server_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_events_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_events_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_events_client_SOURCES = test-glib-events-client.c
+test_glib_events_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_events_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
################################
# Test Glib Events No Grouping
@@ -223,16 +196,9 @@ test-glib-events-nogroup: test-glib-events-nogroup-client test-glib-events-serve
@echo $(DBUS_RUNNER) --task ./test-glib-events-nogroup-client --task-name Client --task ./test-glib-events-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_glib_events_nogroup_client_SOURCES = \
- test-glib-events-nogroup-client.c
-
-test_glib_events_nogroup_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_events_nogroup_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_events_nogroup_client_SOURCES = test-glib-events-nogroup-client.c
+test_glib_events_nogroup_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_events_nogroup_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test JSON
@@ -253,30 +219,17 @@ test_json_server_SOURCES = \
test-json-server.c
test_json_server_CFLAGS = \
- -I $(srcdir)/.. \
- -I $(srcdir) \
- $(DBUSMENUGLIB_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUTESTSVALGRIND_CFLAGS) \
- -Wall -Werror
+ $(DBUSMENU_GLIB_TEST_CFLAGS) \
+ -I$(srcdir) \
+ $(DBUSMENUTESTSVALGRIND_CFLAGS)
test_json_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
libdbusmenu-jsonloader.la \
- $(DBUSMENUTESTS_LIBS) \
- $(DBUSMENUGLIB_LIBS)
+ $(DBUSMENU_GLIB_TEST_LDADD)
-test_json_client_SOURCES = \
- test-json-client.c
-
-test_json_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_json_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUTESTS_LIBS) \
- $(DBUSMENUGLIB_LIBS)
+test_json_client_SOURCES = test-json-client.c
+test_json_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_json_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
#########################
# Test JSON Instructions
@@ -308,29 +261,13 @@ test-glib-submenu: test-glib-submenu-client test-glib-submenu-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-glib-submenu-client --task-name Client --task ./test-glib-submenu-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_glib_submenu_server_SOURCES = \
- test-glib-submenu.h \
- test-glib-submenu-server.c
-
-test_glib_submenu_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
+test_glib_submenu_server_SOURCES = test-glib-submenu.h test-glib-submenu-server.c
+test_glib_submenu_server_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_submenu_server_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_submenu_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
-
-test_glib_submenu_client_SOURCES = \
- test-glib-submenu.h \
- test-glib-submenu-client.c
-
-test_glib_submenu_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_submenu_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_submenu_client_SOURCES = test-glib-submenu.h test-glib-submenu-client.c
+test_glib_submenu_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_submenu_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test Glib Object
@@ -345,16 +282,9 @@ test-glib-objects-test: test-glib-objects Makefile.am
@echo $(DBUS_RUNNER) --task gtester --task-name test --parameter --verbose --parameter -k --parameter -o --parameter $(OBJECT_XML_REPORT) --parameter ./test-glib-objects >> $@
@chmod +x $@
-test_glib_objects_SOURCES = \
- test-glib-objects.c
-
-test_glib_objects_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_objects_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_objects_SOURCES = test-glib-objects.c
+test_glib_objects_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_objects_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
DISTCLEANFILES += $(OBJECT_XML_REPORT)
@@ -369,29 +299,13 @@ test-glib-properties: test-glib-properties-client test-glib-properties-server Ma
@echo $(DBUS_RUNNER) --task ./test-glib-properties-client --task-name Client --task ./test-glib-properties-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_glib_properties_server_SOURCES = \
- test-glib-properties.h \
- test-glib-properties-server.c
-
-test_glib_properties_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_properties_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_properties_server_SOURCES = test-glib-properties.h test-glib-properties-server.c
+test_glib_properties_server_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_properties_server_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_properties_client_SOURCES = \
- test-glib-properties.h \
- test-glib-properties-client.c
-
-test_glib_properties_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_properties_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_properties_client_SOURCES = test-glib-properties.h test-glib-properties-client.c
+test_glib_properties_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_properties_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test Glib Proxy
@@ -409,58 +323,40 @@ test-glib-proxy: test-glib-proxy-client test-glib-proxy-server test-glib-proxy-p
@echo --task ./test-glib-proxy-proxy --parameter test.proxy.last_proxy --parameter test.proxy.server --task-name Proxy05 --ignore-return >> $@
@chmod +x $@
-test_glib_proxy_server_SOURCES = \
- test-glib-proxy.h \
- test-glib-proxy-server.c
-
-test_glib_proxy_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_proxy_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
-
-test_glib_proxy_client_SOURCES = \
- test-glib-proxy.h \
- test-glib-proxy-client.c
-
-test_glib_proxy_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_proxy_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_proxy_server_SOURCES = test-glib-proxy.h test-glib-proxy-server.c
+test_glib_proxy_server_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_proxy_server_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_proxy_proxy_SOURCES = \
- test-glib-proxy.h \
- test-glib-proxy-proxy.c
+test_glib_proxy_client_SOURCES = test-glib-proxy.h test-glib-proxy-client.c
+test_glib_proxy_client_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_proxy_client_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_proxy_proxy_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_glib_proxy_proxy_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+test_glib_proxy_proxy_SOURCES = test-glib-proxy.h test-glib-proxy-proxy.c
+test_glib_proxy_proxy_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_proxy_proxy_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
#########################
# Test Glib Simple Items
#########################
-test_glib_simple_items_SOURCES = \
- test-glib-simple-items.c
+test_glib_simple_items_SOURCES = test-glib-simple-items.c
+test_glib_simple_items_CFLAGS = $(DBUSMENU_GLIB_TEST_CFLAGS)
+test_glib_simple_items_LDADD = $(DBUSMENU_GLIB_TEST_LDADD)
-test_glib_simple_items_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
+EXTRA_DIST += test-glib-simple-items.py
-test_glib_simple_items_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- $(DBUSMENUGLIB_LIBS)
+############################################
+# Shared vars for the dbusmenu-gtk tests
+############################################
-EXTRA_DIST += test-glib-simple-items.py
+DBUSMENU_GTK_TEST_CFLAGS = \
+ $(DBUSMENUGTK_CFLAGS) \
+ $(DBUSMENU_GLIB_TEST_CFLAGS)
+
+DBUSMENU_GTK_TEST_LDADD = \
+ $(top_builddir)/libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
+ $(DBUSMENUGTK_LIBS) \
+ $(DBUSMENU_GLIB_TEST_LDADD)
######################
# Test GTK Object
@@ -476,21 +372,9 @@ test-gtk-objects-test: test-gtk-objects Makefile.am
@echo $(DBUS_RUNNER) --task gtester --task-name test --parameter --verbose --parameter -k --parameter -o --parameter $(GTK_OBJECT_XML_REPORT) --parameter ./test-gtk-objects >> $@
@chmod +x $@
-test_gtk_objects_SOURCES = \
- test-gtk-objects.c
-
-test_gtk_objects_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) \
- $(DBUSMENUGTK_CFLAGS) \
- -DSRCDIR="\"$(srcdir)\"" \
- -Wall -Werror
-
-test_gtk_objects_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGLIB_LIBS) \
- $(DBUSMENUGTK_LIBS)
+test_gtk_objects_SOURCES = test-gtk-objects.c
+test_gtk_objects_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS) -DSRCDIR="\"$(srcdir)\""
+test_gtk_objects_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
DISTCLEANFILES += $(GTK_OBJECT_XML_REPORT)
@@ -508,21 +392,9 @@ test-gtk-parser-test: test-gtk-parser Makefile.am
@echo gtester --verbose -k -o $(GTK_PARSER_XML_REPORT) ./test-gtk-parser >> $@
@chmod +x $@
-test_gtk_parser_SOURCES = \
- test-gtk-parser.c
-
-test_gtk_parser_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGLIB_CFLAGS) \
- $(DBUSMENUGTK_CFLAGS) \
- -DSRCDIR="\"$(srcdir)\"" \
- -Wall -Werror
-
-test_gtk_parser_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGLIB_LIBS) \
- $(DBUSMENUGTK_LIBS)
+test_gtk_parser_SOURCES = test-gtk-parser.c
+test_gtk_parser_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS) -DSRCDIR="\"$(srcdir)\""
+test_gtk_parser_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
DISTCLEANFILES += $(GTK_PARSER_XML_REPORT)
@@ -538,36 +410,13 @@ test-gtk-label: test-gtk-label-client test-gtk-label-server test-gtk-label.json
@echo $(DBUS_RUNNER) --task ./test-gtk-label-client --task-name Client --task ./test-gtk-label-server --parameter $(srcdir)/test-gtk-label.json --task-name Server --ignore-return >> $@
@chmod +x $@
-test_gtk_label_server_SOURCES = \
- test-gtk-label-server.c
-
-test_gtk_label_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_label_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- libdbusmenu-jsonloader.la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
-
-test_gtk_label_client_SOURCES = \
- test-gtk-label-client.c
+test_gtk_label_server_SOURCES = test-gtk-label-server.c
+test_gtk_label_server_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_label_server_LDADD = libdbusmenu-jsonloader.la $(DBUSMENU_GTK_TEST_LDADD)
-test_gtk_label_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_label_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+test_gtk_label_client_SOURCES = test-gtk-label-client.c
+test_gtk_label_client_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_label_client_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
#########################
# Test GTK Shortcut
@@ -581,35 +430,13 @@ test-gtk-shortcut: test-gtk-shortcut-client test-gtk-shortcut-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-gtk-shortcut-client --task-name Client --task ./test-gtk-shortcut-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_gtk_shortcut_server_SOURCES = \
- test-gtk-shortcut-server.c
+test_gtk_shortcut_server_SOURCES = test-gtk-shortcut-server.c
+test_gtk_shortcut_server_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_shortcut_server_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
-test_gtk_shortcut_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_shortcut_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
-
-test_gtk_shortcut_client_SOURCES = \
- test-gtk-shortcut-client.c
-
-test_gtk_shortcut_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_shortcut_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+test_gtk_shortcut_client_SOURCES = test-gtk-shortcut-client.c
+test_gtk_shortcut_client_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_shortcut_client_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
#########################
# Test GTK Shortcut Python
@@ -627,6 +454,22 @@ EXTRA_DIST += test-gtk-shortcut-client.py
CLEANFILES += test-gtk-shortcut-client.pyc
#########################
+# Test GTK Remove
+#########################
+
+test-gtk-remove: test-gtk-remove-server Makefile.am
+ @echo "#!/bin/bash" > $@
+ @echo export UBUNTU_MENUPROXY="" >> $@
+ @echo export G_DEBUG=fatal_criticals >> $@
+ @echo $(XVFB_RUN) >> $@
+ @echo $(DBUS_RUNNER) --task ./test-gtk-remove-server --parameter $(srcdir)/test-gtk-label.json --task-name Server --ignore-return >> $@
+ @chmod +x $@
+
+test_gtk_remove_server_SOURCES = test-gtk-remove-server.c
+test_gtk_remove_server_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_remove_server_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
+
+#########################
# Test GTK Reorder
#########################
@@ -638,20 +481,9 @@ test-gtk-reorder: test-gtk-label-client test-gtk-reorder-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-gtk-label-client --task-name Client --task ./test-gtk-reorder-server --parameter $(srcdir)/test-gtk-label.json --task-name Server --ignore-return >> $@
@chmod +x $@
-test_gtk_reorder_server_SOURCES = \
- test-gtk-reorder-server.c
-
-test_gtk_reorder_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_reorder_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+test_gtk_reorder_server_SOURCES = test-gtk-reorder-server.c
+test_gtk_reorder_server_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_reorder_server_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
#########################
# Test GTK Submenu
@@ -665,35 +497,13 @@ test-gtk-submenu: test-gtk-submenu-client test-gtk-submenu-server Makefile.am
@echo $(DBUS_RUNNER) --task ./test-gtk-submenu-client --task-name Client --task ./test-gtk-submenu-server --task-name Server --ignore-return >> $@
@chmod +x $@
-test_gtk_submenu_server_SOURCES = \
- test-gtk-submenu-server.c
-
-test_gtk_submenu_server_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_submenu_server_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+test_gtk_submenu_server_SOURCES = test-gtk-submenu-server.c
+test_gtk_submenu_server_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_submenu_server_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
-test_gtk_submenu_client_SOURCES = \
- test-gtk-submenu-client.c
-
-test_gtk_submenu_client_CFLAGS = \
- -I $(srcdir)/.. \
- $(DBUSMENUGTK_CFLAGS) \
- $(DBUSMENUTESTS_CFLAGS) \
- $(DBUSMENUGLIB_CFLAGS) -Wall -Werror
-
-test_gtk_submenu_client_LDADD = \
- ../libdbusmenu-glib/libdbusmenu-glib.la \
- ../libdbusmenu-gtk/libdbusmenu-gtk$(VER).la \
- $(DBUSMENUGTK_LIBS) \
- $(DBUSMENUTESTS_LIBS)
+test_gtk_submenu_client_SOURCES = test-gtk-submenu-client.c
+test_gtk_submenu_client_CFLAGS = $(DBUSMENU_GTK_TEST_CFLAGS)
+test_gtk_submenu_client_LDADD = $(DBUSMENU_GTK_TEST_LDADD)
#########################
# Test Mago
diff --git a/tests/test-glib-simple-items.c b/tests/test-glib-simple-items.c
index 1fff8bf..f4086a4 100644
--- a/tests/test-glib-simple-items.c
+++ b/tests/test-glib-simple-items.c
@@ -25,7 +25,7 @@ dummy_users (DbusmenuMenuitem * root) {
static gboolean
quititall (gpointer data)
{
- g_main_quit(mainloop);
+ g_main_loop_quit(mainloop);
return FALSE;
}
diff --git a/tests/test-gtk-remove-server.c b/tests/test-gtk-remove-server.c
new file mode 100644
index 0000000..0655fc0
--- /dev/null
+++ b/tests/test-gtk-remove-server.c
@@ -0,0 +1,118 @@
+/*
+ Confirm that no warnings/criticals get generated by including
+ multiple add/removes in a match w/o waiting on the mainloop to iterate.
+
+ Copyright 2013 Canonical Ltd.
+
+ Original sample code by Drew Bliss <drewb@valvesoftware.com>
+ Modified for automatic testing by Charles Kerr <charles.kerr@canonical.com>
+ */
+
+#include <stdlib.h> /* exit() */
+#include <gtk/gtk.h>
+#include <libdbusmenu-glib/server.h>
+#include <libdbusmenu-gtk/menu.h>
+#include <libdbusmenu-gtk/parser.h>
+
+static GMainLoop * loop = NULL;
+static GtkWidget * top_gtk = NULL;
+static DbusmenuMenuitem * top_dbusmenu = NULL;
+static DbusmenuServer * menuservice = NULL;
+
+static void
+rebuild_menu (void)
+{
+ GList * l;
+ GList * children;
+ int i;
+ const int n = 10;
+ static int count = 0;
+
+ if (top_gtk == NULL)
+ {
+ top_gtk = gtk_menu_new ();
+ gtk_widget_show (top_gtk);
+ top_dbusmenu = dbusmenu_gtk_parse_menu_structure (top_gtk);
+ menuservice = dbusmenu_server_new ("/org/ayatana/NotificationItem/test/Menu");
+ dbusmenu_server_set_root (menuservice, top_dbusmenu);
+ }
+
+ // remove all the previous children
+ children = gtk_container_get_children (GTK_CONTAINER(top_gtk));
+ for (l=children; l!=NULL; l=l->next)
+ gtk_widget_destroy (GTK_WIDGET (l->data));
+
+ // add a handful of new children
+ for (i=0; i<n; ++i)
+ {
+ char buf[80];
+ GtkWidget * child;
+
+ g_snprintf (buf, sizeof(buf), "Test item %d", ++count);
+ child = gtk_menu_item_new_with_label (buf);
+ gtk_menu_shell_append (GTK_MENU_SHELL(top_gtk), child);
+ gtk_widget_show (child);
+ }
+}
+
+/*
+ * Periodically rebuild the menu.
+ *
+ * After we've looped a couple of times with only one rebuild,
+ * attempt to reproduce the bug Drew reported by rebuilding multiple
+ * times before returning control to the main loop.
+ *
+ * If we survive doing this a handful of times without encountering
+ * a g_warning or g_critical, pass the test.
+ */
+static gint
+on_timer (gpointer unused G_GNUC_UNUSED)
+{
+ static int iteration = 0;
+
+ ++iteration;
+
+ if (iteration > 5)
+ {
+ g_main_loop_quit (loop);
+ return G_SOURCE_REMOVE;
+ }
+
+ if (iteration <= 2)
+ {
+ rebuild_menu ();
+ }
+ else
+ {
+ int i;
+
+ for (i=0; i<iteration; ++i)
+ rebuild_menu ();
+ }
+
+ return G_SOURCE_CONTINUE;
+}
+
+static void
+warning_counter (const gchar * log_domain,
+ GLogLevelFlags log_level G_GNUC_UNUSED,
+ const gchar * message,
+ gpointer user_data G_GNUC_UNUSED)
+{
+ g_message ("Failing the test due to warning: %s %s", log_domain, message);
+ exit (EXIT_FAILURE);
+}
+
+int
+main (int argc, char ** argv)
+{
+ g_log_set_handler ("LIBDBUSMENU-GLIB", G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL, warning_counter, NULL);
+
+
+ gtk_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+ g_timeout_add (200, on_timer, NULL);
+ g_main_loop_run (loop);
+
+ return 0;
+}
diff --git a/tests/test-gtk-reorder-server.c b/tests/test-gtk-reorder-server.c
index d0fba82..560820e 100644
--- a/tests/test-gtk-reorder-server.c
+++ b/tests/test-gtk-reorder-server.c
@@ -52,7 +52,7 @@ static gboolean
timer_func (gpointer data)
{
if (test == NUMBER_TESTS) {
- g_main_quit(mainloop);
+ g_main_loop_quit(mainloop);
return FALSE;
}