4 * Copyright (c) Tuomo Valkonen 2004-2009.
6 * See the included file LICENSE for details.
11 #include <libtu/map.h>
12 #include <libtu/minmax.h>
13 #include <libextl/readconfig.h>
14 #include <libmainloop/hooks.h>
16 #include <ioncore/saveload.h>
17 #include <ioncore/screen.h>
18 #include <ioncore/mplex.h>
19 #include <ioncore/stacking.h>
20 #include <ioncore/ioncore.h>
21 #include <ioncore/global.h>
22 #include <ioncore/framep.h>
23 #include <ioncore/frame.h>
24 #include <ioncore/names.h>
25 #include <ioncore/group.h>
26 #include <ioncore/group-ws.h>
32 /*{{{ Module information */
34 #include "../version.h"
36 char mod_sp_ion_api_version
[]=NOTION_API_VERSION
;
42 /*{{{ Bindmaps, config, etc. */
45 #define SP_NAME "*scratchpad*"
46 #define SPWS_NAME "*scratchws*"
55 static WRegion
*create_frame_scratchpad(WWindow
*parent
, const WFitParams
*fp
,
58 return (WRegion
*)create_frame(parent
, fp
, FRAME_MODE_UNKNOWN
);
62 static WRegion
*create_scratchws(WWindow
*parent
, const WFitParams
*fp
,
66 WRegionAttachData data
;
67 WGroupAttachParams par
=GROUPATTACHPARAMS_INIT
;
70 ws
=create_groupws(parent
, fp
);
75 region_set_name((WRegion
*)ws
, SPWS_NAME
);
77 data
.type
=REGION_ATTACH_NEW
;
78 data
.u
.n
.fn
=create_frame_scratchpad
;
82 par
.szplcy
=SIZEPOLICY_FREE_GLUE
;
85 par
.geom
.w
=minof(fp
->g
.w
, CF_SCRATCHPAD_DEFAULT_W
);
86 par
.geom
.h
=minof(fp
->g
.h
, CF_SCRATCHPAD_DEFAULT_H
);
87 par
.geom
.x
=(fp
->g
.w
-par
.geom
.w
)/2;
88 par
.geom
.y
=(fp
->g
.h
-par
.geom
.h
)/2;
91 par
.level
=STACKING_LEVEL_MODAL1
+1;
95 reg
=group_do_attach(&ws
->grp
, &par
, &data
);
98 destroy_obj((Obj
*)ws
);
102 region_set_name((WRegion
*)reg
, SP_NAME
);
108 static WRegion
*create(WMPlex
*mplex
, int flags
)
111 WMPlexAttachParams par
=MPLEXATTACHPARAMS_INIT
;
114 |MPLEX_ATTACH_UNNUMBERED
115 |MPLEX_ATTACH_SIZEPOLICY
116 |MPLEX_ATTACH_PSEUDOMODAL
);
117 par
.szplcy
=SIZEPOLICY_FULL_EXACT
;
119 sp
=mplex_do_attach_new(mplex
, &par
,
124 warn(TR("Unable to create scratchpad."));
130 static bool is_scratchpad(WRegion
*reg
)
132 char *nm
=reg
->ni
.name
;
133 int inst_off
=reg
->ni
.inst_off
;
139 ? (strcmp(nm
, SP_NAME
)==0 ||
140 strcmp(nm
, SPWS_NAME
)==0)
141 : (strncmp(nm
, SP_NAME
, inst_off
)==0 ||
142 strncmp(nm
, SPWS_NAME
, inst_off
)==0));
146 * Is \var{reg} a scratchpad?
150 bool mod_sp_is_scratchpad(WRegion
*reg
)
152 return is_scratchpad(reg
);
156 * Attempt to create a scratchpad on \var{scr}.
159 bool mod_sp_create_scratchpad(WScreen
*scr
)
164 FOR_ALL_MANAGED_BY_MPLEX((WMPlex
*)scr
, reg
, tmp
){
165 if(is_scratchpad(reg
))
169 return create(&scr
->mplex
, MPLEX_ATTACH_HIDDEN
)!=NULL
;
173 * Change displayed status of some scratchpad on \var{mplex} if one is
174 * found. The parameter \var{how} is one of
175 * \codestr{set}, \codestr{unset}, or \codestr{toggle}.
176 * The resulting status is returned.
179 bool mod_sp_set_shown_on(WMPlex
*mplex
, const char *how
)
181 int setpar
=libtu_setparam_invert(libtu_string_to_setparam(how
));
184 bool found
=FALSE
, res
=FALSE
;
186 FOR_ALL_MANAGED_BY_MPLEX(mplex
, reg
, tmp
){
187 if(is_scratchpad(reg
)){
188 res
=!mplex_set_hidden(mplex
, reg
, setpar
);
194 int sp
=libtu_string_to_setparam(how
);
195 if(sp
==SETPARAM_SET
|| sp
==SETPARAM_TOGGLE
)
196 found
=(create(mplex
, 0)!=NULL
);
205 * Toggle displayed status of \var{sp}.
206 * The parameter \var{how} is one of
207 * \codestr{set}, \codestr{unset}, or \codestr{toggle}.
208 * The resulting status is returned.
211 bool mod_sp_set_shown(WFrame
*sp
, const char *how
)
214 int setpar
=libtu_setparam_invert(libtu_string_to_setparam(how
));
215 WMPlex
*mplex
=OBJ_CAST(REGION_MANAGER(sp
), WMPlex
);
217 return mplex_set_hidden(mplex
, (WRegion
*)sp
, setpar
);
227 /*{{{ Init & deinit */
232 mod_sp_unregister_exports();
236 static void check_and_create()
242 /* No longer needed, free the memory the list uses. */
243 hook_remove(ioncore_post_layout_setup_hook
, check_and_create
);
245 FOR_ALL_SCREENS(scr
){
246 FOR_ALL_MANAGED_BY_MPLEX((WMPlex
*)scr
, reg
, tmp
){
247 if(is_scratchpad(reg
))
251 create(&scr
->mplex
, MPLEX_ATTACH_HIDDEN
);
258 if(!mod_sp_register_exports())
261 extl_read_config("cfg_sp", NULL
, FALSE
);
263 if(ioncore_g
.opmode
==IONCORE_OPMODE_INIT
){
264 hook_add(ioncore_post_layout_setup_hook
, check_and_create
);