From 462aa5491a00a1c26d6cab5c5029a9bf9bd329cc Mon Sep 17 00:00:00 2001 From: zhyk Date: Wed, 10 Feb 2016 19:37:47 +0800 Subject: [PATCH] move definition out from header --- ext/native/base/QtMain.cpp | 240 ++++++++++++++++++++++++++++++++++++- ext/native/base/QtMain.h | 231 +++-------------------------------- 2 files changed, 253 insertions(+), 218 deletions(-) diff --git a/ext/native/base/QtMain.cpp b/ext/native/base/QtMain.cpp index 5827bbbaee..a104fdbdcf 100644 --- a/ext/native/base/QtMain.cpp +++ b/ext/native/base/QtMain.cpp @@ -34,7 +34,8 @@ #include -InputState* input_state; +InputState input_state; +MainUI *emugl = NULL; #ifdef SDL extern void mixaudio(void *userdata, Uint8 *stream, int len) { @@ -175,7 +176,7 @@ static int mainInternal(QApplication &a) fmt.format = AUDIO_S16; fmt.channels = 2; fmt.samples = 2048; - fmt.callback = &mixaudio; + fmt.callback = &mixaudio; fmt.userdata = (void *)0; if (SDL_OpenAudio(&fmt, &ret_fmt) < 0) { @@ -200,6 +201,241 @@ static int mainInternal(QApplication &a) return a.exec(); } +MainUI::MainUI(QWidget *parent): + QGLWidget(parent) +{ + setAttribute(Qt::WA_AcceptTouchEvents); +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) + setAttribute(Qt::WA_LockLandscapeOrientation); +#endif +#if defined(MOBILE_DEVICE) && !defined(MAEMO) + acc = new QAccelerometer(this); + acc->start(); +#endif + setFocus(); + setFocusPolicy(Qt::StrongFocus); + startTimer(16); +} + +MainUI::~MainUI() +{ +#if defined(MOBILE_DEVICE) && !defined(MAEMO) + delete acc; +#endif + NativeShutdownGraphics(); + graphicsContext->Shutdown(); + delete graphicsContext; + graphicsContext = nullptr; +} + +QString MainUI::InputBoxGetQString(QString title, QString defaultValue) +{ + bool ok; + QString text = QInputDialog::getText(this, title, title, QLineEdit::Normal, defaultValue, &ok); + if (!ok) + text = QString(); + return text; +} + +void MainUI::resizeEvent(QResizeEvent *e) +{ + UpdateScreenScale(e->size().width(), e->size().height(), false); + PSP_CoreParameter().pixelWidth = pixel_xres; + PSP_CoreParameter().pixelHeight = pixel_yres; +} + +void MainUI::timerEvent(QTimerEvent *) +{ + updateGL(); + emit newFrame(); +} + +void MainUI::changeEvent(QEvent *e) +{ + QGLWidget::changeEvent(e); + if(e->type() == QEvent::WindowStateChange) + Core_NotifyWindowHidden(isMinimized()); +} + +bool MainUI::event(QEvent *e) +{ + TouchInput input; + QList touchPoints; + switch(e->type()) + { + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: + touchPoints = static_cast(e)->touchPoints(); + foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) { + switch (touchPoint.state()) { + case Qt::TouchPointStationary: + break; + case Qt::TouchPointPressed: + case Qt::TouchPointReleased: + input_state.pointer_down[touchPoint.id()] = (touchPoint.state() == Qt::TouchPointPressed); + input_state.pointer_x[touchPoint.id()] = touchPoint.pos().x() * g_dpi_scale; + input_state.pointer_y[touchPoint.id()] = touchPoint.pos().y() * g_dpi_scale; + + input.x = touchPoint.pos().x() * g_dpi_scale; + input.y = touchPoint.pos().y() * g_dpi_scale; + input.flags = (touchPoint.state() == Qt::TouchPointPressed) ? TOUCH_DOWN : TOUCH_UP; + input.id = touchPoint.id(); + NativeTouch(input); + break; + case Qt::TouchPointMoved: + input_state.pointer_x[touchPoint.id()] = touchPoint.pos().x() * g_dpi_scale; + input_state.pointer_y[touchPoint.id()] = touchPoint.pos().y() * g_dpi_scale; + + input.x = touchPoint.pos().x() * g_dpi_scale; + input.y = touchPoint.pos().y() * g_dpi_scale; + input.flags = TOUCH_MOVE; + input.id = touchPoint.id(); + NativeTouch(input); + break; + default: + break; + } + } + break; + case QEvent::MouseButtonDblClick: + if (!g_Config.bShowTouchControls || GetUIState() != UISTATE_INGAME) + emit doubleClick(); + break; + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + input_state.pointer_down[0] = (e->type() == QEvent::MouseButtonPress); + input_state.pointer_x[0] = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; + input_state.pointer_y[0] = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; + + input.x = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; + input.y = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; + input.flags = (e->type() == QEvent::MouseButtonPress) ? TOUCH_DOWN : TOUCH_UP; + input.id = 0; + NativeTouch(input); + break; + case QEvent::MouseMove: + input_state.pointer_x[0] = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; + input_state.pointer_y[0] = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; + + input.x = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; + input.y = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; + input.flags = TOUCH_MOVE; + input.id = 0; + NativeTouch(input); + break; + case QEvent::Wheel: + NativeKey(KeyInput(DEVICE_ID_MOUSE, ((QWheelEvent*)e)->delta()<0 ? NKCODE_EXT_MOUSEWHEEL_DOWN : NKCODE_EXT_MOUSEWHEEL_UP, KEY_DOWN)); + break; + case QEvent::KeyPress: + NativeKey(KeyInput(DEVICE_ID_KEYBOARD, KeyMapRawQttoNative.find(((QKeyEvent*)e)->key())->second, KEY_DOWN)); + break; + case QEvent::KeyRelease: + NativeKey(KeyInput(DEVICE_ID_KEYBOARD, KeyMapRawQttoNative.find(((QKeyEvent*)e)->key())->second, KEY_UP)); + break; + default: + return QWidget::event(e); + } + e->accept(); + return true; +} + +void MainUI::initializeGL() +{ +#ifndef USING_GLES2 + glewInit(); +#endif + graphicsContext = new QtDummyGraphicsContext(); + NativeInitGraphics(graphicsContext); +} + +void MainUI::paintGL() +{ + updateAccelerometer(); + UpdateInputState(&input_state); + time_update(); + UpdateRunLoop(); +} + +void MainUI::updateAccelerometer() +{ +#if defined(MOBILE_DEVICE) && !defined(MAEMO) + // TODO: Toggle it depending on whether it is enabled + QAccelerometerReading *reading = acc->reading(); + if (reading) { + input_state.acc.x = reading->x(); + input_state.acc.y = reading->y(); + input_state.acc.z = reading->z(); + AxisInput axis; + axis.deviceId = DEVICE_ID_ACCELEROMETER; + axis.flags = 0; + + axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_X; + axis.value = input_state.acc.x; + NativeAxis(axis); + + axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_Y; + axis.value = input_state.acc.y; + NativeAxis(axis); + + axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_Z; + axis.value = input_state.acc.z; + NativeAxis(axis); + } +#endif +} + +#ifndef SDL +// Audio +#define AUDIO_FREQ 44100 +#define AUDIO_CHANNELS 2 +#define AUDIO_SAMPLES 2048 +#define AUDIO_SAMPLESIZE 16 +#define AUDIO_BUFFERS 5 + +MainAudio::~MainAudio() +{ + if (feed != NULL) { + killTimer(timer); + feed->close(); + } + if (output) { + output->stop(); + delete output; + } + if (mixbuf) + free(mixbuf); +} + +void MainAudio::run() +{ + QAudioFormat fmt; + fmt.setSampleRate(AUDIO_FREQ); + fmt.setCodec("audio/pcm"); + fmt.setChannelCount(AUDIO_CHANNELS); + fmt.setSampleSize(AUDIO_SAMPLESIZE); + fmt.setByteOrder(QAudioFormat::LittleEndian); + fmt.setSampleType(QAudioFormat::SignedInt); + mixlen = sizeof(short)*AUDIO_BUFFERS*AUDIO_CHANNELS*AUDIO_SAMPLES; + mixbuf = (char*)malloc(mixlen); + output = new QAudioOutput(fmt); + output->setBufferSize(mixlen); + feed = output->start(); + if (feed != NULL) + timer = startTimer((1000*AUDIO_SAMPLES) / AUDIO_FREQ); +} + +void MainAudio::timerEvent(QTimerEvent *) +{ + memset(mixbuf, 0, mixlen); + size_t frames = NativeMix((short *)mixbuf, AUDIO_BUFFERS*AUDIO_SAMPLES); + if (frames > 0) + feed->write(mixbuf, sizeof(short) * AUDIO_CHANNELS * frames); +} + +#endif + + #ifndef SDL Q_DECL_EXPORT #endif diff --git a/ext/native/base/QtMain.h b/ext/native/base/QtMain.h index 242ea84784..b4ee781747 100644 --- a/ext/native/base/QtMain.h +++ b/ext/native/base/QtMain.h @@ -50,189 +50,26 @@ class MainUI : public QGLWidget { Q_OBJECT public: - explicit MainUI(QWidget *parent = 0): - QGLWidget(parent) - { - setAttribute(Qt::WA_AcceptTouchEvents); -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) - setAttribute(Qt::WA_LockLandscapeOrientation); -#endif -#if defined(MOBILE_DEVICE) && !defined(MAEMO) - acc = new QAccelerometer(this); - acc->start(); -#endif - setFocus(); - setFocusPolicy(Qt::StrongFocus); - startTimer(16); - } - ~MainUI() { -#if defined(MOBILE_DEVICE) && !defined(MAEMO) - delete acc; -#endif - NativeShutdownGraphics(); - graphicsContext->Shutdown(); - delete graphicsContext; - graphicsContext = nullptr; - } + explicit MainUI(QWidget *parent = 0); + ~MainUI(); public slots: - QString InputBoxGetQString(QString title, QString defaultValue) { - bool ok; - QString text = QInputDialog::getText(this, title, title, QLineEdit::Normal, defaultValue, &ok); - if (!ok) - text = QString(); - return text; - } + QString InputBoxGetQString(QString title, QString defaultValue); signals: void doubleClick(); void newFrame(); protected: - void resizeEvent(QResizeEvent * e) - { - UpdateScreenScale(e->size().width(), e->size().height(), false); - PSP_CoreParameter().pixelWidth = pixel_xres; - PSP_CoreParameter().pixelHeight = pixel_yres; - } + void resizeEvent(QResizeEvent * e); + void timerEvent(QTimerEvent *); + void changeEvent(QEvent *e); + bool event(QEvent *e); - void timerEvent(QTimerEvent *) { - updateGL(); - emit newFrame(); - } - void changeEvent(QEvent *e) - { - QGLWidget::changeEvent(e); - if(e->type() == QEvent::WindowStateChange) - Core_NotifyWindowHidden(isMinimized()); - } - bool event(QEvent *e) - { - TouchInput input; - QList touchPoints; - switch(e->type()) - { - case QEvent::TouchBegin: - case QEvent::TouchUpdate: - case QEvent::TouchEnd: - touchPoints = static_cast(e)->touchPoints(); - foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) { - switch (touchPoint.state()) { - case Qt::TouchPointStationary: - break; - case Qt::TouchPointPressed: - case Qt::TouchPointReleased: - input_state.pointer_down[touchPoint.id()] = (touchPoint.state() == Qt::TouchPointPressed); - input_state.pointer_x[touchPoint.id()] = touchPoint.pos().x() * g_dpi_scale; - input_state.pointer_y[touchPoint.id()] = touchPoint.pos().y() * g_dpi_scale; + void initializeGL(); + void paintGL(); - input.x = touchPoint.pos().x() * g_dpi_scale; - input.y = touchPoint.pos().y() * g_dpi_scale; - input.flags = (touchPoint.state() == Qt::TouchPointPressed) ? TOUCH_DOWN : TOUCH_UP; - input.id = touchPoint.id(); - NativeTouch(input); - break; - case Qt::TouchPointMoved: - input_state.pointer_x[touchPoint.id()] = touchPoint.pos().x() * g_dpi_scale; - input_state.pointer_y[touchPoint.id()] = touchPoint.pos().y() * g_dpi_scale; - - input.x = touchPoint.pos().x() * g_dpi_scale; - input.y = touchPoint.pos().y() * g_dpi_scale; - input.flags = TOUCH_MOVE; - input.id = touchPoint.id(); - NativeTouch(input); - break; - default: - break; - } - } - break; - case QEvent::MouseButtonDblClick: - if (!g_Config.bShowTouchControls || GetUIState() != UISTATE_INGAME) - emit doubleClick(); - break; - case QEvent::MouseButtonPress: - case QEvent::MouseButtonRelease: - input_state.pointer_down[0] = (e->type() == QEvent::MouseButtonPress); - input_state.pointer_x[0] = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; - input_state.pointer_y[0] = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; - - input.x = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; - input.y = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; - input.flags = (e->type() == QEvent::MouseButtonPress) ? TOUCH_DOWN : TOUCH_UP; - input.id = 0; - NativeTouch(input); - break; - case QEvent::MouseMove: - input_state.pointer_x[0] = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; - input_state.pointer_y[0] = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; - - input.x = ((QMouseEvent*)e)->pos().x() * g_dpi_scale; - input.y = ((QMouseEvent*)e)->pos().y() * g_dpi_scale; - input.flags = TOUCH_MOVE; - input.id = 0; - NativeTouch(input); - break; - case QEvent::Wheel: - NativeKey(KeyInput(DEVICE_ID_MOUSE, ((QWheelEvent*)e)->delta()<0 ? NKCODE_EXT_MOUSEWHEEL_DOWN : NKCODE_EXT_MOUSEWHEEL_UP, KEY_DOWN)); - break; - case QEvent::KeyPress: - NativeKey(KeyInput(DEVICE_ID_KEYBOARD, KeyMapRawQttoNative.find(((QKeyEvent*)e)->key())->second, KEY_DOWN)); - break; - case QEvent::KeyRelease: - NativeKey(KeyInput(DEVICE_ID_KEYBOARD, KeyMapRawQttoNative.find(((QKeyEvent*)e)->key())->second, KEY_UP)); - break; - default: - return QWidget::event(e); - } - e->accept(); - return true; - } - - void initializeGL() - { -#ifndef USING_GLES2 - glewInit(); -#endif - graphicsContext = new QtDummyGraphicsContext(); - NativeInitGraphics(graphicsContext); - } - - void paintGL() - { - updateAccelerometer(); - UpdateInputState(&input_state); - time_update(); - UpdateRunLoop(); - } - - void updateAccelerometer() - { -#if defined(MOBILE_DEVICE) && !defined(MAEMO) - // TODO: Toggle it depending on whether it is enabled - QAccelerometerReading *reading = acc->reading(); - if (reading) { - input_state.acc.x = reading->x(); - input_state.acc.y = reading->y(); - input_state.acc.z = reading->z(); - AxisInput axis; - axis.deviceId = DEVICE_ID_ACCELEROMETER; - axis.flags = 0; - - axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_X; - axis.value = input_state.acc.x; - NativeAxis(axis); - - axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_Y; - axis.value = input_state.acc.y; - NativeAxis(axis); - - axis.axisId = JOYSTICK_AXIS_ACCELEROMETER_Z; - axis.value = input_state.acc.z; - NativeAxis(axis); - } -#endif - } + void updateAccelerometer(); private: InputState input_state; @@ -242,59 +79,21 @@ private: #endif }; -static MainUI* emugl = NULL; +extern MainUI* emugl; #ifndef SDL // Audio -#define AUDIO_FREQ 44100 -#define AUDIO_CHANNELS 2 -#define AUDIO_SAMPLES 2048 -#define AUDIO_SAMPLESIZE 16 -#define AUDIO_BUFFERS 5 class MainAudio: public QObject { Q_OBJECT public: - MainAudio() { - } - ~MainAudio() { - if (feed != NULL) { - killTimer(timer); - feed->close(); - } - if (output) { - output->stop(); - delete output; - } - if (mixbuf) - free(mixbuf); - } + MainAudio() {} + ~MainAudio(); public slots: - void run() { - QAudioFormat fmt; - fmt.setSampleRate(AUDIO_FREQ); - fmt.setCodec("audio/pcm"); - fmt.setChannelCount(AUDIO_CHANNELS); - fmt.setSampleSize(AUDIO_SAMPLESIZE); - fmt.setByteOrder(QAudioFormat::LittleEndian); - fmt.setSampleType(QAudioFormat::SignedInt); - mixlen = sizeof(short)*AUDIO_BUFFERS*AUDIO_CHANNELS*AUDIO_SAMPLES; - mixbuf = (char*)malloc(mixlen); - output = new QAudioOutput(fmt); - output->setBufferSize(mixlen); - feed = output->start(); - if (feed != NULL) - timer = startTimer((1000*AUDIO_SAMPLES) / AUDIO_FREQ); - } - + void run(); protected: - void timerEvent(QTimerEvent *) { - memset(mixbuf, 0, mixlen); - size_t frames = NativeMix((short *)mixbuf, AUDIO_BUFFERS*AUDIO_SAMPLES); - if (frames > 0) - feed->write(mixbuf, sizeof(short) * AUDIO_CHANNELS * frames); - } + void timerEvent(QTimerEvent *); private: QIODevice* feed; QAudioOutput* output;