2017-01-26 2 views
0

Не очень знакомы с perl или bash-скриптами, пытаясь написать скрипт для переключения внутренней клавиатуры (на ноутбуке с использованием внешней механической клавиатуры).bash or perl: включить внутренний скрипт клавиатуры

Переключить внутренняя клавиатура достаточно легко сделать с помощью команды Xinput:

$ xinput 
    ⎡ Virtual core pointer      id=2 [master pointer (3)] 
    ⎜ ↳ Virtual core XTEST pointer    id=4 [slave pointer (2)] 
    ⎜ ↳ Elan Touchpad        id=11 [slave pointer (2)] 
    ⎜ ↳ SINO WEALTH USB KEYBOARD     id=15 [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)] 
     ↳ Video Bus         id=7 [slave keyboard (3)] 
     ↳ Video Bus         id=8 [slave keyboard (3)] 
     ↳ Sleep Button        id=9 [slave keyboard (3)] 
     ↳ USB2.0 VGA UVC WebCam      id=10 [slave keyboard (3)] 
     ↳ Asus WMI hotkeys       id=12 [slave keyboard (3)] 
     ↳ AT Translated Set 2 keyboard    id=13 [slave keyboard (3)] 
     ↳ SINO WEALTH USB KEYBOARD     id=14 [slave keyboard (3)] 

Определить идентификатор и плывут количество AT Переведенный Set 2 клавиатуры (встроенный в клавиатуру).

$ xinput float 13 
$ xinput 
⎡ Virtual core pointer      id=2 [master pointer (3)] 
⎜ ↳ Virtual core XTEST pointer    id=4 [slave pointer (2)] 
⎜ ↳ Elan Touchpad        id=11 [slave pointer (2)] 
⎜ ↳ SINO WEALTH USB KEYBOARD     id=15 [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)] 
    ↳ Video Bus         id=7 [slave keyboard (3)] 
    ↳ Video Bus         id=8 [slave keyboard (3)] 
    ↳ Sleep Button        id=9 [slave keyboard (3)] 
    ↳ USB2.0 VGA UVC WebCam      id=10 [slave keyboard (3)] 
    ↳ Asus WMI hotkeys       id=12 [slave keyboard (3)] 
    ↳ SINO WEALTH USB KEYBOARD     id=14 [slave keyboard (3)] 
∼ AT Translated Set 2 keyboard    id=13 [floating slave] 

Чтобы установить использование клавиатуры:

$ xinput reattach 13 3 

никаких серьезных проблемы здесь, просто любопытно о написании сценария, чтобы сделать это автоматически, до сих пор у меня есть некоторый макет код, который идет как это:

#bin/bash 

val string = xinput | grep "AT keyboard" 

if(parse(string).attached) 
    val floatPartNumber = parse(string).id 
    val reattachNumber = parse(string).slaveNumber 

    # float keyboard 
    xinput float floatPartNumber 

    # create hidden file for storage 
    file = makeFile(".reattachData") 

    #add needed data to file 
    writeTOFile(file)(floatPartNumber) 
    writeTOFile(file)(reattachNumber) 
fi 
else 
    val file = openFile(".reattachData") 
    val floatPartNumber = file.lineOne 
    val reattachNumber = file.lineTwo 

    # reattach keyboard 
    xinput reattach floatPartNumber reattachNumber 
end 

Я хочу перевести это в скрипт bash или perl, что-то легко запускаемое без перескакивания через любые обручи из моей оболочки.

Либо, что может быть хорошим онлайн-ресурсом или ресурсами, для меня ссылка при создании правильного синтаксиса для этого? Или как будет выглядеть функциональная версия этого скрипта?

ответ

0

Я не знаю, выход Xinput, но, основываясь на предположении, что он поставляет линии, как вы при условии, что это будет что-то вдоль этих линий (нет возможности проверить это сейчас):

use strict; 
use warnings; 

my $search = 'AT Translated Set 2 keyboard'; 
my @xout = qx(xinput); # or use backticks instead of qx 

my ($id,$slave) = map { # search for match and capture the numbers 
    /$search.*id=(\d+)\s+\[(?:floating slave|slave keyboard \((\d+)\))\]/ 
    ? ($1,$2) :() 
    } @xout; 

if (defined($slave)) { # should be undef in case of 'floating slave' 
    if (open(my $fh, '>', '.reattachData')) { 
     $fh->print($id.$/.$slave); 
     $fh->close; 
    } 
    qx(xinput float $id); 
} 
else { 
    my @line = do { local(@ARGV) = '.reattachData';(<>) }; # read file 
    chomp(@line); 
    qx(xinput reattach $line[0] $line[1]); 
} 

Это, конечно, предполагает, что ваш поисковый запрос всегда встречается. Нет обработки ошибок там ...

+0

Спасибо, что это работает как шарм. Это нормально без обработки ошибок для моего использования, потому что это очень предсказуемая, особая ситуация, когда я запускаю этот скрипт с небольшой неопределенностью относительно жестко закодированной строки , –