2010-07-12 18 views

Répondre

4

J'ai trouvé une bonne solution. C'est une classe C++ écrite par Jay Bromley, que je peux ajouter à mon application et l'utiliser.

source code

Il est très facile à utiliser:

#include "XKeyboard.h" 

XKeyboard xkb; 

std::string cGrpName=xkb.currentGroupName(); //return somethings like "USA" 
std::string cGrpSymb=xkb.currentGroupSymbol(); //return somethings like "us" 

xkb.setGroupByNum(0);//set keyboard layout to first layout in available ones 

vous pouvez lire le code source et trouvé quelques autres fonctions utiles. pour compiler la version autonome, vous devez décocher les commentaires « int main » présente dans la fonction « XKeyboard.cpp » (ou écrire votre propre main.cpp) et l'utilisation somethings comme ceci:

g++ *.cpp -o getxkblayout -L/usr/lib -lX11 
2

Je ne suis pas sûr de la fonction de la bibliothèque X11, mais setxkbmap est la commande bash que j'utilise pour l'obtenir. Peut-être que chercher sur ces lignes trouvera ce que vous voulez (ou à la rigueur vous pourriez simplement exécuter la commande bash).

Exemple

setxkbmap dvorak 
setxkbmap us 

EDIT: Après une strace de setxkbmap ne se est pas tout ce que je suggère utile simplement appeler:

system(“setxkbmap us”); 
+0

vous auriez pu au moins reformulé la réponse au son comme "regarder dans le code source de setxkbmap". J'aurais posté la réponse hier - si seulement j'avais le temps de trouver les sources. De même, vérifier les sources des applets de commutation de clavier dans KDE/Gnome/Xfce. – Dummy00001

+0

oui cela fonctionne, mais si plus d'un groupe est installé sur l'ordinateur, l'utilisation de "setxkbmap us" désactivera toutes les autres langues. –

+0

@ Dummy00001: Je regarde dans le code source de setxkbmap avant de poser cette question, c'est très "bas niveau" pour mes connaissances en programmation Linux! –

2

Une solution API pur X11 devrait ressembler à ceci:

#include <stdio.h> 
#include <X11/XKBlib.h> 

int main() { 
    Display* _display; 
    char* displayName = ""; 
    _display = XOpenDisplay(displayName); 

    XkbDescRec* _kbdDescPtr = XkbAllocKeyboard(); 
    XkbGetNames(_display, XkbSymbolsNameMask, _kbdDescPtr); 
    Atom symName = _kbdDescPtr -> names -> symbols; 
    char* layoutString = XGetAtomName(_display, symName); 

    XCloseDisplay(_display); 
    printf("%s\n", layoutString); 
} 

Compile avec -lX11 drapeau

cette imprimera quelque chose comme pc+us+inet(evdev) pour l'anglais (USA) mise en page qwerty, pc+ru+us:2+inet(evdev) pour la mise en page russe йцукен, pc+us(dvorak)+us:2+inet(evdev) pour la disposition anglaise de dvorak.

0

Hier, j'essayais de faire passer le layout automatique à EN pour le xsecurelock de Google. J'ai essayé de trouver quelques solutions existantes pour X11 api, mais ...

J'ai donc décidé d'écrire le mien avec l'aide de S. Razi. Voici le code: (à exécuter avec -lX11 gcc)

#include <stdio.h> 
#include <stdlib.h> 
#include <X11/XKBlib.h> 

int main(){ 

Display* _display; 
char* displayName = ""; 
_display = XOpenDisplay(displayName); 

int _deviceId = XkbUseCoreKbd; 
int i = 0; 
int _groupCount = 0; 

XkbDescRec* kbdDescPtr = XkbAllocKeyboard(); 
if (kbdDescPtr == NULL) { 
printf("%s\n", "Failed to get keyboard description."); 
return False; 
} 

kbdDescPtr->dpy = _display; 
if (_deviceId != XkbUseCoreKbd) { 
    kbdDescPtr->device_spec = _deviceId; 
} 

XkbGetControls(_display, XkbAllControlsMask, kbdDescPtr); 
XkbGetNames(_display, XkbSymbolsNameMask, kbdDescPtr); 
XkbGetNames(_display, XkbGroupNamesMask, kbdDescPtr); 

     /* count groups */ 

Atom* groupSource = kbdDescPtr->names->groups; 
if (kbdDescPtr->ctrls != NULL) { 
    _groupCount = kbdDescPtr->ctrls->num_groups; 
} else { 
    _groupCount = 0; 
    while (_groupCount < XkbNumKbdGroups && 
      groupSource[_groupCount] != 0) { 
     _groupCount++; 
    } 
} 

     /* get group names */ 
Atom* tmpGroupSource = kbdDescPtr->names->groups; 
Atom curGroupAtom; 
char* groupName; 
for (i = 0; i < _groupCount; i++) { 
    if ((curGroupAtom = tmpGroupSource[i]) != None) { 
     char* groupNameC = XGetAtomName(_display, curGroupAtom); 
      if (groupNameC == NULL) { 
      continue; 

     } else { 
      groupName = groupNameC; 
      char *temp = "English"; 

      if (strncmp(temp, groupName, 7) == 0){ 
       printf ("%s\n", groupName); 
       printf ("%d\n", i); 
       XkbLockGroup(_display, _deviceId, i); 
       XFree(groupNameC); 
       XCloseDisplay(_display); 
      } 
      return 0; 
     } 
    } 
} 
} 

Ici vous pouvez changer temp char * = "anglais" pour le nom du groupe de votre mise en page (ExMP: "russe"), et ce simple code va changer votre mise en page actuelle :)