1
0
mirror of https://github.com/rhysd/Mstdn.git synced 2025-02-01 05:52:11 +01:00

add shortcuts to switch to next/previous account

This commit is contained in:
rhysd 2017-04-19 17:07:31 +09:00
parent 2a65483779
commit 129490f4b4
5 changed files with 112 additions and 10 deletions

View File

@ -98,12 +98,14 @@ You need to write up this config at first.
Object whose key is a key sequence and whose value is an action name. Object whose key is a key sequence and whose value is an action name.
| Action Name | Description | Default Key | | Action Name | Description | Default Key |
|--------------------|---------------------------------|-------------| |-----------------|---------------------------------|-------------|
| `scroll-down` | Scroll down window | `j` | | `scroll-down` | Scroll down window | `j` |
| `scroll-up` | Scroll up window | `k` | | `scroll-up` | Scroll up window | `k` |
| `scroll-top` | Scroll up to top of window | `i` | | `scroll-top` | Scroll up to top of window | `i` |
| `scroll-bottom` | Scroll down to bottom of window | `m` | | `scroll-bottom` | Scroll down to bottom of window | `m` |
| `next-account` | Switch to next account | N/A |
| `prev-account` | Switch to previous account | N/A |
If an action name starts with `/`, it will navigate to the path. For example, If an action name starts with `/`, it will navigate to the path. For example,
if you set `"/web/timelines/home"` to some key shortcut and you input the key, if you set `"/web/timelines/home"` to some key shortcut and you input the key,
@ -111,6 +113,51 @@ browser will navigate page to `https://{your host}/web/timelines/home`.
By default, some key shortcuts for tab items are set in addition to above table. By default, some key shortcuts for tab items are set in addition to above table.
<details>
<summary> Example of configuration </summary>
<pre><code>
{
"hot_key": "F8",
"icon_color": "black",
"always_on_top": false,
"normal_window": false,
"zoom_factor": 0.9,
"accounts": [
{
"name": "Linda_pp",
"host": "mstdn.jp",
"default_page": "/web/timelines/home"
},
{
"name": "inudog",
"host": "mastodon.social",
"default_page": "/web/timelines/home"
}
],
"keymaps": {
"1": "/web/statuses/new",
"2": "/web/timelines/home",
"3": "/web/notifications",
"4": "/web/timelines/public/local",
"5": "/web/timelines/public",
"6": "/web/getting-started",
"ctrl+1": "/web/statuses/new",
"ctrl+2": "/web/timelines/home",
"ctrl+3": "/web/notifications",
"ctrl+4": "/web/timelines/public/local",
"ctrl+5": "/web/timelines/public",
"ctrl+6": "/web/getting-started",
"j": "scroll-down",
"k": "scroll-up",
"i": "scroll-top",
"m": "scroll-bottom",
"n": "next-account",
"p": "prev-account"
}
}
</code></pre>
</details>
## Multi account ## Multi account
If you set multiple accounts to `accounts` array in `config.json`, `Accounts` menu item will appear in application menu. If you set multiple accounts to `accounts` array in `config.json`, `Accounts` menu item will appear in application menu.
@ -118,7 +165,7 @@ If you set multiple accounts to `accounts` array in `config.json`, `Accounts` me
![multi account menu item](https://github.com/rhysd/ss/blob/master/Mstdn/multi-account.png?raw=true) ![multi account menu item](https://github.com/rhysd/ss/blob/master/Mstdn/multi-account.png?raw=true)
It will show the list of your account. Check mark is added for current user. It will show the list of your account. Check mark is added for current user.
When you click menu item of non-current user, application window will be rectreated and switch page to the account. When you click menu item of non-current user, application window will be recreated and switch page to the account.
[Mastodon]: https://github.com/tootsuite/mastodon [Mastodon]: https://github.com/tootsuite/mastodon
[npm]: https://www.npmjs.com/package/mstdn [npm]: https://www.npmjs.com/package/mstdn

View File

@ -1,5 +1,5 @@
import {EventEmitter} from 'events'; import {EventEmitter} from 'events';
import {Menu, MenuItem} from 'electron'; import {Menu, MenuItem, ipcMain as ipc} from 'electron';
import log from './log'; import log from './log';
import {Account} from './config'; import {Account} from './config';
@ -49,6 +49,9 @@ export default class AccountSwitcher extends EventEmitter {
menu.insert(menu.items.length - 1, item); menu.insert(menu.items.length - 1, item);
Menu.setApplicationMenu(menu); Menu.setApplicationMenu(menu);
} }
ipc.on('mstdn:next-account' as IpcChannelFromRenderer, this.switchToNext);
ipc.on('mstdn:prev-account' as IpcChannelFromRenderer, this.switchToPrev);
} }
switchTo(account: Account) { switchTo(account: Account) {
@ -60,4 +63,41 @@ export default class AccountSwitcher extends EventEmitter {
this.emit('switch', account, this.current); this.emit('switch', account, this.current);
this.current = account; this.current = account;
} }
getAccountIndex(account: Account) {
for (let i = 0; i < this.accounts.length; ++i) {
const a = this.accounts[i];
if (a.name === account.name && a.host === account.host) {
return i;
}
}
return -1;
}
switchToNext = () => {
if (this.accounts.length <= 1) {
log.debug('Skip switching account: Only one account is registered');
return;
}
let idx = this.getAccountIndex(this.current) + 1;
if (idx >= this.accounts.length) {
idx = 0;
}
log.debug('Switch to next account');
this.switchTo(this.accounts[idx]);
}
switchToPrev = () => {
if (this.accounts.length <= 1) {
log.debug('Skip switching account: Only one account is registered');
return;
}
let idx = this.getAccountIndex(this.current);
if (idx <= 0) {
idx = this.accounts.length;
}
--idx;
log.debug('Switch to prev account');
this.switchTo(this.accounts[idx]);
}
} }

View File

@ -42,6 +42,12 @@ const ShortcutActions = {
'scroll-up': () => { 'scroll-up': () => {
scrollable().scrollTop -= window.innerHeight / 3; scrollable().scrollTop -= window.innerHeight / 3;
}, },
'next-account': () => {
Ipc.send('mstdn:next-account');
},
'prev-account': () => {
Ipc.send('mstdn:prev-account');
},
} as {[action: string]: () => void}; } as {[action: string]: () => void};
function setupKeybinds(keybinds: {[key: string]: string}, host: string) { function setupKeybinds(keybinds: {[key: string]: string}, host: string) {

View File

@ -3,9 +3,14 @@ import r from './require';
const electron = r('electron'); const electron = r('electron');
const ipc = electron.ipcRenderer; const ipc = electron.ipcRenderer;
export function on(channel: IpcChannel, callback: (...args: any[]) => void) { export function on(channel: IpcChannelFromMain, callback: (...args: any[]) => void) {
ipc.on(channel, (_, ...args: any[]) => { ipc.on(channel, (_, ...args: any[]) => {
log.info('IPC: Received from:', channel, args); log.info('IPC: Received from:', channel, args);
callback(...args); callback(...args);
}); });
} }
export function send(channel: IpcChannelFromRenderer, ...args: any[]) {
log.info('IPC: Send:', channel, args);
ipc.send(channel, ...args);
}

8
typings/ipc.d.ts vendored
View File

@ -1,4 +1,8 @@
type IpcChannel type IpcChannelFromMain
= 'mstdn:config' = 'mstdn:config'
| 'mstdn:change-account' ;
type IpcChannelFromRenderer
= 'mstdn:next-account'
| 'mstdn:prev-account'
; ;