Extract event processing out of event_loop()
To avoid too many levels of nested blocks, move the event handling logic in a separate function.
This commit is contained in:
parent
aeda583a2c
commit
33ccb1368f
1 changed files with 70 additions and 53 deletions
123
app/src/scrcpy.c
123
app/src/scrcpy.c
|
@ -68,6 +68,70 @@ is_apk(const char *file) {
|
||||||
return ext && !strcmp(ext, ".apk");
|
return ext && !strcmp(ext, ".apk");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum event_result {
|
||||||
|
EVENT_RESULT_CONTINUE,
|
||||||
|
EVENT_RESULT_STOPPED_BY_USER,
|
||||||
|
EVENT_RESULT_STOPPED_BY_EOS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static enum event_result
|
||||||
|
handle_event(SDL_Event *event) {
|
||||||
|
switch (event->type) {
|
||||||
|
case EVENT_STREAM_STOPPED:
|
||||||
|
LOGD("Video stream stopped");
|
||||||
|
return EVENT_RESULT_STOPPED_BY_EOS;
|
||||||
|
case SDL_QUIT:
|
||||||
|
LOGD("User requested to quit");
|
||||||
|
return EVENT_RESULT_STOPPED_BY_USER;
|
||||||
|
case EVENT_NEW_FRAME:
|
||||||
|
if (!screen.has_frame) {
|
||||||
|
screen.has_frame = SDL_TRUE;
|
||||||
|
// this is the very first frame, show the window
|
||||||
|
screen_show_window(&screen);
|
||||||
|
}
|
||||||
|
if (!screen_update_frame(&screen, &video_buffer)) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_WINDOWEVENT:
|
||||||
|
switch (event->window.event) {
|
||||||
|
case SDL_WINDOWEVENT_EXPOSED:
|
||||||
|
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||||
|
screen_render(&screen);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_TEXTINPUT:
|
||||||
|
input_manager_process_text_input(&input_manager, &event->text);
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
case SDL_KEYUP:
|
||||||
|
input_manager_process_key(&input_manager, &event->key);
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
input_manager_process_mouse_motion(&input_manager, &event->motion);
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEWHEEL:
|
||||||
|
input_manager_process_mouse_wheel(&input_manager, &event->wheel);
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
input_manager_process_mouse_button(&input_manager, &event->button);
|
||||||
|
break;
|
||||||
|
case SDL_DROPFILE: {
|
||||||
|
file_handler_action_t action;
|
||||||
|
if (is_apk(event->drop.file)) {
|
||||||
|
action = ACTION_INSTALL_APK;
|
||||||
|
} else {
|
||||||
|
action = ACTION_PUSH_FILE;
|
||||||
|
}
|
||||||
|
file_handler_request(&file_handler, action, event->drop.file);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return EVENT_RESULT_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static SDL_bool
|
static SDL_bool
|
||||||
event_loop(void) {
|
event_loop(void) {
|
||||||
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
#ifdef CONTINUOUS_RESIZING_WORKAROUND
|
||||||
|
@ -75,61 +139,14 @@ event_loop(void) {
|
||||||
#endif
|
#endif
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_WaitEvent(&event)) {
|
while (SDL_WaitEvent(&event)) {
|
||||||
switch (event.type) {
|
enum event_result result = handle_event(&event);
|
||||||
case EVENT_STREAM_STOPPED:
|
switch (result) {
|
||||||
LOGD("Video stream stopped");
|
case EVENT_RESULT_STOPPED_BY_USER:
|
||||||
return SDL_FALSE;
|
|
||||||
case SDL_QUIT:
|
|
||||||
LOGD("User requested to quit");
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
case EVENT_NEW_FRAME:
|
case EVENT_RESULT_STOPPED_BY_EOS:
|
||||||
if (!screen.has_frame) {
|
return SDL_FALSE;
|
||||||
screen.has_frame = SDL_TRUE;
|
case EVENT_RESULT_CONTINUE:
|
||||||
// this is the very first frame, show the window
|
|
||||||
screen_show_window(&screen);
|
|
||||||
}
|
|
||||||
if (!screen_update_frame(&screen, &video_buffer)) {
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT:
|
|
||||||
switch (event.window.event) {
|
|
||||||
case SDL_WINDOWEVENT_EXPOSED:
|
|
||||||
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
|
||||||
screen_render(&screen);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SDL_TEXTINPUT:
|
|
||||||
input_manager_process_text_input(&input_manager, &event.text);
|
|
||||||
break;
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
case SDL_KEYUP:
|
|
||||||
input_manager_process_key(&input_manager, &event.key);
|
|
||||||
break;
|
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
input_manager_process_mouse_motion(&input_manager,
|
|
||||||
&event.motion);
|
|
||||||
break;
|
|
||||||
case SDL_MOUSEWHEEL:
|
|
||||||
input_manager_process_mouse_wheel(&input_manager,
|
|
||||||
&event.wheel);
|
|
||||||
break;
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
case SDL_MOUSEBUTTONUP:
|
|
||||||
input_manager_process_mouse_button(&input_manager,
|
|
||||||
&event.button);
|
|
||||||
break;
|
|
||||||
case SDL_DROPFILE: {
|
|
||||||
file_handler_action_t action;
|
|
||||||
if (is_apk(event.drop.file)) {
|
|
||||||
action = ACTION_INSTALL_APK;
|
|
||||||
} else {
|
|
||||||
action = ACTION_PUSH_FILE;
|
|
||||||
}
|
|
||||||
file_handler_request(&file_handler, action, event.drop.file);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
|
|
Loading…
Reference in a new issue