2023-08-01 18:06:35 +02:00
-- SPDX-License-Identifier: GPL-3.0-or-later
2023-06-26 00:18:50 +02:00
2023-06-28 23:42:07 +02:00
---@diagnostic disable: redefined-local
2023-09-10 03:52:52 +02:00
---Process management.
---
---This module provides utilities to spawn processes and capture their output.
2023-07-22 04:02:02 +02:00
---@class ProcessModule
local process_module = { }
2023-06-21 21:48:38 +02:00
2023-06-30 00:40:35 +02:00
---Spawn a process with an optional callback for its stdout, stderr, and exit information.
2023-06-28 23:42:07 +02:00
---
---`callback` has the following parameters:
2023-09-08 03:48:41 +02:00
---
2023-07-23 00:43:36 +02:00
--- - `stdout` - The process's stdout printed this line.
--- - `stderr` - The process's stderr printed this line.
--- - `exit_code` - The process exited with this code.
--- - `exit_msg` - The process exited with this message.
2023-06-21 21:48:38 +02:00
---@param command string|string[] The command as one whole string or a table of each of its arguments
2023-06-29 18:59:17 +02:00
---@param callback fun(stdout: string|nil, stderr: string|nil, exit_code: integer|nil, exit_msg: string|nil)? A callback to do something whenever the process's stdout or stderr print a line, or when the process exits.
2023-07-22 04:02:02 +02:00
function process_module . spawn ( command , callback )
2023-06-21 21:48:38 +02:00
---@type integer|nil
local callback_id = nil
if callback ~= nil then
2023-06-27 04:19:02 +02:00
---@param args Args
2023-06-21 21:48:38 +02:00
table.insert ( CallbackTable , function ( args )
2023-06-27 04:19:02 +02:00
local args = args.Spawn or { } -- don't know if the `or {}` is necessary
2023-06-21 21:48:38 +02:00
callback ( args.stdout , args.stderr , args.exit_code , args.exit_msg )
end )
callback_id = # CallbackTable
end
2023-06-27 04:19:02 +02:00
local command_arr = { }
if type ( command ) == " string " then
for i in string.gmatch ( command , " %S+ " ) do
table.insert ( command_arr , i )
2023-06-21 21:48:38 +02:00
end
2023-06-27 04:19:02 +02:00
else
command_arr = command
2023-06-21 21:48:38 +02:00
end
SendMsg ( {
Spawn = {
2023-06-27 04:19:02 +02:00
command = command_arr ,
2023-06-21 21:48:38 +02:00
callback_id = callback_id ,
} ,
} )
end
2023-06-30 00:40:35 +02:00
---Spawn a process only if it isn't already running, with an optional callback for its stdout, stderr, and exit information.
---
---`callback` has the following parameters:
2023-09-08 03:48:41 +02:00
---
2023-06-30 00:40:35 +02:00
--- - `stdout`: The process's stdout printed this line.
--- - `stderr`: The process's stderr printed this line.
--- - `exit_code`: The process exited with this code.
--- - `exit_msg`: The process exited with this message.
---
---`spawn_once` checks for the process using `pgrep`. If your system doesn't have `pgrep`, this won't work properly.
---@param command string|string[] The command as one whole string or a table of each of its arguments
---@param callback fun(stdout: string|nil, stderr: string|nil, exit_code: integer|nil, exit_msg: string|nil)? A callback to do something whenever the process's stdout or stderr print a line, or when the process exits.
2023-07-22 04:02:02 +02:00
function process_module . spawn_once ( command , callback )
2023-06-30 00:40:35 +02:00
local proc = " "
if type ( command ) == " string " then
proc = command : match ( " %S+ " )
else
proc = command [ 1 ]
end
---@type string
local procs = io.popen ( " pgrep -f " .. proc ) : read ( " *a " )
if procs : len ( ) ~= 0 then -- if process exists, return
return
end
2023-07-22 04:02:02 +02:00
process_module.spawn ( command , callback )
2023-06-30 00:40:35 +02:00
end
2023-09-10 11:49:31 +02:00
---Set an environment variable for Pinnacle. All future processes spawned will have this env set.
---
---Note that this will only set the variable for Pinnacle the compositor, not the running Lua config process.
---If you need to set an environment variable for this config, place them in the `metaconfig.toml` file instead.
---
---### Example
---```lua
---process.set_env("MOZ_ENABLE_WAYLAND", "1")
---```
---@param key string
---@param value string
function process_module . set_env ( key , value )
SendMsg ( {
SetEnv = {
key = key ,
value = value ,
} ,
} )
end
2023-07-22 04:02:02 +02:00
return process_module