static void connect_to_items_changed (GMenuModel *model, GCallback callback, gpointer data) { gint i; GMenuModel *m; GMenuLinkIter *iter; if (!g_object_get_data (G_OBJECT (model), "handler-connected")) { g_signal_connect (model, "items-changed", callback, data); g_object_set_data (G_OBJECT (model), "handler-connected", GINT_TO_POINTER (1)); } for (i = 0; i < g_menu_model_get_n_items (model); i++) { iter = g_menu_model_iterate_item_links (model, i); while (g_menu_link_iter_next (iter)) { m = g_menu_link_iter_get_value (iter); connect_to_items_changed (m, callback, data); g_object_unref (m); } g_object_unref (iter); } }
static void add_accelerators_from_menu (GtkWindow *window, GtkAccelGroup *accel_group, GMenuModel *model) { int i; GMenuLinkIter *iter; const char *key; GMenuModel *m; for (i = 0; i < g_menu_model_get_n_items (model); i++) { add_accelerators_from_menu_item (window, accel_group, model, i); iter = g_menu_model_iterate_item_links (model, i); while (g_menu_link_iter_get_next (iter, &key, &m)) { add_accelerators_from_menu (window, accel_group, m); g_object_unref (m); } g_object_unref (iter); } }
static void extract_accels_from_menu(GMenuModel * model, GActionMap * action_map, GtkAccelGroup * accel_group) { gint i, n = g_menu_model_get_n_items(model); GMenuLinkIter *iter; const gchar *key; GMenuModel *m; for (i = 0; i < n; i++) { extract_accel_from_menu_item(model, i, action_map, accel_group); iter = g_menu_model_iterate_item_links(model, i); while (g_menu_link_iter_get_next(iter, &key, &m)) { extract_accels_from_menu(m, action_map, accel_group); g_object_unref(m); } g_object_unref(iter); } }
static GMenuExporterLink * g_menu_exporter_menu_create_links (GMenuExporterMenu *menu, gint position) { GMenuExporterLink *list = NULL; GMenuLinkIter *iter; const char *name; GMenuModel *model; iter = g_menu_model_iterate_item_links (menu->model, position); while (g_menu_link_iter_get_next (iter, &name, &model)) { GMenuExporterGroup *group; GMenuExporterLink *tmp; /* keep sections in the same group, but create new groups * otherwise */ if (!g_str_equal (name, "section")) group = g_menu_exporter_create_group (g_menu_exporter_group_get_exporter (menu->group)); else group = menu->group; tmp = g_slice_new (GMenuExporterLink); tmp->name = g_strconcat (":", name, NULL); tmp->menu = g_menu_exporter_group_add_menu (group, model); tmp->next = list; list = tmp; g_object_unref (model); } g_object_unref (iter); return list; }
static GString * g_menu_markup_print_string (GString *string, GMenuModel *model, gint indent, gint tabstop) { gboolean need_nl = FALSE; gint i, n; if G_UNLIKELY (string == NULL) string = g_string_new (NULL); n = g_menu_model_get_n_items (model); for (i = 0; i < n; i++) { GMenuAttributeIter *attr_iter; GMenuLinkIter *link_iter; GString *contents; GString *attrs; attr_iter = g_menu_model_iterate_item_attributes (model, i); link_iter = g_menu_model_iterate_item_links (model, i); contents = g_string_new (NULL); attrs = g_string_new (NULL); while (g_menu_attribute_iter_next (attr_iter)) { const char *name = g_menu_attribute_iter_get_name (attr_iter); GVariant *value = g_menu_attribute_iter_get_value (attr_iter); if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) { gchar *str; str = g_markup_printf_escaped (" %s='%s'", name, g_variant_get_string (value, NULL)); g_string_append (attrs, str); g_free (str); } else { gchar *printed; gchar *str; const gchar *type; printed = g_variant_print (value, TRUE); type = g_variant_type_peek_string (g_variant_get_type (value)); str = g_markup_printf_escaped ("<attribute name='%s' type='%s'>%s</attribute>\n", name, type, printed); indent_string (contents, indent + tabstop); g_string_append (contents, str); g_free (printed); g_free (str); } g_variant_unref (value); } g_object_unref (attr_iter); while (g_menu_link_iter_next (link_iter)) { const gchar *name = g_menu_link_iter_get_name (link_iter); GMenuModel *menu = g_menu_link_iter_get_value (link_iter); gchar *str; if (contents->str[0]) g_string_append_c (contents, '\n'); str = g_markup_printf_escaped ("<link name='%s'>\n", name); indent_string (contents, indent + tabstop); g_string_append (contents, str); g_free (str); g_menu_markup_print_string (contents, menu, indent + 2 * tabstop, tabstop); indent_string (contents, indent + tabstop); g_string_append (contents, "</link>\n"); g_object_unref (menu); } g_object_unref (link_iter); if (contents->str[0]) { indent_string (string, indent); g_string_append_printf (string, "<item%s>\n", attrs->str); g_string_append (string, contents->str); indent_string (string, indent); g_string_append (string, "</item>\n"); need_nl = TRUE; } else { if (need_nl) g_string_append_c (string, '\n'); indent_string (string, indent); g_string_append_printf (string, "<item%s/>\n", attrs->str); need_nl = FALSE; } g_string_free (contents, TRUE); g_string_free (attrs, TRUE); } return string; }