Use change signals on Window interface class.
QWaylandLayerSurface pulled data from the Window on startup. The Window pushed data into the QWaylandLayerSurface on changes. Having two patterns is a sign of something being off. This moves everything to a single design, pulling from the public interface. This allows us to drop a code path that meddles with QWaylandWindow internals.
This commit is contained in:
		
							parent
							
								
									13961ef7b9
								
							
						
					
					
						commit
						7bd63669ea
					
				
					 3 changed files with 33 additions and 41 deletions
				
			
		| 
						 | 
				
			
			@ -5,10 +5,9 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
#include "window.h"
 | 
			
		||||
#include "../qwaylandlayersurface_p.h"
 | 
			
		||||
#include <layershellqt_logging.h>
 | 
			
		||||
#include <private/qwaylandshellsurface_p.h>
 | 
			
		||||
#include <private/qwaylandwindow_p.h>
 | 
			
		||||
 | 
			
		||||
#include <QPointer>
 | 
			
		||||
 | 
			
		||||
using namespace LayerShellQt;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +26,6 @@ public:
 | 
			
		|||
    Window::KeyboardInteractivity keyboardInteractivity = Window::KeyboardInteractivityExclusive;
 | 
			
		||||
    Window::Layer layer = Window::LayerTop;
 | 
			
		||||
    QMargins margins;
 | 
			
		||||
    QWaylandLayerSurface *getSurface() const;
 | 
			
		||||
    QPointer<QScreen> desiredOutput;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,9 +39,7 @@ Window::~Window()
 | 
			
		|||
void Window::setAnchors(Anchors anchors)
 | 
			
		||||
{
 | 
			
		||||
    d->anchors = anchors;
 | 
			
		||||
    if (auto surface = d->getSurface()) {
 | 
			
		||||
        surface->setAnchor(anchors);
 | 
			
		||||
    }
 | 
			
		||||
    Q_EMIT anchorsChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Window::Anchors Window::anchors() const
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +50,7 @@ Window::Anchors Window::anchors() const
 | 
			
		|||
void Window::setExclusiveZone(int32_t zone)
 | 
			
		||||
{
 | 
			
		||||
    d->exclusionZone = zone;
 | 
			
		||||
    if (auto surface = d->getSurface()) {
 | 
			
		||||
        surface->setExclusiveZone(zone);
 | 
			
		||||
    }
 | 
			
		||||
    Q_EMIT exclusionZoneChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t Window::exclusionZone() const
 | 
			
		||||
| 
						 | 
				
			
			@ -67,9 +61,7 @@ int32_t Window::exclusionZone() const
 | 
			
		|||
void Window::setMargins(const QMargins &margins)
 | 
			
		||||
{
 | 
			
		||||
    d->margins = margins;
 | 
			
		||||
    if (auto surface = d->getSurface()) {
 | 
			
		||||
        surface->setMargins(margins);
 | 
			
		||||
    }
 | 
			
		||||
    Q_EMIT marginsChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QMargins Window::margins() const
 | 
			
		||||
| 
						 | 
				
			
			@ -80,9 +72,7 @@ QMargins Window::margins() const
 | 
			
		|||
void Window::setKeyboardInteractivity(KeyboardInteractivity interactivity)
 | 
			
		||||
{
 | 
			
		||||
    d->keyboardInteractivity = interactivity;
 | 
			
		||||
    if (auto surface = d->getSurface()) {
 | 
			
		||||
        surface->setKeyboardInteractivity(interactivity);
 | 
			
		||||
    }
 | 
			
		||||
    Q_EMIT keyboardInteractivityChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Window::KeyboardInteractivity Window::keyboardInteractivity() const
 | 
			
		||||
| 
						 | 
				
			
			@ -93,9 +83,6 @@ 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)
 | 
			
		||||
| 
						 | 
				
			
			@ -139,21 +126,3 @@ 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,6 +93,13 @@ 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,15 +36,31 @@ QWaylandLayerSurface::QWaylandLayerSurface(QWaylandLayerShell *shell, QtWaylandC
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    init(shell->get_layer_surface(window->waylandSurface()->object(), output, interface->layer(), interface->scope()));
 | 
			
		||||
 | 
			
		||||
    Window::Anchors anchors = interface->anchors();
 | 
			
		||||
    connect(interface, &Window::layerChanged, this, [this, interface]() {
 | 
			
		||||
        setLayer(interface->layer());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    set_anchor(interface->anchors());
 | 
			
		||||
    setMargins(interface->margins());
 | 
			
		||||
    setKeyboardInteractivity(interface->keyboardInteractivity());
 | 
			
		||||
    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());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    QSize size = window->surfaceSize();
 | 
			
		||||
    const Window::Anchors anchors = interface->anchors();
 | 
			
		||||
    if ((anchors & Window::AnchorLeft) && (anchors & Window::AnchorRight)) {
 | 
			
		||||
        size.setWidth(0);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue