Làm thế nào để buộc phát hành một bộ sửa đổi bàn phím


18

Đôi khi, khi tôi sử dụng sức mạnh tổng hợp giữa các máy của mình khi một người đang sử dụng máy khách VirtualBox toàn màn hình, tôi bị kẹt với một số sửa đổi khóa kỳ lạ được bật. Nếu chúng tồn tại trên bàn phím của tôi (như Shift_L), tôi có thể chỉ cần nhấn vào đó và trạng thái của chúng được đặt lại và tôi có thể tiếp tục nhập bằng các chữ cái nhỏ. Nhưng một số trong số chúng hoàn toàn không được ánh xạ tới bàn phím của tôi (như ISO_Level3_Shift), vì vậy tôi không có cách nào để tắt chúng cả!

Làm thế nào để thiết lập lại chúng? Ngay bây giờ, tất cả những gì tôi có thể làm là khởi động lại máy tính, nhưng đó là giải pháp khá xấu hổ.

Tất cả những gì tôi muốn là một số chương trình có thể "chạm" một cách giả tạo tất cả các sửa đổi bàn phím có thể, do đó trạng thái của chúng sẽ được đặt lại. Nó có thể được thực hiện?

Tôi sử dụng Mint 14 (bản sao của Ubuntu 12.10 Quantal).

Câu trả lời:


22

Nếu bạn đã xdotoolcài đặt, bạn chỉ cần sử dụng

xdotool keyup ISO_Level3_Shift

Việc gửi một bản phát hành khóa (tất nhiên là cho ISO_Level3_Shift) đến máy chủ X.

Nhưng bạn muốn có một chương trình để phát hành tất cả các phím bổ trợ. Người ta có thể sử dụng xdotool để đạt được điều đó một cách dễ dàng, nếu không vì điều đó tôi không biết những từ khóa sửa đổi nào được định nghĩa. Một phương pháp có thể tìm thấy chúng là phân tích cú pháp keysymdef.h:

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

Mà trả về một số keyyms chắc chắn là sửa đổi. Thật không may, tôi không thể tìm thấy bất kỳ định nghĩa chính xác nào về khóa bổ trợ ngay bây giờ, vì vậy tôi không biết liệu đó có phải là một danh sách đầy đủ hay không.

Nối | xargs xdotool keyupvào đường ống trên sẽ giải phóng tất cả các khóa đó. Trên hệ thống của tôi, nó thực thi lệnh sau:

xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock

1
Tuyệt quá! Tôi cũng thấy rằng các khóa chưa được gán có thể được rút ra thông qua mã khóa, ví dụ xdotool keyup 204.
Adam Spiers

1
@Adam Spiers đã theo dõi tôi. Mã keyup cho trường hợp của tôi là mã xmodmap, ví dụ 204 và sử dụng keyymdef.h không giúp ích được gì. Để xem mã khóa xmodmap, hãy thử : DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Bạn sẽ cần thay đổi số hiển thị thành số hiển thị VNC bị hỏng của bạn.
srking

Tôi nghĩ bạn có nghĩa DISPLAY=:1trong nhận xét trên.
Adam Spiers

1
xdotoolhỗ trợ --clearmodifierstùy chọn cho key/ keydown/ keyup- có thể không khi câu trả lời này được viết? Tôi hy vọng điều đó xdotool keyup --clearmodifiers spacesẽ làm việc. ( xdotool keyupyêu cầu một khóa được chỉ định; không gian của người dùng là tùy ý.)
Rory O'Kane

6

Tôi phát hiện ra rằng đối với hệ thống của mình, giải pháp được đăng liên quan xdotoolthường không bao gồm khóa bị kẹt và việc chạy setxkbmapdường như không thực hiện được bất cứ điều gì trên hệ thống của tôi.

Giải pháp mà tôi phát hiện ra, cho đến nay vẫn hoạt động mà không thất bại, là sử dụng x11vnc. Cụ thể, tôi sử dụng lệnh sau:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keyslà phần quan trọng, ở đây. Nó hướng dẫn x11vncđể xóa tất cả các phím được nhấn khi thoát. -timeout 1yêu x11vnccầu thoát sau 1 giây mà không có kết nối và -deny_allđảm bảo không ai có thể kết nối trong cửa sổ đó.

Đôi khi, khóa bị kẹt sẽ ngăn mọi tương tác có ý nghĩa với máy tính để bàn, trong trường hợp đó tôi sẽ thực hiện các thao tác sau thông qua ssh:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1

4

Tôi sử dụng "setxkbmap" không có đối số. Nó dường như để thiết lập lại bàn phím. Tôi có một "phím tắt" trong bảng điều khiển của mình mà tôi có thể sử dụng bằng chuột khi bàn phím hoàn toàn không thể hoạt động.


0

Câu x11vnctrả lời là khéo léo, nhưng nếu cài đặt x11vncchỉ để xóa các sửa đổi có vẻ như quá mức cần thiết, thì đây là một giải pháp Bash sử dụng xmodmap -pmđầu ra của nó để đưa ra một khóa cho tất cả các sửa đổi đã biết. Việc chuyển đổi từ mã hex sang mã thập phân phụ thuộc vào việc mở rộng số học của Bash.

for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do

    echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
    xdotool keyup $((16#$KEYCODE))

done

Nếu bạn đang chạy nó từ một phím tắt, việc thêm sleep 1vào lúc bắt đầu (để cho phép thời gian cho các phím vật lý được giải phóng) sẽ được khuyên dùng. Các echođể stderr là không cần thiết, tất nhiên; Tôi chỉ muốn có thể kiểm tra ~/.xsession-errorstập tin của tôi cho đầu ra như thế này.

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.