nautilus: don't do own item calculation
[git-cheetah/kirill.git] / nautilus / menu.c
blob3f6544aa5d4f9ac28612b7ad29b0838a6bdf57b1
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 nautilus_data->menu_items = g_list_append(nautilus_data->menu_items,
53 one_menu_item);
55 free(item_name);
56 return TRUE;
59 BOOL build_separator(struct git_data *me, const struct menu_item *item,
60 void *platform)
62 /* not implemented, yet */
63 return FALSE;
66 void reset_platform(void *platform)
68 /* nautilus does not need to reset anything */
71 void *start_submenu(struct git_data *me, const struct menu_item *item,
72 void *platform)
74 /* not implemented, yet */
75 return NULL;
78 void end_submenu(void *parent, void *submenu)
80 /* not implemented, yet */
83 static inline char *get_local_filename_from_fileinfo(char *filename, int n,
84 NautilusFileInfo *file)
86 char *name;
87 char locator[MAX_PATH];
89 name = nautilus_file_info_get_uri(file);
91 /* find out if this is a local file */
92 strncpy(locator, name, MAX_PATH);
93 locator[7] = '\0';
94 if (!strcmp(locator, "file://")) {
95 strncpy(filename, name+7, n);
96 filename[n-1] = '\0';
98 else
99 filename=NULL;
101 g_free(name);
102 return filename;
105 GList *git_extension_get_file_items(NautilusMenuProvider *provider,
106 GtkWidget *window,
107 GList *files)
109 GList *l;
111 if (!files)
112 return NULL;
114 struct nautilus_menu_data nautilus_data = {
115 provider,
116 NULL
120 git_data.name[0] = '\0';
121 for (l = files; l != NULL; l = l->next) {
122 get_local_filename_from_fileinfo(git_data.name,
123 MAX_PATH, NAUTILUS_FILE_INFO(l->data));
126 /* if we could not get a local file we stop */
127 if (!git_data.name[0])
128 return NULL;
130 debug_git("selected %s\n", git_data.name);
132 build_cheetah_menu(&git_data, &nautilus_data);
134 return nautilus_data.menu_items;
137 GList *git_extension_get_background_items(NautilusMenuProvider *provider,
138 GtkWidget *window,
139 NautilusFileInfo *current_folder)
141 if (!current_folder)
142 return NULL;
144 struct nautilus_menu_data nautilus_data = {
145 provider,
146 NULL
149 git_data.name[0] = '\0';
150 get_local_filename_from_fileinfo(git_data.name,
151 MAX_PATH, NAUTILUS_FILE_INFO(current_folder));
153 /* if we could not get a local file we stop */
154 if (!git_data.name[0])
155 return NULL;
157 debug_git("selected %s\n", git_data.name);
159 build_cheetah_menu(&git_data, &nautilus_data);
161 return nautilus_data.menu_items;
164 GList *git_extension_get_toolbar_items(NautilusMenuProvider *provider,
165 GtkWidget *window,
166 NautilusFileInfo *current_folder)
168 return git_extension_get_background_items(provider,
169 window, current_folder);
172 void invoke_command(NautilusMenuItem *item,
173 gpointer user_data)
175 int id;
176 struct git_data *me;
178 id = (int) g_object_get_data((GObject *) item, "git_extension_id");
179 me = (struct git_data *) g_object_get_data((GObject *) item,
180 "git_extension_git_data");
182 debug_git("invoke_command: %s, id: %i", me->name, id);
184 handle_menu_item(me, id);
187 const char **menu_get_platform_argv(menu_commands cmd, const void *data,
188 free_func_t *free_argv, void **argv_data)
190 static const char *bash_argv[] = { "gnome-terminal", NULL };
192 *free_argv = NULL;
193 *argv_data = NULL;
195 switch(cmd)
197 case MENU_BASH:
198 return bash_argv;
199 default:
200 return NULL;