From 266e735162a1821eef33d7381e8dff923c22216b Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Tue, 17 Mar 2026 23:09:11 +0800
Subject: [PATCH 1/7] feat: add configurable GPU acceleration toggle
- Add disableHardwareAcceleration setting to electron-store
- Add GPU toggle UI in settings page with tooltip
- Show restart prompt when toggle changes
- Add i18n support for 5 languages (zh/en/tr/ja/hu)
- Update TypeScript types and Vuex store
---
src/background.ts | 13 +++++++++
src/lang/settings.ts | 42 +++++++++++++++++++++++++++
src/store/getter.ts | 1 +
src/store/modules/app.ts | 13 +++++++++
src/types/global.d.ts | 1 +
src/views/settings/index.vue | 55 ++++++++++++++++++++++++++++++++++--
6 files changed, 123 insertions(+), 2 deletions(-)
diff --git a/src/background.ts b/src/background.ts
index 463a8747b..7670e6e0b 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -40,12 +40,23 @@ declare const __static: string
const Store = require('electron-store')
const electronStore = new Store()
+const DISABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.disableHardwareAcceleration'
let theme: Theme = 'light'
let syncOsTheme = false
let autoCheckUpdate: boolean = true
const isDevelopment: boolean = process.env.NODE_ENV !== 'production'
const isMac: boolean = process.platform === 'darwin'
+const disableHardwareAccelerationBySetting =
+ electronStore.get(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, false) === true
+
+// Hardware acceleration must be configured before the app is ready, so this
+// setting is read from electron-store instead of the database settings table.
+if (disableHardwareAccelerationBySetting) {
+ app.disableHardwareAcceleration()
+ console.log('[GPU] Hardware acceleration disabled')
+}
+
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win: BrowserWindow | null
@@ -222,6 +233,7 @@ async function createWindow() {
logLevel: setting.logLevel,
ignoreQoS0Message: setting.ignoreQoS0Message,
topicWhitespaceDetection: electronStore.get('settings.topicWhitespaceDetection', false),
+ disableHardwareAcceleration: disableHardwareAccelerationBySetting,
}
}
} catch (error) {
@@ -234,6 +246,7 @@ async function createWindow() {
currentLang: 'en',
syncOsTheme: false,
topicWhitespaceDetection: electronStore.get('settings.topicWhitespaceDetection', false),
+ disableHardwareAcceleration: disableHardwareAccelerationBySetting,
}
}
// Create the browser window.
diff --git a/src/lang/settings.ts b/src/lang/settings.ts
index a945fcab7..eeb842ead 100644
--- a/src/lang/settings.ts
+++ b/src/lang/settings.ts
@@ -153,6 +153,48 @@ export default {
ja: 'トピック内の空白を示し、送受信の不一致を防ぐための確認に役立ちます。',
hu: 'Highlights whitespace in topics to help prevent publish/subscribe mismatches.',
},
+ disableHardwareAcceleration: {
+ zh: '禁用 GPU 加速',
+ en: 'Disable GPU Acceleration',
+ tr: 'Disable GPU Acceleration',
+ ja: 'Disable GPU Acceleration',
+ hu: 'Disable GPU Acceleration',
+ },
+ disableHardwareAccelerationDesc: {
+ zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如遇画面卡顿、花屏或兼容性问题,可尝试关闭此选项。',
+ en: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
+ tr: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
+ ja: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
+ hu: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
+ },
+ restartRequired: {
+ zh: '需要重启',
+ en: 'Restart Required',
+ tr: 'Restart Required',
+ ja: 'Restart Required',
+ hu: 'Restart Required',
+ },
+ restartRequiredDesc: {
+ zh: 'GPU 加速设置已更新。需要重启应用才能生效,是否立即重启?',
+ en: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
+ tr: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
+ ja: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
+ hu: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
+ },
+ restartNow: {
+ zh: '立即重启',
+ en: 'Restart Now',
+ tr: 'Restart Now',
+ ja: 'Restart Now',
+ hu: 'Restart Now',
+ },
+ restartLater: {
+ zh: '稍后重启',
+ en: 'Later',
+ tr: 'Later',
+ ja: 'Later',
+ hu: 'Later',
+ },
autoResubDesc: {
zh: '开启后,MQTTX 连接后会自动重新订阅本地保存的所有订阅',
en: 'Once enabled, MQTTX will automatically resubscribe to all locally saved subscriptions after connecting',
diff --git a/src/store/getter.ts b/src/store/getter.ts
index aa9575712..330f99833 100644
--- a/src/store/getter.ts
+++ b/src/store/getter.ts
@@ -26,6 +26,7 @@ const getters = {
ignoreQoS0Message: (state: State) => state.app.ignoreQoS0Message,
topicWhitespaceDetection: (state: State) => state.app.topicWhitespaceDetection,
maxPayloadDisplaySize: (state: State) => state.app.maxPayloadDisplaySize,
+ disableHardwareAcceleration: (state: State) => state.app.disableHardwareAcceleration,
}
export default getters
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index b9155cd7b..9a64f9e70 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -35,6 +35,8 @@ const SET_DATABASE_FAIL_MESSAGE = 'SET_DATABASE_FAIL_MESSAGE'
const TOGGLE_IGNORE_QOS0_MESSAGE = 'TOGGLE_IGNORE_QOS0_MESSAGE'
const TOGGLE_TOPIC_WHITESPACE_DETECTION = 'TOGGLE_TOPIC_WHITESPACE_DETECTION'
const SET_MAX_PAYLOAD_DISPLAY_SIZE = 'SET_MAX_PAYLOAD_DISPLAY_SIZE'
+const TOGGLE_DISABLE_HARDWARE_ACCELERATION = 'TOGGLE_DISABLE_HARDWARE_ACCELERATION'
+const DISABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.disableHardwareAcceleration'
const getShowConnectionList = (): boolean => {
const _showConnectionList: string | null = localStorage.getItem('showConnectionList')
@@ -77,6 +79,9 @@ const app = {
maxPayloadDisplaySize: normalizeMaxPayloadDisplaySize(
electronStore.get('settings.maxPayloadDisplaySize', DEFAULT_MAX_PAYLOAD_DISPLAY_SIZE),
),
+ disableHardwareAcceleration:
+ settingData.disableHardwareAcceleration ??
+ electronStore.get(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, false) === true,
},
mutations: {
[TOGGLE_THEME](state: App, currentTheme: Theme) {
@@ -190,6 +195,9 @@ const app = {
[SET_MAX_PAYLOAD_DISPLAY_SIZE](state: App, maxPayloadDisplaySize: number) {
state.maxPayloadDisplaySize = maxPayloadDisplaySize
},
+ [TOGGLE_DISABLE_HARDWARE_ACCELERATION](state: App, disableHardwareAcceleration: boolean) {
+ state.disableHardwareAcceleration = disableHardwareAcceleration
+ },
},
actions: {
async TOGGLE_THEME({ commit }: any, payload: App) {
@@ -325,6 +333,11 @@ const app = {
commit(SET_MAX_PAYLOAD_DISPLAY_SIZE, normalizedValue)
electronStore.set('settings.maxPayloadDisplaySize', normalizedValue)
},
+ TOGGLE_DISABLE_HARDWARE_ACCELERATION({ commit }: any, payload: App) {
+ commit(TOGGLE_DISABLE_HARDWARE_ACCELERATION, payload.disableHardwareAcceleration)
+ settingData.disableHardwareAcceleration = payload.disableHardwareAcceleration
+ electronStore.set(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, payload.disableHardwareAcceleration)
+ },
},
}
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index cb22592ad..3e3415d24 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -116,6 +116,7 @@ declare global {
ignoreQoS0Message: boolean
topicWhitespaceDetection: boolean
maxPayloadDisplaySize: number
+ disableHardwareAcceleration: boolean
}
interface State {
diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue
index 6b0594bd4..f560d30bd 100644
--- a/src/views/settings/index.vue
+++ b/src/views/settings/index.vue
@@ -370,6 +370,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -474,7 +500,7 @@
import { Component, Vue } from 'vue-property-decorator'
import { Getter, Action } from 'vuex-class'
import { ipcRenderer } from 'electron'
-import { nativeTheme } from '@electron/remote'
+import { app as remoteApp, nativeTheme } from '@electron/remote'
import ImportData from '@/components/ImportData.vue'
import ExportData from '@/components/ExportData.vue'
import ClearUpHistoryData from '@/components/ClearUpHistoryData.vue'
@@ -521,6 +547,9 @@ export default class Settings extends Vue {
@Action('SET_MAX_PAYLOAD_DISPLAY_SIZE') private actionSetMaxPayloadDisplaySize!: (payload: {
maxPayloadDisplaySize: number
}) => void
+ @Action('TOGGLE_DISABLE_HARDWARE_ACCELERATION') private actionToggleDisableHardwareAcceleration!: (payload: {
+ disableHardwareAcceleration: boolean
+ }) => void
@Getter('currentTheme') private currentTheme!: Theme
@Getter('currentLang') private currentLang!: Language
@@ -538,6 +567,7 @@ export default class Settings extends Vue {
@Getter('ignoreQoS0Message') private ignoreQoS0Message!: boolean
@Getter('topicWhitespaceDetection') private topicWhitespaceDetection!: boolean
@Getter('maxPayloadDisplaySize') private maxPayloadDisplaySize!: number
+ @Getter('disableHardwareAcceleration') private disableHardwareAcceleration!: boolean
private showAIModelsSelect = false
@@ -630,6 +660,11 @@ export default class Settings extends Vue {
this.actionToggleTopicWhitespaceDetection({ topicWhitespaceDetection: value })
}
+ private handleDisableHardwareAccelerationChange(value: boolean) {
+ this.actionToggleDisableHardwareAcceleration({ disableHardwareAcceleration: value })
+ this.promptAppRestart()
+ }
+
private handleInputChanged(value: number) {
this.actionMaxReconnectTimes({ maxReconnectTimes: value })
}
@@ -701,7 +736,7 @@ export default class Settings extends Vue {
this.showAIModelsSelect = false
}
- private queryAIAPIHost(queryString: string, cb: (r: any[]) => {}) {
+ private queryAIAPIHost(queryString: string, cb: (r: any[]) => void) {
cb(queryString ? this.AIAPIHostOptions.filter((item) => item.value.includes(queryString)) : this.AIAPIHostOptions)
}
@@ -709,6 +744,22 @@ export default class Settings extends Vue {
this.actionToggleIgnoreQoS0Message({ ignoreQoS0Message: value })
}
+ private promptAppRestart() {
+ this.$confirm(this.$t('settings.restartRequiredDesc') as string, {
+ title: this.$t('settings.restartRequired') as string,
+ showClose: false,
+ closeOnClickModal: false,
+ confirmButtonText: this.$t('settings.restartNow') as string,
+ cancelButtonText: this.$t('settings.restartLater') as string,
+ type: 'warning',
+ })
+ .then(() => {
+ remoteApp.relaunch()
+ remoteApp.exit()
+ })
+ .catch(() => undefined)
+ }
+
private created() {
this.getAIConfigs()
this.payloadDisplaySizeValue = this.maxPayloadDisplaySize
From 5ff848cdc55cf29b55b22cb28e783aef0a546db1 Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Wed, 18 Mar 2026 11:37:48 +0800
Subject: [PATCH 2/7] fix(i18n): add missing translations for tr, ja, and hu
languages
Add missing translations in settings.ts:
- topicWhitespaceDetection
- topicWhitespaceDetectionDesc
- disableHardwareAcceleration
- disableHardwareAccelerationDesc
- restartRequired
- restartRequiredDesc
- restartNow
- restartLater
- jsonHighlight
Fix incomplete translations:
- help.ts: helpMQTT (tr)
- common.ts: viewData, saveToLocal, msgType (hu)
---
src/lang/common.ts | 2 +-
src/lang/help.ts | 2 +-
src/lang/settings.ts | 46 ++++++++++++++++++++++----------------------
3 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/lang/common.ts b/src/lang/common.ts
index f559a30c2..37cd6cfba 100644
--- a/src/lang/common.ts
+++ b/src/lang/common.ts
@@ -327,7 +327,7 @@ export default {
en: 'Save to Local',
tr: 'Yerel olarak kaydet',
ja: 'ローカルに保存',
- hu: 'Mentés helyi',
+ hu: 'Mentés helyileg',
},
msgType: {
zh: '消息类型',
diff --git a/src/lang/help.ts b/src/lang/help.ts
index 78370ffd0..dc7396cd2 100644
--- a/src/lang/help.ts
+++ b/src/lang/help.ts
@@ -3,7 +3,7 @@ export default {
zh: '关于 MQTT 的一切',
en: 'Everything about MQTT',
ja: 'MQTT について',
- tr: 'MQTT hakk',
+ tr: 'MQTT hakkında',
hu: 'Minden MQTT-ről',
},
docs: {
diff --git a/src/lang/settings.ts b/src/lang/settings.ts
index eeb842ead..45dc525e7 100644
--- a/src/lang/settings.ts
+++ b/src/lang/settings.ts
@@ -142,58 +142,58 @@ export default {
topicWhitespaceDetection: {
zh: '主题空格检测',
en: 'Topic whitespace detection',
- tr: 'Topic whitespace detection',
+ tr: 'Konu Boşluk Tespiti',
ja: 'トピック空白検出',
- hu: 'Topic whitespace detection',
+ hu: 'Téma szóköz észlelés',
},
topicWhitespaceDetectionDesc: {
zh: '用于提示主题中的空格字符,帮助提前识别可能导致发布与订阅不匹配的情况。',
en: 'Highlights whitespace in topics to help prevent publish/subscribe mismatches.',
- tr: 'Highlights whitespace in topics to help prevent publish/subscribe mismatches.',
+ tr: 'Konulardaki boşlukları vurgulayarak yayın/abone olma uyuşmazlıklarını önlemeye yardımcı olur.',
ja: 'トピック内の空白を示し、送受信の不一致を防ぐための確認に役立ちます。',
- hu: 'Highlights whitespace in topics to help prevent publish/subscribe mismatches.',
+ hu: 'Kiemeli a szóközöket a témákban, hogy segítsen megelőzni a közzététel/előfizetés eltéréseket.',
},
disableHardwareAcceleration: {
zh: '禁用 GPU 加速',
en: 'Disable GPU Acceleration',
- tr: 'Disable GPU Acceleration',
- ja: 'Disable GPU Acceleration',
- hu: 'Disable GPU Acceleration',
+ tr: 'GPU Hızlandırmayı Devre Dışı Bırak',
+ ja: 'GPUアクセラレーションを無効にする',
+ hu: 'GPU gyorsítás letiltása',
},
disableHardwareAccelerationDesc: {
zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如遇画面卡顿、花屏或兼容性问题,可尝试关闭此选项。',
en: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
- tr: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
- ja: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
- hu: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
+ tr: "GPU hızlandırma, işlemleri daha akıcı hale getirmek ve CPU kullanımını azaltmak için grafik donanımını kullanarak UI'yi render eder. Ekran gecikmesi, görsel bozukluklar veya uyumluluk sorunları yaşıyorsanız bu seçeneği devre dışı bırakın.",
+ ja: 'GPUアクセラレーションは、グラフィックハードウェアを使用してUIをレンダリングし、操作をスムーズにし、CPU使用率を低下させます。画面のラグ、アーティファクト、または互換性の問題が発生した場合は、このオプションを無効にしてください。',
+ hu: 'A GPU gyorsítás grafikus hardvert használ a UI rendereléséhez, így a műveletek gördülékenyebbek és a CPU-használat alacsonyabb. Ha képernyő akadozást, artefaktokat vagy kompatibilitási problémákat tapasztal, tiltsa le ezt a lehetőséget.',
},
restartRequired: {
zh: '需要重启',
en: 'Restart Required',
- tr: 'Restart Required',
- ja: 'Restart Required',
- hu: 'Restart Required',
+ tr: 'Yeniden Başlatma Gerekiyor',
+ ja: '再起動が必要です',
+ hu: 'Újraindítás szükséges',
},
restartRequiredDesc: {
zh: 'GPU 加速设置已更新。需要重启应用才能生效,是否立即重启?',
en: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
- tr: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
- ja: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
- hu: 'The GPU acceleration setting has been updated. Restart the app now to apply the change?',
+ tr: 'GPU hızlandırma ayarı güncellendi. Değişikliği uygulamak için uygulamayı şimdi yeniden başlatın?',
+ ja: 'GPUアクセラレーション設定が更新されました。変更を適用するために今すぐアプリを再起動しますか?',
+ hu: 'A GPU gyorsítás beállítása frissítve lett. Alkalmazza a változást az alkalmazás újraindításával most?',
},
restartNow: {
zh: '立即重启',
en: 'Restart Now',
- tr: 'Restart Now',
- ja: 'Restart Now',
- hu: 'Restart Now',
+ tr: 'Şimdi Yeniden Başlat',
+ ja: '今すぐ再起動',
+ hu: 'Újraindítás most',
},
restartLater: {
zh: '稍后重启',
en: 'Later',
- tr: 'Later',
- ja: 'Later',
- hu: 'Later',
+ tr: 'Sonra',
+ ja: '後で',
+ hu: 'Később',
},
autoResubDesc: {
zh: '开启后,MQTTX 连接后会自动重新订阅本地保存的所有订阅',
@@ -233,7 +233,7 @@ export default {
jsonHighlight: {
zh: 'JSON 数据高亮',
en: 'JSON Highlighting',
- tr: 'JSON Highlighting',
+ tr: 'JSON Vurgulama',
ja: 'JSONハイライト',
hu: 'JSON Kiemelés',
},
From 6beec7d16bb8c7cab42ae6beb35889105abe830b Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Wed, 18 Mar 2026 11:43:54 +0800
Subject: [PATCH 3/7] fix(i18n): improve disableHardwareAccelerationDesc
wording
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Change 'Disable this option if...' to 'Enable this option if...' for
clearer semantics. When users experience issues, they should ENABLE
the 'Disable GPU Acceleration' toggle.
Updated translations:
- zh: 关闭此选项 -> 启用此选项
- en: Disable this option -> Enable this option
- tr: devre dışı bırakın -> etkinleştirin
- ja: 無効にしてください -> 有効にしてください
- hu: tiltsa le -> engedélyezze
---
src/lang/settings.ts | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/lang/settings.ts b/src/lang/settings.ts
index 45dc525e7..7a1810c80 100644
--- a/src/lang/settings.ts
+++ b/src/lang/settings.ts
@@ -161,11 +161,11 @@ export default {
hu: 'GPU gyorsítás letiltása',
},
disableHardwareAccelerationDesc: {
- zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如遇画面卡顿、花屏或兼容性问题,可尝试关闭此选项。',
- en: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Disable this option if you experience screen lag, artifacts, or compatibility issues.',
- tr: "GPU hızlandırma, işlemleri daha akıcı hale getirmek ve CPU kullanımını azaltmak için grafik donanımını kullanarak UI'yi render eder. Ekran gecikmesi, görsel bozukluklar veya uyumluluk sorunları yaşıyorsanız bu seçeneği devre dışı bırakın.",
- ja: 'GPUアクセラレーションは、グラフィックハードウェアを使用してUIをレンダリングし、操作をスムーズにし、CPU使用率を低下させます。画面のラグ、アーティファクト、または互換性の問題が発生した場合は、このオプションを無効にしてください。',
- hu: 'A GPU gyorsítás grafikus hardvert használ a UI rendereléséhez, így a műveletek gördülékenyebbek és a CPU-használat alacsonyabb. Ha képernyő akadozást, artefaktokat vagy kompatibilitási problémákat tapasztal, tiltsa le ezt a lehetőséget.',
+ zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如遇画面卡顿、花屏或兼容性问题,可尝试启用此选项。',
+ en: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Enable this option if you experience screen lag, artifacts, or compatibility issues.',
+ tr: "GPU hızlandırma, işlemleri daha akıcı hale getirmek ve CPU kullanımını azaltmak için grafik donanımını kullanarak UI'yi render eder. Ekran gecikmesi, görsel bozukluklar veya uyumluluk sorunları yaşıyorsanız bu seçeneği etkinleştirin.",
+ ja: 'GPUアクセラレーションは、グラフィックハードウェアを使用してUIをレンダリングし、操作をスムーズにし、CPU使用率を低下させます。画面のラグ、アーティファクト、または互換性の問題が発生した場合は、このオプションを有効にしてください。',
+ hu: 'A GPU gyorsítás grafikus hardvert használ a UI rendereléséhez, így a műveletek gördülékenyebbek és a CPU-használat alacsonyabb. Ha képernyő akadozást, artefaktokat vagy kompatibilitási problémákat tapasztal, engedélyezze ezt a lehetőséget.',
},
restartRequired: {
zh: '需要重启',
From c444c753c47e5da1df0c581ab5aa501dd953bdd9 Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Thu, 19 Mar 2026 21:27:10 +0800
Subject: [PATCH 4/7] refactor(gpu): rename disableHardwareAcceleration to
enableHardwareAcceleration
- Invert setting logic: ON/true = GPU enabled, OFF/false = GPU disabled
- Add GPU support detection for Windows using getGPUFeatureStatus()
- Change default to true (GPU enabled by default if supported)
- Add migration from legacy disableHardwareAcceleration setting
- Update all translations (zh/en/tr/ja/hu)
Fixes inverted UX where switch ON was disabling GPU instead of enabling it.
Includes automatic GPU capability detection to disable on unsupported Windows devices.
---
src/background.ts | 83 +++++++++++++++++++++++++++++++---
src/lang/settings.ts | 26 +++++------
src/store/getter.ts | 2 +-
src/store/modules/app.ts | 87 +++++++++++++++++++++++++++++++-----
src/types/global.d.ts | 2 +-
src/views/settings/index.vue | 18 ++++----
6 files changed, 177 insertions(+), 41 deletions(-)
diff --git a/src/background.ts b/src/background.ts
index 7670e6e0b..002585c75 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -40,21 +40,92 @@ declare const __static: string
const Store = require('electron-store')
const electronStore = new Store()
-const DISABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.disableHardwareAcceleration'
+const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
+const LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY = 'settings.disableHardwareAcceleration'
let theme: Theme = 'light'
let syncOsTheme = false
let autoCheckUpdate: boolean = true
const isDevelopment: boolean = process.env.NODE_ENV !== 'production'
const isMac: boolean = process.platform === 'darwin'
-const disableHardwareAccelerationBySetting =
- electronStore.get(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, false) === true
+/**
+ * Detect if GPU acceleration is supported on Windows.
+ * Uses Electron's app.getGPUFeatureStatus() when available.
+ * @returns boolean indicating if GPU acceleration appears to be supported
+ */
+const detectGPUAccelerationSupport = (): boolean => {
+ try {
+ // On Windows, check if GPU is available
+ if (process.platform === 'win32') {
+ const gpuStatus = app.getGPUFeatureStatus()
+ // If canvas or 2d acceleration is unavailable, GPU may not be properly supported
+ if (gpuStatus) {
+ const canvasStatus = gpuStatus.canvas
+ // 'disabled' or 'unavailable' indicates no GPU support
+ if (canvasStatus === 'disabled' || canvasStatus === 'unavailable') {
+ return false
+ }
+ }
+ }
+ } catch (error) {
+ // If we can't detect, assume GPU is supported (default to true)
+ console.log('[GPU] Could not detect GPU support, defaulting to enabled')
+ }
+ return true
+}
+
+/**
+ * Migrate legacy disableHardwareAcceleration setting to new enableHardwareAcceleration setting.
+ * Inverts the boolean value during migration.
+ */
+const migrateHardwareAccelerationSetting = (): boolean | undefined => {
+ try {
+ const legacyValue = electronStore.get(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
+ if (legacyValue !== undefined) {
+ // Migrate: disableHardwareAcceleration=false means GPU was enabled
+ // So enableHardwareAcceleration should be true in that case
+ const newValue = legacyValue === false
+ electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, newValue)
+ // Remove legacy key after migration
+ electronStore.delete(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
+ console.log('[GPU] Migrated legacy disableHardwareAcceleration setting:', legacyValue, '->', newValue)
+ return newValue
+ }
+ } catch (error) {
+ console.error('[GPU] Error migrating hardware acceleration setting:', error)
+ }
+ return undefined
+}
+
+// Get hardware acceleration setting with migration and GPU detection
+const getHardwareAccelerationSetting = (): boolean => {
+ // First, try to migrate legacy setting if it exists
+ const migrated = migrateHardwareAccelerationSetting()
+ if (migrated !== undefined) {
+ return migrated
+ }
+ // Check if there's an existing new setting
+ const existingValue = electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
+ if (existingValue !== undefined) {
+ return existingValue === true
+ }
+ // No setting exists - detect GPU support and default accordingly
+ const gpuSupported = detectGPUAccelerationSupport()
+ // Default to true (enabled) if GPU is supported, false otherwise
+ electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, gpuSupported)
+ return gpuSupported
+}
+
+const enableHardwareAccelerationBySetting = getHardwareAccelerationSetting()
// Hardware acceleration must be configured before the app is ready, so this
// setting is read from electron-store instead of the database settings table.
-if (disableHardwareAccelerationBySetting) {
+// Call app.disableHardwareAcceleration() when enableHardwareAcceleration is false
+if (!enableHardwareAccelerationBySetting) {
app.disableHardwareAcceleration()
console.log('[GPU] Hardware acceleration disabled')
+} else {
+ console.log('[GPU] Hardware acceleration enabled')
}
// Keep a global reference of the window object, if you don't, the window will
@@ -233,7 +304,7 @@ async function createWindow() {
logLevel: setting.logLevel,
ignoreQoS0Message: setting.ignoreQoS0Message,
topicWhitespaceDetection: electronStore.get('settings.topicWhitespaceDetection', false),
- disableHardwareAcceleration: disableHardwareAccelerationBySetting,
+ enableHardwareAcceleration: enableHardwareAccelerationBySetting,
}
}
} catch (error) {
@@ -246,7 +317,7 @@ async function createWindow() {
currentLang: 'en',
syncOsTheme: false,
topicWhitespaceDetection: electronStore.get('settings.topicWhitespaceDetection', false),
- disableHardwareAcceleration: disableHardwareAccelerationBySetting,
+ enableHardwareAcceleration: enableHardwareAccelerationBySetting,
}
}
// Create the browser window.
diff --git a/src/lang/settings.ts b/src/lang/settings.ts
index 7a1810c80..c95e55cbf 100644
--- a/src/lang/settings.ts
+++ b/src/lang/settings.ts
@@ -153,19 +153,19 @@ export default {
ja: 'トピック内の空白を示し、送受信の不一致を防ぐための確認に役立ちます。',
hu: 'Kiemeli a szóközöket a témákban, hogy segítsen megelőzni a közzététel/előfizetés eltéréseket.',
},
- disableHardwareAcceleration: {
- zh: '禁用 GPU 加速',
- en: 'Disable GPU Acceleration',
- tr: 'GPU Hızlandırmayı Devre Dışı Bırak',
- ja: 'GPUアクセラレーションを無効にする',
- hu: 'GPU gyorsítás letiltása',
- },
- disableHardwareAccelerationDesc: {
- zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如遇画面卡顿、花屏或兼容性问题,可尝试启用此选项。',
- en: 'GPU acceleration uses graphics hardware to render the UI, making operations smoother and reducing CPU usage. Enable this option if you experience screen lag, artifacts, or compatibility issues.',
- tr: "GPU hızlandırma, işlemleri daha akıcı hale getirmek ve CPU kullanımını azaltmak için grafik donanımını kullanarak UI'yi render eder. Ekran gecikmesi, görsel bozukluklar veya uyumluluk sorunları yaşıyorsanız bu seçeneği etkinleştirin.",
- ja: 'GPUアクセラレーションは、グラフィックハードウェアを使用してUIをレンダリングし、操作をスムーズにし、CPU使用率を低下させます。画面のラグ、アーティファクト、または互換性の問題が発生した場合は、このオプションを有効にしてください。',
- hu: 'A GPU gyorsítás grafikus hardvert használ a UI rendereléséhez, így a műveletek gördülékenyebbek és a CPU-használat alacsonyabb. Ha képernyő akadozást, artefaktokat vagy kompatibilitási problémákat tapasztal, engedélyezze ezt a lehetőséget.',
+ enableHardwareAcceleration: {
+ zh: '启用 GPU 加速',
+ en: 'Enable GPU Acceleration',
+ tr: 'GPU Hızlandırmayı Etkinleştir',
+ ja: 'GPUアクセラレーションを有効にする',
+ hu: 'GPU gyorsítás engedélyezése',
+ },
+ enableHardwareAccelerationDesc: {
+ zh: 'GPU 加速利用显卡硬件渲染界面,可使操作更流畅并降低 CPU 占用。如果此选项关闭或遇到画面卡顿、花屏等问题,请检查您的显卡驱动是否为最新版本。',
+ en: 'GPU acceleration uses graphics hardware to render the UI for smoother operation and lower CPU usage. If this option is disabled or you experience screen lag, artifacts, or other issues, please check that your graphics driver is up to date.',
+ tr: "GPU hızlandırma, işlemleri daha akıcı hale getirmek ve CPU kullanımını azaltmak için grafik donanımını kullanarak UI'yi render eder. Bu seçenek devre dışıysa veya ekran gecikmesi, görsel bozukluklar veya diğer sorunlar yaşıyorsanız, lütfen grafik sürücünüzün güncel olduğundan emin olun.",
+ ja: 'GPUアクセラレーションは、グラフィックハードウェアを使用してUIをレンダリングし、操作をスムーズにし、CPU使用率を低下させます。このオプションが無効になっている場合、または画面のラグ、アーティファクト、その他の問題が発生した場合は、グラフィックドライバーが最新であるかどうかを確認してください。',
+ hu: 'A GPU gyorsítás grafikus hardvert használ a UI rendereléséhez, így a műveletek gördülékenyebbek és a CPU-használat alacsonyabb. Ha ez a lehetőség le van tiltva, vagy képernyő akadozást, artefaktokat vagy más problémákat tapasztal, kérjük, ellenőrizze, hogy a grafikus illesztőprogram naprakész-e.',
},
restartRequired: {
zh: '需要重启',
diff --git a/src/store/getter.ts b/src/store/getter.ts
index 330f99833..b94a06053 100644
--- a/src/store/getter.ts
+++ b/src/store/getter.ts
@@ -26,7 +26,7 @@ const getters = {
ignoreQoS0Message: (state: State) => state.app.ignoreQoS0Message,
topicWhitespaceDetection: (state: State) => state.app.topicWhitespaceDetection,
maxPayloadDisplaySize: (state: State) => state.app.maxPayloadDisplaySize,
- disableHardwareAcceleration: (state: State) => state.app.disableHardwareAcceleration,
+ enableHardwareAcceleration: (state: State) => state.app.enableHardwareAcceleration,
}
export default getters
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index 9a64f9e70..b55f7d354 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -35,8 +35,9 @@ const SET_DATABASE_FAIL_MESSAGE = 'SET_DATABASE_FAIL_MESSAGE'
const TOGGLE_IGNORE_QOS0_MESSAGE = 'TOGGLE_IGNORE_QOS0_MESSAGE'
const TOGGLE_TOPIC_WHITESPACE_DETECTION = 'TOGGLE_TOPIC_WHITESPACE_DETECTION'
const SET_MAX_PAYLOAD_DISPLAY_SIZE = 'SET_MAX_PAYLOAD_DISPLAY_SIZE'
-const TOGGLE_DISABLE_HARDWARE_ACCELERATION = 'TOGGLE_DISABLE_HARDWARE_ACCELERATION'
-const DISABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.disableHardwareAcceleration'
+const TOGGLE_ENABLE_HARDWARE_ACCELERATION = 'TOGGLE_ENABLE_HARDWARE_ACCELERATION'
+const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
+const LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY = 'settings.disableHardwareAcceleration'
const getShowConnectionList = (): boolean => {
const _showConnectionList: string | null = localStorage.getItem('showConnectionList')
@@ -46,6 +47,56 @@ const getShowConnectionList = (): boolean => {
return JSON.parse(_showConnectionList)
}
+/**
+ * Detect if GPU acceleration is supported on Windows.
+ * Uses Electron's app.getGPUFeatureStatus() when available.
+ * @returns boolean indicating if GPU acceleration appears to be supported
+ */
+const detectGPUAccelerationSupport = (): boolean => {
+ try {
+ const { app } = require('@electron/remote')
+ // On Windows, check if GPU is available
+ if (process.platform === 'win32') {
+ const gpuStatus = app.getGPUFeatureStatus()
+ // If canvas or 2d acceleration is unavailable, GPU may not be properly supported
+ if (gpuStatus) {
+ const canvasStatus = gpuStatus.canvas
+ // 'disabled' or 'unavailable' indicates no GPU support
+ if (canvasStatus === 'disabled' || canvasStatus === 'unavailable') {
+ return false
+ }
+ }
+ }
+ } catch (error) {
+ // If we can't detect, assume GPU is supported (default to true)
+ console.log('[GPU] Could not detect GPU support, defaulting to enabled')
+ }
+ return true
+}
+
+/**
+ * Migrate legacy disableHardwareAcceleration setting to new enableHardwareAcceleration setting.
+ * Inverts the boolean value during migration.
+ */
+const migrateHardwareAccelerationSetting = (): boolean | undefined => {
+ try {
+ const legacyValue = electronStore.get(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
+ if (legacyValue !== undefined) {
+ // Migrate: disableHardwareAcceleration=false means GPU was enabled
+ // So enableHardwareAcceleration should be true in that case
+ const newValue = legacyValue === false
+ electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, newValue)
+ // Remove legacy key after migration
+ electronStore.delete(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
+ console.log('[GPU] Migrated legacy disableHardwareAcceleration setting:', legacyValue, '->', newValue)
+ return newValue
+ }
+ } catch (error) {
+ console.error('[GPU] Error migrating hardware acceleration setting:', error)
+ }
+ return undefined
+}
+
const settingData = getGlobal('sharedData')
const app = {
@@ -79,9 +130,23 @@ const app = {
maxPayloadDisplaySize: normalizeMaxPayloadDisplaySize(
electronStore.get('settings.maxPayloadDisplaySize', DEFAULT_MAX_PAYLOAD_DISPLAY_SIZE),
),
- disableHardwareAcceleration:
- settingData.disableHardwareAcceleration ??
- electronStore.get(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, false) === true,
+ enableHardwareAcceleration: (() => {
+ // First, try to migrate legacy setting if it exists
+ const migrated = migrateHardwareAccelerationSetting()
+ if (migrated !== undefined) {
+ return migrated
+ }
+ // Check if there's an existing new setting
+ const existingValue = electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
+ if (existingValue !== undefined) {
+ return existingValue === true
+ }
+ // No setting exists - detect GPU support and default accordingly
+ const gpuSupported = detectGPUAccelerationSupport()
+ // Default to true (enabled) if GPU is supported, false otherwise
+ electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, gpuSupported)
+ return gpuSupported
+ })(),
},
mutations: {
[TOGGLE_THEME](state: App, currentTheme: Theme) {
@@ -195,8 +260,8 @@ const app = {
[SET_MAX_PAYLOAD_DISPLAY_SIZE](state: App, maxPayloadDisplaySize: number) {
state.maxPayloadDisplaySize = maxPayloadDisplaySize
},
- [TOGGLE_DISABLE_HARDWARE_ACCELERATION](state: App, disableHardwareAcceleration: boolean) {
- state.disableHardwareAcceleration = disableHardwareAcceleration
+ [TOGGLE_ENABLE_HARDWARE_ACCELERATION](state: App, enableHardwareAcceleration: boolean) {
+ state.enableHardwareAcceleration = enableHardwareAcceleration
},
},
actions: {
@@ -333,10 +398,10 @@ const app = {
commit(SET_MAX_PAYLOAD_DISPLAY_SIZE, normalizedValue)
electronStore.set('settings.maxPayloadDisplaySize', normalizedValue)
},
- TOGGLE_DISABLE_HARDWARE_ACCELERATION({ commit }: any, payload: App) {
- commit(TOGGLE_DISABLE_HARDWARE_ACCELERATION, payload.disableHardwareAcceleration)
- settingData.disableHardwareAcceleration = payload.disableHardwareAcceleration
- electronStore.set(DISABLE_HARDWARE_ACCELERATION_SETTING_KEY, payload.disableHardwareAcceleration)
+ TOGGLE_ENABLE_HARDWARE_ACCELERATION({ commit }: any, payload: App) {
+ commit(TOGGLE_ENABLE_HARDWARE_ACCELERATION, payload.enableHardwareAcceleration)
+ settingData.enableHardwareAcceleration = payload.enableHardwareAcceleration
+ electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, payload.enableHardwareAcceleration)
},
},
}
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index 3e3415d24..53bcb6c56 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -116,7 +116,7 @@ declare global {
ignoreQoS0Message: boolean
topicWhitespaceDetection: boolean
maxPayloadDisplaySize: number
- disableHardwareAcceleration: boolean
+ enableHardwareAcceleration: boolean
}
interface State {
diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue
index f560d30bd..fb24ec02d 100644
--- a/src/views/settings/index.vue
+++ b/src/views/settings/index.vue
@@ -372,12 +372,12 @@
-
+
@@ -386,10 +386,10 @@
@@ -547,8 +547,8 @@ export default class Settings extends Vue {
@Action('SET_MAX_PAYLOAD_DISPLAY_SIZE') private actionSetMaxPayloadDisplaySize!: (payload: {
maxPayloadDisplaySize: number
}) => void
- @Action('TOGGLE_DISABLE_HARDWARE_ACCELERATION') private actionToggleDisableHardwareAcceleration!: (payload: {
- disableHardwareAcceleration: boolean
+ @Action('TOGGLE_ENABLE_HARDWARE_ACCELERATION') private actionToggleEnableHardwareAcceleration!: (payload: {
+ enableHardwareAcceleration: boolean
}) => void
@Getter('currentTheme') private currentTheme!: Theme
@@ -567,7 +567,7 @@ export default class Settings extends Vue {
@Getter('ignoreQoS0Message') private ignoreQoS0Message!: boolean
@Getter('topicWhitespaceDetection') private topicWhitespaceDetection!: boolean
@Getter('maxPayloadDisplaySize') private maxPayloadDisplaySize!: number
- @Getter('disableHardwareAcceleration') private disableHardwareAcceleration!: boolean
+ @Getter('enableHardwareAcceleration') private enableHardwareAcceleration!: boolean
private showAIModelsSelect = false
@@ -660,8 +660,8 @@ export default class Settings extends Vue {
this.actionToggleTopicWhitespaceDetection({ topicWhitespaceDetection: value })
}
- private handleDisableHardwareAccelerationChange(value: boolean) {
- this.actionToggleDisableHardwareAcceleration({ disableHardwareAcceleration: value })
+ private handleEnableHardwareAccelerationChange(value: boolean) {
+ this.actionToggleEnableHardwareAcceleration({ enableHardwareAcceleration: value })
this.promptAppRestart()
}
From 3ffa50f5f0692a387fe3da7e3d46038a0f28156a Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Thu, 19 Mar 2026 21:30:37 +0800
Subject: [PATCH 5/7] refactor(gpu): remove legacy migration code
Remove LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY and migration function.
This is treated as a fresh setting - no backwards compatibility needed.
Users with old disableHardwareAcceleration setting will get default behavior
(GPU enabled if supported, disabled if not detected on Windows).
---
src/background.ts | 33 ++-------------------------------
1 file changed, 2 insertions(+), 31 deletions(-)
diff --git a/src/background.ts b/src/background.ts
index 002585c75..685197fb9 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -41,7 +41,6 @@ declare const __static: string
const Store = require('electron-store')
const electronStore = new Store()
const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
-const LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY = 'settings.disableHardwareAcceleration'
let theme: Theme = 'light'
let syncOsTheme = false
let autoCheckUpdate: boolean = true
@@ -74,37 +73,9 @@ const detectGPUAccelerationSupport = (): boolean => {
return true
}
-/**
- * Migrate legacy disableHardwareAcceleration setting to new enableHardwareAcceleration setting.
- * Inverts the boolean value during migration.
- */
-const migrateHardwareAccelerationSetting = (): boolean | undefined => {
- try {
- const legacyValue = electronStore.get(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
- if (legacyValue !== undefined) {
- // Migrate: disableHardwareAcceleration=false means GPU was enabled
- // So enableHardwareAcceleration should be true in that case
- const newValue = legacyValue === false
- electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, newValue)
- // Remove legacy key after migration
- electronStore.delete(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
- console.log('[GPU] Migrated legacy disableHardwareAcceleration setting:', legacyValue, '->', newValue)
- return newValue
- }
- } catch (error) {
- console.error('[GPU] Error migrating hardware acceleration setting:', error)
- }
- return undefined
-}
-
-// Get hardware acceleration setting with migration and GPU detection
+// Get hardware acceleration setting with GPU detection
const getHardwareAccelerationSetting = (): boolean => {
- // First, try to migrate legacy setting if it exists
- const migrated = migrateHardwareAccelerationSetting()
- if (migrated !== undefined) {
- return migrated
- }
- // Check if there's an existing new setting
+ // Check if there's an existing setting
const existingValue = electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
if (existingValue !== undefined) {
return existingValue === true
From aed6b8a7f88778982132816c57997bc7d7d490b3 Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Thu, 21 May 2026 15:31:39 +0800
Subject: [PATCH 6/7] refactor(gpu): simplify hardware acceleration default
---
src/background.ts | 38 +---------------------
src/store/modules/app.ts | 69 ++--------------------------------------
2 files changed, 4 insertions(+), 103 deletions(-)
diff --git a/src/background.ts b/src/background.ts
index 685197fb9..2c7c5ef0c 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -47,44 +47,8 @@ let autoCheckUpdate: boolean = true
const isDevelopment: boolean = process.env.NODE_ENV !== 'production'
const isMac: boolean = process.platform === 'darwin'
-/**
- * Detect if GPU acceleration is supported on Windows.
- * Uses Electron's app.getGPUFeatureStatus() when available.
- * @returns boolean indicating if GPU acceleration appears to be supported
- */
-const detectGPUAccelerationSupport = (): boolean => {
- try {
- // On Windows, check if GPU is available
- if (process.platform === 'win32') {
- const gpuStatus = app.getGPUFeatureStatus()
- // If canvas or 2d acceleration is unavailable, GPU may not be properly supported
- if (gpuStatus) {
- const canvasStatus = gpuStatus.canvas
- // 'disabled' or 'unavailable' indicates no GPU support
- if (canvasStatus === 'disabled' || canvasStatus === 'unavailable') {
- return false
- }
- }
- }
- } catch (error) {
- // If we can't detect, assume GPU is supported (default to true)
- console.log('[GPU] Could not detect GPU support, defaulting to enabled')
- }
- return true
-}
-
-// Get hardware acceleration setting with GPU detection
const getHardwareAccelerationSetting = (): boolean => {
- // Check if there's an existing setting
- const existingValue = electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
- if (existingValue !== undefined) {
- return existingValue === true
- }
- // No setting exists - detect GPU support and default accordingly
- const gpuSupported = detectGPUAccelerationSupport()
- // Default to true (enabled) if GPU is supported, false otherwise
- electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, gpuSupported)
- return gpuSupported
+ return electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, true) !== false
}
const enableHardwareAccelerationBySetting = getHardwareAccelerationSetting()
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index b55f7d354..92caa4732 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -37,7 +37,6 @@ const TOGGLE_TOPIC_WHITESPACE_DETECTION = 'TOGGLE_TOPIC_WHITESPACE_DETECTION'
const SET_MAX_PAYLOAD_DISPLAY_SIZE = 'SET_MAX_PAYLOAD_DISPLAY_SIZE'
const TOGGLE_ENABLE_HARDWARE_ACCELERATION = 'TOGGLE_ENABLE_HARDWARE_ACCELERATION'
const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
-const LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY = 'settings.disableHardwareAcceleration'
const getShowConnectionList = (): boolean => {
const _showConnectionList: string | null = localStorage.getItem('showConnectionList')
@@ -47,54 +46,8 @@ const getShowConnectionList = (): boolean => {
return JSON.parse(_showConnectionList)
}
-/**
- * Detect if GPU acceleration is supported on Windows.
- * Uses Electron's app.getGPUFeatureStatus() when available.
- * @returns boolean indicating if GPU acceleration appears to be supported
- */
-const detectGPUAccelerationSupport = (): boolean => {
- try {
- const { app } = require('@electron/remote')
- // On Windows, check if GPU is available
- if (process.platform === 'win32') {
- const gpuStatus = app.getGPUFeatureStatus()
- // If canvas or 2d acceleration is unavailable, GPU may not be properly supported
- if (gpuStatus) {
- const canvasStatus = gpuStatus.canvas
- // 'disabled' or 'unavailable' indicates no GPU support
- if (canvasStatus === 'disabled' || canvasStatus === 'unavailable') {
- return false
- }
- }
- }
- } catch (error) {
- // If we can't detect, assume GPU is supported (default to true)
- console.log('[GPU] Could not detect GPU support, defaulting to enabled')
- }
- return true
-}
-
-/**
- * Migrate legacy disableHardwareAcceleration setting to new enableHardwareAcceleration setting.
- * Inverts the boolean value during migration.
- */
-const migrateHardwareAccelerationSetting = (): boolean | undefined => {
- try {
- const legacyValue = electronStore.get(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
- if (legacyValue !== undefined) {
- // Migrate: disableHardwareAcceleration=false means GPU was enabled
- // So enableHardwareAcceleration should be true in that case
- const newValue = legacyValue === false
- electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, newValue)
- // Remove legacy key after migration
- electronStore.delete(LEGACY_DISABLE_HARDWARE_ACCELERATION_KEY)
- console.log('[GPU] Migrated legacy disableHardwareAcceleration setting:', legacyValue, '->', newValue)
- return newValue
- }
- } catch (error) {
- console.error('[GPU] Error migrating hardware acceleration setting:', error)
- }
- return undefined
+const getEnableHardwareAcceleration = (): boolean => {
+ return electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, true) !== false
}
const settingData = getGlobal('sharedData')
@@ -130,23 +83,7 @@ const app = {
maxPayloadDisplaySize: normalizeMaxPayloadDisplaySize(
electronStore.get('settings.maxPayloadDisplaySize', DEFAULT_MAX_PAYLOAD_DISPLAY_SIZE),
),
- enableHardwareAcceleration: (() => {
- // First, try to migrate legacy setting if it exists
- const migrated = migrateHardwareAccelerationSetting()
- if (migrated !== undefined) {
- return migrated
- }
- // Check if there's an existing new setting
- const existingValue = electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
- if (existingValue !== undefined) {
- return existingValue === true
- }
- // No setting exists - detect GPU support and default accordingly
- const gpuSupported = detectGPUAccelerationSupport()
- // Default to true (enabled) if GPU is supported, false otherwise
- electronStore.set(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, gpuSupported)
- return gpuSupported
- })(),
+ enableHardwareAcceleration: getEnableHardwareAcceleration(),
},
mutations: {
[TOGGLE_THEME](state: App, currentTheme: Theme) {
From 9cd1d2a75cbd018ed889a1f5a0c12f6ea9de7606 Mon Sep 17 00:00:00 2001
From: ysfscream <894402575bt@gmail.com>
Date: Fri, 22 May 2026 17:23:03 +0800
Subject: [PATCH 7/7] fix(gpu): refine hardware acceleration setting handling
---
src/background.ts | 4 ++--
src/store/modules/app.ts | 4 ++--
src/utils/settings.ts | 11 +++++++++++
src/views/settings/index.vue | 5 +++--
4 files changed, 18 insertions(+), 6 deletions(-)
create mode 100644 src/utils/settings.ts
diff --git a/src/background.ts b/src/background.ts
index 2c7c5ef0c..a841b2e2a 100644
--- a/src/background.ts
+++ b/src/background.ts
@@ -19,6 +19,7 @@ import ORMConfig from './database/database.config'
import version from '@/version'
import { initialize } from '@electron/remote/main'
import { initMCPHandlers, cleanupMCPConnections } from './main/ai/mcp/MCPManager'
+import { getEnableHardwareAccelerationSetting } from '@/utils/settings'
/**
* Fix the PATH environment variable in packaged Electron apps
@@ -40,7 +41,6 @@ declare const __static: string
const Store = require('electron-store')
const electronStore = new Store()
-const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
let theme: Theme = 'light'
let syncOsTheme = false
let autoCheckUpdate: boolean = true
@@ -48,7 +48,7 @@ const isDevelopment: boolean = process.env.NODE_ENV !== 'production'
const isMac: boolean = process.platform === 'darwin'
const getHardwareAccelerationSetting = (): boolean => {
- return electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, true) !== false
+ return getEnableHardwareAccelerationSetting(electronStore)
}
const enableHardwareAccelerationBySetting = getHardwareAccelerationSetting()
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index 92caa4732..3c2ffae18 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -2,6 +2,7 @@ import Vue from 'vue'
import useServices from '@/database/useServices'
import { getGlobal } from '@electron/remote'
import { DEFAULT_MAX_PAYLOAD_DISPLAY_SIZE, normalizeMaxPayloadDisplaySize } from '@/utils/data'
+import { ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, getEnableHardwareAccelerationSetting } from '@/utils/settings'
const Store = require('electron-store')
const electronStore = new Store()
@@ -36,7 +37,6 @@ const TOGGLE_IGNORE_QOS0_MESSAGE = 'TOGGLE_IGNORE_QOS0_MESSAGE'
const TOGGLE_TOPIC_WHITESPACE_DETECTION = 'TOGGLE_TOPIC_WHITESPACE_DETECTION'
const SET_MAX_PAYLOAD_DISPLAY_SIZE = 'SET_MAX_PAYLOAD_DISPLAY_SIZE'
const TOGGLE_ENABLE_HARDWARE_ACCELERATION = 'TOGGLE_ENABLE_HARDWARE_ACCELERATION'
-const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
const getShowConnectionList = (): boolean => {
const _showConnectionList: string | null = localStorage.getItem('showConnectionList')
@@ -47,7 +47,7 @@ const getShowConnectionList = (): boolean => {
}
const getEnableHardwareAcceleration = (): boolean => {
- return electronStore.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY, true) !== false
+ return getEnableHardwareAccelerationSetting(electronStore)
}
const settingData = getGlobal('sharedData')
diff --git a/src/utils/settings.ts b/src/utils/settings.ts
new file mode 100644
index 000000000..f07303cf7
--- /dev/null
+++ b/src/utils/settings.ts
@@ -0,0 +1,11 @@
+export const ENABLE_HARDWARE_ACCELERATION_SETTING_KEY = 'settings.enableHardwareAcceleration'
+
+interface BooleanSettingStore {
+ get: (key: string) => unknown
+}
+
+export const getEnableHardwareAccelerationSetting = (store: BooleanSettingStore): boolean => {
+ const value = store.get(ENABLE_HARDWARE_ACCELERATION_SETTING_KEY)
+
+ return value === undefined ? true : value === true
+}
diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue
index fb24ec02d..18d2e8ab8 100644
--- a/src/views/settings/index.vue
+++ b/src/views/settings/index.vue
@@ -379,9 +379,9 @@
:open-delay="500"
:content="$t('settings.enableHardwareAccelerationDesc')"
>
-
+
-
+
@@ -887,6 +887,7 @@ export default class Settings extends Vue {
top: 1px;
left: 5px;
color: var(--color-text-default);
+ cursor: help;
}
.ai-models-select {
position: absolute;