Bloqueie o teclado do laptop embutido, mas mantenha um teclado USB externo funcionando

4

Eu tenho um laptop, mas também um teclado USB externo conectado a ele. É de alguma forma possível bloquear o teclado embutido do laptop (ou seja, teclas pressionadas não devem ter efeito), mas manter o externo responsivo?

Estou executando o Ubuntu Gnome 16.04. Meu laptop é o Lenovo ThinkPad T420.

    
por zegkljan 31.08.2016 / 15:09

1 resposta

7

Sim, isso deve ser possível, com o uso de xinput .

Para começar, execute xinput list em um terminal. Você deve ver algo semelhante ao seguinte:

zachary@MCServer:~$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]

Agora, você provavelmente verá dois teclados, em vez de apenas um, já que tem dois teclados conectados. Recomendo desconectar o teclado USB e executar o comando.

Anote o ID de Virtual core XTEST keyboard . No meu caso, é 5 .

Conecte o teclado USB, já que você está prestes a desativar o teclado interno.

Execute este comando:

xinput set-prop 5 "Device Enabled" 0

e substitua 5 pelo ID do seu dispositivo.

Para reativar o teclado:

xinput set-prop 5 "Device Enabled" 1'

substitua 5 pelo ID do seu dispositivo.

Você também pode colocá-los em scripts separados, se desejar, e executá-los no terminal (ou criar .desktop arquivos para os scripts criados).

Editar:
Se você quiser, eu fiz um script que irá verificar o estado do dispositivo especificado em xinput e alterná-lo (para on se off, para off if on). Você precisará alterar a variável device para o ID correspondente.

#!/bin/bash

device=5 #Change this to reflect your device's ID

output=$(xinput list-props $device | awk '/Device Enabled/{print }')

if [ $output == 1 ]
  then
    xinput set-prop $device "Device Enabled" 0
elif [ $output == 0 ]
  then
    xinput set-prop $device "Device Enabled" 1
else
  echo "Something's up."
fi

Editar 2:
Script aprimorado - detecção automática de ID de dispositivo (desde que seu nome seja corrigido) e notificações na área de trabalho.

#!/usr/bin/env bash

# name of the device - we hope this will not change
DEVNAME="AT Translated Set 2 keyboard"
# here we find the device ID corresponding to the name
device=$(xinput list | grep "${DEVNAME}" | sed "s/.*${DEVNAME}.*id=\([0-9]*\).*//g")
# here we get the enabled state
state=$(xinput list-props $device | awk '/Device Enabled/{print }')

if [ ${state} == 1 ]; then
    # if it is enabled, disable it and show a notification
    xinput set-prop ${device} 'Device Enabled' 0
    notify-send -u normal "Keyboard lock" "Keyboard \"${DEVNAME}\" (id=${device}) was disabled."
elif [ ${state} == 0 ]; then
    # if it is disabled, enable it and show a notification
    xinput set-prop ${device} 'Device Enabled' 1
    notify-send -u normal "Keyboard lock" "Keyboard \"${DEVNAME}\" (id=${device}) was enabled."
else
    # some weird state - do nothing and show critical notification
    notify-send -u critical "Keyboard lock" "Keyboard \"${DEVNAME}\" (id=${device}) is neither enabled nor disabled. State is \"${state}\""
fi
    
por TheWanderer 31.08.2016 / 15:18