ushort Gen_GetResponse(WINPTR w, STRING prompt, STRING response, BOOLEAN showresponse, short resplen, enum helpindex help) { WINPTR OldW = Win_Current, TmpW = w; char *cptr, *eptr; ushort c; short rcol, ask_mode; BOOLEAN ins_mode = TRUE; rcol = strlen(prompt) + 2; /* reserve space char on each side */ ask_mode = (*response != '('); /* 0 => single character mode */ if (w == NULL) { Win_1LineBorderSet(); TmpW = Win_Make(WIN_TILED | WIN_NONDESTRUCT | WIN_BORDER, (77 - rcol - resplen) / 2, 10, rcol + resplen + 3, 1, GEN_BORDER_ATTR, GEN_INSIDE_ATTR); } if (TmpW) { Win_Activate(TmpW); if (ask_mode) Win_SetFlags(WIN_BLOKCURSOR); cptr = eptr = response; /* current, end pointers */ while (*eptr) eptr++; for (;;) { Win_Clear(); Win_FastPutS(0, 1, prompt); if (showresponse) Win_FastPutS(0, rcol, response); Win_PutCursor(0, rcol + (cptr - response)); c = Kb_GetCh(); if (ask_mode && c == KB_CRGRTN) break; if ((!ask_mode || (eptr == response)) && c == KB_ESC) break; if (c == KB_F1 || c == KB_ALT_H) Hlp_IHelp(help); else if (ask_mode) Gen_EditString(c, response, &eptr, &cptr, &ins_mode, resplen); else if ((char)c) { if (c >= 'a' && c <= 'z') c -= 'a' - 'A'; if (strchr(response + 1, c) != NULL) if (c != ')') break; } } Win_Clear(); if (w == NULL) Win_Free(TmpW); } if (OldW) Win_Activate(OldW); return c; }
void Gen_ClearMessage(void) { if (Gen_MessageWindow) Win_Free(Gen_MessageWindow); if (Gen_PrevWindow) Win_Activate(Gen_PrevWindow); Gen_MessageWindow = Gen_PrevWindow = NULL; }
void Gen_ShowMessage(STRING message) { if (Win_Current != Gen_MessageWindow) Gen_PrevWindow = Win_Current; if (Gen_MessageWindow == NULL) { Win_1LineBorderSet(); Gen_MessageWindow = Win_Make(WIN_TILED | WIN_NONDESTRUCT | WIN_BORDER, 9, 10, 60, 1, GEN_BORDER_ATTR, GEN_INSIDE_ATTR); } if (Gen_MessageWindow) { Win_Activate(Gen_MessageWindow); Win_Clear(); Win_FastPutS(0, 1, message); } }
// main window procedure STATIC LONG WINAPI Win_MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_MOUSEWHEEL: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { mouse_wheel_event( ( short )HIWORD( wParam ) ); } break; case WM_MOUSEHWHEEL: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { mouse_hwheel_event( ( short )HIWORD( wParam ) ); } break; case WM_NCMOUSEMOVE: if( win.mouse.initialized ) { // don't hide cursor IN_MouseEvent( -1, -1 ); } break; case WM_MOUSEMOVE: if( win.mouse.initialized ) { int x = ( short )LOWORD( lParam ); int y = ( short )HIWORD( lParam ); IN_MouseEvent( x, y ); } // fall through case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_XBUTTONDOWN: case WM_XBUTTONUP: if( win.mouse.initialized == WIN_MOUSE_LEGACY ) { legacy_mouse_event( wParam ); } break; case WM_HOTKEY: return FALSE; case WM_INPUT: if( wParam == RIM_INPUT && win.mouse.initialized == WIN_MOUSE_RAW ) { raw_input_event( ( HANDLE )lParam ); } break; case WM_CLOSE: PostQuitMessage( 0 ); return FALSE; case WM_ACTIVATE: Win_Activate( wParam ); break; case WM_WINDOWPOSCHANGING: if( !( win.flags & QVF_FULLSCREEN ) ) { WINDOWPOS *pos = ( WINDOWPOS * )lParam; if( !( pos->flags & SWP_NOSIZE ) ) { resizing_event( hWnd, pos ); } } break; case WM_SIZE: if( wParam == SIZE_RESTORED && !( win.flags & QVF_FULLSCREEN ) ) { int w = ( short )LOWORD( lParam ); int h = ( short )HIWORD( lParam ); win.rc.width = w; win.rc.height = h; win.mode_changed |= MODE_SIZE; } break; case WM_MOVE: if( !( win.flags & QVF_FULLSCREEN ) ) { int x = ( short )LOWORD( lParam ); int y = ( short )HIWORD( lParam ); RECT r; // adjust for non-client area get_nc_area_size( hWnd, &r ); win.rc.x = x + r.left; win.rc.y = y + r.top; win.mode_changed |= MODE_POS; } break; case WM_SYSCOMMAND: switch( wParam & 0xFFF0 ) { case SC_SCREENSAVE: return FALSE; case SC_MAXIMIZE: if( !vid_fullscreen->integer ) { VID_ToggleFullscreen(); } return FALSE; } break; case WM_KEYDOWN: case WM_SYSKEYDOWN: legacy_key_event( wParam, lParam, qtrue ); return FALSE; case WM_KEYUP: case WM_SYSKEYUP: legacy_key_event( wParam, lParam, qfalse ); return FALSE; case WM_SYSCHAR: case WM_CHAR: #if USE_CHAR_EVENTS Key_CharEvent( wParam ); #endif return FALSE; default: break; } // pass all unhandled messages to DefWindowProc return DefWindowProc( hWnd, uMsg, wParam, lParam ); }