mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-05 13:08:29 -04:00
@@ -1,6 +1,7 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Hyprland
|
import Quickshell.Hyprland
|
||||||
|
import Quickshell.I3
|
||||||
import qs.Common
|
import qs.Common
|
||||||
import qs.Modules.Plugins
|
import qs.Modules.Plugins
|
||||||
import qs.Services
|
import qs.Services
|
||||||
@@ -110,6 +111,27 @@ BasePill {
|
|||||||
Quickshell.execDetached(["hyprctl", "switchxkblayout", root.hyprlandKeyboard, "next"]);
|
Quickshell.execDetached(["hyprctl", "switchxkblayout", root.hyprlandKeyboard, "next"]);
|
||||||
} else if (CompositorService.isMango) {
|
} else if (CompositorService.isMango) {
|
||||||
MangoService.cycleKeyboardLayout();
|
MangoService.cycleKeyboardLayout();
|
||||||
|
} else if (CompositorService.isSway) {
|
||||||
|
I3.dispatch("input type:keyboard xkb_switch_layout next");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
active: CompositorService.isSway
|
||||||
|
sourceComponent: I3IpcListener {
|
||||||
|
subscriptions: ["input"]
|
||||||
|
onIpcEvent: event => {
|
||||||
|
if (event.type !== "input")
|
||||||
|
return;
|
||||||
|
try {
|
||||||
|
const payload = JSON.parse(event.data);
|
||||||
|
if (payload.change !== "xkb_layout")
|
||||||
|
return;
|
||||||
|
const name = payload.input?.xkb_active_layout_name;
|
||||||
|
if (name)
|
||||||
|
root.currentLayout = name;
|
||||||
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,12 +148,25 @@ BasePill {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
if (CompositorService.isHyprland) {
|
if (CompositorService.isHyprland || CompositorService.isSway) {
|
||||||
updateLayout();
|
updateLayout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLayout() {
|
function updateLayout() {
|
||||||
|
if (CompositorService.isSway) {
|
||||||
|
Proc.runCommand(null, ["swaymsg", "-t", "get_inputs", "-r"], (output, exitCode) => {
|
||||||
|
if (exitCode !== 0)
|
||||||
|
return;
|
||||||
|
try {
|
||||||
|
const inputs = JSON.parse(output);
|
||||||
|
const kb = inputs.find(i => i.type === "keyboard" && i.xkb_active_layout_name);
|
||||||
|
if (kb)
|
||||||
|
root.currentLayout = kb.xkb_active_layout_name;
|
||||||
|
} catch (e) {}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (CompositorService.isHyprland) {
|
if (CompositorService.isHyprland) {
|
||||||
Proc.runCommand(null, ["hyprctl", "-j", "devices"], (output, exitCode) => {
|
Proc.runCommand(null, ["hyprctl", "-j", "devices"], (output, exitCode) => {
|
||||||
if (exitCode !== 0) {
|
if (exitCode !== 0) {
|
||||||
|
|||||||
@@ -18,9 +18,18 @@ ROOT_DIR = SCRIPT_DIR.parent
|
|||||||
FREEZE_FILE = SCRIPT_DIR / 'term_freeze.json'
|
FREEZE_FILE = SCRIPT_DIR / 'term_freeze.json'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# dms-plugins is a separate checkout with its own release cadence; the freeze
|
||||||
|
# only guards this repo's terms. Catalog extraction still includes plugins.
|
||||||
|
def shell_terms(translations):
|
||||||
|
return {
|
||||||
|
term: info for term, info in translations.items()
|
||||||
|
if any(not occ['file'].startswith('dms-plugins/') for occ in info['occurrences'])
|
||||||
|
}
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if '--update' in sys.argv:
|
if '--update' in sys.argv:
|
||||||
translations = extract_qstr_strings(ROOT_DIR)
|
translations = shell_terms(extract_qstr_strings(ROOT_DIR))
|
||||||
FREEZE_FILE.write_text(json.dumps(sorted(translations), indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
|
FREEZE_FILE.write_text(json.dumps(sorted(translations), indent=2, ensure_ascii=False) + '\n', encoding='utf-8')
|
||||||
print(f"Froze {len(translations)} terms to {FREEZE_FILE}")
|
print(f"Froze {len(translations)} terms to {FREEZE_FILE}")
|
||||||
return 0
|
return 0
|
||||||
@@ -30,7 +39,7 @@ def main():
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
frozen = set(json.loads(FREEZE_FILE.read_text(encoding='utf-8')))
|
frozen = set(json.loads(FREEZE_FILE.read_text(encoding='utf-8')))
|
||||||
translations = extract_qstr_strings(ROOT_DIR)
|
translations = shell_terms(extract_qstr_strings(ROOT_DIR))
|
||||||
new_terms = sorted(term for term in translations if term not in frozen)
|
new_terms = sorted(term for term in translations if term not in frozen)
|
||||||
if not new_terms:
|
if not new_terms:
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user