summaryrefslogtreecommitdiff
path: root/lang/gjs
diff options
context:
space:
mode:
Diffstat (limited to 'lang/gjs')
-rw-r--r--lang/gjs/src/_app.ts122
-rw-r--r--lang/gjs/src/gobject.ts9
-rw-r--r--lang/gjs/src/gtk3/app.ts104
-rw-r--r--lang/gjs/src/gtk4/app.ts8
-rw-r--r--lang/gjs/src/gtk4/astalify.ts2
-rw-r--r--lang/gjs/src/gtk4/index.ts10
-rw-r--r--lang/gjs/src/gtk4/jsx-runtime.ts2
-rw-r--r--lang/gjs/src/gtk4/widget.ts1
-rw-r--r--lang/gjs/tsconfig.json2
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",
]
}