mirror of
https://github.com/Kuingsmile/PicList.git
synced 2025-02-02 19:18:13 -05:00
🔨 Refactor: change macos clipboard watcher implementment
This commit is contained in:
parent
350e6a376a
commit
1d0c8dba53
@ -20,6 +20,7 @@ import { T } from '~/main/i18n'
|
|||||||
import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion'
|
import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion'
|
||||||
import { buildPicBedListMenu } from '~/main/events/remotes/menu'
|
import { buildPicBedListMenu } from '~/main/events/remotes/menu'
|
||||||
import clipboardListener from 'clipboard-event'
|
import clipboardListener from 'clipboard-event'
|
||||||
|
import clipboardPoll from '~/main/utils/clipboardPoll'
|
||||||
import picgo from '../../core/picgo'
|
import picgo from '../../core/picgo'
|
||||||
import { uploadClipboardFiles } from '../uploader/apis'
|
import { uploadClipboardFiles } from '../uploader/apis'
|
||||||
let contextMenu: Menu | null
|
let contextMenu: Menu | null
|
||||||
@ -43,8 +44,8 @@ export function setDockMenu () {
|
|||||||
label: T('START_WATCH_CLIPBOARD'),
|
label: T('START_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', true)
|
db.set('settings.isListeningClipboard', true)
|
||||||
clipboardListener.startListening()
|
clipboardPoll.startListening()
|
||||||
clipboardListener.on('change', () => {
|
clipboardPoll.on('change', () => {
|
||||||
picgo.log.info('clipboard changed')
|
picgo.log.info('clipboard changed')
|
||||||
uploadClipboardFiles()
|
uploadClipboardFiles()
|
||||||
})
|
})
|
||||||
@ -56,7 +57,7 @@ export function setDockMenu () {
|
|||||||
label: T('STOP_WATCH_CLIPBOARD'),
|
label: T('STOP_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', false)
|
db.set('settings.isListeningClipboard', false)
|
||||||
clipboardListener.stopListening()
|
clipboardPoll.stopListening()
|
||||||
setDockMenu()
|
setDockMenu()
|
||||||
},
|
},
|
||||||
enabled: isListeningClipboard
|
enabled: isListeningClipboard
|
||||||
@ -66,6 +67,7 @@ export function setDockMenu () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createMenu () {
|
export function createMenu () {
|
||||||
|
const ClipboardWatcher = process.platform === 'darwin' ? clipboardPoll : clipboardListener
|
||||||
const submenu = buildPicBedListMenu()
|
const submenu = buildPicBedListMenu()
|
||||||
const isListeningClipboard = db.get('settings.isListeningClipboard') || false
|
const isListeningClipboard = db.get('settings.isListeningClipboard') || false
|
||||||
const appMenu = Menu.buildFromTemplate([
|
const appMenu = Menu.buildFromTemplate([
|
||||||
@ -87,8 +89,8 @@ export function createMenu () {
|
|||||||
label: T('START_WATCH_CLIPBOARD'),
|
label: T('START_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', true)
|
db.set('settings.isListeningClipboard', true)
|
||||||
clipboardListener.startListening()
|
ClipboardWatcher.startListening()
|
||||||
clipboardListener.on('change', () => {
|
ClipboardWatcher.on('change', () => {
|
||||||
picgo.log.info('clipboard changed')
|
picgo.log.info('clipboard changed')
|
||||||
uploadClipboardFiles()
|
uploadClipboardFiles()
|
||||||
})
|
})
|
||||||
@ -100,7 +102,7 @@ export function createMenu () {
|
|||||||
label: T('STOP_WATCH_CLIPBOARD'),
|
label: T('STOP_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', false)
|
db.set('settings.isListeningClipboard', false)
|
||||||
clipboardListener.stopListening()
|
ClipboardWatcher.stopListening()
|
||||||
createMenu()
|
createMenu()
|
||||||
},
|
},
|
||||||
enabled: isListeningClipboard
|
enabled: isListeningClipboard
|
||||||
@ -134,6 +136,7 @@ export function createMenu () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createContextMenu () {
|
export function createContextMenu () {
|
||||||
|
const ClipboardWatcher = process.platform === 'darwin' ? clipboardPoll : clipboardListener
|
||||||
const isListeningClipboard = db.get('settings.isListeningClipboard') || false
|
const isListeningClipboard = db.get('settings.isListeningClipboard') || false
|
||||||
if (process.platform === 'darwin' || process.platform === 'win32') {
|
if (process.platform === 'darwin' || process.platform === 'win32') {
|
||||||
const submenu = buildPicBedListMenu()
|
const submenu = buildPicBedListMenu()
|
||||||
@ -159,8 +162,8 @@ export function createContextMenu () {
|
|||||||
label: T('START_WATCH_CLIPBOARD'),
|
label: T('START_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', true)
|
db.set('settings.isListeningClipboard', true)
|
||||||
clipboardListener.startListening()
|
ClipboardWatcher.startListening()
|
||||||
clipboardListener.on('change', () => {
|
ClipboardWatcher.on('change', () => {
|
||||||
picgo.log.info('clipboard changed')
|
picgo.log.info('clipboard changed')
|
||||||
uploadClipboardFiles()
|
uploadClipboardFiles()
|
||||||
})
|
})
|
||||||
@ -172,7 +175,7 @@ export function createContextMenu () {
|
|||||||
label: T('STOP_WATCH_CLIPBOARD'),
|
label: T('STOP_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', false)
|
db.set('settings.isListeningClipboard', false)
|
||||||
clipboardListener.stopListening()
|
ClipboardWatcher.stopListening()
|
||||||
createContextMenu()
|
createContextMenu()
|
||||||
},
|
},
|
||||||
enabled: isListeningClipboard
|
enabled: isListeningClipboard
|
||||||
@ -273,8 +276,8 @@ export function createContextMenu () {
|
|||||||
label: T('START_WATCH_CLIPBOARD'),
|
label: T('START_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', true)
|
db.set('settings.isListeningClipboard', true)
|
||||||
clipboardListener.startListening()
|
ClipboardWatcher.startListening()
|
||||||
clipboardListener.on('change', () => {
|
ClipboardWatcher.on('change', () => {
|
||||||
picgo.log.info('clipboard changed')
|
picgo.log.info('clipboard changed')
|
||||||
uploadClipboardFiles()
|
uploadClipboardFiles()
|
||||||
})
|
})
|
||||||
@ -286,7 +289,7 @@ export function createContextMenu () {
|
|||||||
label: T('STOP_WATCH_CLIPBOARD'),
|
label: T('STOP_WATCH_CLIPBOARD'),
|
||||||
click () {
|
click () {
|
||||||
db.set('settings.isListeningClipboard', false)
|
db.set('settings.isListeningClipboard', false)
|
||||||
clipboardListener.stopListening()
|
ClipboardWatcher.stopListening()
|
||||||
createContextMenu()
|
createContextMenu()
|
||||||
},
|
},
|
||||||
enabled: isListeningClipboard
|
enabled: isListeningClipboard
|
||||||
|
@ -45,6 +45,7 @@ import { T } from '~/main/i18n'
|
|||||||
import { UpdateInfo, autoUpdater } from 'electron-updater'
|
import { UpdateInfo, autoUpdater } from 'electron-updater'
|
||||||
import updateChecker from '../utils/updateChecker'
|
import updateChecker from '../utils/updateChecker'
|
||||||
import clipboardListener from 'clipboard-event'
|
import clipboardListener from 'clipboard-event'
|
||||||
|
import clipboardPoll from '../utils/clipboardPoll'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import { CLIPBOARD_IMAGE_FOLDER } from '~/universal/utils/static'
|
import { CLIPBOARD_IMAGE_FOLDER } from '~/universal/utils/static'
|
||||||
import fs from 'fs-extra'
|
import fs from 'fs-extra'
|
||||||
@ -140,6 +141,18 @@ class LifeCycle {
|
|||||||
}
|
}
|
||||||
windowManager.create(IWindowList.TRAY_WINDOW)
|
windowManager.create(IWindowList.TRAY_WINDOW)
|
||||||
windowManager.create(IWindowList.SETTING_WINDOW)
|
windowManager.create(IWindowList.SETTING_WINDOW)
|
||||||
|
const isAutoListenClipboard = db.get('settings.isAutoListenClipboard') || false
|
||||||
|
const ClipboardWatcher = process.platform === 'darwin' ? clipboardPoll : clipboardListener
|
||||||
|
if (isAutoListenClipboard) {
|
||||||
|
db.set('settings.isListeningClipboard', true)
|
||||||
|
ClipboardWatcher.startListening()
|
||||||
|
ClipboardWatcher.on('change', () => {
|
||||||
|
picgo.log.info('clipboard changed')
|
||||||
|
uploadClipboardFiles()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
db.set('settings.isListeningClipboard', false)
|
||||||
|
}
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
setDockMenu()
|
setDockMenu()
|
||||||
}
|
}
|
||||||
@ -202,17 +215,6 @@ class LifeCycle {
|
|||||||
settingWindow.show()
|
settingWindow.show()
|
||||||
settingWindow.focus()
|
settingWindow.focus()
|
||||||
}
|
}
|
||||||
const isAutoListenClipboard = db.get('settings.isAutoListenClipboard') || false
|
|
||||||
if (isAutoListenClipboard) {
|
|
||||||
db.set('settings.isListeningClipboard', true)
|
|
||||||
clipboardListener.startListening()
|
|
||||||
clipboardListener.on('change', () => {
|
|
||||||
picgo.log.info('clipboard changed')
|
|
||||||
uploadClipboardFiles()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
db.set('settings.isListeningClipboard', false)
|
|
||||||
}
|
|
||||||
const clipboardDir = path.join(picgo.baseDir, CLIPBOARD_IMAGE_FOLDER)
|
const clipboardDir = path.join(picgo.baseDir, CLIPBOARD_IMAGE_FOLDER)
|
||||||
fs.ensureDir(clipboardDir)
|
fs.ensureDir(clipboardDir)
|
||||||
}
|
}
|
||||||
|
48
src/main/utils/clipboardPoll.ts
Normal file
48
src/main/utils/clipboardPoll.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import { clipboard, nativeImage } from 'electron'
|
||||||
|
import { EventEmitter } from 'events'
|
||||||
|
|
||||||
|
class ClipboardWatcher extends EventEmitter {
|
||||||
|
lastImage: Electron.NativeImage | null
|
||||||
|
timer: NodeJS.Timeout | null
|
||||||
|
|
||||||
|
constructor () {
|
||||||
|
super()
|
||||||
|
this.lastImage = null
|
||||||
|
this.timer = null
|
||||||
|
}
|
||||||
|
|
||||||
|
startListening (watchDelay = 500) {
|
||||||
|
if (this.timer) {
|
||||||
|
clearInterval(this.timer)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.timer = setInterval(() => {
|
||||||
|
const image = clipboard.readImage()
|
||||||
|
if (image.isEmpty()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataUrl = image.toDataURL()
|
||||||
|
const currentImage = nativeImage.createFromDataURL(dataUrl)
|
||||||
|
|
||||||
|
if (this.lastImage) {
|
||||||
|
const lastDataUrl = this.lastImage.toDataURL()
|
||||||
|
if (lastDataUrl === dataUrl) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastImage = currentImage
|
||||||
|
this.emit('change', currentImage)
|
||||||
|
}, watchDelay)
|
||||||
|
}
|
||||||
|
|
||||||
|
stopListening () {
|
||||||
|
if (this.timer) {
|
||||||
|
clearInterval(this.timer)
|
||||||
|
this.timer = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new ClipboardWatcher()
|
Loading…
Reference in New Issue
Block a user