mirror of
https://invent.kde.org/plasma/layer-shell-qt.git
synced 2025-07-14 02:54:31 -04:00
Compare commits
9 Commits
work/david
...
v5.25.5
Author | SHA1 | Date | |
---|---|---|---|
6ef7c56df3 | |||
90569f5e67 | |||
ab09e56d72 | |||
424005733c | |||
6e27a6ab42 | |||
f001835a16 | |||
1b5a182e2e | |||
84b68ca1dd | |||
9573abb542 |
@ -4,7 +4,7 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(layershellqt)
|
||||
set(PROJECT_VERSION "5.25.80")
|
||||
set(PROJECT_VERSION "5.25.5")
|
||||
set(PROJECT_VERSION_MAJOR 5)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#include "window.h"
|
||||
#include "../qwaylandlayersurface_p.h"
|
||||
#include "../qwaylandlayershellintegration_p.h"
|
||||
#include <layershellqt_logging.h>
|
||||
#include <private/qwaylandshellsurface_p.h>
|
||||
#include <private/qwaylandwindow_p.h>
|
||||
@ -28,6 +27,7 @@ public:
|
||||
Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityExclusive;
|
||||
Window::Layer layer = Window::LayerTop;
|
||||
QMargins margins;
|
||||
QWaylandLayerSurface *getSurface() const;
|
||||
QPointer<QScreen> desiredOutput;
|
||||
};
|
||||
|
||||
@ -41,7 +41,9 @@ Window::~Window()
|
||||
void Window::setAnchors(Anchors anchors)
|
||||
{
|
||||
d->anchors = anchors;
|
||||
Q_EMIT anchorsChanged();
|
||||
if (auto surface = d->getSurface()) {
|
||||
surface->setAnchor(anchors);
|
||||
}
|
||||
}
|
||||
|
||||
Window::Anchors Window::anchors() const
|
||||
@ -52,7 +54,9 @@ Window::Anchors Window::anchors() const
|
||||
void Window::setExclusiveZone(int32_t zone)
|
||||
{
|
||||
d->exclusionZone = zone;
|
||||
Q_EMIT exclusionZoneChanged();
|
||||
if (auto surface = d->getSurface()) {
|
||||
surface->setExclusiveZone(zone);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t Window::exclusionZone() const
|
||||
@ -63,7 +67,9 @@ int32_t Window::exclusionZone() const
|
||||
void Window::setMargins(const QMargins &margins)
|
||||
{
|
||||
d->margins = margins;
|
||||
Q_EMIT marginsChanged();
|
||||
if (auto surface = d->getSurface()) {
|
||||
surface->setMargins(margins);
|
||||
}
|
||||
}
|
||||
|
||||
QMargins Window::margins() const
|
||||
@ -74,7 +80,9 @@ QMargins Window::margins() const
|
||||
void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity)
|
||||
{
|
||||
d->keyboardInteractivity = interactivity;
|
||||
Q_EMIT keyboardInteractivityChanged();
|
||||
if (auto surface = d->getSurface()) {
|
||||
surface->setKeyboardInteractivity(interactivity);
|
||||
}
|
||||
}
|
||||
|
||||
Window::KeyboardInteractivity Window::keyboardInteractivity() const
|
||||
@ -85,6 +93,9 @@ Window::KeyboardInteractivity Window::keyboardInteractivity() const
|
||||
void Window::setLayer(Layer layer)
|
||||
{
|
||||
d->layer = layer;
|
||||
if (auto surface = d->getSurface()) {
|
||||
surface->setLayer(layer);
|
||||
}
|
||||
}
|
||||
|
||||
void Window::setScope(const QString &scope)
|
||||
@ -118,23 +129,6 @@ Window::Window(QWindow *window)
|
||||
, d(new WindowPrivate(window))
|
||||
{
|
||||
s_map.insert(d->parentWindow, this);
|
||||
|
||||
//BEGIN Compat mode
|
||||
window->winId();
|
||||
window->setFlag(Qt::BypassWindowManagerHint);
|
||||
|
||||
auto ww = dynamic_cast<QtWaylandClient::QWaylandWindow *>(d->parentWindow->handle());
|
||||
if (!ww) {
|
||||
qCDebug(LAYERSHELLQT) << "window not a wayland window" << d->parentWindow;
|
||||
return;
|
||||
}
|
||||
QWaylandLayerShellIntegration shellIntegration;
|
||||
shellIntegration.initialize(ww->display());
|
||||
shellIntegration.createShellSurface(ww);
|
||||
// we can't block for configure events
|
||||
// a round trip should mean we'll have one by the time we attach the buffer
|
||||
ww->display()->forceRoundTrip();
|
||||
//END compat mode
|
||||
}
|
||||
|
||||
Window *Window::get(QWindow *window)
|
||||
@ -145,3 +139,21 @@ Window *Window::get(QWindow *window)
|
||||
}
|
||||
return new Window(window);
|
||||
}
|
||||
|
||||
QWaylandLayerSurface *WindowPrivate::getSurface() const
|
||||
{
|
||||
if (!parentWindow) {
|
||||
return nullptr;
|
||||
}
|
||||
auto ww = dynamic_cast<QtWaylandClient::QWaylandWindow *>(parentWindow->handle());
|
||||
if (!ww) {
|
||||
qCDebug(LAYERSHELLQT) << "window not a wayland window" << parentWindow;
|
||||
return nullptr;
|
||||
}
|
||||
QWaylandLayerSurface *s = qobject_cast<QWaylandLayerSurface *>(ww->shellSurface());
|
||||
if (!s) {
|
||||
qCDebug(LAYERSHELLQT) << "window not using wlr-layer-shell" << parentWindow << ww->shellSurface();
|
||||
return nullptr;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
@ -93,13 +93,6 @@ public:
|
||||
*/
|
||||
static Window *get(QWindow *window);
|
||||
|
||||
Q_SIGNALS:
|
||||
void anchorsChanged();
|
||||
void exclusionZoneChanged();
|
||||
void marginsChanged();
|
||||
void keyboardInteractivityChanged();
|
||||
void layerChanged();
|
||||
|
||||
private:
|
||||
Window(QWindow *window);
|
||||
QScopedPointer<WindowPrivate> d;
|
||||
|
@ -36,31 +36,15 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShell *shell, QtWaylandC
|
||||
}
|
||||
}
|
||||
init(shell->get_layer_surface(window->waylandSurface()->object(), output, interface->layer(), interface->scope()));
|
||||
connect(interface, &Window::layerChanged, this, [this, interface]() {
|
||||
set_layer(interface->layer());
|
||||
});
|
||||
|
||||
Window::Anchors anchors = interface->anchors();
|
||||
|
||||
set_anchor(interface->anchors());
|
||||
connect(interface, &Window::anchorsChanged, this, [this, interface]() {
|
||||
set_anchor(interface->anchors());
|
||||
});
|
||||
setExclusiveZone(interface->exclusionZone());
|
||||
connect(interface, &Window::exclusionZoneChanged, this, [this, interface]() {
|
||||
setExclusiveZone(interface->exclusionZone());
|
||||
});
|
||||
|
||||
setMargins(interface->margins());
|
||||
connect(interface, &Window::marginsChanged, this, [this, interface]() {
|
||||
setMargins(interface->margins());
|
||||
});
|
||||
|
||||
setKeyboardInteractivity(interface->keyboardInteractivity());
|
||||
connect(interface, &Window::keyboardInteractivityChanged, this, [this, interface]() {
|
||||
setKeyboardInteractivity(interface->keyboardInteractivity());
|
||||
});
|
||||
setExclusiveZone(interface->exclusionZone());
|
||||
|
||||
QSize size = window->surfaceSize();
|
||||
const Window::Anchors anchors = interface->anchors();
|
||||
if ((anchors & Window::AnchorLeft) && (anchors & Window::AnchorRight)) {
|
||||
size.setWidth(0);
|
||||
}
|
||||
|
@ -51,8 +51,7 @@ class BasicWindow : public QRasterWindow
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
// Shell::useLayerShell();
|
||||
qputenv("QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT", "1");
|
||||
Shell::useLayerShell();
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
|
Reference in New Issue
Block a user