2013-03-19 20 views
9

Tôi mới tham gia chương trình X.org. Tôi muốn xây dựng một ứng dụng nhỏ phản ứng trên chuyển đổi bố trí bàn phím X. Tôi đã tìm kiếm, nhưng không tìm thấy sự kiện nào được kích hoạt khi bố cục kb được bật. Xin vui lòng, chỉ cho tôi sự kiện chính xác. Cảm ơnSự kiện nào được kích hoạt khi chuyển bố cục kb trong X.org

+0

Bạn đang làm gì để chuyển bố cục bàn phím? Bạn đang sử dụng một máy khách GUI? Hoặc chỉnh sửa một tập tin cấu hình? Khi nào thì thay đổi có hiệu lực? Đây là những manh mối có thể giúp chúng ta tìm hiểu nơi để tìm. –

+0

Chuyển đổi giữa bố cục ngôn ngữ (en, cs, ...). Ứng dụng khách GUI nghe nhạc chuyển đổi kb (ví dụ: tôi đã thiết lập cả hai ca để chuyển bố cục bàn phím và công tắc này tạo ra sự kiện mà tôi muốn bắt và thực hiện một số thao tác). Nên là mã c/C++. – Pat

+0

Bạn có thể đăng một số mã không? – JoRouss

Trả lời

8

Có loại sự kiện XkbStateNotify, là một phần của X Keyboard Extension. Bạn có thể lấy ngôn ngữ bố trí từ nó như thế này:

void x11Events(XEvent* evt) 
{ 
    if(evt->type == xkbEventType) { 
     XkbEvent* xkbevt = (XkbEvent*)evt; 
     if (xkbevt->any.xkb_type == XkbStateNotify) { 
      int lang = xkbevt->state.group; 
      // Some code using lang here. 
     } 
    } 
} 

Để có được xkbEventType, hãy gọi XkbQueryExtension() chức năng (khai báo trong XKBlib.h).

Tuy nhiên, XkbStateNotify không chỉ được kích hoạt khi thay đổi bố cục. Đây là từ đặc điểm kỹ thuật tham chiếu ở trên:

Những thay đổi báo cáo bao gồm những thay đổi bất kỳ khía cạnh của tình trạng bàn phím : khi một sửa đổi được thiết lập hoặc unset, khi nhóm hiện thay đổi, hoặc khi một nút trỏ được nhấn hoặc phát hành.

Bởi vì điều này, bạn sẽ phải lưu giá trị của lang nơi nào đó, và sau đó, khi sự kiện mới đến, so sánh giá trị mới của lang đến một trong những lưu trước đó.

NB. Ngoài ra còn có sự kiện XkbMapNotifyEvent, thông báo không phải về việc chuyển đổi bố cục cho mỗi lần, mà là thay đổi ánh xạ bàn phím. Bạn cũng có thể muốn xem xét điều đó.

+0

Lưu ý cho các lập trình viên có thể là một gợi ý làm thế nào để có được sự kiện này bằng cách sử dụng một bộ công cụ hiện đại như GTK. – user4815162342

+1

Trong GTK, thường không cần xử lý 'XEvents 'thô (không phải để phát hiện thay đổi bố cục, ít nhất), vì có [sự kiện gdk] (https://developer.gnome.org/pygtk/stable/class- gdkevent.html), có thể được sử dụng để lấy nhóm bàn phím hiện tại. Hơn nữa, việc can thiệp vào xử lý sự kiện X trong ứng dụng gtk có thể làm suy yếu bộ công cụ vì nó có vòng lặp xử lý sự kiện riêng. Tôi không có nhiều về Qt, nhưng tôi nghi ngờ những thứ tương tự ở đó. – shakurov

+0

Đó là chính xác những gì tôi đã đề cập đến - mã tương đương với ở trên, nhưng bằng cách sử dụng các sự kiện GDK. Nó phải có thể truy cập sự kiện chuyển đổi bố cục Xkb từ GTK/GDK, bởi vì ít nhất các bảng điều khiển chỉ báo bàn phím cần phát hiện chuyển đổi. – user4815162342

Các vấn đề liên quan