MRESULT hia_usermDestroyHCHLB( HWND hwnd, MPARAM mp1, MPARAM mp2 ) { HIA *hia = WinQueryWindowPtr(hwnd,WINWORD_INSTANCE); WinSendMsg( hia->hwndHCHLB, HCHLM_CHAR, MPFROMSH2CH( KC_VIRTUALKEY, 0, 0 ), MPFROM2SHORT( 0, VK_ESC )); return 0; }
BOOL lboxChar(PELBOX pelb, PCHRMSG pchmsg) { ULONG fs = pchmsg->fs & 0xfff; // se cambia cursore notifica owner indicando in mp1 l'ID dell'item con // il cursore if (!((pchmsg->fs & KC_ALT) || (pchmsg->fs & KC_KEYUP)) && (pchmsg->fs & KC_VIRTUALKEY) && ((pchmsg->vkey == VK_PAGEUP) || (pchmsg->vkey == VK_PAGEDOWN) || (pchmsg->vkey == VK_END) || (pchmsg->vkey == VK_HOME) || (pchmsg->vkey == VK_UP) || (pchmsg->vkey == VK_DOWN))) { pelb->lbxwprc(pelb->hlbx, WM_CHAR, MPFROMSH2CH(pchmsg->fs, pchmsg->cRepeat, pchmsg->scancode), MPFROM2SHORT(pchmsg->chr, pchmsg->vkey)); WinSendMsg(WinQueryWindow(pelb->hwnd, QW_OWNER), WM_CONTROL, MPFROM2SHORT((USHORT)pelb->id, ELBXN_CURSORMOVE), (MPARAM)(pelb->lbxwprc(pelb->hlbx, LM_QUERYSELECTION, (MPARAM)LIT_CURSOR, MPVOID))); return TRUE; } /* endif */ // ignora caratteri selezione item if (pchmsg->vkey == VK_SPACE || pchmsg->vkey == VK_NEWLINE || pchmsg->vkey == VK_ENTER || pchmsg->fs & KC_CTRL) return TRUE; // considera solo caratteri: if (fs == 5 || fs == 0xd) { INT i; SHORT idx; for (i = 0; i < pelb->ccol; ++i) { if (pchmsg->chr == pelb->pcol[i].mnemo && (idx = (SHORT)pelb->lbxwprc(pelb->hlbx, LM_QUERYSELECTION, (MPARAM)LIT_CURSOR, MPVOID)) >= 0) { WinSendMsg(WinQueryWindow(pelb->hwnd, QW_OWNER), WM_CONTROL, MPFROM2SHORT((USHORT)pelb->id, (pelb->fl & ELBCS_ITEMCHECKBOXED? ELBXN_CHECKED: ELBXN_SELECT)), MPFROM2SHORT(idx, i)); // cambia stato selezione item per forzarne aggiornamento i = (SHORT)pelb->lbxwprc(pelb->hlbx, LM_QUERYSELECTION, (MPARAM)(idx - 1), MPVOID); pelb->lbxwprc(pelb->hlbx, LM_SELECTITEM, (MPARAM)idx, (MPARAM)(i != idx || i < 0)); break; } /* endif */ } /* endfor */ return TRUE; } /* endif */ // gli altri caratteri di scrolling sono regolarmente processati return FALSE; }
VOID sendCharToWnd( HANCHAR hch ) { if( ISHCH( hch )) { hch = hch_sy2ks( hch ); hch = MAKESHORT( HIBYTE( hch ), LOBYTE( hch )); } WinPostMsg( hwndCurrentInput, WM_CHAR, MPFROMSH2CH( KC_CHAR, 1, 0 ), MPFROM2SHORT( hch, 0 )); }
MRESULT EXPENTRY WndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { // static POINTS DragStartPtrPos; POINTL ptl; static char Row, Col; static BOOL HasMoved = FALSE; static BOOL IntroSoundPlayed = FALSE; static BOOL RealPaint = TRUE; // indicates whether the board // has to be repainted or just copied INT aktscan; CHAR msgtext[256]; ULONG ulResponse; // ERRORID errId; switch( msg ){ case WM_CREATE: if( !InfoData.LoadHigh() ){ // get previously saved highscores InfoData.ResetHigh(); WinMessageBox( HWND_DESKTOP, hwndMain, "The file scores.dat " \ "(which is in the current directory) was somehow corrupted." \ " All Highscores will be reset to Zero.", "Error when loading Highscores", 0, MB_OK | MB_INFORMATION ); } // allocate memory for global variables; see GLOBALS struct in tgraph.h pg = new GLOBALS; // initialize globals to zero memset( pg, 0, sizeof( GLOBALS )); // store globals pointer into client window words; see WinRegisterClass // WinSetWindowULong( hwnd, QWL_USER, (ULONG) pg ); wcprintf("1: %x", WinGetLastError( hab ) ); DosCreateEventSem( NULL, &hevWaitAfterScan, 0, FALSE ); // Sem is created in reset state DosCreateEventSem( NULL, &hevHiScoreWin, 0, FALSE ); DosCreateEventSem( NULL, &hevWaitAfterSound, 0, FALSE ); DosCreateEventSem( NULL, &hevWaitSoundReady, 0, TRUE ); // Sem is created in posted state // hevWaitAfterScan and hewWaitAfterSound are used to indicate // when the respective WM_CREATE routines are done. // after that they are in posted state, as desired // initialize globals with important data pg->hab = hab; pg->hwndClient = hwnd; pg->hwndFrame = WinQueryWindow( hwnd, QW_PARENT ); pg->hwndTitlebar = WinWindowFromID( pg->hwndFrame, FID_TITLEBAR ); pg->hwndMenubar = WinWindowFromID( pg->hwndFrame, FID_MENU ); // create graphics and sound threads pg->tidTSound = _beginthread( &threadsound, NULL, LEN_STACK, NULL ); pg->tidTGraph = _beginthread( &threadgraph, NULL, LEN_STACK, NULL ); DosWaitEventSem( hevWaitAfterSound, SEM_INDEFINITE_WAIT ); WinPostMsg( pg->hwndTSound, WM_SOUND_INTRO, MPFROMHWND(hwnd), 0 ); // wait for the sound's WM_CREATE DosWaitEventSem( hevWaitAfterScan, SEM_INDEFINITE_WAIT ); // wait for the graphics' WM_CREATE InfoData.ShipsNotFound = GBoard.GetShipNumber(); wcprintf("create: %x", WinGetLastError( hab ) ); return (MRESULT)0; case WM_CONTROL: break; case WM_QUIT: break; case WM_CLOSE: // this message is sent before WM_QUIT InfoData.SaveHigh( WinGetCurrentTime(hab) ); // save the highscores and provide a random seed // get pointer to globals from window words // pg = (PGLOBALS) WinQueryWindowULong( hwnd, QWL_USER ); // tell object windows to quit, then exit their threads // WinSendMsg( pg->hwndTGraph, WM_DESTROY, mp1, mp2 ); WinPostMsg( pg->hwndTGraph, WM_QUIT, mp1, mp2 ); // WinSendMsg( pg->hwndTSound, WM_DESTROY, mp1, mp2 ); WinPostMsg( pg->hwndTSound, WM_QUIT, mp1, mp2 ); DosCloseEventSem( hevWaitAfterScan ); DosCloseEventSem( hevHiScoreWin ); DosCloseEventSem( hevWaitAfterSound ); DosCloseEventSem( hevWaitSoundReady ); WriteProfile( hab ); delete pg; return (MRESULT) 0; case WM_ERASEBACKGROUND: wcprintf("erasebackground"); // return (MRESULT) FALSE; return (MRESULT) TRUE; case WM_PAINT: /////////////////////////////////// { RECTL rectl; WinQueryWindowRect( pg->hwndClient, &rectl ); wcprintf("Linienrechteck: Breite: %d H”he: %d", rectl.xRight, rectl.yTop ); // test size: GpiSetColor( hpsGlob, CLR_RED ); ptl.x = rectl.xLeft; ptl.y = rectl.yBottom; GpiMove( hpsGlob, &ptl ); ptl.x = rectl.xRight; ptl.y = rectl.yTop; GpiLine( hpsGlob, &ptl ); } /////////////////////////// break; case WM_SIZE: wcprintf("main wnd function wm-size"); RealPaint = TRUE; GBoard.SetPMBoardValues( SHORT1FROMMP( mp2 ), SHORT2FROMMP( mp2 ) ); WndResize( hwnd ); wcprintf("size: %x", WinGetLastError( hab ) ); break; case WM_BEGINDRAG: WinSetCapture( HWND_DESKTOP, hwnd ); // capture the mouse pointer GBoard.SetfDrag( TRUE ); // indicate that mouse is being dragged GBoard.ResetFirstDraw(); // for initialization of drag op. fHideSquare = TRUE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( 0, 0 ) ); // GBoard.ShowPointerPos( hwnd, 0, 0 ); // removes the square ptl.x = SHORT1FROMMP(mp1); ptl.y = SHORT2FROMMP(mp1); Row = GBoard.GetBoardRow( ptl.y ); // starting point of drag Col = GBoard.GetBoardCol( ptl.x ); // operation; static! return (MRESULT)TRUE; case WM_MOUSEMOVE: if( GBoard.GetfDrag() ){ // if mouse is being dragged WinSendMsg( pg->hwndTGraph, WM_DRAWDRAGLINE, mp1, MPFROM2SHORT( Row, Col ) ); HasMoved = TRUE; } else { // mouse is moved normally if( !fHideSquare ) WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), mp1 ); // GBoard.ShowPointerPos( hwnd, SHORT1FROMMP(mp1), // SHORT2FROMMP(mp1)); } break; case WM_ENDDRAG: WinSetCapture( HWND_DESKTOP, NULLHANDLE ); // release the captured // mouse pointer if( HasMoved ){ // mousemove has actually been moved WinSendMsg( pg->hwndTGraph, WM_MARKDRAGLINE, MPFROM2SHORT( Row, Col ), 0 ); HasMoved = FALSE; } GBoard.SetfDrag( FALSE ); GBoard.ClearDrawPoint(); // because no square is drawn right now fHideSquare = FALSE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), mp1 ); // GBoard.ShowPointerPos( hwnd, SHORT1FROMMP(mp1), SHORT2FROMMP(mp1)); // draws square at the current ptr pos break; case WM_CHAR: // key was pressed if( SHORT2FROMMP( mp2 ) != VK_SPACE ) break; // only space is interesting if( GBoard.GetfDrag() ) break; // do nothing while dragging if( !GBoard.GetfShowLines() ){ // lines not visible yet GBoard.SetfShowLines( TRUE ); WinSendMsg( pg->hwndTGraph, WM_DISPLAYLINES, 0, 0 ); } break; case WM_BUTTON1CLICK: if( !InfoData.ShipsNotFound ) break; // game is finished ptl.x = (LONG)SHORT1FROMMP( mp1 ); ptl.y = (LONG)SHORT2FROMMP( mp1 ); Row = GBoard.GetBoardRow( ptl.y ); Col = GBoard.GetBoardCol( ptl.x ); if( !Row || !Col ) break; fHideSquare = TRUE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( 0, 0 ) ); // GBoard.ShowPointerPos( hwnd, 0, 0 ); // hides pointer square if(( aktscan = GBoard.GetDiscovered( Row, Col )) != -1 ){ WinSendMsg( pg->hwndTGraph, WM_DRAWPMPLACE, MPFROMHWND(hwnd), MPFROMSH2CH( MAKESHORT(Row, Col), (CHAR)aktscan,(CHAR)TRUE)); // umstricken auf WinPostMsg // toggle Place display } else { // scan Place DosResetEventSem( hevWaitAfterScan, &ulResponse ); // DosBeep(500, 150 ); WinPostMsg( pg->hwndTGraph, WM_GRAPH_SCAN, MPFROMHWND(hwnd), MPFROM2SHORT( Row, Col ) ); // DosBeep( 800, 150 ); WinWaitEventSem( hevWaitAfterScan, SEM_INDEFINITE_WAIT ); // DosBeep( 1000, 150 ); // first the scanning sounds must be played (and finished) aktscan = GBoard.Scan( Row, Col ); if( aktscan == GBoard.GetShipNumber() + 10 ){ InfoData.ShipsNotFound--; WinPostMsg( pg->hwndTSound, WM_SOUND_FOUNDSHIP, MPFROMHWND(hwnd), 0 ); } else { if( aktscan ) WinPostMsg( pg->hwndTSound, WM_SOUND_FOUND, MPFROMHWND(hwnd), MPFROMLONG( aktscan ) ); else WinPostMsg( pg->hwndTSound, WM_SOUND_FOUND0, MPFROMHWND(hwnd), 0 ); } WinWaitEventSem( hevWaitAfterScan, SEM_INDEFINITE_WAIT ); // waits until scanning is done, and only then displays the // field icon // hps = WinGetPS( hwnd ); WinSendMsg( pg->hwndTGraph, WM_DRAWPMPLACE, MPFROMHWND(hwnd), MPFROMSH2CH( MAKESHORT(Row, Col), (CHAR)aktscan,(CHAR)TRUE)); // umstricken auf WinPostMsg WinPostMsg( pg->hwndTGraph, WM_SHOWSTATUSLINE, 0, 0 ); // ShowStatusLine( hps, GBoard.MovesNeeded(), InfoData.ShipsNotFound, // GBoard.GetWinWidth(), GBoard.GetWinHeight() ); // WinReleasePS( hps ); if( !InfoData.ShipsNotFound ){ // game is finished, all ships found Score = GBoard.MovesNeeded(); if ( !InfoData.ReturnLastHigh() // still space in the hiscore table || Score < InfoData.ReturnLastHigh() ){ // player kicks last one out // player enters highscore table WinPostMsg( pg->hwndTSound, WM_SOUND_NEWHISCORE, MPFROMHWND(hwnd), 0 ); WinWaitEventSem( hevHiScoreWin, SEM_INDEFINITE_WAIT ); // waits until the NEWHISCORE sound is actually played WinDlgBox( HWND_DESKTOP, hwnd, HighScoreDlgProc, (HMODULE)0, IDR_HIGHSCOREDLG, NULL ); WinPostMsg( hwnd, WM_COMMAND, MPFROMSHORT(IDM_GAMEHIGH), (MPARAM)0 ); // show highscore-table DosResetEventSem( hevHiScoreWin, &ulResponse ); // resets the sem again } else { WinPostMsg( pg->hwndTSound, WM_SOUND_LOST, MPFROMHWND(hwnd), 0 ); WinWaitEventSem( hevHiScoreWin, SEM_INDEFINITE_WAIT ); // waits until the NEWHISCORE sound is actually played sprintf( msgtext, "You needed %d moves to find the lost ships. " \ "To enter the highscore list you need %d moves." \ " So try again!", Score, InfoData.ReturnLastHigh() - 1 ); WinMessageBox( HWND_DESKTOP, hwnd, msgtext, "Oh, Shit!", 0, MB_OK | MB_INFORMATION | MB_HELP ); } } } fHideSquare = FALSE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( ptl.x, ptl.y ) ); // GBoard.ShowPointerPos( hwnd, ptl.x, ptl.y ); // redisplay ptr square break; case WM_BUTTON2CLICK: fHideSquare = TRUE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( 0, 0 ) ); ptl.x = (LONG)SHORT1FROMMP( mp1 ); ptl.y = (LONG)SHORT2FROMMP( mp1 ); Row = GBoard.GetBoardRow( ptl.y ); Col = GBoard.GetBoardCol( ptl.x ); WinSendMsg( pg->hwndTGraph, WM_DRAWPMMARK, MPFROMHWND(hwnd), MPFROM2SHORT( Row, Col ) ); fHideSquare = FALSE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( ptl.x, ptl.y ) ); break; case WM_COMMAND: switch( SHORT1FROMMP( mp1 ) ){ case IDM_GAMENEW: GBoard.NewGame(); InfoData.ShipsNotFound = GBoard.GetShipNumber(); RealPaint = TRUE; WinInvalidateRect( hwnd, NULL, TRUE ); break; case IDM_GAMESETTINGS: if( WinDlgBox( HWND_DESKTOP, hwndFrame, GameSettingsDlgProc, (HMODULE)0, IDR_GAMESETTINGSDLG, NULL ) ){ // screen must be repainted RealPaint = TRUE; WinInvalidateRect( hwnd, NULL, TRUE ); } break; case IDM_GAMEHIGH: if( !WinDlgBox( HWND_DESKTOP, hwndFrame, ShowHighDlgProc, (HMODULE)0, IDR_SHOWHIGHDLG, NULL ) ){ // user requested "Clear" if( WinMessageBox( HWND_DESKTOP, hwndMain, "Do you really want to eradicate all those " \ "arduously achieved highscores?", "Clear Highscores", 0, MB_OKCANCEL | MB_WARNING ) == MBID_OK ) InfoData.ResetHigh(); } break; case IDM_HELPINDEX: // help index WinSendMsg( hwndHelp, HM_HELP_INDEX, 0, 0 ); break; case IDM_HELPGENERAL: // general help WinSendMsg( hwndHelp, HM_EXT_HELP, 0, 0 ); break; case IDM_HELPEXTENDED: // help on help (system page) WinSendMsg( hwndHelp, HM_DISPLAY_HELP, 0, 0 ); break; case IDM_HELPKEYS: // keys help WinSendMsg( hwndHelp, HM_KEYS_HELP, 0, 0 ); break; case IDM_HELPPRODUCTINFO: ulResponse = WinDlgBox( HWND_DESKTOP, hwndFrame, ProdInfoDlgProc, (HMODULE)0, IDR_PRODINFODLG, NULL ); break; } break; case HM_QUERY_KEYS_HELP: // system asks which page to display return MRFROMSHORT( PANEL_HELPKEYS ); case HM_HELPSUBITEM_NOT_FOUND: return (MRESULT)FALSE; case WM_USER_ACK: // graphics task finished its work // DosBeep( 1000, 150 ); switch( (ULONG)mp1 ){ case WM_USER_PAINT: WinQueryPointerPos( HWND_DESKTOP, &ptl ); WinMapWindowPoints( HWND_DESKTOP, hwnd, &ptl, 1); fHideSquare = FALSE; WinSendMsg( pg->hwndTGraph, WM_SHOWPOINTERPOS, MPFROMHWND(hwnd), MPFROM2SHORT( ptl.x, ptl.y ) ); // GBoard.ShowPointerPos( hwnd, ptl.x, ptl.y ); // painting has finished, square can be displayed now break; } break; case WM_SOUND_ACK: switch( (ULONG)mp1 ){ case WM_SOUND_INTRO: break; } break; default: return (MRESULT)WinDefWindowProc( hwnd, msg, mp1, mp2 ); } // end switch( msg ) return (MRESULT)WinDefWindowProc( hwnd, msg, mp1, mp2 ); } // end MRESULT EXPENTRY WndProc()
BOOL kimeAccelHook( PQMSG pQmsg ) { if( pQmsg->msg == WM_CHAR #ifndef ODIN_SUPPORT_IN_INPUT_HOOK || pQmsg->msg == WM_CHAR_SPECIAL #endif ) { 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 ); ULONG flHIAState; BOOL hanIn; BOOL consumed; BOOL callHanja; //BOOL patched; if( queryRunningHCHLB()) { WinSendMsg( hwndHIA, HIAM_CHAR, pQmsg->mp1, pQmsg->mp2 ); return TRUE; } //patched = FALSE; if(( fsFlags & KC_VIRTUALKEY ) && ( usVk == VK_PAGEDOWN + 0x90 ) && ( ucScancode = 0x96 )) { usVk = VK_PAGEDOWN; ucScancode = 0x67; pQmsg->mp1 = MPFROMSH2CH( fsFlags, ucRepeat, ucScancode ); pQmsg->mp2 = MPFROM2SHORT( usCh, usVk ); //patched = TRUE; } if(( fsFlags & KC_SCANCODE ) && ( ucScancode == 0x2B ) && ( fsFlags & KC_INVALIDCHAR )) { fsFlags &= ~KC_INVALIDCHAR; fsFlags |= KC_CHAR; usCh = 0x5C; pQmsg->mp1 = MPFROMSH2CH( fsFlags, ucRepeat, ucScancode ); pQmsg->mp2 = MPFROM2SHORT( usCh, usVk ); //patched = TRUE; } callHanja = isHanjaKey( fsFlags, ucScancode, usVk, usCh ); if((( fsFlags & KC_KEYUP ) || (( fsFlags & 0x0FFF ) == KC_SCANCODE ) || !( fsFlags & KC_SCANCODE )) && !callHanja ) return FALSE; #ifdef FOCUS_ON dprintf(("inputFocusChanged %d, hwndCurrentInput %04X\n", inputFocusChanged, hwndCurrentInput )); if( inputFocusChanged || ( hwndCurrentInput != pQmsg->hwnd )) { inputFocusChanged = FALSE; hwndCurrentInput = pQmsg->hwnd; supportDBCS = checkDBCSSupport( hwndCurrentInput ); exception = checkExceptWindow( hwndCurrentInput ); } #else dprintf(("hwndCurrentInput %04X\n", hwndCurrentInput )); if( hwndCurrentInput != pQmsg->hwnd ) { hwndCurrentInput = pQmsg->hwnd; initKimeStatus( hwndCurrentInput, FALSE ); supportDBCS = checkDBCSSupport( hwndCurrentInput ); exception = checkExceptWindow( hwndCurrentInput ); } #endif dprintf(("hwndCurrentInput %04X, supportDBCS %d, exception %d\n", hwndCurrentInput, supportDBCS, exception )); if(( fsFlags & ( KC_CTRL | KC_SHIFT )) && (( fsFlags & KC_VIRTUALKEY ) && ( usVk == VK_SPACE ))) supportDBCS = checkDBCSSupport( hwndCurrentInput ); if( kimeOpt.useOS2IME ) { if( exception /* || !supportDBCS */) return FALSE; if((( fsFlags & ( KC_ALT | KC_CTRL | KC_SHIFT )) == KC_SHIFT ) && (( fsFlags & KC_VIRTUALKEY ) && ( usVk == VK_SPACE ))) { toggleOS2IMEHanEng( hwndCurrentInput ); return TRUE; } #if 0 if( callHanja ) { callIMEHanja( pQmsg->hwnd ); return TRUE; } #endif return FALSE; } dprintf(("hwndCurrentInput %04X, supportDBCS %d, exception %d\n", hwndCurrentInput, supportDBCS, exception )); if( !hwndCurrentInput || !supportDBCS || exception ) return FALSE; if(( fsFlags & ( KC_CTRL | KC_SHIFT )) && (( fsFlags & KC_VIRTUALKEY ) && ( usVk == VK_SPACE ))) return ( BOOL )WinSendMsg( hwndHIA, WM_CHAR, pQmsg->mp1, pQmsg->mp2 ); flHIAState = (ULONG) WinSendMsg( hwndHIA, HIAM_QUERYSTATE, 0L, 0L ); hanIn = flHIAState & HIAST_HANMODE; #if 0 if( !HIUSHORT( flHIAState ) && ( fsFlags & ( KC_VIRTUALKEY | KC_CTRL | KC_ALT )) && !callHanja ) return FALSE; #endif if( hanIn /*|| patched */ ) { //MPARAM mp2; consumed = FALSE; if( callHanja ) { WinPostMsg( hwndKime, KIMEM_CALLHANJAINPUT, 0, 0 ); consumed = TRUE; } else if((( fsFlags & KC_CHAR ) || (( fsFlags & KC_VIRTUALKEY ) && (( usVk == VK_ESC ) || ( usVk == VK_SHIFT )))) && !(( fsFlags & KC_VIRTUALKEY ) && (( usVk == VK_TAB )/* || ( usVk == VK_SPACE )*/))) { //mp2 = pQmsg->mp2; //kbdKeyTranslate( pQmsg ); consumed = (BOOL)WinSendMsg( hwndHIA, WM_CHAR, pQmsg->mp1, pQmsg->mp2 ); //pQmsg->mp2 = mp2; } else if( !isHanjaKey( fsFlags | KC_LONEKEY, ucScancode, usVk, usCh )) WinSendMsg( hwndHIA, HIAM_COMPLETEHCH, 0, 0 ); if( !consumed ) { if( !HIUSHORT( flHIAState )) return FALSE; if( fsFlags & ( KC_CTRL | KC_ALT )) return FALSE; if(( fsFlags & KC_VIRTUALKEY ) && (( usVk == VK_SHIFT ) || (( usVk >= VK_F1 ) && ( usVk <= VK_F24 )))) return FALSE; #ifndef ODIN_SUPPORT_IN_INPUT_HOOK if( pQmsg->msg == WM_CHAR ) { #endif #if 0 // IME do as the following. if( HIUSHORT( flHIAState ) && ( fsFlags & KC_CHAR ) && ( usCh == ' ' )) { pQmsg->mp1 = MPFROMSH2CH( KC_CHAR, ucRepeat, 0 ); pQmsg->mp2 = MPFROM2SHORT( usCh, 0 ); } #endif #ifndef ODIN_SUPPORT_IN_INPUT_HOOK } #endif WinPostMsg( pQmsg->hwnd, pQmsg->msg, pQmsg->mp1, pQmsg->mp2 ); } return TRUE; } } return FALSE; }
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; }
MRESULT EXPENTRY newKimeWndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { if( msg == KIMEM_RELOAD ) { WinSendMsg( hwndKHS, KHSM_RELOADEXCEPTFILE, 0, 0 ); hwndCurrentInput = NULLHANDLE; } if( msg == KIMEM_CALLHANJAINPUT ) { initKimeStatus( hwndCurrentInput, FALSE ); WinSendMsg( hwndHIA, WM_CHAR, MPFROMSH2CH( KC_LONEKEY | KC_SCANCODE, 0, 0x5B ), 0 ); WinSetFocus( HWND_DESKTOP, hwndCurrentInput ); return 0; } if( msg == KIMEM_CHANGEHANHOOK ) { WinSendMsg( hwndHIA, HIAM_CHANGEHANMODE, 0, 0 ); if( kimeOpt.useOS2IME ) toggleOS2IMEHanEng( hwndCurrentInput ); return 0; } if( msg == WM_CONTROL ) { switch (SHORT1FROMMP(mp1)) { case ID_HIA: switch (SHORT2FROMMP(mp1)) { case HIAN_INSERTHCH: if (!(SHORT1FROMMP(mp2) & 0x8000)) { sendCharToWnd( SHORT1FROMMP( mp2 )); setInputBoxHch( 0 ); showInputBox( FALSE ); } break; case HIAN_COMPO_BEGIN: case HIAN_COMPO_STEP: case HIAN_COMPO_STEPBACK: hchComposing = SHORT2FROMMP(mp2); setInputBoxHch( hchComposing ); showInputBox( TRUE ); break; #if 0 case HIAN_COMPO_STEP: hchComposing = SHORT2FROMMP(mp2); setInputBoxHch( hchComposing ); break; case HIAN_COMPO_STEPBACK: hchComposing = SHORT2FROMMP(mp2); setInputBoxHch( hchComposing ); break; #endif case HIAN_COMPO_CANCEL: setInputBoxHch( 0 ); showInputBox( FALSE ); hchComposing = 0; break; case HIAN_COMPO_COMPLETE: sendCharToWnd( SHORT1FROMMP( mp2 )); setInputBoxHch( 0 ); showInputBox( FALSE ); hchComposing = 0; break; case HIAN_HANMODECHANGED: WinSendMsg( hwndKHS, KHSM_SETHANSTATUS, MPFROMHWND( hwndCurrentInput ), MPFROMLONG( LONGFROMMP( mp2 ) == HCH_HAN )); WinSendMsg( hwndKime, KIMEM_SETHAN, MPFROMLONG( LONGFROMMP( mp2 ) == HCH_HAN ), 0 ); break; case HIAN_KBDTYPECHANGED: kimeOpt.kbdLayout = LONGFROMMR( mp2 ); break; case HIAN_INSERTMODECHANGED: break; case HIAN_HGHJCONVERT: WinSendMsg( hwndHIA, WM_CHAR, 0, 0 ); // call special char input WinSetFocus( HWND_DESKTOP, hwndCurrentInput); break; } // note switch end break; } // control switch end return 0; } return oldKimeWndProc( hwnd, msg, mp1, mp2 ); }
int icqskin_insertMessageHistory(HWND hwnd, ULONG flags, const char *hdr, const char *text) { ICQMSGDIALOG *cfg = WinQueryWindowPtr(hwnd,0); ULONG bytes = sizeof(RECORD)+strlen(hdr)+strlen(text)+5; HWND h = CHILD_WINDOW(hwnd,MSGID_HISTORY); PRECORD rec; RECORDINSERT recordInsert; PRECORD last = NULL; char *ptr; DBGTracex(h); last = (PRECORD) WinSendMsg(h,CM_QUERYRECORD, 0, MPFROM2SHORT(CMA_LAST,CMA_ITEMORDER)); if( ((long) last) == -1) last = NULL; rec = WinSendMsg(h,CM_ALLOCRECORD,MPFROMLONG(bytes),MPFROMSHORT(1)); DBGTracex(rec); if(!rec) return icqskin_logErrorInfo(((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq,hwnd,TRUE,"CM_ALLOCRECORD has failed"); memset(rec,0,sizeof(RECORD)); rec->recordCore.cb = sizeof(RECORDCORE); sprintf(rec->text,"%s\n%s",hdr,text); rec->recordCore.pszText = rec->recordCore.pszIcon = rec->recordCore.pszName = rec->msgText = rec->text; rec->flags = flags; rec->icon = rec->recordCore.hptrIcon = (flags & 1) ? cfg->msgOut : cfg->msgIn; for(ptr = rec->text;*ptr;ptr++) { if(*ptr == ICQ_FIELD_SEPARATOR) *ptr = '\n'; } memset(&recordInsert,0,sizeof(RECORDINSERT)); recordInsert.cb = sizeof(RECORDINSERT); recordInsert.pRecordParent = NULL; recordInsert.pRecordOrder = (PRECORDCORE)CMA_END; recordInsert.zOrder = CMA_TOP; recordInsert.cRecordsInsert = 1; recordInsert.fInvalidateRecord = TRUE; if(!WinSendMsg(h, CM_INSERTRECORD, (PRECORDCORE) rec, &recordInsert)) return icqskin_logErrorInfo(((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq,hwnd,TRUE,"CM_INSERTRECORD has failed"); if(last) { if(last->recordCore.flRecordAttr & HISTORY_SELECTED) WinSendMsg(h,CM_SETRECORDEMPHASIS,(MPARAM) last, MPFROM2SHORT(FALSE, HISTORY_SELECTED)); else return 0; } WinSendMsg(h,CM_SETRECORDEMPHASIS,(MPARAM) rec, MPFROM2SHORT(TRUE, HISTORY_SELECTED)); WinPostMsg(WinWindowFromID(h,CID_VSCROLL),WM_CHAR,MPFROMSH2CH(KC_VIRTUALKEY,0,0),MPFROM2SHORT(0,VK_END)); WinPostMsg(hwnd,WM_USER+10,0,0); return 0; }