~ubuntu-branches/ubuntu/karmic/file-browser-applet/karmic

« back to all changes in this revision

Viewing changes to src/panel-menu-bar.c

  • Committer: Bazaar Package Importer
  • Author(s): Andrew Starr-Bochicchio
  • Date: 2009-04-11 17:15:39 UTC
  • mfrom: (1.1.4 upstream) (2.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090411171539-jk4kgkvm4i39nv3c
Tags: 0.6.2-1
* New upstream release. (Closes: #504525)
 - Added context menu with a few actions (open-with, new folder here, 
   delete file/folder, create/extract archive, create CD/DVD from 
   file/folder, compile a tex file).
 - Added configuration option to make text vertical/horizontal when 
   the panel is vertical.
 - Added tooltips to configuration dialog.
 - Fixes upstream bugs #21, #30, #34, #37, #39, #43, #44, #45, #49, 
   #51, #56, #59, #60, and #62.
 - Added mnemonic keyboard shortcut to menus for 
   faster keyboard navigation.
 - Added recent documents' support.
 - Improved menu browser focus after context menu close.
 - Added preliminary DnD dragging out of applet. MOVE is the default 
   behaviour.
 - Some code cleanups and plugged memory leaks.
 - Slightly improved "New Folder" dialog.
 - Migrated to gtk+ builder from libglade.
* debian/control:
 - Add suggests on file-roller, brasero, and rubber 
   for new features.
 - Add Vcs-Bzr field.
 - Drop depricated libglade2-dev Build-Depend
 - Drop unneeded libpanel-applet2-0 Depend. Already picked up by 
   shlibs:Depends.
 - Add versionized Build-Depend on libgtk2.0-dev (>= 2.14)
 - Bump Standards-Version to 3.8.1
* debian/copyright:
 - Use /usr/share/common-licenses/GPL-2 rather than just GLP.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * File:                                panel-menu-bar.c
3
 
 * Created:                             October 2007
4
 
 * Created by:                  Axel von Bertoldi
5
 
 * Last Modified:               August 2008
6
 
 * Last Modified by:    Axel von Bertoldi
7
 
 * (C) 2005-2008                Axel von Bertoldi
 
2
 * File:                panel-menu-bar.c
 
3
 * Created:             October 2007
 
4
 * Created by:          Axel von Bertoldi
 
5
 * Last Modified:       August 2008
 
6
 * Last Modified by:    Axel von Bertoldi
 
7
 * (C) 2005-2008        Axel von Bertoldi
8
8
 *
9
9
 * This program is free software; you can redistribute it and/or modify it
10
10
 * under the terms of the GNU General Public License as published by the Free
40
40
 
41
41
/******************************************************************************/
42
42
#define PANEL_MENU_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_PANEL_MENU_BAR, PanelMenuBarPrivate))
43
 
#define TOOLTIP_TEXT            _("Browse and open files in your home directory")
 
43
#define TOOLTIP_TEXT        _("Browse and open files in your home directory")
44
44
/******************************************************************************/
45
45
struct _PanelMenuBarPrivate {
46
 
        PanelApplet                     *applet;
47
 
        GPtrArray                       *file_browsers;
48
 
        AppletPreferences       *prefs;
49
 
        PanelAppletOrient       orientation;
50
 
        gint                            panel_size;
51
 
        gboolean                        text_vertical;
52
 
        BonoboControl           *bonobo_control;
 
46
    PanelApplet         *applet;
 
47
    GPtrArray           *file_browsers;
 
48
    AppletPreferences   *prefs;
 
49
    PanelAppletOrient   orientation;
 
50
    gint                panel_size;
 
51
    gboolean            text_vertical;
 
52
    BonoboControl       *bonobo_control;
53
53
};
54
54
/******************************************************************************/
55
55
enum {
56
 
        PANEL_MENU_BAR_DUMMY_PROPERTY
 
56
    PANEL_MENU_BAR_DUMMY_PROPERTY
57
57
};
58
58
 
59
59
enum {
60
 
        PROP_0,
61
 
        PROP_ORIENTATION,
 
60
    PROP_0,
 
61
    PROP_ORIENTATION,
62
62
};
63
63
/******************************************************************************/
64
64
static gpointer panel_menu_bar_parent_class = NULL;
66
66
/******************************************************************************/
67
67
void
68
68
panel_menu_bar_edit_prefs (PanelMenuBar *self) {
69
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
70
 
 
71
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
72
 
 
73
 
        AppletPreferences *prefs = self->priv->prefs;
74
 
        applet_preferences_make_dialog (prefs);
 
69
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
70
 
 
71
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
72
 
 
73
    AppletPreferences *prefs = self->priv->prefs;
 
74
    applet_preferences_make_dialog (prefs);
75
75
}
76
76
/******************************************************************************/
77
 
static void     /* Originally from the Main Menu Bar Applet */
78
 
panel_menu_bar_change_orient (PanelApplet               *applet,
79
 
                                                          PanelAppletOrient     orientation,
80
 
                                                          PanelMenuBar          *self) {
81
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
82
 
 
83
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
84
 
 
85
 
        gint                            i;
86
 
        PangoEllipsizeMode      ellipsize_mode = PANGO_ELLIPSIZE_NONE;
87
 
        GtkPackDirection        pack_direction = GTK_PACK_DIRECTION_LTR;
88
 
        double                          text_angle = 0.0;
89
 
        float                           text_xalign = 0.0;
90
 
        float                           text_yalign = 0.5;
91
 
 
92
 
        /* update the panel's orientation */
93
 
        self->priv->orientation = orientation;
94
 
 
95
 
        /* set the text and pack direction and */
96
 
        switch (orientation) {
97
 
        case PANEL_APPLET_ORIENT_UP:
98
 
        case PANEL_APPLET_ORIENT_DOWN:
99
 
                /* handled by defaults */
100
 
                break;
101
 
        case PANEL_APPLET_ORIENT_RIGHT:
102
 
                if (self->priv->prefs->menu_bar_prefs->horizontal_text) {
103
 
                        pack_direction = GTK_PACK_DIRECTION_TTB;
104
 
                        ellipsize_mode = PANGO_ELLIPSIZE_END;
105
 
                }
106
 
                else {
107
 
                        pack_direction = GTK_PACK_DIRECTION_BTT;
108
 
                        text_angle = 90.0;
109
 
                        text_xalign = 0.5;
110
 
                        text_yalign = 0.0;
111
 
                }
112
 
                break;
113
 
        case PANEL_APPLET_ORIENT_LEFT:
114
 
                pack_direction = GTK_PACK_DIRECTION_TTB;
115
 
                if (self->priv->prefs->menu_bar_prefs->horizontal_text) {
116
 
                        ellipsize_mode = PANGO_ELLIPSIZE_END;
117
 
                }
118
 
                else {
119
 
                        text_angle = 270.0;
120
 
                        text_xalign = 0.5;
121
 
                        text_yalign = 0.0;
122
 
                }
123
 
                break;
124
 
        default:
125
 
                g_assert_not_reached ();
126
 
                break;
127
 
        }
128
 
        /* update the menu_bar pack direction */
129
 
        gtk_menu_bar_set_pack_direction (GTK_MENU_BAR (self), pack_direction);
130
 
        gtk_menu_bar_set_child_pack_direction (GTK_MENU_BAR (self), pack_direction);
131
 
 
132
 
        /* update the menu_item ellipsizing */
133
 
        for (i=0; i < self->priv->file_browsers->len; i++) {
134
 
                GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, i));
135
 
                GtkWidget *label = gtk_bin_get_child (GTK_BIN (menu_browser));
136
 
                if (GTK_IS_LABEL (label)) {
137
 
                        gtk_label_set_ellipsize (GTK_LABEL (label), ellipsize_mode);
138
 
                        gtk_label_set_angle             (GTK_LABEL (label), text_angle);
139
 
                        gtk_misc_set_alignment  (GTK_MISC  (label), text_xalign, text_yalign);
140
 
                }
141
 
        }
 
77
static void /* Originally from the Main Menu Bar Applet */
 
78
panel_menu_bar_change_orient (PanelApplet       *applet,
 
79
                              PanelAppletOrient orientation,
 
80
                              PanelMenuBar      *self) {
 
81
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
82
 
 
83
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
84
 
 
85
    gint                i;
 
86
    PangoEllipsizeMode  ellipsize_mode = PANGO_ELLIPSIZE_NONE;
 
87
    GtkPackDirection    pack_direction = GTK_PACK_DIRECTION_LTR;
 
88
    double              text_angle = 0.0;
 
89
    float               text_xalign = 0.0;
 
90
    float               text_yalign = 0.5;
 
91
 
 
92
    /* update the panel's orientation */
 
93
    self->priv->orientation = orientation;
 
94
 
 
95
    /* set the text and pack direction and */
 
96
    switch (orientation) {
 
97
    case PANEL_APPLET_ORIENT_UP:
 
98
    case PANEL_APPLET_ORIENT_DOWN:
 
99
        /* handled by defaults */
 
100
        break;
 
101
    case PANEL_APPLET_ORIENT_RIGHT:
 
102
        if (self->priv->prefs->menu_bar_prefs->horizontal_text) {
 
103
            pack_direction = GTK_PACK_DIRECTION_TTB;
 
104
            ellipsize_mode = PANGO_ELLIPSIZE_END;
 
105
        }
 
106
        else {
 
107
            pack_direction = GTK_PACK_DIRECTION_BTT;
 
108
            text_angle = 90.0;
 
109
            text_xalign = 0.5;
 
110
            text_yalign = 0.0;
 
111
        }
 
112
        break;
 
113
    case PANEL_APPLET_ORIENT_LEFT:
 
114
        pack_direction = GTK_PACK_DIRECTION_TTB;
 
115
        if (self->priv->prefs->menu_bar_prefs->horizontal_text) {
 
116
            ellipsize_mode = PANGO_ELLIPSIZE_END;
 
117
        }
 
118
        else {
 
119
            text_angle = 270.0;
 
120
            text_xalign = 0.5;
 
121
            text_yalign = 0.0;
 
122
        }
 
123
        break;
 
124
    default:
 
125
        g_assert_not_reached ();
 
126
        break;
 
127
    }
 
128
    /* update the menu_bar pack direction */
 
129
    gtk_menu_bar_set_pack_direction (GTK_MENU_BAR (self), pack_direction);
 
130
    gtk_menu_bar_set_child_pack_direction (GTK_MENU_BAR (self), pack_direction);
 
131
 
 
132
    /* update the menu_item ellipsizing */
 
133
    for (i=0; i < self->priv->file_browsers->len; i++) {
 
134
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, i));
 
135
        GtkWidget *label = gtk_bin_get_child (GTK_BIN (menu_browser));
 
136
        if (GTK_IS_LABEL (label)) {
 
137
            gtk_label_set_ellipsize (GTK_LABEL (label), ellipsize_mode);
 
138
            gtk_label_set_angle     (GTK_LABEL (label), text_angle);
 
139
            gtk_misc_set_alignment  (GTK_MISC  (label), text_xalign, text_yalign);
 
140
        }
 
141
    }
