+2

Tự động tắt bàn phím laptop khi gắn bàn phím rời trên Linux

Có ai như mình không, đặc biệt rất thích mang laptop ra cafe ngồi gõ, không những thế mà lại còn thích dùng cả phím cơ nữa chứ. Thế nhưng đời không như là mơ, có những quán cà phê với bàn và diện tích rất nhỏ, thế nên việc để phím cơ lên laptop sẽ gây ra một tình trạng muôn thuở đó là...

Câu chuyện cấn phím 😵‍💫

Dẫn nhập

Và bài viết này, với một trick nhỏ sẽ giúp mọi người dứt điểm được tình trạng đó, bằng cách chạy script với duy nhất 1 logic đơn giản là:

  • Tắt phím internal của laptop khi phát hiện keyboard cần tìm được gắn vào
  • Bật lại phím internal của laptop khi keyboard cần tìm bị rút ra

Setup script theo logic đã đề cập

1. Tìm tên bàn phím

Trước tiên thì gõ lệnh đơn giản sau để tìm tên bàn phím của các bạn trước đã:

xinput list

Đây là mẫu output của laptop mình:

image.png

Okay bây giờ thì ta sẽ chỉ cần quan tâm đến cái nhánh có tên là Virtual core keyboard thôi nha:

  • Thằng XTEST thì không cần quan tâm tới
  • bàn phím internal của laptop sẽ có tên kiểu kiểu như đây: (thường là giống y chang)

AT Translated Set 2 keyboard

  • Tiếp đến, là bàn phím rời thường ở dưới cùng của mục, như của mình là Evision AKKO Keyboard, nhưng của các bạn sẽ là một cái tên khác, thường thì ta sẽ nhận qua brand bàn phím là nhanh nhất, như của mình là kit AKKO thì thấy có AKKO là xúc thôi.

Nếu không chắc chắn về tên phím rời của mình lắm thì các bạn có thể làm cái trò là: ngắt kết nối với phím rời, gõ xinput list lần 1, sau đó kết nối rồi gõ xinput list lần thứ 2 để check sự khác biệt ở hai output

Chúng ta note những cái tên này lại nha 😀

2. Tạo script thôi

Đầu tiên thì mình tạo file script tên tùy thích:

touch disable_laptop_keyboard.sh
chmod +x disable_laptop_keyboard.sh # để cấp quyền execute cho em nó

Thêm nội dung sau vào file disable_laptop_keyboard.sh:

Thay đổi giá trị tên bàn phím rời đã note ở bước 1 trong function check_external_keyboard. Check lại xem của AT_KEYBOARD_ID có trùng khớp với giá trị bên trên không, không thì mình chủ động đổi nhé.

#!/bin/bash

# check xem ban phim roi co duoc ket noi khong
check_external_keyboard() {
    xinput list | grep -q 'Evision AKKO Keyboard'
}

# id cua ban phim internal trong laptop
AT_KEYBOARD_ID='AT Translated Set 2 keyboard'

while true; do
        if check_external_keyboard; then
                xinput disable "$AT_KEYBOARD_ID"
        else
                xinput enable "$AT_KEYBOARD_ID"
        fi
        sleep 1
done

Giải thích từng bước:

  • Đầu tiên mình check tên phím đã noted ở bước 1 có tồn tại trong xinput list không bằng cách đơn giản sau:
    • Mình đóng function cho lệnh này để check xem output có là empty hay không
xinput list | grep -q 'Evision AKKO Keyboard'
  • Gán biến internal laptop vào trong script

Thường thì chỉ khi giá trị mà bạn đã check khác thì mới cần thay đổi bước này

AT_KEYBOARD_ID='AT Translated Set 2 keyboard'
  • Sau đó thì ta tiến hành thực hiện logic đã đề cập ở phần dẫn nhập:
  1. Tắt phím internal của laptop khi phát hiện keyboard cần tìm được gắn vào, tức là if check_external_keyboard; then thực hiện tắt phím bằng lệnh sau:
if check_external_keyboard; then
   xinput disable "$AT_KEYBOARD_ID"
  1. Bật lại phím internal của laptop khi keyboard cần tìm bị rút ra, tức là else thực hiện bật phím bằng lệnh sau:
else
    xinput enable "$AT_KEYBOARD_ID"
  • Thực hiện việc check như này liên tục mỗi giây 1 lần, hoặc realtime thì bạn bỏ sleep 1 trong script nhé.

3. Thêm vào startup script

Ubuntu, Debian

  • Mở Startup Applications qua Activities (nhấn Super). Hoặc đơn giản hơn là nhấn Alt+F2 và gõ lệnh gnome-session-properties và nhấn Enter.

image.png

  • Nhấp vào Add và nhập đường dẫn của file script vừa tạo tại mục Command, đặt tên tùy thích, sau đó nhấn Save.

image.png

  • Khởi động lại là xong.

Các distro khác

  1. Move file script đã tạo vào /etc/init.d/:
sudo mv ./disable_internal_keyboard.sh /etc/init.d/disable_internal_keyboard

Lưu ý là khi move vào mình bỏ cái đuôi sh cho tiện gọi nha

  1. Update cho script này chạy startup (dùng cái tên script đã bỏ đuôi .sh ban nãy:
sudo update-rc.d disable_internal_keyboard defaults 100

Nếu cần thay đổi, thì con số 100 tức là thứ tự chạy script startup của mình thôi, mình hay dùng 100, 101, 102,....

  1. Reboot lại test thử thôi
sudo reboot

Chúc các bạn thành công nhé 🎉


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí