จะกำหนดเค้าโครงแป้นพิมพ์ที่แตกต่างให้กับแป้นพิมพ์ USB อย่างถาวรได้อย่างไร


16

ฉันมักจะปลั๊กอินแป้นพิมพ์ USB กับแล็ปท็อปของฉัน (นอกเหนือจากจอภาพและเมาส์ภายนอกซึ่งทั้งหมดจะแปลงแล็ปท็อปของฉันไปเป็นคอมพิวเตอร์เดสก์ท็อป) และฉันชอบที่จะใช้รูปแบบแป้นพิมพ์ที่แตกต่างกัน

ฉันต้องเปลี่ยนเค้าโครงแป้นพิมพ์ปัจจุบันด้วยตนเองทุกครั้งที่ฉันเสียบแป้นพิมพ์ USB นี้

และฉันต้องการใช้วิธีอัตโนมัติสำหรับสิ่งนี้ถ้าเป็นไปได้

Raduคำตอบของคำถามที่นี่ให้เบาะแสบางอย่าง แต่ดูเหมือนว่าฉันจะต้องมีสคริปต์เริ่มต้นสำหรับงานนี้เป็น ID อุปกรณ์สำหรับแป้นพิมพ์ USB ของฉันเปลี่ยนแปลงทุกครั้งที่คอมพิวเตอร์เริ่มทำงาน

สคริปต์เริ่มต้นนี้อาจรวมถึงคำสั่งxinput -list | grep "USB Keyboard"ก่อนและคำสั่งอื่นเพื่อรับหมายเลขแป้นพิมพ์ USB แรกที่แสดงและใช้ในคำสั่งสุดท้ายเพื่อตั้งค่าเลย์เอาต์ที่ฉันเลือกสำหรับแป้นพิมพ์ USB ดังต่อไปนี้:

setxkbmap -device <NUMBER> -layout <LAYOUT>



1
@Sadi คุณหมายถึงการเปลี่ยนรัทเกอร์และธงสหรัฐคว่ำลงหลังจากการลอบสังหารดร. Martin Luther King หรือไม่? Paul Robeson: The Great Forerunnerโดย Freedomwaysที่หน้า 182
guest271314

@ guest271314 ขอบคุณมาก! แต่ฉันสงสัยว่าทำไมคุณถึงลงเอยที่นี่เพื่อให้ความเห็นเกี่ยวกับคำถามนี้: history.stackexchange.com/questions/48704/… ;-) นี่เป็นรูปแบบการประท้วงอีกรูปแบบหนึ่งที่ฉลาด แต่ฉันไม่คิดว่าสิ่งนี้จะเกิดขึ้นได้ในที่สุด เรื่องเล่าที่ฉันจำได้
Sadi

@Sadi คำถามของคุณถูกลบไปที่การเมือง
guest271314

คำตอบ:


15

หลังจากการวิจัยเล็กน้อยฉันได้พบวิธีแก้ปัญหาแม้ว่าฉันจะยังคงเปิดรับคำตอบอื่น ๆ (น่าจะดีกว่า)

นี่คือสคริปต์เริ่มต้น (ซึ่งสามารถเพิ่มลงในแอปพลิเคชันเริ่มต้น ) ซึ่งจะตั้งค่าตัวแปรusbkbd_layout ที่ใส่ไว้ใน maually เป็นรหัสอุปกรณ์usbkbdที่พบในรายการ xinput :

#!/bin/bash
usbkbd=`xinput -list | grep -c "USB Keyboard"`
if [[ "$usbkbd" -gt 0 ]]
then
    usbkbd_ids=`xinput -list | grep "USB Keyboard" | awk -F'=' '{print $2}' | cut -c 1-2`
    usbkbd_layout="tr(f)"
    for ID in $usbkbd_ids
    do
      setxkbmap -device "${ID}" -layout "${usbkbd_layout}"
    done
fi
exit 0

สคริปต์นี้มีประโยชน์มาก (และมีเสถียรภาพมากขึ้น) สำหรับสถานการณ์ที่ผู้ใช้เริ่มใช้งานแล็ปท็อปในการตั้งค่าเดสก์ท็อป (ด้วยแป้นพิมพ์ภายนอกเมาส์และจอมอนิเตอร์ ฯลฯ ) และสามารถเรียกใช้ด้วยตนเองได้ทุกครั้งที่เสียบ USB ภายนอก ...

================================================== ========================

การแก้ปัญหาที่ดีกว่า (เกือบจะสมบูรณ์แบบ) - พบขอบคุณMinimusHeximusและผู้ที่เกี่ยวข้องกับหัวข้อที่เขากล่าวถึงในความคิดเห็นของเขาด้านล่าง:

ตอนนี้ฉันสามารถปลั๊กอินแป้นพิมพ์ USB ของฉันและใช้เค้าโครงแป้นพิมพ์ (TR-F) ที่แตกต่างกันโดยอัตโนมัติในขณะที่ยังคงรักษารูปแบบแป้นพิมพ์เริ่มต้น (TR-Q) ไว้ในแล็ปท็อปของฉัน!

นี่คือไฟล์และเนื้อหาที่ทำให้เป็นไปได้:

/etc/udev/rules.d/00-usb-keyboard.rules

ATTRS{idVendor}=="09da", ATTRS{idProduct}=="0260", OWNER="sadi"
ACTION=="add", RUN+="/home/sadi/.bin/usb-keyboard-in_udev"
ACTION=="remove", RUN+="/home/sadi/.bin/usb-keyboard-out_udev"

/home/sadi/.bin/usb-keyboard-in_udev

#!/bin/bash
/home/sadi/.bin/usb-keyboard-in &

/home/sadi/.bin/usb-keyboard-in

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/sadi/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
usbkbd_id=`xinput -list | grep "USB Keyboard" | awk -F'=' '{print $2}' | cut -c 1-2 | head -1`
usbkbd_layout="tr(f)"
if [ "${usbkbd_id}" ]; then
    gsettings set org.gnome.settings-daemon.plugins.keyboard active false
    sleep 2
    setxkbmap -device "${usbkbd_id}" -layout "${usbkbd_layout}"
fi

/home/sadi/.bin/usb-keyboard-out_udev

#!/bin/bash
/home/sadi/.bin/usb-keyboard-out &

/home/sadi/.bin/usb-keyboard-out

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/sadi/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
gsettings set org.gnome.settings-daemon.plugins.keyboard active true

หมายเหตุ:

  1. แน่นอนว่าไฟล์ทั้งสี่ไฟล์ในโฟลเดอร์ "bin" ของคุณควรมีสิทธิ์ที่จำเป็น (อ่านได้และสามารถเรียกใช้งานได้) ซึ่งอาจมีการใช้งานเช่นคำสั่ง Terminal เช่น chmod - 755 /home/sadi/.bin/usb-keyboard-*
  2. บางครั้งหลังจากเสียบแป้นพิมพ์ USB แล้วมันยังคงใช้รูปแบบแป้นพิมพ์ (ค่าเริ่มต้น) เหมือนเดิมและเปลี่ยนเป็นรูปแบบที่ระบุเมื่อลองครั้งที่สอง
  3. รูปแบบเฉพาะของแป้นพิมพ์ USB ไม่มีผลในหน้าจอเข้าสู่ระบบ (เมื่อคุณออกจากระบบ)
  4. หากคุณใช้พาร์ติชันแยกต่างหากสำหรับ/ homeอาจเป็นความคิดที่ดีกว่าที่จะวางสคริปต์สี่ตัวไว้ในรูทพาร์ติชันเช่น/ usr / local / binและแก้ไขเนื้อหาของไฟล์ทั้งหมดตามลำดับเนื่องจากบางครั้ง udev อาจมองหา ไฟล์เหล่านั้นก่อน/พาร์ติชันของคุณถูกเมาท์และทำให้เกิดปัญหา

เพื่อปรับการตั้งค่านี้ตามความต้องการที่แตกต่าง:

  1. ผู้ขายคีย์บอร์ด USB และรหัสผลิตภัณฑ์ควรเปลี่ยนตามผลลัพธ์ของคำสั่งlsusb(ตัวอย่างเช่นlsusbเอาท์พุทของฉันมีไว้สำหรับคีย์บอร์ด USB ของฉัน:Bus 001 Device 006: ID 09da:0260 A4 Tech Co., Ltd )
  2. OWNER และชื่อไดเรกทอรีผู้ใช้ทั้งหมดควรเปลี่ยนจาก "sadi" เป็นชื่ออื่น
  3. usbkbd_id อาจต้องการการปรับแต่งเล็กน้อยเพื่อคว้า id อุปกรณ์ที่ถูกต้อง (ตัวอย่างเช่นผลลัพธ์ของคำสั่งxinput -list | grep "USB Keyboard"ให้ฉันสองบรรทัด↳ USB Keyboard id=14 [slave keyboard (3)]และ↳ USB Keyboard id=16 [slave keyboard (3)]จากนั้นจะถูกกรองโดยawkใช้ "=" เป็นตัวคั่นฟิลด์และจับส่วนที่สองจากนั้นตัดเฉพาะ สองหลักแรกแล้วใช้เฉพาะค่าในบรรทัดแรก)
  4. ค่าสำหรับ usbkbd_layout อาจเป็นทางเลือกที่ถูกต้องอื่น ๆ

มันจะดีมากถ้าอีกสคริปต์ที่คล้ายกันจะทำงานโดยอัตโนมัติเมื่อแป้นพิมพ์ USB เสียบในฐานะถาม (ไม่ตอบยัง) ที่นี่: askubuntu.com/questions/284224/...
Sadi

2
มันจะมีประโยชน์ถ้าคุณสามารถโพสต์คำตอบอื่นจากกระทู้ยุ่งเหยิงนี้: superuser.com/questions/249064/ …
nano - ผสานฉัน

1
@MinimusHeximus ขอบคุณหนึ่งล้าน !!! หลังจากผ่านเธรดที่คุณได้ชี้ให้เห็นและทำการทดลองและข้อผิดพลาดในที่สุดฉันก็แยกมันออกและจะเพิ่มโซลูชั่น hotplugging แบบใหม่ที่เกือบสมบูรณ์แบบด้านบน!
Sadi

1
แป้นพิมพ์ของฉันด้วยเหตุผลบางอย่างมีสองรหัสดังนั้นแทนที่จะใช้ผมต้องใช้IF FORมันใช้งานได้สำหรับฉันตอนนี้ขอบคุณ! gist.github.com/zvictor/193b567c14b5b6a679fe
zVictor

1
@Sadi ฉันเป็นแค่ผู้ใช้โดยเฉลี่ยเท่านั้นเอง ฉันจะโพสต์โซลูชันของฉันที่นี่ บางทีคุณสามารถนำความคิดบางอย่างออกจากที่
kleinfreund

9

หนึ่งสามารถระบุตัวเลือกไดรเวอร์ X11 ภายในกฎ udev ไม่จำเป็นต้องใช้สคริปต์ที่กำหนดเอง ตัวอย่างเช่นนี่คือเนื้อหาของ/etc/udev/rules.d/99-usb-kbd.rulesของฉัน

ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2323", ENV{XKBMODEL}="pc104", ENV{XKBLAYOUT}="us", ENV{XKBVARIANT}="euro", ENV{XKBOPTIONS}="compose:caps"

