diff --git a/README.md b/README.md index 66a2e0875..e3e4a447a 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,63 @@ +

PojavLauncher

+ +PojavLauncher logo + [![Android CI](https://github.com/PojavLauncherTeam/PojavLauncher/workflows/Android%20CI/badge.svg)](https://github.com/PojavLauncherTeam/PojavLauncher/actions) +[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/PojavLauncherTeam/PojavLauncher)](https://github.com/PojavLauncherTeam/PojavLauncher/actions) [![Crowdin](https://badges.crowdin.net/pojavlauncher/localized.svg)](https://crowdin.com/project/pojavlauncher) -[![Discord](https://img.shields.io/discord/724163890803638273.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/6RpEJda) -[![Reddit](https://img.shields.io/badge/dynamic/json.svg?label=r/PojavLauncher%20member%20count&query=$.data.subscribers&url=https://www.reddit.com/r/PojavLauncher/about.json)](https://reddit.com/r/PojavLauncher) -[![Google Play](https://gist.githubusercontent.com/meefik/54a54afa7cc1dc600bdb855cb7895a4a/raw/ad617c006a1ac28d067c9a87cec60199ca8fef7c/get-it-on-google-play.png)](https://play.google.com/store/apps/details?id=net.kdt.pojavlaunch) +[![Discord](https://img.shields.io/discord/724163890803638273.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/6RpEJda) +[![Twitter Follow](https://img.shields.io/twitter/follow/plaunchteam?color=blue&style=flat-square)](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: +[![Google Play](https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png)](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 {