Expose XWarpPointer to lua as rootwin:warp_pointer, for region_do_warp_alt
[notion.git] / contrib / scripts / cfg_dock2.lua
blobfe0d24bd052b91a4c6718bea13756a9325598e8c
1 -- Authors: pinko
2 -- License: Unknown
3 -- Last Changed: 2005-11-09
4 --
5 -- cfg_dock2.lua (pinko version)
6 --
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.
12 -- Features:
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
29 -- Mod1+K D F flip
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
33 -- Button1 flip
34 -- Button2 transpose
35 -- ___________
36 -- |7 8 9| Mod1+K D (number) to move a floating dock.
37 -- | | Same for embedded dock, limited to 1,3,7,9.
38 -- |4 5 6|
39 -- | |
40 -- |1 2 3|
41 -- -----------
43 -- 2005-11-09:
44 -- added this header.
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
58 docktable={}
59 end
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]
65 end
66 end
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]
70 end
71 end
72 end
74 function reset_dockgeom(scr)
75 ioncore.defer(function()
76 get_dock(scr):rqgeom({x=docktable[scr:id()].x, y=docktable[scr:id()].y})
77 end)
78 end
80 for i in pairs(use_these_screens) do
81 scr=use_these_screens[1]
83 io.stdout:write(i)
84 io.stdout:write(scr)
85 if docktable[scr]==nil then
86 docktable[scr] = {
87 screen=0,
88 mode="floating",
89 pos="tl",
90 grow="down",
91 floating_hidden=false,
92 x=0, y=0
94 end
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
101 screen=scr,
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
109 is_auto=true,
110 -- Show floating dock initially?
111 floating_hidden=docktable[scr].floating_hidden,
112 -- Name of the dock
113 name="dock"..scr,
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", {
127 submap(MOD1.."K", {
128 submap("D", {
129 kpress("A", "get_dock(_:screen_of()):attach(_sub)", "_sub:WClientWin"),
134 defbindings("WScreen", {
135 submap(MOD1.."K", {
136 submap("D", {
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
169 -- previously.
170 if mod_menu then
171 function dock_settings_menu(dock)
172 if docktable[dock:screen_of():id()].mode=="floating" then
173 return {
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())"),
192 else
193 return {
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)
228 save_dock_settings()
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
237 dock:set{grow='up'}
239 reset_dockgeom(dock:screen_of())
242 function cycle_dock_direction(dock)
243 save_dock_settings()
244 local dockget = dock:get()
245 local dockgeom = dock:geom()
246 local screengeom = dock:screen_of():geom()
248 if dockget.grow=="left" then
249 dock:set{grow='up'}
250 if dockgeom.w + dockgeom.y > screengeom.h then
251 dock:rqgeom({x=dockgeom.x, y=screengeom.h - dockgeom.w})
252 else
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})
259 else
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})
266 else
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})
273 else
274 reset_dockgeom(dock:screen_of())
279 function save_dock_settings()
280 local dockget, dockgeom
281 --docktable={}
282 for i in pairs(ioncore.region_list('WDock')) do
283 dock=ioncore.region_list('WDock')[i]
284 dockget = dock:get()
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")
295 else
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"
305 else
306 docktable[scr:id()].mode="embedded"
308 save_dock_settings()
309 ioncore.restart()
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