/** * Cold reset ST (reset memory, all registers and reboot) */ int Reset_Cold(void) { /* Set mouse pointer to the middle of the screen */ Main_WarpMouse(sdlscrn->w/2, sdlscrn->h/2, false); return Reset_ST(true); }
/** * Show the "alert" dialog. Return true if user pressed "OK". */ static int DlgAlert_ShowDlg(const char *text) { static int maxlen = sizeof(dlglines[0])-1; char *t = (char *)malloc(strlen(text)+1); char *orig_t = t; int lines, i, len, offset; bool bOldMouseVisibility; int nOldMouseX, nOldMouseY; strcpy(t, text); lines = DlgAlert_FormatTextToBox(t, maxlen, &len); offset = (maxlen-len)/2; for(i=0; i<MAX_LINES; i++) { if (i < lines) { /* center text to current dlgline */ memset(dlglines[i], ' ', offset); strcpy(dlglines[i] + offset, t); t += strlen(t)+1; } else { dlglines[i][0] = '\0'; } } free(orig_t); if (SDLGui_SetScreen(sdlscrn)) return false; SDLGui_CenterDlg(alertdlg); SDL_GetMouseState(&nOldMouseX, &nOldMouseY); bOldMouseVisibility = SDL_ShowCursor(SDL_QUERY); SDL_ShowCursor(SDL_ENABLE); i = SDLGui_DoDialog(alertdlg, NULL); SDL_UpdateRect(sdlscrn, 0,0, 0,0); SDL_ShowCursor(bOldMouseVisibility); Main_WarpMouse(nOldMouseX, nOldMouseY); return (i == DLGALERT_OK); }
/** * This functions sets up the actual font and then displays the main dialog. */ int Dialog_MainDlg(bool *bReset, bool *bLoadedSnapshot) { int retbut; bool bOldMouseVisibility; int nOldMouseX, nOldMouseY; char *psNewCfg; *bReset = false; *bLoadedSnapshot = false; if (SDLGui_SetScreen(sdlscrn)) return false; SDL_GetMouseState(&nOldMouseX, &nOldMouseY); bOldMouseVisibility = SDL_ShowCursor(SDL_QUERY); SDL_ShowCursor(SDL_ENABLE); SDLGui_CenterDlg(maindlg); maindlg[MAINDLG_NORESET].state |= SG_SELECTED; maindlg[MAINDLG_RESET].state &= ~SG_SELECTED; do { retbut = SDLGui_DoDialog(maindlg, NULL); switch (retbut) { case MAINDLG_ABOUT: Dialog_AboutDlg(); break; case MAINDLG_FLOPPYS: DlgFloppy_Main(); break; case MAINDLG_HARDDISK: DlgHardDisk_Main(); break; case MAINDLG_ROM: DlgRom_Main(); break; case MAINDLG_MONITOR: Dialog_MonitorDlg(); break; case MAINDLG_WINDOW: Dialog_WindowDlg(); break; case MAINDLG_SYSTEM: Dialog_SystemDlg(); break; case MAINDLG_MEMORY: if (Dialog_MemDlg()) { /* Memory snapshot has been loaded - leave GUI immediately */ *bLoadedSnapshot = true; SDL_ShowCursor(bOldMouseVisibility); Main_WarpMouse(nOldMouseX, nOldMouseY); return true; } break; case MAINDLG_JOY: Dialog_JoyDlg(); break; case MAINDLG_KEYBD: Dialog_KeyboardDlg(); break; case MAINDLG_DEVICES: Dialog_DeviceDlg(); break; case MAINDLG_SOUND: Dialog_SoundDlg(); break; case MAINDLG_LOADCFG: psNewCfg = SDLGui_FileSelect(sConfigFileName, NULL, false); if (psNewCfg) { strcpy(sConfigFileName, psNewCfg); Configuration_Load(NULL); free(psNewCfg); } break; case MAINDLG_SAVECFG: psNewCfg = SDLGui_FileSelect(sConfigFileName, NULL, true); if (psNewCfg) { strcpy(sConfigFileName, psNewCfg); Configuration_Save(); free(psNewCfg); } break; case MAINDLG_QUIT: bQuitProgram = true; break; } gui_poll_events(); } while (retbut != MAINDLG_OK && retbut != MAINDLG_CANCEL && retbut != SDLGUI_QUIT && retbut != SDLGUI_ERROR && !bQuitProgram); if (maindlg[MAINDLG_RESET].state & SG_SELECTED) *bReset = true; SDL_ShowCursor(bOldMouseVisibility); Main_WarpMouse(nOldMouseX, nOldMouseY); return (retbut == MAINDLG_OK); }
void HostScreen_setWindowSize(int width, int height, int bpp) { int screenwidth, screenheight, maxw, maxh; int scalex, scaley, sbarheight; if (bpp == 24) bpp = 32; /* constrain size request to user's desktop size */ Resolution_GetDesktopSize(&maxw, &maxh); scalex = scaley = 1; while (width > maxw*scalex) { scalex *= 2; } while (height > maxh*scalex) { scalex *= 2; } if (scalex * scaley > 1) { fprintf(stderr, "WARNING: too large screen size %dx%d -> divided by %dx%d!\n", width, height, scalex, scaley); width /= scalex; height /= scaley; } Resolution_GetLimits(&maxw, &maxh, &bpp); nScreenZoomX = nScreenZoomY = 1; if (ConfigureParams.Screen.bAspectCorrect) { /* Falcon (and TT) pixel scaling factors seem to 2^x * (quarter/half pixel, interlace/double line), so * do aspect correction as 2's exponent. */ while (nScreenZoomX*width < height && 2*nScreenZoomX*width < maxw) { nScreenZoomX *= 2; } while (2*nScreenZoomY*height < width && 2*nScreenZoomY*height < maxh) { nScreenZoomY *= 2; } if (nScreenZoomX*nScreenZoomY > 2) { fprintf(stderr, "WARNING: strange screen size %dx%d -> aspect corrected by %dx%d!\n", width, height, nScreenZoomX, nScreenZoomY); } } /* then select scale as close to target size as possible * without having larger size than it */ scalex = maxw/(nScreenZoomX*width); scaley = maxh/(nScreenZoomY*height); if (scalex > 1 && scaley > 1) { /* keep aspect ratio */ if (scalex < scaley) { nScreenZoomX *= scalex; nScreenZoomY *= scalex; } else { nScreenZoomX *= scaley; nScreenZoomY *= scaley; } } hs_width_req = width; hs_height_req = height; width *= nScreenZoomX; height *= nScreenZoomY; /* get statusbar size for this screen size */ sbarheight = Statusbar_GetHeightForSize(width, height); screenheight = height + sbarheight; screenwidth = width; /* get resolution corresponding to these */ Resolution_Search(&screenwidth, &screenheight, &bpp); /* re-calculate statusbar height for this resolution */ sbarheight = Statusbar_SetHeight(screenwidth, screenheight-sbarheight); hs_bpp = bpp; /* videl.c might scale things differently in fullscreen than * in windowed mode because this uses screensize instead of using * the aspect scaled sizes directly, but it works better this way. */ hs_width = screenwidth; hs_height = screenheight - sbarheight; if (sdlscrn && (!bpp || sdlscrn->format->BitsPerPixel == bpp) && sdlscrn->w == (signed)screenwidth && sdlscrn->h == (signed)screenheight && (sdlscrn->flags&SDL_FULLSCREEN) == (sdl_videoparams&SDL_FULLSCREEN)) { /* same host screen size despite Atari resolution change, * -> no time consuming host video mode change needed */ if (screenwidth > width || screenheight > height+sbarheight) { /* Atari screen smaller than host -> clear screen */ SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = sdlscrn->w; rect.h = sdlscrn->h - sbarheight; SDL_FillRect(sdlscrn, &rect, SDL_MapRGB(sdlscrn->format, 0, 0, 0)); /* re-calculate variables in case height + statusbar height * don't anymore match SDL surface size (there's an assert * for that) */ Statusbar_Init(sdlscrn); } // check in case switched from VDI to Hostscreen doUpdate = ( sdlscrn->flags & SDL_HWSURFACE ) == 0; return; } if (bInFullScreen) { /* un-embed the Hatari WM window for fullscreen */ Control_ReparentWindow(screenwidth, screenheight, bInFullScreen); sdl_videoparams = SDL_SWSURFACE|SDL_HWPALETTE|SDL_FULLSCREEN; } else { sdl_videoparams = SDL_SWSURFACE|SDL_HWPALETTE; } #ifdef _MUDFLAP if (sdlscrn) { __mf_unregister(sdlscrn->pixels, sdlscrn->pitch*sdlscrn->h, __MF_TYPE_GUESS); } #endif sdlscrn = SDL_SetVideoMode(screenwidth, screenheight, bpp, sdl_videoparams); #ifdef _MUDFLAP __mf_register(sdlscrn->pixels, sdlscrn->pitch*sdlscrn->h, __MF_TYPE_GUESS, "SDL pixels"); #endif if (!bInFullScreen) { /* re-embed the new Hatari SDL window */ Control_ReparentWindow(screenwidth, screenheight, bInFullScreen); } // In case surface format changed, update SDL palette & remap the native palette HostScreen_updatePalette(256); HostScreen_remapPalette(); // redraw statusbar Statusbar_Init(sdlscrn); Dprintf(("Surface Pitch = %d, width = %d, height = %d\n", sdlscrn->pitch, sdlscrn->w, sdlscrn->h)); Dprintf(("Must Lock? %s\n", SDL_MUSTLOCK(sdlscrn) ? "YES" : "NO")); // is the SDL_update needed? doUpdate = ( sdlscrn->flags & SDL_HWSURFACE ) == 0; Dprintf(("Pixel format:bitspp=%d, tmasks r=%04x g=%04x b=%04x" ", tshifts r=%d g=%d b=%d" ", tlosses r=%d g=%d b=%d\n", sdlscrn->format->BitsPerPixel, sdlscrn->format->Rmask, sdlscrn->format->Gmask, sdlscrn->format->Bmask, sdlscrn->format->Rshift, sdlscrn->format->Gshift, sdlscrn->format->Bshift, sdlscrn->format->Rloss, sdlscrn->format->Gloss, sdlscrn->format->Bloss)); Main_WarpMouse(sdlscrn->w/2,sdlscrn->h/2); }
/** * Cold reset ST (reset memory, all registers and reboot) */ const char* Reset_Cold(void) { Main_WarpMouse(sdlscrn->w/2, sdlscrn->h/2); /* Set mouse pointer to the middle of the screen */ return Reset_ST(true); }