Skip to content

Commit a82ccd8

Browse files
CommandMCNocccer
andauthored
[Fix] Some things missed in the EOS Overlay PR (#1563)
* Create Wineprefix if it doesn't exist * Fastpath for Windows * Only return latest version if overlay is installed * Off-load onClick functions to dedicated functions + multiple improvements relating to first-time overlay install * Frontend clean up * lint fix * Review fixes * Fix: Missing ! * Improve isEnabled check a bit Co-authored-by: Nocccer <[email protected]>
1 parent 5dc05b8 commit a82ccd8

File tree

4 files changed

+195
-165
lines changed

4 files changed

+195
-165
lines changed

electron/legendary/eos_overlay/eos_overlay.ts

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import { logError, LogPrefix, logWarning } from '../../logger/logger'
99
import { runLegendaryCommand } from '../library'
1010
import { LegendaryGame } from '../games'
1111
import { killPattern } from '../../utils'
12+
import { Runner } from '../../types'
13+
import { Game } from '../../games'
14+
import { verifyWinePrefix } from '../../launcher'
1215

1316
const currentVersionPath = join(legendaryConfigPath, 'overlay_version.json')
1417
const installedVersionPath = join(legendaryConfigPath, 'overlay_install.json')
@@ -39,6 +42,10 @@ function getStatus(): {
3942

4043
async function getLatestVersion() {
4144
if (!existsSync(currentVersionPath)) {
45+
// HACK: `overlay_version.json` isn't created when the overlay isn't installed
46+
if (!isInstalled()) {
47+
return ''
48+
}
4249
await updateInfo()
4350
if (!existsSync(currentVersionPath)) {
4451
logError(
@@ -55,6 +62,11 @@ async function getLatestVersion() {
5562
}
5663

5764
async function updateInfo() {
65+
// Without the overlay being installed, this will do nothing at all.
66+
// So we can just skip running the command if that's the case
67+
if (!isInstalled()) {
68+
return
69+
}
5870
await runLegendaryCommand(['status'], {
5971
logMessagePrefix: 'Updating EOS Overlay information'
6072
})
@@ -127,8 +139,17 @@ function cancelInstallOrUpdate() {
127139
}
128140

129141
async function enable(
130-
prefix: string
142+
appName: string,
143+
runner: Runner
131144
): Promise<{ wasEnabled: boolean; installNow?: boolean }> {
145+
let prefix = ''
146+
if (isLinux) {
147+
const game = Game.get(appName, runner)
148+
await verifyWinePrefix(game)
149+
const { winePrefix, wineVersion } = await game.getSettings()
150+
prefix =
151+
wineVersion.type === 'proton' ? join(winePrefix, 'pfx') : winePrefix
152+
}
132153
if (!isInstalled()) {
133154
const { response } = await dialog.showMessageBox({
134155
title: t('setting.eosOverlay.notInstalledTitle', 'Overlay not installed'),
@@ -148,7 +169,15 @@ async function enable(
148169
return { wasEnabled: true }
149170
}
150171

151-
async function disable(prefix: string) {
172+
async function disable(appName: string, runner: Runner) {
173+
let prefix = ''
174+
if (isLinux) {
175+
const game = Game.get(appName, runner)
176+
const { winePrefix, wineVersion } = await game.getSettings()
177+
prefix =
178+
wineVersion.type === 'proton' ? join(winePrefix, 'pfx') : winePrefix
179+
}
180+
152181
await runLegendaryCommand(
153182
['eos-overlay', 'disable', ...(prefix ? ['--prefix', prefix] : [])],
154183
{ logMessagePrefix: 'Disabling EOS Overlay' }
@@ -159,12 +188,21 @@ function isInstalled() {
159188
return existsSync(installedVersionPath)
160189
}
161190

162-
async function isEnabled(prefix: string) {
191+
/**
192+
* Checks if the EOS Overlay is enabled (either for a specific game on Linux or globally on Windows)
193+
* @param appName required on Linux, does nothing on Windows
194+
* @param runner required on Linux, does nothing on Windows
195+
* @returns Enabled = True; Disabled = False
196+
*/
197+
async function isEnabled(appName?: string, runner?: Runner) {
163198
let enabled = false
164199

165-
// The overlay can't be enabled globally on Linux
166-
if (isLinux && !prefix) {
167-
return false
200+
let prefix = ''
201+
if (isLinux || !(appName && runner)) {
202+
const game = Game.get(appName, runner)
203+
const { winePrefix, wineVersion } = await game.getSettings()
204+
prefix =
205+
wineVersion.type === 'proton' ? join(winePrefix, 'pfx') : winePrefix
168206
}
169207

170208
await runLegendaryCommand(

electron/legendary/eos_overlay/ipc_handler.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ ipcMain.handle('updateEosOverlayInfo', updateInfo)
1717
ipcMain.handle('installEosOverlay', install)
1818
ipcMain.handle('removeEosOverlay', remove)
1919
ipcMain.handle('cancelEosOverlayInstallOrUpdate', cancelInstallOrUpdate)
20-
ipcMain.handle('enableEosOverlay', async (e, prefix) => {
21-
return enable(prefix)
20+
ipcMain.handle('enableEosOverlay', async (e, appName, runner) => {
21+
return enable(appName, runner)
2222
})
23-
ipcMain.handle('disableEosOverlay', async (e, prefix) => {
24-
return disable(prefix)
23+
ipcMain.handle('disableEosOverlay', async (e, appName, runner) => {
24+
return disable(appName, runner)
2525
})
26-
ipcMain.handle('isEosOverlayEnabled', async (e, prefix) => {
27-
return isEnabled(prefix)
26+
ipcMain.handle('isEosOverlayEnabled', async (e, appName?, runner?) => {
27+
return isEnabled(appName, runner)
2828
})

src/screens/Game/GameSubMenu/index.tsx

Lines changed: 49 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import './index.css'
22

33
import React, { useContext, useEffect, useState } from 'react'
44

5-
import { AppSettings, GameSettings, GameStatus, Runner } from 'src/types'
5+
import { AppSettings, GameStatus, Runner } from 'src/types'
66

77
import { SmallInfo } from 'src/components/UI'
88
import { createNewWindow, getGameInfo, repair } from 'src/helpers'
@@ -99,12 +99,15 @@ export default function GamesSubmenu({
9999
const isWin = platform === 'win32'
100100
const isMac = platform === 'darwin'
101101
const isLinux = platform === 'linux'
102-
const [info, setInfo] = useState({ prefix: '', wine: '' } as otherInfo)
103-
const [isNative, setIsNative] = useState(false)
102+
const [info, setInfo] = useState<otherInfo>({
103+
prefix: '',
104+
wine: ''
105+
} as otherInfo)
106+
const [isNative, setIsNative] = useState<boolean>(false)
104107
const [steamRefresh, setSteamRefresh] = useState<boolean>(false)
105108
const [addedToSteam, setAddedToSteam] = useState<boolean>(false)
106-
const [eosOverlayEnabled, setEosOverlayEnabled] = useState(false)
107-
const [eosOverlayRefresh, setEosOverlayRefresh] = useState(false)
109+
const [eosOverlayEnabled, setEosOverlayEnabled] = useState<boolean>(false)
110+
const [eosOverlayRefresh, setEosOverlayRefresh] = useState<boolean>(false)
108111
const eosOverlayAppName = '98bc04bc842e4906993fd6d6644ffb8d'
109112
const { t } = useTranslation('gamepage')
110113

@@ -179,6 +182,43 @@ export default function GamesSubmenu({
179182
ipcRenderer.send('addShortcut', appName, runner, true)
180183
}
181184

185+
async function handleEosOverlay() {
186+
setEosOverlayRefresh(true)
187+
if (eosOverlayEnabled) {
188+
await ipcRenderer.invoke('disableEosOverlay', appName, runner)
189+
setEosOverlayEnabled(false)
190+
} else {
191+
const initialEnableResult = await ipcRenderer.invoke(
192+
'enableEosOverlay',
193+
appName,
194+
runner
195+
)
196+
const { installNow } = initialEnableResult
197+
let { wasEnabled } = initialEnableResult
198+
199+
if (installNow) {
200+
await handleGameStatus({
201+
appName: eosOverlayAppName,
202+
runner: 'legendary',
203+
status: 'installing'
204+
})
205+
206+
await ipcRenderer.invoke('installEosOverlay')
207+
await handleGameStatus({
208+
appName: eosOverlayAppName,
209+
runner: 'legendary',
210+
status: 'done'
211+
})
212+
213+
wasEnabled = (
214+
await ipcRenderer.invoke('enableEosOverlay', appName, runner)
215+
).wasEnabled
216+
}
217+
setEosOverlayEnabled(wasEnabled)
218+
}
219+
setEosOverlayRefresh(false)
220+
}
221+
182222
async function handleAddToSteam() {
183223
setSteamRefresh(true)
184224
if (addedToSteam) {
@@ -230,67 +270,16 @@ export default function GamesSubmenu({
230270
setAddedToSteam(added)
231271
})
232272

233-
ipcRenderer
234-
.invoke('requestSettings', appName)
235-
.then(async (response: GameSettings | AppSettings) => {
236-
console.log(response)
237-
const enabled = await ipcRenderer.invoke(
238-
'isEosOverlayEnabled',
239-
response.winePrefix
240-
)
241-
setEosOverlayEnabled(enabled)
242-
})
243-
}, [])
244-
245-
useEffect(() => {
246273
const { status } =
247274
libraryStatus.filter(
248275
(game: GameStatus) => game.appName === eosOverlayAppName
249276
)[0] || {}
250277
setEosOverlayRefresh(status === 'installing')
251-
}, [eosOverlayRefresh])
252-
253-
async function handleEosOverlay() {
254-
const { winePrefix, wineVersion } = await ipcRenderer.invoke(
255-
'requestSettings',
256-
appName
257-
)
258-
const actualPrefix =
259-
wineVersion.type === 'proton' ? `${winePrefix}/pfx` : winePrefix
260-
261-
if (eosOverlayEnabled) {
262-
await ipcRenderer.invoke('disableEosOverlay', actualPrefix)
263-
setEosOverlayEnabled(false)
264-
} else {
265-
const initialEnableResult = await ipcRenderer.invoke(
266-
'enableEosOverlay',
267-
actualPrefix
268-
)
269-
const { installNow } = initialEnableResult
270-
let { wasEnabled } = initialEnableResult
271278

272-
if (installNow) {
273-
await handleGameStatus({
274-
appName: eosOverlayAppName,
275-
runner: 'legendary',
276-
status: 'installing'
277-
})
278-
setEosOverlayRefresh(true)
279-
await ipcRenderer.invoke('installEosOverlay')
280-
await handleGameStatus({
281-
appName: eosOverlayAppName,
282-
runner: 'legendary',
283-
status: 'done'
284-
})
285-
setEosOverlayRefresh(false)
286-
wasEnabled = (
287-
await ipcRenderer.invoke('enableEosOverlay', actualPrefix)
288-
).wasEnabled
289-
}
290-
291-
setEosOverlayEnabled(wasEnabled)
292-
}
293-
}
279+
ipcRenderer
280+
.invoke('isEosOverlayEnabled', appName, runner)
281+
.then((enabled) => setEosOverlayEnabled(enabled))
282+
}, [])
294283

295284
const refreshCircle = () => {
296285
return <CircularProgress className="link button is-text is-link" />

0 commit comments

Comments
 (0)