249
257
return toplevel_list;
252
/* Is this the last un-attached toplevel? */
261
panel_toplevel_get_by_id (const char *toplevel_id)
265
if (PANEL_GLIB_STR_EMPTY (toplevel_id))
268
for (l = toplevel_list; l; l = l->next) {
269
PanelToplevel *toplevel = l->data;
271
if (!g_strcmp0 (toplevel->priv->toplevel_id, toplevel_id))
254
panel_toplevel_is_last_unattached (PanelToplevel *toplevel)
279
panel_toplevel_is_last (PanelToplevel *toplevel)
258
if (panel_toplevel_get_is_attached (toplevel))
261
283
for (l = toplevel_list; l; l = l->next) {
262
PanelToplevel *t = l->data;
264
if (t != toplevel && !panel_toplevel_get_is_attached (t))
284
if (l->data != toplevel)
292
panel_toplevel_find_empty_spot (GdkScreen *screen,
293
PanelOrientation *orientation,
299
gboolean found_a_spot = FALSE;
302
*orientation = PANEL_ORIENTATION_TOP;
304
filled_spots = g_new0 (int, panel_multiscreen_monitors (screen));
306
for (li = panel_toplevel_list_toplevels (); li != NULL; li = li->next) {
307
PanelToplevel *toplevel = li->data;
308
GdkScreen *toplevel_screen = gtk_window_get_screen (GTK_WINDOW (toplevel));
309
int toplevel_monitor = panel_toplevel_get_monitor (toplevel);
311
if (toplevel_screen != screen ||
312
toplevel_monitor < 0)
315
filled_spots[toplevel_monitor] |= panel_toplevel_get_orientation (toplevel);
318
for (i = 0; i < panel_multiscreen_monitors (screen); i++) {
319
/* These are ordered based on "priority" of the
320
orientation when picking it */
321
if ( ! (filled_spots[i] & PANEL_ORIENTATION_TOP)) {
322
*orientation = PANEL_ORIENTATION_TOP;
326
} else if ( ! (filled_spots[i] & PANEL_ORIENTATION_BOTTOM)) {
327
*orientation = PANEL_ORIENTATION_BOTTOM;
331
} else if ( ! (filled_spots[i] & PANEL_ORIENTATION_RIGHT)) {
332
*orientation = PANEL_ORIENTATION_RIGHT;
336
} else if ( ! (filled_spots[i] & PANEL_ORIENTATION_LEFT)) {
337
*orientation = PANEL_ORIENTATION_LEFT;
344
g_free (filled_spots);
272
349
static GdkScreen *
273
350
panel_toplevel_get_screen_geometry (PanelToplevel *toplevel,
1687
panel_toplevel_update_attached_position (PanelToplevel *toplevel,
1694
GtkAllocation attach_allocation;
1695
PanelOrientation attach_orientation;
1696
GdkRectangle toplevel_box;
1697
GdkRectangle parent_box;
1698
GdkRectangle attach_box;
1699
int x_origin = 0, y_origin = 0;
1700
int monitor_x, monitor_y;
1701
int monitor_width, monitor_height;
1703
if (!gtk_widget_get_realized (GTK_WIDGET (toplevel->priv->attach_toplevel)) ||
1704
!gtk_widget_get_realized (toplevel->priv->attach_widget))
1707
gtk_widget_get_allocation (GTK_WIDGET (toplevel->priv->attach_widget), &attach_allocation);
1709
toplevel_box = toplevel->priv->geometry;
1710
parent_box = toplevel->priv->attach_toplevel->priv->geometry;
1711
attach_box = attach_allocation;
1713
if (attach_box.x != -1) {
1714
gdk_window_get_origin (gtk_widget_get_window (GTK_WIDGET (toplevel->priv->attach_widget)),
1715
&x_origin, &y_origin);
1717
attach_box.x += x_origin;
1718
attach_box.y += y_origin;
1720
/* attach_widget isn't allocated. Put the toplevel
1723
attach_box.x = -toplevel_box.width;
1724
attach_box.y = -toplevel_box.height;
1727
attach_orientation = panel_toplevel_get_orientation (
1728
toplevel->priv->attach_toplevel);
1730
if (attach_orientation & PANEL_HORIZONTAL_MASK)
1731
*x = attach_box.x + attach_box.width / 2 - toplevel_box.width / 2;
1733
*y = attach_box.y + attach_box.height / 2 - toplevel_box.height / 2;
1735
switch (attach_orientation) {
1736
case PANEL_ORIENTATION_TOP:
1739
*y += parent_box.height;
1741
*h = parent_box.height;
1743
case PANEL_ORIENTATION_BOTTOM:
1746
*y -= toplevel_box.height;
1748
*h = parent_box.height;
1750
case PANEL_ORIENTATION_LEFT:
1753
*x += parent_box.width;
1755
*w = parent_box.width;
1757
case PANEL_ORIENTATION_RIGHT:
1760
*x -= toplevel_box.width;
1762
*w = parent_box.width;
1765
g_assert_not_reached ();
1769
panel_toplevel_get_monitor_geometry (toplevel,
1778
if (toplevel->priv->orientation & PANEL_VERTICAL_MASK)
1779
*x = CLAMP (*x, 0, monitor_width - toplevel->priv->original_width);
1781
*y = CLAMP (*y, 0, monitor_height - toplevel->priv->original_height);
1785
1744
panel_toplevel_update_normal_position (PanelToplevel *toplevel,
2305
2255
calculate_minimum_height (GtkWidget *widget,
2306
2256
PanelOrientation orientation)
2309
PangoContext *context;
2258
GtkStateFlags state;
2259
GtkStyleContext *style_context;
2260
const PangoFontDescription *font_desc;
2261
PangoContext *pango_context;
2310
2262
PangoFontMetrics *metrics;
2311
2264
int focus_width = 0;
2312
2265
int focus_pad = 0;
2317
style = gtk_widget_get_style (widget);
2318
context = gtk_widget_get_pango_context (widget);
2319
metrics = pango_context_get_metrics (context,
2321
pango_context_get_language (context));
2270
state = gtk_widget_get_state_flags (widget);
2271
style_context = gtk_widget_get_style_context (widget);
2272
font_desc = gtk_style_context_get_font (style_context, state);
2274
pango_context = gtk_widget_get_pango_context (widget);
2275
metrics = pango_context_get_metrics (pango_context,
2277
pango_context_get_language (pango_context));
2323
2278
ascent = pango_font_metrics_get_ascent (metrics);
2324
2279
descent = pango_font_metrics_get_descent (metrics);
2326
2281
pango_font_metrics_unref (metrics);
2283
gtk_style_context_get_padding (style_context, state, &padding);
2328
2284
gtk_widget_style_get (widget,
2329
2285
"focus-line-width", &focus_width,
2330
2286
"focus-padding", &focus_pad,
2333
2289
thickness = orientation & PANEL_HORIZONTAL_MASK ?
2290
padding.top + padding.bottom :
2291
padding.left + padding.right;
2337
return PANGO_PIXELS (ascent + descent) + 2 * (focus_width + focus_pad + thickness);
2293
return PANGO_PIXELS (ascent + descent) + 2 * (focus_width + focus_pad) + thickness;
2560
2505
panel_toplevel_update_description (toplevel);
2564
panel_toplevel_attach_widget_destroyed (PanelToplevel *toplevel)
2566
panel_toplevel_detach (toplevel);
2570
panel_toplevel_attach_widget_configure (PanelToplevel *toplevel)
2572
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
2578
panel_toplevel_update_attach_orientation (PanelToplevel *toplevel)
2580
PanelOrientation attach_orientation;
2581
PanelOrientation orientation;
2583
attach_orientation =
2584
panel_toplevel_get_orientation (toplevel->priv->attach_toplevel);
2586
orientation = toplevel->priv->orientation;
2588
switch (attach_orientation) {
2589
case PANEL_ORIENTATION_TOP:
2590
orientation = PANEL_ORIENTATION_LEFT;
2592
case PANEL_ORIENTATION_BOTTOM:
2593
orientation = PANEL_ORIENTATION_RIGHT;
2595
case PANEL_ORIENTATION_LEFT:
2596
orientation = PANEL_ORIENTATION_TOP;
2598
case PANEL_ORIENTATION_RIGHT:
2599
orientation = PANEL_ORIENTATION_BOTTOM;
2602
g_assert_not_reached ();
2606
panel_toplevel_set_orientation (toplevel, orientation);
2610
panel_toplevel_attach_widget_parent_set (PanelToplevel *toplevel,
2611
GtkWidget *previous_parent,
2612
GtkWidget *attach_widget)
2614
GtkWidget *panel_widget;
2616
panel_widget = gtk_widget_get_parent (GTK_WIDGET (attach_widget));
2620
g_assert (PANEL_IS_WIDGET (panel_widget));
2622
toplevel->priv->attach_toplevel = PANEL_WIDGET (panel_widget)->toplevel;
2623
panel_toplevel_update_attach_orientation (toplevel);
2624
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
2628
panel_toplevel_attach_toplevel_hiding (PanelToplevel *toplevel)
2630
if (!panel_toplevel_get_is_hidden (toplevel)) {
2631
panel_toplevel_hide (toplevel, FALSE, -1);
2633
toplevel->priv->attach_hidden = TRUE;
2638
panel_toplevel_attach_toplevel_unhiding (PanelToplevel *toplevel)
2640
if (!toplevel->priv->attach_hidden)
2643
toplevel->priv->attach_hidden = FALSE;
2645
panel_toplevel_unhide (toplevel);
2649
panel_toplevel_reverse_arrow (PanelToplevel *toplevel,
2652
GtkArrowType arrow_type;
2654
arrow_type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "arrow-type"));
2656
switch (arrow_type) {
2658
arrow_type = GTK_ARROW_DOWN;
2660
case GTK_ARROW_DOWN:
2661
arrow_type = GTK_ARROW_UP;
2663
case GTK_ARROW_LEFT:
2664
arrow_type = GTK_ARROW_RIGHT;
2666
case GTK_ARROW_RIGHT:
2667
arrow_type = GTK_ARROW_LEFT;
2670
g_assert_not_reached ();
2674
g_object_set_data (G_OBJECT (button), "arrow-type", GINT_TO_POINTER (arrow_type));
2676
gtk_arrow_set (GTK_ARROW (gtk_bin_get_child (GTK_BIN (button))), arrow_type, GTK_SHADOW_NONE);
2680
panel_toplevel_reverse_arrows (PanelToplevel *toplevel)
2682
panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_top);
2683
panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_bottom);
2684
panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_left);
2685
panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_right);
2689
panel_toplevel_disconnect_attached (PanelToplevel *toplevel)
2693
for (i = 0; i < N_ATTACH_TOPLEVEL_SIGNALS; i++) {
2694
if (!toplevel->priv->attach_toplevel_signals [i])
2697
g_signal_handler_disconnect (
2698
toplevel->priv->attach_toplevel,
2699
toplevel->priv->attach_toplevel_signals [i]);
2700
toplevel->priv->attach_toplevel_signals [i] = 0;
2703
for (i = 0; i < N_ATTACH_WIDGET_SIGNALS; i++) {
2704
if (!toplevel->priv->attach_widget_signals [i])
2707
g_signal_handler_disconnect (
2708
toplevel->priv->attach_widget,
2709
toplevel->priv->attach_widget_signals [i]);
2710
toplevel->priv->attach_widget_signals [i] = 0;
2715
panel_toplevel_connect_attached (PanelToplevel *toplevel)
2720
signals = toplevel->priv->attach_toplevel_signals;
2722
signals [i++] = g_signal_connect_swapped (
2723
toplevel->priv->attach_toplevel, "destroy",
2724
G_CALLBACK (panel_toplevel_attach_widget_destroyed), toplevel);
2725
signals [i++] = g_signal_connect_swapped (
2726
toplevel->priv->attach_toplevel, "notify::orientation",
2727
G_CALLBACK (panel_toplevel_update_attach_orientation), toplevel);
2728
signals [i++] = g_signal_connect_swapped (
2729
toplevel->priv->attach_toplevel, "configure-event",
2730
G_CALLBACK (panel_toplevel_attach_widget_configure), toplevel);
2731
signals [i++] = g_signal_connect_swapped (
2732
toplevel->priv->attach_toplevel, "hiding",
2733
G_CALLBACK (panel_toplevel_attach_toplevel_hiding), toplevel);
2734
signals [i++] = g_signal_connect_swapped (
2735
toplevel->priv->attach_toplevel, "unhiding",
2736
G_CALLBACK (panel_toplevel_attach_toplevel_unhiding), toplevel);
2738
g_assert (i == N_ATTACH_TOPLEVEL_SIGNALS);
2740
signals = toplevel->priv->attach_widget_signals;
2743
signals [i++] = g_signal_connect_swapped (
2744
toplevel->priv->attach_widget, "destroy",
2745
G_CALLBACK (panel_toplevel_attach_widget_destroyed), toplevel);
2746
signals [i++] = g_signal_connect_swapped (
2747
toplevel->priv->attach_widget, "configure-event",
2748
G_CALLBACK (panel_toplevel_attach_widget_configure), toplevel);
2749
signals [i++] = g_signal_connect_swapped (
2750
toplevel->priv->attach_widget, "parent-set",
2751
G_CALLBACK (panel_toplevel_attach_widget_parent_set), toplevel);
2752
signals [i++] = g_signal_connect_swapped (
2753
toplevel->priv->attach_widget, "show",
2754
G_CALLBACK (gtk_widget_show), toplevel);
2755
signals [i++] = g_signal_connect_swapped (
2756
toplevel->priv->attach_widget, "hide",
2757
G_CALLBACK (gtk_widget_hide), toplevel);
2759
g_assert (i == N_ATTACH_WIDGET_SIGNALS);
2763
panel_toplevel_attach_to_widget (PanelToplevel *toplevel,
2764
PanelToplevel *attach_toplevel,
2765
GtkWidget *attach_widget)
2767
g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel));
2768
g_return_if_fail (PANEL_IS_TOPLEVEL (attach_toplevel));
2769
g_return_if_fail (GTK_IS_WIDGET (attach_widget));
2771
if (toplevel->priv->attached)
2772
panel_toplevel_disconnect_attached (toplevel);
2774
toplevel->priv->attached = TRUE;
2776
/* Cancelling the initial animation for drawers in
2777
* panel_toplevel_initially_hide() is not enough, since this will
2778
* happen only when the toplevel is realized, which might be too late
2779
* for drawers (since it's realized when the drawer is clicked) */
2780
toplevel->priv->initial_animation_done = TRUE;
2782
toplevel->priv->attach_toplevel = attach_toplevel;
2783
toplevel->priv->attach_widget = attach_widget;
2785
panel_toplevel_connect_attached (toplevel);
2787
panel_toplevel_reverse_arrows (toplevel);
2788
panel_toplevel_set_expand (toplevel, FALSE);
2789
panel_toplevel_update_attach_orientation (toplevel);
2790
panel_toplevel_update_hide_buttons (toplevel);
2792
gtk_window_set_screen (GTK_WINDOW (toplevel),
2793
gtk_widget_get_screen (GTK_WIDGET (attach_toplevel)));
2794
panel_toplevel_set_monitor (toplevel,
2795
panel_toplevel_get_monitor (attach_toplevel));
2796
if (toplevel->priv->state == PANEL_STATE_NORMAL)
2797
panel_toplevel_push_autohide_disabler (toplevel->priv->attach_toplevel);
2799
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
2803
panel_toplevel_detach (PanelToplevel *toplevel)
2805
g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel));
2807
if (!toplevel->priv->attached)
2810
if (toplevel->priv->state == PANEL_STATE_NORMAL)
2811
panel_toplevel_pop_autohide_disabler (toplevel->priv->attach_toplevel);
2813
panel_toplevel_disconnect_attached (toplevel);
2815
panel_toplevel_reverse_arrows (toplevel);
2817
toplevel->priv->attached = FALSE;
2819
toplevel->priv->attach_toplevel = NULL;
2820
toplevel->priv->attach_widget = NULL;
2822
gtk_widget_queue_resize (GTK_WIDGET (toplevel));
2826
panel_toplevel_get_is_attached (PanelToplevel *toplevel)
2828
g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE);
2830
return toplevel->priv->attached;
2834
panel_toplevel_get_attach_toplevel (PanelToplevel *toplevel)
2836
g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL);
2838
return toplevel->priv->attach_toplevel;
2842
panel_toplevel_get_attach_widget (PanelToplevel *toplevel)
2844
g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL);
2846
return toplevel->priv->attach_widget;
2849
2508
static gboolean
2850
2509
panel_toplevel_popup_panel_menu (PanelToplevel *toplevel)
3171
2842
static gboolean
3172
panel_toplevel_expose (GtkWidget *widget,
3173
GdkEventExpose *event)
2843
panel_toplevel_draw (GtkWidget *widget,
3175
PanelToplevel *toplevel = (PanelToplevel *) widget;
3176
PanelFrameEdge edges;
3177
gboolean retval = FALSE;
3181
GtkAllocation allocation;
3183
if (!gtk_widget_is_drawable (widget))
3186
if (GTK_WIDGET_CLASS (panel_toplevel_parent_class)->expose_event)
3187
retval = GTK_WIDGET_CLASS (panel_toplevel_parent_class)->expose_event (widget, event);
2846
PanelToplevel *toplevel = (PanelToplevel *) widget;
2847
PanelFrameEdge edges;
2848
gboolean retval = FALSE;
2850
GtkStyleContext *context;
2851
GtkStateFlags state;
2853
int awidth, aheight;
2855
if (GTK_WIDGET_CLASS (panel_toplevel_parent_class)->draw)
2856
retval = GTK_WIDGET_CLASS (panel_toplevel_parent_class)->draw (widget, cr);
3189
2858
edges = toplevel->priv->edges;
3190
panel_frame_draw (widget, edges);
2859
/* FIXMEchpe: WTF!? */
2860
panel_frame_draw (widget, cr, edges);
3192
2862
if (toplevel->priv->expand ||
3193
toplevel->priv->buttons_enabled ||
3194
toplevel->priv->attached)
2863
toplevel->priv->buttons_enabled)
3197
2866
window = gtk_widget_get_window (widget);
3198
style = gtk_widget_get_style (widget);
3199
state = gtk_widget_get_state (widget);
3200
gtk_widget_get_allocation (widget, &allocation);
2867
state = gtk_widget_get_state_flags (widget);
2868
awidth = gtk_widget_get_allocated_width (widget);
2869
aheight = gtk_widget_get_allocated_height (widget);
2871
context = gtk_widget_get_style_context (widget);
2872
gtk_style_context_get_padding (context, state, &padding);
2874
gtk_style_context_save (context);
2875
gtk_style_context_set_state (context, state);
3202
2877
if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK) {
3203
2878
int x, y, width, height;
3204
int xthickness, ythickness;
3208
2882
width = HANDLE_SIZE;
3209
height = allocation.height;
3211
xthickness = style->xthickness;
3212
ythickness = style->ythickness;
3214
2885
if (edges & PANEL_EDGE_TOP) {
3216
height -= ythickness;
2887
height -= padding.top;
3218
2889
if (edges & PANEL_EDGE_BOTTOM)
3219
height -= ythickness;
2890
height -= padding.bottom;
3220
2891
if (edges & PANEL_EDGE_LEFT)
3223
gtk_paint_handle (style, window, state,
3225
&event->area, widget, "handlebox",
3226
x, y, width, height,
3227
GTK_ORIENTATION_VERTICAL);
3229
x = allocation.width - HANDLE_SIZE;
2895
gtk_render_handle (context, cr, x, y, width, height);
2898
x = awidth - HANDLE_SIZE;
3230
2899
if (edges & PANEL_EDGE_RIGHT)
3233
gtk_paint_handle (style, window, state,
3235
&event->area, widget, "handlebox",
3236
x, y, width, height,
3237
GTK_ORIENTATION_VERTICAL);
2903
gtk_render_handle (context, cr, x, y, width, height);
3239
2906
int x, y, width, height;
3240
int xthickness, ythickness;
3244
width = allocation.width;
3245
2911
height = HANDLE_SIZE;
3247
xthickness = style->xthickness;
3248
ythickness = style->ythickness;
3250
2913
if (edges & PANEL_EDGE_LEFT) {
3252
width -= xthickness;
2915
width -= padding.left;
3254
2917
if (edges & PANEL_EDGE_RIGHT)
3255
width -= xthickness;
2918
width -= padding.right;
3256
2919
if (edges & PANEL_EDGE_TOP)
3259
gtk_paint_handle (style, window, state,
3261
&event->area, widget, "handlebox",
3262
x, y, width, height,
3263
GTK_ORIENTATION_HORIZONTAL);
3265
y = allocation.height - HANDLE_SIZE;
2923
gtk_render_handle (context, cr, x, y, width, height);
2926
y = aheight - HANDLE_SIZE;
3266
2927
if (edges & PANEL_EDGE_BOTTOM)
2928
y -= padding.bottom;
3269
gtk_paint_handle (style, window, state,
3271
&event->area, widget, "handlebox",
3272
x, y, width, height,
3273
GTK_ORIENTATION_HORIZONTAL);
2931
gtk_render_handle (context, cr, x, y, width, height);
2935
gtk_style_context_restore (context);
4631
4366
return toplevel->priv->panel_widget;
4370
panel_toplevel_position_is_writable (PanelToplevel *toplevel)
4372
if (panel_lockdown_get_panels_locked_down_s () ||
4373
!(g_settings_is_writable (toplevel->priv->settings,
4374
PANEL_TOPLEVEL_SCREEN_KEY) &&
4375
g_settings_is_writable (toplevel->priv->settings,
4376
PANEL_TOPLEVEL_MONITOR_KEY) &&
4377
g_settings_is_writable (toplevel->priv->settings,
4378
PANEL_TOPLEVEL_ORIENTATION_KEY)))
4381
/* For expanded panels we don't really have to check x and y */
4382
if (panel_toplevel_get_expand (toplevel))
4385
return (g_settings_is_writable (toplevel->priv->settings,
4386
PANEL_TOPLEVEL_X_KEY) &&
4387
g_settings_is_writable (toplevel->priv->settings,
4388
PANEL_TOPLEVEL_Y_KEY) &&
4389
g_settings_is_writable (toplevel->priv->settings,
4390
PANEL_TOPLEVEL_X_RIGHT_KEY) &&
4391
g_settings_is_writable (toplevel->priv->settings,
4392
PANEL_TOPLEVEL_Y_BOTTOM_KEY) &&
4393
g_settings_is_writable (toplevel->priv->settings,
4394
PANEL_TOPLEVEL_X_CENTERED_KEY) &&
4395
g_settings_is_writable (toplevel->priv->settings,
4396
PANEL_TOPLEVEL_Y_CENTERED_KEY));
4400
panel_toplevel_apply_delayed_settings (PanelToplevel *toplevel)
4402
g_settings_apply (toplevel->priv->delayed_settings);
4404
toplevel->priv->apply_delayed_id = 0;
4410
panel_toplevel_apply_delayed_settings_queue (PanelToplevel *toplevel)
4412
if (toplevel->priv->apply_delayed_id != 0)
4415
toplevel->priv->apply_delayed_id = g_timeout_add (500,
4416
(GSourceFunc) panel_toplevel_apply_delayed_settings,
4421
panel_toplevel_settings_bind_get_screen (GValue *value,
4425
PanelToplevel *toplevel = PANEL_TOPLEVEL (user_data);
4426
GdkDisplay *display;
4430
display = gdk_display_get_default ();
4431
screen_n = g_variant_get_int32 (variant);
4433
if (screen_n < 0 || screen_n >= gdk_display_get_n_screens (display)) {
4434
/* Trigger an event so that the gsettings key gets updated, to
4435
* to set the key back to an actual available screen so it will
4436
* get loaded on next startup. */
4437
g_object_notify (G_OBJECT (toplevel), "screen");
4441
screen = gdk_display_get_screen (display, screen_n);
4444
g_value_set_object (value, screen);
4446
return (screen != NULL);
4450
panel_toplevel_settings_bind_set_screen (const GValue *value,
4451
const GVariantType *expected_type,
4454
GdkScreen *screen = g_value_get_object (value);
4456
if (!screen || GDK_IS_SCREEN (screen))
4457
screen = gdk_screen_get_default ();
4459
return g_variant_new ("i", gdk_screen_get_number (screen));
4463
panel_toplevel_bind_gsettings (PanelToplevel *toplevel)
4465
/* Delayed settings: the ones related to the position */
4467
g_settings_bind (toplevel->priv->delayed_settings,
4468
PANEL_TOPLEVEL_MONITOR_KEY,
4471
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4473
g_settings_bind (toplevel->priv->delayed_settings,
4474
PANEL_TOPLEVEL_SIZE_KEY,
4477
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4479
g_settings_bind (toplevel->priv->delayed_settings,
4480
PANEL_TOPLEVEL_ORIENTATION_KEY,
4483
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4485
g_settings_bind (toplevel->priv->delayed_settings,
4486
PANEL_TOPLEVEL_X_KEY,
4489
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4491
g_settings_bind (toplevel->priv->delayed_settings,
4492
PANEL_TOPLEVEL_X_RIGHT_KEY,
4495
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4497
g_settings_bind (toplevel->priv->delayed_settings,
4498
PANEL_TOPLEVEL_X_CENTERED_KEY,
4501
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4503
g_settings_bind (toplevel->priv->delayed_settings,
4504
PANEL_TOPLEVEL_Y_KEY,
4507
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4509
g_settings_bind (toplevel->priv->delayed_settings,
4510
PANEL_TOPLEVEL_Y_BOTTOM_KEY,
4513
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4515
g_settings_bind (toplevel->priv->delayed_settings,
4516
PANEL_TOPLEVEL_Y_CENTERED_KEY,
4519
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4521
/* Normal settings */
4523
g_settings_bind_with_mapping (toplevel->priv->settings,
4524
PANEL_TOPLEVEL_SCREEN_KEY,
4527
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY,
4528
panel_toplevel_settings_bind_get_screen,
4529
panel_toplevel_settings_bind_set_screen,
4532
g_settings_bind (toplevel->priv->settings,
4533
PANEL_TOPLEVEL_NAME_KEY,
4536
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4538
g_settings_bind (toplevel->priv->settings,
4539
PANEL_TOPLEVEL_EXPAND_KEY,
4542
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4544
g_settings_bind (toplevel->priv->settings,
4545
PANEL_TOPLEVEL_AUTO_HIDE_KEY,
4548
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4550
g_settings_bind (toplevel->priv->settings,
4551
PANEL_TOPLEVEL_HIDE_DELAY_KEY,
4554
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4556
g_settings_bind (toplevel->priv->settings,
4557
PANEL_TOPLEVEL_UNHIDE_DELAY_KEY,
4560
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4562
g_settings_bind (toplevel->priv->settings,
4563
PANEL_TOPLEVEL_AUTO_HIDE_SIZE_KEY,
4566
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4568
g_settings_bind (toplevel->priv->settings,
4569
PANEL_TOPLEVEL_ANIMATION_SPEED_KEY,
4572
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4574
g_settings_bind (toplevel->priv->settings,
4575
PANEL_TOPLEVEL_ENABLE_BUTTONS_KEY,
4578
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4580
g_settings_bind (toplevel->priv->settings,
4581
PANEL_TOPLEVEL_ENABLE_ARROWS_KEY,
4584
G_SETTINGS_BIND_DEFAULT|G_SETTINGS_BIND_NO_SENSITIVITY);
4588
panel_toplevel_set_toplevel_id (PanelToplevel *toplevel,
4589
const char *toplevel_id)
4591
g_assert (toplevel->priv->toplevel_id == NULL);
4593
toplevel->priv->toplevel_id = g_strdup (toplevel_id);
4596
G_CONST_RETURN char *
4597
panel_toplevel_get_id (PanelToplevel *toplevel)
4599
g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL);
4601
return toplevel->priv->toplevel_id;
4605
panel_toplevel_set_settings_path (PanelToplevel *toplevel,
4606
const char *settings_path)
4608
GSettings *settings_background;
4610
g_assert (toplevel->priv->settings_path == NULL);
4611
g_assert (toplevel->priv->settings == NULL);
4612
g_assert (toplevel->priv->delayed_settings == NULL);
4614
toplevel->priv->settings_path = g_strdup (settings_path);
4615
toplevel->priv->settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA,
4617
toplevel->priv->delayed_settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA,
4619
g_settings_delay (toplevel->priv->delayed_settings);
4621
settings_background = g_settings_get_child (toplevel->priv->settings,
4622
PANEL_BACKGROUND_SCHEMA_CHILD);
4623
/* FIXME: ideally, move this inside panel-widget.c since we're not
4624
* supposed to know about the backgrounds here */
4625
panel_background_settings_init (&toplevel->priv->panel_widget->background,
4626
settings_background);
4627
g_object_unref (settings_background);
4635
4631
panel_toplevel_update_name (PanelToplevel *toplevel)