Qt: Adapt to 6.8 changes for Wayland.

Remove parent stackwidget. Don't set native properties for the render,
widget because they apply to the main window instead. Subsurfaces
don't need that anyway.
This commit is contained in:
BearOso 2024-12-06 14:58:22 -06:00
parent fd05ca7df5
commit a7d59843da
9 changed files with 37 additions and 60 deletions

View File

@ -3,8 +3,8 @@
#include <qnamespace.h>
#include <qwidget.h>
EmuCanvas::EmuCanvas(EmuConfig *config, QWidget *parent, QWidget *main_window)
: QWidget(parent)
EmuCanvas::EmuCanvas(EmuConfig *config, QWidget *main_window)
: config(config), main_window(main_window)
{
setFocus();
setFocusPolicy(Qt::StrongFocus);
@ -12,9 +12,6 @@ EmuCanvas::EmuCanvas(EmuConfig *config, QWidget *parent, QWidget *main_window)
output_data.buffer = nullptr;
output_data.ready = false;
this->config = config;
this->parent = parent;
this->main_window = main_window;
}
EmuCanvas::~EmuCanvas()

View File

@ -8,7 +8,7 @@ class EmuConfig;
class EmuCanvas : public QWidget
{
public:
EmuCanvas(EmuConfig *config, QWidget *parent, QWidget *main_window);
EmuCanvas(EmuConfig *config, QWidget *main_window);
~EmuCanvas();
virtual void deinit() = 0;
@ -71,7 +71,6 @@ class EmuCanvas : public QWidget
double frame_rate;
} output_data;
QWidget *parent{};
QWidget *main_window{};
EmuConfig *config{};
Throttle throttle_object;

View File

