mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-20 19:22:43 +08:00
feat: 支持快捷键设置
This commit is contained in:
parent
7341edb32f
commit
4bac5ac8a2
@ -62,6 +62,7 @@
|
|||||||
"download": "^8.0.0",
|
"download": "^8.0.0",
|
||||||
"download-git-repo": "^3.0.2",
|
"download-git-repo": "^3.0.2",
|
||||||
"electron-store": "^8.0.0",
|
"electron-store": "^8.0.0",
|
||||||
|
"keycode": "^2.2.0",
|
||||||
"marked": "^2.0.7",
|
"marked": "^2.0.7",
|
||||||
"node-fetch": "^2.6.1",
|
"node-fetch": "^2.6.1",
|
||||||
"osx-mouse": "git+https://github.com/Toinane/osx-mouse.git",
|
"osx-mouse": "git+https://github.com/Toinane/osx-mouse.git",
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
} from 'electron';
|
} from 'electron';
|
||||||
import Api from './api';
|
import Api from './api';
|
||||||
import robot from 'robotjs';
|
import robot from 'robotjs';
|
||||||
|
import './config';
|
||||||
|
|
||||||
const browsers = require("../browsers")();
|
const browsers = require("../browsers")();
|
||||||
const mouseEvents = require("osx-mouse");
|
const mouseEvents = require("osx-mouse");
|
||||||
@ -20,6 +21,19 @@ let closePicker = (newColor) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function registerShortCut(mainWindow) {
|
||||||
|
const config = global.opConfig.get();
|
||||||
|
globalShortcut.unregisterAll();
|
||||||
|
|
||||||
|
globalShortcut.register(config.perf.shortCut.showAndHidden, () => {
|
||||||
|
mainWindow.show();
|
||||||
|
});
|
||||||
|
|
||||||
|
globalShortcut.register(config.perf.shortCut.separate, () => {
|
||||||
|
mainWindow.webContents.send('new-window');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default function init(mainWindow) {
|
export default function init(mainWindow) {
|
||||||
const mouseTrack = mouseEvents();
|
const mouseTrack = mouseEvents();
|
||||||
let down_time = 0;
|
let down_time = 0;
|
||||||
@ -31,26 +45,20 @@ export default function init(mainWindow) {
|
|||||||
new Notification({ title: 'Rubick 通知', body: '长按了' }).show();
|
new Notification({ title: 'Rubick 通知', body: '长按了' }).show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
registerShortCut(mainWindow);
|
||||||
|
|
||||||
|
ipcMain.on('re-register', (event, arg) => {
|
||||||
|
registerShortCut(mainWindow);
|
||||||
|
});
|
||||||
|
|
||||||
ipcMain.on('changeWindowSize-rubick', (event, arg) => {
|
ipcMain.on('changeWindowSize-rubick', (event, arg) => {
|
||||||
mainWindow.setSize(arg.width || 800, arg.height);
|
mainWindow.setSize(arg.width || 800, arg.height);
|
||||||
});
|
});
|
||||||
|
|
||||||
mainWindow.on('blur', () => {
|
mainWindow.on('blur', () => {
|
||||||
// mainWindow.hide();
|
mainWindow.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
globalShortcut.register('Alt+R', () => {
|
|
||||||
mainWindow.show();
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcMain.on('init-shortcut', (event) => {
|
|
||||||
globalShortcut.register('ctrl+d', () => {
|
|
||||||
event.sender.send('new-window');
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
ipcMain.on('msg-trigger', async (event, arg) => {
|
ipcMain.on('msg-trigger', async (event, arg) => {
|
||||||
const window = arg.winId ? BrowserWindow.fromId(arg.winId) : mainWindow
|
const window = arg.winId ? BrowserWindow.fromId(arg.winId) : mainWindow
|
||||||
const operators = arg.type.split('.');
|
const operators = arg.type.split('.');
|
||||||
|
46
src/main/common/config.js
Normal file
46
src/main/common/config.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import path from "path";
|
||||||
|
import fs from 'fs';
|
||||||
|
import {getlocalDataFile} from "./utils";
|
||||||
|
import os from 'os';
|
||||||
|
|
||||||
|
const configPath = path.join(getlocalDataFile(), './rubick-config.json');
|
||||||
|
|
||||||
|
let defaultConfig = {
|
||||||
|
Darwin: {
|
||||||
|
perf: {
|
||||||
|
shortCut: {
|
||||||
|
showAndHidden: 'Option+R',
|
||||||
|
separate: 'Ctrl+D'
|
||||||
|
},
|
||||||
|
common: {
|
||||||
|
start: true,
|
||||||
|
space: true,
|
||||||
|
},
|
||||||
|
local: {
|
||||||
|
search: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global.opConfig = {
|
||||||
|
config: null,
|
||||||
|
get() {
|
||||||
|
const platform = os.type();
|
||||||
|
try {
|
||||||
|
if (!opConfig.config) {
|
||||||
|
opConfig.config = JSON.parse(fs.readFileSync(configPath) || JSON.stringify(defaultConfig[platform]));
|
||||||
|
}
|
||||||
|
return opConfig.config;
|
||||||
|
} catch (e) {
|
||||||
|
opConfig.config = defaultConfig[platform]
|
||||||
|
return opConfig.config;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set(key, value) {
|
||||||
|
console.log(opConfig.config);
|
||||||
|
opConfig.config[key] = value;
|
||||||
|
fs.writeFileSync(configPath, JSON.stringify(opConfig.config));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
183
src/renderer/assets/keycode.js
Normal file
183
src/renderer/assets/keycode.js
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
export default {
|
||||||
|
0: 'That key has no keycode',
|
||||||
|
3: 'break',
|
||||||
|
8: 'backspace / delete',
|
||||||
|
9: 'tab',
|
||||||
|
12: 'clear',
|
||||||
|
13: 'enter',
|
||||||
|
16: 'shift',
|
||||||
|
17: 'ctrl',
|
||||||
|
18: 'alt',
|
||||||
|
19: 'pause/break',
|
||||||
|
20: 'caps lock',
|
||||||
|
21: 'hangul',
|
||||||
|
25: 'hanja',
|
||||||
|
27: 'escape',
|
||||||
|
28: 'conversion',
|
||||||
|
29: 'non-conversion',
|
||||||
|
32: 'space',
|
||||||
|
33: 'page up',
|
||||||
|
34: 'page down',
|
||||||
|
35: 'end',
|
||||||
|
36: 'home',
|
||||||
|
37: 'left arrow',
|
||||||
|
38: 'up arrow',
|
||||||
|
39: 'right arrow',
|
||||||
|
40: 'down arrow',
|
||||||
|
41: 'select',
|
||||||
|
42: 'print',
|
||||||
|
43: 'execute',
|
||||||
|
44: 'Print Screen',
|
||||||
|
45: 'insert',
|
||||||
|
46: 'delete',
|
||||||
|
47: 'help',
|
||||||
|
48: '0',
|
||||||
|
49: '1',
|
||||||
|
50: '2',
|
||||||
|
51: '3',
|
||||||
|
52: '4',
|
||||||
|
53: '5',
|
||||||
|
54: '6',
|
||||||
|
55: '7',
|
||||||
|
56: '8',
|
||||||
|
57: '9',
|
||||||
|
58: ':',
|
||||||
|
59: 'semicolon (firefox), equals',
|
||||||
|
60: '<',
|
||||||
|
61: 'equals (firefox)',
|
||||||
|
63: 'ß',
|
||||||
|
64: '@ (firefox)',
|
||||||
|
65: 'a',
|
||||||
|
66: 'b',
|
||||||
|
67: 'c',
|
||||||
|
68: 'd',
|
||||||
|
69: 'e',
|
||||||
|
70: 'f',
|
||||||
|
71: 'g',
|
||||||
|
72: 'h',
|
||||||
|
73: 'i',
|
||||||
|
74: 'j',
|
||||||
|
75: 'k',
|
||||||
|
76: 'l',
|
||||||
|
77: 'm',
|
||||||
|
78: 'n',
|
||||||
|
79: 'o',
|
||||||
|
80: 'p',
|
||||||
|
81: 'q',
|
||||||
|
82: 'r',
|
||||||
|
83: 's',
|
||||||
|
84: 't',
|
||||||
|
85: 'u',
|
||||||
|
86: 'v',
|
||||||
|
87: 'w',
|
||||||
|
88: 'x',
|
||||||
|
89: 'y',
|
||||||
|
90: 'z',
|
||||||
|
91: 'Windows Key / Left ⌘ / Chromebook Search key',
|
||||||
|
92: 'right window key',
|
||||||
|
93: 'Windows Menu / Right ⌘',
|
||||||
|
95: 'sleep',
|
||||||
|
96: 'numpad 0',
|
||||||
|
97: 'numpad 1',
|
||||||
|
98: 'numpad 2',
|
||||||
|
99: 'numpad 3',
|
||||||
|
100: 'numpad 4',
|
||||||
|
101: 'numpad 5',
|
||||||
|
102: 'numpad 6',
|
||||||
|
103: 'numpad 7',
|
||||||
|
104: 'numpad 8',
|
||||||
|
105: 'numpad 9',
|
||||||
|
106: 'multiply',
|
||||||
|
107: 'add',
|
||||||
|
108: 'numpad period (firefox)',
|
||||||
|
109: 'subtract',
|
||||||
|
110: 'decimal point',
|
||||||
|
111: 'divide',
|
||||||
|
112: 'f1',
|
||||||
|
113: 'f2',
|
||||||
|
114: 'f3',
|
||||||
|
115: 'f4',
|
||||||
|
116: 'f5',
|
||||||
|
117: 'f6',
|
||||||
|
118: 'f7',
|
||||||
|
119: 'f8',
|
||||||
|
120: 'f9',
|
||||||
|
121: 'f10',
|
||||||
|
122: 'f11',
|
||||||
|
123: 'f12',
|
||||||
|
124: 'f13',
|
||||||
|
125: 'f14',
|
||||||
|
126: 'f15',
|
||||||
|
127: 'f16',
|
||||||
|
128: 'f17',
|
||||||
|
129: 'f18',
|
||||||
|
130: 'f19',
|
||||||
|
131: 'f20',
|
||||||
|
132: 'f21',
|
||||||
|
133: 'f22',
|
||||||
|
134: 'f23',
|
||||||
|
135: 'f24',
|
||||||
|
136: 'f25',
|
||||||
|
137: 'f26',
|
||||||
|
138: 'f27',
|
||||||
|
139: 'f28',
|
||||||
|
140: 'f29',
|
||||||
|
141: 'f30',
|
||||||
|
142: 'f31',
|
||||||
|
143: 'f32',
|
||||||
|
144: 'num lock',
|
||||||
|
145: 'scroll lock',
|
||||||
|
151: 'airplane mode',
|
||||||
|
160: '^',
|
||||||
|
161: '!',
|
||||||
|
162: '؛ (arabic semicolon)',
|
||||||
|
163: '#',
|
||||||
|
164: '$',
|
||||||
|
165: 'ù',
|
||||||
|
166: 'page backward',
|
||||||
|
167: 'page forward',
|
||||||
|
168: 'refresh',
|
||||||
|
169: 'closing paren (AZERTY)',
|
||||||
|
170: '*',
|
||||||
|
171: '~ + * key',
|
||||||
|
172: 'home key',
|
||||||
|
173: 'minus (firefox), mute/unmute',
|
||||||
|
174: 'decrease volume level',
|
||||||
|
175: 'increase volume level',
|
||||||
|
176: 'next',
|
||||||
|
177: 'previous',
|
||||||
|
178: 'stop',
|
||||||
|
179: 'play/pause',
|
||||||
|
180: 'e-mail',
|
||||||
|
181: 'mute/unmute (firefox)',
|
||||||
|
182: 'decrease volume level (firefox)',
|
||||||
|
183: 'increase volume level (firefox)',
|
||||||
|
186: 'semi-colon / ñ',
|
||||||
|
187: 'equal sign',
|
||||||
|
188: 'comma',
|
||||||
|
189: 'dash',
|
||||||
|
190: 'period',
|
||||||
|
191: 'forward slash / ç',
|
||||||
|
192: 'grave accent / ñ / æ / ö',
|
||||||
|
193: '?, / or °',
|
||||||
|
194: 'numpad period (chrome)',
|
||||||
|
219: 'open bracket',
|
||||||
|
220: 'back slash',
|
||||||
|
221: 'close bracket / å',
|
||||||
|
222: 'single quote / ø / ä',
|
||||||
|
223: '`',
|
||||||
|
224: 'left or right ⌘ key (firefox)',
|
||||||
|
225: 'altgr',
|
||||||
|
226: '< /git >, left back slash',
|
||||||
|
230: 'GNOME Compose Key',
|
||||||
|
231: 'ç',
|
||||||
|
233: 'XF86Forward',
|
||||||
|
234: 'XF86Back',
|
||||||
|
235: 'non-conversion',
|
||||||
|
240: 'alphanumeric',
|
||||||
|
242: 'hiragana/katakana',
|
||||||
|
243: 'half-width/full-width',
|
||||||
|
244: 'kanji',
|
||||||
|
251: 'unlock trackpad (Chrome/Edge)',
|
||||||
|
255: 'toggle touchpad',
|
||||||
|
};
|
@ -73,7 +73,6 @@ export default {
|
|||||||
this.$set(this.loading, index, false);
|
this.$set(this.loading, index, false);
|
||||||
},
|
},
|
||||||
showButton(item) {
|
showButton(item) {
|
||||||
console.log(this.devPlugins)
|
|
||||||
return !this.devPlugins.filter(plugin => (plugin.name === item.name && plugin.type === 'prod')).length;
|
return !this.devPlugins.filter(plugin => (plugin.name === item.name && plugin.type === 'prod')).length;
|
||||||
},
|
},
|
||||||
...mapActions('main', ['downloadPlugin'])
|
...mapActions('main', ['downloadPlugin'])
|
||||||
|
@ -3,8 +3,13 @@
|
|||||||
<div class="dev-detail" v-if="prodPlugin.length">
|
<div class="dev-detail" v-if="prodPlugin.length">
|
||||||
<a-menu v-model="currentSelect" style="width: 256px; height: 100%" mode="vertical">
|
<a-menu v-model="currentSelect" style="width: 256px; height: 100%" mode="vertical">
|
||||||
<a-menu-item @click="currentSelect = [index]" v-for="(plugin, index) in prodPlugin" :key="index">
|
<a-menu-item @click="currentSelect = [index]" v-for="(plugin, index) in prodPlugin" :key="index">
|
||||||
<div>{{ plugin.pluginName }}</div>
|
<div class="menu-item">
|
||||||
<div>{{ plugin.description }}</div>
|
<img width="40" height="40" :src="plugin.icon" />
|
||||||
|
<div>
|
||||||
|
<div class="title">{{ plugin.pluginName }}</div>
|
||||||
|
<div class="desc">{{ plugin.description }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
</a-menu>
|
</a-menu>
|
||||||
<div class="plugin-detail">
|
<div class="plugin-detail">
|
||||||
|
@ -1,14 +1,150 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-result status="403" title="功能开发中" sub-title="敬请期待...">
|
<div class="pg-settings">
|
||||||
</a-result>
|
<div class="dev-detail">
|
||||||
|
<a-menu v-model="currentSelect" style="width: 256px; height: 100%" mode="vertical">
|
||||||
|
<a-menu-item :key="0">
|
||||||
|
偏好设置
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item :key="1">
|
||||||
|
本地启动文件
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item :key="2">
|
||||||
|
全局快捷键
|
||||||
|
</a-menu-item>
|
||||||
|
<a-menu-item :key="3">
|
||||||
|
所有关键字
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
<div class="settings-detail">
|
||||||
|
<div v-if="currentSelect[0] === 0">
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="title">快捷键</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">显示/隐藏快捷键</div>
|
||||||
|
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'showAndHidden')">{{ config.perf.shortCut.showAndHidden }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">插件分离快捷键</div>
|
||||||
|
<div class="value" tabIndex=-1 @keydown="(e) => changeShortCut(e, 'separate')">{{ config.perf.shortCut.separate }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="title">通用</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">开机启动</div>
|
||||||
|
<a-switch v-model:checked="config.perf.common.start" checked-children="开" un-checked-children="关"></a-switch>
|
||||||
|
</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">空格执行</div>
|
||||||
|
<a-switch v-model:checked="config.perf.common.space" checked-children="开" un-checked-children="关"></a-switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="title">本地搜索启动</div>
|
||||||
|
<div class="settings-item-li">
|
||||||
|
<div class="label">搜索启动应用&文件</div>
|
||||||
|
<a-switch v-model:checked="config.perf.local.search" checked-children="开" un-checked-children="关"></a-switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import keycodes from '../../../assets/keycode';
|
||||||
|
import {ipcRenderer, remote} from 'electron';
|
||||||
|
|
||||||
|
const opConfig = remote.getGlobal('opConfig');
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "settings.vue"
|
data() {
|
||||||
|
return {
|
||||||
|
currentSelect: [0],
|
||||||
|
config: JSON.parse(JSON.stringify(opConfig.get()))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
changeShortCut(e, key) {
|
||||||
|
let change = false;
|
||||||
|
if(e.altKey && e.keyCode !== 18){
|
||||||
|
const compose = `Option+${keycodes[e.keyCode].toUpperCase()}`;
|
||||||
|
this.config.perf.shortCut[key] = compose;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
if(e.ctrlKey && e.keyCode !== 17){
|
||||||
|
const compose = `Ctrl+${keycodes[e.keyCode].toUpperCase()}`;
|
||||||
|
this.config.perf.shortCut[key] = compose;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
if(e.shiftKey && e.keyCode !== 16){
|
||||||
|
const compose = `Shift+${keycodes[e.keyCode].toUpperCase()}`;
|
||||||
|
this.config.perf.shortCut[key] = compose;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
if(e.metaKey && e.keyCode !== 93){
|
||||||
|
const compose = `Command+${keycodes[e.keyCode].toUpperCase()}`;
|
||||||
|
this.config.perf.shortCut[key] = compose;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
config: {
|
||||||
|
deep: true,
|
||||||
|
handler() {
|
||||||
|
opConfig.set('perf', this.config.perf);
|
||||||
|
ipcRenderer.send('re-register');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="less">
|
||||||
|
.pg-settings {
|
||||||
|
height: calc(~'100vh - 110px');
|
||||||
|
overflow: auto;
|
||||||
|
.dev-detail {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
background: #F8FAFC;
|
||||||
|
}
|
||||||
|
.settings-detail {
|
||||||
|
padding: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
flex: 1;
|
||||||
|
.setting-item {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
.title {
|
||||||
|
color: #6C9FE2;
|
||||||
|
font-size: 15px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.settings-item-li {
|
||||||
|
padding-left: 20px;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
.label {
|
||||||
|
color: #646464;
|
||||||
|
}
|
||||||
|
.value {
|
||||||
|
width: 300px;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
color: #6C9FE2;
|
||||||
|
font-size: 14px;
|
||||||
|
height: 24px;
|
||||||
|
font-weight: lighter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -229,7 +229,8 @@ const actions = {
|
|||||||
...config,
|
...config,
|
||||||
id: uuidv4(),
|
id: uuidv4(),
|
||||||
sourceFile: `${fileUrl}/${config.main}`,
|
sourceFile: `${fileUrl}/${config.main}`,
|
||||||
type: 'prod'
|
type: 'prod',
|
||||||
|
icon: payload.logo
|
||||||
};
|
};
|
||||||
commit('commonUpdate', {
|
commit('commonUpdate', {
|
||||||
devPlugins: [pluginConfig, ...state.devPlugins],
|
devPlugins: [pluginConfig, ...state.devPlugins],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user