39 #include <glib/gi18n.h> 50 struct _RemminaAppletMenuPriv {
72 g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT);
75 g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT);
94 GtkWidget **groupmenuitem)
100 widget = gtk_menu_item_new_with_label(group);
101 gtk_widget_show(widget);
103 g_object_set_data_full(G_OBJECT(widget),
"group", g_strdup(group), g_free);
104 g_object_set_data(G_OBJECT(widget),
"count", GINT_TO_POINTER(0));
106 *groupmenuitem = widget;
109 gtk_menu_shell_append(GTK_MENU_SHELL(menu), widget);
111 gtk_menu_shell_insert(GTK_MENU_SHELL(menu), widget, position);
114 submenu = gtk_menu_new();
115 gtk_widget_show(submenu);
116 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), submenu);
123 TRACE_CALL(__func__);
127 cnt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),
"count")) + 1;
128 g_object_set_data(G_OBJECT(widget),
"count", GINT_TO_POINTER(cnt));
129 s = g_strdup_printf(
"%s (%i)", (
const gchar*)g_object_get_data(G_OBJECT(widget),
"group"), cnt);
130 gtk_menu_item_set_label(GTK_MENU_ITEM(widget), s);
136 TRACE_CALL(__func__);
142 TRACE_CALL(__func__);
144 GtkWidget *groupmenuitem;
145 GtkMenuItem *submenuitem;
146 gchar *s, *p1, *p2, *mstr;
147 GList *childs, *child;
150 submenu = GTK_WIDGET(menu);
151 s = g_strdup(menuitem->
group);
153 p2 = p1 ? strchr(p1,
'/') : NULL;
156 while (p1 && p1[0]) {
157 groupmenuitem = NULL;
158 childs = gtk_container_get_children(GTK_CONTAINER(submenu));
160 for (child = g_list_first(childs); child; child = g_list_next(child)) {
161 if (!GTK_IS_MENU_ITEM(child->data))
164 submenuitem = GTK_MENU_ITEM(child->data);
165 if (gtk_menu_item_get_submenu(submenuitem)) {
166 mstr = (gchar*)g_object_get_data(G_OBJECT(submenuitem),
"group");
167 if (g_strcmp0(p1, mstr) == 0) {
169 submenu = gtk_menu_item_get_submenu(submenuitem);
170 groupmenuitem = GTK_WIDGET(submenuitem);
175 if (strcoll(p1, mstr) < 0) {
192 if (groupmenuitem && !menu->
priv->hide_count) {
196 p2 = p1 ? strchr(p1,
'/') : NULL;
202 childs = gtk_container_get_children(GTK_CONTAINER(submenu));
204 for (child = g_list_first(childs); child; child = g_list_next(child)) {
205 if (!GTK_IS_MENU_ITEM(child->data))
208 submenuitem = GTK_MENU_ITEM(child->data);
209 if (gtk_menu_item_get_submenu(submenuitem))
211 if (!REMMINA_IS_APPLET_MENU_ITEM(submenuitem))
213 if (strcoll(menuitem->
name, REMMINA_APPLET_MENU_ITEM(submenuitem)->name) <= 0) {
214 gtk_menu_shell_insert(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem), position);
219 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem));
228 TRACE_CALL(__func__);
231 menu = REMMINA_APPLET_MENU(g_object_new(REMMINA_TYPE_APPLET_MENU, NULL));
233 return GTK_WIDGET(menu);
238 TRACE_CALL(__func__);
239 menu->
priv->hide_count = hide_count;
244 TRACE_CALL(__func__);
246 gchar filename[MAX_PATH_LEN];
248 gchar *remmina_data_dir;
255 dir = g_dir_open(remmina_data_dir, 0, NULL);
258 while ((name = g_dir_read_name(dir)) != NULL) {
259 if (!g_str_has_suffix(name,
".remmina"))
261 g_snprintf(filename,
sizeof(filename),
"%s/%s", remmina_data_dir, name);
264 if (menuitem != NULL) {
266 gtk_widget_show(menuitem);
273 menuitem = gtk_separator_menu_item_new();
274 gtk_widget_show(menuitem);
276 gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem);
278 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
281 g_free(remmina_data_dir);
gchar * remmina_file_get_datadir(void)
Return datadir_path from pref or first found data dir as per XDG specs.
gboolean applet_new_ontop