Переглянути джерело

Allowing enabling and disabling of immersive mode via borderless setting and love.window.setMode()

fysx 11 роки тому
батько
коміт
42f6beaa7e

+ 14 - 0
jni/love/src/common/android.cpp

@@ -35,6 +35,20 @@ namespace love
 namespace android
 {
 
+void setBorderless (bool borderless_active) {
+	JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
+
+	jobject activity = (jobject) SDL_AndroidGetActivity();
+
+	jclass clazz (env->GetObjectClass(activity));
+	jmethodID method_id = env->GetMethodID (clazz, "setImmersiveMode", "(Z)V");
+
+	env->CallVoidMethod (activity, method_id, borderless_active);
+
+	env->DeleteLocalRef (activity);
+	env->DeleteLocalRef (clazz);
+}
+
 double getScreenScale()
 {
   static double result = -1.;

+ 2 - 0
jni/love/src/common/android.h

@@ -32,6 +32,8 @@ namespace love
 namespace android
 {
 
+void setBorderless (bool borderless_active);
+
 /**
  * Gets the scale factor of the window's screen, e.g. on Retina displays this
  * will return 2.0.

+ 4 - 0
jni/love/src/modules/window/sdl/Window.cpp

@@ -244,6 +244,10 @@ bool Window::setWindow(int width, int height, WindowSettings *settings)
 
 		if (!gfx->setMode(width, height, curMode.settings.sRGB))
 			showMessageBox("Could not set graphics mode", "Unsupported OpenGL version?", MESSAGEBOX_ERROR, true);
+
+#ifdef LOVE_ANDROID
+		love::android::setBorderless(f.borderless);
+#endif
 	}
 
 	// Make sure the mouse keeps its previous grab setting.

+ 44 - 7
src/org/love2d/android/GameActivity.java

@@ -12,6 +12,7 @@ import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 
+import android.app.Activity;
 import android.app.DownloadManager;
 import android.app.ProgressDialog;
 import android.content.Context;
@@ -36,6 +37,7 @@ public class GameActivity extends SDLActivity {
     private static String gamePath = "";
     private static Context context;
     private static Vibrator vibrator;
+    private static boolean immersiveActive = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -82,13 +84,48 @@ public class GameActivity extends SDLActivity {
     @Override
     public void onResume() {
       super.onResume();
-      getWindow().getDecorView().setSystemUiVisibility(
-          View.SYSTEM_UI_FLAG_LAYOUT_STABLE
-          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
-          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
-          | View.SYSTEM_UI_FLAG_FULLSCREEN
-          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+
+      if (immersiveActive) {
+        getWindow().getDecorView().setSystemUiVisibility(
+            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+            | View.SYSTEM_UI_FLAG_FULLSCREEN
+            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+      }
+    }
+
+    public void setImmersiveMode (boolean immersive_mode) {
+      immersiveActive = immersive_mode;
+
+      final Object lock = new Object();
+      final boolean immersive_enabled = immersive_mode;
+      synchronized (lock) {
+        runOnUiThread (new Runnable() {
+          @Override
+          public void run() {
+            synchronized (lock) {
+              if (immersive_enabled) {
+                getWindow().getDecorView().setSystemUiVisibility(
+                  View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                  | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                  | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                  | View.SYSTEM_UI_FLAG_FULLSCREEN
+                  | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+              } else {
+                getWindow().getDecorView().setSystemUiVisibility(
+                  View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                  | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                  );
+              }
+
+              lock.notify();
+            }
+          }
+        });
+      };
     }
 
     public static String getGamePath() {