1 #include "qwaylanddecoration.h"
3 #include "qwaylandwindow.h"
4 #include "qwaylandshmbackingstore.h"
5 #include "qwaylandshellsurface.h"
6 #include "qwaylandinputdevice.h"
8 #include <QtGui/QGuiApplication>
9 #include <QtGui/QCursor>
10 #include <QtGui/QPainter>
11 #include <QtGui/QRadialGradient>
12 QWaylandDecoration::QWaylandDecoration(QWindow *window, QWaylandShmBackingStore *backing_store)
14 , m_wayland_window(static_cast<QWaylandWindow *>(window->handle()))
15 , m_backing_store(backing_store)
17 , m_hasSetCursor(false)
18 , m_mouseButtons(Qt::NoButton)
20 m_wayland_window->setDecoration(this);
21 QTextOption option(Qt::AlignHCenter | Qt::AlignVCenter);
22 option.setWrapMode(QTextOption::NoWrap);
23 m_windowTitle.setTextOption(option);
26 QWaylandDecoration::~QWaylandDecoration()
28 m_wayland_window->setDecoration(0);
31 void QWaylandDecoration::paintDecoration()
33 QRect surfaceRect(QPoint(), m_backing_store->entireSurface()->size());
36 QRect(0, 0, surfaceRect.width(), m_margins.top()),
37 QRect(0, surfaceRect.height() - m_margins.bottom(), surfaceRect.width(), m_margins.bottom()),
38 QRect(0, m_margins.top(), m_margins.left(), surfaceRect.height() - m_margins.top() - m_margins.bottom()),
39 QRect(surfaceRect.width() - m_margins.right(), m_margins.top(), m_margins.left(), surfaceRect.height() - m_margins.top() - m_margins.bottom())
42 QPainter p(m_backing_store->entireSurface());
43 p.setRenderHint(QPainter::Antialiasing);
44 QPoint gradCenter(top.center()+ QPoint(30,60));
45 QRadialGradient grad(gradCenter, top.width() / 2, gradCenter);
46 QColor base(90, 90, 100);
47 grad.setColorAt(1, base);
48 grad.setColorAt(0, base.lighter(123));
49 QPainterPath roundedRect;
50 roundedRect.addRoundedRect(surfaceRect, 6, 6);
51 for (int i = 0; i < 4; ++i) {
53 p.setClipRect(clips[i]);
54 p.fillPath(roundedRect, grad);
59 QString windowTitleText = m_window->windowTitle();
60 if (!windowTitleText.isEmpty()) {
61 if (m_windowTitle.text() != windowTitleText) {
62 m_windowTitle.setText(windowTitleText);
63 m_windowTitle.prepare();
67 p.setPen(QColor(0xee,0xee,0xee));
68 QSizeF size = m_windowTitle.size();
69 int dx = (top.width() - size.width()) /2;
70 int dy = (top.height()- size.height()) /2;
71 QPoint windowTitlePoint(top.topLeft().x() + dx,
72 top.topLeft().y() + dy);
73 p.drawStaticText(windowTitlePoint,m_windowTitle);
78 void QWaylandDecoration::handleMouse(QWaylandInputDevice *inputDevice, const QPointF &local, const QPointF &global, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
82 //figure out what area mouse is in
83 if (local.y() <= m_margins.top()) {
84 processMouseTop(inputDevice,local,b,mods);
85 } else if (local.y() > m_window->height() - m_margins.bottom()) {
86 processMouseBottom(inputDevice,local,b,mods);
87 } else if (local.x() <= m_margins.left()) {
88 processMouseLeft(inputDevice,local,b,mods);
89 } else if (local.x() > m_window->width() - m_margins.right()) {
90 processMouseRight(inputDevice,local,b,mods);
97 void QWaylandDecoration::restoreMouseCursor()
100 QGuiApplication::restoreOverrideCursor();
101 m_hasSetCursor = false;
105 bool QWaylandDecoration::inMouseButtonPressedState() const
107 return m_mouseButtons & Qt::NoButton;
110 void QWaylandDecoration::startResize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize resize, Qt::MouseButtons buttons)
112 if (isLeftClicked(buttons)) {
113 m_wayland_window->shellSurface()->resize(inputDevice, resize);
114 inputDevice->removeMouseButtonFromState(Qt::LeftButton);
118 void QWaylandDecoration::startMove(QWaylandInputDevice *inputDevice, Qt::MouseButtons buttons)
120 if (isLeftClicked(buttons)) {
121 m_wayland_window->shellSurface()->move(inputDevice);
122 inputDevice->removeMouseButtonFromState(Qt::LeftButton);
126 void QWaylandDecoration::processMouseTop(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
129 if (local.y() <= m_margins.bottom()) {
130 if (local.x() <= margins().left()) {
132 startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP_LEFT,b);
133 } else if (local.x() > m_window->width() - margins().right()) {
135 startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP_RIGHT,b);
138 overrideCursor(Qt::SplitVCursor);
139 startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_TOP,b);
142 restoreMouseCursor();
143 startMove(inputDevice,b);
148 void QWaylandDecoration::processMouseBottom(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
151 if (local.x() <= margins().left()) {
153 startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_BOTTOM_LEFT,b);
154 } else if (local.x() > m_window->width() - margins().right()) {
156 startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_BOTTOM_RIGHT,b);
159 overrideCursor(Qt::SplitVCursor);
160 startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_BOTTOM,b);
164 void QWaylandDecoration::processMouseLeft(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
168 overrideCursor(Qt::SplitHCursor);
169 startResize(inputDevice,WL_SHELL_SURFACE_RESIZE_LEFT,b);
172 void QWaylandDecoration::processMouseRight(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b, Qt::KeyboardModifiers mods)
176 overrideCursor(Qt::SplitHCursor);
177 startResize(inputDevice, WL_SHELL_SURFACE_RESIZE_RIGHT,b);
180 bool QWaylandDecoration::isLeftClicked(Qt::MouseButtons newMouseButtonState)
182 if ((!m_mouseButtons & Qt::LeftButton) && (newMouseButtonState & Qt::LeftButton))
187 bool QWaylandDecoration::isLeftReleased(Qt::MouseButtons newMouseButtonState)
189 if ((m_mouseButtons & Qt::LeftButton) && !(newMouseButtonState & Qt::LeftButton))