From 73c6713b90e30a8853c8ce760af1226463573601 Mon Sep 17 00:00:00 2001 From: viarotel Date: Mon, 16 Oct 2023 11:53:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=9A=80=20=E5=AF=B9=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=E5=92=8C=E4=BB=A3=E7=A0=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=BF=9B=E8=A1=8C=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-assets.yml | 20 +- .gitignore | 2 +- binary.js | 2 +- dev-publish.yml | 4 + electron-builder.json | 51 +++++ electron-builder.json5 | 48 ----- .../{ipcManage => events}/handles/index.js | 0 electron/{ipcManage => events}/index.js | 0 .../{ipcManage => events}/updater/index.js | 20 +- electron/{plugins => exposes}/adbkit/index.js | 6 +- .../{plugins => exposes}/electron/index.js | 0 electron/{plugins => exposes}/index.js | 2 +- electron/{plugins => exposes}/scrcpy/index.js | 4 +- electron/loading/index.js | 175 ++++++++++++++++++ electron/main.js | 48 ++++- electron/preload.js | 5 +- .../resources/{ => extra}/core/AdbWinApi.dll | Bin .../{ => extra}/core/AdbWinUsbApi.dll | Bin electron/resources/{ => extra}/core/SDL2.dll | Bin electron/resources/{ => extra}/core/adb.exe | Bin .../resources/{ => extra}/core/avcodec-60.dll | Bin .../{ => extra}/core/avformat-60.dll | Bin .../resources/{ => extra}/core/avutil-58.dll | Bin electron/resources/{ => extra}/core/icon.png | Bin .../{ => extra}/core/msys-usb-1.0.dll | Bin .../{ => extra}/core/open_a_terminal_here.bat | 0 .../{ => extra}/core/scrcpy-console.bat | 0 .../{ => extra}/core/scrcpy-noconsole.vbs | 0 .../resources/{ => extra}/core/scrcpy-server | Bin .../resources/{ => extra}/core/scrcpy.exe | Bin .../{ => extra}/core/swresample-4.dll | Bin .../icon.icns => extra/icons/logo.icns} | 0 .../{icons/icon.ico => extra/icons/logo.ico} | Bin .../{icons/icon.png => extra/icons/logo.png} | Bin index.html | 6 +- jsconfig.json | 6 +- package.json | 3 +- pnpm-lock.yaml | 3 + public/electron-vite.svg | 26 --- public/logo.ico | Bin 0 -> 173639 bytes .../resources => public}/screenshot/phone.jpg | Bin src/components/Devices/ControlBar/index.vue | 4 +- src/components/Devices/index.vue | 2 +- src/main.js | 12 +- vite.config.js | 29 +-- 45 files changed, 336 insertions(+), 142 deletions(-) create mode 100644 dev-publish.yml create mode 100644 electron-builder.json delete mode 100644 electron-builder.json5 rename electron/{ipcManage => events}/handles/index.js (100%) rename electron/{ipcManage => events}/index.js (100%) rename electron/{ipcManage => events}/updater/index.js (86%) rename electron/{plugins => exposes}/adbkit/index.js (95%) rename electron/{plugins => exposes}/electron/index.js (100%) rename electron/{plugins => exposes}/index.js (93%) rename electron/{plugins => exposes}/scrcpy/index.js (68%) create mode 100644 electron/loading/index.js rename electron/resources/{ => extra}/core/AdbWinApi.dll (100%) rename electron/resources/{ => extra}/core/AdbWinUsbApi.dll (100%) rename electron/resources/{ => extra}/core/SDL2.dll (100%) rename electron/resources/{ => extra}/core/adb.exe (100%) rename electron/resources/{ => extra}/core/avcodec-60.dll (100%) rename electron/resources/{ => extra}/core/avformat-60.dll (100%) rename electron/resources/{ => extra}/core/avutil-58.dll (100%) rename electron/resources/{ => extra}/core/icon.png (100%) rename electron/resources/{ => extra}/core/msys-usb-1.0.dll (100%) rename electron/resources/{ => extra}/core/open_a_terminal_here.bat (100%) rename electron/resources/{ => extra}/core/scrcpy-console.bat (100%) rename electron/resources/{ => extra}/core/scrcpy-noconsole.vbs (100%) rename electron/resources/{ => extra}/core/scrcpy-server (100%) rename electron/resources/{ => extra}/core/scrcpy.exe (100%) rename electron/resources/{ => extra}/core/swresample-4.dll (100%) rename electron/resources/{icons/icon.icns => extra/icons/logo.icns} (100%) rename electron/resources/{icons/icon.ico => extra/icons/logo.ico} (100%) rename electron/resources/{icons/icon.png => extra/icons/logo.png} (100%) delete mode 100644 public/electron-vite.svg create mode 100644 public/logo.ico rename {electron/resources => public}/screenshot/phone.jpg (100%) diff --git a/.github/workflows/release-assets.yml b/.github/workflows/release-assets.yml index 058dc55..2cd6397 100644 --- a/.github/workflows/release-assets.yml +++ b/.github/workflows/release-assets.yml @@ -49,15 +49,15 @@ jobs: with: draft: true files: | - dist/*.exe - dist/*.zip - dist/*.dmg - dist/*.AppImage - dist/*.snap - dist/*.deb - dist/*.rpm - dist/*.tar.gz - dist/*.yml - dist/*.blockmap + dist-release/*.exe + dist-release/*.zip + dist-release/*.dmg + dist-release/*.AppImage + dist-release/*.snap + dist-release/*.deb + dist-release/*.rpm + dist-release/*.tar.gz + dist-release/*.yml + dist-release/*.blockmap env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.gitignore b/.gitignore index ec42731..cf5a008 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ node_modules dist dist-ssr dist-electron -release +dist-release *.local # Editor directories and files diff --git a/binary.js b/binary.js index 22f448a..74c26b4 100644 --- a/binary.js +++ b/binary.js @@ -1,4 +1,4 @@ -export default function CustomPlugin() { +export default function VitePluginPath() { return { name: 'vite-plugin-path', transform(src, id) { diff --git a/dev-publish.yml b/dev-publish.yml new file mode 100644 index 0000000..f7509c6 --- /dev/null +++ b/dev-publish.yml @@ -0,0 +1,4 @@ +provider: github +owner: viarotel-org +repo: escrcpy +updaterCacheDirName: escrcpy-updater diff --git a/electron-builder.json b/electron-builder.json new file mode 100644 index 0000000..4b466c0 --- /dev/null +++ b/electron-builder.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://raw.githubusercontent.com/electron-userland/electron-builder/master/packages/app-builder-lib/scheme.json", + "appId": "org.viarotel.escrcpy", + "asar": true, + "productName": "escrcpy", + "directories": { + "output": "dist-release/${version}", + "buildResources": "electron/resources/build" + }, + "files": ["dist", "dist-electron"], + "extraResources": ["electron/resources/extra"], + "publish": { + "provider": "github", + "owner": "viarotel-org", + "repo": "escrcpy", + "updaterCacheDirName": "escrcpy-updater" + }, + "mac": { + "target": ["dmg"], + "artifactName": "${productName}-${version}-mac-installer.${ext}" + }, + "win": { + "target": [ + { + "target": "nsis", + "arch": ["x64"] + }, + { + "target": "zip" + }, + { + "target": "portable" + } + ] + }, + "nsis": { + "artifactName": "${productName}-${version}-win-setup.${ext}", + "oneClick": false, + "perMachine": false, + "allowToChangeInstallationDirectory": true, + "deleteAppDataOnUninstall": false + }, + "portable": { + "artifactName": "${productName}-${version}-win-portable.${ext}", + "requestExecutionLevel": "user" + }, + "linux": { + "target": ["AppImage"], + "artifactName": "${productName}-${version}-linux.${ext}" + } +} diff --git a/electron-builder.json5 b/electron-builder.json5 deleted file mode 100644 index 89f227b..0000000 --- a/electron-builder.json5 +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @see https://www.electron.build/configuration/configuration - */ -{ - "$schema": "https://raw.githubusercontent.com/electron-userland/electron-builder/master/packages/app-builder-lib/scheme.json", - "appId": "YourAppID", - "asar": true, - "productName": "YourAppName", - "directories": { - "output": "release/${version}" - }, - "files": [ - "dist", - "dist-electron" - ], - "extraResources": [ - "electron/resources" - ], - "mac": { - "target": [ - "dmg" - ], - "artifactName": "${productName}-Mac-${version}-Installer.${ext}" - }, - "win": { - "target": [ - { - "target": "nsis", - "arch": [ - "x64" - ] - } - ], - "artifactName": "${productName}-Windows-${version}-Setup.${ext}" - }, - "nsis": { - "oneClick": false, - "perMachine": false, - "allowToChangeInstallationDirectory": true, - "deleteAppDataOnUninstall": false - }, - "linux": { - "target": [ - "AppImage" - ], - "artifactName": "${productName}-Linux-${version}.${ext}" - } -} diff --git a/electron/ipcManage/handles/index.js b/electron/events/handles/index.js similarity index 100% rename from electron/ipcManage/handles/index.js rename to electron/events/handles/index.js diff --git a/electron/ipcManage/index.js b/electron/events/index.js similarity index 100% rename from electron/ipcManage/index.js rename to electron/events/index.js diff --git a/electron/ipcManage/updater/index.js b/electron/events/updater/index.js similarity index 86% rename from electron/ipcManage/updater/index.js rename to electron/events/updater/index.js index 4589245..d64d72a 100644 --- a/electron/ipcManage/updater/index.js +++ b/electron/events/updater/index.js @@ -1,23 +1,21 @@ -import path from 'node:path' import { app, ipcMain } from 'electron' import { is } from '@electron-toolkit/utils' import { autoUpdater } from 'electron-updater' +import devPublishPath from '@root/dev-publish.yml?path' export default (mainWindow) => { // dev-start, 这里是为了在本地做应用升级测试使用,正式环境请务必删除 - if (is.dev && process.env.ELECTRON_RENDERER_URL) { - const updateConfigPath = path.join(process.cwd(), './dev-app-update.yml') - // console.log('updateConfigPath', updateConfigPath) + // if (is.dev && process.env.ELECTRON_RENDERER_URL) { + if (is.dev && process.env.VITE_DEV_SERVER_URL) { + const updateConfigPath = devPublishPath autoUpdater.updateConfigPath = updateConfigPath + Object.defineProperty(app, 'isPackaged', { + get() { + return true + }, + }) } - Object.defineProperty(app, 'isPackaged', { - get() { - return true - }, - }) - // dev-end - // 触发检查更新(此方法用于被渲染线程调用,例如页面点击检查更新按钮来调用此方法) ipcMain.on('check-for-update', () => { console.log('ipcMain:check-for-update') diff --git a/electron/plugins/adbkit/index.js b/electron/exposes/adbkit/index.js similarity index 95% rename from electron/plugins/adbkit/index.js rename to electron/exposes/adbkit/index.js index 7931bef..1adfc35 100644 --- a/electron/plugins/adbkit/index.js +++ b/electron/exposes/adbkit/index.js @@ -4,9 +4,7 @@ import path from 'node:path' import fs from 'node:fs' import dayjs from 'dayjs' import { Adb } from '@devicefarmer/adbkit' -import adbPath from '@resources/core/adb.exe?path' - -console.log('adbPath', adbPath) +import adbPath from '@resources/extra/core/adb.exe?path' const exec = util.promisify(child_process.exec) @@ -99,7 +97,7 @@ const watch = async (callback) => { } export default () => { - client = Adb.createClient({}) + client = Adb.createClient({ bin: adbPath }) console.log('client', client) return { diff --git a/electron/plugins/electron/index.js b/electron/exposes/electron/index.js similarity index 100% rename from electron/plugins/electron/index.js rename to electron/exposes/electron/index.js diff --git a/electron/plugins/index.js b/electron/exposes/index.js similarity index 93% rename from electron/plugins/index.js rename to electron/exposes/index.js index 12c5ad7..98f24ba 100644 --- a/electron/plugins/index.js +++ b/electron/exposes/index.js @@ -4,7 +4,7 @@ import adbkit from './adbkit/index.js' import scrcpy from './scrcpy/index.js' export default { - install(expose) { + init(expose) { expose('nodePath', path) expose('electron', electron()) expose('adbkit', adbkit()) diff --git a/electron/plugins/scrcpy/index.js b/electron/exposes/scrcpy/index.js similarity index 68% rename from electron/plugins/scrcpy/index.js rename to electron/exposes/scrcpy/index.js index 5a13b68..40a253b 100644 --- a/electron/plugins/scrcpy/index.js +++ b/electron/exposes/scrcpy/index.js @@ -1,7 +1,7 @@ import util from 'node:util' import child_process from 'node:child_process' -import adbPath from '@resources/core/adb.exe?path' -import scrcpyPath from '@resources/core/scrcpy.exe?path' +import adbPath from '@resources/extra/core/adb.exe?path' +import scrcpyPath from '@resources/extra/core/scrcpy.exe?path' const exec = util.promisify(child_process.exec) diff --git a/electron/loading/index.js b/electron/loading/index.js new file mode 100644 index 0000000..ab7154a --- /dev/null +++ b/electron/loading/index.js @@ -0,0 +1,175 @@ +// --------- Preload scripts loading --------- +function domReady(condition = ['complete', 'interactive']) { + return new Promise((resolve) => { + if (condition.includes(document.readyState)) { + resolve(true) + } + else { + document.addEventListener('readystatechange', () => { + if (condition.includes(document.readyState)) { + resolve(true) + } + }) + } + }) +} + +const safeDOM = { + append(parent, child) { + if (!Array.from(parent.children).find(e => e === child)) { + parent.appendChild(child) + } + }, + remove(parent, child) { + if (Array.from(parent.children).find(e => e === child)) { + parent.removeChild(child) + } + }, +} + +/** + * https://tobiasahlin.com/spinkit + * https://connoratherton.com/loaders + * https://projects.lukehaas.me/css-loaders + * https://matejkustec.github.io/SpinThatShit + */ +function useLoading() { + const className = 'electron-loading' + const loginStyles = ` + .${className}-core { + font-size: 30px; + text-indent: -9999em; + overflow: hidden; + width: 1em; + height: 1em; + border-radius: 50%; + margin: 72px auto; + position: relative; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation: electron-loading-dots 1.7s infinite ease, electron-loading-spin 1.7s infinite ease; + animation: electron-loading-dots 1.7s infinite ease, electron-loading-spin 1.7s infinite ease; + } + + @-webkit-keyframes electron-loading-dots { + 0% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + 5%, + 95% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + 10%, + 59% { + box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em; + } + 20% { + box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em; + } + 38% { + box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em; + } + 100% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + } + + @keyframes electron-loading-dots { + 0% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + 5%, + 95% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + 10%, + 59% { + box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em; + } + 20% { + box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em; + } + 38% { + box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em; + } + 100% { + box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; + } + } + + @-webkit-keyframes electron-loading-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + @keyframes electron-loading-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .${className}-wrap { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + z-index: 3000; + background: white; + color: #028D71; + } + + .${className}-text { + margin-top: -45px; + } + ` + + const styleEl = document.createElement('style') + styleEl.id = `${className}-style` + styleEl.innerHTML = loginStyles + + const divEl = document.createElement('div') + divEl.className = `${className}-wrap` + divEl.innerHTML = ` +
+
初始化服务中...
+ ` + + return { + appendLoading() { + safeDOM.append(document.head, styleEl) + safeDOM.append(document.body, divEl) + }, + removeLoading() { + safeDOM.remove(document.head, styleEl) + safeDOM.remove(document.body, divEl) + }, + } +} + +// ---------------------------------------------------------------------- + +const { appendLoading, removeLoading } = useLoading() +domReady().then(appendLoading) + +window.onmessage = (ev) => { + ev.data.payload === 'removeLoading' && removeLoading() +} + +setTimeout(removeLoading, 4999) diff --git a/electron/main.js b/electron/main.js index 8375b28..41a5734 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,6 +1,12 @@ import path from 'node:path' -import { BrowserWindow, app } from 'electron' -import ipcManage from './ipcManage/index.js' +import { BrowserWindow, app, shell } from 'electron' +import { electronApp, optimizer } from '@electron-toolkit/utils' + +import logoPath from '@resources/extra/icons/logo.png?path' +import icoLogoPath from '@resources/extra/icons/logo.ico?path' +import icnsLogoPath from '@resources/extra/icons/logo.icns?path' + +import events from './events/index.js' // The built directory structure // @@ -11,18 +17,26 @@ import ipcManage from './ipcManage/index.js' // │ │ ├── main.js // │ │ └── preload.js // │ + process.env.DIST = path.join(__dirname, '../dist') -process.env.VITE_PUBLIC = app.isPackaged - ? process.env.DIST - : path.join(process.env.DIST, '../public') let mainWindow // 🚧 Use ['ENV_NAME'] avoid vite:define plugin - Vite@2.x const VITE_DEV_SERVER_URL = process.env.VITE_DEV_SERVER_URL function createWindow() { + let icon = logoPath + + if (process.platform === 'win32') { + icon = icoLogoPath + } + else if (process.platform === 'darwin') { + icon = icnsLogoPath + } + mainWindow = new BrowserWindow({ - icon: path.join(process.env.VITE_PUBLIC, 'electron-vite.svg'), + show: false, + icon, minWidth: 1000, minHeight: 700, autoHideMenuBar: true, @@ -32,6 +46,16 @@ function createWindow() { preload: path.join(__dirname, './preload.js'), sandbox: false, }, + backgroundColor: 'white', + }) + + mainWindow.on('ready-to-show', () => { + mainWindow.show() + }) + + mainWindow.webContents.setWindowOpenHandler((details) => { + shell.openExternal(details.url) + return { action: 'deny' } }) // Test active push message to Renderer-process. @@ -50,7 +74,7 @@ function createWindow() { mainWindow.loadFile(path.join(process.env.DIST, 'index.html')) } - ipcManage(mainWindow) + events(mainWindow) } // Quit when all windows are closed, except on macOS. There, it's common @@ -71,4 +95,12 @@ app.on('activate', () => { } }) -app.whenReady().then(createWindow) +app.whenReady().then(() => { + electronApp.setAppUserModelId('com.viarotel.escrcpy') + + app.on('browser-window-created', (_, window) => { + optimizer.watchWindowShortcuts(window) + }) + + createWindow() +}) diff --git a/electron/preload.js b/electron/preload.js index 721bcdb..6da0ed6 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -1,6 +1,7 @@ -import plugins from './plugins/index.js' +import exposes from './exposes/index.js' import { exposeContext } from './helpers/index.js' +import './loading/index.js' process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = 'true' -plugins.install(exposeContext) +exposes.init(exposeContext) diff --git a/electron/resources/core/AdbWinApi.dll b/electron/resources/extra/core/AdbWinApi.dll similarity index 100% rename from electron/resources/core/AdbWinApi.dll rename to electron/resources/extra/core/AdbWinApi.dll diff --git a/electron/resources/core/AdbWinUsbApi.dll b/electron/resources/extra/core/AdbWinUsbApi.dll similarity index 100% rename from electron/resources/core/AdbWinUsbApi.dll rename to electron/resources/extra/core/AdbWinUsbApi.dll diff --git a/electron/resources/core/SDL2.dll b/electron/resources/extra/core/SDL2.dll similarity index 100% rename from electron/resources/core/SDL2.dll rename to electron/resources/extra/core/SDL2.dll diff --git a/electron/resources/core/adb.exe b/electron/resources/extra/core/adb.exe similarity index 100% rename from electron/resources/core/adb.exe rename to electron/resources/extra/core/adb.exe diff --git a/electron/resources/core/avcodec-60.dll b/electron/resources/extra/core/avcodec-60.dll similarity index 100% rename from electron/resources/core/avcodec-60.dll rename to electron/resources/extra/core/avcodec-60.dll diff --git a/electron/resources/core/avformat-60.dll b/electron/resources/extra/core/avformat-60.dll similarity index 100% rename from electron/resources/core/avformat-60.dll rename to electron/resources/extra/core/avformat-60.dll diff --git a/electron/resources/core/avutil-58.dll b/electron/resources/extra/core/avutil-58.dll similarity index 100% rename from electron/resources/core/avutil-58.dll rename to electron/resources/extra/core/avutil-58.dll diff --git a/electron/resources/core/icon.png b/electron/resources/extra/core/icon.png similarity index 100% rename from electron/resources/core/icon.png rename to electron/resources/extra/core/icon.png diff --git a/electron/resources/core/msys-usb-1.0.dll b/electron/resources/extra/core/msys-usb-1.0.dll similarity index 100% rename from electron/resources/core/msys-usb-1.0.dll rename to electron/resources/extra/core/msys-usb-1.0.dll diff --git a/electron/resources/core/open_a_terminal_here.bat b/electron/resources/extra/core/open_a_terminal_here.bat similarity index 100% rename from electron/resources/core/open_a_terminal_here.bat rename to electron/resources/extra/core/open_a_terminal_here.bat diff --git a/electron/resources/core/scrcpy-console.bat b/electron/resources/extra/core/scrcpy-console.bat similarity index 100% rename from electron/resources/core/scrcpy-console.bat rename to electron/resources/extra/core/scrcpy-console.bat diff --git a/electron/resources/core/scrcpy-noconsole.vbs b/electron/resources/extra/core/scrcpy-noconsole.vbs similarity index 100% rename from electron/resources/core/scrcpy-noconsole.vbs rename to electron/resources/extra/core/scrcpy-noconsole.vbs diff --git a/electron/resources/core/scrcpy-server b/electron/resources/extra/core/scrcpy-server similarity index 100% rename from electron/resources/core/scrcpy-server rename to electron/resources/extra/core/scrcpy-server diff --git a/electron/resources/core/scrcpy.exe b/electron/resources/extra/core/scrcpy.exe similarity index 100% rename from electron/resources/core/scrcpy.exe rename to electron/resources/extra/core/scrcpy.exe diff --git a/electron/resources/core/swresample-4.dll b/electron/resources/extra/core/swresample-4.dll similarity index 100% rename from electron/resources/core/swresample-4.dll rename to electron/resources/extra/core/swresample-4.dll diff --git a/electron/resources/icons/icon.icns b/electron/resources/extra/icons/logo.icns similarity index 100% rename from electron/resources/icons/icon.icns rename to electron/resources/extra/icons/logo.icns diff --git a/electron/resources/icons/icon.ico b/electron/resources/extra/icons/logo.ico similarity index 100% rename from electron/resources/icons/icon.ico rename to electron/resources/extra/icons/logo.ico diff --git a/electron/resources/icons/icon.png b/electron/resources/extra/icons/logo.png similarity index 100% rename from electron/resources/icons/icon.png rename to electron/resources/extra/icons/logo.png diff --git a/index.html b/index.html index 2e087ad..59f8641 100644 --- a/index.html +++ b/index.html @@ -2,12 +2,12 @@ - + - Vite + Vue + TS + Escrcpy
- + \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json index b986304..5e9c0a5 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -2,9 +2,11 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@/*": ["src/*"], + "@root/*": ["*"], + "@resources/*": ["electron/resources/*"] } }, - "exclude": ["node_modules", "dist", "dist-electron"], + "exclude": ["node_modules", "dist", "dist-electron", "dist-release"], "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.vue", "electron"] } \ No newline at end of file diff --git a/package.json b/package.json index 622eec1..695e3e6 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "escrcpy-next", + "name": "escrcpy", "version": "1.6.2", "private": true, "description": "Scrcpy Powered by Electron", @@ -29,6 +29,7 @@ "electron-builder": "^24.6.4", "electron-updater": "^6.1.4", "element-plus": "^2.4.0", + "lodash-es": "^4.17.21", "pinia": "^2.1.7", "typescript": "^5.2.2", "vite": "^4.4.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 173f24c..db25b4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ devDependencies: element-plus: specifier: ^2.4.0 version: 2.4.0(vue@3.3.4) + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 pinia: specifier: ^2.1.7 version: 2.1.7(typescript@5.2.2)(vue@3.3.4) diff --git a/public/electron-vite.svg b/public/electron-vite.svg deleted file mode 100644 index e4b75fc..0000000 --- a/public/electron-vite.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/logo.ico b/public/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..0ca480ce6bb7f8c8c8ec2a4e3390b4953d812ed8 GIT binary patch literal 173639 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
  • !}x>h+r$<@#MgC&3m0`7yrw^S6KcgPR4=2(6BO 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 { -// // Remove Preload scripts loading -// postMessage({ payload: 'removeLoading' }, '*') -// // Use contextBridge -// window.ipcRenderer.on('main-process-message', (_event, message) => { -// console.log(message) -// }) -// }) +app.$nextTick(() => { + // Remove Preload scripts loading + postMessage({ payload: 'removeLoading' }, '*') +}) diff --git a/vite.config.js b/vite.config.js index 80c51be..d1b495c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,12 +1,26 @@ import { resolve } from 'node:path' -import { defineConfig } from 'vite' +import { defineConfig, mergeConfig } from 'vite' import useElectron from 'vite-plugin-electron' import useRenderer from 'vite-plugin-electron-renderer' import useVue from '@vitejs/plugin-vue' import useEslint from 'vite-plugin-eslint' import useUnoCSS from 'unocss/vite' -import binary from './binary.js' +import usePath from './binary.js' + +const merge = config => + mergeConfig( + { + resolve: { + alias: { + '@root': resolve('./'), + '@resources': resolve('./electron/resources'), + }, + }, + plugins: [usePath()], + }, + config, + ) // https://vitejs.dev/config/ export default defineConfig({ @@ -23,21 +37,14 @@ export default defineConfig({ useElectron([ { entry: 'electron/main.js', - vite: {}, + vite: merge({}), }, { entry: 'electron/preload.js', onstart(args) { args.reload() }, - vite: { - resolve: { - alias: { - '@resources': resolve('./electron/resources'), - }, - }, - plugins: [binary()], - }, + vite: merge({}), }, ]), useRenderer(),