@ -46,12 +46,19 @@ void main()
}
)";
EmuCanvasOpenGL::EmuCanvasOpenGL(EmuConfig *config, QWidget *parent, QWidget *main_window)
: EmuCanvas(config, parent, main_window)
EmuCanvasOpenGL::EmuCanvasOpenGL(EmuConfig *config, QWidget *main_window)
: EmuCanvas(config, main_window)
{
setMinimumSize(256 / devicePixelRatioF(), 224 / devicePixelRatioF());
setUpdatesEnabled(false);
setAutoFillBackground(false);
if (QGuiApplication::platformName() == "wayland")
{
main_window->createWinId();
return;
}
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_NativeWindow, true);
setAttribute(Qt::WA_PaintOnScreen, true);
@ -133,12 +140,12 @@ bool EmuCanvasOpenGL::createContext()
#ifndef _WIN32
if (platform == "wayland")
{
auto display = (wl_display *)pni->nativeResourceForWindow("display", windowHandle());
auto display = (wl_display *)pni->nativeResourceForWindow("display", main_window->windowHandle());
auto surface = (wl_surface *)pni->nativeResourceForWindow("surface", main_window->windowHandle());
auto wayland_egl_context = new WaylandEGLContext();
int s = devicePixelRatio();
if (!wayland_egl_context->attach(display, surface, { parent->x() - main_window->x(), parent->y() - main_window->y(), parent->width(), parent->height(), s }))
if (!wayland_egl_context->attach(display, surface, { x() - main_window->x(), y() - main_window->y(), width(), height(), s }))
{
printf("Couldn't attach context to wayland surface.\n");
context.reset();
@ -306,12 +313,11 @@ void EmuCanvasOpenGL::resizeEvent(QResizeEvent *event)
if (!context)
return;
auto g = parent->geometry();
int s = devicePixelRatio();
auto platform = QGuiApplication::platformName();
#ifndef _WIN32
if (QGuiApplication::platformName() == "wayland")
((WaylandEGLContext *)context.get())->resize({ g.x() - main_window->x(), g.y() - main_window->y(), g.width(), g.height(), s });
((WaylandEGLContext *)context.get())->resize({ x() - main_window->x(), y() - main_window->y(), width(), height(), s });
else if (platform == "xcb")
((GTKGLXContext *)context.get())->resize();
#else

View File

@ -11,7 +11,7 @@ class GLSLShader;
class EmuCanvasOpenGL : public EmuCanvas
{
public:
EmuCanvasOpenGL(EmuConfig *config, QWidget *parent, QWidget *main_window);
EmuCanvasOpenGL(EmuConfig *config, QWidget *main_window);
~EmuCanvasOpenGL();
bool createContext() override;

View File

@ -5,8 +5,8 @@
#include <QtEvents>
#include <QThread>
EmuCanvasQt::EmuCanvasQt(EmuConfig *config, QWidget *parent, QWidget *main_window)
: EmuCanvas(config, parent, main_window)
EmuCanvasQt::EmuCanvasQt(EmuConfig *config, QWidget *main_window)
: EmuCanvas(config, main_window)
{
setMinimumSize(256 / devicePixelRatioF(), 224 / devicePixelRatioF());
}

View File

@ -9,7 +9,7 @@
class EmuCanvasQt : public EmuCanvas
{
public:
EmuCanvasQt(EmuConfig *config, QWidget *parent, QWidget *main_window);
EmuCanvasQt(EmuConfig *config, QWidget *main_window);
~EmuCanvasQt();
virtual void deinit() override;

View File

@ -11,12 +11,20 @@
using namespace QNativeInterface;
EmuCanvasVulkan::EmuCanvasVulkan(EmuConfig *config, QWidget *parent, QWidget *main_window)
: EmuCanvas(config, parent, main_window)
EmuCanvasVulkan::EmuCanvasVulkan(EmuConfig *config, QWidget *main_window)
: EmuCanvas(config, main_window)
{
setMinimumSize(256 / devicePixelRatioF(), 224 / devicePixelRatioF());
setUpdatesEnabled(false);
setAutoFillBackground(false);
if (QGuiApplication::platformName() == "wayland")
{
main_window->createWinId();
window = main_window->windowHandle();
return;
}
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_NativeWindow, true);
setAttribute(Qt::WA_PaintOnScreen, true);
@ -102,7 +110,7 @@ bool EmuCanvasVulkan::createContext()
wayland_surface = std::make_unique<WaylandSurface>();
auto display = (wl_display *)pni->nativeResourceForWindow("display", window);
auto surface = (wl_surface *)pni->nativeResourceForWindow("surface", main_window->windowHandle());
wayland_surface->attach(display, surface, { parent->x() - main_window->x(), parent->y() - main_window->y(), width(), height(), static_cast<int>(devicePixelRatio()) });
wayland_surface->attach(display, surface, { x() - main_window->x(), y() - main_window->y(), width(), height(), static_cast<int>(devicePixelRatio()) });
auto [scaled_width, scaled_height] = wayland_surface->get_size();
context->swapchain->set_desired_size(scaled_width, scaled_height);
@ -215,6 +223,7 @@ void EmuCanvasVulkan::draw()
if (retval)
{
throttle();
context->swapchain->set_vsync(config->enable_vsync);
context->swapchain->swap();
if (config->reduce_input_lag)
{
@ -236,8 +245,8 @@ void EmuCanvasVulkan::resizeEvent(QResizeEvent *event)
if (platform == "wayland")
{
WaylandSurface::Metrics m = {
parent->x() - main_window->x(),
parent->y() - main_window->y(),
this->x() - main_window->x(),
this->y() - main_window->y(),
event->size().width(),
event->size().height(),
(int)devicePixelRatio()

View File

@ -13,7 +13,7 @@
class EmuCanvasVulkan : public EmuCanvas
{
public:
EmuCanvasVulkan(EmuConfig *config, QWidget *parent, QWidget *main_window);
EmuCanvasVulkan(EmuConfig *config, QWidget *main_window);
~EmuCanvasVulkan();
bool createContext() override;

View File

@ -114,43 +114,9 @@ bool EmuMainWindow::createCanvas()
app->config->display_driver != "qt")
app->config->display_driver = "qt";
#ifndef _WIN32
if (QGuiApplication::platformName() == "wayland" && app->config->display_driver != "qt")
{
auto central_widget = new QStackedWidget();
setVisible(true);
QGuiApplication::processEvents();
if (app->config->display_driver == "vulkan")
{
canvas = new EmuCanvasVulkan(app->config.get(), central_widget, this);
QGuiApplication::processEvents();
if (!canvas->createContext())
{
delete canvas;
return fallback();
}
}
else if (app->config->display_driver == "opengl")
{
canvas = new EmuCanvasOpenGL(app->config.get(), central_widget, this);
QGuiApplication::processEvents();
app->emu_thread->runOnThread([&] { canvas->createContext(); }, true);
}
central_widget->addWidget(canvas);
central_widget->setCurrentWidget(canvas);
setCentralWidget(central_widget);
using_stacked_widget = true;
QGuiApplication::processEvents();
return true;
}
#endif
if (app->config->display_driver == "vulkan")
{
canvas = new EmuCanvasVulkan(app->config.get(), this, this);
canvas = new EmuCanvasVulkan(app->config.get(), this);
QGuiApplication::processEvents();
if (!canvas->createContext())
{
@ -160,12 +126,12 @@ bool EmuMainWindow::createCanvas()
}
else if (app->config->display_driver == "opengl")
{
canvas = new EmuCanvasOpenGL(app->config.get(), this, this);
canvas = new EmuCanvasOpenGL(app->config.get(), this);
QGuiApplication::processEvents();
app->emu_thread->runOnThread([&] { canvas->createContext(); }, true);
}
else
canvas = new EmuCanvasQt(app->config.get(), this, this);
canvas = new EmuCanvasQt(app->config.get(), this);
setCentralWidget(canvas);
using_stacked_widget = false;