2017-03-24 2 views
2

pendant GameDev pour un titre multiplate-forme les questions se pose comment soutenir l'entrée Unicode complète dans le chat-ingame. En utilisant WinAPI sous Windows et xcb sous Linux pour la saisie générale, il y a les événements WM_KEY_ * messages et xcb_key_ * respectivement. C'est très bien si vous voulez être informé d'une touche enfoncée sur le clavier.Comment obtenir l'entrée unicode de xcb sans plus tarder

Maintenant, cela ne vous permet pas d'entrer le texte intégral. Par exemple sur Windows il y a un message supplémentaire appelé WM_CHAR explicitement pour la saisie de texte. Codes clés a traduits en codes Unicode, y compris la manipulation de ModifierKeys comme shift. Même l'entrée chinoise est possible.

Maintenant, qu'en est-il de xcb? Tout ce que je peux trouver selon ce sujet est dépassé depuis au moins quatre ans maintenant. Y a-t-il eu des progrès? Est-il maintenant possible d'obtenir au moins la traduction des caractères morts en KeySyms (comme XFilterEvent l'a fait)? Je n'ai pas besoin d'une entrée Unicode complète comme la touche Alt et tapez un nombre sur le pavé numérique pour obtenir le corresp. codepoint sur l'écran. Aussi je ne veux pas lier d'énormes bibliothèques comme GTK juste pour traduire l'entrée du clavier en Unicode. Je sais que c'est une question répétée, mais tous sont périmés, donc je demande à nouveau l'état actuel de la saisie de texte en xcb.

Merci!

+0

Avez-vous trouvé une solution? –

+0

Non, pas encore. S'il vous plaît poster la réponse ici si vous l'avez. –

Répondre

1

Je ne sais pas si elle sera d'aucune aide, mais ...

Vous cherchez probablement pour une famille de fonctions X de * de LookupString:

http://www.xfree86.org/current/Xutf8LookupString.3.html

Maintenant, j'ai eu le même problème que vous, c'est, je devais porter une application en utilisant WM_CHAR de WinAPI à celui qui utilise xcb couplé avec X11 (comme un tel couplage est nécessaire pour une fenêtre OpenGL). Je ne l'ai pas exactement besoin Unicode, mais j'étais encore perdu parce qu'il n'y avait rien à me laisser obtenir entrée composé des séquences de touches (par exemple, en appuyant sur shift et 7 devrait aboutir à &)

Malheureusement, à ce devis XCB to-do list:

état actuel

Actuellement, XCB implémente uniquement les bits données dans le système X Window protocole, et même ce soutien n'est pas complète par rapport à Xlib (encodage de caractères, pas XLookupString() ...).

Donc, si vous devez utiliser xcb, cela rend les choses d'autant plus difficile, car il n'y a pas X*LookupString fonctions équivalentes pour l'événement de presse clé renvoyée par XCB - xcb_key_press_event_t. Ce que vous devez faire est de le convertir en XKeyEvent compréhensible par, par exemple, XLookupString.

Maintenant, en regardant le source of XLookupString, nous pouvons voir que jamais utilise trois champs de XKeyEvent:

  • display - votre Display
  • keycode - la touche enfoncée
  • state - l'état du touches de modification, p.ex.shift ou caps lock

Il se trouve juste qu'il y a des champs correspondants dans xcb_key_press_event_t qui sont à peu près identiques à ceux dont nous avons besoin. Ce que je l'ai fait pour faire mon travail d'application particulier était le suivant:

// This is your generic event returned by, for example, xcb_poll_for_event 
    const xcb_generic_event_t* event = ...; 

    const auto* const press = reinterpret_cast<const xcb_key_press_event_t*>(event); 

    // Now we have to prepare input understandable by the lookup function 

    XKeyEvent keyev; 
    keyev.display = display; // here you'll need to supply your Display* 
    keyev.keycode = press->detail; 
    keyev.state = press->state; 

    std::array<char, 16> buf {}; 

    if (XLookupString(&keyev, buf.data(), buf.size(), nullptr, nullptr)) { 
     // Now buf should contain a string with your characters; 
     // I just need ascii so I always take only buf[0] and it works fine 
    } 
    else { 
     // Something's wrong... report error or something 
    } 

Il ressemble également à XLookupString sorties correspondant keysym au caractère composé, par son argument en dehors KeySym *keysym_return. Comme vous dites que vous avez également besoin de keysyms, vous pouvez l'utiliser.

Je ne fais pas une application professionnelle, donc c'est tout ce dont j'avais besoin, et je ne suis pas vraiment sûr de la marche à suivre pour un support Unicode complet, mais si jamais j'y arrive, je vous laisserai connaître.