diff options
Diffstat (limited to 'lang/gjs')
-rw-r--r-- | lang/gjs/src/_app.ts | 122 | ||||
-rw-r--r-- | lang/gjs/src/gobject.ts | 9 | ||||
-rw-r--r-- | lang/gjs/src/gtk3/app.ts | 104 | ||||
-rw-r--r-- | lang/gjs/src/gtk4/app.ts | 8 | ||||
-rw-r--r-- | lang/gjs/src/gtk4/astalify.ts | 2 | ||||
-rw-r--r-- | lang/gjs/src/gtk4/index.ts | 10 | ||||
-rw-r--r-- | lang/gjs/src/gtk4/jsx-runtime.ts | 2 | ||||
-rw-r--r-- | lang/gjs/src/gtk4/widget.ts | 1 | ||||
-rw-r--r-- | lang/gjs/tsconfig.json | 2 |
9 files changed, 153 insertions, 107 deletions
diff --git a/lang/gjs/src/_app.ts b/lang/gjs/src/_app.ts new file mode 100644 index 0000000..82e8bb5 --- /dev/null +++ b/lang/gjs/src/_app.ts @@ -0,0 +1,122 @@ +import { setConsoleLogDomain } from "console" +import { exit, programArgs } from "system" +import IO from "gi://AstalIO" +import GObject from "gi://GObject" +import Gio from "gi://Gio?version=2.0" +import type Astal3 from "gi://Astal?version=3.0" +import type Astal4 from "gi://Astal?version=4.0" + +type Config = Partial<{ + instanceName: string + css: string + icons: string + gtkTheme: string + iconTheme: string + cursorTheme: string + hold: boolean + requestHandler(request: string, res: (response: any) => void): void + main(...args: string[]): void + client(message: (msg: string) => string, ...args: string[]): void +}> + +interface Astal3JS extends Astal3.Application { + eval(body: string): Promise<any> + requestHandler: Config["requestHandler"] + apply_css(style: string, reset?: boolean): void + quit(code?: number): void + start(config?: Config): void +} + +interface Astal4JS extends Astal4.Application { + eval(body: string): Promise<any> + requestHandler?: Config["requestHandler"] + apply_css(style: string, reset?: boolean): void + quit(code?: number): void + start(config?: Config): void +} + +type App3 = typeof Astal3.Application +type App4 = typeof Astal4.Application + +export function mkApp<App extends App3>(App: App): Astal3JS +export function mkApp<App extends App4>(App: App): Astal4JS + +export function mkApp(App: App3 | App4) { + return new (class AstalJS extends App { + static { GObject.registerClass({ GTypeName: "AstalJS" }, this as any) } + + eval(body: string): Promise<any> { + return new Promise((res, rej) => { + try { + const fn = Function(`return (async function() { + ${body.includes(";") ? body : `return ${body};`} + })`) + fn()().then(res).catch(rej) + } + catch (error) { + rej(error) + } + }) + } + + requestHandler?: Config["requestHandler"] + + vfunc_request(msg: string, conn: Gio.SocketConnection): void { + if (typeof this.requestHandler === "function") { + this.requestHandler(msg, (response) => { + IO.write_sock(conn, String(response), (_, res) => + IO.write_sock_finish(res), + ) + }) + } + else { + super.vfunc_request(msg, conn) + } + } + + apply_css(style: string, reset = false) { + super.apply_css(style, reset) + } + + quit(code?: number): void { + super.quit() + exit(code ?? 0) + } + + start({ requestHandler, css, hold, main, client, icons, ...cfg }: Config = {}) { + const app = this as unknown as InstanceType<App3 | App4> + + client ??= () => { + print(`Astal instance "${app.instanceName}" already running`) + exit(1) + } + + Object.assign(this, cfg) + setConsoleLogDomain(app.instanceName) + + this.requestHandler = requestHandler + app.connect("activate", () => { + main?.(...programArgs) + }) + + try { + app.acquire_socket() + } + catch (error) { + return client(msg => IO.send_message(app.instanceName, msg)!, ...programArgs) + } + + if (css) + this.apply_css(css, false) + + if (icons) + app.add_icons(icons) + + hold ??= true + if (hold) + app.hold() + + app.runAsync([]) + } + }) +} diff --git a/lang/gjs/src/gobject.ts b/lang/gjs/src/gobject.ts index aeb3d9e..72093b0 100644 --- a/lang/gjs/src/gobject.ts +++ b/lang/gjs/src/gobject.ts @@ -40,6 +40,11 @@ type MetaInfo = GObject.MetaInfo<never, Array<{ $gtype: GObject.GType }>, never> export function register(options: MetaInfo = {}) { return function (cls: GObjectConstructor) { + const t = options.Template + if (typeof t === "string" && !t.startsWith("resource://") && !t.startsWith("file://")) { + options.Template = new TextEncoder().encode(t) + } + GObject.registerClass({ Signals: { ...cls[meta]?.Signals }, Properties: { ...cls[meta]?.Properties }, @@ -95,10 +100,10 @@ export function property(declaration: PropertyDeclaration = Object) { } export function signal(...params: Array<{ $gtype: GObject.GType } | typeof Object>): - (target: any, signal: any, desc?: PropertyDescriptor) => void +(target: any, signal: any, desc?: PropertyDescriptor) => void export function signal(declaration?: SignalDeclaration): - (target: any, signal: any, desc?: PropertyDescriptor) => void +(target: any, signal: any, desc?: PropertyDescriptor) => void export function signal( declaration?: SignalDeclaration | { $gtype: GObject.GType } | typeof Object, diff --git a/lang/gjs/src/gtk3/app.ts b/lang/gjs/src/gtk3/app.ts index 1191dc4..ccf714c 100644 --- a/lang/gjs/src/gtk3/app.ts +++ b/lang/gjs/src/gtk3/app.ts @@ -1,105 +1,7 @@ -import IO from "gi://AstalIO" -import GObject from "gi://GObject" -import Astal from "gi://Astal?version=3.0" -import Gio from "gi://Gio?version=2.0" import Gtk from "gi://Gtk?version=3.0" +import Astal from "gi://Astal?version=3.0" +import { mkApp } from "src/_app" Gtk.init(null) -type RequestHandler = { - (request: string, res: (response: any) => void): void -} - -type Config = Partial<{ - icons: string - instanceName: string - gtkTheme: string - iconTheme: string - cursorTheme: string - css: string - requestHandler: RequestHandler - main(...args: string[]): void - client(message: (msg: string) => string, ...args: string[]): void - hold: boolean -}> - -import { setConsoleLogDomain } from "console" -import { exit, programArgs } from "system" - -export default new (class AstalJS extends Astal.Application { - static { GObject.registerClass({ GTypeName: "AstalJS" }, this) } - - eval(body: string): Promise<any> { - return new Promise((res, rej) => { - try { - const fn = Function(`return (async function() { - ${body.includes(";") ? body : `return ${body};`} - })`) - fn()() - .then(res) - .catch(rej) - } - catch (error) { - rej(error) - } - }) - } - - requestHandler?: RequestHandler - - vfunc_request(msg: string, conn: Gio.SocketConnection): void { - if (typeof this.requestHandler === "function") { - this.requestHandler(msg, (response) => { - IO.write_sock(conn, String(response), (_, res) => - IO.write_sock_finish(res), - ) - }) - } - else { - super.vfunc_request(msg, conn) - } - } - - apply_css(style: string, reset = false) { - super.apply_css(style, reset) - } - - quit(code?: number): void { - super.quit() - exit(code ?? 0) - } - - start({ requestHandler, css, hold, main, client, icons, ...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", () => { - main?.(...programArgs) - }) - - try { - this.acquire_socket() - } - catch (error) { - return client(msg => IO.send_message(this.instanceName, msg)!, ...programArgs) - } - - if (css) - this.apply_css(css, false) - - if (icons) - this.add_icons(icons) - - hold ??= true - if (hold) - this.hold() - - this.runAsync([]) - } -}) +export default mkApp(Astal.Application) diff --git a/lang/gjs/src/gtk4/app.ts b/lang/gjs/src/gtk4/app.ts index d931f73..ad3c1cb 100644 --- a/lang/gjs/src/gtk4/app.ts +++ b/lang/gjs/src/gtk4/app.ts @@ -1 +1,7 @@ -// TODO: gtk4 +import Gtk from "gi://Gtk?version=4.0" +import Astal from "gi://Astal?version=4.0" +import { mkApp } from "src/_app" + +Gtk.init() + +export default mkApp(Astal.Application) diff --git a/lang/gjs/src/gtk4/astalify.ts b/lang/gjs/src/gtk4/astalify.ts index d931f73..6c8ea4d 100644 --- a/lang/gjs/src/gtk4/astalify.ts +++ b/lang/gjs/src/gtk4/astalify.ts @@ -1 +1 @@ -// TODO: gtk4 +// TODO: diff --git a/lang/gjs/src/gtk4/index.ts b/lang/gjs/src/gtk4/index.ts index d931f73..3b1f737 100644 --- a/lang/gjs/src/gtk4/index.ts +++ b/lang/gjs/src/gtk4/index.ts @@ -1 +1,9 @@ -// TODO: gtk4 +import Astal from "gi://Astal?version=4.0" +import Gtk from "gi://Gtk?version=4.0" +import Gdk from "gi://Gdk?version=4.0" +// import astalify, { type ConstructProps } from "./astalify.js" + +export { Astal, Gtk, Gdk } +export { default as App } from "./app.js" +// export { astalify, ConstructProps } +// export * as Widget from "./widget.js" diff --git a/lang/gjs/src/gtk4/jsx-runtime.ts b/lang/gjs/src/gtk4/jsx-runtime.ts index d931f73..6c8ea4d 100644 --- a/lang/gjs/src/gtk4/jsx-runtime.ts +++ b/lang/gjs/src/gtk4/jsx-runtime.ts @@ -1 +1 @@ -// TODO: gtk4 +// TODO: diff --git a/lang/gjs/src/gtk4/widget.ts b/lang/gjs/src/gtk4/widget.ts new file mode 100644 index 0000000..6c8ea4d --- /dev/null +++ b/lang/gjs/src/gtk4/widget.ts @@ -0,0 +1 @@ +// TODO: diff --git a/lang/gjs/tsconfig.json b/lang/gjs/tsconfig.json index 171e75b..3d5ade5 100644 --- a/lang/gjs/tsconfig.json +++ b/lang/gjs/tsconfig.json @@ -11,6 +11,8 @@ "include": [ "@girs", "src/*.ts", + "src/gtk3/*", + "src/gtk4/*", "index.ts", ] } |