-
Notifications
You must be signed in to change notification settings - Fork 0
/
init.lua
164 lines (141 loc) · 5.66 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
-------------------------------------------------------------------
-- Drop-down applications manager for the awesome window manager
-------------------------------------------------------------------
-- Coded by: * Lucas de Vries <[email protected]>
-- Hacked by: * Adrian C. (anrxc) <[email protected]>
-- Licensed under the WTFPL version 2
-- * http://sam.zoy.org/wtfpl/COPYING
-------------------------------------------------------------------
-- To use this module add:
-- local scratchdrop = require("scratchdrop")
-- to the top of your rc.lua, and call it from a keybinding:
-- scratchdrop(prog, vert, horiz, width, height, sticky, screen)
--
-- Parameters:
-- prog - Program to run; "urxvt", "gmrun", "thunderbird"
-- vert - Vertical; "bottom", "center" or "top" (default)
-- horiz - Horizontal; "left", "right" or "center" (default)
-- width - Width in absolute pixels, or width percentage
-- when <= 1 (1 (100% of the screen) by default)
-- height - Height in absolute pixels, or height percentage
-- when <= 1 (0.25 (25% of the screen) by default)
-- sticky - Visible on all tags, false by default
-- screen - Screen (optional), mouse.screen by default
-------------------------------------------------------------------
-- Grab environment
local pairs = pairs
local awful = require("awful")
local setmetatable = setmetatable
local capi = {
mouse = mouse,
client = client,
screen = screen
}
-- Scratchdrop: drop-down applications manager for the awesome window manager
local attachdrop = {} -- module scratch.drop
local dropdown = {}
-- Use Meta + X to run
-- require('attachdrop').showall()
-- if some of your windows lost in hidden space
function attachdrop.showall()
for prog,scrs in pairs(dropdown) do
for src,c in pairs(scrs) do
awful.client.movetotag(awful.tag.selected(capi.mouse.screen), c)
c.hidden = false
c:raise()
capi.client.focus = c
end
end
end
-- Attach window under cursor to prog
function attachdrop.attach(prog)
if not dropdown[prog] then
dropdown[prog] = {}
end
screen = capi.mouse.screen
c = awful.mouse.client_under_pointer()
dropdown[prog][screen] = c
end
-- Create a new window for the drop-down application when it doesn't
-- exist, or toggle between hidden and visible states when it does
function attachdrop.toggle(prog, vert, horiz, width, height, sticky, screen)
vert = vert or "top"
horiz = horiz or "center"
width = width or 1
height = height or 0.25
sticky = sticky or false
screen = screen or capi.mouse.screen
-- Determine signal usage in this version of awesome
local attach_signal = capi.client.connect_signal or capi.client.add_signal
local detach_signal = capi.client.disconnect_signal or capi.client.remove_signal
if not dropdown[prog] then
dropdown[prog] = {}
-- Add unmanage signal for scratchdrop programs
attach_signal("unmanage", function (c)
for scr, cl in pairs(dropdown[prog]) do
if cl == c then
dropdown[prog][scr] = nil
end
end
end)
end
if not dropdown[prog][screen] then
spawnw = function (c)
dropdown[prog][screen] = c
-- Scratchdrop clients are floaters
awful.client.floating.set(c, true)
-- Client geometry and placement
local screengeom = capi.screen[screen].workarea
if width <= 1 then width = math.ceil(screengeom.width * width) - 3 end
if height <= 1 then height = math.ceil(screengeom.height * height) end
if horiz == "left" then x = screengeom.x
elseif horiz == "right" then x = screengeom.width - width
else x = screengeom.x+math.ceil((screengeom.width-width)/2) - 1 end
if vert == "bottom" then y = screengeom.height + screengeom.y - height
elseif vert == "center" then y = screengeom.y+math.ceil((screengeom.height-height)/2)
else y = screengeom.y end
-- Client properties
c:geometry({ x = x, y = y, width = width, height = height })
c.ontop = true
c.above = true
c.skip_taskbar = true
if sticky then c.sticky = true end
if c.titlebar then awful.titlebar.remove(c) end
c:raise()
capi.client.focus = c
detach_signal("manage", spawnw)
end
-- Add manage signal and spawn the program
attach_signal("manage", spawnw)
awful.util.spawn_with_shell(prog, false) -- original without '_with_shell'
else
-- Get a running client
c = dropdown[prog][screen]
status, err = pcall(awful.client.movetotag, awful.tag.selected(screen), c)
if err then
dropdown[prog][screen] = false
return
end
-- Switch the client to the current workspace
if c:isvisible() == false then c.hidden = true
awful.client.movetotag(awful.tag.selected(screen), c)
end
-- Focus and raise if hidden
if c.hidden then
-- Make sure it is centered
if vert == "center" then awful.placement.center_vertical(c) end
if horiz == "center" then awful.placement.center_horizontal(c) end
c.hidden = false
c:raise()
capi.client.focus = c
else -- Hide and detach tags if not
c.hidden = true
local ctags = c:tags()
for i, t in pairs(ctags) do
ctags[i] = nil
end
c:tags(ctags)
end
end
end
return attachdrop