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

« 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: 2008-08-29 13:50:51 UTC
  • mfrom: (2.1.1 squeeze)
  • Revision ID: james.westby@ubuntu.com-20080829135051-bani7mwsfjdbs9fx
Tags: 0.5.9-1
* New upstream release. (Closes: #497078)
* debian/control:
 - Remove Build-Depend on libgnomevfs2-dev and add Build-Depend
   on libglib2.0-dev as upstream has moved to GIO. (Closes: #493878)
 - Remove depreciated Depends and Build Depends on libgnome-desktop{-dev}
* Fixes Lintian warning: timewarp-standards-version

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
8
8
 *
25
25
 
26
26
#include <glib.h>
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"
31
32
#include "utils.h"
32
33
 
 
34
#ifdef ENABLE_GTK_HOTKEY 
 
35
#include <gtkhotkey.h>
 
36
#endif
 
37
 
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"
42
47
        gint                            panel_size;
43
48
        gboolean                        text_vertical;
44
49
        BonoboControl           *bonobo_control;
45
 
        gboolean                        child_active;
46
50
};
47
51
/******************************************************************************/
48
52
enum {
60
64
/******************************************************************************/
61
65
void
62
66
panel_menu_bar_edit_prefs (PanelMenuBar *self) {
 
67
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
68
 
 
69
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
70
 
63
71
        AppletPreferences *prefs = self->priv->prefs;
64
72
        applet_preferences_make_dialog (prefs);
65
73
}
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__);
 
80
 
 
81
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
82
 
71
83
        gint                            i;
72
84
        gboolean                        text_vertical = FALSE;
73
85
        gdouble                         text_angle;
125
137
                        g_assert_not_reached ();
126
138
                        break;
127
139
        }
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);
131
143
 
136
148
                gtk_label_set_angle (GTK_LABEL (label), text_angle);
137
149
                gtk_misc_set_alignment (GTK_MISC (label), text_xalign, text_yalign);
138
150
        }
139
 
        if (DEBUG) g_printf ("Changing panel orientation : %d\n", orientation);
140
151
        return;
141
152
}
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__);
 
158
 
146
159
        PanelMenuBar *self = (PanelMenuBar *)widget;
147
160
 
 
161
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
162
 
148
163
        /* WTF!? */
149
164
        allocation->x = 0;
150
165
        allocation->y = 0;
153
168
 
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;
159
174
        }
165
180
                                                                  orientation,
166
181
                                                                  self);
167
182
 
168
 
        if (DEBUG) g_printf ("Resizing panel : ");
169
 
        if (DEBUG) g_printf ("x %d, "
170
 
                                                 "y %d, "
171
 
                                                 "height %d, "
172
 
                                                 "width %d\n",
173
 
                                                 allocation->x,
174
 
                                                 allocation->y,
175
 
                                                 allocation->height,
176
 
                                                 allocation->width);
177
183
        return;
178
184
}
179
185
/******************************************************************************/
183
189
                                                                  GdkColor                  *color,
184
190
                                                                  GdkPixmap                 *pixmap,
185
191
                                                                  PanelMenuBar                          *self) {
 
192
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
193
 
 
194
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
195
 
186
196
        GtkRcStyle *rc_style;
187
197
        GtkStyle *style;
188
 
        
 
198
 
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);  
194
 
        
 
203
        gtk_rc_style_unref (rc_style);
 
204
 
195
205
        switch (type) {
196
206
                case PANEL_COLOR_BACKGROUND:
197
207
                        gtk_widget_modify_bg (GTK_WIDGET (self),
198
 
                                                                  GTK_STATE_NORMAL, 
 
208
                                                                  GTK_STATE_NORMAL,
199
209
                                                                  color);
200
210
                        break;
201
 
                
 
211
 
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);
210
220
                        break;
211
 
                
 
221
 
212
222
                case PANEL_NO_BACKGROUND:
213
223
                default:
214
224
                        break;
215
225
        }
216
 
        if (DEBUG) g_printf ("Changing Applet Background\n");
217
226
        return;
218
227
}
219
228
/******************************************************************************/
220
229
static void
221
230
panel_menu_bar_update_image (PanelMenuBar *self) {
 
231
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
232
 
 
233
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
234
 
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));
242
255
        return;
243
256
}
244
257
/******************************************************************************/
 
258
#ifdef ENABLE_GTK_HOTKEY
 
259
static void
 
260
panel_menu_bar_on_hotkey_press (GtkHotkeyInfo *hot_key_info,
 
261
                                                                guint event_time,
 
262
                                                                PanelMenuBar *self) {
 
263
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
264
 
 
265
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
266
 
 
267
        MenuBrowser *menu_browser = (MenuBrowser *)(g_ptr_array_index (self->priv->file_browsers, 0));
 
268
 
 
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));
 
273
}
 
274
/******************************************************************************/
245
275
static void
246
276
panel_menu_bar_add_keybinding (PanelMenuBar *self) {
247
 
        /*
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,
252
 
                                                                  GDK_b,
253
 
                                                                  GDK_SHIFT_MASK | GDK_CONTROL_MASK,
254
 
                                                                  signal_name,
255
 
                                                                  0);
256
 
                                                                  */
 
277
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
278
 
 
279
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
280
 
 
281
        GError *error = NULL;
 
282
 
 
283
        GtkHotkeyInfo *hot_key_info = gtk_hotkey_info_new ("file-browser-applet",
 
284
                                                                                                           "file-browser-applet",
 
285
                                                       "<Super>h",
 
286
                                                                                                           NULL);
 
287
 
 
288
        g_signal_connect (G_OBJECT (hot_key_info),
 
289
                                          "activated",
 
290
                                          G_CALLBACK (panel_menu_bar_on_hotkey_press),
 
291
                                          self);
 
292
 
 
293
        gtk_hotkey_info_bind (hot_key_info, &error);
257
294
}
 
295
#endif
258
296
/******************************************************************************/
259
297
static void
260
298
panel_menu_bar_update_entry (PanelMenuBar *self,
261
299
                                                         PrefsChangedSignalData *signal_data) {
 
300
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
301
 
 
302
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
303
 
262
304
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, signal_data->instance));
263
305
 
264
306
        menu_browser_update (MENU_BROWSER (menu_browser),
270
312
static void
271
313
panel_menu_bar_move_entry (PanelMenuBar *self,
272
314
                                                   PrefsChangedSignalData *signal_data) {
 
315
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
316
 
 
317
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
318
 
273
319
        int new_pos;
274
320
        GtkWidget *menu_browser = NULL;
275
321
        GtkWidget *menu_browser_affected = NULL;
312
358
static void
313
359
panel_menu_bar_remove_entry (PanelMenuBar *self,
314
360
                                                         gint instance) {
 
361
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
362
 
 
363
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
364
 
315
365
        GtkWidget *menu_browser = (GtkWidget *)(g_ptr_array_index (self->priv->file_browsers, instance));
316
366
 
317
367
        if (menu_browser != NULL) {
329
379
panel_menu_bar_add_entry (PanelMenuBar *self,
330
380
                                                  gchar *label,
331
381
                                                  gchar *path) {
 
382
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
383
 
 
384
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
332
385
 
333
386
        GtkWidget *menu_browser = menu_browser_new (path,
334
387
                                                                                                label,
347
400
static void
348
401
panel_menu_bar_on_preferences_changed (AppletPreferences *a_prefs,
349
402
                                                                           PrefsChangedSignalData *signal_data,
350
 
                                                                           gpointer data) {
351
 
        PanelMenuBar *self = (PanelMenuBar *)data;
 
403
                                                                           PanelMenuBar *self) {
 
404
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
405
 
 
406
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
352
407
 
353
408
        switch (signal_data->signal_id) {
354
409
                case PREFS_SIGNAL_TERMINAL :
392
447
                                                          int           *y,
393
448
                                                          gboolean  *push_in,
394
449
                                                          GtkWidget *applet) {
 
450
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
451
 
395
452
        GtkRequisition  requisition;
396
453
        GdkScreen      *screen;
397
454
        int             menu_x = 0;
420
477
                            requisition.width < pointer_x) {
421
478
                                menu_x += MIN (pointer_x, applet->allocation.width - requisition.width);
422
479
                        }
423
 
                } 
 
480
                }
424
481
                else {
425
482
                        menu_x += applet->allocation.width - requisition.width;
426
483
                        if (pointer_x > 0 && pointer_x < applet->allocation.width &&
461
518
void
462
519
panel_menu_bar_on_deactivate (GtkWidget *widget,
463
520
                                                          PanelMenuBar *self) {
 
521
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
522
 
 
523
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
524
 
464
525
        g_object_set (G_OBJECT (widget), "has-tooltip", TRUE, NULL);
465
 
        self->priv->child_active = FALSE;
466
526
}
467
527
/******************************************************************************/
468
528
gboolean
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__);
 
533
 
 
534
        g_return_val_if_fail (self == NULL || IS_PANEL_MENU_BAR (self), TRUE);
 
535
 
 
536
        GtkMenuShell *menu_shell = GTK_MENU_SHELL (self);
 
537
 
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
475
 
                         * right place*/
 
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));
477
543
 
478
544
                        bonobo_control_do_popup_full (self->priv->bonobo_control,
484
550
                                                                                  event->time);
485
551
                        return TRUE;
486
552
                }
487
 
                return FALSE;           
 
553
                return FALSE;
 
554
        }
 
555
        else if (event->button == 2) {
 
556
                /* Do nothing  on middle-clicks */
 
557
                return TRUE;
488
558
        }
489
559
        else {
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);
492
562
                return FALSE;
493
563
        }
494
564
}
495
565
/******************************************************************************/
 