142
142
}
143
143
/******************************************************************************/
144
144
static void
145
145
panel_menu_bar_update_orient (PanelMenuBar *self) {
146
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
146
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
147
147
 
148
 
        PanelAppletOrient orientation = panel_applet_get_orient (PANEL_APPLET (self->priv->applet));
149
 
        panel_menu_bar_change_orient (self->priv->applet, orientation, self);
 
148
    PanelAppletOrient orientation = panel_applet_get_orient (PANEL_APPLET (self->priv->applet));
 
149
    panel_menu_bar_change_orient (self->priv->applet, orientation, self);
150
150
}
151
151
/******************************************************************************/
152
 
static void     /* Taken from the Main Menu Bar Applet */
 
152
static void /* Taken from the Main Menu Bar Applet */
153
153
panel_menu_bar_size_allocate (GtkWidget *widget,
154
 
                                                          GtkAllocation *allocation) {
155
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
156
 
 
157
 
        PanelMenuBar *self = (PanelMenuBar *)widget;
158
 
 
159
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
160
 
 
161
 
        /* WTF!? */
162
 
        allocation->x = 0;
163
 
        allocation->y = 0;
164
 
        allocation->height += 2;
165
 
        allocation->width += 2;
166
 
 
167
 
        /* update the panel's width */
168
 
        self->priv->panel_size = allocation->height;
169
 
        if (self->priv->orientation == PANEL_APPLET_ORIENT_RIGHT ||
170
 
                self->priv->orientation == PANEL_APPLET_ORIENT_LEFT) {
171
 
                self->priv->panel_size = allocation->width;
172
 
        }
173
 
 
174
 
        GTK_WIDGET_CLASS (panel_menu_bar_parent_class)->size_allocate (widget, allocation);
175
 
 
176
 
        PanelAppletOrient orientation = panel_applet_get_orient (PANEL_APPLET (self->priv->applet));
177
 
        panel_menu_bar_change_orient (self->priv->applet, orientation, self);
 
154
                              GtkAllocation *allocation) {
 
155
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
156
 
 
157
    PanelMenuBar *self = (PanelMenuBar *)widget;
 
158
 
 
159
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
160
 
 
161
    /* WTF!? */
 
162
    allocation->x = 0;
 
163
    allocation->y = 0;
 
164
    allocation->height += 2;
 
165
    allocation->width += 2;
 
166
 
 
167
    /* update the panel's width */
 
168
    self->priv->panel_size = allocation->height;
 
169
    if (self->priv->orientation == PANEL_APPLET_ORIENT_RIGHT ||
 
170
        self->priv->orientation == PANEL_APPLET_ORIENT_LEFT) {
 
171
        self->priv->panel_size = allocation->width;
 
172
    }
 
173
 
 
174
    GTK_WIDGET_CLASS (panel_menu_bar_parent_class)->size_allocate (widget, allocation);
 
175
 
 
176
    PanelAppletOrient orientation = panel_applet_get_orient (PANEL_APPLET (self->priv->applet));
 
177
    panel_menu_bar_change_orient (self->priv->applet, orientation, self);
178
178
}
179
179
/******************************************************************************/
180
 
static void     /* Taken from the Trash Applet */
181
 
