diff --git a/client.cpp b/client.cpp index 4145f584cc..ff20b05e6d 100644 --- a/client.cpp +++ b/client.cpp @@ -451,12 +451,12 @@ void Client::createDecoration(const QRect& oldgeom) // TODO: Check decoration's minimum size? decoration->init(); decoration->widget()->installEventFilter(this); - xcb_reparent_window(connection(), decoration->widget()->winId(), frameId(), 0, 0); - decoration->widget()->lower(); + xcb_reparent_window(connection(), decoration->window()->winId(), frameId(), 0, 0); + decoration->window()->lower(); decoration->borders(border_left, border_right, border_top, border_bottom); padding_left = padding_right = padding_top = padding_bottom = 0; decoration->padding(padding_left, padding_right, padding_top, padding_bottom); - Xcb::moveWindow(decoration->widget()->winId(), -padding_left, -padding_top); + Xcb::moveWindow(decoration->window()->winId(), -padding_left, -padding_top); move(calculateGravitation(false)); plainResize(sizeForClientSize(clientSize()), ForceGeometrySet); if (Compositor::compositing()) { @@ -495,7 +495,7 @@ bool Client::checkBorderSizes(bool also_resize) int new_left = 0, new_right = 0, new_top = 0, new_bottom = 0; decoration->padding(new_left, new_right, new_top, new_bottom); if (padding_left != new_left || padding_top != new_top) - Xcb::moveWindow(decoration->widget()->winId(), -new_left, -new_top); + Xcb::moveWindow(decoration->window()->winId(), -new_left, -new_top); padding_left = new_left; padding_right = new_right; padding_top = new_top; @@ -652,7 +652,7 @@ void Client::resizeDecoration(const QSize& s) } else { triggerDecorationRepaint(); } - Xcb::moveWindow(decoration->widget()->winId(), -padding_left, -padding_top); + Xcb::moveWindow(decoration->window()->winId(), -padding_left, -padding_top); updateInputWindow(); } @@ -2253,7 +2253,7 @@ void Client::updateCursor() return; m_cursor = c; if (decoration != NULL) - decoration->widget()->setCursor(m_cursor); + decoration->window()->setCursor(m_cursor); xcb_cursor_t nativeCursor = Cursor::x11Cursor(m_cursor); m_frame.defineCursor(nativeCursor); if (m_decoInputExtent.isValid()) diff --git a/client.h b/client.h index 14856aa4f3..05cf1f00e7 100644 --- a/client.h +++ b/client.h @@ -32,6 +32,7 @@ along with this program. If not, see . #include // Qt #include +#include // X #include @@ -1018,7 +1019,7 @@ inline xcb_window_t Client::wrapperId() const inline xcb_window_t Client::decorationId() const { if (decoration) { - return decoration->widget()->winId(); + return decoration->window()->winId(); } return XCB_WINDOW_NONE; } diff --git a/libkdecorations/kdecoration.cpp b/libkdecorations/kdecoration.cpp index efcbecb872..c633125219 100644 --- a/libkdecorations/kdecoration.cpp +++ b/libkdecorations/kdecoration.cpp @@ -27,6 +27,7 @@ DEALINGS IN THE SOFTWARE. #include #include +#include #include #include #include @@ -59,12 +60,14 @@ public: , factory(f) , alphaEnabled(false) , w() + , window() { } KDecorationBridge *bridge; KDecorationFactory *factory; bool alphaEnabled; QScopedPointer w; + QScopedPointer window; }; KDecoration::KDecoration(KDecorationBridge* bridge, KDecorationFactory* factory) @@ -508,6 +511,27 @@ const QWidget* KDecoration::widget() const return d->w.data(); } +QWindow *KDecoration::window() +{ + if (!d->window.isNull()) { + return d->window.data(); + } + if (!d->w.isNull()) { + // we have a widget + if (d->w->windowHandle()) { + // the window exists, so return it + return d->w->windowHandle(); + } else { + // access window Id to generate the handle + WId tempId = d->w->winId(); + Q_UNUSED(tempId) + return d->w->windowHandle(); + } + } + // neither window, nor widget are set + return nullptr; +} + KDecorationFactory* KDecoration::factory() const { return d->factory; diff --git a/libkdecorations/kdecoration.h b/libkdecorations/kdecoration.h index 1ad63ee83a..4576312378 100644 --- a/libkdecorations/kdecoration.h +++ b/libkdecorations/kdecoration.h @@ -997,6 +997,10 @@ public: * Returns the main widget for the decoration. */ const QWidget* widget() const; + /** + * Returns the main window for the decoration. + */ + QWindow* window(); /** * Returns the factory that created this decoration. */