กฎนี้ทำให้มั่นใจได้ว่าแป้นพิมพ์ USB เฉพาะใช้รูปแบบสหรัฐใน Xorg (แป้นพิมพ์ภายในของแล็ปท็อปของฉันคือภาษาเยอรมันและนี่ก็เป็นเค้าโครงหลักของฉันด้วย) จุดสำคัญ:

  1. คุณสามารถค้นหาidVendorและidProductใช้งานอุปกรณ์ของคุณได้lsusbหรือevtest
  2. คุณสามารถใช้เลย์เอาต์ใดก็ได้จาก /usr/share/X11/xkb/symbolsจาก ให้ความสนใจเพื่อระบุทั้งรูปแบบที่ถูกต้องและชุดตัวเลือกที่ถูกต้อง
  3. ชื่อไฟล์จะต้องเริ่มต้นด้วยตัวเลข> 64 เพื่อให้การตั้งค่าเพื่อเขียนทับการตั้งค่าความกว้างของระบบที่ระบุ /lib/udev/rules.d/64-xorg-xkb.rules
  4. ตรวจสอบให้แน่ใจว่าการจัดการโครงร่าง Gnome / KDE ไม่ได้เขียนทับการตั้งค่าของคุณ

ถอดปลั๊กและคีย์บอร์ดของคุณและค้นหา/var/log/Xorg.0.logปัญหาที่อาจเกิดขึ้น คุณยังสามารถใช้udevadm infoเพื่อตรวจสอบว่าการตั้งค่าถูกนำไปใช้อย่างถูกต้อง
pavel

ยูเรก้า! วิธีการแก้ปัญหาสมาร์ทของคุณเริ่มทำงานเฉพาะหลังจากที่ผมเข้าคำสั่งนี้ (ทุกครั้ง) เพื่อแทนที่การตั้งค่า GConf gsettings set org.gnome.settings-daemon.plugins.keyboard active falseปัจจุบัน: หากคุณยังเพิ่มดังกล่าวทราบผมจะพยายามที่จะทำเครื่องหมายแสดงความนับถือเป็นคำตอบ (แทนเงอะงะที่ยาวและคดเคี้ยวถนน ;-)
Sadi

มันยอดเยี่ยมมาก บน Ubuntu 14.04 รูปแบบ / โครงร่าง / ตัวเลือก / อื่น ๆ ที่เป็นไปได้ มีการระบุไว้ที่/usr/share/X11/xkb/rules/evdev.lst
Jon

