Skip to content

Commit

Permalink
WIP: Use KWayland to set window geometry
Browse files Browse the repository at this point in the history
  • Loading branch information
hluk committed Sep 26, 2024
1 parent a80d186 commit f4d48d0
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/gui/windowgeometryguard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,18 @@ bool WindowGeometryGuard::eventFilter(QObject *, QEvent *event)
}

case QEvent::Move:
case QEvent::Resize:
case QEvent::Resize: {
if ( !isWindowGeometryLocked() && m_window->isVisible() )
m_timerSaveGeometry.start();

QWindow *w = m_window->windowHandle();
if (w) {
const QRect newGeometry = m_window->geometry();
auto platform = platformNativeInterface();
platform->setWindowGeometry(w, newGeometry);
}
break;
}

case QEvent::Hide:
if ( isGeometryGuardBlockedUntilHidden(m_window) )
Expand Down
5 changes: 5 additions & 0 deletions src/platform/dummy/dummyplatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,8 @@ QStringList DummyPlatform::getCommandLineArguments(int argc, char **argv)

return arguments;
}

void DummyPlatform::setWindowGeometry(QWindow *window, const QRect &windowGeometry)
{
window->setGeometry(windowGeometry);
}
2 changes: 2 additions & 0 deletions src/platform/dummy/dummyplatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ class DummyPlatform : public PlatformNativeInterface
QString translationPrefix() override;

QString themePrefix() override { return QString(); }

void setWindowGeometry(QWindow *window, const QRect &windowGeometry) override;
};

#endif // DUMMYPLATFORM_H
2 changes: 2 additions & 0 deletions src/platform/platformnativeinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ class PlatformNativeInterface
*/
virtual QString themePrefix() = 0;

virtual void setWindowGeometry(QWindow *window, const QRect &windowGeometry) = 0;

PlatformNativeInterface(const PlatformNativeInterface &) = delete;
PlatformNativeInterface &operator=(const PlatformNativeInterface &) = delete;
};
Expand Down
3 changes: 3 additions & 0 deletions src/platform/x11/x11platform.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,6 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/platform/x11/systemclipboard)
add_subdirectory(platform/x11/systemclipboard)
set_target_properties(systemclipboard PROPERTIES COMPILE_FLAGS "-Wno-old-style-cast")
list(APPEND copyq_LIBRARIES systemclipboard)

find_package(KWayland REQUIRED)

Check failure on line 55 in src/platform/x11/x11platform.cmake

View workflow job for this annotation

GitHub Actions / Qt 6

By not providing "FindKWayland.cmake" in CMAKE_MODULE_PATH this project has
list(APPEND copyq_LIBRARIES Plasma::KWaylandClient)
50 changes: 50 additions & 0 deletions src/platform/x11/x11platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
#include <QStringList>
#include <QVariant>
#include <QWidget>
#include <QThread>

#include <KWayland/Client/connection_thread.h>
#include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
#include <KWayland/Client/xdgshell.h>

#include "x11platformclipboard.h"

Expand Down Expand Up @@ -320,6 +326,50 @@ QString X11Platform::translationPrefix()
return QString();
}


void X11Platform::setWindowGeometry(QWindow *window, const QRect &windowGeometry)
{
using namespace KWayland::Client;

XdgShellSurface *xdgSurface = window->findChild<XdgShellSurface*>();

if (!xdgSurface) {
if (!m_registry) {
ConnectionThread *connection = new ConnectionThread;
QThread *thread = new QThread;
connection->moveToThread(thread);
thread->start();

QObject::connect(connection, &ConnectionThread::connected, [connection] {
qDebug() << "Successfully connected to Wayland server at socket:" << connection->socketName();
});
QObject::connect(connection, &ConnectionThread::failed, [connection] {
qDebug() << "Failed to connect to Wayland server at socket:" << connection->socketName();
});
connection->initConnection();

qDebug() << "Creating registry";
m_registry = new Registry();
m_registry->create(connection);
m_registry->setup();
}

if (!m_xdgShell) {
const auto interface = m_registry->interface(Registry::Interface::XdgShellUnstableV5);
if (interface.name == 0 && interface.version == 0) {
qDebug() << "XdgShellUnstableV5 interface has not been announced";
return;
}
m_xdgShell = m_registry->createXdgShell(interface.name, interface.version);
}

Surface *surface = Surface::fromWindow(window);
xdgSurface = m_xdgShell->createSurface(surface, window);
}

xdgSurface->setWindowGeometry(windowGeometry);
}

#ifdef COPYQ_WITH_X11
void sendDummyX11Event()
{
Expand Down
11 changes: 11 additions & 0 deletions src/platform/x11/x11platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
#include <QKeyEvent>
#include <QString>

namespace KWayland::Client {
class Registry;
class XdgShell;
}

class X11Platform final : public PlatformNativeInterface
{
public:
Expand Down Expand Up @@ -60,6 +65,12 @@ class X11Platform final : public PlatformNativeInterface
QString translationPrefix() override;

QString themePrefix() override { return QString(); }

void setWindowGeometry(QWindow *window, const QRect &windowGeometry) override;

private:
KWayland::Client::Registry *m_registry = nullptr;
KWayland::Client::XdgShell *m_xdgShell = nullptr;
};

#ifdef COPYQ_WITH_X11
Expand Down

0 comments on commit f4d48d0

Please sign in to comment.