aboutsummaryrefslogtreecommitdiff
path: root/libX11/src/xkb/XKBleds.c
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/src/xkb/XKBleds.c')
-rw-r--r--libX11/src/xkb/XKBleds.c337
1 files changed, 337 insertions, 0 deletions
diff --git a/libX11/src/xkb/XKBleds.c b/libX11/src/xkb/XKBleds.c
new file mode 100644
index 000000000..865342c46
--- /dev/null
+++ b/libX11/src/xkb/XKBleds.c
@@ -0,0 +1,337 @@
+/* $Xorg: XKBleds.c,v 1.3 2000/08/17 19:45:03 cpqbld Exp $ */
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+/* $XFree86: xc/lib/X11/XKBleds.c,v 1.4 2003/04/13 19:22:18 dawes Exp $ */
+
+#define NEED_REPLIES
+#define NEED_EVENTS
+#define NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+Status
+XkbGetIndicatorState(Display *dpy,unsigned deviceSpec,unsigned *pStateRtrn)
+{
+ register xkbGetIndicatorStateReq *req;
+ xkbGetIndicatorStateReply rep;
+ XkbInfoPtr xkbi;
+ Bool ok;
+
+ if ((dpy->flags & XlibDisplayNoXkb) ||
+ (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+ return BadAccess;
+ LockDisplay(dpy);
+ xkbi = dpy->xkb_info;
+ GetReq(kbGetIndicatorState, req);
+ req->reqType = xkbi->codes->major_opcode;
+ req->xkbReqType = X_kbGetIndicatorState;
+ req->deviceSpec = deviceSpec;
+ ok=_XReply(dpy, (xReply *)&rep, 0, xFalse);
+ if (ok && (pStateRtrn!=NULL))
+ *pStateRtrn= rep.state;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return (ok?Success:BadImplementation);
+}
+
+Status
+_XkbReadGetIndicatorMapReply( Display * dpy,
+ xkbGetIndicatorMapReply * rep,
+ XkbDescPtr xkb,
+ int * nread_rtrn)
+{
+XkbIndicatorPtr leds;
+XkbReadBufferRec buf;
+
+ if ((!xkb->indicators)&&(XkbAllocIndicatorMaps(xkb)!=Success))
+ return BadAlloc;
+ leds= xkb->indicators;
+
+ leds->phys_indicators = rep->realIndicators;
+ if (rep->length>0) {
+ register int left;
+ if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4))
+ return BadAlloc;
+ if (nread_rtrn)
+ *nread_rtrn= (int)rep->length*4;
+ if (rep->which) {
+ register int i,bit;
+ left= (int)rep->which;
+ for (i=0,bit=1;(i<XkbNumIndicators)&&(left);i++,bit<<=1) {
+ if (left&bit) {
+ xkbIndicatorMapWireDesc *wire;
+ wire= (xkbIndicatorMapWireDesc *)
+ _XkbGetReadBufferPtr(&buf,
+ SIZEOF(xkbIndicatorMapWireDesc));
+ if (wire==NULL) {
+ _XkbFreeReadBuffer(&buf);
+ return BadAlloc;
+ }
+ leds->maps[i].flags= wire->flags;
+ leds->maps[i].which_groups= wire->whichGroups;
+ leds->maps[i].groups= wire->groups;
+ leds->maps[i].which_mods= wire->whichMods;
+ leds->maps[i].mods.mask= wire->mods;
+ leds->maps[i].mods.real_mods= wire->realMods;
+ leds->maps[i].mods.vmods= wire->virtualMods;
+ leds->maps[i].ctrls= wire->ctrls;
+ left&= ~bit;
+ }
+ }
+ }
+ left= _XkbFreeReadBuffer(&buf);
+ }
+ return Success;
+}
+
+Bool
+XkbGetIndicatorMap(Display *dpy,unsigned long which,XkbDescPtr xkb)
+{
+ register xkbGetIndicatorMapReq * req;
+ xkbGetIndicatorMapReply rep;
+ XkbInfoPtr xkbi;
+ Status status;
+
+ if ((dpy->flags & XlibDisplayNoXkb) ||
+ (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+ return BadAccess;
+ if ((!which)||(!xkb))
+ return BadValue;
+
+ LockDisplay(dpy);
+ xkbi = dpy->xkb_info;
+ if (!xkb->indicators) {
+ xkb->indicators = _XkbTypedCalloc(1,XkbIndicatorRec);
+ if (!xkb->indicators) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return BadAlloc;
+ }
+ }
+ GetReq(kbGetIndicatorMap, req);
+ req->reqType = xkbi->codes->major_opcode;
+ req->xkbReqType = X_kbGetIndicatorMap;
+ req->deviceSpec = xkb->device_spec;
+ req->which = (CARD32)which;
+ if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return BadValue;
+ }
+ status= _XkbReadGetIndicatorMapReply(dpy,&rep,xkb,NULL);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return status;
+}
+
+Bool
+XkbSetIndicatorMap(Display *dpy,unsigned long which,XkbDescPtr xkb)
+{
+ register xkbSetIndicatorMapReq *req;
+ register int i,bit;
+ int nMaps;
+ xkbIndicatorMapWireDesc *wire;
+ XkbInfoPtr xkbi;
+
+ if ((dpy->flags & XlibDisplayNoXkb) ||
+ (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+ return False;
+ if ((!xkb)||(!which)||(!xkb->indicators))
+ return False;
+ LockDisplay(dpy);
+ xkbi = dpy->xkb_info;
+ GetReq(kbSetIndicatorMap, req);
+ req->reqType = xkbi->codes->major_opcode;
+ req->xkbReqType = X_kbSetIndicatorMap;
+ req->deviceSpec = xkb->device_spec;
+ req->which = (CARD32)which;
+ for (i=nMaps=0,bit=1;i<32;i++,bit<<=1) {
+ if (which&bit)
+ nMaps++;
+ }
+ req->length+= (nMaps*sizeof(XkbIndicatorMapRec))/4;
+ BufAlloc(xkbIndicatorMapWireDesc *,wire,
+ (nMaps*SIZEOF(xkbIndicatorMapWireDesc)));
+ for (i=0,bit=1;i<32;i++,bit<<=1) {
+ if (which&bit) {
+ wire->flags= xkb->indicators->maps[i].flags;
+ wire->whichGroups= xkb->indicators->maps[i].which_groups;
+ wire->groups= xkb->indicators->maps[i].groups;
+ wire->whichMods= xkb->indicators->maps[i].which_mods;
+ wire->mods= xkb->indicators->maps[i].mods.real_mods;
+ wire->virtualMods= xkb->indicators->maps[i].mods.vmods;
+ wire->ctrls= xkb->indicators->maps[i].ctrls;
+ wire++;
+ }
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return True;
+}
+
+Bool
+XkbGetNamedDeviceIndicator( Display * dpy,
+ unsigned device,
+ unsigned class,
+ unsigned id,
+ Atom name,
+ int * pNdxRtrn,
+ Bool * pStateRtrn,
+ XkbIndicatorMapPtr pMapRtrn,
+ Bool * pRealRtrn)
+{
+ register xkbGetNamedIndicatorReq *req;
+ xkbGetNamedIndicatorReply rep;
+ XkbInfoPtr xkbi;
+
+ if ((dpy->flags & XlibDisplayNoXkb) || (name==None) ||
+ (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+ return False;
+ LockDisplay(dpy);
+ xkbi = dpy->xkb_info;
+ GetReq(kbGetNamedIndicator, req);
+ req->reqType = xkbi->codes->major_opcode;
+ req->xkbReqType = X_kbGetNamedIndicator;
+ req->deviceSpec = device;
+ req->ledClass = class;
+ req->ledID = id;
+ req->indicator = (CARD32)name;
+ if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if ((!rep.found)||(!rep.supported))
+ return False;
+ if (pNdxRtrn!=NULL)
+ *pNdxRtrn= rep.ndx;
+ if (pStateRtrn!=NULL)
+ *pStateRtrn= rep.on;
+ if (pMapRtrn!=NULL) {
+ pMapRtrn->flags= rep.flags;
+ pMapRtrn->which_groups= rep.whichGroups;
+ pMapRtrn->groups= rep.groups;
+ pMapRtrn->which_mods= rep.whichMods;
+ pMapRtrn->mods.mask= rep.mods;
+ pMapRtrn->mods.real_mods= rep.realMods;
+ pMapRtrn->mods.vmods= rep.virtualMods;
+ pMapRtrn->ctrls= rep.ctrls;
+ }
+ if (pRealRtrn!=NULL)
+ *pRealRtrn= rep.realIndicator;
+ return True;
+}
+
+Bool
+XkbGetNamedIndicator( Display * dpy,
+ Atom name,
+ int * pNdxRtrn,
+ Bool * pStateRtrn,
+ XkbIndicatorMapPtr pMapRtrn,
+ Bool * pRealRtrn)
+{
+ return XkbGetNamedDeviceIndicator(dpy,XkbUseCoreKbd,
+ XkbDfltXIClass,XkbDfltXIId,
+ name,pNdxRtrn,pStateRtrn,
+ pMapRtrn,pRealRtrn);
+}
+
+Bool
+XkbSetNamedDeviceIndicator( Display * dpy,
+ unsigned device,
+ unsigned class,
+ unsigned id,
+ Atom name,
+ Bool changeState,
+ Bool state,
+ Bool createNewMap,
+ XkbIndicatorMapPtr pMap)
+{
+ register xkbSetNamedIndicatorReq *req;
+ XkbInfoPtr xkbi;
+
+ if ((dpy->flags & XlibDisplayNoXkb) || (name==None) ||
+ (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+ return False;
+ LockDisplay(dpy);
+ xkbi = dpy->xkb_info;
+ GetReq(kbSetNamedIndicator, req);
+ req->reqType = xkbi->codes->major_opcode;
+ req->xkbReqType = X_kbSetNamedIndicator;
+ req->deviceSpec = device;
+ req->ledClass = class;
+ req->ledID = id;
+ req->indicator= (CARD32)name;
+ req->setState= changeState;
+ if (req->setState)
+ req->on= state;
+ else req->on= False;
+ if (pMap!=NULL) {
+ req->setMap= True;
+ req->createMap= createNewMap;
+ req->flags= pMap->flags;
+ req->whichGroups= pMap->which_groups;
+ req->groups= pMap->groups;
+ req->whichMods= pMap->which_mods;
+ req->realMods= pMap->mods.real_mods;
+ req->virtualMods= pMap->mods.vmods;
+ req->ctrls= pMap->ctrls;
+ }
+ else {
+ req->setMap= False;
+ req->createMap= False;
+ req->flags= 0;
+ req->whichGroups= 0;
+ req->groups= 0;
+ req->whichMods= 0;
+ req->realMods= 0;
+ req->virtualMods= 0;
+ req->ctrls= 0;
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return True;
+}
+
+Bool
+XkbSetNamedIndicator( Display * dpy,
+ Atom name,
+ Bool changeState,
+ Bool state,
+ Bool createNewMap,
+ XkbIndicatorMapPtr pMap)
+{
+ return XkbSetNamedDeviceIndicator(dpy,XkbUseCoreKbd,
+ XkbDfltXIClass,XkbDfltXIId,
+ name,changeState,state,
+ createNewMap,pMap);
+}