add keyboard layout config

This commit is contained in:
piotr
2024-03-18 03:00:23 +01:00
parent bbeac1059d
commit 0f88051c46
5 changed files with 365 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
import json
import os import os
import signal import signal
import subprocess import subprocess
@@ -12,13 +13,14 @@ gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GLib from gi.repository import Gtk, Gdk, GLib
from nwg_panel.tools import get_config_dir, local_dir, load_json, save_json, load_string, list_outputs, check_key, \ from nwg_panel.tools import get_config_dir, local_dir, load_json, save_json, load_string, list_outputs, check_key, \
list_configs, update_gtk_entry, is_command, check_commands, cmd2string, eprint, temp_dir, load_shell_data list_configs, update_gtk_entry, is_command, check_commands, cmd2string, eprint, temp_dir, load_shell_data, hyprctl
from nwg_panel.__about__ import __version__ from nwg_panel.__about__ import __version__
dir_name = os.path.dirname(__file__) dir_name = os.path.dirname(__file__)
sway = os.getenv('SWAYSOCK') is not None sway = os.getenv('SWAYSOCK') is not None
hyprland = os.getenv("HYPRLAND_INSTANCE_SIGNATURE")
config_dir = get_config_dir() config_dir = get_config_dir()
data_home = os.getenv('XDG_DATA_HOME') if os.getenv('XDG_DATA_HOME') else os.path.join(os.getenv("HOME"), data_home = os.getenv('XDG_DATA_HOME') if os.getenv('XDG_DATA_HOME') else os.path.join(os.getenv("HOME"),
@@ -724,6 +726,7 @@ class EditorWrapper(object):
builder.get_object("hyprland-taskbar").set_text(voc["hyprland-taskbar"]) builder.get_object("hyprland-taskbar").set_text(voc["hyprland-taskbar"])
builder.get_object("hyprland-workspaces").set_text(voc["hyprland-workspaces"]) builder.get_object("hyprland-workspaces").set_text(voc["hyprland-workspaces"])
builder.get_object("brightness-slider").set_text(voc["brightness-slider"]) builder.get_object("brightness-slider").set_text(voc["brightness-slider"])
builder.get_object("keyboard-layout").set_text(voc["keyboard-layout"])
builder.get_object("executors").set_text(voc["executors"]) builder.get_object("executors").set_text(voc["executors"])
builder.get_object("buttons").set_text(voc["buttons"]) builder.get_object("buttons").set_text(voc["buttons"])
builder.get_object("menu-start").set_text(voc["menu-start"]) builder.get_object("menu-start").set_text(voc["menu-start"])
@@ -751,6 +754,7 @@ class EditorWrapper(object):
"dwl-tags", "dwl-tags",
"hyprland-taskbar", "hyprland-taskbar",
"hyprland-workspaces", "hyprland-workspaces",
"keyboard-layout",
"tray" "tray"
] ]
@@ -788,6 +792,9 @@ class EditorWrapper(object):
builder.get_object("eb-dwl-tags").connect("button-press-event", self.edit_dwl_tags) builder.get_object("eb-dwl-tags").connect("button-press-event", self.edit_dwl_tags)
builder.get_object("eb-hyprland-taskbar").connect("button-press-event", self.edit_hyprland_taskbar) builder.get_object("eb-hyprland-taskbar").connect("button-press-event", self.edit_hyprland_taskbar)
builder.get_object("eb-hyprland-workspaces").connect("button-press-event", self.edit_hyprland_workspaces) builder.get_object("eb-hyprland-workspaces").connect("button-press-event", self.edit_hyprland_workspaces)
builder.get_object("eb-keyboard-layout").connect("button-press-event", self.edit_keyboard_layout)
builder.get_object("eb-executors").connect("button-press-event", self.select_executor) builder.get_object("eb-executors").connect("button-press-event", self.select_executor)
builder.get_object("eb-buttons").connect("button-press-event", self.select_button) builder.get_object("eb-buttons").connect("button-press-event", self.select_button)
@@ -1197,6 +1204,8 @@ class EditorWrapper(object):
self.update_hyprland_taskbar() self.update_hyprland_taskbar()
elif self.edited == "hyprland-workspaces": elif self.edited == "hyprland-workspaces":
self.update_hyprland_workspaces() self.update_hyprland_workspaces()
elif self.edited == "keyboard-layout":
self.update_keyboard_layout()
elif self.edited == "openweather": elif self.edited == "openweather":
self.update_openweather() self.update_openweather()
elif self.edited == "brightness-slider": elif self.edited == "brightness-slider":
@@ -2178,6 +2187,105 @@ class EditorWrapper(object):
save_json(self.config, self.file) save_json(self.config, self.file)
def edit_keyboard_layout(self, *args):
self.load_panel()
self.edited = "keyboard-layout"
check_key(self.panel, "keyboard-layout", {})
settings = self.panel["keyboard-layout"]
defaults = {
"keyboard-device-sway": "",
"keyboard-device-hyprland": "",
"root-css-name": "root-executor",
"css-name": "executor",
"show-icon": True,
"icon-size": 16,
"icon-placement": "left",
"tooltip-text": "LMB: Next layout, RMB: Menu",
"angle": 0.0
}
for key in defaults:
check_key(settings, key, defaults[key])
builder = Gtk.Builder.new_from_file(os.path.join(dir_name, "glade/config_keyboard_layout.glade"))
builder.get_object("lbl-device").set_text("{}:".format(voc["device"]))
builder.get_object("lbl-tooltip-text").set_text("{}:".format(voc["tooltip-text"]))
builder.get_object("lbl-root-css-name").set_text("{}:".format(voc["root-css-name"]))
builder.get_object("lbl-css-name").set_text("{}:".format(voc["css-name"]))
builder.get_object("lbl-icon-placement").set_text("{}:".format(voc["icon-placement"]))
builder.get_object("lbl-icon-size").set_text("{}:".format(voc["icon-size"]))
builder.get_object("show-icon").set_label("{}".format(voc["show-icon"]))
builder.get_object("lbl-angle").set_text("{}:".format(voc["angle"]))
frame = builder.get_object("frame")
frame.set_label(" {}: KeyboardLayout ".format(voc["module"]))
self.kl_combo_device = builder.get_object("device")
if sway:
from i3ipc import Connection
i3 = Connection()
inputs = i3.get_inputs()
self.kl_combo_device.append("", voc["all"])
for i in inputs:
if i.type == "keyboard":
self.kl_combo_device.append(i, i)
self.kl_combo_device.set_active_id(settings["keyboard-device-sway"])
else:
o = hyprctl("j/devices")
devices = json.loads(o)
keyboards = devices["keyboards"] if "keyboards" in devices else []
self.kl_combo_device.append("", voc["all"])
for k in keyboards:
self.kl_combo_device.append(k["name"], k["name"])
self.kl_combo_device.set_active_id(settings["keyboard-device-hyprland"])
self.kl_tooltip_text = builder.get_object("tooltip-text")
self.kl_tooltip_text.set_text(settings["tooltip-text"])
self.kl_root_css_name = builder.get_object("root-css-name")
self.kl_root_css_name.set_text(settings["root-css-name"])
self.kl_css_name = builder.get_object("css-name")
self.kl_css_name.set_text(settings["css-name"])
self.kl_icon_placement = builder.get_object("icon-placement")
self.kl_icon_placement.set_active_id(settings["icon-placement"])
self.kl_icon_size = builder.get_object("icon-size")
self.kl_icon_size.set_numeric(True)
adj = Gtk.Adjustment(value=0, lower=8, upper=129, step_increment=1, page_increment=10, page_size=1)
self.kl_icon_size.configure(adj, 1, 0)
self.kl_icon_size.set_value(settings["icon-size"])
self.ws_angle = builder.get_object("angle")
self.ws_angle.set_tooltip_text(voc["angle-tooltip"])
self.ws_angle.set_active_id(str(settings["angle"]))
self.cb_show_icon = builder.get_object("show-icon")
self.cb_show_icon.set_active(settings["show-icon"])
for item in self.scrolled_window.get_children():
item.destroy()
self.scrolled_window.add(frame)
def update_keyboard_layout(self):
settings = self.panel["keyboard-layout"]
if sway:
settings["keyboard-device-sway"] = self.kl_combo_device.get_active_id()
elif hyprland:
settings["keyboard-device-hyprland"] = self.kl_combo_device.get_active_id()
settings["tooltip-text"] = self.kl_tooltip_text.get_text()
settings["root-css-name"] = self.kl_root_css_name.get_text()
settings["css-name"] = self.kl_css_name.get_text()
settings["icon-placement"] = self.kl_icon_placement.get_active_id()
settings["icon-size"] = self.kl_icon_size.get_value()
settings["show-icon"] = self.cb_show_icon.get_active()
try:
settings["angle"] = float(self.ws_angle.get_active_id())
except:
settings["angle"] = 0.0
save_json(self.config, self.file)
def edit_menu_start(self, *args): def edit_menu_start(self, *args):
self.load_panel() self.load_panel()
self.edited = "menu-start" self.edited = "menu-start"

