From 28168bb3a63b7506a79441d6ce5ed312ba6f6e1a Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 17 May 2021 04:09:47 +0200 Subject: Make body movement smooth, async load video related videos to allow cancellation with esc --- src/QuickMedia.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index cd4a279..cd1377a 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -561,7 +561,6 @@ namespace QuickMedia { } void Program::init(Window parent_window, std::string &program_path) { - XInitThreads(); disp = XOpenDisplay(NULL); if (!disp) throw std::runtime_error("Failed to open display to X11 server"); @@ -2187,8 +2186,15 @@ namespace QuickMedia { return; channel_url.clear(); - // TODO: Remove this and use lazy_fetch instead - related_videos = video_page->get_related_media(video_url, channel_url); + TaskResult load_related_media_result = run_task_with_loading_screen([video_page, &related_videos, &video_url, &channel_url]{ + related_videos = video_page->get_related_media(video_url, channel_url); + return true; + }); + + if(load_related_media_result == TaskResult::CANCEL) { + current_page = previous_page; + return; + } // TODO: Make this also work for other video plugins if(strcmp(plugin_name, "youtube") != 0 || resume_video) @@ -2297,7 +2303,7 @@ namespace QuickMedia { KeySym pressed_keysym = XKeycodeToKeysym(disp, xev.xkey.keycode, 0); #pragma GCC diagnostic pop bool pressing_ctrl = (CLEANMASK(xev.xkey.state) == ControlMask); - if(pressed_keysym == XK_Escape || pressed_keysym == XK_BackSpace || pressed_keysym == XK_q) { + if(pressed_keysym == XK_Escape || pressed_keysym == XK_q || pressed_keysym == XK_BackSpace) { current_page = previous_page; break; } else if(pressed_keysym == XK_f && pressing_ctrl) { @@ -2402,7 +2408,7 @@ namespace QuickMedia { if(new_video_url.empty() && parent_page && parent_body_page) { BodyItems new_body_items; const int fetch_page = (*parent_body_page) + 1; - run_task_with_loading_screen([parent_page, parent_page_search, fetch_page, &new_body_items] { + TaskResult load_next_page_result = run_task_with_loading_screen([parent_page, parent_page_search, fetch_page, &new_body_items] { if(parent_page->get_page(parent_page_search, fetch_page, new_body_items) != PluginResult::OK) { fprintf(stderr, "Failed to get next page (page %d)\n", fetch_page); return false; @@ -2418,6 +2424,11 @@ namespace QuickMedia { related_videos = std::move(new_body_items); find_next_video(); } + + if(load_next_page_result == TaskResult::CANCEL) { + current_page = previous_page; + continue; + } } // If there are no videos to play, then dont play any... -- cgit v1.2.3