2
น่าเสียดายโซลูชันที่ดีและใช้งานง่ายนี้หยุดทำงานให้ฉันหลังจากอัปเกรดเป็นUbuntu Gnome 17.04 :-(
Sadi

พยายาม Linux Mint 18.2 ซึ่งใช้ Ubuntu 16.04 LTS กับรุ่น udev 229-4ubuntu19ไม่มีผลอีก :-( ความคิดเห็นใด ๆ เกี่ยวกับพฤติกรรมของ udev นี้แปลก ???
Sadi

2

ฉันเพิ่งปรับปรุงโซลูชันนี้สำหรับแป้นพิมพ์bépo Typematrix (รุ่นภาษาฝรั่งเศสของ dvorak ที่ยอดเยี่ยมที่ปรับปรุงแล้ว) และในบริบทของระบบที่กว้าง (สมมติว่าคุณมีการเข้าถึงรูทเครื่อง) ต้องการเพียง 3 ไฟล์ในการทำงาน คุณสามารถปรึกษา logfile ในกรณีที่ล้มเหลวในการหาสิ่งที่ล้มเหลว

/etc/udev/96-usb-keyboard.rules

ATTRS{idVendor}=="1e54", ATTRS{idProduct}=="2030", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/etc/udev/bepo-typematrix-kbd.sh in"
ATTRS{idVendor}=="1e54", ATTRS{idProduct}=="2030", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/etc/udev/bepo-typematrix-kbd.sh out"

/etc/udev/bepo-typematrix-kbd.sh (จำเป็นอย่างยิ่งที่จะใช้สคริปต์พื้นหลังระดับกลาง)

#!/bin/bash

dir=$(dirname $0)
command=$(basename $0)
command=$dir/${command%\.sh}
arg=$1 # must be "in" or "out"
LOG=/var/log/bepo-typematrix-kbd.log

[ -x "$command" ] && $command $arg >$LOG 2>&1 &

/ etc / udev / bepo-typematrix-kbd

#!/bin/bash
# jp dot ayanides at free.fr

MODEL="tm2030USB-102" # keyboard model
DISPLAY=':0.0'
GSETTING=/usr/bin/gsettings
XSET=/usr/bin/xset
SETXKBMAP=/usr/bin/setxkbmap
XINPUT=/usr/bin/xinput

USER=$(/usr/bin/who | /usr/bin/awk -v DIS=':0' '{if ($2==DIS) print $1}')
eval HOME=~$USER
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME

case $1 in
        'in')
                BEPO=$($XINPUT list --short | grep "TypeMatrix.com USB Keyboard" | grep keyboard | sed -e 's/^.*id=\([0-9]\+\).*/\1/g')
                if [ -n "$BEPO" ]; then
                        [ -x $GSETTING ] && $GSETTING set org.gnome.settings-daemon.plugins.keyboard active false
                        # apparently nothing to do with TDE (trinity KDE)
                        for ID in $BEPO; do # case of multiple bepo keyboard is taken into account
                                [ -x $SETXKBMAP ] && $SETXKBMAP -device $ID -model $MODEL -layout fr -variant bepo
                        done
                fi
                echo "bépo keyboard id(s) is (are) $BEPO"
                [ -x $XSET ] && $XSET -display $DISPLAY r rate 250 40
        ;;
        'out')
                # apparently nothing to do with TDE (trinity KDE)
                [ -x $GSETTING ] && $GSETTING set org.gnome.settings-daemon.plugins.keyboard active true
        ;;
        *)
                printf "wrong parameter: $1\n"
                exit 1
        ;;
esac

1

หลังจากเล่นซอไปเยอะแล้วนี่คือสิ่งที่ฉันต้องทำตอนนี้ บางทีฉันอาจจะเขียนบทความที่แปลกประหลาดและเผยแพร่รหัสภายในที่เก็บถ้ามันน่าสนใจ


ตั้งค่ากฎใหม่ตั้งไว้สำหรับ udev เช่นนั้น:

 sudo gedit /etc/udev/rules.d/80-external-keyboard.rules

กฎควรจะเรียกเชลล์สคริปต์ทุกครั้งที่มีการกระทำบางอย่างเกิดขึ้นจากอุปกรณ์ที่มีการรวมกันของผู้ขายและรหัสผลิตภัณฑ์

ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"

หลังจากเพิ่มชุดกฎใหม่แล้วให้เริ่มบริการ udev ใหม่:

sudo service udev restart

หมายเหตุ: ฉันไม่สามารถบรรลุผลลัพธ์ที่เชื่อถือได้ด้วยการระบุกฎการจับคู่ที่เฉพาะเจาะจงมากขึ้นในไฟล์นั้น สิ่งสำคัญที่สุดการเพิ่มACTIONกฎการจับคู่ไม่ทำงาน เท่าที่ฉันสามารถบอกได้สคริปต์ก็ถูกเรียกใช้แล้ว เมื่อเพิ่มACTION=="add"สคริปต์จะยังคงถูกเรียกใช้เมื่อนำอุปกรณ์ออก แปลกและสับสนมาก

อย่างไรก็ตามการกระทำที่เรียกใช้กฎ udev จะมีให้สำหรับสคริปต์ที่เรียกว่าดังที่แสดงด้านล่าง


ถัดไปสคริปต์ตัวเอง ก็ไม่มาก บันทึกwrapperคำต่อท้ายในชื่อไฟล์ สิ่งนี้บ่งชี้ว่านี่ไม่ใช่สคริปต์จริง แต่เป็น wrapper ที่เรียกใช้สคริปต์และดำเนินการในพื้นหลังเพื่อให้ udev สามารถเสร็จสิ้นกระบวนการได้

