[PATCH RFC kdrive/ephyr v2] Match host X server's keymap

Uli Schlachter psychon at znc.in
Tue Dec 8 10:55:04 PST 2015


Hi,

Am 08.12.2015 um 13:46 schrieb Laércio de Sousa:
[...]
> diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
> index 49516bb..249b210 100644
> --- a/hw/kdrive/ephyr/hostx.c
> +++ b/hw/kdrive/ephyr/hostx.c
[...]
> @@ -1086,18 +1085,105 @@ hostx_paint_debug_rect(KdScreenInfo *screen,
>      nanosleep(&tspec, NULL);
>  }
>  
> -void
> -hostx_load_keymap(void)
> +Bool
> +hostx_load_keymap(KeySymsPtr keySyms, CARD8 *modmap, XkbControlsPtr controls)
>  {
>      int min_keycode, max_keycode;
> +    int map_width;
> +    size_t i, j;
> +    int keymap_len;
> +    xcb_keysym_t *keymap;
> +    xcb_keycode_t *modifier_map;
> +    xcb_get_keyboard_mapping_cookie_t mapping_c;
> +    xcb_get_keyboard_mapping_reply_t *mapping_r;
> +    xcb_get_modifier_mapping_cookie_t modifier_c;
> +    xcb_get_modifier_mapping_reply_t *modifier_r;
> +    xcb_xkb_use_extension_cookie_t use_c;
> +    xcb_xkb_use_extension_reply_t *use_r;
> +    xcb_xkb_get_controls_cookie_t controls_c;
> +    xcb_xkb_get_controls_reply_t *controls_r;
>  
>      min_keycode = xcb_get_setup(HostX.conn)->min_keycode;
>      max_keycode = xcb_get_setup(HostX.conn)->max_keycode;
>  
>      EPHYR_DBG("min: %d, max: %d", min_keycode, max_keycode);
>  
> -    ephyrKeySyms.minKeyCode = min_keycode;
> -    ephyrKeySyms.maxKeyCode = max_keycode;
> +    keySyms->minKeyCode = min_keycode;
> +    keySyms->maxKeyCode = max_keycode;
> +
> +    use_c = xcb_xkb_use_extension(HostX.conn,
> +                                  XCB_XKB_MAJOR_VERSION,
> +                                  XCB_XKB_MINOR_VERSION);
> +    use_r = xcb_xkb_use_extension_reply(HostX.conn, use_c, NULL);

Could you check xcb_get_extension_data(HostX.conn, &xcb_xkb_id)->present first?
I don't know why XKB's UseExtension has a supported field, but without this
suggested check, the XCB connection will just go in an error state if the XKB
connection is not actually present.

> +
> +    if (!use_r) {
> +        EPHYR_LOG_ERROR("Couldn't use XKB extension.");
> +        return FALSE;
> +    } else if (!use_r->supported) {
> +        EPHYR_LOG_ERROR("XKB extension is not supported in X server.");
> +        free(use_r);
> +        return FALSE;
> +    }
> +
> +    free(use_r);
> +
> +    controls_c = xcb_xkb_get_controls(HostX.conn,
> +                                      XCB_XKB_ID_USE_CORE_KBD);
> +    controls_r = xcb_xkb_get_controls_reply(HostX.conn,
> +                                            controls_c,
> +                                            NULL);
> +
> +    if (!controls_r) {
> +        EPHYR_LOG_ERROR("Couldn't get XKB keyboard controls.");
> +        return FALSE;

For this one you check for errors, with the following ones you do not. Is there
a reason for that?

> +    }
> +
> +    mapping_c = xcb_get_keyboard_mapping(HostX.conn,
> +                                         min_keycode,
> +                                         max_keycode - min_keycode + 1);
> +    mapping_r = xcb_get_keyboard_mapping_reply(HostX.conn,
> +                                               mapping_c,
> +                                               NULL);
> +    map_width = mapping_r->keysyms_per_keycode;
> +    keymap = xcb_get_keyboard_mapping_keysyms(mapping_r);
> +    keymap_len = xcb_get_keyboard_mapping_keysyms_length(mapping_r);
> +
> +    modifier_c = xcb_get_modifier_mapping(HostX.conn);
> +    modifier_r = xcb_get_modifier_mapping_reply(HostX.conn,
> +                                                modifier_c,
> +                                                NULL);

Also, even though it will never matter much, could you first send all the
requests and then get the replies?

[...]

No clue about the rest. I don't really understand this. :-)

Cheers,
Uli
-- 
“Some people are worth melting for.” - Olaf


More information about the xorg-devel mailing list