From bf17d81d2573b8c3d333252c7a8e2c5edd6c0aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Wed, 10 Jul 2019 09:58:01 +0200 Subject: [PATCH] Add Basic Keyboard Input --- gui/include/streamsession.h | 5 +++++ gui/include/streamwindow.h | 4 ++++ gui/src/streamsession.cpp | 42 +++++++++++++++++++++++++++++++++++++ gui/src/streamwindow.cpp | 13 ++++++++++++ 4 files changed, 64 insertions(+) diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index 0db073b..b1f9dbd 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -31,6 +31,7 @@ class QGamepad; class QAudioOutput; class QIODevice; +class QKeyEvent; class StreamSession : public QObject { @@ -45,6 +46,8 @@ class StreamSession : public QObject QGamepad *gamepad; #endif + ChiakiControllerState keyboard_state; + VideoDecoder video_decoder; QAudioOutput *audio_output; @@ -62,6 +65,8 @@ class StreamSession : public QObject #endif VideoDecoder *GetVideoDecoder() { return &video_decoder; } + void HandleKeyboardEvent(QKeyEvent *event); + signals: void CurrentImageUpdated(); diff --git a/gui/include/streamwindow.h b/gui/include/streamwindow.h index f842a25..2e7fcb4 100644 --- a/gui/include/streamwindow.h +++ b/gui/include/streamwindow.h @@ -38,6 +38,10 @@ class StreamWindow: public QMainWindow void SetImage(const QImage &image); + protected: + void keyPressEvent(QKeyEvent *event) override; + void keyReleaseEvent(QKeyEvent *event) override; + private slots: void FramesAvailable(); }; diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index 87b4924..cc68370 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -24,9 +24,11 @@ #include #endif +#include #include #include +#include static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user); @@ -88,6 +90,8 @@ StreamSession::StreamSession(const QString &host, const QString ®istkey, cons audio_output = new QAudioOutput(audio_format, this); audio_io = audio_output->start(); + memset(&keyboard_state, 0, sizeof(keyboard_state)); + chiaki_session_init(&session, &connect_info); chiaki_session_set_audio_frame_cb(&session, AudioFrameCb, this); chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this); @@ -108,6 +112,42 @@ StreamSession::~StreamSession() chiaki_session_fini(&session); } +void StreamSession::HandleKeyboardEvent(QKeyEvent *event) +{ + uint64_t button_mask; + switch(event->key()) + { + case Qt::Key::Key_Left: + button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_LEFT; + break; + case Qt::Key::Key_Right: + button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_RIGHT; + break; + case Qt::Key::Key_Up: + button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_UP; + break; + case Qt::Key::Key_Down: + button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_DOWN; + break; + case Qt::Key::Key_Return: + button_mask = CHIAKI_CONTROLLER_BUTTON_CROSS; + break; + case Qt::Key::Key_Backspace: + button_mask = CHIAKI_CONTROLLER_BUTTON_MOON; + break; + default: + // not interested + return; + } + + if(event->type() == QEvent::KeyPress) + keyboard_state.buttons |= button_mask; + else + keyboard_state.buttons &= ~button_mask; + + SendFeedbackState(); +} + #if CHIAKI_GUI_ENABLE_QT_GAMEPAD void StreamSession::UpdateGamepads() { @@ -183,6 +223,8 @@ void StreamSession::SendFeedbackState() } #endif + state.buttons |= keyboard_state.buttons; + chiaki_session_set_controller_state(&session, &state); } diff --git a/gui/src/streamwindow.cpp b/gui/src/streamwindow.cpp index 27af570..5cf5b53 100644 --- a/gui/src/streamwindow.cpp +++ b/gui/src/streamwindow.cpp @@ -33,6 +33,8 @@ StreamWindow::StreamWindow(StreamSession *session, QWidget *parent) connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable); FramesAvailable(); + + grabKeyboard(); } StreamWindow::~StreamWindow() @@ -44,6 +46,17 @@ void StreamWindow::SetImage(const QImage &image) imageLabel->setPixmap(QPixmap::fromImage(image)); } +void StreamWindow::keyPressEvent(QKeyEvent *event) +{ + session->HandleKeyboardEvent(event); +} + +void StreamWindow::keyReleaseEvent(QKeyEvent *event) +{ + session->HandleKeyboardEvent(event); +} + + void StreamWindow::FramesAvailable() { QImage prev;