Main+App+Store: Implement basic setting sync between Electron windows

The app utilizes the Electron IPC to communicate settings' updates
to the other existing windows.

This is still at a fairly rudimentary stage, since some settings are
not syncing at all, while other settings have related side effects that
are not currently being propagated to the remaining windows.

An example of this would be the 'uiScale' setting, in which
the value is properly synced, but the app's actual scaling isn't.
This commit is contained in:
Svallinn 2021-06-09 05:57:35 +01:00
parent 5e105f5584
commit 7e94abb3b4
No known key found for this signature in database
GPG Key ID: 09FB527F34037CCA
3 changed files with 32 additions and 1 deletions

View File

@ -387,6 +387,16 @@ function runApp() {
createWindow(false, '', false) createWindow(false, '', false)
}) })
ipcMain.on('syncSetting', (event, setting) => {
const otherWindows = openedWindows.filter((window) => {
return window.webContents.id !== event.sender.id
})
for (const window of otherWindows) {
window.webContents.send('syncSetting', setting)
}
})
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
if (process.platform !== 'darwin') { if (process.platform !== 'darwin') {
app.quit() app.quit()

View File

@ -80,6 +80,7 @@ export default Vue.extend({
}, },
mounted: function () { mounted: function () {
this.grabUserSettings().then(() => { this.grabUserSettings().then(() => {
this.setUpListenerToSyncSettings()
this.grabAllProfiles(this.$t('Profile.All Channels')).then(async () => { this.grabAllProfiles(this.$t('Profile.All Channels')).then(async () => {
this.grabHistory() this.grabHistory()
this.grabAllPlaylists() this.grabAllPlaylists()
@ -404,7 +405,8 @@ export default Vue.extend({
'grabAllPlaylists', 'grabAllPlaylists',
'getRegionData', 'getRegionData',
'getYoutubeUrlInfo', 'getYoutubeUrlInfo',
'getLocale' 'getLocale',
'setUpListenerToSyncSettings'
]) ])
} }
}) })

View File

@ -121,6 +121,13 @@ for (const settingId of Object.keys(state)) {
(err, _) => { (err, _) => {
if (!err) { if (!err) {
commit(mutationId, value) commit(mutationId, value)
if (getters.getUsingElectron) {
const { ipcRenderer } = require('electron')
// Propagate setting values to all other existing windows
ipcRenderer.send('syncSetting', {
_id: settingId, value: value
})
}
} }
} }
) )
@ -190,6 +197,18 @@ Object.assign(actions, {
} }
) )
}) })
},
setUpListenerToSyncSettings: ({ commit, getters }) => {
if (getters.getUsingElectron) {
const { ipcRenderer } = require('electron')
ipcRenderer.on('syncSetting', (_, setting) => {
const capitalizedSettingId =
setting._id.replace(/^\w/, (c) => c.toUpperCase())
commit('set' + capitalizedSettingId, setting.value)
})
}
} }
}) })