Hello.

I'm a bit confused.
I'm trying to get keyboard layout from xscreensaver-lock and see unexpected results.

I have a function which returns current layout (see below), which works fine when compiled standalone. But when I compile it as part of xscreensaver-lock , I suddenly find out that it sees two XKB groups
'English (US)' instead of 'English (US)' and 'Russian'.
So I see that we use group number 0 or 1, but their names are masked.

Do you have any suggestions where xscreensaver-lock can manage to do it? :)

static gchar*
getGroup()
{
  XkbStateRec state;
  Display *dpy;
  XkbDescRec desc[1];
  char *names[XkbNumKbdGroups];
  int i;
  gchar *s1 = NULL;

  dpy = gdk_x11_get_default_xdisplay();
  memset(desc, 0, sizeof(desc));
  desc->device_spec = XkbUseCoreKbd;
  if (XkbGetControls(dpy, XkbGroupsWrapMask, desc) == Success) {
    if (XkbGetNames(dpy, XkbGroupNamesMask, desc) == Success) {
      if (XkbGetState(dpy, XkbUseCoreKbd, &state) == Success) {
XGetAtomNames(dpy, desc->names->groups, desc->ctrls->num_groups, names);
        for(i=0; i< desc->ctrls->num_groups; i++){
          fprintf(stderr, names[i]);
        }
        if (names[state.group]) {
          if(strlen(names[state.group]) > 2) {
             names[state.group][2]='\0';
          }

          s1 = g_ascii_strdown (names[state.group], -1);
          fprintf(stderr, "Got group %d %s\n", state.group, s1);
          fflush(stderr);
        }
      }
      XkbFreeNames(desc, XkbGroupNamesMask, True);
    }
    XkbFreeControls(desc, XkbGroupsWrapMask, True);
  }
  return s1;
}


--
Best regards,
Alexander Pyhalov,
system administrator of Southern Federal University IT department

_______________________________________________
oi-dev mailing list
oi-dev@openindiana.org
https://openindiana.org/mailman/listinfo/oi-dev

Reply via email to