[UP] use ion3-plus haha.
[arrow.git] / archlinux_conf / etc / ion3 / old / cfg_dock2.lua
blob2deb979b546813272d303e44ef678ef37ea79f5c
1 --
2 -- cfg_dock2.lua (pinko version)
3 --
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.
8 --
9 -- Features:
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
26 -- Mod1+K D F flip
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
30 -- Button1 flip
31 -- Button2 transpose
32 -- ___________
33 -- |7 8 9| Mod1+K D (number) to move a floating dock.
34 -- | | Same for embedded dock, limited to 1,3,7,9.
35 -- |4 5 6|
36 -- | |
37 -- |1 2 3|
38 -- -----------
40 -- 2005-11-09:
41 -- added this header.
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
55 docktable={}
56 end
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]
62 end
63 end
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]
67 end
68 end
69 end
71 function reset_dockgeom(scr)
72 ioncore.defer(function()
73 get_dock(scr):rqgeom({x=docktable[scr:id()].x, y=docktable[scr:id()].y})
74 end)
75 end
77 for i in pairs(use_these_screens) do
78 scr=use_these_screens[1]
80 io.stdout:write(i)
81 io.stdout:write(scr)
82 if docktable[scr]==nil then
83 docktable[scr] = {
84 screen=0,
85 mode="floating",
86 pos="tl",
87 grow="down",
88 floating_hidden=false,
89 x=0, y=0
91 end
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
98 screen=scr,
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
106 is_auto=true,
107 -- Show floating dock initially?
108 floating_hidden=docktable[scr].floating_hidden,
109 -- Name of the dock
110 name="dock"..scr,
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", {
124 submap(MOD1.."K", {
125 submap("D", {
126 kpress("A", "get_dock(_:screen_of()):attach(_sub)", "_sub:WClientWin"),
131 defbindings("WScreen", {
132 submap(MOD1.."K", {
133 submap("D", {
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
166 -- previously.
167 if mod_menu then
168 function dock_settings_menu(dock)
169 if docktable[dock:screen_of():id()].mode=="floating" then
170 return {
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())"),
189 else
190 return {
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)
225 save_dock_settings()
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
234 dock:set{grow='up'}
236 reset_dockgeom(dock:screen_of())
239 function cycle_dock_direction(dock)
240 save_dock_settings()
241 local dockget = dock:get()
242 local dockgeom = dock:geom()
243 local screengeom = dock:screen_of():geom()
245 if dockget.grow=="left" then
246 dock:set{grow='up'}
247 if dockgeom.w + dockgeom.y > screengeom.h then
248 dock:rqgeom({x=dockgeom.x, y=screengeom.h - dockgeom.w})
249 else
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})
256 else
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})
263 else
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})
270 else
271 reset_dockgeom(dock:screen_of())
276 function save_dock_settings()
277 local dockget, dockgeom
278 --docktable={}
279 for i in pairs(ioncore.region_list('WDock')) do
280 dock=ioncore.region_list('WDock')[i]
281 dockget = dock:get()
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")
292 else
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"
302 else
303 docktable[scr:id()].mode="embedded"
305 save_dock_settings()
306 ioncore.restart()
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