|
|
1.1 ! root 1: /* ! 2: Hatari ! 3: ! 4: Main viewing window display. This involves redrawing of the Window and also of directing input ! 5: to the various functions. Parts of this code control the relative mouse movement, debouncing ! 6: of input keys and the sizing of the view Window. ! 7: */ ! 8: ! 9: #include <SDL.h> ! 10: ! 11: #include "main.h" ! 12: #include "debug.h" ! 13: #include "dialog.h" ! 14: /*#include "dsurface.h"*/ ! 15: #include "floppy.h" ! 16: #include "ikbd.h" ! 17: #include "keymap.h" ! 18: #include "reset.h" ! 19: #include "screen.h" ! 20: #include "shortcut.h" ! 21: #include "statusBar.h" ! 22: /*#include "toolbar.h"*/ ! 23: #include "vdi.h" ! 24: #include "joy.h" ! 25: #include "view.h" ! 26: ! 27: ! 28: //HBITMAP Bitmaps[MAX_BITMAPS]; /* Handles to Bitmaps used to draw view window */ ! 29: //HCURSOR Cursors[MAX_CURSORS]; /* Cursors used to hide/show during view */ ! 30: ! 31: BOOL bWindowsMouseMode = FALSE/*TRUE*/; /* TRUE if mouse in Windows mode, FALSE if ST mode */ ! 32: BOOL bCursorOn = TRUE; /* TRUE if we are showing the standard windows arrow cursor */ ! 33: ! 34: //RECT WindowInitRect; ! 35: //HMENU hFullScreenMenu; /* Menu handle for full-screen options access */ ! 36: ! 37: char szPreviousImageFilenames[2][MAX_FLOPPY_MENU_IMAGES][MAX_FILENAME_LENGTH] = { ! 38: { "","","","" }, ! 39: { "","","","" } ! 40: }; ! 41: int nPreviousImageFilenames[2]= { 0,0 }; // Drive A, B ! 42: ! 43: // List of ST scan codes to NOT de-bounce when running in maximum speed ! 44: char DebounceExtendedKeys[] = { ! 45: 0x1d, // CTRL ! 46: 0x2a, // Left SHIFT ! 47: 0x01, // ESC ! 48: 0x38, // ALT ! 49: 0x36, // Right SHIFT ! 50: 0 //term ! 51: }; ! 52: ! 53: // Size of screen area for Windows according to resolution and options settings ! 54: // Index ONLY using 'View_GetWindowBorderSizeIndex()' ! 55: /* ! 56: RECT MinWindowBorderSizes[2][3] = { ! 57: { // Non-Overscan ! 58: 0,0, 320,200, // ST_LOW_RES ! 59: 0,0, 640,400, // ST_MEDIUM_RES ! 60: 0,0, 640,400, // ST_HIGH_RES ! 61: }, ! 62: { // Overscan ! 63: 0,0, 320+OVERSCAN_LEFT+OVERSCAN_RIGHT,200+OVERSCAN_TOP+OVERSCAN_BOTTOM, // ST_LOW_RES ! 64: 0,0, 640+OVERSCAN_LEFT*2+OVERSCAN_RIGHT*2,400+OVERSCAN_TOP*2+OVERSCAN_BOTTOM*2, // ST_MEDIUM_RES ! 65: 0,0, 640,400, // ST_HIGH_RES ! 66: } ! 67: }; ! 68: ! 69: RECT WindowBorderSizes[2][3] = { ! 70: { // Non-Overscan ! 71: 0,0, 320,200, // ST_LOW_RES ! 72: 0,0, 640,400, // ST_MEDIUM_RES ! 73: 0,0, 640,400, // ST_HIGH_RES ! 74: }, ! 75: { // Overscan ! 76: 0,0, 320+OVERSCAN_LEFT+OVERSCAN_RIGHT,200+OVERSCAN_TOP+OVERSCAN_BOTTOM, // ST_LOW_RES ! 77: 0,0, 640+OVERSCAN_LEFT*2+OVERSCAN_RIGHT*2,400+OVERSCAN_TOP*2+OVERSCAN_BOTTOM*2, // ST_MEDIUM_RES ! 78: 0,0, 640,400, // ST_HIGH_RES ! 79: } ! 80: }; ! 81: */ ! 82: ! 83: //----------------------------------------------------------------------- ! 84: /* ! 85: Set default Window init position(CW_USEDEFAULT) ! 86: */ ! 87: /* ! 88: void View_DefaultWindowPos(void) ! 89: { ! 90: WindowInitRect.left = ! 91: WindowInitRect.top = ! 92: WindowInitRect.right = ! 93: WindowInitRect.bottom = CW_USEDEFAULT; ! 94: } ! 95: */ ! 96: ! 97: //----------------------------------------------------------------------- ! 98: /* ! 99: Create our view window with toolbar/status bar and client area ! 100: */ ! 101: /* ! 102: void View_CreateWindow(void) ! 103: { ! 104: // Clear our short-cut keys ! 105: ShortCut_ClearKeys(); ! 106: ! 107: // Get size of window (320x200 default), make sure is on screen ! 108: View_SizeWindow(); ! 109: ! 110: // Create window, get global DC ! 111: hWnd = CreateWindow(szName,PROG_NAME,WS_OVERLAPPEDWINDOW ! 112: ,WindowInitRect.left,WindowInitRect.top,WindowInitRect.right,WindowInitRect.bottom ! 113: ,NULL,NULL,hInst,NULL); ! 114: MainDC = GetDC(hWnd); ! 115: // Call Windows to allow drag'n'drop of disc images ! 116: DragAcceptFiles(hWnd,TRUE); ! 117: // Create menu for full-screen ! 118: hFullScreenMenu = LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU_FULLSCREEN)); ! 119: ! 120: // Load bitmaps needed for tool/status bars ! 121: memset(Bitmaps,0x00,sizeof(HBITMAP)*MAX_BITMAPS); ! 122: View_LoadBitmaps(); ! 123: ! 124: // Load cursors used, and store off default ! 125: Cursors[CURSOR_ORIGINAL] = SetCursor(Cursors[CURSOR_ARROW]); ! 126: Cursors[CURSOR_ARROW] = LoadCursor(NULL,IDC_ARROW); ! 127: Cursors[CURSOR_NULL] = LoadCursor(hInst,MAKEINTRESOURCE(IDC_CURSOR1)); ! 128: Cursors[CURSOR_HOURGLASS] = LoadCursor(NULL,IDC_WAIT); ! 129: ! 130: // Create pop-up menus for toolbar ! 131: ToolBar_CreateMenus(); ! 132: } ! 133: */ ! 134: ! 135: //----------------------------------------------------------------------- ! 136: /* ! 137: Close our view Window ! 138: */ ! 139: /* ! 140: void View_CloseWindow(void) ! 141: { ! 142: // Free tool/status bar bitmaps ! 143: View_FreeBitmaps(); ! 144: ! 145: // Restore cursor back to normal ! 146: SetCursor(Cursors[CURSOR_ORIGINAL]); ! 147: ! 148: // Free menus ! 149: ToolBar_FreeMenus(); ! 150: // Free full-screen menu ! 151: DestroyMenu(hFullScreenMenu); ! 152: } ! 153: */ ! 154: ! 155: //----------------------------------------------------------------------- ! 156: /* ! 157: Show our view Window(create at correct size) ! 158: */ ! 159: /* ! 160: void View_ShowWindow(void) ! 161: { ! 162: // Set VDI before create window ! 163: VDI_SetResolution(VDIModeOptions[ConfigureParams.TOSGEM.nGEMResolution],ConfigureParams.TOSGEM.nGEMColours); ! 164: } ! 165: */ ! 166: ! 167: //----------------------------------------------------------------------- ! 168: /* ! 169: Load Bitmaps, using in ToolBar/StatusBar. Delete any existing ones, and remap to Windows colours ! 170: */ ! 171: /* ! 172: void View_LoadBitmaps(void) ! 173: { ! 174: // Free first ! 175: View_FreeBitmaps(); ! 176: ! 177: // Load bitmaps used from resource(remap colours to Windows using 'LoadImage') ! 178: Bitmaps[BITMAP_TOOLBAR_ICONS] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_TOOLBAR_ICONS),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 179: Bitmaps[BITMAP_GRILL] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_GRILL),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 180: Bitmaps[BITMAP_RESIZE] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_RESIZE),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 181: Bitmaps[BITMAP_TOOLBAR_MENU] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_TOOLBAR_MENU),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 182: Bitmaps[BITMAP_TOOLBAR_SEPARATOR] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP9),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 183: Bitmaps[BITMAP_STATUSBAR_ICONS] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP_STATUSBAR_ICONS),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADMAP3DCOLORS); ! 184: } ! 185: */ ! 186: ! 187: //----------------------------------------------------------------------- ! 188: /* ! 189: Free Bitmaps used in View window ! 190: */ ! 191: /* ! 192: void View_FreeBitmaps(void) ! 193: { ! 194: int i; ! 195: ! 196: // Free any existing bitmaps ! 197: for(i=0; i<MAX_BITMAPS; i++) { ! 198: if (Bitmaps[i]) { ! 199: DeleteObject(Bitmaps[i]); ! 200: Bitmaps[i] = NULL; ! 201: } ! 202: } ! 203: } ! 204: */ ! 205: ! 206: //----------------------------------------------------------------------- ! 207: /* ! 208: Set menu 'tick's - do to full-screen and pop-up versions ! 209: */ ! 210: /* ! 211: void View_CheckMenuItem(int Control,BOOL bState) ! 212: { ! 213: CheckMenuItem(hFullScreenMenu,Control,bState ? MF_CHECKED:MF_UNCHECKED); ! 214: CheckMenuItem(hToolBarMenus[POPUP_MENU_OPTIONS][1],Control,bState ? MF_CHECKED:MF_UNCHECKED); ! 215: } ! 216: */ ! 217: ! 218: //----------------------------------------------------------------------- ! 219: /* ! 220: Set all items on menu bar ! 221: */ ! 222: /* ! 223: void View_SetMenuChecks(void) ! 224: { ! 225: View_CheckMenuItem(ID_OPTIONS_SOUND,ConfigureParams.Sound.bEnableSound); ! 226: View_CheckMenuItem(ID_OPTIONS_MAXSPEED,ConfigureParams.Configure.nMinMaxSpeed==MINMAXSPEED_MAX); ! 227: View_CheckMenuItem(ID_OPTIONS_CURSOREMU,ConfigureParams.Joysticks.Joy[1].bCursorEmulation); ! 228: } ! 229: */ ! 230: ! 231: //----------------------------------------------------------------------- ! 232: /* ! 233: ! 234: */ ! 235: /* ! 236: void View_SetMenuFileNames(HMENU hMenu, int InitMenuItem,int Drive) ! 237: { ! 238: MENUITEMINFO MenuInfo; ! 239: int i; ! 240: ! 241: // Delete any old menu items for filenames, including separator ! 242: for(i=0; i<(MAX_FLOPPY_MENU_IMAGES+1); i++) ! 243: RemoveMenu(hMenu,InitMenuItem,MF_BYPOSITION); ! 244: ! 245: // Do we have any filenames to add? ! 246: if (nPreviousImageFilenames[Drive]!=0) { ! 247: // Add separator ! 248: memset(&MenuInfo,0x0,sizeof(MENUITEMINFO)); ! 249: MenuInfo.cbSize = sizeof(MENUITEMINFO); ! 250: MenuInfo.fMask = MIIM_TYPE; ! 251: MenuInfo.fType = MFT_SEPARATOR; ! 252: InsertMenuItem(hMenu,InitMenuItem,TRUE,&MenuInfo); ! 253: // Add filenames ! 254: for(i=0; i<nPreviousImageFilenames[Drive]; i++) { ! 255: memset(&MenuInfo,0x0,sizeof(MENUITEMINFO)); ! 256: MenuInfo.cbSize = sizeof(MENUITEMINFO); ! 257: MenuInfo.fMask = MIIM_TYPE|MIIM_ID; ! 258: MenuInfo.wID = (Drive==0) ? (ID_FLOPPYA_INSERT_SLOT1+i):(ID_FLOPPYB_INSERT_SLOT1+i); ! 259: MenuInfo.fType = MFT_STRING; ! 260: MenuInfo.dwTypeData = szPreviousImageFilenames[Drive][i]; ! 261: InsertMenuItem(hMenu,InitMenuItem+1+i,TRUE,&MenuInfo); ! 262: } ! 263: } ! 264: } ! 265: */ ! 266: ! 267: //----------------------------------------------------------------------- ! 268: /* ! 269: Add filename to Floppy menu, move item to top if already on menu or just add a fresh ! 270: */ ! 271: /* ! 272: void View_AddMenuFileName(int Drive,char *pszFileName) ! 273: { ! 274: int i,j; ! 275: ! 276: // Is already in list? ! 277: for(i=0; i<MAX_FLOPPY_MENU_IMAGES; i++) { ! 278: if (!stricmp(szPreviousImageFilenames[Drive][i],pszFileName)) { ! 279: // Found in list, move to top ! 280: for(j=i; j>0; j--) ! 281: strcpy(szPreviousImageFilenames[Drive][j],szPreviousImageFilenames[Drive][j-1]); ! 282: // Copy to top ! 283: strcpy(szPreviousImageFilenames[Drive][0],pszFileName); ! 284: ! 285: return; ! 286: } ! 287: } ! 288: ! 289: // Could not find in list, add to top ! 290: ! 291: // Move all down ! 292: for(i=(MAX_FLOPPY_MENU_IMAGES-1); i>0; i--) ! 293: strcpy(szPreviousImageFilenames[Drive][i],szPreviousImageFilenames[Drive][i-1]); ! 294: // Add entry ! 295: strcpy(szPreviousImageFilenames[Drive][0],pszFileName); ! 296: nPreviousImageFilenames[Drive]++; ! 297: if (nPreviousImageFilenames[Drive]>=MAX_FLOPPY_MENU_IMAGES) ! 298: nPreviousImageFilenames[Drive] = MAX_FLOPPY_MENU_IMAGES; ! 299: } ! 300: */ ! 301: ! 302: //----------------------------------------------------------------------- ! 303: /* ! 304: Create and populate full-screen menu ! 305: */ ! 306: /* ! 307: void View_SetFullScreenMenu(void) ! 308: { ! 309: SetMenu(hWnd,hFullScreenMenu); // Set for menu display ! 310: View_SetMenuChecks(); ! 311: // Set filenames on menu Floppy A,B ! 312: View_SetMenuFileNames(GetSubMenu(hFullScreenMenu,1),NUM_FLOPPYA_MENU_ITEMS,0); ! 313: View_SetMenuFileNames(GetSubMenu(hFullScreenMenu,2),NUM_FLOPPYB_MENU_ITEMS,1); ! 314: ! 315: DrawMenuBar(hWnd); ! 316: } ! 317: */ ! 318: ! 319: //----------------------------------------------------------------------- ! 320: /* ! 321: Draw background rectangle in correct Window colour ! 322: */ ! 323: /* ! 324: void View_DrawBackgroundRect(HDC hDC,RECT *pRect) ! 325: { ! 326: HBRUSH hBrush; ! 327: ! 328: // Create brush for background ! 329: hBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); ! 330: // Fill ! 331: FillRect(hDC,pRect,hBrush); ! 332: // Clean up ! 333: DeleteObject(hBrush); ! 334: } ! 335: */ ! 336: ! 337: //----------------------------------------------------------------------- ! 338: /* ! 339: Draw line Window hi-light colour ! 340: */ ! 341: /* ! 342: void View_DrawBackgroundLineLight(HDC hDC,int x,int y,int x2,int y2) ! 343: { ! 344: HPEN hPen,hOldPen; ! 345: ! 346: // Create pen for hi-light ! 347: hPen = CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHILIGHT)); ! 348: hOldPen = (HPEN)SelectObject(hDC,hPen); ! 349: MoveToEx(hDC,x,y,NULL); ! 350: LineTo(hDC,x2,y2); ! 351: // Clean up ! 352: DeleteObject(SelectObject(hDC,hOldPen)); ! 353: } ! 354: */ ! 355: ! 356: //----------------------------------------------------------------------- ! 357: /* ! 358: Draw line Window shadow colour ! 359: */ ! 360: /* ! 361: void View_DrawBackgroundLineShadow(HDC hDC,int x,int y,int x2,int y2) ! 362: { ! 363: HPEN hPen,hOldPen; ! 364: ! 365: // Create pen for shadow ! 366: hPen = CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW)); ! 367: hOldPen = (HPEN)SelectObject(hDC,hPen); ! 368: MoveToEx(hDC,x,y,NULL); ! 369: LineTo(hDC,x2,y2); ! 370: // Clean up ! 371: DeleteObject(SelectObject(hDC,hOldPen)); ! 372: } ! 373: */ ! 374: ! 375: //----------------------------------------------------------------------- ! 376: /* ! 377: Draw view window, with ToolBar and StatusBar ! 378: */ ! 379: /* ! 380: void View_DrawWindow(HDC hDC) ! 381: { ! 382: HDC MemDC; ! 383: RECT Rect,RectCopy; ! 384: ! 385: if (!bInFullScreen) { // Only draw when in Window, else DirectX may draw! Doh! ! 386: MemDC = CreateCompatibleDC(hDC); ! 387: GetClientRect(hWnd,&Rect); ! 388: ! 389: // Draw speed bar ! 390: View_DrawBackgroundLineLight(hDC,0,0, Rect.right,0); ! 391: RectCopy = Rect; ! 392: RectCopy.top = 1; ! 393: RectCopy.bottom = 26; ! 394: View_DrawBackgroundRect(hDC,&RectCopy); ! 395: // Draw icons ! 396: SelectObject(MemDC,Bitmaps[BITMAP_TOOLBAR_MENU]); // Win98 Menu bar ! 397: BitBlt(hDC,Rect.left+1,2,6,23,MemDC,0,0,SRCCOPY); ! 398: SelectObject(MemDC,Bitmaps[BITMAP_TOOLBAR_SEPARATOR]); // Win98 Icon space lines ! 399: BitBlt(hDC,Rect.left+1+42,2,2,23,MemDC,0,0,SRCCOPY); ! 400: BitBlt(hDC,Rect.left+1+114,2,2,23,MemDC,0,0,SRCCOPY); ! 401: BitBlt(hDC,Rect.left+1+175,2,2,23,MemDC,0,0,SRCCOPY); ! 402: ToolBar_DrawButtons(hDC); ! 403: SelectObject(MemDC,Bitmaps[BITMAP_GRILL]); // ST 'Grill' ! 404: BitBlt(hDC,Rect.right-136,1,132,17,MemDC,0,0,SRCCOPY); ! 405: ! 406: // Draw outline ! 407: View_DrawBackgroundLineShadow(hDC,Rect.right-1,Rect.top+26, 0,Rect.top+26); ! 408: View_DrawBackgroundLineShadow(hDC,0,Rect.top+26, 0,Rect.bottom-17); ! 409: View_DrawBackgroundLineLight(hDC,Rect.right-1,Rect.top+26, Rect.right-1,Rect.bottom-18); ! 410: View_DrawBackgroundLineLight(hDC,Rect.right-1,Rect.bottom-18, 0,Rect.bottom-18); ! 411: ! 412: DeleteDC(MemDC); ! 413: ! 414: // Draw our status bar, with text and icons ! 415: StatusBar_Draw(); ! 416: } ! 417: } ! 418: */ ! 419: ! 420: ! 421: //----------------------------------------------------------------------- ! 422: /* ! 423: Draw our full-screen menu ! 424: */ ! 425: /* ! 426: void View_DrawMenu(void) ! 427: { ! 428: // Update menu ! 429: if (bFullScreenHold) { ! 430: DrawMenuBar(hWnd); ! 431: } ! 432: } ! 433: */ ! 434: ! 435: ! 436: //----------------------------------------------------------------------- ! 437: /* ! 438: Limit Windows cursor whole physical screen ! 439: */ ! 440: /* ! 441: void View_LimitCursorToScreen(void) ! 442: { ! 443: SetCursor(Cursors[CURSOR_ARROW]); // Restore cursor ! 444: ClipCursor(NULL); ! 445: } ! 446: */ ! 447: ! 448: //----------------------------------------------------------------------- ! 449: /* ! 450: Set IKBD relative delta to zero ! 451: */ ! 452: void View_ResetRelativeMouseDelta(void) ! 453: { ! 454: int x,y; ! 455: ! 456: /* Get cursor point */ ! 457: SDL_GetMouseState(&x, &y); ! 458: /* And set so we have a zero delta */ ! 459: KeyboardProcessor.Rel.X = KeyboardProcessor.Rel.PrevX = x; ! 460: KeyboardProcessor.Rel.Y = KeyboardProcessor.Rel.PrevY = y; ! 461: } ! 462: ! 463: //----------------------------------------------------------------------- ! 464: /* ! 465: Limit Windows cursor to area of ST screen display ! 466: */ ! 467: /* ! 468: void View_LimitCursorToClient(void) ! 469: { ! 470: RECT Rect; ! 471: ! 472: if (!bWindowsMouseMode) { ! 473: // Find area of client area ! 474: GetClientRect(hWnd,&Rect); ! 475: // Make to screen coords, and limit cursor to this area ! 476: ClientToScreen(hWnd,(POINT *)&Rect.left); ! 477: ClientToScreen(hWnd,(POINT *)&Rect.right); ! 478: ! 479: // Limit mouse to client area ! 480: ClipCursor(&Rect); ! 481: // And make sure delta isn't passed back to emulation ! 482: View_ResetRelativeMouseDelta(); ! 483: } ! 484: else { ! 485: // Allow cursor to move to all of desktop screen ! 486: View_LimitCursorToScreen(); ! 487: } ! 488: } ! 489: */ ! 490: ! 491: //----------------------------------------------------------------------- ! 492: /* ! 493: Set our mouse mode, by passing MOUSE_xxxx. This allows for a direct set to WINDOWS or ST ! 494: and also the ability to TOGGLE the mode between the two ! 495: Returns TRUE if was previously in MOUSE_WINDOWS mode(used to revert mode) ! 496: */ ! 497: /* ! 498: BOOL View_ToggleWindowsMouse(int ForceToMode) ! 499: { ! 500: int SetMode, OldWindowsMouse; ! 501: ! 502: // Store old mode ! 503: OldWindowsMouse = bWindowsMouseMode; ! 504: ! 505: // Set which mouse mode to use ! 506: if (ForceToMode==MOUSE_TOGGLE) { // Toggle? ! 507: if (bWindowsMouseMode) ! 508: SetMode = MOUSE_ST; ! 509: else ! 510: SetMode = MOUSE_WINDOWS; ! 511: } ! 512: else // Or force ! 513: SetMode = ForceToMode; ! 514: ! 515: // Clear status bar text/reset toolbar, or show Help message if in Windows mode ! 516: if (SetMode==MOUSE_ST) ! 517: StatusBar_SetText(""); ! 518: else { ! 519: ToolBar_UpdateOnMoveMove(-1,-1); ! 520: StatusBar_SetText(pszStatusBarHelpText); ! 521: } ! 522: ! 523: // Toggle windows mouse ! 524: if (SetMode==MOUSE_ST) { // Go to ST mouse mode ! 525: bWindowsMouseMode = FALSE; ! 526: View_LimitCursorToClient(); ! 527: if (bCursorOn) { // 'ShowCursor' uses count, so make sure only turn on/off when need to! ! 528: SetCursor(Cursors[CURSOR_NULL]); // Use 'blank' cursor, as some graphics cards still display when turn off! Doh! ! 529: ShowCursor(FALSE); ! 530: bCursorOn = FALSE; ! 531: } ! 532: ! 533: Main_UnPauseEmulation(); ! 534: } ! 535: else { // Return to Windows mouse mode! ! 536: bWindowsMouseMode = TRUE; ! 537: View_LimitCursorToScreen(); ! 538: if (!bCursorOn) { ! 539: SetCursor(Cursors[CURSOR_ARROW]); // Restore cursor ! 540: ShowCursor(TRUE); ! 541: bCursorOn = TRUE; ! 542: } ! 543: ! 544: Main_PauseEmulation(); ! 545: } ! 546: ! 547: return(OldWindowsMouse); ! 548: } ! 549: */ ! 550: ! 551: ! 552: //----------------------------------------------------------------------- ! 553: /* ! 554: Scan list of keys to NOT de-bounce when running in maximum speed, eg ALT,SHIFT,CTRL etc... ! 555: Return TRUE if key requires de-bouncing ! 556: */ ! 557: BOOL View_DebounceSTKey(char STScanCode) ! 558: { ! 559: int i=0; ! 560: ! 561: /* Are we in maximum speed, and have disabled key repeat? */ ! 562: /* ! 563: if ( (ConfigureParams.Configure.nMinMaxSpeed!=MINMAXSPEED_MIN) && (ConfigureParams.Keyboard.bDisableKeyRepeat) ) { ! 564: // We should de-bounce all non extended keys, eg leave ALT,SHIFT,CTRL etc... held ! 565: while (DebounceExtendedKeys[i]) { ! 566: if (STScanCode==DebounceExtendedKeys[i]) ! 567: return(FALSE); ! 568: i++; ! 569: } ! 570: ! 571: // De-bounce key ! 572: return(TRUE); ! 573: } ! 574: */ ! 575: /* Do not de-bounce key */ ! 576: return(FALSE); ! 577: } ! 578: ! 579: ! 580: //----------------------------------------------------------------------- ! 581: /* ! 582: Debounce any PC key held down if running with key repeat disabled ! 583: This is called each ST frame, so keys get held down for one VBL which is enough for 68000 code to scan ! 584: */ ! 585: void View_DebounceAllKeys(void) ! 586: { ! 587: unsigned int Key; ! 588: char STScanCode; ! 589: /* ! 590: // Are we in maximum speed, and have disabled key repeat? ! 591: if ( (ConfigureParams.Configure.nMinMaxSpeed!=MINMAXSPEED_MIN) && (ConfigureParams.Keyboard.bDisableKeyRepeat) ) { ! 592: // Now run through each PC key looking for ones held down ! 593: for(Key=0; Key<256; Key++) { ! 594: // Is key held? ! 595: if (Keyboard.KeyStates[Key]) { ! 596: // Get scan code ! 597: STScanCode = Keymap_RemapWindowsKeyToSTScanCode(Key); ! 598: if (STScanCode!=-1) { ! 599: // Does this require de-bouncing? ! 600: if (View_DebounceSTKey(STScanCode)) ! 601: View_KeyUp(hWnd,0,MAKELONG(0,(Key&0x80) ? KF_EXTENDED|Key:Key)); ! 602: } ! 603: } ! 604: } ! 605: } ! 606: */ ! 607: } ! 608: ! 609: //----------------------------------------------------------------------- ! 610: /* ! 611: Check if mouse is at edges of our Window and move back to middle to allow us to emulate ! 612: the relative mouse mode. ! 613: As Windows does not allow 'relative' mouse movement (on all versions of Windows) we need to ! 614: emulate this by finding the difference between this mouse position and the previous one. ! 615: However, Windows will limit the mouse to the edge of the screen/client area and so we need ! 616: to move the mouse back to the middle of the window when it gets close to the edges to give ! 617: constant relative values. Phew! ! 618: */ ! 619: void View_CheckMouseAtEdgeOfScreen(/*HWND hWnd,*/int MouseX,int MouseY) ! 620: { ! 621: /* ! 622: RECT RectCapture; ! 623: POINT MousePoint; ! 624: ! 625: // Get mouse point as client coordinates ! 626: MousePoint.x = MouseX; ! 627: MousePoint.y = MouseY; ! 628: if (!bInFullScreen) ! 629: ScreenToClient(hWnd,&MousePoint); ! 630: ! 631: // Calculate edges along client/full screen bounds ! 632: View_GetMinBorderRect(&RectCapture); ! 633: ! 634: // Is mouse towards edge of client area? If so, need to reset to keep relative ! 635: if ( (MousePoint.x<(RectCapture.left+20)) || (MousePoint.y<(RectCapture.top+20)) || (MousePoint.x>(RectCapture.right-20)) || (MousePoint.y>(RectCapture.bottom-20)) ) { ! 636: // This is the middle of the window ! 637: MousePoint.x = (RectCapture.right/2); ! 638: MousePoint.y = (RectCapture.bottom/2); ! 639: // Put back into screen coordinates for setting position back ! 640: if (!bInFullScreen) ! 641: ClientToScreen(hWnd,&MousePoint); ! 642: SetCursorPos(MousePoint.x,MousePoint.y); ! 643: ! 644: // And make sure delta isn't passed back to emulation ! 645: View_ResetRelativeMouseDelta(); ! 646: } ! 647: */ ! 648: } ! 649: ! 650: //----------------------------------------------------------------------- ! 651: /* ! 652: Store current mouse position and check for edges of window(to create relative movement) ! 653: */ ! 654: void View_UpdateSTMousePosition(void) ! 655: { ! 656: int mx, my; ! 657: ! 658: /* Only update if in mouse emulation mode */ ! 659: if (!bWindowsMouseMode) { ! 660: /* Get cursor position */ ! 661: SDL_GetMouseState(&mx, &my); ! 662: KeyboardProcessor.Rel.X = mx; ! 663: KeyboardProcessor.Rel.Y = my; ! 664: /* Move Windows cursor back from edges of screen (creates relative movement) */ ! 665: View_CheckMouseAtEdgeOfScreen(mx, my); ! 666: } ! 667: } ! 668: ! 669: ! 670: //----------------------------------------------------------------------- ! 671: /* ! 672: User press key down ! 673: */ ! 674: void View_KeyDown( unsigned int sdlkey, unsigned int sdlmod ) ! 675: { ! 676: BOOL bPreviousKeyState; ! 677: char STScanCode; ! 678: unsigned int Key; ! 679: ! 680: Key = sdlkey; ! 681: ! 682: /* If using cursor emulation, DON'T send keys to keyboard processor!!! Some games use keyboard as pause! */ ! 683: if ( (ConfigureParams.Joysticks.Joy[0].bCursorEmulation || ConfigureParams.Joysticks.Joy[1].bCursorEmulation) ! 684: && !(SDL_GetModState()&(KMOD_LSHIFT|KMOD_RSHIFT)) ) ! 685: { ! 686: if( Key==SDLK_UP ) { cursorJoyEmu |= 1; return; } ! 687: else if( Key==SDLK_DOWN ) { cursorJoyEmu |= 2; return; } ! 688: else if( Key==SDLK_LEFT ) { cursorJoyEmu |= 4; return; } ! 689: else if( Key==SDLK_RIGHT ) { cursorJoyEmu |= 8; return; } ! 690: else if( Key==SDLK_RCTRL || Key==SDLK_KP0 ) { cursorJoyEmu |= 128; return; } ! 691: } ! 692: ! 693: /* Bring up help on F1 */ ! 694: //FM if ( (bWindowsMouseMode) && (Key==KEY_F1) ) ! 695: //FIXME ToolBar_Activate_Help(); ! 696: ! 697: /* Set down */ ! 698: bPreviousKeyState = Keyboard.KeyStates[Key]; ! 699: Keyboard.KeyStates[Key] = TRUE; ! 700: ! 701: /* If pressed F11 or F12, retain short-cut keypress until safe to execute(start of VBL) */ ! 702: /*FIXME ! 703: if ( (Key==KEY_F11) || (Key==KEY_F12) ) ! 704: { ! 705: ShortCutKey.Key = Key; ! 706: ShortCutKey.bCtrlPressed = (GetAsyncKeyState(VK_CONTROL)&0x8000); ! 707: ShortCutKey.bShiftPressed = (GetAsyncKeyState(VK_SHIFT)&0x8000); ! 708: } ! 709: else ! 710: */ ! 711: { ! 712: STScanCode = Keymap_RemapKeyToSTScanCode(Key); ! 713: /*fprintf(stderr,"Key=%i, Scancode=%x\n",Key,STScanCode);*/ ! 714: if (STScanCode!=-1) ! 715: { ! 716: if (!bPreviousKeyState) ! 717: IKBD_PressSTKey(STScanCode,TRUE); ! 718: } ! 719: } ! 720: ! 721: // If not running emulator check keys here and not on VBL ! 722: if (bWindowsMouseMode) ! 723: ShortCut_CheckKeys(); ! 724: } ! 725: ! 726: ! 727: //----------------------------------------------------------------------- ! 728: /* ! 729: User released key ! 730: */ ! 731: void View_KeyUp(unsigned int sdlkey, unsigned int sdlmod) ! 732: { ! 733: char STScanCode; ! 734: unsigned int Key; ! 735: ! 736: Key = sdlkey; ! 737: ! 738: ! 739: /* If using cursor emulation, DON'T send keys to keyboard processor!!! Some games use keyboard as pause! */ ! 740: if ( (ConfigureParams.Joysticks.Joy[0].bCursorEmulation || ConfigureParams.Joysticks.Joy[1].bCursorEmulation) ! 741: && !(SDL_GetModState()&(KMOD_LSHIFT|KMOD_RSHIFT)) ) ! 742: { ! 743: if( Key==SDLK_UP ) { cursorJoyEmu &= ~1; return; } ! 744: else if( Key==SDLK_DOWN ) { cursorJoyEmu &= ~2; return; } ! 745: else if( Key==SDLK_LEFT ) { cursorJoyEmu &= ~4; return; } ! 746: else if( Key==SDLK_RIGHT ) { cursorJoyEmu &= ~8; return; } ! 747: else if( Key==SDLK_RCTRL || Key==SDLK_KP0 ) { cursorJoyEmu &= ~128; return; } ! 748: } ! 749: ! 750: /* Release key (only if was pressed) */ ! 751: STScanCode = Keymap_RemapKeyToSTScanCode(Key); ! 752: if (STScanCode!=-1) { ! 753: if (Keyboard.KeyStates[Key]) ! 754: IKBD_PressSTKey(STScanCode,FALSE); ! 755: } ! 756: ! 757: Keyboard.KeyStates[Key] = FALSE; ! 758: } ! 759: ! 760: ! 761: //----------------------------------------------------------------------- ! 762: /* ! 763: User moved mouse ! 764: */ ! 765: /* ! 766: void View_MouseMove(HWND hWnd,UINT wParam,LONG lParam) ! 767: { ! 768: int MouseX,MouseY; ! 769: ! 770: // Are we in Windows mouse mode? ! 771: if (bWindowsMouseMode) { ! 772: // Get mouse coords ! 773: MouseX = LOWORD(lParam); ! 774: MouseY = HIWORD(lParam); ! 775: ! 776: // Restore cursor ! 777: SetCursor(Cursors[CURSOR_ARROW]); ! 778: // Update toolbar ! 779: ToolBar_UpdateOnMoveMove(MouseX,MouseY); ! 780: ! 781: return; ! 782: } ! 783: } ! 784: */ ! 785: ! 786: //----------------------------------------------------------------------- ! 787: /* ! 788: User pressed left mouse button ! 789: */ ! 790: void View_LeftMouseButtonDown() ! 791: { ! 792: int MouseX,MouseY; ! 793: ! 794: // Are we in Windows mouse mode? ! 795: /* ! 796: if (bWindowsMouseMode) ! 797: { ! 798: // Get mouse coords ! 799: MouseX = LOWORD(lParam); ! 800: MouseY = HIWORD(lParam); ! 801: ! 802: // Activate toolbar button and execute ! 803: ToolBar_ActivateOnLeftButtonDown(MouseX,MouseY); ! 804: } ! 805: else ! 806: */ ! 807: { ! 808: if (Keyboard.LButtonDblClk==0) ! 809: Keyboard.bLButtonDown |= BUTTON_MOUSE; // Set button down flag ! 810: } ! 811: } ! 812: ! 813: ! 814: //----------------------------------------------------------------------- ! 815: /* ! 816: User released left mouse button ! 817: */ ! 818: void View_LeftMouseButtonUp() ! 819: { ! 820: /* Are we in Windows mouse mode? */ ! 821: /* ! 822: if (!bWindowsMouseMode) { ! 823: if (Keyboard.LButtonDblClk==0) ! 824: Keyboard.bLButtonDown &= ~BUTTON_MOUSE; // Button is released ! 825: } ! 826: else ! 827: */ ! 828: Keyboard.bLButtonDown &= ~BUTTON_MOUSE; ! 829: } ! 830: ! 831: ! 832: //----------------------------------------------------------------------- ! 833: /* ! 834: User pressed right mouse button ! 835: */ ! 836: void View_RightMouseButtonDown() ! 837: { ! 838: int MouseX,MouseY; ! 839: ! 840: /* Are we in Windows mouse mode? */ ! 841: /* ! 842: if (bWindowsMouseMode) ! 843: { ! 844: // Get mouse coords ! 845: MouseX = LOWORD(lParam); ! 846: MouseY = HIWORD(lParam); ! 847: ! 848: // Activate toolbar button and execute ! 849: ToolBar_ActivateOnRightButtonDown(MouseX,MouseY); ! 850: } ! 851: else ! 852: */ ! 853: { ! 854: Keyboard.bRButtonDown |= BUTTON_MOUSE; ! 855: } ! 856: } ! 857: ! 858: ! 859: //----------------------------------------------------------------------- ! 860: /* ! 861: User released right mouse button ! 862: */ ! 863: void View_RightMouseButtonUp() ! 864: { ! 865: // Are we in Windows mouse mode? ! 866: if (bWindowsMouseMode) ! 867: return; ! 868: ! 869: Keyboard.bRButtonDown &= ~BUTTON_MOUSE; ! 870: } ! 871:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.