panel_menu_bar_change_background (PanelApplet                           *applet,
182
 
                                          PanelAppletBackgroundType      type,
183
 
                                                                  GdkColor                  *color,
184
 
                                                                  GdkPixmap                 *pixmap,
185
 
                                                                  PanelMenuBar                          *self) {
186
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
187
 
 
188
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
189
 
 
190
 
        GtkRcStyle *rc_style;
191
 
        GtkStyle *style;
192
 
 
193
 
        /* reset style */
194
 
        gtk_widget_set_style (GTK_WIDGET (self), NULL);
195
 
        rc_style = gtk_rc_style_new ();
196
 
        gtk_widget_modify_style (GTK_WIDGET (self), rc_style);
197
 
        gtk_rc_style_unref (rc_style);
198
 
 
199
 
        switch (type) {
200
 
        case PANEL_COLOR_BACKGROUND:
201
 
                gtk_widget_modify_bg (GTK_WIDGET (self), GTK_STATE_NORMAL, color);
202
 
                break;
203
 
        case PANEL_PIXMAP_BACKGROUND:
204
 
                style = gtk_style_copy (GTK_WIDGET (self)->style);
205
 
                if (style->bg_pixmap[GTK_STATE_NORMAL] != NULL)
206
 
                        g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
207
 
 
208
 
                style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
209
 
                gtk_widget_set_style (GTK_WIDGET (self), style);
210
 
                g_object_unref (style);
211
 
                break;
212
 
        case PANEL_NO_BACKGROUND:
213
 
        default:
214
 
                break;
215
 
        }
 
180
static void /* Taken from the Trash Applet */
 
181
panel_menu_bar_change_background (PanelApplet               *applet,
 
182
                                  PanelAppletBackgroundType  type,
 
183
                                  GdkColor                  *color,
 
184
                                  GdkPixmap                 *pixmap,
 
185
                                  PanelMenuBar              *self) {
 
186
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
187
 
 
188
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
189
 
 
190
    GtkRcStyle *rc_style;
 
191
    GtkStyle *style;
 
192
 
 
193
    /* reset style */
 
194
    gtk_widget_set_style (GTK_WIDGET (self), NULL);
 
195
    rc_style = gtk_rc_style_new ();
 
196
    gtk_widget_modify_style (GTK_WIDGET (self), rc_style);
 
197
    gtk_rc_style_unref (rc_style);
 
198
 
 
199
    switch (type) {
 
200
    case PANEL_COLOR_BACKGROUND:
 
201
        gtk_widget_modify_bg (GTK_WIDGET (self), GTK_STATE_NORMAL, color);
 
202
        break;
 
203
    case PANEL_PIXMAP_BACKGROUND:
 
204
        style = gtk_style_copy (GTK_WIDGET (self)->style);
 
205
        if (style->bg_pixmap[GTK_STATE_NORMAL] != NULL)
 
206
            g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
 
207
 
 
208
        style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
 
209
        gtk_widget_set_style (GTK_WIDGET (self), style);
 
210
        g_object_unref (style);
 
211
        break;
 
212
    case PANEL_NO_BACKGROUND:
 
213
    default:
 
214
        break;
 
215
    }
216
216
}
217
217
/******************************************************************************/
218
218
static void
219
219
panel_menu_bar_update_image (PanelMenuBar *self) {
220
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
221
 
 
222
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
223
 
 
224
 
        GtkWidget *image = NULL;
225
 
        AppletPreferences *a_prefs = self->priv->prefs;
226
 
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, 0));
227
 
 
228
 
        image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menu_browser));
229
 
 
230
 
        if (image) {
231
 
                gtk_widget_destroy (image);
232
 
        }
233
 
 
234
 
        if (a_prefs->menu_bar_prefs->show_icon) {
235
 
                GtkWidget *icon = utils_get_scaled_image_from_file (a_prefs->menu_bar_prefs->icon,
236
 
                                                                                                                        ICON_BUTTON_SIZE);
237
 
                if (icon == NULL) {
238
 
                        icon = gtk_image_new_from_icon_name ("user-home", GTK_ICON_SIZE_BUTTON);
239
 
                }
240
 
 
241
 
                gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_browser),
242
 
                                                                                                                        icon);
243
 
        }
 
220
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
221
 
 
222
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
223
 
 
224
    GtkWidget *image = NULL;
 
225
    AppletPreferences *a_prefs = self->priv->prefs;
 
226
    GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, 0));
 
227
 
 
228
    image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (menu_browser));
 
229
 
 
230
    if (image) {
 
231
        gtk_widget_destroy (image);
 
232
    }
 
233
 
 
234
    if (a_prefs->menu_bar_prefs->show_icon) {
 
235
        GtkWidget *icon = utils_get_scaled_image_from_file (a_prefs->menu_bar_prefs->icon,
 
236
                                                            ICON_BUTTON_SIZE);
 
237
        if (icon == NULL) {
 
238
            icon = gtk_image_new_from_icon_name ("user-home", GTK_ICON_SIZE_BUTTON);
 
239
        }
 
240
 
 
241
        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_browser),
 
242
                                                            icon);
 
243
    }
244
244
}
245
245
/******************************************************************************/
246
246
#ifdef LIBGTKHOTKEY_FOUND
247
247
static void
248
248
panel_menu_bar_on_hotkey_press (GtkHotkeyInfo *hot_key_info,
249
 
                                                                guint event_time,
250
 
                                                                PanelMenuBar *self) {
251
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
252
 
 
253
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
254
 
 
255
 
        MenuBrowser *menu_browser = (MenuBrowser *)(g_ptr_array_index (self->priv->file_browsers, 0));
256
 
 
257
 
        GTK_MENU_SHELL (self)->active = TRUE;
258
 
        gtk_menu_shell_set_take_focus (GTK_MENU_SHELL (self), TRUE);
259
 
        gtk_menu_shell_select_item (GTK_MENU_SHELL (self), GTK_WIDGET (menu_browser));
 
249
                                guint event_time,
 
250
                                PanelMenuBar *self) {
 
251
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
252
 
 
253
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
254
 
 
255
    MenuBrowser *menu_browser = (MenuBrowser *)(g_ptr_array_index (self->priv->file_browsers, 0));
 
256
 
 
257
    GTK_MENU_SHELL (self)->active = TRUE;
 
258
    gtk_menu_shell_set_take_focus (GTK_MENU_SHELL (self), TRUE);
 
259
    gtk_menu_shell_select_item (GTK_MENU_SHELL (self), GTK_WIDGET (menu_browser));
260
260
}
261
261
/******************************************************************************/
262
262
static void
263
263
panel_menu_bar_add_keybinding (PanelMenuBar *self) {
264
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
265
 
 
266
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
267
 
 
268
 
        GError *error = NULL;
269
 
 
270
 
        GtkHotkeyInfo *hot_key_info = gtk_hotkey_info_new (APP_NAME,
 
264
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
265
 
 
266
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
267
 
 
268
    GError *error = NULL;
 
269
 
 
270
    GtkHotkeyInfo *hot_key_info = gtk_hotkey_info_new (APP_NAME,
271
271
                                                       APP_NAME,
272
272
                                                       "<Super>h",
273
 
                                                                                                           NULL);
274
 
 
275
 
        g_signal_connect (G_OBJECT (hot_key_info),
276
 
                                          "activated",
277
 
                                          G_CALLBACK (panel_menu_bar_on_hotkey_press),
278
 
                                          self);
279
 
 
280
 
        gtk_hotkey_info_bind (hot_key_info, &error);
281
 
        utils_gerror_ok (&error, TRUE);
 
273
                                                       NULL);
 
274
 
 
275
    g_signal_connect (G_OBJECT (hot_key_info),
 
276
                      "activated",
 
277
                      G_CALLBACK (panel_menu_bar_on_hotkey_press),
 
278
                      self);
 
279
 
 
280
    gtk_hotkey_info_bind (hot_key_info, &error);
 
281
    utils_gerror_ok (&error, TRUE);
282
282
}
283
283
#endif
284
284
/******************************************************************************/
285
285
static void
286
286
panel_menu_bar_update_entry (PanelMenuBar *self,
287
 
                                                         PrefsChangedSignalData *signal_data) {
288
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
289
 
 
290
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
291
 
 
292
 
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
293
 
 
294
 
        menu_browser_update (MENU_BROWSER (menu_browser), signal_data->path, signal_data->label);
 
287
                             PrefsChangedSignalData *signal_data) {
 
288
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
289
 
 
290
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
291
 
 
292
    GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
 
293
 
 
294
    menu_browser_update (MENU_BROWSER (menu_browser), signal_data->path, signal_data->label);
295
295
}
296
296
/******************************************************************************/
297
297
static void
298
298
panel_menu_bar_move_entry (PanelMenuBar *self,
299
 
                                                   PrefsChangedSignalData *signal_data) {
300
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
301
 
 
302
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
303
 
 
304
 
        int new_pos;
305
 
        GtkWidget *menu_browser = NULL;
306
 
        GtkWidget *menu_browser_affected = NULL;
307
 
 
308
 
        if (signal_data->signal_id == PREFS_SIGNAL_DIR_MOVE_UP) {
309
 
                new_pos = signal_data->instance - 1;
310
 
        }
311
 
        else if (signal_data->signal_id == PREFS_SIGNAL_DIR_MOVE_DOWN) {
312
 
                new_pos = signal_data->instance + 1;
313
 
        }
314
 
        else {
315
 
                if (DEBUG) g_printf("shitzer\n"); return;
316
 
        }
317
 
 
318
 
        if (new_pos < 0) {
319
 
                if (DEBUG) g_printf("shitzer\n"); return;
320
 
        }
321
 
 
322
 
        menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
323
 
        menu_browser_affected = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, new_pos));
