2
2
* File: panel-menu-bar.c
3
3
* Created: October 2007
4
4
* Created by: Axel von Bertoldi
5
* Last Modified: January 2008
5
* Last Modified: August 2008
6
6
* Last Modified by: Axel von Bertoldi
7
7
* (C) 2005-2008 Axel von Bertoldi
27
27
#include <glib/gprintf.h>
28
#include <gdk/gdkkeysyms.h>
28
29
#include "panel-menu-bar.h"
29
30
#include "preferences.h"
30
31
#include "menu-browser.h"
34
#ifdef ENABLE_GTK_HOTKEY
35
#include <gtkhotkey.h>
33
38
/******************************************************************************/
34
39
#define PANEL_MENU_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_PANEL_MENU_BAR, PanelMenuBarPrivate))
35
40
#define TOOLTIP_TEXT "Browse and open files in your home directory"
60
64
/******************************************************************************/
62
66
panel_menu_bar_edit_prefs (PanelMenuBar *self) {
67
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
69
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
63
71
AppletPreferences *prefs = self->priv->prefs;
64
72
applet_preferences_make_dialog (prefs);
68
76
panel_menu_bar_change_orient (PanelApplet *applet,
69
77
PanelAppletOrient orientation,
70
78
PanelMenuBar *self) {
79
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
81
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
72
84
gboolean text_vertical = FALSE;
73
85
gdouble text_angle;
125
137
g_assert_not_reached ();
128
/* update the menu_bar pack direction */
140
/* update the menu_bar pack direction */
129
141
gtk_menu_bar_set_pack_direction (GTK_MENU_BAR (self), pack_direction);
130
142
gtk_menu_bar_set_child_pack_direction (GTK_MENU_BAR (self), pack_direction);
136
148
gtk_label_set_angle (GTK_LABEL (label), text_angle);
137
149
gtk_misc_set_alignment (GTK_MISC (label), text_xalign, text_yalign);
139
if (DEBUG) g_printf ("Changing panel orientation : %d\n", orientation);
142
153
/******************************************************************************/
143
154
static void /* Taken from the Main Menu Bar Applet */
144
155
panel_menu_bar_size_allocate (GtkWidget *widget,
145
156
GtkAllocation *allocation) {
157
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
146
159
PanelMenuBar *self = (PanelMenuBar *)widget;
161
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
149
164
allocation->x = 0;
150
165
allocation->y = 0;
154
169
/* update the panel's width */
155
170
self->priv->panel_size = allocation->height;
156
if (self->priv->orientation == PANEL_APPLET_ORIENT_RIGHT ||
171
if (self->priv->orientation == PANEL_APPLET_ORIENT_RIGHT ||
157
172
self->priv->orientation == PANEL_APPLET_ORIENT_LEFT) {
158
173
self->priv->panel_size = allocation->width;
184
190
GdkPixmap *pixmap,
185
191
PanelMenuBar *self) {
192
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
194
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
186
196
GtkRcStyle *rc_style;
189
199
/* reset style */
190
200
gtk_widget_set_style (GTK_WIDGET (self), NULL);
191
201
rc_style = gtk_rc_style_new ();
192
202
gtk_widget_modify_style (GTK_WIDGET (self), rc_style);
193
gtk_rc_style_unref (rc_style);
203
gtk_rc_style_unref (rc_style);
196
206
case PANEL_COLOR_BACKGROUND:
197
207
gtk_widget_modify_bg (GTK_WIDGET (self),
202
212
case PANEL_PIXMAP_BACKGROUND:
203
213
style = gtk_style_copy (GTK_WIDGET (self)->style);
204
214
if (style->bg_pixmap[GTK_STATE_NORMAL] != NULL)
208
218
gtk_widget_set_style (GTK_WIDGET (self), style);
209
219
g_object_unref (style);
212
222
case PANEL_NO_BACKGROUND:
216
if (DEBUG) g_printf ("Changing Applet Background\n");
219
228
/******************************************************************************/
221
230
panel_menu_bar_update_image (PanelMenuBar *self) {
231
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
233
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
222
235
GtkWidget *image = NULL;
223
236
AppletPreferences *a_prefs = self->priv->prefs;
224
237
GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, 0));
244
257
/******************************************************************************/
258
#ifdef ENABLE_GTK_HOTKEY
260
panel_menu_bar_on_hotkey_press (GtkHotkeyInfo *hot_key_info,
262
PanelMenuBar *self) {
263
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
265
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
267
MenuBrowser *menu_browser = (MenuBrowser *)(g_ptr_array_index (self->priv->file_browsers, 0));
269
GTK_MENU_SHELL (self)->active = TRUE;
270
gtk_menu_shell_set_take_focus (GTK_MENU_SHELL (self), TRUE);
271
gtk_menu_shell_select_item (GTK_MENU_SHELL (self),
272
GTK_WIDGET (menu_browser));
274
/******************************************************************************/
246
276
panel_menu_bar_add_keybinding (PanelMenuBar *self) {
248
GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, 0));
249
GtkBindingSet *binding_set;
250
binding_set = gtk_binding_set_by_class (panel_menu_bar_parent_class);
251
gtk_binding_entry_add_signal (binding_set,
253
GDK_SHIFT_MASK | GDK_CONTROL_MASK,
277
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
279
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
281
GError *error = NULL;
283
GtkHotkeyInfo *hot_key_info = gtk_hotkey_info_new ("file-browser-applet",
284
"file-browser-applet",
288
g_signal_connect (G_OBJECT (hot_key_info),
290
G_CALLBACK (panel_menu_bar_on_hotkey_press),
293
gtk_hotkey_info_bind (hot_key_info, &error);
258
296
/******************************************************************************/
260
298
panel_menu_bar_update_entry (PanelMenuBar *self,
261
299
PrefsChangedSignalData *signal_data) {
300
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
302
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
262
304
GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
264
306
menu_browser_update (MENU_BROWSER (menu_browser),
271
313
panel_menu_bar_move_entry (PanelMenuBar *self,
272
314
PrefsChangedSignalData *signal_data) {
315
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
317
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
274
320
GtkWidget *menu_browser = NULL;
275
321
GtkWidget *menu_browser_affected = NULL;
313
359
panel_menu_bar_remove_entry (PanelMenuBar *self,
361
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
363
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
315
365
GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, instance));
317
367
if (menu_browser != NULL) {
329
379
panel_menu_bar_add_entry (PanelMenuBar *self,
382
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
384
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
333
386
GtkWidget *menu_browser = menu_browser_new (path,
348
401
panel_menu_bar_on_preferences_changed (AppletPreferences *a_prefs,
349
402
PrefsChangedSignalData *signal_data,
351
PanelMenuBar *self = (PanelMenuBar *)data;
403
PanelMenuBar *self) {
404
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
406
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
353
408
switch (signal_data->signal_id) {
354
409
case PREFS_SIGNAL_TERMINAL :
420
477
requisition.width < pointer_x) {
421
478
menu_x += MIN (pointer_x, applet->allocation.width - requisition.width);
425
482
menu_x += applet->allocation.width - requisition.width;
426
483
if (pointer_x > 0 && pointer_x < applet->allocation.width &&
462
519
panel_menu_bar_on_deactivate (GtkWidget *widget,
463
520
PanelMenuBar *self) {
521
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
523
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
464
525
g_object_set (G_OBJECT (widget), "has-tooltip", TRUE, NULL);
465
self->priv->child_active = FALSE;
467
527
/******************************************************************************/
469
panel_menu_bar_on_activate (GtkWidget *widget,
470
GdkEventButton *event,
471
PanelMenuBar *self) {
529
panel_menu_bar_on_button_press (GtkWidget *widget,
530
GdkEventButton *event,
531
PanelMenuBar *self) {
532
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
534
g_return_val_if_fail (self == NULL || IS_PANEL_MENU_BAR (self), TRUE);
536
GtkMenuShell *menu_shell = GTK_MENU_SHELL (self);
472
538
if (event->button == 3) {
473
if (!self->priv->child_active) {
474
/* popup the applet context menu and make sure it's poped up in the
539
if (!menu_shell->active) {
540
/* popup the applet context menu on right-clicks and make sure it's
541
* popped up in the right place */
476
542
gtk_menu_shell_deactivate (GTK_MENU_SHELL (self));
478
544
bonobo_control_do_popup_full (self->priv->bonobo_control,
555
else if (event->button == 2) {
556
/* Do nothing on middle-clicks */
490
g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
491
self->priv->child_active = TRUE;
560
/* Activate the menu only on left-clicks */
561
g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
495
565
/******************************************************************************/
567
panel_menu_bar_on_key_press (GtkWidget *widget,
569
PanelMenuBar *self) {
570
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
572
g_return_val_if_fail (self == NULL || IS_PANEL_MENU_BAR (self), TRUE);
574
if ((event->keyval == GDK_Menu) ||
575
(event->keyval == GDK_F10 &&
576
(event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK)){
577
bonobo_control_do_popup_full (self->priv->bonobo_control,
580
(GtkMenuPositionFunc) panel_menu_bar_position_menu,
586
g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
589
/******************************************************************************/
497
591
panel_menu_bar_new (PanelApplet* applet) {
592
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
594
g_return_val_if_fail (applet == NULL || PANEL_IS_APPLET (applet), NULL);
498
596
PanelMenuBar *self;
500
598
g_return_val_if_fail (applet == NULL || PANEL_IS_APPLET (applet), NULL);
503
601
g_signal_connect (GTK_MENU_BAR (self),
504
602
"button_press_event",
505
G_CALLBACK (panel_menu_bar_on_activate),
603
G_CALLBACK (panel_menu_bar_on_button_press),
605
g_signal_connect (GTK_MENU_BAR (self),
607
G_CALLBACK (panel_menu_bar_on_key_press),
508
610
g_signal_connect (GTK_MENU_SHELL (self),
528
630
gtk_widget_set_tooltip_text (GTK_WIDGET (self), _(TOOLTIP_TEXT));
530
632
/* get the applet configuration */
531
633
self->priv->prefs = applet_preferences_new (applet);
533
635
MenuBarPrefs *mb_prefs = self->priv->prefs->menu_bar_prefs;
534
636
g_signal_connect (G_OBJECT (self->priv->prefs),
536
G_CALLBACK (panel_menu_bar_on_preferences_changed),
638
G_CALLBACK (panel_menu_bar_on_preferences_changed),
539
641
/* for each path in the config, make a browser object */
550
652
/* add the image to the menu item */
551
653
panel_menu_bar_update_image (self);
553
gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));
655
gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));
555
657
/* make sure the text orientation is correct on startup */
556
658
self->priv->text_vertical = FALSE;
558
660
/* get a handle to the applet context menu */
559
661
self->priv->bonobo_control = panel_applet_get_control (applet);
663
#ifdef ENABLE_GTK_HOTKEY
561
664
/* setup global keybinding */
562
665
panel_menu_bar_add_keybinding (self);
564
self->priv->child_active = FALSE;
568
670
/******************************************************************************/
569
671
static void panel_menu_bar_class_init (PanelMenuBarClass * klass) {
672
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
570
674
panel_menu_bar_parent_class = g_type_class_peek_parent (klass);
571
675
g_type_class_add_private (klass, sizeof (PanelMenuBarPrivate));
572
676
G_OBJECT_CLASS (klass)->dispose = panel_menu_bar_dispose;
585
689
/******************************************************************************/
587
691
panel_menu_bar_init (PanelMenuBar * self) {
692
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
694
g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
588
696
self->priv = PANEL_MENU_BAR_GET_PRIVATE (self);
591
699
/******************************************************************************/
593
701
panel_menu_bar_dispose (GObject *obj) {
702
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
594
704
PanelMenuBar *self;
595
705
PanelMenuBarClass *klass;
596
706
/* GObjectClass * parent_class;*/
605
715
/******************************************************************************/
607
717
panel_menu_bar_get_type (void) {
718
if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
608
720
static GType panel_menu_bar_type_id = 0;
609
721
if (G_UNLIKELY (panel_menu_bar_type_id == 0)) {
610
722
static const GTypeInfo g_define_type_info = {sizeof (PanelMenuBarClass),