Rebindir chaves dependendo do programa com foco

1

Eu quero fazer Como mapear uma chave para outro no meu teclado? , mas tem diferentes mapeamentos para diferentes programas.

Especificamente, quero mapear a tecla F6 para F7 sempre que uma janela específica tiver o foco.

Eu uso o xUbuntu 14.04 se isso faz diferença.

    
por David Oneill 24.09.2014 / 16:51

1 resposta

0

Solução usando xdotool

Eu não acho que exista um DE que tenha uma opção embutida para isso, mas com a ajuda de xdotool podemos escrever um script personalizado que deve fazer o truque:

#!/bin/bash

# 'f6f7swap.sh' by Glutanimate
# 
# Reassign F6 to F7 if specific application has focus
# Dependencies: xdotool x11-utils
# 
# Usage:    f6f7swap.sh '<full window class>'
# Example:  f6f7swap.sh '"gnome-terminal", "Gnome-terminal"'

# --Variables--

WinClass="$1"

# --Main--

# get currently active window ID
ActiveWinID="$(xdotool getactivewindow)"
# get window class of active window
ActiveWmClass="$(xprop -id "$ActiveWinID" \
  | grep "WM_CLASS" \
  | awk -F' = ' '{print $2}' )"

# Compare with provided window class
if [[ "$ActiveWmClass" = "$WinClass" ]]; then
  echo "Target window found. Sending 'F7'"
  xdotool key F7
else
  echo "Target window not found. Sending 'F6'"
  xdotool key F6
fi

Instruções

  1. Verifique se você tem xdotool e xprop instalado ( sudo apt-get install xdotool x11-utils )
  2. Salve este script como f6f7swap.sh e torne-o executável
  3. Determine a classe da janela da sua janela / aplicativo de destino executando xprop | grep WM_CLASS e clicando em uma janela de amostra
  4. Execute f6f7swap.sh com a classe de janela inteira como um argumento, por exemplo:

    f6f7swap.sh '"gnome-terminal", "Gnome-terminal"'
    

    f6f7swap.sh tentará corresponder à janela ativa com a classe de janela fornecida. Se eles corresponderem, o script enviará 'F7'; se não, enviará 'F6'.

  5. Vincule o comando completo (por exemplo, f6f7swap.sh '"gnome-terminal", "Gnome-terminal"' ) a F6 nas preferências do seu teclado

Script atualizado

Segue-se uma versão mais genérica do script que permite a troca de qualquer chave à sua escolha:

#!/bin/bash

# 'keyswap.sh' by Glutanimate
# 
# Reassign keys if specific application has focus
# Dependencies: xdotool
# 
# Usage:    keyswap.sh '<full window class>' '<input key>' '<output key>'
# Example:  keyswap.sh '"gnome-terminal", "Gnome-terminal"' 'F6' 'F7'

# --Variables and Checks--

Usage="Usage: keyswap.sh '<full window class>' '<input key>' '<output key>'"

if [[ "$#" != "3" ]]; then
  echo "Error: Insufficient arguments"
  echo "$Usage"
  exit 1
fi

WinClass="$1"
OrigKey="$2"
ReplKey="$3"

# --Main--

# get currently active window ID
ActiveWinID="$(xdotool getactivewindow)"
# get window class of active window
ActiveWmClass="$(xprop -id "$ActiveWinID" \
  | grep "WM_CLASS" \
  | awk -F' = ' '{print $2}' )"

# Compare with provided window class
if [[ "$ActiveWmClass" = "$WinClass" ]]; then
  echo "Target window found. Sending $ReplKey"
  xdotool key "$ReplKey"
else
  echo "Target window not found. Sending $OrigKey"
  xdotool key "$OrigKey"
fi

Invoque-o com:

keyswap.sh '<full window class>' '<input key>' '<output key>'

Por exemplo:

keyswap.sh '"gnome-terminal", "Gnome-terminal"' 'F6' 'F7'
    
por Glutanimate 25.09.2014 / 22:37