Commit a307d827 authored by Roman Alifanov's avatar Roman Alifanov

init BinaryBackend

parent 6b3ea81c
#!/bin/bash
sslk() {
gsettings set org.gnome.desktop.wm.keybindings switch-input-source "$1"
}
ck() {
gsettings set org.gnome.desktop.wm.keybindings switch-input-source "['']"
gsettings set org.gnome.desktop.wm.keybindings switch-input-source-backward "['']"
sslk "['']"
gsettings set org.gnome.desktop.input-sources xkb-options "['']"
}
get_range() {
echo '["<Ctrl>Shift_L", "<Super>space", "<Alt>Shift_L", "CapsLock"]'
}
set_value() {
ck
layout="$1"
case "$layout" in
"<Alt>Shift_L")
sslk "['$layout', '<Shift>Alt_L']"
;;
"<Ctrl>Shift_L")
sslk "['<Shift>Control_L', '<Ctrl>Shift_L']"
;;
"CapsLock")
gsettings set org.gnome.desktop.input-sources xkb-options "['grp:caps_toggle']"
;;
*)
sslk "['$layout']"
;;
esac
}
get_value() {
current_keybinding=$(gsettings get org.gnome.desktop.wm.keybindings switch-input-source)
current_xkb_options=$(gsettings get org.gnome.desktop.input-sources xkb-options)
if [[ "$current_xkb_options" == *"grp:caps_toggle"* ]]; then
echo "CapsLock"
else
case "$current_keybinding" in
"['<Ctrl>Shift_L', '<Shift>Control_L']")
echo "<Ctrl>Shift_L"
;;
"['<Alt>Shift_L', '<Shift>Alt_L']")
echo "<Alt>Shift_L"
;;
"['<Super>space']")
echo "<Super>space"
;;
"[]")
echo "No keybinding set"
;;
*)
echo "Unknown layout"
;;
esac
fi
}
command="$1"
case "$command" in
"get_range")
get_range
;;
"set_value")
layout="$2"
set_value "$layout"
;;
"get_value")
get_value
;;
*)
echo "Неизвестная команда: $command"
exit 1
;;
esac
......@@ -7,6 +7,8 @@
icon: preferences-system-time-symbolic
- name: "Power"
icon: battery-symbolic
- name: "Keyboard"
icon: input-keyboard-symbolic
- name: "System"
icon: preferences-system-symbolic
- name: "Boot"
......@@ -14,6 +16,17 @@
- name: "Fonts"
icon: preferences-desktop-display-symbolic
sections:
- name: "Lang"
weight: 0
page: "Keyboard"
settings:
- name: keyboard shortcut
type: choice
gtype: string
backend: binary
params:
binary_path: "bin/"
binary_name: "langswitch.sh"
- name: "Themes"
weight: 0
page: "Appearance"
......
from gi.repository import Gio, GLib
import os, re
import ast, subprocess
class Backend:
def __init__(self, params=None):
......@@ -184,11 +184,77 @@ class FileBackend(Backend):
self._save_file()
class BinaryBackend(Backend):
def __init__(self, params=None):
super().__init__(params)
self.binary_path = os.path.join(
self.params.get('module_path'),
self.params.get('binary_path')
)
self.binary_name = self.params.get('binary_name')
def _run_binary(self, command, *args):
try:
full_command = (
[self.binary_path + self.binary_name, command]
+ [x for x in args if x is not None]
)
result = subprocess.run(full_command, capture_output=True, text=True, check=True)
return result.stdout.strip()
except subprocess.CalledProcessError as e:
print(f"[ERROR] Ошибка при выполнении команды {command}: {e}")
return None
def get_value(self, key, gtype):
print(f"[DEBUG] Получение значения: key={key}, gtype={gtype}")
result = self._run_binary('get_value', key)
if result:
try:
return ast.literal_eval(result)
except (ValueError, SyntaxError) as e:
print(f"[ERROR] Ошибка при преобразовании результата {result}: {e}")
return result
return None
def get_range(self, key, gtype):
print(f"[DEBUG] Получение диапазона: key={key}, gtype={gtype}")
result = self._run_binary('get_range', key)
if not result:
print(f"[ERROR] Пустой результат или ошибка при выполнении команды get_range для ключа {key}")
return None
try:
parsed_result = ast.literal_eval(result)
return parsed_result
except (ValueError, SyntaxError) as e:
print(f"[ERROR] Ошибка при преобразовании результата {result} для ключа {key}: {e}")
return None
def set_value(self, key, value, gtype):
print(f"[DEBUG] Установка значения: key={key}, value={value}, gtype={gtype}")
result = self._run_binary('set_value', key, str(value))
if result:
try:
return ast.literal_eval(result)
except (ValueError, SyntaxError) as e:
print(f"[ERROR] Ошибка при преобразовании результата {result}: {e}")
return None
class BackendFactory:
def __init__(self):
self.backends = {
'gsettings': GSettingsBackend,
'file': FileBackend,
'binary': BinaryBackend,
}
def get_backend(self, backend_name, params=None):
......@@ -205,6 +271,8 @@ class RootBackendFactory:
def __init__(self):
self.backends = {
'file': FileBackend,
'binary': BinaryBackend,
}
def get_backend(self, backend_name, params=None):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment