[hatari-devel] New recording dialog

[ Thread Index | Date Index | More lists.tuxfamily.org/hatari-devel Archives ]


Hi,

As discussed before release, I've worked on splitting video and audio recording to their own "Recording" options dialog. See attached patches and screenshots. It seems to work fine, and fixes couple of minor bugs
I noticed while testing it.

If there are no comments before next week, I'll push these.

Note: Suggestions for dialog layout changes are best done as ASCII version of the whole suggested layout.


	- Eero
From 67c14ad96f884902e9d2d0c0d9eac3b16418edec Mon Sep 17 00:00:00 2001
From: Eero Tamminen <oak@xxxxxxxxxxxxxx>
Date: Fri, 5 Sep 2025 00:17:14 +0300
Subject: [PATCH 2/2] Fix GUI text when recording fails to start

Ancient GUI bugs of not checking for startup errors.

Fixes: 26c09cbf2
Fixes: 836d7dee2
---
 src/gui-sdl/dlgRecord.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/gui-sdl/dlgRecord.c b/src/gui-sdl/dlgRecord.c
index db312e34..91072c24 100644
--- a/src/gui-sdl/dlgRecord.c
+++ b/src/gui-sdl/dlgRecord.c
@@ -205,7 +205,8 @@ void Dialog_RecordingDlg(void)
 				if (!File_QueryOverwrite(selname))
 					break;
 				Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile));
-				Avi_StartRecording_WithConfig ();
+				if (!Avi_StartRecording_WithConfig ())
+					break;
 				recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP;
 			}
 			break;
@@ -228,8 +229,10 @@ void Dialog_RecordingDlg(void)
 				{
 					strcpy(ConfigureParams.Sound.szYMCaptureFileName, DEFAULT_AUDIO_FILE);
 				}
-				recorddlg[DLGRECORD_RECAUDIO].txt =  AUDIO_STOP;
-				Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName);
+				if (Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName))
+				{
+					recorddlg[DLGRECORD_RECAUDIO].txt =  AUDIO_STOP;
+				}
 			}
 			break;
 		}
-- 
2.39.5

From 8d5c95fd8f6b9bab391cfea043a7580bbbac0dad Mon Sep 17 00:00:00 2001
From: Eero Tamminen <oak@xxxxxxxxxxxxxx>
Date: Thu, 4 Sep 2025 02:14:20 +0300
Subject: [PATCH 1/2] Move video+audio recording options to their own dialog

Grouping them together seems more logical, and leaves more space to
arrange Hatari window and audio dialog layouts better.
---
 src/gui-sdl/CMakeLists.txt |   4 +-
 src/gui-sdl/dlgMain.c      |  39 +++---
 src/gui-sdl/dlgRecord.c    | 244 +++++++++++++++++++++++++++++++++++++
 src/gui-sdl/dlgScreen.c    | 181 +++------------------------
 src/gui-sdl/dlgSound.c     |  57 +--------
 src/includes/dialog.h      |   1 +
 6 files changed, 289 insertions(+), 237 deletions(-)
 create mode 100644 src/gui-sdl/dlgRecord.c

diff --git a/src/gui-sdl/CMakeLists.txt b/src/gui-sdl/CMakeLists.txt
index 4f822ba0..db217ab6 100644
--- a/src/gui-sdl/CMakeLists.txt
+++ b/src/gui-sdl/CMakeLists.txt
@@ -8,8 +8,8 @@ endif()
 add_library(GuiSdl
 	dlgAbout.c dlgAlert.c dlgCpu.c dlgDevice.c dlgFileSelect.c dlgFloppy.c
 	dlgHalt.c dlgHardDisk.c dlgJoystick.c dlgKeyboard.c dlgMain.c
-	dlgMemory.c dlgNewDisk.c dlgRom.c dlgScreen.c dlgSound.c dlgSystem.c
-	sdlgui.c
+	dlgMemory.c dlgNewDisk.c dlgRecord.c dlgRom.c dlgScreen.c
+	dlgSound.c dlgSystem.c sdlgui.c
 	)
 
 target_link_libraries(GuiSdl PRIVATE ${SDL2_LIBRARIES})
diff --git a/src/gui-sdl/dlgMain.c b/src/gui-sdl/dlgMain.c
index f45e4508..df2bce8e 100644
--- a/src/gui-sdl/dlgMain.c
+++ b/src/gui-sdl/dlgMain.c
@@ -27,20 +27,21 @@ const char DlgMain_fileid[] = "Hatari dlgMain.c";
 #define MAINDLG_KEYBD    11
 #define MAINDLG_DEVICES  12
 #define MAINDLG_SOUND    13
