2 -- cfg_dock2.lua (pinko version)
4 -- An improved dock module configuration.
5 -- Remove the "2" and save to ~/.ion3, replacing any current
6 -- cfg_dock.lua. The script couldn't be put in a separate file
7 -- because it affects how the dock is created.
11 -- * key bindings for all functions that were in the button3 menu.
12 -- * switch between floating and embedded mode.
13 -- (Doing this restarts ion, so don't use with config files open.)
14 -- * button3 menu includes missing positions and ajusts to dock mode.
15 -- * flip or transpose the dock.
16 -- * bindings to move a floating dock by keyboard.
17 -- * mouse drag on border moves floating dock.
18 -- * move the dock anywhere, not just the sides and corners.
19 -- * attach current window to dock.
20 -- * support multiple docks if there are multiple screens.
22 -- Screenshot: http://silenceisdefeat.org/~chv/pics/screenshots/2docks.png
25 -- Mod1+K D E toggle between floating and embedded modes
27 -- Mod1+K D T transpose
28 -- Mod1+K D R "resize mode" (it will move but not resize)
29 -- Mod1+K D A attach clientwin to dock
33 -- |7 8 9| Mod1+K D (number) to move a floating dock.
34 -- | | Same for embedded dock, limited to 1,3,7,9.
42 -- changed name from "dock" to "dockN", N being a screen id.
43 -- flipped numbered bindings upside down to match keypad.
44 -- multiple screen support
45 -- arbitrary x,y position survives ion restart.
48 -- List IDs of all screens on which a dock should be created:
49 -- i.e., {0,1}, {0,2,4}
50 local use_these_screens
={0}
52 docktable
=ioncore
.read_savefile("dock_settings")
54 if docktable
==nil then
58 function get_dock(scr
)
59 for i
in pairs(scr
:llist(2)) do
60 if obj_is(scr
:llist(2)[i
],"WDock") then
61 return scr
:llist(2)[i
]
64 for i
in pairs(ioncore
.region_list("WDock")) do
65 if scr
==ioncore
.region_list("WDock")[i
]:screen_of() then
66 return ioncore
.region_list("WDock")[i
]
71 function reset_dockgeom(scr
)
72 ioncore
.defer(function()
73 get_dock(scr
):rqgeom({x
=docktable
[scr
:id()].x
, y
=docktable
[scr
:id()].y
})
77 for i
in pairs(use_these_screens
) do
78 scr
=use_these_screens
[1]
82 if docktable
[scr
]==nil then
88 floating_hidden
=false,
93 -- Create a dock based on a saved settings file.
94 curdock
=mod_dock
.create
{
95 -- Dock mode: embedded|floating
96 mode
=docktable
[scr
].mode
,
97 -- The screen to create the dock on
99 -- Corner or side of the screen to place the dock on.
100 -- For embedded dock the valid values are: tl|tr|bl|br
101 -- For floating dock the following are also valid: tc|bc|ml|mc|mr
102 pos
=docktable
[scr
].pos
,
103 -- Growth direction: left|right|up|down
104 grow
=docktable
[scr
].grow
,
105 -- Whether new dockapps should be added automatically to this dock
107 -- Show floating dock initially?
108 floating_hidden
=docktable
[scr
].floating_hidden
,
113 reset_dockgeom(ioncore
.find_screen_id(scr
))
115 ioncore
.write_savefile("dock_settings", docktable
)
117 defbindings("WScreen", {
119 bdoc("Toggle floating dock."),
120 kpress(MOD1
.."D", "mod_dock.set_floating_shown_on(_, 'toggle')"),
123 defbindings("WMPlex", {
126 kpress("A", "get_dock(_:screen_of()):attach(_sub)", "_sub:WClientWin"),
131 defbindings("WScreen", {
134 kpress("KP_7", "get_dock(_):set{pos='tl'}"),
135 kpress("KP_8", "get_dock(_):set{pos='tc'}"),
136 kpress("KP_9", "get_dock(_):set{pos='tr'}"),
137 kpress("KP_4", "get_dock(_):set{pos='ml'}"),
138 kpress("KP_5", "get_dock(_):set{pos='mc'}"),
139 kpress("KP_6", "get_dock(_):set{pos='mr'}"),
140 kpress("KP_1", "get_dock(_):set{pos='bl'}"),
141 kpress("KP_2", "get_dock(_):set{pos='bc'}"),
142 kpress("KP_3", "get_dock(_):set{pos='br'}"),
143 kpress("7", "get_dock(_):set{pos='tl'}"),
144 kpress("8", "get_dock(_):set{pos='tc'}"),
145 kpress("9", "get_dock(_):set{pos='tr'}"),
146 kpress("4", "get_dock(_):set{pos='ml'}"),
147 kpress("5", "get_dock(_):set{pos='mc'}"),
148 kpress("6", "get_dock(_):set{pos='mr'}"),
149 kpress("1", "get_dock(_):set{pos='bl'}"),
150 kpress("2", "get_dock(_):set{pos='bc'}"),
151 kpress("3", "get_dock(_):set{pos='br'}"),
153 kpress("R", "get_dock(_):begin_kbresize()"),
154 kpress("F", "flip_dock_direction(get_dock(_))"),
155 kpress("T", "cycle_dock_direction(get_dock(_))"),
157 kpress("E", "swap_dockmodes(_)"),
159 kpress("G", "reset_dockgeom(_:screen_of())"),
165 -- Dock settings menu. For this to work, mod_menu must have been loaded
168 function dock_settings_menu(dock
)
169 if docktable
[dock
:screen_of():id()].mode
=="floating" then
171 menuentry("Hide dock", "mod_dock.set_floating_shown_on("..
172 "_:screen_of(), 'toggle')"),
173 menuentry("Pos-TL", "_:set{pos='tl'}"),
174 menuentry("Pos-TC", "_:set{pos='tc'}"),
175 menuentry("Pos-TR", "_:set{pos='tr'}"),
176 menuentry("Pos-ML", "_:set{pos='ml'}"),
177 menuentry("Pos-MC", "_:set{pos='mc'}"),
178 menuentry("Pos-MR", "_:set{pos='mr'}"),
179 menuentry("Pos-BL", "_:set{pos='bl'}"),
180 menuentry("Pos-BC", "_:set{pos='bc'}"),
181 menuentry("Pos-BR", "_:set{pos='br'}"),
183 menuentry("Grow-L", "_:set{grow='left'}"),
184 menuentry("Grow-R", "_:set{grow='right'}"),
185 menuentry("Grow-U", "_:set{grow='up'}"),
186 menuentry("Grow-D", "_:set{grow='down'}"),
187 menuentry("Embed dock", "swap_dockmodes(_:screen_of())"),
191 menuentry("Pos-TL", "_:set{pos='tl'}"),
192 menuentry("Pos-TR", "_:set{pos='tr'}"),
193 menuentry("Pos-BL", "_:set{pos='bl'}"),
194 menuentry("Pos-BR", "_:set{pos='br'}"),
196 menuentry("Grow-L", "_:set{grow='left'}"),
197 menuentry("Grow-R", "_:set{grow='right'}"),
198 menuentry("Grow-U", "_:set{grow='up'}"),
199 menuentry("Grow-D", "_:set{grow='down'}"),
200 menuentry("Float dock", "swap_dockmodes(_:screen_of())"),
204 defbindings("WDock", {
205 mpress("Button3", "mod_menu.pmenu(_, _sub, dock_settings_menu(_))"),
210 -- To use any of the dock's mouse bindings,
211 -- you'll have to find a bit of dead space for clicking in.
212 -- Near the border should always work.
213 -- (This is even necessary for Mod..Button bindings.)
214 defbindings("WDock", {
215 mpress("Button2", "cycle_dock_direction(_)"),
216 mclick("Button1", "flip_dock_direction(_)"),
218 -- You can actually drag a floating dock anywhere.
219 -- Position will be lost when ion restarts.
220 mdrag("Button1", "_:p_move()"),
221 mdrag(MOD1
.."Button1", "_:p_move()"),
224 function flip_dock_direction(dock
)
226 local dockgrow
= dock
:get().grow
227 if dockgrow
=="left" then
228 dock
:set
{grow
='right'}
229 elseif dockgrow
=="right" then
230 dock
:set
{grow
='left'}
231 elseif dockgrow
=="up" then
232 dock
:set
{grow
='down'}
233 elseif dockgrow
=="down" then
236 reset_dockgeom(dock
:screen_of())
239 function cycle_dock_direction(dock
)
241 local dockget
= dock
:get()
242 local dockgeom
= dock
:geom()
243 local screengeom
= dock
:screen_of():geom()
245 if dockget
.grow
=="left" then
247 if dockgeom
.w
+ dockgeom
.y
> screengeom
.h
then
248 dock
:rqgeom({x
=dockgeom
.x
, y
=screengeom
.h
- dockgeom
.w
})
250 reset_dockgeom(dock
:screen_of())
252 elseif dockget
.grow
=="right" then
253 dock
:set
{grow
='down'}
254 if dockgeom
.w
+ dockgeom
.y
> screengeom
.h
then
255 dock
:rqgeom({x
=dockgeom
.x
, y
=screengeom
.h
- dockgeom
.w
})
257 reset_dockgeom(dock
:screen_of())
259 elseif dockget
.grow
=="up" then
260 dock
:set
{grow
='right'}
261 if dockgeom
.x
+ dockgeom
.h
> screengeom
.w
then
262 dock
:rqgeom({x
=screengeom
.w
- dockgeom
.h
, y
=dockgeom
.y
})
264 reset_dockgeom(dock
:screen_of())
266 elseif dockget
.grow
=="down" then
267 dock
:set
{grow
='left'}
268 if dockgeom
.x
+ dockgeom
.h
> screengeom
.w
then
269 dock
:rqgeom({x
=screengeom
.w
- dockgeom
.h
, y
=dockgeom
.y
})
271 reset_dockgeom(dock
:screen_of())
276 function save_dock_settings()
277 local dockget
, dockgeom
279 for i
in pairs(ioncore
.region_list('WDock')) do
280 dock
=ioncore
.region_list('WDock')[i
]
282 dockgeom
= dock
:geom()
283 scr
= dock
:screen_of():id()
284 if not docktable
[scr
] then docktable
[scr
]={} end
285 docktable
[scr
].screen
= scr
286 docktable
[scr
].x
= dockgeom
.x
287 docktable
[scr
].y
= dockgeom
.y
288 docktable
[scr
].grow
= dockget
.grow
289 docktable
[scr
].floating_hidden
= dock
:screen_of():l2_is_hidden(dock
)
290 if docktable
[scr
].mode
=="embedded" then
291 docktable
[scr
].pos
=string.gsub(string.gsub(dockget
.pos
, "m", "t"), "c", "l")
293 docktable
[scr
].pos
= dockget
.pos
296 ioncore
.write_savefile("dock_settings", docktable
)
299 function swap_dockmodes(scr
)
300 if docktable
[scr
:id()].mode
=="embedded" then
301 docktable
[scr
:id()].mode
="floating"
303 docktable
[scr
:id()].mode
="embedded"
311 -- This makes sure dock settings are saved any time ion restarts.
313 ioncore
.get_hook("ioncore_deinit_hook"):add(
314 function() save_dock_settings() end