52
56
/******************************************************************************/
54
58
menu_browser_clear_menu (GtkWidget *menu_item) {
55
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
59
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
57
GtkWidget *menu = menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
58
gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback) gtk_widget_destroy, NULL);
61
GtkWidget *menu = menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
62
gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback) gtk_widget_destroy, NULL);
60
64
/******************************************************************************/
62
66
menu_browser_clean_up (MenuBrowser *self) {
63
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
65
g_return_if_fail (IS_MENU_BROWSER (self));
67
menu_browser_clear_menu (GTK_WIDGET (self));
69
garbage_empty (&(self->priv->garbage), TRUE);
67
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
69
g_return_if_fail (IS_MENU_BROWSER (self));
71
menu_browser_clear_menu (GTK_WIDGET (self));
73
garbage_empty (&(self->priv->garbage), TRUE);
71
75
/******************************************************************************/
73
77
menu_browser_on_dir_middle_click (const gchar *path, MenuBrowser *self) {
74
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
76
g_return_if_fail (IS_MENU_BROWSER (self));
78
gchar **args = g_strv_new (ARGS_SIZE);
79
args[ARG_APP] = g_strdup (self->prefs->terminal);
80
args[ARG_FILE] = g_strdup (path);
81
vfs_launch_application ((const gchar*const*)args);
78
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
80
g_return_if_fail (IS_MENU_BROWSER (self));
82
gchar **args = g_strv_new (ARGS_SIZE);
83
args[ARG_APP] = g_strdup (self->prefs->terminal);
84
args[ARG_FILE] = g_strdup (path);
85
vfs_launch_application ((const gchar*const*)args);
84
88
/******************************************************************************/
86
90
menu_browser_on_file_left_click (const gchar *file_name_and_path, MenuBrowser *self) {
87
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
89
g_return_if_fail (IS_MENU_BROWSER (self));
91
vfs_file_do_default_action (file_name_and_path);
91
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
93
g_return_if_fail (IS_MENU_BROWSER (self));
95
vfs_file_do_default_action (file_name_and_path);
93
97
/******************************************************************************/
95
99
menu_browser_on_file_middle_click (const gchar *file_name_and_path, MenuBrowser *self) {
96
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
98
g_return_if_fail (IS_MENU_BROWSER (self));
100
gchar **args = g_strv_new (ARGS_SIZE);
101
args[ARG_APP] = g_strdup (self->prefs->editor);
102
args[ARG_FILE] = g_strdup (file_name_and_path);
103
vfs_launch_application ((const gchar*const*)args);
100
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
102
g_return_if_fail (IS_MENU_BROWSER (self));
104
gchar **args = g_strv_new (ARGS_SIZE);
105
args[ARG_APP] = g_strdup (self->prefs->editor);
106
args[ARG_FILE] = g_strdup (file_name_and_path);
107
vfs_launch_application ((const gchar*const*)args);
106
110
/******************************************************************************/
108
112
menu_browser_on_file_right_click (const gchar *file_name_and_path, GtkWidget *menu_item) {
109
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
113
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
110
114
#ifdef ENABLE_CONTEXT_MENU
111
return context_menu_display (file_name_and_path, menu_item);
115
return context_menu_display (file_name_and_path, menu_item);
113
utils_show_dialog (_("Error"),
114
_("Right-click on file action not yet implemented."),
117
utils_show_dialog (_("Error"),
118
_("Right-click on file action not yet implemented."),
119
123
/******************************************************************************/
121
125
menu_browser_on_item_activate (GtkMenuItem *menu_item, MenuBrowser *self) {
122
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
124
g_return_if_fail (IS_MENU_BROWSER (self));
126
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
128
if (!vfs_file_exists (path)) {
129
gchar *tmp = g_strdup_printf (_("Error: The file \"%s\" does not exists."), path);
130
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
135
menu_browser_on_file_left_click (path, self);
126
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
128
g_return_if_fail (IS_MENU_BROWSER (self));
130
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
132
if (!vfs_file_exists (path)) {
133
gchar *tmp = g_strdup_printf (_("Error: The file \"%s\" does not exists."), path);
134
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
139
menu_browser_on_file_left_click (path, self);
137
141
/******************************************************************************/
139
143
menu_browser_on_item_button_release (GtkWidget *menu_item,
140
GdkEventButton *event,
144
GdkEventButton *event,
141
145
MenuBrowser *self) {
142
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
144
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
146
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
148
if (!vfs_file_exists (path)) {
149
gchar *tmp = g_strdup_printf (_("Error: The file \"%s\" does not exists."), path);
150
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
146
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
148
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
150
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
152
if (!vfs_file_exists (path)) {
153
gchar *tmp = g_strdup_printf (_("Error: The file \"%s\" does not exists."), path);
154
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
155
159
if (event->button == 2) {
156
vfs_file_is_directory (path) ?
157
menu_browser_on_dir_middle_click (path, self) :
158
menu_browser_on_file_middle_click (path, self);
160
vfs_file_is_directory (path) ?
161
menu_browser_on_dir_middle_click (path, self) :
162
menu_browser_on_file_middle_click (path, self);
159
163
gtk_menu_shell_deactivate (self->priv->parent_menu_shell);
162
else if (event->button == 3) {
166
else if (event->button == 3) {
163
167
/* Sigh! Have to set the event button to 0 because the menu items in
164
168
* the "open with" sub menu in the context menu aren't activated
165
169
* otherwise. This bug appeared when "button_press_event" was changed
167
171
* of the main menu. */
168
172
event->button = 0;
170
g_object_set_data (G_OBJECT (menu_item), "menu_browser", self);
171
g_object_set_data (G_OBJECT (menu_item), "button_event", event);
172
return menu_browser_on_file_right_click (path, menu_item);
174
g_object_set_data (G_OBJECT (menu_item), "menu_browser", self);
175
g_object_set_data (G_OBJECT (menu_item), "button_event", event);
176
return menu_browser_on_file_right_click (path, menu_item);
177
181
/******************************************************************************/
179
183
menu_browser_on_menu_key_release (GtkWidget *menu,
180
184
GdkEventKey *event,
181
185
MenuBrowser *self) {
182
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
184
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
186
GtkMenuShell *menu_shell = GTK_MENU_SHELL (menu);
187
GtkWidget *menu_item = menu_shell->active_menu_item;
190
if (!self->priv->parent_menu_shell->active || !menu_item) {
194
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
196
if (!vfs_file_exists (path)) {
197
gchar *tmp = g_strdup_printf ("Error: The file \"%s\" does not exists.", path);
198
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
186
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
188
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
190
GtkMenuShell *menu_shell = GTK_MENU_SHELL (menu);
191
GtkWidget *menu_item = menu_shell->active_menu_item;
194
if (!self->priv->parent_menu_shell->active || !menu_item) {
198
gchar *path = (gchar*)g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
200
if (!vfs_file_exists (path)) {
201
gchar *tmp = g_strdup_printf ("Error: The file \"%s\" does not exists.", path);
202
utils_show_dialog (_("Error"), tmp, GTK_MESSAGE_ERROR);
203
207
/* "Enter" or equivalent a are handled by menu_browser_on_item_activate */
205
if (event->keyval == GDK_F4 ||
206
event->keyval == GDK_KP_F4) {
209
if (event->keyval == GDK_F4 ||
210
event->keyval == GDK_KP_F4) {
208
vfs_file_is_directory (path) ?
209
menu_browser_on_dir_middle_click (path, self) :
210
menu_browser_on_file_middle_click (path, self);
211
gtk_menu_shell_deactivate (self->priv->parent_menu_shell);
212
vfs_file_is_directory (path) ?
213
menu_browser_on_dir_middle_click (path, self) :
214
menu_browser_on_file_middle_click (path, self);
215
gtk_menu_shell_deactivate (self->priv->parent_menu_shell);
214
else if ((event->keyval == GDK_Menu) ||
215
(event->keyval == GDK_F10 &&
216
(event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK)){
217
g_object_set_data (G_OBJECT (menu_item), "menu_browser", self);
218
g_object_set_data (G_OBJECT (menu_item), "button_event", event);
219
return menu_browser_on_file_right_click (path, menu_item);
218
else if ((event->keyval == GDK_Menu) ||
219
(event->keyval == GDK_F10 &&
220
(event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK)){
221
g_object_set_data (G_OBJECT (menu_item), "menu_browser", self);
222
g_object_set_data (G_OBJECT (menu_item), "button_event", event);
223
return menu_browser_on_file_right_click (path, menu_item);
227
/******************************************************************************/
229
/*on_drag_end (GtkWidget *widget,*/
230
/*GdkDragContext *context,*/
231
/*gpointer user_data) {*/
234
/******************************************************************************/
236
on_drag_data_get (GtkWidget *widget,
237
GdkDragContext *context,
238
GtkSelectionData *selection_data,
243
gtk_selection_data_set (selection_data,
244
selection_data->target,
249
/******************************************************************************/
251
on_drag_begin (GtkWidget *menu_item, GdkDragContext *context) {
255
const gchar *icon_name = NULL;
258
GtkWidget *image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menu_item));
259
gtk_image_get_gicon (GTK_IMAGE(image), &icon, &size);
261
if (G_IS_FILE_ICON(icon)) {
262
/* What do I do now!? */
263
GFile *file = g_file_icon_get_file(G_FILE_ICON(icon));
264
gchar *tmp1 = g_file_get_basename (file);
265
tmp = g_strndup (tmp1, strlen(tmp1) - 4);
266
icon_name = (const gchar*)tmp;
269
else if (G_IS_THEMED_ICON(icon)) {
271
const char*const* icon_names = g_themed_icon_get_names (G_THEMED_ICON(icon));
272
icon_name = icon_names ? icon_names[0] : NULL;
276
/* Sigh! gtk_drag_source_set_icon_name can't load drag icon from icon
277
* name inode-directory "i.e. folders". Since that will probably be the
278
* most common case, make sure it looks OK. */
279
if (strcmp(icon_name, "inode-directory") == 0)
280
icon_name = "folder";
282
gtk_drag_source_set_icon_name (menu_item, icon_name);
286
/******************************************************************************/
288
menu_browser_dnd_setup (GtkWidget *menu_item) {
289
gchar *file_name = g_object_get_data (G_OBJECT (menu_item), G_OBJECT_DATA_NAME);
290
gchar *uri = g_filename_to_uri(file_name, NULL, NULL);
292
gtk_drag_source_set (menu_item,
296
GDK_ACTION_MOVE | GDK_ACTION_ASK);
298
g_signal_connect_data (menu_item,
300
G_CALLBACK (on_drag_data_get),
302
(GClosureNotify)g_free,
305
g_signal_connect (menu_item,
307
G_CALLBACK (on_drag_begin),
309
/*g_signal_connect (menu_item,*/
311
/*G_CALLBACK (on_drag_end),*/
223
314
/******************************************************************************/
225
316
menu_browser_add_signals (GtkWidget *menu_item, MenuBrowser *self) {
226
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
317
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
228
g_return_if_fail (IS_MENU_BROWSER (self));
319
g_return_if_fail (IS_MENU_BROWSER (self));
230
321
g_signal_connect (menu_item,
231
322
"button_release_event",
286
379
/******************************************************************************/
288
381
menu_browser_add_files (GtkWidget *menu, GPtrArray *files, MenuBrowser *self) {
289
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
291
g_return_if_fail (IS_MENU_BROWSER (self));
294
for (i=0; i<files->len; i++) {
295
VfsFileInfo *vfs_file_info = (VfsFileInfo*)g_ptr_array_index (files, i);
382
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
384
g_return_if_fail (IS_MENU_BROWSER (self));
387
for (i=0; i<files->len; i++) {
388
VfsFileInfo *vfs_file_info = (VfsFileInfo*)g_ptr_array_index (files, i);
297
390
GtkWidget *menu_item = menu_browser_entry_new (vfs_file_info, self);
299
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menu_item);
392
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menu_item);
301
394
menu_browser_add_signals (menu_item, self);
304
397
/******************************************************************************/
306
menu_browser_add_folders (GtkWidget *menu, GPtrArray *dirs, MenuBrowser *self) {
307
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
309
g_return_if_fail (IS_MENU_BROWSER (self));
312
for (i=0; i<dirs->len; i++) {
313
VfsFileInfo *vfs_file_info = (VfsFileInfo*)g_ptr_array_index (dirs, i);
399
menu_browser_add_folders (GtkWidget *menu, GPtrArray *dirs, MenuBrowser *self) {
400
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
402
g_return_if_fail (IS_MENU_BROWSER (self));
405
for (i=0; i<dirs->len; i++) {
406
VfsFileInfo *vfs_file_info = (VfsFileInfo*)g_ptr_array_index (dirs, i);
315
408
GtkWidget *menu_item = menu_browser_entry_new (vfs_file_info, self);
317
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
318
/*make the sub menu to show all the files in this dir*/
319
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), gtk_menu_new ());
410
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
411
/*make the sub menu to show all the files in this dir*/
412
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), gtk_menu_new ());
321
g_signal_connect (GTK_MENU_ITEM (menu_item),
323
G_CALLBACK (menu_browser_populate_menu),
414
g_signal_connect (GTK_MENU_ITEM (menu_item),
416
G_CALLBACK (menu_browser_populate_menu),
326
419
g_signal_connect (GTK_WIDGET (menu_item),
327
420
"button_press_event",
328
421
G_CALLBACK (menu_browser_on_item_button_release),
333
426
/******************************************************************************/
335
428
menu_browser_add_menu_header (GtkWidget *menu, gchar *path, MenuBrowser *self) {
336
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
338
g_return_if_fail (IS_MENU_BROWSER (self));
340
VfsFileInfo *vfs_file_info = g_new0 (VfsFileInfo, 1);
429
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
431
g_return_if_fail (IS_MENU_BROWSER (self));
433
VfsFileInfo *vfs_file_info = g_new0 (VfsFileInfo, 1);
341
434
vfs_file_info->display_name = g_strdup (g_path_get_basename(path));
342
435
vfs_file_info->file_name = g_strdup (path);
343
436
vfs_file_info->icon = vfs_get_icon_for_file (path);
346
439
GtkWidget *menu_item = menu_browser_entry_new (vfs_file_info, self);
347
440
g_free (vfs_file_info);
349
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
442
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
351
444
menu_browser_add_signals (menu_item, self);
353
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
354
gtk_separator_menu_item_new());
446
gtk_menu_shell_append (GTK_MENU_SHELL (menu),
447
gtk_separator_menu_item_new());
356
449
/******************************************************************************/
358
451
menu_browser_populate_menu (GtkWidget *parent_menu_item, MenuBrowser *self) {
359
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
361
g_return_if_fail (IS_MENU_BROWSER (self));
363
gchar *current_path = NULL;
365
GtkWidget *menu_item = NULL;
366
GtkWidget *current_menu = NULL;
367
GPtrArray *files = g_ptr_array_new();
368
GPtrArray *dirs = g_ptr_array_new();
370
/* empty the menu of its existing contents first */
371
menu_browser_clear_menu (parent_menu_item);
373
current_path = (gchar*)g_object_get_data (G_OBJECT (parent_menu_item), G_OBJECT_DATA_NAME);
375
/* get the menu widget to pack all the menu items for this dir into */
376
current_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (parent_menu_item));
452
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
454
g_return_if_fail (IS_MENU_BROWSER (self));
456
gchar *current_path = NULL;
458
GtkWidget *menu_item = NULL;
459
GtkWidget *current_menu = NULL;
460
GPtrArray *files = g_ptr_array_new();
461
GPtrArray *dirs = g_ptr_array_new();
463
/* empty the menu of its existing contents first */
464
menu_browser_clear_menu (parent_menu_item);
466
current_path = (gchar*)g_object_get_data (G_OBJECT (parent_menu_item), G_OBJECT_DATA_NAME);
468
/* get the menu widget to pack all the menu items for this dir into */
469
current_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (parent_menu_item));
378
471
/* If we want to catch key presses/releases, we have to do it before
379
472
* menu_item signals are emitted. So, we have to watch the menu. */
380
g_signal_connect (current_menu,
382
G_CALLBACK (menu_browser_on_menu_key_release),
385
/* add the dir name and events */
386
menu_browser_add_menu_header (current_menu, current_path, self);
388
/* read the contents of the dir. */
389
error = vfs_get_dir_listings (files,
391
self->prefs->show_hidden,
395
menu_browser_add_folders (current_menu, dirs, self);
397
if ((dirs->len > 0) & (files->len > 0)) {
398
/*add a separator between dirs and files*/
399
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu),
400
gtk_separator_menu_item_new());
404
menu_browser_add_files (current_menu, files, self);
406
/* add any error or other messages */
408
menu_item = gtk_menu_item_new_with_label (error);
410
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu), menu_item);
411
gtk_widget_set_sensitive (GTK_WIDGET (menu_item), FALSE);
412
} /* the folder was empty */
413
else if ((dirs->len == 0) & (files->len == 0)) {
414
menu_item = gtk_menu_item_new_with_label (_("(Empty)"));
415
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu), menu_item);
416
gtk_widget_set_sensitive (GTK_WIDGET (menu_item), FALSE);
418
gtk_widget_show_all (current_menu);
421
g_ptr_array_foreach (dirs, (GFunc)g_free, NULL);
422
g_ptr_array_foreach (files, (GFunc)g_free, NULL);
423
g_ptr_array_free (dirs, TRUE);
424
g_ptr_array_free (files, TRUE);
473
g_signal_connect (current_menu,
475
G_CALLBACK (menu_browser_on_menu_key_release),
478
/* add the dir name and events */
479
menu_browser_add_menu_header (current_menu, current_path, self);
481
/* read the contents of the dir. */
482
error = vfs_get_dir_listings (files,
484
self->prefs->show_hidden,
488
menu_browser_add_folders (current_menu, dirs, self);
490
if ((dirs->len > 0) & (files->len > 0)) {
491
/*add a separator between dirs and files*/
492
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu),
493
gtk_separator_menu_item_new());
497
menu_browser_add_files (current_menu, files, self);
499
/* add any error or other messages */
501
menu_item = gtk_menu_item_new_with_label (error);
503
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu), menu_item);
504
gtk_widget_set_sensitive (GTK_WIDGET (menu_item), FALSE);
505
} /* the folder was empty */
506
else if ((dirs->len == 0) & (files->len == 0)) {
507
menu_item = gtk_menu_item_new_with_label (_("(Empty)"));
508
gtk_menu_shell_append (GTK_MENU_SHELL (current_menu), menu_item);
509
gtk_widget_set_sensitive (GTK_WIDGET (menu_item), FALSE);
511
gtk_widget_show_all (current_menu);
514
g_ptr_array_foreach (dirs, (GFunc)g_free, NULL);
515
g_ptr_array_foreach (files, (GFunc)g_free, NULL);
516
g_ptr_array_free (dirs, TRUE);
517
g_ptr_array_free (files, TRUE);
426
519
/******************************************************************************/
428
521
menu_browser_update (MenuBrowser *self, const gchar *path, const gchar *label) {
429
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
431
g_return_if_fail (IS_MENU_BROWSER (self));
433
GtkWidget *item_label = GTK_BIN (self)->child;
434
gtk_label_set_text (GTK_LABEL (item_label), label);
436
g_free (g_object_get_data (G_OBJECT (self), G_OBJECT_DATA_NAME));
437
g_object_set_data (G_OBJECT (self), G_OBJECT_DATA_NAME, g_strdup (path));
522
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
524
g_return_if_fail (IS_MENU_BROWSER (self));
526
GtkWidget *item_label = GTK_BIN (self)->child;
527
gtk_label_set_text (GTK_LABEL (item_label), label);
529
g_free (g_object_get_data (G_OBJECT (self), G_OBJECT_DATA_NAME));
530
g_object_set_data (G_OBJECT (self), G_OBJECT_DATA_NAME, g_strdup (path));
439
532
/******************************************************************************/
441
534
menu_browser_class_init (MenuBrowserClass *klass) {
442
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
535
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
444
menu_browser_parent_class = g_type_class_peek_parent (klass);
445
g_type_class_add_private (klass, sizeof (MenuBrowserPrivate));
446
G_OBJECT_CLASS (klass)->dispose = menu_browser_dispose;
537
menu_browser_parent_class = g_type_class_peek_parent (klass);
538
g_type_class_add_private (klass, sizeof (MenuBrowserPrivate));
539
G_OBJECT_CLASS (klass)->dispose = menu_browser_dispose;
448
541
/******************************************************************************/
450
543
menu_browser_init (MenuBrowser *self) {
452
g_return_if_fail (IS_MENU_BROWSER (self));
545
g_return_if_fail (IS_MENU_BROWSER (self));
454
self->priv = MENU_BROWSER_GET_PRIVATE (self);
547
self->priv = MENU_BROWSER_GET_PRIVATE (self);
456
549
/******************************************************************************/
458
551
menu_browser_dispose (GObject *obj) {
459
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
461
MenuBrowser *self = MENU_BROWSER (obj);
462
/* MenuBrowserClass *klass = MENU_BROWSER_CLASS (g_type_class_peek (TYPE_MENU_BROWSER));*/
464
(self->priv->menu_item_label == NULL ? NULL : (self->priv->menu_item_label = (gtk_widget_destroy (self->priv->menu_item_label), NULL)));
465
(self->priv->garbage == NULL ? NULL : garbage_empty (&(self->priv->garbage), FALSE));
467
G_OBJECT_CLASS (menu_browser_parent_class)->dispose (obj);
552
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
554
MenuBrowser *self = MENU_BROWSER (obj);
555
/* MenuBrowserClass *klass = MENU_BROWSER_CLASS (g_type_class_peek (TYPE_MENU_BROWSER));*/
557
(self->priv->menu_item_label == NULL ? NULL : (self->priv->menu_item_label = (gtk_widget_destroy (self->priv->menu_item_label), NULL)));
558
(self->priv->garbage == NULL ? NULL : garbage_empty (&(self->priv->garbage), FALSE));
560
G_OBJECT_CLASS (menu_browser_parent_class)->dispose (obj);
469
562
/******************************************************************************/
471
564
menu_browser_get_type (void) {
472
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
474
static GType menu_browser_type_id = 0;
475
if (G_UNLIKELY (menu_browser_type_id == 0)) {
476
static const GTypeInfo g_define_type_info = {sizeof (MenuBrowserClass),
477
(GBaseInitFunc) NULL,
478
(GBaseFinalizeFunc) NULL,
479
(GClassInitFunc) menu_browser_class_init,
480
(GClassFinalizeFunc) NULL,
482
sizeof (MenuBrowser),
484
(GInstanceInitFunc) menu_browser_init };
486
menu_browser_type_id = g_type_register_static (GTK_TYPE_IMAGE_MENU_ITEM,
488
&g_define_type_info, 0);
490
return menu_browser_type_id;
565
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
567
static GType menu_browser_type_id = 0;
568
if (G_UNLIKELY (menu_browser_type_id == 0)) {
569
static const GTypeInfo g_define_type_info = {sizeof (MenuBrowserClass),
570
(GBaseInitFunc) NULL,
571
(GBaseFinalizeFunc) NULL,
572
(GClassInitFunc) menu_browser_class_init,
573
(GClassFinalizeFunc) NULL,
575
sizeof (MenuBrowser),
577
(GInstanceInitFunc) menu_browser_init };
579
menu_browser_type_id = g_type_register_static (GTK_TYPE_IMAGE_MENU_ITEM,
581
&g_define_type_info, 0);
583
return menu_browser_type_id;
492
585
/******************************************************************************/
494
587
menu_browser_activate_main_menu (MenuBrowser *self) {
495
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
588
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
497
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
590
g_return_val_if_fail (IS_MENU_BROWSER (self), FALSE);
499
592
menu_browser_clean_up (self);
501
self->priv->parent_menu_shell =
502
GTK_MENU_SHELL (gtk_widget_get_parent (GTK_WIDGET (self)));
504
GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (self));
506
/* this is here because of the solution to the focus problem caused by the
507
* popped context menu */
508
gtk_widget_set_sensitive (GTK_WIDGET (menu), TRUE);
510
menu_browser_populate_menu (GTK_WIDGET (self), self);
512
gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
513
gtk_menu_reposition (GTK_MENU (menu));
594
self->priv->parent_menu_shell =
595
GTK_MENU_SHELL (gtk_widget_get_parent (GTK_WIDGET (self)));
597
GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (self));
599
/* this is here because of the solution to the focus problem caused by the
600
* popped context menu */
601
gtk_widget_set_sensitive (GTK_WIDGET (menu), TRUE);
603
menu_browser_populate_menu (GTK_WIDGET (self), self);
605
gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
606
gtk_menu_reposition (GTK_MENU (menu));
516
609
/******************************************************************************/
518
611
menu_browser_new (const gchar* path,
520
BrowserPrefs *prefs) {
521
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
523
MenuBrowser *self = g_object_newv (TYPE_MENU_BROWSER, 0, NULL);
525
self->priv->parent_menu_shell = NULL;
528
/* get the default config if none passed. */
529
/* prefs = preferences_browser_get_default ();*/
533
garbage_init(&(self->priv->garbage));
535
GtkWidget *item_label = gtk_label_new (label);
536
gtk_misc_set_alignment (GTK_MISC (item_label), 0.0, 0.5);
537
gtk_container_add (GTK_CONTAINER (self), item_label);
538
self->priv->menu_item_label = item_label;
540
/*make the main menu*/
541
gtk_menu_item_set_submenu (GTK_MENU_ITEM (self), gtk_menu_new());
543
g_object_set_data (G_OBJECT (self), G_OBJECT_DATA_NAME, g_strdup (path));
545
g_signal_connect_after (GTK_MENU_ITEM (self),
613
BrowserPrefs *prefs) {
614
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
616
MenuBrowser *self = g_object_newv (TYPE_MENU_BROWSER, 0, NULL);
618
self->priv->parent_menu_shell = NULL;
621
/* get the default config if none passed. */
622
/* prefs = preferences_browser_get_default ();*/
626
garbage_init(&(self->priv->garbage));
628
GtkWidget *item_label = gtk_label_new (label);
629
gtk_misc_set_alignment (GTK_MISC (item_label), 0.0, 0.5);
630
gtk_container_add (GTK_CONTAINER (self), item_label);
631
self->priv->menu_item_label = item_label;
633
/*make the main menu*/
634
gtk_menu_item_set_submenu (GTK_MENU_ITEM (self), gtk_menu_new());
636
g_object_set_data (G_OBJECT (self), G_OBJECT_DATA_NAME, g_strdup (path));
638
g_signal_connect_after (GTK_MENU_ITEM (self),
547
640
G_CALLBACK (menu_browser_activate_main_menu),