XKBCtrls.c revision 818534a1
11ab64890Smrg/************************************************************ 21ab64890SmrgCopyright (c) 1993 by Silicon Graphics Computer Systems, Inc. 31ab64890Smrg 41ab64890SmrgPermission to use, copy, modify, and distribute this 51ab64890Smrgsoftware and its documentation for any purpose and without 61ab64890Smrgfee is hereby granted, provided that the above copyright 71ab64890Smrgnotice appear in all copies and that both that copyright 81ab64890Smrgnotice and this permission notice appear in supporting 961b2299dSmrgdocumentation, and that the name of Silicon Graphics not be 1061b2299dSmrgused in advertising or publicity pertaining to distribution 111ab64890Smrgof the software without specific prior written permission. 1261b2299dSmrgSilicon Graphics makes no representation about the suitability 131ab64890Smrgof this software for any purpose. It is provided "as is" 141ab64890Smrgwithout any express or implied warranty. 151ab64890Smrg 1661b2299dSmrgSILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 1761b2299dSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 181ab64890SmrgAND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON 1961b2299dSmrgGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 2061b2299dSmrgDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 2161b2299dSmrgDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 221ab64890SmrgOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH 231ab64890SmrgTHE USE OR PERFORMANCE OF THIS SOFTWARE. 241ab64890Smrg 251ab64890Smrg********************************************************/ 261ab64890Smrg 271ab64890Smrg#ifdef HAVE_CONFIG_H 281ab64890Smrg#include <config.h> 291ab64890Smrg#endif 301ab64890Smrg#include <stdio.h> 311ab64890Smrg#include "Xlibint.h" 321ab64890Smrg#include <X11/extensions/XKBproto.h> 331ab64890Smrg#include "XKBlibint.h" 341ab64890Smrg 351ab64890Smrg 361ab64890Smrgstatic xkbSetControlsReq * 37818534a1Smrg_XkbGetSetControlsReq(Display *dpy, XkbInfoPtr xkbi, unsigned int deviceSpec) 381ab64890Smrg{ 39818534a1Smrg xkbSetControlsReq *req; 401ab64890Smrg 41818534a1Smrg GetReq(kbSetControls, req); 42818534a1Smrg bzero(req, SIZEOF(xkbSetControlsReq)); 431ab64890Smrg req->reqType = xkbi->codes->major_opcode; 44818534a1Smrg req->length = (SIZEOF(xkbSetControlsReq) >> 2); 451ab64890Smrg req->xkbReqType = X_kbSetControls; 461ab64890Smrg req->deviceSpec = deviceSpec; 471ab64890Smrg return req; 481ab64890Smrg} 491ab64890Smrg 5061b2299dSmrgBool 51818534a1SmrgXkbSetAutoRepeatRate(Display *dpy, 52818534a1Smrg unsigned int deviceSpec, 53818534a1Smrg unsigned int timeout, 54818534a1Smrg unsigned int interval) 551ab64890Smrg{ 561ab64890Smrg register xkbSetControlsReq *req; 571ab64890Smrg 581ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 59818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 60818534a1Smrg return False; 611ab64890Smrg LockDisplay(dpy); 62818534a1Smrg req = _XkbGetSetControlsReq(dpy, dpy->xkb_info, deviceSpec); 631ab64890Smrg req->changeCtrls = XkbRepeatKeysMask; 641ab64890Smrg req->repeatDelay = timeout; 651ab64890Smrg req->repeatInterval = interval; 661ab64890Smrg UnlockDisplay(dpy); 671ab64890Smrg SyncHandle(); 681ab64890Smrg return True; 691ab64890Smrg} 701ab64890Smrg 7161b2299dSmrgBool 72818534a1SmrgXkbGetAutoRepeatRate(Display *dpy, 73818534a1Smrg unsigned int deviceSpec, 74818534a1Smrg unsigned int *timeoutp, 75818534a1Smrg unsigned int *intervalp) 761ab64890Smrg{ 771ab64890Smrg register xkbGetControlsReq *req; 781ab64890Smrg xkbGetControlsReply rep; 791ab64890Smrg XkbInfoPtr xkbi; 801ab64890Smrg 811ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 82818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 83818534a1Smrg return False; 841ab64890Smrg LockDisplay(dpy); 851ab64890Smrg xkbi = dpy->xkb_info; 861ab64890Smrg GetReq(kbGetControls, req); 871ab64890Smrg req->reqType = xkbi->codes->major_opcode; 881ab64890Smrg req->xkbReqType = X_kbGetControls; 891ab64890Smrg req->deviceSpec = deviceSpec; 90818534a1Smrg if (!_XReply(dpy, (xReply *) &rep, 91818534a1Smrg (SIZEOF(xkbGetControlsReply) - SIZEOF(xReply)) >> 2, xFalse)) { 92818534a1Smrg UnlockDisplay(dpy); 93818534a1Smrg SyncHandle(); 94818534a1Smrg return False; 951ab64890Smrg } 961ab64890Smrg UnlockDisplay(dpy); 971ab64890Smrg SyncHandle(); 981ab64890Smrg *timeoutp = rep.repeatDelay; 991ab64890Smrg *intervalp = rep.repeatInterval; 1001ab64890Smrg return True; 1011ab64890Smrg} 1021ab64890Smrg 1031ab64890SmrgBool 104818534a1SmrgXkbSetServerInternalMods(Display *dpy, 105818534a1Smrg unsigned deviceSpec, 106818534a1Smrg unsigned affectReal, 107818534a1Smrg unsigned realValues, 108818534a1Smrg unsigned affectVirtual, 109818534a1Smrg unsigned virtualValues) 1101ab64890Smrg{ 1111ab64890Smrg register xkbSetControlsReq *req; 1121ab64890Smrg 1131ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 114818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 115818534a1Smrg return False; 1161ab64890Smrg LockDisplay(dpy); 117818534a1Smrg req = _XkbGetSetControlsReq(dpy, dpy->xkb_info, deviceSpec); 1181ab64890Smrg req->affectInternalMods = affectReal; 1191ab64890Smrg req->internalMods = realValues; 120818534a1Smrg req->affectInternalVMods = affectVirtual; 121818534a1Smrg req->internalVMods = virtualValues; 1221ab64890Smrg req->changeCtrls = XkbInternalModsMask; 1231ab64890Smrg UnlockDisplay(dpy); 1241ab64890Smrg SyncHandle(); 1251ab64890Smrg return True; 1261ab64890Smrg} 1271ab64890Smrg 1281ab64890SmrgBool 129818534a1SmrgXkbSetIgnoreLockMods(Display *dpy, 130818534a1Smrg unsigned int deviceSpec, 131818534a1Smrg unsigned affectReal, 132818534a1Smrg unsigned realValues, 133818534a1Smrg unsigned affectVirtual, 134818534a1Smrg unsigned virtualValues) 1351ab64890Smrg{ 1361ab64890Smrg register xkbSetControlsReq *req; 1371ab64890Smrg 1381ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 139818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 140818534a1Smrg return False; 1411ab64890Smrg LockDisplay(dpy); 142818534a1Smrg req = _XkbGetSetControlsReq(dpy, dpy->xkb_info, deviceSpec); 143818534a1Smrg req->affectIgnoreLockMods = affectReal; 1441ab64890Smrg req->ignoreLockMods = realValues; 145818534a1Smrg req->affectIgnoreLockVMods = affectVirtual; 146818534a1Smrg req->ignoreLockVMods = virtualValues; 1471ab64890Smrg req->changeCtrls = XkbIgnoreLockModsMask; 1481ab64890Smrg UnlockDisplay(dpy); 1491ab64890Smrg SyncHandle(); 1501ab64890Smrg return True; 1511ab64890Smrg} 1521ab64890Smrg 1531ab64890SmrgBool 154818534a1SmrgXkbChangeEnabledControls(Display *dpy, 155818534a1Smrg unsigned deviceSpec, 156818534a1Smrg unsigned affect, 157818534a1Smrg unsigned values) 1581ab64890Smrg{ 1591ab64890Smrg register xkbSetControlsReq *req; 1601ab64890Smrg 1611ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 162818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 163818534a1Smrg return False; 1641ab64890Smrg LockDisplay(dpy); 165818534a1Smrg req = _XkbGetSetControlsReq(dpy, dpy->xkb_info, deviceSpec); 166818534a1Smrg req->affectEnabledCtrls = affect; 167818534a1Smrg req->enabledCtrls = (affect & values); 1681ab64890Smrg req->changeCtrls = XkbControlsEnabledMask; 1691ab64890Smrg UnlockDisplay(dpy); 1701ab64890Smrg SyncHandle(); 1711ab64890Smrg return True; 1721ab64890Smrg} 1731ab64890Smrg 17461b2299dSmrgStatus 1751ab64890SmrgXkbGetControls(Display *dpy, unsigned long which, XkbDescPtr xkb) 1761ab64890Smrg{ 1771ab64890Smrg register xkbGetControlsReq *req; 1781ab64890Smrg xkbGetControlsReply rep; 179818534a1Smrg XkbControlsPtr ctrls; 1801ab64890Smrg XkbInfoPtr xkbi; 1811ab64890Smrg 1821ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 183818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 184818534a1Smrg return BadAccess; 1851ab64890Smrg if ((!xkb) || (!which)) 186818534a1Smrg return BadMatch; 1871ab64890Smrg 1881ab64890Smrg LockDisplay(dpy); 1891ab64890Smrg xkbi = dpy->xkb_info; 1901ab64890Smrg GetReq(kbGetControls, req); 191818534a1Smrg if (!xkb->ctrls) { 192818534a1Smrg xkb->ctrls = _XkbTypedCalloc(1, XkbControlsRec); 193818534a1Smrg if (!xkb->ctrls) { 194818534a1Smrg UnlockDisplay(dpy); 195818534a1Smrg SyncHandle(); 196818534a1Smrg return BadAlloc; 197818534a1Smrg } 1981ab64890Smrg } 1991ab64890Smrg req->reqType = xkbi->codes->major_opcode; 2001ab64890Smrg req->xkbReqType = X_kbGetControls; 2011ab64890Smrg req->deviceSpec = xkb->device_spec; 202818534a1Smrg if (!_XReply(dpy, (xReply *) &rep, 203818534a1Smrg (SIZEOF(xkbGetControlsReply) - SIZEOF(xReply)) >> 2, xFalse)) { 204818534a1Smrg UnlockDisplay(dpy); 205818534a1Smrg SyncHandle(); 206818534a1Smrg return BadImplementation; 2071ab64890Smrg } 208818534a1Smrg if (xkb->device_spec == XkbUseCoreKbd) 209818534a1Smrg xkb->device_spec = rep.deviceID; 210818534a1Smrg ctrls = xkb->ctrls; 211818534a1Smrg if (which & XkbControlsEnabledMask) 212818534a1Smrg ctrls->enabled_ctrls = rep.enabledCtrls; 213818534a1Smrg ctrls->num_groups = rep.numGroups; 214818534a1Smrg if (which & XkbGroupsWrapMask) 215818534a1Smrg ctrls->groups_wrap = rep.groupsWrap; 216818534a1Smrg if (which & XkbInternalModsMask) { 217818534a1Smrg ctrls->internal.mask = rep.internalMods; 218818534a1Smrg ctrls->internal.real_mods = rep.internalRealMods; 219818534a1Smrg ctrls->internal.vmods = rep.internalVMods; 2201ab64890Smrg } 221818534a1Smrg if (which & XkbIgnoreLockModsMask) { 222818534a1Smrg ctrls->ignore_lock.mask = rep.ignoreLockMods; 223818534a1Smrg ctrls->ignore_lock.real_mods = rep.ignoreLockRealMods; 224818534a1Smrg ctrls->ignore_lock.vmods = rep.ignoreLockVMods; 2251ab64890Smrg } 226818534a1Smrg if (which & XkbRepeatKeysMask) { 227818534a1Smrg ctrls->repeat_delay = rep.repeatDelay; 228818534a1Smrg ctrls->repeat_interval = rep.repeatInterval; 2291ab64890Smrg } 230818534a1Smrg if (which & XkbSlowKeysMask) 231818534a1Smrg ctrls->slow_keys_delay = rep.slowKeysDelay; 232818534a1Smrg if (which & XkbBounceKeysMask) 233818534a1Smrg ctrls->debounce_delay = rep.debounceDelay; 234818534a1Smrg if (which & XkbMouseKeysMask) { 235818534a1Smrg ctrls->mk_dflt_btn = rep.mkDfltBtn; 2361ab64890Smrg } 237818534a1Smrg if (which & XkbMouseKeysAccelMask) { 238818534a1Smrg ctrls->mk_delay = rep.mkDelay; 239818534a1Smrg ctrls->mk_interval = rep.mkInterval; 240818534a1Smrg ctrls->mk_time_to_max = rep.mkTimeToMax; 241818534a1Smrg ctrls->mk_max_speed = rep.mkMaxSpeed; 242818534a1Smrg ctrls->mk_curve = rep.mkCurve; 2431ab64890Smrg } 244818534a1Smrg if (which & XkbAccessXKeysMask) 245818534a1Smrg ctrls->ax_options = rep.axOptions; 246818534a1Smrg if (which & XkbStickyKeysMask) { 247818534a1Smrg ctrls->ax_options &= ~XkbAX_SKOptionsMask; 248818534a1Smrg ctrls->ax_options |= rep.axOptions & XkbAX_SKOptionsMask; 2491ab64890Smrg } 250818534a1Smrg if (which & XkbAccessXFeedbackMask) { 251818534a1Smrg ctrls->ax_options &= ~XkbAX_FBOptionsMask; 252818534a1Smrg ctrls->ax_options |= rep.axOptions & XkbAX_FBOptionsMask; 2531ab64890Smrg } 254818534a1Smrg if (which & XkbAccessXTimeoutMask) { 255818534a1Smrg ctrls->ax_timeout = rep.axTimeout; 256818534a1Smrg ctrls->axt_ctrls_mask = rep.axtCtrlsMask; 257818534a1Smrg ctrls->axt_ctrls_values = rep.axtCtrlsValues; 258818534a1Smrg ctrls->axt_opts_mask = rep.axtOptsMask; 259818534a1Smrg ctrls->axt_opts_values = rep.axtOptsValues; 2601ab64890Smrg } 261818534a1Smrg if (which & XkbPerKeyRepeatMask) { 262818534a1Smrg memcpy(ctrls->per_key_repeat, rep.perKeyRepeat, XkbPerKeyBitArraySize); 2631ab64890Smrg } 2641ab64890Smrg UnlockDisplay(dpy); 2651ab64890Smrg SyncHandle(); 2661ab64890Smrg return Success; 2671ab64890Smrg} 2681ab64890Smrg 26961b2299dSmrgBool 2701ab64890SmrgXkbSetControls(Display *dpy, unsigned long which, XkbDescPtr xkb) 2711ab64890Smrg{ 2721ab64890Smrg register xkbSetControlsReq *req; 273818534a1Smrg XkbControlsPtr ctrls; 2741ab64890Smrg 2751ab64890Smrg if ((dpy->flags & XlibDisplayNoXkb) || 276818534a1Smrg (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) 277818534a1Smrg return False; 278818534a1Smrg if ((!xkb) || (!xkb->ctrls)) 279818534a1Smrg return False; 2801ab64890Smrg 281818534a1Smrg ctrls = xkb->ctrls; 2821ab64890Smrg LockDisplay(dpy); 283818534a1Smrg req = _XkbGetSetControlsReq(dpy, dpy->xkb_info, xkb->device_spec); 284818534a1Smrg req->changeCtrls = (CARD32) which; 285818534a1Smrg if (which & XkbInternalModsMask) { 286818534a1Smrg req->affectInternalMods = ~0; 287818534a1Smrg req->internalMods = ctrls->internal.real_mods; 288818534a1Smrg req->affectInternalVMods = ~0; 289818534a1Smrg req->internalVMods = ctrls->internal.vmods; 2901ab64890Smrg } 291818534a1Smrg if (which & XkbIgnoreLockModsMask) { 292818534a1Smrg req->affectIgnoreLockMods = ~0; 293818534a1Smrg req->ignoreLockMods = ctrls->ignore_lock.real_mods; 294818534a1Smrg req->affectIgnoreLockVMods = ~0; 295818534a1Smrg req->ignoreLockVMods = ctrls->ignore_lock.vmods; 2961ab64890Smrg } 297818534a1Smrg if (which & XkbControlsEnabledMask) { 298818534a1Smrg req->affectEnabledCtrls = XkbAllBooleanCtrlsMask; 299818534a1Smrg req->enabledCtrls = ctrls->enabled_ctrls; 3001ab64890Smrg } 301818534a1Smrg if (which & XkbRepeatKeysMask) { 302818534a1Smrg req->repeatDelay = ctrls->repeat_delay; 303818534a1Smrg req->repeatInterval = ctrls->repeat_interval; 3041ab64890Smrg } 305818534a1Smrg if (which & XkbSlowKeysMask) 306818534a1Smrg req->slowKeysDelay = ctrls->slow_keys_delay; 307818534a1Smrg if (which & XkbBounceKeysMask) 308818534a1Smrg req->debounceDelay = ctrls->debounce_delay; 309818534a1Smrg if (which & XkbMouseKeysMask) { 310818534a1Smrg req->mkDfltBtn = ctrls->mk_dflt_btn; 3111ab64890Smrg } 312818534a1Smrg if (which & XkbGroupsWrapMask) 313818534a1Smrg req->groupsWrap = ctrls->groups_wrap; 314818534a1Smrg if (which & 315818534a1Smrg (XkbAccessXKeysMask | XkbStickyKeysMask | XkbAccessXFeedbackMask)) 316818534a1Smrg req->axOptions = ctrls->ax_options; 317818534a1Smrg if (which & XkbMouseKeysAccelMask) { 318818534a1Smrg req->mkDelay = ctrls->mk_delay; 319818534a1Smrg req->mkInterval = ctrls->mk_interval; 320818534a1Smrg req->mkTimeToMax = ctrls->mk_time_to_max; 321818534a1Smrg req->mkMaxSpeed = ctrls->mk_max_speed; 322818534a1Smrg req->mkCurve = ctrls->mk_curve; 3231ab64890Smrg } 324818534a1Smrg if (which & XkbAccessXTimeoutMask) { 325818534a1Smrg req->axTimeout = ctrls->ax_timeout; 326818534a1Smrg req->axtCtrlsMask = ctrls->axt_ctrls_mask; 327818534a1Smrg req->axtCtrlsValues = ctrls->axt_ctrls_values; 328818534a1Smrg req->axtOptsMask = ctrls->axt_opts_mask; 329818534a1Smrg req->axtOptsValues = ctrls->axt_opts_values; 3301ab64890Smrg } 331818534a1Smrg if (which & XkbPerKeyRepeatMask) { 332818534a1Smrg memcpy(req->perKeyRepeat, ctrls->per_key_repeat, XkbPerKeyBitArraySize); 3331ab64890Smrg } 3341ab64890Smrg UnlockDisplay(dpy); 3351ab64890Smrg SyncHandle(); 3361ab64890Smrg return True; 3371ab64890Smrg} 3381ab64890Smrg 3391ab64890Smrg/***====================================================================***/ 3401ab64890Smrg 3411ab64890Smrgvoid 342818534a1SmrgXkbNoteControlsChanges(XkbControlsChangesPtr old, 343818534a1Smrg XkbControlsNotifyEvent *new, 344818534a1Smrg unsigned int wanted) 3451ab64890Smrg{ 346818534a1Smrg old->changed_ctrls |= (new->changed_ctrls & wanted); 347818534a1Smrg if (new->changed_ctrls & XkbControlsEnabledMask & wanted) 348818534a1Smrg old->enabled_ctrls_changes ^= new->enabled_ctrl_changes; 3491ab64890Smrg /* num_groups_changed?? */ 3501ab64890Smrg return; 3511ab64890Smrg} 352