Thay đổi trạng thái của đèn led bàn phím, từ trong phiên X, không có quyền truy cập root


10

Tôi đang cố gắng buộc capslock dẫn vào. xsetkhông làm việc cho tôi, vì vậy tôi đang cố gắng sử dụng setleds.

Trong bảng điều khiển đồ họa, lệnh này trả về:

> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?

Trong một thiết bị đầu cuối ảo, nó hoạt động, tuy nhiên hiệu ứng là cục bộ của thiết bị ảo đó. Từ những gì tôi hiểu, chạy

> setleds -L +caps < /dev/tty1

từ một thiết bị đầu cuối ảo (máy chủ X của tôi đang ngồi trên tty1) sẽ hoạt động. Tuy nhiên, điều này đòi hỏi quyền truy cập root.

Có cách nào để gửi lệnh đến bàn điều khiển bên dưới máy chủ X, từ máy chủ xs đã nói hoặc từ VT khác, không có root?

Chỉnh sửa: Từ một đề xuất từ ​​Mark Plotnik và dựa trên mã được tìm thấy ở đây , tôi đã viết và biên soạn như sau:

#include <X11/Xlib.h>
#include <X11/XKBlib.h>

#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16

void setLeds(int leds) {
   Display *dpy = XOpenDisplay(0);
   XKeyboardControl values;
   values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
   values.led = 3;
   XChangeKeyboardControl(dpy, KBLedMode, &values);
   XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
                    leds & (CAPSLOCK | NUMLOCK) );
   XFlush(dpy);
   XCloseDisplay(dpy);
}

int main() {
   setLeds(CAPSLOCK);
   return 0;
}

Từ những gì Gilles đã viết xset, tôi không mong đợi nó hoạt động, nhưng nó ... theo một nghĩa nào đó: nó đặt đèn led, nhưng nó cũng đặt trạng thái capslock. Tôi không hiểu đầy đủ tất cả các mã ở trên, vì vậy tôi có thể đã phạm một lỗi ngớ ngẩn. Rõ ràng, dòng XChangeKeyboardControl...không thay đổi hành vi của chương trình, và XkbLockModifierslà những gì thiết lập trạng thái led và trạng thái capslock.


Bạn có thể làm một cái gì đó giống như xdotool key Caps_Locktừ máy khách X được ủy quyền, mặc dù điều này thực sự sẽ bật nắp khóa.
Đánh dấu Plotnick

@MarkPlotnick Điểm thực sự là không bật CapsLock. Có cách nào để tắt CapsLock mà không cần chạm vào đèn led không?
T. Verron

Tôi đã xem xtermnguồn này và nó sử dụng lệnh gọi XChangePalControl () để đặt hoặc hủy đặt đèn LED mà không ảnh hưởng đến trạng thái khóa mũ, v.v. Vì vậy, nếu bạn có thể biên dịch mã C, đó là một cách tiếp cận.
Đánh dấu Plotnick

@MarkPlotnick Có xtermảnh hưởng đến đèn led không? Nghe có vẻ là một ý tưởng tốt, tôi sẽ chỉnh sửa câu hỏi với kết quả của tôi.
T. Verron

