mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-11 22:12:03 +00:00
ACTUALLY FIX the friends focus workaround
This commit is contained in:
@@ -1,4 +1,16 @@
|
|||||||
import { ConfirmModal, ModalRoot, QuickAccessTab, Router, showModal, sleep, staticClasses } from 'decky-frontend-lib';
|
import {
|
||||||
|
ConfirmModal,
|
||||||
|
ModalRoot,
|
||||||
|
Patch,
|
||||||
|
QuickAccessTab,
|
||||||
|
Router,
|
||||||
|
callOriginal,
|
||||||
|
findModuleChild,
|
||||||
|
replacePatch,
|
||||||
|
showModal,
|
||||||
|
sleep,
|
||||||
|
staticClasses,
|
||||||
|
} from 'decky-frontend-lib';
|
||||||
import { lazy } from 'react';
|
import { lazy } from 'react';
|
||||||
import { FaPlug } from 'react-icons/fa';
|
import { FaPlug } from 'react-icons/fa';
|
||||||
|
|
||||||
@@ -39,6 +51,8 @@ class PluginLoader extends Logger {
|
|||||||
// stores a list of plugin names which requested to be reloaded
|
// stores a list of plugin names which requested to be reloaded
|
||||||
private pluginReloadQueue: { name: string; version?: string }[] = [];
|
private pluginReloadQueue: { name: string; version?: string }[] = [];
|
||||||
|
|
||||||
|
private focusWorkaroundPatch?: Patch;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(PluginLoader.name);
|
super(PluginLoader.name);
|
||||||
this.log('Initialized');
|
this.log('Initialized');
|
||||||
@@ -83,6 +97,38 @@ class PluginLoader extends Logger {
|
|||||||
initFilepickerPatches();
|
initFilepickerPatches();
|
||||||
|
|
||||||
this.updateVersion();
|
this.updateVersion();
|
||||||
|
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// TODO remove all of this once Valve fixes the bug
|
||||||
|
const focusManager = findModuleChild((m) => {
|
||||||
|
if (typeof m !== 'object') return false;
|
||||||
|
for (let prop in m) {
|
||||||
|
if (m[prop]?.prototype?.TakeFocus) return m[prop];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.focusWorkaroundPatch = replacePatch(focusManager.prototype, 'TakeFocus', function () {
|
||||||
|
// @ts-ignore
|
||||||
|
const classList = this.m_node?.m_element.classList;
|
||||||
|
if (
|
||||||
|
// @ts-ignore
|
||||||
|
(this.m_node?.m_element && classList.contains(staticClasses.TabGroupPanel)) ||
|
||||||
|
classList.contains('FriendsListTab') ||
|
||||||
|
classList.contains('FriendsTabList') ||
|
||||||
|
classList.contains('FriendsListAndChatsSteamDeck')
|
||||||
|
) {
|
||||||
|
self.debug('Intercepted friends re-focus');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return callOriginal;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
this.error('Friends focus patch failed', e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async updateVersion() {
|
public async updateVersion() {
|
||||||
@@ -167,6 +213,7 @@ class PluginLoader extends Logger {
|
|||||||
this.routerHook.removeRoute('/decky/store');
|
this.routerHook.removeRoute('/decky/store');
|
||||||
this.routerHook.removeRoute('/decky/settings');
|
this.routerHook.removeRoute('/decky/settings');
|
||||||
deinitFilepickerPatches();
|
deinitFilepickerPatches();
|
||||||
|
this.focusWorkaroundPatch?.unpatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public unloadPlugin(name: string) {
|
public unloadPlugin(name: string) {
|
||||||
|
|||||||
@@ -1,14 +1,4 @@
|
|||||||
import {
|
import { Patch, ToastData, afterPatch, findInReactTree, findModuleChild, sleep } from 'decky-frontend-lib';
|
||||||
Patch,
|
|
||||||
ToastData,
|
|
||||||
afterPatch,
|
|
||||||
callOriginal,
|
|
||||||
findInReactTree,
|
|
||||||
findModuleChild,
|
|
||||||
replacePatch,
|
|
||||||
sleep,
|
|
||||||
staticClasses,
|
|
||||||
} from 'decky-frontend-lib';
|
|
||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
import Toast from './components/Toast';
|
import Toast from './components/Toast';
|
||||||
@@ -37,35 +27,6 @@ class Toaster extends Logger {
|
|||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
let instance: any;
|
let instance: any;
|
||||||
const self = this;
|
|
||||||
const focusManager = findModuleChild((m) => {
|
|
||||||
if (typeof m !== 'object') return false;
|
|
||||||
for (let prop in m) {
|
|
||||||
if (m[prop]?.prototype?.TakeFocus) return m[prop];
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
const overrideFocus = function () {
|
|
||||||
// @ts-ignore
|
|
||||||
self.debug(this.m_node.m_element);
|
|
||||||
// @ts-ignore
|
|
||||||
const classList = this.m_node?.m_element.classList;
|
|
||||||
if (
|
|
||||||
// @ts-ignore
|
|
||||||
(this.m_node?.m_element && classList.contains(staticClasses.TabGroupPanel)) ||
|
|
||||||
classList.contains('FriendsListTab') ||
|
|
||||||
classList.contains('FriendsTabList') ||
|
|
||||||
classList.contains('FriendsListAndChatsSteamDeck')
|
|
||||||
) {
|
|
||||||
self.debug('Intercepted friends re-focus');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return callOriginal;
|
|
||||||
};
|
|
||||||
|
|
||||||
const focusWorkaroundPatch = replacePatch(focusManager.prototype, 'TakeFocus', overrideFocus);
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
instance = findInReactTree(
|
instance = findInReactTree(
|
||||||
@@ -111,7 +72,6 @@ class Toaster extends Logger {
|
|||||||
if (typeof m[prop]?.settings && m[prop]?.communityPreferences) return m[prop];
|
if (typeof m[prop]?.settings && m[prop]?.communityPreferences) return m[prop];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
focusWorkaroundPatch.unpatch();
|
|
||||||
this.log('Initialized');
|
this.log('Initialized');
|
||||||
this.ready = true;
|
this.ready = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user