diff io.c @ 1263:5f65a16c23ff

Implement raw screenshot functionality requested in ticket:10
author Michael Pavone <pavone@retrodev.com>
date Sat, 04 Mar 2017 11:50:14 -0800
parents db28178bd2a1
children a4fa897c99ce
line wrap: on
line diff
--- a/io.c	Fri Mar 03 23:51:29 2017 -0800
+++ b/io.c	Sat Mar 04 11:50:14 2017 -0800
@@ -74,6 +74,7 @@
 	UI_TOGGLE_KEYBOARD_CAPTURE,
 	UI_TOGGLE_FULLSCREEN,
 	UI_SOFT_RESET,
+	UI_SCREENSHOT,
 	UI_EXIT
 } ui_action;
 
@@ -402,6 +403,10 @@
 	return is_keyboard(io->ports) || is_keyboard(io->ports+1) || is_keyboard(io->ports+2);
 }
 
+#ifdef _WIN32
+#define localtime_r(a,b) localtime(a)
+#endif
+
 void handle_binding_up(keybinding * binding)
 {
 	switch(binding->bind_type)
@@ -491,6 +496,24 @@
 		case UI_SOFT_RESET:
 			current_system->soft_reset(current_system);
 			break;
+		case UI_SCREENSHOT: {
+			char *screenshot_base = tern_find_path(config, "ui\0screenshot_path\0").ptrval;
+			if (!screenshot_base) {
+				screenshot_base = get_home_dir();
+			}
+			time_t now = time(NULL);
+			struct tm local_store;
+			char fname_part[256];
+			char *template = tern_find_path(config, "ui\0screenshot_template\0").ptrval;
+			if (!template) {
+				template = "blastem_%c.ppm";
+			}
+			strftime(fname_part, sizeof(fname_part), template, localtime_r(&now, &local_store));
+			char const *parts[] = {screenshot_base, PATH_SEP, fname_part};
+			char *path = alloc_concat_m(3, parts);
+			render_save_screenshot(path);
+			break;
+		}
 		case UI_EXIT:
 			current_system->request_exit(current_system);
 			break;
@@ -665,6 +688,8 @@
 			*ui_out = UI_TOGGLE_FULLSCREEN;
 		} else if (!strcmp(target + 3, "soft_reset")) {
 			*ui_out = UI_SOFT_RESET;
+		} else if (!strcmp(target + 3, "screenshot")) {
+			*ui_out = UI_SCREENSHOT;
 		} else if(!strcmp(target + 3, "exit")) {
 			*ui_out = UI_EXIT;
 		} else {