6#include "private/qguiapplication_p.h"
8#include <QCoreApplication>
11#include <qpa/qwindowsysteminterface.h>
25 , BWindow(BRect(rect.x(), rect.y(), rect.right() - 1, rect.bottom() - 1),
26 window->title().toUtf8(), B_NO_BORDER_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, 0)
27 , m_qtCalledZoom(
false)
28 , m_zoomInProgress(
false)
34 Q_EMIT moved(QPoint(pos.x, pos.y));
39 Q_EMIT resized(QSize(
static_cast<
int>(width),
static_cast<
int>(height)), m_zoomInProgress);
41 m_zoomInProgress =
false;
46 Q_EMIT windowActivated(activated);
51 BWindow::Minimize(minimize);
53 Q_EMIT minimized(minimize);
58 m_zoomInProgress =
true;
59 BWindow::Zoom(pos, width, height);
68 Q_EMIT quitRequested();
78 m_qtCalledZoom =
true;
80 m_qtCalledZoom =
false;
84 : QPlatformWindow(window)
86 , m_windowState(Qt::WindowNoState)
91 connect(haikuWindow, SIGNAL(moved(QPoint)), SLOT(haikuWindowMoved(QPoint)));
92 connect(haikuWindow, SIGNAL(resized(QSize,
bool)), SLOT(haikuWindowResized(QSize,
bool)));
93 connect(haikuWindow, SIGNAL(windowActivated(
bool)), SLOT(haikuWindowActivated(
bool)));
94 connect(haikuWindow, SIGNAL(minimized(
bool)), SLOT(haikuWindowMinimized(
bool)));
95 connect(haikuWindow, SIGNAL(zoomed()), SLOT(haikuWindowZoomed()));
96 connect(haikuWindow, SIGNAL(quitRequested()), SLOT(haikuWindowQuitRequested()), Qt::BlockingQueuedConnection);
101 qFatal(
"QHaikuWindow: failed to create window");
104 setWindowFlags(window->flags());
117 QPlatformWindow::setGeometry(rect);
119 m_window->MoveTo(rect.x(), rect.y());
120 m_window->ResizeTo(rect.width(), rect.height());
125 const BRect decoratorFrame =
m_window->DecoratorFrame();
126 const BRect frame =
m_window->Frame();
128 return QMargins(frame.left - decoratorFrame.left,
129 frame.top - decoratorFrame.top,
130 decoratorFrame.right - frame.right,
131 decoratorFrame.bottom - frame.bottom);
139 window()->requestActivate();
141 QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), window()->geometry().size()));
159 return (WId)
static_cast<BWindow*>(m_window);
174 if (m_windowState == state)
177 const Qt::WindowStates oldState = m_windowState;
179 m_windowState = state;
181 if (m_windowState & Qt::WindowMinimized)
183 else if (m_windowState & Qt::WindowMaximized)
185 else if (oldState & Qt::WindowMinimized)
187 else if (oldState & Qt::WindowMaximized)
193 const Qt::WindowType type =
static_cast<Qt::WindowType>(
static_cast<
int>(flags & Qt::WindowType_Mask));
195 const bool isPopup = (type == Qt::Popup);
196 const bool isSplashScreen = (type == Qt::SplashScreen);
197 const bool isDialog = ((type == Qt::Dialog) || (type == Qt::Sheet) || (type == Qt::MSWindowsFixedSizeDialogHint));
198 const bool isTool = ((type == Qt::Tool) || (type == Qt::Drawer));
199 const bool isToolTip = (type == Qt::ToolTip);
201 window_look wlook = B_TITLED_WINDOW_LOOK;
202 window_feel wfeel = B_NORMAL_WINDOW_FEEL;
203 uint32 wflag = (B_NO_WORKSPACE_ACTIVATION | B_NOT_ANCHORED_ON_ACTIVATE);
206 wlook = B_FLOATING_WINDOW_LOOK;
207 wflag |= B_WILL_ACCEPT_FIRST_CLICK;
210 if (isSplashScreen) {
211 wlook = B_NO_BORDER_WINDOW_LOOK;
215 wlook = B_NO_BORDER_WINDOW_LOOK;
216 wflag |= (B_WILL_ACCEPT_FIRST_CLICK | B_AVOID_FRONT | B_AVOID_FOCUS);
217 flags |= Qt::WindowStaysOnTopHint;
221 if (window()->modality() == Qt::WindowModal)
222 wfeel = B_MODAL_SUBSET_WINDOW_FEEL;
223 else if (window()->modality() == Qt::ApplicationModal)
224 wfeel = B_MODAL_APP_WINDOW_FEEL;
228 wlook = B_NO_BORDER_WINDOW_LOOK;
229 wflag |= (B_WILL_ACCEPT_FIRST_CLICK | B_AVOID_FOCUS);
230 flags |= Qt::WindowStaysOnTopHint;
233 if (flags & Qt::FramelessWindowHint)
234 wlook = B_NO_BORDER_WINDOW_LOOK;
236 if (flags & Qt::MSWindowsFixedSizeDialogHint)
237 wflag |= (B_NOT_RESIZABLE | B_NOT_ZOOMABLE);
239 if (flags & Qt::CustomizeWindowHint) {
240 if (!(flags & Qt::WindowMinimizeButtonHint))
241 wflag |= B_NOT_MINIMIZABLE;
242 if (!(flags & Qt::WindowMaximizeButtonHint))
243 wflag |= B_NOT_ZOOMABLE;
244 if (!(flags & Qt::WindowCloseButtonHint))
245 wflag |= B_NOT_CLOSABLE;
248 if (flags & Qt::WindowStaysOnTopHint)
249 wfeel = B_FLOATING_ALL_WINDOW_FEEL;
258 m_window->SetTitle(title.toLocal8Bit().constData());
263 m_window->SetSizeLimits(window()->minimumSize().width(),
264 window()->maximumSize().width(),
265 window()->minimumSize().height(),
266 window()->maximumSize().height());
268 m_window->SetZoomLimits(window()->maximumSize().width(),
269 window()->maximumSize().height());
274 const QRect newGeometry(pos, geometry().size());
276 QWindowSystemInterface::handleGeometryChange(window(), newGeometry);
277 QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), newGeometry.size()));
280void QHaikuWindow::haikuWindowResized(
const QSize &size,
bool zoomInProgress)
282 const QRect newGeometry(geometry().topLeft(), size);
284 QWindowSystemInterface::handleGeometryChange(window(), newGeometry);
285 QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), newGeometry.size()));
287 if ((m_windowState == Qt::WindowMaximized) && !zoomInProgress) {
289 m_windowState = Qt::WindowNoState;
291 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
297 QWindowSystemInterface::handleFocusWindowChanged(activated ? window() :
nullptr);
302 m_windowState = (minimize ? Qt::WindowMinimized : Qt::WindowNoState);
304 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
309 m_windowState = (m_windowState == Qt::WindowMaximized ? Qt::WindowNoState : Qt::WindowMaximized);
311 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
319void QHaikuWindow::haikuMouseEvent(
const QPoint &localPosition,
const QPoint &globalPosition, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)
321 QWindowSystemInterface::handleMouseEvent(window(), localPosition, globalPosition,
322 buttons, modifiers, source);
325void QHaikuWindow::haikuWheelEvent(
const QPoint &localPosition,
const QPoint &globalPosition,
int delta, Qt::Orientation orientation, Qt::KeyboardModifiers modifiers)
327 QWindowSystemInterface::handleWheelEvent(window(), localPosition, globalPosition, delta, orientation, modifiers);
330void QHaikuWindow::haikuKeyEvent(QEvent::Type type,
int key, Qt::KeyboardModifiers modifiers,
const QString &text)
332 QWindowSystemInterface::handleKeyEvent(window(), type, key, modifiers, text);
347 QWindowSystemInterface::handleExposeEvent(window(), QRegion(rect));
bool QuitRequested() override
void Zoom(BPoint pos, float width, float height) override
void Minimize(bool minimize) override
void FrameMoved(BPoint pos) override
void WindowActivated(bool activated) override
void FrameResized(float width, float height) override
void requestActivateWindow() override
Reimplement to let Qt be able to request activation/focus for a window.
bool isExposed() const override
Returns if this window is exposed in the windowing system.
void setVisible(bool visible) override
Reimplemented in subclasses to show the surface if visible is true, and hide it if visible is false.
BWindow * nativeHandle() const
void propagateSizeHints() override
Reimplement to propagate the size hints of the QWindow.
void setWindowTitle(const QString &title) override
Reimplement to set the window title to title.
void setGeometry(const QRect &rect) override
This function is called by Qt whenever a window is moved or resized using the QWindow API.
void setWindowState(Qt::WindowStates state) override
Requests setting the window state of this surface to type.
HaikuWindowProxy * m_window
bool isActive() const override
Returns true if the window should appear active from a style perspective.
WId winId() const override
Reimplement in subclasses to return a handle to the native window.
QMargins frameMargins() const override
void setWindowFlags(Qt::WindowFlags flags) override
Requests setting the window flags of this surface to flags.
QRect window() const
Returns the window rectangle.