fix: migrate X11 integration to Qt6

main
reionwong 3 weeks ago
parent 0029fc40d1
commit 9591382350

@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.16)
project(cutefish-qt-plugins)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/compat")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

@ -1,47 +0,0 @@
/* Qt 6 compatibility layer for the legacy QX11Info API. */
#ifndef CUTEFISH_QX11INFO_COMPAT
#define CUTEFISH_QX11INFO_COMPAT
#include <QGuiApplication>
#include <QtGui/qguiapplication_platform.h>
#include <xcb/xcb.h>
class QX11Info
{
public:
static bool isPlatformX11()
{
return nativeInterface() != nullptr;
}
static xcb_connection_t *connection()
{
const auto native = nativeInterface();
return native ? native->connection() : nullptr;
}
static Display *display()
{
const auto native = nativeInterface();
return native ? native->display() : nullptr;
}
static xcb_window_t appRootWindow()
{
xcb_connection_t *c = connection();
if (!c)
return XCB_WINDOW_NONE;
const xcb_setup_t *setup = xcb_get_setup(c);
const xcb_screen_iterator_t iterator = xcb_setup_roots_iterator(setup);
return iterator.data ? iterator.data->root : XCB_WINDOW_NONE;
}
private:
static QNativeInterface::QX11Application *nativeInterface()
{
return qGuiApp ? qGuiApp->nativeInterface<QNativeInterface::QX11Application>() : nullptr;
}
};
#endif

@ -19,11 +19,12 @@
* Boston, MA 02110-1301, USA.
*/
#include "x11integration.h"
#include "x11utils.h"
#include <QCoreApplication>
#include <QX11Info>
#include <QPlatformSurfaceEvent>
#include <QGuiApplication>
#include <QtGui/qguiapplication_platform.h>
#include <QWindow>
#include <QWidget>
#include <QVariant>
@ -58,7 +59,7 @@ bool X11Integration::eventFilter(QObject *watched, QEvent *event)
if (event->type() == QEvent::Show && watched->inherits("QShapedPixmapWindow")) {
//static cast should be safe there
QWindow *w = static_cast<QWindow *>(watched);
NETWinInfo info(QX11Info::connection(), w->winId(), QX11Info::appRootWindow(), NET::WMWindowType, NET::Properties2());
NETWinInfo info(qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->connection(), w->winId(), Cutefish::X11::rootWindow(), NET::WMWindowType, NET::Properties2());
info.setWindowType(NET::DNDIcon);
// TODO: does this flash the xcb connection?
}
@ -103,13 +104,13 @@ void X11Integration::installDesktopFileName(QWindow *w)
if (desktopFileName.endsWith(QLatin1String(".desktop"))) {
desktopFileName.chop(8);
}
NETWinInfo info(QX11Info::connection(), w->winId(), QX11Info::appRootWindow(), NET::Properties(), NET::Properties2());
NETWinInfo info(qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->connection(), w->winId(), Cutefish::X11::rootWindow(), NET::Properties(), NET::Properties2());
info.setDesktopFileName(desktopFileName.toUtf8().constData());
}
void X11Integration::setWindowProperty(QWindow *window, const QByteArray &name, const QByteArray &value)
{
auto *c = QX11Info::connection();
auto *c = qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->connection();
xcb_atom_t atom;
auto it = m_atoms.find(name);

@ -30,6 +30,7 @@
//////////////////////////////////////////////////////////////////////////////
#include "blurhelper.h"
#include "x11utils.h"
// KDE Frameworks
#include <KWindowEffects>
@ -43,7 +44,7 @@
#include <QEvent>
#include <QPainterPath>
#include <QApplication>
#include <QX11Info>
#include <QtGui/qguiapplication_platform.h>
// XCB
#include <xcb/xcb.h>
@ -124,7 +125,7 @@ void BlurHelper::enableBlurBehind(QWidget *widget, bool enable, qreal windowRadi
if (!widget)
return;
xcb_connection_t *c = QX11Info::connection();
xcb_connection_t *c = qGuiApp->nativeInterface<QNativeInterface::QX11Application>()->connection();
if (!c)
return;

@ -0,0 +1,21 @@
#pragma once
#include <QGuiApplication>
#include <QtGui/qguiapplication_platform.h>
#include <xcb/xcb.h>
namespace Cutefish::X11
{
inline xcb_window_t rootWindow()
{
const auto native = qGuiApp ? qGuiApp->nativeInterface<QNativeInterface::QX11Application>() : nullptr;
const auto c = native ? native->connection() : nullptr;
if (!c)
return XCB_WINDOW_NONE;
const auto *setup = xcb_get_setup(c);
const auto iterator = xcb_setup_roots_iterator(setup);
return iterator.data ? iterator.data->root : XCB_WINDOW_NONE;
}
}
Loading…
Cancel
Save