source: trunk/third/gnome-panel/gnome-panel/border-widget.c @ 18631

Revision 18631, 7.9 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18630, which included commits to RCS files with non-trunk default branches.
Line 
1/* Gnome panel: border widget
2 * (C) 1999 the Free Software Foundation
3 *
4 * Authors:  Jacob Berkman
5 *           George Lebl
6 */
7
8#include "config.h"
9
10#include "border-widget.h"
11#include "panel-marshal.h"
12#include "panel-config-global.h"
13#include "panel-typebuiltins.h"
14
15#undef BORDER_WIDGET_DEBUG
16
17extern GlobalConfig global_config;
18
19static void border_pos_class_init (BorderPosClass *klass);
20static void border_pos_instance_init (BorderPos *pos);
21
22static void border_pos_set_hidebuttons (BasePWidget *basep);
23static PanelOrient border_pos_get_applet_orient (BasePWidget *basep);
24
25static PanelOrient border_pos_get_hide_orient (BasePWidget *basep);
26
27static void border_pos_show_hide_left (BasePWidget *basep);
28static void border_pos_show_hide_right (BasePWidget *basep);
29
30static void border_pos_pre_convert_hook (BasePWidget *basep);
31
32static BasePPosClass *border_pos_parent_class;
33
34GType
35border_pos_get_type (void)
36{
37        static GType object_type = 0;
38        if (object_type == 0) {
39                static const GTypeInfo object_info = {
40                        sizeof (BorderPosClass),
41                        (GBaseInitFunc)         NULL,
42                        (GBaseFinalizeFunc)     NULL,
43                        (GClassInitFunc)        border_pos_class_init,
44                        NULL,                   /* class_finalize */
45                        NULL,                   /* class_data */
46                        sizeof (BorderPos),
47                        0,                      /* n_preallocs */
48                        (GInstanceInitFunc)     border_pos_instance_init
49                };
50
51                object_type = g_type_register_static (BASEP_TYPE_POS,
52                                                      "BorderPos", &object_info, 0);
53                border_pos_parent_class = g_type_class_ref (BASEP_TYPE_POS);
54        }
55
56        return object_type;
57}
58
59enum {
60        EDGE_CHANGE_SIGNAL,
61        LAST_SIGNAL
62};
63
64static guint border_pos_signals[LAST_SIGNAL] = { 0 };
65
66static void
67border_pos_class_init (BorderPosClass *klass)
68{
69        GObjectClass *object_class = G_OBJECT_CLASS(klass);
70        BasePPosClass *pos_class = BASEP_POS_CLASS(klass);
71
72
73        /* set up signals */
74        border_pos_signals[EDGE_CHANGE_SIGNAL] =
75                g_signal_new ("edge_change",
76                             G_TYPE_FROM_CLASS (object_class),
77                             G_SIGNAL_RUN_LAST,
78                             G_STRUCT_OFFSET (BorderPosClass, edge_change),
79                             NULL,
80                             NULL,
81                             g_cclosure_marshal_VOID__ENUM,
82                             G_TYPE_NONE,
83                             1,
84                             PANEL_TYPE_EDGE);
85
86        /* fill out the virtual funcs */
87        pos_class->set_hidebuttons = border_pos_set_hidebuttons;
88        pos_class->get_applet_orient = border_pos_get_applet_orient;
89        pos_class->get_hide_orient = border_pos_get_hide_orient;
90
91        pos_class->north_clicked = pos_class->west_clicked =
92                border_pos_show_hide_left;
93        pos_class->south_clicked = pos_class->east_clicked =
94                border_pos_show_hide_right;
95        pos_class->pre_convert_hook = border_pos_pre_convert_hook;
96
97}
98
99static void
100border_pos_instance_init (BorderPos *pos)
101{
102        pos->edge = BORDER_TOP;
103}
104
105static void
106border_pos_set_hidebuttons (BasePWidget *basep)
107{
108        if (PANEL_WIDGET(basep->panel)->orient == GTK_ORIENTATION_HORIZONTAL) {
109                gtk_widget_hide(basep->hidebutton_n);
110                gtk_widget_show(basep->hidebutton_e);
111                gtk_widget_show(basep->hidebutton_w);
112                gtk_widget_hide(basep->hidebutton_s);
113        } else { /*vertical*/
114                gtk_widget_show(basep->hidebutton_n);
115                gtk_widget_hide(basep->hidebutton_e);
116                gtk_widget_hide(basep->hidebutton_w);
117                gtk_widget_show(basep->hidebutton_s);
118        }
119}
120
121static PanelOrient
122border_pos_get_applet_orient (BasePWidget *basep)
123{
124        BorderPos *pos = BORDER_POS(basep->pos);
125       
126        switch (pos->edge) {
127        case BORDER_TOP: return PANEL_ORIENT_DOWN;
128        case BORDER_RIGHT: return PANEL_ORIENT_LEFT;
129        case BORDER_BOTTOM: return PANEL_ORIENT_UP;
130        case BORDER_LEFT: return PANEL_ORIENT_RIGHT;
131        default: return PANEL_ORIENT_UP;               
132        }
133}
134
135static PanelOrient
136border_pos_get_hide_orient (BasePWidget *basep)
137{
138        BorderPos *pos = BORDER_POS (basep->pos);
139        PanelWidget *panel = PANEL_WIDGET (basep->panel);
140
141        switch (basep->state) {
142        case BASEP_AUTO_HIDDEN:
143                switch (pos->edge) {
144                case BORDER_TOP: return PANEL_ORIENT_UP;
145                case BORDER_RIGHT: return PANEL_ORIENT_RIGHT;
146                case BORDER_LEFT: return PANEL_ORIENT_LEFT;
147                case BORDER_BOTTOM: return PANEL_ORIENT_DOWN;
148                }
149                g_assert_not_reached ();
150                break;
151        case BASEP_HIDDEN_LEFT:
152                return (panel->orient == GTK_ORIENTATION_HORIZONTAL)
153                        ? PANEL_ORIENT_LEFT : PANEL_ORIENT_UP;
154        case BASEP_HIDDEN_RIGHT:
155                return (panel->orient == GTK_ORIENTATION_HORIZONTAL)
156                        ? PANEL_ORIENT_RIGHT : PANEL_ORIENT_DOWN;
157        default:
158                g_assert_not_reached ();
159                break;
160        }
161        g_assert_not_reached ();
162        return PANEL_ORIENT_LEFT;
163}
164
165void
166border_widget_change_params (BorderWidget *border,
167                             int screen,
168                             int monitor,
169                             BorderEdge edge,
170                             int sz,
171                             BasePMode mode,
172                             BasePState state,
173                             gboolean hidebuttons_enabled,
174                             gboolean hidebutton_pixmaps_enabled,
175                             PanelBackgroundType back_type,
176                             char *pixmap_name,
177                             gboolean fit_pixmap_bg,
178                             gboolean stretch_pixmap_bg,
179                             gboolean rotate_pixmap_bg,
180                             PanelColor *back_color)
181{
182        GtkOrientation new_orient;
183        g_return_if_fail (GTK_WIDGET_REALIZED (GTK_WIDGET (border)));
184
185        new_orient = (edge == BORDER_TOP ||
186                      edge == BORDER_BOTTOM)
187                ? GTK_ORIENTATION_HORIZONTAL
188                : GTK_ORIENTATION_VERTICAL;
189
190        if (edge != BORDER_POS (border->pos)->edge) {   
191                BORDER_POS(border->pos)->edge = edge;
192                g_signal_emit (G_OBJECT (border->pos),
193                               border_pos_signals[EDGE_CHANGE_SIGNAL],
194                               0, edge);
195        }
196
197        basep_widget_change_params (BASEP_WIDGET (border),
198                                    screen,
199                                    monitor,
200                                    new_orient,
201                                    sz,
202                                    mode,
203                                    state,
204                                    hidebuttons_enabled,
205                                    hidebutton_pixmaps_enabled,
206                                    back_type,
207                                    pixmap_name,
208                                    fit_pixmap_bg,
209                                    stretch_pixmap_bg,
210                                    rotate_pixmap_bg,
211                                    back_color);
212}
213
214static void
215border_pos_show_hide_left (BasePWidget *basep)
216{
217        switch (basep->state) {
218        case BASEP_SHOWN:
219                basep_widget_explicit_hide (basep, BASEP_HIDDEN_LEFT);
220                break;
221        case BASEP_HIDDEN_RIGHT:
222                basep_widget_explicit_show (basep);
223                break;
224        default:
225                break;
226        }
227}
228
229
230static void
231border_pos_show_hide_right (BasePWidget *basep)
232{
233        switch (basep->state) {
234        case BASEP_SHOWN:
235                basep_widget_explicit_hide (basep, BASEP_HIDDEN_RIGHT);
236                break;
237        case BASEP_HIDDEN_LEFT:
238                basep_widget_explicit_show (basep);
239                break;
240        default:
241                break;
242        }
243}
244
245static void
246border_pos_pre_convert_hook (BasePWidget *basep)
247{
248        basep->keep_in_screen = TRUE;
249        PANEL_WIDGET (basep->panel)->packed = TRUE;
250}
251
252void
253border_widget_change_edge (BorderWidget *border, BorderEdge edge)
254{
255        BasePWidget *basep = BASEP_WIDGET (border);
256        PanelWidget *panel = PANEL_WIDGET (basep->panel);
257       
258        if (BORDER_POS (border->pos)->edge == edge)
259                return;
260
261        border_widget_change_params (border,
262                                     basep->screen,
263                                     basep->monitor,
264                                     edge,
265                                     panel->sz,
266                                     basep->mode,
267                                     basep->state,
268                                     basep->hidebuttons_enabled,
269                                     basep->hidebutton_pixmaps_enabled,
270                                     panel->background.type,
271                                     panel->background.image,
272                                     panel->background.fit_image,
273                                     panel->background.stretch_image,
274                                     panel->background.rotate_image,
275                                     &panel->background.color);
276}
277
278GtkWidget *
279border_widget_construct (const char *panel_id,
280                         BorderWidget *border,
281                         int screen,
282                         int monitor,
283                         BorderEdge edge,
284                         gboolean packed,
285                         gboolean reverse_arrows,
286                         int sz,
287                         BasePMode mode,
288                         BasePState state,
289                         gboolean hidebuttons_enabled,
290                         gboolean hidebutton_pixmaps_enabled,
291                         PanelBackgroundType back_type,
292                         const char *back_pixmap,
293                         gboolean fit_pixmap_bg,
294                         gboolean stretch_pixmap_bg,
295                         gboolean rotate_pixmap_bg,
296                         PanelColor *back_color)
297{
298        BasePWidget *basep = BASEP_WIDGET (border);
299        GtkOrientation orient;
300
301        if (edge == BORDER_TOP ||
302            edge == BORDER_BOTTOM)
303                orient = GTK_ORIENTATION_HORIZONTAL;
304        else
305                orient = GTK_ORIENTATION_VERTICAL;
306
307        BORDER_POS (basep->pos)->edge = edge;
308        basep->keep_in_screen = TRUE;
309
310        basep_widget_construct (panel_id,
311                                basep,
312                                packed,
313                                reverse_arrows,
314                                screen,
315                                monitor,
316                                orient,
317                                sz,
318                                mode,
319                                state,
320                                hidebuttons_enabled,
321                                hidebutton_pixmaps_enabled,
322                                back_type,
323                                back_pixmap,
324                                fit_pixmap_bg,
325                                stretch_pixmap_bg,
326                                rotate_pixmap_bg,
327                                back_color);
328
329        return GTK_WIDGET (basep);
330}
Note: See TracBrowser for help on using the repository browser.