3 * Here we implement the functions which feed the cheetah menuengine
6 * Copyright (C) Heiko Voigt, 2009
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"
18 static struct git_data git_data
;
20 BOOL
build_item(struct git_data
*me
, const struct menu_item
*item
,
25 char item_reference_string
[1024];
26 NautilusMenuItem
*one_menu_item
;
27 struct nautilus_menu_data
*nautilus_data
= platform
;
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
,
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
);
55 nautilus_data
->menu_items
= g_list_append(nautilus_data
->menu_items
,
62 BOOL
build_separator(struct git_data
*me
, const struct menu_item
*item
,
65 /* not implemented, yet */
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
,
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(
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
);
107 nautilus_data
->menu_items
= g_list_append(nautilus_data
->menu_items
,
110 nautilus_data
->submenu
= submenu
;
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
,
123 static inline char *get_local_filename_from_fileinfo(char *filename
, int n
,
124 NautilusFileInfo
*file
)
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
);
134 if (!strcmp(locator
, "file://")) {
135 strncpy(filename
, name
+7, n
);
136 filename
[n
-1] = '\0';
145 GList
*git_extension_get_file_items(NautilusMenuProvider
*provider
,
154 struct nautilus_menu_data nautilus_data
= {
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])
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
,
180 NautilusFileInfo
*current_folder
)
185 struct nautilus_menu_data nautilus_data
= {
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])
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
,
208 NautilusFileInfo
*current_folder
)
210 return git_extension_get_background_items(provider
,
211 window
, current_folder
);
214 void invoke_command(NautilusMenuItem
*item
,
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
};