-#define MAINDLG_ABOUT    14
-#define MAINDLG_LOADCFG  15
-#define MAINDLG_SAVECFG  16
-#define MAINDLG_NORESET  17
-#define MAINDLG_RESET    18
-#define MAINDLG_OK       19
-#define MAINDLG_QUIT     20
-#define MAINDLG_CANCEL   21
+#define MAINDLG_RECORD   14
+#define MAINDLG_ABOUT    15
+#define MAINDLG_LOADCFG  16
+#define MAINDLG_SAVECFG  17
+#define MAINDLG_NORESET  18
+#define MAINDLG_RESET    19
+#define MAINDLG_OK       20
+#define MAINDLG_QUIT     21
+#define MAINDLG_CANCEL   22
 
 
 /* The main dialog: */
 static SGOBJ maindlg[] =
 {
-	{ SGBOX, 0, 0, 0,0, 50,19, NULL },
+	{ SGBOX, 0, 0, 0,0, 50,21, NULL },
 	{ SGTEXT, 0, 0, 17,1, 16,1, "Hatari main menu" },
 	{ SGBUTTON, 0, 0,  2, 4, 13,1, "S_ystem" },
 	{ SGBUTTON, 0, 0,  2, 6, 13,1, "CP_U" },
@@ -54,14 +55,15 @@ static SGOBJ maindlg[] =
 	{ SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" },
 	{ SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" },
 	{ SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" },
-	{ SGBUTTON, 0, 0,  2,13, 13,1, "A_bout" },
-	{ SGBUTTON, 0, 0, 17,13, 16,1, "_Load config" },
-	{ SGBUTTON, 0, 0, 35,13, 13,1, "_Save config" },
-	{ SGRADIOBUT, 0, 0, 3,15, 10,1, "_No Reset" },
-	{ SGRADIOBUT, 0, 0, 3,17, 15,1, "Reset ma_chine" },
-	{ SGBUTTON, SG_DEFAULT, 0, 21,15, 8,3, "OK" },
-	{ SGBUTTON, 0, 0, 36,15, 10,1, "_Quit" },
-	{ SGBUTTON, SG_CANCEL, 0, 36,17, 10,1, "Cancel" },
+	{ SGBUTTON, 0, 0, 35,12, 13,1, "Recordin_g" },
+	{ SGBUTTON, 0, 0,  2,15, 13,1, "A_bout" },
+	{ SGBUTTON, 0, 0, 17,15, 16,1, "_Load config" },
+	{ SGBUTTON, 0, 0, 35,15, 13,1, "_Save config" },
+	{ SGRADIOBUT, 0, 0, 3,17, 10,1, "_No Reset" },
+	{ SGRADIOBUT, 0, 0, 3,19, 15,1, "Reset ma_chine" },
+	{ SGBUTTON, SG_DEFAULT, 0, 21,17, 8,3, "OK" },
+	{ SGBUTTON, 0, 0, 36,17, 10,1, "_Quit" },
+	{ SGBUTTON, SG_CANCEL, 0, 36,19, 10,1, "Cancel" },
 	{ SGSTOP, 0, 0, 0,0, 0,0, NULL }
 };
 
@@ -141,6 +143,9 @@ int Dialog_MainDlg(bool *bReset, bool *bLoadedSnapshot)
 		 case MAINDLG_SOUND:
 			Dialog_SoundDlg();
 			break;
+		 case MAINDLG_RECORD:
+			Dialog_RecordingDlg();
+			break;
 		 case MAINDLG_LOADCFG:
 			psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false);
 			if (psNewCfg)
diff --git a/src/gui-sdl/dlgRecord.c b/src/gui-sdl/dlgRecord.c
new file mode 100644
index 00000000..db312e34
--- /dev/null
+++ b/src/gui-sdl/dlgRecord.c
@@ -0,0 +1,244 @@
+/*
+  Hatari - dlgRecord.c
+
+  This file is distributed under the GNU General Public License, version 2
+  or at your option any later version. Read the file gpl.txt for details.
+
+ Hatari screenshot, video and audio recording dialog.
+*/
+const char DlgRecord_fileid[] = "Hatari dlgRecord.c";
+
+#include <assert.h>
+#include "main.h"
+#include "configuration.h"
+#include "dialog.h"
+#include "sdlgui.h"
+#include "screen.h"
+#include "statusbar.h"
+#include "screenSnapShot.h"
+#include "avi_record.h"
+#include "sound.h"
+#include "str.h"
+#include "file.h"
+
+/* video object indexes */
+#define DLGRECORD_CAPTURE     3
+#define DLGRECORD_FORMAT_PNG  4
+#define DLGRECORD_FORMAT_BMP  5
+#define DLGRECORD_FORMAT_NEO  6
+#define DLGRECORD_FORMAT_XIMG 7
+#define DLGRECORD_CAPTURE_DIR 8
+#define DLGRECORD_RECVIDEO    10
+#define DLGRECORD_CROP        11
+/* audio object indexes */
+#define DLGRECORD_RECBROWSE   13
+#define DLGRECORD_AUDIONAME   14
+#define DLGRECORD_RECAUDIO    15
+/* exit */
+#define DLGRECORD_EXIT_RECORD 16
+
+/* path names shown in the dialog */
+#define MAX_PATH_LEN 28
+static char dlgShotDir[MAX_PATH_LEN+1];
+static char dlgAudioName[MAX_PATH_LEN+1];
+
+/* Recording dialog: */
+static SGOBJ recorddlg[] =
+{
+	{ SGBOX, 0, 0, 0,0, 52,19, NULL },
+	{ SGTEXT,     0, 0,  6,1, 18,1, "Recording options" },
+	{ SGBOX,      0, 0,  1,3, 50,7, NULL },
+	{ SGBUTTON,   0, 0,  4,4, 14,1, "_Screenshot" },
+	{ SGRADIOBUT, 0, 0, 21,4,  5,1, "_PNG" },
+	{ SGRADIOBUT, 0, 0, 27,4,  5,1, "_BMP" },
+	{ SGRADIOBUT, 0, 0, 33,4,  5,1, "_NEO" },
+	{ SGRADIOBUT, 0, 0, 39,4,  5,1, "_XIMG" },
+	{ SGBUTTON,   0, 0,  4,6, 14,1, "Directory:" },
+	{ SGTEXT,     0, 0, 21,6, MAX_PATH_LEN,1, dlgShotDir },
+	{ SGBUTTON,   0, 0,  4,8, 14,1, NULL }, /* text set later, see below */
+	{ SGCHECKBOX, 0, 0, 21,8, 16,1, "_Crop statusbar" },
+
+	{ SGBOX,      0,0,  1,11, 50,5, NULL },
+	{ SGBUTTON,   0,0,  4,12, 14,1, "_File name:" },
+	{ SGTEXT,     0,0, 21,12, MAX_PATH_LEN,1, dlgAudioName },
+	{ SGBUTTON,   0,0, 17,14, 20,1, NULL }, /* text set later, see below */
+
+	{ SGBUTTON, SG_DEFAULT, 0, 17,17, 20,1, "Back to main menu" },
+	{ SGSTOP, 0, 0, 0,0, 0,0, NULL }
+};
+
+/* for record buttons */
+#define VIDEO_START "Recor_d AVI"
+#define VIDEO_STOP  "Stop recor_d"
+#define AUDIO_START "Rec_ord YM/WAV"
+#define AUDIO_STOP  "Stop rec_ording"
+
+#define DEFAULT_AUDIO_FILE "./hatari.wav"
+
+
+/**
+ * Set ScreenShotFormat depending on which button is selected
+ */
+static void DlgRecord_SetScreenShotFormat(void)
+{
+	if ( recorddlg[DLGRECORD_FORMAT_NEO].state & SG_SELECTED )
+		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_NEO;
+	else if ( recorddlg[DLGRECORD_FORMAT_XIMG].state & SG_SELECTED )
+		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_XIMG;
+#if HAVE_LIBPNG
+	else if ( recorddlg[DLGRECORD_FORMAT_PNG].state & SG_SELECTED )
+		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_PNG;
+#endif
+	else
+		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_BMP;
+}
+
+/*-----------------------------------------------------------------------*/
+/**
+ * If screenshot dir path given, set it to screenshot dir config string,
+ * and update dialog screenshot dir field accordingly.
+ */
+static void DlgRecord_UpdateScreenShotDir(void)
+{
+	if (ConfigureParams.Screen.szScreenShotDir[0])
+	{
+		File_MakeValidPathName(ConfigureParams.Screen.szScreenShotDir);
+		File_CleanFileName(ConfigureParams.Screen.szScreenShotDir);
+		File_ShrinkName(dlgShotDir, ConfigureParams.Screen.szScreenShotDir, sizeof(dlgShotDir)-1);
+	}
+	else
+	{
+		static const char base[] = "(default) ";
+		const int len = sizeof(base) - 1;
+		assert(len < sizeof(dlgShotDir));
+		Str_Copy(dlgShotDir, base, sizeof(dlgShotDir));
+		File_ShrinkName(dlgShotDir + len, Configuration_GetScreenShotDir(), sizeof(dlgShotDir)-len-1);
+	}
+}
+
+/**
+ * Show and process the recording dialog.
+ */
+void Dialog_RecordingDlg(void)
+{
+	char *selname;
+	int but;
+
+	SDLGui_CenterDlg(recorddlg);
+
+	/* Initialize window capture options: */
+	DlgRecord_UpdateScreenShotDir();
+
+	recorddlg[DLGRECORD_FORMAT_PNG].state &= ~SG_SELECTED;
+	recorddlg[DLGRECORD_FORMAT_BMP].state &= ~SG_SELECTED;
+	recorddlg[DLGRECORD_FORMAT_NEO].state &= ~SG_SELECTED;
+	recorddlg[DLGRECORD_FORMAT_XIMG].state &= ~SG_SELECTED;
+	if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_NEO )
+		recorddlg[DLGRECORD_FORMAT_NEO].state |= SG_SELECTED;
+	else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_XIMG )
+		recorddlg[DLGRECORD_FORMAT_XIMG].state |= SG_SELECTED;
+#if HAVE_LIBPNG
+	else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_PNG)
+		recorddlg[DLGRECORD_FORMAT_PNG].state |= SG_SELECTED;
+#endif
+	else
+		recorddlg[DLGRECORD_FORMAT_BMP].state |= SG_SELECTED;
+
+	if (ConfigureParams.Screen.bCrop)
+		recorddlg[DLGRECORD_CROP].state |= SG_SELECTED;
+	else
+		recorddlg[DLGRECORD_CROP].state &= ~SG_SELECTED;
+
+	if (Avi_AreWeRecording())
+		recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP;
+	else
+		recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_START;
+
+	/* Initialize audio capture options: */
+	File_ShrinkName(dlgAudioName, ConfigureParams.Sound.szYMCaptureFileName, recorddlg[DLGRECORD_AUDIONAME].w);
+
+	if (Sound_AreWeRecording())
+		recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_STOP;
+	else
+		recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_START;
+
+	/* Recording dialog main loop */
+	do
+	{
+		but = SDLGui_DoDialog(recorddlg);
+		switch (but)
+		{
+		 case DLGRECORD_CAPTURE_DIR:
+			selname = SDLGui_FileSelect("Screenshot Directory", Configuration_GetScreenShotDir(), NULL, false);
+			if (selname)
+			{
+				Str_Copy(ConfigureParams.Screen.szScreenShotDir, selname, sizeof(ConfigureParams.Screen.szScreenShotDir));
+				free(selname);
+			}
+			DlgRecord_UpdateScreenShotDir();
+			break;
+
+		 case DLGRECORD_CAPTURE:
+			DlgRecord_SetScreenShotFormat();	/* Take latest choice into account */
+			Screen_UpdateRect(sdlscrn, 0,0,0,0);
+			ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED);
+			ScreenSnapShot_SaveScreen();
+			break;
+
+		 case DLGRECORD_RECVIDEO:
+			if (Avi_AreWeRecording())
+			{
+				/* AVI indexing can take a while for larger files */
+				Statusbar_AddMessage("Finishing AVI file...", 100);
+				Statusbar_Update(sdlscrn, true);
+				Avi_StopRecording();
+				recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_START;
+				Statusbar_AddMessage("Emulation paused", 100);
+				Statusbar_Update(sdlscrn, true);
+			}
+			else
+			{
+				ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED);
+				selname = SDLGui_FileSelect("Record to AVI file...", ConfigureParams.Video.AviRecordFile, NULL, true);
+				if (!selname || File_DoesFileNameEndWithSlash(selname))
+					break;
+				if (!File_QueryOverwrite(selname))
+					break;
+				Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile));
+				Avi_StartRecording_WithConfig ();
+				recorddlg[DLGRECORD_RECVIDEO].txt = VIDEO_STOP;
+			}
+			break;
+		 case DLGRECORD_RECBROWSE:                    /* Choose a new record file */
+			SDLGui_FileConfSelect("Capture file:", dlgAudioName,
+			                      ConfigureParams.Sound.szYMCaptureFileName,
+			                      sizeof(dlgAudioName)-1,
+			                      true);
+			break;
+		 case  DLGRECORD_RECAUDIO:
+			if (Sound_AreWeRecording())
+			{
+				recorddlg[DLGRECORD_RECAUDIO].txt = AUDIO_START;
+				Sound_EndRecording();
+			}
+			else
+			{
+				/* make sure that we have a valid file name... */
+				if (strlen(ConfigureParams.Sound.szYMCaptureFileName) < 4)
+				{
+					strcpy(ConfigureParams.Sound.szYMCaptureFileName, DEFAULT_AUDIO_FILE);
+				}
+				recorddlg[DLGRECORD_RECAUDIO].txt =  AUDIO_STOP;
+				Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName);
+			}
+			break;
+		}
+	}
+	while (but != DLGRECORD_EXIT_RECORD && but != SDLGUI_QUIT
+	        && but != SDLGUI_ERROR && !bQuitProgram);
+
+	/* Read new values from dialog: */
+	DlgRecord_SetScreenShotFormat();
+
+	ConfigureParams.Screen.bCrop = (recorddlg[DLGRECORD_CROP].state & SG_SELECTED);
+}
diff --git a/src/gui-sdl/dlgScreen.c b/src/gui-sdl/dlgScreen.c
index f3aaf540..0aa28379 100644
--- a/src/gui-sdl/dlgScreen.c
+++ b/src/gui-sdl/dlgScreen.c
@@ -15,22 +15,17 @@ const char DlgScreen_fileid[] = "Hatari dlgScreen.c";
 #include "sdlgui.h"
 #include "options.h"
 #include "screen.h"
