mirror of
https://github.com/ZiuChen/ClipboardManager.git
synced 2025-06-08 22:54:09 +08:00
parent
7d551e93ea
commit
621911524d
@ -7,6 +7,7 @@
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const crypto = require('crypto')
|
const crypto = require('crypto')
|
||||||
const { clipboard } = require('electron')
|
const { clipboard } = require('electron')
|
||||||
|
const time = require('./time')
|
||||||
|
|
||||||
const homePath = utools.getPath('home')
|
const homePath = utools.getPath('home')
|
||||||
const userDataPath = utools.getPath('userData')
|
const userDataPath = utools.getPath('userData')
|
||||||
@ -17,7 +18,6 @@ const isWindows = utools.isWindows()
|
|||||||
const DBPath = `${isMacOs ? userDataPath : homePath}${isWindows ? '\\' : '/'}${dbName}`
|
const DBPath = `${isMacOs ? userDataPath : homePath}${isWindows ? '\\' : '/'}${dbName}`
|
||||||
|
|
||||||
let globalImageOversize = false
|
let globalImageOversize = false
|
||||||
let globalTimmerSet = false
|
|
||||||
|
|
||||||
class DB {
|
class DB {
|
||||||
constructor(path) {
|
constructor(path) {
|
||||||
@ -119,46 +119,46 @@ class DB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const pbpaste = async () => {
|
const pbpaste = () => {
|
||||||
return new Promise((res) => {
|
// file
|
||||||
// file
|
const files = utools.getCopyedFiles() // null | Array
|
||||||
const files = utools.getCopyedFiles() // null | Array
|
if (files) {
|
||||||
if (files) {
|
return {
|
||||||
res({
|
type: 'file',
|
||||||
type: 'file',
|
data: JSON.stringify(files)
|
||||||
data: JSON.stringify(files)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
// text
|
}
|
||||||
const text = clipboard.readText()
|
// text
|
||||||
if (text.trim()) res({ type: 'text', data: text })
|
const text = clipboard.readText()
|
||||||
// image
|
if (text.trim()) return { type: 'text', data: text }
|
||||||
const image = clipboard.readImage() // 大图卡顿来源
|
// image
|
||||||
const data = image.toDataURL()
|
const image = clipboard.readImage() // 大图卡顿来源
|
||||||
globalImageOversize = data.length > 4e5
|
const data = image.toDataURL()
|
||||||
if (!image.isEmpty()) {
|
globalImageOversize = data.length > 4e5
|
||||||
res({
|
if (!image.isEmpty()) {
|
||||||
type: 'image',
|
return {
|
||||||
data: data
|
type: 'image',
|
||||||
})
|
data: data
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const watchClipboard = async (db, fn) => {
|
const watchClipboard = async (db, fn) => {
|
||||||
let prev = db.dataBase.data[0] || {}
|
let prev = db.dataBase.data[0] || {}
|
||||||
return setInterval(() => {
|
function loop() {
|
||||||
pbpaste().then((item) => {
|
time.sleep(250).then(loop)
|
||||||
item.id = crypto.createHash('md5').update(item.data).digest('hex')
|
const item = pbpaste()
|
||||||
if (item && prev.id != item.id) {
|
if (!item) return
|
||||||
// 剪切板元素 与最近一次复制内容不同
|
item.id = crypto.createHash('md5').update(item.data).digest('hex')
|
||||||
prev = item
|
if (item && prev.id != item.id) {
|
||||||
fn(item)
|
// 剪切板元素 与最近一次复制内容不同
|
||||||
} else {
|
prev = item
|
||||||
// 剪切板元素 与上次复制内容相同
|
fn(item)
|
||||||
}
|
} else {
|
||||||
})
|
// 剪切板元素 与上次复制内容相同
|
||||||
}, 250)
|
}
|
||||||
|
}
|
||||||
|
loop()
|
||||||
}
|
}
|
||||||
|
|
||||||
const copy = (item, isHideMainWindow = true) => {
|
const copy = (item, isHideMainWindow = true) => {
|
||||||
@ -210,39 +210,17 @@ let timmer = watchClipboard(db, (item) => {
|
|||||||
db.addItem(item)
|
db.addItem(item)
|
||||||
})
|
})
|
||||||
|
|
||||||
globalTimmerSet = true // 计时器成功添加
|
|
||||||
|
|
||||||
utools.onPluginEnter(() => {
|
utools.onPluginEnter(() => {
|
||||||
if (globalImageOversize) {
|
if (globalImageOversize) {
|
||||||
utools.copyText('ImageOverSized')
|
utools.copyText('ImageOverSized')
|
||||||
globalImageOversize = false
|
globalImageOversize = false
|
||||||
}
|
}
|
||||||
if (!globalTimmerSet) {
|
|
||||||
// 定时器被清除了 重新添加计时器
|
|
||||||
// same to code above
|
|
||||||
timmer = watchClipboard(db, (item) => {
|
|
||||||
if (!item) return
|
|
||||||
if (db.updateItemViaId(item.id)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
item.createTime = new Date().getTime()
|
|
||||||
item.updateTime = new Date().getTime()
|
|
||||||
db.addItem(item)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
focus()
|
focus()
|
||||||
select() // 进入插件将搜索框内容全选
|
select() // 进入插件将搜索框内容全选
|
||||||
toTop()
|
toTop()
|
||||||
resetNav()
|
resetNav()
|
||||||
})
|
})
|
||||||
|
|
||||||
utools.onPluginOut((processExit) => {
|
|
||||||
// 卡顿来源: 似乎插件每次启动 uTools不会清除插件设置的 interval定时器
|
|
||||||
// 插件重复进入/退出会产生多个计时器导致插件卡退
|
|
||||||
// 插件退出 清除计时器 插件隐藏后台 不清除
|
|
||||||
processExit ? (clearInterval(timmer), (globalTimmerSet = false)) : (globalTimmerSet = true)
|
|
||||||
})
|
|
||||||
|
|
||||||
window.db = db
|
window.db = db
|
||||||
window.copy = copy
|
window.copy = copy
|
||||||
window.paste = paste
|
window.paste = paste
|
||||||
|
68
public/time.js
Normal file
68
public/time.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// author: inu1255
|
||||||
|
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
function newPromise(fn) {
|
||||||
|
let a, b
|
||||||
|
var tmp = {
|
||||||
|
resolve(x) {
|
||||||
|
if (this.pending) {
|
||||||
|
a(x)
|
||||||
|
this.resolved = true
|
||||||
|
this.pending = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
reject(e) {
|
||||||
|
if (this.pending) {
|
||||||
|
b(e)
|
||||||
|
this.rejectd = true
|
||||||
|
this.pending = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
pending: true,
|
||||||
|
resolved: false,
|
||||||
|
rejected: false
|
||||||
|
}
|
||||||
|
/** @type {Promise<T>} */
|
||||||
|
var pms = new Promise(function (resolve, reject) {
|
||||||
|
a = resolve
|
||||||
|
b = reject
|
||||||
|
if (fn) fn(tmp.resolve, tmp.reject)
|
||||||
|
})
|
||||||
|
return Object.assign(pms, tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
let cbIdx = 1
|
||||||
|
const cbMap = new Map()
|
||||||
|
function getWorker() {
|
||||||
|
if (getWorker.worker) return getWorker.worker
|
||||||
|
const worker = new Worker(path.join(__dirname, 'time.worker.js'))
|
||||||
|
getWorker.worker = worker
|
||||||
|
worker.onmessage = (e) => {
|
||||||
|
if (e.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,
|
||||||
|
args,
|
||||||
|
cb
|
||||||
|
})
|
||||||
|
return pms
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return call('sleep', [ms])
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.sleep = sleep
|
21
public/time.worker.js
Normal file
21
public/time.worker.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// 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, err: 'no such method' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
apis[method].apply(null, args).then(
|
||||||
|
(res) => postMessage({ cb, data: res }),
|
||||||
|
(err) => postMessage({ cb, err })
|
||||||
|
)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user