Merge lp:~ted/libdbusmenu/lp784890 into lp:libdbusmenu/0.5
- lp784890
- Merge into trunk
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 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
DBus Menu Team | Pending | ||
Review via email: mp+64937@code.launchpad.net |
Commit message
Description of the change
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
1 | === modified file 'libdbusmenu-glib/menuitem.c' | |||
2 | --- libdbusmenu-glib/menuitem.c 2011-05-13 13:14:04 +0000 | |||
3 | +++ libdbusmenu-glib/menuitem.c 2011-06-17 03:55:50 +0000 | |||
4 | @@ -1694,25 +1694,20 @@ | |||
5 | 1694 | #endif | 1694 | #endif |
6 | 1695 | DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi); | 1695 | DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi); |
7 | 1696 | 1696 | ||
8 | 1697 | /* We need to keep a ref to the variant because the signal | ||
9 | 1698 | handler will drop the floating ref and then we'll be up | ||
10 | 1699 | a creek if we don't have our own later. */ | ||
11 | 1700 | if (variant != NULL) { | ||
12 | 1701 | g_variant_ref_sink(variant); | ||
13 | 1702 | } | ||
14 | 1703 | |||
15 | 1704 | gboolean handled = FALSE; | 1697 | gboolean handled = FALSE; |
16 | 1698 | if (variant == NULL) { | ||
17 | 1699 | variant = g_variant_new_int32(0); | ||
18 | 1700 | } | ||
19 | 1701 | |||
20 | 1702 | g_variant_ref_sink(variant); | ||
21 | 1703 | |||
22 | 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); |
23 | 1706 | 1705 | ||
24 | 1707 | if (!handled && class->handle_event != NULL) { | 1706 | if (!handled && class->handle_event != NULL) { |
25 | 1708 | class->handle_event(mi, name, variant, timestamp); | 1707 | class->handle_event(mi, name, variant, timestamp); |
26 | 1709 | } | 1708 | } |
27 | 1710 | 1709 | ||
33 | 1711 | if (variant != NULL) { | 1710 | g_variant_unref(variant); |
29 | 1712 | g_variant_unref(variant); | ||
30 | 1713 | } | ||
31 | 1714 | |||
32 | 1715 | return; | ||
34 | 1716 | } | 1711 | } |
35 | 1717 | 1712 | ||
36 | 1718 | /** | 1713 | /** |
37 | 1719 | 1714 | ||
38 | === modified file 'libdbusmenu-glib/server.c' | |||
39 | --- libdbusmenu-glib/server.c 2011-04-19 18:53:17 +0000 | |||
40 | +++ libdbusmenu-glib/server.c 2011-06-17 03:55:50 +0000 | |||
41 | @@ -952,11 +952,13 @@ | |||
42 | 952 | } | 952 | } |
43 | 953 | } | 953 | } |
44 | 954 | 954 | ||
45 | 955 | /* these are going to be standard references in all code paths and must be unrefed */ | ||
46 | 955 | GVariant * megadata[2]; | 956 | GVariant * megadata[2]; |
47 | 956 | gboolean gotsomething = FALSE; | 957 | gboolean gotsomething = FALSE; |
48 | 957 | 958 | ||
49 | 958 | if (item_init) { | 959 | if (item_init) { |
50 | 959 | megadata[0] = g_variant_builder_end(&itembuilder); | 960 | megadata[0] = g_variant_builder_end(&itembuilder); |
51 | 961 | g_variant_ref_sink(megadata[0]); | ||
52 | 960 | gotsomething = TRUE; | 962 | gotsomething = TRUE; |
53 | 961 | } else { | 963 | } else { |
54 | 962 | GError * error = NULL; | 964 | GError * error = NULL; |
55 | @@ -970,6 +972,7 @@ | |||
56 | 970 | 972 | ||
57 | 971 | if (removeitem_init) { | 973 | if (removeitem_init) { |
58 | 972 | megadata[1] = g_variant_builder_end(&removeitembuilder); | 974 | megadata[1] = g_variant_builder_end(&removeitembuilder); |
59 | 975 | g_variant_ref_sink(megadata[1]); | ||
60 | 973 | gotsomething = TRUE; | 976 | gotsomething = TRUE; |
61 | 974 | } else { | 977 | } else { |
62 | 975 | GError * error = NULL; | 978 | GError * error = NULL; |
63 | @@ -989,11 +992,11 @@ | |||
64 | 989 | "ItemsPropertiesUpdated", | 992 | "ItemsPropertiesUpdated", |
65 | 990 | g_variant_new_tuple(megadata, 2), | 993 | g_variant_new_tuple(megadata, 2), |
66 | 991 | NULL); | 994 | NULL); |
67 | 992 | } else { | ||
68 | 993 | g_variant_unref(megadata[0]); | ||
69 | 994 | g_variant_unref(megadata[1]); | ||
70 | 995 | } | 995 | } |
71 | 996 | 996 | ||
72 | 997 | g_variant_unref(megadata[0]); | ||
73 | 998 | g_variant_unref(megadata[1]); | ||
74 | 999 | |||
75 | 997 | /* Clean everything up */ | 1000 | /* Clean everything up */ |
76 | 998 | prop_array_teardown(priv->prop_array); | 1001 | prop_array_teardown(priv->prop_array); |
77 | 999 | priv->prop_array = NULL; | 1002 | priv->prop_array = NULL; |
78 | @@ -1194,9 +1197,11 @@ | |||
79 | 1194 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); | 1197 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); |
80 | 1195 | 1198 | ||
81 | 1196 | /* Input */ | 1199 | /* Input */ |
85 | 1197 | gint parent = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1200 | gint32 parent; |
86 | 1198 | gint recurse = g_variant_get_int32(g_variant_get_child_value(params, 1)); | 1201 | gint32 recurse; |
87 | 1199 | const gchar ** props = g_variant_get_strv(g_variant_get_child_value(params, 2), NULL); | 1202 | const gchar ** props; |
88 | 1203 | |||
89 | 1204 | g_variant_get(params, "(ii^a&s)", &parent, &recurse, &props); | ||
90 | 1200 | 1205 | ||
91 | 1201 | /* Output */ | 1206 | /* Output */ |
92 | 1202 | guint revision = priv->layout_revision; | 1207 | guint revision = priv->layout_revision; |
93 | @@ -1209,6 +1214,7 @@ | |||
94 | 1209 | items = dbusmenu_menuitem_build_variant(mi, props, recurse); | 1214 | items = dbusmenu_menuitem_build_variant(mi, props, recurse); |
95 | 1210 | } | 1215 | } |
96 | 1211 | } | 1216 | } |
97 | 1217 | g_free(props); | ||
98 | 1212 | 1218 | ||
99 | 1213 | /* What happens if we don't have anything? */ | 1219 | /* What happens if we don't have anything? */ |
100 | 1214 | if (items == NULL) { | 1220 | if (items == NULL) { |
101 | @@ -1255,9 +1261,11 @@ | |||
102 | 1255 | "There currently isn't a layout in this server"); | 1261 | "There currently isn't a layout in this server"); |
103 | 1256 | return; | 1262 | return; |
104 | 1257 | } | 1263 | } |
108 | 1258 | 1264 | ||
109 | 1259 | gint id = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1265 | gint32 id; |
110 | 1260 | const gchar * property = g_variant_get_string(g_variant_get_child_value(params, 1), NULL); | 1266 | const gchar * property; |
111 | 1267 | |||
112 | 1268 | g_variant_get(params, "(i&s)", &id, &property); | ||
113 | 1261 | 1269 | ||
114 | 1262 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); | 1270 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); |
115 | 1263 | 1271 | ||
116 | @@ -1299,7 +1307,8 @@ | |||
117 | 1299 | return; | 1307 | return; |
118 | 1300 | } | 1308 | } |
119 | 1301 | 1309 | ||
121 | 1302 | gint id = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1310 | gint32 id; |
122 | 1311 | g_variant_get(params, "(i)", &id); | ||
123 | 1303 | 1312 | ||
124 | 1304 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); | 1313 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); |
125 | 1305 | 1314 | ||
126 | @@ -1327,28 +1336,43 @@ | |||
127 | 1327 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); | 1336 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); |
128 | 1328 | 1337 | ||
129 | 1329 | if (priv->root == NULL) { | 1338 | if (priv->root == NULL) { |
130 | 1339 | /* Allow a request for just id 0 when root is null. Return no properties. | ||
131 | 1340 | So that a request always returns a valid structure no matter the | ||
132 | 1341 | state of the structure in the server. | ||
133 | 1342 | */ | ||
134 | 1330 | GVariant * idlist = g_variant_get_child_value(params, 0); | 1343 | GVariant * idlist = g_variant_get_child_value(params, 0); |
139 | 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) { |
140 | 1332 | GVariant * final = g_variant_parse(g_variant_type_new("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL); | 1345 | |
141 | 1333 | g_dbus_method_invocation_return_value(invocation, final); | 1346 | GVariant *id_v = g_variant_get_child_value(idlist, 0); |
142 | 1334 | return; | 1347 | gint32 id = g_variant_get_int32(id_v); |
143 | 1348 | g_variant_unref(id_v); | ||
144 | 1349 | |||
145 | 1350 | if (id == 0) { | ||
146 | 1351 | |||
147 | 1352 | GVariant * final = g_variant_parse(G_VARIANT_TYPE("(a(ia{sv}))"), "([(0, {})],)", NULL, NULL, NULL); | ||
148 | 1353 | g_dbus_method_invocation_return_value(invocation, final); | ||
149 | 1354 | g_variant_unref(final); | ||
150 | 1355 | } | ||
151 | 1356 | } else { | ||
152 | 1357 | |||
153 | 1358 | g_dbus_method_invocation_return_error(invocation, | ||
154 | 1359 | error_quark(), | ||
155 | 1360 | NO_VALID_LAYOUT, | ||
156 | 1361 | "There currently isn't a layout in this server"); | ||
157 | 1335 | } | 1362 | } |
163 | 1336 | 1363 | g_variant_unref(idlist); | |
159 | 1337 | g_dbus_method_invocation_return_error(invocation, | ||
160 | 1338 | error_quark(), | ||
161 | 1339 | NO_VALID_LAYOUT, | ||
162 | 1340 | "There currently isn't a layout in this server"); | ||
164 | 1341 | return; | 1364 | return; |
165 | 1342 | } | 1365 | } |
166 | 1343 | 1366 | ||
169 | 1344 | GVariantIter ids; | 1367 | GVariantIter *ids; |
170 | 1345 | g_variant_iter_init(&ids, g_variant_get_child_value(params, 0)); | 1368 | g_variant_get(params, "(aias)", &ids, NULL); |
171 | 1369 | /* TODO: implementation ignores propertyNames declared in XML */ | ||
172 | 1346 | 1370 | ||
173 | 1347 | GVariantBuilder builder; | 1371 | GVariantBuilder builder; |
174 | 1348 | gboolean builder_init = FALSE; | 1372 | gboolean builder_init = FALSE; |
175 | 1349 | 1373 | ||
178 | 1350 | gint id; | 1374 | gint32 id; |
179 | 1351 | while (g_variant_iter_next(&ids, "i", &id)) { | 1375 | while (g_variant_iter_loop(ids, "i", &id)) { |
180 | 1352 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); | 1376 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); |
181 | 1353 | if (mi == NULL) continue; | 1377 | if (mi == NULL) continue; |
182 | 1354 | 1378 | ||
183 | @@ -1364,7 +1388,7 @@ | |||
184 | 1364 | 1388 | ||
185 | 1365 | if (props == NULL) { | 1389 | if (props == NULL) { |
186 | 1366 | GError * error = NULL; | 1390 | GError * error = NULL; |
188 | 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); |
189 | 1368 | if (error != NULL) { | 1392 | if (error != NULL) { |
190 | 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); |
191 | 1370 | g_error_free(error); | 1394 | g_error_free(error); |
192 | @@ -1377,18 +1401,20 @@ | |||
193 | 1377 | 1401 | ||
194 | 1378 | g_variant_builder_add_value(&builder, mi_data); | 1402 | g_variant_builder_add_value(&builder, mi_data); |
195 | 1379 | } | 1403 | } |
196 | 1404 | g_variant_iter_free(ids); | ||
197 | 1380 | 1405 | ||
198 | 1406 | /* a standard reference that must be unrefed */ | ||
199 | 1381 | GVariant * ret = NULL; | 1407 | GVariant * ret = NULL; |
200 | 1382 | 1408 | ||
201 | 1383 | if (builder_init) { | 1409 | if (builder_init) { |
202 | 1384 | ret = g_variant_builder_end(&builder); | 1410 | ret = g_variant_builder_end(&builder); |
203 | 1411 | g_variant_ref_sink(ret); | ||
204 | 1385 | } else { | 1412 | } else { |
205 | 1386 | GError * error = NULL; | 1413 | GError * error = NULL; |
207 | 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); |
208 | 1388 | if (error != NULL) { | 1415 | if (error != NULL) { |
209 | 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); |
210 | 1390 | g_error_free(error); | 1417 | g_error_free(error); |
211 | 1391 | ret = NULL; | ||
212 | 1392 | } | 1418 | } |
213 | 1393 | } | 1419 | } |
214 | 1394 | 1420 | ||
215 | @@ -1396,6 +1422,7 @@ | |||
216 | 1396 | if (ret != NULL) { | 1422 | if (ret != NULL) { |
217 | 1397 | g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE); | 1423 | g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE); |
218 | 1398 | g_variant_builder_add_value(&builder, ret); | 1424 | g_variant_builder_add_value(&builder, ret); |
219 | 1425 | g_variant_unref(ret); | ||
220 | 1399 | final = g_variant_builder_end(&builder); | 1426 | final = g_variant_builder_end(&builder); |
221 | 1400 | } else { | 1427 | } else { |
222 | 1401 | g_warning("Error building property list, final variant is NULL"); | 1428 | g_warning("Error building property list, final variant is NULL"); |
223 | @@ -1434,7 +1461,8 @@ | |||
224 | 1434 | bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation) | 1461 | bus_get_children (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation) |
225 | 1435 | { | 1462 | { |
226 | 1436 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); | 1463 | DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); |
228 | 1437 | gint id = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1464 | gint32 id; |
229 | 1465 | g_variant_get(params, "(i)", &id); | ||
230 | 1438 | 1466 | ||
231 | 1439 | if (priv->root == NULL) { | 1467 | if (priv->root == NULL) { |
232 | 1440 | g_dbus_method_invocation_return_error(invocation, | 1468 | g_dbus_method_invocation_return_error(invocation, |
233 | @@ -1468,7 +1496,7 @@ | |||
234 | 1468 | ret = g_variant_new_tuple(&end, 1); | 1496 | ret = g_variant_new_tuple(&end, 1); |
235 | 1469 | } else { | 1497 | } else { |
236 | 1470 | GError * error = NULL; | 1498 | GError * error = NULL; |
238 | 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); |
239 | 1472 | if (error != NULL) { | 1500 | if (error != NULL) { |
240 | 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); |
241 | 1474 | g_error_free(error); | 1502 | g_error_free(error); |
242 | @@ -1520,32 +1548,35 @@ | |||
243 | 1520 | return; | 1548 | return; |
244 | 1521 | } | 1549 | } |
245 | 1522 | 1550 | ||
247 | 1523 | gint id = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1551 | gint32 id; |
248 | 1552 | gchar *etype; | ||
249 | 1553 | GVariant *data; | ||
250 | 1554 | guint32 ts; | ||
251 | 1555 | |||
252 | 1556 | g_variant_get(params, "(isvu)", &id, &etype, &data, &ts); | ||
253 | 1557 | |||
254 | 1524 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); | 1558 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); |
255 | 1525 | 1559 | ||
256 | 1526 | if (mi == NULL) { | 1560 | if (mi == NULL) { |
257 | 1561 | |||
258 | 1527 | g_dbus_method_invocation_return_error(invocation, | 1562 | g_dbus_method_invocation_return_error(invocation, |
259 | 1528 | error_quark(), | 1563 | error_quark(), |
260 | 1529 | INVALID_MENUITEM_ID, | 1564 | INVALID_MENUITEM_ID, |
261 | 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", |
262 | 1531 | id); | 1566 | id); |
280 | 1532 | return; | 1567 | g_free(etype); |
281 | 1533 | } | 1568 | g_variant_unref(data); |
282 | 1534 | 1569 | ||
283 | 1535 | idle_event_t * event_data = g_new0(idle_event_t, 1); | 1570 | } else { |
284 | 1536 | event_data->mi = mi; | 1571 | |
285 | 1537 | g_object_ref(event_data->mi); | 1572 | idle_event_t * event_data = g_new0(idle_event_t, 1); |
286 | 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); |
287 | 1539 | event_data->timestamp = g_variant_get_uint32(g_variant_get_child_value(params, 3)); | 1574 | event_data->eventid = etype; |
288 | 1540 | event_data->variant = g_variant_get_child_value(params, 2); | 1575 | event_data->timestamp = ts; |
289 | 1541 | 1576 | event_data->variant = data; /* give away our reference */ | |
290 | 1542 | if (g_variant_is_of_type(event_data->variant, G_VARIANT_TYPE_VARIANT)) { | 1577 | |
291 | 1543 | event_data->variant = g_variant_get_variant(event_data->variant); | 1578 | g_timeout_add(0, event_local_handler, event_data); |
292 | 1544 | } | 1579 | } |
276 | 1545 | |||
277 | 1546 | g_variant_ref_sink(event_data->variant); | ||
278 | 1547 | |||
279 | 1548 | g_timeout_add(0, event_local_handler, event_data); | ||
293 | 1549 | 1580 | ||
294 | 1550 | g_dbus_method_invocation_return_value(invocation, NULL); | 1581 | g_dbus_method_invocation_return_value(invocation, NULL); |
295 | 1551 | return; | 1582 | return; |
296 | @@ -1565,7 +1596,8 @@ | |||
297 | 1565 | return; | 1596 | return; |
298 | 1566 | } | 1597 | } |
299 | 1567 | 1598 | ||
301 | 1568 | gint id = g_variant_get_int32(g_variant_get_child_value(params, 0)); | 1599 | gint32 id; |
302 | 1600 | g_variant_get(params, "(i)", &id); | ||
303 | 1569 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); | 1601 | DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id); |
304 | 1570 | 1602 | ||
305 | 1571 | if (mi == NULL) { | 1603 | if (mi == NULL) { |
306 | 1572 | 1604 | ||
307 | === modified file 'libdbusmenu-gtk/parser.c' | |||
308 | --- libdbusmenu-gtk/parser.c 2011-05-31 21:37:28 +0000 | |||
309 | +++ libdbusmenu-gtk/parser.c 2011-06-17 03:55:50 +0000 | |||
310 | @@ -873,6 +873,8 @@ | |||
311 | 873 | g_idle_add ((GSourceFunc)recreate_menu_item_in_idle_cb, child); | 873 | g_idle_add ((GSourceFunc)recreate_menu_item_in_idle_cb, child); |
312 | 874 | } | 874 | } |
313 | 875 | } | 875 | } |
314 | 876 | |||
315 | 877 | g_value_unset (&prop_value); | ||
316 | 876 | } | 878 | } |
317 | 877 | 879 | ||
318 | 878 | static void | 880 | static void |