123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | // Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Tobias Koenig <tobias.koenig@kdab.com>// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qhaikurasterwindow.h"#include"qhaikukeymapper.h"#include <View.h>#include <Window.h>#include <qpa/qwindowsysteminterface.h> QT_BEGIN_NAMESPACE Q_DECLARE_METATYPE(QEvent::Type)Q_DECLARE_METATYPE(Qt::MouseButtons)Q_DECLARE_METATYPE(Qt::MouseEventSource)Q_DECLARE_METATYPE(Qt::KeyboardModifiers)Q_DECLARE_METATYPE(Qt::Orientation)HaikuViewProxy::HaikuViewProxy(BWindow *window, QObject *parent):QObject(parent),BView(BRect(0,0, window->Bounds().right, window->Bounds().bottom),0, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FRAME_EVENTS){}voidHaikuViewProxy::MessageReceived(BMessage *message){switch(message->what) {case B_MOUSE_WHEEL_CHANGED:{float deltaX =0;if(message->FindFloat("be:wheel_delta_x", &deltaX) != B_OK) deltaX =0;float deltaY =0;if(message->FindFloat("be:wheel_delta_y", &deltaY) != B_OK) deltaY =0;if(deltaX !=0|| deltaY !=0) { BPoint localPos; uint32 keyState =0;GetMouse(&localPos, &keyState);constQt::KeyboardModifiers keyboardModifiers =keyStateToModifiers(modifiers());const BPoint globalPos =ConvertToScreen(localPos);const QPoint globalPosition =QPoint(globalPos.x, globalPos.y);const QPoint localPosition =QPoint(localPos.x, localPos.y);if(deltaX !=0) Q_EMIT wheelEvent(localPosition, globalPosition, (deltaX * -120),Qt::Horizontal, keyboardModifiers);if(deltaY !=0) Q_EMIT wheelEvent(localPosition, globalPosition, (deltaY * -120),Qt::Vertical, keyboardModifiers);}break;}default:BView::MessageReceived(message);break;}}voidHaikuViewProxy::Draw(BRect updateRect){BView::Draw(updateRect); Q_EMIT drawRequest(QRect(updateRect.left, updateRect.top, updateRect.Width(), updateRect.Height()));}voidHaikuViewProxy::MouseDown(BPoint localPos){ BPoint dummyPos; uint32 keyState =0;GetMouse(&dummyPos, &keyState);constQt::MouseButtons mouseButtons =keyStateToMouseButtons(keyState);constQt::KeyboardModifiers keyboardModifiers =keyStateToModifiers(modifiers());constQt::MouseEventSource source =Qt::MouseEventNotSynthesized;const BPoint globalPos =ConvertToScreen(localPos);const QPoint globalPosition =QPoint(globalPos.x, globalPos.y);const QPoint localPosition =QPoint(localPos.x, localPos.y); Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);}voidHaikuViewProxy::MouseUp(BPoint localPos){ BPoint dummyPos; uint32 keyState =0;GetMouse(&dummyPos, &keyState);constQt::MouseButtons mouseButtons =keyStateToMouseButtons(keyState);constQt::KeyboardModifiers keyboardModifiers =keyStateToModifiers(modifiers());constQt::MouseEventSource source =Qt::MouseEventNotSynthesized;const BPoint globalPos =ConvertToScreen(localPos);const QPoint globalPosition =QPoint(globalPos.x, globalPos.y);const QPoint localPosition =QPoint(localPos.x, localPos.y); Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);}voidHaikuViewProxy::MouseMoved(BPoint pos, uint32 code,const BMessage *dragMessage){switch(code) {case B_INSIDE_VIEW:{ BPoint dummyPos; uint32 keyState =0;GetMouse(&dummyPos, &keyState);constQt::MouseButtons mouseButtons =keyStateToMouseButtons(keyState);constQt::KeyboardModifiers keyboardModifiers =keyStateToModifiers(modifiers());constQt::MouseEventSource source =Qt::MouseEventNotSynthesized;const BPoint globalPos =ConvertToScreen(pos);const QPoint globalPosition =QPoint(globalPos.x, globalPos.y);const QPoint localPosition =QPoint(pos.x, pos.y); Q_EMIT mouseEvent(localPosition, globalPosition, mouseButtons, keyboardModifiers, source);}break;case B_ENTERED_VIEW: Q_EMIT enteredView();break;case B_EXITED_VIEW: Q_EMIT exitedView();break;}BView::MouseMoved(pos, code, dragMessage);}voidHaikuViewProxy::KeyDown(const char*, int32){handleKeyEvent(QEvent::KeyPress,Window()->CurrentMessage());}voidHaikuViewProxy::KeyUp(const char*, int32){handleKeyEvent(QEvent::KeyRelease,Window()->CurrentMessage());}Qt::MouseButtons HaikuViewProxy::keyStateToMouseButtons(uint32 keyState)const{Qt::MouseButtons mouseButtons(Qt::NoButton);if(keyState & B_PRIMARY_MOUSE_BUTTON) mouseButtons |=Qt::LeftButton;if(keyState & B_SECONDARY_MOUSE_BUTTON) mouseButtons |=Qt::RightButton;if(keyState & B_TERTIARY_MOUSE_BUTTON) mouseButtons |=Qt::MiddleButton;return mouseButtons;}Qt::KeyboardModifiers HaikuViewProxy::keyStateToModifiers(uint32 keyState)const{Qt::KeyboardModifiers modifiers(Qt::NoModifier);if(keyState & B_SHIFT_KEY) modifiers |=Qt::ShiftModifier;if(keyState & B_CONTROL_KEY) modifiers |=Qt::AltModifier;if(keyState & B_COMMAND_KEY) modifiers |=Qt::ControlModifier;return modifiers;}voidHaikuViewProxy::handleKeyEvent(QEvent::Type type, BMessage *message){ int32 key =0; uint32 code =0;const char*bytes =nullptr; QString text;if(message) {if(message->FindString("bytes", &bytes) == B_OK) { text =QString::fromLocal8Bit(bytes,strlen(bytes));}if(message->FindInt32("key", &key) == B_OK) { code =QHaikuKeyMapper::translateKeyCode(key, (modifiers() & B_NUM_LOCK));}}constQt::KeyboardModifiers keyboardModifiers =keyStateToModifiers(modifiers()); Q_EMIT keyEvent(type, code, keyboardModifiers, text);}QHaikuRasterWindow::QHaikuRasterWindow(QWindow *window):QHaikuWindow(window){ qRegisterMetaType<QEvent::Type>(); qRegisterMetaType<Qt::MouseButtons>(); qRegisterMetaType<Qt::MouseEventSource>(); qRegisterMetaType<Qt::KeyboardModifiers>(); qRegisterMetaType<Qt::Orientation>(); HaikuViewProxy *haikuView =newHaikuViewProxy(m_window);connect(haikuView,SIGNAL(mouseEvent(QPoint,QPoint,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::MouseEventSource)),this,SLOT(haikuMouseEvent(QPoint,QPoint,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::MouseEventSource)));connect(haikuView,SIGNAL(wheelEvent(QPoint,QPoint,int,Qt::Orientation,Qt::KeyboardModifiers)),this,SLOT(haikuWheelEvent(QPoint,QPoint,int,Qt::Orientation,Qt::KeyboardModifiers)));connect(haikuView,SIGNAL(keyEvent(QEvent::Type,int,Qt::KeyboardModifiers,QString)),this,SLOT(haikuKeyEvent(QEvent::Type,int,Qt::KeyboardModifiers,QString)));connect(haikuView,SIGNAL(enteredView()),this,SLOT(haikuEnteredView()));connect(haikuView,SIGNAL(exitedView()),this,SLOT(haikuExitedView()));connect(haikuView,SIGNAL(drawRequest(QRect)),this,SLOT(haikuDrawRequest(QRect))); m_view = haikuView; m_window->LockLooper(); m_window->AddChild(m_view); m_view->MakeFocus(); m_window->UnlockLooper();}QHaikuRasterWindow::~QHaikuRasterWindow(){ m_window->LockLooper(); m_view->RemoveSelf(); m_window->UnlockLooper();delete m_view; m_view =nullptr;} BView*QHaikuRasterWindow::nativeViewHandle()const{return m_view;} QT_END_NAMESPACE
|