From b4dc9f803bf4cae24f1e51b80db4a0534a893d58 Mon Sep 17 00:00:00 2001 From: ZiuChen <457353192@qq.com> Date: Wed, 21 Sep 2022 16:33:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8C=BA=E5=88=86Mac=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=20=E9=87=87=E7=94=A8=E6=97=A7=E7=9A=84=E5=89=AA=E8=B4=B4?= =?UTF-8?q?=E6=9D=BF=E7=9B=91=E5=90=AC=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/node_modules/clipboard-event/index.js | 2 - .../platform/clipboard-event-handler-mac | Bin 75664 -> 0 bytes public/preload.js | 4 +- public/time.js | 2 + public/time.worker.js | 2 + src/global/initPlugin.js | 69 +++++++++++++----- src/views/Main.vue | 23 +++++- 7 files changed, 75 insertions(+), 27 deletions(-) delete mode 100644 public/node_modules/clipboard-event/platform/clipboard-event-handler-mac create mode 100644 public/time.js create mode 100644 public/time.worker.js diff --git a/public/node_modules/clipboard-event/index.js b/public/node_modules/clipboard-event/index.js index 2439737..86e615d 100644 --- a/public/node_modules/clipboard-event/index.js +++ b/public/node_modules/clipboard-event/index.js @@ -34,8 +34,6 @@ class ClipboardEventListener extends EventEmitter { this.emit('error', error) } this.child = execFile(target) - } else if (platform === 'darwin') { - this.child = execFile(path.join(__dirname, 'platform/clipboard-event-handler-mac')) } else { throw 'Not yet supported' } diff --git a/public/node_modules/clipboard-event/platform/clipboard-event-handler-mac b/public/node_modules/clipboard-event/platform/clipboard-event-handler-mac deleted file mode 100644 index d0eee8eb5f314f74a082d07fb3575ce78ef286bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75664 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.data&&cbMap.has(e.data.cb)){cbMap.get(e.data.cb).apply(null,e.data.args)}};return worker}function call(method,args){const cb=cbIdx++;let pms=newPromise();cbMap.set(cb,function(err,data){if(err)pms.reject(err);else pms.resolve(data)});getWorker().postMessage({method:method,args:args,cb:cb});return pms}function sleep(ms){return call("sleep",[ms])}exports.sleep=sleep; \ No newline at end of file diff --git a/public/time.worker.js b/public/time.worker.js new file mode 100644 index 0000000..97b632d --- /dev/null +++ b/public/time.worker.js @@ -0,0 +1,2 @@ +// time.worker.js author: inu1255 +const apis={sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}};onmessage=event=>{const data=event.data;if(!data)return;const{cb,method,args}=data;if(!apis[method]){postMessage({cb:cb,err:"no such method"});return}apis[method].apply(null,args).then(res=>postMessage({cb:cb,data:res}),err=>postMessage({cb:cb,err:err}))}; \ No newline at end of file diff --git a/src/global/initPlugin.js b/src/global/initPlugin.js index 3c2e9ce..ed042f5 100644 --- a/src/global/initPlugin.js +++ b/src/global/initPlugin.js @@ -1,5 +1,14 @@ -const { utools, existsSync, readFileSync, writeFileSync, mkdirSync, crypto, listener, clipboard } = - window.exports +const { + utools, + existsSync, + readFileSync, + writeFileSync, + mkdirSync, + crypto, + listener, + clipboard, + time +} = window.exports import setting from './readSetting' export default function initPlugin() { @@ -192,6 +201,19 @@ export default function initPlugin() { const toTop = () => (document.scrollingElement.scrollTop = 0) const resetNav = () => document.querySelectorAll('.clip-switch-item')[0]?.click() + const handleClipboardChange = (item = pbpaste()) => { + if (!item) return + item.id = crypto.createHash('md5').update(item.data).digest('hex') + if (db.updateItemViaId(item.id)) { + // 在库中 由 updateItemViaId 更新 updateTime + return + } + // 不在库中 由 addItem 添加 + item.createTime = new Date().getTime() + item.updateTime = new Date().getTime() + db.addItem(item) + } + const registerClipEvent = (listener) => { const exitHandler = () => { utools.showNotification('剪贴板监听异常退出 请重启插件以开启监听') @@ -205,30 +227,37 @@ export default function initPlugin() { utools.outPlugin() } listener - .on('change', () => { - const item = pbpaste() - if (!item) return - item.id = crypto.createHash('md5').update(item.data).digest('hex') - if (db.updateItemViaId(item.id)) { - // 在库中 由 updateItemViaId 更新 updateTime - return - } - // 不在库中 由 addItem 添加 - item.createTime = new Date().getTime() - item.updateTime = new Date().getTime() - db.addItem(item) - }) + .on('change', handleClipboardChange) .on('close', exitHandler) .on('exit', exitHandler) .on('error', (error) => errorHandler(error)) } - // 首次启动插件 即开启监听 - registerClipEvent(listener) - listener.startListening() + if (!utools.isMacOs()) { + // 首次启动插件 即开启监听 + registerClipEvent(listener) + listener.startListening() + } else { + // macos 由于无法执行 clipboard-event-handler-mac 所以使用旧方法 + let prev = db.dataBase.data[0] || {} + function loop() { + time.sleep(300).then(loop) + const item = pbpaste() + if (!item) return + item.id = crypto.createHash('md5').update(item.data).digest('hex') + if (item && prev.id != item.id) { + // 剪切板元素 与最近一次复制内容不同 + prev = item + handleClipboardChange(item) + } else { + // 剪切板元素 与上次复制内容相同 + } + } + loop() + } utools.onPluginEnter(() => { - if (!listener.listening) { + if (!listener.listening && !utools.isMacOs()) { // 进入插件后 如果监听已关闭 则重新开启监听 registerClipEvent(listener) listener.startListening() @@ -238,7 +267,7 @@ export default function initPlugin() { }) utools.onPluginOut((processExit) => { - if (processExit) { + if (processExit && !utools.isMacOs()) { utools.showNotification('剪贴板监听异常退出 请重启插件以开启监听') listener.stopListening() } diff --git a/src/views/Main.vue b/src/views/Main.vue index 1f0aee1..26e126b 100644 --- a/src/views/Main.vue +++ b/src/views/Main.vue @@ -226,10 +226,25 @@ onMounted(() => { updateShowList(activeTab.value) // 定期检查更新 - window.listener.on('change', () => { - list.value = window.db.dataBase.data - updateShowList(activeTab.value) - }) + if (!utools.isMacOs) { + window.listener.on('change', () => { + list.value = window.db.dataBase.data + updateShowList(activeTab.value) + }) + } else { + // macos + let prev = {} + setInterval(() => { + const now = window.db.dataBase.data[0] + if (prev?.id === now?.id) { + } else { + // 有更新 + list.value = window.db.dataBase.data + updateShowList(activeTab.value) + prev = now + } + }, 800) + } // 监听搜索框 watch(filterText, (val) => updateShowList(activeTab.value))