-#include "screenSnapShot.h"
 #include "resolution.h"
 #include "vdi.h"
 #include "video.h"
-#include "avi_record.h"
-#include "statusbar.h"
-#include "clocks_timings.h"
-#include "file.h"
-#include "str.h"
 
 /* how many pixels to increment VDI mode
  * width/height on each click
  */
 #define VDI_SIZE_INC	     16
 
-/* The Monitor dialog: */
+/* ------------ The Monitor dialog: -------------- */
+
 #define DLGSCRN_MONO         3
 #define DLGSCRN_RGB          4
 #define DLGSCRN_VGA          5
@@ -85,8 +80,8 @@ static SGOBJ monitordlg[] =
 	{ SGSTOP, 0, 0, 0,0, 0,0, NULL }
 };
 
+/* ---------------- The window dialog: -------------- */
 
-/* The window dialog: */
 #define DLGSCRN_FULLSCRN    3
 #define DLGSCRN_STATUSBAR   5
 #define DLGSCRN_DRIVELED    6
@@ -104,18 +99,10 @@ static SGOBJ monitordlg[] =
 #define DLGSCRN_MAX_HLESS   23
 #define DLGSCRN_MAX_HTEXT   24
 #define DLGSCRN_MAX_HMORE   25
-#define DLGSCRN_CAPTURE     27
-#define DLGSCRN_FORMAT_PNG  28
-#define DLGSCRN_FORMAT_BMP  29
-#define DLGSCRN_FORMAT_NEO  30
-#define DLGSCRN_FORMAT_XIMG 31
-#define DLGSCRN_CAPTURE_DIR 32
-#define DLGSCRN_RECANIM     34
-#define DLGSCRN_CROP        35
-#define DLGSCRN_GPUSCALE    37
-#define DLGSCRN_RESIZABLE   38
-#define DLGSCRN_VSYNC       39
-#define DLGSCRN_EXIT_WINDOW 40
+#define DLGSCRN_GPUSCALE    28
+#define DLGSCRN_RESIZABLE   29
+#define DLGSCRN_VSYNC       30
+#define DLGSCRN_EXIT_WINDOW 31
 
 /* needs to match Frame skip values in windowdlg[]! */
 static const int skip_frames[] = { 0, 1, 2, 4, AUTO_FRAMESKIP_LIMIT };
