2022-08-31 12:20:58 +00:00
-- This file is part of Reno desktop.
--
-- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
--
-- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>.
2023-07-03 16:53:52 +00:00
-- XFCE style autostart system with a system to automatically kill children just to fuck over Steam. (now with SMЯT targeting software package!)
2022-07-23 19:10:02 +00:00
local awful = require ( " awful " )
local gears = require ( " gears " )
local gfs = gears.filesystem
local menu_utils = require ( " menubar.utils " )
2023-07-03 16:53:52 +00:00
local hide_ids = { }
local related_ids = { }
local settings = config.autostart
local stop_checking = false
-- I know this is linux specific, blame Steam for creating a triple-forking launcher with no startup id.
-- I love the fact that valve is supportive of linux and thinks it's the future of gaming and all that
-- but you could've just done the due diligence and, yk, maybe research how things work with XDG?
-- P.S. if you know how to make this function work in similar vein on BSD, feel free to contribute
local function is_child_of ( pid , related )
related = related or pid
local ppidfile = io.open ( " /proc/ " .. tostring ( pid ) .. " /status " , " rb " )
if not ppidfile then return false end
local ppid = ppidfile : read ( " *a " ) : match ( " PPid:%s*(%d+) " )
ppidfile : close ( )
if ( not ppid ) or ( ppid == " 1 " ) then return false end
if hide_ids [ tonumber ( ppid ) ] then
related_ids [ related ] = tonumber ( ppid )
return true
else
return is_child_of ( ppid , related )
end
end
-- Play whack-a-mole with the clients that match ids to hide
-- NO MORE MR NICE GUY, until the user EXPLICITLY activates the client,
-- it's being hidden.
local callback = function ( c )
if not settings.minimize_enable then return end
if stop_checking then return end
gears.timer . delayed_call ( function ( )
local kill_later = false
if c.pid and hide_ids [ c.pid ] then
kill_later = true
end
if c.startup_id and hide_ids [ c.startup_id ] then
kill_later = true
end
if c.pid and is_child_of ( c.pid ) then
kill_later = true
end
if kill_later then
c.minimized = true
end
end )
end
client.connect_signal ( " focus " , callback )
client.connect_signal ( " manage " , callback )
-- if the client has been mouse pressed we no longer hide it or any of its siblings - user needs the client to be active.
client.connect_signal ( " request::activate " , function ( c , reason )
if ( reason ~= " mouse_click " ) and ( reason ~= " tasklist " ) then
return
end
if c.pid then
hide_ids [ c.pid ] = nil
if related_ids [ c.pid ] then
hide_ids [ related_ids [ c.pid ] ] = nil
end
end
if c.startup_id then
hide_ids [ c.startup_id ] = nil
end
end )
-- this ain't happy hour - stop hitting everything in sight.
gears.timer {
timeout = settings.minimize_timeout or 30 ,
autostart = true ,
single_shot = true ,
callback = function ( )
stop_checking = true
hide_ids = { }
end
}
2023-05-20 16:17:35 +00:00
local stdir = os.getenv ( " XDG_RUNTIME_DIR " ) .. " /.awesome_startup/ "
2022-07-23 19:10:02 +00:00
gfs.make_directories ( stdir )
awful.spawn . with_line_callback ( " find " .. gfs.get_xdg_config_home ( ) .. " autostart/ -name *.desktop " , {
stdout = function ( line )
local data = menu_utils.parse_desktop_file ( line )
if ( data.RunHook == " 0 " ) or ( data.RunHook == nil ) then
if not gfs.file_readable ( stdir .. line : match ( " [^/]*$ " ) ) then
2023-07-03 16:53:52 +00:00
local npid , nsnid = awful.spawn ( data.Exec : gsub ( " %%%w " , " " ) )
io.open ( stdir .. line : match ( " [^/]*$ " ) , " w " ) : write ( npid ) : close ( )
if data.Hidden then
if npid then
hide_ids [ npid ] = true
end
if nsnid then
hide_ids [ nsnid ] = true
end
end
2022-07-23 19:10:02 +00:00
end
end
end
} )