[decorations] Add a KDecoration::window() returning the QWindow

KWin core can access the QWindow of the decoration instead of the
QWidget. This is a preparation step to allow QWidget based window
decorations without any QWidgets at all.

KWin core makes already use of this new accessor to get the window Id
which is also on QWidgets provided through the QWindow.
master
Martin Gräßlin 11 years ago
parent d6bf62eb3e
commit 8ecb69cd8c

@ -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())

@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <KDE/NETWinInfo>
// Qt
#include <QPixmap>
#include <QWindow>
// X
#include <xcb/sync.h>
@ -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;
}

@ -27,6 +27,7 @@ DEALINGS IN THE SOFTWARE.
#include <QApplication>
#include <QMenu>
#include <QWindow>
#include <assert.h>
#include <X11/Xlib.h>
#include <fixx11h.h>
@ -59,12 +60,14 @@ public:
, factory(f)
, alphaEnabled(false)
, w()
, window()
{
}
KDecorationBridge *bridge;
KDecorationFactory *factory;
bool alphaEnabled;
QScopedPointer<QWidget> w;
QScopedPointer<QWindow> 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;

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

Loading…
Cancel
Save