View File

@@ -0,0 +1,231 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkFrame" id="frame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0.5</property>
<property name="shadow-type">out</property>
<child>
<!-- n-columns=2 n-rows=10 -->
<object class="GtkGrid" id="grid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">6</property>
<property name="margin-end">6</property>
<property name="margin-top">6</property>
<property name="margin-bottom">6</property>
<property name="row-spacing">6</property>
<property name="column-spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">&lt;span size="small"&gt;&lt;b&gt;Note:&lt;/b&gt; on sway switching lang for one keyboard device selects the same value for the others.
Either it's a bug or I don't understand 'man sway-input' ¯\_(•_•)_/¯&lt;/span&gt;</property>
<property name="use-markup">True</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">9</property>
<property name="width">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="tooltip-text">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-tooltip-text">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Tooltip text:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="root-css-name">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-root-css-name">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Root CSS name:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="css-name">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-css-name">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">CSS name:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="icon-placement">
<property name="visible">True</property>
<property name="can-focus">False</property>
<items>
<item id="left" translatable="yes">left</item>
<item id="right" translatable="yes">right</item>
</items>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-icon-placement">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Icon placement:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="icon-size">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-icon-size">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Icon size:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="show-icon">
<property name="label" translatable="yes">Show icon</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">6</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="angle">
<property name="visible">True</property>
<property name="can-focus">False</property>
<items>
<item id="0.0" translatable="yes">0°</item>
<item id="90.0" translatable="yes">90°</item>
<item id="270.0" translatable="yes">270°</item>
</items>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-angle">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Angle:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl-device">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Device:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">8</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="device">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">8</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Module: Executor</property>
</object>
</child>
</object>
</interface>