~/.bin/switch-kb-layout-wrapper.sh:

#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &

ตัวแปรACTIONมีแอ็คชัน udev ที่ถูกทริกเกอร์โดยอุปกรณ์ มันให้ค่าเช่นadd(อุปกรณ์เสียบอยู่) และremove(อุปกรณ์ถูกลบ) เราจะใช้สิ่งเหล่านี้ในภายหลัง

~/.bin/switch-kb-layout.sh:

#!/bin/sh

sleep 1

# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME

udev_action=$1
log_file="$HOME/switch-kb-layout.log"

if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
    echo "Other action. Aborting." >> $log_file
    exit 1
fi

internal_kb_layout="de"
internal_kb_variant=""

external_kb_layout="us"
external_kb_variant="altgr-intl"

kb_layout=""
kb_variant=""

if [ "${udev_action}" = "add" ]; then
    kb_layout=$external_kb_layout
    kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
    kb_layout=$internal_kb_layout
    kb_variant=$internal_kb_variant
fi

setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
    setxkbmap -variant "${kb_variant}"
    echo "set variant:" "$kb_variant" >> $log_file
fi

แทนที่ชื่อผู้ใช้ของฉันด้วยการตั้งค่าHOMEตัวแปร ( $(whoami)จะไม่ทำงานที่นี่เนื่องจากจะไม่ถูกเรียกโดยผู้ใช้ของคุณ แต่โดยroot)

sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh

เพื่อจุดประสงค์ในการทดสอบฉันเพิ่มบางบรรทัดที่บันทึกเหตุการณ์บางอย่างลงในไฟล์ในโฮมไดเร็กตอรี่ของฉันเพื่อดูว่าทุกอย่างใช้งานได้หรือไม่ คุณสามารถลบสิ่งเหล่านี้ได้อย่างหมดจด


ในที่สุดสคริปต์เหล่านี้จำเป็นต้องมีสิทธิ์ดำเนินการ นอกจากนี้อาจเป็นสิ่งสำคัญที่จะต้องทราบว่าสคริปต์เหล่านี้จะถูกเรียกใช้โดยrootผู้ใช้ดังนั้นควรระมัดระวังสิ่งที่คุณทำในที่นั้น

chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh 

1
ขอบคุณมากใช้งานได้ดี! ฉันทำให้มันทำงานได้ดี อย่างไรก็ตามทำไมฉันเห็น 14 ครั้ง "เพิ่มการกระทำ" และ 3 ครั้ง "การกระทำอื่น ๆ " เมื่อฉันปลั๊กอินคำสั่งภายนอกของฉันเป็นเรื่องลึกลับซึ่งฉันจะพยายามแก้ไขในภายหลัง แต่ฉันพบว่ามันเป็นการดีกว่าที่จะเพิ่ม Device ID ลงในคำสั่ง setxkbmap เพื่อให้แป้นพิมพ์ภายในยังคงสามารถใช้งานได้เช่นเดียวกับแป้นพิมพ์ภายนอกเช่นเดียวกับในสคริปต์เริ่มอัตโนมัติอัตโนมัติล่าสุดของฉัน ฉันจะให้นี้ลองสองสามวันและกลับมาและดูว่าคุณสามารถถือเป็นคำตอบที่อาจจะมีการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่นี่และมี ;-)
Sadi

ยังได้รับสายบันทึกเดียวกันหลายครั้ง จับได้ดีบน ID อุปกรณ์ในคำสั่ง
kleinfreund

@Sadi นอกจากนี้ผมคิดว่าสายไม่สามารถทำงานได้ตามที่ตั้งใจไว้เป็นสคริปต์ที่จะดำเนินการโดยgsettings set org.gnome.settings-daemon.plugins.keyboard active false rootในการทดสอบของฉันบรรทัดไม่มีผลต่อการตั้งค่านั้น
kleinfreund

