XKBCtrls.c revision 1ab64890
11ab64890Smrg/* $Xorg: XKBCtrls.c,v 1.3 2000/08/17 19:45:00 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/XKBCtrls.c,v 1.4 2002/12/10 04:33:48 dawes Exp $ */ 281ab64890Smrg 291ab64890Smrg#ifdef HAVE_CONFIG_H 301ab64890Smrg#include <config.h> 311ab64890Smrg#endif 321ab64890Smrg#include <stdio.h> 331ab64890Smrg#define NEED_REPLIES 341ab64890Smrg#define NEED_EVENTS 351ab64890Smrg#include "Xlibint.h" 361ab64890Smrg#include <X11/extensions/XKBproto.h> 371ab64890Smrg#include "XKBlibint.h" 381ab64890Smrg 391ab64890Smrg 401ab64890Smrgstatic xkbSetControlsReq * 411ab64890Smrg_XkbGetSetControlsReq(Display *dpy,XkbInfoPtr xkbi,unsigned int deviceSpec) 421ab64890Smrg{ 431ab64890SmrgxkbSetControlsReq *req; 441ab64890Smrg 451ab64890Smrg GetReq(kbSetControls,req); 461ab64890Smrg bzero(req,SIZEOF(xkbSetControlsReq)); 471ab64890Smrg req->reqType = xkbi->codes->major_opcode; 481ab64890Smrg req->length = (SIZEOF(xkbSetControlsReq)>>2); 491ab64890Smrg req->xkbReqType = X_kbSetControls; 501ab64890Smrg req->deviceSpec = deviceSpec; 511ab64890Smrg return req; 521ab64890Smrg} 531ab64890Smrg 541ab64890SmrgBool 551ab64890SmrgXkbSetAutoRepeatRate( Display *dpy, 561ab64890Smrg unsigned int deviceSpec, 571ab64890Smrg unsigned int timeout, 581ab64890Smrg unsigned int interval) 591ab64890Smrg{ 601ab64890Smrg register xkbSetControlsReq *req; 611ab64890Smrg 621ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 631ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 641ab64890Smrg return False; 651ab64890Smrg LockDisplay(dpy); 661ab64890Smrg req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec); 671ab64890Smrg req->changeCtrls = XkbRepeatKeysMask; 681ab64890Smrg req->repeatDelay = timeout; 691ab64890Smrg req->repeatInterval = interval; 701ab64890Smrg UnlockDisplay(dpy); 711ab64890Smrg SyncHandle(); 721ab64890Smrg return True; 731ab64890Smrg} 741ab64890Smrg 751ab64890SmrgBool 761ab64890SmrgXkbGetAutoRepeatRate( Display * dpy, 771ab64890Smrg unsigned int deviceSpec, 781ab64890Smrg unsigned int * timeoutp, 791ab64890Smrg unsigned int * intervalp) 801ab64890Smrg{ 811ab64890Smrg register xkbGetControlsReq *req; 821ab64890Smrg xkbGetControlsReply rep; 831ab64890Smrg XkbInfoPtr xkbi; 841ab64890Smrg 851ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 861ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 871ab64890Smrg return False; 881ab64890Smrg LockDisplay(dpy); 891ab64890Smrg xkbi = dpy->xkb_info; 901ab64890Smrg GetReq(kbGetControls, req); 911ab64890Smrg req->reqType = xkbi->codes->major_opcode; 921ab64890Smrg req->xkbReqType = X_kbGetControls; 931ab64890Smrg req->deviceSpec = deviceSpec; 941ab64890Smrg if (!_XReply(dpy, (xReply *)&rep, 951ab64890Smrg (SIZEOF(xkbGetControlsReply)-SIZEOF(xReply))>>2, xFalse)) { 961ab64890Smrg UnlockDisplay(dpy); 971ab64890Smrg SyncHandle(); 981ab64890Smrg return False; 991ab64890Smrg } 1001ab64890Smrg UnlockDisplay(dpy); 1011ab64890Smrg SyncHandle(); 1021ab64890Smrg *timeoutp = rep.repeatDelay; 1031ab64890Smrg *intervalp = rep.repeatInterval; 1041ab64890Smrg return True; 1051ab64890Smrg} 1061ab64890Smrg 1071ab64890SmrgBool 1081ab64890SmrgXkbSetServerInternalMods( Display * dpy, 1091ab64890Smrg unsigned deviceSpec, 1101ab64890Smrg unsigned affectReal, 1111ab64890Smrg unsigned realValues, 1121ab64890Smrg unsigned affectVirtual, 1131ab64890Smrg unsigned virtualValues) 1141ab64890Smrg{ 1151ab64890Smrg register xkbSetControlsReq *req; 1161ab64890Smrg 1171ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 1181ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 1191ab64890Smrg return False; 1201ab64890Smrg LockDisplay(dpy); 1211ab64890Smrg req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec); 1221ab64890Smrg req->affectInternalMods = affectReal; 1231ab64890Smrg req->internalMods = realValues; 1241ab64890Smrg req->affectInternalVMods= affectVirtual; 1251ab64890Smrg req->internalVMods= virtualValues; 1261ab64890Smrg req->changeCtrls = XkbInternalModsMask; 1271ab64890Smrg UnlockDisplay(dpy); 1281ab64890Smrg SyncHandle(); 1291ab64890Smrg return True; 1301ab64890Smrg} 1311ab64890Smrg 1321ab64890SmrgBool 1331ab64890SmrgXkbSetIgnoreLockMods( Display * dpy, 1341ab64890Smrg unsigned int deviceSpec, 1351ab64890Smrg unsigned affectReal, 1361ab64890Smrg unsigned realValues, 1371ab64890Smrg unsigned affectVirtual, 1381ab64890Smrg unsigned virtualValues) 1391ab64890Smrg{ 1401ab64890Smrg register xkbSetControlsReq *req; 1411ab64890Smrg 1421ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 1431ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 1441ab64890Smrg return False; 1451ab64890Smrg LockDisplay(dpy); 1461ab64890Smrg req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec); 1471ab64890Smrg req->affectIgnoreLockMods= affectReal; 1481ab64890Smrg req->ignoreLockMods = realValues; 1491ab64890Smrg req->affectIgnoreLockVMods= affectVirtual; 1501ab64890Smrg req->ignoreLockVMods= virtualValues; 1511ab64890Smrg req->changeCtrls = XkbIgnoreLockModsMask; 1521ab64890Smrg UnlockDisplay(dpy); 1531ab64890Smrg SyncHandle(); 1541ab64890Smrg return True; 1551ab64890Smrg} 1561ab64890Smrg 1571ab64890SmrgBool 1581ab64890SmrgXkbChangeEnabledControls( Display * dpy, 1591ab64890Smrg unsigned deviceSpec, 1601ab64890Smrg unsigned affect, 1611ab64890Smrg unsigned values) 1621ab64890Smrg{ 1631ab64890Smrg register xkbSetControlsReq *req; 1641ab64890Smrg 1651ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 1661ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 1671ab64890Smrg return False; 1681ab64890Smrg LockDisplay(dpy); 1691ab64890Smrg req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec); 1701ab64890Smrg req->affectEnabledCtrls= affect; 1711ab64890Smrg req->enabledCtrls= (affect&values); 1721ab64890Smrg req->changeCtrls = XkbControlsEnabledMask; 1731ab64890Smrg UnlockDisplay(dpy); 1741ab64890Smrg SyncHandle(); 1751ab64890Smrg return True; 1761ab64890Smrg} 1771ab64890Smrg 1781ab64890SmrgStatus 1791ab64890SmrgXkbGetControls(Display *dpy, unsigned long which, XkbDescPtr xkb) 1801ab64890Smrg{ 1811ab64890Smrg register xkbGetControlsReq *req; 1821ab64890Smrg xkbGetControlsReply rep; 1831ab64890Smrg XkbControlsPtr ctrls; 1841ab64890Smrg XkbInfoPtr xkbi; 1851ab64890Smrg 1861ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 1871ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 1881ab64890Smrg return BadAccess; 1891ab64890Smrg if ((!xkb) || (!which)) 1901ab64890Smrg return BadMatch; 1911ab64890Smrg 1921ab64890Smrg LockDisplay(dpy); 1931ab64890Smrg xkbi = dpy->xkb_info; 1941ab64890Smrg GetReq(kbGetControls, req); 1951ab64890Smrg if (!xkb->ctrls) { 1961ab64890Smrg xkb->ctrls = _XkbTypedCalloc(1,XkbControlsRec); 1971ab64890Smrg if (!xkb->ctrls) { 1981ab64890Smrg UnlockDisplay(dpy); 1991ab64890Smrg SyncHandle(); 2001ab64890Smrg return BadAlloc; 2011ab64890Smrg } 2021ab64890Smrg } 2031ab64890Smrg req->reqType = xkbi->codes->major_opcode; 2041ab64890Smrg req->xkbReqType = X_kbGetControls; 2051ab64890Smrg req->deviceSpec = xkb->device_spec; 2061ab64890Smrg if (!_XReply(dpy, (xReply *)&rep, 2071ab64890Smrg (SIZEOF(xkbGetControlsReply)-SIZEOF(xReply))>>2, xFalse)) { 2081ab64890Smrg UnlockDisplay(dpy); 2091ab64890Smrg SyncHandle(); 2101ab64890Smrg return BadImplementation; 2111ab64890Smrg } 2121ab64890Smrg if (xkb->device_spec==XkbUseCoreKbd) 2131ab64890Smrg xkb->device_spec= rep.deviceID; 2141ab64890Smrg ctrls= xkb->ctrls; 2151ab64890Smrg if (which&XkbControlsEnabledMask) 2161ab64890Smrg ctrls->enabled_ctrls = rep.enabledCtrls; 2171ab64890Smrg ctrls->num_groups= rep.numGroups; 2181ab64890Smrg if (which&XkbGroupsWrapMask) 2191ab64890Smrg ctrls->groups_wrap= rep.groupsWrap; 2201ab64890Smrg if (which&XkbInternalModsMask) { 2211ab64890Smrg ctrls->internal.mask = rep.internalMods; 2221ab64890Smrg ctrls->internal.real_mods = rep.internalRealMods; 2231ab64890Smrg ctrls->internal.vmods = rep.internalVMods; 2241ab64890Smrg } 2251ab64890Smrg if (which&XkbIgnoreLockModsMask) { 2261ab64890Smrg ctrls->ignore_lock.mask = rep.ignoreLockMods; 2271ab64890Smrg ctrls->ignore_lock.real_mods = rep.ignoreLockRealMods; 2281ab64890Smrg ctrls->ignore_lock.vmods = rep.ignoreLockVMods; 2291ab64890Smrg } 2301ab64890Smrg if (which&XkbRepeatKeysMask) { 2311ab64890Smrg ctrls->repeat_delay = rep.repeatDelay; 2321ab64890Smrg ctrls->repeat_interval = rep.repeatInterval; 2331ab64890Smrg } 2341ab64890Smrg if (which&XkbSlowKeysMask) 2351ab64890Smrg ctrls->slow_keys_delay = rep.slowKeysDelay; 2361ab64890Smrg if (which&XkbBounceKeysMask) 2371ab64890Smrg ctrls->debounce_delay = rep.debounceDelay; 2381ab64890Smrg if (which&XkbMouseKeysMask) { 2391ab64890Smrg ctrls->mk_dflt_btn = rep.mkDfltBtn; 2401ab64890Smrg } 2411ab64890Smrg if (which&XkbMouseKeysAccelMask) { 2421ab64890Smrg ctrls->mk_delay = rep.mkDelay; 2431ab64890Smrg ctrls->mk_interval = rep.mkInterval; 2441ab64890Smrg ctrls->mk_time_to_max = rep.mkTimeToMax; 2451ab64890Smrg ctrls->mk_max_speed = rep.mkMaxSpeed; 2461ab64890Smrg ctrls->mk_curve = rep.mkCurve; 2471ab64890Smrg } 2481ab64890Smrg if (which&XkbAccessXKeysMask) 2491ab64890Smrg ctrls->ax_options= rep.axOptions; 2501ab64890Smrg if (which&XkbStickyKeysMask) { 2511ab64890Smrg ctrls->ax_options &= ~XkbAX_SKOptionsMask; 2521ab64890Smrg ctrls->ax_options |= rep.axOptions & XkbAX_SKOptionsMask; 2531ab64890Smrg } 2541ab64890Smrg if (which&XkbAccessXFeedbackMask) { 2551ab64890Smrg ctrls->ax_options &= ~XkbAX_FBOptionsMask; 2561ab64890Smrg ctrls->ax_options |= rep.axOptions & XkbAX_FBOptionsMask; 2571ab64890Smrg } 2581ab64890Smrg if (which&XkbAccessXTimeoutMask) { 2591ab64890Smrg ctrls->ax_timeout = rep.axTimeout; 2601ab64890Smrg ctrls->axt_ctrls_mask = rep.axtCtrlsMask; 2611ab64890Smrg ctrls->axt_ctrls_values = rep.axtCtrlsValues; 2621ab64890Smrg ctrls->axt_opts_mask = rep.axtOptsMask; 2631ab64890Smrg ctrls->axt_opts_values= rep.axtOptsValues; 2641ab64890Smrg } 2651ab64890Smrg if (which&XkbPerKeyRepeatMask) { 2661ab64890Smrg memcpy(ctrls->per_key_repeat,rep.perKeyRepeat, 2671ab64890Smrg XkbPerKeyBitArraySize); 2681ab64890Smrg } 2691ab64890Smrg UnlockDisplay(dpy); 2701ab64890Smrg SyncHandle(); 2711ab64890Smrg return Success; 2721ab64890Smrg} 2731ab64890Smrg 2741ab64890SmrgBool 2751ab64890SmrgXkbSetControls(Display *dpy, unsigned long which, XkbDescPtr xkb) 2761ab64890Smrg{ 2771ab64890Smrg register xkbSetControlsReq *req; 2781ab64890Smrg XkbControlsPtr ctrls; 2791ab64890Smrg 2801ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 2811ab64890Smrg (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) 2821ab64890Smrg return False; 2831ab64890Smrg if ((!xkb)||(!xkb->ctrls)) 2841ab64890Smrg return False; 2851ab64890Smrg 2861ab64890Smrg ctrls= xkb->ctrls; 2871ab64890Smrg LockDisplay(dpy); 2881ab64890Smrg req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,xkb->device_spec); 2891ab64890Smrg req->changeCtrls = (CARD32)which; 2901ab64890Smrg if (which&XkbInternalModsMask) { 2911ab64890Smrg req->affectInternalMods= ~0; 2921ab64890Smrg req->internalMods= ctrls->internal.real_mods; 2931ab64890Smrg req->affectInternalVMods = ~0; 2941ab64890Smrg req->internalVMods= ctrls->internal.vmods; 2951ab64890Smrg } 2961ab64890Smrg if (which&XkbIgnoreLockModsMask) { 2971ab64890Smrg req->affectIgnoreLockMods= ~0; 2981ab64890Smrg req->ignoreLockMods= ctrls->ignore_lock.real_mods; 2991ab64890Smrg req->affectIgnoreLockVMods= ~0; 3001ab64890Smrg req->ignoreLockVMods= ctrls->ignore_lock.vmods; 3011ab64890Smrg } 3021ab64890Smrg if (which&XkbControlsEnabledMask) { 3031ab64890Smrg req->affectEnabledCtrls= XkbAllBooleanCtrlsMask; 3041ab64890Smrg req->enabledCtrls= ctrls->enabled_ctrls; 3051ab64890Smrg } 3061ab64890Smrg if (which&XkbRepeatKeysMask) { 3071ab64890Smrg req->repeatDelay = ctrls->repeat_delay; 3081ab64890Smrg req->repeatInterval = ctrls->repeat_interval; 3091ab64890Smrg } 3101ab64890Smrg if (which&XkbSlowKeysMask) 3111ab64890Smrg req->slowKeysDelay = ctrls->slow_keys_delay; 3121ab64890Smrg if (which&XkbBounceKeysMask) 3131ab64890Smrg req->debounceDelay = ctrls->debounce_delay; 3141ab64890Smrg if (which&XkbMouseKeysMask) { 3151ab64890Smrg req->mkDfltBtn = ctrls->mk_dflt_btn; 3161ab64890Smrg } 3171ab64890Smrg if (which&XkbGroupsWrapMask) 3181ab64890Smrg req->groupsWrap= ctrls->groups_wrap; 3191ab64890Smrg if (which&(XkbAccessXKeysMask|XkbStickyKeysMask|XkbAccessXFeedbackMask)) 3201ab64890Smrg req->axOptions= ctrls->ax_options; 3211ab64890Smrg if (which&XkbMouseKeysAccelMask) { 3221ab64890Smrg req->mkDelay = ctrls->mk_delay; 3231ab64890Smrg req->mkInterval = ctrls->mk_interval; 3241ab64890Smrg req->mkTimeToMax = ctrls->mk_time_to_max; 3251ab64890Smrg req->mkMaxSpeed = ctrls->mk_max_speed; 3261ab64890Smrg req->mkCurve = ctrls->mk_curve; 3271ab64890Smrg } 3281ab64890Smrg if (which&XkbAccessXTimeoutMask) { 3291ab64890Smrg req->axTimeout = ctrls->ax_timeout; 3301ab64890Smrg req->axtCtrlsMask = ctrls->axt_ctrls_mask; 3311ab64890Smrg req->axtCtrlsValues = ctrls->axt_ctrls_values; 3321ab64890Smrg req->axtOptsMask = ctrls->axt_opts_mask; 3331ab64890Smrg req->axtOptsValues=ctrls->axt_opts_values; 3341ab64890Smrg } 3351ab64890Smrg if (which&XkbPerKeyRepeatMask) { 3361ab64890Smrg memcpy(req->perKeyRepeat,ctrls->per_key_repeat, 3371ab64890Smrg XkbPerKeyBitArraySize); 3381ab64890Smrg } 3391ab64890Smrg UnlockDisplay(dpy); 3401ab64890Smrg SyncHandle(); 3411ab64890Smrg return True; 3421ab64890Smrg} 3431ab64890Smrg 3441ab64890Smrg/***====================================================================***/ 3451ab64890Smrg 3461ab64890Smrgvoid 3471ab64890SmrgXkbNoteControlsChanges( XkbControlsChangesPtr old, 3481ab64890Smrg XkbControlsNotifyEvent * new, 3491ab64890Smrg unsigned int wanted) 3501ab64890Smrg{ 3511ab64890Smrg old->changed_ctrls|= (new->changed_ctrls&wanted); 3521ab64890Smrg if (new->changed_ctrls&XkbControlsEnabledMask&wanted) 3531ab64890Smrg old->enabled_ctrls_changes^= new->enabled_ctrl_changes; 3541ab64890Smrg /* num_groups_changed?? */ 3551ab64890Smrg return; 3561ab64890Smrg} 357