XKBUse.c revision 1ab64890
11ab64890Smrg/* $Xorg: XKBUse.c,v 1.3 2000/08/17 19:45:03 cpqbld Exp $ */ 21ab64890Smrg/************************************************************ 31ab64890SmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc. 41ab64890Smrg 51ab64890SmrgPermission to use, copy, modify, and distribute this 61ab64890Smrgsoftware and its documentation for any purpose and without 71ab64890Smrgfee is hereby granted, provided that the above copyright 81ab64890Smrgnotice appear in all copies and that both that copyright 91ab64890Smrgnotice and this permission notice appear in supporting 101ab64890Smrgdocumentation, and that the name of Silicon Graphics not be 111ab64890Smrgused in advertising or publicity pertaining to distribution 121ab64890Smrgof the software without specific prior written permission. 131ab64890SmrgSilicon Graphics makes no representation about the suitability 141ab64890Smrgof this software for any purpose. It is provided "as is" 151ab64890Smrgwithout any express or implied warranty. 161ab64890Smrg 171ab64890SmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 181ab64890SmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 191ab64890SmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 201ab64890SmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 211ab64890SmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 221ab64890SmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 231ab64890SmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 241ab64890SmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE. 251ab64890Smrg 261ab64890Smrg********************************************************/ 271ab64890Smrg/* $XFree86: xc/lib/X11/XKBUse.c,v 3.7 2003/07/07 15:34:21 eich Exp $ */ 281ab64890Smrg 291ab64890Smrg#ifdef HAVE_CONFIG_H 301ab64890Smrg#include <config.h> 311ab64890Smrg#endif 321ab64890Smrg#include <stdio.h> 331ab64890Smrg#include <ctype.h> 341ab64890Smrg#define NEED_REPLIES 351ab64890Smrg#define NEED_EVENTS 361ab64890Smrg#include "Xlibint.h" 371ab64890Smrg#include <X11/extensions/XKBproto.h> 381ab64890Smrg#include "XKBlibint.h" 391ab64890Smrg 401ab64890Smrgstatic Bool _XkbIgnoreExtension = False; 411ab64890Smrg 421ab64890Smrgvoid 431ab64890SmrgXkbNoteMapChanges(XkbMapChangesPtr old,XkbMapNotifyEvent *new,unsigned wanted) 441ab64890Smrg{ 451ab64890Smrg int first,oldLast,newLast; 461ab64890Smrg wanted&= new->changed; 471ab64890Smrg 481ab64890Smrg if (wanted&XkbKeyTypesMask) { 491ab64890Smrg if (old->changed&XkbKeyTypesMask) { 501ab64890Smrg first = old->first_type; 511ab64890Smrg oldLast = old->first_type+old->num_types-1; 521ab64890Smrg newLast = new->first_type+new->num_types-1; 531ab64890Smrg 541ab64890Smrg if (new->first_type<first) 551ab64890Smrg first = new->first_type; 561ab64890Smrg if (oldLast>newLast) 571ab64890Smrg newLast= oldLast; 581ab64890Smrg old->first_type = first; 591ab64890Smrg old->num_types = newLast-first+1; 601ab64890Smrg } 611ab64890Smrg else { 621ab64890Smrg old->first_type= new->first_type; 631ab64890Smrg old->num_types = new->num_types; 641ab64890Smrg } 651ab64890Smrg } 661ab64890Smrg if (wanted&XkbKeySymsMask) { 671ab64890Smrg if (old->changed&XkbKeySymsMask) { 681ab64890Smrg first = old->first_key_sym; 691ab64890Smrg oldLast = old->first_key_sym+old->num_key_syms-1; 701ab64890Smrg newLast = new->first_key_sym+new->num_key_syms-1; 711ab64890Smrg 721ab64890Smrg if (new->first_key_sym<first) 731ab64890Smrg first = new->first_key_sym; 741ab64890Smrg if (oldLast>newLast) 751ab64890Smrg newLast= oldLast; 761ab64890Smrg old->first_key_sym = first; 771ab64890Smrg old->num_key_syms = newLast-first+1; 781ab64890Smrg } 791ab64890Smrg else { 801ab64890Smrg old->first_key_sym = new->first_key_sym; 811ab64890Smrg old->num_key_syms = new->num_key_syms; 821ab64890Smrg } 831ab64890Smrg } 841ab64890Smrg if (wanted&XkbKeyActionsMask) { 851ab64890Smrg if (old->changed&XkbKeyActionsMask) { 861ab64890Smrg first = old->first_key_act; 871ab64890Smrg oldLast = old->first_key_act+old->num_key_acts-1; 881ab64890Smrg newLast = new->first_key_act+new->num_key_acts-1; 891ab64890Smrg 901ab64890Smrg if (new->first_key_act<first) 911ab64890Smrg first = new->first_key_act; 921ab64890Smrg if (oldLast>newLast) 931ab64890Smrg newLast= oldLast; 941ab64890Smrg old->first_key_act = first; 951ab64890Smrg old->num_key_acts = newLast-first+1; 961ab64890Smrg } 971ab64890Smrg else { 981ab64890Smrg old->first_key_act = new->first_key_act; 991ab64890Smrg old->num_key_acts = new->num_key_acts; 1001ab64890Smrg } 1011ab64890Smrg } 1021ab64890Smrg if (wanted&XkbKeyBehaviorsMask) { 1031ab64890Smrg if (old->changed&XkbKeyBehaviorsMask) { 1041ab64890Smrg first = old->first_key_behavior; 1051ab64890Smrg oldLast = old->first_key_behavior+old->num_key_behaviors-1; 1061ab64890Smrg newLast = new->first_key_behavior+new->num_key_behaviors-1; 1071ab64890Smrg 1081ab64890Smrg if (new->first_key_behavior<first) 1091ab64890Smrg first = new->first_key_behavior; 1101ab64890Smrg if (oldLast>newLast) 1111ab64890Smrg newLast= oldLast; 1121ab64890Smrg old->first_key_behavior = first; 1131ab64890Smrg old->num_key_behaviors = newLast-first+1; 1141ab64890Smrg } 1151ab64890Smrg else { 1161ab64890Smrg old->first_key_behavior = new->first_key_behavior; 1171ab64890Smrg old->num_key_behaviors = new->num_key_behaviors; 1181ab64890Smrg } 1191ab64890Smrg } 1201ab64890Smrg if (wanted&XkbVirtualModsMask) { 1211ab64890Smrg old->vmods|= new->vmods; 1221ab64890Smrg } 1231ab64890Smrg if (wanted&XkbExplicitComponentsMask) { 1241ab64890Smrg if (old->changed&XkbExplicitComponentsMask) { 1251ab64890Smrg first = old->first_key_explicit; 1261ab64890Smrg oldLast = old->first_key_explicit+old->num_key_explicit-1; 1271ab64890Smrg newLast = new->first_key_explicit+new->num_key_explicit-1; 1281ab64890Smrg 1291ab64890Smrg if (new->first_key_explicit<first) 1301ab64890Smrg first = new->first_key_explicit; 1311ab64890Smrg if (oldLast>newLast) 1321ab64890Smrg newLast= oldLast; 1331ab64890Smrg old->first_key_explicit = first; 1341ab64890Smrg old->num_key_explicit = newLast-first+1; 1351ab64890Smrg } 1361ab64890Smrg else { 1371ab64890Smrg old->first_key_explicit = new->first_key_explicit; 1381ab64890Smrg old->num_key_explicit = new->num_key_explicit; 1391ab64890Smrg } 1401ab64890Smrg } 1411ab64890Smrg if (wanted&XkbModifierMapMask) { 1421ab64890Smrg if (old->changed&XkbModifierMapMask) { 1431ab64890Smrg first = old->first_modmap_key; 1441ab64890Smrg oldLast = old->first_modmap_key+old->num_modmap_keys-1; 1451ab64890Smrg newLast = new->first_modmap_key+new->num_modmap_keys-1; 1461ab64890Smrg 1471ab64890Smrg if (new->first_modmap_key<first) 1481ab64890Smrg first = new->first_modmap_key; 1491ab64890Smrg if (oldLast>newLast) 1501ab64890Smrg newLast= oldLast; 1511ab64890Smrg old->first_modmap_key = first; 1521ab64890Smrg old->num_modmap_keys = newLast-first+1; 1531ab64890Smrg } 1541ab64890Smrg else { 1551ab64890Smrg old->first_modmap_key = new->first_modmap_key; 1561ab64890Smrg old->num_modmap_keys = new->num_modmap_keys; 1571ab64890Smrg } 1581ab64890Smrg } 1591ab64890Smrg if (wanted&XkbVirtualModMapMask) { 1601ab64890Smrg if (old->changed&XkbVirtualModMapMask) { 1611ab64890Smrg first = old->first_vmodmap_key; 1621ab64890Smrg oldLast = old->first_vmodmap_key+old->num_vmodmap_keys-1; 1631ab64890Smrg newLast = new->first_vmodmap_key+new->num_vmodmap_keys-1; 1641ab64890Smrg 1651ab64890Smrg if (new->first_vmodmap_key<first) 1661ab64890Smrg first = new->first_vmodmap_key; 1671ab64890Smrg if (oldLast>newLast) 1681ab64890Smrg newLast= oldLast; 1691ab64890Smrg old->first_vmodmap_key = first; 1701ab64890Smrg old->num_vmodmap_keys = newLast-first+1; 1711ab64890Smrg } 1721ab64890Smrg else { 1731ab64890Smrg old->first_vmodmap_key = new->first_vmodmap_key; 1741ab64890Smrg old->num_vmodmap_keys = new->num_vmodmap_keys; 1751ab64890Smrg } 1761ab64890Smrg } 1771ab64890Smrg old->changed|= wanted; 1781ab64890Smrg return; 1791ab64890Smrg} 1801ab64890Smrg 1811ab64890Smrgvoid 1821ab64890Smrg_XkbNoteCoreMapChanges( XkbMapChangesPtr old, 1831ab64890Smrg XMappingEvent * new, 1841ab64890Smrg unsigned int wanted) 1851ab64890Smrg{ 1861ab64890Smrg int first,oldLast,newLast; 1871ab64890Smrg 1881ab64890Smrg if ((new->request==MappingKeyboard)&&(wanted&XkbKeySymsMask)) { 1891ab64890Smrg if (old->changed&XkbKeySymsMask) { 1901ab64890Smrg first = old->first_key_sym; 1911ab64890Smrg oldLast = old->first_key_sym+old->num_key_syms-1; 1921ab64890Smrg newLast = new->first_keycode+new->count-1; 1931ab64890Smrg 1941ab64890Smrg if (new->first_keycode<first) 1951ab64890Smrg first = new->first_keycode; 1961ab64890Smrg if (oldLast>newLast) 1971ab64890Smrg newLast= oldLast; 1981ab64890Smrg old->first_key_sym = first; 1991ab64890Smrg old->num_key_syms = newLast-first+1; 2001ab64890Smrg } 2011ab64890Smrg else { 2021ab64890Smrg old->changed|= XkbKeySymsMask; 2031ab64890Smrg old->first_key_sym = new->first_keycode; 2041ab64890Smrg old->num_key_syms = new->count; 2051ab64890Smrg } 2061ab64890Smrg } 2071ab64890Smrg return; 2081ab64890Smrg} 2091ab64890Smrg 2101ab64890Smrgstatic Bool 2111ab64890Smrgwire_to_event(Display *dpy,XEvent *re,xEvent *event) 2121ab64890Smrg{ 2131ab64890Smrg xkbEvent *xkbevent= (xkbEvent *)event; 2141ab64890Smrg XkbInfoPtr xkbi; 2151ab64890Smrg 2161ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 2171ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 2181ab64890Smrg return False; 2191ab64890Smrg xkbi = dpy->xkb_info; 2201ab64890Smrg if (((event->u.u.type&0x7f)-xkbi->codes->first_event)!=XkbEventCode) 2211ab64890Smrg return False; 2221ab64890Smrg 2231ab64890Smrg switch (xkbevent->u.any.xkbType) { 2241ab64890Smrg case XkbStateNotify: 2251ab64890Smrg { 2261ab64890Smrg xkbStateNotify *sn = (xkbStateNotify *)event; 2271ab64890Smrg if ( xkbi->selected_events&XkbStateNotifyMask ) { 2281ab64890Smrg XkbStateNotifyEvent *sev=(XkbStateNotifyEvent *)re; 2291ab64890Smrg sev->type = XkbEventCode+xkbi->codes->first_event; 2301ab64890Smrg sev->xkb_type = XkbStateNotify; 2311ab64890Smrg sev->serial = _XSetLastRequestRead(dpy, 2321ab64890Smrg (xGenericReply *)event); 2331ab64890Smrg sev->send_event = ((event->u.u.type & 0x80) != 0); 2341ab64890Smrg sev->display = dpy; 2351ab64890Smrg sev->time = sn->time; 2361ab64890Smrg sev->device = sn->deviceID; 2371ab64890Smrg sev->keycode = sn->keycode; 2381ab64890Smrg sev->event_type = sn->eventType; 2391ab64890Smrg sev->req_major = sn->requestMajor; 2401ab64890Smrg sev->req_minor = sn->requestMinor; 2411ab64890Smrg sev->changed = sn->changed; 2421ab64890Smrg sev->group = sn->group; 2431ab64890Smrg sev->base_group = sn->baseGroup; 2441ab64890Smrg sev->latched_group = sn->latchedGroup; 2451ab64890Smrg sev->locked_group = sn->lockedGroup; 2461ab64890Smrg sev->mods = sn->mods; 2471ab64890Smrg sev->base_mods = sn->baseMods; 2481ab64890Smrg sev->latched_mods = sn->latchedMods; 2491ab64890Smrg sev->locked_mods = sn->lockedMods; 2501ab64890Smrg sev->compat_state = sn->compatState; 2511ab64890Smrg sev->grab_mods = sn->grabMods; 2521ab64890Smrg sev->compat_grab_mods = sn->compatGrabMods; 2531ab64890Smrg sev->lookup_mods = sn->lookupMods; 2541ab64890Smrg sev->compat_lookup_mods = sn->compatLookupMods; 2551ab64890Smrg sev->ptr_buttons = sn->ptrBtnState; 2561ab64890Smrg return True; 2571ab64890Smrg } 2581ab64890Smrg } 2591ab64890Smrg break; 2601ab64890Smrg case XkbMapNotify: 2611ab64890Smrg { 2621ab64890Smrg xkbMapNotify *mn = (xkbMapNotify *)event; 2631ab64890Smrg if ((xkbi->selected_events&XkbMapNotifyMask)&& 2641ab64890Smrg (xkbi->selected_map_details&mn->changed)) { 2651ab64890Smrg XkbMapNotifyEvent *mev; 2661ab64890Smrg mev =(XkbMapNotifyEvent *)re; 2671ab64890Smrg mev->type = XkbEventCode+xkbi->codes->first_event; 2681ab64890Smrg mev->xkb_type = XkbMapNotify; 2691ab64890Smrg mev->serial = _XSetLastRequestRead(dpy, 2701ab64890Smrg (xGenericReply *)event); 2711ab64890Smrg mev->send_event = ((event->u.u.type&0x80)!=0); 2721ab64890Smrg mev->display = dpy; 2731ab64890Smrg mev->time = mn->time; 2741ab64890Smrg mev->device = mn->deviceID; 2751ab64890Smrg mev->changed = mn->changed; 2761ab64890Smrg mev->min_key_code = mn->minKeyCode; 2771ab64890Smrg mev->max_key_code = mn->maxKeyCode; 2781ab64890Smrg mev->first_type = mn->firstType; 2791ab64890Smrg mev->num_types = mn->nTypes; 2801ab64890Smrg mev->first_key_sym = mn->firstKeySym; 2811ab64890Smrg mev->num_key_syms = mn->nKeySyms; 2821ab64890Smrg mev->first_key_act = mn->firstKeyAct; 2831ab64890Smrg mev->num_key_acts = mn->nKeyActs; 2841ab64890Smrg mev->first_key_behavior = mn->firstKeyBehavior; 2851ab64890Smrg mev->num_key_behaviors = mn->nKeyBehaviors; 2861ab64890Smrg mev->vmods = mn->virtualMods; 2871ab64890Smrg mev->first_key_explicit = mn->firstKeyExplicit; 2881ab64890Smrg mev->num_key_explicit = mn->nKeyExplicit; 2891ab64890Smrg mev->first_modmap_key = mn->firstModMapKey; 2901ab64890Smrg mev->num_modmap_keys = mn->nModMapKeys; 2911ab64890Smrg mev->first_vmodmap_key = mn->firstVModMapKey; 2921ab64890Smrg mev->num_vmodmap_keys = mn->nVModMapKeys; 2931ab64890Smrg XkbNoteMapChanges(&xkbi->changes,mev,XKB_XLIB_MAP_MASK); 2941ab64890Smrg if (xkbi->changes.changed) 2951ab64890Smrg xkbi->flags|= XkbMapPending; 2961ab64890Smrg return True; 2971ab64890Smrg } 2981ab64890Smrg else if (mn->nKeySyms>0) { 2991ab64890Smrg register XMappingEvent *ev = (XMappingEvent *)re; 3001ab64890Smrg ev->type = MappingNotify; 3011ab64890Smrg ev->serial = _XSetLastRequestRead(dpy, 3021ab64890Smrg (xGenericReply *)event); 3031ab64890Smrg ev->send_event = ((event->u.u.type&0x80)!=0); 3041ab64890Smrg ev->display = dpy; 3051ab64890Smrg ev->window = 0; 3061ab64890Smrg ev->first_keycode = mn->firstKeySym; 3071ab64890Smrg ev->request = MappingKeyboard; 3081ab64890Smrg ev->count = mn->nKeySyms; 3091ab64890Smrg _XkbNoteCoreMapChanges(&xkbi->changes,ev,XKB_XLIB_MAP_MASK); 3101ab64890Smrg if (xkbi->changes.changed) 3111ab64890Smrg xkbi->flags|= XkbMapPending; 3121ab64890Smrg return True; 3131ab64890Smrg } 3141ab64890Smrg } 3151ab64890Smrg break; 3161ab64890Smrg case XkbControlsNotify: 3171ab64890Smrg { 3181ab64890Smrg if (xkbi->selected_events&XkbControlsNotifyMask) { 3191ab64890Smrg xkbControlsNotify *cn =(xkbControlsNotify *)event; 3201ab64890Smrg XkbControlsNotifyEvent *cev; 3211ab64890Smrg cev =(XkbControlsNotifyEvent *)re; 3221ab64890Smrg cev->type = XkbEventCode+xkbi->codes->first_event; 3231ab64890Smrg cev->xkb_type = XkbControlsNotify; 3241ab64890Smrg cev->serial = _XSetLastRequestRead(dpy, 3251ab64890Smrg (xGenericReply *)event); 3261ab64890Smrg cev->send_event = ((event->u.u.type&0x80)!=0); 3271ab64890Smrg cev->display = dpy; 3281ab64890Smrg cev->time = cn->time; 3291ab64890Smrg cev->device = cn->deviceID; 3301ab64890Smrg cev->changed_ctrls = cn->changedControls; 3311ab64890Smrg cev->enabled_ctrls = cn->enabledControls; 3321ab64890Smrg cev->enabled_ctrl_changes = cn->enabledControlChanges; 3331ab64890Smrg cev->keycode = cn->keycode; 3341ab64890Smrg cev->num_groups = cn->numGroups; 3351ab64890Smrg cev->event_type = cn->eventType; 3361ab64890Smrg cev->req_major = cn->requestMajor; 3371ab64890Smrg cev->req_minor = cn->requestMinor; 3381ab64890Smrg return True; 3391ab64890Smrg } 3401ab64890Smrg } 3411ab64890Smrg break; 3421ab64890Smrg case XkbIndicatorMapNotify: 3431ab64890Smrg { 3441ab64890Smrg if (xkbi->selected_events&XkbIndicatorMapNotifyMask) { 3451ab64890Smrg xkbIndicatorNotify *in =(xkbIndicatorNotify *)event; 3461ab64890Smrg XkbIndicatorNotifyEvent *iev; 3471ab64890Smrg iev =(XkbIndicatorNotifyEvent *)re; 3481ab64890Smrg iev->type = XkbEventCode+xkbi->codes->first_event; 3491ab64890Smrg iev->xkb_type = XkbIndicatorMapNotify; 3501ab64890Smrg iev->serial = _XSetLastRequestRead(dpy, 3511ab64890Smrg (xGenericReply *)event); 3521ab64890Smrg iev->send_event = ((event->u.u.type&0x80)!=0); 3531ab64890Smrg iev->display = dpy; 3541ab64890Smrg iev->time = in->time; 3551ab64890Smrg iev->device = in->deviceID; 3561ab64890Smrg iev->changed = in->changed; 3571ab64890Smrg iev->state= in->state; 3581ab64890Smrg return True; 3591ab64890Smrg } 3601ab64890Smrg } 3611ab64890Smrg break; 3621ab64890Smrg case XkbIndicatorStateNotify: 3631ab64890Smrg { 3641ab64890Smrg if (xkbi->selected_events&XkbIndicatorStateNotifyMask) { 3651ab64890Smrg xkbIndicatorNotify *in =(xkbIndicatorNotify *)event; 3661ab64890Smrg XkbIndicatorNotifyEvent *iev; 3671ab64890Smrg iev =(XkbIndicatorNotifyEvent *)re; 3681ab64890Smrg iev->type = XkbEventCode+xkbi->codes->first_event; 3691ab64890Smrg iev->xkb_type = XkbIndicatorStateNotify; 3701ab64890Smrg iev->serial = _XSetLastRequestRead(dpy, 3711ab64890Smrg (xGenericReply *)event); 3721ab64890Smrg iev->send_event = ((event->u.u.type&0x80)!=0); 3731ab64890Smrg iev->display = dpy; 3741ab64890Smrg iev->time = in->time; 3751ab64890Smrg iev->device = in->deviceID; 3761ab64890Smrg iev->changed = in->changed; 3771ab64890Smrg iev->state= in->state; 3781ab64890Smrg return True; 3791ab64890Smrg } 3801ab64890Smrg } 3811ab64890Smrg break; 3821ab64890Smrg case XkbBellNotify: 3831ab64890Smrg { 3841ab64890Smrg if (xkbi->selected_events&XkbBellNotifyMask) { 3851ab64890Smrg xkbBellNotify *bn =(xkbBellNotify *)event; 3861ab64890Smrg XkbBellNotifyEvent *bev; 3871ab64890Smrg bev =(XkbBellNotifyEvent *)re; 3881ab64890Smrg bev->type = XkbEventCode+xkbi->codes->first_event; 3891ab64890Smrg bev->xkb_type = XkbBellNotify; 3901ab64890Smrg bev->serial = _XSetLastRequestRead(dpy, 3911ab64890Smrg (xGenericReply *)event); 3921ab64890Smrg bev->send_event = ((event->u.u.type&0x80)!=0); 3931ab64890Smrg bev->display = dpy; 3941ab64890Smrg bev->time = bn->time; 3951ab64890Smrg bev->device = bn->deviceID; 3961ab64890Smrg bev->percent = bn->percent; 3971ab64890Smrg bev->pitch = bn->pitch; 3981ab64890Smrg bev->duration = bn->duration; 3991ab64890Smrg bev->bell_class = bn->bellClass; 4001ab64890Smrg bev->bell_id = bn->bellID; 4011ab64890Smrg bev->name = bn->name; 4021ab64890Smrg bev->window = bn->window; 4031ab64890Smrg bev->event_only = bn->eventOnly; 4041ab64890Smrg return True; 4051ab64890Smrg } 4061ab64890Smrg } 4071ab64890Smrg break; 4081ab64890Smrg case XkbAccessXNotify: 4091ab64890Smrg { 4101ab64890Smrg if (xkbi->selected_events&XkbAccessXNotifyMask) { 4111ab64890Smrg xkbAccessXNotify *axn =(xkbAccessXNotify *)event; 4121ab64890Smrg XkbAccessXNotifyEvent *axev; 4131ab64890Smrg axev =(XkbAccessXNotifyEvent *)re; 4141ab64890Smrg axev->type = XkbEventCode+xkbi->codes->first_event; 4151ab64890Smrg axev->xkb_type = XkbAccessXNotify; 4161ab64890Smrg axev->serial = _XSetLastRequestRead(dpy, 4171ab64890Smrg (xGenericReply *)event); 4181ab64890Smrg axev->send_event = ((event->u.u.type&0x80)!=0); 4191ab64890Smrg axev->display = dpy; 4201ab64890Smrg axev->time = axn->time; 4211ab64890Smrg axev->device = axn->deviceID; 4221ab64890Smrg axev->detail = axn->detail; 4231ab64890Smrg axev->keycode = axn->keycode; 4241ab64890Smrg axev->sk_delay = axn->slowKeysDelay; 4251ab64890Smrg axev->debounce_delay = axn->debounceDelay; 4261ab64890Smrg return True; 4271ab64890Smrg } 4281ab64890Smrg } 4291ab64890Smrg break; 4301ab64890Smrg case XkbNamesNotify: 4311ab64890Smrg { 4321ab64890Smrg if (xkbi->selected_events&XkbNamesNotifyMask) { 4331ab64890Smrg xkbNamesNotify *nn =(xkbNamesNotify *)event; 4341ab64890Smrg XkbNamesNotifyEvent *nev; 4351ab64890Smrg nev =(XkbNamesNotifyEvent *)re; 4361ab64890Smrg nev->type = XkbEventCode+xkbi->codes->first_event; 4371ab64890Smrg nev->xkb_type = XkbNamesNotify; 4381ab64890Smrg nev->serial = _XSetLastRequestRead(dpy, 4391ab64890Smrg (xGenericReply *)event); 4401ab64890Smrg nev->send_event = ((event->u.u.type&0x80)!=0); 4411ab64890Smrg nev->display = dpy; 4421ab64890Smrg nev->time = nn->time; 4431ab64890Smrg nev->device = nn->deviceID; 4441ab64890Smrg nev->changed = nn->changed; 4451ab64890Smrg nev->first_type = nn->firstType; 4461ab64890Smrg nev->num_types = nn->nTypes; 4471ab64890Smrg nev->first_lvl = nn->firstLevelName; 4481ab64890Smrg nev->num_lvls = nn->nLevelNames; 4491ab64890Smrg nev->num_aliases = nn->nAliases; 4501ab64890Smrg nev->num_radio_groups = nn->nRadioGroups; 4511ab64890Smrg nev->changed_vmods = nn->changedVirtualMods; 4521ab64890Smrg nev->changed_groups = nn->changedGroupNames; 4531ab64890Smrg nev->changed_indicators = nn->changedIndicators; 4541ab64890Smrg nev->first_key = nn->firstKey; 4551ab64890Smrg nev->num_keys = nn->nKeys; 4561ab64890Smrg return True; 4571ab64890Smrg } 4581ab64890Smrg } 4591ab64890Smrg break; 4601ab64890Smrg case XkbCompatMapNotify: 4611ab64890Smrg { 4621ab64890Smrg if (xkbi->selected_events&XkbCompatMapNotifyMask) { 4631ab64890Smrg xkbCompatMapNotify *cmn =(xkbCompatMapNotify *)event; 4641ab64890Smrg XkbCompatMapNotifyEvent *cmev; 4651ab64890Smrg cmev =(XkbCompatMapNotifyEvent *)re; 4661ab64890Smrg cmev->type = XkbEventCode+xkbi->codes->first_event; 4671ab64890Smrg cmev->xkb_type = XkbCompatMapNotify; 4681ab64890Smrg cmev->serial = _XSetLastRequestRead(dpy, 4691ab64890Smrg (xGenericReply *)event); 4701ab64890Smrg cmev->send_event = ((event->u.u.type&0x80)!=0); 4711ab64890Smrg cmev->display = dpy; 4721ab64890Smrg cmev->time = cmn->time; 4731ab64890Smrg cmev->device = cmn->deviceID; 4741ab64890Smrg cmev->changed_groups = cmn->changedGroups; 4751ab64890Smrg cmev->first_si = cmn->firstSI; 4761ab64890Smrg cmev->num_si = cmn->nSI; 4771ab64890Smrg cmev->num_total_si = cmn->nTotalSI; 4781ab64890Smrg return True; 4791ab64890Smrg } 4801ab64890Smrg } 4811ab64890Smrg break; 4821ab64890Smrg case XkbActionMessage: 4831ab64890Smrg { 4841ab64890Smrg if (xkbi->selected_events&XkbActionMessageMask) { 4851ab64890Smrg xkbActionMessage *am= (xkbActionMessage *)event; 4861ab64890Smrg XkbActionMessageEvent *amev; 4871ab64890Smrg amev= (XkbActionMessageEvent *)re; 4881ab64890Smrg amev->type = XkbEventCode+xkbi->codes->first_event; 4891ab64890Smrg amev->xkb_type = XkbActionMessage; 4901ab64890Smrg amev->serial = _XSetLastRequestRead(dpy, 4911ab64890Smrg (xGenericReply *)event); 4921ab64890Smrg amev->send_event = ((event->u.u.type&0x80)!=0); 4931ab64890Smrg amev->display = dpy; 4941ab64890Smrg amev->time = am->time; 4951ab64890Smrg amev->device = am->deviceID; 4961ab64890Smrg amev->keycode = am->keycode; 4971ab64890Smrg amev->press = am->press; 4981ab64890Smrg amev->key_event_follows = am->keyEventFollows; 4991ab64890Smrg amev->group = am->group; 5001ab64890Smrg amev->mods = am->mods; 5011ab64890Smrg memcpy(amev->message,am->message,XkbActionMessageLength); 5021ab64890Smrg amev->message[XkbActionMessageLength]= '\0'; 5031ab64890Smrg return True; 5041ab64890Smrg } 5051ab64890Smrg } 5061ab64890Smrg break; 5071ab64890Smrg case XkbExtensionDeviceNotify: 5081ab64890Smrg { 5091ab64890Smrg if (xkbi->selected_events&XkbExtensionDeviceNotifyMask) { 5101ab64890Smrg xkbExtensionDeviceNotify *ed= 5111ab64890Smrg (xkbExtensionDeviceNotify *)event; 5121ab64890Smrg XkbExtensionDeviceNotifyEvent *edev; 5131ab64890Smrg edev= (XkbExtensionDeviceNotifyEvent *)re; 5141ab64890Smrg edev->type= XkbEventCode+xkbi->codes->first_event; 5151ab64890Smrg edev->xkb_type= XkbExtensionDeviceNotify; 5161ab64890Smrg edev->serial= _XSetLastRequestRead(dpy, 5171ab64890Smrg (xGenericReply *)event); 5181ab64890Smrg edev->send_event= ((event->u.u.type&0x80)!=0); 5191ab64890Smrg edev->display= dpy; 5201ab64890Smrg edev->time= ed->time; 5211ab64890Smrg edev->device= ed->deviceID; 5221ab64890Smrg edev->led_class= ed->ledClass; 5231ab64890Smrg edev->led_id= ed->ledID; 5241ab64890Smrg edev->reason= ed->reason; 5251ab64890Smrg edev->supported= ed->supported; 5261ab64890Smrg edev->leds_defined= ed->ledsDefined; 5271ab64890Smrg edev->led_state= ed->ledState; 5281ab64890Smrg edev->first_btn= ed->firstBtn; 5291ab64890Smrg edev->num_btns= ed->nBtns; 5301ab64890Smrg edev->unsupported= ed->unsupported; 5311ab64890Smrg return True; 5321ab64890Smrg } 5331ab64890Smrg } 5341ab64890Smrg break; 5351ab64890Smrg case XkbNewKeyboardNotify: 5361ab64890Smrg { 5371ab64890Smrg xkbNewKeyboardNotify *nkn = (xkbNewKeyboardNotify *)event; 5381ab64890Smrg if ((xkbi->selected_events&XkbNewKeyboardNotifyMask)&& 5391ab64890Smrg (xkbi->selected_nkn_details&nkn->changed)) { 5401ab64890Smrg XkbNewKeyboardNotifyEvent *nkev; 5411ab64890Smrg nkev =(XkbNewKeyboardNotifyEvent *)re; 5421ab64890Smrg nkev->type = XkbEventCode+xkbi->codes->first_event; 5431ab64890Smrg nkev->xkb_type = XkbNewKeyboardNotify; 5441ab64890Smrg nkev->serial = _XSetLastRequestRead(dpy, 5451ab64890Smrg (xGenericReply *)event); 5461ab64890Smrg nkev->send_event = ((event->u.u.type&0x80)!=0); 5471ab64890Smrg nkev->display = dpy; 5481ab64890Smrg nkev->time = nkn->time; 5491ab64890Smrg nkev->device = nkn->deviceID; 5501ab64890Smrg nkev->old_device = nkn->oldDeviceID; 5511ab64890Smrg nkev->min_key_code = nkn->minKeyCode; 5521ab64890Smrg nkev->max_key_code = nkn->maxKeyCode; 5531ab64890Smrg nkev->old_min_key_code = nkn->oldMinKeyCode; 5541ab64890Smrg nkev->old_max_key_code = nkn->oldMaxKeyCode; 5551ab64890Smrg nkev->req_major = nkn->requestMajor; 5561ab64890Smrg nkev->req_minor = nkn->requestMinor; 5571ab64890Smrg nkev->changed = nkn->changed; 5581ab64890Smrg if ((xkbi->desc)&&(nkev->send_event==0)&& 5591ab64890Smrg ((xkbi->desc->device_spec==nkev->old_device)|| 5601ab64890Smrg (nkev->device!=nkev->old_device))) { 5611ab64890Smrg xkbi->flags= XkbMapPending|XkbXlibNewKeyboard; 5621ab64890Smrg } 5631ab64890Smrg return True; 5641ab64890Smrg } 5651ab64890Smrg else if(nkn->changed&(XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask)){ 5661ab64890Smrg register XMappingEvent *ev = (XMappingEvent *)re; 5671ab64890Smrg ev->type = MappingNotify; 5681ab64890Smrg ev->serial = _XSetLastRequestRead(dpy, 5691ab64890Smrg (xGenericReply *)event); 5701ab64890Smrg ev->send_event = ((event->u.u.type&0x80)!=0); 5711ab64890Smrg ev->display = dpy; 5721ab64890Smrg ev->window = 0; 5731ab64890Smrg ev->first_keycode = dpy->min_keycode; 5741ab64890Smrg ev->request = MappingKeyboard; 5751ab64890Smrg ev->count = (dpy->max_keycode-dpy->min_keycode)+1; 5761ab64890Smrg if ((xkbi->desc)&&(ev->send_event==0)&& 5771ab64890Smrg ((xkbi->desc->device_spec==nkn->oldDeviceID)|| 5781ab64890Smrg (nkn->deviceID!=nkn->oldDeviceID))) { 5791ab64890Smrg xkbi->flags|= XkbMapPending|XkbXlibNewKeyboard; 5801ab64890Smrg } 5811ab64890Smrg return True; 5821ab64890Smrg } 5831ab64890Smrg } 5841ab64890Smrg break; 5851ab64890Smrg default: 5861ab64890Smrg#ifdef DEBUG 5871ab64890Smrg fprintf(stderr,"Got unknown XKEYBOARD event (%d, base=%d)\n", 5881ab64890Smrg re->type, 5891ab64890Smrg xkbi->codes->first_event); 5901ab64890Smrg#endif 5911ab64890Smrg break; 5921ab64890Smrg } 5931ab64890Smrg return False; 5941ab64890Smrg} 5951ab64890Smrg 5961ab64890SmrgBool 5971ab64890SmrgXkbIgnoreExtension(Bool ignore) 5981ab64890Smrg{ 5991ab64890Smrg if (getenv("XKB_FORCE")!=NULL) { 6001ab64890Smrg#ifdef DEBUG 6011ab64890Smrg fprintf(stderr,"Forcing use of XKEYBOARD (overriding an IgnoreExtensions)\n"); 6021ab64890Smrg#endif 6031ab64890Smrg return False; 6041ab64890Smrg } 6051ab64890Smrg#ifdef DEBUG 6061ab64890Smrg else if (getenv("XKB_DEBUG")!=NULL) { 6071ab64890Smrg fprintf(stderr,"Explicitly %signoring XKEYBOARD\n",ignore?"":"not "); 6081ab64890Smrg } 6091ab64890Smrg#endif 6101ab64890Smrg _XkbIgnoreExtension = ignore; 6111ab64890Smrg return True; 6121ab64890Smrg} 6131ab64890Smrg 6141ab64890Smrgstatic void 6151ab64890Smrg_XkbFreeInfo(Display *dpy) 6161ab64890Smrg{ 6171ab64890Smrg XkbInfoPtr xkbi = dpy->xkb_info; 6181ab64890Smrg if (xkbi) { 6191ab64890Smrg if (xkbi->desc) 6201ab64890Smrg XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True); 6211ab64890Smrg Xfree(xkbi); 6221ab64890Smrg } 6231ab64890Smrg} 6241ab64890Smrg 6251ab64890SmrgBool 6261ab64890SmrgXkbUseExtension(Display *dpy,int *major_rtrn,int *minor_rtrn) 6271ab64890Smrg{ 6281ab64890Smrg xkbUseExtensionReply rep; 6291ab64890Smrg register xkbUseExtensionReq *req; 6301ab64890Smrg XExtCodes *codes; 6311ab64890Smrg int ev_base,forceIgnore; 6321ab64890Smrg XkbInfoPtr xkbi; 6331ab64890Smrg char * str; 6341ab64890Smrg static int debugMsg; 6351ab64890Smrg static int been_here= 0; 6361ab64890Smrg 6371ab64890Smrg if ( dpy->xkb_info && !(dpy->flags & XlibDisplayNoXkb)) { 6381ab64890Smrg if (major_rtrn) *major_rtrn= dpy->xkb_info->srv_major; 6391ab64890Smrg if (minor_rtrn) *minor_rtrn= dpy->xkb_info->srv_minor; 6401ab64890Smrg return True; 6411ab64890Smrg } 6421ab64890Smrg if (!been_here) { 6431ab64890Smrg debugMsg= (getenv("XKB_DEBUG")!=NULL); 6441ab64890Smrg been_here= 1; 6451ab64890Smrg } 6461ab64890Smrg 6471ab64890Smrg if (major_rtrn) *major_rtrn= 0; 6481ab64890Smrg if (minor_rtrn) *minor_rtrn= 0; 6491ab64890Smrg 6501ab64890Smrg if (!dpy->xkb_info) { 6511ab64890Smrg xkbi = _XkbTypedCalloc(1, XkbInfoRec); 6521ab64890Smrg if ( !xkbi ) 6531ab64890Smrg return False; 6541ab64890Smrg dpy->xkb_info = xkbi; 6551ab64890Smrg dpy->free_funcs->xkb = _XkbFreeInfo; 6561ab64890Smrg 6571ab64890Smrg xkbi->xlib_ctrls|= (XkbLC_ControlFallback|XkbLC_ConsumeLookupMods); 6581ab64890Smrg if ((str=getenv("_XKB_OPTIONS_ENABLE"))!=NULL) { 6591ab64890Smrg if ((str=getenv("_XKB_LATIN1_LOOKUP"))!=NULL) { 6601ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6611ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_ForceLatin1Lookup; 6621ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_ForceLatin1Lookup; 6631ab64890Smrg } 6641ab64890Smrg if ((str=getenv("_XKB_CONSUME_LOOKUP_MODS"))!=NULL) { 6651ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6661ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_ConsumeLookupMods; 6671ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_ConsumeLookupMods; 6681ab64890Smrg } 6691ab64890Smrg if ((str=getenv("_XKB_CONSUME_SHIFT_AND_LOCK"))!=NULL) { 6701ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6711ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_AlwaysConsumeShiftAndLock; 6721ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_AlwaysConsumeShiftAndLock; 6731ab64890Smrg } 6741ab64890Smrg if ((str=getenv("_XKB_IGNORE_NEW_KEYBOARDS"))!=NULL) { 6751ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6761ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_IgnoreNewKeyboards; 6771ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_IgnoreNewKeyboards; 6781ab64890Smrg } 6791ab64890Smrg if ((str=getenv("_XKB_CONTROL_FALLBACK"))!=NULL) { 6801ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6811ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_ControlFallback; 6821ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_ControlFallback; 6831ab64890Smrg } 6841ab64890Smrg if ((str=getenv("_XKB_COMP_LED"))!=NULL) { 6851ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6861ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_ComposeLED; 6871ab64890Smrg else { 6881ab64890Smrg xkbi->xlib_ctrls|= XkbLC_ComposeLED; 6891ab64890Smrg if (strlen(str)>0) 6901ab64890Smrg xkbi->composeLED= XInternAtom(dpy,str,False); 6911ab64890Smrg } 6921ab64890Smrg } 6931ab64890Smrg if ((str=getenv("_XKB_COMP_FAIL_BEEP"))!=NULL) { 6941ab64890Smrg if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0)) 6951ab64890Smrg xkbi->xlib_ctrls&= ~XkbLC_BeepOnComposeFail; 6961ab64890Smrg else xkbi->xlib_ctrls|= XkbLC_BeepOnComposeFail; 6971ab64890Smrg } 6981ab64890Smrg } 6991ab64890Smrg if ((xkbi->composeLED==None)&&((xkbi->xlib_ctrls&XkbLC_ComposeLED)!=0)) 7001ab64890Smrg xkbi->composeLED= XInternAtom(dpy,"Compose",False); 7011ab64890Smrg#ifdef DEBUG 7021ab64890Smrg if (debugMsg) { 7031ab64890Smrg register unsigned c= xkbi->xlib_ctrls; 7041ab64890Smrg fprintf(stderr,"XKEYBOARD compose: beep on failure is %s, LED is %s\n", 7051ab64890Smrg ((c&XkbLC_BeepOnComposeFail)?"on":"off"), 7061ab64890Smrg ((c&XkbLC_ComposeLED)?"on":"off")); 7071ab64890Smrg fprintf(stderr,"XKEYBOARD XLookupString: %slatin-1, %s lookup modifiers\n", 7081ab64890Smrg ((c&XkbLC_ForceLatin1Lookup)?"allow non-":"force "), 7091ab64890Smrg ((c&XkbLC_ConsumeLookupMods)?"consume":"re-use")); 7101ab64890Smrg fprintf(stderr, 7111ab64890Smrg "XKEYBOARD XLookupString: %sconsume shift and lock, %scontrol fallback\n", 7121ab64890Smrg ((c&XkbLC_AlwaysConsumeShiftAndLock)?"always ":"don't "), 7131ab64890Smrg ((c&XkbLC_ControlFallback)?"":"no ")); 7141ab64890Smrg 7151ab64890Smrg } 7161ab64890Smrg#endif 7171ab64890Smrg } else 7181ab64890Smrg xkbi = dpy->xkb_info; 7191ab64890Smrg 7201ab64890Smrg forceIgnore= (dpy->flags&XlibDisplayNoXkb)||dpy->keysyms; 7211ab64890Smrg forceIgnore= forceIgnore&&(major_rtrn==NULL)&&(minor_rtrn==NULL); 7221ab64890Smrg if ( forceIgnore || _XkbIgnoreExtension || getenv("XKB_DISABLE")) { 7231ab64890Smrg LockDisplay(dpy); 7241ab64890Smrg dpy->flags |= XlibDisplayNoXkb; 7251ab64890Smrg UnlockDisplay(dpy); 7261ab64890Smrg if (debugMsg) 7271ab64890Smrg fprintf(stderr,"XKEYBOARD extension disabled or missing\n"); 7281ab64890Smrg return False; 7291ab64890Smrg } 7301ab64890Smrg 7311ab64890Smrg if ( (codes=XInitExtension(dpy,XkbName))==NULL ) { 7321ab64890Smrg LockDisplay(dpy); 7331ab64890Smrg dpy->flags |= XlibDisplayNoXkb; 7341ab64890Smrg UnlockDisplay(dpy); 7351ab64890Smrg if (debugMsg) 7361ab64890Smrg fprintf(stderr,"XKEYBOARD extension not present\n"); 7371ab64890Smrg return False; 7381ab64890Smrg } 7391ab64890Smrg xkbi->codes = codes; 7401ab64890Smrg LockDisplay(dpy); 7411ab64890Smrg 7421ab64890Smrg GetReq(kbUseExtension, req); 7431ab64890Smrg req->reqType = xkbi->codes->major_opcode; 7441ab64890Smrg req->xkbReqType = X_kbUseExtension; 7451ab64890Smrg req->wantedMajor = XkbMajorVersion; 7461ab64890Smrg req->wantedMinor = XkbMinorVersion; 7471ab64890Smrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.supported ) { 7481ab64890Smrg Bool fail; 7491ab64890Smrg fail= True; 7501ab64890Smrg if (debugMsg) 7511ab64890Smrg fprintf(stderr, 7521ab64890Smrg "XKEYBOARD version mismatch (want %d.%02d, got %d.%02d)\n", 7531ab64890Smrg XkbMajorVersion,XkbMinorVersion, 7541ab64890Smrg rep.serverMajor, rep.serverMinor); 7551ab64890Smrg 7561ab64890Smrg /* pre-release 0.65 is very close to 1.00 */ 7571ab64890Smrg if ((rep.serverMajor==0)&&(rep.serverMinor==65)) { 7581ab64890Smrg if (debugMsg) 7591ab64890Smrg fprintf(stderr,"Trying to fall back to version 0.65..."); 7601ab64890Smrg GetReq(kbUseExtension, req); 7611ab64890Smrg req->reqType = xkbi->codes->major_opcode; 7621ab64890Smrg req->xkbReqType = X_kbUseExtension; 7631ab64890Smrg req->wantedMajor = 0; 7641ab64890Smrg req->wantedMinor = 65; 7651ab64890Smrg if ( _XReply(dpy, (xReply *)&rep, 0, xFalse) && rep.supported ) { 7661ab64890Smrg if (debugMsg) 7671ab64890Smrg fprintf(stderr,"succeeded\n"); 7681ab64890Smrg fail= False; 7691ab64890Smrg } 7701ab64890Smrg else if (debugMsg) fprintf(stderr,"failed\n"); 7711ab64890Smrg } 7721ab64890Smrg if (fail) { 7731ab64890Smrg dpy->flags |= XlibDisplayNoXkb; 7741ab64890Smrg UnlockDisplay(dpy); 7751ab64890Smrg SyncHandle(); 7761ab64890Smrg if (major_rtrn) *major_rtrn= rep.serverMajor; 7771ab64890Smrg if (minor_rtrn) *minor_rtrn= rep.serverMinor; 7781ab64890Smrg return False; 7791ab64890Smrg } 7801ab64890Smrg } 7811ab64890Smrg#ifdef DEBUG 7821ab64890Smrg else if ( forceIgnore ) { 7831ab64890Smrg fprintf(stderr,"Internal Error! XkbUseExtension succeeded with forceIgnore set\n"); 7841ab64890Smrg } 7851ab64890Smrg#endif 7861ab64890Smrg UnlockDisplay(dpy); 7871ab64890Smrg xkbi->srv_major= rep.serverMajor; 7881ab64890Smrg xkbi->srv_minor= rep.serverMinor; 7891ab64890Smrg if (major_rtrn) *major_rtrn= rep.serverMajor; 7901ab64890Smrg if (minor_rtrn) *minor_rtrn= rep.serverMinor; 7911ab64890Smrg if (debugMsg) 7921ab64890Smrg fprintf(stderr,"XKEYBOARD (version %d.%02d/%d.%02d) OK!\n", 7931ab64890Smrg XkbMajorVersion,XkbMinorVersion, 7941ab64890Smrg rep.serverMajor,rep.serverMinor); 7951ab64890Smrg 7961ab64890Smrg ev_base = codes->first_event; 7971ab64890Smrg XESetWireToEvent(dpy,ev_base+XkbEventCode,wire_to_event); 7981ab64890Smrg SyncHandle(); 7991ab64890Smrg return True; 8001ab64890Smrg} 8011ab64890Smrg 802