Add awesome extras
This commit is contained in:
88
.config/awesome/extras/bling/module/window_swallowing.lua
Executable file
88
.config/awesome/extras/bling/module/window_swallowing.lua
Executable file
@@ -0,0 +1,88 @@
|
||||
local awful = require("awful")
|
||||
local gears = require("gears")
|
||||
local beautiful = require("beautiful")
|
||||
|
||||
local helpers = require(tostring(...):match(".*bling") .. ".helpers")
|
||||
|
||||
-- It might actually swallow too much, that's why there is a filter option by classname
|
||||
-- without the don't-swallow-list it would also swallow for example
|
||||
-- file pickers or new firefox windows spawned by an already existing one
|
||||
|
||||
local window_swallowing_activated = false
|
||||
|
||||
-- you might want to add or remove applications here
|
||||
local dont_swallow_classname_list = beautiful.dont_swallow_classname_list
|
||||
or { "firefox", "Gimp", "Google-chrome" }
|
||||
local activate_dont_swallow_filter = beautiful.dont_swallow_filter_activated
|
||||
or true
|
||||
|
||||
-- checks if client classname matches with any entry of the dont-swallow-list
|
||||
local function check_if_swallow(c)
|
||||
if not activate_dont_swallow_filter then
|
||||
return true
|
||||
end
|
||||
for _, classname in ipairs(dont_swallow_classname_list) do
|
||||
if classname == c.class then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- the function that will be connected to / disconnected from the spawn client signal
|
||||
local function manage_clientspawn(c)
|
||||
-- get the last focused window to check if it is a parent window
|
||||
local parent_client = awful.client.focus.history.get(c.screen, 1)
|
||||
if not parent_client then
|
||||
return
|
||||
end
|
||||
|
||||
-- io.popen is normally discouraged. Should probably be changed
|
||||
local handle = io.popen(
|
||||
[[pstree -T -p -a -s ]]
|
||||
.. tostring(c.pid)
|
||||
.. [[ | sed '2q;d' | grep -o '[0-9]*$' | tr -d '\n']]
|
||||
)
|
||||
local parent_pid = handle:read("*a")
|
||||
handle:close()
|
||||
|
||||
if
|
||||
(tostring(parent_pid) == tostring(parent_client.pid))
|
||||
and check_if_swallow(c)
|
||||
then
|
||||
c:connect_signal("unmanage", function()
|
||||
helpers.client.turn_on(parent_client)
|
||||
helpers.client.sync(parent_client, c)
|
||||
end)
|
||||
|
||||
helpers.client.sync(c, parent_client)
|
||||
helpers.client.turn_off(parent_client)
|
||||
end
|
||||
end
|
||||
|
||||
-- without the following functions that module would be autoloaded by require("bling")
|
||||
-- a toggle window swallowing hotkey is also possible that way
|
||||
|
||||
local function start()
|
||||
client.connect_signal("manage", manage_clientspawn)
|
||||
window_swallowing_activated = true
|
||||
end
|
||||
|
||||
local function stop()
|
||||
client.disconnect_signal("manage", manage_clientspawn)
|
||||
window_swallowing_activated = false
|
||||
end
|
||||
|
||||
local function toggle()
|
||||
if window_swallowing_activated then
|
||||
stop()
|
||||
else
|
||||
start()
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
start = start,
|
||||
stop = stop,
|
||||
toggle = toggle,
|
||||
}
|
Reference in New Issue
Block a user