324
 
 
325
 
        if (menu_browser != NULL && menu_browser_affected != NULL) {
326
 
                g_object_ref (G_OBJECT (menu_browser));
327
 
                gtk_container_remove (GTK_CONTAINER (self), menu_browser);
328
 
                gtk_menu_shell_insert (GTK_MENU_SHELL (self), menu_browser, new_pos);
329
 
                g_object_unref (G_OBJECT (menu_browser));
330
 
                self->priv->file_browsers->pdata[new_pos] = menu_browser;
331
 
                self->priv->file_browsers->pdata[signal_data->instance] = menu_browser_affected;
332
 
        }
333
 
        else {
334
 
                if (DEBUG) g_printf("shitzer\n");
335
 
        }
 
299
                           PrefsChangedSignalData *signal_data) {
 
300
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
301
 
 
302
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
303
 
 
304
    int new_pos;
 
305
    GtkWidget *menu_browser = NULL;
 
306
    GtkWidget *menu_browser_affected = NULL;
 
307
 
 
308
    if (signal_data->signal_id == PREFS_SIGNAL_DIR_MOVE_UP) {
 
309
        new_pos = signal_data->instance - 1;
 
310
    }
 
311
    else if (signal_data->signal_id == PREFS_SIGNAL_DIR_MOVE_DOWN) {
 
312
        new_pos = signal_data->instance + 1;
 
313
    }
 
314
    else {
 
315
        if (DEBUG) g_printf("shitzer\n"); return;
 
316
    }
 
317
 
 
318
    if (new_pos < 0) {
 
319
        if (DEBUG) g_printf("shitzer\n"); return;
 
320
    }
 
321
 
 
322
    menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
 
323
    menu_browser_affected = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, new_pos));
 
324
 
 
325
    if (menu_browser != NULL && menu_browser_affected != NULL) {
 
326
        g_object_ref (G_OBJECT (menu_browser));
 
327
        gtk_container_remove (GTK_CONTAINER (self), menu_browser);
 
328
        gtk_menu_shell_insert (GTK_MENU_SHELL (self), menu_browser, new_pos);
 
329
        g_object_unref (G_OBJECT (menu_browser));
 
330
        self->priv->file_browsers->pdata[new_pos] = menu_browser;
 
331
        self->priv->file_browsers->pdata[signal_data->instance] = menu_browser_affected;
 
332
    }
 
333
    else {
 
334
        if (DEBUG) g_printf("shitzer\n");
 
335
    }
336
336
}
337
337
/******************************************************************************/
338
338
static void
339
339
panel_menu_bar_remove_entry (PanelMenuBar *self, gint instance) {
340
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
341
 
 
342
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
343
 
 
344
 
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, instance));
345
 
 
346
 
        if (menu_browser != NULL) {
347
 
                gtk_container_remove (GTK_CONTAINER (self), menu_browser);
348
 
                g_ptr_array_remove_index (self->priv->file_browsers, instance);
349
 
        }
350
 
        else {
351
 
                if (DEBUG) g_printf("shitzer\n");
352
 
        }
 
340
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
341
 
 
342
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
343
 
 
344
    GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, instance));
 
345
 
 
346
    if (menu_browser != NULL) {
 
347
        gtk_container_remove (GTK_CONTAINER (self), menu_browser);
 
348
        g_ptr_array_remove_index (self->priv->file_browsers, instance);
 
349
    }
 
350
    else {
 
351
        if (DEBUG) g_printf("shitzer\n");
 
352
    }