@@ -123,15 +110,13 @@ static const int skip_frames[] = { 0, 1, 2, 4, AUTO_FRAMESKIP_LIMIT };
 /* Strings for doubled resolution max width and height */
 static char sMaxWidth[5];
 static char sMaxHeight[5];
-/* Screenshot path name shown in the dialog */
-static char sScreenShotDir[29];
 
 #define MAX_SIZE_STEP 8
 
 /* The window dialog: */
 static SGOBJ windowdlg[] =
 {
-	{ SGBOX, 0, 0, 0,0, 52,24, NULL },
+	{ SGBOX, 0, 0, 0,0, 52,18, NULL },
 	{ SGBOX,      0, 0,  1,1, 50,10, NULL },
 	{ SGTEXT,     0, 0,  4,2, 20,1, "Hatari screen options" },
 	{ SGCHECKBOX, 0, 0,  4,4, 12,1, "_Fullscreen" },
@@ -158,32 +143,17 @@ static SGOBJ windowdlg[] =
 	{ SGTEXT,     0, 0, 37,9,  4,1, sMaxHeight },
 	{ SGBUTTON,   0, 0, 43,9,  1,1, "\x03", SG_SHORTCUT_DOWN },
 
-	{ SGBOX,      0, 0,  1,12, 50,7, NULL },
-	{ SGBUTTON,   0, 0,  4,13, 14,1, "_Screenshot" },
-	{ SGRADIOBUT, 0, 0, 21,13,  5,1, "PNG" },
-	{ SGRADIOBUT, 0, 0, 27,13,  5,1, "BMP" },
-	{ SGRADIOBUT, 0, 0, 33,13,  5,1, "NEO" },
-	{ SGRADIOBUT, 0, 0, 39,13,  5,1, "XIMG" },
-	{ SGBUTTON,   0, 0,  4,15, 14,1, "Directory:" },
-	{ SGTEXT,     0, 0, 21,15, sizeof(sScreenShotDir)-1,1, sScreenShotDir },
-	{ SGBUTTON,   0, 0,  4,17, 14,1, NULL },      /* Record text set later */
-	{ SGCHECKBOX, 0, 0, 21,17, 16,1, "_Crop statusbar" },
-
-	{ SGTEXT,     0, 0,  4,20, 12,1, "SDL2:" },
-	{ SGCHECKBOX, 0, 0, 12,20, 20,1, "GPU scal_ing" },
-	{ SGCHECKBOX, 0, 0, 27,20, 20,1, "Resi_zable" },
-	{ SGCHECKBOX, 0, 0, 40,20, 11,1, "_VSync" },
-
-	{ SGBUTTON, SG_DEFAULT, 0, 17,22, 20,1, "Back to main menu" },
+	{ SGBOX,      0, 0,  1,12, 50,3, NULL },
+	{ SGTEXT,     0, 0,  4,13, 12,1, "SDL2:" },
+	{ SGCHECKBOX, 0, 0, 12,13, 20,1, "GPU scal_ing" },
+	{ SGCHECKBOX, 0, 0, 27,13, 20,1, "Resi_zable" },
+	{ SGCHECKBOX, 0, 0, 40,13, 11,1, "_VSync" },
+
+	{ SGBUTTON, SG_DEFAULT, 0, 17,16, 20,1, "Back to main menu" },
 	{ SGSTOP, 0, 0, 0,0, 0,0, NULL }
 };
 
