2012-03-23 8 views
7

Kiedy próbuję zbudować mój kod z nagłówkami X11 w Ubuntu 12.04Wymienić od XKeycodeToKeysym

case KeyPress: 
     xcommon_update_server_time(event.xkey.time); 
     /* if(event.xkey.state & ShiftMask) arg |= I_SHIFT; */ 
     /* this alternate approach allows handling of keys like '<' and '>' -- mrallen */ 
     if(event.xkey.state & ShiftMask) { 
      mykey = XKeycodeToKeysym(display, event.xkey.keycode, 1); 
     } else { 
      mykey = XKeycodeToKeysym(display, event.xkey.keycode, 0); 
     } 

Jaki jest oczekiwany wynik? Kompilacja.

Co się stanie zamiast tego?

warning: 'XKeycodeToKeysym' is deprecated (declared at /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations] 

Wskutek https://bugs.freedesktop.org/show_bug.cgi?id=5349 XKeycodeToKeysym jest teraz prawidłowo oznaczone jako przestarzałe.

Jak naprawić mój kod za ostrzeżenie za darmo i prawidłową kompilację?

Dzięki

+0

Komentarz # 5 na stronie bug związany wspomina pan 'XkbKeycodeToKeysym', że nie będzie robić to, co chcesz? – Eric

+0

Eric, Moje pytanie dodania: #include i zmieniając XKeycodeToKeysym (wyświetlacz, event.xkey.keycode, 1); z XkbKeycodeToKeysym (g_display, e.xkey.keycode, 1, 0); i XKeycodeToKeysym (display, event.xkey.keycode, 0); z: XkbKeycodeToKeysym (g_display, e.xkey.keycode, 0, 0); to poprawne rozwiązanie? – iattila

+0

Uważam, że należy zamienić dwa ostatnie parametry. Nie mam doświadczenia z programowaniem X11, ale z tej strony http://www.x.org/archive/X11R7.5/doc/man/man3/XkbKeyAction.3.html wynika, że ​​idx = group_index * key_width + shift_level ', który pasuje do trzeciego parametru (indeksu) w twoim starym kodzie odpowiadającym klawiszowi shift. – Eric

Odpowiedz

9

Pod XKB jest dostępny wtedy najprostszą zamiennik XKeycodeToKeysym jest:

#include <X11/XKBlib.h> 
/* which declares: 
    KeySym XkbKeycodeToKeysym(Display *dpy, KeyCode kc, 
           unsigned int group, unsigned int level); */ 

... a potem kod pierwotnego pytania mogłyby stać:

mykey = XkbKeycodeToKeysym(display, event.xkey.keycode, 
           0, event.xkey.state & ShiftMask ? 1 : 0); 

Uwagi:

+1

To powinna być zaakceptowana odpowiedź. Dba również o ShiftMask, co oszczędza wiele bólu głowy. Tylko dlaczego mówi "pod warunkiem, że XKB jest dostępny"? Czy zdarza się, że X11 przychodzi bez XKB? – AlwaysLearning

+0

Jestem również ciekawy @AlwaysLearning, czy jest możliwe, aby XKB tam nie było? We wszystkich testowanych systemach X11 to było. – Noitidart

6

pokazać przykład i można zrobić to samo na źródle.

Wymień

keysym = XKeycodeToKeysym(dpy,xe->xkey.keycode,0)

z

{ 
    int keysyms_per_keycode_return; 
    KeySym *keysym = XGetKeyboardMapping(dpy, 
     xe->xkey.keycode, 
     1, 
     &keysyms_per_keycode_return); 

    /* do something with keysym[0] */ 

    XFree(keysym); 
} 

Nie zapominając uwolnić zwracanej wartości.

Powiązane problemy