static XkbFileInfo * input_pad_xkb_get_file_info (InputPadGtkWindow *window) { Display *xdisplay = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (GTK_WIDGET (window))); XkbFileInfo *xkb_info; xkb_info = g_new0 (XkbFileInfo, 1); xkb_info->type = XkmKeymapFile; xkb_info->xkb = XkbGetMap (xdisplay, XkbAllMapComponentsMask, XkbUseCoreKbd); if (xkb_info->xkb == NULL) { g_warning ("Could not get XKB map"); } if (XkbGetNames (xdisplay, XkbAllNamesMask, xkb_info->xkb) !=Success) { g_warning ("Could not get XKB names"); } if (XkbGetGeometry (xdisplay, xkb_info->xkb) !=Success) { g_warning ("Could not get geometry"); return NULL; } if (XkbChangeKbdDisplay (xdisplay, xkb_info) !=Success) { g_warning ("Could not get display"); return NULL; } return xkb_info; }
unsigned XkbReadFromServer(Display *dpy,unsigned need,unsigned want,XkbFileInfo *result) { unsigned which= need|want; unsigned tmp = 0; if ((result==NULL)||(dpy==NULL)) return which; if (which&XkmSymbolsMask) tmp= XkbAllMapComponentsMask; else if (which&XkmTypesMask) tmp= XkbKeyTypesMask; if (result->xkb==NULL) { result->xkb= XkbGetMap(dpy,tmp,XkbUseCoreKbd); if (!result->xkb) return which; else which&= ~(XkmSymbolsMask|XkmTypesMask|XkmVirtualModsMask); } else if ((tmp)&&(XkbGetUpdatedMap(dpy,tmp,result->xkb)==Success)) which&= ~(XkmSymbolsMask|XkmTypesMask|XkmVirtualModsMask); if (which&XkmIndicatorsMask) { if (XkbGetIndicatorMap(dpy,XkbAllIndicatorsMask,result->xkb)==Success) which&= ~XkmIndicatorsMask; } if (which&XkmCompatMapMask) { if (XkbGetCompatMap(dpy,XkbAllCompatMask,result->xkb)==Success) which&= ~XkmCompatMapMask; } if (which&XkmGeometryMask) { if (XkbGetGeometry(dpy,result->xkb)==Success) which&= ~XkmGeometryMask; } XkbGetNames(dpy,XkbAllNamesMask,result->xkb); return which; }