-/* for record button */
-#define RECORD_START "_Record AVI"
-#define RECORD_STOP "Stop _record"
-
-
-/* ---------------------------------------------------------------- */
+/* --------------- Monitor dialog ---------------------- */
 /**
  * To be called when changing VDI mode bit-depth.
  * Sets width & height stepping for VDI resolution changing,
@@ -312,50 +282,8 @@ void Dialog_MonitorDlg(void)
 	}
 }
 
+/*-------------------- Hatari window dialog ----------------------*/
 
-
-/*-----------------------------------------------------------------------*/
-/**
- * Set ScreenShotFormat depending on which button is selected
- */
-static void DlgWindow_SetScreenShotFormat(void)
-{
-	if ( windowdlg[DLGSCRN_FORMAT_NEO].state & SG_SELECTED )
-		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_NEO;
-	else if ( windowdlg[DLGSCRN_FORMAT_XIMG].state & SG_SELECTED )
-		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_XIMG;
-#if HAVE_LIBPNG
-	else if ( windowdlg[DLGSCRN_FORMAT_PNG].state & SG_SELECTED )
-		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_PNG;
-#endif
-	else
-		ConfigureParams.Screen.ScreenShotFormat = SCREEN_SNAPSHOT_BMP;
-}
-
-/*-----------------------------------------------------------------------*/
-/**
- * If screenshot dir path given, set it to screenshot dir config string,
- * and update dialog screenshot dir field accordingly.
- */
-static void DlgWindow_UpdateScreenShotDir(void)
-{
-	if (ConfigureParams.Screen.szScreenShotDir[0])
-	{
-		File_MakeValidPathName(ConfigureParams.Screen.szScreenShotDir);
-		File_CleanFileName(ConfigureParams.Screen.szScreenShotDir);
-		File_ShrinkName(sScreenShotDir, ConfigureParams.Screen.szScreenShotDir, sizeof(sScreenShotDir)-1);
-	}
-	else
-	{
-		static const char base[] = "(default) ";
-		const int len = sizeof(base) - 1;
-		assert(len < sizeof(sScreenShotDir));
-		Str_Copy(sScreenShotDir, base, sizeof(sScreenShotDir));
-		File_ShrinkName(sScreenShotDir + len, Configuration_GetScreenShotDir(), sizeof(sScreenShotDir)-len-1);
-	}
-}
-
-/*-----------------------------------------------------------------------*/
 /**
  * Show and process the window dialog.
  */
