diff --git a/README.md b/README.md
index 66a2e0875..e3e4a447a 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,63 @@
+
PojavLauncher
+
+
+
[](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
+[](https://github.com/PojavLauncherTeam/PojavLauncher/actions)
[](https://crowdin.com/project/pojavlauncher)
-[](https://discord.gg/6RpEJda)
-[](https://reddit.com/r/PojavLauncher)
-[](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch)
+[](https://discord.gg/6RpEJda)
+[](https://twitter.com/PLaunchTeam)
+---------
+* From [Boardwalk](https://github.com/zhuowei/Boardwalk)'s ashes here comes PojavLauncher!
-# PojavLauncher
+* PojavLauncher is a launcher that allows you to play Minecraft:Java Edition on your Android device!
-## Note
+* It can run almost every version of the Minecraft, allowing you to use .jar only installers to install modloaders like [forge](https://files.minecraftforge.net/), [fabric](http://fabricmc.net/), [optifine](https://optifine.net); hack clients like LabyMod and much more!
+
+* For more details [check out our wiki](https://github.com/PojavLauncherTeam/PojavLauncher/wiki)
+## Some notes to start with
- We do not exist on TikTok. No one from the dev team makes TikTok videos.
- The official Twitter for PojavLauncher is [@PLaunchTeam](https://twitter.com/PLaunchTeam). Any others (most notably @PojavLauncher) are fake, please report them to Twitter's moderation team.
## Navigation
- [Introduction](#introduction)
+- [Getting PojavLauncher](#getting-pojavlauncher)
- [Building](#building)
- [Current status](#current-status)
- [License](#license)
- [Contributing](#contributing)
-- [Credits & Third party components and their licenses](#credits--third-party-components-and-their-licenses)
+- [Credits & Third party components and their licenses](#credits--third-party-components-and-their-licenses-if-available)
## Introduction
-PojavLauncher is a Minecraft: Java Edition launcher for Android and iOS based on [Boardwalk](https://github.com/zhuowei/Boardwalk). This launcher can launch almost all available Minecraft versions (from rd-132211 to 1.18 snapshots (kinda)), including Combat Test versions. Modding via Forge (up to 1.16.5) and Fabric are also supported. This repository contains source code for Android. For iOS/iPadOS, check out [PojavLauncher_iOS](https://github.com/PojavLauncherTeam/PojavLauncher_iOS).
+* PojavLauncher is a Minecraft: Java Edition launcher for Android and iOS based on [Boardwalk](https://github.com/zhuowei/Boardwalk).
+* This launcher can launch almost all available Minecraft versions ranging from rd-132211 to 1.19 snapshots (including Combat Test versions).
+* Modding via Forge and Fabric are also supported.
+* This repository contains source code for Android.
+* For iOS/iPadOS, check out [PojavLauncher_iOS](https://github.com/PojavLauncherTeam/PojavLauncher_iOS).
+## Getting PojavLauncher
+
+Getting PojavLauncher is divided into 3 parts.
+
+1. You can get prebuilt app from [stable releases](https://github.com/PojavLauncherTeam/PojavLauncher/releases) or [automatic builds](https://github.com/PojavLauncherTeam/PojavLauncher/actions).
+
+2. You can get it from Google Play by clicking:
+[](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch)
+
+3. You can [build](#building) from source.
## Building
-To get started, you can just get prebuilt app from [stable release](https://github.com/PojavLauncherTeam/PojavLauncher/releases) or [automatic builds](https://github.com/PojavLauncherTeam/PojavLauncher/actions). If you want to build after launcher code changes, follow steps below.
-
-Will be moved to **BUILDING.md**
+If you want to build after launcher code changes, follow the steps below.
### Java Runtime Environment (JRE)
-- JRE for Android is [here](https://github.com/PojavLauncherTeam/openjdk-multiarch-jdk8u), also the build script [here](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch).
+- JRE for Android is [here](https://github.com/PojavLauncherTeam/openjdk-multiarch-jdk8u), and the build script is [here](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch).
- Follow build instruction on build script [README.md](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/blob/buildjre8/README.md).
-- You can also get [CI auto builds](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/actions).
-- Either get `jre8-pojav` artifact from auto builds, or do splitting by yourself:
- - Get JREs for all of 4 supported architectures (arm, arm64, x86, x86_64)
- - Split JRE into parts:
+- You can also get [CI auto builds](https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/actions) if you are lazy or failing it for some reason.
+* Either get `jre8-pojav` artifact from auto builds, or do splitting by yourself:
+ - Get JREs for all of 4 supported architectures (arm, arm64, x86, x86_64)
+ - Split JRE into parts:
Platform-independent: .jar files, libraries, configs, etc...
Platform-dependent: .so files, etc...
- Create:
- file named `universal.tar.xz` with all platform-independent files
+ A file named `universal.tar.xz` with all platform-independent files
4 files named `bin-.tar.xz` with all platform-dependent files per-architecture
- Put these in `assets/components/jre/` folder
- (If needed) update the Version file with the current date
@@ -44,21 +66,25 @@ Will be moved to **BUILDING.md**
- **Coming soon**
### The Launcher
-- Because languages are auto added by Crowdin, so need to run language list generator before building. In this directory, run:
+- Because languages are auto added by Crowdin, you need to run language list generator before building. In the project directory, run:
+
+* On Linux, Mac OS:
```
-# On Linux, Mac OS:
chmod +x scripts/languagelist_updater.sh
bash scripts/languagelist_updater.sh
-
-# On Windows:
+```
+* On Windows:
+```
scripts\languagelist_updater.bat
```
-- Then, run these commands ~~build use Android Studio~~.
+Then, run these commands ~~or build using Android Studio~~.
+
+* Build GLFW stub:
```
-# Build GLFW stub
./gradlew :jre_lwjgl3glfw:build
-
-# Build the launcher
+```
+* Build the launcher
+```
./gradlew :app_pojavlauncher:assembleDebug
```
(Replace `gradlew` to `gradlew.bat` if you are building on Windows).
@@ -66,32 +92,33 @@ scripts\languagelist_updater.bat
## Current status
- [x] ~~OpenJDK 9 Mobile port: ARM32, ARM64, x86, x86_64.~~ Replaced by JRE8.
- [x] OpenJDK 8 Mobile port: ARM32, ARM64, x86, x86_64
+- [x] OpenJDK 17 Mobile port: ARM32, ARM64, x86, x86_64
- [x] Mod installer headless
- [x] Mod installer with GUI. Used `Caciocavallo` project for AWT without X11.
- [x] OpenGL in OpenJDK environment
-- [x] OpenAL (work on most devices)
-- [x] Support Minecraft 1.12.2 and below. Used [lwjglx](https://github.com/PojavLauncherTeam/lwjglx), a LWJGL2 compatibility layer for LWJGL3.
-- [x] Support Minecraft 1.13 and above. Used [GLFW stub](https://github.com/PojavLauncherTeam/lwjgl3-glfw-java).
+- [x] OpenAL (works on most devices)
+- [x] Support for Minecraft 1.12.2 and below. Used [lwjglx](https://github.com/PojavLauncherTeam/lwjglx), a LWJGL2 compatibility layer for LWJGL3.
+- [x] Support for Minecraft 1.13 and above. Used [GLFW stub](https://github.com/PojavLauncherTeam/lwjgl3-glfw-java).
+- [x] Support for Minecraft 1.17 (22w13a to be exact) and above. Used [Holy GL4ES](https://github.com/PojavLauncherTeam/gl4es-114-extra)
- [x] Game surface zooming.
- [x] New input pipe rewritten to native code to boost performance.
-- [ ] More...
+- [x] Rewritten entire controls system (thanks to @Mathias-Boulay)
+- [ ] More to come!
## Known Issues
-- Minecraft `21w10a` or newer are currently not yet supported due to the new GLSL usage. Fortunately, a workaround is provided and built into the launcher.
-- In 1.16 and up, spawn eggs banners are white (you can fix this by switching renderer
-to `gl4es 1.1.5`, only works on 1.16 and up, do not use under this version, as the texture
-will bug out when hit a mob)
- Controller mods aren't working.
- Random crashes could happen very often on Android 5.x during game load or join world.
- With big modpacks textures could be messed up
-- probably more, that's why we have a bug tracker ;)
+- Probably more, that's why we have a bug tracker ;)
## License
- PojavLauncher is licensed under [GNU GPLv3](https://github.com/khanhduytran0/PojavLauncher/blob/master/LICENSE).
## Contributing
-Contributions are welcome! We welcome any type of contribution, not only code.
-Any code change should be submitted as a pull request. The description should explain what the code does and give steps to execute it.
+Contributions are welcome! We welcome any type of contribution, not only code. For example, you can help the wiki shape up. You can help the [translation](https://crowdin.com/project/pojavlauncher) too!
+
+
+Any code change to this repository (or iOS) should be submitted as a pull request. The description should explain what the code does and give steps to execute it.
## Credits & Third party components and their licenses (if available)
- [Boardwalk](https://github.com/zhuowei/Boardwalk) (JVM Launcher): Unknown License/[Apache License 2.0](https://github.com/zhuowei/Boardwalk/blob/master/LICENSE) or GNU GPLv2.
diff --git a/app_pojavlauncher/src/main/assets/assets-v0.zip b/app_pojavlauncher/src/main/assets/assets-v0.zip
deleted file mode 100644
index d3d9f7f9b..000000000
Binary files a/app_pojavlauncher/src/main/assets/assets-v0.zip and /dev/null differ
diff --git a/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-shared-1.18-SNAPSHOT.jar b/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-shared-1.18-SNAPSHOT.jar
new file mode 100644
index 000000000..0d4859d2d
Binary files /dev/null and b/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-shared-1.18-SNAPSHOT.jar differ
diff --git a/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-tta-1.18-SNAPSHOT.jar b/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-tta-1.18-SNAPSHOT.jar
new file mode 100644
index 000000000..179e59cbd
Binary files /dev/null and b/app_pojavlauncher/src/main/assets/components/caciocavallo17/cacio-tta-1.18-SNAPSHOT.jar differ
diff --git a/app_pojavlauncher/src/main/assets/components/caciocavallo17/version b/app_pojavlauncher/src/main/assets/components/caciocavallo17/version
new file mode 100644
index 000000000..918be360b
--- /dev/null
+++ b/app_pojavlauncher/src/main/assets/components/caciocavallo17/version
@@ -0,0 +1 @@
+20220819
diff --git a/app_pojavlauncher/src/main/assets/pojavlauncher.png b/app_pojavlauncher/src/main/assets/pojavlauncher.png
new file mode 100644
index 000000000..2dd689f69
Binary files /dev/null and b/app_pojavlauncher/src/main/assets/pojavlauncher.png differ
diff --git a/app_pojavlauncher/src/main/assets/pojavtext.png b/app_pojavlauncher/src/main/assets/pojavtext.png
new file mode 100644
index 000000000..1c52cb985
Binary files /dev/null and b/app_pojavlauncher/src/main/assets/pojavtext.png differ
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java
index 7c8bb19b5..2b7b9e8df 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/AWTCanvasView.java
@@ -12,8 +12,8 @@ import net.kdt.pojavlaunch.utils.*;
import org.lwjgl.glfw.*;
public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {
- public static final int AWT_CANVAS_WIDTH = 600;
- public static final int AWT_CANVAS_HEIGHT = 420;
+ public static final int AWT_CANVAS_WIDTH = 720;
+ public static final int AWT_CANVAS_HEIGHT = 600;
private final int MAX_SIZE = 100;
private final double NANOS = 1000000000.0;
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseActivity.java
index 04347eeea..326fa27e7 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseActivity.java
@@ -11,14 +11,11 @@ public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ LocaleUtils.setLocale(this);
Tools.setFullscreen(this);
Tools.updateWindowSize(this);
}
-
- @Override
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(LocaleUtils.setLocale(base));
- }
+
@Override
public void startActivity(Intent i) {
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java
index 8395cb970..95d957a3e 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/BaseMainActivity.java
@@ -233,7 +233,7 @@ public class BaseMainActivity extends BaseActivity {
if(Tools.LOCAL_RENDERER == null) {
Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER;
}
- Logger.getInstance().appendToLog("--------- beggining with launcher debug");
+ Logger.getInstance().appendToLog("--------- beginning with launcher debug");
Logger.getInstance().appendToLog("Info: Launcher version: " + BuildConfig.VERSION_NAME);
if (Tools.LOCAL_RENDERER.equals("vulkan_zink")) {
checkVulkanZinkIsSupported();
@@ -376,7 +376,7 @@ public class BaseMainActivity extends BaseActivity {
sendKeyPress(LwjglGlfwKeycode.GLFW_KEY_ESCAPE);
return true;
}
- return super.dispatchKeyEvent(event);
+ return minecraftGLView.processKeyEvent(event);
}
public static void switchKeyboardState() {
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/DisplayableLocale.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/DisplayableLocale.java
index 66a6372d1..755a75ec6 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/DisplayableLocale.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/DisplayableLocale.java
@@ -8,7 +8,7 @@ public class DisplayableLocale {
private static Locale processStringLocale(String locale) {
if (locale.contains("-")) {
String[] split = locale.split("-");
- return new Locale(split[0], split[1]);
+ return new Locale(split[0], split[1].toUpperCase());
} else {
return new Locale(locale);
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ImportControlActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ImportControlActivity.java
index 15fe8abd6..648daa5f9 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ImportControlActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/ImportControlActivity.java
@@ -17,6 +17,7 @@ import androidx.annotation.Nullable;
import net.kdt.pojavlaunch.utils.FileUtils;
+import org.apache.commons.io.IOUtils;
import org.json.JSONException;
import org.json.JSONObject;
@@ -122,11 +123,8 @@ public class ImportControlActivity extends Activity {
InputStream is;
try {
is = getContentResolver().openInputStream(mUriData);
-
OutputStream os = new FileOutputStream(Tools.CTRLMAP_PATH + "/" + fileName + ".json");
- byte[] buffer = new byte[1024];
- while(is.read(buffer) != -1)
- os.write(buffer);
+ IOUtils.copy(is, os);
os.close();
is.close();
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
index 2815780a9..6955e1856 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java
@@ -117,13 +117,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
});
try {
- JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties(LauncherPreferences.PREF_DEFAULT_RUNTIME);
- if (JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0")) {
- MultiRTUtils.setRuntimeNamed(this,LauncherPreferences.PREF_DEFAULT_RUNTIME);
- } else {
- MultiRTUtils.setRuntimeNamed(this,MultiRTUtils.getExactJreName(8));
- JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties();
- }
+ MultiRTUtils.setRuntimeNamed(this,LauncherPreferences.PREF_DEFAULT_RUNTIME);
placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2);
@@ -247,7 +241,8 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
List javaArgList = new ArrayList();
// Enable Caciocavallo
- Tools.getCacioJavaArgs(javaArgList,false);
+ JREUtils.jreReleaseList = JREUtils.readJREReleaseProperties(LauncherPreferences.PREF_DEFAULT_RUNTIME);
+ Tools.getCacioJavaArgs(javaArgList,JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0"));
if (javaArgs != null) {
javaArgList.addAll(Arrays.asList(javaArgs.split(" ")));
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLSurface.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLSurface.java
index a31e4a77c..b40284f4f 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLSurface.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MinecraftGLSurface.java
@@ -203,7 +203,7 @@ public class MinecraftGLSurface extends View {
public boolean onTouchEvent(MotionEvent e) {
// Looking for a mouse to handle, won't have an effect if no mouse exists.
for (int i = 0; i < e.getPointerCount(); i++) {
- if (e.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE) continue;
+ if(e.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE && e.getToolType(i) != MotionEvent.TOOL_TYPE_STYLUS ) continue;
// Mouse found
if(CallbackBridge.isGrabbing()) return false;
@@ -391,7 +391,7 @@ public class MinecraftGLSurface extends View {
}
for(int i = 0; i < event.getPointerCount(); i++) {
- if(event.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE) continue;
+ if(event.getToolType(i) != MotionEvent.TOOL_TYPE_MOUSE && event.getToolType(i) != MotionEvent.TOOL_TYPE_STYLUS ) continue;
// Mouse found
mouseCursorIndex = i;
break;
@@ -480,13 +480,11 @@ public class MinecraftGLSurface extends View {
}
/** The event for keyboard/ gamepad button inputs */
- @Override
- public boolean onKeyPreIme(int keyCode, KeyEvent event) {
+ public boolean processKeyEvent(KeyEvent event) {
//Toast.makeText(this, event.toString(),Toast.LENGTH_SHORT).show();
//Toast.makeText(this, event.getDevice().toString(), Toast.LENGTH_SHORT).show();
//Filtering useless events by order of probability
- if((event.getFlags() & KeyEvent.FLAG_FALLBACK) == KeyEvent.FLAG_FALLBACK) return true;
int eventKeycode = event.getKeyCode();
if(eventKeycode == KeyEvent.KEYCODE_UNKNOWN) return true;
if(eventKeycode == KeyEvent.KEYCODE_VOLUME_DOWN) return false;
@@ -494,8 +492,6 @@ public class MinecraftGLSurface extends View {
if(event.getRepeatCount() != 0) return true;
if(event.getAction() == KeyEvent.ACTION_MULTIPLE) return true;
- //Toast.makeText(this, "FIRST VERIF PASSED", Toast.LENGTH_SHORT).show();
-
//Sometimes, key events comes from SOME keys of the software keyboard
//Even weirder, is is unknown why a key or another is selected to trigger a keyEvent
if((event.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD){
@@ -503,25 +499,19 @@ public class MinecraftGLSurface extends View {
touchCharInput.dispatchKeyEvent(event);
return true;
}
- //Toast.makeText(this, "SECOND VERIF PASSED", Toast.LENGTH_SHORT).show();
-
//Sometimes, key events may come from the mouse
if(event.getDevice() != null
&& ( (event.getSource() & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE
|| (event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) ){
- //Toast.makeText(this, "THE EVENT COMES FROM A MOUSE", Toast.LENGTH_SHORT).show();
-
if(eventKeycode == KeyEvent.KEYCODE_BACK){
sendMouseButton(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_RIGHT, event.getAction() == KeyEvent.ACTION_DOWN);
return true;
}
}
- //System.out.println(event);
if(Gamepad.isGamepadEvent(event)){
-
if(mGamepad == null){
mGamepad = new Gamepad(this, event.getDevice());
}
@@ -537,6 +527,9 @@ public class MinecraftGLSurface extends View {
return true;
}
+ // Some events will be generated an infinite number of times when no consumed
+ if((event.getFlags() & KeyEvent.FLAG_FALLBACK) == KeyEvent.FLAG_FALLBACK) return true;
+
return false;
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
index 086598c49..7cd4665f1 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java
@@ -180,14 +180,7 @@ public class PojavLoginActivity extends BaseActivity {
setContentView(R.layout.activity_pojav_login);
Spinner spinnerChgLang = findViewById(R.id.login_spinner_language);
-
- String defaultLang = LocaleUtils.DEFAULT_LOCALE.getDisplayName();
- SpannableString defaultLangChar = new SpannableString(defaultLang);
- defaultLangChar.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, defaultLang.length(), 0);
-
final ArrayAdapter langAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);
- langAdapter.add(new DisplayableLocale(LocaleUtils.DEFAULT_LOCALE, defaultLangChar));
- langAdapter.add(new DisplayableLocale(Locale.ENGLISH));
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(getAssets().open("language_list.txt")));
@@ -205,17 +198,15 @@ public class PojavLoginActivity extends BaseActivity {
}
langAdapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
-
- int selectedLang = 0;
- for (int i = 0; i < langAdapter.getCount(); i++) {
- if (Locale.getDefault().toString().equalsIgnoreCase(langAdapter.getItem(i).mLocale.toString())) {
- selectedLang = i;
- break;
- }
- }
-
+
+ int selectedLang = getSelectorPosition(langAdapter, LocaleUtils.getLocale());
+ if (selectedLang == -1) selectedLang = getSelectorPosition(langAdapter, null);
+
spinnerChgLang.setAdapter(langAdapter);
- spinnerChgLang.setSelection(selectedLang);
+ if (selectedLang != -1){
+ spinnerChgLang.setSelection(selectedLang);
+ }
+
spinnerChgLang.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
private boolean isInitCalled;
@Override
@@ -225,15 +216,7 @@ public class PojavLoginActivity extends BaseActivity {
return;
}
- Locale locale;
- if (position == 0) {
- locale = LocaleUtils.DEFAULT_LOCALE;
- } else if (position == 1) {
- locale = Locale.ENGLISH;
- } else {
- locale = langAdapter.getItem(position).mLocale;
- }
-
+ Locale locale = langAdapter.getItem(position).mLocale;
LauncherPreferences.PREF_LANGUAGE = locale.toString();
LauncherPreferences.DEFAULT_PREF.edit().putString("language", LauncherPreferences.PREF_LANGUAGE).apply();
@@ -256,6 +239,18 @@ public class PojavLoginActivity extends BaseActivity {
});
isSkipInit = true;
}
+
+ /** @return The index in the array adapter for a given language, or english. -1 if not found */
+ public int getSelectorPosition(@NonNull ArrayAdapter langAdapter, @Nullable Locale locale){
+ String localeString = locale == null ? Locale.ENGLISH.toString() : locale.toString();
+ for (int i = 0; i < langAdapter.getCount(); i++) {
+ if (localeString.equalsIgnoreCase(langAdapter.getItem(i).mLocale.toString())) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
@Override
public void onResume() {
@@ -349,6 +344,7 @@ public class PojavLoginActivity extends BaseActivity {
AssetManager am = this.getAssets();
unpackComponent(am, "caciocavallo");
+ unpackComponent(am, "caciocavallo17");
// Since the Java module system doesn't allow multiple JARs to declare the same module,
// we repack them to a single file here
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java
index 120bfa0af..13d8c08dc 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java
@@ -141,13 +141,7 @@ public final class Tools {
List javaArgList = new ArrayList();
- // Only Java 8 supports headful AWT for now
- if (JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0")) {
- getCacioJavaArgs(javaArgList, false);
- } else if (LauncherPreferences.PREF_ARC_CAPES) {
- // Opens the java.net package to Arc DNS injector on Java 9+
- javaArgList.add("--add-opens=java.base/java.net=ALL-UNNAMED");
- }
+ getCacioJavaArgs(javaArgList, JREUtils.jreReleaseList.get("JAVA_VERSION").equals("1.8.0"));
/*
int mcReleaseDate = Integer.parseInt(versionInfo.releaseTime.substring(0, 10).replace("-", ""));
@@ -179,20 +173,46 @@ public final class Tools {
JREUtils.launchJavaVM(activity, javaArgList);
}
- public static void getCacioJavaArgs(List javaArgList, boolean isHeadless) {
- javaArgList.add("-Djava.awt.headless="+isHeadless);
+ public static void getCacioJavaArgs(List javaArgList, boolean isJava8) {
// Caciocavallo config AWT-enabled version
+ javaArgList.add("-Djava.awt.headless=false");
javaArgList.add("-Dcacio.managed.screensize=" + AWTCanvasView.AWT_CANVAS_WIDTH + "x" + AWTCanvasView.AWT_CANVAS_HEIGHT);
// javaArgList.add("-Dcacio.font.fontmanager=net.java.openjdk.cacio.ctc.CTCFontManager");
- javaArgList.add("-Dcacio.font.fontmanager=sun.awt.X11FontManager");
javaArgList.add("-Dcacio.font.fontscaler=sun.font.FreetypeFontScaler");
javaArgList.add("-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel");
- javaArgList.add("-Dawt.toolkit=net.java.openjdk.cacio.ctc.CTCToolkit");
- javaArgList.add("-Djava.awt.graphicsenv=net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
+ if (isJava8) {
+ javaArgList.add("-Dcacio.font.fontmanager=sun.awt.X11FontManager");
+ javaArgList.add("-Dawt.toolkit=net.java.openjdk.cacio.ctc.CTCToolkit");
+ javaArgList.add("-Djava.awt.graphicsenv=net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
+ } else {
+ javaArgList.add("-Dcacio.font.fontmanager=com.github.caciocavallosilano.cacio.ctc.CTCFontManager");
+ javaArgList.add("-Dawt.toolkit=com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
+ javaArgList.add("-Djava.awt.graphicsenv=com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
+ javaArgList.add("-Djava.system.class.loader=com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
+
+ javaArgList.add("--add-exports=java.desktop/java.awt=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.java2d=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/java.awt.dnd.peer=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.awt=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.awt.event=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.awt.datatransfer=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.desktop/sun.font=ALL-UNNAMED");
+ javaArgList.add("--add-exports=java.base/sun.security.action=ALL-UNNAMED");
+ javaArgList.add("--add-opens=java.base/java.util=ALL-UNNAMED");
+ javaArgList.add("--add-opens=java.desktop/java.awt=ALL-UNNAMED");
+ javaArgList.add("--add-opens=java.desktop/sun.font=ALL-UNNAMED");
+ javaArgList.add("--add-opens=java.desktop/sun.java2d=ALL-UNNAMED");
+ javaArgList.add("--add-opens=java.base/java.lang.reflect=ALL-UNNAMED");
+
+ // Opens the java.net package to Arc DNS injector on Java 9+
+ javaArgList.add("--add-opens=java.base/java.net=ALL-UNNAMED");
+ }
StringBuilder cacioClasspath = new StringBuilder();
- cacioClasspath.append("-Xbootclasspath/p");
- File cacioDir = new File(DIR_GAME_HOME + "/caciocavallo");
+ cacioClasspath.append("-Xbootclasspath/" + (isJava8 ? "p" : "a"));
+ File cacioDir = new File(DIR_GAME_HOME + "/caciocavallo" + (isJava8 ? "" : "17"));
if (cacioDir.exists() && cacioDir.isDirectory()) {
for (File file : cacioDir.listFiles()) {
if (file.getName().endsWith(".jar")) {
@@ -256,6 +276,7 @@ public final class Tools {
gameDir.mkdirs();
Map varArgMap = new ArrayMap<>();
+ varArgMap.put("auth_session", profile.accessToken); // For legacy versions of MC
varArgMap.put("auth_access_token", profile.accessToken);
varArgMap.put("auth_player_name", username);
varArgMap.put("auth_uuid", profile.profileId);
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
index dc9d70448..0fb7dfc21 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Touchpad.java
@@ -40,6 +40,20 @@ public class Touchpad extends FrameLayout {
private float mPrevX, mPrevY;
/* Last first pointer positions non-scaled, used to scroll distance */
private float mScrollLastInitialX, mScrollLastInitialY;
+ /* Handler and message to check if we are grabbing */
+ private final Runnable mGrabRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (!CallbackBridge.isGrabbing() && mDisplayState && getVisibility() != VISIBLE) {
+ enable();
+ }else{
+ if ((CallbackBridge.isGrabbing() && getVisibility() != View.GONE) || !mDisplayState && getVisibility() == VISIBLE) {
+ disable();
+ }
+ }
+ postDelayed(this, 250);
+ }
+ };
public Touchpad(@NonNull Context context) {
this(context, null);
@@ -170,20 +184,7 @@ public class Touchpad extends FrameLayout {
// When the game is grabbing, we should not display the mouse
disable();
mDisplayState = false;
- Thread virtualMouseGrabThread = new Thread(() -> {
- while (true) {
- if (!CallbackBridge.isGrabbing() && mDisplayState && getVisibility() != VISIBLE) {
- post(this::enable);
- }else{
- if ((CallbackBridge.isGrabbing() && getVisibility() != View.GONE) || !mDisplayState && getVisibility() == VISIBLE) {
- post(this::disable);
- }
- }
-
- }
- }, "VirtualMouseGrabThread");
- virtualMouseGrabThread.setPriority(Thread.MIN_PRIORITY);
- virtualMouseGrabThread.start();
+ postDelayed(mGrabRunnable, 250);
}
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java
index e64b84b99..3d6ddbb0f 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java
@@ -77,16 +77,11 @@ public class MultiRTUtils {
public static void installRuntimeNamed(String nativeLibDir, InputStream runtimeInputStream, String name, RuntimeProgressReporter progressReporter) throws IOException {
File dest = new File(RUNTIME_FOLDER,"/"+name);
- File tmp = new File(dest,"temporary");
if(dest.exists()) FileUtils.deleteDirectory(dest);
dest.mkdirs();
- FileOutputStream fos = new FileOutputStream(tmp);
- progressReporter.reportStringProgress(R.string.multirt_progress_caching);
- IOUtils.copy(runtimeInputStream,fos);
- fos.close();
+
+ uncompressTarXZ(runtimeInputStream,dest,progressReporter);
runtimeInputStream.close();
- uncompressTarXZ(tmp,dest,progressReporter);
- tmp.delete();
unpack200(nativeLibDir,RUNTIME_FOLDER + "/" + name);
read(name);
}
@@ -230,25 +225,16 @@ public class MultiRTUtils {
}
private static void installRuntimeNamedNoRemove(InputStream runtimeInputStream, File dest, RuntimeProgressReporter progressReporter) throws IOException {
- File tmp = new File(dest,"temporary");
- FileOutputStream fos = new FileOutputStream(tmp);
- progressReporter.reportStringProgress(R.string.multirt_progress_caching);
- IOUtils.copy(runtimeInputStream,fos);
- fos.close();
+
+ uncompressTarXZ(runtimeInputStream,dest,progressReporter);
runtimeInputStream.close();
- uncompressTarXZ(tmp,dest,progressReporter);
- tmp.delete();
}
- private static void uncompressTarXZ(final File tarFile, final File dest, final RuntimeProgressReporter thingy) throws IOException {
+ private static void uncompressTarXZ(final InputStream tarFileInputStream, final File dest, final RuntimeProgressReporter thingy) throws IOException {
dest.mkdirs();
TarArchiveInputStream tarIn = new TarArchiveInputStream(
- new XZCompressorInputStream(
- new BufferedInputStream(
- new FileInputStream(tarFile)
- )
- )
+ new XZCompressorInputStream(tarFileInputStream)
);
TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
// tarIn is a TarArchiveInputStream
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
index f3b325d33..8c72415c1 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/LauncherPreferences.java
@@ -23,7 +23,7 @@ public class LauncherPreferences {
public static String PREF_DEFAULTCTRL_PATH = Tools.CTRLDEF_FILE;
public static String PREF_CUSTOM_JAVA_ARGS;
public static String PREF_LANGUAGE = "default";
- public static String PREF_VERSION_REPOS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json";
+ public static String PREF_VERSION_REPOS = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
public static boolean PREF_CHECK_LIBRARY_SHA = true;
public static boolean PREF_DISABLE_GESTURES = false;
public static float PREF_MOUSESPEED = 1f;
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java
index 4b593cfd3..7d181d1a2 100644
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java
+++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/MinecraftDownloaderTask.java
@@ -92,7 +92,7 @@ public class MinecraftDownloaderTask extends AsyncTask 20210225 && verInfo.javaVersion != null && verInfo.javaVersion.majorVersion > 15)
- V117CompatUtil.runCheck(mActivity);
- }
+
try {
assets = downloadIndex(verInfo.assets, new File(Tools.ASSETS_PATH, "indexes/" + verInfo.assets + ".json"));
} catch (IOException e) {
@@ -465,10 +461,13 @@ public class MinecraftDownloaderTask extends AsyncTask= 24) {
+ config.setLocale(CURRENT_LOCALE);
+ context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
+ } else {
+ config.locale = CURRENT_LOCALE;
+ context.getApplicationContext().createConfigurationContext(config);
+ }
+
return context;
}
}
diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/V117CompatUtil.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/V117CompatUtil.java
deleted file mode 100644
index 0272e6b3a..000000000
--- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/V117CompatUtil.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package net.kdt.pojavlaunch.utils;
-
-import android.app.Activity;
-import android.content.res.AssetManager;
-import android.util.Log;
-
-import androidx.appcompat.app.AlertDialog;
-
-import net.kdt.pojavlaunch.BaseLauncherActivity;
-import net.kdt.pojavlaunch.R;
-import net.kdt.pojavlaunch.Tools;
-import net.kdt.pojavlaunch.prefs.LauncherPreferences;
-import net.kdt.pojavlaunch.tasks.MinecraftDownloaderTask;
-import net.kdt.pojavlaunch.value.PerVersionConfig;
-import net.kdt.pojavlaunch.value.launcherprofiles.LauncherProfiles;
-import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile;
-
-import org.apache.commons.io.IOUtils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class V117CompatUtil {
- /*
- /*
- New rendering engine was added in snapshot 21w10a
- 21a08b (FP (GL2) engine): 20210225
- 21w10a (non-FP engine): 20210310
-
- boolean skipResDialog = false;
- if(mcReleaseDate > 20210225) skipResDialog = true;
- PerVersionConfig.update(); //Prepare the PVC
- PerVersionConfig.VersionConfig cfg = PerVersionConfig.configMap.get(p1[0]); //Get the version config...
- if (cfg == null) {
- cfg = new PerVersionConfig.VersionConfig();//or create a new one!
- PerVersionConfig.configMap.put(p1[0], cfg);//and put it into the base
- }
- MCOptionUtils.load();
-
- if(!skipResDialog) {
- AtomicBoolean proceed = new AtomicBoolean(false);
- Object lock = new Object();
- mActivity.runOnUiThread(() -> {
- AlertDialog.Builder bldr = new AlertDialog.Builder(mActivity);
- bldr.setTitle(R.string.global_warinng);
- bldr.setMessage(R.string.compat_117_message);
- bldr.setPositiveButton(android.R.string.ok, (dialog, which) -> {
- proceed.set(true);
- synchronized (lock) { lock.notifyAll(); }
- dialog.dismiss();
- });
- bldr.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
- synchronized (lock) { lock.notifyAll(); }
- dialog.dismiss();
- });
- bldr.setCancelable(false);
- bldr.show();
- });
- synchronized (lock) {
- lock.wait();
- }
- if(proceed.get()) {
- File resourcepacksDir = new File(cfg.gamePath==null? Tools.DIR_GAME_NEW:cfg.gamePath,"resourcepacks");
- if(!resourcepacksDir.exists()) resourcepacksDir.mkdirs();
- FileOutputStream fos = new FileOutputStream(new File(resourcepacksDir,"assets-v0.zip"));
- InputStream is = this.mActivity.getAssets().open("assets-v0.zip");
- IOUtils.copy(is,fos);
- is.close();fos.close();
- String resourcepacks = MCOptionUtils.get("resourcePacks");
- if(resourcepacks == null || !resourcepacks.contains("assets-v0.zip")) {
- List resPacksArray = resourcepacks == null ? new ArrayList(): Arrays.asList()
- }
- }else throw new MinecraftDownloaderTask.SilentException();
- }
- */
- private static List getTexturePackList(String param) {
- if (param == null) {
- Log.i("V117CompatDebug","null, defaulting to empty");
- return new ArrayList<>();
- }
- Log.i("V117CompatDebug",param);
- if("[]".equals(param)) return new ArrayList<>();
- Log.i("V117CompatDebug","ph2");
- if(param == null) return new ArrayList<>();
- Log.i("V117CompatDebug","ph3");
- String rawList = param.substring(1,param.length()-1);
- Log.i("V117CompatDebug",rawList);
- return new ArrayList<>(Arrays.asList(rawList.split(",")));
- }
-
- private static String regenPackList(List packs) {
- if(packs.size()==0) return "[]";
- StringBuilder ret = new StringBuilder("[" + packs.get(0));
- for(int i = 1; i < packs.size(); i++) {
- ret.append(",").append(packs.get(i));
- }
- ret.append("]");
- return ret.toString();
- }
-
- public static void runCheck(Activity activity) throws Exception{
-
-
- MCOptionUtils.load();
-
- List packList =getTexturePackList(MCOptionUtils.get("resourcePacks"));
- String renderer;
- String gamePath;
- LauncherProfiles.update();
- String selectedProfile = LauncherPreferences.DEFAULT_PREF.getString(LauncherPreferences.PREF_KEY_CURRENT_PROFILE,"");
- MinecraftProfile prof = LauncherProfiles.mainProfileJson.profiles.get(selectedProfile);
- if(prof == null) throw new MinecraftDownloaderTask.SilentException();
- renderer = prof.pojavRendererName != null ? prof.pojavRendererName : LauncherPreferences.PREF_RENDERER;
- gamePath = prof.gameDir != null && prof.gameDir.startsWith(Tools.LAUNCHERPROFILES_RTPREFIX) ? prof.gameDir.replace(Tools.LAUNCHERPROFILES_RTPREFIX,Tools.DIR_GAME_HOME + "/") : Tools.DIR_GAME_NEW;
-
- //String
-
- if(renderer.equals("vulkan_zink") || renderer.equals("opengles3_virgl")) return; //don't install for zink/virgl users;
- if(packList.contains("\"assets-v0.zip\"")) return;
- if(JREUtils.getDetectedVersion() >= 3) return; // GL4ES_extra supports 1.17+
-
- Object lock = new Object();
- AtomicInteger proceed = new AtomicInteger(0);
- activity.runOnUiThread(() -> {
- AlertDialog.Builder builder = new AlertDialog.Builder(activity);
- builder.setTitle(R.string.global_warinng);
- builder.setMessage(R.string.compat_117_message);
- builder.setPositiveButton(android.R.string.ok, (dialog, which) -> {
- proceed.set(1);
- synchronized (lock) { lock.notifyAll(); }
- });
- builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
- synchronized (lock) { lock.notifyAll(); }
- });
- builder.setNeutralButton(R.string.compat_11x_playanyway, (dialog, which) -> {
- proceed.set(2);
- synchronized (lock) { lock.notifyAll(); }
- });
- builder.setCancelable(false);
- builder.show();
- });
-
- synchronized (lock) {
- lock.wait();
- }
- switch(proceed.get()) {
- case 1:
- MinecraftProfile minecraftProfile = LauncherProfiles.mainProfileJson.profiles.get(selectedProfile);
- if(minecraftProfile == null) throw new MinecraftDownloaderTask.SilentException();
- minecraftProfile.pojavRendererName = "opengles2";
- LauncherProfiles.update();
- copyResourcePack(gamePath,activity.getAssets());
- if(!packList.contains("\"assets-v0.zip\"")) packList.add(0,"\"assets-v0.zip\"");
- MCOptionUtils.set("resourcePacks",regenPackList(packList));
- MCOptionUtils.save();
- break;
- case 0:
- throw new MinecraftDownloaderTask.SilentException();
- }
- }
-
- public static void copyResourcePack(String gameDir, AssetManager am) throws IOException {
- File resourcepacksDir = new File(gameDir,"resourcepacks");
- if(!resourcepacksDir.exists()) resourcepacksDir.mkdirs();
- FileOutputStream fos = new FileOutputStream(new File(resourcepacksDir,"assets-v0.zip"));
- InputStream is = am.open("assets-v0.zip");
- IOUtils.copy(is,fos);
- is.close();fos.close();
- }
-}
diff --git a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java
index 2df40f007..12ca84982 100644
--- a/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java
+++ b/app_pojavlauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java
@@ -5,8 +5,12 @@ import android.os.Looper;
import net.kdt.pojavlaunch.*;
import android.content.*;
+import android.view.Choreographer;
public class CallbackBridge {
+ public static Choreographer sChoreographer = Choreographer.getInstance();
+ private static boolean isGrabbing = false;
+ private static long lastGrabTime = System.currentTimeMillis();
public static final int ANDROID_TYPE_GRAB_STATE = 0;
public static final int CLIPBOARD_COPY = 2000;
@@ -21,12 +25,9 @@ public class CallbackBridge {
public volatile static boolean holdingAlt, holdingCapslock, holdingCtrl,
holdingNumlock, holdingShift;
-
public static void putMouseEventWithCoords(int button, float x, float y) {
putMouseEventWithCoords(button, true, x, y);
- Handler handler = new Handler(Looper.getMainLooper());
- handler.postDelayed(() -> putMouseEventWithCoords(button, false, x, y), 22);
-
+ sChoreographer.postFrameCallbackDelayed(l -> putMouseEventWithCoords(button, false, x, y), 33);
}
public static void putMouseEventWithCoords(int button, boolean isDown, float x, float y /* , int dz, long nanos */) {
@@ -119,8 +120,13 @@ public class CallbackBridge {
}
public static boolean isGrabbing() {
- // return isGrabbing;
- return nativeIsGrabbing();
+ // Avoid going through the JNI each time.
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - lastGrabTime > 250){
+ isGrabbing = nativeIsGrabbing();
+ lastGrabTime = currentTime;
+ }
+ return isGrabbing;
}
// Called from JRE side
diff --git a/app_pojavlauncher/src/main/jni/awt_bridge.c b/app_pojavlauncher/src/main/jni/awt_bridge.c
index 2a0b6fd9b..da62f03fd 100644
--- a/app_pojavlauncher/src/main/jni/awt_bridge.c
+++ b/app_pojavlauncher/src/main/jni/awt_bridge.c
@@ -35,6 +35,10 @@ JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_AWTInputBridge_nativeSendData(JN
if (method_ReceiveInput == NULL) {
class_CTCAndroidInput = (*runtimeJNIEnvPtr_INPUT)->FindClass(runtimeJNIEnvPtr_INPUT, "net/java/openjdk/cacio/ctc/CTCAndroidInput");
+ if ((*runtimeJNIEnvPtr_INPUT)->ExceptionCheck(runtimeJNIEnvPtr_INPUT) == JNI_TRUE) {
+ (*runtimeJNIEnvPtr_INPUT)->ExceptionClear(runtimeJNIEnvPtr_INPUT);
+ class_CTCAndroidInput = (*runtimeJNIEnvPtr_INPUT)->FindClass(runtimeJNIEnvPtr_INPUT, "com/github/caciocavallosilano/cacio/ctc/CTCAndroidInput");
+ }
assert(class_CTCAndroidInput != NULL);
method_ReceiveInput = (*runtimeJNIEnvPtr_INPUT)->GetStaticMethodID(runtimeJNIEnvPtr_INPUT, class_CTCAndroidInput, "receiveData", "(IIIII)V");
assert(method_ReceiveInput != NULL);
@@ -64,6 +68,10 @@ JNIEXPORT jintArray JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_renderAWTScr
if (method_GetRGB == NULL) {
class_CTCScreen = (*runtimeJNIEnvPtr_GRAPHICS)->FindClass(runtimeJNIEnvPtr_GRAPHICS, "net/java/openjdk/cacio/ctc/CTCScreen");
+ if ((*runtimeJNIEnvPtr_GRAPHICS)->ExceptionCheck(runtimeJNIEnvPtr_GRAPHICS) == JNI_TRUE) {
+ (*runtimeJNIEnvPtr_GRAPHICS)->ExceptionClear(runtimeJNIEnvPtr_GRAPHICS);
+ class_CTCScreen = (*runtimeJNIEnvPtr_GRAPHICS)->FindClass(runtimeJNIEnvPtr_GRAPHICS, "com/github/caciocavallosilano/cacio/ctc/CTCScreen");
+ }
assert(class_CTCScreen != NULL);
method_GetRGB = (*runtimeJNIEnvPtr_GRAPHICS)->GetStaticMethodID(runtimeJNIEnvPtr_GRAPHICS, class_CTCScreen, "getCurrentScreenRGB", "()[I");
assert(method_GetRGB != NULL);
diff --git a/app_pojavlauncher/src/main/jni/input_bridge_v3.c b/app_pojavlauncher/src/main/jni/input_bridge_v3.c
index dfc455df0..f5d220a8c 100644
--- a/app_pojavlauncher/src/main/jni/input_bridge_v3.c
+++ b/app_pojavlauncher/src/main/jni/input_bridge_v3.c
@@ -416,8 +416,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_GLFW_nglfwSetShowingWindow(JNIEnv* en
}
JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSetWindowAttrib(JNIEnv* env, jclass clazz, jint attrib, jint value) {
- if (!showingWindow) {
- return; // nothing to do yet
+ if (!showingWindow || !isUseStackQueueCall) {
+ // If the window is not shown, there is nothing to do yet.
+ // For Minecraft < 1.13, calling to JNI functions here crashes the JVM for some reason, therefore it is skipped for now.
+ return;
}
jclass glfwClazz = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "org/lwjgl/glfw/GLFW");
diff --git a/app_pojavlauncher/src/main/res/values-en-rUD/strings.xml b/app_pojavlauncher/src/main/res/values-en-rUD/strings.xml
deleted file mode 100644
index 7764e8b4d..000000000
--- a/app_pojavlauncher/src/main/res/values-en-rUD/strings.xml
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
- (pᴉoɹpuⱯ ɹoɟ uoᴉʇᴉpƎ ɐʌɐՐ :ʇɟɐɹɔǝuᴉW) ɹǝɥɔunɐꞀʌɐɾoԀ
- ɹǝɥɔunɐꞀʌɐɾoԀ
- ¡ǝɔᴉʌǝp ɹnoʎ uᴉ uoᴉʇᴉpƎ ɐʌɐՐ :ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ
-
-
-
- ǝɯɐuɹǝsn ɹo ꞁᴉɐɯƎ
- pɹoʍssɐԀ
- uᴉ pǝᵷᵷoꞁ ǝɯ dǝǝꞰ
- uᴉᵷoꞀ
- ˙ǝɹoɔsɹǝpun puɐ 6-0 \'z-ɐ \'Z-Ɐ suᴉɐʇuoɔ ʎꞁuo pꞁnoɥs \'sɹǝʇɔɐɹɐɥɔ 9⥝-Ɛ ɟo ǝᵷuɐɹ uᴉ ǝq ʇsnɯ ǝɯɐuɹǝs∩ ˙ǝɯɐuɹǝsn pᴉꞁɐʌuI
- ʇsᴉxǝ ʎpɐǝɹꞁɐ ǝɯɐuɹǝsn sᴉɥ⟘
- uᴉᵷoꞁ ʇɟosoɹɔᴉW
- ʇunoɔɔɐ ʇɔǝꞁǝS
- ¡ punoɟ ʇunoɔɔɐ oN
- ˙uᴉᵷoꞁ ʇsɹᴉɟ uodn ʇunoɔɔɐ uɐ ǝʌɐs oʇ </b>,, uᴉ pǝᵷᵷoꞁ ǝɯ dǝǝꞰ,,<b> uoᴉʇdo ǝɥʇ ǝs∩\n˙ʇunoɔɔɐ pǝʌɐs ʎuɐ ǝʌɐɥ ʇ, uop no⅄.
-
- "˙ǝʇǝꞁǝp ɹo ǝzᴉsǝɹ 'ʇᴉpǝ :ǝzᴉɯoʇsnɔ oʇ uoʇʇnq ɐ pꞁoH\n◀ nuǝɯ uǝdo oʇ ʇɟǝꞁ oʇ ʇɥᵷᴉɹ ɯoɹɟ ǝdᴉʍS"
-
- ¡pǝʌoɯǝɹ ǝq ꞁꞁᴉʍ ʇunoɔɔɐ sᴉɥ⟘
-
- (zx˙ɹɐʇ˙) %s ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuI
- ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ʇɔǝꞁǝS
-
- pǝɥsɐɹɔ ʎꞁpǝʇɔǝdxǝun sɐɥ ɹǝɥɔunɐꞀʌɐɾoԀ
- ¡uoᴉsɹǝʌ oN
- ǝɹoɯ ʍoɥS
- ssǝꞁ ʍoɥS
-
- ¡pǝɹᴉnbǝɹ sᴉ uoᴉssᴉɯɹǝd ǝᵷɐɹoʇs oʇ ǝʇᴉɹʍ/pɐǝɹ ǝɥ⟘
- ꞁnɟssǝɔɔns ꞁꞁɐʇsuI
- ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉun ǝuoᗡ
-
-
- sʍǝN
- ǝꞁosuoɔ ʇuǝɯdoꞁǝʌǝᗡ
- ᵷoꞁ ɥsɐɹƆ
-
- pǝʇɔǝuuoƆ
- lɐɔo˥
-
- %s ʇɟɐɹɔǝuᴉW ʎɐꞁd oʇ ʎpɐǝᴚ
- sǝꞁᴉɟ ǝɥɔɐɔ ᵷuᴉuɐǝꞁƆ
- %s ᵷuᴉpɐoꞁuʍoᗡ
- "(ᗺW %.2f / ᗺW %.2f) %s ᵷuᴉpɐoꞁuʍoᗡ"
- sǝɔɹnosǝɹ pɐoꞁuʍop oʇ ᵷuᴉɹɐdǝɹԀ
- ˙ǝnuᴉʇuoɔ oʇ ʇunoɔɔɐ ǝuᴉluo uɐ oʇ ɥɔʇᴉʍs ǝsɐǝlԀ ˙ʇunoɔɔɐ lɐɔol ɐ ɥʇᴉʍ uᴉ pǝƃƃol uǝɥʍ pǝllɐʇsuᴉ ʎllɐƃǝl ǝq ʇ,uɐɔ ʇɟɐɹɔǝuᴉW
- suoᴉʇdO
- (˙˙˙ɔʇǝ \'ɔᴉɹqɐℲ \'poWʎqɐꞀ \'ǝᵷɹoℲ) ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ɥɔunɐꞀ
- (sʇuǝɯnᵷɹɐ ɯoʇsnɔ ɥʇᴉʍ) ɹǝꞁꞁɐʇsuᴉ poɯ ɐ ɥɔunɐꞀ
- sꞁoɹʇuoɔ ɯoʇsnƆ
- sᵷuᴉʇʇǝS
- ʇnoqⱯ
- ƃuᴉɹǝpuǝɹ ǝɔɐɟɹns ǝʇɐuɹǝʇlɐ ǝs∩
- soᴉɹɐuǝɔs punoq ndƃ uᴉ ǝɔuɐɯɹoɟɹǝd dlǝɥ ʎɐW
- ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉu∩
- ǝɯᴉʇunᴚ ɐʌɐՐ ꞁꞁɐʇsuᴉ-ǝɹ noʎ ʇǝꞁ sᴉɥ⟘ [pǝɹᴉnbǝɹ ʇɹɐʇsǝɹ ɹǝɥɔunɐꞀ]
- ǝpoɯ ɯɹoɟǝǝɹℲ uᴉ ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ
- +0˙ㄥ pᴉoɹpuⱯ sǝɹᴉnbǝᴚ ˙ʍopuᴉʍ ᵷuᴉʇɐoꞁɟ uᴉ ʇɟɐɹɔǝuᴉW ɥɔunɐꞀ
- ɹɐqǝpᴉS ǝpᴉH
- ˙ǝɔuǝᴉɹǝdxǝ uǝǝɹɔsꞁꞁnɟ ǝɹoɯ ɐ noʎ sǝʌᴉ⅁ ˙sᴉɥʇ ǝʞᴉꞁ ʇɥᵷᴉɯ I∩ ⥝ʌ pꞁo ǝɥʇ ᵷuᴉɹɹǝɟǝɹd sʞꞁoɟ ɔᴉᵷꞁɐʇsoN
- ɥɔʇou ǝɹouᵷI
- ˙ǝɔuǝᴉɹǝdxǝ ǝʌᴉsɹǝɯɯᴉ ǝɹoɯ ɐ noʎ sǝʌᴉ⅁\n˙ʇᴉ ɹǝpun uǝǝɹɔs ǝɥʇ spuǝʇxǝ puɐ ɥɔʇou ǝɥʇ ǝɹouᵷI
- ɹǝꞁɐɔS uoᴉʇnꞁosǝᴚ
- uoᴉʇnꞁosǝɹ ꞁꞁnɟ sᴉ %00⥝ ˙uoᴉʇnꞁosǝɹ ǝɯɐᵷ ǝɥʇ ǝsɐǝɹɔǝp oʇ noʎ sʍoꞁꞁⱯ
- ssǝɹd ᵷuoꞁ ɹǝʇɟɐ ɹǝᵷᵷᴉɹʇ ꞁꞁᴉʍ ᵷuoꞁ ʍoH
- ˙ɯǝʇᴉ doɹp puɐ ʞɔoꞁq ʎoɹʇsǝp uᴉ ssǝɹd ᵷuoꞁ ɹoɟ ǝɯᴉʇ ɹǝᵷᵷᴉɹʇ ǝᵷuɐɥƆ
- ǝsnoɯ ʇɥᵷᴉɹ sɐ uoʇʇnq ʞɔɐq ʇɐǝɹ⟘
- ˙sᴉɥʇ ǝꞁqɐuǝ pꞁnoɥs noʎ \'ǝsnoɯ ꞁɐuɹǝʇxǝ ᵷuᴉsn ǝɹɐ noʎ ɟI ˙uoʇʇnq ʞɔɐq sɐ ǝsnoɯ ʇɥᵷᴉɹ ꞁɐuɹǝʇxǝ sʇɐǝɹʇ sǝɔᴉʌǝp ǝɯoS
- ǝꞁʎʇs uoʇʇnq ʇɐꞁℲ
- ˙ʇɐꞁɟ oʇ ǝꞁʎʇs uoʇʇnq ꞁoɹʇuoɔ ǝᵷuɐɥɔ oʇ sᴉɥʇ ǝꞁqɐuƎ
- ᵷuᴉꞁɐɔs suoʇʇnq ꞁoɹʇuoƆ
- ˙ꞁꞁɐɯs ooʇ ǝɹɐ suoʇʇnq ɟᴉ ɯǝɥʇ ǝꞁɐɔsd∩
- ᵷuᴉꞁɐɔs ǝsnoW
- ˙ǝsnoɯ ꞁɐnʇɹᴉʌ ɟo ǝzᴉs ǝᵷuɐɥƆ
- sʇuǝɯnᵷɹɐ ɥɔunɐꞀ WɅՐ
- ˙ǝᵷpǝꞁʍouʞ ʇnoɥʇᴉʍ pǝᴉɟᴉpoɯ ɟᴉ ɥsɐɹɔ ǝɯɐᵷ ǝʞɐɯ ʎɐɯ sᴉɥʇ \'ꞁnɟǝɹɐɔ ǝᗺ
- sᵷuᴉʇʇǝs ꞁɐɹǝuǝ⅁
- sᵷuᴉʇʇǝs ᵷuᴉꞁɐɔS
- ɹǝɹǝpuǝᴚ
- Ɛ˙߈ Ꞁ⅁uǝdO sʇɹodxǝ :(Ɛ SƎ Ꞁ⅁uǝdO) ɹǝɹǝpuǝɹꞁᵷɹᴉʌ
- 0˙Ɛ Ꞁ⅁uǝdO sʇɹodxǝ :(Ɛ SƎ Ꞁ⅁uǝdO) ndᵷʌ
- 9˙߈ Ꞁ⅁uǝdO sʇɹodxǝ :(uɐʞꞁnɅ) ʞuᴉz
- ʇsᴉꞁ uoᴉsɹǝʌ uᴉ ǝq ꞁꞁᴉʍ ǝdʎʇ uoᴉsɹǝɅ
- ǝsɐǝꞁǝᴚ
- ʇoɥsdɐuS
- ɐɥdꞁɐ-pꞁO
- ɐʇǝq-pꞁO
- ǝuoꞁƆ
-
- ʇᴉpƎ
- ɹoɹɹƎ
- ᵷuᴉuɹɐM
- pɐoꞀ
- ǝɯɐN
- ǝʌoɯǝᴚ
- ǝuoꞁƆ
- ʇɹɐʇsǝᴚ
- ǝʌɐS
- %s ᵷuᴉʞɔɐdu∩
- ʎʇdɯǝ ǝq ʇ,uɐɔ pꞁǝᴉɟ sᴉɥ⟘
- ʇᴉɐM
-
- sꞁᴉɐʇǝp ǝɹoɯ ɹoɟ ʇxʇ˙ᵷoꞁʇsǝʇɐꞁ ʞɔǝɥɔ \'%d ǝpoɔ ɥʇᴉʍ pǝʇᴉxǝ ǝɯɐ⅁/uoᴉʇɐɔᴉꞁddⱯ
- ʇᴉxƎ
- ¿ǝsoꞁɔ ǝɔɹoɟ oʇ ʇuɐʍ ǝɹns noʎ ǝɹⱯ
- ¡pǝꞁꞁɐʇsuᴉ ʇou sɐʍ ƐꞀ⅁ՐMꞀ
- ¡ǝɔᴉʌǝp sᴉɥʇ uo pǝʇɹoddns ʇou sᴉ ɹǝɹǝpuǝɹ ʞuᴉZ uɐʞꞁnɅ
-
- I∩⅁
- pɹɐoqʎǝꞰ
- ʇɐɥƆ
- ᵷnqǝᗡ
- ᴉɹԀ
- ɔǝS
- ʌuI
- pɹƐ
- qɐ⟘
- ǝsnoW
- ɟɟo :ǝsnoW
- uo :ǝsnoW
-
- ǝsoꞁɔ ǝɔɹoℲ
- ʇndʇno ᵷoꞀ
- ᵷnqǝᗡ ʇnduI
- ǝpoɔʎǝʞ ɯoʇsnɔ puǝS
- dn ǝlɐɔS
- uʍop ǝlɐɔS
-
- sloɹʇuoɔ ʇɹodɯI
- ǝlᴉɟ pǝʇdnɹɹoɔ ɹo pᴉlɐʌuI
- sloɹʇuoɔ ʇɹodɯᴉ
- …uᴉɐᵷɐ ʎɹʇ puɐ ʇᴉɐʍ ǝsɐǝꞁd \'pǝᴉɟᴉɹǝʌ ᵷuᴉǝq sᴉ ǝꞁᴉℲ
- sʇsᴉxǝ ʎpɐǝɹꞁɐ ǝꞁᴉɟ ɹo ǝɯɐu pᴉꞁɐʌuI
- ǝuop uoᴉʇɐʇɹodɯI
-
- %s ᵷuᴉʇᴉpƎ
- ¿%s ǝʌoɯǝᴚ
- ǝpoɔʎǝꞰ
- ǝꞁqɐǝꞁᵷᵷo⟘
- ǝzᴉS
- ɥʇpᴉM
- ʇɥᵷᴉǝH
- ᵷuᴉddɐW
- uoᴉʇɐʇuǝᴉɹO
- ɹoꞁoɔ punoɹᵷʞɔɐᗺ
- snᴉpɐɹ ɹǝuɹoƆ
- ɥʇpᴉʍ ǝʞoɹʇS
- ɹoꞁoɔ ǝʞoɹʇS
- uoᴉʇᴉsod ɔᴉɯɐuʎᗡ ꞁɐnuɐW
- X ɔᴉɯɐuʎᗡ
- ⅄ ɔᴉɯɐuʎᗡ
- ʎɔuǝɹɐdsuɐɹʇ punoɹᵷʞɔɐᗺ
- ʎʇᴉɔɐdO uoʇʇnᗺ
- uoᴉʇɐuᴉqɯoɔ ʎǝꞰ
- uoʇʇnq ppⱯ
- ɹǝʍɐɹp uoʇʇnq pp∀
- uoʇʇnq-qns pp∀
- ¡ pǝppɐ uǝǝq sɐɥ %d°u uoʇʇnq-qnS
- uosɾ ꞁoɹʇuoƆ ʇꞁnɐɟǝp ʇɔǝꞁǝS
- ɹɐɾ˙ ꞁꞁɐʇsuI
- suoᴉʇdO
- ʎɐꞁԀ
- %s \'ǝɯoɔꞁǝM
- (ɅƎᗡ) oɟuI
- ɹǝsn ɥɔʇᴉʍS
- :uoᴉsɹǝɅ
- pǝʇɔǝʇǝp ɥsɐɹɔ oN
- ˙ᵷoꞁ oN
- ¡ pǝǝɟ sʍǝu ǝɥʇ ɥɔʇǝɟ oʇ pǝꞁᴉɐℲ
- ɹǝʇsnɾpɐ WⱯᴚ ɔᴉʇɐɯoʇnɐ sǝꞁqɐuƎ
- WⱯᴚ oʇnⱯ
- ᗺW %d oʇ ʇǝs ʎɹoɯǝW
- ᵷuᴉpɐoꞁuʍop ɹǝʇɟɐ sǝᴉɹɐɹqᴉꞁ ʞɔǝɥƆ
- ˙spɐoꞁuʍop uǝʞoɹq sʇuǝʌǝɹԀ ˙ǝꞁqɐꞁᴉɐʌɐ s,ʇᴉ ɟᴉ ɥsɐɥ ʎɹɐɹqᴉꞁ ǝɥʇ ʞɔǝɥɔ oʇ ɹǝɥɔunɐꞁ sǝɔɹoɟ uoᴉʇdo sᴉɥ⟘
- pǝpɐoꞁuʍopǝɹ ǝq ꞁꞁᴉʍ puɐ pǝᵷɐɯɐp sᴉ %s ʎɹɐɹqᴉꞀ
- pooᵷ s,ʇᴉ ǝɯnssɐ oʇ ǝʌɐɥ \'pǝʞɔǝɥɔ ǝq ʇ,uɐɔ %s ʎɹɐɹqᴉꞀ
- ǝꞁqɐsn puɐ ǝuᴉɟ sᴉ %s ʎɹɐɹqᴉꞀ
- sǝɹnʇsǝᵷ ǝꞁqɐsᴉᗡ
- ˙ʞɔoꞁq ɐ ǝɔɐꞁd oʇ dɐʇ puɐ \'ʞɔoꞁq ʞɐǝɹq oʇ pꞁoɥ sɐ ɥɔns \'sǝɹnʇsǝᵷ sǝꞁqɐsᴉᗡ
- pǝǝdS ǝsnoW
- ǝsnoɯ ǝɹɐʍʇɟos ǝɥʇ ɟo pǝǝds ǝɥʇ sǝᵷuɐɥƆ
- nɹɥʇ-ssɐd ǝsnoW
- ǝꞁqɐǝdᴉʍS
- pǝpunoᴚ
- ˙sǝɥsɐɹɔ ǝɯɐᵷ ǝɥʇ ɟᴉ uoᴉʇɐɔoꞁꞁɐ ǝɥʇ ǝᵷuɐɥƆ ˙sǝɥsɐɹɔ oʇ pɐǝꞁ ʎɐɯ ɥɔᴉɥʍ \'(%d) WⱯᴚ pǝʇɐɔoꞁꞁɐ uɐɥʇ ɹǝʍoꞁ sᴉ (%d) WⱯᴚ ǝǝɹɟ ɟo ʇunoɯɐ ʇuǝɹɹnɔ ǝɥ⟘
- uoᴉʇɐɔoꞁꞁɐ ʎɹoɯǝW
- ʇɟɐɹɔǝuᴉW oʇ uǝʌᴉᵷ sᴉ ʎɹoɯǝɯ ɥɔnɯ ʍoɥ sꞁoɹʇuoƆ
- ǝɯᴉʇunᴚ ɐʌɐՐ pǝʇdnɹɹoƆ
- %s :ǝɹnʇɔǝʇᴉɥɔɹɐ ǝlqᴉʇɐdɯoɔuI
- sWɅ ɐʌɐՐ
- ʍǝu pp∀
- WɅ ɐʌɐՐ ʍǝu ʇɹodɯI
- ɹǝᵷɐuɐW ǝɯᴉʇunᴚ
- sWɅ ɐʌɐՐ pǝꞁꞁɐʇsuᴉ ǝᵷɐuɐW
- ˙˙˙ᵷuᴉɥɔɐƆ
- ʇꞁnɐɟǝp ʇǝS
- ʇꞁnɐɟǝᗡ
- pǝꞁꞁɐʇsuᴉ ǝɯᴉʇunᴚ ɐʌɐՐ ǝuo ʇsɐǝꞁ ʇɐ ǝʌɐɥ ʇsnɯ no⅄
- ˙ɹǝʍǝu ɹo %d ɐʌɐſ sǝɹᴉnbǝɹ uoᴉsɹǝʌ sᴉɥ┴ ˙ǝɯᴉʇunɹ ɐʌɐſ ǝlqᴉʇɹɐdɯoɔ ʎuɐ puᴉɟ ʇ,uɐƆ
- ˙8 ɐʌɐſ llɐʇsuᴉ oʇ pǝǝu noʎ \'uoᴉʇdo sᴉɥʇ ǝsn oʇ ɹǝpɹo uI ˙8 ɐʌɐſ puᴉɟ ʇ,uɐƆ
- ʎɐʍʎuɐ ʎɐlԀ
- ʎɹoʇɔǝɹᴉp ǝɯɐ⅁
- sʇuǝɯnᵷɹɐ WɅՐ
- sᵷuᴉʇʇǝs uoᴉsɹǝʌ-ɹǝԀ
- sǝᵷuɐɥɔ ǝᵷɐɹoʇS
- ɹǝɥɔunɐ˥ʌɐɾoԀ/sǝɯɐƃ ʇɐ ɹǝploɟ lɐuᴉƃᴉɹo ǝɥʇ ɯoɹɟ ƃuᴉɥʇʎɹǝʌǝ ʎdoɔ ǝsɐǝld \'sǝlᴉɟ ǝɯɐƃ ɹnoʎ ʎdoɔ oʇ pǝǝu noʎ ɟI
˙(ɹǝɹoldxǝ ǝlᴉɟ ɹnoʎ uᴉ ɹǝpᴉʌoɹd ǝƃɐɹoʇs ɐ ƃuᴉsn ǝlqᴉssǝɔɔɐ oslɐ) /sǝlᴉɟ/%s/ɐʇɐp/pᴉoɹpu∀ sᴉ sǝlᴉɟ ʌɐɾoԀ ɹoɟ ɹǝploɟ ʍǝu ǝɥ┴
˙ɹǝploɟ ǝʇɐʌᴉɹd-ddɐ uɐ oʇuᴉ ʎɹoʇɔǝɹᴉp ǝɯɐƃ ǝɥʇ ǝʌoɯ oʇ pǝɹᴉnbǝɹ ǝɹɐ ǝʍ \'ɹǝɥƃᴉɥ puɐ 0Ɩ pᴉoɹpu∀ uᴉ pǝppɐ sʇuǝɯǝɔɹoɟuǝ ǝƃɐɹoʇs pǝdoɔs ʍǝu s,\ǝlƃooפ oʇ ǝnp]]>
- ʇǝsɟɟo ꞁoɹʇuoƆ
- :ʇǝsɟɟo do⟘
- :ʇǝsɟɟo ʇɥᵷᴉɹ
- :ʇǝsɟɟo ɯoʇʇoq
- :ʇǝsɟɟo ʇɟǝꞁ
- sʇǝsɟɟo ǝpᴉs ꞁoɹʇuoƆ
- uǝǝɹɔs ǝɥʇ ɟo ǝpᴉs ɥɔɐǝ oʇ ʇǝsɟɟo ɯoʇsnɔ ɐ ʇǝS
- uo ǝsnoɯ lɐnʇɹᴉʌ ɥʇᴉʍ ʇɹɐʇS
- ʎɐlnoq-sɐᴉɥʇɐW ʎq pǝƃpnɾ noʎ ʇǝƃ llᴉʍ uoᴉʇdo sᴉɥʇ ƃuᴉs∩
- ɹǝɹǝpuǝɹ puɐ oǝpᴉɅ
- ɹǝɹǝpuǝɹ puɐ \'ǝdʎʇ ᵷuᴉꞁɐɔs \'uoᴉʇnꞁosǝᴚ
- uoᴉʇɐzᴉɯoʇsnɔ ꞁoɹʇuoƆ
- ᵷuᴉꞁɐɔs puɐ \'sɹǝᵷᵷᴉɹʇ \'sǝdʎʇ sǝɹnʇsǝ⅁
- sʞɐǝʍ⟘ ɐʌɐՐ
- ʇunoɯɐ WⱯᴚ puɐ \'sʇuǝɯnᵷɹⱯ WɅՐ \'suoᴉsɹǝʌ ɐʌɐՐ
- sᵷuᴉʇʇǝs snoǝuɐꞁꞁǝɔsᴉW
- sʞɔǝɥɔ sqᴉꞁ puɐ \'ʇsᴉꞁ uoᴉsɹǝɅ
- ɟɟnʇS ꞁɐʇuǝɯᴉɹǝdxƎ
- ˙ʇɹoddns ou \'uoᴉʇɐɹǝpᴉsuoɔ ɥʇᴉʍ ǝɹǝɥʇ sᵷuᴉɥʇ ǝs∩
- ǝpoɯ ǝɔuɐɯɹoɟɹǝd pǝuᴉɐʇsns ǝꞁqɐuƎ
- ǝɔuɐɯɹoɟɹǝd ʞɐǝd ᵷuᴉʇᴉɯᴉꞁ ʎq ᵷuᴉꞁʇʇoɹɥʇ ꞁɐɯɹǝɥʇ ʇᴉɯᴉꞀ
- uǝǝɹɔs ʇsɐꞁ ǝɥʇ oʇ ʞɔɐᗺ
- ʞɔɐɥ ʞuᴉɹɥS SƎㄣ˥פ
- sǝɹnʇxǝʇ ʞuᴉɹɥs ʇ,uop
- ᄅ ʎq sǝɹnʇxǝʇ llɐ sǝpᴉʌᴉp
- ㄣ/ ɹo ᄅ/ ʎq sǝɹnʇxǝʇ ƃᴉq sǝpᴉʌᴉp
- pǝɯɐuu∩
- ʇoɥsdɐus ʇsǝʇɐ˥
- ǝsɐǝlǝɹ ʇsǝʇɐ˥
- ǝlᴉɟoɹd ƃuᴉʇᴉpƎ
- ǝɯɐN
- uoᴉsɹǝΛ
- ǝʇǝlǝp
- ǝɯᴉʇunɹ ɐʌɐſ
- ɹǝɹǝpuǝᴚ
- sǝdɐɔ ɐɔıʇǝɯsoɔ
- ˙ǝuıɟıʇdo sǝɹınbǝɹ ˙ɔɔ˙ɐɔıʇǝɯsoɔ//:sdʇʇɥ ʇısıʌ ǝsɐǝld uoıʇɐɯɹoɟuı ǝɹoɯ ɹoɟ ˙(ɔɹɐ ʎlsnoıʌǝɹd) ɐɔıʇǝɯsoɔ ɯoɹɟ sǝdɐɔ sǝlqɐuǝ
- uoᴉʇɐɹnƃᴉɟuoɔ uoᴉsɹǝʌ %s
-
diff --git a/gl4es b/gl4es
index 37452ff0d..b675669fb 160000
--- a/gl4es
+++ b/gl4es
@@ -1 +1 @@
-Subproject commit 37452ff0dc01b2edbbe146840c1c3acb42e586bb
+Subproject commit b675669fbd9acf2592d626fe9dfae929f19b17b2
diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/glfw/GLFW.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/glfw/GLFW.java
index 9ef855c36..247732615 100644
--- a/jre_lwjgl3glfw/src/main/java/org/lwjgl/glfw/GLFW.java
+++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/glfw/GLFW.java
@@ -689,12 +689,6 @@ public class GLFW
if (cbfun == null) mGLFWFramebufferSizeCallback = null;
else mGLFWFramebufferSizeCallback = GLFWFramebufferSizeCallback.createSafe(nglfwSetFramebufferSizeCallback(window, memAddressSafe(cbfun)));
- mGLFWFramebufferSizeCallback = GLFWFramebufferSizeCallback.createSafe(nglfwSetFramebufferSizeCallback(window, memAddressSafe(cbfun)));
-
- try {
- mGLFWFramebufferSizeCallback.invoke(window, mGLFWWindowWidth, mGLFWWindowHeight);
- } catch (Throwable th) {}
-
return lastCallback;
}
@@ -798,12 +792,6 @@ public class GLFW
if (cbfun == null) mGLFWWindowSizeCallback = null;
else mGLFWWindowSizeCallback = GLFWWindowSizeCallback.createSafe(nglfwSetWindowSizeCallback(window, memAddressSafe(cbfun)));
- mGLFWWindowSizeCallback = GLFWWindowSizeCallback.createSafe(nglfwSetWindowSizeCallback(window, memAddressSafe(cbfun)));
-
- try {
- mGLFWWindowSizeCallback.invoke(window, mGLFWWindowWidth, mGLFWWindowHeight);
- } catch (Throwable th) {}
-
return lastCallback;
}
@@ -922,10 +910,9 @@ public class GLFW
@NativeType("GLFWvidmode const *")
public static GLFWVidMode.Buffer glfwGetVideoModes(@NativeType("GLFWmonitor *") long monitor) {
MemoryStack stack = stackGet(); int stackPointer = stack.getPointer();
- IntBuffer count = stack.callocInt(1);
try {
// long __result = nglfwGetVideoModes(monitor, memAddress(count));
- long __result = memAddress(stack.callocLong(1));
+ long __result = glfwGetVideoMode(monitor).address();
return GLFWVidMode.createSafe(__result, 1);
} finally {
stack.setPointer(stackPointer);
diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Controllers.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Controllers.java
index eac151dee..7e6d1ebdd 100644
--- a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Controllers.java
+++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Controllers.java
@@ -19,8 +19,7 @@ public static int getControllerCount() {
ctrlr.poll();
}
public static boolean next() {
- ctrlr.poll();
- return true;
+ return false;
}
public static boolean isCreated() {
return true;
diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/opengl/Display.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/opengl/Display.java
index 232e67138..d1fde8c94 100644
--- a/jre_lwjgl3glfw/src/main/java/org/lwjgl/opengl/Display.java
+++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/opengl/Display.java
@@ -953,7 +953,7 @@ public class Display {
} else {
glfwSetWindowIcon(Window.handle, new GLFWImage.Buffer(icons[0]));
}
- } catch (NullPointerException e) {
+ } catch (Exception e) {
LWJGLUtil.log("Couldn't set icon");
e.printStackTrace();
}
@@ -986,8 +986,10 @@ public class Display {
}
public static void setDisplayModeAndFullscreen(DisplayMode dm) throws LWJGLException {
- Display.mode = dm;
- GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight());
+ if(Window.handle != 0) {
+ Display.mode = dm;
+ GLFW.glfwSetWindowSize(Window.handle, dm.getWidth(), dm.getHeight());
+ }
}
public static void setFullscreen(boolean fullscreen) throws LWJGLException {