From 201d5feb3957bbdde31b7fdff86718c9136cc078 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 11 Jan 2023 19:14:12 +0000 Subject: [PATCH] steamcompmgr: Add --force-windows-fullscreen Useful for browsers or nested desktop environments. Also adds GAMESCOPE_FORCE_WINDOWS_FULLSCREEN atom per-xwayland. --- src/main.cpp | 2 ++ src/steamcompmgr.cpp | 14 +++++++++++++- src/xwayland_ctx.hpp | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index e6efb2d..5ef56c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -84,6 +84,7 @@ const struct option *gamescope_options = (struct option[]){ { "disable-xres", no_argument, nullptr, 'x' }, { "fade-out-duration", required_argument, nullptr, 0 }, { "force-orientation", required_argument, nullptr, 0 }, + { "force-windows-fullscreen", no_argument, nullptr, 0 }, { "hdr-enabled", no_argument, nullptr, 0 }, { "hdr-sdr-content-nits", required_argument, nullptr, 0 }, @@ -120,6 +121,7 @@ const char usage[] = " --xwayland-count create N xwayland servers\n" " --prefer-vk-device prefer Vulkan device for compositing (ex: 1002:7300)\n" " --force-orientation rotate the internal display (left, right, normal, upsidedown)\n" + " --force-windows-fullscreen force windows inside of gamescope to be the size of the nested display (fullscreen)\n" " --hdr-enabled enable HDR output (needs Gamescope WSI layer enabled for support from clients)\n" " If this is not set, and there is a HDR client, it will be tonemapped SDR.\n" " --hdr-wide-gammut-for-sdr treat SDR sRGB content as having Rec.2020 primaries. Makes colors more vivid at cost of 'correctness'.\n" diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index f7fbcac..a38a247 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -2767,7 +2767,7 @@ determine_and_apply_focus(xwayland_ctx_t *ctx, std::vector& vecGlobalPossi if (w->a.x != 0 || w->a.y != 0) XMoveWindow(ctx->dpy, ctx->focus.focusWindow->id, 0, 0); - if ( window_is_fullscreen( ctx->focus.focusWindow ) ) + if ( window_is_fullscreen( ctx->focus.focusWindow ) || ctx->force_windows_fullscreen ) { bool bIsSteam = window_is_steam( ctx->focus.focusWindow ); int fs_width = ctx->root_width; @@ -4509,6 +4509,11 @@ handle_property_notify(xwayland_ctx_t *ctx, XPropertyEvent *ev) g_flLinearToNits = 400.0f; hasRepaint = true; } + if ( ev->atom == ctx->atoms.gamescopeForceWindowsFullscreen ) + { + ctx->force_windows_fullscreen = !!get_prop( ctx, ctx->root, ctx->atoms.gamescopeForceWindowsFullscreen, 0 ); + focusDirty = true; + } for (int i = 0; i < DRM_SCREEN_TYPE_COUNT; i++) { if ( ev->atom == ctx->atoms.gamescopeColorLut3D[i] ) @@ -5499,6 +5504,8 @@ void init_xwayland_ctx(gamescope_xwayland_server_t *xwayland_server) ctx->atoms.gamescopeHDROutputFeedback = XInternAtom( ctx->dpy, "GAMESCOPE_HDR_OUTPUT_FEEDBACK", false ); ctx->atoms.gamescopeHDRSDRContentBrightness = XInternAtom( ctx->dpy, "GAMESCOPE_HDR_SDR_CONTENT_BRIGHTNESS", false ); + ctx->atoms.gamescopeForceWindowsFullscreen = XInternAtom( ctx->dpy, "GAMESCOPE_FORCE_WINDOWS_FULLSCREEN", false ); + ctx->atoms.gamescopeColorLut3D[DRM_SCREEN_TYPE_INTERNAL] = XInternAtom( ctx->dpy, "GAMESCOPE_COLOR_3DLUT", false ); ctx->atoms.gamescopeColorLut3D[DRM_SCREEN_TYPE_EXTERNAL] = XInternAtom( ctx->dpy, "GAMESCOPE_COLOR_3DLUT_EXTERNAL", false ); @@ -5638,6 +5645,7 @@ steamcompmgr_main(int argc, char **argv) int o; int opt_index = -1; + bool bForceWindowsFullscreen = false; while ((o = getopt_long(argc, argv, gamescope_optstring, gamescope_options, &opt_index)) != -1) { const char *opt_name; @@ -5682,6 +5690,8 @@ steamcompmgr_main(int argc, char **argv) sscanf(optarg, "%d,%d", &g_customCursorHotspotX, &g_customCursorHotspotY); } else if (strcmp(opt_name, "fade-out-duration") == 0) { g_FadeOutDuration = atoi(optarg); + } else if (strcmp(opt_name, "force-windows-fullscreen") == 0) { + bForceWindowsFullscreen = true; } else if (strcmp(opt_name, "hdr-enabled") == 0) { g_bHDREnabled = true; } else if (strcmp(opt_name, "hdr-sdr-content-nits") == 0) { @@ -5784,6 +5794,8 @@ steamcompmgr_main(int argc, char **argv) uint32_t serverId = static_cast(i); XChangeProperty(server->ctx->dpy, server->ctx->root, server->ctx->atoms.gamescopeXwaylandServerId, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&serverId, 1 ); + + server->ctx->force_windows_fullscreen = bForceWindowsFullscreen; } } diff --git a/src/xwayland_ctx.hpp b/src/xwayland_ctx.hpp index 91ed81b..cc58985 100644 --- a/src/xwayland_ctx.hpp +++ b/src/xwayland_ctx.hpp @@ -65,6 +65,8 @@ struct xwayland_ctx_t double accum_x = 0.0; double accum_y = 0.0; + bool force_windows_fullscreen = false; + struct { Atom steamAtom; Atom gameAtom; @@ -179,6 +181,8 @@ struct xwayland_ctx_t Atom gamescopeHDROutputFeedback; Atom gamescopeHDRSDRContentBrightness; + Atom gamescopeForceWindowsFullscreen; + Atom gamescopeColorLut3D[DRM_SCREEN_TYPE_COUNT]; Atom gamescopeColorShaperLut[DRM_SCREEN_TYPE_COUNT];