Quy tắc udev để tự động tải bố cục bàn phím khi cắm bàn phím usb


24

Tôi đang cố tải bố cục bàn phím mới khi tôi cắm bàn phím usb nhưng quy tắc udev của tôi không hoạt động.

SUBSYSTEM == "đầu vào", ATTR {idVendor} == "062a", ATTR {id SẢNt} == "0201", GOTO = "usb_xmodmap_auto"

LABEL = "usb_xmodmap_auto"
HÀNH ĐỘNG == "thêm", RUN + = "/ usr / bin / xmodmap ~ / .usbXmodmap"
HÀNH ĐỘNG == "xóa", RUN + = "/ usr / bin / xmodmap ~ / .pndXmodmap"

Tôi đã tải lại các quy tắc bằng cách sử dụng:

> điều khiển sudo udevadm - quy tắc tải lại

và bằng cách khởi động lại hệ thống nhưng khi tôi cắm bàn phím usb, xmodmap ban đầu vẫn được tải và do đó bố trí bàn phím bị sai, nhưng nếu tôi chạy lệnh trong thiết bị đầu cuối

> / usr / bin / xmodmap ~ / .usbXmodmap
hoặc là
> / usr / bin / xmodmap ~ / .pndXmodmap

họ làm việc tốt

hy vọng có thể giúp đỡ.

Chỉnh sửa:

chỉ để giúp thêm tôi đã chạy một số bài kiểm tra udevadm:

> kiểm tra udevadm --action = add /devices/pl platform / eci-omap.0 / usb1 / 1/1/2/1/2: ​​3, 1

đầu ra:

run_command: đang gọi: kiểm tra
udevadm_test: phiên bản 151
Chương trình này chỉ để gỡ lỗi, nó không chạy bất kỳ chương trình nào,
được chỉ định bởi một phím RUN. Nó có thể hiển thị kết quả không chính xác, bởi vì
một số giá trị có thể khác hoặc không có sẵn khi chạy mô phỏng.

[...]
parse_file: đọc '/etc/udev/rules.d/usb-keyboard.rules' dưới dạng tệp quy tắc
udev_rules_new: quy tắc sử dụng 100572 byte mã thông báo (8381 * 12 byte), bộ đệm 21523 byte
udev_rules_new: chỉ mục tạm thời đã sử dụng 35380 byte (1769 * 20 byte)
udev_device_new_from_syspath: thiết bị 0x3b4d8 có devpath '/devices/pl platform / eci-omap.0 / usb1 / 1/1/2/1/2: ​​3/1
udev_rules_apply_to_event: RUN '/ sbin / modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rules giáp
udev_rules_apply_to_event: RUN 'socket: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules:2
udev_rules_apply_to_event: RUN '/ sbin / modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules:31
udev_rules_apply_to_event: RUN 'socket: / org / kernel / udev / màn hình' /etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .usbXmodmap' /etc/udev/rules.d/usb-keyboard.rules:4
udevadm_test: UDEV_LOG = 6
udevadm_test: DEVPATH = / thiết bị / nền tảng / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / đầu vào / đầu vào10
udevadm_test: SẢN PHẨM = 3 / 62a / 201/110
udevadm_test: NAME = "Bàn phím tương thích USB"
udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udevadm_test: UNIQ = ""
udevadm_test: EV == 1f
udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udevadm_test: REL == 143
udevadm_test: ABS == 1 0
udevadm_test: MSC == 10
udevadm_test: MODALIAS = input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E 2 18D, 192.193.195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r0,1,6,8, a20, m4, lsfw
udevadm_test: ACTION = thêm
udevadm_test: SUBSYSTEM = đầu vào
udevadm_test: run: '/ sbin / modprobe -b đầu vào: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,88,89 , 8, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1 , B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B , 17F, 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1 , 6,8, a20, m4, lsfw '
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ sbin / modprobe input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,88,89,8A , 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2 , B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17 , 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1 , 8, a20, m4, lsfw '
udevadm_test: run: 'socket: / org / kernel / udev / màn hình'
udevadm_test: chạy: '/ usr / bin / xmodmap ~ / .usbXmodmap'

