40 #include <glib/gi18n.h> 51 struct _RemminaAppletMenuPriv {
73 g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT);
76 g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT);
95 GtkWidget **groupmenuitem)
101 widget = gtk_menu_item_new_with_label(group);
102 gtk_widget_show(widget);
104 g_object_set_data_full(G_OBJECT(widget),
"group", g_strdup(group), g_free);
105 g_object_set_data(G_OBJECT(widget),
"count", GINT_TO_POINTER(0));
107 *groupmenuitem = widget;
110 gtk_menu_shell_append(GTK_MENU_SHELL(menu), widget);
112 gtk_menu_shell_insert(GTK_MENU_SHELL(menu), widget, position);
115 submenu = gtk_menu_new();
116 gtk_widget_show(submenu);
117 gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), submenu);
124 TRACE_CALL(__func__);
128 cnt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),
"count")) + 1;
129 g_object_set_data(G_OBJECT(widget),
"count", GINT_TO_POINTER(cnt));
130 s = g_strdup_printf(
"%s (%i)", (
const gchar*)g_object_get_data(G_OBJECT(widget),
"group"), cnt);
131 gtk_menu_item_set_label(GTK_MENU_ITEM(widget), s);
137 TRACE_CALL(__func__);
143 TRACE_CALL(__func__);
145 GtkWidget *groupmenuitem;
146 GtkMenuItem *submenuitem;
147 gchar *s, *p1, *p2, *mstr;
148 GList *childs, *child;
151 submenu = GTK_WIDGET(menu);
152 s = g_strdup(menuitem->
group);
154 p2 = p1 ? strchr(p1,
'/') : NULL;
157 while (p1 && p1[0]) {
158 groupmenuitem = NULL;
159 childs = gtk_container_get_children(GTK_CONTAINER(submenu));
161 for (child = g_list_first(childs); child; child = g_list_next(child)) {
162 if (!GTK_IS_MENU_ITEM(child->data))
165 submenuitem = GTK_MENU_ITEM(child->data);
166 if (gtk_menu_item_get_submenu(submenuitem)) {
167 mstr = (gchar*)g_object_get_data(G_OBJECT(submenuitem),
"group");
168 if (g_strcmp0(p1, mstr) == 0) {
170 submenu = gtk_menu_item_get_submenu(submenuitem);
171 groupmenuitem = GTK_WIDGET(submenuitem);
176 if (strcoll(p1, mstr) < 0) {
193 if (groupmenuitem && !menu->
priv->hide_count) {
197 p2 = p1 ? strchr(p1,
'/') : NULL;
203 childs = gtk_container_get_children(GTK_CONTAINER(submenu));
205 for (child = g_list_first(childs); child; child = g_list_next(child)) {
206 if (!GTK_IS_MENU_ITEM(child->data))
209 submenuitem = GTK_MENU_ITEM(child->data);
210 if (gtk_menu_item_get_submenu(submenuitem))
212 if (!REMMINA_IS_APPLET_MENU_ITEM(submenuitem))
214 if (strcoll(menuitem->
name, REMMINA_APPLET_MENU_ITEM(submenuitem)->name) <= 0) {
215 gtk_menu_shell_insert(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem), position);
220 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem));
229 TRACE_CALL(__func__);
232 menu = REMMINA_APPLET_MENU(g_object_new(REMMINA_TYPE_APPLET_MENU, NULL));
234 return GTK_WIDGET(menu);
239 TRACE_CALL(__func__);
240 menu->
priv->hide_count = hide_count;
245 TRACE_CALL(__func__);
247 gchar filename[MAX_PATH_LEN];
249 gchar *remmina_data_dir;
253 dir = g_dir_open(remmina_data_dir, 0, NULL);
256 while ((name = g_dir_read_name(dir)) != NULL) {
257 if (!g_str_has_suffix(name,
".remmina"))
259 g_snprintf(filename,
sizeof(filename),
"%s/%s", remmina_data_dir, name);
262 if (menuitem != NULL) {
264 gtk_widget_show(menuitem);
269 g_free(remmina_data_dir);
gchar * remmina_file_get_datadir(void)