summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-03-04 11:50:14 -0800
committerMichael Pavone <pavone@retrodev.com>2017-03-04 11:50:14 -0800
commit2eb32065b23a5cd90a6ae8908ae8a8ff24a4f209 (patch)
treef0afa5091944f9b2170428b77b7e65abc203ada2 /io.c
parentb933af364fff4b627930ccfb176332240f391d8e (diff)
Implement raw screenshot functionality requested in ticket:10
Diffstat (limited to 'io.c')
-rw-r--r--io.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/io.c b/io.c
index 8999242..2081e2f 100644
--- a/io.c
+++ b/io.c
@@ -74,6 +74,7 @@ typedef enum {
UI_TOGGLE_KEYBOARD_CAPTURE,
UI_TOGGLE_FULLSCREEN,
UI_SOFT_RESET,
+ UI_SCREENSHOT,
UI_EXIT
} ui_action;
@@ -402,6 +403,10 @@ uint8_t keyboard_connected(sega_io *io)
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 @@ void handle_binding_up(keybinding * binding)
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 @@ int parse_binding_target(char * target, tern_node * padbuttons, tern_node *mouse
*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 {