const {Gdk, Gtk} = imports.gi import {App, Service, Utils, Widget} from "../imports.js" const {Box, EventBox, Button, Revealer} = Widget const {execAsync, exec} = Utils import {setupCursorHover, setupCursorHoverAim} from "./lib/cursorhover.js" import {MaterialIcon} from "./lib/materialicon.js" import {separatorLine} from "./lib/separator.js" import {defaultOskLayout, oskLayouts} from "../data/keyboardlayouts.js" const keyboardLayout = defaultOskLayout const keyboardJson = oskLayouts[keyboardLayout] execAsync(`ydotoold`).catch(print) // Start ydotool daemon function releaseAllKeys() { const keycodes = Array.from(Array(249).keys()) execAsync([`ydotool`, `key`, ...keycodes.map(keycode => `${keycode}:0`)]) .then(console.log("Released all keys")) .catch(print) } var modsPressed = false const keyboardControlButton = (icon, text, runFunction) => Button({ className: "osk-control-button spacing-h-10", onClicked: () => runFunction(), child: Widget.Box({ children: [ MaterialIcon(icon, "norm"), Widget.Label({ label: `${text}`, }), ], }), }) const keyboardControls = Box({ vertical: true, className: "spacing-v-5", children: [ Button({ className: "osk-control-button txt-norm icon-material", onClicked: () => { releaseAllKeys() App.toggleWindow("osk") }, label: "keyboard_hide", }), Button({ className: "osk-control-button txt-norm", label: `${keyboardJson["name_short"]}`, }), Button({ className: "osk-control-button txt-norm icon-material", onClicked: () => { // TODO: Proper clipboard widget, since fuzzel doesn't receive mouse inputs execAsync([ `bash`, `-c`, "pkill fuzzel || cliphist list | fuzzel --no-fuzzy --dmenu | cliphist decode | wl-copy", ]).catch(print) }, label: "assignment", }), ], }) const keyboardItself = kbJson => { return Box({ vertical: true, className: "spacing-v-5", children: kbJson.keys.map(row => Box({ vertical: false, className: "spacing-h-5", children: row.map(key => { return Button({ className: `osk-key osk-key-${key.shape}`, hexpand: key.shape == "space" || key.shape == "expand", label: key.label, setup: button => { let pressed = false if (key.keytype == "normal") { button.connect("pressed", () => { // mouse down execAsync(`ydotool key ${key.keycode}:1`) }) button.connect("clicked", () => { // release execAsync(`ydotool key ${key.keycode}:0`) }) } else if (key.keytype == "modkey") { button.connect("pressed", () => { // release if (pressed) { execAsync(`ydotool key ${key.keycode}:0`) button.toggleClassName("osk-key-active", false) pressed = false } else { execAsync(`ydotool key ${key.keycode}:1`) button.toggleClassName("osk-key-active", true) pressed = true modsPressed = true } }) } }, }) }), }), ), }) } export default () => Box({ vexpand: true, hexpand: true, className: "osk-window spacing-h-10", children: [keyboardControls, separatorLine, keyboardItself(keyboardJson)], })