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.
*/