353
353
}
354
354
/******************************************************************************/
355
355
static void
356
356
panel_menu_bar_add_entry (PanelMenuBar *self, const gchar *label, const gchar *path) {
357
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
358
 
 
359
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
360
 
 
361
 
        GtkWidget *menu_browser = menu_browser_new (path,
362
 
                                                                                                label,
363
 
                                                                                                self->priv->prefs->menu_bar_prefs->browser_prefs);
364
 
 
365
 
        /* add it to the list and to the menu bar*/
366
 
        g_ptr_array_add (self->priv->file_browsers, menu_browser);
367
 
 
368
 
        gtk_menu_shell_append (GTK_MENU_SHELL (self), menu_browser);
369
 
 
370
 
        gtk_widget_show_all (menu_browser);
 
357
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
358
 
 
359
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
360
 
 
361
    GtkWidget *menu_browser = menu_browser_new (path,
 
362
                                                label,
 
363
                                                self->priv->prefs->menu_bar_prefs->browser_prefs);
 
364
 
 
365
    /* add it to the list and to the menu bar*/
 
366
    g_ptr_array_add (self->priv->file_browsers, menu_browser);
 
367
 
 
368
    gtk_menu_shell_append (GTK_MENU_SHELL (self), menu_browser);
 
369
 
 
370
    gtk_widget_show_all (menu_browser);
371
371
}
372
372
/******************************************************************************/
373
373
static void
374
374
panel_menu_bar_on_preferences_changed (AppletPreferences *a_prefs,
375
 
                                                                           PrefsChangedSignalData *signal_data,
376
 
                                                                           PanelMenuBar *self) {
377
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
378
 
 
379
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
380
 
 
381
 
        switch (signal_data->signal_id) {
382
 
        case PREFS_SIGNAL_TERMINAL :
383
 
        case PREFS_SIGNAL_SHOW_HIDDEN :
384
 
                break;
385
 
        case PREFS_SIGNAL_SHOW_ICON :
386
 
        case PREFS_SIGNAL_ICON_CHANGED :
387
 
                panel_menu_bar_update_image (self);
388
 
                break;
389
 
        case PREFS_SIGNAL_DIR_MOVE_UP :
390
 
        case PREFS_SIGNAL_DIR_MOVE_DOWN :
391
 
                panel_menu_bar_move_entry (self, signal_data);
392
 
                break;
393
 
        case PREFS_SIGNAL_DIR_CHANGED :
394
 
                panel_menu_bar_update_entry (self, signal_data);
395
 
                break;
396
 
        case PREFS_SIGNAL_DIR_ADD :
397
 
                panel_menu_bar_add_entry (self, signal_data->label, g_strdup (signal_data->path));
398
 
                break;
399
 
        case PREFS_SIGNAL_DIR_DEL :
400
 
                panel_menu_bar_remove_entry (self, signal_data->instance);
401
 
                break;
402
 
        case PREFS_SIGNAL_HORIZONTAL_TEXT :
403
 
                panel_menu_bar_update_orient (self);
404
 
                break;
405
 
        default:
406
 
                g_assert_not_reached ();
407
 
        }
408
 
        if (DEBUG) g_printf ("caught the signal: %d, ", signal_data->signal_id);
409
 
        if (DEBUG) g_printf ("instance %d, label: %s, path %s\n",
410
 
                                                 signal_data->instance,
411
 
                                                 signal_data->label,
412
 
                                                 signal_data->path);
413
 
 
414
 
        g_free (signal_data->label);
415
 
        g_free (signal_data->path);
416
 
        g_free (signal_data);
 
375
                                       PrefsChangedSignalData *signal_data,
 
376
                                       PanelMenuBar *self) {
 
377
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
378
 
 
379
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
380
 
 
381
    switch (signal_data->signal_id) {
 
382
    case PREFS_SIGNAL_TERMINAL :
 
383
    case PREFS_SIGNAL_SHOW_HIDDEN :
 
384
        break;
 
385
    case PREFS_SIGNAL_SHOW_ICON :
 
386
    case PREFS_SIGNAL_ICON_CHANGED :
 
387
        panel_menu_bar_update_image (self);
 
388
        break;
 
389
    case PREFS_SIGNAL_DIR_MOVE_UP :
 
390
    case PREFS_SIGNAL_DIR_MOVE_DOWN :
 
391
        panel_menu_bar_move_entry (self, signal_data);
 
392
        break;
 
393
    case PREFS_SIGNAL_DIR_CHANGED :
 
394
        panel_menu_bar_update_entry (self, signal_data);
 
395
        break;
 
396
    case PREFS_SIGNAL_DIR_ADD :
 
397
        panel_menu_bar_add_entry (self, signal_data->label, g_strdup (signal_data->path));
 
398
        break;
 
399
    case PREFS_SIGNAL_DIR_DEL :
 
400
        panel_menu_bar_remove_entry (self, signal_data->instance);
 
401
        break;
 
402
    case PREFS_SIGNAL_HORIZONTAL_TEXT :
 
403
        panel_menu_bar_update_orient (self);
 
404
        break;
 
405
    default:
 
406
        g_assert_not_reached ();
 
407
    }
 
408
    if (DEBUG) g_printf ("caught the signal: %d, ", signal_data->signal_id);
 
409
    if (DEBUG) g_printf ("instance %d, label: %s, path %s\n",
 
410
                         signal_data->instance,
 
411
                         signal_data->label,
 
412
                         signal_data->path);
 
413
 
 
414
    g_free (signal_data->label);
 
415
    g_free (signal_data->path);
 
416
    g_free (signal_data);
417
417
}
418
418
/******************************************************************************/
419
419
/* this function was blatantly stolen (and slightly modified) from applet.c
420
420
 * from the gnome-panel code base.*/
421
421
/******************************************************************************/
422
422
void
423
 
