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