Wie führe ich ein Skript aus, wenn ich zwischen Tastaturlayouts wechsle?

Wie führe ich ein Skript aus, wenn ich zwischen Tastaturlayouts wechsle?

Ich verwende mehr als ein Tastaturlayout und möchte eine Möglichkeit finden, ein Skript auszuführen, wenn ich zwischen den Layouts wechsle.

Ist das möglich?

Bisher kann ich einem Skript eine Verknüpfung wie folgt zuweisen:

#!/bin/bash

#switch between two layouts (English and Greek in this case)
current_layouts=$(gsettings get org.gnome.libgnomekbd.keyboard layouts)

if [ "$current_layouts" = "us" ]; then
    gsettings set org.gnome.libgnomekbd.keyboard layouts "['gr']"
else 
    gsettings set org.gnome.libgnomekbd.keyboard layouts "['us']"
fi

exec /path/to/another/script

Aber mit dieser Methode kann ich nur diese Tastenkombination zum Wechseln zwischen Layouts verwenden und die Tastaturanzeige verschwindet aus dem Statusmenü, was unangenehm ist.

Antwort1

dconf watchkann als Ereignisempfänger verwendet werden, Beispiel (in Ubuntu 13.10/14.04):

dconf watch /org/gnome/desktop/input-sources/current | xargs -L 2 sh -c "echo kbd layout changed" &

Antwort2

gsettings monitor org.gnome.desktop.input-sources mru-sources \
        | xargs -L1 bash -c 'source /path/to/your/script.sh'

Antwort3

Ich würde es andersherum machen, ein Skript ausführen, das das Layout ändert. Auf diese Weise können Sie mit demselben Skript alles andere tun, was Sie wollen. Leider ist es ziemlich schwierig, Ihr aktuelles Tastaturlayout herauszufinden. Ich habe keinen Ansatz gefunden, der funktioniert füralleMethoden zum Layoutwechsel. Aus irgendeinem Grund macht es einen Unterschied, ob Sie mit setxkbmapoder über die GUI-Tastenkombinationen wechseln.

Meine Problemumgehung besteht also darin, immer mit zu wechseln setxkbmap. Ich habe ein Skript, das aufruft setxkbmap, und ich habe dieses Skript an eine Verknüpfung in meiner Desktopumgebung gebunden, damit ich problemlos wechseln kann. Das folgende Beispiel gilt für griechische und US-Layouts. Sie müssen es an Ihr Setup anpassen:

#!/usr/bin/env bash
key=`xmodmap -pke | grep -w "59" | awk '{print \$NF}'` 
## If this is the "us" layout, that will return "less"
if [ $key == "less" ]; then
    setxkbmap gr
    ## Add other things to be done here
else
    setxkbmap us
    ## Add other things to be done here
fi

verwandte Informationen