diff options
-rw-r--r-- | gjs/src/application.ts | 17 | ||||
-rw-r--r-- | lua/astal/application.lua | 23 | ||||
-rw-r--r-- | src/astal.vala | 32 |
3 files changed, 51 insertions, 21 deletions
diff --git a/gjs/src/application.ts b/gjs/src/application.ts index b42492f..1141ad7 100644 --- a/gjs/src/application.ts +++ b/gjs/src/application.ts @@ -11,6 +11,8 @@ type Config = Partial<{ cursorTheme: string css: string requestHandler: RequestHandler + main(...args: string[]): void + client(message: (msg: string) => string, ...args: string[]): void hold: boolean }> @@ -51,16 +53,19 @@ class AstalJS extends Astal.Application { } } - start({ requestHandler, css, hold, ...cfg }: Config = {}, callback?: (args: string[]) => void) { + start({ requestHandler, css, hold, main, client, ...cfg }: Config = {}) { + client ??= () => { + print(`Astal instance "${this.instanceName}" already running`) + exit(1) + } + Object.assign(this, cfg) setConsoleLogDomain(this.instanceName) this.requestHandler = requestHandler - this.connect("activate", () => callback?.(programArgs)) - if (!this.acquire_socket()) { - print(`Astal instance "${this.instanceName}" already running`) - exit(1) - } + this.connect("activate", () => main?.(...programArgs)) + if (!this.acquire_socket()) + client(msg => this.message(msg)!, ...programArgs) if (css) this.apply_css(css, false) diff --git a/lua/astal/application.lua b/lua/astal/application.lua index 8402a59..f738c09 100644 --- a/lua/astal/application.lua +++ b/lua/astal/application.lua @@ -26,14 +26,22 @@ local app = AstalLua() ---@field css? string ---@field hold? boolean ---@field request_handler? fun(msg: string, response: fun(res: any)) +---@field main? fun(...): unknown +---@field client? fun(message: fun(msg: string): string, ...): unknown ---@param config StartConfig | nil ----@param callback function | nil -function Astal.Application:start(config, callback) +function Astal.Application:start(config) if config == nil then config = {} end + if config.client == nil then + config.client = function() + print('Astal instance "' .. app.instance_name .. '" is already running') + os.exit(1) + end + end + if config.hold == nil then config.hold = true end @@ -57,17 +65,18 @@ function Astal.Application:start(config, callback) end app.on_activate = function() + if type(config.main) == "function" then + config.main(table.unpack(arg)) + end if config.hold then self:hold() end - if type(callback) == "function" then - callback() - end end if not app:acquire_socket() then - print('Astal instance "' .. app.instance_name .. '" is already running') - os.exit(1) + config.client(function(msg) + return app:message(msg) + end, table.unpack(arg)) end self:run(nil) diff --git a/src/astal.vala b/src/astal.vala index 2bae9e0..45c11ea 100644 --- a/src/astal.vala +++ b/src/astal.vala @@ -2,7 +2,8 @@ namespace Astal { public class Application : Gtk.Application { private List<Gtk.CssProvider> css_providers; private SocketService service; - private string socket; + + public string socket_path { get; private set; } public new string application_id { get { return base.application_id; } @@ -101,20 +102,20 @@ public class Application : Gtk.Application { * the return value indicates if instance is already running */ public bool acquire_socket() { - socket = GLib.Environment.get_user_runtime_dir().concat( + socket_path = GLib.Environment.get_user_runtime_dir().concat( "/", instance_name, ".sock"); - if (FileUtils.test(socket, GLib.FileTest.EXISTS)) { - info("socket %s exists", socket); + if (FileUtils.test(socket_path, GLib.FileTest.EXISTS)) { + info("socket %s exists", socket_path); return false; } try { service = new SocketService(); service.add_address( - new UnixSocketAddress(socket), + new UnixSocketAddress(socket_path), SocketType.STREAM, SocketProtocol.DEFAULT, null, @@ -125,7 +126,7 @@ public class Application : Gtk.Application { return false; }); - info("socket acquired: %s\n", socket); + info("socket acquired: %s\n", socket_path); return true; } catch (Error err) { critical("could not acquire socket %s\n", application_id); @@ -134,14 +135,29 @@ public class Application : Gtk.Application { } } + public string? message(string msg) { + var client = new SocketClient(); + + try { + var conn = client.connect(new UnixSocketAddress(socket_path), null); + conn.output_stream.write(msg.concat("\x04").data); + + var stream = new DataInputStream(conn.input_stream); + return stream.read_upto("\x04", -1, null, null); + } catch (Error err) { + printerr(err.message); + return null; + } + } + construct { if (instance_name == null) instance_name = "astal"; shutdown.connect(() => { - if (FileUtils.test(socket, GLib.FileTest.EXISTS)){ + if (FileUtils.test(socket_path, GLib.FileTest.EXISTS)){ try { - File.new_for_path(socket).delete(null); + File.new_for_path(socket_path).delete(null); } catch (Error err) { warning(err.message); } |