From 18348b150b654d8435f4475bdb7548bc5be9b7ae Mon Sep 17 00:00:00 2001 From: collecting Date: Fri, 24 Oct 2025 03:41:57 +0000 Subject: [PATCH 1/3] fix: Multiplayer Room Overlay --- src/citron/util/multiplayer_room_overlay.cpp | 57 +++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/citron/util/multiplayer_room_overlay.cpp b/src/citron/util/multiplayer_room_overlay.cpp index 020fd0766..2fc2e62a6 100644 --- a/src/citron/util/multiplayer_room_overlay.cpp +++ b/src/citron/util/multiplayer_room_overlay.cpp @@ -28,7 +28,7 @@ MultiplayerRoomOverlay::MultiplayerRoomOverlay(GMainWindow* parent) border_color = QColor(60, 60, 60, 120); main_layout = new QGridLayout(this); - main_layout->setContentsMargins(padding, padding, 0, 0); // No margins on bottom/right for grip + main_layout->setContentsMargins(padding, padding, 0, 0); main_layout->setSpacing(6); players_online_label = new QLabel(this); @@ -71,7 +71,6 @@ MultiplayerRoomOverlay::~MultiplayerRoomOverlay() { } void MultiplayerRoomOverlay::OnEmulationStarting() { - // When emulation starts, resume updates if we are visible. if (is_visible) { ConnectToRoom(); update_timer.start(500); @@ -79,7 +78,6 @@ void MultiplayerRoomOverlay::OnEmulationStarting() { } void MultiplayerRoomOverlay::OnEmulationStopping() { - // CRASH FIX: When emulation stops, immediately disconnect from network objects. update_timer.stop(); DisconnectFromRoom(); } @@ -90,7 +88,6 @@ void MultiplayerRoomOverlay::SetVisible(bool visible) { if (visible) { show(); - // Only start connecting and updating if emulation is running. if (main_window && main_window->IsEmulationRunning()) { ConnectToRoom(); update_timer.start(500); @@ -116,19 +113,26 @@ void MultiplayerRoomOverlay::paintEvent(QPaintEvent* event) { void MultiplayerRoomOverlay::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); if (!has_been_moved) UpdatePosition(); } bool MultiplayerRoomOverlay::eventFilter(QObject* watched, QEvent* event) { if (event->type() == QEvent::MouseButtonPress) { if (chat_room_widget->hasFocus()) { chat_room_widget->clearFocus(); } } return QObject::eventFilter(watched, event); } + #if defined(Q_OS_LINUX) void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { if (size_grip->geometry().contains(event->pos())) { // Let the size grip handle the event } else if (!childAt(event->pos()) || childAt(event->pos()) == this) { - if (windowHandle()) windowHandle()->startSystemMove(); + if (windowHandle()) { + QTimer::singleShot(0, this, [this] { windowHandle()->startSystemMove(); }); + } } } QWidget::mousePressEvent(event); } -void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) { QWidget::mouseMoveEvent(event); } -#else + +void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) { + QWidget::mouseMoveEvent(event); +} + +#else // Windows and other platforms void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { if (size_grip->geometry().contains(event->pos())) { @@ -142,12 +146,14 @@ void MultiplayerRoomOverlay::mousePressEvent(QMouseEvent* event) { } QWidget::mousePressEvent(event); } + void MultiplayerRoomOverlay::mouseMoveEvent(QMouseEvent* event) { if (is_dragging) { QPoint delta = event->globalPosition().toPoint() - drag_start_pos; move(widget_start_pos + delta); + has_been_moved = true; } - QWidget::mouseMoveEvent(event); // Corrected typo here + QWidget::mouseMoveEvent(event); } #endif @@ -177,7 +183,10 @@ void MultiplayerRoomOverlay::ConnectToRoom() { room_member = room_network.GetRoomMember().lock(); if (room_member) { - chat_room_widget->Initialize(&room_network); + if (!is_chat_initialized) { + chat_room_widget->Initialize(&room_network); + is_chat_initialized = true; + } } else { chat_room_widget->Clear(); chat_room_widget->AppendStatusMessage(tr("Not connected to a room.")); @@ -185,10 +194,17 @@ void MultiplayerRoomOverlay::ConnectToRoom() { } void MultiplayerRoomOverlay::DisconnectFromRoom() { - chat_room_widget->Clear(); + ClearUI(); room_member.reset(); multiplayer_state = nullptr; + is_chat_initialized = false; +} + +void MultiplayerRoomOverlay::ClearUI() { players_online_label->setText(QString::fromUtf8("Players Online: 0")); + chat_room_widget->Clear(); + chat_room_widget->AppendStatusMessage(tr("Not connected to a room.")); + chat_room_widget->SetPlayerList({}); } void MultiplayerRoomOverlay::UpdateRoomData() { @@ -203,26 +219,27 @@ void MultiplayerRoomOverlay::UpdateRoomData() { chat_room_widget->Clear(); chat_room_widget->AppendStatusMessage(tr("Chat available in main window.")); } - } else { - if (!chat_room_widget->isEnabled()) { - ConnectToRoom(); - } + return; + } + + if (!chat_room_widget->isEnabled()) { + ConnectToRoom(); } if (room_member && room_member->GetState() >= Network::RoomMember::State::Joined) { const auto& members = room_member->GetMemberInformation(); QString label_text = QString::fromStdString("Players Online: %1").arg(members.size()); players_online_label->setText(label_text); + + // FIX: Removed the redundant logic that was generating duplicate join/leave messages. + // The ChatRoom widget is now the single source of truth for these messages. + if (chat_room_widget->isEnabled()) { chat_room_widget->SetPlayerList(members); } } else { - players_online_label->setText(QString::fromUtf8("Players Online: 0")); - if (!room_member && !multiplayer_state->IsClientRoomVisible()) { - chat_room_widget->Clear(); - chat_room_widget->AppendStatusMessage(tr("Not connected to a room.")); - ConnectToRoom(); - } + ClearUI(); + room_member.reset(); } } From e8d838335fa71d2ce4eb535adf43b767ef72997c Mon Sep 17 00:00:00 2001 From: collecting Date: Fri, 24 Oct 2025 03:42:24 +0000 Subject: [PATCH 2/3] fix: Multiplayer Room Overlay --- src/citron/util/multiplayer_room_overlay.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/citron/util/multiplayer_room_overlay.h b/src/citron/util/multiplayer_room_overlay.h index d93580f18..5a5e84233 100644 --- a/src/citron/util/multiplayer_room_overlay.h +++ b/src/citron/util/multiplayer_room_overlay.h @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include "citron/multiplayer/state.h" #include "citron/multiplayer/chat_room.h" @@ -45,6 +47,7 @@ private: void UpdatePosition(); void ConnectToRoom(); void DisconnectFromRoom(); + void ClearUI(); GMainWindow* main_window; QTimer update_timer; @@ -74,4 +77,7 @@ private: bool has_been_moved = false; QPoint drag_start_pos; QPoint widget_start_pos; + + // State tracking + bool is_chat_initialized = false; }; From ba62e4be62cba2ac0f1399250210e509f48faf9d Mon Sep 17 00:00:00 2001 From: collecting Date: Fri, 24 Oct 2025 04:11:55 +0000 Subject: [PATCH 3/3] Edit: multiplayer_room_overlay.cpp --- src/citron/util/multiplayer_room_overlay.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/citron/util/multiplayer_room_overlay.cpp b/src/citron/util/multiplayer_room_overlay.cpp index 2fc2e62a6..0d36a0fe5 100644 --- a/src/citron/util/multiplayer_room_overlay.cpp +++ b/src/citron/util/multiplayer_room_overlay.cpp @@ -174,7 +174,7 @@ void MultiplayerRoomOverlay::ConnectToRoom() { if (multiplayer_state->IsClientRoomVisible()) { chat_room_widget->setEnabled(false); chat_room_widget->Clear(); - chat_room_widget->AppendStatusMessage(tr("Chat available in main window.")); + chat_room_widget->AppendStatusMessage(tr("In order to use chat functionality in the Overlay, please close the Multiplayer Room Window.")); return; } @@ -217,7 +217,7 @@ void MultiplayerRoomOverlay::UpdateRoomData() { if (chat_room_widget->isEnabled()) { chat_room_widget->setEnabled(false); chat_room_widget->Clear(); - chat_room_widget->AppendStatusMessage(tr("Chat available in main window.")); + chat_room_widget->AppendStatusMessage(tr("In order to use chat functionality in the Overlay, please close the Multiplayer Room Window.")); } return; } @@ -231,9 +231,6 @@ void MultiplayerRoomOverlay::UpdateRoomData() { QString label_text = QString::fromStdString("Players Online: %1").arg(members.size()); players_online_label->setText(label_text); - // FIX: Removed the redundant logic that was generating duplicate join/leave messages. - // The ChatRoom widget is now the single source of truth for these messages. - if (chat_room_widget->isEnabled()) { chat_room_widget->SetPlayerList(members); } @@ -249,4 +246,4 @@ void MultiplayerRoomOverlay::UpdatePosition() { QPoint main_window_pos = main_window->mapToGlobal(QPoint(0, 0)); move(main_window_pos.x() + main_window->width() - this->width() - 10, main_window_pos.y() + 10); } -} +} \ No newline at end of file