diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-05-08 14:55:14 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:09:42 +0200 |
commit | d1359f8b0c2b8fcffc2112d2e29d530ac1ab7c9a (patch) | |
tree | 0f7fdee380c657914065230d522f91a89563088e /src | |
parent | 85b1d4e6524504321fa769457eea5fb3b7e62e7e (diff) | |
download | qtwayland-d1359f8b0c2b8fcffc2112d2e29d530ac1ab7c9a.tar.gz |
Improve QWaylandExtension
By using curiously recurring template pattern we can generate a getter
which is very convenient, and all QWaylandExtensions should have this
casting operation
Change-Id: Idb5a786655f2e106cf5388b11ed71e8b6ddddec0
Diffstat (limited to 'src')
28 files changed, 96 insertions, 151 deletions
diff --git a/src/compositor/compositor_api/qwaylandinputpanel.cpp b/src/compositor/compositor_api/qwaylandinputpanel.cpp index a7fa8214..c0317c93 100644 --- a/src/compositor/compositor_api/qwaylandinputpanel.cpp +++ b/src/compositor/compositor_api/qwaylandinputpanel.cpp @@ -74,9 +74,14 @@ QRect QWaylandInputPanel::cursorRectangle() const return d->cursorRectangle(); } -QWaylandInputPanel *QWaylandInputPanel::get(QWaylandExtensionContainer *container) +const struct wl_interface *QWaylandInputPanel::interface() { - return static_cast<QWaylandInputPanel *>(container->extension(QtWaylandServer::wl_input_panel::name())); + return QWaylandInputPanelPrivate::interface(); +} + +QByteArray QWaylandInputPanel::interfaceName() +{ + return QWaylandInputPanelPrivate::interfaceName(); } QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandinputpanel.h b/src/compositor/compositor_api/qwaylandinputpanel.h index 9336b7ca..1e595336 100644 --- a/src/compositor/compositor_api/qwaylandinputpanel.h +++ b/src/compositor/compositor_api/qwaylandinputpanel.h @@ -53,7 +53,7 @@ namespace QtWayland { class InputPanel; } -class Q_COMPOSITOR_EXPORT QWaylandInputPanel : public QWaylandExtensionTemplate +class Q_COMPOSITOR_EXPORT QWaylandInputPanel : public QWaylandExtensionTemplate<QWaylandInputPanel> { Q_OBJECT Q_DECLARE_PRIVATE(QWaylandInputPanel) @@ -69,7 +69,8 @@ public: bool visible() const; QRect cursorRectangle() const; - static QWaylandInputPanel *get(QWaylandExtensionContainer *container); + static const struct wl_interface *interface(); + static QByteArray interfaceName(); Q_SIGNALS: void focusChanged(); void visibleChanged(); diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index ffa8f437..8168147d 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -169,8 +169,9 @@ void QWaylandQuickSurface::setClientRenderingEnabled(bool enabled) if (d->clientRenderingEnabled != enabled) { d->clientRenderingEnabled = enabled; - if (QWaylandExtension *extension = this->extension(QtWaylandServer::qt_extended_surface::name())) - static_cast<QtWayland::ExtendedSurface*>(extension)->setVisibility(enabled ? QWindow::AutomaticVisibility : QWindow::Hidden); + if (QtWayland::ExtendedSurface *extSurface = QtWayland::ExtendedSurface::get(this)) + extSurface->setVisibility(enabled ? QWindow::AutomaticVisibility : QWindow::Hidden); + emit clientRenderingEnabledChanged(); } } diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index 6f80f32e..8ed5db39 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -133,10 +133,6 @@ public: Origin origin() const; - QWaylandSurface *transientParent() const; - - QPointF transientOffset() const; - QtWayland::Surface *handle(); QByteArray authenticationToken() const; diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension.cpp b/src/compositor/extensions/qwaylandwindowmanagerextension.cpp index 92b0d834..80ccd02e 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension.cpp +++ b/src/compositor/extensions/qwaylandwindowmanagerextension.cpp @@ -50,7 +50,7 @@ QWaylandWindowManagerExtension::QWaylandWindowManagerExtension(QWaylandComposito } QWaylandWindowManagerExtensionPrivate::QWaylandWindowManagerExtensionPrivate(QWaylandCompositor *compositor) - : QWaylandExtensionTemplatePrivateImpl(compositor) + : QWaylandExtensionTemplatePrivate(compositor) , m_showIsFullScreen(false) , m_compositor(compositor) { @@ -75,11 +75,6 @@ void QWaylandWindowManagerExtension::sendQuitMessage(wl_client *client) d->send_quit(resource->handle); } -QWaylandWindowManagerExtension *QWaylandWindowManagerExtension::get(QWaylandExtensionContainer *container) -{ - return static_cast<QWaylandWindowManagerExtension *>(container->extension(QtWaylandServer::qt_windowmanager::interface())); -} - void QWaylandWindowManagerExtensionPrivate::windowmanager_bind_resource(Resource *resource) { send_hints(resource->handle, static_cast<int32_t>(m_showIsFullScreen)); @@ -105,4 +100,15 @@ void QWaylandWindowManagerExtensionPrivate::windowmanager_open_url(Resource *res } } +const struct wl_interface *QWaylandWindowManagerExtension::interface() +{ + return QWaylandWindowManagerExtensionPrivate::interface(); +} + +QByteArray QWaylandWindowManagerExtension::interfaceName() +{ + return QWaylandWindowManagerExtensionPrivate::interfaceName(); +} + + QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension.h b/src/compositor/extensions/qwaylandwindowmanagerextension.h index 80f71dd5..68166938 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension.h +++ b/src/compositor/extensions/qwaylandwindowmanagerextension.h @@ -52,7 +52,7 @@ class QWaylandCompositor; class QWaylandWindowManagerExtensionPrivate; -class Q_COMPOSITOR_EXPORT QWaylandWindowManagerExtension : public QWaylandExtensionTemplate +class Q_COMPOSITOR_EXPORT QWaylandWindowManagerExtension : public QWaylandExtensionTemplate<QWaylandWindowManagerExtension> { Q_OBJECT Q_DECLARE_PRIVATE(QWaylandWindowManagerExtension) @@ -62,7 +62,8 @@ public: void setShowIsFullScreen(bool value); void sendQuitMessage(wl_client *client); - static QWaylandWindowManagerExtension *get(QWaylandExtensionContainer *container); + static const struct wl_interface *interface(); + static QByteArray interfaceName(); Q_SIGNALS: void openUrl(QWaylandClient *client, const QUrl &url); }; diff --git a/src/compositor/extensions/qwaylandwindowmanagerextension_p.h b/src/compositor/extensions/qwaylandwindowmanagerextension_p.h index 94f38903..08638e5b 100644 --- a/src/compositor/extensions/qwaylandwindowmanagerextension_p.h +++ b/src/compositor/extensions/qwaylandwindowmanagerextension_p.h @@ -43,7 +43,7 @@ #include <QMap> -class Q_COMPOSITOR_EXPORT QWaylandWindowManagerExtensionPrivate : public QWaylandExtensionTemplatePrivateImpl<QtWaylandServer::qt_windowmanager> +class Q_COMPOSITOR_EXPORT QWaylandWindowManagerExtensionPrivate : public QWaylandExtensionTemplatePrivate, public QtWaylandServer::qt_windowmanager { Q_DECLARE_PUBLIC(QWaylandWindowManagerExtension) public: diff --git a/src/compositor/extensions/qwlextendedsurface.cpp b/src/compositor/extensions/qwlextendedsurface.cpp index 42c10053..c9aae421 100644 --- a/src/compositor/extensions/qwlextendedsurface.cpp +++ b/src/compositor/extensions/qwlextendedsurface.cpp @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE namespace QtWayland { SurfaceExtensionGlobal::SurfaceExtensionGlobal(Compositor *compositor) - : QWaylandExtension(compositor->waylandCompositor()) + : QWaylandExtensionTemplate(compositor->waylandCompositor()) , QtWaylandServer::qt_surface_extension(compositor->wl_display(), 1) { } @@ -57,13 +57,8 @@ void SurfaceExtensionGlobal::surface_extension_get_extended_surface(Resource *re new ExtendedSurface(resource->client(),id, wl_resource_get_version(resource->handle), surface); } -ExtendedSurface *ExtendedSurface::get(QWaylandSurface *surface) -{ - return static_cast<ExtendedSurface *>(surface->extension(qt_extended_surface::name())); -} - ExtendedSurface::ExtendedSurface(struct wl_client *client, uint32_t id, int version, Surface *surface) - : QWaylandExtension(surface->waylandSurface()) + : QWaylandExtensionTemplate(surface->waylandSurface()) , QtWaylandServer::qt_extended_surface(client, id, version) , m_surface(surface) , m_windowFlags(0) diff --git a/src/compositor/extensions/qwlextendedsurface_p.h b/src/compositor/extensions/qwlextendedsurface_p.h index 09dee024..f666c44a 100644 --- a/src/compositor/extensions/qwlextendedsurface_p.h +++ b/src/compositor/extensions/qwlextendedsurface_p.h @@ -56,13 +56,11 @@ namespace QtWayland { class Compositor; -class SurfaceExtensionGlobal : public QWaylandExtension, public QtWaylandServer::qt_surface_extension +class SurfaceExtensionGlobal : public QWaylandExtensionTemplate<SurfaceExtensionGlobal>, public QtWaylandServer::qt_surface_extension { public: SurfaceExtensionGlobal(Compositor *compositor); - const wl_interface *interface() const Q_DECL_OVERRIDE { return QtWaylandServer::qt_surface_extension::interface(); } - private: void surface_extension_get_extended_surface(Resource *resource, uint32_t id, @@ -70,7 +68,7 @@ private: }; -class Q_COMPOSITOR_EXPORT ExtendedSurface : public QWaylandExtension, public QtWaylandServer::qt_extended_surface +class Q_COMPOSITOR_EXPORT ExtendedSurface : public QWaylandExtensionTemplate<ExtendedSurface>, public QtWaylandServer::qt_extended_surface { Q_OBJECT Q_PROPERTY(Qt::ScreenOrientations contentOrientationMask READ contentOrientationMask NOTIFY contentOrientationMaskChanged) @@ -84,8 +82,6 @@ public: }; Q_DECLARE_FLAGS(WindowFlags, WindowFlag) - static ExtendedSurface *get(QWaylandSurface *surface); - ExtendedSurface(struct wl_client *client, uint32_t id, int version, Surface *surface); ~ExtendedSurface(); @@ -109,8 +105,6 @@ public: QVariant windowProperty(const QString &propertyName) const; void setWindowProperty(const QString &name, const QVariant &value); - const wl_interface *interface() const Q_DECL_OVERRIDE { return QtWaylandServer::qt_extended_surface::interface(); } - Q_SIGNALS: void contentOrientationMaskChanged(); void windowFlagsChanged(); diff --git a/src/compositor/extensions/qwlinputpanel.cpp b/src/compositor/extensions/qwlinputpanel.cpp index d1c6ab82..392a62ba 100644 --- a/src/compositor/extensions/qwlinputpanel.cpp +++ b/src/compositor/extensions/qwlinputpanel.cpp @@ -48,7 +48,8 @@ QT_BEGIN_NAMESPACE QWaylandInputPanelPrivate::QWaylandInputPanelPrivate(QtWayland::Compositor *compositor) - : QWaylandExtensionTemplatePrivateImpl(compositor->waylandCompositor()) + : QWaylandExtensionTemplatePrivate(compositor->waylandCompositor()) + , QtWaylandServer::wl_input_panel() , m_compositor(compositor) , m_focus() , m_inputPanelVisible(false) @@ -115,16 +116,16 @@ void QWaylandInputPanelPrivate::setCursorRectangle(const QRect &cursorRectangle) Q_EMIT q->cursorRectangleChanged(); } -QWaylandInputPanelPrivate *QWaylandInputPanelPrivate::get(QWaylandExtensionContainer *container) +QWaylandInputPanelPrivate *QWaylandInputPanelPrivate::get(QWaylandInputPanel *panel) { - QWaylandInputPanel *panel = static_cast<QWaylandInputPanel *>(container->extension(wl_input_panel::name())); - if (panel) - return panel->d_func(); - return Q_NULLPTR; + return panel->d_func(); } -QWaylandInputPanelPrivate *QWaylandInputPanelPrivate::get(QWaylandInputPanel *panel) +QWaylandInputPanelPrivate *QWaylandInputPanelPrivate::get(QWaylandExtensionContainer *container) { + QWaylandInputPanel *panel = QWaylandInputPanel::get(container); + if (!panel) + return Q_NULLPTR; return panel->d_func(); } diff --git a/src/compositor/extensions/qwlinputpanel_p.h b/src/compositor/extensions/qwlinputpanel_p.h index 49a14e79..1add11e1 100644 --- a/src/compositor/extensions/qwlinputpanel_p.h +++ b/src/compositor/extensions/qwlinputpanel_p.h @@ -55,7 +55,7 @@ class TextInput; } -class Q_COMPOSITOR_EXPORT QWaylandInputPanelPrivate : public QWaylandExtensionTemplatePrivateImpl<QtWaylandServer::wl_input_panel> +class Q_COMPOSITOR_EXPORT QWaylandInputPanelPrivate : public QWaylandExtensionTemplatePrivate, public QtWaylandServer::wl_input_panel { Q_DECLARE_PUBLIC(QWaylandInputPanel) public: @@ -73,8 +73,8 @@ public: QRect cursorRectangle() const; void setCursorRectangle(const QRect &cursorRectangle); - static QWaylandInputPanelPrivate *get(QWaylandExtensionContainer *container); static QWaylandInputPanelPrivate *get(QWaylandInputPanel *panel); + static QWaylandInputPanelPrivate *get(QWaylandExtensionContainer *container); protected: void input_panel_get_input_panel_surface(Resource *resource, uint32_t id, struct ::wl_resource *surface) Q_DECL_OVERRIDE; diff --git a/src/compositor/extensions/qwlqtkey.cpp b/src/compositor/extensions/qwlqtkey.cpp index b7d567a0..cc6bb7af 100644 --- a/src/compositor/extensions/qwlqtkey.cpp +++ b/src/compositor/extensions/qwlqtkey.cpp @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE namespace QtWayland { QtKeyExtensionGlobal::QtKeyExtensionGlobal(Compositor *compositor) - : QWaylandExtension(compositor->waylandCompositor()) + : QWaylandExtensionTemplate(compositor->waylandCompositor()) , QtWaylandServer::qt_key_extension(compositor->wl_display(), 2) , m_compositor(compositor) { @@ -73,11 +73,6 @@ bool QtKeyExtensionGlobal::postQtKeyEvent(QKeyEvent *event, Surface *surface) return false; } -QtKeyExtensionGlobal *QtKeyExtensionGlobal::get(QWaylandExtensionContainer *container) -{ - return static_cast<QtKeyExtensionGlobal *>(container->extension(qt_key_extension::name())); -} - } QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwlqtkey_p.h b/src/compositor/extensions/qwlqtkey_p.h index 542f6eae..fa78037d 100644 --- a/src/compositor/extensions/qwlqtkey_p.h +++ b/src/compositor/extensions/qwlqtkey_p.h @@ -51,7 +51,7 @@ class QKeyEvent; namespace QtWayland { -class QtKeyExtensionGlobal : public QWaylandExtension, public QtWaylandServer::qt_key_extension +class QtKeyExtensionGlobal : public QWaylandExtensionTemplate<QtKeyExtensionGlobal>, public QtWaylandServer::qt_key_extension { Q_OBJECT public: @@ -59,9 +59,6 @@ public: bool postQtKeyEvent(QKeyEvent *event, Surface *surface); - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return qt_key_extension::interface(); } - - static QtKeyExtensionGlobal *get(QWaylandExtensionContainer *container); private: Compositor *m_compositor; }; diff --git a/src/compositor/extensions/qwlqttouch.cpp b/src/compositor/extensions/qwlqttouch.cpp index 872bbdcb..57de3965 100644 --- a/src/compositor/extensions/qwlqttouch.cpp +++ b/src/compositor/extensions/qwlqttouch.cpp @@ -47,7 +47,7 @@ namespace QtWayland { static const int maxRawPos = 24; TouchExtensionGlobal::TouchExtensionGlobal(Compositor *compositor) - : QWaylandExtension(compositor->waylandCompositor()) + : QWaylandExtensionTemplate(compositor->waylandCompositor()) , QtWaylandServer::qt_touch_extension(compositor->wl_display(), 1) , m_compositor(compositor) , m_flags(0) @@ -151,11 +151,6 @@ void TouchExtensionGlobal::setBehviorFlags(BehaviorFlags flags) behaviorFlagsChanged(); } -TouchExtensionGlobal *TouchExtensionGlobal::get(QWaylandExtensionContainer *container) -{ - return static_cast<TouchExtensionGlobal *>(container->extension(qt_touch_extension::name())); -} - void TouchExtensionGlobal::touch_extension_bind_resource(Resource *resource) { m_resources.append(resource); diff --git a/src/compositor/extensions/qwlqttouch_p.h b/src/compositor/extensions/qwlqttouch_p.h index 94c90949..42d35433 100644 --- a/src/compositor/extensions/qwlqttouch_p.h +++ b/src/compositor/extensions/qwlqttouch_p.h @@ -50,7 +50,7 @@ class QWaylandSurfaceView; namespace QtWayland { -class TouchExtensionGlobal : public QWaylandExtension, public QtWaylandServer::qt_touch_extension +class TouchExtensionGlobal : public QWaylandExtensionTemplate<TouchExtensionGlobal>, public QtWaylandServer::qt_touch_extension { Q_OBJECT Q_PROPERTY(BehaviorFlags behaviorFlags READ behaviorFlags WRITE setBehviorFlags NOTIFY behaviorFlagsChanged) @@ -70,9 +70,6 @@ public: void setBehviorFlags(BehaviorFlags flags); BehaviorFlags behaviorFlags() const { return m_flags; } - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return QtWaylandServer::qt_touch_extension::interface(); } - - static TouchExtensionGlobal *get(QWaylandExtensionContainer *container); Q_SIGNALS: void behaviorFlagsChanged(); diff --git a/src/compositor/extensions/qwlshellsurface.cpp b/src/compositor/extensions/qwlshellsurface.cpp index 2aea23ba..da6f0662 100644 --- a/src/compositor/extensions/qwlshellsurface.cpp +++ b/src/compositor/extensions/qwlshellsurface.cpp @@ -56,16 +56,11 @@ QT_BEGIN_NAMESPACE namespace QtWayland { Shell::Shell(QWaylandCompositor *compositor) - : QWaylandExtension(compositor) + : QWaylandExtensionTemplate(compositor) , wl_shell(compositor->waylandDisplay(), 1) { } -const wl_interface *Shell::interface() const -{ - return &wl_shell_interface; -} - ShellSurfacePopupGrabber *Shell::getPopupGrabber(QWaylandInputDevice *input) { if (!m_popupGrabber.contains(input)) @@ -80,13 +75,8 @@ void Shell::shell_get_shell_surface(Resource *resource, uint32_t id, struct ::wl new ShellSurface(this, resource->client(), id, surface); } -ShellSurface *ShellSurface::get(QWaylandSurface *surface) -{ - return static_cast<ShellSurface *>(surface->extension(wl_shell_surface::name())); -} - ShellSurface::ShellSurface(Shell *shell, wl_client *client, uint32_t id, Surface *surface) - : QWaylandExtension(surface->waylandSurface()) + : QWaylandExtensionTemplate(surface->waylandSurface()) , wl_shell_surface(client, id, 1) , m_shell(shell) , m_surface(surface) diff --git a/src/compositor/extensions/qwlshellsurface_p.h b/src/compositor/extensions/qwlshellsurface_p.h index 8c1bfa71..3161fc6e 100644 --- a/src/compositor/extensions/qwlshellsurface_p.h +++ b/src/compositor/extensions/qwlshellsurface_p.h @@ -62,14 +62,12 @@ class ShellSurfaceResizeGrabber; class ShellSurfaceMoveGrabber; class ShellSurfacePopupGrabber; -class Shell : public QWaylandExtension, public QtWaylandServer::wl_shell +class Shell : public QWaylandExtensionTemplate<Shell>, public QtWaylandServer::wl_shell { Q_OBJECT public: Shell(QWaylandCompositor *compositor); - const wl_interface *interface() const Q_DECL_OVERRIDE; - ShellSurfacePopupGrabber* getPopupGrabber(QWaylandInputDevice *input); private: @@ -78,7 +76,7 @@ private: QHash<QWaylandInputDevice *, ShellSurfacePopupGrabber*> m_popupGrabber; }; -class Q_COMPOSITOR_EXPORT ShellSurface : public QWaylandExtension, public QtWaylandServer::wl_shell_surface +class Q_COMPOSITOR_EXPORT ShellSurface : public QWaylandExtensionTemplate<ShellSurface>, public QtWaylandServer::wl_shell_surface { Q_OBJECT Q_PROPERTY(SurfaceType surfaceType READ surfaceType WRITE setSurfaceType NOTIFY surfaceTypeChanged) @@ -90,8 +88,6 @@ public: Popup }; - static ShellSurface *get(QWaylandSurface *surface); - ShellSurface(Shell *shell, struct wl_client *client, uint32_t id, Surface *surface); ~ShellSurface(); void sendConfigure(uint32_t edges, int32_t width, int32_t height); @@ -111,8 +107,6 @@ public: QWaylandSurfaceView *view() { return m_view; } - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return QtWaylandServer::wl_shell_surface::interface(); } - void setSurfaceType(SurfaceType type); SurfaceType surfaceType() const; @@ -122,6 +116,7 @@ public: void setTransientParent(QWaylandSurface *parent) { m_transientParent = parent; } void setTransientOffset(const QPointF &offset) { m_transientOffset = offset; } + QPointF transientOffset() const { return m_transientOffset; } Q_SIGNALS: void surfaceTypeChanged(); diff --git a/src/compositor/extensions/qwlsubsurface.cpp b/src/compositor/extensions/qwlsubsurface.cpp index fb99fbe8..a9e6183c 100644 --- a/src/compositor/extensions/qwlsubsurface.cpp +++ b/src/compositor/extensions/qwlsubsurface.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE namespace QtWayland { SubSurfaceExtensionGlobal::SubSurfaceExtensionGlobal(QWaylandCompositor *compositor) - : QWaylandExtension(compositor) + : QWaylandExtensionTemplate(compositor) , qt_sub_surface_extension(compositor->waylandDisplay(), 1) , m_compositor(compositor) { @@ -60,7 +60,7 @@ void SubSurfaceExtensionGlobal::sub_surface_extension_get_sub_surface_aware_surf } SubSurface::SubSurface(wl_client *client, uint32_t id, QWaylandSurface *surface) - : QWaylandExtension(surface) + : QWaylandExtensionTemplate(surface) , qt_sub_surface(client, id, 1) , m_surface(surface) , m_parent(0) diff --git a/src/compositor/extensions/qwlsubsurface_p.h b/src/compositor/extensions/qwlsubsurface_p.h index 255544f7..d86b6e7e 100644 --- a/src/compositor/extensions/qwlsubsurface_p.h +++ b/src/compositor/extensions/qwlsubsurface_p.h @@ -50,20 +50,19 @@ class QWaylandSurface; namespace QtWayland { -class SubSurfaceExtensionGlobal : public QWaylandExtension, public QtWaylandServer::qt_sub_surface_extension +class SubSurfaceExtensionGlobal : public QWaylandExtensionTemplate<SubSurfaceExtensionGlobal>, public QtWaylandServer::qt_sub_surface_extension { Q_OBJECT public: SubSurfaceExtensionGlobal(QWaylandCompositor *compositor); - const struct wl_interface *interface() const { return qt_sub_surface_extension::interface(); } private: QWaylandCompositor *m_compositor; void sub_surface_extension_get_sub_surface_aware_surface(Resource *resource, uint32_t id, struct ::wl_resource *surface) Q_DECL_OVERRIDE; }; -class SubSurface : public QWaylandExtension, public QtWaylandServer::qt_sub_surface +class SubSurface : public QWaylandExtensionTemplate<SubSurface>, public QtWaylandServer::qt_sub_surface { Q_OBJECT Q_PROPERTY(SubSurface *parent READ parent WRITE setParent NOTIFY parentChanged) @@ -81,8 +80,6 @@ public: QWaylandSurface *surface() const; - const struct wl_interface *interface() const { return qt_sub_surface::interface(); } - Q_SIGNALS: void parentChanged(SubSurface *newParent, SubSurface *oldParent); diff --git a/src/compositor/extensions/qwltextinput.cpp b/src/compositor/extensions/qwltextinput.cpp index 5b5f8a6d..57dbff43 100644 --- a/src/compositor/extensions/qwltextinput.cpp +++ b/src/compositor/extensions/qwltextinput.cpp @@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE namespace QtWayland { TextInput::TextInput(QWaylandExtensionContainer *container, Compositor *compositor, struct ::wl_client *client, int id) - : QWaylandExtension(container) + : QWaylandExtensionTemplate(container) , wl_text_input(client, id, 1) , m_compositor(compositor) , m_focus() diff --git a/src/compositor/extensions/qwltextinput_p.h b/src/compositor/extensions/qwltextinput_p.h index 60485d32..7580c86f 100644 --- a/src/compositor/extensions/qwltextinput_p.h +++ b/src/compositor/extensions/qwltextinput_p.h @@ -50,7 +50,7 @@ class Compositor; class InputMethod; class Surface; -class TextInput : public QWaylandExtension, public QtWaylandServer::wl_text_input +class TextInput : public QWaylandExtensionTemplate<TextInput>, public QtWaylandServer::wl_text_input { public: explicit TextInput(QWaylandExtensionContainer *container, Compositor *compositor, struct ::wl_client *client, int id); @@ -62,7 +62,6 @@ public: void deactivate(InputMethod *inputMethod); - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return wl_text_input::interface(); } protected: void text_input_destroy_resource(Resource *resource) Q_DECL_OVERRIDE; diff --git a/src/compositor/extensions/qwltextinputmanager.cpp b/src/compositor/extensions/qwltextinputmanager.cpp index 73868015..b45a7e38 100644 --- a/src/compositor/extensions/qwltextinputmanager.cpp +++ b/src/compositor/extensions/qwltextinputmanager.cpp @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE namespace QtWayland { TextInputManager::TextInputManager(Compositor *compositor) - : QWaylandExtension(compositor->waylandCompositor()) + : QWaylandExtensionTemplate(compositor->waylandCompositor()) , QtWaylandServer::wl_text_input_manager(compositor->wl_display(), 1) , m_compositor(compositor) { diff --git a/src/compositor/extensions/qwltextinputmanager_p.h b/src/compositor/extensions/qwltextinputmanager_p.h index b9f3a0ae..234d4ab1 100644 --- a/src/compositor/extensions/qwltextinputmanager_p.h +++ b/src/compositor/extensions/qwltextinputmanager_p.h @@ -46,14 +46,13 @@ namespace QtWayland { class Compositor; -class TextInputManager : public QWaylandExtension, public QtWaylandServer::wl_text_input_manager, public QWaylandExtensionContainer +class TextInputManager : public QWaylandExtensionTemplate<TextInputManager>, public QtWaylandServer::wl_text_input_manager, public QWaylandExtensionContainer { Q_OBJECT public: TextInputManager(Compositor *compositor); ~TextInputManager(); - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return wl_text_input_manager::interface(); } protected: void text_input_manager_create_text_input(Resource *resource, uint32_t id) Q_DECL_OVERRIDE; diff --git a/src/compositor/global/qwaylandextension.cpp b/src/compositor/global/qwaylandextension.cpp index 55fd994e..e255aecc 100644 --- a/src/compositor/global/qwaylandextension.cpp +++ b/src/compositor/global/qwaylandextension.cpp @@ -70,7 +70,7 @@ QWaylandExtensionContainer::~QWaylandExtensionContainer() QWaylandExtension *QWaylandExtensionContainer::extension(const QByteArray &name) { for (int i = 0; i < extension_vector.size(); i++) { - if (extension_vector.at(i)->name() == name) + if (extension_vector.at(i)->extensionInterface()->name == name) return extension_vector.at(i); } return Q_NULLPTR; @@ -79,7 +79,7 @@ QWaylandExtension *QWaylandExtensionContainer::extension(const QByteArray &name) QWaylandExtension *QWaylandExtensionContainer::extension(const wl_interface *interface) { for (int i = 0; i < extension_vector.size(); i++) { - if (extension_vector.at(i)->interface() == interface) + if (extension_vector.at(i)->extensionInterface() == interface) return extension_vector.at(i); } return Q_NULLPTR; @@ -101,18 +101,4 @@ void QWaylandExtensionContainer::removeExtension(QWaylandExtension *extension) extension_vector.removeOne(extension); } -QWaylandExtensionTemplate::QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent) - : QWaylandExtension(container, parent) -{ } - -QWaylandExtensionTemplate::QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent) - : QWaylandExtension(dd, parent) -{ } - -const struct wl_interface *QWaylandExtensionTemplate::interface() const -{ - Q_D(const QWaylandExtensionTemplate); - return d->interface(); -} - QT_END_NAMESPACE diff --git a/src/compositor/global/qwaylandextension.h b/src/compositor/global/qwaylandextension.h index e31c6398..dbb87a99 100644 --- a/src/compositor/global/qwaylandextension.h +++ b/src/compositor/global/qwaylandextension.h @@ -46,27 +46,10 @@ QT_BEGIN_NAMESPACE class QWaylandCompositor; -class QWaylandExtensionContainer; +class QWaylandExtension; class QWaylandExtensionPrivate; class QWaylandExtensionTemplatePrivate; -class Q_COMPOSITOR_EXPORT QWaylandExtension : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QWaylandExtension) -public: - QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent = 0); - virtual ~QWaylandExtension(); - - virtual const struct wl_interface *interface() const = 0; - - const QByteArray name() const { return interface()->name; } - quint32 version() const { return interface()->version; } - -protected: - QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent = 0); -}; - class Q_COMPOSITOR_EXPORT QWaylandExtensionContainer { public: @@ -82,17 +65,44 @@ protected: QVector<QWaylandExtension *> extension_vector; }; -class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplate : public QWaylandExtension +class Q_COMPOSITOR_EXPORT QWaylandExtension : public QObject { Q_OBJECT + Q_DECLARE_PRIVATE(QWaylandExtension) +public: + QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent = 0); + virtual ~QWaylandExtension(); + + virtual const struct wl_interface *extensionInterface() const = 0; + +protected: + QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent = 0); +}; + +template <typename T> +class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplate : public QWaylandExtension +{ Q_DECLARE_PRIVATE(QWaylandExtensionTemplate) public: - QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent = 0); + QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent = 0) + : QWaylandExtension(container, parent) + { } + + const struct wl_interface *extensionInterface() const Q_DECL_OVERRIDE + { + return T::interface(); + } - const struct wl_interface *interface() const Q_DECL_OVERRIDE; + static T *get(QWaylandExtensionContainer *container) + { + if (!container) return Q_NULLPTR; + return qobject_cast<T *>(container->extension(T::interfaceName())); + } protected: - QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent = 0); + QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent = 0) + : QWaylandExtension(dd, parent) + { } }; QT_END_NAMESPACE diff --git a/src/compositor/global/qwaylandextension_p.h b/src/compositor/global/qwaylandextension_p.h index b8694365..5ca5bd3c 100644 --- a/src/compositor/global/qwaylandextension_p.h +++ b/src/compositor/global/qwaylandextension_p.h @@ -56,25 +56,10 @@ public: class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplatePrivate : public QWaylandExtensionPrivate { - Q_DECLARE_PUBLIC(QWaylandExtension) - public: QWaylandExtensionTemplatePrivate(QWaylandExtensionContainer *container) : QWaylandExtensionPrivate(container) - {} - - virtual const struct wl_interface *interface() const = 0; -}; - -template <typename T> -class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplatePrivateImpl : public QWaylandExtensionTemplatePrivate, public T -{ -public: - QWaylandExtensionTemplatePrivateImpl(QWaylandExtensionContainer *container) - : QWaylandExtensionTemplatePrivate(container) { } - - const struct wl_interface *interface() const Q_DECL_OVERRIDE { return T::interface(); } }; #endif /*QWAYLANDEXTENSION_P_H*/ diff --git a/src/compositor/wayland_wrapper/qwltouch.cpp b/src/compositor/wayland_wrapper/qwltouch.cpp index 11ed148a..77464d81 100644 --- a/src/compositor/wayland_wrapper/qwltouch.cpp +++ b/src/compositor/wayland_wrapper/qwltouch.cpp @@ -138,7 +138,7 @@ void QWaylandTouchPrivate::sendFullTouchEvent(QTouchEvent *event) return; } - QtWayland::TouchExtensionGlobal *ext = qobject_cast<QtWayland::TouchExtensionGlobal *>(compositor()->extension(QtWaylandServer::qt_touch_extension::name())); + QtWayland::TouchExtensionGlobal *ext = QtWayland::TouchExtensionGlobal::get(compositor()); if (ext && ext->postTouchEvent(event, m_seat->mouseFocus())) return; diff --git a/src/qtwaylandscanner/qtwaylandscanner.cpp b/src/qtwaylandscanner/qtwaylandscanner.cpp index 1945f64c..78873c71 100644 --- a/src/qtwaylandscanner/qtwaylandscanner.cpp +++ b/src/qtwaylandscanner/qtwaylandscanner.cpp @@ -451,7 +451,7 @@ void process(QXmlStreamReader &xml, const QByteArray &headerPath, const QByteArr printf(" bool isResource() const { return m_resource != 0; }\n"); printf("\n"); printf(" static const struct ::wl_interface *interface();\n"); - printf(" static QByteArray name() { return interface()->name; }\n"); + printf(" static QByteArray interfaceName() { return interface()->name; }\n"); printf(" static int interfaceVersion() { return interface()->version; }\n"); printf("\n"); |