2012-03-23 11 views
7

Quando si tenta di costruire il mio codice con le intestazioni X11 in Ubuntu 12,04Sostituire di 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); 
     } 

Qual è il risultato atteso? Compila.

Cosa succede invece?

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

Come risultato di https://bugs.freedesktop.org/show_bug.cgi?id=5349 XKeycodeToKeysym è ora correttamente contrassegnati come obsoleto.

Come risolvere il mio codice per la generazione di avvisi gratuita e corretta?

Grazie

+0

commento # 5 nella pagina di errore si è collegato cita 'XkbKeycodeToKeysym', non avrebbe che fare quello che vuoi? – Eric

+0

Eric, mia domanda Aggiunta: #include e cambiando XKeycodeToKeysym (display, event.xkey.keycode, 1); con XkbKeycodeToKeysym (g_display, e.xkey.keycode, 1, 0); e XKeycodeToKeysym (visualizzazione, event.xkey.keycode, 0); con: XkbKeycodeToKeysym (g_display, e.xkey.keycode, 0, 0); è la soluzione corretta? – iattila

+0

Credo che sia necessario scambiare gli ultimi due parametri. Non ho esperienza con la programmazione X11, ma raccolgo da questa pagina http://www.x.org/archive/X11R7.5/doc/man/man3/XkbKeyAction.3.html che 'idx = group_index * key_width + shift_level ', che corrisponde al terzo parametro (indice) nel vecchio codice corrispondente al tasto maiuscole. – Eric

risposta

9

fornito XKB è disponibile, la sostituzione semplice per XKeycodeToKeysym è:

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

... e poi il codice della domanda iniziale potrebbe diventare:

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

note:

+1

Questa dovrebbe essere la risposta accettata. Si prende cura anche di ShiftMask, che risparmia un sacco di mal di testa. Solo perché dice "fornito XKB è disponibile"? Accade che X11 arrivi senza XKB? – AlwaysLearning

+0

Sono anche curioso di @AlwaysLearning, è possibile che XKB non ci sia? In tutti i sistemi X11 che ho provato era lì. – Noitidart

6

vi mostri un esempio e si può fare lo stesso sulla sorgente.

Sostituire

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

con

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

    /* do something with keysym[0] */ 

    XFree(keysym); 
} 

Senza dimenticare di liberare il valore di ritorno.