@@ -363,7 +291,6 @@ void Dialog_WindowDlg(void)
 {
 	int maxw, maxh, deskw, deskh, but, skip = 0;
 	unsigned int i;
-	char *selname;
 
 	SDLGui_CenterDlg(windowdlg);
 
@@ -403,34 +330,6 @@ void Dialog_WindowDlg(void)
 	sprintf(sMaxWidth, "%4i", maxw);
 	sprintf(sMaxHeight, "%4i", maxh);
 
-	/* Initialize window capture options: */
-	DlgWindow_UpdateScreenShotDir();
-
-	windowdlg[DLGSCRN_FORMAT_PNG].state &= ~SG_SELECTED;
-	windowdlg[DLGSCRN_FORMAT_BMP].state &= ~SG_SELECTED;
-	windowdlg[DLGSCRN_FORMAT_NEO].state &= ~SG_SELECTED;
-	windowdlg[DLGSCRN_FORMAT_XIMG].state &= ~SG_SELECTED;
-	if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_NEO )
-		windowdlg[DLGSCRN_FORMAT_NEO].state |= SG_SELECTED;
-	else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_XIMG )
-		windowdlg[DLGSCRN_FORMAT_XIMG].state |= SG_SELECTED;
-#if HAVE_LIBPNG
-	else if (ConfigureParams.Screen.ScreenShotFormat == SCREEN_SNAPSHOT_PNG)
-		windowdlg[DLGSCRN_FORMAT_PNG].state |= SG_SELECTED;
-#endif
-	else
-		windowdlg[DLGSCRN_FORMAT_BMP].state |= SG_SELECTED;
-
-	if (ConfigureParams.Screen.bCrop)
-		windowdlg[DLGSCRN_CROP].state |= SG_SELECTED;
-	else
-		windowdlg[DLGSCRN_CROP].state &= ~SG_SELECTED;
-
-	if (Avi_AreWeRecording())
-		windowdlg[DLGSCRN_RECANIM].txt = RECORD_STOP;
-	else
-		windowdlg[DLGSCRN_RECANIM].txt = RECORD_START;
-
 	/* SDL2 options */
 	if (ConfigureParams.Screen.bResizable)
 		windowdlg[DLGSCRN_RESIZABLE].state |= SG_SELECTED;