Tôi đã xtermlàm sáng LED ScrollLock bằng cách gửi chuỗi thoát ESC [3 q, theo tệp ctlseqs.txtđi kèm với nguồn, nhưng không thể làm cho đèn LED Num hoặc CapsLock sáng lên với tham số 1 và 2. Có lẽ tôi cần phải làm cấu hình XKB được đề cập trong câu trả lời. xtermgọi XChangeKeyboardControltrong xtermShowLEDxtermClearLEDs, nhưng không gọi XkbLockModifiersbất cứ nơi nào cả.
Đánh dấu Plotnick

Câu trả lời:


7

Về nguyên tắc, bạn sẽ có thể làm điều đó với xsetlệnh đáng kính .

xset led named 'Caps Lock'

hoặc xset led 4để đặt đèn LED số 4, nếu hệ thống của bạn không nhận ra đèn LED theo tên.

Tuy nhiên, điều này dường như không hoạt động đáng tin cậy. Trên máy của tôi, tôi chỉ có thể đặt Scroll Lock theo cách này và tôi không phải là người duy nhất . Đây dường như là một vấn đề của cấu hình XKB .

Công việc ở cấp độ người dùng sau đây sẽ hoạt động (đối với hầu hết các phần):

  1. Trích xuất cấu hình xkb hiện tại của bạn:

    xkbcomp $DISPLAY myconf.xkb
    
  2. Chỉnh sửa tệp myconf.xkb, thay thế !allowExplicitbằng allowExplicittrong các khối có liên quan:

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. Tải tập tin mới

    xkbcomp myconf.xkb $DISPLAY
    

Bây giờ cài đặt đèn led và tắt xsetsẽ hoạt động. Theo báo cáo lỗi, bạn sẽ không thể tắt đèn led khi chúng được bật (ví dụ: nếu CapsLock được bật).


Cảm ơn! Tôi đã thử xsettrước đây và thực sự nó không hoạt động. Tôi đã không nhìn thấy báo cáo lỗi này mặc dù. Dù sao, "Trạng thái: Wontfix đã giải quyết" không thực sự đáng khích lệ ... Công allowExplicitviệc có lẽ sẽ phù hợp với tôi (tôi không cần tắt đèn led), nhưng thay đổi nó vẫn cần root.
T. Verron 16/1/2015

@ T.Verron Bạn không cần phải root để thay đổi cấu hình XKB. Bạn có thể gọi xkbcompbất cứ lúc nào. Tôi không đủ quen thuộc với XKB để cho bạn biết chính xác những gì bạn cần thay đổi (thiết lập một khía cạnh cụ thể thay vì bản đồ được xác định trước đầy đủ với XKB là một chút đau khổ), nhưng unix.stackexchange.com/questions/166844/mapping -key-bindings / Nên có một vài gợi ý.
Gilles 'SO- ngừng trở nên xấu xa'

Oh, điểm tốt. Vâng, như một nỗ lực đầu tiên, tôi đã thử : xkbcomp $DISPLAY output.xkb, sau đó thay thế !allowExplicitbằng allowExplicittrong indicator "Caps Lock"phần, sau đó tải lại tệp với xkbcomp output.xkb. Có rất nhiều cảnh báo và sau đó xset không hoạt động tốt hơn. Tôi sẽ đọc thêm một số về xkb.
T. Verron 16/1/2015

1
Đây là loại làm việc cho tôi. Sau khi tôi nhập tệp đã sửa đổi, tôi nhận được một số thông báo lỗi và tôi có thể bật đèn LED nhưng những thứ khác đã bị rối, cộng với việc nó không tồn tại khi khởi động lại. Vì vậy, tôi đã đi trước một chỉnh sửa /usr/share/X11/xkb/compat/ledcapsvà ... / lednum và điều này làm cho nó vĩnh viễn.
jtgd

0

Sử dụng sed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

Sau khi đăng xuất và đăng nhập lại, Caps Lockgiờ đây đèn LED có thể được điều khiển mà không cần bất kỳ rootđặc quyền nào bằng cách sử dụng các lệnh:

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

Nhưng điều này đòi hỏi phải root.
T. Verron

@ T.Verron Chỉ một lần để thay đổi tệp cấu hình sudovà sau đó không bao giờ lặp lại. Để hiểu được lý do tại sao điều này có thể rất quan trọng đối với một số người dùng nhất định, hãy xem vimứng dụng này .
Serge Stroobandt

Là người đã đặt câu hỏi 3 năm trước, tôi chắc chắn hiểu tại sao nó có thể quan trọng đối với một số người dùng (trong trường hợp của tôi, nó hoạt động xung quanh bàn phím táo chậm trễ ngu ngốc khi kích hoạt capslock, sau khi ánh xạ lại capslock để kiểm soát). Nhưng trước đó, tôi đặc biệt cần một giải pháp mà không cần bất kỳ quyền truy cập root nào, bởi vì nó là cho một máy tính làm việc. Câu trả lời được chấp nhận liên quan đến một vài bước nữa, nhưng nó hoạt động mà không có sudo.
T. Verron

@ T.Verron tôi hiểu. Hệ thống chia sẻ là một trường hợp khác mà điều này sẽ không hoạt động. Mặc dù vậy, tôi thích sự thẳng thắn của người bình luận cuối cùng về câu trả lời được chấp nhận và đưa ra một câu trả lời sedtừ đó.
Serge Stroobandt

0

Một sự kết hợp của cách tiếp cận không cần root của @Gilles với ý tưởng tự động hóa hoàn toàn của @Serge_Stroobandt.

Để bật điều khiển đèn LED Caps Lock , Num LockShift Lock :

#!/bin/bash
# Enables to control keyboard LEDs that are not available for control by default
xkbcomp $DISPLAY /tmp/my_conf.xkb
cat /tmp/my_conf.xkb | awk -e '
    BEGIN {
        change = 0
    }

    {
        if (change == 1) {
            if ($1 == "!allowExplicit;") {
                gsub("!", "", $0)
            }
            change = 0
        }
        print $0

    }

    /indicator "Caps Lock"/ {
        change = 1
    }
    /indicator "Num Lock"/ {
        change = 1
    }
    /indicator "Shift Lock"/ {
        change = 1
    }
    ' > /tmp/my_conf_modified.xkb
xkbcomp /tmp/my_conf_modified.xkb $DISPLAY

Để bật và tắt đèn LED:

# Turns the LED on
xset led named 'Caps Lock'

# wait 1s
sleep 1

# Resets the LED to the actual state,
# so it might still be on, if Caps Lock is activated.
xset -led named 'Caps Lock'
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.