|
|
1.1 ! root 1: /* ! 2: Hatari - dlgScreen.c ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. ! 6: ! 7: Atari monitor and Hatari window settings. ! 8: */ ! 9: const char DlgScreen_fileid[] = "Hatari dlgScreen.c : " __DATE__ " " __TIME__; ! 10: ! 11: #include "main.h" ! 12: #include "configuration.h" ! 13: #include "dialog.h" ! 14: #include "sdlgui.h" ! 15: #include "screen.h" ! 16: #include "screenSnapShot.h" ! 17: #include "video.h" ! 18: #include "avi_record.h" ! 19: #include "statusbar.h" ! 20: ! 21: #define ITEMS_IN_ARRAY(a) (sizeof(a)/sizeof(a[0])) ! 22: ! 23: ! 24: /* The Monitor dialog: */ ! 25: #define DLGSCRN_MONO 3 ! 26: #define DLGSCRN_RGB 4 ! 27: #define DLGSCRN_VGA 5 ! 28: #define DLGSCRN_TV 6 ! 29: #define DLGSCRN_OVERSCAN 7 ! 30: #define DLGSCRN_USEVDIRES 9 ! 31: #define DLGSCRN_VDI_WLESS 11 ! 32: #define DLGSCRN_VDI_WTEXT 12 ! 33: #define DLGSCRN_VDI_WMORE 13 ! 34: #define DLGSCRN_VDI_HLESS 15 ! 35: #define DLGSCRN_VDI_HTEXT 16 ! 36: #define DLGSCRN_VDI_HMORE 17 ! 37: #define DLGSCRN_BPP1 18 ! 38: #define DLGSCRN_BPP2 19 ! 39: #define DLGSCRN_BPP4 20 ! 40: #define DLGSCRN_EXIT_MONITOR 21 ! 41: ! 42: /* Strings for VDI resolution width and height */ ! 43: static char sVdiWidth[5]; ! 44: static char sVdiHeight[5]; ! 45: ! 46: static SGOBJ monitordlg[] = ! 47: { ! 48: { SGBOX, 0, 0, 0,0, 34,19, NULL }, ! 49: ! 50: { SGBOX, 0, 0, 1,1, 32,6, NULL }, ! 51: { SGTEXT, 0, 0, 10,1, 14,1, "Atari monitor" }, ! 52: { SGRADIOBUT, 0, 0, 4,3, 6,1, "Mono" }, ! 53: { SGRADIOBUT, 0, 0, 12,3, 6,1, "RGB" }, ! 54: { SGRADIOBUT, 0, 0, 19,3, 6,1, "VGA" }, ! 55: { SGRADIOBUT, 0, 0, 26,3, 6,1, "TV" }, ! 56: { SGCHECKBOX, 0, 0, 6,5, 22,1, "Show ST/STE borders" }, ! 57: ! 58: { SGBOX, 0, 0, 1,8, 32,7, NULL }, ! 59: { SGCHECKBOX, 0, 0, 4,9, 33,1, "Use extended VDI screen" }, ! 60: { SGTEXT, 0, 0, 4,11, 5,1, "Size:" }, ! 61: { SGBUTTON, 0, 0, 6,12, 1,1, "\x04" }, /* Arrow left */ ! 62: { SGTEXT, 0, 0, 8,12, 4,1, sVdiWidth }, ! 63: { SGBUTTON, 0, 0, 13,12, 1,1, "\x03" }, /* Arrow right */ ! 64: { SGTEXT, 0, 0, 4,13, 1,1, "x" }, ! 65: { SGBUTTON, 0, 0, 6,13, 1,1, "\x04" }, /* Arrow left */ ! 66: { SGTEXT, 0, 0, 8,13, 4,1, sVdiHeight }, ! 67: { SGBUTTON, 0, 0, 13,13, 1,1, "\x03" }, /* Arrow right */ ! 68: ! 69: { SGRADIOBUT, SG_EXIT, 0, 18,11, 11,1, " 2 colors" }, ! 70: { SGRADIOBUT, SG_EXIT, 0, 18,12, 11,1, " 4 colors" }, ! 71: { SGRADIOBUT, SG_EXIT, 0, 18,13, 11,1, "16 colors" }, ! 72: ! 73: { SGBUTTON, SG_DEFAULT, 0, 7,17, 20,1, "Back to main menu" }, ! 74: { -1, 0, 0, 0,0, 0,0, NULL } ! 75: }; ! 76: ! 77: ! 78: /* The window dialog: */ ! 79: #define DLGSCRN_FULLSCRN 3 ! 80: #define DLGSCRN_STATUSBAR 4 ! 81: #define DLGSCRN_MAX_WLESS 6 ! 82: #define DLGSCRN_MAX_WTEXT 7 ! 83: #define DLGSCRN_MAX_WMORE 8 ! 84: #define DLGSCRN_MAX_HLESS 10 ! 85: #define DLGSCRN_MAX_HTEXT 11 ! 86: #define DLGSCRN_MAX_HMORE 12 ! 87: #define DLGSCRN_SKIP0 14 ! 88: #define DLGSCRN_SKIP1 15 ! 89: #define DLGSCRN_SKIP2 16 ! 90: #define DLGSCRN_SKIP3 17 ! 91: #define DLGSCRN_SKIP4 18 ! 92: #define DLGSCRN_ONCHANGE 21 ! 93: #define DLGSCRN_CAPTURE 22 ! 94: #define DLGSCRN_RECANIM 23 ! 95: #define DLGSCRN_EXIT_WINDOW 24 ! 96: ! 97: /* needs to match Frame skip values in windowdlg[]! */ ! 98: static const int skip_frames[] = { 0, 1, 2, 4, AUTO_FRAMESKIP_LIMIT }; ! 99: ! 100: /* Strings for doubled resolution max width and height */ ! 101: static char sMaxWidth[5]; ! 102: static char sMaxHeight[5]; ! 103: ! 104: #define MAX_SIZE_STEP 8 ! 105: ! 106: /* The window dialog: */ ! 107: static SGOBJ windowdlg[] = ! 108: { ! 109: { SGBOX, 0, 0, 0,0, 35,21, NULL }, ! 110: ! 111: { SGBOX, 0, 0, 1,1, 33,9, NULL }, ! 112: { SGTEXT, 0, 0, 7,1, 20,1, "Hatari screen options" }, ! 113: { SGCHECKBOX, 0, 0, 4,3, 12,1, "Fullscreen" }, ! 114: { SGCHECKBOX, 0, 0, 4,4, 12,1, "Statusbar" }, ! 115: { SGTEXT, 0, 0, 4,6, 12,1, "Max zoomed:" }, ! 116: { SGBUTTON, 0, 0, 6,7, 1,1, "\x04" }, /* Arrow left */ ! 117: { SGTEXT, 0, 0, 8,7, 4,1, sMaxWidth }, ! 118: { SGBUTTON, 0, 0, 13,7, 1,1, "\x03" }, /* Arrow right */ ! 119: { SGTEXT, 0, 0, 4,8, 1,1, "x" }, ! 120: { SGBUTTON, 0, 0, 6,8, 1,1, "\x04" }, /* Arrow left */ ! 121: { SGTEXT, 0, 0, 8,8, 4,1, sMaxHeight }, ! 122: { SGBUTTON, 0, 0, 13,8, 1,1, "\x03" }, /* Arrow right */ ! 123: { SGTEXT, 0, 0, 20,3, 11,1, "Frame skip:" }, ! 124: { SGRADIOBUT, 0, 0, 22,4, 6,1, "Off" }, ! 125: { SGRADIOBUT, 0, 0, 22,5, 6,1, "1" }, ! 126: { SGRADIOBUT, 0, 0, 22,6, 6,1, "2" }, ! 127: { SGRADIOBUT, 0, 0, 22,7, 6,1, "4" }, ! 128: { SGRADIOBUT, 0, 0, 22,8, 6,1, "Auto" }, ! 129: ! 130: { SGBOX, 0, 0, 1,11, 33,6, NULL }, ! 131: { SGTEXT, 0, 0, 10,11, 14,1, "Screen capture" }, ! 132: { SGCHECKBOX, 0, 0, 4,13, 39,1, "Capture only when changed" }, ! 133: { SGBUTTON, 0, 0, 4,15, 12,1, "Screenshot" }, ! 134: { SGBUTTON, 0, 0, 19,15, 12,1, "Record AVI" }, ! 135: ! 136: { SGBUTTON, SG_DEFAULT, 0, 8,19, 20,1, "Back to main menu" }, ! 137: { -1, 0, 0, 0,0, 0,0, NULL } ! 138: }; ! 139: ! 140: ! 141: /* ---------------------------------------------------------------- */ ! 142: ! 143: static int nVdiStepX, nVdiStepY; /* VDI resolution changing steps */ ! 144: ! 145: /** ! 146: * Set width and height stepping for VDI resolution changing. ! 147: * Depending on the color depth we can only change the VDI resolution ! 148: * in certain steps: ! 149: * - The screen width must be dividable by 16 bytes (i.e. 128 pixels in ! 150: * monochrome, 32 pixels in 16 color mode), or the text mode scrolling ! 151: * function of TOS will fail. ! 152: * - The screen height must be a multiple of the character cell height ! 153: * (i.e. 16 pixels in monochrome, 8 pixels in color mode). ! 154: */ ! 155: static void DlgMonitor_SetVdiStepping(void) ! 156: { ! 157: if (monitordlg[DLGSCRN_BPP1].state & SG_SELECTED) ! 158: { ! 159: nVdiStepX = 128; ! 160: nVdiStepY = 16; ! 161: } ! 162: else if (monitordlg[DLGSCRN_BPP2].state & SG_SELECTED) ! 163: { ! 164: nVdiStepX = 64; ! 165: nVdiStepY = 8; ! 166: } ! 167: else ! 168: { ! 169: nVdiStepX = 32; ! 170: nVdiStepY = 8; ! 171: } ! 172: } ! 173: ! 174: ! 175: /*-----------------------------------------------------------------------*/ ! 176: /** ! 177: * Show and process the monitor dialog. ! 178: */ ! 179: void Dialog_MonitorDlg(void) ! 180: { ! 181: int but; ! 182: unsigned int i; ! 183: MONITORTYPE mti; ! 184: ! 185: SDLGui_CenterDlg(monitordlg); ! 186: ! 187: /* Set up general monitor options in the dialog from actual values: */ ! 188: ! 189: if (ConfigureParams.Screen.bAllowOverscan) ! 190: monitordlg[DLGSCRN_OVERSCAN].state |= SG_SELECTED; ! 191: else ! 192: monitordlg[DLGSCRN_OVERSCAN].state &= ~SG_SELECTED; ! 193: ! 194: for (i = DLGSCRN_MONO; i <= DLGSCRN_TV; i++) ! 195: monitordlg[i].state &= ~SG_SELECTED; ! 196: monitordlg[DLGSCRN_MONO+ConfigureParams.Screen.nMonitorType].state |= SG_SELECTED; ! 197: ! 198: /* Initialize VDI resolution options: */ ! 199: ! 200: if (ConfigureParams.Screen.bUseExtVdiResolutions) ! 201: monitordlg[DLGSCRN_USEVDIRES].state |= SG_SELECTED; ! 202: else ! 203: monitordlg[DLGSCRN_USEVDIRES].state &= ~SG_SELECTED; ! 204: for (i=0; i<3; i++) ! 205: monitordlg[DLGSCRN_BPP1 + i].state &= ~SG_SELECTED; ! 206: monitordlg[DLGSCRN_BPP1 + ConfigureParams.Screen.nVdiColors - 16].state |= SG_SELECTED; ! 207: sprintf(sVdiWidth, "%4i", ConfigureParams.Screen.nVdiWidth); ! 208: sprintf(sVdiHeight, "%4i", ConfigureParams.Screen.nVdiHeight); ! 209: DlgMonitor_SetVdiStepping(); ! 210: ! 211: /* The monitor dialog main loop */ ! 212: do ! 213: { ! 214: but = SDLGui_DoDialog(monitordlg, NULL); ! 215: switch (but) ! 216: { ! 217: case DLGSCRN_VDI_WLESS: ! 218: // ConfigureParams.Screen.nVdiWidth = VDI_Limit(ConfigureParams.Screen.nVdiWidth - nVdiStepX, ! 219: // nVdiStepX, MIN_VDI_WIDTH, MAX_VDI_WIDTH); ! 220: sprintf(sVdiWidth, "%4i", ConfigureParams.Screen.nVdiWidth); ! 221: break; ! 222: case DLGSCRN_VDI_WMORE: ! 223: // ConfigureParams.Screen.nVdiWidth = VDI_Limit(ConfigureParams.Screen.nVdiWidth + nVdiStepX, ! 224: // nVdiStepX, MIN_VDI_WIDTH, MAX_VDI_WIDTH); ! 225: sprintf(sVdiWidth, "%4i", ConfigureParams.Screen.nVdiWidth); ! 226: break; ! 227: ! 228: case DLGSCRN_VDI_HLESS: ! 229: // ConfigureParams.Screen.nVdiHeight = VDI_Limit(ConfigureParams.Screen.nVdiHeight - nVdiStepY, ! 230: // nVdiStepY, MIN_VDI_HEIGHT, MAX_VDI_HEIGHT); ! 231: sprintf(sVdiHeight, "%4i", ConfigureParams.Screen.nVdiHeight); ! 232: break; ! 233: case DLGSCRN_VDI_HMORE: ! 234: // ConfigureParams.Screen.nVdiHeight = VDI_Limit(ConfigureParams.Screen.nVdiHeight + nVdiStepY, ! 235: // nVdiStepY, MIN_VDI_HEIGHT, MAX_VDI_HEIGHT); ! 236: sprintf(sVdiHeight, "%4i", ConfigureParams.Screen.nVdiHeight); ! 237: break; ! 238: ! 239: case DLGSCRN_BPP1: ! 240: case DLGSCRN_BPP2: ! 241: case DLGSCRN_BPP4: ! 242: DlgMonitor_SetVdiStepping(); ! 243: /* Align resolution to actual conditions: */ ! 244: // ConfigureParams.Screen.nVdiWidth = VDI_Limit(ConfigureParams.Screen.nVdiWidth, nVdiStepX, ! 245: // MIN_VDI_WIDTH, MAX_VDI_WIDTH); ! 246: // ConfigureParams.Screen.nVdiHeight = VDI_Limit(ConfigureParams.Screen.nVdiHeight, nVdiStepY, ! 247: // MIN_VDI_HEIGHT, MAX_VDI_HEIGHT); ! 248: sprintf(sVdiWidth, "%4i", ConfigureParams.Screen.nVdiWidth); ! 249: sprintf(sVdiHeight, "%4i", ConfigureParams.Screen.nVdiHeight); ! 250: break; ! 251: } ! 252: } ! 253: while (but != DLGSCRN_EXIT_MONITOR && but != SDLGUI_QUIT ! 254: && but != SDLGUI_ERROR && !bQuitProgram); ! 255: ! 256: /* Read new values from dialog: */ ! 257: ! 258: // ConfigureParams.Screen.bAllowOverscan = (monitordlg[DLGSCRN_OVERSCAN].state & SG_SELECTED); ! 259: ! 260: for (mti = MONITOR_TYPE_MONO; mti <= MONITOR_TYPE_TV; mti++) ! 261: { ! 262: if (monitordlg[mti + DLGSCRN_MONO].state & SG_SELECTED) ! 263: { ! 264: ConfigureParams.Screen.nMonitorType = mti; ! 265: break; ! 266: } ! 267: } ! 268: ! 269: ConfigureParams.Screen.bUseExtVdiResolutions = (monitordlg[DLGSCRN_USEVDIRES].state & SG_SELECTED); ! 270: for (i=0; i<3; i++) ! 271: { ! 272: // if (monitordlg[DLGSCRN_BPP1 + i].state & SG_SELECTED) ! 273: // ConfigureParams.Screen.nVdiColors = GEMCOLOR_2 + i; ! 274: } ! 275: } ! 276: ! 277: ! 278: /*-----------------------------------------------------------------------*/ ! 279: /** ! 280: * Show and process the window dialog. ! 281: */ ! 282: void Dialog_WindowDlg(void) ! 283: { ! 284: int but, skip = 0; ! 285: unsigned int i; ! 286: ! 287: SDLGui_CenterDlg(windowdlg); ! 288: ! 289: /* Set up general window options in the dialog from actual values: */ ! 290: ! 291: if (ConfigureParams.Screen.bFullScreen) ! 292: windowdlg[DLGSCRN_FULLSCRN].state |= SG_SELECTED; ! 293: else ! 294: windowdlg[DLGSCRN_FULLSCRN].state &= ~SG_SELECTED; ! 295: ! 296: if (ConfigureParams.Screen.bShowStatusbar) ! 297: windowdlg[DLGSCRN_STATUSBAR].state |= SG_SELECTED; ! 298: else ! 299: windowdlg[DLGSCRN_STATUSBAR].state &= ~SG_SELECTED; ! 300: ! 301: for (i = 0; i < ITEMS_IN_ARRAY(skip_frames); i++) ! 302: { ! 303: if (ConfigureParams.Screen.nFrameSkips >= skip_frames[i]) ! 304: skip = i; ! 305: windowdlg[i+DLGSCRN_SKIP0].state &= ~SG_SELECTED; ! 306: } ! 307: windowdlg[DLGSCRN_SKIP0+skip].state |= SG_SELECTED; ! 308: ! 309: sprintf(sMaxWidth, "%4i", ConfigureParams.Screen.nMaxWidth); ! 310: sprintf(sMaxHeight, "%4i", ConfigureParams.Screen.nMaxHeight); ! 311: ! 312: /* Initialize window capture options: */ ! 313: ! 314: if (ConfigureParams.Screen.bCaptureChange) ! 315: windowdlg[DLGSCRN_ONCHANGE].state |= SG_SELECTED; ! 316: else ! 317: windowdlg[DLGSCRN_ONCHANGE].state &= ~SG_SELECTED; ! 318: ! 319: ! 320: /* The window dialog main loop */ ! 321: do ! 322: { ! 323: but = SDLGui_DoDialog(windowdlg, NULL); ! 324: switch (but) ! 325: { ! 326: case DLGSCRN_MAX_WLESS: ! 327: // ConfigureParams.Screen.nMaxWidth = VDI_Limit(ConfigureParams.Screen.nMaxWidth - MAX_SIZE_STEP, ! 328: // MAX_SIZE_STEP, MIN_VDI_WIDTH, MAX_VDI_WIDTH); ! 329: sprintf(sMaxWidth, "%4i", ConfigureParams.Screen.nMaxWidth); ! 330: break; ! 331: case DLGSCRN_MAX_WMORE: ! 332: // ConfigureParams.Screen.nMaxWidth = VDI_Limit(ConfigureParams.Screen.nMaxWidth + MAX_SIZE_STEP, ! 333: // MAX_SIZE_STEP, MIN_VDI_WIDTH, MAX_VDI_WIDTH); ! 334: sprintf(sMaxWidth, "%4i", ConfigureParams.Screen.nMaxWidth); ! 335: break; ! 336: ! 337: case DLGSCRN_MAX_HLESS: ! 338: // ConfigureParams.Screen.nMaxHeight = VDI_Limit(ConfigureParams.Screen.nMaxHeight - MAX_SIZE_STEP, ! 339: // MAX_SIZE_STEP, MIN_VDI_HEIGHT, MAX_VDI_HEIGHT); ! 340: sprintf(sMaxHeight, "%4i", ConfigureParams.Screen.nMaxHeight); ! 341: break; ! 342: case DLGSCRN_MAX_HMORE: ! 343: // ConfigureParams.Screen.nMaxHeight = VDI_Limit(ConfigureParams.Screen.nMaxHeight + MAX_SIZE_STEP, ! 344: // MAX_SIZE_STEP, MIN_VDI_HEIGHT, MAX_VDI_HEIGHT); ! 345: sprintf(sMaxHeight, "%4i", ConfigureParams.Screen.nMaxHeight); ! 346: break; ! 347: ! 348: case DLGSCRN_CAPTURE: ! 349: SDL_UpdateRect(sdlscrn, 0,0,0,0); ! 350: ScreenSnapShot_SaveScreen(); ! 351: break; ! 352: ! 353: case DLGSCRN_RECANIM: ! 354: break; ! 355: } ! 356: } ! 357: while (but != DLGSCRN_EXIT_WINDOW && but != SDLGUI_QUIT ! 358: && but != SDLGUI_ERROR && !bQuitProgram); ! 359: ! 360: /* Read new values from dialog: */ ! 361: ! 362: ConfigureParams.Screen.bFullScreen = (windowdlg[DLGSCRN_FULLSCRN].state & SG_SELECTED); ! 363: ! 364: if (windowdlg[DLGSCRN_STATUSBAR].state & SG_SELECTED) ! 365: ConfigureParams.Screen.bShowStatusbar = true; ! 366: else ! 367: ConfigureParams.Screen.bShowStatusbar = false; ! 368: ! 369: for (i = DLGSCRN_SKIP0; i <= DLGSCRN_SKIP4; i++) ! 370: { ! 371: if (windowdlg[i].state & SG_SELECTED) ! 372: { ! 373: ConfigureParams.Screen.nFrameSkips = skip_frames[i-DLGSCRN_SKIP0]; ! 374: break; ! 375: } ! 376: } ! 377: ! 378: ConfigureParams.Screen.bCaptureChange = (windowdlg[DLGSCRN_ONCHANGE].state & SG_SELECTED); ! 379: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.