yazgoo / umberwm

:ram: a minimalistic X window manager based on tinywm, inspired by qtile.
57 stars 3 forks source link

use xkbcommon bindings instead of xmodmap -pke #2

Closed yazgoo closed 3 years ago

yazgoo commented 4 years ago

https://github.com/rtbo/rust-xcb/issues/79

mfdorst commented 3 years ago

This looks promising https://rtbo.github.io/xkbcommon-rs/xkbcommon/xkb/struct.State.html#method.key_get_syms

yazgoo commented 3 years ago
/*
gcc keymap.c -o keymap -lxcb -lX11 && ./keymap
*/
#include <stdlib.h>
#include <stdio.h>
#include <xcb/xcb.h>
#include <X11/Xlib.h>

void xcb_show_keyboard_mapping(xcb_connection_t* connection, const xcb_setup_t* setup){
  xcb_get_keyboard_mapping_reply_t* keyboard_mapping =
    xcb_get_keyboard_mapping_reply(
      connection,
      xcb_get_keyboard_mapping(
        connection,
        setup->min_keycode,
        setup->max_keycode - setup->min_keycode + 1),
      NULL);

  int          nkeycodes = keyboard_mapping->length / keyboard_mapping->keysyms_per_keycode;
  int          nkeysyms  = keyboard_mapping->length;
  xcb_keysym_t* keysyms  = (xcb_keysym_t*)(keyboard_mapping + 1);  // `xcb_keycode_t` is just a `typedef u8`, and `xcb_keysym_t` is just a `typedef u32`
  printf("nkeycodes %u  nkeysyms %u  keysyms_per_keycode %u\n\n", nkeycodes, nkeysyms, keyboard_mapping->keysyms_per_keycode);

  for(int keycode_idx=0; keycode_idx < nkeycodes; ++keycode_idx){
    printf("keycode %3u =", setup->min_keycode + keycode_idx);
    for(int keysym_idx=0; keysym_idx < keyboard_mapping->keysyms_per_keycode; ++keysym_idx){
      int sym = keysyms[keysym_idx + keycode_idx * keyboard_mapping->keysyms_per_keycode];
      if(sym != 0) { printf(" %s", XKeysymToString(sym)); };
    }
    putchar('\n');
  }

  free(keyboard_mapping);
}

int main(){
  xcb_connection_t*  connection = xcb_connect(NULL, NULL);
  const xcb_setup_t* setup      = xcb_get_setup(connection);
  xcb_show_keyboard_mapping(connection, setup);
  xcb_disconnect(connection);
}