Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 14 additions & 27 deletions WayOSK/Keyboard.qml
Original file line number Diff line number Diff line change
Expand Up @@ -14,39 +14,26 @@ PanelWindow {
right: true
}

property var keyRows: [
["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
["A", "S", "D", "F", "G", "H", "J", "K", "L"],
["Z", "X", "C", "V", "B", "N", "M"]
]

property string layoutPath: ""
property Socket keyboardSocket: keyboardSocket

Socket {
id: keyboardSocket
path: "/tmp/wayosk.sock"
}

Rectangle {
anchors.fill: parent
color: "gray"
opacity: 0.75

Column {
anchors.centerIn: parent
spacing: 8
IpcHandler {
target: "keyboard"

Repeater {
model: keyRows
delegate: Row {
spacing: 8
Repeater {
model: modelData
delegate: KeyboardKey {
keyValue: modelData
socketConnection: keyboardSocket
}
}
}
}
function setLayoutPath(path: string): void {
keyboard.layoutPath = path
}
}

Loader {
id: keyboardLoader
anchors.fill: parent
source: keyboard.layoutPath
active: keyboard.layoutPath !== ""
}
}
14 changes: 7 additions & 7 deletions WayOSK/KeyboardKey.qml → WayOSK/KeyboardUtils/KeyboardKey.qml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import QtQuick.Controls

Button {
id: keyButton
property string keyValue: ""
property Socket socketConnection: null
property string key: ""
property string label: ""

text: keyValue
text: label
width: 40
height: 40
font.pixelSize: 20
Expand All @@ -18,10 +18,10 @@ Button {
}

onClicked: {
if (socketConnection) {
socketConnection.connected = true
socketConnection.write(keyValue)
socketConnection.flush()
if (keyboard.keyboardSocket) {
keyboard.keyboardSocket.connected = true
keyboard.keyboardSocket.write(key)
keyboard.keyboardSocket.flush()
} else {
console.error("Socket is not connected")
}
Expand Down
1 change: 1 addition & 0 deletions WayOSK/KeyboardUtils/qmldir
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
KeyboardKey 1.0 KeyboardKey.qml
16 changes: 16 additions & 0 deletions WayOSK/config_handler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import configparser
import os

class ConfigHandler:
def __init__(self) -> None:
self.config_file = os.path.expanduser(os.path.join("~", ".config", "WayOSK", "config.ini"))
self.config = configparser.ConfigParser()
self.config.read(self.config_file)

def get_layout_path(self) -> str:
layout = self.config.get("Keyboard", "layout", fallback="de_de")
layout_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "layouts")
if f"{layout}.qml" not in os.listdir(layout_dir):
print("Layout not found, aborting")
return ""
return os.path.join(layout_dir, f"{layout}.qml")
2 changes: 1 addition & 1 deletion WayOSK/keyboard_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def listen_for_keys(self):
if not data:
continue

wk.click(f"KEY_{data}")
wk.click(data)

def cleanup(self):
if self.server:
Expand Down
130 changes: 130 additions & 0 deletions WayOSK/layouts/de_de.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import QtQuick
import QtQuick.Layouts
import KeyboardUtils

Rectangle {
id: customKeyboard
color: "gray"
opacity: 0.75

property var keyRows : [
[
{ key: "KEY_ESCAPE", label: "Esc" },
{ key: "KEY_F1", label: "F1" },
{ key: "KEY_F2", label: "F2" },
{ key: "KEY_F3", label: "F3" },
{ key: "KEY_F4", label: "F4" },
{ key: "KEY_F5", label: "F5" },
{ key: "KEY_F6", label: "F6" },
{ key: "KEY_F7", label: "F7" },
{ key: "KEY_F8", label: "F8" },
{ key: "KEY_F9", label: "F9" },
{ key: "KEY_F10", label: "F10" },
{ key: "KEY_F11", label: "F11" },
{ key: "KEY_F12", label: "F12" }
],
[
{ key: "KEY_GRAVE", label: "^" },
{ key: "KEY_1", label: "1" },
{ key: "KEY_2", label: "2" },
{ key: "KEY_3", label: "3" },
{ key: "KEY_4", label: "4" },
{ key: "KEY_5", label: "5" },
{ key: "KEY_6", label: "6" },
{ key: "KEY_7", label: "7" },
{ key: "KEY_8", label: "8" },
{ key: "KEY_9", label: "9" },
{ key: "KEY_0", label: "0" },
{ key: "KEY_MINUS", label: "ß" },
{ key: "KEY_EQUAL", label: "´" },
{ key: "KEY_BACKSPACE", label: "Backspace", width: 2 }
],
[
{ key: "KEY_TAB", label: "Tab", width: 1.25 },
{ key: "KEY_Q", label: "Q" },
{ key: "KEY_W", label: "W" },
{ key: "KEY_E", label: "E" },
{ key: "KEY_R", label: "R" },
{ key: "KEY_T", label: "T" },
{ key: "KEY_Y", label: "Z" },
{ key: "KEY_U", label: "U" },
{ key: "KEY_I", label: "I" },
{ key: "KEY_O", label: "O" },
{ key: "KEY_P", label: "P" },
{ key: "KEY_LEFTBRACE", label: "Ü" },
{ key: "KEY_RIGHTBRACE", label: "+" },
{ key: "KEY_ENTER", label: "Enter", width: 1.25 }
],
[
{ key: "KEY_CAPSLOCK", label: "Caps", width: 1.5 },
{ key: "KEY_A", label: "A" },
{ key: "KEY_S", label: "S" },
{ key: "KEY_D", label: "D" },
{ key: "KEY_F", label: "F" },
{ key: "KEY_G", label: "G" },
{ key: "KEY_H", label: "H" },
{ key: "KEY_J", label: "J" },
{ key: "KEY_K", label: "K" },
{ key: "KEY_L", label: "L" },
{ key: "KEY_SEMICOLON", label: "Ö" },
{ key: "KEY_APOSTROPHE", label: "Ä" },
{ key: "KEY_BACKSLASH", label: "#" },
{ key: "KEY_ENTER", label: "Enter" }
],
[
{ key: "KEY_LEFTSHIFT", label: "Shift", width: 1.25 },
{ key: "KEY_LESS", label: "<" },
{ key: "KEY_Z", label: "Y" },
{ key: "KEY_X", label: "X" },
{ key: "KEY_C", label: "C" },
{ key: "KEY_V", label: "V" },
{ key: "KEY_B", label: "B" },
{ key: "KEY_N", label: "N" },
{ key: "KEY_M", label: "M" },
{ key: "KEY_COMMA", label: "," },
{ key: "KEY_DOT", label: "." },
{ key: "KEY_SLASH", label: "-" },
{ key: "KEY_RIGHTSHIFT", label: "Shift", width: 1.25 }
],
[
{ key: "KEY_LEFTCTRL", label: "Ctrl" },
{ key: "KEY_LEFTMETA", label: "Meta" },
{ key: "KEY_LEFTALT", label: "Alt" },
{ key: "KEY_SPACE", label: "Space", width: 6 },
{ key: "KEY_RIGHTALT", label: "AltGr" },
{ key: "KEY_RIGHTMETA", label: "Meta" },
{ key: "KEY_RIGHTCTRL", label: "Ctrl" }
],
]

ColumnLayout {
anchors.fill: parent
anchors.margins: 10
spacing: 5

Repeater {
model: keyRows.length

RowLayout {
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 5

property var rowKeys: keyRows[index]

Repeater {
model: rowKeys

KeyboardKey {
key: modelData.key
label: modelData.label
Layout.fillWidth: true
Layout.preferredWidth: (modelData.width || 1) * 40
Layout.minimumWidth: 40
Layout.fillHeight: true
}
}
}
}
}
}
16 changes: 15 additions & 1 deletion WayOSK/main.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from keyboard_server import KeyboardServer
from config_handler import ConfigHandler
import subprocess
import shutil
import time
import sys
import os

Expand All @@ -10,8 +12,20 @@
sys.exit("Error: 'quickshell' is not installed. Please install it: 'https://quickshell.org/'")

server = KeyboardServer(SOCKET_PATH)
config_handler = ConfigHandler()

try:
subprocess.run(["quickshell", "-p", f"{os.path.dirname(os.path.abspath(__file__))}/main.qml"])
utils_path = os.path.dirname(os.path.abspath(__file__))
os.environ["QML_IMPORT_PATH"] = utils_path

quickshell_process = subprocess.Popen(["quickshell", "-p", f"{os.path.dirname(os.path.abspath(__file__))}/main.qml"])

layout_path = config_handler.get_layout_path()
ipc_process = None
while ipc_process != 0:
ipc_process = subprocess.call(["quickshell", "ipc", "--pid", str(quickshell_process.pid), "call", "keyboard", "setLayoutPath", layout_path])
time.sleep(0.1)

quickshell_process.wait()
finally:
server.cleanup()