@@ -469,48 +368,6 @@ void Dialog_WindowDlg(void)
 			maxh = Opt_ValueAlignMinMax(maxh + MAX_SIZE_STEP, MAX_SIZE_STEP, MIN_VDI_HEIGHT, deskh);
 			sprintf(sMaxHeight, "%4i", maxh);
 			break;
-
-		 case DLGSCRN_CAPTURE_DIR:
-			selname = SDLGui_FileSelect("Screenshot Directory", Configuration_GetScreenShotDir(), NULL, false);
-			if (selname)
-			{
-				Str_Copy(ConfigureParams.Screen.szScreenShotDir, selname, sizeof(ConfigureParams.Screen.szScreenShotDir));
-				free(selname);
-			}
-			DlgWindow_UpdateScreenShotDir();
-			break;
-
-		 case DLGSCRN_CAPTURE:
-			DlgWindow_SetScreenShotFormat();	/* Take latest choice into account */
-			Screen_UpdateRect(sdlscrn, 0,0,0,0);
-			ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED);
-			ScreenSnapShot_SaveScreen();
-			break;
-
-		 case DLGSCRN_RECANIM:
-			if (Avi_AreWeRecording())
-			{
-				/* AVI indexing can take a while for larger files */
-				Statusbar_AddMessage("Finishing AVI file...", 100);
-				Statusbar_Update(sdlscrn, true);
-				Avi_StopRecording();
-				windowdlg[DLGSCRN_RECANIM].txt = RECORD_START;
-				Statusbar_AddMessage("Emulation paused", 100);
-				Statusbar_Update(sdlscrn, true);
-			}
-			else
-			{
-				ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED);
-				selname = SDLGui_FileSelect("Record to AVI file...", ConfigureParams.Video.AviRecordFile, NULL, true);
-				if (!selname || File_DoesFileNameEndWithSlash(selname))
-					break;
-				if (!File_QueryOverwrite(selname))
-					break;
-				Str_Copy(ConfigureParams.Video.AviRecordFile, selname, sizeof(ConfigureParams.Video.AviRecordFile));
-				Avi_StartRecording_WithConfig ();
-				windowdlg[DLGSCRN_RECANIM].txt = RECORD_STOP;
-			}
-			break;
 		}
 	}
 	while (but != DLGSCRN_EXIT_WINDOW && but != SDLGUI_QUIT
@@ -540,10 +397,6 @@ void Dialog_WindowDlg(void)
 		}
 	}
 
-	DlgWindow_SetScreenShotFormat();
-
-	ConfigureParams.Screen.bCrop = (windowdlg[DLGSCRN_CROP].state & SG_SELECTED);
-
 	ConfigureParams.Screen.bResizable = (windowdlg[DLGSCRN_RESIZABLE].state & SG_SELECTED);
 	ConfigureParams.Screen.bUseSdlRenderer = (windowdlg[DLGSCRN_GPUSCALE].state & SG_SELECTED);
 	ConfigureParams.Screen.bUseVsync = (windowdlg[DLGSCRN_VSYNC].state & SG_SELECTED);
diff --git a/src/gui-sdl/dlgSound.c b/src/gui-sdl/dlgSound.c
index cf844565..08a64c55 100644
--- a/src/gui-sdl/dlgSound.c
+++ b/src/gui-sdl/dlgSound.c
@@ -13,7 +13,6 @@ const char DlgSound_fileid[] = "Hatari dlgSound.c";
 #include "file.h"
 #include "sound.h"
 
-
 #define DLGSOUND_ENABLE     3
 #define DLGSOUND_SYNC       4
 #define DLGSOUND_11KHZ      6
@@ -28,19 +27,12 @@ const char DlgSound_fileid[] = "Hatari dlgSound.c";
 #define DLGSOUND_MODEL      16
 #define DLGSOUND_TABLE      17
 #define DLGSOUND_LINEAR     18
-#define DLGSOUND_RECNAME    22
-#define DLGSOUND_RECBROWSE  23
-#define DLGSOUND_RECORD     24
-#define DLGSOUND_EXIT       25
-
-
-static char dlgRecordName[35];
-
+#define DLGSOUND_EXIT       19
 
 /* The sound dialog: */
 static SGOBJ sounddlg[] =
 {
-	{ SGBOX,      0,0,  0, 0, 40,25, NULL },
+	{ SGBOX,      0,0,  0, 0, 40,17, NULL },
 	{ SGBOX,      0,0,  1, 1, 38,13, NULL },
 	{ SGTEXT,     0,0,  4, 2,  5,1, "SOUND" },
 	{ SGCHECKBOX, 0,0, 13, 2,  9,1, "_Enabled" },
@@ -62,20 +54,10 @@ static SGOBJ sounddlg[] =
 	{ SGRADIOBUT, 0,0, 15,12, 10,1, "_ST table" },
 	{ SGRADIOBUT, 0,0, 28,12,  8,1, "_Linear" },
 
-	{ SGBOX,      0,0,  1,15, 38,7, NULL },
-	{ SGTEXT,     0,0, 13,16, 14,1, "Capture YM/WAV" },
-	{ SGTEXT,     0,0,  2,17, 26,1, "File name (*.wav / *.ym):" },
-	{ SGTEXT,     0,0,  2,18, 34,1, dlgRecordName },
-	{ SGBUTTON,   0,0, 28,17,  8,1, " _Browse " },
-	{ SGBUTTON,   0,0, 12,20, 16,1, NULL }, /* text set later, see below */
-
-	{ SGBUTTON, SG_DEFAULT, 0, 10,23, 20,1, "Back to main menu" },
+	{ SGBUTTON, SG_DEFAULT, 0, 10,15, 20,1, "Back to main menu" },
 	{ SGSTOP, 0, 0, 0,0, 0,0, NULL }
 };
 
-#define RECORD_START "_Record sound"
-#define RECORD_STOP  "Stop _recording"
-
 static const int nSoundFreqs[] =
 {
 	11025,
@@ -136,43 +118,10 @@ void Dialog_SoundDlg(void)
 	else
 		sounddlg[DLGSOUND_LINEAR].state |= SG_SELECTED;
 
-	File_ShrinkName(dlgRecordName, ConfigureParams.Sound.szYMCaptureFileName, sounddlg[DLGSOUND_RECNAME].w);
-
-	if ( Sound_AreWeRecording() )
-		sounddlg[DLGSOUND_RECORD].txt = RECORD_STOP;
-	else
-		sounddlg[DLGSOUND_RECORD].txt = RECORD_START;
-
 	/* The sound dialog main loop */
 	do
 	{
 		but = SDLGui_DoDialog(sounddlg);
-		switch (but)
-		{
-		 case DLGSOUND_RECBROWSE:                    /* Choose a new record file */
-			SDLGui_FileConfSelect("Capture file:", dlgRecordName,
-			                      ConfigureParams.Sound.szYMCaptureFileName,
-			                      sounddlg[DLGSOUND_RECNAME].w,
-			                      true);
-			break;
-		 case  DLGSOUND_RECORD:
-			if (Sound_AreWeRecording())
-			{
-				sounddlg[DLGSOUND_RECORD].txt = RECORD_START;
-				Sound_EndRecording();
-			}
-			else
-			{
-				/* make sure that we have a valid file name... */
-				if (strlen(ConfigureParams.Sound.szYMCaptureFileName) < 4)
-				{
-					strcpy(ConfigureParams.Sound.szYMCaptureFileName, "./hatari.wav");
-				}
-				sounddlg[DLGSOUND_RECORD].txt =  RECORD_STOP;
-				Sound_BeginRecording(ConfigureParams.Sound.szYMCaptureFileName);
-			}
-			break;
-		}
 	}
 	while (but != DLGSOUND_EXIT && but != SDLGUI_QUIT
 	        && but != SDLGUI_ERROR && !bQuitProgram );
diff --git a/src/includes/dialog.h b/src/includes/dialog.h
index 918e642b..9caa9bf8 100644
--- a/src/includes/dialog.h
+++ b/src/includes/dialog.h
@@ -26,6 +26,7 @@ extern bool Dialog_MemDlg(void);
 extern char* DlgNewDisk_Main(void);
 extern void Dialog_MonitorDlg(void);
 extern void Dialog_WindowDlg(void);
+extern void Dialog_RecordingDlg(void);
 extern void Dialog_SoundDlg(void);
 extern void DlgSystem_Main(void);
 extern void DlgRom_Main(void);
-- 
2.39.5

Attachment: main-dialog.png
Description: PNG image

Attachment: record-dialog.png
Description: PNG image



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/