diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 2a0a561e9..0a13e1bfb 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -315,27 +315,32 @@ MainWindow::MainWindow(QWidget *parent) : connect(actGroup, &QActionGroup::triggered, [this](QAction* action) { vid_api = action->property("vid_api").toInt(); + RendererStack::Renderer newVidApi = RendererStack::Renderer::Software; switch (vid_api) { case 0: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::Software); + newVidApi = RendererStack::Renderer::Software; break; case 1: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL); + newVidApi = (RendererStack::Renderer::OpenGL); break; case 2: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGLES); + newVidApi = (RendererStack::Renderer::OpenGLES); break; case 3: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL3); + newVidApi = (RendererStack::Renderer::OpenGL3); break; case 4: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::Vulkan); + newVidApi = (RendererStack::Renderer::Vulkan); break; case 5: - ui->stackedWidget->switchRenderer(RendererStack::Renderer::Direct3D9); + newVidApi = (RendererStack::Renderer::Direct3D9); break; } + ui->stackedWidget->switchRenderer(newVidApi); + for (int i = 1; i < MONITORS_NUM; i++) { + if (renderers[i]) renderers[i]->switchRenderer(newVidApi); + } }); connect(ui->stackedWidget, &RendererStack::rendererChanged, [this]() { @@ -1579,16 +1584,36 @@ void MainWindow::on_actionResizable_window_triggered(bool checked) { setWindowFlag(Qt::WindowMaximizeButtonHint); setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, false); setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + for (int i = 1; i < MONITORS_NUM; i++) { + if (monitors[i].target_buffer) { + renderers[i]->setWindowFlag(Qt::WindowMaximizeButtonHint); + renderers[i]->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, false); + renderers[i]->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + } + } } else { vid_resize = 0; setWindowFlag(Qt::WindowMaximizeButtonHint, false); setWindowFlag(Qt::MSWindowsFixedSizeDialogHint); + for (int i = 1; i < MONITORS_NUM; i++) { + if (monitors[i].target_buffer) { + renderers[i]->setWindowFlag(Qt::WindowMaximizeButtonHint); + renderers[i]->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, false); + emit resizeContentsMonitor(monitors[i].mon_scrnsz_x, monitors[i].mon_scrnsz_y, i); + } + } } show(); - ui->stackedWidget->switchRenderer((RendererStack::Renderer)vid_api); - ui->menuWindow_scale_factor->setEnabled(! checked); emit resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y); + ui->stackedWidget->switchRenderer((RendererStack::Renderer)vid_api); + for (int i = 1; i < MONITORS_NUM; i++) { + if (monitors[i].target_buffer) { + renderers[i]->show(); + renderers[i]->switchRenderer((RendererStack::Renderer)vid_api); + QApplication::processEvents(); + } + } } static void @@ -1601,6 +1626,9 @@ video_toggle_option(QAction* action, int *val) endblit(); config_save(); device_force_redraw(); + for (int i = 0; i < MONITORS_NUM; i++) { + if (monitors[i].target_buffer) video_force_resize_set_monitor(1, i); + } } void MainWindow::on_actionInverted_VGA_monitor_triggered() { @@ -1615,9 +1643,9 @@ static void update_scaled_checkboxes(Ui::MainWindow* ui, QAction* selected) { reset_screen_size(); device_force_redraw(); - video_force_resize_set(1); - for (int i = 0; i < MONITORS_NUM; i++) - if (monitors[i].target_buffer) atomic_flag_clear(&doresize_monitors[i]); + for (int i = 0; i < MONITORS_NUM; i++) { + if (monitors[i].target_buffer) video_force_resize_set_monitor(1, i); + } config_save(); } @@ -1796,7 +1824,6 @@ void MainWindow::on_actionChange_contrast_for_monochrome_display_triggered() { void MainWindow::on_actionForce_4_3_display_ratio_triggered() { video_toggle_option(ui->actionForce_4_3_display_ratio, &force_43); - video_force_resize_set(1); } void MainWindow::on_actionRemember_size_and_position_triggered() diff --git a/src/thread.cpp b/src/thread.cpp index 6a7af25b8..67bf8d5e6 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -26,6 +26,7 @@ thread_create(void (*thread_rout)(void *param), void *param) int thread_wait(thread_t *arg) { + if (!arg) return 0; auto thread = reinterpret_cast(arg); thread->join(); return 0; diff --git a/src/video/video.c b/src/video/video.c index 16eab9986..9bf810df3 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -943,7 +943,7 @@ video_monitor_init(int index) monitors[index].mon_pal_lookup = calloc(sizeof(uint32_t), 256); monitors[index].mon_cga_palette = calloc(1, sizeof(int)); if (index >= 1) ui_init_monitor(index); - thread_create(blit_thread, monitors[index].mon_blit_data_ptr); + monitors[index].mon_blit_data_ptr->blit_thread = thread_create(blit_thread, monitors[index].mon_blit_data_ptr); } void @@ -960,6 +960,8 @@ video_monitor_close(int monitor_index) free(monitors[monitor_index].mon_blit_data_ptr); if (!monitors[monitor_index].mon_pal_lookup_static) free(monitors[monitor_index].mon_pal_lookup); if (!monitors[monitor_index].mon_cga_palette_static) free(monitors[monitor_index].mon_cga_palette); + destroy_bitmap(monitors[monitor_index].target_buffer); + monitors[monitor_index].target_buffer = NULL; memset(&monitors[monitor_index], 0, sizeof(monitor_t)); }