@ -106,13 +106,17 @@ static void event_loop(void) {
}
}
static SDL_bool set_show_touches_enabled ( const char * serial , SDL_bool enabled ) {
static process_t set_show_touches_enabled ( const char * serial , SDL_bool enabled ) {
const char * value = enabled ? " 1 " : " 0 " ;
const char * const adb_cmd [ ] = {
" shell " , " settings " , " put " , " system " , " show_touches " , value
} ;
process_t proc = adb_execute ( serial , adb_cmd , ARRAY_LEN ( adb_cmd ) ) ;
return process_check_success ( proc , " show_touches " ) ;
return adb_execute ( serial , adb_cmd , ARRAY_LEN ( adb_cmd ) ) ;
}
static void wait_show_touches ( process_t process ) {
// reap the process, ignore the result
process_check_success ( process , " show_touches " ) ;
}
SDL_bool scrcpy ( const struct scrcpy_options * options ) {
@ -121,6 +125,14 @@ SDL_bool scrcpy(const struct scrcpy_options *options) {
return SDL_FALSE ;
}
process_t proc_show_touches ;
SDL_bool show_touches_waited ;
if ( options - > show_touches ) {
LOGI ( " Enable show_touches " ) ;
proc_show_touches = set_show_touches_enabled ( options - > serial , SDL_TRUE ) ;
show_touches_waited = SDL_FALSE ;
}
SDL_bool ret = SDL_TRUE ;
if ( ! SDL_SetHint ( SDL_HINT_NO_SIGNAL_HANDLERS , " 1 " ) ) {
@ -183,8 +195,8 @@ SDL_bool scrcpy(const struct scrcpy_options *options) {
}
if ( options - > show_touches ) {
LOGI( " Enable show_touches " ) ;
set_show_touches_enabled ( options - > serial , SDL_TRUE ) ;
wait_show_touches( proc_show_touches ) ;
show_touches_waited = SDL_TRUE ;
}
event_loop ( ) ;
@ -192,10 +204,6 @@ SDL_bool scrcpy(const struct scrcpy_options *options) {
screen_destroy ( & screen ) ;
if ( options - > show_touches ) {
LOGI ( " Disable show_touches " ) ;
set_show_touches_enabled ( options - > serial , SDL_FALSE ) ;
}
finally_stop_and_join_controller :
controller_stop ( & controller ) ;
controller_join ( & controller ) ;
@ -209,6 +217,16 @@ finally_stop_decoder:
finally_destroy_frames :
frames_destroy ( & frames ) ;
finally_destroy_server :
if ( options - > show_touches ) {
if ( ! show_touches_waited ) {
// wait the process which enabled "show touches"
wait_show_touches ( proc_show_touches ) ;
}
LOGI ( " Disable show_touches " ) ;
proc_show_touches = set_show_touches_enabled ( options - > serial , SDL_FALSE ) ;
wait_show_touches ( proc_show_touches ) ;
}
server_destroy ( & server ) ;
return ret ;