Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qhaikurasterwindow.cpp
Go to the documentation of this file.
1// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include "qhaikukeymapper.h"
7
8#include <View.h>
9#include <Window.h>
10
11#include <qpa/qwindowsysteminterface.h>
12
14
16Q_DECLARE_METATYPE(Qt::MouseButtons)
18Q_DECLARE_METATYPE(Qt::KeyboardModifiers)
20
22 : QObject(parent)
23 , BView(BRect(0, 0, window->Bounds().right, window->Bounds().bottom), 0, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FRAME_EVENTS)
24{
25}
26
28{
29 switch (message->what) {
30 case B_MOUSE_WHEEL_CHANGED:
31 {
32 float deltaX = 0;
33 if (message->FindFloat("be:wheel_delta_x", &deltaX) != B_OK)
34 deltaX = 0;
35
36 float deltaY = 0;
37 if (message->FindFloat("be:wheel_delta_y", &deltaY) != B_OK)
38 deltaY = 0;
39
40 if (deltaX != 0 || deltaY != 0) {
41 BPoint localPos;
42 uint32 keyState = 0;
43 GetMouse(&localPos, &keyState);
44 const Qt::KeyboardModifiers keyboardModifiers = keyStateToModifiers(modifiers());
45
46 const BPoint globalPos = ConvertToScreen(localPos);
47 const QPoint globalPosition = QPoint(globalPos.x, globalPos.y);
48 const QPoint localPosition = QPoint(localPos.x, localPos.y);
49
50 if (deltaX != 0)
51 Q_EMIT wheelEvent(localPosition, globalPosition, (deltaX * -120), Qt::Horizontal, keyboardModifiers);
52
53 if (deltaY != 0)
54 Q_EMIT wheelEvent(localPosition, globalPosition, (deltaY * -120), Qt::Vertical, keyboardModifiers);
55 }
56 break;
57 }
58 default:
59 BView::MessageReceived(message);
60 break;
61 }
62
63}
64
65void HaikuViewProxy::Draw(BRect updateRect)
66{
67 BView::Draw(updateRect);
68
69 Q_EMIT drawRequest(QRect(updateRect.left, updateRect.top, updateRect.Width(), updateRect.Height()));
70}
71
72void HaikuViewProxy::MouseDown(BPoint localPos)
73{
74 BPoint dummyPos;
75 uint32 keyState = 0;
76 GetMouse(&dummyPos, &keyState);
77
78 const Qt::MouseButtons mouseButtons = keyStateToMouseButtons(keyState);
79 const Qt::KeyboardModifiers keyboardModifiers = keyStateToModifiers(modifiers());
81
82 const BPoint globalPos = ConvertToScreen(localPos);
83 const QPoint globalPosition = QPoint(globalPos.x, globalPos.y);
84 const QPoint localPosition = QPoint(localPos.x, localPos.y);
85
86 Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);
87}
88
89void HaikuViewProxy::MouseUp(BPoint localPos)
90{
91 BPoint dummyPos;
92 uint32 keyState = 0;
93 GetMouse(&dummyPos, &keyState);
94
95 const Qt::MouseButtons mouseButtons = keyStateToMouseButtons(keyState);
96 const Qt::KeyboardModifiers keyboardModifiers = keyStateToModifiers(modifiers());
98
99 const BPoint globalPos = ConvertToScreen(localPos);
100 const QPoint globalPosition = QPoint(globalPos.x, globalPos.y);
101 const QPoint localPosition = QPoint(localPos.x, localPos.y);
102
103 Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);
104}
105
106void HaikuViewProxy::MouseMoved(BPoint pos, uint32 code, const BMessage *dragMessage)
107{
108 switch (code) {
109 case B_INSIDE_VIEW:
110 {
111 BPoint dummyPos;
112 uint32 keyState = 0;
113 GetMouse(&dummyPos, &keyState);
114
115 const Qt::MouseButtons mouseButtons = keyStateToMouseButtons(keyState);
116 const Qt::KeyboardModifiers keyboardModifiers = keyStateToModifiers(modifiers());
118
119 const BPoint globalPos = ConvertToScreen(pos);
120 const QPoint globalPosition = QPoint(globalPos.x, globalPos.y);
121 const QPoint localPosition = QPoint(pos.x, pos.y);
122
123 Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);
124 }
125 break;
126 case B_ENTERED_VIEW:
128 break;
129 case B_EXITED_VIEW:
131 break;
132 }
133
134 BView::MouseMoved(pos, code, dragMessage);
135}
136
137void HaikuViewProxy::KeyDown(const char*, int32)
138{
139 handleKeyEvent(QEvent::KeyPress, Window()->CurrentMessage());
140}
141
142void HaikuViewProxy::KeyUp(const char*, int32)
143{
144 handleKeyEvent(QEvent::KeyRelease, Window()->CurrentMessage());
145}
146
147Qt::MouseButtons HaikuViewProxy::keyStateToMouseButtons(uint32 keyState) const
148{
149 Qt::MouseButtons mouseButtons(Qt::NoButton);
150 if (keyState & B_PRIMARY_MOUSE_BUTTON)
151 mouseButtons |= Qt::LeftButton;
152 if (keyState & B_SECONDARY_MOUSE_BUTTON)
153 mouseButtons |= Qt::RightButton;
154 if (keyState & B_TERTIARY_MOUSE_BUTTON)
155 mouseButtons |= Qt::MiddleButton;
156
157 return mouseButtons;
158}
159
160Qt::KeyboardModifiers HaikuViewProxy::keyStateToModifiers(uint32 keyState) const
161{
162 Qt::KeyboardModifiers modifiers(Qt::NoModifier);
163
164 if (keyState & B_SHIFT_KEY)
166 if (keyState & B_CONTROL_KEY)
168 if (keyState & B_COMMAND_KEY)
170
171 return modifiers;
172}
173
174void HaikuViewProxy::handleKeyEvent(QEvent::Type type, BMessage *message)
175{
176 int32 key = 0;
177 uint32 code = 0;
178 const char *bytes = nullptr;
180
181 if (message) {
182 if (message->FindString("bytes", &bytes) == B_OK) {
183 text = QString::fromLocal8Bit(bytes, strlen(bytes));
184 }
185
186 if (message->FindInt32("key", &key) == B_OK) {
188 }
189 }
190
191 const Qt::KeyboardModifiers keyboardModifiers = keyStateToModifiers(modifiers());
192
193 Q_EMIT keyEvent(type, code, keyboardModifiers, text);
194}
195
196
199{
200 qRegisterMetaType<QEvent::Type>();
201 qRegisterMetaType<Qt::MouseButtons>();
202 qRegisterMetaType<Qt::MouseEventSource>();
203 qRegisterMetaType<Qt::KeyboardModifiers>();
204 qRegisterMetaType<Qt::Orientation>();
205
206 HaikuViewProxy *haikuView = new HaikuViewProxy(m_window);
207 connect(haikuView, SIGNAL(mouseEvent(QPoint,QPoint,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::MouseEventSource)),
208 this, SLOT(haikuMouseEvent(QPoint,QPoint,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::MouseEventSource)));
209 connect(haikuView, SIGNAL(wheelEvent(QPoint,QPoint,int,Qt::Orientation,Qt::KeyboardModifiers)),
210 this, SLOT(haikuWheelEvent(QPoint,QPoint,int,Qt::Orientation,Qt::KeyboardModifiers)));
211 connect(haikuView, SIGNAL(keyEvent(QEvent::Type,int,Qt::KeyboardModifiers,QString)),
212 this, SLOT(haikuKeyEvent(QEvent::Type,int,Qt::KeyboardModifiers,QString)));
213 connect(haikuView, SIGNAL(enteredView()), this, SLOT(haikuEnteredView()));
214 connect(haikuView, SIGNAL(exitedView()), this, SLOT(haikuExitedView()));
215 connect(haikuView, SIGNAL(drawRequest(QRect)), this, SLOT(haikuDrawRequest(QRect)));
216
217 m_view = haikuView;
218
219 m_window->LockLooper();
220 m_window->AddChild(m_view);
221 m_view->MakeFocus();
222 m_window->UnlockLooper();
223}
224
226{
227 m_window->LockLooper();
228 m_view->RemoveSelf();
229 m_window->UnlockLooper();
230
231 delete m_view;
232 m_view = nullptr;
233}
234
236{
237 return m_view;
238}
239
void MessageReceived(BMessage *message) override
void wheelEvent(const QPoint &localPosition, const QPoint &globalPosition, int delta, Qt::Orientation orientation, Qt::KeyboardModifiers modifiers)
void drawRequest(const QRect &rect)
void MouseUp(BPoint pos) override
void mouseEvent(const QPoint &localPosition, const QPoint &globalPosition, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)
void Draw(BRect updateRect) override
void MouseMoved(BPoint pos, uint32 code, const BMessage *dragMessage) override
void KeyDown(const char *bytes, int32 numBytes) override
void MouseDown(BPoint pos) override
void keyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text)
void KeyUp(const char *bytes, int32 numBytes) override
void enteredView()
Type
This enum type defines the valid event types in Qt.
Definition qcoreevent.h:51
@ KeyRelease
Definition qcoreevent.h:65
@ KeyPress
Definition qcoreevent.h:64
static uint32 translateKeyCode(uint32 key, bool numlockActive)
BView * nativeViewHandle() const
QHaikuRasterWindow(QWindow *window)
HaikuWindowProxy * m_window
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
\inmodule QtCore\reentrant
Definition qpoint.h:25
\inmodule QtCore\reentrant
Definition qrect.h:30
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5949
\inmodule QtGui
Definition qwindow.h:63
EGLImageKHR int int EGLuint64KHR * modifiers
QString text
Combined button and popup list for selecting options.
@ LeftButton
Definition qnamespace.h:58
@ RightButton
Definition qnamespace.h:59
@ MiddleButton
Definition qnamespace.h:60
@ NoButton
Definition qnamespace.h:57
Orientation
Definition qnamespace.h:98
@ Horizontal
Definition qnamespace.h:99
@ Vertical
Definition qnamespace.h:100
MouseEventSource
@ MouseEventNotSynthesized
@ ShiftModifier
@ ControlModifier
@ NoModifier
@ AltModifier
#define Q_DECLARE_METATYPE(TYPE)
Definition qmetatype.h:1525
#define SLOT(a)
Definition qobjectdefs.h:52
#define SIGNAL(a)
Definition qobjectdefs.h:53
GLuint64 key
GLdouble GLdouble right
GLenum type
GLint GLint bottom
GLuint GLsizei const GLchar * message
GLsizei GLsizei GLchar * source
#define Q_EMIT
XID Window
aWidget window() -> setWindowTitle("New Window Title")
[2]