> kiểm tra udevadm --action = remove /devices/pl platform / eci-omap.0 / usb1 / 1/1/2/1/2: ​​3, 1

đầu ra:

run_command: đang gọi: kiểm tra
udevadm_test: phiên bản 151
Chương trình này chỉ để gỡ lỗi, nó không chạy bất kỳ chương trình nào,
được chỉ định bởi một phím RUN. Nó có thể hiển thị kết quả không chính xác, bởi vì
một số giá trị có thể khác hoặc không có sẵn khi chạy mô phỏng.

[...]
parse_file: đọc '/etc/udev/rules.d/usb-keyboard.rules' dưới dạng tệp quy tắc
udev_rules_new: quy tắc sử dụng 100572 byte mã thông báo (8381 * 12 byte), bộ đệm 21523 byte
udev_rules_new: chỉ mục tạm thời đã sử dụng 35380 byte (1769 * 20 byte)
udev_device_new_from_syspath: thiết bị 0x3b4d8 có devpath '/devices/pl platform / eci-omap.0 / usb1 / 1/1/2/1/2: ​​3/1
udev_rules_apply_to_event: RUN 'socket: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules:2
udev_rules_apply_to_event: RUN 'socket: / org / kernel / udev / màn hình' /etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rules giáp
udevadm_test: UDEV_LOG = 6
udevadm_test: DEVPATH = / thiết bị / nền tảng / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / đầu vào / đầu vào10
udevadm_test: SẢN PHẨM = 3 / 62a / 201/110
udevadm_test: NAME = "Bàn phím tương thích USB"
udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1"
udevadm_test: UNIQ = ""
udevadm_test: EV == 1f
udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0
udevadm_test: REL == 143
udevadm_test: ABS == 1 0
udevadm_test: MSC == 10
udevadm_test: MODALIAS = input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E 2 18D, 192.193.195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r0,1,6,8, a20, m4, lsfw
udevadm_test: ACTION = xóa
udevadm_test: SUBSYSTEM = đầu vào
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: 'socket: / org / kernel / udev / màn hình'
udevadm_test: chạy: '/ usr / bin / xmodmap ~ / .pndXmodmap'

có vẻ như cho thấy nó nên hoạt động, nhưng nó không hy vọng điều này sẽ giúp có được câu trả lời.


Câu trả lời:


16

Tôi tìm thấy một cách để giải quyết vấn đề này, mặc dù nó hơi hack.

Hôm nay tôi đã đến cùng một điểm chính xác khi cố gắng thiết lập hai bàn phím với udev, setxkbmap và xinput --list và để chúng hoạt động với chức năng cắm nóng usb. Tôi đang trao đổi các phím xung quanh, không thay đổi bố cục, nhưng tất cả đều giống nhau, một khi bạn đã xác định bàn phím của mình trên một hotplug và có thể gọi setxkbmap một cách ngẫu nhiên, thì bạn chỉ có thể đặt ngôn ngữ của bàn phím mà bạn đã chỉ định . Danh sách bố trí bàn phím có thể được tìm thấy ở đây ls -l /usr/share/kbd/keymaps/i386/và bạn có thể tìm thấy tên thiết bị của mình để sử dụng xinput -list.

  1. Bạn sẽ muốn thay thế rizumubằng tên người dùng của mình, vì tôi thấy đó không phải là cách để làm điều này mà không rõ ràng.
  2. Hãy chắc chắn rằng bạn grep trên yourtên bàn phím.
  3. Sử dụng lsusbđể khám phá ID phần cứng mà bạn cần đặt trong quy tắc udev. Bàn phím das của tôi trông như thế nàyBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.

Trước tiên tôi thiết lập quy tắc udev để tự động xác định bàn phím bằng cách tạo quy tắc udev:

Trong tập tin /etc/udev/rules.d/00-usb-keyboards.rules:

ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2013", RUN+="/home/rizumu/bin/kbd_udev", OWNER="rizumu"

Tôi có hai tệp ~ / bin / kbd và ~ / bin / kbd_udev. Hãy chắc chắn rằng họ có quyềnchmod 755 ~/bin/kbd*

Các ~/bin/kbd_udevkịch bản bao gồm:

#!/bin/bash
/home/rizumu/bin/kbd &

