diff --git a/app/src/main/java/com/winlator/ContainerDetailFragment.java b/app/src/main/java/com/winlator/ContainerDetailFragment.java index 5e9f7960..0cfb346d 100644 --- a/app/src/main/java/com/winlator/ContainerDetailFragment.java +++ b/app/src/main/java/com/winlator/ContainerDetailFragment.java @@ -27,6 +27,7 @@ import com.winlator.box86_64.Box86_64Preset; import com.winlator.box86_64.Box86_64PresetManager; +import com.winlator.box86_64.rc.RCManager; import com.winlator.container.Container; import com.winlator.container.ContainerManager; import com.winlator.contentdialog.AddEnvVarDialog; @@ -160,6 +161,11 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup r final Spinner sBox64Preset = view.findViewById(R.id.SBox64Preset); Box86_64PresetManager.loadSpinner("box64", sBox64Preset, isEditMode() ? container.getBox64Preset() : preferences.getString("box64_preset", Box86_64Preset.COMPATIBILITY)); + final Spinner sRCFile = view.findViewById(R.id.SRCFile); + final int[] rcfileIds = {0}; + RCManager rcManager = new RCManager(context); + RCManager.loadRCFileSpinner(rcManager, container == null ? 0 : container.getRCFileId(), sRCFile, id -> rcfileIds[0] = id); + final CPUListView cpuListView = view.findViewById(R.id.CPUListView); final CPUListView cpuListViewWoW64 = view.findViewById(R.id.CPUListViewWoW64); @@ -192,6 +198,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup r String box86Preset = Box86_64PresetManager.getSpinnerSelectedId(sBox86Preset); String box64Preset = Box86_64PresetManager.getSpinnerSelectedId(sBox64Preset); String desktopTheme = getDesktopTheme(view); + int rcfileId = rcfileIds[0]; if (isEditMode()) { container.setName(name); @@ -211,6 +218,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup r container.setBox86Preset(box86Preset); container.setBox64Preset(box64Preset); container.setDesktopTheme(desktopTheme); + container.setRcfileId(rcfileId); container.saveData(); saveWineRegistryKeys(view); getActivity().onBackPressed(); @@ -234,6 +242,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup r data.put("box86Preset", box86Preset); data.put("box64Preset", box64Preset); data.put("desktopTheme", desktopTheme); + data.put("rcfileId", rcfileId); if (wineInfos.size() > 1) { data.put("wineVersion", wineInfos.get(sWineVersion.getSelectedItemPosition()).identifier()); diff --git a/app/src/main/java/com/winlator/XServerDisplayActivity.java b/app/src/main/java/com/winlator/XServerDisplayActivity.java index 229364ae..9c93cbc4 100644 --- a/app/src/main/java/com/winlator/XServerDisplayActivity.java +++ b/app/src/main/java/com/winlator/XServerDisplayActivity.java @@ -22,6 +22,8 @@ import androidx.preference.PreferenceManager; import com.google.android.material.navigation.NavigationView; +import com.winlator.box86_64.rc.RCFile; +import com.winlator.box86_64.rc.RCManager; import com.winlator.container.Container; import com.winlator.container.ContainerManager; import com.winlator.container.Shortcut; @@ -455,6 +457,16 @@ else if (audioDriver.equals("pulseaudio")) { environment.addComponent(new VirGLRendererComponent(xServer, UnixSocketConfig.createSocket(rootPath, UnixSocketConfig.VIRGL_SERVER_PATH))); } + RCManager manager = new RCManager(this); + manager.loadRCFiles(); + int rcfileId = shortcut == null ? container.getRCFileId() : + Integer.parseInt(shortcut.getExtra("rcfileId", String.valueOf(container.getRCFileId()))); + RCFile rcfile = manager.getRcfile(rcfileId); + File file = new File(container.getRootDir(), ".box64rc"); + String str = rcfile == null ? "" : rcfile.generateBox86_64rc(); + FileUtils.writeString(file, str); + envVars.put("BOX64_RCFILE", file.getAbsolutePath()); + guestProgramLauncherComponent.setEnvVars(envVars); guestProgramLauncherComponent.setTerminationCallback((status) -> exit()); environment.addComponent(guestProgramLauncherComponent); @@ -667,7 +679,7 @@ public boolean dispatchGenericMotionEvent(MotionEvent event) { @Override public boolean dispatchKeyEvent(KeyEvent event) { return (!inputControlsView.onKeyEvent(event) && !winHandler.onKeyEvent(event) && xServer.keyboard.onKeyEvent(event)) || - (!ExternalController.isGameController(event.getDevice()) && super.dispatchKeyEvent(event)); + (!ExternalController.isGameController(event.getDevice()) && super.dispatchKeyEvent(event)); } public InputControlsView getInputControlsView() { @@ -723,7 +735,7 @@ private void generateWineprefix() { TarCompressorUtils.compress(TarCompressorUtils.Type.ZSTD, new File(rootDir, ImageFs.WINEPREFIX), containerPatternFile, MainActivity.CONTAINER_PATTERN_COMPRESSION_LEVEL); if (!containerPatternFile.renameTo(new File(installedWineDir, containerPatternFile.getName())) || - !(new File(wineInfo.path)).renameTo(new File(installedWineDir, wineInfo.identifier()))) { + !(new File(wineInfo.path)).renameTo(new File(installedWineDir, wineInfo.identifier()))) { containerPatternFile.delete(); } diff --git a/app/src/main/java/com/winlator/box86_64/rc/RCManager.java b/app/src/main/java/com/winlator/box86_64/rc/RCManager.java index 5002f03f..747fa239 100644 --- a/app/src/main/java/com/winlator/box86_64/rc/RCManager.java +++ b/app/src/main/java/com/winlator/box86_64/rc/RCManager.java @@ -4,7 +4,13 @@ import android.content.res.AssetManager; import android.media.MediaScannerConnection; import android.os.Environment; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import com.winlator.R; +import com.winlator.core.Callback; import com.winlator.core.FileUtils; import org.json.JSONArray; @@ -16,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; @@ -239,4 +246,31 @@ public void removeRCFile(RCFile rcfile) { File file = RCFile.getRCFile(context, rcfile.id); if (file.isFile() && file.delete()) rcfiles.remove(rcfile); } + + public static void loadRCFileSpinner(RCManager rcManager, int rcfileId, Spinner spinner, Callback callback) { + Context context = spinner.getContext(); + rcManager.loadRCFiles(); + List rcFiles = rcManager.getRCFiles(); + + List filesName = new ArrayList<>(); + filesName.add(context.getString(R.string.no_profile_selected)); + for (RCFile rcfile : rcFiles) + filesName.add(rcfile.getName()); + + spinner.setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_spinner_dropdown_item, filesName)); + RCFile currentRCFile = rcManager.getRcfile(rcfileId); + + spinner.setSelection(currentRCFile == null ? 0 : rcFiles.indexOf(currentRCFile) + 1); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + callback.call(position == 0 ? 0 : rcFiles.get(position - 1).id); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + } } diff --git a/app/src/main/java/com/winlator/container/Container.java b/app/src/main/java/com/winlator/container/Container.java index 2c639519..86f4bc37 100644 --- a/app/src/main/java/com/winlator/container/Container.java +++ b/app/src/main/java/com/winlator/container/Container.java @@ -50,6 +50,7 @@ public class Container { private String box64Preset = Box86_64Preset.COMPATIBILITY; private File rootDir; private JSONObject extraData; + private int rcfileId = 0; public Container(int id) { this.id = id; @@ -260,6 +261,14 @@ public void setDesktopTheme(String desktopTheme) { this.desktopTheme = desktopTheme; } + public int getRCFileId() { + return rcfileId; + } + + public void setRcfileId(int id) { + rcfileId = id; + } + public Iterable drivesIterator() { return drivesIterator(drives); } @@ -306,6 +315,7 @@ public void saveData() { data.put("box64Preset", box64Preset); data.put("desktopTheme", desktopTheme); data.put("extraData", extraData); + data.put("rcfileId", rcfileId); if (!WineInfo.isMainWineVersion(wineVersion)) data.put("wineVersion", wineVersion); FileUtils.writeString(getConfigFile(), data.toString()); @@ -381,6 +391,9 @@ public void loadData(JSONObject data) throws JSONException { case "desktopTheme" : setDesktopTheme(data.getString(key)); break; + case "rcfileId" : + setRcfileId(data.getInt(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 324ea33b..5d962bb4 100644 --- a/app/src/main/java/com/winlator/container/ContainerManager.java +++ b/app/src/main/java/com/winlator/container/ContainerManager.java @@ -151,6 +151,7 @@ private void duplicateContainer(Container srcContainer) { dstContainer.setBox86Preset(srcContainer.getBox86Preset()); dstContainer.setBox64Preset(srcContainer.getBox64Preset()); dstContainer.setDesktopTheme(srcContainer.getDesktopTheme()); + dstContainer.setRcfileId(srcContainer.getRCFileId()); dstContainer.saveData(); maxContainerId++; diff --git a/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java b/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java index c2c80fcc..90a08df7 100644 --- a/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java +++ b/app/src/main/java/com/winlator/contentdialog/ShortcutSettingsDialog.java @@ -13,6 +13,7 @@ import com.winlator.R; import com.winlator.ShortcutsFragment; import com.winlator.box86_64.Box86_64PresetManager; +import com.winlator.box86_64.rc.RCManager; import com.winlator.container.Shortcut; import com.winlator.core.AppUtils; import com.winlator.core.EnvVars; @@ -78,6 +79,14 @@ private void createContentView() { final Spinner sBox64Preset = findViewById(R.id.SBox64Preset); Box86_64PresetManager.loadSpinner("box64", sBox64Preset, shortcut.getExtra("box64Preset", shortcut.container.getBox64Preset())); + final Spinner sRCFile = findViewById(R.id.SRCFile); + final int[] rcfileIds = {0}; + RCManager manager = new RCManager(context); + String rcfileId = shortcut.getExtra("rcfileId", String.valueOf(shortcut.container.getRCFileId())); + RCManager.loadRCFileSpinner(manager, Integer.parseInt(rcfileId), sRCFile, id -> { + rcfileIds[0] = id; + }); + final Spinner sControlsProfile = findViewById(R.id.SControlsProfile); loadControlsProfileSpinner(sControlsProfile, shortcut.getExtra("controlsProfile", "0")); @@ -133,6 +142,8 @@ private void createContentView() { shortcut.putExtra("box86Preset", !box86Preset.equals(shortcut.container.getBox86Preset()) ? box86Preset : null); shortcut.putExtra("box64Preset", !box64Preset.equals(shortcut.container.getBox64Preset()) ? box64Preset : null); + shortcut.putExtra("rcfileId", rcfileIds[0] != shortcut.container.getRCFileId() ? Integer.toString(rcfileIds[0]) : null); + int dinputMapperType = sDInputMapperType.getSelectedItemPosition(); ArrayList profiles = inputControlsManager.getProfiles(true); int controlsProfile = sControlsProfile.getSelectedItemPosition() > 0 ? profiles.get(sControlsProfile.getSelectedItemPosition()-1).id : 0; diff --git a/app/src/main/res/layout/container_detail_fragment.xml b/app/src/main/res/layout/container_detail_fragment.xml index 15cfcf71..4b61bd7b 100644 --- a/app/src/main/res/layout/container_detail_fragment.xml +++ b/app/src/main/res/layout/container_detail_fragment.xml @@ -503,6 +503,16 @@ style="@style/ComboBox" android:id="@+id/SBox64Preset" android:layout_width="match_parent" /> + + + + + + + + Cannot remove default profile. Cannot edit default profile. Do you want to restore default profile? + RC File \ No newline at end of file