home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / evbl0627.zip / everblue_20010627.zip / x11 / XKBList.c < prev    next >
C/C++ Source or Header  |  1999-11-02  |  8KB  |  279 lines

  1. /* $XConsortium: XKBList.c /main/3 1996/02/05 06:00:46 kaleb $ */
  2. /************************************************************
  3. Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
  4.  
  5. Permission to use, copy, modify, and distribute this
  6. software and its documentation for any purpose and without
  7. fee is hereby granted, provided that the above copyright
  8. notice appear in all copies and that both that copyright
  9. notice and this permission notice appear in supporting
  10. documentation, and that the name of Silicon Graphics not be 
  11. used in advertising or publicity pertaining to distribution 
  12. of the software without specific prior written permission.
  13. Silicon Graphics makes no representation about the suitability 
  14. of this software for any purpose. It is provided "as is"
  15. without any express or implied warranty.
  16.  
  17. SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
  18. SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
  19. AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
  20. GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
  21. DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
  22. DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
  23. OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
  24. THE USE OR PERFORMANCE OF THIS SOFTWARE.
  25.  
  26. ********************************************************/
  27.  
  28. #define NEED_REPLIES
  29. #define NEED_EVENTS
  30. #define    NEED_MAP_READERS
  31. #include "Xlib_private.h"
  32. #include <X11/extensions/XKBproto.h>
  33. #include "XKBlibint.h"
  34.  
  35. /***====================================================================***/
  36.  
  37. static void
  38. #if NeedFunctionPrototypes
  39. _FreeComponentNames(int num,XkbComponentNamePtr names)
  40. #else
  41. _FreeComponentNames(num,names)
  42.     int            num;
  43.     XkbComponentNamePtr    names;
  44. #endif
  45. {
  46.     DBUG_ENTER("_FreeComponentNames")
  47.     int            i;
  48.     XkbComponentNamePtr    tmp;
  49.  
  50.     if ((num<1)||(names==NULL))
  51.     DBUG_VOID_RETURN;
  52.     for (i=0,tmp=names;i<num;i++,tmp++) {
  53.     if (tmp->name) {
  54.         _XkbFree(tmp->name);
  55.         tmp->name= NULL;
  56.     }
  57.     }
  58.     _XkbFree(names);
  59.     DBUG_VOID_RETURN;
  60. }
  61.  
  62. /***====================================================================***/
  63.  
  64. static XkbComponentNamePtr
  65. #if NeedFunctionPrototypes
  66. _ReadListing(XkbReadBufferPtr buf,int count,Status *status_rtrn)
  67. #else
  68. _ReadListing(buf,count,status_rtrn)
  69.     XkbReadBufferPtr    buf;
  70.     int            count;
  71.     Status *        status_rtrn;
  72. #endif
  73. {
  74.     DBUG_ENTER("_ReadListing")
  75.     XkbComponentNamePtr    first,this;
  76.     register int        i;
  77.     CARD16 *        flags;
  78.     int            slen,wlen;
  79.     char *            str;
  80.  
  81.     if (count<1)
  82.     DBUG_RETURN(NULL);
  83.     first= _XkbTypedCalloc(count,XkbComponentNameRec);
  84.     if (!first)
  85.     DBUG_RETURN(NULL);
  86.     for (this=first,i=0;i<count;i++,this++) {
  87.     flags= (CARD16 *)_XkbGetReadBufferPtr(buf,2*sizeof(CARD16));
  88.     if (!flags)
  89.         goto BAILOUT;
  90.     this->flags=     flags[0];
  91.     slen=        flags[1];
  92.     wlen=         ((slen+1)/2)*2; /* pad to 2 byte boundary */
  93.     this->name=    _XkbTypedCalloc(slen+1,char);
  94.     if (!this->name)
  95.         goto BAILOUT;
  96.     str= (char *)_XkbGetReadBufferPtr(buf,wlen);
  97.     memcpy(this->name,str,slen);
  98.     }
  99.     DBUG_RETURN(first);
  100. BAILOUT:
  101.     *status_rtrn= BadAlloc;
  102.     _FreeComponentNames(i,first);
  103.     DBUG_RETURN(NULL);
  104. }
  105.  
  106. /***====================================================================***/
  107. #if 0
  108. XkbComponentListPtr
  109. #if NeedFunctionPrototypes
  110. XkbListComponents(    Display *        dpy,
  111.             unsigned        deviceSpec,
  112.             XkbComponentNamesPtr    ptrns,
  113.             int *            max_inout)
  114. #else
  115. XkbListComponents(dpy,deviceSpec,ptrns,max_inout)
  116.     Display *            dpy;
  117.     unsigned            deviceSpec;
  118.     XkbComponentNamesPtr    ptrns;
  119.     int *            max_inout;
  120. #endif
  121. {
  122.     DBUG_ENTER("XkbListComponents")
  123.     register xkbListComponentsReq*    req;
  124.     xkbListComponentsReply         rep;
  125.     XkbInfoPtr             xkbi;
  126.     XkbComponentListPtr        list;
  127.     XkbReadBufferRec        buf;
  128.     int                left;
  129.     char *                str;
  130.     int extraLen,len,mapLen,codesLen,typesLen,compatLen,symsLen,geomLen;
  131.  
  132.     if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) ||
  133.     (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) ||
  134.     (ptrns==NULL) || (max_inout==NULL))
  135.     DBUG_RETURN(NULL);
  136.  
  137.     xkbi= dpy->xkb_info;
  138.     LockDisplay(dpy);
  139.     GetReq(kbListComponents, req);
  140.     req->reqType =     xkbi->codes->major_opcode;
  141.     req->xkbReqType =     X_kbListComponents;
  142.     req->deviceSpec =     deviceSpec;
  143.     req->maxNames =    *max_inout;
  144.  
  145.     mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
  146.     if (ptrns->keymap)
  147.     mapLen= (int)strlen(ptrns->keymap);
  148.     if (ptrns->keycodes)
  149.     codesLen= (int)strlen(ptrns->keycodes);
  150.     if (ptrns->types)
  151.     typesLen= (int)strlen(ptrns->types);
  152.     if (ptrns->compat)
  153.     compatLen= (int)strlen(ptrns->compat);
  154.     if (ptrns->symbols)
  155.     symsLen= (int)strlen(ptrns->symbols);
  156.     if (ptrns->geometry)
  157.     geomLen= (int)strlen(ptrns->geometry);
  158.     if (mapLen>255)    mapLen= 255;
  159.     if (codesLen>255)    codesLen= 255;
  160.     if (typesLen>255)    typesLen= 255;
  161.     if (compatLen>255)    compatLen= 255;
  162.     if (symsLen>255)    symsLen= 255;
  163.     if (geomLen>255)    geomLen= 255;
  164.  
  165.     len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6;
  166.     len= XkbPaddedSize(len);
  167.     req->length+= len/4;
  168.     BufAlloc(char *,str,len);
  169.     *str++= mapLen;
  170.     if (mapLen>0) {
  171.      memcpy(str,ptrns->keymap,mapLen);
  172.      str+= mapLen;
  173.     }
  174.     *str++= codesLen;
  175.     if (codesLen>0) {
  176.      memcpy(str,ptrns->keycodes,codesLen);
  177.      str+= codesLen;
  178.     }
  179.     *str++= typesLen;
  180.     if (typesLen>0) {
  181.      memcpy(str,ptrns->types,typesLen);
  182.      str+= typesLen;
  183.     }
  184.     *str++= compatLen;
  185.     if (compatLen>0) {
  186.      memcpy(str,ptrns->compat,compatLen);
  187.      str+= compatLen;
  188.     }
  189.     *str++= symsLen;
  190.     if (symsLen>0) {
  191.      memcpy(str,ptrns->symbols,symsLen);
  192.      str+= symsLen;
  193.     }
  194.     *str++= geomLen;
  195.     if (geomLen>0) {
  196.      memcpy(str,ptrns->geometry,geomLen);
  197.      str+= geomLen;
  198.     }
  199.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
  200.     goto BAILOUT;
  201.     extraLen= (int)rep.length*4;
  202.     *max_inout= rep.extra;
  203.     if (extraLen==0) { /* no matches, but we don't want to report a failure */
  204.     list= _XkbTypedCalloc(1,XkbComponentListRec);
  205.     UnlockDisplay(dpy);
  206.     SyncHandle();
  207.     DBUG_RETURN(list);
  208.     }
  209.     if (_XkbInitReadBuffer(dpy,&buf,extraLen)) {
  210.     Status status;
  211.     
  212.     status= Success;
  213.     list= _XkbTypedCalloc(1,XkbComponentListRec);
  214.     if (!list) {
  215.         _XkbFreeReadBuffer(&buf);
  216.         goto BAILOUT;
  217.     }
  218.     list->num_keymaps= rep.nKeymaps;
  219.     list->num_keycodes= rep.nKeycodes;
  220.     list->num_types= rep.nTypes;
  221.     list->num_compat= rep.nCompatMaps;
  222.     list->num_symbols= rep.nSymbols;
  223.     list->num_geometry= rep.nGeometries;
  224.     if ((status==Success)&&(list->num_keymaps>0))
  225.         list->keymaps= _ReadListing(&buf,list->num_keymaps,&status);
  226.     if ((status==Success)&&(list->num_keycodes>0))
  227.         list->keycodes= _ReadListing(&buf,list->num_keycodes,&status);
  228.     if ((status==Success)&&(list->num_types>0))
  229.         list->types= _ReadListing(&buf,list->num_types,&status);
  230.     if ((status==Success)&&(list->num_compat>0))
  231.         list->compat= _ReadListing(&buf,list->num_compat,&status);
  232.     if ((status==Success)&&(list->num_symbols>0))
  233.         list->symbols= _ReadListing(&buf,list->num_symbols,&status);
  234.     if ((status==Success)&&(list->num_geometry>0))
  235.         list->geometry= _ReadListing(&buf,list->num_geometry,&status);
  236.     left= _XkbFreeReadBuffer(&buf);
  237.     if ((status!=Success)||(buf.error)||(left>2)) {
  238.         XkbFreeComponentList(list);
  239.         goto BAILOUT;
  240.     }
  241.     UnlockDisplay(dpy);
  242.     SyncHandle();
  243.     DBUG_RETURN(list);
  244.     }
  245. BAILOUT:
  246.     UnlockDisplay(dpy);
  247.     SyncHandle();
  248.     DBUG_RETURN(NULL);
  249. }
  250. #endif
  251.  
  252. void
  253. #if NeedFunctionPrototypes
  254. XkbFreeComponentList(XkbComponentListPtr list)
  255. #else
  256. XkbFreeComponentList(list)
  257.     XkbComponentListPtr    list;
  258. #endif
  259. {
  260.     DBUG_ENTER("XkbFreeComponentList")
  261.     if (list) {
  262.     if (list->keymaps)
  263.         _FreeComponentNames(list->num_keymaps,list->keymaps);
  264.     if (list->keycodes)
  265.         _FreeComponentNames(list->num_keycodes,list->keycodes);
  266.     if (list->types)
  267.         _FreeComponentNames(list->num_types,list->types);
  268.     if (list->compat)
  269.         _FreeComponentNames(list->num_compat,list->compat);
  270.     if (list->symbols)
  271.         _FreeComponentNames(list->num_symbols,list->symbols);
  272.     if (list->geometry)
  273.         _FreeComponentNames(list->num_geometry,list->geometry);
  274.     bzero((char *)list,sizeof(XkbComponentListRec));
  275.     _XkbFree(list);
  276.     }
  277.     DBUG_VOID_RETURN;
  278. }
  279.