Skip to content

CrossOver engine (copied) + portable, no-install bundle - #12

Open
etedgy wants to merge 3 commits into
mainfrom
feat/crossover-engine-and-portable-bundle
Open

CrossOver engine (copied) + portable, no-install bundle#12
etedgy wants to merge 3 commits into
mainfrom
feat/crossover-engine-and-portable-bundle

Conversation

@etedgy

@etedgy etedgy commented Sep 6, 2026

Copy link
Copy Markdown
Owner

What

Two related changes that make GamePorter run games from a self-contained, movable bundle.

1. Restore CrossOver as a copied engine

The de-brand commits dropped the .crossover engine. This brings it back, but as a one-time copy into Engines/crossover rather than a live reference to /Applications/CrossOver.app:

  • detectCrossOver() drives the copied loader; every env path points into the copy.
  • importCrossOver() clones the installed CrossOver with FileManager.copyItem (APFS clonefile — source is only read, never modified).
  • Engines panel gets an Import from your installed CrossOver action (shown only while CrossOver is installed and not yet copied).

2. Portable, no-install operation

  • AppPaths.root uses a sibling GamePorterData folder next to the app bundle (or $GAMEPORTER_DATA) when present — so the app + engines + bottles run straight from a USB/SSD with no install.
  • WineRunner resolves a pin's absolute exe/workingDir against the current bottle's drive_c at launch, so bottles stay portable across machines and usernames.
  • ContentView auto-selects the first bottle (no more empty "No bottle selected" on launch).
  • Silences an unused try? warning.

Testing

  • Built release; imported CrossOver (verified source byte-for-byte unchanged); cloned the Diablo II: Resurrected bottle and confirmed it launches through D3DMetal.
  • Verified portable mode by moving the internal data aside and launching the SSD bundle's own binary — it read engines + the bottle from the sibling GamePorterData (confirmed via lsof).

Personal-use project.

🤖 Generated with Claude Code

YanEtedgy and others added 3 commits September 6, 2026 09:34
Re-adds the .crossover engine kind (dropped in the de-brand commits) but as a
one-time copy into Engines/crossover instead of a live reference, so it runs off
GamePorter's own copy and never touches /Applications/CrossOver.app at runtime.

- detectCrossOver() now points every path (loader, server, DLL path, CX_ROOT,
  apple_gptk libd3dshared) at the copied tree under Engines/crossover.
- importCrossOver() clones the installed CrossOver via FileManager.copyItem
  (APFS clonefile; source is only read, never modified).
- Engines panel gains an "Import from your installed CrossOver" action, shown
  only while CrossOver is installed and not yet copied.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lets the app + engines + bottles live on a USB/SSD and run with no install.

- AppPaths.root uses a sibling "GamePorterData" folder next to the app bundle
  (or $GAMEPORTER_DATA) when present, else the usual Application Support path.
- WineRunner resolves a pin's absolute exe/workingDir against the current
  bottle's drive_c at launch, so bottles stay portable across machines/users.
- ContentView auto-selects the first bottle so it's visible immediately instead
  of the empty "No bottle selected" pane.
- Silence an unused try? result in disableCrashDebugger.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AppPaths.root also looks for GamePorterData inside the app bundle
(Contents/Resources/GamePorterData), before the sibling-folder and
Application Support locations — so a single .app can carry the porter,
engines and bottles and run with nothing beside it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants