From 19dac306d102ab7a92e2774afbdf089f5fcccd85 Mon Sep 17 00:00:00 2001 From: jmt-gh <13617455+jmt-gh@users.noreply.github.com> Date: Sun, 10 Jan 2021 07:50:12 -0800 Subject: [PATCH] Add support for Fullscreen UI in Moonlight (#492) * initial UI and window decoration removal toggle * revert default height change * add fullscreen support to kiosk mode * add tool tip for kiosk mode * change to fullscreen rather than kiosk * update to Fullscreen instead of Full-screen or Full Screen * update UI text * convert to display mode picker * add UI label for picker * clean up references to startMaximized and fullScreenUIMode * remove flags property, as fullscreen visiblity handles this already * use Maximized in selection text * account for running moonlight without a window manager * lock display mode from being changed if there is no window manager running Co-authored-by: jmt-gh --- app/gui/SettingsView.qml | 51 ++++++++++++++++++++++----- app/gui/main.qml | 12 +++++-- app/settings/streamingpreferences.cpp | 8 +++-- app/settings/streamingpreferences.h | 14 ++++++-- 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/app/gui/SettingsView.qml b/app/gui/SettingsView.qml index 2f515d3d..befe2f47 100644 --- a/app/gui/SettingsView.qml +++ b/app/gui/SettingsView.qml @@ -551,7 +551,7 @@ Flickable { model: ListModel { id: windowModeListModel ListElement { - text: qsTr("Full-screen") + text: qsTr("Fullscreen") val: StreamingPreferences.WM_FULLSCREEN } ListElement { @@ -570,7 +570,7 @@ Flickable { ToolTip.delay: 1000 ToolTip.timeout: 5000 ToolTip.visible: hovered - ToolTip.text: qsTr("Full-screen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.") + ToolTip.text: qsTr("Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.") } CheckBox { @@ -713,15 +713,50 @@ Flickable { anchors.fill: parent spacing: 5 - CheckBox { - id: startMaximizedCheck + Label { width: parent.width - text: qsTr("Maximize Moonlight window on startup") + id: uiDisplayModeTitle + text: qsTr("Display Mode") font.pointSize: 12 + wrapMode: Text.Wrap + } + + AutoResizingComboBox { + // ignore setting the index at first, and actually set it when the component is loaded + Component.onCompleted: { + var saved_uidisplaymode = StreamingPreferences.uiDisplayMode + currentIndex = 0 + for (var i = 0; i < uiDisplayModeListModel.count; i++) { + var el_uidisplaymode = uiDisplayModeListModel.get(i).val; + if (saved_uidisplaymode === el_uidisplaymode) { + currentIndex = i + break + } + } + activated(currentIndex) + } + + id: uiDisplayModeComboBox enabled: SystemProperties.hasWindowManager - checked: !StreamingPreferences.startWindowed || !SystemProperties.hasWindowManager - onCheckedChanged: { - StreamingPreferences.startWindowed = !checked + textRole: "text" + model: ListModel { + id: uiDisplayModeListModel + ListElement { + text: qsTr("Windowed") + val: StreamingPreferences.UI_WINDOWED + } + ListElement { + text: qsTr("Maximized") + val: StreamingPreferences.UI_FULLSCREEN_WINDOWED + } + ListElement { + text: qsTr("Fullscreen") + val: StreamingPreferences.UI_FULLSCREEN + } + } + // ::onActivated must be used, as it only listens for when the index is changed by a human + onActivated : { + StreamingPreferences.uiDisplayMode = uiDisplayModeListModel.get(currentIndex).val } } diff --git a/app/gui/main.qml b/app/gui/main.qml index 95d4b572..7b411e87 100644 --- a/app/gui/main.qml +++ b/app/gui/main.qml @@ -17,8 +17,16 @@ ApplicationWindow { width: 1280 height: 600 - visibility: (SystemProperties.hasWindowManager && StreamingPreferences.startWindowed) ? "Windowed" : "Maximized" - + visibility: { + if (SystemProperties.hasWindowManager) { + if (StreamingPreferences.uiDisplayMode == StreamingPreferences.UI_WINDOWED) return "Windowed" + else if (StreamingPreferences.uiDisplayMode == StreamingPreferences.UI_FULLSCREEN_WINDOWED) return "Maximized" + else if (StreamingPreferences.uiDisplayMode == StreamingPreferences.UI_FULLSCREEN) return "FullScreen" + } else { + return "Maximized" + } + } + // This configures the maximum width of the singleton attached QML ToolTip. If left unconstrained, // it will never insert a line break and just extend on forever. ToolTip.toolTip.contentWidth: ToolTip.toolTip.implicitContentWidth < 400 ? ToolTip.toolTip.implicitContentWidth : 400 diff --git a/app/settings/streamingpreferences.cpp b/app/settings/streamingpreferences.cpp index e7749571..fb106d01 100644 --- a/app/settings/streamingpreferences.cpp +++ b/app/settings/streamingpreferences.cpp @@ -21,9 +21,9 @@ #define SER_QUITAPPAFTER "quitAppAfter" #define SER_ABSMOUSEMODE "mouseacceleration" #define SER_ABSTOUCHMODE "abstouchmode" -#define SER_STARTWINDOWED "startwindowed" #define SER_FRAMEPACING "framepacing" #define SER_CONNWARNINGS "connwarnings" +#define SER_UIDISPLAYMODE "uidisplaymode" #define SER_RICHPRESENCE "richpresence" #define SER_GAMEPADMOUSE "gamepadmouse" #define SER_DEFAULTVER "defaultver" @@ -68,7 +68,6 @@ void StreamingPreferences::reload() quitAppAfter = settings.value(SER_QUITAPPAFTER, false).toBool(); absoluteMouseMode = settings.value(SER_ABSMOUSEMODE, false).toBool(); absoluteTouchMode = settings.value(SER_ABSTOUCHMODE, true).toBool(); - startWindowed = settings.value(SER_STARTWINDOWED, true).toBool(); framePacing = settings.value(SER_FRAMEPACING, false).toBool(); connectionWarnings = settings.value(SER_CONNWARNINGS, true).toBool(); richPresence = settings.value(SER_RICHPRESENCE, true).toBool(); @@ -90,6 +89,9 @@ void StreamingPreferences::reload() // Try to load from the old preference value too static_cast(settings.value(SER_FULLSCREEN, true).toBool() ? recommendedFullScreenMode : WindowMode::WM_WINDOWED)).toInt()); + uiDisplayMode = static_cast(settings.value(SER_UIDISPLAYMODE, + static_cast(UIDisplayMode::UI_WINDOWED)).toInt()); + // Perform default settings updates as required based on last default version if (defaultVer == 0) { @@ -119,7 +121,6 @@ void StreamingPreferences::save() settings.setValue(SER_QUITAPPAFTER, quitAppAfter); settings.setValue(SER_ABSMOUSEMODE, absoluteMouseMode); settings.setValue(SER_ABSTOUCHMODE, absoluteTouchMode); - settings.setValue(SER_STARTWINDOWED, startWindowed); settings.setValue(SER_FRAMEPACING, framePacing); settings.setValue(SER_CONNWARNINGS, connectionWarnings); settings.setValue(SER_RICHPRESENCE, richPresence); @@ -130,6 +131,7 @@ void StreamingPreferences::save() settings.setValue(SER_VIDEOCFG, static_cast(videoCodecConfig)); settings.setValue(SER_VIDEODEC, static_cast(videoDecoderSelection)); settings.setValue(SER_WINDOWMODE, static_cast(windowMode)); + settings.setValue(SER_UIDISPLAYMODE, static_cast(uiDisplayMode)); settings.setValue(SER_DEFAULTVER, CURRENT_DEFAULT_VER); settings.setValue(SER_SWAPMOUSEBUTTONS, swapMouseButtons); settings.setValue(SER_MUTEONFOCUSLOSS, muteOnFocusLoss); diff --git a/app/settings/streamingpreferences.h b/app/settings/streamingpreferences.h index 7af19bcd..37d653cc 100644 --- a/app/settings/streamingpreferences.h +++ b/app/settings/streamingpreferences.h @@ -50,6 +50,14 @@ public: }; Q_ENUM(WindowMode) + enum UIDisplayMode + { + UI_WINDOWED, + UI_FULLSCREEN_WINDOWED, + UI_FULLSCREEN + }; + Q_ENUM(UIDisplayMode) + Q_PROPERTY(int width MEMBER width NOTIFY displayModeChanged) Q_PROPERTY(int height MEMBER height NOTIFY displayModeChanged) Q_PROPERTY(int fps MEMBER fps NOTIFY displayModeChanged) @@ -63,7 +71,6 @@ public: Q_PROPERTY(bool quitAppAfter MEMBER quitAppAfter NOTIFY quitAppAfterChanged) Q_PROPERTY(bool absoluteMouseMode MEMBER absoluteMouseMode NOTIFY absoluteMouseModeChanged) Q_PROPERTY(bool absoluteTouchMode MEMBER absoluteTouchMode NOTIFY absoluteTouchModeChanged) - Q_PROPERTY(bool startWindowed MEMBER startWindowed NOTIFY startWindowedChanged) Q_PROPERTY(bool framePacing MEMBER framePacing NOTIFY framePacingChanged) Q_PROPERTY(bool connectionWarnings MEMBER connectionWarnings NOTIFY connectionWarningsChanged) Q_PROPERTY(bool richPresence MEMBER richPresence NOTIFY richPresenceChanged) @@ -74,6 +81,7 @@ public: Q_PROPERTY(VideoDecoderSelection videoDecoderSelection MEMBER videoDecoderSelection NOTIFY videoDecoderSelectionChanged) Q_PROPERTY(WindowMode windowMode MEMBER windowMode NOTIFY windowModeChanged) Q_PROPERTY(WindowMode recommendedFullScreenMode MEMBER recommendedFullScreenMode CONSTANT) + Q_PROPERTY(UIDisplayMode uiDisplayMode MEMBER uiDisplayMode NOTIFY uiDisplayModeChanged) Q_PROPERTY(bool swapMouseButtons MEMBER swapMouseButtons NOTIFY mouseButtonsChanged) Q_PROPERTY(bool muteOnFocusLoss MEMBER muteOnFocusLoss NOTIFY muteOnFocusLossChanged) Q_PROPERTY(bool backgroundGamepad MEMBER backgroundGamepad NOTIFY backgroundGamepadChanged) @@ -94,7 +102,6 @@ public: bool quitAppAfter; bool absoluteMouseMode; bool absoluteTouchMode; - bool startWindowed; bool framePacing; bool connectionWarnings; bool richPresence; @@ -111,6 +118,7 @@ public: VideoDecoderSelection videoDecoderSelection; WindowMode windowMode; WindowMode recommendedFullScreenMode; + UIDisplayMode uiDisplayMode; signals: void displayModeChanged(); @@ -127,8 +135,8 @@ signals: void audioConfigChanged(); void videoCodecConfigChanged(); void videoDecoderSelectionChanged(); + void uiDisplayModeChanged(); void windowModeChanged(); - void startWindowedChanged(); void framePacingChanged(); void connectionWarningsChanged(); void richPresenceChanged();