From f0b903435c67da8ed50380e4604de895ea0f7bcf Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sun, 2 Aug 2015 00:02:58 -0700 Subject: [PATCH] UI: Change "main preview" to use OBSQTDisplay (Non-compiling commit: windowless-context branch) Gets rid of all functions/data related to setting up the main preview to be associated with obs_reset_video and instead uses OBSQTDisplay for the main window display (thus associating it with an obs_display object). --- obs/window-basic-main.cpp | 71 +++++++++++++-------------------------- 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index b4bfbe674..3afccd095 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -841,10 +841,6 @@ void OBSBasic::OBSInit() if (ret <= 0) throw "Failed to get scene collection json file path"; - /* make sure it's fully displayed before doing any initialization */ - show(); - App()->processEvents(); - if (!obs_startup(App()->GetLocale())) throw "Failed to initialize libobs"; if (!InitBasicConfig()) @@ -909,6 +905,20 @@ void OBSBasic::OBSInit() RefreshSceneCollections(); RefreshProfiles(); disableSaving--; + + auto addDisplay = [this] (OBSQTDisplay *window) + { + obs_display_add_draw_callback(window->GetDisplay(), + OBSBasic::RenderMain, this); + + struct obs_video_info ovi; + if (obs_get_video_info(&ovi)) + ResizePreview(ovi.base_width, ovi.base_height); + }; + + connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDisplay); + + show(); } void OBSBasic::InitHotkeys() @@ -1055,7 +1065,7 @@ void OBSBasic::ClearHotkeys() OBSBasic::~OBSBasic() { - bool previewEnabled = obs_preview_enabled(); + bool previewEnabled = obs_display_enabled(ui->preview->GetDisplay()); /* XXX: any obs data must be released before calling obs_shutdown. * currently, we can't automate this with C++ RAII because of the @@ -1087,6 +1097,9 @@ OBSBasic::~OBSBasic() if (advAudioWindow) delete advAudioWindow; + obs_display_remove_draw_callback(ui->preview->GetDisplay(), + OBSBasic::RenderMain, this); + obs_enter_graphics(); gs_vertexbuffer_destroy(box); gs_vertexbuffer_destroy(circle); @@ -1954,23 +1967,7 @@ bool OBSBasic::StreamingActive() static inline int AttemptToResetVideo(struct obs_video_info *ovi) { - int ret = obs_reset_video(ovi); - if (ret == OBS_VIDEO_INVALID_PARAM) { - struct obs_video_info new_params = *ovi; - - if (new_params.window_width == 0) - new_params.window_width = 512; - if (new_params.window_height == 0) - new_params.window_height = 512; - - new_params.output_width = new_params.window_width; - new_params.output_height = new_params.window_height; - new_params.base_width = new_params.window_width; - new_params.base_height = new_params.window_height; - ret = obs_reset_video(&new_params); - } - - return ret; + return obs_reset_video(ovi); } static inline enum obs_scale_type GetScaleType(ConfigFile &basicConfig) @@ -2038,15 +2035,6 @@ int OBSBasic::ResetVideo() ovi.gpu_conversion = true; ovi.scale_type = GetScaleType(basicConfig); - QTToGSWindow(ui->preview->winId(), ovi.window); - - //required to make opengl display stuff on osx(?) - ResizePreview(ovi.base_width, ovi.base_height); - - QSize size = GetPixelSize(ui->preview); - ovi.window_width = size.width(); - ovi.window_height = size.height(); - ret = AttemptToResetVideo(&ovi); if (IS_WIN32 && ret != OBS_VIDEO_SUCCESS) { /* Try OpenGL if DirectX fails on windows */ @@ -2061,9 +2049,6 @@ int OBSBasic::ResetVideo() } } - if (ret == OBS_VIDEO_SUCCESS) - obs_add_draw_callback(OBSBasic::RenderMain, this); - return ret; } @@ -2132,11 +2117,6 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy) previewX += float(PREVIEW_EDGE_SIZE); previewY += float(PREVIEW_EDGE_SIZE); - - if (isVisible()) { - QSize size = GetPixelSize(ui->preview); - obs_resize(size.width(), size.height()); - } } void OBSBasic::CloseDialogs() @@ -2212,10 +2192,6 @@ void OBSBasic::closeEvent(QCloseEvent *event) signalHandlers.clear(); - // remove draw callback in case our drawable surfaces go away before - // the destructor gets called - obs_remove_draw_callback(OBSBasic::RenderMain, this); - SaveProjectNow(); disableSaving++; @@ -2550,7 +2526,8 @@ void OBSBasic::CreateSourcePopupMenu(QListWidgetItem *item, bool preview) QTStr("Basic.Main.PreviewConextMenu.Enable"), this, SLOT(TogglePreview())); action->setCheckable(true); - action->setChecked(obs_preview_enabled()); + action->setChecked( + obs_display_enabled(ui->preview->GetDisplay())); previewProjector = new QMenu(QTStr("PreviewProjector")); AddProjectorMenuMonitors(previewProjector, this, @@ -3163,7 +3140,7 @@ void OBSBasic::on_previewDisabledLabel_customContextMenuRequested( QTStr("Basic.Main.PreviewConextMenu.Enable"), this, SLOT(TogglePreview())); action->setCheckable(true); - action->setChecked(obs_preview_enabled()); + action->setChecked(obs_display_enabled(ui->preview->GetDisplay())); previewProjector = new QMenu(QTStr("PreviewProjector")); AddProjectorMenuMonitors(previewProjector, this, @@ -3476,8 +3453,8 @@ void OBSBasic::on_actionCenterToScreen_triggered() void OBSBasic::TogglePreview() { - bool enabled = !obs_preview_enabled(); - obs_preview_set_enabled(enabled); + bool enabled = !obs_display_enabled(ui->preview->GetDisplay()); + obs_display_set_enabled(ui->preview->GetDisplay(), enabled); ui->preview->setVisible(enabled); ui->previewDisabledLabel->setVisible(!enabled); }