nautilus: handle special characters in file-path
[git-cheetah/kirill.git] / nautilus / menu.c
blobff60657dc33f1a733c57bff2a72e570033ae9326
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, *uri = nautilus_file_info_get_uri(file);
128 /* find out if this is a local file */
129 name = g_filename_from_uri(uri, NULL, NULL);
130 if (name) {
131 strncpy(filename, name, n);
132 g_free(name);
133 filename[n-1] = '\0';
135 else
136 filename=NULL;
138 g_free(uri);
140 return filename;
143 GList *git_extension_get_file_items(NautilusMenuProvider *provider,
144 GtkWidget *window,
145 GList *files)
147 GList *l;
149 if (!files)
150 return NULL;
152 struct nautilus_menu_data nautilus_data = {
153 provider,
154 NULL,
155 NULL
159 git_data.name[0] = '\0';
160 for (l = files; l != NULL; l = l->next) {
161 get_local_filename_from_fileinfo(git_data.name,
162 MAX_PATH, NAUTILUS_FILE_INFO(l->data));
165 /* if we could not get a local file we stop */
166 if (!git_data.name[0])
167 return NULL;
169 debug_git("selected %s\n", git_data.name);
171 build_cheetah_menu(&git_data, &nautilus_data);
173 return nautilus_data.menu_items;
176 GList *git_extension_get_background_items(NautilusMenuProvider *provider,
177 GtkWidget *window,
178 NautilusFileInfo *current_folder)
180 if (!current_folder)
181 return NULL;
183 struct nautilus_menu_data nautilus_data = {
184 provider,
185 NULL,
186 NULL
189 git_data.name[0] = '\0';
190 get_local_filename_from_fileinfo(git_data.name,
191 MAX_PATH, NAUTILUS_FILE_INFO(current_folder));
193 /* if we could not get a local file we stop */
194 if (!git_data.name[0])
195 return NULL;
197 debug_git("selected %s\n", git_data.name);
199 build_cheetah_menu(&git_data, &nautilus_data);
201 return nautilus_data.menu_items;
204 GList *git_extension_get_toolbar_items(NautilusMenuProvider *provider,
205 GtkWidget *window,
206 NautilusFileInfo *current_folder)
208 return git_extension_get_background_items(provider,
209 window, current_folder);
212 void invoke_command(NautilusMenuItem *item,
213 gpointer user_data)
215 int id;
216 struct git_data *me;
218 id = (int) g_object_get_data((GObject *) item, "git_extension_id");
219 me = (struct git_data *) g_object_get_data((GObject *) item,
220 "git_extension_git_data");
222 debug_git("invoke_command: %s, id: %i", me->name, id);
224 handle_menu_item(me, id);
227 const char **menu_get_platform_argv(menu_commands cmd, const void *data,
228 free_func_t *free_argv, void **argv_data)
230 static const char *bash_argv[] = { "gnome-terminal", NULL };
232 *free_argv = NULL;
233 *argv_data = NULL;
235 switch(cmd)
237 case MENU_BASH:
238 return bash_argv;
239 default:
240 return NULL;