5
* Copyright (C) 2011 Novell, Inc.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License as
9
* published by the Free Software Foundation; either version 2 of the
10
* License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23
* Vincent Untz <vuntz@gnome.org>
29
#include <glib/gi18n.h>
33
#include <libpanel-util/panel-cleanup.h>
34
#include <libpanel-util/panel-dconf.h>
35
#include <libpanel-util/panel-glib.h>
36
#include <libpanel-util/panel-gsettings.h>
39
#include "panel-gconf.h"
40
#include "panel-multiscreen.h"
41
#include "panel-object-loader.h"
42
#include "panel-schemas.h"
43
#include "panel-toplevel.h"
45
#include "panel-layout.h"
47
static GSettings *layout_settings = NULL;
49
#define PANEL_LAYOUT_ERROR panel_layout_error_quark ()
50
#define PANEL_LAYOUT_OBJECT_GCONF_PATH_TEMPLATE "/apps/panel3-applets/%s"
52
static void panel_layout_load_toplevel (const char *toplevel_id);
53
static void panel_layout_load_object (const char *object_id);
54
static void panel_layout_changed_toplevel (void);
55
static void panel_layout_changed_object (void);
58
panel_layout_error_quark (void)
60
static GQuark ret = 0;
63
ret = g_quark_from_static_string ("panel_layout_error");
69
panel_layout_init (void)
71
if (layout_settings == NULL) {
72
layout_settings = g_settings_new (PANEL_LAYOUT_SCHEMA);
73
panel_cleanup_register (panel_cleanup_unref_and_nullify,
79
/************************************\
80
* Adding to the layout from a file *
81
\************************************/
87
} PanelLayoutKeyDefinition;
89
static PanelLayoutKeyDefinition panel_layout_toplevel_keys[] = {
90
{ PANEL_TOPLEVEL_NAME_KEY, G_TYPE_STRING },
91
{ PANEL_TOPLEVEL_SCREEN_KEY, G_TYPE_INT },
92
{ PANEL_TOPLEVEL_MONITOR_KEY, G_TYPE_INT },
93
{ PANEL_TOPLEVEL_EXPAND_KEY, G_TYPE_BOOLEAN },
94
{ PANEL_TOPLEVEL_ORIENTATION_KEY, G_TYPE_STRING },
95
{ PANEL_TOPLEVEL_SIZE_KEY, G_TYPE_INT },
96
{ PANEL_TOPLEVEL_X_KEY, G_TYPE_INT },
97
{ PANEL_TOPLEVEL_Y_KEY, G_TYPE_INT },
98
{ PANEL_TOPLEVEL_X_RIGHT_KEY, G_TYPE_INT },
99
{ PANEL_TOPLEVEL_Y_BOTTOM_KEY, G_TYPE_INT },
100
{ PANEL_TOPLEVEL_X_CENTERED_KEY, G_TYPE_BOOLEAN },
101
{ PANEL_TOPLEVEL_Y_CENTERED_KEY, G_TYPE_BOOLEAN },
102
{ PANEL_TOPLEVEL_AUTO_HIDE_KEY, G_TYPE_BOOLEAN },
103
{ PANEL_TOPLEVEL_ENABLE_BUTTONS_KEY, G_TYPE_BOOLEAN },
104
{ PANEL_TOPLEVEL_ENABLE_ARROWS_KEY, G_TYPE_BOOLEAN },
105
{ PANEL_TOPLEVEL_HIDE_DELAY_KEY, G_TYPE_INT },
106
{ PANEL_TOPLEVEL_UNHIDE_DELAY_KEY, G_TYPE_INT },
107
{ PANEL_TOPLEVEL_AUTO_HIDE_SIZE_KEY, G_TYPE_INT },
108
{ PANEL_TOPLEVEL_ANIMATION_SPEED_KEY, G_TYPE_STRING }
111
static PanelLayoutKeyDefinition panel_layout_object_keys[] = {
112
{ PANEL_OBJECT_IID_KEY, G_TYPE_STRING },
113
{ PANEL_OBJECT_TOPLEVEL_ID_KEY, G_TYPE_STRING },
114
{ PANEL_OBJECT_PACK_TYPE_KEY, G_TYPE_STRING },
115
{ PANEL_OBJECT_PACK_INDEX_KEY, G_TYPE_INT }
119
panel_layout_append_self_check (GSettings *settings,
120
PanelLayoutKeyDefinition *key_definitions,
121
int key_definitions_len,
124
char **settings_keys = NULL;
127
/* Don't do those checks twice; we use a static array with a boolean
128
* for each set of key definitions we might want to check, and mark the
129
* booleans to TRUE once we've entered this function once for a set. */
130
static gboolean self_check_done[2] = {FALSE, FALSE};
132
g_assert (key_definitions == panel_layout_toplevel_keys ||
133
key_definitions == panel_layout_object_keys);
135
if (key_definitions == panel_layout_toplevel_keys) {
136
if (self_check_done[0])
139
self_check_done[0] = TRUE;
141
if (key_definitions == panel_layout_object_keys) {
142
if (self_check_done[1])
145
self_check_done[1] = TRUE;
147
/* End hacky way of avoiding double-checks */
149
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
151
settings_keys = g_settings_list_keys (settings);
153
for (i = 0; settings_keys[i] != NULL; i++) {
154
gboolean found = FALSE;
156
for (j = 0; j < key_definitions_len; j++) {
157
if (g_strcmp0 (settings_keys[i],
158
key_definitions[j].name) == 0) {
165
g_set_error (error, PANEL_LAYOUT_ERROR, 0,
166
"Mismatch between keys defined in schema and keys known to gnome-panel ('%s' is not known)",
168
g_strfreev (settings_keys);
173
g_strfreev (settings_keys);
175
if (i != key_definitions_len) {
176
g_set_error (error, PANEL_LAYOUT_ERROR, 0,
177
"Mismatch between keys defined in schema and keys known to gnome-panel (%d keys in schema, %d keys known to gnome-panel)",
186
panel_layout_find_free_id (const char *id_list_key,
188
const char *path_prefix,
190
int screen_for_toplevels)
194
char **existing_dirs;
199
existing_ids = g_settings_get_strv (layout_settings,
201
existing_dirs = panel_dconf_list_subdirs (path_prefix, TRUE);
206
/* If a specific id is specified, try to use it; it might be
209
if (screen_for_toplevels != -1 &&
210
g_strcmp0 (schema, PANEL_TOPLEVEL_SCHEMA) == 0)
211
unique_id = g_strdup_printf ("%s-screen%d",
213
screen_for_toplevels);
215
unique_id = g_strdup (try_id);
219
for (i = 0; !existing && existing_ids[i] != NULL; i++) {
220
if (g_strcmp0 (unique_id,
221
existing_ids[i]) == 0)
224
for (i = 0; !existing && existing_dirs[i] != NULL; i++) {
225
if (g_strcmp0 (unique_id,
226
existing_dirs[i]) == 0)
235
if (g_strcmp0 (schema, PANEL_TOPLEVEL_SCHEMA) == 0)
237
else if (g_strcmp0 (schema, PANEL_OBJECT_SCHEMA) == 0)
240
g_assert_not_reached ();
243
/* Append an index at the end of the id to find a unique
244
* id, not used yet */
246
if (screen_for_toplevels != -1 &&
247
g_strcmp0 (schema, PANEL_TOPLEVEL_SCHEMA) == 0)
248
unique_id = g_strdup_printf ("%s-screen%d-%d",
250
screen_for_toplevels,
253
unique_id = g_strdup_printf ("%s-%d", try_id, index);
257
for (i = 0; !existing && existing_ids[i] != NULL; i++) {
258
if (g_strcmp0 (unique_id,
259
existing_ids[i]) == 0)
262
for (i = 0; !existing && existing_dirs[i] != NULL; i++) {
263
if (g_strcmp0 (unique_id,
264
existing_dirs[i]) == 0)
273
g_strfreev (existing_dirs);
274
g_strfreev (existing_ids);
280
panel_layout_append_group_helper (GKeyFile *keyfile,
283
const char *group_prefix,
284
const char *id_list_key,
286
const char *path_prefix,
287
const char *default_prefix,
288
PanelLayoutKeyDefinition *key_definitions,
289
int key_definitions_len,
292
const char *type_for_error_message)
294
gboolean retval = FALSE;
296
char *unique_id = NULL;
298
GSettings *settings = NULL;
299
char **keyfile_keys = NULL;
302
gboolean value_boolean;
305
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
307
/* Try to extract an id from the group, by stripping the prefix,
308
* and create a unique id out of that */
309
id = group + strlen (group_prefix);
310
while (g_ascii_isspace (*id))
316
if (id && !panel_gsettings_is_valid_keyname (id, error))
319
unique_id = panel_layout_find_free_id (id_list_key, schema, path_prefix,
322
path = g_strdup_printf ("%s%s/", path_prefix, unique_id);
323
settings = g_settings_new_with_path (schema, path);
326
/* Check that what the code knows matches what the schemas say */
327
if (!panel_layout_append_self_check (settings,
333
keyfile_keys = g_key_file_get_keys (keyfile, group, NULL, error);
338
/* Now do the real work: we validate/add keys from the keyfile */
339
for (i = 0; keyfile_keys[i] != NULL; i++) {
340
gboolean found = FALSE;
342
for (j = 0; j < key_definitions_len; j++) {
343
if (g_strcmp0 (keyfile_keys[i],
344
key_definitions[j].name) == 0) {
351
g_set_error (error, PANEL_LAYOUT_ERROR, 0,
352
"Unknown key '%s' for %s",
354
type_for_error_message);
358
switch (key_definitions[j].type) {
360
value_str = g_key_file_get_string (
362
group, keyfile_keys[i],
368
g_settings_set_string (settings,
369
key_definitions[j].name,
375
value_int = g_key_file_get_integer (
377
group, keyfile_keys[i],
383
g_settings_set_int (settings,
384
key_definitions[j].name,
389
value_boolean = g_key_file_get_boolean (
391
group, keyfile_keys[i],
397
g_settings_set_boolean (settings,
398
key_definitions[j].name,
402
g_assert_not_reached ();
408
if (set_screen_to != -1 &&
409
g_strcmp0 (schema, PANEL_TOPLEVEL_SCHEMA) == 0)
410
g_settings_set_int (settings,
411
PANEL_TOPLEVEL_SCREEN_KEY,
414
panel_gsettings_append_strv (layout_settings,
423
g_strfreev (keyfile_keys);
425
g_object_unref (settings);
433
panel_layout_append_group (GKeyFile *keyfile,
435
int screen_for_toplevels,
439
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
441
if (g_strcmp0 (group, "Toplevel") == 0 ||
442
g_str_has_prefix (group, "Toplevel "))
443
return panel_layout_append_group_helper (
445
screen_for_toplevels,
447
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY,
448
PANEL_TOPLEVEL_SCHEMA,
449
PANEL_LAYOUT_TOPLEVEL_PATH,
450
PANEL_LAYOUT_TOPLEVEL_DEFAULT_PREFIX,
451
panel_layout_toplevel_keys,
452
G_N_ELEMENTS (panel_layout_toplevel_keys),
453
dry_run, error, "toplevel");
454
else if (g_strcmp0 (group, "Object") == 0 ||
455
g_str_has_prefix (group, "Object "))
456
return panel_layout_append_group_helper (
460
PANEL_LAYOUT_OBJECT_ID_LIST_KEY,
462
PANEL_LAYOUT_OBJECT_PATH,
463
PANEL_LAYOUT_OBJECT_DEFAULT_PREFIX,
464
panel_layout_object_keys,
465
G_N_ELEMENTS (panel_layout_object_keys),
466
dry_run, error, "object");
468
g_set_error (error, PANEL_LAYOUT_ERROR, 0,
469
"Unknown group '%s'", group);
475
panel_layout_append_from_file_real (const char *layout_file,
476
int screen_for_toplevels,
477
gboolean error_fatal)
479
GError *error = NULL;
480
GKeyFile *keyfile = NULL;
481
char **groups = NULL;
482
gboolean found_one = FALSE;
485
panel_layout_init ();
487
keyfile = g_key_file_new ();
490
if (!g_key_file_load_from_file (keyfile, layout_file,
491
G_KEY_FILE_NONE, &error))
494
groups = g_key_file_get_groups (keyfile, NULL);
496
/* First pass to validate: we don't want to add only a subset of the
497
* layout; the whole layout has to be valid */
498
for (i = 0; groups[i] != NULL; i++) {
499
if (!panel_layout_append_group (keyfile, groups[i],
500
screen_for_toplevels,
508
error = g_error_new (PANEL_LAYOUT_ERROR, 0,
509
"No defined toplevel or object");
513
/* Second pass to really add the layout. We know there'll be no error
514
* since the first pass worked. */
515
for (i = 0; groups[i] != NULL; i++)
516
panel_layout_append_group (keyfile, groups[i],
517
screen_for_toplevels,
522
g_printerr ("Error while parsing default layout from '%s': %s\n",
523
layout_file, error->message);
524
g_error_free (error);
527
g_assert_not_reached ();
534
g_key_file_free (keyfile);
538
panel_layout_append_from_file_for_screen (const char *layout_file,
541
int screen_n = gdk_screen_get_number (screen);
543
panel_layout_append_from_file_real (layout_file, screen_n, FALSE);
547
panel_layout_append_from_file (const char *layout_file,
548
gboolean error_fatal)
550
panel_layout_append_from_file_real (layout_file, -1, error_fatal);
554
/***********************\
555
* New toplevel/object *
556
\***********************/
560
panel_layout_toplevel_create (GdkScreen *screen)
565
PanelOrientation orientation;
568
unique_id = panel_layout_find_free_id (PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY,
569
PANEL_TOPLEVEL_SCHEMA,
570
PANEL_LAYOUT_TOPLEVEL_PATH,
573
path = g_strdup_printf ("%s%s/", PANEL_LAYOUT_TOPLEVEL_PATH, unique_id);
574
settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA, path);
577
g_settings_set_int (settings,
578
PANEL_TOPLEVEL_SCREEN_KEY,
579
gdk_screen_get_number (screen));
581
if (panel_toplevel_find_empty_spot (screen, &orientation, &monitor)) {
582
g_settings_set_enum (settings,
583
PANEL_TOPLEVEL_ORIENTATION_KEY,
585
g_settings_set_int (settings,
586
PANEL_TOPLEVEL_MONITOR_KEY,
590
g_object_unref (settings);
592
panel_gsettings_append_strv (layout_settings,
593
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY,
600
panel_layout_object_create (PanelObjectType type,
601
const char *type_detail,
602
const char *toplevel_id,
603
PanelObjectPackType pack_type,
608
id = panel_layout_object_create_start (type, type_detail,
609
toplevel_id, pack_type, pack_index,
615
panel_layout_object_create_finish (id);
621
panel_layout_object_get_gconf_path (const char *object_id)
626
/* gconf uses '_' and not '-' */
627
gconfied_id = g_strdup (object_id);
628
g_strdelimit (gconfied_id, "-", '_');
630
ret = g_strdup_printf (PANEL_LAYOUT_OBJECT_GCONF_PATH_TEMPLATE,
633
g_free (gconfied_id);
639
panel_layout_get_instance_settings (GSettings *settings_object,
644
GSettings *settings_instance;
646
g_return_val_if_fail (G_IS_SETTINGS (settings_object), NULL);
648
g_object_get (settings_object, "path", &path, NULL);
649
path_instance = g_strdup_printf ("%s%s", path,
650
PANEL_LAYOUT_OBJECT_CONFIG_SUFFIX);
653
settings_instance = g_settings_new_with_path (schema, path_instance);
654
g_free (path_instance);
656
return settings_instance;
660
panel_layout_object_create_start (PanelObjectType type,
661
const char *type_detail,
662
const char *toplevel_id,
663
PanelObjectPackType pack_type,
665
GSettings **settings)
669
GSettings *settings_object;
675
iid = panel_object_type_to_iid (type, type_detail);
679
unique_id = panel_layout_find_free_id (PANEL_LAYOUT_OBJECT_ID_LIST_KEY,
681
PANEL_LAYOUT_OBJECT_PATH,
684
path = g_strdup_printf ("%s%s/", PANEL_LAYOUT_OBJECT_PATH, unique_id);
685
settings_object = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path);
688
g_settings_set_string (settings_object,
689
PANEL_OBJECT_IID_KEY,
691
g_settings_set_string (settings_object,
692
PANEL_OBJECT_TOPLEVEL_ID_KEY,
694
g_settings_set_enum (settings_object,
695
PANEL_OBJECT_PACK_TYPE_KEY,
697
g_settings_set_int (settings_object,
698
PANEL_OBJECT_PACK_INDEX_KEY,
704
*settings = settings_object;
706
g_object_unref (settings_object);
712
panel_layout_object_create_finish (const char *object_id)
714
panel_gsettings_append_strv (layout_settings,
715
PANEL_LAYOUT_OBJECT_ID_LIST_KEY,
720
/*******************\
722
\*******************/
726
panel_layout_is_writable (void)
728
return (g_settings_is_writable (layout_settings,
729
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY) &&
730
g_settings_is_writable (layout_settings,
731
PANEL_LAYOUT_OBJECT_ID_LIST_KEY));
735
panel_layout_delete_toplevel (const char *toplevel_id)
742
if (PANEL_GLIB_STR_EMPTY (toplevel_id))
745
/* The original will be freed if removal succeeds */
746
id_copy = g_strdup (toplevel_id);
748
if (!panel_gsettings_remove_all_from_strv (layout_settings,
749
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY,
755
path = g_strdup_printf ("%s%s/",
756
PANEL_LAYOUT_TOPLEVEL_PATH, id_copy);
757
panel_dconf_recursive_reset (path, NULL);
759
/* remove all applets that were on this toplevel */
761
objects = g_settings_get_strv (layout_settings,
762
PANEL_LAYOUT_OBJECT_ID_LIST_KEY);
764
for (i = 0; objects[i] != NULL; i++) {
766
char *object_toplevel_id;
768
path = g_strdup_printf ("%s%s/",
769
PANEL_LAYOUT_OBJECT_PATH, objects[i]);
771
settings = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path);
772
object_toplevel_id = g_settings_get_string (settings,
773
PANEL_OBJECT_TOPLEVEL_ID_KEY);
775
g_object_unref (settings);
778
if (g_strcmp0 (id_copy, object_toplevel_id) == 0)
779
panel_layout_delete_object (objects[i]);
781
g_free (object_toplevel_id);
784
g_strfreev (objects);
790
panel_layout_delete_object (const char *object_id)
795
if (PANEL_GLIB_STR_EMPTY (object_id))
798
/* The original will be freed if removal succeeds */
799
id_copy = g_strdup (object_id);
801
if (!panel_gsettings_remove_all_from_strv (layout_settings,
802
PANEL_LAYOUT_OBJECT_ID_LIST_KEY,
808
path = g_strdup_printf ("%s%s/",
809
PANEL_LAYOUT_OBJECT_PATH, id_copy);
810
panel_dconf_recursive_reset (path, NULL);
813
path = panel_layout_object_get_gconf_path (id_copy);
814
panel_gconf_recursive_unset (path, NULL);
821
panel_layout_changed_toplevel (void)
831
ids = g_settings_get_strv (layout_settings,
832
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY);
834
/* Remove what is not in the layout anymore */
838
for (l = panel_toplevel_list_toplevels (); l != NULL; l = l->next) {
839
id = panel_toplevel_get_id (l->data);
842
for (i = 0; ids[i] != NULL; i++) {
843
if (g_strcmp0 (ids[i], id) == 0) {
850
to_remove = g_slist_prepend (to_remove, l->data);
853
for (l = to_remove; l != NULL; l = l->next)
854
gtk_widget_destroy (GTK_WIDGET (l->data));
856
g_slist_free (to_remove);
858
/* Add what appeared in the layout */
862
for (i = 0; ids[i] != NULL; i++) {
865
for (l = panel_toplevel_list_toplevels (); l != NULL; l = l->next) {
866
id = panel_toplevel_get_id (l->data);
867
if (g_strcmp0 (ids[i], id) == 0) {
874
panel_layout_load_toplevel (ids[i]);
881
/* Reload list of objects to get those that might be on the new
884
panel_layout_changed_object ();
888
panel_layout_changed_object (void)
898
ids = g_settings_get_strv (layout_settings,
899
PANEL_LAYOUT_OBJECT_ID_LIST_KEY);
901
/* Remove what is not in the layout anymore */
905
for (l = panel_applet_list_applets (); l != NULL; l = l->next) {
906
id = panel_applet_get_id (l->data);
909
for (i = 0; ids[i] != NULL; i++) {
910
if (g_strcmp0 (ids[i], id) == 0) {
917
to_remove = g_slist_prepend (to_remove, l->data);
920
for (l = to_remove; l != NULL; l = l->next)
921
panel_applet_clean (l->data);
923
g_slist_free (to_remove);
925
/* Add what appeared in the layout */
929
for (i = 0; ids[i] != NULL; i++) {
932
if (panel_object_loader_is_queued (ids[i]))
935
for (l = panel_applet_list_applets (); l != NULL; l = l->next) {
936
id = panel_applet_get_id (l->data);
937
if (g_strcmp0 (ids[i], id) == 0) {
944
panel_layout_load_object (ids[i]);
951
/* Always do this, even if loading is FALSE: if a panel has been
952
* created, we want a do_load() to unhide it, even if there is no
954
panel_object_loader_do_load (FALSE);
958
panel_layout_changed (GSettings *settings,
962
if (g_strcmp0 (key, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY) == 0)
963
panel_layout_changed_toplevel ();
964
else if (g_strcmp0 (key, PANEL_LAYOUT_OBJECT_ID_LIST_KEY) == 0)
965
panel_layout_changed_object ();
974
panel_layout_load_toplevel (const char *toplevel_id)
976
PanelToplevel *toplevel;
981
if (PANEL_GLIB_STR_EMPTY (toplevel_id))
984
path = g_strdup_printf ("%s%s/",
985
PANEL_LAYOUT_TOPLEVEL_PATH, toplevel_id);
987
/* Check that the screen is valid */
988
settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA, path);
989
screen = g_settings_get_int (settings, PANEL_TOPLEVEL_SCREEN_KEY);
990
g_object_unref (settings);
992
if (screen < 0 || screen >= panel_multiscreen_screens ()) {
997
toplevel = g_object_new (PANEL_TYPE_TOPLEVEL,
998
"toplevel-id", toplevel_id,
999
"settings-path", path,
1004
/* FIXME: we shouldn't have to do this manually */
1005
panel_setup (toplevel);
1007
gtk_widget_show (GTK_WIDGET (toplevel));
1011
panel_layout_load_object (const char *object_id)
1015
if (PANEL_GLIB_STR_EMPTY (object_id))
1018
path = g_strdup_printf ("%s%s/",
1019
PANEL_LAYOUT_OBJECT_PATH, object_id);
1021
panel_object_loader_queue (object_id, path);
1027
panel_layout_get_default_layout_file (void)
1029
return g_build_filename (PANELDATADIR,
1030
"panel-default-layout.layout",
1035
panel_layout_ensure_toplevel_per_screen (void)
1038
GSList *empty_screens = NULL;
1040
GdkDisplay *display;
1042
char *default_layout_file;
1044
toplevels = panel_toplevel_list_toplevels ();
1046
display = gdk_display_get_default ();
1048
n_screens = gdk_display_get_n_screens (display);
1049
for (i = 0; i < n_screens; i++) {
1052
screen = gdk_display_get_screen (display, i);
1054
for (l = toplevels; l; l = l->next)
1055
if (gtk_window_get_screen (l->data) == screen)
1059
empty_screens = g_slist_prepend (empty_screens, screen);
1062
if (empty_screens == NULL)
1065
default_layout_file = panel_layout_get_default_layout_file ();
1067
for (l = empty_screens; l; l = l->next)
1068
panel_layout_append_from_file_for_screen (default_layout_file,
1071
g_free (default_layout_file);
1073
g_slist_free (empty_screens);
1077
panel_layout_load (void)
1083
panel_layout_init ();
1085
toplevels = g_settings_get_strv (layout_settings,
1086
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY);
1088
if (!toplevels[0]) {
1089
char *default_layout_file;
1091
g_strfreev (toplevels);
1093
if (!g_settings_is_writable (layout_settings,
1094
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY) ||
1095
!g_settings_is_writable (layout_settings,
1096
PANEL_LAYOUT_OBJECT_ID_LIST_KEY)) {
1097
g_printerr (_("Cannot create initial panel layout.\n"));
1102
default_layout_file = panel_layout_get_default_layout_file ();
1103
panel_layout_append_from_file (default_layout_file, TRUE);
1104
g_free (default_layout_file);
1106
toplevels = g_settings_get_strv (layout_settings,
1107
PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY);
1109
if (!toplevels[0]) {
1110
g_strfreev (toplevels);
1111
g_printerr (_("Cannot create initial panel layout.\n"));
1117
for (i = 0; toplevels[i] != NULL; i++)
1118
panel_layout_load_toplevel (toplevels[i]);
1120
g_strfreev (toplevels);
1122
objects = g_settings_get_strv (layout_settings,
1123
PANEL_LAYOUT_OBJECT_ID_LIST_KEY);
1125
for (i = 0; objects[i] != NULL; i++)
1126
panel_layout_load_object (objects[i]);
1128
g_strfreev (objects);
1130
g_signal_connect (layout_settings, "changed",
1131
G_CALLBACK (panel_layout_changed), NULL);
1133
/* This needs to happen after we've loaded the current toplevels (to
1134
* know if we have toplevels on all screens), and after we've connected
1135
* to the settings changed notifications (to automatically load created
1137
panel_layout_ensure_toplevel_per_screen ();
1139
panel_object_loader_do_load (TRUE);