summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gjs/src/application.ts17
-rw-r--r--lua/astal/application.lua23
-rw-r--r--src/astal.vala32
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);
}