Và bạn sẽ nhận thấy rằng tất cả những gì nó làm là gọi ~/bin/kbdtrong nền, để udev có thể hoàn thành quy trình của nó và kích hoạt bàn phím. Bên trong ~/bin/kbdtập lệnh chúng ta ngủ trong một giây, bởi vì chúng ta cần đợi cho đến khi bàn phím được kích hoạt để chúng ta có thể lấy id thiết bị bằng cách sử dụng xinput. Để đạt được điều này tôi đã thiết lập một số biến và xuất khẩu chúng để xinput setxkbmap có thể làm của họ làm việc: DISPLAY, XAUTHORITY, HOME, và một daskb_idcho id của daskeyboard của tôi:

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/rizumu/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
daskb_id=`xinput -list | grep -i 'daskeyboard' | grep -o id=[0-9]. | grep -o [0-9]. | head -1`

xset r rate 200 30
setxkbmap -layout colemak
setxkbmap -option ctrl:nocaps
if [ "${daskb_id}" ]; then
    setxkbmap -device "${daskb_id}" -option altwin:swap_lalt_lwin
fi

Cảm ơn rất nhiều vì đã giúp tôi trả lời câu hỏi của riêng tôi là AskUbfox: askubfox.com/questions/337411/ mẹo
Sadi

