Merge pull request #2598 from Cacodemon345/qt-fullscreen-stretch-maximize
qt: Add option to apply fullscreen stretching modes when maximized
This commit is contained in:
@@ -188,6 +188,7 @@ int enable_discord = 0; /* (C) enable Discord integration */
|
||||
int pit_mode = -1; /* (C) force setting PIT mode */
|
||||
int fm_driver = 0; /* (C) select FM sound driver */
|
||||
int open_dir_usr_path = 0; /* default file open dialog directory of usr_path */
|
||||
int video_fullscreen_scale_maximized = 0; /* (C) Whether fullscreen scaling settings also apply when maximized. */
|
||||
|
||||
/* Statistics. */
|
||||
extern int mmuflush;
|
||||
|
@@ -969,6 +969,8 @@ load_video(void)
|
||||
ibm8514_enabled = !!config_get_int(cat, "8514a", 0);
|
||||
xga_enabled = !!config_get_int(cat, "xga", 0);
|
||||
show_second_monitors = !!config_get_int(cat, "show_second_monitors", 1);
|
||||
video_fullscreen_scale_maximized = !!config_get_int(cat, "video_fullscreen_scale_maximized", 0);
|
||||
|
||||
p = config_get_string(cat, "gfxcard_2", NULL);
|
||||
if (!p)
|
||||
p = "none";
|
||||
@@ -2554,6 +2556,11 @@ save_video(void)
|
||||
else
|
||||
config_set_int(cat, "show_second_monitors", show_second_monitors);
|
||||
|
||||
if (video_fullscreen_scale_maximized == 0)
|
||||
config_delete_var(cat, "video_fullscreen_scale_maximized");
|
||||
else
|
||||
config_set_int(cat, "video_fullscreen_scale_maximized", video_fullscreen_scale_maximized);
|
||||
|
||||
delete_section_if_empty(cat);
|
||||
}
|
||||
|
||||
|
@@ -133,6 +133,7 @@ extern atomic_bool doresize_monitors[MONITORS_NUM];
|
||||
extern int monitor_index_global;
|
||||
extern int gfxcard_2;
|
||||
extern int show_second_monitors;
|
||||
extern int video_fullscreen_scale_maximized;
|
||||
|
||||
typedef rgb_t PALETTE[256];
|
||||
|
||||
|
@@ -145,6 +145,7 @@ void D3D9Renderer::blit(int x, int y, int w, int h)
|
||||
return;
|
||||
}
|
||||
surfaceInUse = true;
|
||||
auto origSource = source;
|
||||
source.setRect(x, y, w, h);
|
||||
RECT srcRect;
|
||||
D3DLOCKED_RECT lockRect;
|
||||
@@ -164,6 +165,7 @@ void D3D9Renderer::blit(int x, int y, int w, int h)
|
||||
d3d9surface->UnlockRect();
|
||||
}
|
||||
else video_blit_complete_monitor(m_monitor_index);
|
||||
if (origSource != source) onResize(this->width() * devicePixelRatioF(), this->height() * devicePixelRatioF());
|
||||
surfaceInUse = false;
|
||||
QTimer::singleShot(0, this, [this] { this->update(); });
|
||||
}
|
||||
|
@@ -134,6 +134,7 @@ void HardwareRenderer::initializeGL()
|
||||
pclog("OpenGL version: %s\n", glGetString(GL_VERSION));
|
||||
pclog("OpenGL shader language version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||
glClearColor(0, 0, 0, 1);
|
||||
m_texture->setWrapMode(QOpenGLTexture::ClampToEdge);
|
||||
}
|
||||
|
||||
void HardwareRenderer::paintGL() {
|
||||
@@ -187,6 +188,7 @@ void HardwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) {
|
||||
auto tval = this;
|
||||
void* nuldata = 0;
|
||||
if (memcmp(&tval, &nuldata, sizeof(void*)) == 0) return;
|
||||
auto origSource = source;
|
||||
if (!m_texture || !m_texture->isCreated())
|
||||
{
|
||||
buf_usage[buf_idx].clear();
|
||||
@@ -197,6 +199,7 @@ void HardwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) {
|
||||
m_texture->setData(QOpenGLTexture::PixelFormat::RGBA, QOpenGLTexture::PixelType::UInt8, (const void*)imagebufs[buf_idx].get());
|
||||
buf_usage[buf_idx].clear();
|
||||
source.setRect(x, y, w, h);
|
||||
if (origSource != source) onResize(this->width(), this->height());
|
||||
update();
|
||||
}
|
||||
|
||||
|
@@ -47,6 +47,10 @@ public:
|
||||
void resizeGL(int w, int h) override;
|
||||
void initializeGL() override;
|
||||
void paintGL() override;
|
||||
void exposeEvent(QExposeEvent* event) override
|
||||
{
|
||||
onResize(size().width(), size().height());
|
||||
}
|
||||
std::vector<std::tuple<uint8_t*, std::atomic_flag*>> getBuffers() override;
|
||||
HardwareRenderer(QWidget* parent = nullptr, RenderType rtype = RenderType::OpenGL)
|
||||
: QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, parent->windowHandle()), QOpenGLFunctions()
|
||||
|
@@ -133,6 +133,8 @@ std::atomic<bool> blitDummied{false};
|
||||
extern void qt_mouse_capture(int);
|
||||
extern "C" void qt_blit(int x, int y, int w, int h, int monitor_index);
|
||||
|
||||
extern MainWindow* main_window;
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
@@ -293,6 +295,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
ui->actionShow_non_primary_monitors->setChecked(show_second_monitors);
|
||||
ui->actionUpdate_status_bar_icons->setChecked(update_icons);
|
||||
ui->actionEnable_Discord_integration->setChecked(enable_discord);
|
||||
ui->actionApply_fullscreen_stretch_mode_when_maximized->setChecked(video_fullscreen_scale_maximized);
|
||||
|
||||
#if defined Q_OS_WINDOWS || defined Q_OS_MACOS
|
||||
/* Make the option visible only if ANGLE is loaded. */
|
||||
@@ -1773,11 +1776,15 @@ static void update_fullscreen_scale_checkboxes(Ui::MainWindow* ui, QAction* sele
|
||||
ui->actionFullScreen_keepRatio->setChecked(ui->actionFullScreen_keepRatio == selected);
|
||||
ui->actionFullScreen_int->setChecked(ui->actionFullScreen_int == selected);
|
||||
|
||||
if (video_fullscreen > 0) {
|
||||
{
|
||||
auto widget = ui->stackedWidget->currentWidget();
|
||||
ui->stackedWidget->onResize(widget->width(), widget->height());
|
||||
}
|
||||
|
||||
for (int i = 1; i < MONITORS_NUM; i++) {
|
||||
if (main_window->renderers[i]) main_window->renderers[i]->onResize(main_window->renderers[i]->width(), main_window->renderers[i]->height());
|
||||
}
|
||||
|
||||
device_force_redraw();
|
||||
config_save();
|
||||
}
|
||||
@@ -2130,3 +2137,19 @@ void MainWindow::on_actionOpen_screenshots_folder_triggered()
|
||||
QDesktopServices::openUrl(QUrl(QString("file:///") + usr_path + QString("/screenshots/")));
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionApply_fullscreen_stretch_mode_when_maximized_triggered(bool checked)
|
||||
{
|
||||
video_fullscreen_scale_maximized = checked;
|
||||
|
||||
auto widget = ui->stackedWidget->currentWidget();
|
||||
ui->stackedWidget->onResize(widget->width(), widget->height());
|
||||
|
||||
for (int i = 1; i < MONITORS_NUM; i++) {
|
||||
if (renderers[i]) renderers[i]->onResize(renderers[i]->width(), renderers[i]->height());
|
||||
}
|
||||
|
||||
device_force_redraw();
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,8 @@ public:
|
||||
void blitToWidget(int x, int y, int w, int h, int monitor_index);
|
||||
QSize getRenderWidgetSize();
|
||||
void setSendKeyboardInput(bool enabled);
|
||||
|
||||
std::array<std::unique_ptr<RendererStack>, 8> renderers;
|
||||
signals:
|
||||
void paint(const QImage& image);
|
||||
void resizeContents(int w, int h);
|
||||
@@ -131,10 +133,11 @@ private slots:
|
||||
|
||||
void on_actionOpen_screenshots_folder_triggered();
|
||||
|
||||
void on_actionApply_fullscreen_stretch_mode_when_maximized_triggered(bool checked);
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
std::unique_ptr<MachineStatus> status;
|
||||
std::array<std::unique_ptr<RendererStack>, 8> renderers;
|
||||
std::shared_ptr<MediaMenu> mm;
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
|
@@ -179,6 +179,7 @@
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFullscreen"/>
|
||||
<addaction name="menuFullscreen_stretch_mode"/>
|
||||
<addaction name="actionApply_fullscreen_stretch_mode_when_maximized"/>
|
||||
<addaction name="menuEGA_S_VGA_settings"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCGA_PCjr_Tandy_EGA_S_VGA_overscan"/>
|
||||
@@ -785,6 +786,14 @@
|
||||
<string>Open screenshots folder...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionApply_fullscreen_stretch_mode_when_maximized">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Apply fullscreen stretch mode when maximized</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
|
@@ -80,6 +80,8 @@ OpenGLRenderer::exposeEvent(QExposeEvent *event)
|
||||
|
||||
if (!isInitialized)
|
||||
initialize();
|
||||
|
||||
onResize(size().width(), size().height());
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -47,7 +47,7 @@ static void integer_scale(double *d, double *g) {
|
||||
}
|
||||
|
||||
void RendererCommon::onResize(int width, int height) {
|
||||
if (video_fullscreen == 0) {
|
||||
if (video_fullscreen == 0 && video_fullscreen_scale_maximized ? (parentWidget->isMaximized() == false && (main_window->isAncestorOf(parentWidget) && main_window->isMaximized() == false)) : 1) {
|
||||
destination.setRect(0, 0, width, height);
|
||||
return;
|
||||
}
|
||||
|
@@ -37,7 +37,7 @@ public:
|
||||
protected:
|
||||
bool eventDelegate(QEvent *event, bool &result);
|
||||
|
||||
QRect source, destination;
|
||||
QRect source{0, 0, 0, 0}, destination;
|
||||
QWidget *parentWidget { nullptr };
|
||||
|
||||
std::vector<std::atomic_flag> buf_usage;
|
||||
|
@@ -397,6 +397,7 @@ RendererStack::createRenderer(Renderer renderer)
|
||||
if (current.get() == nullptr) return;
|
||||
current->setFocusPolicy(Qt::NoFocus);
|
||||
current->setFocusProxy(this);
|
||||
current->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
addWidget(current.get());
|
||||
|
||||
this->setStyleSheet("background-color: black");
|
||||
|
@@ -32,6 +32,10 @@ public:
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override
|
||||
{
|
||||
onResize(event->size().width(), event->size().height());
|
||||
}
|
||||
void keyPressEvent(QKeyEvent *event) override
|
||||
{
|
||||
event->ignore();
|
||||
|
@@ -57,11 +57,14 @@ void SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) {
|
||||
auto tval = this;
|
||||
void* nuldata = 0;
|
||||
if (memcmp(&tval, &nuldata, sizeof(void*)) == 0) return;
|
||||
auto origSource = source;
|
||||
|
||||
cur_image = buf_idx;
|
||||
buf_usage[(buf_idx + 1) % 2].clear();
|
||||
|
||||
source.setRect(x, y, w, h);
|
||||
|
||||
if (source != origSource) onResize(this->width(), this->height());
|
||||
update();
|
||||
}
|
||||
|
||||
|
@@ -836,9 +836,11 @@ bool VulkanWindowRenderer::event(QEvent *event)
|
||||
|
||||
void VulkanWindowRenderer::onBlit(int buf_idx, int x, int y, int w, int h)
|
||||
{
|
||||
auto origSource = source;
|
||||
source.setRect(x, y, w, h);
|
||||
if (isExposed()) requestUpdate();
|
||||
buf_usage[0].clear();
|
||||
if (origSource != source) onResize(this->width(), this->height());
|
||||
}
|
||||
|
||||
uint32_t VulkanWindowRenderer::getBytesPerRow()
|
||||
|
Reference in New Issue
Block a user