Merge lp:~ted/libdbusmenu/lp784890 into lp:libdbusmenu/0.5

Proposed by Ted Gould
Status: Merged
Merged at revision: 309
Proposed branch: lp:~ted/libdbusmenu/lp784890
Merge into: lp:libdbusmenu/0.5
Diff against target: 318 lines (+88/-59)
3 files modified
libdbusmenu-glib/menuitem.c (+7/-12)
libdbusmenu-glib/server.c (+79/-47)
libdbusmenu-gtk/parser.c (+2/-0)
To merge this branch: bzr merge lp:~ted/libdbusmenu/lp784890
Reviewer Review Type Date Requested Status
DBus Menu Team Pending
Review via email: mp+64937@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libdbusmenu-glib/menuitem.c'
--- libdbusmenu-glib/menuitem.c 2011-05-13 13:14:04 +0000
+++ libdbusmenu-glib/menuitem.c 2011-06-17 03:55:50 +0000
@@ -1694,25 +1694,20 @@
1694 #endif1694 #endif
1695 DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi);1695 DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi);
16961696
1697 /* We need to keep a ref to the variant because the signal
1698 handler will drop the floating ref and then we'll be up
1699 a creek if we don't have our own later. */
1700 if (variant != NULL) {
1701 g_variant_ref_sink(variant);
1702 }
1703
1704 gboolean handled = FALSE;1697 gboolean handled = FALSE;
1698 if (variant == NULL) {
1699 variant = g_variant_new_int32(0);
1700 }
1701
1702 g_variant_ref_sink(variant);
1703
1705 g_signal_emit(G_OBJECT(mi), signals[EVENT], g_quark_from_string(name), name, variant, timestamp, &handled);1704 g_signal_emit(G_OBJECT(mi), signals[EVENT], g_quark_from_string(name), name, variant, timestamp, &handled);
17061705
1707 if (!handled && class->handle_event != NULL) {1706 if (!handled && class->handle_event != NULL) {
1708 class->handle_event(mi, name, variant, timestamp);1707 class->handle_event(mi, name, variant, timestamp);
1709 }1708 }
17101709
1711 if (variant != NULL) {1710 g_variant_unref(variant);
1712 g_variant_unref(variant);
1713 }
1714
1715 return;
1716}1711}
17171712
1718/**1713/**
17191714
=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c 2011-04-19 18:53:17 +0000
+++ libdbusmenu-glib/server.c 2011-06-17 03:55:50 +0000
@@ -952,11 +952,13 @@
952 }952 }
953 }953 }
954954
955 /* these are going to be standard references in all code paths and must be unrefed */
955 GVariant * megadata[2];956 GVariant * megadata[2];
956 gboolean gotsomething = FALSE;957 gboolean gotsomething = FALSE;
957958
958 if (item_init) {959 if (item_init) {
959 megadata[0] = g_variant_builder_end(&itembuilder);960 megadata[0] = g_variant_builder_end(&itembuilder);
961 g_variant_ref_sink(megadata[0]);
960 gotsomething = TRUE;962 gotsomething = TRUE;
961 } else {963 } else {
962 GError * error = NULL;964 GError * error = NULL;
@@ -970,6 +972,7 @@
970972
971 if (removeitem_init) {973 if (removeitem_init) {
972 megadata[1] = g_variant_builder_end(&removeitembuilder);974 megadata[1] = g_variant_builder_end(&removeitembuilder);
975 g_variant_ref_sink(megadata[1]);
973 gotsomething = TRUE;976 gotsomething = TRUE;
974 } else {977 } else {
975 GError * error = NULL;978 GError * error = NULL;
@@ -989,11 +992,11 @@
989 "ItemsPropertiesUpdated",992 "ItemsPropertiesUpdated",
990 g_variant_new_tuple(megadata, 2),993 g_variant_new_tuple(megadata, 2),
991 NULL);994 NULL);
992 } else {
993 g_variant_unref(megadata[0]);
994 g_variant_unref(megadata[1]);
995 }995 }
996996
997 g_variant_unref(megadata[0]);
998 g_variant_unref(megadata[1]);
999
997 /* Clean everything up */1000 /* Clean everything up */
998 prop_array_teardown(priv->prop_array);1001 prop_array_teardown(priv->prop_array);
999 priv->prop_array = NULL;1002 priv->prop_array = NULL;
@@ -1194,9 +1197,11 @@
1194 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);1197 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
11951198
1196 /* Input */1199 /* Input */
1197 gint parent = g_variant_get_int32(g_variant_get_child_value(params, 0));1200 gint32 parent;
1198 gint recurse = g_variant_get_int32(g_variant_get_child_value(params, 1));1201 gint32 recurse;
1199 const gchar ** props = g_variant_get_strv(g_variant_get_child_value(params, 2), NULL);1202 const gchar ** props;
1203
1204 g_variant_get(params, "(ii^a&s)", &parent, &recurse, &props);
12001205
1201 /* Output */1206 /* Output */
1202 guint revision = priv->layout_revision;1207 guint revision = priv->layout_revision;
@@ -1209,6 +1214,7 @@
1209 items = dbusmenu_menuitem_build_variant(mi, props, recurse);1214 items = dbusmenu_menuitem_build_variant(mi, props, recurse);
1210 }1215 }
1211 }1216 }
1217 g_free(props);
12121218
1213 /* What happens if we don't have anything? */1219 /* What happens if we don't have anything? */
1214 if (items == NULL) {1220 if (items == NULL) {
@@ -1255,9 +1261,11 @@
1255 "There currently isn't a layout in this server");1261 "There currently isn't a layout in this server");
1256 return;1262 return;
1257 }1263 }
1258 1264
1259 gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));1265 gint32 id;
1260 const gchar * property = g_variant_get_string(g_variant_get_child_value(params, 1), NULL);1266 const gchar * property;
1267
1268 g_variant_get(params, "(i&s)", &id, &property);
12611269
1262 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1270 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
12631271
@@ -1299,7 +1307,8 @@
1299 return;1307 return;
1300 }1308 }
13011309
1302 gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));1310 gint32 id;
1311 g_variant_get(params, "(i)", &id);
13031312
1304 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1313 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
13051314
@@ -1327,28 +1336,43 @@
1327 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);1336 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
13281337
1329 if (priv->root == NULL) {1338 if (priv->root == NULL) {
1339 /* Allow a request for just id 0 when root is null. Return no properties.
1340 So that a request always returns a valid structure no matter the
1341 state of the structure in the server.
1342 */
1330 GVariant * idlist = g_variant_get_child_value(params, 0);1343 GVariant * idlist = g_variant_get_child_value(params, 0);
1331 if (g_variant_n_children(idlist) == 1 && g_variant_get_int32(g_variant_get_child_value(idlist, 0)) == 0) {1344 if (g_variant_n_children(idlist) == 1) {
1332 GVariant * final = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);1345
1333 g_dbus_method_invocation_return_value(invocation, final);1346 GVariant *id_v = g_variant_get_child_value(idlist, 0);
1334 return;1347 gint32 id = g_variant_get_int32(id_v);
1348 g_variant_unref(id_v);
1349
1350 if (id == 0) {
1351
1352 GVariant * final = g_variant_parse(G_VARIANT_TYPE("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL);
1353 g_dbus_method_invocation_return_value(invocation, final);
1354 g_variant_unref(final);
1355 }
1356 } else {
1357
1358 g_dbus_method_invocation_return_error(invocation,
1359 error_quark(),
1360 NO_VALID_LAYOUT,
1361 "There currently isn't a layout in this server");
1335 }1362 }
13361363 g_variant_unref(idlist);
1337 g_dbus_method_invocation_return_error(invocation,
1338 error_quark(),
1339 NO_VALID_LAYOUT,
1340 "There currently isn't a layout in this server");
1341 return;1364 return;
1342 }1365 }
13431366
1344 GVariantIter ids;1367 GVariantIter *ids;
1345 g_variant_iter_init(&ids, g_variant_get_child_value(params, 0));1368 g_variant_get(params, "(aias)", &ids, NULL);
1369 /* TODO: implementation ignores propertyNames declared in XML */
13461370
1347 GVariantBuilder builder;1371 GVariantBuilder builder;
1348 gboolean builder_init = FALSE;1372 gboolean builder_init = FALSE;
13491373
1350 gint id;1374 gint32 id;
1351 while (g_variant_iter_next(&ids, "i", &id)) {1375 while (g_variant_iter_loop(ids, "i", &id)) {
1352 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1376 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
1353 if (mi == NULL) continue;1377 if (mi == NULL) continue;
13541378
@@ -1364,7 +1388,7 @@
13641388
1365 if (props == NULL) {1389 if (props == NULL) {
1366 GError * error = NULL;1390 GError * error = NULL;
1367 props = g_variant_parse(g_variant_type_new("a{sv}"), "{}", NULL, NULL, &error);1391 props = g_variant_parse(G_VARIANT_TYPE("a{sv}"), "{}", NULL, NULL, &error);
1368 if (error != NULL) {1392 if (error != NULL) {
1369 g_warning("Unable to parse '{}' as a 'a{sv}': %s", error->message);1393 g_warning("Unable to parse '{}' as a 'a{sv}': %s", error->message);
1370 g_error_free(error);1394 g_error_free(error);
@@ -1377,18 +1401,20 @@
13771401
1378 g_variant_builder_add_value(&builder, mi_data);1402 g_variant_builder_add_value(&builder, mi_data);
1379 }1403 }
1404 g_variant_iter_free(ids);
13801405
1406 /* a standard reference that must be unrefed */
1381 GVariant * ret = NULL;1407 GVariant * ret = NULL;
1382 1408
1383 if (builder_init) {1409 if (builder_init) {
1384 ret = g_variant_builder_end(&builder);1410 ret = g_variant_builder_end(&builder);
1411 g_variant_ref_sink(ret);
1385 } else {1412 } else {
1386 GError * error = NULL;1413 GError * error = NULL;
1387 ret = g_variant_parse(g_variant_type_new("a(ia{sv})"), "[]", NULL, NULL, NULL);1414 ret = g_variant_parse(G_VARIANT_TYPE("a(ia{sv})"), "[]", NULL, NULL, &error);
1388 if (error != NULL) {1415 if (error != NULL) {
1389 g_warning("Unable to parse '[]' as a 'a(ia{sv})': %s", error->message);1416 g_warning("Unable to parse '[]' as a 'a(ia{sv})': %s", error->message);
1390 g_error_free(error);1417 g_error_free(error);
1391 ret = NULL;
1392 }1418 }
1393 }1419 }
13941420
@@ -1396,6 +1422,7 @@
1396 if (ret != NULL) {1422 if (ret != NULL) {
1397 g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);1423 g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
1398 g_variant_builder_add_value(&builder, ret);1424 g_variant_builder_add_value(&builder, ret);
1425 g_variant_unref(ret);
1399 final = g_variant_builder_end(&builder);1426 final = g_variant_builder_end(&builder);
1400 } else {1427 } else {
1401 g_warning("Error building property list, final variant is NULL");1428 g_warning("Error building property list, final variant is NULL");
@@ -1434,7 +1461,8 @@
1434bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation)1461bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation)
1435{1462{
1436 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);1463 DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
1437 gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));1464 gint32 id;
1465 g_variant_get(params, "(i)", &id);
14381466
1439 if (priv->root == NULL) {1467 if (priv->root == NULL) {
1440 g_dbus_method_invocation_return_error(invocation,1468 g_dbus_method_invocation_return_error(invocation,
@@ -1468,7 +1496,7 @@
1468 ret = g_variant_new_tuple(&end, 1);1496 ret = g_variant_new_tuple(&end, 1);
1469 } else {1497 } else {
1470 GError * error = NULL;1498 GError * error = NULL;
1471 ret = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);1499 ret = g_variant_parse(G_VARIANT_TYPE("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, &error);
1472 if (error != NULL) {1500 if (error != NULL) {
1473 g_warning("Unable to parse '([(0, {})],)' as a '(a(ia{sv}))': %s", error->message);1501 g_warning("Unable to parse '([(0, {})],)' as a '(a(ia{sv}))': %s", error->message);
1474 g_error_free(error);1502 g_error_free(error);
@@ -1520,32 +1548,35 @@
1520 return;1548 return;
1521 }1549 }
15221550
1523 gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));1551 gint32 id;
1552 gchar *etype;
1553 GVariant *data;
1554 guint32 ts;
1555
1556 g_variant_get(params, "(isvu)", &id, &etype, &data, &ts);
1557
1524 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1558 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
15251559
1526 if (mi == NULL) {1560 if (mi == NULL) {
1561
1527 g_dbus_method_invocation_return_error(invocation,1562 g_dbus_method_invocation_return_error(invocation,
1528 error_quark(),1563 error_quark(),
1529 INVALID_MENUITEM_ID,1564 INVALID_MENUITEM_ID,
1530 "The ID supplied %d does not refer to a menu item we have",1565 "The ID supplied %d does not refer to a menu item we have",
1531 id);1566 id);
1532 return;1567 g_free(etype);
1533 }1568 g_variant_unref(data);
15341569
1535 idle_event_t * event_data = g_new0(idle_event_t, 1);1570 } else {
1536 event_data->mi = mi;1571
1537 g_object_ref(event_data->mi);1572 idle_event_t * event_data = g_new0(idle_event_t, 1);
1538 event_data->eventid = g_strdup(g_variant_get_string(g_variant_get_child_value(params, 1), NULL));1573 event_data->mi = g_object_ref(mi);
1539 event_data->timestamp = g_variant_get_uint32(g_variant_get_child_value(params, 3));1574 event_data->eventid = etype;
1540 event_data->variant = g_variant_get_child_value(params, 2);1575 event_data->timestamp = ts;
15411576 event_data->variant = data; /* give away our reference */
1542 if (g_variant_is_of_type(event_data->variant, G_VARIANT_TYPE_VARIANT)) {1577
1543 event_data->variant = g_variant_get_variant(event_data->variant);1578 g_timeout_add(0, event_local_handler, event_data);
1544 }1579 }
1545
1546 g_variant_ref_sink(event_data->variant);
1547
1548 g_timeout_add(0, event_local_handler, event_data);
15491580
1550 g_dbus_method_invocation_return_value(invocation, NULL);1581 g_dbus_method_invocation_return_value(invocation, NULL);
1551 return;1582 return;
@@ -1565,7 +1596,8 @@
1565 return;1596 return;
1566 }1597 }
15671598
1568 gint id = g_variant_get_int32(g_variant_get_child_value(params, 0));1599 gint32 id;
1600 g_variant_get(params, "(i)", &id);
1569 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);1601 DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
15701602
1571 if (mi == NULL) {1603 if (mi == NULL) {
15721604
=== modified file 'libdbusmenu-gtk/parser.c'
--- libdbusmenu-gtk/parser.c 2011-05-31 21:37:28 +0000
+++ libdbusmenu-gtk/parser.c 2011-06-17 03:55:50 +0000
@@ -873,6 +873,8 @@
873 g_idle_add ((GSourceFunc)recreate_menu_item_in_idle_cb, child);873 g_idle_add ((GSourceFunc)recreate_menu_item_in_idle_cb, child);
874 } 874 }
875 }875 }
876
877 g_value_unset (&prop_value);
876}878}
877879
878static void880static void

Subscribers

People subscribed via source and target branches