Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

474
Vistas
¿Cómo obtener el carácter de una tecla XLib en el diseño del teclado?

Usando XKeycodeToKeysym (en C++) puedo obtener KeySym para un evento de pulsación de tecla. Por lo que entiendo, esto ya debería respetar la distribución del teclado. Sin embargo, cuando cambio la distribución del teclado (entre inglés y hebreo) obtengo el mismo KeySym. ¿Sospecho que Xlib Keysym solo respeta el diseño del teclado definido en el nivel X11? En mi sistema, los diseños de teclado se definen solo en el nivel de entorno de escritorio (Mate). Y si es así, ¿hay alguna forma de obtener el carácter correcto sin usar un conjunto de herramientas como Qt / GTK? ¿Debo manejar cada entorno de escritorio por separado?

[Editar]

Probé lo siguiente (según la sugerencia de Andrey), que no funciona:

 #include <X11/XKBlib.h> #include <cstring> #include <cassert> #include <iostream> int main() { Display *display = XOpenDisplay(nullptr); Window root, window; XSetWindowAttributes swa; root = DefaultRootWindow( display ); XSelectInput( display, root, MappingNotify ); std::memset(&swa, 0, sizeof swa ); swa.event_mask = MappingNotify | KeyPressMask; window = XCreateWindow( display, root, 50, 200, 1024, 768, 0, CopyFromParent, InputOutput, CopyFromParent, CWEventMask, &swa ); XMapRaised( display, window ); int xkbEventCode=0, n0=0, n1=0, n2=0, n3=0; bool isOk = XkbQueryExtension( display, &n0, &xkbEventCode, &n1, &n2, &n3 ) ==True; assert( isOk ); isOk = XkbSelectEvents( display, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask ) ==True; assert( isOk ); while (true) { XEvent event; std::memset( &event, 0, sizeof event ); XNextEvent( display, &event ); if (event.type == xkbEventCode) switch (reinterpret_cast<XkbEvent*>(&event)->any.xkb_type) { case XkbNewKeyboardNotify: case XkbMapNotify: { std::cout << "Keyboard mapping has changed." << std::endl; break; } default: break; } else switch (event.type) { case KeyPress: { KeyCode keyCode = event.xkey.keycode; int keySymsPerkeyCode=0; KeySym *keySyms( XGetKeyboardMapping(display, keyCode, 1, &keySymsPerkeyCode)), *keySym = keySyms; while (keySymsPerkeyCode-- && *keySym != NoSymbol) { std::cout << *keySym << std::endl; ++keySym; } XFree( keySyms ); break; } case MappingNotify: { std::cout << "Keyboard mapping has changed." << std::endl; break; } default: break; } } return 0; }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puedo responder solo en un nivel inferior, no sé qué hace XKeycodeToKeysym .

Debe escuchar el evento MappingNotify y cada vez que lo reciba, vuelva a leer el nuevo mapeo (por lo general, esto significa que el diseño del teclado / idioma cambió) con XGetKeyboardMapping

Esto es parte del protocolo core X, entorno de escritorio / independiente de WM

actualizar:

Parece que xlib habilita la extensión XKeyboard de forma predeterminada. Una vez que esté habilitado, debe expresar explícitamente su interés en mapear eventos de cambio (a diferencia del protocolo central donde MappingNotify siempre se envía a todos los clientes); consulte http://www.x.org/archive/X11R7.5/doc/man/man3 /XkbSeleccionarEventos.3.html

 XkbSelectEvents (display, XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);

Después de eso, responde al evento XkbMapNotify y ejecuta XkbGetMap() para obtener un nuevo diseño

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda