3 -- Last Changed: 2005-11-09
5 -- cfg_dock2.lua (pinko version)
7 -- An improved dock module configuration.
8 -- Remove the "2" and save to ~/.ion3, replacing any current
9 -- cfg_dock.lua. The script couldn't be put in a separate file
10 -- because it affects how the dock is created.
14 -- * key bindings for all functions that were in the button3 menu.
15 -- * switch between floating and embedded mode.
16 -- (Doing this restarts ion, so don't use with config files open.)
17 -- * button3 menu includes missing positions and ajusts to dock mode.
18 -- * flip or transpose the dock.
19 -- * bindings to move a floating dock by keyboard.
20 -- * mouse drag on border moves floating dock.
21 -- * move the dock anywhere, not just the sides and corners.
22 -- * attach current window to dock.
23 -- * support multiple docks if there are multiple screens.
25 -- Screenshot: http://silenceisdefeat.org/~chv/pics/screenshots/2docks.png
28 -- Mod1+K D E toggle between floating and embedded modes
30 -- Mod1+K D T transpose
31 -- Mod1+K D R "resize mode" (it will move but not resize)
32 -- Mod1+K D A attach clientwin to dock
36 -- |7 8 9| Mod1+K D (number) to move a floating dock.
37 -- | | Same for embedded dock, limited to 1,3,7,9.
45 -- changed name from "dock" to "dockN", N being a screen id.
46 -- flipped numbered bindings upside down to match keypad.
47 -- multiple screen support
48 -- arbitrary x,y position survives ion restart.
51 -- List IDs of all screens on which a dock should be created:
52 -- i.e., {0,1}, {0,2,4}
53 local use_these_screens
={0}
55 docktable
=ioncore
.read_savefile("dock_settings")
57 if docktable
==nil then
61 function get_dock(scr
)
62 for i
in pairs(scr
:llist(2)) do
63 if obj_is(scr
:llist(2)[i
],"WDock") then
64 return scr
:llist(2)[i
]
67 for i
in pairs(ioncore
.region_list("WDock")) do
68 if scr
==ioncore
.region_list("WDock")[i
]:screen_of() then
69 return ioncore
.region_list("WDock")[i
]
74 function reset_dockgeom(scr
)
75 ioncore
.defer(function()
76 get_dock(scr
):rqgeom({x
=docktable
[scr
:id()].x
, y
=docktable
[scr
:id()].y
})
80 for i
in pairs(use_these_screens
) do
81 scr
=use_these_screens
[1]
85 if docktable
[scr
]==nil then
91 floating_hidden
=false,
96 -- Create a dock based on a saved settings file.
97 curdock
=mod_dock
.create
{
98 -- Dock mode: embedded|floating
99 mode
=docktable
[scr
].mode
,
100 -- The screen to create the dock on
102 -- Corner or side of the screen to place the dock on.
103 -- For embedded dock the valid values are: tl|tr|bl|br
104 -- For floating dock the following are also valid: tc|bc|ml|mc|mr
105 pos
=docktable
[scr
].pos
,
106 -- Growth direction: left|right|up|down
107 grow
=docktable
[scr
].grow
,
108 -- Whether new dockapps should be added automatically to this dock
110 -- Show floating dock initially?
111 floating_hidden
=docktable
[scr
].floating_hidden
,
116 reset_dockgeom(ioncore
.find_screen_id(scr
))
118 ioncore
.write_savefile("dock_settings", docktable
)
120 defbindings("WScreen", {
122 bdoc("Toggle floating dock."),
123 kpress(MOD1
.."D", "mod_dock.set_floating_shown_on(_, 'toggle')"),
126 defbindings("WMPlex", {
129 kpress("A", "get_dock(_:screen_of()):attach(_sub)", "_sub:WClientWin"),
134 defbindings("WScreen", {
137 kpress("KP_7", "get_dock(_):set{pos='tl'}"),
138 kpress("KP_8", "get_dock(_):set{pos='tc'}"),
139 kpress("KP_9", "get_dock(_):set{pos='tr'}"),
140 kpress("KP_4", "get_dock(_):set{pos='ml'}"),
141 kpress("KP_5", "get_dock(_):set{pos='mc'}"),
142 kpress("KP_6", "get_dock(_):set{pos='mr'}"),
143 kpress("KP_1", "get_dock(_):set{pos='bl'}"),
144 kpress("KP_2", "get_dock(_):set{pos='bc'}"),
145 kpress("KP_3", "get_dock(_):set{pos='br'}"),
146 kpress("7", "get_dock(_):set{pos='tl'}"),
147 kpress("8", "get_dock(_):set{pos='tc'}"),
148 kpress("9", "get_dock(_):set{pos='tr'}"),
149 kpress("4", "get_dock(_):set{pos='ml'}"),
150 kpress("5", "get_dock(_):set{pos='mc'}"),
151 kpress("6", "get_dock(_):set{pos='mr'}"),
152 kpress("1", "get_dock(_):set{pos='bl'}"),
153 kpress("2", "get_dock(_):set{pos='bc'}"),
154 kpress("3", "get_dock(_):set{pos='br'}"),
156 kpress("R", "get_dock(_):begin_kbresize()"),
157 kpress("F", "flip_dock_direction(get_dock(_))"),
158 kpress("T", "cycle_dock_direction(get_dock(_))"),
160 kpress("E", "swap_dockmodes(_)"),
162 kpress("G", "reset_dockgeom(_:screen_of())"),
168 -- Dock settings menu. For this to work, mod_menu must have been loaded
171 function dock_settings_menu(dock
)
172 if docktable
[dock
:screen_of():id()].mode
=="floating" then
174 menuentry("Hide dock", "mod_dock.set_floating_shown_on("..
175 "_:screen_of(), 'toggle')"),
176 menuentry("Pos-TL", "_:set{pos='tl'}"),
177 menuentry("Pos-TC", "_:set{pos='tc'}"),
178 menuentry("Pos-TR", "_:set{pos='tr'}"),
179 menuentry("Pos-ML", "_:set{pos='ml'}"),
180 menuentry("Pos-MC", "_:set{pos='mc'}"),
181 menuentry("Pos-MR", "_:set{pos='mr'}"),
182 menuentry("Pos-BL", "_:set{pos='bl'}"),
183 menuentry("Pos-BC", "_:set{pos='bc'}"),
184 menuentry("Pos-BR", "_:set{pos='br'}"),
186 menuentry("Grow-L", "_:set{grow='left'}"),
187 menuentry("Grow-R", "_:set{grow='right'}"),
188 menuentry("Grow-U", "_:set{grow='up'}"),
189 menuentry("Grow-D", "_:set{grow='down'}"),
190 menuentry("Embed dock", "swap_dockmodes(_:screen_of())"),
194 menuentry("Pos-TL", "_:set{pos='tl'}"),
195 menuentry("Pos-TR", "_:set{pos='tr'}"),
196 menuentry("Pos-BL", "_:set{pos='bl'}"),
197 menuentry("Pos-BR", "_:set{pos='br'}"),
199 menuentry("Grow-L", "_:set{grow='left'}"),
200 menuentry("Grow-R", "_:set{grow='right'}"),
201 menuentry("Grow-U", "_:set{grow='up'}"),
202 menuentry("Grow-D", "_:set{grow='down'}"),
203 menuentry("Float dock", "swap_dockmodes(_:screen_of())"),
207 defbindings("WDock", {
208 mpress("Button3", "mod_menu.pmenu(_, _sub, dock_settings_menu(_))"),
213 -- To use any of the dock's mouse bindings,
214 -- you'll have to find a bit of dead space for clicking in.
215 -- Near the border should always work.
216 -- (This is even necessary for Mod..Button bindings.)
217 defbindings("WDock", {
218 mpress("Button2", "cycle_dock_direction(_)"),
219 mclick("Button1", "flip_dock_direction(_)"),
221 -- You can actually drag a floating dock anywhere.
222 -- Position will be lost when ion restarts.
223 mdrag("Button1", "_:p_move()"),
224 mdrag(MOD1
.."Button1", "_:p_move()"),
227 function flip_dock_direction(dock
)
229 local dockgrow
= dock
:get().grow
230 if dockgrow
=="left" then
231 dock
:set
{grow
='right'}
232 elseif dockgrow
=="right" then
233 dock
:set
{grow
='left'}
234 elseif dockgrow
=="up" then
235 dock
:set
{grow
='down'}
236 elseif dockgrow
=="down" then
239 reset_dockgeom(dock
:screen_of())
242 function cycle_dock_direction(dock
)
244 local dockget
= dock
:get()
245 local dockgeom
= dock
:geom()
246 local screengeom
= dock
:screen_of():geom()
248 if dockget
.grow
=="left" then
250 if dockgeom
.w
+ dockgeom
.y
> screengeom
.h
then
251 dock
:rqgeom({x
=dockgeom
.x
, y
=screengeom
.h
- dockgeom
.w
})
253 reset_dockgeom(dock
:screen_of())
255 elseif dockget
.grow
=="right" then
256 dock
:set
{grow
='down'}
257 if dockgeom
.w
+ dockgeom
.y
> screengeom
.h
then
258 dock
:rqgeom({x
=dockgeom
.x
, y
=screengeom
.h
- dockgeom
.w
})
260 reset_dockgeom(dock
:screen_of())
262 elseif dockget
.grow
=="up" then
263 dock
:set
{grow
='right'}
264 if dockgeom
.x
+ dockgeom
.h
> screengeom
.w
then
265 dock
:rqgeom({x
=screengeom
.w
- dockgeom
.h
, y
=dockgeom
.y
})
267 reset_dockgeom(dock
:screen_of())
269 elseif dockget
.grow
=="down" then
270 dock
:set
{grow
='left'}
271 if dockgeom
.x
+ dockgeom
.h
> screengeom
.w
then
272 dock
:rqgeom({x
=screengeom
.w
- dockgeom
.h
, y
=dockgeom
.y
})
274 reset_dockgeom(dock
:screen_of())
279 function save_dock_settings()
280 local dockget
, dockgeom
282 for i
in pairs(ioncore
.region_list('WDock')) do
283 dock
=ioncore
.region_list('WDock')[i
]
285 dockgeom
= dock
:geom()
286 scr
= dock
:screen_of():id()
287 if not docktable
[scr
] then docktable
[scr
]={} end
288 docktable
[scr
].screen
= scr
289 docktable
[scr
].x
= dockgeom
.x
290 docktable
[scr
].y
= dockgeom
.y
291 docktable
[scr
].grow
= dockget
.grow
292 docktable
[scr
].floating_hidden
= dock
:screen_of():l2_is_hidden(dock
)
293 if docktable
[scr
].mode
=="embedded" then
294 docktable
[scr
].pos
=string.gsub(string.gsub(dockget
.pos
, "m", "t"), "c", "l")
296 docktable
[scr
].pos
= dockget
.pos
299 ioncore
.write_savefile("dock_settings", docktable
)
302 function swap_dockmodes(scr
)
303 if docktable
[scr
:id()].mode
=="embedded" then
304 docktable
[scr
:id()].mode
="floating"
306 docktable
[scr
:id()].mode
="embedded"
314 -- This makes sure dock settings are saved any time ion restarts.
316 ioncore
.get_hook("ioncore_deinit_hook"):add(
317 function() save_dock_settings() end