From e5f5fdee2e5ae11c1ab417946694079b3a46d4d1 Mon Sep 17 00:00:00 2001 From: adityaruplaha Date: Thu, 29 Mar 2018 11:24:34 +0530 Subject: [PATCH] SDL2: Implement fullscreen --- src/citra/citra.cpp | 23 ++++++++++++++------ src/citra/emu_window/emu_window_sdl2.cpp | 27 +++++++++++++++++++++++- src/citra/emu_window/emu_window_sdl2.h | 5 ++++- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index a6578676a..f5c75820d 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -57,6 +57,7 @@ static void PrintHelp(const char* argv0) { " Nickname, password, address and port for multiplayer\n" "-r, --movie-record=[file] Record a movie (game inputs) to the given file\n" "-p, --movie-play=[file] Playback the movie (game inputs) from the given file\n" + "-f, --fullscreen Start in fullscreen mode\n" "-h, --help Display this help and exit\n" "-v, --version Output version information and exit\n"; } @@ -134,20 +135,26 @@ int main(int argc, char** argv) { std::string filepath; bool use_multiplayer = false; + bool fullscreen = false; std::string nickname{}; std::string password{}; std::string address{}; u16 port = Network::DefaultRoomPort; static struct option long_options[] = { - {"gdbport", required_argument, 0, 'g'}, {"install", required_argument, 0, 'i'}, - {"multiplayer", required_argument, 0, 'm'}, {"movie-record", required_argument, 0, 'r'}, - {"movie-play", required_argument, 0, 'p'}, {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'v'}, {0, 0, 0, 0}, + {"gdbport", required_argument, 0, 'g'}, + {"install", required_argument, 0, 'i'}, + {"multiplayer", required_argument, 0, 'm'}, + {"movie-record", required_argument, 0, 'r'}, + {"movie-play", required_argument, 0, 'p'}, + {"fullscreen", no_argument, 0, 'f'}, + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'v'}, + {0, 0, 0, 0}, }; while (optind < argc) { - char arg = getopt_long(argc, argv, "g:i:m:r:p:hv", long_options, &option_index); + char arg = getopt_long(argc, argv, "g:i:m:r:p:fhv", long_options, &option_index); if (arg != -1) { switch (arg) { case 'g': @@ -210,6 +217,10 @@ int main(int argc, char** argv) { case 'p': movie_play = optarg; break; + case 'f': + fullscreen = true; + NGLOG_INFO(Frontend, "Starting in fullscreen mode..."); + break; case 'h': PrintHelp(argv[0]); return 0; @@ -255,7 +266,7 @@ int main(int argc, char** argv) { Settings::values.movie_record = std::move(movie_record); Settings::Apply(); - std::unique_ptr emu_window{std::make_unique()}; + std::unique_ptr emu_window{std::make_unique(fullscreen)}; Core::System& system{Core::System::GetInstance()}; diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index cf44ea991..c35cfceb4 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -58,7 +58,28 @@ void EmuWindow_SDL2::OnResize() { UpdateCurrentFramebufferLayout(width, height); } -EmuWindow_SDL2::EmuWindow_SDL2() { +void EmuWindow_SDL2::Fullscreen() { + if (SDL_SetWindowFullscreen(render_window, SDL_WINDOW_FULLSCREEN) == 0) { + return; + } + + NGLOG_ERROR(Frontend, "Fullscreening failed: {}", SDL_GetError()); + + // Try a different fullscreening method + NGLOG_INFO(Frontend, "Attempting to use borderless fullscreen..."); + if (SDL_SetWindowFullscreen(render_window, SDL_WINDOW_FULLSCREEN_DESKTOP) == 0) { + return; + } + + NGLOG_ERROR(Frontend, "Borderless fullscreening failed: {}", SDL_GetError()); + + // Fallback algorithm: Maximise window. + // Works on all systems (unless something is seriously wrong), so no fallback for this one. + NGLOG_INFO(Frontend, "Falling back on a maximised window..."); + SDL_MaximizeWindow(render_window); +} + +EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) { InputCommon::Init(); Network::Init(); @@ -93,6 +114,10 @@ EmuWindow_SDL2::EmuWindow_SDL2() { exit(1); } + if (fullscreen) { + Fullscreen(); + } + gl_context = SDL_GL_CreateContext(render_window); if (gl_context == nullptr) { diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 3664d2fbe..7d5cfffb6 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -12,7 +12,7 @@ struct SDL_Window; class EmuWindow_SDL2 : public EmuWindow { public: - EmuWindow_SDL2(); + explicit EmuWindow_SDL2(bool fullscreen); ~EmuWindow_SDL2(); /// Swap buffers to display the next frame @@ -43,6 +43,9 @@ private: /// Called by PollEvents when any event that may cause the window to be resized occurs void OnResize(); + /// Called when user passes the fullscreen parameter flag + void Fullscreen(); + /// Called when a configuration change affects the minimal size of the window void OnMinimalClientAreaChangeRequest( const std::pair& minimal_size) override;