int shot(int argc, char * argv[]) { char path[256] = ROOT_PATH"/shot.bmp"; if (argc >= 2) { strcpy(path, argv[1]); } return screen_shot(path); }
static void __emu_one_frame(int rasters, int frameskip) { SDL_Event e; while (SDL_PollEvent(&e) != 0) switch (e.type) { case SDL_WINDOWEVENT: if (!is_fullscreen && e.window.event == SDL_WINDOWEVENT_RESIZED) { DEBUG("UI: Window is resized to %d x %d" NL, e.window.data1, e.window.data2 ); screen_window_resized(e.window.data1, e.window.data2); } break; case SDL_QUIT: if (QUESTION_WINDOW("?No|!Yes", "Are you sure to exit?") == 1) XEMUEXIT(0); return; case SDL_KEYDOWN: case SDL_KEYUP: if (e.key.repeat == 0 && (e.key.windowID == sdl_winid || e.key.windowID == 0)) { int code = emu_kbd(e.key.keysym, e.key.state == SDL_PRESSED); if (code == 0xF9) // // OSD REPLAY, default key GRAVE osd_replay(e.key.state == SDL_PRESSED ? 0 : OSD_FADE_START); else if (code && e.key.state == SDL_PRESSED) switch(code) { #ifndef __EMSCRIPTEN__ case 0xFF: // FULLSCREEN toogle, default key F11 screen_set_fullscreen(!is_fullscreen); break; case 0xFE: // EXIT, default key F9 if (QUESTION_WINDOW("?No|!Yes", "Are you sure to exit?") == 1) XEMUEXIT(0); break; case 0xFD: // SCREENSHOT, default key F10 screen_shot(ep_pixels, current_directory, "screenshot-*.png"); break; #endif case 0xFC: // RESET, default key PAUSE if (e.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) { zxemu_on = 0; (void)ep_init_ram(); } ep_reset(); break; case 0xFB: // DOWNGRADE CPU SPEED, default key PAGE DOWN if (_cpu_speed_index) set_cpu_clock_with_osd(_cpu_speeds[-- _cpu_speed_index]); break; case 0xFA: // UPGRADE CPU SPEED, default key PAGE UP if (_cpu_speed_index < 3) set_cpu_clock_with_osd(_cpu_speeds[++ _cpu_speed_index]); break; case 0xF8: // CONSOLE, key pad minus if (!console_is_open) console_open_window(); break; } } else if (e.key.repeat == 0) DEBUG("UI: NOT HANDLED KEY EVENT: repeat = %d windowid = %d [our win = %d]" NL, e.key.repeat, e.key.windowID, sdl_winid); break; case SDL_MOUSEMOTION: if (e.motion.windowID == sdl_winid) emu_mouse_motion(e.motion.xrel, e.motion.yrel); break; case SDL_MOUSEWHEEL: if (e.wheel.windowID == sdl_winid) emu_mouse_wheel( e.wheel.x, e.wheel.y, e.wheel.direction == SDL_MOUSEWHEEL_FLIPPED ); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if (e.button.windowID == sdl_winid) emu_mouse_button(e.button.button, e.button.state == SDL_PRESSED); break; default: joy_sdl_event(&e); break; } if (!frameskip) screen_present_frame(ep_pixels); // this should be after the event handler, as eg screenshot function needs locked texture state if this feature is used at all xepgui_iteration(); monitor_process_queued(); emu_timekeeping_delay((1000000.0 * rasters * 57.0) / (double)NICK_SLOTS_PER_SEC); }
static void send_codes(vx_display_t * disp, const uint8_t * data, int datalen) { state_t * state = disp->impl; vx_code_input_stream_t * cins = vx_code_input_stream_create(data, datalen); // Peek at the code type to determine which function to call uint32_t code = cins->read_uint32(cins); pthread_mutex_lock(&state->mutex); switch(code) { case OP_BUFFER_RESOURCES: vx_resc_manager_buffer_resources(state->mgr, data, datalen); break; case OP_BUFFER_ENABLED: vx_gl_renderer_buffer_enabled(state->glrend, cins); break; case OP_BUFFER_CODES: vx_gl_renderer_set_buffer_render_codes(state->glrend, cins); break; case OP_LAYER_INFO: vx_gl_renderer_update_layer(state->glrend, cins); { vx_code_input_stream_t * c2 = vx_code_input_stream_create(data, datalen); c2->read_uint32(c2); //discard code process_layer(state, c2); vx_code_input_stream_destroy(c2); } // XXX Also need to intercept these! break; case OP_DEALLOC_RESOURCES: vx_gl_renderer_remove_resources(state->glrend, cins); break; case OP_LAYER_VIEWPORT_REL: process_viewport_rel(state, cins); break; case OP_LAYER_VIEWPORT_ABS: process_viewport_abs(state, cins); break; case OP_LAYER_CAMERA: process_camera_codes(state, cins); break; case OP_WINDOW_SCENE: { save_scene(state, cins); break; } case OP_WINDOW_SCREENSHOT: screen_shot(state, cins); break; case OP_WINDOW_MOVIE_RECORD: case OP_WINDOW_MOVIE_STOP: movie(state, cins, code == OP_WINDOW_MOVIE_RECORD); break; default: assert(0); } pthread_mutex_unlock(&state->mutex); // Buffer layer manager, outside the lock switch(code) { case OP_BUFFER_ENABLED: vx_gtk_buffer_manager_codes(state->buffer_manager, data, datalen); break; case OP_BUFFER_CODES: vx_gtk_buffer_manager_codes(state->buffer_manager, data, datalen); break; case OP_LAYER_INFO: vx_gtk_buffer_manager_codes(state->buffer_manager, data, datalen); break; } vx_code_input_stream_destroy(cins); }