diff --git a/public/listener.js b/public/listener.js new file mode 100644 index 0000000..36c51bb --- /dev/null +++ b/public/listener.js @@ -0,0 +1,56 @@ +const { chmodSync, existsSync } = require('fs') +const { EventEmitter } = require('events') +const path = require('path') +const { execFile } = require('child_process') + +class ClipboardEventListener extends EventEmitter { + constructor() { + super() + this.child = null + this.listening = false + } + startListening(dbPath) { + const targetMap = { + win32: 'clipboard-event-handler-win32.exe', + linux: 'clipboard-event-handler-linux' + } + const { platform } = process + const target = path.resolve( + dbPath.split('_utools_clipboard_manager_storage')[0], + targetMap[platform] + ) + if (!existsSync(target)) { + this.emit('error', '剪贴板监听程序不存在') + return + } + if (platform === 'win32') { + this.child = execFile(target) + } else if (platform === 'linux') { + chmodSync(target, 0o755) + this.child = execFile(target) + } else { + throw 'Not yet supported' + } + this.child.stdout.on('data', (data) => { + if (data.trim() === 'CLIPBOARD_CHANGE') { + this.emit('change') + } + }) + this.child.stdout.on('close', () => { + this.emit('close') + this.listening = false + }) + this.child.stdout.on('exit', () => { + this.emit('exit') + this.listening = false + }) + this.listening = true + } + stopListening() { + const res = this.child.kill() + this.listening = false + return res + } +} + +module.exports = new ClipboardEventListener() diff --git a/public/node_modules/clipboard-event/LICENSE b/public/node_modules/clipboard-event/LICENSE deleted file mode 100644 index 1b0701b..0000000 --- a/public/node_modules/clipboard-event/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Sudhakar R - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/public/node_modules/clipboard-event/index.js b/public/node_modules/clipboard-event/index.js deleted file mode 100644 index 86e615d..0000000 --- a/public/node_modules/clipboard-event/index.js +++ /dev/null @@ -1,62 +0,0 @@ -const { chmodSync, existsSync, mkdirSync, copyFileSync } = require('fs') -const { EventEmitter } = require('events') -const path = require('path') -const { execFile } = require('child_process') -const homeDir = require('os').homedir() - -class ClipboardEventListener extends EventEmitter { - constructor() { - super() - this.child = null - this.listening = false - } - startListening() { - const { platform } = process - if (platform === 'win32') { - this.child = execFile(path.join(__dirname, 'platform/clipboard-event-handler-win32.exe')) - } else if (platform === 'linux') { - // linux: cant execFile without chmod, and cant chmod in app.asar - // so we need to copy the file to /usr/bin - const targetPath = path.resolve(homeDir, '.local', 'bin') - const target = path.resolve(targetPath, 'clipboard-event-handler-linux') - const p = path.join(__dirname, 'platform/clipboard-event-handler-linux') - try { - if (!existsSync(targetPath)) { - // bin dir doesnt exist, create it - mkdirSync(targetPath) - } - if (!existsSync(target)) { - // copy the file - copyFileSync(p, target) - chmodSync(target, 0o755) - } - } catch (error) { - this.emit('error', error) - } - this.child = execFile(target) - } else { - throw 'Not yet supported' - } - this.child.stdout.on('data', (data) => { - if (data.trim() === 'CLIPBOARD_CHANGE') { - this.emit('change') - } - }) - this.child.stdout.on('close', () => { - this.emit('close') - this.listening = false - }) - this.child.stdout.on('exit', () => { - this.emit('exit') - this.listening = false - }) - this.listening = true - } - stopListening() { - const res = this.child.kill() - this.listening = false - return res - } -} - -module.exports = new ClipboardEventListener() diff --git a/public/node_modules/clipboard-event/platform/clipboard-event-handler-linux b/public/node_modules/clipboard-event/platform/clipboard-event-handler-linux deleted file mode 100644 index 0f6d129..0000000 Binary files a/public/node_modules/clipboard-event/platform/clipboard-event-handler-linux and /dev/null differ diff --git a/public/node_modules/clipboard-event/platform/clipboard-event-handler-win32.exe b/public/node_modules/clipboard-event/platform/clipboard-event-handler-win32.exe deleted file mode 100644 index 6341183..0000000 Binary files a/public/node_modules/clipboard-event/platform/clipboard-event-handler-win32.exe and /dev/null differ diff --git a/public/preload.js b/public/preload.js index d9052e7..725a9e8 100644 --- a/public/preload.js +++ b/public/preload.js @@ -1,6 +1,6 @@ const { existsSync, readFileSync, writeFileSync, mkdirSync } = require('fs') const crypto = require('crypto') -const listener = require('clipboard-event') +const listener = require('./listener') const { clipboard } = require('electron') const time = require('./time') diff --git a/src/global/initPlugin.js b/src/global/initPlugin.js index ed042f5..6727c02 100644 --- a/src/global/initPlugin.js +++ b/src/global/initPlugin.js @@ -214,31 +214,7 @@ export default function initPlugin() { db.addItem(item) } - const registerClipEvent = (listener) => { - const exitHandler = () => { - utools.showNotification('剪贴板监听异常退出 请重启插件以开启监听') - utools.outPlugin() - } - const errorHandler = (error) => { - const info = '请手动安装 clipboard-event-handler-linux 到 ~/.local/bin' - const site = 'https://ziuchen.gitee.io/project/ClipboardManager/guide/' - utools.showNotification('启动剪贴板监听出错: ' + error + info) - utools.shellOpenExternal(site) - utools.outPlugin() - } - listener - .on('change', handleClipboardChange) - .on('close', exitHandler) - .on('exit', exitHandler) - .on('error', (error) => errorHandler(error)) - } - - if (!utools.isMacOs()) { - // 首次启动插件 即开启监听 - registerClipEvent(listener) - listener.startListening() - } else { - // macos 由于无法执行 clipboard-event-handler-mac 所以使用旧方法 + const addCommonListener = () => { let prev = db.dataBase.data[0] || {} function loop() { time.sleep(300).then(loop) @@ -256,11 +232,39 @@ export default function initPlugin() { loop() } + const registerClipEvent = (listener) => { + const exitHandler = () => { + utools.showNotification('剪贴板监听异常退出 请重启插件以开启监听') + utools.outPlugin() + } + const errorHandler = (error) => { + const info = '请手动安装 clipboard-event-handler 到 剪贴板数据库目录' + const site = 'https://ziuchen.gitee.io/project/ClipboardManager/guide/' + utools.showNotification('启动剪贴板监听出错: ' + error + info) + utools.shellOpenExternal(site) + addCommonListener() + } + listener + .on('change', handleClipboardChange) + .on('close', exitHandler) + .on('exit', exitHandler) + .on('error', (error) => errorHandler(error)) + } + + if (!utools.isMacOs()) { + // 首次启动插件 即开启监听 + registerClipEvent(listener) + listener.startListening(setting.database.path) + } else { + // macos 由于无法执行 clipboard-event-handler-mac 所以使用旧方法 + addCommonListener() + } + utools.onPluginEnter(() => { if (!listener.listening && !utools.isMacOs()) { // 进入插件后 如果监听已关闭 则重新开启监听 registerClipEvent(listener) - listener.startListening() + listener.startListening(setting.database.path) } toTop() resetNav() diff --git a/src/views/Main.vue b/src/views/Main.vue index 26e126b..a809755 100644 --- a/src/views/Main.vue +++ b/src/views/Main.vue @@ -226,15 +226,17 @@ onMounted(() => { updateShowList(activeTab.value) // 定期检查更新 - if (!utools.isMacOs) { + if (!utools.isMacOs() && window.listener.listening) { + // 非macOS系统且监听器开启时 window.listener.on('change', () => { list.value = window.db.dataBase.data updateShowList(activeTab.value) }) } else { - // macos + // macOS且监听器启动失败时 let prev = {} setInterval(() => { + console.log('interval') const now = window.db.dataBase.data[0] if (prev?.id === now?.id) { } else {