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