mirror of
https://github.com/Theaninova/TheaninovOS.git
synced 2025-12-13 03:56:24 +00:00
115 lines
4.1 KiB
JavaScript
115 lines
4.1 KiB
JavaScript
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),
|
|
],
|
|
});
|