diff options
Diffstat (limited to 'lang/gjs/src')
-rw-r--r-- | lang/gjs/src/_app.ts | 1 | ||||
-rw-r--r-- | lang/gjs/src/gobject.ts | 6 | ||||
-rw-r--r-- | lang/gjs/src/gtk3/astalify.ts | 6 | ||||
-rw-r--r-- | lang/gjs/src/gtk3/index.ts | 4 | ||||
-rw-r--r-- | lang/gjs/src/gtk3/jsx-runtime.ts | 3 | ||||
-rw-r--r-- | lang/gjs/src/index.ts | 1 | ||||
-rw-r--r-- | lang/gjs/src/overrides.ts | 69 |
7 files changed, 83 insertions, 7 deletions
diff --git a/lang/gjs/src/_app.ts b/lang/gjs/src/_app.ts index 82e8bb5..3dadd04 100644 --- a/lang/gjs/src/_app.ts +++ b/lang/gjs/src/_app.ts @@ -1,3 +1,4 @@ +import "./overrides.js" import { setConsoleLogDomain } from "console" import { exit, programArgs } from "system" import IO from "gi://AstalIO" diff --git a/lang/gjs/src/gobject.ts b/lang/gjs/src/gobject.ts index 59dd62a..b744cfb 100644 --- a/lang/gjs/src/gobject.ts +++ b/lang/gjs/src/gobject.ts @@ -51,6 +51,8 @@ export function register(options: MetaInfo = {}) { Properties: { ...cls[meta]?.Properties }, ...options, }, cls) + + delete cls[meta] } } @@ -124,7 +126,9 @@ export function signal( } } else { - target.constructor[meta].Signals[name] = declaration + target.constructor[meta].Signals[name] = declaration || { + param_types: [], + } } if (!desc) { diff --git a/lang/gjs/src/gtk3/astalify.ts b/lang/gjs/src/gtk3/astalify.ts index b9621be..6973805 100644 --- a/lang/gjs/src/gtk3/astalify.ts +++ b/lang/gjs/src/gtk3/astalify.ts @@ -43,7 +43,7 @@ function setProp(obj: any, prop: string, value: any) { export default function astalify< C extends { new(...args: any[]): Gtk.Widget }, ->(cls: C) { +>(cls: C, clsName = cls.name) { class Widget extends cls { get css(): string { return Astal.widget_get_css(this) } set css(css: string) { Astal.widget_set_css(this, css) } @@ -233,7 +233,7 @@ export default function astalify< } GObject.registerClass({ - GTypeName: `Astal_${cls.name}`, + GTypeName: `Astal_${clsName}`, Properties: { "class-name": GObject.ParamSpec.string( "class-name", "", "", GObject.ParamFlags.READWRITE, "", @@ -256,7 +256,7 @@ export default function astalify< return Widget } -type BindableProps<T> = { +export type BindableProps<T> = { [K in keyof T]: Binding<T[K]> | T[K]; } diff --git a/lang/gjs/src/gtk3/index.ts b/lang/gjs/src/gtk3/index.ts index cfafbda..ff641af 100644 --- a/lang/gjs/src/gtk3/index.ts +++ b/lang/gjs/src/gtk3/index.ts @@ -1,9 +1,9 @@ import Astal from "gi://Astal?version=3.0" import Gtk from "gi://Gtk?version=3.0" import Gdk from "gi://Gdk?version=3.0" -import astalify, { type ConstructProps } from "./astalify.js" +import astalify, { type ConstructProps, type BindableProps } from "./astalify.js" export { Astal, Gtk, Gdk } export { default as App } from "./app.js" -export { astalify, ConstructProps } +export { astalify, ConstructProps, BindableProps } export * as Widget from "./widget.js" diff --git a/lang/gjs/src/gtk3/jsx-runtime.ts b/lang/gjs/src/gtk3/jsx-runtime.ts index 22dc424..9da4bb6 100644 --- a/lang/gjs/src/gtk3/jsx-runtime.ts +++ b/lang/gjs/src/gtk3/jsx-runtime.ts @@ -10,7 +10,8 @@ export function Fragment({ children = [], child }: { child?: BindableChild children?: Array<BindableChild> }) { - return mergeBindings([...children, child]) + if (child) children.push(child) + return mergeBindings(children) } export function jsx( diff --git a/lang/gjs/src/index.ts b/lang/gjs/src/index.ts index cabc961..8fe8d01 100644 --- a/lang/gjs/src/index.ts +++ b/lang/gjs/src/index.ts @@ -1,3 +1,4 @@ +import "./overrides.js" export { default as AstalIO } from "gi://AstalIO?version=0.1" export * from "./process.js" export * from "./time.js" diff --git a/lang/gjs/src/overrides.ts b/lang/gjs/src/overrides.ts new file mode 100644 index 0000000..6643ba5 --- /dev/null +++ b/lang/gjs/src/overrides.ts @@ -0,0 +1,69 @@ +/** + * Workaround for "Can't convert non-null pointer to JS value " + */ + +export { } + +const snakeify = (str: string) => str + .replace(/([a-z])([A-Z])/g, "$1_$2") + .replaceAll("-", "_") + .toLowerCase() + +async function suppress<T>(mod: Promise<{ default: T }>, patch: (m: T) => void) { + return mod.then(m => patch(m.default)).catch(() => void 0) +} + +function patch<P extends object>(proto: P, prop: Extract<keyof P, string>) { + Object.defineProperty(proto, prop, { + get() { return this[`get_${snakeify(prop)}`]() }, + }) +} + +await suppress(import("gi://AstalApps"), ({ Apps, Application }) => { + patch(Apps.prototype, "list") + patch(Application.prototype, "keywords") + patch(Application.prototype, "categories") +}) + +await suppress(import("gi://AstalBattery"), ({ UPower }) => { + patch(UPower.prototype, "devices") +}) + +await suppress(import("gi://AstalBluetooth"), ({ Adapter, Bluetooth, Device }) => { + patch(Adapter.prototype, "uuids") + patch(Bluetooth.prototype, "adapters") + patch(Bluetooth.prototype, "devices") + patch(Device.prototype, "uuids") +}) + +await suppress(import("gi://AstalHyprland"), ({ Hyprland, Monitor, Workspace }) => { + patch(Hyprland.prototype, "monitors") + patch(Hyprland.prototype, "workspaces") + patch(Hyprland.prototype, "clients") + patch(Monitor.prototype, "availableModes") + patch(Monitor.prototype, "available_modes") + patch(Workspace.prototype, "clients") +}) + +await suppress(import("gi://AstalMpris"), ({ Mpris, Player }) => { + patch(Mpris.prototype, "players") + patch(Player.prototype, "supported_uri_schemas") + patch(Player.prototype, "supportedUriSchemas") + patch(Player.prototype, "supported_mime_types") + patch(Player.prototype, "supportedMimeTypes") + patch(Player.prototype, "comments") +}) + +await suppress(import("gi://AstalNetwork"), ({ Wifi }) => { + patch(Wifi.prototype, "access_points") + patch(Wifi.prototype, "accessPoints") +}) + +await suppress(import("gi://AstalNotifd"), ({ Notifd, Notification }) => { + patch(Notifd.prototype, "notifications") + patch(Notification.prototype, "actions") +}) + +await suppress(import("gi://AstalPowerProfiles"), ({ PowerProfiles }) => { + patch(PowerProfiles.prototype, "actions") +}) |