566
gboolean
 
567
panel_menu_bar_on_key_press (GtkWidget *widget,
 
568
                                                                GdkEventKey *event,
 
569
                                                                PanelMenuBar *self) {
 
570
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
571
 
 
572
        g_return_val_if_fail (self == NULL || IS_PANEL_MENU_BAR (self), TRUE);
 
573
 
 
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,
 
578
                                                                          NULL,
 
579
                                                                          NULL,
 
580
                                                                          (GtkMenuPositionFunc) panel_menu_bar_position_menu,
 
581
                                                                          self->priv->applet,
 
582
                                                                          3,
 
583
                                                                          GDK_CURRENT_TIME);
 
584
                return TRUE;
 
585
        }
 
586
        g_object_set (G_OBJECT (self), "has-tooltip", FALSE, NULL);
 
587
        return FALSE;
 
588
}
 
589
/******************************************************************************/
496
590
PanelMenuBar*
497
591
panel_menu_bar_new (PanelApplet* applet) {
 
592
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
593
 
 
594
        g_return_val_if_fail (applet == NULL || PANEL_IS_APPLET (applet), NULL);
 
595
 
498
596
        PanelMenuBar *self;
499
597
 
500
598
        g_return_val_if_fail (applet == NULL || PANEL_IS_APPLET (applet), NULL);
502
600
 
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),
 
604
                                          self);
 
605
        g_signal_connect (GTK_MENU_BAR (self),
 
606
                                          "key_press_event",
 
607
                                          G_CALLBACK (panel_menu_bar_on_key_press),
506
608
                                          self);
507
609
 
508
610
        g_signal_connect (GTK_MENU_SHELL (self),
526
628
                                          self);
527
629
 
528
630
    gtk_widget_set_tooltip_text (GTK_WIDGET (self), _(TOOLTIP_TEXT));
529
 
        
 
631
 
530
632
        /* get the applet configuration */
531
633
        self->priv->prefs = applet_preferences_new (applet);
532
634
 
533
635
        MenuBarPrefs *mb_prefs = self->priv->prefs->menu_bar_prefs;
534
636
        g_signal_connect (G_OBJECT (self->priv->prefs),
535
637
                                          "prefs_changed",
536
 
                                          G_CALLBACK (panel_menu_bar_on_preferences_changed), 
 
638
                                          G_CALLBACK (panel_menu_bar_on_preferences_changed),
537
639
                                          self);
538
640
 
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);
552
654
 
553
 
        gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));  
 
655
        gtk_container_add (GTK_CONTAINER (applet), GTK_WIDGET (self));
554
656
 
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);
560
662
 
 
663
#ifdef ENABLE_GTK_HOTKEY
561
664
        /* setup global keybinding */
562
665
        panel_menu_bar_add_keybinding (self);
563
 
 
564
 
        self->priv->child_active = FALSE;
 
666
#endif
565
667
 
566
668
        return self;
567
669
}
568
670
/******************************************************************************/
569
671
static void panel_menu_bar_class_init (PanelMenuBarClass * klass) {
 
672
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
673
 
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
/******************************************************************************/
586
690
static void
587
691
panel_menu_bar_init (PanelMenuBar * self) {
 
692
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
693
 
 
694
        g_return_if_fail (self == NULL || IS_PANEL_MENU_BAR (self));
 
695
 
588
696
        self->priv = PANEL_MENU_BAR_GET_PRIVATE (self);
589
697
        return;
590
698
}
591
699
/******************************************************************************/
592
700
static void
593
701
panel_menu_bar_dispose (GObject *obj) {
 
702
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
703
 
594
704
        PanelMenuBar *self;
595
705
        PanelMenuBarClass *klass;
596
706
/*      GObjectClass * parent_class;*/
605
715
/******************************************************************************/
606
716
GType
607
717
panel_menu_bar_get_type (void) {
 
718
        if (DEBUG) g_printf ("In %s\n", __FUNCTION__);
 
719
 
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),