View File

@@ -434,6 +434,29 @@
</child> </child>
</object> </object>
</child> </child>
<child>
<object class="GtkListBoxRow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="selectable">False</property>
<child>
<object class="GtkEventBox" id="eb-keyboard-layout">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel" id="keyboard-layout">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="margin-left">6</property>
<property name="margin-start">6</property>
<property name="label" translatable="yes">Keyboard layout</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child> <child>
<object class="GtkListBoxRow"> <object class="GtkListBoxRow">
<property name="visible">True</property> <property name="visible">True</property>

View File

@@ -253,6 +253,7 @@
"units": "Units", "units": "Units",
"use-signal": "Use signal", "use-signal": "Use signal",
"user-menu": "User menu", "user-menu": "User menu",
"values-in-widget":"Values in widget",
"values-in-widget-tooltip": "Show value in the panel widget", "values-in-widget-tooltip": "Show value in the panel widget",
"vertical-padding": "Vertical padding", "vertical-padding": "Vertical padding",
"vertical-window-margin": "Vertical window margin", "vertical-window-margin": "Vertical window margin",

View File

@@ -253,6 +253,7 @@
"units": "Jednostki", "units": "Jednostki",
"use-signal": "Używaj sygnału", "use-signal": "Używaj sygnału",
"user-menu": "Menu użytkownika", "user-menu": "Menu użytkownika",
"values-in-widget":"Wartości w widgecie",
"values-in-widget-tooltip": "Pokazuj wartość w widgecie panelu", "values-in-widget-tooltip": "Pokazuj wartość w widgecie panelu",
"vertical-padding": "Wypełnienie pionowe", "vertical-padding": "Wypełnienie pionowe",
"vertical-window-margin": "Pionowy margines okna", "vertical-window-margin": "Pionowy margines okna",