panel_menu_bar_position_menu (GtkMenu   *menu,
424
 
                                                          int           *x,
425
 
                                                          int           *y,
426
 
                                                          gboolean  *push_in,
427
 
                                                          GtkWidget *applet) {
428
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
429
 
 
430
 
        GtkRequisition  requisition;
431
 
        GdkScreen      *screen;
432
 
        int             menu_x = 0;
433
 
        int             menu_y = 0;
434
 
        int             pointer_x;
435
 
        int             pointer_y;
436
 
 
437
 
        g_return_if_fail (PANEL_IS_APPLET (applet));
438
 
 
439
 
        screen = gtk_widget_get_screen (applet);
440
 
 
441
 
        gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
442
 
 
443
 
        gdk_window_get_origin (applet->window, &menu_x, &menu_y);
444
 
        gtk_widget_get_pointer (applet, &pointer_x, &pointer_y);
445
 
 
446
 
        if (GTK_WIDGET_NO_WINDOW (applet)) {
447
 
                menu_x += applet->allocation.x;
448
 
                menu_y += applet->allocation.y;
449
 
        }
450
 
 
451
 
        if (panel_applet_get_orient (PANEL_APPLET (applet)) == PANEL_APPLET_ORIENT_UP ||
452
 
                panel_applet_get_orient (PANEL_APPLET (applet)) == PANEL_APPLET_ORIENT_DOWN) {
453
 
                if (gtk_widget_get_direction (GTK_WIDGET (menu)) != GTK_TEXT_DIR_RTL) {
454
 
                        if (pointer_x < applet->allocation.width &&
455
 
                            requisition.width < pointer_x) {
456
 
                                menu_x += MIN (pointer_x, applet->allocation.width - requisition.width);
457
 
                        }
458
 
                }
459
 
                else {
460
 
                        menu_x += applet->allocation.width - requisition.width;
461
 
                        if (pointer_x > 0 && pointer_x < applet->allocation.width &&
462
 
                            pointer_x < applet->allocation.width - requisition.width) {
463
 
                                        menu_x -= MIN (applet->allocation.width - pointer_x,
464
 
                                                                   applet->allocation.width - requisition.width);
465
 
                        }
466
 
                }
467
 
                menu_x = MIN (menu_x, gdk_screen_get_width (screen) - requisition.width);
468
 
 
469
 
                if (menu_y > gdk_screen_get_height (screen) / 2) {
470
 
                        menu_y -= requisition.height;
471
 
                }
472
 
                else {
473
 
                        menu_y += applet->allocation.height;
474
 
                }
475
 
        }
476
 
        else {
477
 
                if (pointer_y < applet->allocation.height &&
478
 
                    requisition.height < pointer_y) {
479
 
                        menu_y += MIN (pointer_y, applet->allocation.height - requisition.height);
480
 
                }
481
 
                menu_y = MIN (menu_y, gdk_screen_get_height (screen) - requisition.height);
482
 
 
483
 
                if (menu_x > gdk_screen_get_width (screen) / 2) {
484
 
                        menu_x -= requisition.width;
485
 
                }
486
 
                else {
487
 
                        menu_x += applet->allocation.width;
488
 
                }
489
 
        }
490
 
 
491
 
        *x = menu_x;
492
 
        *y = menu_y;
493
 
        *push_in = TRUE;
 
423
panel_menu_bar_position_menu (GtkMenu   *menu,
 
424
                              int       *x,
 
425
                              int       *y,
 
426
                              gboolean  *push_in,
 
427
                              GtkWidget *applet) {
 
428
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
429
 
 
430
    GtkRequisition  requisition;
 
431
    GdkScreen      *screen;
 
432
    int             menu_x = 0;
 
433
    int             menu_y = 0;
 
434
    int             pointer_x;
 
435
    int             pointer_y;
 
436
 
 
437
    g_return_if_fail (PANEL_IS_APPLET (applet));
 
438
 
 
439
    screen = gtk_widget_get_screen (applet);
 
440
 
 
441
    gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
 
442
 
 
443
    gdk_window_get_origin (applet->window, &menu_x, &menu_y);
 
444
    gtk_widget_get_pointer (applet, &pointer_x, &pointer_y);
 
445
 
 
446
    if (GTK_WIDGET_NO_WINDOW (applet)) {
 
447
        menu_x += applet->allocation.x;
 
448
        menu_y += applet->allocation.y;
 
449
    }
 
450
 
 
451
    if (panel_applet_get_orient (PANEL_APPLET (applet)) == PANEL_APPLET_ORIENT_UP ||
 
452
        panel_applet_get_orient (PANEL_APPLET (applet)) == PANEL_APPLET_ORIENT_DOWN) {
 
453
        if (gtk_widget_get_direction (GTK_WIDGET (menu)) != GTK_TEXT_DIR_RTL) {
 
454
            if (pointer_x < applet->allocation.width &&
 
455
                requisition.width < pointer_x) {
 
456
                menu_x += MIN (pointer_x, applet->allocation.width - requisition.width);
 
457
            }
 
458
        }
 
459
        else {
 
460
            menu_x += applet->allocation.width - requisition.width;
 
461
            if (pointer_x > 0 && pointer_x < applet->allocation.width &&
 
462
                pointer_x < applet->allocation.width - requisition.width) {
 
463
                    menu_x -= MIN (applet->allocation.width - pointer_x,
 
464
                                   applet->allocation.width - requisition.width);
 
465
            }
 
466
        }
 
467
        menu_x = MIN (menu_x, gdk_screen_get_width (screen) - requisition.width);
 
468
 
 
469
        if (menu_y > gdk_screen_get_height (screen) / 2) {
 
470
            menu_y -= requisition.height;
 
471
        }
 
472
        else {
 
473
            menu_y += applet->allocation.height;
 
474
        }
 
475
    }
 
476
    else {
 
477
        if (pointer_y < applet->allocation.height &&
 
478
            requisition.height < pointer_y) {
 
479
            menu_y += MIN (pointer_y, applet->allocation.height - requisition.height);
 
480
        }
 
481
        menu_y = MIN (menu_y, gdk_screen_get_height (screen) - requisition.height);
 
482
 
 
483
        if (menu_x > gdk_screen_get_width (screen) / 2) {
 
484
            menu_x -= requisition.width;
 
485
        }
 
486
        else {
 
487
            menu_x += applet->allocation.width;
 
488
        }
 
489
    }
 
490
 
 
491
    *x = menu_x;
 
492
    *y = menu_y;
 
493
    *push_in = TRUE;
494
494
}
495
495
/******************************************************************************/
496
496
void
497
497
panel_menu_bar_on_deactivate (GtkWidget *widget,
498
 
                                                          PanelMenuBar *self) {
499
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
500
 
 
501
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
502
 
 
503
 
        g_object_set (G_OBJECT (self), "has-tooltip", TRUE, NULL);
504
 
 
505
 
        /* this is here because of the solution to the focus problem caused by the
506
 
         * popped context menu */
507
 
        gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
508
 
        gint i;
509
 
        for (i=0; i < self->priv->file_browsers->len; i++) {
510
 
                GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, i));
511
 
                gtk_widget_set_sensitive (menu_browser, TRUE);
512
 
        }
 
498
                              PanelMenuBar *self) {
 
499
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
500
 
 
501
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
502
 
 
503
    g_object_set (G_OBJECT (self), "has-tooltip", TRUE, NULL);
 
504
 
 
505
    /* this is here because of the solution to the focus problem caused by the
 
506
     * popped context menu */
 
507
    gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
 
508
    gint i;
 
509
    for (i=0; i < self->priv->file_browsers->len; i++) {
 
510
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, i));
 
511
        gtk_widget_set_sensitive (menu_browser, TRUE);
 
512
    }
