From 9e6aaac464e6fb5d5c4f587d258bf18db69b9b34 Mon Sep 17 00:00:00 2001 From: Collecting Date: Sun, 4 Jan 2026 02:23:53 +0000 Subject: [PATCH] fix(overhaul): UI and resolution bugs for Steam Deck (Gamescope) Signed-off-by: Collecting --- src/citron/util/multiplayer_room_overlay.cpp | 66 +++++++++----------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/src/citron/util/multiplayer_room_overlay.cpp b/src/citron/util/multiplayer_room_overlay.cpp index f5666b322..49e04988c 100644 --- a/src/citron/util/multiplayer_room_overlay.cpp +++ b/src/citron/util/multiplayer_room_overlay.cpp @@ -18,12 +18,17 @@ #include "network/room.h" #include "citron/uisettings.h" -MultiplayerRoomOverlay::MultiplayerRoomOverlay(GMainWindow* parent) - : QWidget(parent), main_window(parent) { +MultiplayerRoomOverlay::MultiplayerRoomOverlay(QWidget* parent) +: QWidget(parent) { - setAttribute(Qt::WA_TranslucentBackground, true); - setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); - setFocusPolicy(Qt::ClickFocus); + main_window = qobject_cast(parent->window()); + + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + setAttribute(Qt::WA_TranslucentBackground); + + // Set smaller sizes for Steam Deck + setMinimumSize(240, 180); + resize(260, 220); main_layout = new QGridLayout(this); main_layout->setContentsMargins(padding, padding, 0, 0); @@ -58,7 +63,9 @@ MultiplayerRoomOverlay::MultiplayerRoomOverlay(GMainWindow* parent) update_timer.setSingleShot(false); connect(&update_timer, &QTimer::timeout, this, &MultiplayerRoomOverlay::UpdateRoomData); - connect(parent, &GMainWindow::themeChanged, this, &MultiplayerRoomOverlay::UpdateTheme); + if (main_window) { + connect(main_window, &GMainWindow::themeChanged, this, &MultiplayerRoomOverlay::UpdateTheme); + } UpdateTheme(); setMinimumSize(280, 220); @@ -108,48 +115,35 @@ void MultiplayerRoomOverlay::resizeEvent(QResizeEvent* event) { QWidget::resizeE 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()) { - QTimer::singleShot(0, this, [this] { windowHandle()->startSystemMove(); }); - } - } - } - QWidget::mousePressEvent(event); -} - -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())) { - // Let the size grip handle the event - } else if (!childAt(event->pos()) || childAt(event->pos()) == this) { + if (event->button() == Qt::LeftButton && !size_grip->geometry().contains(event->pos())) { + const bool is_gamescope = !qgetenv("GAMESCOPE_WIDTH").isEmpty() || qgetenv("XDG_CURRENT_DESKTOP") == "gamescope"; + if (is_gamescope) { is_dragging = true; - drag_start_pos = event->globalPosition().toPoint(); - widget_start_pos = this->pos(); + drag_start_pos = event->globalPosition().toPoint() - this->pos(); setCursor(Qt::ClosedHandCursor); + } else { + #if defined(Q_OS_LINUX) + if (windowHandle()) windowHandle()->startSystemMove(); + #else + is_dragging = true; + drag_start_pos = event->globalPosition().toPoint() - this->pos(); + setCursor(Qt::ClosedHandCursor); + #endif } } 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; + if (is_dragging && main_window) { + QPoint new_pos = event->globalPosition().toPoint() - drag_start_pos; + QPoint win_origin = main_window->mapToGlobal(QPoint(0, 0)); + move(std::clamp(new_pos.x(), win_origin.x(), win_origin.x() + main_window->width() - width()), + std::clamp(new_pos.y(), win_origin.y(), win_origin.y() + main_window->height() - height())); } QWidget::mouseMoveEvent(event); } -#endif void MultiplayerRoomOverlay::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton && is_dragging) {