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