Skip to content

Commit

Permalink
Merge pull request #287 from nwg-piotr/kb
Browse files Browse the repository at this point in the history
add KeyboardLayout module
  • Loading branch information
nwg-piotr authored Mar 19, 2024
2 parents 194e8d0 + 11e3d81 commit 6a2e3d4
Show file tree
Hide file tree
Showing 9 changed files with 588 additions and 2 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ buttons
- **Scratchpad**: displays info on current scratchpad content and allows to open scratchpad windows
- **SwayMode**: a simple indicator of a sway mode other than "default"
- **Tray**: SNI system tray module
- **KeyboardLayout**: keyboard layout switcher, between values defined as `xkb_layout` (sway) or `kb_layout` (Hyprland).
Use commas to separate values, e.g. `pl,us,de`.

## Installation

Expand Down
111 changes: 110 additions & 1 deletion nwg_panel/config.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/python3

import json
import os
import signal
import subprocess
Expand All @@ -12,13 +13,14 @@
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, \
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__

dir_name = os.path.dirname(__file__)

sway = os.getenv('SWAYSOCK') is not None
hyprland = os.getenv("HYPRLAND_INSTANCE_SIGNATURE")

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"),
Expand Down Expand Up @@ -724,6 +726,7 @@ def __init__(self, parent, file, panel_idx, plugin_menu_start):
builder.get_object("hyprland-taskbar").set_text(voc["hyprland-taskbar"])
builder.get_object("hyprland-workspaces").set_text(voc["hyprland-workspaces"])
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("buttons").set_text(voc["buttons"])
builder.get_object("menu-start").set_text(voc["menu-start"])
Expand Down Expand Up @@ -751,6 +754,7 @@ def __init__(self, parent, file, panel_idx, plugin_menu_start):
"dwl-tags",
"hyprland-taskbar",
"hyprland-workspaces",
"keyboard-layout",
"tray"
]

Expand Down Expand Up @@ -788,6 +792,9 @@ def __init__(self, parent, file, panel_idx, plugin_menu_start):
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-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-buttons").connect("button-press-event", self.select_button)

Expand Down Expand Up @@ -1197,6 +1204,8 @@ def apply_changes(self, *args):
self.update_hyprland_taskbar()
elif self.edited == "hyprland-workspaces":
self.update_hyprland_workspaces()
elif self.edited == "keyboard-layout":
self.update_keyboard_layout()
elif self.edited == "openweather":
self.update_openweather()
elif self.edited == "brightness-slider":
Expand Down Expand Up @@ -2178,6 +2187,106 @@ def update_hyprland_workspaces(self):

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-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.identifier, i.identifier)
# self.kl_combo_device.set_active_id(settings["keyboard-device-sway"])
self.kl_combo_device.set_active_id("")
self.kl_combo_device.set_sensitive(False)
elif hyprland:
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"])

builder.get_object("note").hide()

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 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):
self.load_panel()
self.edited = "menu-start"
Expand Down
Loading

0 comments on commit 6a2e3d4

Please sign in to comment.