Và tôi tự hỏi nếu bạn cũng có thể giúp tôi thêm một tin nhắn thông báo ở cuối tập lệnh này (ví dụ notify-send "USB Keyboard is plugged in and ready for use now." -i gtk-dialog-info -t 1000 -u normal). Vì tôi không biết nhiều về kịch bản, tôi đã thử chèn nó trước hoặc sau "fi" nhưng trong cả hai trường hợp, thông báo thông báo cứ xuất hiện lặp đi lặp lại :-(
Sadi

Tại sao cài đặt OWNERcho thiết bị này?
Limbo Peng

1
Không những gì xset r rate 200 30dòng làm gì? xsetkhông có sẵn trên bản cài đặt Ubuntu 17.04 của tôi.
kleinfreund

1
Tôi không thể chạy xmodmap $HOME/.Xmodmapbằng cách sử dụng tập lệnh tương tự như "/ home / rizumu / bin / kbd" của bạn. Tại sao lại như vậy?
Lão máu

5

Tùy thuộc vào bản phân phối của bạn, bạn có thể đã có quy tắc udev cho bàn phím trong /lib/udev/rules.d/64-xorg-xkb.rules. Trên Ubuntu, nhập / etc / default / keyboard, có các tùy chọn gần giống như thế này:

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

Đối với thiết lập của tôi, tôi thấy rằng quy tắc tích hợp này đang thực thi sau quy tắc udev tùy chỉnh của tôi và đã ghi đè cài đặt của tôi. Thay vào đó, tôi đã thay đổi XKBOPTIONS trong / etc / default / keyboard thành:

XKBOPTIONS="-option ctrl:nocaps"

Để có được hành vi "Caps Lock is Control" tôi muốn trên tất cả các bàn phím.


2
Ý tưởng tuyệt vời! Của tôi chỉ hoạt động vớiXBKOPTIONS="ctrl:nocaps"
RasmusWL

3

Nếu bạn đang chạy Gnome thì bạn sẽ cần phải tắt plugin quản lý bàn phím để nó không ghi đè thay đổi bố cục của bạn.

gconftool-2 --toggle /apps/gnome_settings_daemon/plugins/keyboard/active

Chạy cùng một lệnh một lần nữa để kích hoạt nó như mong muốn.


tôi đang chạy angstrom. sẽ làm việc này?
Jake Aitchison

Bạn có đang sử dụng Gnome trên Ångström không?
Ignacio Vazquez-Abrams

Không sử dụng xfce 4.6.1
Jake Aitchison

1
Trong Ubuntu 13.04 của tôi, đây là dconfdưới /org/gnome/settings-daemon/plugins/keyboard/active.
nh2

1
Và lệnh cho Ubuntu 13.04 là:gsettings set org.gnome.settings-daemon.plugins.keyboard active false
Sadi

3

Nó không hoạt động vì udevxmodmapkhông có quyền truy cập vào màn hình X11 của bạn. Trong thực tế, udevthậm chí không biết nếu có hoạt động màn hình X11.

  • Lưu ý: hiển thị , số nhiều. Nó không thể sử dụng "màn hình" X11 vì có thể có nhiều hơn một. Ví dụ: nếu bạn sử dụng "chuyển đổi người dùng nhanh".

Vì vậy, làm thế nào tôi có thể làm cho công việc này?
Jake Aitchison

Bất cứ ai biết làm thế nào tôi có thể sửa chữa điều này?
Jake Aitchison

1
Tôi đã nhận được udev để gọi setxkbmap. Quy tắc udev gọi một tập lệnh tạo nền cho tập lệnh khác (để udev có thể hoàn thành). Kịch bản thứ hai tạm dừng trong một giây, thiết lập các biến X11 dự kiến ​​và kích hoạt setxkbmap. Xem câu trả lời của tôi cho câu hỏi chính để biết thêm chi tiết.
Thomas Schreiber

@rizumu: Ahh, chúc may mắn khi làm việc với GDM.
grawity

3

Tôi nghĩ rằng tôi đã tìm thấy một cách dễ dàng hơn để cấu hình cái này, không yêu cầu hack X11 đặc biệt.

Ý tưởng đằng sau điều này là udevsẽ chỉ phát hiện cho đầu vào bàn phím mới và tạo liên kết tượng trưng cho từng bố cục, sau đó inotifysẽ xem bố cục mới trong không gian người dùng.

quy tắc udev

#/etc/udev/rules.d/61-usb-keyboard-layout.rules

# will match my Logitech keyboard with US layout 
SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c31c", GROUP="plugdev", MODE="0660", SYMLINK+="input/by-layout/us"

# will match my Lenovo integrated keyboard with IT layout
SUBSYSTEM=="input", ENV{ID_PATH}=="platform-i8042-serio-0", SYMLINK+="input/by-layout/it"

# force the directory to be recreated, just in case you unplug all input
SUBSYSTEM=="input", RUN="/bin/mkdir -p /dev/input/by-layout"

Với quy tắc này, tôi có một thư mục dưới dev ( /dev/input/by-layout) để theo dõi các thay đổi trong tập lệnh không gian người dùng.

Tập lệnh không gian người dùng cho KDE

Ví dụ: khi sử dụng KDE, tôi có đoạn script này (tự động) đang chạy:

#!/bin/bash

# In case no link are found, switch to this layout
DEFAULT="it"

switch_layout () {
        [ ! -z "$1" ] || return 0
        /usr/bin/qdbus org.kde.keyboard /Layouts org.kde.KeyboardLayouts.setLayout $1
}

best_layout() {
        local LAYOUT=$(ls -1t /dev/input/by-layout/ | head -n 1)
        if [ -z "$LAYOUT" ] ; then
                LAYOUT=$DEFAULT
        fi
        echo $LAYOUT
}

switch_layout $(best_layout)

while true ; do
        EVENT=$(inotifywait -q -e create -e delete --exclude '.*tmp.*' /dev/input/by-layout/)

        if echo "$EVENT" | grep -qe CREATE ; then
                LAYOUT=${EVENT#?*CREATE }
        fi

        if echo "$EVENT" | grep -qe DELETE ; then
                LAYOUT=$(best_layout)
        fi

        switch_layout $LAYOUT
done

Điều này làm việc như một cơ duyên với tôi. Để thay đổi bố cục hệ thống (mà tôi không cần ngay bây giờ), một tập lệnh tương tự loadkeyscó thể được sử dụng bằng cách sử dụng tập lệnh init hệ thống.


Cảm ơn, điều này khiến tôi nhận ra tôi chỉ có thể sử dụng inotifywaitđể chạy tập lệnh thiết lập trên bất kỳ thay đổi nào /dev/input, vì bản thân tập lệnh là không cần thiết.
Charlie Gorichanaz

3

Cấu hình X.Org thì sao? Từ Gentoo Wiki: X.Org/Input_drivers - udev :

Ví dụ: Nếu bạn có bàn phím Logitech Access cho phần tiếng Pháp của Thụy Sĩ, bạn có thể sử dụng như sau:

Tệp: /etc/X11/xorg.conf.d/10-keyboard.conf

Section "InputClass"
    Identifier             "evdev keyboard catchall"
    MatchIsKeyboard        "on"
    MatchDevicePath        "/dev/input/event*"
    Driver                 "evdev"
    Option                 "XkbModel" "logiaccess"
    Option                 "XkbLayout" "ch"
    Option                 "XkbVariant" "fr"
EndSection

Đối với một lời giải thích sâu sắc, đọc:

man xorg.conf

và:

man evdev

ArchWiki thể hiện bằng cách sử dụng cùng một cú pháp trong xorg.conf nhưng lưu ý rằng "hiện tại bạn nên tạo một tệp cấu hình riêng biệt, như /etc/X11/xorg.conf.d/90-keyboard-layouts.conf". Tôi sử dụng Arch và định cấu hình bàn phím USB của riêng tôi trong /etc/X11/xorg.conf.d/vim 10-evdev.conf Làm việc cho tôi.

@rizumu: Kydge thông minh, cảm ơn vì đã chia sẻ.


1
Tôi không có thư mục x.org.conf.d trên Linux Mint 18.2
Max N

2

Để trả lời câu hỏi của bạn về việc truy cập màn hình đang chạy, bạn có thể xuất biến HIỂN THỊ thích hợp trong tập lệnh, giả sử rằng các quyền cho màn hình được đặt chính xác. ( man xsetđể cấp quyền hiển thị.)

Trong nhiều trường hợp thông thường, bạn có thể chỉ cần export DISPLAY=:0 cho lệnh, vì đó là màn hình đầu tiên trên một hệ thống người dùng. Có thể dễ dàng nhất để chạy tập lệnh thay vì trực tiếp xmodmap, vì điều này sẽ cho phép bạn có quyền kiểm soát nhiều hơn đối với các biến môi trường và phần còn lại. (Vì vậy, thay thế "/ usr / bin / xmodmap ~ / .usbXmodmap" trong quy tắc của bạn bằng "/usr/local/bin/keyboard_plug.sh" và đặt các lệnh thích hợp trong tập lệnh đó cùng với biến HIỂN THỊ.)

Tuy nhiên, như đã lưu ý ở trên, nếu bạn giả sử HIỂN THỊ =: 0 thì bạn có thể gặp sự cố sau này nếu bạn có nhiều người dùng hoặc hiển thị. Bạn có thể viết các tập lệnh để phát hiện màn hình phù hợp, nhưng trong trường hợp đó bạn phải tự mình thực hiện (theo như câu trả lời này). :)


1

Vì tôi không thể có được các bản hack để làm cho các quy tắc udev hoạt động, tôi đã viết một tập lệnh Python nhỏ sử dụng pyudevđể theo dõi các sự kiện đầu vào.

#! /usr/bin/env python3

import pyudev
import time
import subprocess

ctx = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(ctx)
monitor.filter_by("input")

def defer_xmodmap():
    time.sleep(1) # not sure if there's a race here, but it feels like there could be.
    subprocess.run("xmodmap ~/dotfiles/.xmodmap", shell=True)


for device in iter(monitor.poll, None):
    # there might be a way to add the action condition to the filter, but I couldn't find it
    if device.action != "add":
        continue

    # ensure the KB is initialized -- not sure if this is actually a needed check
    if not device.is_initialized:
        continue

    # my keyboard, from the output of `lsusb`
    if not "045E:07A5" in device.device_path:
        continue

    # it's the keyboard being added.
    defer_xmodmap()

Sau đó tôi sử dụng tệp đơn vị người dùng systemd này để giữ cho nó chạy ( systemctl --user enable name_of_service_file):

[Unit]
Description=udev xmodmap monitor

[Service]
ExecStart=/usr/bin/env python3 %h/local/bin/monitor_kb_udev
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

Các inotifywaitgiải pháp từ @ giosh94mhz là một chút đơn giản hơn, và tránh được sự phụ thuộc vào pyudev. Tuy nhiên, vì một số lý do, tôi thấy inotifysự kiện không được kích hoạt trong 10-20 giây sau khi bàn phím của tôi được kết nối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.