Заменить XKeycodeToKeysym - PullRequest
       25

Заменить XKeycodeToKeysym

7 голосов
/ 23 марта 2012

Когда я пытаюсь собрать свой код с заголовками X11 в Ubuntu 12.04

    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 );
        }

Каков ожидаемый результат? Составляет.

Что происходит вместо этого?

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

В результате https://bugs.freedesktop.org/show_bug.cgi?id=5349 XKeycodeToKeysym теперь правильно помечен как устаревший.

Как исправить мой код для предупреждения свободной и правильной сборки?

Спасибо

Ответы [ 3 ]

9 голосов
/ 15 марта 2014

Если XKB доступно, то самая простая замена для XKeycodeToKeysym:

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

... и тогда исходный код вопроса может стать:

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

Примечания:

6 голосов
/ 19 января 2013

Покажите вам пример, и вы можете сделать то же самое на вашем источнике.

Заменить

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

с

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

    /* do something with keysym[0] */

    XFree(keysym);
}

Не забудьте освободить возвращаемое значение.

0 голосов
/ 10 сентября 2018

XStringToKeysym () может быть использовано для этого. Преобразуйте значение кода ключа в шестнадцатеричную строку с добавленным префиксом «0x», и оно вернет правильное значение ключа-символа.

// 0xffbe = F1 
KeySym keysym = XStringToKeysym("0xffbe");
...