2012-09-10 105 views
4

我有一個以ascii字符形式輸入的小程序。我需要能夠將它們轉換爲用於x11函數的鍵碼。是否有一個xlib函數來執行此操作或另一個庫?或者一個大型開關盒的效果最好?將ASCII字符轉換爲x11鍵碼

回答

1

您可以使用XStringToKeysym轉換爲KeySym,然後按XKeysymToKeycode轉換爲KeyCode

Display *display = ...; 
KeySym sym_a = XStringToKeysym("A"); 
KeyCode code_a = XKeysymToKeycode(display, sym_a); 
+1

這在一般情況下不起作用。 XStringToKeysym映射KeySym名稱,而不是ASCII字符。您經常可以正常使用,因爲對於常見的打印字符,KeySym名稱與字符匹配,但不適用於空格字符。 – BobDoolittle

7

這個問題有一箇舊的,錯誤的答案(來自@oldrinb),奇怪的是從未受到過挑戰。如註釋中所述,不能使用XStringToKeysym以通用方式將字符映射到KeySyms。它將適用於字母和數字,但這就是它的原因,因爲KeySym名稱直接映射到這些ASCII字符。對於其他ASCII字符(如標點符號或空格)不起作用。

但你可以做得比這更好。如果你看看<X11/keysymdef.h>,你發現對於ASCII 0x20-0xFF,字符映射直接XKeySyms。所以,我想說直接使用這個範圍的字符更簡單,就像KeySyms一樣,然後將其餘的32個字符映射到對應的KeyCodes。所以,我想說的代碼應該更恰當地:

Display *display = ...; 
if ((int)c >= 0x20) { 
    XKeysymToKeycode(display, (KeySym)c); 
} else { 
    ... // Exercise left to the reader :-) 
} 

的「其他」子句將需要多個KeyCodes因爲例如ASCII 1(控制-A)是XK_AXK_CONTROL_R(或XK_CONTROL_L)修改。所以你必須發行例如:XK_CONTROL_L DOWN,XK_A DOWN,XK_A UP,XK_CONTROL_L UP。

這裏有一個玩具程序,由通過模擬鍵盤事件呼應的第一個參數說明了這一點:

#include <stdio.h> 
#include <X11/Xlib.h> 
#include <X11/Xlib-xcb.h> 
#include <xcb/xcb.h> 
#include <xcb/xcb_event.h> 
#include <xcb/xtest.h> 

main(int argc, char **argv) 
{ 
    char *pc; 
    xcb_connection_t *xconn; 
    KeyCode code_a; 
    Display *dpy = XOpenDisplay(NULL); 

    xconn = XGetXCBConnection(dpy); 

    for (pc = argv[1]; *pc != '\0'; ++pc) { 
     if (*pc >= (char)0x20) { 
      code_a = XKeysymToKeycode(dpy, (KeySym)*pc); 
      xcb_test_fake_input(xconn, XCB_KEY_PRESS, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); 
      xcb_test_fake_input(xconn, XCB_KEY_RELEASE, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); 
      xcb_flush(xconn); 
     } else { 
      fprintf(stderr, "Eeek - out-of-range character 0x%x\n", (unsigned int)*pc); 
     } 
    } 
    XCloseDisplay(dpy); 
} 

你需要將它與鏈接:-lX11 -lxcb -lxcb-xtest -lX11-xcb

免責聲明:無鍵符中的寫作受到傷害這段代碼。