513
513
}
514
514
/******************************************************************************/
515
515
gboolean
516
516
panel_menu_bar_on_button_press (GtkWidget *widget,
517
 
                                                                GdkEventButton *event,
518
 
                                                                PanelMenuBar *self) {
519
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
520
 
 
521
 
        g_return_val_if_fail (IS_PANEL_MENU_BAR (self), TRUE);
522
 
 
523
 
        GtkMenuShell *menu_shell = GTK_MENU_SHELL (self);
524
 
 
525
 
        if (event->button == 3) {
526
 
                if (!menu_shell->active) {
527
 
                        /* popup the applet context menu on right-clicks and make sure it's
528
 
                         * popped up in the right place */
529
 
                        gtk_menu_shell_deactivate (GTK_MENU_SHELL (self));
530
 
 
531
 
                        bonobo_control_do_popup_full (self->priv->bonobo_control,
532
 
                                                                                  NULL,
533
 
                                                                                  NULL,
534
 
                                                                                  (GtkMenuPositionFunc) panel_menu_bar_position_menu,
535
 
                                                                                  self->priv->applet,
536
 
                                                                                  event->button,
537
 
                                                                                  event->time);
538
 
                        return TRUE;
539
 
                }
540
 
                return FALSE;
541
 
        }
542
 
        else if (event->button == 2) {
543
 
                /* Do nothing  on middle-clicks */
544
 
                return TRUE;
545
 
        }
546
 
        else {
547
 
                /* Activate the menu only on left-clicks */
548
 
                g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
549
 
                return FALSE;
550
 
        }
 
517
                                GdkEventButton *event,
 
518
                                PanelMenuBar *self) {
 
519
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
520
 
 
521
    g_return_val_if_fail (IS_PANEL_MENU_BAR (self), TRUE);
 
522
 
 
523
    GtkMenuShell *menu_shell = GTK_MENU_SHELL (self);
 
524
 
 
525
    if (event->button == 3) {
 
526
        if (!menu_shell->active) {
 
527
            /* popup the applet context menu on right-clicks and make sure it's
 
528
             * popped up in the right place */
 
529
            gtk_menu_shell_deactivate (GTK_MENU_SHELL (self));
 
530
 
 
531
            bonobo_control_do_popup_full (self->priv->bonobo_control,
 
532
                                          NULL,
 
533
                                          NULL,
 
534
                                          (GtkMenuPositionFunc) panel_menu_bar_position_menu,
 
535
                                          self->priv->applet,
 
536
                                          event->button,
 
537
                                          event->time);
 
538
            return TRUE;
 
539
        }
 
540
        return FALSE;
 
541
    }
 
542
    else if (event->button == 2) {
 
543
        /* Do nothing  on middle-clicks */
 
544
        return TRUE;
 
545
    }
 
546
    else {
 
547
        /* Activate the menu only on left-clicks */
 
548
        g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
 
549
        return FALSE;
 
550
    }
551
551
}
552
552
/******************************************************************************/
553
553
gboolean
554
554
panel_menu_bar_on_key_press (GtkWidget *widget,
555
 
                                                         GdkEventKey *event,
556
 
                                                         PanelMenuBar *self) {
557
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
558
 
 
559
 
        g_return_val_if_fail (IS_PANEL_MENU_BAR (self), TRUE);
560
 
 
561
 
        if ((event->keyval == GDK_Menu) ||
562
 
                         (event->keyval == GDK_F10 &&
563
 
                         (event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK)){
564
 
                bonobo_control_do_popup_full (self->priv->bonobo_control,
565
 
                                                                          NULL,
566
 
                                                                          NULL,
567
 
                                                                          (GtkMenuPositionFunc) panel_menu_bar_position_menu,
568
 
                                                                          self->priv->applet,
569
 
                                                                          3,
570
 
                                                                          GDK_CURRENT_TIME);
571
 
                return TRUE;
572
 
        }
573
 
        g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
574
 
        return FALSE;
 
555
                             GdkEventKey *event,
 
556
                             PanelMenuBar *self) {
 
557
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
558
 
 
559
    g_return_val_if_fail (IS_PANEL_MENU_BAR (self), TRUE);
 
560
 
 
561
    if ((event->keyval == GDK_Menu) ||
 
562
             (event->keyval == GDK_F10 &&
 
563
             (event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK)){
 
564
        bonobo_control_do_popup_full (self->priv->bonobo_control,
 
565
                                      NULL,
 
566
                                      NULL,
 
567
                                      (GtkMenuPositionFunc) panel_menu_bar_position_menu,
 
568
                                      self->priv->applet,
 
569
                                      3,
 
570
                                      GDK_CURRENT_TIME);
 
571
        return TRUE;
 
572
    }
 
573
    g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
 
574
    return FALSE;
575
575
}
576
576
/******************************************************************************/
577
577
PanelMenuBar*
578
578
panel_menu_bar_new (PanelApplet* applet) {
579
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
580
 
 
581
 
        g_return_val_if_fail (PANEL_IS_APPLET (applet), NULL);
582
 
 
583
 
        PanelMenuBar *self = g_object_newv (TYPE_PANEL_MENU_BAR, 0, NULL);
584
 
 
585
 
        g_signal_connect (GTK_MENU_BAR (self),
586
 
                                          "button_press_event",
587
 
                                          G_CALLBACK (panel_menu_bar_on_button_press),
588
 
                                          self);
589
 
        g_signal_connect (GTK_MENU_BAR (self),
590
 
                                          "key_press_event",
591
 
                                          G_CALLBACK (panel_menu_bar_on_key_press),
592
 
                                          self);
593
 
 
594
 
        g_signal_connect (GTK_MENU_SHELL (self),
595
 
                                          "deactivate",
596
 
                                          G_CALLBACK (panel_menu_bar_on_deactivate),
597
 
                                          self);
598
 
 
599
 
        self->priv->file_browsers = g_ptr_array_new ();
600
 
 
601
 
        self->priv->panel_size= 0;
602
 
        self->priv->applet = applet;
603
 
 
604
 
        /* setup callbacks to handle changes in the panel */
605
 
        g_signal_connect (G_OBJECT (applet),
606
 
                                          "change_background",
607
 
                                          G_CALLBACK (panel_menu_bar_change_background),
608
 
                                          self);
609
 
        g_signal_connect (G_OBJECT (applet),
610
 
                                          "change_orient",
611
 
                                          G_CALLBACK (panel_menu_bar_change_orient),
612
 
                                          self);
 
579
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
580
 
 
581
    g_return_val_if_fail (PANEL_IS_APPLET (applet), NULL);
 
582
 
 
583
    PanelMenuBar *self = g_object_newv (TYPE_PANEL_MENU_BAR, 0, NULL);
 
584
 
 
585
    g_signal_connect (GTK_MENU_BAR (self),
 
586
                      "button_press_event",
 
587
                      G_CALLBACK (panel_menu_bar_on_button_press),
 
588
                      self);
 
589
    g_signal_connect (GTK_MENU_BAR (self),
 
590
                      "key_press_event",
 
591
                      G_CALLBACK (panel_menu_bar_on_key_press),
 
592
                      self);
 
593
 
 
594
    g_signal_connect (GTK_MENU_SHELL (self),
 
595
                      "deactivate",
 
596
                      G_CALLBACK (panel_menu_bar_on_deactivate),
 
597
                      self);
 
598
 
 
599
    self->priv->file_browsers = g_ptr_array_new ();
 
600
 
 
601
    self->priv->panel_size= 0;
 
602
    self->priv->applet = applet;
 
603
 
 
604
    /* setup callbacks to handle changes in the panel */
 
605
    g_signal_connect (G_OBJECT (applet),
 
606
                      "change_background",
 
607
                      G_CALLBACK (panel_menu_bar_change_background),
 
608
                      self);
 
609
    g_signal_connect (G_OBJECT (applet),
 
610
                      "change_orient",
 
611
                      G_CALLBACK (panel_menu_bar_change_orient),
 
612
                      self);
613
613
 
614
614
    gtk_widget_set_tooltip_text (GTK_WIDGET (self), _(TOOLTIP_TEXT));
615
615
 
616
 
        /* get the applet configuration */
617
 
        self->priv->prefs = applet_preferences_new (applet);
618
 
 
619
 
        MenuBarPrefs *mb_prefs = self->priv->prefs->menu_bar_prefs;
620
 
        g_signal_connect (G_OBJECT (self->priv->prefs),
621
 
                                          "prefs_changed",
622
 
                                          G_CALLBACK (panel_menu_bar_on_preferences_changed),
623
 
                                          self);
624
 
 
625
 
        /* for each path in the config, make a browser object */
626
 
        GSList *tmp_dir   = mb_prefs->dirs;
627
 
        GSList *tmp_label = mb_prefs->labels;
628
 
        while (tmp_label && tmp_dir) {
629
 
                panel_menu_bar_add_entry (self,
630
 
                                                                  (gchar*)tmp_label->data,
631
 
                                                                  (gchar*)tmp_dir->data);
632
 
                tmp_dir   = tmp_dir->next;
633
 
                tmp_label = tmp_label->next;
634
 
        }
 
616
    /* get the applet configuration */
 
617
    self->priv->prefs = applet_preferences_new (applet);
 
618
 
 
619
    MenuBarPrefs *mb_prefs = self->priv->prefs->menu_bar_prefs;
 
620
    g_signal_connect (G_OBJECT (self->priv->prefs),
 
621
                      "prefs_changed",
 
622
                      G_CALLBACK (panel_menu_bar_on_preferences_changed),
 
623
                      self);
 
624
 
 
625
    /* for each path in the config, make a browser object */
 
626
    GSList *tmp_dir   = mb_prefs->dirs;
 
627
    GSList *tmp_label = mb_prefs->labels;
 
628
    while (tmp_label && tmp_dir) {
 
629
        panel_menu_bar_add_entry (self,
 
630
                                  (gchar*)tmp_label->data,
 
631
                                  (gchar*)tmp_dir->data);
 
632
        tmp_dir   = tmp_dir->next;
 
633
        tmp_label = tmp_label->next;
 
634
    }
635
635
 
636
636
    /* add the image to the menu item */
637
 
        panel_menu_bar_update_image (self);
638
 
 
639
 
        gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));
640
 
 
641
 
        /* make sure the text orientation is correct on startup */
642
 
        self->priv->text_vertical = FALSE;
643
 
 
644
 
        /* get a handle to the applet context menu */
645
 
        self->priv->bonobo_control = panel_applet_get_control (applet);
 
637
    panel_menu_bar_update_image (self);
 
638
 
 
639
    gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));
 
