#include #include #include #include #include #include #include #include static void set_props (DbusmenuMenuitem * mi, JsonObject * node) { if (node == NULL) return; GList * members = NULL; for (members = json_object_get_members(node); members != NULL; members = g_list_next(members)) { const gchar * member = members->data; if (!g_strcmp0(member, "id")) { continue; } if (!g_strcmp0(member, "submenu")) { continue; } JsonNode * lnode = json_object_get_member(node, member); if (JSON_NODE_TYPE(lnode) != JSON_NODE_VALUE) { continue; } dbusmenu_menuitem_property_set(mi, member, json_node_get_string(lnode)); } return; } static DbusmenuMenuitem * layout2menuitem (JsonNode * inlayout) { if (inlayout == NULL) return NULL; if (JSON_NODE_TYPE(inlayout) != JSON_NODE_OBJECT) return NULL; JsonObject * layout = json_node_get_object(inlayout); DbusmenuMenuitem * local = NULL; if (json_object_has_member(layout, "id")) { JsonNode * node = json_object_get_member(layout, "id"); g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_VALUE, NULL); local = dbusmenu_menuitem_new_with_id(json_node_get_int(node)); } else { local = dbusmenu_menuitem_new(); } set_props(local, layout); if (json_object_has_member(layout, "submenu")) { JsonNode * node = json_object_get_member(layout, "submenu"); g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_ARRAY, local); JsonArray * array = json_node_get_array(node); guint count; for (count = 0; count < json_array_get_length(array); count++) { DbusmenuMenuitem * child = layout2menuitem(json_array_get_element(array, count)); if (child != NULL) { dbusmenu_menuitem_child_append(local, child); } } } /* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */ return local; } static JsonArray * root_array = NULL; static guint layouton = 0; static DbusmenuServer * server = NULL; static GMainLoop * mainloop = NULL; static gboolean timer_func (gpointer data) { if (layouton == json_array_get_length(root_array)) { g_debug("Completed %d layouts", layouton); g_main_loop_quit(mainloop); return FALSE; } g_debug("Updating to Layout %d", layouton); dbusmenu_server_set_root(server, layout2menuitem(json_array_get_element(root_array, layouton))); layouton++; return TRUE; } int main (int argc, char ** argv) { g_type_init(); JsonParser * parser = json_parser_new(); GError * error = NULL; if (!json_parser_load_from_file(parser, argv[1], &error)) { g_debug("Failed parsing file %s because: %s", argv[1], error->message); return 1; } JsonNode * root_node = json_parser_get_root(parser); if (JSON_NODE_TYPE(root_node) != JSON_NODE_ARRAY) { g_debug("Root node is not an array, fail. It's an: %s", json_node_type_name(root_node)); return 1; } root_array = json_node_get_array(root_node); g_debug("%d layouts in test description '%s'", json_array_get_length(root_array), argv[1]); DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); guint nameret = 0; if (!org_freedesktop_DBus_request_name(bus_proxy, "glib.label.test", 0, &nameret, &error)) { g_error("Unable to call to request name"); return 1; } if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { g_error("Unable to get name"); return 1; } server = dbusmenu_server_new("/org/test"); timer_func(NULL); g_timeout_add_seconds(15, timer_func, NULL); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); g_debug("Quiting"); return 0; }