ผมคิดว่าในสถานการณ์เช่นนี้มันอาจจะเป็นความคิดที่ดีที่จะรันคำสั่งgsettings set org.gnome.settings-daemon.plugins.keyboard active falseเป็นผู้ใช้และทุกครั้งและจากนั้นใช้สคริปต์นี้ได้โดยไม่ต้องgsettings setใช้คำสั่ง ...
Sadi

จนถึงตอนนี้ฉันเห็นแล้วว่าเรายังไม่สามารถทำงานนี้ได้อย่างราบรื่น บางครั้งรูปแบบแป้นพิมพ์จะไม่ถูกใช้งานโดย udev และคุณต้องปิดและเสียบอีกครั้ง ฉันคิดว่าฉันจะกลับไปที่สคริปต์เริ่มต้นของฉัน (อัปเดต) ที่ด้านบนของคำตอบของฉันอีกครั้งซึ่งให้บริการฉันอย่างราบรื่นมากขึ้น - เฉพาะฉันต้องเรียกใช้ด้วยตนเองถ้าฉันเสียบแป้นพิมพ์ภายนอกหลังจากเริ่มต้น ดูเหมือนว่า udev เป็นรถบั๊กเล็กน้อยที่สามารถเห็นได้ในการกระทำซ้ำ ๆ มากมาย (มันใช้สคริปต์ wrapper หลายครั้งและในรูปแบบที่แปลก) ...
Sadi

1

ฉันมีปัญหาสิทธิ์ใช้งานสคริปต์ดำเนินการโดย udev ฉันแก้ไขด้วย sudo ดังนี้

# Estract id of MX3 keyboard devices that present themself as "123 COM Smart Control"
    IDLIST=$(sudo -u max /usr/bin/xinput -list | grep "123 COM Smart Control" | grep keyboard | sed -e 's/^.*id=\([0-9]\+\).*/\1/g')

ตั้งค่าการแมปคีย์บอร์ดสำหรับแต่ละอุปกรณ์

    for ID in $IDLIST; do
            sudo -u max /usr/bin/setxkbmap -device $ID -layout "${kb_layout}" -display :0
    done

ฉันคิดว่ามันจะมีประโยชน์มากขึ้นถ้าคุณเขียนได้เต็มที่ ตัวอย่างเช่นคุณใส่บรรทัดข้างบนไว้ที่ใด
Sadi

0

คุณยังสามารถกำหนดได้ในไฟล์กำหนดค่า Xorg

มีการจัดโครงร่างในคำตอบ stackexchange นี้: /superuser//a/946575/437492


นั่นคงจะดีมากถ้าฉันสามารถทำให้มันใช้งานได้ แต่การใช้รุ่นล่าสุด LTS, อูบุนตู 18.04 ผมสามารถเห็นเฉพาะ/usr/share/X11/xorg.conf.d/ไดเรกทอรีที่มีไฟล์ชื่อ40 libinput.conf ดังนั้นฉันก็เพิ่มส่วนสำหรับแป้นพิมพ์ภายนอกในไฟล์นั้น การใช้libinputหรือevdevและชื่อผู้จำหน่ายที่ยาวและสั้นลงฉันไม่สามารถรับผลลัพธ์ใด ๆ ได้ ความคิดใด ๆ
Sadi

@Sadi: ถ้าคุณอ่านเกี่ยวกับการกำหนดค่า Xorg คุณจะพบว่าคุณสามารถเพิ่มไฟล์ใหม่ลงไปได้/etc/X11/xorg.conf.d/(นั่นคือที่ที่ควรไป)
Golar Ramblar

ขอบคุณ ฉันอ่านค่อนข้างน้อยและลองใช้ "/etc/X11/xorg.conf.d/30-keyboard.conf" ก่อน ฉันจะลองเสี่ยงโชคของฉันภายใต้คำตอบ stackexchange ดังกล่าวข้างต้นแล้ว ;-)
Sadi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.