示例#1
0
文件: kimehook.c 项目: komh/kime
BOOL ztelnetAccelHook( PQMSG pQmsg )
{
    if( pQmsg->msg == WM_CHAR )
    {
        USHORT  fsFlags = SHORT1FROMMP( pQmsg->mp1 );
        //UCHAR   ucRepeat = CHAR3FROMMP( pQmsg->mp1 );
        //UCHAR   ucScancode = CHAR4FROMMP( pQmsg->mp1 );
        USHORT  usCh = SHORT1FROMMP( pQmsg->mp2 );
        USHORT  usVk = SHORT2FROMMP( pQmsg->mp2 );

        if( fsFlags & KC_KEYUP )
            return FALSE;

        if(( fsFlags & ( KC_SHIFT | KC_CTRL )) && ( usVk == VK_SPACE ))
        {
            WinSendMsg( hwndKime, KIMEM_CHANGEHAN, 0, 0 );
            WinSendMsg( hwndKHS, KHSM_CHANGEHANSTATUS, MPFROMHWND( pQmsg->hwnd ), 0 );
        }
        else if( !( fsFlags & KC_ALT ) && ( usVk == VK_F3 ))
        {
            WinSendMsg( hwndKime, KIMEM_CHANGEIM, 0, 0 );
            WinSendMsg( hwndKHS, KHSM_CHANGEIMSTATUS, MPFROMHWND( pQmsg->hwnd ), 0 );
        }
        else if( LONGFROMMR( WinSendMsg( hwndKime, KIMEM_QUERYHAN, 0, 0 ))
                 && ( !( fsFlags & ( KC_CTRL | KC_ALT ))))
        {
            UCHAR uch;
            UCHAR *kbdConv;
            BOOL  shiftOn;

            usCh = kbdKeyTranslate( pQmsg );
            uch = tolower( LOUCHAR( usCh ));
            if( fsFlags & KC_SHIFT )
                uch = toupper( uch );
            else if( kimeOpt.patchChat && prevHanInput &&
                     LONGFROMMR( WinSendMsg( hwndKime, KIMEM_QUERYIM, 0, 0 )) &&
                     ( usVk == VK_SPACE ))
                     WinSendMsg( pQmsg->hwnd, pQmsg->msg, pQmsg->mp1, pQmsg->mp2 );

            shiftOn = FALSE;
            if( isDblJaum( uch ))
            {
                if( dblJaumPressed )
                {
                    if( uchPrevDbl == uch )
                    {
                        if( kimeOpt.patch3bul )
                            WinSendMsg( pQmsg->hwnd, WM_CHAR,
                                        MPFROMSH2CH( fsFlags | KC_VIRTUALKEY, 0, 0 ),
                                        MPFROM2SHORT( 0, VK_BACKSPACE ));

                        uchPrevDbl = 0;
                        dblJaumPressed = FALSE;
                        shiftOn = TRUE;
                    }
                    else
                        uchPrevDbl = uch;
                }
                else
                {
                    uchPrevDbl = uch;
                    dblJaumPressed = TRUE;
                }
            }
            else
                dblJaumPressed = FALSE;

            if(( kbdConv = findKbdConv( uch )) != NULL )
            {
                fsFlags &= ~KC_SHIFT;
                if( kbdConv[ 3 ] || shiftOn )
                    fsFlags |= KC_SHIFT;

                usCh = MAKEUSHORT( kbdConv[ 1 ], 0 );
                if( kbdConv[ 2 ])
                {
                    if( kimeOpt.patch3bul )
                        WinSendMsg( pQmsg->hwnd, WM_CHAR,
                                    MPFROMSH2CH( fsFlags, 0, 0 ),
                                    MPFROM2SHORT( usCh, 0 ));

                    usCh = MAKEUSHORT( kbdConv[ 2 ], 0 );
                }

                if( usCh )
                {
                    if( kimeOpt.patch3bul )
                    {
                        //pQmsg->mp1 = MPFROMSH2CH( fsFlags, ucRepeat, ucScancode );
                        //pQmsg->mp2 = MPFROM2SHORT( usCh, usVk );

                        pQmsg->mp1 = MPFROMSH2CH( fsFlags, 0, 0 );
                        pQmsg->mp2 = MPFROM2SHORT( usCh, 0 );
                    }
                }
            }

            prevHanInput = ( strchr( SBCS_CHARS, SHORT1FROMMP( pQmsg->mp2 )) == NULL ) &&
                           !( fsFlags & KC_VIRTUALKEY );
        }
    }

    return FALSE;
}
示例#2
0
/********************************************************************* 
     Main processing loop.
     get a key record from the input queue.
     if a key was input from keyboard (owner == TRUE), then look at
     the key record and try to call a function. If no function, then
     just input it into the sheet.

     if input was from clipboard (owner == FALSE), then don't try to 
     call a function, just put it in the sheet.

     v 3.0  9-12-94
            still needs work. sigh..

************************************************************************/
static void  edit_loop (void)
{
USHORT key;
bool ok = FALSE;        // temp for load_key
USHORT cmd_result = 0x0000;      // returned from do_command
UCHAR lokey, hikey;     // low and high byte of KEY USHORT
USHORT keystate;
struct key_rec edit_key_rec;

#ifndef NO_COMMANDO
//char commando_cwd[FNAME_LEN];
//strcpy (commando_cwd, cwd);
#endif

#ifndef NO_HELP
DEF_HELP(EDIT_HELP,1,-1,-1);
init_help (Help);
NEW_HELP;
#endif

for (;;) {
get_next:
   edit_key_rec = view_getkey();
   key = edit_key_rec.value;
   keystate = edit_key_rec.state;
   lokey = LOUCHAR(key);
   hikey = HIUCHAR(key);

//  DBG_INI(dout<<"edit.cpp line "<<__LINE__<<" shell_command.s = °"<<settings.shell_command.s<<"°"<<endl);
   switch (key) {
      case kESC:   
             if (pulldown_menu() && tryquit ()) {
                  return;
             }
             else {
                lokey = 0x00;     // "eat" the ESC key
             }
             break;
      default:
         DBG_KEY(dout<<'\n'<<"edit key =  "<<hex<<key<<"  high = "<<hikey);
         DBG_KEY(dout<<" low = "<< lokey<<" keystate = "<<keystate<<dec<<endl);
         if(edit_key_rec.owner == TRUE) {                // keyboard key
            if((CTL_KEY(keystate)) || ((lokey == 0x00)||(lokey == 0xE0))) {
               if(key != 0x0000) {
                  cmd_result = do_command(mykey_rec);
                  DBG_KEY(dout<<" edit_key after do_command() "<<endl);        
               }
               if(cmd_result == CMD_QUIT) {
                  DBG_KEY(dout<<" edit key QUIT cmd_result = "<<hex<<cmd_result<<dec<<endl);
                  return;
               }
               if(cmd_result == CMD_HANDLED) {
                  DBG_KEY(dout<<" edit key ignoring cmd_result = "<<hex<<cmd_result<<dec<<endl);
                  goto get_next;
               }
            }
            if((lokey != 0xE0) && (lokey >0)) { // ignore any ext key not handled
               DBG_KEY(dout<<" edit_key calling view_addkey() "<<endl);        
               view_addkey(lokey);
               break;
           }
         }
         else {
           DBG_KEY(dout<<" edit key not owner"<<endl);
           if((lokey < 255) && (lokey >0)) { // ignore any ext key not handled
//            DBG_KEY(dout<<" edit_loop addkey  key = "<<hex<<lokey<<dec<<endl);
              view_addkey(lokey);
              break;
           }
         }
   }                               // end switch/case
}                                  // end for(;;)
#pragma warn -aus        // eliminate 'OLD_HELP'assigned but not used
}