home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / omron / omronKbd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-29  |  20.4 KB  |  904 lines

  1. /*
  2.  * $XConsortium: omronKbd.c,v 1.1 91/06/29 13:49:01 xguest Exp $
  3.  *
  4.  * Copyright 1991 by OMRON Corporation
  5.  * 
  6.  * Permission to use, copy, modify, distribute, and sell this software and its
  7.  * documentation for any purpose is hereby granted without fee, provided that
  8.  * the above copyright notice appear in all copies and that both that
  9.  * copyright notice and this permission notice appear in supporting
  10.  * documentation, and that the name of OMRON not be used in advertising or
  11.  * publicity pertaining to distribution of the software without specific,
  12.  * written prior permission.  OMRON makes no representations about the
  13.  * suitability of this software for any purpose.  It is provided "as is"
  14.  * without express or implied warranty.
  15.  *
  16.  * OMRON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  17.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OMRON
  18.  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  20.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
  21.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  */
  23.  
  24. #include "omron.h"
  25.  
  26. #include "omronKbd.h"
  27.  
  28. #ifdef    uniosu
  29. # include <sys/semienc.t>
  30. #else /* not uniosu */
  31. # ifdef luna88k
  32. #  include <dev/semienc.t>
  33. # else
  34. #  ifdef luna2
  35. #   include <dev/semienc.t>
  36. #  else /* uniosb */
  37. #   include <om68kdev/keymap.t>
  38. #  endif
  39. # endif
  40. #endif
  41.  
  42. #if (!defined(uniosu)) && (!defined(luna88k)) && (!defined(luna2))
  43. #define NOTREP 0
  44. #define REPEAT 1
  45. #endif
  46.  
  47. extern CARD8 *omronKeyModMap[];
  48. extern KeySymsRec omronKeySyms[];
  49. extern unsigned char *omronAutoRepeats[];
  50.  
  51. static Bool omronKbdInit();
  52. static void omronBell();
  53. static void omronKbdCtrl();
  54. #ifndef USE_KANA_SWITCH
  55. static void omronKbdModCheck();
  56. #endif
  57.  
  58. int
  59. omronKbdProc(pKeyboard,what)
  60. DevicePtr     pKeyboard;
  61. int           what;
  62. {
  63.     static Bool initFlag = FALSE;
  64.     static omronKeyPrv prv[1];
  65.  
  66.     switch(what) {
  67.         case DEVICE_INIT:
  68.             pKeyboard->devicePrivate = (pointer)prv;
  69.             if (initFlag == FALSE) {
  70. #ifdef USE_KEYCOMPATI
  71.                 prv->offset = 0;
  72. #else
  73.                 prv->offset = 7;
  74. #endif
  75.                 if (!omronKbdInit(prv))
  76.                     return (!Success);
  77.                 initFlag = TRUE;
  78.             }
  79.             bcopy(prv->semiEncodeDef,prv->semiEncode,CODTBSZ);
  80. #ifndef USE_KANA_SWITCH
  81.             bcopy(prv->semiEncodeDef,prv->semiKanaEncode,CODTBSZ);
  82. #endif
  83.             bcopy (omronAutoRepeats[prv->type],
  84.                 defaultKeyboardControl.autoRepeats,AREPBUFSZ);
  85.             prv->keybdCtrl = defaultKeyboardControl;
  86. #ifndef USE_KANA_SWITCH
  87.             prv->key_state = 0;
  88. # ifdef luna2
  89.             if (prv->type != KB_ASCII ) {
  90. # endif
  91.                 prv->kana_offset =
  92.                     (omronKeySyms[prv->type].maxKeyCode +
  93.                      omronKeySyms[prv->type].minKeyCode + 1) /2 - 
  94.                      omronKeySyms[prv->type].minKeyCode ; 
  95. # ifdef luna2
  96.             }
  97. # endif
  98. #endif
  99.             InitKeyboardDeviceStruct(pKeyboard,
  100.                 &(omronKeySyms[prv->type]), (omronKeyModMap[prv->type]),
  101.                 omronBell, omronKbdCtrl);
  102. #ifndef UNUSE_DRV_TIME 
  103.             omronSetDriverTimeMode(NULL, pKeyboard);
  104. #endif
  105.             break;
  106.         case DEVICE_ON:
  107. #ifndef UNUSE_SIGIO_SIGNAL
  108.             prv->flags |= FASYNC;
  109.             if (fcntl(prv->fd, F_SETFL, prv->flags) < 0 ) {
  110.                 Error("Can't enable the keyboard SIGIO.");
  111.                 return (!Success);
  112.             }
  113. #endif
  114.             AddEnabledDevice(prv->fd);
  115.             pKeyboard->on = TRUE;
  116.             break;
  117.         case DEVICE_OFF:
  118.         case DEVICE_CLOSE:
  119. #ifndef UNUSE_SIGIO_SIGNAL
  120.             prv->flags &= ~FASYNC;
  121.             if (fcntl(prv->fd, F_SETFL, prv->flags) < 0 ) {
  122.                 Error("Can't disable the keyboard SIGIO.");
  123.             }
  124. #endif
  125.             if (ioctl(prv->fd, KBFLSH, NULL) < 0) {
  126.                 Error("Keyboard ioctl KBFLSH fault.");
  127.             }
  128.             RemoveEnabledDevice(prv->fd);
  129.             pKeyboard->on = FALSE;
  130.             break;
  131.     }
  132.     return (Success);
  133.  
  134.  
  135. static Bool
  136. omronKbdInit(prv)
  137. omronKeyPrvPtr prv;
  138. {
  139. #ifdef uniosu
  140.     struct termio new_term;
  141. #else
  142.     struct sgttyb new_term;
  143. #endif
  144.     struct kbssgeta segeta;
  145. #if   (! defined(uniosu)) && (! defined(luna88k)) && (! defined(luna2))
  146.     register int i;
  147. #endif
  148. #ifdef UNUSE_SIGIO_SIGNAL
  149.     int arg = 1; 
  150. #endif
  151.  
  152.  
  153.     if((prv->fd = open("/dev/kbd",O_RDWR,0)) < 0) {
  154.         Error("Can't open /dev/kbd");
  155.         return FALSE;
  156.     }
  157.  
  158. #ifdef luna2
  159.     if( ioctl(prv->fd,KIOCTYPE,&(prv->type)) == -1 ) {
  160.         Error("Can't get kbd type.");
  161.         return FALSE;
  162.     }    
  163. #else
  164.     prv->type = 0;
  165. #endif
  166.  
  167. #ifdef UNUSE_SIGIO_SIGNAL
  168.     ioctl (prv->fd, FIONBIO, &arg);
  169. #else
  170.     if ((prv->flags = fcntl(prv->fd, F_GETFL, NULL)) < 0) {
  171.         Error("Keyboard fcntl F_GETFL fault.");
  172.         return FALSE;
  173.     }
  174.     prv->flags |= FNDELAY;
  175.     if (fcntl(prv->fd, F_SETFL, prv->flags) < 0
  176.         || fcntl(prv->fd, F_SETOWN, getpid()) < 0) {
  177.         Error("Can't set up kbd to receive SIGIO.");
  178.         return FALSE;
  179.     }
  180. #endif
  181.  
  182.     if(ioctl(prv->fd,KBSETM,SEMIENCODED) < 0) {
  183.         Error("Keyboard ioctl SEMIENCODED fault.");
  184.         return FALSE;
  185.     }
  186.  
  187.     if (ioctl(prv->fd,KBRSTENABLE,RSTDISABLE) < 0) {
  188.         Error("Keyboard ioctl RSTDISABLE fault.");
  189.         return FALSE;
  190.     }
  191. #ifdef uniosu
  192.     if(ioctl(prv->fd,TCGETA,&(prv->old_term)) < 0) {
  193.         Error("Keyboard ioctl TCGETA fault.");
  194.         return FALSE;
  195.     }
  196. #else
  197.     if(ioctl(prv->fd,TIOCGETP,&(prv->old_term)) < 0) {
  198.         Error("Keyboard ioctl TCGETA fault.");
  199.         return FALSE;
  200.     }
  201. #endif
  202.  
  203.     new_term = prv->old_term;
  204.  
  205. #ifdef uniosu
  206.     new_term.c_lflag &= ~ICANON;
  207.     new_term.c_lflag &= ~ISIG;
  208.     new_term.c_cc[VEOF] = 1;
  209.     if (ioctl(prv->fd,TCSETA,&new_term) < 0) {    
  210.         Error("Keyboard ioctl TCSETA fault.");
  211.         return FALSE;
  212.     }
  213. #else
  214.     new_term.sg_flags = RAW;
  215.     if (ioctl(prv->fd,TIOCSETP,&new_term) < 0) {    
  216.         Error("Keyboard ioctl TIOCSETP fault.");
  217.         return FALSE;
  218.     }
  219. #endif
  220.     
  221.     segeta.kbsreptp = prv->semiEncodeDef;
  222.     if(ioctl(prv->fd, KBSGETTA, &segeta) < 0) {
  223.         Error("Kbd ioctl KBSGETTA fault.");
  224.         return FALSE;
  225.     }
  226.  
  227. #if   (! defined(uniosu)) && (! defined(luna88k)) && (! defined(luna2))
  228.     for(i = 0 ; i < CODTBSZ ; i++ ) {
  229.         prv->semiEncodeDef[i] = prv->semiEncodeDef[i] ? 0 : 1;
  230.     }
  231. #endif
  232.  
  233.     return TRUE;
  234. }
  235.         
  236. void
  237. omronKbdGiveUp()
  238. {
  239.     DevicePtr     pKeyboard;
  240.     omronKeyPrvPtr prv;
  241.  
  242.     pKeyboard = LookupKeyboardDevice();
  243.  
  244.     if(!pKeyboard) return;
  245.  
  246.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  247.     if(!prv) return;
  248.  
  249.     if (ioctl(prv->fd,KBSETM,ENCODED) < 0) {
  250.         Error("Kbd ioctl fault(set encode mode).");
  251.     }
  252.  
  253.     if (ioctl(prv->fd,KBRSTENABLE,RSTENABLE) < 0) {
  254.         Error("Kbd ioctl fault.");
  255.     }
  256.  
  257. #ifdef uniosu    
  258.     if (ioctl(prv->fd,TCSETA,&(prv->old_term)) < 0) {
  259.         Error("Kbd ioctl fault(reset term mode).");
  260.     }
  261. #else
  262.     if (ioctl(prv->fd,TIOCSETP,&(prv->old_term)) < 0) {
  263.         Error("Kbd ioctl fault(reset term mode).");
  264.     }
  265. #endif
  266.  
  267. #ifndef UNUSE_DRV_TIME
  268.     if(ioctl(prv->fd, KBTIME,0) < 0) {
  269.         if ( errno != EINVAL ) {
  270.             Error("Kbd ioctl KBTIME fault.");
  271.         }
  272.     }
  273. #endif
  274.  
  275.     close(prv->fd);
  276. }
  277.     
  278. static void
  279. omronBell(loudness, pKeyboard)
  280. int           loudness;
  281. DevicePtr     pKeyboard;
  282. {
  283.     register int     hz, msec;
  284.     char c;
  285.     omronKeyPrvPtr prv;
  286.  
  287.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  288.  
  289.     if (loudness == 0) {
  290.         return;
  291.     }
  292.     hz = prv->keybdCtrl.bell_pitch;
  293. #ifdef uniosu
  294.     if (hz <= 100){
  295.         c = 0x47;
  296.     } else  if (hz <= 150) {
  297.         c = 0x46;
  298.     } else  if (hz <= 300) {
  299.         c = 0x45;
  300.     } else  if (hz <= 600) {
  301.         c = 0x44;
  302.     } else  if (hz <= 1000) {
  303.         c = 0x43;
  304.     } else  if (hz <= 1500) {
  305.         c = 0x42;
  306.     } else  if (hz <= 3000) {
  307.         c = 0x41;
  308.     } else {
  309.         c = 0x40;
  310.     }
  311.  
  312.     msec = omronKeybdCtrl.bell_duration;
  313.     if (msec <= 40) {
  314.         i = 0;
  315.     } else if (msec <= 150) {
  316.         i = 1;
  317.     } else if (msec <= 400) {
  318.         i = 2;
  319.     } else {
  320.         i = 3;
  321.     }
  322.     c |= (i << 3);
  323. #else
  324.     if (hz <= 100){
  325.         c = K_HZ100;
  326.     } else  if (hz <= 150) {
  327.         c = K_HZ150;
  328.     } else  if (hz <= 300) {
  329.         c = K_HZ300;
  330.     } else  if (hz <= 600) {
  331.         c = K_HZ600;
  332.     } else  if (hz <= 1000) {
  333.         c = K_HZ1000;
  334.     } else  if (hz <= 1500) {
  335.         c = K_HZ1500;
  336.     } else  if (hz <= 3000) {
  337.         c = K_HZ3000;
  338.     } else {
  339.         c = K_HZ6000;
  340.     }
  341.  
  342.     msec = prv->keybdCtrl.bell_duration;
  343.     if (msec <= 40) {
  344.         c |= K_TIME40;
  345.     } else if (msec <= 150) {
  346.         c |= K_TIME150;
  347.     } else if (msec <= 400) {
  348.         c |= K_TIME400;
  349.     } else {
  350.         c |= K_TIME700;
  351.     }
  352. #endif
  353. #ifdef uniosu
  354.     if (  write(prv->fd,&c,1) < 0 ) {
  355.         Error ("OmronBell can't write keyboard.");
  356.     }
  357. #else
  358.     if (  ioctl(prv->fd, KBBELL, c) < 0 ) {
  359.         Error ("OmronBell ioctl KBBELL error.");
  360.     }
  361. #endif
  362. }
  363.  
  364. static void
  365. omronKbdCtrl(pKeyboard, ctrl)
  366. DevicePtr     pKeyboard;
  367. KeybdCtrl     *ctrl;
  368. {
  369.     struct kbrepeat rep;
  370.     struct kbssgeta seseta;
  371.     register KeyCode key;
  372.     register int mask,i;
  373.     int shift;
  374.     omronKeyPrvPtr prv;
  375.  
  376.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  377.  
  378.     if ( pKeyboard->on == FALSE ) {
  379.         if ( ctrl->click == 0 ) {
  380.             if(ioctl(prv->fd, KBCLICK, 0) < 0) {
  381.                 Error("Kbd ioctl KBCLICK error.");
  382.             }
  383.         } else {
  384.             if(ioctl(prv->fd, KBCLICK, 5) < 0) {
  385.                 Error("Kbd ioctl KBCLICK error.");
  386.             }
  387.         }
  388.  
  389.         if ( ctrl->autoRepeat == TRUE )
  390.             rep.repstart = REPCNT;
  391.         else
  392.             rep.repstart = 0;
  393.         
  394.         rep.repinterval = RPINTVL;
  395.     
  396.         if(ioctl(prv->fd, KBREPTIM, &rep) < 0) {
  397.             Error("Kbd ioctl KBREPTIM error.");
  398.         } 
  399.  
  400.         prv->minkey = omronKeySyms[prv->type].minKeyCode;
  401. #ifndef USE_KANA_SWITCH
  402. # ifdef luna2
  403.         if (prv->type == KB_ASCII )
  404.             prv->maxkey = omronKeySyms[prv->type].maxKeyCode; 
  405.         else
  406. # endif
  407.             prv->maxkey = omronKeySyms[prv->type].minKeyCode +
  408.                           prv->kana_offset - 1; 
  409. #else
  410.         prv->maxkey = omronKeySyms[prv->type].maxKeyCode; 
  411. #endif
  412.  
  413.         for( key = prv->minkey ; key <= prv->maxkey ; key++) {
  414.             if ( prv->semiEncodeDef[key - prv->offset] == REPEAT ) {
  415.                 i = (key >> 3) ; 
  416.                 mask = (1 << (key & 7));
  417.                 if ( ctrl->autoRepeats[i] & mask ) {
  418.                     prv->semiEncode[key - prv->offset] = REPEAT;    
  419.                 } else {
  420.                     prv->semiEncode[key - prv->offset] = NOTREP;    
  421.                 }
  422.             }
  423.         }
  424.  
  425. #ifndef USE_KANA_SWITCH
  426. # ifdef luna2
  427.         if ( prv->type != KB_ASCII ) {
  428. # endif
  429.             prv->kana_minkey = omronKeySyms[prv->type].minKeyCode +
  430.                                prv->kana_offset;
  431.             prv->kana_maxkey = omronKeySyms[prv->type].maxKeyCode; 
  432.     
  433.             for( key = prv->kana_minkey ; key <= prv->kana_maxkey ; key++) {
  434.                 if ( prv->semiEncodeDef[key - prv->kana_offset - prv->offset] == REPEAT ) {
  435.                     i = (key >> 3) ; 
  436.                     mask = (1 << (key & 7));
  437.                     if ( ctrl->autoRepeats[i] & mask ) {
  438.                         prv->semiKanaEncode[key - prv->kana_offset - prv->offset] = REPEAT;    
  439.                     } else {
  440.                         prv->semiKanaEncode[key - prv->kana_offset - prv->offset] = NOTREP;    
  441.                     }
  442.                 }
  443.             }
  444. # ifdef luna2
  445.         }
  446. # endif
  447. #endif
  448.         seseta.kbsreptp = prv->semiEncode;
  449.         if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  450.             Error("Kbd ioctl KBSSETTA error.");
  451.         } 
  452.     } else {
  453.         if ( ctrl->click != prv->keybdCtrl.click ) {
  454.             if( ctrl->click == 0 ) {
  455.                 if(ioctl(prv->fd, KBCLICK, 0) < 0) {
  456.                     Error("Kbd ioctl KBCLICK error.");
  457.                 }
  458.             } else {
  459.                 if(ioctl(prv->fd, KBCLICK, 5) < 0) {
  460.                     Error("Kbd ioctl KBCLICK error.");
  461.                 }
  462.             }
  463.         }
  464.         if ( ctrl->autoRepeat != prv->keybdCtrl.autoRepeat ) { 
  465.             if ( ctrl->autoRepeat == TRUE )     
  466.                 rep.repstart = REPCNT;
  467.             else
  468.                 rep.repstart = 0;
  469.             rep.repinterval = RPINTVL;
  470.             if(ioctl(prv->fd, KBREPTIM, &rep) < 0) {
  471.                 Error("Kbd ioctl KBREPTIM error.");
  472.             }
  473.         }
  474.         for ( i = 0 ; i < AREPBUFSZ ; i++) {
  475.             if (mask = ctrl->autoRepeats[i] ^ prv->keybdCtrl.autoRepeats[i] ) {
  476.                 shift = ffs(mask) -1;
  477.                 key = ( i << 3) | shift;
  478.                 if ( key >= prv->minkey && key <= prv->maxkey ) {
  479.                     key -= prv->offset;
  480.                     if ( prv->semiEncodeDef[key] == REPEAT ) {
  481.                         if ( ctrl->autoRepeats[i] & (1 << shift) )
  482.                         {
  483.                             prv->semiEncode[key] = REPEAT;
  484.                         }else{
  485.                             prv->semiEncode[key] = NOTREP;
  486.                         }
  487. #ifndef USE_KANA_SWITCH
  488.                         if ( !(prv->key_state & KS_KANA) ){
  489. #endif
  490.                             seseta.kbsreptp = prv->semiEncode;
  491.                             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  492.                                 Error("Kbd ioctl fault(semi-encode table set).");
  493.                             }
  494. #ifndef USE_KANA_SWITCH
  495.                         }
  496. #endif
  497.                     }
  498. #ifdef USE_KANA_SWITCH
  499.                 }
  500. #else
  501. # ifdef luna2
  502.                 } else if(prv->type != KB_ASCII && key >= prv->kana_minkey &&
  503.                                                   key <= prv->kana_maxkey ) {
  504. # else
  505.                 } else if ( key >= prv->kana_minkey &&
  506.                             key <= prv->kana_maxkey ) {
  507. # endif
  508.                     key -= (prv->kana_offset + prv->offset);
  509.                     if ( prv->semiEncodeDef[key] == REPEAT ) {
  510.                         if ( ctrl->autoRepeats[i] & (1 << shift) )
  511.                             prv->semiKanaEncode[key] = REPEAT;
  512.                         else
  513.                             prv->semiKanaEncode[key] = NOTREP;
  514.                         if ( prv->key_state & KS_KANA ) {
  515.                             seseta.kbsreptp = prv->semiKanaEncode;
  516.                             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  517.                                 Error("Kbd ioctl fault(semi-encode table set).");
  518.                             }
  519.                         }
  520.                     }
  521.                 }
  522. #endif
  523.                 break;
  524.             }
  525.         }
  526.     }
  527.     prv->keybdCtrl = *ctrl;
  528. }
  529.     
  530. Bool
  531. LegalModifier(key)
  532. BYTE key;
  533. {
  534.     return(TRUE);
  535. }
  536.  
  537. #define MAXEVENTS    1024
  538.  
  539. unsigned char *
  540. omronKbdGetEvents(pKeyboard, pNumEvents, pAgain)
  541. DevicePtr     pKeyboard;
  542. int           *pNumEvents;
  543. Bool          *pAgain;
  544. {    
  545.     int           nBytes;
  546.     static unsigned char codebuf[MAXEVENTS];
  547.     omronKeyPrvPtr prv;
  548.  
  549.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  550.  
  551.     nBytes = read(prv->fd,codebuf,sizeof(codebuf));
  552.  
  553.     if( nBytes < 0) {
  554.         if (errno == EWOULDBLOCK) {
  555.             *pNumEvents = 0;
  556.             *pAgain = FALSE;
  557.         } else {
  558.             Error ("Can't read keyboard");
  559.         }    
  560.     } else {
  561.         *pNumEvents = nBytes;
  562.         *pAgain = (nBytes == sizeof (codebuf));
  563.     }    
  564.     return(codebuf);
  565. }
  566.  
  567. #ifndef UNUSE_DRV_TIME
  568. key_event *
  569. omronKbdGetTEvents(pKeyboard, pNumEvents, pAgain)
  570. DevicePtr     pKeyboard;
  571. int           *pNumEvents;
  572. Bool          *pAgain;
  573. {    
  574.     int           nBytes;
  575.     static key_event codebuf[MAXEVENTS];
  576.     omronKeyPrvPtr prv;
  577.  
  578.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  579.  
  580.     nBytes = read(prv->fd,codebuf,sizeof(codebuf));
  581.  
  582.     if( nBytes < 0) {
  583.         if (errno == EWOULDBLOCK) {
  584.             *pNumEvents = 0;
  585.             *pAgain = FALSE;
  586.         } else {
  587.             Error ("Can't read keyboard");
  588.         }    
  589.     } else {
  590.         *pNumEvents = nBytes / sizeof (key_event);
  591.         *pAgain = (nBytes == sizeof (codebuf));
  592.     }    
  593.     return(codebuf);
  594. }
  595. #endif
  596.  
  597.  
  598. void
  599. omronKbdEnqueueEvent(pKeyboard, data)
  600. DevicePtr     pKeyboard;
  601. unsigned char   *data;
  602. {
  603.  
  604.     unsigned char key;
  605.     xEvent xE;
  606.     CARD8 keyModifiers;
  607.     KeySymsPtr pKeys;
  608.     int lock_key = 0;
  609. #ifndef USE_KANA_SWITCH
  610.     struct kbssgeta seseta;
  611.     unsigned long keysym; 
  612.     static unsigned long modstate = 0;
  613.     int    omron_key_state;
  614. #endif
  615.     omronKeyPrvPtr prv;
  616.  
  617.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  618. #ifndef USE_KANA_SWITCH
  619.     omron_key_state = prv->key_state;
  620. #endif
  621.  
  622.     lastEventTime = GetTimeInMillis();
  623.     xE.u.keyButtonPointer.time = lastEventTime;
  624.  
  625.     key = *data;
  626.  
  627. #ifndef USE_KANA_SWITCH
  628.     if (!(key & 0x80)) {
  629.         key &= 0x7f;
  630.         if (key == KANA_KEY) {
  631.             omron_key_state |= KS_KANA;
  632.             prv->key_state = omron_key_state;
  633.             seseta.kbsreptp = prv->semiKanaEncode;
  634.             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  635.                 Error("Kbd ioctl fault(semi-encode table set).");
  636.             }
  637.             return;
  638.         }
  639.         xE.u.u.type = KeyPress;
  640.     } else {
  641.         key &= 0x7f;
  642.         if (key == KANA_KEY) {
  643.             omron_key_state &= ~KS_KANA;
  644.             prv->key_state = omron_key_state;
  645.             seseta.kbsreptp = prv->semiEncode;
  646.             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  647.                 Error("Kbd ioctl fault(semi-encode table set).");
  648.             }
  649.             return;
  650.         }
  651.         xE.u.u.type = KeyRelease;
  652.     }
  653.     if (key == CAPSLOCK_KEY) {
  654.         lock_key = 1;
  655.     }
  656.     key += prv->offset;
  657.     keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  658.     if ((omron_key_state & KS_KANA) && (!modstate) && (keyModifiers == 0)) {
  659.         key += prv->kana_offset;
  660.     }
  661.     if (keyModifiers != 0) {
  662.         pKeys = &((DeviceIntPtr)pKeyboard)->key->curKeySyms;
  663.         if (!(lock_key ) && ((keyModifiers & LockMask) ||
  664.             ((keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))
  665.             && (pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth] == XK_Mode_switch)))) {
  666.             if (xE.u.u.type == KeyRelease)
  667.                 return;
  668.             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,key))
  669.                 xE.u.u.type = KeyRelease;
  670.         } else if ((keyModifiers & ControlMask) ||
  671.             (keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))) {
  672.             keysym = pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth];
  673.             omronKbdModCheck(keysym, xE.u.u.type, &modstate);
  674.         }
  675.     }
  676. #else
  677.     if (!(key & 0x80)) {
  678.         xE.u.u.type = KeyPress;
  679.     } else {
  680.         xE.u.u.type = KeyRelease;
  681.     }
  682.     key &= 0x7f;
  683.     if ((key == CAPSLOCK_KEY) || (key == KANA_KEY)) {
  684.         lock_key = 1;
  685.     }
  686.     key += prv->offset;
  687.     if (!lock_key) {
  688.         keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  689.         pKeys = &((DeviceIntPtr)pKeyboard)->key->curKeySyms;
  690.         if ((keyModifiers & LockMask) ||
  691.             ((keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))
  692.             && (pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth] == XK_Mode_switch))) {
  693.             if (xE.u.u.type == KeyRelease)
  694.                 return;
  695.             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,key))
  696.                 xE.u.u.type = KeyRelease;
  697.         }
  698.     }
  699. #endif
  700.     xE.u.u.detail = key;
  701. #ifndef USE_KANA_SWITCH
  702.     prv->key_state = omron_key_state;
  703. #endif
  704.     mieqEnqueue(&xE);
  705. }
  706.  
  707. #ifndef UNUSE_DRV_TIME
  708. void
  709. omronKbdEnqueueTEvent(pKeyboard, data)
  710. DevicePtr     pKeyboard;
  711. key_event     *data;
  712. {
  713.  
  714.     unsigned char key;
  715.     xEvent xE;
  716.     CARD8 keyModifiers;
  717.     KeySymsPtr pKeys;
  718.     int lock_key = 0;
  719. #ifndef USE_KANA_SWITCH
  720.     struct kbssgeta seseta;
  721.     unsigned long keysym; 
  722.     static unsigned long modstate = 0;
  723.     int    omron_key_state;
  724. #endif
  725.     omronKeyPrvPtr prv;
  726.  
  727.     prv = (omronKeyPrvPtr)(pKeyboard->devicePrivate);
  728. #ifndef USE_KANA_SWITCH
  729.     omron_key_state = prv->key_state;
  730. #endif
  731.  
  732.     xE.u.keyButtonPointer.time = data->time;
  733.     key = data->code;
  734.  
  735. #ifndef USE_KANA_SWITCH
  736.     if (!(key & 0x80)) {
  737.         key &= 0x7f;
  738.         if (key == KANA_KEY) {
  739.             omron_key_state |= KS_KANA;
  740.             prv->key_state = omron_key_state;
  741.             seseta.kbsreptp = prv->semiKanaEncode;
  742.             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  743.                 Error("Kbd ioctl fault(semi-encode table set).");
  744.             }
  745.             return;
  746.         }
  747.         xE.u.u.type = KeyPress;
  748.     } else {
  749.         key &= 0x7f;
  750.         if (key == KANA_KEY) {
  751.             omron_key_state &= ~KS_KANA;
  752.             prv->key_state = omron_key_state;
  753.             seseta.kbsreptp = prv->semiEncode;
  754.             if(ioctl(prv->fd, KBSSETTA, &seseta) < 0) {
  755.                 Error("Kbd ioctl fault(semi-encode table set).");
  756.             }
  757.             return;
  758.         }
  759.         xE.u.u.type = KeyRelease;
  760.     }
  761.     if (key == CAPSLOCK_KEY) {
  762.         lock_key = 1;
  763.     }
  764.     key += prv->offset;
  765.     keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  766.     if ((omron_key_state & KS_KANA) && (!modstate) && (keyModifiers == 0)) {
  767.         key += prv->kana_offset;
  768.     }
  769.     if (keyModifiers != 0) {
  770.         pKeys = &((DeviceIntPtr)pKeyboard)->key->curKeySyms;
  771.         if (!(lock_key ) && ((keyModifiers & LockMask) ||
  772.             ((keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))
  773.             && (pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth] == XK_Mode_switch)))) {
  774.             if (xE.u.u.type == KeyRelease)
  775.                 return;
  776.             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,key))
  777.                 xE.u.u.type = KeyRelease;
  778.         } else if ((keyModifiers & ControlMask) ||
  779.             (keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))) {
  780.             keysym = pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth];
  781.             omronKbdModCheck(keysym, xE.u.u.type, &modstate);
  782.         }
  783.     }
  784. #else
  785.     if (!(key & 0x80)) {
  786.         xE.u.u.type = KeyPress;
  787.     } else {
  788.         xE.u.u.type = KeyRelease;
  789.     }
  790.     key &= 0x7f;
  791.     if ((key == CAPSLOCK_KEY) || (key == KANA_KEY)) {
  792.         lock_key = 1;
  793.     }
  794.     key += prv->offset;
  795.     if (!lock_key) {
  796.         keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  797.         pKeys = &((DeviceIntPtr)pKeyboard)->key->curKeySyms;
  798.         if ((keyModifiers & LockMask) ||
  799.             ((keyModifiers & (Mod1Mask| Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask))
  800.             && (pKeys->map[(key - pKeys->minKeyCode) * pKeys->mapWidth] == XK_Mode_switch))) {
  801.             if (xE.u.u.type == KeyRelease)
  802.                 return;
  803.             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,key))
  804.                 xE.u.u.type = KeyRelease;
  805.         }
  806.     }
  807. #endif
  808.     xE.u.u.detail = key;
  809. #ifndef USE_KANA_SWITCH
  810.     prv->key_state = omron_key_state;
  811. #endif
  812.     mieqEnqueue(&xE);
  813. }
  814. #endif
  815.  
  816. #ifndef USE_KANA_SWITCH
  817. static void
  818. omronKbdModCheck(keysym, type, modstate)
  819. unsigned long keysym;
  820. BYTE type;
  821. unsigned long *modstate;
  822. {
  823.         unsigned long modst;
  824.  
  825.         modst = *modstate;
  826.         switch(keysym) {
  827.         case XK_Control_L:
  828.             if (type == KeyPress) {
  829.                 modst |= KS_CTRL_L;
  830.             } else {
  831.                 modst &= ~KS_CTRL_L;
  832.             }
  833.             break;
  834.         case XK_Control_R:
  835.             if (type == KeyPress) {
  836.                 modst |= KS_CTRL_R;
  837.             } else {
  838.                 modst &= ~KS_CTRL_R;
  839.             }
  840.             break;
  841.         case XK_Meta_L:
  842.             if (type == KeyPress) {
  843.                 modst |= KS_META_L;
  844.             } else {
  845.                 modst &= ~KS_META_L;
  846.             }
  847.             break;
  848.         case XK_Meta_R:
  849.             if (type == KeyPress) {
  850.                 modst |= KS_META_R;
  851.             } else {
  852.                 modst &= ~KS_META_R;
  853.             }
  854.             break;
  855.         case XK_Alt_L:
  856.             if (type == KeyPress) {
  857.                 modst |= KS_ALT_L;
  858.             } else {
  859.                 modst &= ~KS_ALT_L;
  860.             }
  861.             break;
  862.         case XK_Alt_R:
  863.             if (type == KeyPress) {
  864.                 modst |= KS_ALT_R;
  865.             } else {
  866.                 modst &= ~KS_ALT_R;
  867.             }
  868.             break;
  869.         case XK_Super_L:
  870.             if (type == KeyPress) {
  871.                 modst |= KS_SUPER_L;
  872.             } else {
  873.                 modst &= ~KS_SUPER_L;
  874.             }
  875.             break;
  876.         case XK_Super_R:
  877.             if (type == KeyPress) {
  878.                 modst |= KS_SUPER_R;
  879.             } else {
  880.                 modst &= ~KS_SUPER_R;
  881.             }
  882.             break;
  883.         case XK_Hyper_L:
  884.             if (type == KeyPress) {
  885.                 modst |= KS_HYPER_L;
  886.             } else {
  887.                 modst &= ~KS_HYPER_L;
  888.             }
  889.             break;
  890.         case XK_Hyper_R:
  891.             if (type == KeyPress) {
  892.                 modst |= KS_HYPER_R;
  893.             } else {
  894.                 modst &= ~KS_HYPER_R;
  895.             }
  896.             break;
  897.         default:
  898.             break;
  899.         }
  900.         *modstate = modst;
  901. }
  902. #endif
  903.