From e5f5fdee2e5ae11c1ab417946694079b3a46d4d1 Mon Sep 17 00:00:00 2001
From: adityaruplaha <adi24360526@gmail.com>
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<EmuWindow_SDL2> emu_window{std::make_unique<EmuWindow_SDL2>()};
+    std::unique_ptr<EmuWindow_SDL2> emu_window{std::make_unique<EmuWindow_SDL2>(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<unsigned, unsigned>& minimal_size) override;