1:     2:     3:     4:     5:     6:     7:     8:     9:    10:    11:    12:    13:    14: 
   15: 
   16:    17:    18:    19:    20:    21: 
   22: 
   23: #include "kbpd.h"
   24: 
   25: 
   26: 
   27:    28:    29: 
   30: EXPORT ER kpNotifyEvent( void *evt, W size )
   31: {
   32:         ER     ercd;
   33: 
   34:         
   35:         if ( kpMgrInfo.eventMbf == InvalidID ) return E_OK;
   36: 
   37:         
   38:         ercd = tk_snd_mbf(kpMgrInfo.eventMbf, evt, size, TMO_FEVR);
   39:         if ( ercd != E_OK ) {
   40:                 DEBUG_PRINT(("kpNotifyEvent, tk_snd_mbf err = %d\n", ercd));
   41:                 return ercd;
   42:         }
   43: 
   44:         return E_OK;
   45: }
   46: 
   47:    48:    49: 
   50: EXPORT ER kpNotifyMetaEvent( void )
   51: {
   52:         KeyEvt keyEvt;
   53:         ER     err;
   54: 
   55:         
   56:         keyEvt.h.evttyp = TDE_KEYMETA;
   57:         keyEvt.keytop = 0;
   58:         keyEvt.code = 0;
   59:         keyEvt.stat = kpMgrInfo.kpState.stat;
   60: 
   61:         
   62:         err = kpNotifyEvent(&keyEvt, sizeof(keyEvt));
   63:         if ( err != E_OK ) {
   64:                 DEBUG_PRINT(("kpNotifyMetaEvent, err = %d\n", err));
   65:                 return err;
   66:         }
   67: 
   68:         return E_OK;
   69: }
   70: 
   71:    72:    73: 
   74: EXPORT ER kpNotifyPdEvent( TDEvtTyp devEvt, UW nodsp )
   75: {
   76:         PdEvt  pdEvt;
   77:         ER     err;
   78: 
   79:         
   80:         kpMgrInfo.kpState.stat.nodsp = nodsp;
   81: 
   82:         
   83:         pdEvt.h.evttyp = devEvt;
   84:         pdEvt.stat = kpMgrInfo.kpState;
   85: 
   86:         
   87:         err = kpNotifyEvent(&pdEvt, sizeof(pdEvt));
   88:         if ( err != E_OK ) {
   89:                 DEBUG_PRINT(("kpNotifyPdEvent, err = %d\n", err));
   90:                 return err;
   91:         }
   92: 
   93:         return E_OK;
   94: }
   95: 
   96: 
   97: 
   98:    99:   100: 
  101: EXPORT UH kpToKeycode( KeyTop keytop, KpMetaBut *meta )
  102: {
  103: #define keyTab  kbdef->keyDef.keytab
  104: 
  105:         KbDef  *kbdef;
  106:         W      sel;
  107:         UH     code;
  108: 
  109:         kbdef = GetKbDef(meta->o.kbsel, keytop.u.kid);
  110:         if ( kbdef == NULL ) {
  111:                   112: 
  113:                 kbdef = GetKbDef(0, keytop.u.kid);
  114:                 if ( kbdef == NULL ) return InvalidKeycode;
  115:         }
  116: 
  117:         if ( keytop.u.kcode >= keyTab.keymax ) return InvalidKeycode;
  118: 
  119:         sel = (*(UW*)meta & 0xfc) >> 2;
  120:         code = keyTab.kct[keyTab.keymax * keyTab.kctsel[sel] + keytop.u.kcode];
  121: 
  122:         return code;
  123: 
  124: #undef keyTab
  125: }
  126: 
  127:   128:   129:   130:   131: 
  132: EXPORT W kpGetKeyKind( KeyTop keytop )
  133: {
  134:         UH                     code;
  135: 
  136:         
  137:         code = kpToKeycode(keytop, (KpMetaBut*)&kpMgrInfo.kpState.stat);
  138: 
  139:         switch ( code ) {
  140:           
  141:           case KC_SHT_R:       return SK_SHIFT_R;    
  142:           case KC_SHT_L:       return SK_SHIFT_L;    
  143:           case KC_EXP:         return SK_EXPANSION;   
  144:           case KC_CMD:         return SK_COMMAND;     
  145: 
  146:           
  147:           case KC_CC_U:                return IK_CC_U;               
  148:           case KC_CC_D:                return IK_CC_D;               
  149:           case KC_CC_R:                return IK_CC_R;               
  150:           case KC_CC_L:                return IK_CC_L;               
  151:         }
  152:         return NormalKey;
  153: }
  154: 
  155:   156:   157:   158: 
  159: EXPORT BOOL kpChangeShiftLock( InnEvtType type, ShiftKeyKind skind )
  160: {
  161:         KpMetaBut      meta;
  162:         KpMetaBut      *stat = (KpMetaBut*)&kpMgrInfo.kpState.stat;
  163: 
  164:         meta.o = kpMgrInfo.kpState.stat;
  165: 
  166:         if ( (type & IE_BUTUP) != 0 ) type = IE_BUTUP;
  167: 
  168:         switch ( type ) {
  169:           case IE_KEYUP:       
  170:           case IE_BUTUP:       
  171:                 meta.u.tmpShift = 0;
  172:                 break;
  173: 
  174:           case IE_S_REL:       
  175:                 meta.u.tmpShift &= ~skind;
  176:                 meta.u.shiftLock &= ~skind;
  177:                 break;
  178: 
  179:           case IE_S_SCLK:      
  180:                 if ( kpMgrInfo.kb.keyMode.tslock ) {
  181:                         
  182:                         if ( (meta.u.shiftLock & skind) != 0 ) {
  183:                                 meta.u.shiftLock &= ~skind;
  184:                                 break;
  185:                         }
  186:                         if ( (meta.u.tmpShift & skind) != 0 ) {
  187:                                 meta.u.tmpShift &= ~skind;
  188:                                 meta.u.shiftLock |= skind;
  189:                                 break;
  190:                         }
  191:                         meta.u.tmpShift |= skind;
  192:                 } else {
  193:                         if ( (meta.u.shiftLock & skind) == 0 ) {
  194:                                 meta.u.tmpShift ^= skind;
  195:                         } else {
  196:                                 meta.u.shiftLock &= ~skind;
  197:                         }
  198:                 }
  199:                 break;
  200: 
  201:           case IE_S_DCLK:      
  202:                 meta.u.tmpShift &= ~skind;
  203:                 meta.u.shiftLock |= skind;
  204:                 break;
  205: 
  206:           default:
  207:                 return FALSE;
  208:         }
  209: 
  210:         if ( meta.u.tmpShift == stat->u.tmpShift
  211:           && meta.u.shiftLock == stat->u.shiftLock ) return FALSE;
  212: 
  213:         
  214:         stat->u.tmpShift = meta.u.tmpShift;
  215:         stat->u.shiftLock = meta.u.shiftLock;
  216:         stat->u.shift = meta.u.tmpShift | meta.u.shiftLock | kpMgrInfo.spress;
  217: 
  218:         return TRUE;
  219: }
  220: 
  221:   222:   223: 
  224: EXPORT W kpKeyTopCode( KeyTop keytop, UW kbsel )
  225: {
  226:         KbDef  *kbdef;
  227:         W      keytopcode, keytopofs;
  228: 
  229:         kbdef = GetKbDef(kbsel, keytop.u.kid);
  230:         if ( kbdef == NULL ) {
  231:                   232: 
  233:                 kbdef = GetKbDef(0, keytop.u.kid);
  234:         }
  235:         keytopofs = ( kbdef == NULL )? 0: kbdef->keyDef.keytopofs;
  236: 
  237:         keytopcode = keytop.u.kcode + keytopofs;
  238:         if ( keytopcode >= KEYMAX ) return InvalidKeytop;
  239: 
  240:         return keytopcode;
  241: }
  242: 
  243:   244:   245: 
  246: EXPORT void kpSetOrResetKeyMap( KeyTop keytop, UW kbsel, UW press )
  247: {
  248:         W      i;
  249:         UB     *idx;
  250: 
  251:         if ( (i = kpKeyTopCode(keytop, kbsel)) != InvalidKeytop ) {
  252:                 idx = &kpMgrInfo.kb.keyMap[i >> 3];
  253:                 if ( press )  *idx |=  0x80 >> (i & 7);
  254:                 else          *idx &= ~0x80 >> (i & 7);
  255:         }
  256: }
  257: 
  258:   259:   260: 
  261: EXPORT void kpAllResetKeyMap( void )
  262: {
  263:         MEMSET(kpMgrInfo.kb.keyMap, 0, sizeof(KeyMap));
  264: }
  265: 
  266: 
  267: 
  268:   269:   270:   271:   272: 
  273: EXPORT void kpPdPreProcess( PdInput *msg )
  274: {
  275:         if ( kpMgrInfo.pd.pdMode.attr.reverse ) {
  276:                 
  277:                 if ( msg->stat.xyrev && !msg->stat.abs ) {
  278:                         
  279:                         msg->xpos = - msg->xpos;
  280:                         msg->ypos = - msg->ypos;
  281:                 }
  282:                 if ( msg->stat.butrev ) {
  283:                         
  284:                         SWAP(UW, msg->stat.main, msg->stat.sub);
  285:                 }
  286:         }
  287: 
  288:         if ( kpMgrInfo.pd.pdMode.attr.qpress ) {
  289:                 if ( msg->stat.onebut && msg->stat.qpress ) {
  290:                         
  291:                         msg->stat.main = 1;
  292:                 }
  293:         }
  294: }
  295: 
  296:   297:   298: 
  299: LOCAL H normalizePositionX( W xpos )
  300: {
  301: #define xmax    (kpMgrInfo.pd.pdRange.xmax)
  302: 
  303:         if ( xpos < 0 ) return 0;
  304:         if ( xpos >= xmax ) return xmax - 1;
  305:         return xpos;
  306: 
  307: #undef xmax
  308: }
  309: 
  310:   311:   312: 
  313: LOCAL H normalizePositionY( W ypos )
  314: {
  315: #define ymax    (kpMgrInfo.pd.pdRange.ymax)
  316: 
  317:         if ( ypos < 0 ) return 0;
  318:         if ( ypos >= ymax ) return ymax - 1;
  319:         return ypos;
  320: 
  321: #undef ymax
  322: }
  323: 
  324:   325:   326:   327:   328: 
  329: EXPORT BOOL kpMovePointer( W xpos, W ypos )
  330: {
  331:         xpos = normalizePositionX(xpos);
  332:         ypos = normalizePositionY(ypos);
  333: 
  334:         if ( kpMgrInfo.kpState.xpos == xpos
  335:           && kpMgrInfo.kpState.ypos == ypos ) return FALSE;
  336: 
  337:         
  338:         kpMgrInfo.kpState.xpos = xpos;
  339:         kpMgrInfo.kpState.ypos = ypos;
  340: 
  341:         return TRUE;
  342: }
  343: 
  344:   345:   346: 
  347: EXPORT ER kpMovePointerAndNotify( H xpos, H ypos )
  348: {
  349:         BOOL   move;
  350:         ER     err = E_OK;
  351: 
  352:         
  353:         move = kpMovePointer(xpos, ypos);
  354: 
  355:         if ( move ) {
  356:                 
  357:                 err = kpNotifyPdEvent(TDE_PDMOVE, 0);
  358:         }
  359: 
  360:         return err;
  361: }
  362: 
  363:   364:   365:   366: 
  367: EXPORT TDEvtTyp kpPdMoveEvent( InnerEvent *evt )
  368: {
  369:         W              x, y;
  370:         TDEvtTyp       devEvt = 0;
  371: 
  372:         x = evt->i.pd.x;
  373:         y = evt->i.pd.y;
  374: 
  375:         if ( evt->i.pd.stat.o.abs ) {
  376:                 
  377:                 PdRange *range = &kpMgrInfo.pd.pdRange;
  378: 
  379:                 x = range->xmax * x / PDIN_XMAX;
  380:                 y = range->ymax * y / PDIN_YMAX;
  381: 
  382: #if     0   
  383:                 if ( !kpMgrInfo.pd.pdMode.attr.absolute
  384:                   && !evt->i.pd.stat.o.norel ) {
  385:                         
  386:                         if ( evt->i.pd.stat.o.vst ) {
  387:                                 
  388:                                 kpMgrInfo.firstXpos = x;
  389:                                 kpMgrInfo.firstYpos = y;
  390:                         }
  391:                         
  392:                         x = x - kpMgrInfo.firstXpos;
  393:                         y = y - kpMgrInfo.firstYpos;
  394:                         
  395:                         kpMgrInfo.firstXpos += x;    
  396:                         kpMgrInfo.firstYpos += y;
  397:                         x += kpMgrInfo.kpState.xpos; 
  398:                         y += kpMgrInfo.kpState.ypos;
  399:                 }
  400: #endif
  401:         } else {
  402:                 
  403:                 x += kpMgrInfo.kpState.xpos;
  404:                 y += kpMgrInfo.kpState.ypos;
  405:         }
  406: 
  407:         
  408:         if ( kpMovePointer(x, y) ) {
  409:                 devEvt = TDE_PDMOVE;
  410:         }
  411: 
  412:         return devEvt;
  413: }
  414: 
  415:   416:   417:   418: 
  419: EXPORT TDEvtTyp kpPdButEvent( InnerEvent *evt )
  420: {
  421:         if ( (evt->type & IE_MBUTDOWN) != 0 ) {        
  422:                 kpMgrInfo.kpState.stat.main = 1;
  423:         }
  424:         if ( (evt->type & IE_MBUTUP) != 0 ) {  
  425:                 kpMgrInfo.kpState.stat.main = 0;
  426:         }
  427:         if ( (evt->type & IE_SBUTDOWN) != 0 ) {        
  428:                 kpMgrInfo.kpState.stat.sub = 1;
  429:         }
  430:         if ( (evt->type & IE_SBUTUP) != 0 ) {  
  431:                 kpMgrInfo.kpState.stat.sub = 0;
  432:         }
  433: 
  434:         return TDE_PDBUT;
  435: }