nautilus: add submenu support
[git-cheetah/kirill.git] / nautilus / menu.c
blob52cf9ae1fa20b017e1bef21ce5479c43c01f00d0
1 /* menu.c
3 * Here we implement the functions which feed the cheetah menuengine
4 * for Nautilus.
6 * Copyright (C) Heiko Voigt, 2009
8 */
10 #include "../common/git-compat-util.h"
11 #include "../common/debug.h"
12 #include "../common/strbuf.h"
13 #include "../common/menuengine.h"
14 #include "../common/cheetahmenu.h"
15 #include "plugin.h"
16 #include "menu.h"
18 static struct git_data git_data;
20 BOOL build_item(struct git_data *me, const struct menu_item *item,
21 void *platform)
23 char *item_name;
24 char shortcut_key;
25 char item_reference_string[1024];
26 NautilusMenuItem *one_menu_item;
27 struct nautilus_menu_data *nautilus_data = platform;
29 if (!platform)
30 return TRUE;
32 item_name = strdup(item->string);
34 shortcut_key = parse_and_remove_shortcuts(item_name);
36 debug_git("Adding entry: %s", item_name);
38 snprintf(item_reference_string, 1024, "GitExtension::%s", item_name);
39 item_reference_string[1023] = '\0';
40 one_menu_item = nautilus_menu_item_new(item_reference_string,
41 item_name,
42 item->helptext,
43 NULL /* icon name */);
44 g_signal_connect(one_menu_item, "activate",
45 G_CALLBACK(invoke_command), nautilus_data->provider);
47 g_object_set_data((GObject *) one_menu_item, "git_extension_id",
48 (void *)next_active_item);
49 g_object_set_data((GObject *) one_menu_item,
50 "git_extension_git_data", me);
52 if (nautilus_data->submenu)
53 nautilus_menu_append_item(nautilus_data->submenu, one_menu_item);
54 else
55 nautilus_data->menu_items = g_list_append(nautilus_data->menu_items,
56 one_menu_item);
58 free(item_name);
59 return TRUE;
62 BOOL build_separator(struct git_data *me, const struct menu_item *item,
63 void *platform)
65 /* not implemented, yet */
66 return FALSE;
69 void reset_platform(void *platform)
71 /* nautilus does not need to reset anything */
74 void *start_submenu(struct git_data *me, const struct menu_item *item,
75 void *platform)
77 struct nautilus_menu_data *nautilus_data = platform;
79 NautilusMenuItem *submenu_item;
80 NautilusMenu *submenu;
81 char name[512], *item_name = strdup(item->string), shortcut_key;
83 shortcut_key = parse_and_remove_shortcuts(item_name);
85 snprintf(name, sizeof(name), "GitExtension::%s", item_name);
86 name[sizeof(name) - 1] = '\0';
88 debug_git("creating submenu item '%s' '%s' '%s'", item_name, name, item->helptext);
89 submenu_item = nautilus_menu_item_new(
90 name,
91 item_name,
92 item->helptext,
93 NULL);
95 free(item_name);
97 submenu = nautilus_menu_new();
99 g_object_set_data((GObject *)submenu, "git_menu_parent",
100 (void *)nautilus_data->submenu);
102 nautilus_menu_item_set_submenu(submenu_item, submenu);
104 if (nautilus_data->submenu)
105 nautilus_menu_append_item(nautilus_data->submenu, submenu_item);
106 else
107 nautilus_data->menu_items = g_list_append(nautilus_data->menu_items,
108 submenu_item);
110 nautilus_data->submenu = submenu;
112 return platform;
115 void end_submenu(void *parent, void *submenu)
117 struct nautilus_menu_data *nautilus_data = parent;
118 nautilus_data->submenu = (NautilusMenu *)g_object_get_data(
119 (GObject *)nautilus_data->submenu,
120 "git_menu_parent");
123 static inline char *get_local_filename_from_fileinfo(char *filename, int n,
124 NautilusFileInfo *file)
126 char *name;
127 char locator[MAX_PATH];
129 name = nautilus_file_info_get_uri(file);
131 /* find out if this is a local file */
132 strncpy(locator, name, MAX_PATH);
133 locator[7] = '\0';
134 if (!strcmp(locator, "file://")) {
135 strncpy(filename, name+7, n);
136 filename[n-1] = '\0';
138 else
139 filename=NULL;
141 g_free(name);
142 return filename;
145 GList *git_extension_get_file_items(NautilusMenuProvider *provider,
146 GtkWidget *window,
147 GList *files)
149 GList *l;
151 if (!files)
152 return NULL;
154 struct nautilus_menu_data nautilus_data = {
155 provider,
156 NULL,
157 NULL
161 git_data.name[0] = '\0';
162 for (l = files; l != NULL; l = l->next) {
163 get_local_filename_from_fileinfo(git_data.name,
164 MAX_PATH, NAUTILUS_FILE_INFO(l->data));
167 /* if we could not get a local file we stop */
168 if (!git_data.name[0])
169 return NULL;
171 debug_git("selected %s\n", git_data.name);
173 build_cheetah_menu(&git_data, &nautilus_data);
175 return nautilus_data.menu_items;
178 GList *git_extension_get_background_items(NautilusMenuProvider *provider,
179 GtkWidget *window,
180 NautilusFileInfo *current_folder)
182 if (!current_folder)
183 return NULL;
185 struct nautilus_menu_data nautilus_data = {
186 provider,
187 NULL,
188 NULL
191 git_data.name[0] = '\0';
192 get_local_filename_from_fileinfo(git_data.name,
193 MAX_PATH, NAUTILUS_FILE_INFO(current_folder));
195 /* if we could not get a local file we stop */
196 if (!git_data.name[0])
197 return NULL;
199 debug_git("selected %s\n", git_data.name);
201 build_cheetah_menu(&git_data, &nautilus_data);
203 return nautilus_data.menu_items;
206 GList *git_extension_get_toolbar_items(NautilusMenuProvider *provider,
207 GtkWidget *window,
208 NautilusFileInfo *current_folder)
210 return git_extension_get_background_items(provider,
211 window, current_folder);
214 void invoke_command(NautilusMenuItem *item,
215 gpointer user_data)
217 int id;
218 struct git_data *me;
220 id = (int) g_object_get_data((GObject *) item, "git_extension_id");
221 me = (struct git_data *) g_object_get_data((GObject *) item,
222 "git_extension_git_data");
224 debug_git("invoke_command: %s, id: %i", me->name, id);
226 handle_menu_item(me, id);
229 const char **menu_get_platform_argv(menu_commands cmd, const void *data,
230 free_func_t *free_argv, void **argv_data)
232 static const char *bash_argv[] = { "gnome-terminal", NULL };
234 *free_argv = NULL;
235 *argv_data = NULL;
237 switch(cmd)
239 case MENU_BASH:
240 return bash_argv;
241 default:
242 return NULL;