Revert "do not inherit handles into child processes"
[git-cheetah/kirill.git] / nautilus / menu.c
bloba0bb181ae9660f9be82e9bf8b54edcb5ad9e5ae9
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 GValue sensitive = {0};
28 struct nautilus_menu_data *nautilus_data = platform;
30 if (!platform)
31 return TRUE;
33 item_name = strdup(item->string);
35 shortcut_key = parse_and_remove_shortcuts(item_name);
37 debug_git("Adding entry: %s", item_name);
39 snprintf(item_reference_string, 1024, "GitExtension::%s", item_name);
40 item_reference_string[1023] = '\0';
41 one_menu_item = nautilus_menu_item_new(item_reference_string,
42 item_name,
43 item->helptext,
44 item->flags & MI_CHECKED ? GTK_STOCK_YES : NULL);
45 g_signal_connect(one_menu_item, "activate",
46 G_CALLBACK(invoke_command), nautilus_data->provider);
48 g_object_set_data((GObject *) one_menu_item, "git_extension_id",
49 (void *)next_active_item);
50 g_object_set_data((GObject *) one_menu_item,
51 "git_extension_git_data", me);
53 g_value_init(&sensitive, G_TYPE_BOOLEAN);
54 g_value_set_boolean(&sensitive, !(item->flags & MI_DISABLED));
55 g_object_set_property((GObject *)one_menu_item, "sensitive",
56 &sensitive);
58 if (nautilus_data->submenu)
59 nautilus_menu_append_item(nautilus_data->submenu, one_menu_item);
60 else
61 nautilus_data->menu_items = g_list_append(nautilus_data->menu_items,
62 one_menu_item);
64 free(item_name);
65 return TRUE;
68 BOOL build_separator(struct git_data *me, const struct menu_item *item,
69 void *platform)
71 /* not implemented, yet */
72 return FALSE;
75 void reset_platform(void *platform)
77 /* nautilus does not need to reset anything */
80 void *start_submenu(struct git_data *me, const struct menu_item *item,
81 void *platform)
83 struct nautilus_menu_data *nautilus_data = platform;
85 NautilusMenuItem *submenu_item;
86 NautilusMenu *submenu;
87 char name[512], *item_name = strdup(item->string), shortcut_key;
89 shortcut_key = parse_and_remove_shortcuts(item_name);
91 snprintf(name, sizeof(name), "GitExtension::%s", item_name);
92 name[sizeof(name) - 1] = '\0';
94 debug_git("creating submenu item '%s' '%s' '%s'", item_name, name, item->helptext);
95 submenu_item = nautilus_menu_item_new(
96 name,
97 item_name,
98 item->helptext,
99 NULL);
101 free(item_name);
103 submenu = nautilus_menu_new();
105 g_object_set_data((GObject *)submenu, "git_menu_parent",
106 (void *)nautilus_data->submenu);
108 nautilus_menu_item_set_submenu(submenu_item, submenu);
110 if (nautilus_data->submenu)
111 nautilus_menu_append_item(nautilus_data->submenu, submenu_item);
112 else
113 nautilus_data->menu_items = g_list_append(nautilus_data->menu_items,
114 submenu_item);
116 nautilus_data->submenu = submenu;
118 return platform;
121 void end_submenu(void *parent, void *submenu)
123 struct nautilus_menu_data *nautilus_data = parent;
124 nautilus_data->submenu = (NautilusMenu *)g_object_get_data(
125 (GObject *)nautilus_data->submenu,
126 "git_menu_parent");
129 static inline char *get_local_filename_from_fileinfo(char *filename, int n,
130 NautilusFileInfo *file)
132 char *name, *uri = nautilus_file_info_get_uri(file);
134 /* find out if this is a local file */
135 name = g_filename_from_uri(uri, NULL, NULL);
136 if (name) {
137 strncpy(filename, name, n);
138 g_free(name);
139 filename[n-1] = '\0';
141 else
142 filename=NULL;
144 g_free(uri);
146 return filename;
149 GList *git_extension_get_file_items(NautilusMenuProvider *provider,
150 GtkWidget *window,
151 GList *files)
153 GList *l;
155 if (!files)
156 return NULL;
158 struct nautilus_menu_data nautilus_data = {
159 provider,
160 NULL,
161 NULL
165 git_data.name[0] = '\0';
166 for (l = files; l != NULL; l = l->next) {
167 get_local_filename_from_fileinfo(git_data.name,
168 MAX_PATH, NAUTILUS_FILE_INFO(l->data));
171 /* if we could not get a local file we stop */
172 if (!git_data.name[0])
173 return NULL;
175 debug_git("selected %s\n", git_data.name);
177 build_cheetah_menu(&git_data, &nautilus_data);
179 return nautilus_data.menu_items;
182 GList *git_extension_get_background_items(NautilusMenuProvider *provider,
183 GtkWidget *window,
184 NautilusFileInfo *current_folder)
186 if (!current_folder)
187 return NULL;
189 struct nautilus_menu_data nautilus_data = {
190 provider,
191 NULL,
192 NULL
195 git_data.name[0] = '\0';
196 get_local_filename_from_fileinfo(git_data.name,
197 MAX_PATH, NAUTILUS_FILE_INFO(current_folder));
199 /* if we could not get a local file we stop */
200 if (!git_data.name[0])
201 return NULL;
203 debug_git("selected %s\n", git_data.name);
205 build_cheetah_menu(&git_data, &nautilus_data);
207 return nautilus_data.menu_items;
210 GList *git_extension_get_toolbar_items(NautilusMenuProvider *provider,
211 GtkWidget *window,
212 NautilusFileInfo *current_folder)
214 return git_extension_get_background_items(provider,
215 window, current_folder);
218 void invoke_command(NautilusMenuItem *item,
219 gpointer user_data)
221 int id;
222 struct git_data *me;
223 NautilusMenuProvider *provider = (NautilusMenuProvider*)user_data;
225 id = (int) g_object_get_data((GObject *) item, "git_extension_id");
226 me = (struct git_data *) g_object_get_data((GObject *) item,
227 "git_extension_git_data");
229 debug_git("invoke_command: %s, id: %i", me->name, id);
231 if (handle_menu_item(me, id))
232 nautilus_menu_provider_emit_items_updated_signal(provider);
235 const char **menu_get_platform_argv(menu_commands cmd, void *data,
236 free_func_t *free_argv, void **argv_data)
238 static const char *bash_argv[] = { "gnome-terminal", NULL };
240 *free_argv = NULL;
241 *argv_data = NULL;
243 switch(cmd)
245 case MENU_BASH:
246 return bash_argv;
247 default:
248 return NULL;