2
* desktop-menu-plugin.c - xfce4-panel plugin that displays the desktop menu
4
* Copyright (C) 2004 Brian Tarricone, <bjt23@cornell.edu>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Library General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
* Jean-Francois Wauthy (option panel for choice between icon/text)
22
* Jasper Huijsmans (menu placement function, toggle button, scaled image
24
* Olivier Fourdan (remote popup)
52
#include <libxfcegui4/libxfcegui4.h>
53
#include <libxfce4panel/xfce-panel-plugin.h>
54
#include <libxfce4panel/xfce-panel-convenience.h>
56
#ifdef HAVE_THUNAR_VFS
57
#include <thunar-vfs/thunar-vfs.h>
60
#include "desktop-menu-stub.h"
61
#include "xfdesktop-common.h"
62
#include "xfce4-popup-menu.h"
65
#define DEFAULT_BUTTON_ICON DATADIR "/pixmaps/xfce4_xicon1.png"
66
#define DEFAULT_BUTTON_TITLE "Xfce Menu"
68
/* this'll only allow one copy of the plugin; useful for forcing the
69
* xfce4-popup-menu keybind to work with only one plugin */
70
/* #define CHECK_RUNNING_PLUGIN */
72
typedef struct _DMPlugin {
73
XfcePanelPlugin *plugin;
79
XfceDesktopMenu *desktop_menu;
80
gboolean use_default_menu;
83
gboolean show_menu_icons;
85
gboolean show_button_title;
87
GtkWidget *file_entry;
88
GtkWidget *icon_entry;
90
GtkTooltips *tooltip; /* needed? */
95
dmp_get_real_path(const gchar *raw_path)
100
if(strstr(raw_path, "$XDG_CONFIG_DIRS/") == raw_path)
101
return xfce_resource_lookup(XFCE_RESOURCE_CONFIG, raw_path+17);
102
else if(strstr(raw_path, "$XDG_CONFIG_HOME/") == raw_path)
103
return xfce_resource_save_location(XFCE_RESOURCE_CONFIG, raw_path+17, FALSE);
104
else if(strstr(raw_path, "$XDG_DATA_DIRS/") == raw_path)
105
return xfce_resource_lookup(XFCE_RESOURCE_DATA, raw_path+15);
106
else if(strstr(raw_path, "$XDG_DATA_HOME/") == raw_path)
107
return xfce_resource_save_location(XFCE_RESOURCE_DATA, raw_path+15, FALSE);
108
else if(strstr(raw_path, "$XDG_CACHE_HOME/") == raw_path)
109
return xfce_resource_save_location(XFCE_RESOURCE_CACHE, raw_path+16, FALSE);
111
return xfce_expand_variables(raw_path, NULL);
115
dmp_get_icon(const gchar *icon_name, gint size, GtkOrientation orientation)
117
GdkPixbuf *pix = NULL;
121
filename = xfce_themed_icon_lookup(icon_name, size);
125
#if GTK_CHECK_VERSION(2, 8, 0)
126
w = orientation == GTK_ORIENTATION_HORIZONTAL ? -1 : size;
127
h = orientation == GTK_ORIENTATION_VERTICAL ? -1 : size;
128
pix = gdk_pixbuf_new_from_file_at_scale(filename, w, h, TRUE, NULL);
130
pix = gdk_pixbuf_new_from_file(filename, NULL);
135
w = gdk_pixbuf_get_width(pix);
136
h = gdk_pixbuf_get_height(pix);
137
aspect = (gdouble)w / h;
139
w = orientation == GTK_ORIENTATION_HORIZONTAL ? size*aspect : size;
140
h = orientation == GTK_ORIENTATION_VERTICAL ? size*aspect : size;
142
tmp = gdk_pixbuf_scale_simple(pix, w, h, GDK_INTERP_BILINEAR);
143
g_object_unref(G_OBJECT(pix));
154
dmp_set_size(XfcePanelPlugin *plugin, gint wsize, DMPlugin *dmp)
156
gint width, height, size, pix_w = 0, pix_h = 0;
157
GtkOrientation orientation = xfce_panel_plugin_get_orientation(plugin);
159
size = wsize - MAX(GTK_WIDGET(dmp->button)->style->xthickness,
160
GTK_WIDGET(dmp->button)->style->ythickness) - 1;
162
DBG("wsize: %d, size: %d", wsize, size);
165
GdkPixbuf *pix = dmp_get_icon(dmp->icon_file, size, orientation);
167
pix_w = gdk_pixbuf_get_width(pix);
168
pix_h = gdk_pixbuf_get_height(pix);
169
gtk_image_set_from_pixbuf(GTK_IMAGE(dmp->image), pix);
170
g_object_unref(G_OBJECT(pix));
174
width = pix_w + (wsize - size);
175
height = pix_h + (wsize - size);
177
if(dmp->show_button_title) {
180
gtk_widget_size_request(dmp->label, &req);
181
if(orientation == GTK_ORIENTATION_HORIZONTAL)
182
width += req.width + BORDER / 2;
184
width = (width > req.width ? width : req.width
185
+ GTK_WIDGET(dmp->label)->style->xthickness);
186
height += req.height + BORDER / 2;
190
if(dmp->icon_file && dmp->show_button_title) {
191
gint delta = gtk_box_get_spacing(GTK_BOX(dmp->box));
193
if(orientation == GTK_ORIENTATION_HORIZONTAL)
199
DBG("width: %d, height: %d", width, height);
201
gtk_widget_set_size_request(dmp->button, width, height);
205
dmp_set_orientation(XfcePanelPlugin *plugin,
206
GtkOrientation orientation,
209
if(!dmp->show_button_title)
212
gtk_widget_set_size_request(dmp->button, -1, -1);
214
gtk_container_remove(GTK_CONTAINER(dmp->button),
215
gtk_bin_get_child(GTK_BIN(dmp->button)));
217
if(xfce_panel_plugin_get_orientation(plugin) == GTK_ORIENTATION_HORIZONTAL)
218
dmp->box = gtk_hbox_new(FALSE, BORDER / 2);
220
dmp->box = gtk_vbox_new(FALSE, BORDER / 2);
221
gtk_container_set_border_width(GTK_CONTAINER(dmp->box), 0);
222
gtk_widget_show(dmp->box);
223
gtk_container_add(GTK_CONTAINER(dmp->button), dmp->box);
225
gtk_widget_show(dmp->image);
226
gtk_box_pack_start(GTK_BOX(dmp->box), dmp->image, TRUE, TRUE, 0);
227
gtk_widget_show(dmp->label);
228
gtk_box_pack_start(GTK_BOX(dmp->box), dmp->label, TRUE, TRUE, 0);
230
dmp_set_size(plugin, xfce_panel_plugin_get_size(plugin), dmp);
234
show_title_toggled_cb(GtkToggleButton *tb, gpointer user_data)
236
DMPlugin *dmp = user_data;
238
dmp->show_button_title = gtk_toggle_button_get_active(tb);
240
if(dmp->show_button_title)
241
dmp_set_orientation(dmp->plugin, xfce_panel_plugin_get_orientation(dmp->plugin), dmp);
243
gtk_widget_hide(dmp->label);
244
dmp_set_size(dmp->plugin, xfce_panel_plugin_get_size(dmp->plugin), dmp);
249
dmp_free(XfcePanelPlugin *plugin, DMPlugin *dmp)
251
if(dmp->desktop_menu)
252
xfce_desktop_menu_destroy(dmp->desktop_menu);
254
gtk_object_sink(GTK_OBJECT(dmp->tooltip));
257
g_free(dmp->menu_file);
259
g_free(dmp->icon_file);
260
if(dmp->button_title)
261
g_free(dmp->button_title);
267
dmp_position_menu (GtkMenu *menu, int *x, int *y, gboolean *push_in,
270
XfceScreenPosition pos;
273
gtk_widget_size_request(GTK_WIDGET(menu), &req);
275
gdk_window_get_origin (GTK_WIDGET (dmp->plugin)->window, x, y);
277
pos = xfce_panel_plugin_get_screen_position(dmp->plugin);
280
case XFCE_SCREEN_POSITION_NW_V:
281
case XFCE_SCREEN_POSITION_W:
282
case XFCE_SCREEN_POSITION_SW_V:
283
*x += dmp->button->allocation.width;
284
*y += dmp->button->allocation.height - req.height;
287
case XFCE_SCREEN_POSITION_NE_V:
288
case XFCE_SCREEN_POSITION_E:
289
case XFCE_SCREEN_POSITION_SE_V:
291
*y += dmp->button->allocation.height - req.height;
294
case XFCE_SCREEN_POSITION_NW_H:
295
case XFCE_SCREEN_POSITION_N:
296
case XFCE_SCREEN_POSITION_NE_H:
297
*y += dmp->button->allocation.height;
300
case XFCE_SCREEN_POSITION_SW_H:
301
case XFCE_SCREEN_POSITION_S:
302
case XFCE_SCREEN_POSITION_SE_H:
306
default: /* floating */
308
GdkScreen *screen = NULL;
309
gint screen_width, screen_height;
311
gdk_display_get_pointer(gtk_widget_get_display(GTK_WIDGET(dmp->plugin)),
312
&screen, x, y, NULL);
313
screen_width = gdk_screen_get_width(screen);
314
screen_height = gdk_screen_get_height(screen);
315
if ((*x + req.width) > screen_width)
317
if ((*y + req.height) > screen_height)
328
/* TODO: wtf is this ? */
333
menu_destroy_idled(gpointer data)
335
gtk_widget_destroy(GTK_WIDGET(data));
340
menu_deactivated(GtkWidget *menu, gpointer user_data)
342
DMPlugin *dmp = user_data;
344
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dmp->button), FALSE);
345
g_idle_add(menu_destroy_idled, menu);
349
menu_activate(DMPlugin *dmp, gboolean at_pointer)
354
button = dmp->button;
355
if(!dmp->desktop_menu) {
356
g_critical("dmp->desktop_menu is NULL - module load failed?");
357
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
360
if(xfce_desktop_menu_need_update(dmp->desktop_menu))
361
xfce_desktop_menu_force_regen(dmp->desktop_menu);
363
menu = xfce_desktop_menu_get_widget(dmp->desktop_menu);
365
g_signal_connect(menu, "deactivate",
366
G_CALLBACK(menu_deactivated), dmp);
368
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
369
xfce_panel_plugin_register_menu (dmp->plugin, GTK_MENU(menu));
370
gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
371
(GtkMenuPositionFunc)(at_pointer ? NULL : dmp_position_menu),
372
dmp, 1, gtk_get_current_event_time());
374
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
378
dmp_message_received(GtkWidget *w,
382
DMPlugin *dmp = user_data;
387
button = dmp->button;
388
gscreen = gtk_widget_get_screen (button);
389
root = gdk_screen_get_root_window(gscreen);
390
if(!xfdesktop_popup_grab_available(root, GDK_CURRENT_TIME))
392
g_critical("Unable to get keyboard/mouse grab.");
396
if(evt->data_format == 8) {
397
if(strcmp(XFCE_MENU_MESSAGE, evt->data.b) == 0) {
398
menu_activate(dmp, FALSE);
401
if(strcmp(XFCE_MENU_AT_POINTER_MESSAGE, evt->data.b) == 0) {
402
menu_activate(dmp, TRUE);
411
dmp_popup(GtkWidget *w,
415
DMPlugin *dmp = user_data;
417
if(evt->button != 1 || ((evt->state & GDK_CONTROL_MASK)
418
&& !(evt->state & (GDK_MOD1_MASK|GDK_SHIFT_MASK
421
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), FALSE);
425
menu_activate(dmp, FALSE);
431
dmp_set_defaults(DMPlugin *dmp)
433
dmp->use_default_menu = TRUE;
434
dmp->menu_file = NULL;
435
dmp->icon_file = g_strdup(DEFAULT_BUTTON_ICON);
436
dmp->show_menu_icons = TRUE;
437
dmp->button_title = g_strdup(_(DEFAULT_BUTTON_TITLE));
438
dmp->show_button_title = TRUE;
442
dmp_read_config(XfcePanelPlugin *plugin, DMPlugin *dmp)
448
if(!(cfgfile = xfce_panel_plugin_lookup_rc_file(plugin))) {
449
dmp_set_defaults(dmp);
453
rcfile = xfce_rc_simple_open(cfgfile, TRUE);
457
dmp_set_defaults(dmp);
461
dmp->use_default_menu = xfce_rc_read_bool_entry(rcfile, "use_default_menu",
464
value = xfce_rc_read_entry(rcfile, "menu_file", NULL);
466
g_free(dmp->menu_file);
467
dmp->menu_file = g_strdup(value);
469
dmp->use_default_menu = TRUE;
471
value = xfce_rc_read_entry(rcfile, "icon_file", NULL);
473
g_free(dmp->icon_file);
474
dmp->icon_file = g_strdup(value);
476
dmp->icon_file = g_strdup(DEFAULT_BUTTON_ICON);
478
dmp->show_menu_icons = xfce_rc_read_bool_entry(rcfile, "show_menu_icons",
481
value = xfce_rc_read_entry(rcfile, "button_title", NULL);
483
g_free(dmp->button_title);
484
dmp->button_title = g_strdup(value);
486
dmp->button_title = g_strdup(_(DEFAULT_BUTTON_TITLE));
488
dmp->show_button_title = xfce_rc_read_bool_entry(rcfile,
492
xfce_rc_close(rcfile);
496
dmp_write_config(XfcePanelPlugin *plugin, DMPlugin *dmp)
501
if(!(cfgfile = xfce_panel_plugin_save_location(plugin, TRUE)))
504
rcfile = xfce_rc_simple_open(cfgfile, FALSE);
507
xfce_rc_write_bool_entry(rcfile, "use_default_menu", dmp->use_default_menu);
508
xfce_rc_write_entry(rcfile, "menu_file", dmp->menu_file ? dmp->menu_file : "");
509
xfce_rc_write_entry(rcfile, "icon_file", dmp->icon_file ? dmp->icon_file : "");
510
xfce_rc_write_bool_entry(rcfile, "show_menu_icons", dmp->show_menu_icons);
511
xfce_rc_write_entry(rcfile, "button_title", dmp->button_title ? dmp->button_title : "");
512
xfce_rc_write_bool_entry(rcfile, "show_button_title", dmp->show_button_title);
514
xfce_rc_close(rcfile);
518
dmp_menu_file_set(GtkFileChooser *fc,
521
DMPlugin *dmp = user_data;
523
g_free(dmp->menu_file);
524
dmp->menu_file = gtk_file_chooser_get_filename(fc);
525
if(!dmp->menu_file|| !g_file_test(dmp->menu_file, G_FILE_TEST_EXISTS)) {
526
g_free(dmp->menu_file);
527
dmp->menu_file = NULL;
531
if(dmp->desktop_menu) {
532
const gchar *cur_file = xfce_desktop_menu_get_menu_file(dmp->desktop_menu);
533
if(strcmp(dmp->menu_file, cur_file)) {
535
xfce_desktop_menu_destroy(dmp->desktop_menu);
536
path = dmp_get_real_path(dmp->menu_file);
537
dmp->desktop_menu = xfce_desktop_menu_new(path, TRUE);
539
if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dmp->icons_chk)))
540
xfce_desktop_menu_set_show_icons(dmp->desktop_menu, FALSE);
546
dmp_icon_file_set(GtkFileChooser *fc,
549
DMPlugin *dmp = user_data;
551
g_free(dmp->icon_file);
552
dmp->icon_file = gtk_file_chooser_get_filename(fc);
554
if(dmp->icon_file && *dmp->icon_file)
555
dmp_set_size(dmp->plugin, xfce_panel_plugin_get_size(dmp->plugin), dmp);
557
gtk_image_set_from_pixbuf(GTK_IMAGE(dmp->image), NULL);
561
icon_chk_cb(GtkToggleButton *w, gpointer user_data)
563
DMPlugin *dmp = user_data;
565
dmp->show_menu_icons = gtk_toggle_button_get_active(w);
566
if(dmp->desktop_menu)
567
xfce_desktop_menu_set_show_icons(dmp->desktop_menu, dmp->show_menu_icons);
571
dmp_use_desktop_menu_toggled_cb(GtkToggleButton *tb, gpointer user_data)
573
DMPlugin *dmp = user_data;
575
if(gtk_toggle_button_get_active(tb)) {
578
dmp->use_default_menu = TRUE;
580
hbox = g_object_get_data(G_OBJECT(tb), "dmp-child-hbox");
581
gtk_widget_set_sensitive(hbox, FALSE);
583
if(dmp->desktop_menu)
584
xfce_desktop_menu_destroy(dmp->desktop_menu);
585
dmp->desktop_menu = xfce_desktop_menu_new(NULL, TRUE);
590
dmp_use_custom_menu_toggled_cb(GtkToggleButton *tb, gpointer user_data)
592
DMPlugin *dmp = user_data;
594
if(gtk_toggle_button_get_active(tb)) {
597
dmp->use_default_menu = FALSE;
599
hbox = g_object_get_data(G_OBJECT(tb), "dmp-child-hbox");
600
gtk_widget_set_sensitive(hbox, TRUE);
602
if(dmp->menu_file && g_file_test(dmp->menu_file, G_FILE_TEST_EXISTS)) {
603
if(dmp->desktop_menu)
604
xfce_desktop_menu_destroy(dmp->desktop_menu);
605
dmp->desktop_menu = xfce_desktop_menu_new(dmp->menu_file, TRUE);
611
dmp_button_title_focus_out_cb(GtkWidget *w, GdkEventFocus *evt,
614
DMPlugin *dmp = user_data;
616
if(dmp->button_title)
617
g_free(dmp->button_title);
618
dmp->button_title = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1);
620
gtk_tooltips_set_tip(dmp->tooltip, dmp->button, dmp->button_title, NULL);
621
gtk_label_set_text(GTK_LABEL(dmp->label), dmp->button_title);
622
dmp_set_size(dmp->plugin, xfce_panel_plugin_get_size(dmp->plugin), dmp);
629
dmp_edit_menu_clicked_cb(GtkWidget *w, gpointer user_data)
631
DMPlugin *dmp = user_data;
633
const gchar *menu_file = NULL;
636
g_return_if_fail(dmp && dmp->desktop_menu);
639
if(dmp->use_default_menu)
640
g_snprintf(cmd, PATH_MAX, "%s/xfce4-menueditor", BINDIR);
642
menu_file = xfce_desktop_menu_get_menu_file(dmp->desktop_menu);
645
g_snprintf(cmd, PATH_MAX, "%s/xfce4-menueditor \"%s\"", BINDIR,
649
if(xfce_exec(cmd, FALSE, FALSE, NULL))
652
if(dmp->use_default_menu)
653
g_strlcpy(cmd, "xfce4-menueditor", PATH_MAX);
655
g_snprintf(cmd, PATH_MAX, "xfce4-menueditor \"%s\"", menu_file);
657
if(!xfce_exec(cmd, FALSE, FALSE, &err)) {
658
xfce_warn(_("Unable to launch xfce4-menueditor: %s"), err->message);
665
dmp_options_dlg_response_cb(GtkDialog *dialog, gint response, DMPlugin *dmp)
667
gtk_widget_destroy(GTK_WIDGET(dialog));
668
xfce_panel_plugin_unblock_menu(dmp->plugin);
669
dmp_write_config(dmp->plugin, dmp);
673
dmp_create_file_chooser_button(DMPlugin *dmp,
677
GtkFileFilter *filter;
681
title = _("Select Icon");
683
title = _("Select Menu File");
685
chooser = gtk_file_chooser_button_new(title, GTK_FILE_CHOOSER_ACTION_OPEN);
688
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(chooser),
689
DATADIR "/pixmaps", NULL);
693
dir = xfce_resource_save_location(XFCE_RESOURCE_CONFIG, "menus/",
696
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(chooser),
701
dir = xfce_resource_lookup(XFCE_RESOURCE_CONFIG, "menus/");
703
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(chooser),
709
filter = gtk_file_filter_new();
710
gtk_file_filter_set_name(filter, _("All Files"));
711
gtk_file_filter_add_pattern(filter, "*");
712
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
713
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), filter);
715
filter = gtk_file_filter_new();
717
gtk_file_filter_set_name(filter, _("Image Files"));
718
gtk_file_filter_add_pixbuf_formats(filter);
720
gtk_file_filter_set_name(filter, _("Menu Files"));
721
gtk_file_filter_add_pattern(filter, "*.menu");
723
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
727
exo_gtk_file_chooser_add_thumbnail_preview(GTK_FILE_CHOOSER(chooser));
730
gtk_widget_show(chooser);
736
dmp_create_options(XfcePanelPlugin *plugin, DMPlugin *dmp)
738
GtkWidget *dlg, *topvbox, *vbox, *hbox, *frame, *frame_bin, *spacer;
739
GtkWidget *label, *chk, *radio, *entry;
741
xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
743
xfce_panel_plugin_block_menu(plugin);
745
dlg = xfce_titled_dialog_new_with_buttons(_("Xfce Menu"),
746
GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(plugin))),
747
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
748
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
749
gtk_container_set_border_width(GTK_CONTAINER(dlg), 0);
750
g_signal_connect(G_OBJECT(dlg), "response",
751
G_CALLBACK(dmp_options_dlg_response_cb), dmp);
753
topvbox = gtk_vbox_new(FALSE, BORDER / 2);
754
gtk_widget_show(topvbox);
755
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), topvbox, TRUE, TRUE, 0);
757
frame = xfce_create_framebox(_("Button"), &frame_bin);
758
gtk_widget_show(frame);
759
gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
761
vbox = gtk_vbox_new(FALSE, BORDER / 2);
762
gtk_widget_show(vbox);
763
gtk_container_add(GTK_CONTAINER(frame_bin), vbox);
765
hbox = gtk_hbox_new(FALSE, BORDER / 2);
766
gtk_container_set_border_width(GTK_CONTAINER(hbox), BORDER / 2);
767
gtk_widget_show(hbox);
768
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
770
label = gtk_label_new_with_mnemonic(_("Button _title:"));
771
gtk_widget_show(label);
772
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
774
entry = gtk_entry_new();
775
if(dmp->button_title)
776
gtk_entry_set_text(GTK_ENTRY(entry), dmp->button_title);
777
gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry);
778
gtk_widget_show(entry);
779
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
780
g_signal_connect(G_OBJECT(entry), "focus-out-event",
781
G_CALLBACK(dmp_button_title_focus_out_cb), dmp);
783
chk = gtk_check_button_new_with_mnemonic(_("_Show title in button"));
784
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), dmp->show_button_title);
785
gtk_widget_show(chk);
786
gtk_box_pack_start(GTK_BOX(vbox), chk, FALSE, FALSE, 0);
787
g_signal_connect(G_OBJECT(chk), "toggled",
788
G_CALLBACK(show_title_toggled_cb), dmp);
790
frame = xfce_create_framebox(_("Menu File"), &frame_bin);
791
gtk_widget_show(frame);
792
gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
794
vbox = gtk_vbox_new(FALSE, BORDER / 2);
795
gtk_widget_show(vbox);
796
gtk_container_add(GTK_CONTAINER(frame_bin), vbox);
798
/* 2nd radio button's child hbox */
799
hbox = gtk_hbox_new(FALSE, BORDER / 2);
800
gtk_widget_show(hbox);
802
radio = gtk_radio_button_new_with_mnemonic(NULL, _("Use default _desktop menu file"));
803
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), dmp->use_default_menu);
804
gtk_widget_show(radio);
805
gtk_box_pack_start(GTK_BOX(vbox), radio, FALSE, FALSE, 0);
806
g_signal_connect(G_OBJECT(radio), "toggled",
807
G_CALLBACK(dmp_use_desktop_menu_toggled_cb), dmp);
808
g_object_set_data(G_OBJECT(radio), "dmp-child-hbox", hbox);
810
radio = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio),
811
_("Use _custom menu file:"));
812
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), !dmp->use_default_menu);
813
gtk_widget_show(radio);
814
gtk_box_pack_start(GTK_BOX(vbox), radio, FALSE, FALSE, 0);
815
g_signal_connect(G_OBJECT(radio), "toggled",
816
G_CALLBACK(dmp_use_custom_menu_toggled_cb), dmp);
817
g_object_set_data(G_OBJECT(radio), "dmp-child-hbox", hbox);
819
/* now pack in the child hbox */
820
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
822
spacer = gtk_alignment_new(0.5, 0.5, 1, 1);
823
gtk_widget_show(spacer);
824
gtk_box_pack_start(GTK_BOX(hbox), spacer, FALSE, FALSE, 0);
825
gtk_widget_set_size_request(spacer, 16, -1);
827
dmp->file_entry = dmp_create_file_chooser_button(dmp, FALSE);
829
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dmp->file_entry), dmp->menu_file);
830
else if(dmp->desktop_menu) {
831
dmp->menu_file = g_strdup(xfce_desktop_menu_get_menu_file(dmp->desktop_menu));
832
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dmp->file_entry), dmp->menu_file);
834
gtk_label_set_mnemonic_widget(GTK_LABEL(label), dmp->file_entry);
835
gtk_widget_show(dmp->file_entry);
836
gtk_box_pack_start(GTK_BOX(hbox), dmp->file_entry, TRUE, TRUE, 3);
837
g_signal_connect(G_OBJECT(dmp->file_entry), "file-set",
838
G_CALLBACK(dmp_menu_file_set), dmp);
840
gtk_widget_set_sensitive(hbox, !dmp->use_default_menu);
842
#if 0 /* we don't have a menu editor anymore... */
843
spacer = gtk_alignment_new(0.5, 0.5, 1, 1);
844
gtk_widget_show(spacer);
845
gtk_box_pack_start(GTK_BOX(vbox), spacer, FALSE, FALSE, 0);
846
gtk_widget_set_size_request(spacer, -1, 4);
848
hbox = gtk_hbox_new(FALSE, BORDER / 2);
849
gtk_widget_show(hbox);
850
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
852
btn = xfce_create_mixed_button(GTK_STOCK_EDIT, _("_Edit Menu"));
853
gtk_widget_show(btn);
854
gtk_box_pack_end(GTK_BOX(hbox), btn, FALSE, FALSE, 0);
855
g_signal_connect(G_OBJECT(btn), "clicked",
856
G_CALLBACK(dmp_edit_menu_clicked_cb), dmp);
859
frame = xfce_create_framebox(_("Icons"), &frame_bin);
860
gtk_widget_show(frame);
861
gtk_box_pack_start(GTK_BOX(topvbox), frame, FALSE, FALSE, 0);
863
vbox = gtk_vbox_new(FALSE, BORDER / 2);
864
gtk_widget_show(vbox);
865
gtk_container_add(GTK_CONTAINER(frame_bin), vbox);
867
hbox = gtk_hbox_new(FALSE, BORDER / 2);
868
gtk_widget_show(hbox);
869
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
871
label = gtk_label_new_with_mnemonic(_("_Button icon:"));
872
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
873
gtk_widget_show(label);
874
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
876
dmp->icon_entry = dmp_create_file_chooser_button(dmp, TRUE);
878
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dmp->icon_entry), dmp->icon_file);
879
gtk_label_set_mnemonic_widget(GTK_LABEL(label), dmp->icon_entry);
880
gtk_widget_show(dmp->icon_entry);
881
gtk_box_pack_start(GTK_BOX(hbox), dmp->icon_entry, TRUE, TRUE, 3);
882
g_signal_connect(G_OBJECT(dmp->icon_entry), "file-set",
883
G_CALLBACK(dmp_icon_file_set), dmp);
885
dmp->icons_chk = chk = gtk_check_button_new_with_mnemonic(_("Show _icons in menu"));
886
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk), dmp->show_menu_icons);
887
gtk_widget_show(chk);
888
gtk_box_pack_start(GTK_BOX(vbox), chk, FALSE, FALSE, BORDER / 2);
889
g_signal_connect(G_OBJECT(chk), "toggled", G_CALLBACK(icon_chk_cb), dmp);
891
gtk_widget_show(dlg);
894
#ifdef XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL_FULL
896
desktop_menu_plugin_preinit(int argc,
899
#ifdef HAVE_THUNAR_VFS
907
desktop_menu_plugin_check(GdkScreen *gscreen)
909
#ifdef CHECK_RUNNING_PLUGIN
910
gchar selection_name[32];
913
g_snprintf(selection_name,
914
sizeof(selection_name),
915
XFCE_MENU_SELECTION"%d",
916
gdk_screen_get_number (gscreen));
917
selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);
919
if(XGetSelectionOwner(GDK_DISPLAY(), selection_atom)) {
920
xfce_info(_("There is already a panel menu registered for this screen"));
929
dmp_set_selection(DMPlugin *dmp)
932
gchar selection_name[32];
937
win = gtk_invisible_new();
938
gtk_widget_realize(win);
939
xwin = GDK_WINDOW_XID(GTK_WIDGET(win)->window);
941
gscreen = gtk_widget_get_screen (win);
942
g_snprintf(selection_name,
943
sizeof(selection_name),
944
XFCE_MENU_SELECTION"%d",
945
gdk_screen_get_number (gscreen));
946
selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);
948
if(XGetSelectionOwner(GDK_DISPLAY(), selection_atom)) {
949
gtk_widget_destroy (win);
953
XSelectInput(GDK_DISPLAY(), xwin, PropertyChangeMask);
954
XSetSelectionOwner(GDK_DISPLAY(), selection_atom, xwin, GDK_CURRENT_TIME);
956
g_signal_connect(G_OBJECT(win), "client-event",
957
G_CALLBACK(dmp_message_received), dmp);
963
dmp_new(XfcePanelPlugin *plugin)
965
DMPlugin *dmp = g_new0(DMPlugin, 1);
967
dmp->plugin = plugin;
968
dmp_read_config(plugin, dmp);
970
dmp->tooltip = gtk_tooltips_new();
972
dmp->button = xfce_create_panel_toggle_button();
973
gtk_widget_set_name(dmp->button, "xfce-menu-button");
974
gtk_widget_show(dmp->button);
975
gtk_tooltips_set_tip(dmp->tooltip, dmp->button, dmp->button_title, NULL);
977
if(xfce_panel_plugin_get_orientation(plugin) == GTK_ORIENTATION_HORIZONTAL)
978
dmp->box = gtk_hbox_new(FALSE, BORDER / 2);
980
dmp->box = gtk_vbox_new(FALSE, BORDER / 2);
981
gtk_container_set_border_width(GTK_CONTAINER(dmp->box), 0);
982
gtk_widget_show(dmp->box);
983
gtk_container_add(GTK_CONTAINER(dmp->button), dmp->box);
985
dmp->image = gtk_image_new();
986
g_object_ref(G_OBJECT(dmp->image));
987
gtk_widget_show(dmp->image);
988
gtk_box_pack_start(GTK_BOX(dmp->box), dmp->image, TRUE, TRUE, 0);
990
dmp->label = gtk_label_new(dmp->button_title);
991
g_object_ref(G_OBJECT(dmp->label));
992
if(dmp->show_button_title)
993
gtk_widget_show(dmp->label);
994
gtk_box_pack_start(GTK_BOX(dmp->box), dmp->label, TRUE, TRUE, 0);
996
dmp->desktop_menu = xfce_desktop_menu_new(!dmp->use_default_menu
997
? dmp->menu_file : NULL,
999
if(dmp->desktop_menu) {
1000
xfce_desktop_menu_set_show_icons(dmp->desktop_menu,
1001
dmp->show_menu_icons);
1002
xfce_desktop_menu_start_autoregen(dmp->desktop_menu, 10);
1004
g_signal_connect(G_OBJECT(dmp->button), "button-press-event",
1005
G_CALLBACK(dmp_popup), dmp);
1006
dmp_set_selection(dmp);
1012
desktop_menu_plugin_construct(XfcePanelPlugin *plugin)
1016
GtkWidget *mi, *img;
1019
xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
1021
#ifdef HAVE_THUNAR_VFS
1025
if(!(dmp = dmp_new(plugin)))
1028
xfce_panel_plugin_add_action_widget(plugin, dmp->button);
1029
gtk_container_add(GTK_CONTAINER(plugin), dmp->button);
1032
/* Add edit menu option to right click menu */
1033
img = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU);
1034
gtk_widget_show(img);
1035
mi = gtk_image_menu_item_new_with_label(_("Edit Menu"));
1036
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
1037
gtk_widget_show(mi);
1038
xfce_panel_plugin_menu_insert_item(plugin, GTK_MENU_ITEM(mi));
1039
g_signal_connect(G_OBJECT(mi), "activate",
1040
G_CALLBACK(dmp_edit_menu_clicked_cb), dmp);
1043
g_signal_connect(plugin, "free-data",
1044
G_CALLBACK(dmp_free), dmp);
1045
g_signal_connect(plugin, "save",
1046
G_CALLBACK(dmp_write_config), dmp);
1047
g_signal_connect(plugin, "configure-plugin",
1048
G_CALLBACK(dmp_create_options), dmp);
1049
g_signal_connect(plugin, "size-changed",
1050
G_CALLBACK(dmp_set_size), dmp);
1051
g_signal_connect(plugin, "orientation-changed",
1052
G_CALLBACK(dmp_set_orientation), dmp);
1054
xfce_panel_plugin_menu_show_configure(plugin);
1056
dmp_set_size(plugin, xfce_panel_plugin_get_size(plugin), dmp);
1059
#ifdef XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL_FULL
1060
XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL_FULL(desktop_menu_plugin_construct,
1061
desktop_menu_plugin_preinit,
1062
desktop_menu_plugin_check)
1064
XFCE_PANEL_PLUGIN_REGISTER_EXTERNAL_WITH_CHECK(desktop_menu_plugin_construct,
1065
desktop_menu_plugin_check)