diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/QuickMedia.cpp | 16 | ||||
-rw-r--r-- | src/VideoPlayer.cpp | 49 |
2 files changed, 46 insertions, 19 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 8d6e4a2..ddb81a9 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3076,7 +3076,7 @@ namespace QuickMedia { std::string channel_url; AsyncTask<void> related_videos_task; - std::function<void(const char*)> video_event_callback; + EventCallbackFunc video_event_callback; bool go_to_previous_page = false; std::string video_url; @@ -3317,7 +3317,7 @@ namespace QuickMedia { } }; - video_event_callback = [&](const char *event_name) mutable { + video_event_callback = [&](const char *event_name, const std::vector<std::string> &args) mutable { if(strcmp(event_name, "pause") == 0) { //double time_remaining = 9999.0; //if(video_player->get_time_remaining(&time_remaining) == VideoPlayer::Error::OK && time_remaining <= 1.0) @@ -3337,6 +3337,8 @@ namespace QuickMedia { } else if(strcmp(event_name, "seek") == 0) { if(video_page->is_local()) update_time_pos = true; + } else if(strcmp(event_name, "fullscreen") == 0 && args.size() == 1) { + window_set_fullscreen(disp, window.get_system_handle(), args[0] == "yes" ? WindowFullscreenState::SET : WindowFullscreenState::UNSET); } //fprintf(stderr, "event name: %s\n", event_name); @@ -3376,13 +3378,12 @@ namespace QuickMedia { } else if(event.type == mgl::Event::KeyPressed && (event.key.code == mgl::Keyboard::Escape || event.key.code == mgl::Keyboard::Q || event.key.code == mgl::Keyboard::Backspace)) { // To be able to close the video player while the video is loading if(window_is_fullscreen(disp, window.get_system_handle())) { - window_set_fullscreen(disp, window.get_system_handle(), WindowFullscreenState::UNSET); + if(video_player && video_player_window && event.key.code != mgl::Keyboard::Escape) + video_player->cycle_fullscreen(); } else { current_page = previous_page; go_to_previous_page = true; } - } else if(event.type == mgl::Event::KeyPressed && event.key.code == mgl::Keyboard::F && event.key.control) { - window_set_fullscreen(disp, window.get_system_handle(), WindowFullscreenState::TOGGLE); } else if(event.type == mgl::Event::KeyPressed && event.key.code == mgl::Keyboard::C && event.key.control && !video_page->is_local()) { save_video_url_to_clipboard(); } else if(event.type == mgl::Event::KeyPressed && event.key.code == mgl::Keyboard::F5 && !video_page->is_local()) { @@ -3401,14 +3402,15 @@ namespace QuickMedia { window.close(); } else if(pressed_keysym == XK_Escape || pressed_keysym == XK_q || pressed_keysym == XK_BackSpace) { if(window_is_fullscreen(disp, window.get_system_handle())) { - window_set_fullscreen(disp, window.get_system_handle(), WindowFullscreenState::UNSET); + if(pressed_keysym != XK_Escape) + video_player->cycle_fullscreen(); } else { current_page = previous_page; go_to_previous_page = true; break; } } else if(pressed_keysym == XK_f && pressing_ctrl) { - window_set_fullscreen(disp, window.get_system_handle(), WindowFullscreenState::TOGGLE); + video_player->cycle_fullscreen(); } else if(pressed_keysym == XK_s && pressing_ctrl && !video_page->is_local()) { video_page_download_video(video_page->get_download_url(video_get_max_height()), video_player_window); } else if(pressed_keysym == XK_F5 && !video_page->is_local()) { diff --git a/src/VideoPlayer.cpp b/src/VideoPlayer.cpp index 2c0fe44..26e2013 100644 --- a/src/VideoPlayer.cpp +++ b/src/VideoPlayer.cpp @@ -96,8 +96,8 @@ namespace QuickMedia { video_process_id(-1), connect_tries(0), find_window_tries(0), - event_callback(_event_callback), - window_create_callback(_window_create_callback), + event_callback(std::move(_event_callback)), + window_create_callback(std::move(_window_create_callback)), window_handle(0), display(nullptr), request_id_counter(1), @@ -364,6 +364,21 @@ namespace QuickMedia { return Error::OK; } + static std::vector<std::string> json_array_to_string_list(const Json::Value &json) { + std::vector<std::string> result; + if(!json.isArray()) + return result; + + for(const Json::Value &item : json) { + if(!item.isString()) + continue; + + result.push_back(item.asString()); + } + + return result; + } + VideoPlayer::Error VideoPlayer::read_ipc_func() { Json::Value json_root; Json::CharReaderBuilder json_builder; @@ -386,18 +401,26 @@ namespace QuickMedia { if(json_reader->parse(buffer + start, buffer + i, &json_root, &json_errors) && json_root.isObject()) { const Json::Value &event = json_root["event"]; - const Json::Value &request_id_json = json_root["request_id"]; + const Json::Value &args = json_root["args"]; if(event.isString()) { if(event_callback) - event_callback(event.asCString()); + event_callback(event.asCString(), json_array_to_string_list(args)); } + const Json::Value &request_id_json = json_root["request_id"]; if(expected_request_id != 0 && request_id_json.isNumeric() && request_id_json.asUInt() == expected_request_id) { const Json::Value &status_json = json_root["status"]; - if(!status_json.isString() || strcmp(status_json.asCString(), "error") == 0) + if(!status_json.isString() || strcmp(status_json.asCString(), "error") == 0) { response_data_status = ResponseDataStatus::ERROR; - else + const char *err_msg = "Unknown"; + const Json::Value &message_json = json_root["message"]; + if(message_json.isString()) + err_msg = message_json.asCString(); + + fprintf(stderr, "VideoPlayer::send_command failed, error from video player: %s\n", err_msg); + } else { response_data_status = ResponseDataStatus::OK; + } request_response_data = json_root["data"]; } } else { @@ -440,6 +463,14 @@ namespace QuickMedia { return send_command(json_root, &result, Json::ValueType::nullValue); } + VideoPlayer::Error VideoPlayer::cycle_fullscreen() { + Json::Value json_root(Json::objectValue); + json_root["command"] = "cycle-fullscreen"; + + Json::Value result; + return send_command(json_root, &result, Json::ValueType::nullValue); + } + uint32_t VideoPlayer::get_next_request_id() { unsigned int cmd_request_id = request_id_counter; ++request_id_counter; @@ -483,12 +514,6 @@ namespace QuickMedia { else err = Error::READ_INCORRECT_TYPE; } else if(response_data_status == ResponseDataStatus::ERROR) { - const char *err_msg = "Unknown"; - const Json::Value &message_json = request_response_data["message"]; - if(message_json.isString()) - err_msg = message_json.asCString(); - - fprintf(stderr, "VideoPlayer::send_command failed, error from video player: %s\n", err_msg); err = Error::READ_RESPONSE_ERROR; goto cleanup; } else { |