Properly handle Ctrl+C on Windows
By default, Ctrl+C just kills the process on Windows. This caused corrupted video files on recording. Handle Ctrl+C properly to clean up properly. Fixes #818 <https://github.com/Genymobile/scrcpy/issues/818>
This commit is contained in:
parent
e2d5f0e7fc
commit
28abd98f7f
2 changed files with 24 additions and 1 deletions
|
@ -210,7 +210,6 @@ To disable mirroring while recording:
|
|||
scrcpy --no-display --record file.mp4
|
||||
scrcpy -Nr file.mkv
|
||||
# interrupt recording with Ctrl+C
|
||||
# Ctrl+C does not terminate properly on Windows, so disconnect the device
|
||||
```
|
||||
|
||||
"Skipped frames" are recorded, even if they are not displayed in real time (for
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
#include <sys/time.h>
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#include "command.h"
|
||||
#include "common.h"
|
||||
|
@ -45,6 +49,18 @@ static struct input_manager input_manager = {
|
|||
.prefer_text = false, // initialized later
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
BOOL windows_ctrl_handler(DWORD ctrl_type) {
|
||||
if (ctrl_type == CTRL_C_EVENT) {
|
||||
SDL_Event event;
|
||||
event.type = SDL_QUIT;
|
||||
SDL_PushEvent(&event);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
// init SDL and set appropriate hints
|
||||
static bool
|
||||
sdl_init_and_configure(bool display, const char *render_driver) {
|
||||
|
@ -56,6 +72,14 @@ sdl_init_and_configure(bool display, const char *render_driver) {
|
|||
|
||||
atexit(SDL_Quit);
|
||||
|
||||
#ifdef _WIN32
|
||||
// Clean up properly on Ctrl+C on Windows
|
||||
bool ok = SetConsoleCtrlHandler(windows_ctrl_handler, TRUE);
|
||||
if (!ok) {
|
||||
LOGW("Could not set Ctrl+C handler");
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
if (!display) {
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue