diff --git a/app/build.gradle b/app/build.gradle
index 1c926a1..1b6f5ac 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId 'com.winlator'
minSdkVersion 26
targetSdkVersion 28
- versionCode 12
- versionName "6.0"
+ versionCode 13
+ versionName "6.1"
}
buildTypes {
@@ -27,6 +27,8 @@ android {
checkReleaseBuilds false
}
+ ndkVersion '22.1.7171670'
+
externalNativeBuild {
cmake {
version '3.22.1'
diff --git a/app/src/main/assets/box86_64/box64-0.2.6.tzst b/app/src/main/assets/box86_64/box64-0.2.6.tzst
index 87b5f17..1dcfb3a 100644
Binary files a/app/src/main/assets/box86_64/box64-0.2.6.tzst and b/app/src/main/assets/box86_64/box64-0.2.6.tzst differ
diff --git a/app/src/main/assets/box86_64/box64-0.2.7.tzst b/app/src/main/assets/box86_64/box64-0.2.7.tzst
index 4767fcf..ca9e475 100644
Binary files a/app/src/main/assets/box86_64/box64-0.2.7.tzst and b/app/src/main/assets/box86_64/box64-0.2.7.tzst differ
diff --git a/app/src/main/assets/box86_64/box86-0.3.0.tzst b/app/src/main/assets/box86_64/box86-0.3.0.tzst
index b085219..10e42a3 100644
Binary files a/app/src/main/assets/box86_64/box86-0.3.0.tzst and b/app/src/main/assets/box86_64/box86-0.3.0.tzst differ
diff --git a/app/src/main/assets/box86_64/box86-0.3.5.tzst b/app/src/main/assets/box86_64/box86-0.3.5.tzst
index b8af26e..241263f 100644
Binary files a/app/src/main/assets/box86_64/box86-0.3.5.tzst and b/app/src/main/assets/box86_64/box86-0.3.5.tzst differ
diff --git a/app/src/main/assets/graphics_driver/turnip-23.0.0.tzst b/app/src/main/assets/graphics_driver/turnip-23.0.0.tzst
new file mode 100644
index 0000000..235f455
Binary files /dev/null and b/app/src/main/assets/graphics_driver/turnip-23.0.0.tzst differ
diff --git a/app/src/main/assets/graphics_driver/turnip-24.0.2.tzst b/app/src/main/assets/graphics_driver/turnip-24.0.2.tzst
deleted file mode 100644
index 73d3e70..0000000
Binary files a/app/src/main/assets/graphics_driver/turnip-24.0.2.tzst and /dev/null differ
diff --git a/app/src/main/assets/graphics_driver/turnip-24.1.0.tzst b/app/src/main/assets/graphics_driver/turnip-24.1.0.tzst
new file mode 100644
index 0000000..8f77c91
Binary files /dev/null and b/app/src/main/assets/graphics_driver/turnip-24.1.0.tzst differ
diff --git a/app/src/main/assets/imagefs.txz b/app/src/main/assets/imagefs.txz
index da099a4..f8678a5 100644
--- a/app/src/main/assets/imagefs.txz
+++ b/app/src/main/assets/imagefs.txz
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ffbd6b8bb2d8df316038c1ffbe6a882b620ac5a87c078e3272d8299d79de1b64
-size 167540620
+oid sha256:68491a479524185489abae06045bf9f9d0018b57ec7bd7d26faeb58edcd2f1b5
+size 167532776
diff --git a/app/src/main/assets/imagefs_patches.tzst b/app/src/main/assets/imagefs_patches.tzst
index 1af52ea..463ed2f 100644
Binary files a/app/src/main/assets/imagefs_patches.tzst and b/app/src/main/assets/imagefs_patches.tzst differ
diff --git a/app/src/main/assets/pulseaudio.tzst b/app/src/main/assets/pulseaudio.tzst
index 884f0ff..21ae130 100644
Binary files a/app/src/main/assets/pulseaudio.tzst and b/app/src/main/assets/pulseaudio.tzst differ
diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt
index 01aa35e..da22641 100644
--- a/app/src/main/cpp/CMakeLists.txt
+++ b/app/src/main/cpp/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22.1)
Project(Winlator)
-set(CMAKE_C_FLAGS "-O2 -Wno-unused-function -Wimplicit-function-declaration")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wno-unused-function -Wimplicit-function-declaration")
add_subdirectory(proot)
add_subdirectory(virglrenderer)
diff --git a/app/src/main/cpp/proot/CMakeLists.txt b/app/src/main/cpp/proot/CMakeLists.txt
index 45d97f7..b04e6d4 100644
--- a/app/src/main/cpp/proot/CMakeLists.txt
+++ b/app/src/main/cpp/proot/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22.1)
project(PRoot)
-set(CMAKE_C_FLAGS "-O2 -Wno-unused-function -Wimplicit-function-declaration")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wno-unused-function -Wimplicit-function-declaration")
add_library(talloc STATIC
talloc/talloc.c)
diff --git a/app/src/main/cpp/virglrenderer/CMakeLists.txt b/app/src/main/cpp/virglrenderer/CMakeLists.txt
index 6741df0..55802e7 100644
--- a/app/src/main/cpp/virglrenderer/CMakeLists.txt
+++ b/app/src/main/cpp/virglrenderer/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22.1)
project(VirGLRenderer)
-set(CMAKE_C_FLAGS "-O2 -Wno-unused-function -Wimplicit-function-declaration")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wno-unused-function -Wimplicit-function-declaration")
include_directories(src
src/gallium/include
diff --git a/app/src/main/java/com/winlator/ContainerDetailFragment.java b/app/src/main/java/com/winlator/ContainerDetailFragment.java
index c2ddf14..671c4a8 100644
--- a/app/src/main/java/com/winlator/ContainerDetailFragment.java
+++ b/app/src/main/java/com/winlator/ContainerDetailFragment.java
@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
@@ -32,6 +31,7 @@ import com.winlator.container.Container;
import com.winlator.container.ContainerManager;
import com.winlator.contentdialog.AddEnvVarDialog;
import com.winlator.contentdialog.DXVKConfigDialog;
+import com.winlator.contentdialog.TurnipConfigDialog;
import com.winlator.core.AppUtils;
import com.winlator.core.Callback;
import com.winlator.core.EnvVars;
@@ -135,8 +135,11 @@ public class ContainerDetailFragment extends Fragment {
final View vDXWrapperConfig = view.findViewById(R.id.BTDXWrapperConfig);
vDXWrapperConfig.setTag(editContainer ? container.getDXWrapperConfig() : "");
+ final View vGraphicsDriverConfig = view.findViewById(R.id.BTGraphicsDriverConfig);
+ vGraphicsDriverConfig.setTag(editContainer ? container.getGraphicsDriverConfig() : "");
+
setupDXWrapperSpinner(sDXWrapper, vDXWrapperConfig);
- loadGraphicsDriverSpinner(sGraphicsDriver, sDXWrapper,
+ loadGraphicsDriverSpinner(sGraphicsDriver, sDXWrapper, vGraphicsDriverConfig,
editContainer ? container.getGraphicsDriver() : Container.DEFAULT_GRAPHICS_DRIVER, editContainer ? container.getDXWrapper() : Container.DEFAULT_DXWRAPPER);
view.findViewById(R.id.BTHelpDXWrapper).setOnClickListener((v) -> AppUtils.showHelpBox(context, v, R.string.dxwrapper_help_content));
@@ -175,6 +178,7 @@ public class ContainerDetailFragment extends Fragment {
String graphicsDriver = StringUtils.parseIdentifier(sGraphicsDriver.getSelectedItem());
String dxwrapper = StringUtils.parseIdentifier(sDXWrapper.getSelectedItem());
String dxwrapperConfig = vDXWrapperConfig.getTag().toString();
+ String graphicsDriverConfig = vGraphicsDriverConfig.getTag().toString();
String audioDriver = StringUtils.parseIdentifier(sAudioDriver.getSelectedItem());
String wincomponents = getWinComponents(view);
String drives = getDrives(view);
@@ -193,6 +197,7 @@ public class ContainerDetailFragment extends Fragment {
container.setGraphicsDriver(graphicsDriver);
container.setDXWrapper(dxwrapper);
container.setDXWrapperConfig(dxwrapperConfig);
+ container.setGraphicsDriverConfig(graphicsDriverConfig);
container.setAudioDriver(audioDriver);
container.setWinComponents(wincomponents);
container.setDrives(drives);
@@ -214,6 +219,7 @@ public class ContainerDetailFragment extends Fragment {
data.put("graphicsDriver", graphicsDriver);
data.put("dxwrapper", dxwrapper);
data.put("dxwrapperConfig", dxwrapperConfig);
+ data.put("graphicsDriverConfig", graphicsDriverConfig);
data.put("audioDriver", audioDriver);
data.put("wincomponents", wincomponents);
data.put("drives", drives);
@@ -442,7 +448,7 @@ public class ContainerDetailFragment extends Fragment {
}
}
- public static void loadGraphicsDriverSpinner(final Spinner sGraphicsDriver, final Spinner sDXWrapper, String selectedGraphicsDriver, String selectedDXWrapper) {
+ public static void loadGraphicsDriverSpinner(final Spinner sGraphicsDriver, final Spinner sDXWrapper, final View vGraphicsDriverConfig, String selectedGraphicsDriver, String selectedDXWrapper) {
final Context context = sGraphicsDriver.getContext();
final String[] dxwrapperEntries = context.getResources().getStringArray(R.array.dxwrapper_entries);
@@ -459,6 +465,12 @@ public class ContainerDetailFragment extends Fragment {
sGraphicsDriver.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
+ String graphicsDriver = StringUtils.parseIdentifier(sGraphicsDriver.getSelectedItem());
+ if (graphicsDriver.equals("turnip")) {
+ vGraphicsDriverConfig.setOnClickListener((v) -> (new TurnipConfigDialog(vGraphicsDriverConfig)).show());
+ vGraphicsDriverConfig.setVisibility(View.VISIBLE);
+ }
+ else vGraphicsDriverConfig.setVisibility(View.GONE);
update.run();
}
@@ -467,11 +479,10 @@ public class ContainerDetailFragment extends Fragment {
});
AppUtils.setSpinnerSelectionFromIdentifier(sGraphicsDriver, selectedGraphicsDriver);
-
update.run();
}
- public static void setupDXWrapperSpinner(Spinner sDXWrapper, View vDXWrapperConfig) {
+ public static void setupDXWrapperSpinner(final Spinner sDXWrapper, final View vDXWrapperConfig) {
sDXWrapper.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
diff --git a/app/src/main/java/com/winlator/MainActivity.java b/app/src/main/java/com/winlator/MainActivity.java
index 3849884..47221e9 100644
--- a/app/src/main/java/com/winlator/MainActivity.java
+++ b/app/src/main/java/com/winlator/MainActivity.java
@@ -185,9 +185,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
try {
final PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
- TextView tvDeveloper = dialog.findViewById(R.id.TVDeveloper);
- tvDeveloper.setText(Html.fromHtml("by BrunoSX (winlator.org)", Html.FROM_HTML_MODE_LEGACY));
- tvDeveloper.setMovementMethod(LinkMovementMethod.getInstance());
+ TextView tvWebpage = dialog.findViewById(R.id.TVWebpage);
+ tvWebpage.setText(Html.fromHtml("winlator.org", Html.FROM_HTML_MODE_LEGACY));
+ tvWebpage.setMovementMethod(LinkMovementMethod.getInstance());
((TextView)dialog.findViewById(R.id.TVAppVersion)).setText(getString(R.string.version)+" "+pInfo.versionName);
diff --git a/app/src/main/java/com/winlator/XServerDisplayActivity.java b/app/src/main/java/com/winlator/XServerDisplayActivity.java
index ef70ee3..fbef357 100644
--- a/app/src/main/java/com/winlator/XServerDisplayActivity.java
+++ b/app/src/main/java/com/winlator/XServerDisplayActivity.java
@@ -26,6 +26,7 @@ import com.winlator.container.ContainerManager;
import com.winlator.container.Shortcut;
import com.winlator.contentdialog.ContentDialog;
import com.winlator.contentdialog.DXVKConfigDialog;
+import com.winlator.contentdialog.TurnipConfigDialog;
import com.winlator.core.AppUtils;
import com.winlator.core.CursorLocker;
import com.winlator.core.EnvVars;
@@ -96,6 +97,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
private String audioDriver = Container.DEFAULT_AUDIO_DRIVER;
private String dxwrapper = Container.DEFAULT_DXWRAPPER;
private KeyValueSet dxwrapperConfig;
+ private KeyValueSet graphicsDriverConfig;
private WineInfo wineInfo;
private final EnvVars envVars = new EnvVars();
private boolean firstTimeBoot = false;
@@ -145,6 +147,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
audioDriver = container.getAudioDriver();
dxwrapper = container.getDXWrapper();
String dxwrapperConfig = container.getDXWrapperConfig();
+ String graphicsDriverConfig = container.getGraphicsDriverConfig();
screenSize = container.getScreenSize();
if (shortcut != null) {
@@ -152,6 +155,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
audioDriver = shortcut.getExtra("audioDriver", container.getAudioDriver());
dxwrapper = shortcut.getExtra("dxwrapper", container.getDXWrapper());
dxwrapperConfig = shortcut.getExtra("dxwrapperConfig", container.getDXWrapperConfig());
+ graphicsDriverConfig = shortcut.getExtra("graphicsDriverConfig", container.getGraphicsDriverConfig());
screenSize = shortcut.getExtra("screenSize", container.getScreenSize());
String dinputMapperType = shortcut.getExtra("dinputMapperType");
@@ -159,6 +163,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
}
if (dxwrapper.equals("dxvk")) this.dxwrapperConfig = DXVKConfigDialog.parseConfig(dxwrapperConfig);
+ if (graphicsDriver.equals("turnip")) this.graphicsDriverConfig = TurnipConfigDialog.parseConfig(this, graphicsDriverConfig);
if (!wineInfo.isWin64()) {
onExtractFileListener = (file, size) -> {
@@ -407,6 +412,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
winHandler.start();
envVars.clear();
dxwrapperConfig = null;
+ graphicsDriverConfig = null;
}
private void setupUI() {
@@ -529,7 +535,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
private void extractGraphicsDriverFiles() {
String cacheId = graphicsDriver;
if (graphicsDriver.equals("turnip")) {
- cacheId += "-"+DefaultVersion.TURNIP+"-"+DefaultVersion.ZINK;
+ cacheId += "-"+graphicsDriverConfig.get("version")+"-"+DefaultVersion.ZINK;
}
else if (graphicsDriver.equals("virgl")) {
cacheId += "-"+DefaultVersion.VIRGL;
@@ -549,8 +555,8 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
if (graphicsDriver.equals("turnip")) {
if (dxwrapper.equals("dxvk")) DXVKConfigDialog.setEnvVars(this, dxwrapperConfig, envVars);
+ TurnipConfigDialog.setEnvVars(graphicsDriverConfig, envVars);
envVars.put("GALLIUM_DRIVER", "zink");
- envVars.put("TU_DEBUG", "noconform");
envVars.put("MESA_VK_WSI_PRESENT_MODE", "mailbox");
envVars.put("vblank_mode", "0");
@@ -561,7 +567,7 @@ public class XServerDisplayActivity extends AppCompatActivity implements Navigat
}
if (changed) {
- TarCompressorUtils.extract(TarCompressorUtils.Type.ZSTD, this, "graphics_driver/turnip-"+DefaultVersion.TURNIP+".tzst", rootDir);
+ TarCompressorUtils.extract(TarCompressorUtils.Type.ZSTD, this, "graphics_driver/turnip-"+graphicsDriverConfig.get("version")+".tzst", rootDir);
TarCompressorUtils.extract(TarCompressorUtils.Type.ZSTD, this, "graphics_driver/zink-"+DefaultVersion.ZINK+".tzst", rootDir);
}
}
diff --git a/app/src/main/java/com/winlator/container/Container.java b/app/src/main/java/com/winlator/container/Container.java
index 1c6fd6a..21e027a 100644
--- a/app/src/main/java/com/winlator/container/Container.java
+++ b/app/src/main/java/com/winlator/container/Container.java
@@ -25,7 +25,7 @@ public class Container {
public static final String DEFAULT_DXWRAPPER = "wined3d";
public static final String DEFAULT_WINCOMPONENTS = "direct3d=1,directsound=1,directmusic=0,directshow=0,directplay=0,vcrun2010=1";
public static final String FALLBACK_WINCOMPONENTS = "direct3d=0,directsound=0,directmusic=0,directshow=0,directplay=0,vcrun2010=0";
- public static final String DEFAULT_DRIVES = "D:"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+ public static final String DEFAULT_DRIVES = "D:"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"E:/data/data/com.winlator/storage";
public static final byte MAX_DRIVE_LETTERS = 8;
public final int id;
private String name;
@@ -34,6 +34,7 @@ public class Container {
private String graphicsDriver = DEFAULT_GRAPHICS_DRIVER;
private String dxwrapper = DEFAULT_DXWRAPPER;
private String dxwrapperConfig = "";
+ private String graphicsDriverConfig = "";
private String wincomponents = DEFAULT_WINCOMPONENTS;
private String audioDriver = DEFAULT_AUDIO_DRIVER;
private String drives = DEFAULT_DRIVES;
@@ -100,6 +101,14 @@ public class Container {
this.dxwrapperConfig = dxwrapperConfig != null ? dxwrapperConfig : "";
}
+ public String getGraphicsDriverConfig() {
+ return graphicsDriverConfig;
+ }
+
+ public void setGraphicsDriverConfig(String graphicsDriverConfig) {
+ this.graphicsDriverConfig = graphicsDriverConfig != null ? graphicsDriverConfig : "";
+ }
+
public String getAudioDriver() {
return audioDriver;
}
@@ -267,6 +276,7 @@ public class Container {
data.put("graphicsDriver", graphicsDriver);
data.put("dxwrapper", dxwrapper);
if (!dxwrapperConfig.isEmpty()) data.put("dxwrapperConfig", dxwrapperConfig);
+ if (!graphicsDriverConfig.isEmpty()) data.put("graphicsDriverConfig", graphicsDriverConfig);
data.put("audioDriver", audioDriver);
data.put("wincomponents", wincomponents);
data.put("drives", drives);
@@ -289,6 +299,7 @@ public class Container {
public void loadData(JSONObject data) throws JSONException {
wineVersion = WineInfo.MAIN_WINE_VERSION.identifier();
dxwrapperConfig = "";
+ graphicsDriverConfig = "";
checkObsoleteOrMissingProperties(data);
for (Iterator it = data.keys(); it.hasNext(); ) {
@@ -318,6 +329,9 @@ public class Container {
case "dxwrapperConfig" :
setDXWrapperConfig(data.getString(key));
break;
+ case "graphicsDriverConfig" :
+ setGraphicsDriverConfig(data.getString(key));
+ break;
case "drives" :
setDrives(data.getString(key));
break;
diff --git a/app/src/main/java/com/winlator/container/ContainerManager.java b/app/src/main/java/com/winlator/container/ContainerManager.java
index 6f14055..c833dfb 100644
--- a/app/src/main/java/com/winlator/container/ContainerManager.java
+++ b/app/src/main/java/com/winlator/container/ContainerManager.java
@@ -141,6 +141,7 @@ public class ContainerManager {
dstContainer.setGraphicsDriver(srcContainer.getGraphicsDriver());
dstContainer.setDXWrapper(srcContainer.getDXWrapper());
dstContainer.setDXWrapperConfig(srcContainer.getDXWrapperConfig());
+ dstContainer.setGraphicsDriverConfig(srcContainer.getGraphicsDriverConfig());
dstContainer.setAudioDriver(srcContainer.getAudioDriver());
dstContainer.setWinComponents(srcContainer.getWinComponents());
dstContainer.setDrives(srcContainer.getDrives());
diff --git a/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java b/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java
index ec4d3df..97a694b 100644
--- a/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java
+++ b/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java
@@ -66,14 +66,17 @@ public class ShortcutSettingsDialog extends ContentDialog {
final View vDXWrapperConfig = findViewById(R.id.BTDXWrapperConfig);
vDXWrapperConfig.setTag(shortcut.getExtra("dxwrapperConfig", shortcut.container.getDXWrapperConfig()));
+ final View vGraphicsDriverConfig = findViewById(R.id.BTGraphicsDriverConfig);
+ vGraphicsDriverConfig.setTag(shortcut.getExtra("graphicsDriverConfig", shortcut.container.getGraphicsDriverConfig()));
+
ContainerDetailFragment.setupDXWrapperSpinner(sDXWrapper, vDXWrapperConfig);
- ContainerDetailFragment.loadGraphicsDriverSpinner(sGraphicsDriver, sDXWrapper,
+ ContainerDetailFragment.loadGraphicsDriverSpinner(sGraphicsDriver, sDXWrapper, vGraphicsDriverConfig,
shortcut.getExtra("graphicsDriver", shortcut.container.getGraphicsDriver()), shortcut.getExtra("dxwrapper", shortcut.container.getDXWrapper()));
findViewById(R.id.BTHelpDXWrapper).setOnClickListener((v) -> AppUtils.showHelpBox(context, v, R.string.dxwrapper_help_content));
final Spinner sAudioDriver = findViewById(R.id.SAudioDriver);
- AppUtils.setSpinnerSelectionFromIdentifier(sAudioDriver, shortcut.getExtra("audioDriver"));
+ AppUtils.setSpinnerSelectionFromIdentifier(sAudioDriver, shortcut.getExtra("audioDriver", shortcut.container.getAudioDriver()));
final CheckBox cbForceFullscreen = findViewById(R.id.CBForceFullscreen);
cbForceFullscreen.setChecked(shortcut.getExtra("forceFullscreen", "0").equals("1"));
@@ -117,6 +120,7 @@ public class ShortcutSettingsDialog extends ContentDialog {
String graphicsDriver = StringUtils.parseIdentifier(sGraphicsDriver.getSelectedItem());
String dxwrapper = StringUtils.parseIdentifier(sDXWrapper.getSelectedItem());
String dxwrapperConfig = vDXWrapperConfig.getTag().toString();
+ String graphicsDriverConfig = vGraphicsDriverConfig.getTag().toString();
String audioDriver = StringUtils.parseIdentifier(sAudioDriver.getSelectedItem());
String execArgs = etExecArgs.getText().toString();
@@ -125,6 +129,7 @@ public class ShortcutSettingsDialog extends ContentDialog {
shortcut.putExtra("graphicsDriver", !graphicsDriver.equals(shortcut.container.getGraphicsDriver()) ? graphicsDriver : null);
shortcut.putExtra("dxwrapper", !dxwrapper.equals(shortcut.container.getDXWrapper()) ? dxwrapper : null);
shortcut.putExtra("dxwrapperConfig", !dxwrapperConfig.equals(shortcut.container.getDXWrapperConfig()) ? dxwrapperConfig : null);
+ shortcut.putExtra("graphicsDriverConfig", !graphicsDriverConfig.equals(shortcut.container.getGraphicsDriverConfig()) ? graphicsDriverConfig : null);
shortcut.putExtra("audioDriver", !audioDriver.equals(shortcut.container.getAudioDriver())? audioDriver : null);
shortcut.putExtra("forceFullscreen", cbForceFullscreen.isChecked() ? "1" : null);
shortcut.putExtra("wincomponents", getWinComponents());
diff --git a/app/src/main/java/com/winlator/contentdialog/TurnipConfigDialog.java b/app/src/main/java/com/winlator/contentdialog/TurnipConfigDialog.java
new file mode 100644
index 0000000..f498567
--- /dev/null
+++ b/app/src/main/java/com/winlator/contentdialog/TurnipConfigDialog.java
@@ -0,0 +1,81 @@
+package com.winlator.contentdialog;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.Spinner;
+
+import com.winlator.R;
+import com.winlator.core.AppUtils;
+import com.winlator.core.DefaultVersion;
+import com.winlator.core.EnvVars;
+import com.winlator.core.KeyValueSet;
+import com.winlator.core.StringUtils;
+import com.winlator.core.UnitUtils;
+
+public class TurnipConfigDialog extends ContentDialog {
+ private static final String[] DEBUG_OPTIONS = {"noconform", "syncdraw", "flushall"};
+
+ public TurnipConfigDialog(View anchor) {
+ super(anchor.getContext(), R.layout.turnip_config_dialog);
+ Context context = anchor.getContext();
+ setIcon(R.drawable.icon_settings);
+ setTitle("Turnip "+context.getString(R.string.configuration));
+
+ final Spinner sVersion = findViewById(R.id.SVersion);
+
+ KeyValueSet config = parseConfig(context, anchor.getTag());
+ AppUtils.setSpinnerSelectionFromIdentifier(sVersion, config.get("version"));
+ loadDebugOptions(config.get("options"));
+
+ setOnConfirmCallback(() -> {
+ config.put("version", StringUtils.parseNumber(sVersion.getSelectedItem()));
+ config.put("options", getDebugOptions());
+ anchor.setTag(config.toString());
+ });
+ }
+
+ private static String getDefaultConfig(Context context) {
+ return "version="+DefaultVersion.TURNIP(context)+",options=noconform";
+ }
+
+ private String getDebugOptions() {
+ String options = "";
+ LinearLayout container = findViewById(R.id.LLOptions);
+
+ for (int i = 0; i < container.getChildCount(); i++) {
+ CheckBox checkBox = (CheckBox)container.getChildAt(i);
+ if (checkBox.isChecked()) options += (!options.isEmpty() ? "|" : "")+checkBox.getText();
+ }
+
+ return options;
+ }
+
+ private void loadDebugOptions(String options) {
+ LinearLayout container = findViewById(R.id.LLOptions);
+ container.removeAllViews();
+ Context context = container.getContext();
+
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ params.setMargins(0, 0, (int)UnitUtils.dpToPx(4), 0);
+ for (String opt : DEBUG_OPTIONS) {
+ CheckBox checkBox = new CheckBox(context);
+ checkBox.setText(opt);
+ checkBox.setLayoutParams(params);
+ checkBox.setChecked(options.contains(opt));
+ container.addView(checkBox);
+ }
+ }
+
+ public static KeyValueSet parseConfig(Context context, Object config) {
+ String data = config != null && !config.toString().isEmpty() ? config.toString() : getDefaultConfig(context);
+ return new KeyValueSet(data);
+ }
+
+ public static void setEnvVars(KeyValueSet config, EnvVars envVars) {
+ String options = config.get("options");
+ if (!options.isEmpty()) envVars.put("TU_DEBUG", options.replace("|", ","));
+ }
+}
diff --git a/app/src/main/java/com/winlator/core/DefaultVersion.java b/app/src/main/java/com/winlator/core/DefaultVersion.java
index a6541ca..6c4fe89 100644
--- a/app/src/main/java/com/winlator/core/DefaultVersion.java
+++ b/app/src/main/java/com/winlator/core/DefaultVersion.java
@@ -1,10 +1,15 @@
package com.winlator.core;
+import android.content.Context;
+
public abstract class DefaultVersion {
public static final String BOX86 = "0.3.0";
public static final String BOX64 = "0.2.6";
- public static final String TURNIP = "24.0.2";
public static final String ZINK = "22.2.2";
public static final String VIRGL = "22.1.7";
public static final String DXVK = "1.10.3";
+
+ public static String TURNIP(Context context) {
+ return GPUInformation.isAdreno6xx(context) ? "23.0.0" : "24.1.0";
+ }
}
diff --git a/app/src/main/java/com/winlator/core/WineUtils.java b/app/src/main/java/com/winlator/core/WineUtils.java
index 2386e3d..e74f39b 100644
--- a/app/src/main/java/com/winlator/core/WineUtils.java
+++ b/app/src/main/java/com/winlator/core/WineUtils.java
@@ -31,7 +31,13 @@ public abstract class WineUtils {
FileUtils.symlink("/", dosdevicesPath+"/z:");
for (String[] drive : container.drivesIterator()) {
- FileUtils.symlink((new File(drive[1])).getAbsolutePath(), dosdevicesPath+"/"+drive[0].toLowerCase(Locale.ENGLISH)+":");
+ File linkTarget = new File(drive[1]);
+ String path = linkTarget.getAbsolutePath();
+ if (!linkTarget.isDirectory() && path.endsWith("/com.winlator/storage")) {
+ linkTarget.mkdirs();
+ FileUtils.chmod(linkTarget, 0771);
+ }
+ FileUtils.symlink(path, dosdevicesPath+"/"+drive[0].toLowerCase(Locale.ENGLISH)+":");
}
}
diff --git a/app/src/main/java/com/winlator/widget/TouchpadView.java b/app/src/main/java/com/winlator/widget/TouchpadView.java
index 2465a77..096223f 100644
--- a/app/src/main/java/com/winlator/widget/TouchpadView.java
+++ b/app/src/main/java/com/winlator/widget/TouchpadView.java
@@ -85,12 +85,12 @@ public class TouchpadView extends View {
this.y = transformedPoint[1];
}
- private int deltaX() {
+ private int deltaX(float sensitivity) {
float dx = (x - lastX) * sensitivity;
return (int)(x <= lastX ? Math.floor(dx) : Math.ceil(dx));
}
- private int deltaY() {
+ private int deltaY(float sensitivity) {
float dy = (y - lastY) * sensitivity;
return (int)(y <= lastY ? Math.floor(dy) : Math.ceil(dy));
}
@@ -214,8 +214,10 @@ public class TouchpadView extends View {
}
if (!scrolling && numFingers <= 2 && !skipPointerMove) {
- int dx = finger1.deltaX();
- int dy = finger1.deltaY();
+ float distance = (float)Math.hypot(finger1.x - finger1.lastX, finger1.y - finger1.lastY);
+ float sensitivity = this.sensitivity * Math.min(distance, 1.0f);
+ int dx = finger1.deltaX(sensitivity);
+ int dy = finger1.deltaY(sensitivity);
if (xServer.cursorLocker.getState() == CursorLocker.State.LOCKED) {
WinHandler winHandler = xServer.getWinHandler();
diff --git a/app/src/main/java/com/winlator/xenvironment/ImageFsInstaller.java b/app/src/main/java/com/winlator/xenvironment/ImageFsInstaller.java
index a136623..98c035f 100644
--- a/app/src/main/java/com/winlator/xenvironment/ImageFsInstaller.java
+++ b/app/src/main/java/com/winlator/xenvironment/ImageFsInstaller.java
@@ -26,7 +26,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
public abstract class ImageFsInstaller {
- public static final byte LATEST_VERSION = 4;
+ public static final byte LATEST_VERSION = 5;
private static void resetContainerImgVersions(Context context) {
ContainerManager manager = new ContainerManager(context);
diff --git a/app/src/main/java/com/winlator/xenvironment/components/GuestProgramLauncherComponent.java b/app/src/main/java/com/winlator/xenvironment/components/GuestProgramLauncherComponent.java
index 0f57928..4ab2e31 100644
--- a/app/src/main/java/com/winlator/xenvironment/components/GuestProgramLauncherComponent.java
+++ b/app/src/main/java/com/winlator/xenvironment/components/GuestProgramLauncherComponent.java
@@ -177,7 +177,7 @@ public class GuestProgramLauncherComponent extends EnvironmentComponent {
}
private void addBox86EnvVars(EnvVars envVars) {
- envVars.put("BOX86_NOBANNER", "1");
+ envVars.put("BOX86_NOBANNER", MainActivity.DEBUG_LEVEL == 1 ? "0" : "1");
envVars.put("BOX86_DYNAREC", "1");
if (MainActivity.DEBUG_LEVEL >= 3) envVars.put("BOX86_LOG", MainActivity.DEBUG_LEVEL == 3 ? "1" : "2");
@@ -188,7 +188,7 @@ public class GuestProgramLauncherComponent extends EnvironmentComponent {
}
private void addBox64EnvVars(EnvVars envVars) {
- envVars.put("BOX64_NOBANNER", "1");
+ envVars.put("BOX64_NOBANNER", MainActivity.DEBUG_LEVEL == 1 ? "0" : "1");
envVars.put("BOX64_DYNAREC", "1");
if (MainActivity.DEBUG_LEVEL >= 3) envVars.put("BOX64_LOG", MainActivity.DEBUG_LEVEL == 3 ? "1" : "2");
diff --git a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java
index 7cd252d..8207c15 100644
--- a/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java
+++ b/app/src/main/java/com/winlator/xenvironment/components/PulseAudioComponent.java
@@ -55,10 +55,12 @@ public class PulseAudioComponent extends EnvironmentComponent {
"set-default-sink AAudioSink"
));
- File modulesDir = new File(workingDir, "modules/"+ AppUtils.getArchName());
+ String archName = AppUtils.getArchName();
+ File modulesDir = new File(workingDir, "modules/"+archName);
+ String systemLibPath = archName.equals("arm64") ? "/system/lib64" : "system/lib";
ArrayList envVars = new ArrayList<>();
- envVars.add("LD_LIBRARY_PATH="+nativeLibraryDir+":"+modulesDir);
+ envVars.add("LD_LIBRARY_PATH="+systemLibPath+":"+nativeLibraryDir+":"+modulesDir);
envVars.add("HOME="+workingDir);
envVars.add("TMPDIR="+environment.getTmpDir());
diff --git a/app/src/main/jniLibs/arm64-v8a/libpulse.so b/app/src/main/jniLibs/arm64-v8a/libpulse.so
index e6524e3..3febb14 100644
Binary files a/app/src/main/jniLibs/arm64-v8a/libpulse.so and b/app/src/main/jniLibs/arm64-v8a/libpulse.so differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpulseaudio.so b/app/src/main/jniLibs/arm64-v8a/libpulseaudio.so
index aa280f9..e4cb309 100644
Binary files a/app/src/main/jniLibs/arm64-v8a/libpulseaudio.so and b/app/src/main/jniLibs/arm64-v8a/libpulseaudio.so differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpulsecommon-13.0.so b/app/src/main/jniLibs/arm64-v8a/libpulsecommon-13.0.so
index 78e8c9a..2d28dcb 100644
Binary files a/app/src/main/jniLibs/arm64-v8a/libpulsecommon-13.0.so and b/app/src/main/jniLibs/arm64-v8a/libpulsecommon-13.0.so differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libpulsecore-13.0.so b/app/src/main/jniLibs/arm64-v8a/libpulsecore-13.0.so
index e614f88..6081303 100644
Binary files a/app/src/main/jniLibs/arm64-v8a/libpulsecore-13.0.so and b/app/src/main/jniLibs/arm64-v8a/libpulsecore-13.0.so differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libsndfile.so b/app/src/main/jniLibs/arm64-v8a/libsndfile.so
index 578dc87..6172359 100644
Binary files a/app/src/main/jniLibs/arm64-v8a/libsndfile.so and b/app/src/main/jniLibs/arm64-v8a/libsndfile.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libpulse.so b/app/src/main/jniLibs/armeabi-v7a/libpulse.so
index bd1779e..073a5f4 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libpulse.so and b/app/src/main/jniLibs/armeabi-v7a/libpulse.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libpulseaudio.so b/app/src/main/jniLibs/armeabi-v7a/libpulseaudio.so
index 3577273..6d5e3e8 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libpulseaudio.so and b/app/src/main/jniLibs/armeabi-v7a/libpulseaudio.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libpulsecommon-13.0.so b/app/src/main/jniLibs/armeabi-v7a/libpulsecommon-13.0.so
index 23d7d67..e57c0ec 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libpulsecommon-13.0.so and b/app/src/main/jniLibs/armeabi-v7a/libpulsecommon-13.0.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libpulsecore-13.0.so b/app/src/main/jniLibs/armeabi-v7a/libpulsecore-13.0.so
index d5280c5..8cb9b55 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libpulsecore-13.0.so and b/app/src/main/jniLibs/armeabi-v7a/libpulsecore-13.0.so differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libsndfile.so b/app/src/main/jniLibs/armeabi-v7a/libsndfile.so
index 11cf5bb..baf9544 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libsndfile.so and b/app/src/main/jniLibs/armeabi-v7a/libsndfile.so differ
diff --git a/app/src/main/res/layout/about_dialog.xml b/app/src/main/res/layout/about_dialog.xml
index dcc5953..c1a12de 100644
--- a/app/src/main/res/layout/about_dialog.xml
+++ b/app/src/main/res/layout/about_dialog.xml
@@ -30,11 +30,11 @@
android:text="@string/app_name" />
+ android:textColor="@color/colorAccent" />
-
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+
+
+
+
-
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 4fb0854..ce307c4 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -40,6 +40,10 @@
- 1.10.3 (Default)
- 2.3.1
+
+ - 23.0.0
+ - 24.1.0
+
- 0 (Default)
- 512 MB
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 14dc9bb..b69264e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -211,4 +211,5 @@
Browse
Magnifier
Bring to Front
+ Options
\ No newline at end of file