640
 
 
641
    /* make sure the text orientation is correct on startup */
 
642
    self->priv->text_vertical = FALSE;
 
643
 
 
644
    /* get a handle to the applet context menu */
 
645
    self->priv->bonobo_control = panel_applet_get_control (applet);
646
646
 
647
647
#ifdef LIBGTKHOTKEY_FOUND
648
 
        /* setup global keybinding */
649
 
        panel_menu_bar_add_keybinding (self);
 
648
    /* setup global keybinding */
 
649
    panel_menu_bar_add_keybinding (self);
650
650
#endif
651
651
 
652
 
        return self;
 
652
    return self;
653
653
}
654
654
/******************************************************************************/
655
655
static void panel_menu_bar_class_init (PanelMenuBarClass * klass) {
656
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
657
 
 
658
 
        panel_menu_bar_parent_class = g_type_class_peek_parent (klass);
659
 
        g_type_class_add_private (klass, sizeof (PanelMenuBarPrivate));
660
 
        G_OBJECT_CLASS (klass)->dispose = panel_menu_bar_dispose;
661
 
 
662
 
/*      GObjectClass     *gobject_class = (GObjectClass   *) klass;*/
663
 
        GtkWidgetClass   *widget_class  = (GtkWidgetClass *) klass;
664
 
        widget_class->size_allocate = panel_menu_bar_size_allocate;
665
 
 
666
 
        gtk_rc_parse_string ("style \"panel-menubar-style\"\n"
667
 
                                                 "{\n"
668
 
                                                 "  GtkMenuBar::shadow-type = none\n"
669
 
                                                 "  GtkMenuBar::internal-padding = 0\n"
670
 
                                                 "}\n"
671
 
                                                 "class \"PanelMenuBar\" style \"panel-menubar-style\"");
 
656
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
657
 
 
658
    panel_menu_bar_parent_class = g_type_class_peek_parent (klass);
 
659
    g_type_class_add_private (klass, sizeof (PanelMenuBarPrivate));
 
660
    G_OBJECT_CLASS (klass)->dispose = panel_menu_bar_dispose;
 
661
 
 
662
/*  GObjectClass     *gobject_class = (GObjectClass   *) klass;*/
 
663
    GtkWidgetClass   *widget_class  = (GtkWidgetClass *) klass;
 
664
    widget_class->size_allocate = panel_menu_bar_size_allocate;
 
665
 
 
666
    gtk_rc_parse_string ("style \"panel-menubar-style\"\n"
 
667
                         "{\n"
 
668
                         "  GtkMenuBar::shadow-type = none\n"
 
669
                         "  GtkMenuBar::internal-padding = 0\n"
 
670
                         "}\n"
 
671
                         "class \"PanelMenuBar\" style \"panel-menubar-style\"");
672
672
}
673
673
/******************************************************************************/
674
674
static void
675
675
panel_menu_bar_init (PanelMenuBar * self) {
676
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
677
 
 
678
 
        g_return_if_fail (IS_PANEL_MENU_BAR (self));
679
 
 
680
 
        self->priv = PANEL_MENU_BAR_GET_PRIVATE (self);
 
676
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
677
 
 
678
    g_return_if_fail (IS_PANEL_MENU_BAR (self));
 
679
 
 
680
    self->priv = PANEL_MENU_BAR_GET_PRIVATE (self);
681
681
}
682
682
/******************************************************************************/
683
683
static void
684
684
panel_menu_bar_dispose (GObject *obj) {
685
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
686
 
 
687
 
        PanelMenuBarClass *klass;
688
 
/*      GObjectClass * parent_class;*/
689
 
 
690
 
        PanelMenuBar *self = PANEL_MENU_BAR (obj);
691
 
        (self->priv->applet == NULL ? NULL : (self->priv->applet = (g_object_unref (self->priv->applet), NULL)));
692
 
        (self->priv->file_browsers == NULL ? NULL : (self->priv->file_browsers = (gpointer)(g_ptr_array_free (self->priv->file_browsers, TRUE))));
693
 
        klass = PANEL_MENU_BAR_CLASS (g_type_class_peek (TYPE_PANEL_MENU_BAR));
694
 
        G_OBJECT_CLASS (panel_menu_bar_parent_class)->dispose (obj);
 
685
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
686
 
 
687
    PanelMenuBarClass *klass;
 
688
/*  GObjectClass * parent_class;*/
 
689
 
 
690
    PanelMenuBar *self = PANEL_MENU_BAR (obj);
 
691
    (self->priv->applet == NULL ? NULL : (self->priv->applet = (g_object_unref (self->priv->applet), NULL)));
 
692
    (self->priv->file_browsers == NULL ? NULL : (self->priv->file_browsers = (gpointer)(g_ptr_array_free (self->priv->file_browsers, TRUE))));
 
693
    klass = PANEL_MENU_BAR_CLASS (g_type_class_peek (TYPE_PANEL_MENU_BAR));
 
694
    G_OBJECT_CLASS (panel_menu_bar_parent_class)->dispose (obj);
695
695
}
696
696
/******************************************************************************/
697
697
GType
698
698
panel_menu_bar_get_type (void) {
699
 
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
700
 
 
701
 
        static GType panel_menu_bar_type_id = 0;
702
 
        if (G_UNLIKELY (panel_menu_bar_type_id == 0)) {
703
 
                static const GTypeInfo g_define_type_info = {sizeof (PanelMenuBarClass),
704
 
                                                                                                         (GBaseInitFunc) NULL,
705
 
                                                                                                         (GBaseFinalizeFunc) NULL,
706
 
                                                                                                         (GClassInitFunc) panel_menu_bar_class_init,
707
 
                                                                                                         (GClassFinalizeFunc) NULL,
708
 
                                                                                                         NULL,
709
 
                                                                                                         sizeof (PanelMenuBar),
710
 
                                                                                                         0,
711
 
                                                                                                         (GInstanceInitFunc) panel_menu_bar_init };
712
 
 
713
 
                panel_menu_bar_type_id = g_type_register_static (GTK_TYPE_MENU_BAR,
714
 
                                                                                                                 "PanelMenuBar",
715
 
                                                                                                                 &g_define_type_info,
716
 
                                                                                                                 0);
717
 
        }
718
 
        return panel_menu_bar_type_id;
 
699
    if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
700
 
 
701
    static GType panel_menu_bar_type_id = 0;
 
702
    if (G_UNLIKELY (panel_menu_bar_type_id == 0)) {
 
703
        static const GTypeInfo g_define_type_info = {sizeof (PanelMenuBarClass),
 
704
                                                     (GBaseInitFunc) NULL,
 
705
                                                     (GBaseFinalizeFunc) NULL,
 
706
                                                     (GClassInitFunc) panel_menu_bar_class_init,
 
707
                                                     (GClassFinalizeFunc) NULL,
 
708
                                                     NULL,
 
709
                                                     sizeof (PanelMenuBar),
 
710
                                                     0,
 
711
                                                     (GInstanceInitFunc) panel_menu_bar_init };
 
712
 
 
713
        panel_menu_bar_type_id = g_type_register_static (GTK_TYPE_MENU_BAR,
 
714
                                                         "PanelMenuBar",
 
715
                                                         &g_define_type_info,
 
716
                                                         0);
 
717
    }
 
718
    return panel_menu_bar_type_id;
719
719
}
720
720
/******************************************************************************/