2 * ion/ioncore/saveload.c
4 * Copyright (c) Tuomo Valkonen 1999-2009.
6 * See the included file LICENSE for details.
13 #include <libtu/objp.h>
14 #include <libextl/readconfig.h>
15 #include <libextl/extl.h>
29 static bool loading_layout
=FALSE
;
30 static bool layout_load_error
=FALSE
;
33 /*{{{ Session management module support */
36 static SMAddCallback
*add_cb
;
37 static SMCfgCallback
*cfg_cb
;
40 void ioncore_set_sm_callbacks(SMAddCallback
*add
, SMCfgCallback
*cfg
)
47 void ioncore_get_sm_callbacks(SMAddCallback
**add
, SMCfgCallback
**cfg
)
57 /*{{{ Load support functions */
60 static WPHolder
**current_ph_p
=NULL
;
63 WPHolder
*ioncore_get_load_pholder()
65 if(current_ph_p
==NULL
){
68 WPHolder
*ph
=*current_ph_p
;
75 WRegion
*create_region_load(WWindow
*par
, const WFitParams
*fp
,
76 ExtlTab tab
, WPHolder
**sm_ph_p
)
78 char *objclass
=NULL
, *name
=NULL
;
79 WRegionLoadCreateFn
* fn
=NULL
;
80 WRegClassInfo
*info
=NULL
;
83 char *grouped_name
=NULL
;
86 if(!extl_table_gets_s(tab
, "type", &objclass
))
92 info
=ioncore_lookup_regclass(objclass
, FALSE
);
97 warn(TR("Unknown class \"%s\", cannot create region."),
99 layout_load_error
=loading_layout
;
105 old_ph_p
=current_ph_p
;
106 current_ph_p
=sm_ph_p
;
108 reg
=fn(par
, fp
, tab
);
110 current_ph_p
=old_ph_p
;
113 if(!OBJ_IS(reg
, WClientWin
)){
114 if(extl_table_gets_s(tab
, "name", &name
)){
115 region_set_name(reg
, name
);
128 /*{{{ Save support functions */
131 bool region_supports_save(WRegion
*reg
)
133 return HAS_DYN(reg
, region_get_configuration
);
137 ExtlTab
region_get_base_configuration(WRegion
*reg
)
142 tab
=extl_create_table();
144 extl_table_sets_s(tab
, "type", OBJ_TYPESTR(reg
));
146 name
=region_name(reg
);
148 if(name
!=NULL
&& !OBJ_IS(reg
, WClientWin
))
149 extl_table_sets_s(tab
, "name", name
);
155 static bool get_config_clientwins
=TRUE
;
158 ExtlTab
region_get_configuration(WRegion
*reg
)
160 ExtlTab tab
=extl_table_none();
161 if(get_config_clientwins
|| !OBJ_IS(reg
, WClientWin
)){
162 CALL_DYN_RET(tab
, ExtlTab
, region_get_configuration
, reg
, (reg
));
169 * Get configuration tree. If \var{clientwins} is unset, client windows
172 EXTL_EXPORT_AS(WRegion
, get_configuration
)
173 ExtlTab
region_get_configuration_extl(WRegion
*reg
, bool clientwins
)
177 get_config_clientwins
=clientwins
;
179 tab
=region_get_configuration(reg
);
181 get_config_clientwins
=TRUE
;
190 /*{{{ save_workspaces, load_workspaces */
193 static const char backup_msg
[]=DUMMY_TR(
194 "There were errors loading layout. Backing up current layout savefile as\n"
196 "If you are _not_ running under a session manager and wish to restore your\n"
197 "old layout, copy this backup file over the layout savefile found in the\n"
198 "same directory while Ion is not running and after having fixed your other\n"
199 "configuration files that are causing this problem. (Maybe a missing\n"
203 bool ioncore_init_layout()
210 ok
=extl_read_savefile("saved_layout", &tab
);
213 layout_load_error
=FALSE
;
215 FOR_ALL_SCREENS(scr
){
216 ExtlTab scrtab
=extl_table_none();
219 /* Potential Xinerama or such support should set the screen ID
220 * of the root window to less than zero, and number its own
221 * fake screens up from 0.
227 scrok
=extl_table_geti_t(tab
, screen_id(scr
), &scrtab
);
229 n
+=(TRUE
==screen_init_layout(scr
, scrtab
));
232 extl_unref_table(scrtab
);
235 loading_layout
=FALSE
;
237 if(layout_load_error
){
239 char tm
[]="saved_layout.backup-YYYYMMDDHHMMSS\0\0\0\0";
242 strftime(tm
+20, 15, "%Y%m%d%H%M%S", localtime(&t
));
243 backup
=extl_get_savefile(tm
);
245 warn(TR("Unable to get file for layout backup."));
248 if(access(backup
, F_OK
)==0){
249 warn(TR("Backup file %s already exists."), backup
);
253 warn(TR(backup_msg
), backup
);
254 if(!extl_serialise(backup
, tab
))
255 warn(TR("Failed backup."));
260 warn(TR("Unable to initialise layout on any screen."));
268 bool ioncore_save_layout()
271 ExtlTab tab
=extl_create_table();
274 if(tab
==extl_table_none())
277 FOR_ALL_SCREENS(scr
){
284 scrtab
=region_get_configuration((WRegion
*)scr
);
286 if(scrtab
==extl_table_none()){
287 warn(TR("Unable to get configuration for screen %d."),
290 extl_table_seti_t(tab
, screen_id(scr
), scrtab
);
291 extl_unref_table(scrtab
);
295 ret
=extl_write_savefile("saved_layout", tab
);
297 extl_unref_table(tab
);
300 warn(TR("Unable to save layout."));