From 3679bc918916e5c3db1cd05ede0d27c0522cb444 Mon Sep 17 00:00:00 2001 From: fan xia Date: Thu, 7 Dec 2023 01:34:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CI.yml | 2 +- .gitignore | 4 +- addon/.cargo/config.toml | 5 - addon/.gitignore | 200 ------------------ addon/.npmignore | 13 -- addon/Cargo.toml | 27 --- addon/build.rs | 5 - addon/npm/darwin-arm64/README.md | 3 - addon/npm/darwin-arm64/package.json | 18 -- addon/npm/darwin-universal/README.md | 3 - addon/npm/darwin-universal/package.json | 15 -- addon/npm/darwin-x64/README.md | 3 - addon/npm/darwin-x64/package.json | 18 -- addon/npm/linux-arm64-gnu/README.md | 3 - addon/npm/linux-arm64-gnu/package.json | 21 -- addon/npm/linux-arm64-musl/README.md | 3 - addon/npm/linux-arm64-musl/package.json | 21 -- addon/npm/linux-x64-gnu/README.md | 3 - addon/npm/linux-x64-gnu/package.json | 21 -- addon/npm/linux-x64-musl/README.md | 3 - addon/npm/linux-x64-musl/package.json | 21 -- addon/npm/win32-arm64-msvc/README.md | 3 - addon/npm/win32-arm64-msvc/package.json | 18 -- addon/npm/win32-ia32-msvc/README.md | 3 - addon/npm/win32-ia32-msvc/package.json | 18 -- addon/npm/win32-x64-msvc/README.md | 3 - addon/npm/win32-x64-msvc/package.json | 18 -- addon/package.json | 38 ---- addon/postbuild.js | 10 - addon/prepub.js | 5 - addon/rustfmt.toml | 2 - addon/src/clipboard/mod.rs | 118 ----------- addon/src/lib.rs | 9 - addon/src/main.rs | 20 -- addon/src/monitor/mod.rs | 65 ------ addon/src/shotcut/exelook/dib.rs | 267 ------------------------ addon/src/shotcut/exelook/mod.rs | 197 ----------------- addon/src/shotcut/mod.rs | 69 ------ addon/src/simulation/mod.rs | 122 ----------- package.json | 101 +++++---- prepub.js | 5 - src/clipboard.ts | 25 --- src/deprecated/cb.ts | 76 ------- src/deprecated/package.json | 14 -- src/folder.ts | 85 -------- src/index.ts | 6 - src/monitor.ts | 158 -------------- src/simulation.ts | 62 ------ src/sysapp/index.ts | 48 ----- src/sysapp/windows.ts | 29 --- test.ts | 10 - tsconfig.json | 14 +- 52 files changed, 73 insertions(+), 1957 deletions(-) delete mode 100644 addon/.cargo/config.toml delete mode 100644 addon/.gitignore delete mode 100644 addon/.npmignore delete mode 100644 addon/Cargo.toml delete mode 100644 addon/build.rs delete mode 100644 addon/npm/darwin-arm64/README.md delete mode 100644 addon/npm/darwin-arm64/package.json delete mode 100644 addon/npm/darwin-universal/README.md delete mode 100644 addon/npm/darwin-universal/package.json delete mode 100644 addon/npm/darwin-x64/README.md delete mode 100644 addon/npm/darwin-x64/package.json delete mode 100644 addon/npm/linux-arm64-gnu/README.md delete mode 100644 addon/npm/linux-arm64-gnu/package.json delete mode 100644 addon/npm/linux-arm64-musl/README.md delete mode 100644 addon/npm/linux-arm64-musl/package.json delete mode 100644 addon/npm/linux-x64-gnu/README.md delete mode 100644 addon/npm/linux-x64-gnu/package.json delete mode 100644 addon/npm/linux-x64-musl/README.md delete mode 100644 addon/npm/linux-x64-musl/package.json delete mode 100644 addon/npm/win32-arm64-msvc/README.md delete mode 100644 addon/npm/win32-arm64-msvc/package.json delete mode 100644 addon/npm/win32-ia32-msvc/README.md delete mode 100644 addon/npm/win32-ia32-msvc/package.json delete mode 100644 addon/npm/win32-x64-msvc/README.md delete mode 100644 addon/npm/win32-x64-msvc/package.json delete mode 100644 addon/package.json delete mode 100644 addon/postbuild.js delete mode 100644 addon/prepub.js delete mode 100644 addon/rustfmt.toml delete mode 100644 addon/src/clipboard/mod.rs delete mode 100644 addon/src/lib.rs delete mode 100644 addon/src/main.rs delete mode 100644 addon/src/monitor/mod.rs delete mode 100644 addon/src/shotcut/exelook/dib.rs delete mode 100644 addon/src/shotcut/exelook/mod.rs delete mode 100644 addon/src/shotcut/mod.rs delete mode 100644 addon/src/simulation/mod.rs delete mode 100644 prepub.js delete mode 100644 src/clipboard.ts delete mode 100644 src/deprecated/cb.ts delete mode 100644 src/deprecated/package.json delete mode 100644 src/folder.ts delete mode 100644 src/index.ts delete mode 100644 src/monitor.ts delete mode 100644 src/simulation.ts delete mode 100644 src/sysapp/index.ts delete mode 100644 src/sysapp/windows.ts delete mode 100644 test.ts diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fc4bb52..2d07439 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,7 +1,7 @@ name: CI env: DEBUG: napi:* - APP_NAME: rubick-native-addon + APP_NAME: rubick-native MACOSX_DEPLOYMENT_TARGET: "10.13" permissions: contents: write diff --git a/.gitignore b/.gitignore index 82c788c..4b1645a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node +index.d.ts +index.js ### Node ### # Logs @@ -13,6 +14,7 @@ lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json pnpm-lock.yaml +package-lock.json # Runtime data pids diff --git a/addon/.cargo/config.toml b/addon/.cargo/config.toml deleted file mode 100644 index 5bd0907..0000000 --- a/addon/.cargo/config.toml +++ /dev/null @@ -1,5 +0,0 @@ -[target.'cfg(target_os = "linux")'] -rustflags = ["-C", "link-arg=-nostartfiles", "-C", "target-feature=-crt-static"] - -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc" diff --git a/addon/.gitignore b/addon/.gitignore deleted file mode 100644 index 4b1645a..0000000 --- a/addon/.gitignore +++ /dev/null @@ -1,200 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -index.d.ts -index.js - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -pnpm-lock.yaml -package-lock.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# End of https://www.toptal.com/developers/gitignore/api/node - -# Created by https://www.toptal.com/developers/gitignore/api/macos -# Edit at https://www.toptal.com/developers/gitignore?templates=macos - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### macOS Patch ### -# iCloud generated files -*.icloud - -# End of https://www.toptal.com/developers/gitignore/api/macos - -# Created by https://www.toptal.com/developers/gitignore/api/windows -# Edit at https://www.toptal.com/developers/gitignore?templates=windows - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -Thumbs.db:encryptable -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# End of https://www.toptal.com/developers/gitignore/api/windows - -#Added by cargo - -/target -Cargo.lock - -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions - -*.node diff --git a/addon/.npmignore b/addon/.npmignore deleted file mode 100644 index ec144db..0000000 --- a/addon/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -target -Cargo.lock -.cargo -.github -npm -.eslintrc -.prettierignore -rustfmt.toml -yarn.lock -*.node -.yarn -__test__ -renovate.json diff --git a/addon/Cargo.toml b/addon/Cargo.toml deleted file mode 100644 index 9f9d054..0000000 --- a/addon/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -edition = "2021" -name = "rubick-native-addon" -version = "0.0.0" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -rdev = { version = "0.5", features = ["serialize", "unstable_grab"] } -clipboard-files = "0.1" -copypasta = "0.10" -enigo = "0.1" -napi = { version = "2", features = ["async"] } -napi-derive = "2" -serde_json = "1" -lnk_parser = "0.4" -parselnk = "0.1" -pelite = "0.10" -base64 = "0.21" -tokio = { version = "1", features = ["full"] } - -[build-dependencies] -napi-build = "2" - -[profile.release] -lto = true diff --git a/addon/build.rs b/addon/build.rs deleted file mode 100644 index 1f866b6..0000000 --- a/addon/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern crate napi_build; - -fn main() { - napi_build::setup(); -} diff --git a/addon/npm/darwin-arm64/README.md b/addon/npm/darwin-arm64/README.md deleted file mode 100644 index 4b5632e..0000000 --- a/addon/npm/darwin-arm64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-darwin-arm64` - -This is the **aarch64-apple-darwin** binary for `rubick-native-addon` diff --git a/addon/npm/darwin-arm64/package.json b/addon/npm/darwin-arm64/package.json deleted file mode 100644 index d8f5776..0000000 --- a/addon/npm/darwin-arm64/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rubick-native-addon-darwin-arm64", - "version": "0.0.0", - "os": [ - "darwin" - ], - "cpu": [ - "arm64" - ], - "main": "rubick-native-addon.darwin-arm64.node", - "files": [ - "rubick-native-addon.darwin-arm64.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/npm/darwin-universal/README.md b/addon/npm/darwin-universal/README.md deleted file mode 100644 index 39dbddb..0000000 --- a/addon/npm/darwin-universal/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-darwin-universal` - -This is the **universal-apple-darwin** binary for `rubick-native-addon` diff --git a/addon/npm/darwin-universal/package.json b/addon/npm/darwin-universal/package.json deleted file mode 100644 index dfdb592..0000000 --- a/addon/npm/darwin-universal/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "rubick-native-addon-darwin-universal", - "version": "0.0.0", - "os": [ - "darwin" - ], - "main": "rubick-native-addon.darwin-universal.node", - "files": [ - "rubick-native-addon.darwin-universal.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/npm/darwin-x64/README.md b/addon/npm/darwin-x64/README.md deleted file mode 100644 index 09015b3..0000000 --- a/addon/npm/darwin-x64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-darwin-x64` - -This is the **x86_64-apple-darwin** binary for `rubick-native-addon` diff --git a/addon/npm/darwin-x64/package.json b/addon/npm/darwin-x64/package.json deleted file mode 100644 index 2d4b987..0000000 --- a/addon/npm/darwin-x64/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rubick-native-addon-darwin-x64", - "version": "0.0.0", - "os": [ - "darwin" - ], - "cpu": [ - "x64" - ], - "main": "rubick-native-addon.darwin-x64.node", - "files": [ - "rubick-native-addon.darwin-x64.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/npm/linux-arm64-gnu/README.md b/addon/npm/linux-arm64-gnu/README.md deleted file mode 100644 index 28ac99e..0000000 --- a/addon/npm/linux-arm64-gnu/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-linux-arm64-gnu` - -This is the **aarch64-unknown-linux-gnu** binary for `rubick-native-addon` diff --git a/addon/npm/linux-arm64-gnu/package.json b/addon/npm/linux-arm64-gnu/package.json deleted file mode 100644 index 68b8bce..0000000 --- a/addon/npm/linux-arm64-gnu/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "rubick-native-addon-linux-arm64-gnu", - "version": "0.0.0", - "os": [ - "linux" - ], - "cpu": [ - "arm64" - ], - "main": "rubick-native-addon.linux-arm64-gnu.node", - "files": [ - "rubick-native-addon.linux-arm64-gnu.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "libc": [ - "glibc" - ] -} \ No newline at end of file diff --git a/addon/npm/linux-arm64-musl/README.md b/addon/npm/linux-arm64-musl/README.md deleted file mode 100644 index 884a0e6..0000000 --- a/addon/npm/linux-arm64-musl/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-linux-arm64-musl` - -This is the **aarch64-unknown-linux-musl** binary for `rubick-native-addon` diff --git a/addon/npm/linux-arm64-musl/package.json b/addon/npm/linux-arm64-musl/package.json deleted file mode 100644 index d46b442..0000000 --- a/addon/npm/linux-arm64-musl/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "rubick-native-addon-linux-arm64-musl", - "version": "0.0.0", - "os": [ - "linux" - ], - "cpu": [ - "arm64" - ], - "main": "rubick-native-addon.linux-arm64-musl.node", - "files": [ - "rubick-native-addon.linux-arm64-musl.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "libc": [ - "musl" - ] -} \ No newline at end of file diff --git a/addon/npm/linux-x64-gnu/README.md b/addon/npm/linux-x64-gnu/README.md deleted file mode 100644 index 0106ff4..0000000 --- a/addon/npm/linux-x64-gnu/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-linux-x64-gnu` - -This is the **x86_64-unknown-linux-gnu** binary for `rubick-native-addon` diff --git a/addon/npm/linux-x64-gnu/package.json b/addon/npm/linux-x64-gnu/package.json deleted file mode 100644 index 07c996b..0000000 --- a/addon/npm/linux-x64-gnu/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "rubick-native-addon-linux-x64-gnu", - "version": "0.0.0", - "os": [ - "linux" - ], - "cpu": [ - "x64" - ], - "main": "rubick-native-addon.linux-x64-gnu.node", - "files": [ - "rubick-native-addon.linux-x64-gnu.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "libc": [ - "glibc" - ] -} \ No newline at end of file diff --git a/addon/npm/linux-x64-musl/README.md b/addon/npm/linux-x64-musl/README.md deleted file mode 100644 index 3119386..0000000 --- a/addon/npm/linux-x64-musl/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-linux-x64-musl` - -This is the **x86_64-unknown-linux-musl** binary for `rubick-native-addon` diff --git a/addon/npm/linux-x64-musl/package.json b/addon/npm/linux-x64-musl/package.json deleted file mode 100644 index 245d476..0000000 --- a/addon/npm/linux-x64-musl/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "rubick-native-addon-linux-x64-musl", - "version": "0.0.0", - "os": [ - "linux" - ], - "cpu": [ - "x64" - ], - "main": "rubick-native-addon.linux-x64-musl.node", - "files": [ - "rubick-native-addon.linux-x64-musl.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "libc": [ - "musl" - ] -} \ No newline at end of file diff --git a/addon/npm/win32-arm64-msvc/README.md b/addon/npm/win32-arm64-msvc/README.md deleted file mode 100644 index 0309cf5..0000000 --- a/addon/npm/win32-arm64-msvc/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-win32-arm64-msvc` - -This is the **aarch64-pc-windows-msvc** binary for `rubick-native-addon` diff --git a/addon/npm/win32-arm64-msvc/package.json b/addon/npm/win32-arm64-msvc/package.json deleted file mode 100644 index 039c789..0000000 --- a/addon/npm/win32-arm64-msvc/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rubick-native-addon-win32-arm64-msvc", - "version": "0.0.0", - "os": [ - "win32" - ], - "cpu": [ - "arm64" - ], - "main": "rubick-native-addon.win32-arm64-msvc.node", - "files": [ - "rubick-native-addon.win32-arm64-msvc.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/npm/win32-ia32-msvc/README.md b/addon/npm/win32-ia32-msvc/README.md deleted file mode 100644 index b2f5854..0000000 --- a/addon/npm/win32-ia32-msvc/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-win32-ia32-msvc` - -This is the **i686-pc-windows-msvc** binary for `rubick-native-addon` diff --git a/addon/npm/win32-ia32-msvc/package.json b/addon/npm/win32-ia32-msvc/package.json deleted file mode 100644 index bc8bd48..0000000 --- a/addon/npm/win32-ia32-msvc/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rubick-native-addon-win32-ia32-msvc", - "version": "0.0.0", - "os": [ - "win32" - ], - "cpu": [ - "ia32" - ], - "main": "rubick-native-addon.win32-ia32-msvc.node", - "files": [ - "rubick-native-addon.win32-ia32-msvc.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/npm/win32-x64-msvc/README.md b/addon/npm/win32-x64-msvc/README.md deleted file mode 100644 index 921d1af..0000000 --- a/addon/npm/win32-x64-msvc/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `rubick-native-addon-win32-x64-msvc` - -This is the **x86_64-pc-windows-msvc** binary for `rubick-native-addon` diff --git a/addon/npm/win32-x64-msvc/package.json b/addon/npm/win32-x64-msvc/package.json deleted file mode 100644 index cfc1567..0000000 --- a/addon/npm/win32-x64-msvc/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rubick-native-addon-win32-x64-msvc", - "version": "0.0.0", - "os": [ - "win32" - ], - "cpu": [ - "x64" - ], - "main": "rubick-native-addon.win32-x64-msvc.node", - "files": [ - "rubick-native-addon.win32-x64-msvc.node" - ], - "license": "MIT", - "engines": { - "node": ">= 10" - } -} \ No newline at end of file diff --git a/addon/package.json b/addon/package.json deleted file mode 100644 index 90d2cd2..0000000 --- a/addon/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "rubick-native-addon", - "version": "0.0.0", - "main": "index.js", - "types": "index.d.ts", - "napi": { - "name": "rubick-native-addon", - "triples": { - "additional": [ - "aarch64-unknown-linux-gnu", - "aarch64-unknown-linux-musl", - "x86_64-unknown-linux-musl", - "aarch64-apple-darwin", - "universal-apple-darwin", - "aarch64-pc-windows-msvc", - "i686-pc-windows-msvc" - ] - } - }, - "engines": { - "node": ">= 10" - }, - "scripts": { - "artifacts": "napi artifacts", - "build": "napi build --platform --release && node ./postbuild.js", - "build:debug": "napi build --platform", - "prepublishOnly": "node ./prepub.js && napi prepublish -t npm", - "universal": "napi universal", - "version": "napi version" - }, - "devDependencies": { - "@napi-rs/cli": "^2.16.5" - }, - "files": [ - "index.js", - "index.d.ts" - ] -} \ No newline at end of file diff --git a/addon/postbuild.js b/addon/postbuild.js deleted file mode 100644 index 46baf41..0000000 --- a/addon/postbuild.js +++ /dev/null @@ -1,10 +0,0 @@ -const { readFileSync, writeFileSync } = require("fs") -const path = require("path"); - -const ijs_path = path.join(__dirname, "index.js") -const ijs = readFileSync(ijs_path, "utf-8") -const twoijs = ijs.split('binding\`)\n}\n') - -const newijs = 'const nativeBinding = (new Function(`require`,`__dirname`,`' + twoijs[0].replaceAll('`', '\\`').replaceAll('$', '\\$') + 'binding\\`)\n}\nreturn nativeBinding`))(require,__dirname)\n' + twoijs[1] - -writeFileSync(ijs_path, newijs) \ No newline at end of file diff --git a/addon/prepub.js b/addon/prepub.js deleted file mode 100644 index 710f7c2..0000000 --- a/addon/prepub.js +++ /dev/null @@ -1,5 +0,0 @@ -const { writeFileSync } = require("fs") -const { version } = require("../package.json") -const pkg = require("./package.json") -pkg.version = version -writeFileSync("./package.json", JSON.stringify(pkg)) diff --git a/addon/rustfmt.toml b/addon/rustfmt.toml deleted file mode 100644 index cab5731..0000000 --- a/addon/rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ -tab_spaces = 2 -edition = "2021" diff --git a/addon/src/clipboard/mod.rs b/addon/src/clipboard/mod.rs deleted file mode 100644 index 2acd2b8..0000000 --- a/addon/src/clipboard/mod.rs +++ /dev/null @@ -1,118 +0,0 @@ -use clipboard_files; -use copypasta::{ClipboardContext, ClipboardProvider}; - -// use std::{ -// path::PathBuf, -// sync::mpsc::{self, Sender}, -// thread::spawn, -// }; - -// use napi::{ -// bindgen_prelude::*, -// threadsafe_function::{ErrorStrategy, ThreadsafeFunction, ThreadsafeFunctionCallMode}, -// }; - -// enum ClipBoardContent { -// File(Vec), -// Text(String), -// } - -#[napi(object)] -pub struct ClipBoardContentJson { - #[napi(ts_type = "'file' | 'text'")] - pub r#type: String, - pub content: Vec, -} - -// struct Handler { -// pub tx: Sender, -// pub ctx: WindowsClipboardContext, -// } - -// impl ClipboardHandler for Handler { -// fn on_clipboard_change(&mut self) -> CallbackResult { -// let files = clipboard_files::read(); -// match files { -// Ok(f) => { -// println!("{:#?}", f); -// self.tx.send(ClipBoardContent::File(f)).unwrap(); -// } -// Err(err1) => { -// println!("{:#?}", err1); -// let content = self.ctx.get_contents(); -// match content { -// Ok(text) => { -// self.tx.send(ClipBoardContent::Text(text)).unwrap(); -// } -// Err(err) => { -// println!("{:#?}", err); -// // self.tx.send(None).unwrap(); -// } -// } -// } -// } -// CallbackResult::Next -// } - -// fn on_clipboard_error(&mut self, error: std::io::Error) -> CallbackResult { -// println!("{:#?}", error); -// CallbackResult::Next -// } -// } - -// #[napi(ts_args_type = "callback: (content: {type:'file'|'text',content:string[]}) => void")] -// pub fn on_clipboard_change(callback: JsFunction) { -// let jsfn: ThreadsafeFunction = callback -// .create_threadsafe_function(0, |ctx| match ctx.value { -// ClipBoardContent::File(f) => Ok(vec![ClipBoardContentJson { -// r#type: "file".to_string(), -// content: f -// .into_iter() -// .map(|c| c.to_str().unwrap().to_string()) -// .collect::>(), -// }]), -// ClipBoardContent::Text(t) => Ok(vec![ClipBoardContentJson { -// r#type: "text".to_string(), -// content: vec![t], -// }]), -// }) -// .unwrap(); - -// let (tx, rx) = mpsc::channel(); -// let ctx = ClipboardContext::new().unwrap(); - -// spawn(|| { -// let _ = Master::new(Handler { tx, ctx }).run(); -// }); -// spawn(move || { -// for c in rx { -// jsfn.call(c, ThreadsafeFunctionCallMode::Blocking); -// } -// }); -// } - -// 获取剪切板文件或者文本 -#[napi] -pub fn get_clipboard_content() -> Option { - let files = clipboard_files::read(); - let mut ctx = ClipboardContext::new().unwrap(); - match files { - Ok(f) => Some(ClipBoardContentJson { - r#type: "file".to_string(), - content: f - .into_iter() - .map(|c| c.to_str().unwrap().to_string()) - .collect::>(), - }), - Err(_) => { - let content = ctx.get_contents(); - match content { - Ok(text) => Some(ClipBoardContentJson { - r#type: "text".to_string(), - content: vec![text], - }), - Err(_) => None, - } - } - } -} diff --git a/addon/src/lib.rs b/addon/src/lib.rs deleted file mode 100644 index 338bcf1..0000000 --- a/addon/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![deny(clippy::all)] -#![feature(absolute_path)] -#[macro_use] -extern crate napi_derive; - -pub mod clipboard; -pub mod monitor; -pub mod shotcut; -pub mod simulation; diff --git a/addon/src/main.rs b/addon/src/main.rs deleted file mode 100644 index 0190204..0000000 --- a/addon/src/main.rs +++ /dev/null @@ -1,20 +0,0 @@ -// #[cfg(feature = "unstable_grab")] -use rdev::{grab, Event}; - -fn main() { - // #[cfg(feature = "unstable_grab")] - let callback = |event: Event| -> Option { - println!("{}", serde_json::to_string_pretty(&event).unwrap()); - None // CapsLock is now effectively disabled - // if let EventType::KeyPress(Key::CapsLock) = event.event_type { - // } else { - // Some(event) - // } - }; - // This will block. - // #[cfg(feature = "unstable_grab")] - println!("{}", 1); - if let Err(error) = grab(callback) { - println!("Error: {:?}", error) - } -} diff --git a/addon/src/monitor/mod.rs b/addon/src/monitor/mod.rs deleted file mode 100644 index e52ce07..0000000 --- a/addon/src/monitor/mod.rs +++ /dev/null @@ -1,65 +0,0 @@ -use napi::{ - bindgen_prelude::*, - threadsafe_function::{ErrorStrategy, ThreadsafeFunction, ThreadsafeFunctionCallMode}, - JsBoolean, Result, -}; -use rdev::{grab, listen, Event}; -use std::{ - sync::mpsc::{self, Sender}, - thread::spawn, -}; - -#[napi(ts_args_type = "callback: (event: string) => void")] -pub fn on_input_event(callback: JsFunction) -> Result<()> { - let jsfn: ThreadsafeFunction = - callback.create_threadsafe_function(0, |ctx| Ok(vec![ctx.value]))?; - - spawn(|| { - if let Err(error) = listen(move |event| { - jsfn.call( - serde_json::to_string(&event).unwrap(), - ThreadsafeFunctionCallMode::NonBlocking, - ); - }) { - println!("Error: {:?}", error) - } - }); - Ok(()) -} - -#[napi(ts_args_type = "callback: (event: string) => boolean")] -pub fn grab_input_event(callback: JsFunction) -> Result<()> { - let jsfn: ThreadsafeFunction = - callback.create_threadsafe_function(0, |ctx| Ok(vec![ctx.value]))?; - - let gcallback = move |event: Event| -> Option { - let (s, r): (Sender, mpsc::Receiver) = mpsc::channel::(); - jsfn.call_with_return_value( - serde_json::to_string(&event).unwrap(), - ThreadsafeFunctionCallMode::NonBlocking, - move |e: JsBoolean| { - if let Ok(goon) = e.get_value() { - if !goon { - // 需要拦截事件 - s.send(false).unwrap(); - } - } - s.send(true).unwrap(); - Ok(()) - }, - ); - for i in r { - if !i { - return None; - } - } - Some(event) - }; - - spawn(|| { - if let Err(error) = grab(gcallback) { - println!("GrabError: {:?}", error) - } - }); - Ok(()) -} diff --git a/addon/src/shotcut/exelook/dib.rs b/addon/src/shotcut/exelook/dib.rs deleted file mode 100644 index 2f1c30b..0000000 --- a/addon/src/shotcut/exelook/dib.rs +++ /dev/null @@ -1,267 +0,0 @@ -use super::{Error, Result}; -use pelite::Error::Bounds; -use std::{convert::TryInto, fmt}; - -pub(crate) struct BitmapInfoHeader<'a> { - bytes: &'a [u8], -} - -#[derive(Debug)] -pub struct Pixel { - pub red: u8, - pub green: u8, - pub blue: u8, - pub alpha: u8, -} - -impl Pixel { - fn copy_to_vec(&self, vec: &mut Vec) { - vec.push(self.red); - vec.push(self.green); - vec.push(self.blue); - vec.push(self.alpha); - } -} - -pub struct DIB<'a> { - palette: &'a [u8], - xor_mask: &'a [u8], - and_mask: &'a [u8], - row_size: usize, - mask_row_size: usize, - real_height: usize, - width: usize, - bit_count: u16, - upside_down: bool, -} - -impl<'a> DIB<'a> { - fn pixel_at_1bpp(&self, x: usize, ry: usize, rym: usize) -> Pixel { - let idx = (self.xor_mask[ry + x / 8] >> (7 - (x % 8))) as usize & 1; - let blue = self.palette[idx * 4]; - let green = self.palette[idx * 4 + 1]; - let red = self.palette[idx * 4 + 2]; - let alpha = (self.and_mask[rym + x / 8] >> (7 - (x % 8))) & 1; - Pixel { - red, - green, - blue, - alpha: if alpha == 0 { 255 } else { 0 }, - } - } - fn pixel_at_4bpp(&self, x: usize, ry: usize, rym: usize) -> Pixel { - let idx = (self.xor_mask[ry + x / 2] >> (if x % 2 == 0 { 4 } else { 0 })) as usize & 15; - let blue = self.palette[idx * 4]; - let green = self.palette[idx * 4 + 1]; - let red = self.palette[idx * 4 + 2]; - let alpha = (self.and_mask[rym + x / 8] >> (7 - (x % 8))) & 1; - Pixel { - red, - green, - blue, - alpha: if alpha == 0 { 255 } else { 0 }, - } - } - fn pixel_at_8bpp(&self, x: usize, ry: usize, rym: usize) -> Pixel { - let idx = self.xor_mask[ry + x] as usize; - let blue = self.palette[idx * 4]; - let green = self.palette[idx * 4 + 1]; - let red = self.palette[idx * 4 + 2]; - let alpha = (self.and_mask[rym + x / 8] >> (7 - (x % 8))) & 1; - Pixel { - red, - green, - blue, - alpha: if alpha == 0 { 255 } else { 0 }, - } - } - fn pixel_at_24bpp(&self, x: usize, ry: usize, rym: usize) -> Pixel { - let blue = self.xor_mask[ry + x * 3]; - let green = self.xor_mask[ry + x * 3 + 1]; - let red = self.xor_mask[ry + x * 3 + 2]; - let alpha = (self.and_mask[rym + x / 8] >> (7 - (x % 8))) & 1; - Pixel { - red, - green, - blue, - alpha: if alpha == 0 { 255 } else { 0 }, - } - } - fn pixel_at_32bpp(&self, x: usize, ry: usize, rym: usize) -> Pixel { - let blue = self.xor_mask[ry + x * 4]; - let green = self.xor_mask[ry + x * 4 + 1]; - let red = self.xor_mask[ry + x * 4 + 2]; - let alpha = self.xor_mask[ry + x * 4 + 3]; - let mask = (self.and_mask[rym + x / 8] >> (7 - (x % 8))) & 1; - Pixel { - red, - green, - blue, - alpha: if alpha == 0 && mask == 0 { 255 } else { alpha }, - } - } - fn from_bytes<'b>(hdr: &'b BitmapInfoHeader, bytes: &'b [u8]) -> Result> { - match hdr.bit_count() { - 1 => { - let row_size = hdr.width() as usize / 8 + if hdr.width() % 8 != 0 { 1 } else { 0 }; - DIB::from_bytes_shared(hdr, bytes, 4 * 2, row_size) - } - 4 => { - let row_size = (hdr.width() / 2 + hdr.width() % 2) as usize; - DIB::from_bytes_shared(hdr, bytes, 4 * 16, row_size) - } - 8 => DIB::from_bytes_shared(hdr, bytes, 4 * 256, hdr.width() as usize), - 24 => DIB::from_bytes_shared(hdr, bytes, 0, hdr.width() as usize * 3), - 32 => DIB::from_bytes_shared(hdr, bytes, 0, hdr.width() as usize * 4), - _ => Err(Error::UnrecognizedBPP), - } - } - fn decode(&self) -> Vec { - let mut pixels = Vec::with_capacity(self.real_height * self.width * 4); - for y in 0..self.real_height { - for x in 0..self.width { - let ry = if self.upside_down { - (self.real_height - 1 - y) * self.row_size - } else { - y * self.row_size - }; - let rym = if self.upside_down { - (self.real_height - 1 - y) * self.mask_row_size - } else { - y * self.mask_row_size - }; - match self.bit_count { - // hoping that loop unswitching will kick in here - 1 => { - self.pixel_at_1bpp(x, ry, rym).copy_to_vec(&mut pixels); - } - 4 => { - self.pixel_at_4bpp(x, ry, rym).copy_to_vec(&mut pixels); - } - 8 => { - self.pixel_at_8bpp(x, ry, rym).copy_to_vec(&mut pixels); - } - 24 => { - self.pixel_at_24bpp(x, ry, rym).copy_to_vec(&mut pixels); - } - 32 => { - self.pixel_at_32bpp(x, ry, rym).copy_to_vec(&mut pixels); - } - _ => { - unreachable!(); - } - } - } - } - pixels - } - - fn from_bytes_shared<'b>( - hdr: &'b BitmapInfoHeader, - bytes: &'b [u8], - palette_size: usize, - mut row_size: usize, - ) -> Result> { - let header_size = 40; - let image_data_offset = header_size + palette_size; - let real_height = (hdr.height().abs() / 2) as usize; - if row_size % 4 != 0 { - row_size += 4 - row_size % 4; - } - let xor_mask_size = row_size * real_height; - let and_mask_offset = image_data_offset + xor_mask_size; - let mut mask_row_size = - hdr.width() as usize / 8 + if hdr.width() as usize % 8 != 0 { 1 } else { 0 }; - if mask_row_size % 4 != 0 { - mask_row_size += 4 - mask_row_size % 4; - } - let and_mask_size = mask_row_size * real_height; - let image_end = and_mask_offset + and_mask_size; - let and_mask = bytes - .get(and_mask_offset..image_end) - .ok_or_else(|| Error::from(Bounds))?; - let palette = &bytes[header_size..image_data_offset]; // first check dominates the following checks - let xor_mask = &bytes[image_data_offset..and_mask_offset]; // keep it above them to use only one .get - let upside_down = hdr.height() > 0; - Ok(DIB { - palette, - xor_mask, - and_mask, - row_size, - mask_row_size, - real_height, - upside_down, - width: hdr.width() as usize, - bit_count: hdr.bit_count(), - }) - } -} - -pub(crate) fn decode_dib(bytes: &[u8]) -> Result> { - let hdr = BitmapInfoHeader::from_bytes(bytes)?; - let dib = DIB::from_bytes(&hdr, bytes)?; - Ok(dib.decode()) -} - -impl<'a> BitmapInfoHeader<'a> { - pub(crate) fn from_bytes(bytes: &[u8]) -> Result { - if bytes.len() >= 40 { - Ok(BitmapInfoHeader { - bytes: &bytes[..40], - }) - } else { - Err(Bounds.into()) - } - } - pub(crate) fn size(&self) -> u32 { - u32::from_le_bytes(self.bytes[0..4].try_into().unwrap()) - } - pub(crate) fn width(&self) -> i32 { - i32::from_le_bytes(self.bytes[4..8].try_into().unwrap()) - } - pub(crate) fn height(&self) -> i32 { - i32::from_le_bytes(self.bytes[8..12].try_into().unwrap()) - } - pub(crate) fn planes(&self) -> u16 { - u16::from_le_bytes(self.bytes[12..14].try_into().unwrap()) - } - pub(crate) fn bit_count(&self) -> u16 { - u16::from_le_bytes(self.bytes[14..16].try_into().unwrap()) - } - pub(crate) fn compression(&self) -> u32 { - u32::from_le_bytes(self.bytes[16..20].try_into().unwrap()) - } - pub(crate) fn image_size(&self) -> u32 { - u32::from_le_bytes(self.bytes[20..24].try_into().unwrap()) - } - pub(crate) fn x_px_per_meter(&self) -> i32 { - i32::from_le_bytes(self.bytes[24..28].try_into().unwrap()) - } - pub(crate) fn y_px_per_meter(&self) -> i32 { - i32::from_le_bytes(self.bytes[28..32].try_into().unwrap()) - } - pub(crate) fn colors_used(&self) -> u32 { - u32::from_le_bytes(self.bytes[32..36].try_into().unwrap()) - } - pub(crate) fn colors_important(&self) -> u32 { - u32::from_le_bytes(self.bytes[36..40].try_into().unwrap()) - } -} - -impl<'a> fmt::Debug for BitmapInfoHeader<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("BitmapInfoHeader") - .field("size", &self.size()) - .field("width", &self.width()) - .field("height", &self.height()) - .field("planes", &self.planes()) - .field("bit_count", &self.bit_count()) - .field("compression", &self.compression()) - .field("image_size", &self.image_size()) - .field("x_px_per_meter", &self.x_px_per_meter()) - .field("y_px_per_meter", &self.y_px_per_meter()) - .field("colors_used", &self.colors_used()) - .field("colors_important", &self.colors_important()) - .finish() - } -} diff --git a/addon/src/shotcut/exelook/mod.rs b/addon/src/shotcut/exelook/mod.rs deleted file mode 100644 index efb0b8c..0000000 --- a/addon/src/shotcut/exelook/mod.rs +++ /dev/null @@ -1,197 +0,0 @@ -// 借用该项目源码(Apache-2.0 license): https://github.com/Lucius-Q-User/ExeLook -mod dib; - -use base64::{engine::general_purpose, Engine}; - -use pelite::Error::Bounds; -use pelite::{ - self, - resources::{FindError, Resources}, - FileMap, PeFile, -}; - -use std::{ - convert::{From, TryInto}, - io, - str::Utf8Error, -}; - -impl<'a> BitmapInfoHeader<'a> { - pub(crate) fn from_bytes(bytes: &[u8]) -> Result { - if bytes.len() >= 40 { - Ok(BitmapInfoHeader { - bytes: &bytes[..40], - }) - } else { - Err(Bounds.into()) - } - } - pub(crate) fn width(&self) -> i32 { - i32::from_le_bytes(self.bytes[4..8].try_into().unwrap()) - } - pub(crate) fn height(&self) -> i32 { - i32::from_le_bytes(self.bytes[8..12].try_into().unwrap()) - } - pub(crate) fn planes(&self) -> u16 { - u16::from_le_bytes(self.bytes[12..14].try_into().unwrap()) - } - pub(crate) fn bit_count(&self) -> u16 { - u16::from_le_bytes(self.bytes[14..16].try_into().unwrap()) - } - pub(crate) fn compression(&self) -> u32 { - u32::from_le_bytes(self.bytes[16..20].try_into().unwrap()) - } -} - -struct BitmapInfoHeader<'a> { - bytes: &'a [u8], -} - -#[derive(Debug)] -pub enum Error { - Io(io::Error), - Pe(pelite::Error), - UTF(Utf8Error), - NoIconFound, - PlanarNotSupported, - UnrecognizedBPP, - UnknownCompression, - MalformedPng, -} - -impl From for Error { - fn from(err: Utf8Error) -> Self { - Error::UTF(err) - } -} - -impl From for Error { - fn from(err: io::Error) -> Self { - Error::Io(err) - } -} - -impl From for Error { - fn from(err: pelite::Error) -> Self { - Error::Pe(err) - } -} - -impl From for Error { - fn from(_err: FindError) -> Self { - Error::NoIconFound - } -} - -struct PngHeader<'a> { - bytes: &'a [u8], -} - -impl<'a> PngHeader<'a> { - fn from_bytes<'b>(bytes: &'b [u8]) -> Result> { - if bytes.len() < 24 || bytes[12..16] != [b'I', b'H', b'D', b'R'] { - Err(Error::MalformedPng) - } else { - Ok(PngHeader { bytes }) - } - } - fn width(&self) -> i32 { - u32::from_be_bytes(self.bytes[16..20].try_into().unwrap()) as i32 - } - fn height(&self) -> i32 { - u32::from_be_bytes(self.bytes[20..24].try_into().unwrap()) as i32 - } -} - -pub type Result = ::std::result::Result; - -fn get_resources(bytes: &[u8]) -> Result { - let res = PeFile::from_bytes(bytes)?.resources(); - if let Err(pelite::Error::Null) = res { - Err(Error::NoIconFound) - } else { - res.map_err(Into::into) - } -} - -fn is_png(bytes: &[u8]) -> bool { - bytes.starts_with(&[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]) -} - -fn icon_compare_key(icon: &[u8]) -> Result { - Ok(if is_png(icon) { - let hdr = PngHeader::from_bytes(icon)?; - (hdr.width(), hdr.height(), 64) - } else { - let hdr = BitmapInfoHeader::from_bytes(icon)?; - (hdr.width(), hdr.height(), hdr.bit_count()) - }) -} - -fn best_icon<'a>(mut icons: impl Iterator>) -> Result<&'a [u8]> { - let mut cur_max: &'a [u8] = if let Some(x) = icons.next() { - x? - } else { - return Err(Error::NoIconFound); - }; - let mut cur_max_key = icon_compare_key(cur_max)?; - for icon in icons { - let icon = icon?; - let key = icon_compare_key(icon)?; - if key > cur_max_key { - cur_max = icon; - cur_max_key = key; - } - } - Ok(cur_max) -} - -#[napi] -pub struct ShorCutImg { - pub data: Vec, - pub width: i32, - pub height: i32, -} - -fn _exelook(file_name: String) -> Result { - let map_region = FileMap::open(&file_name)?; - let resources = get_resources(map_region.as_ref())?; - let (_, icon_group) = resources.icons().next().ok_or(Error::NoIconFound)??; - let icons = icon_group - .entries() - .iter() - .map(|ent| icon_group.image(ent.nId).map_err(Into::into)); - - let best_icon = best_icon(icons)?; - if is_png(best_icon) { - Ok(ShorCutImg { - data: best_icon.to_owned(), - width: 0, - height: 0, - }) - } else { - let infoheader = BitmapInfoHeader::from_bytes(best_icon)?; - if infoheader.planes() != 1 { - return Err(Error::PlanarNotSupported); - } - if infoheader.compression() != 0 { - return Err(Error::UnknownCompression); - } - let data = dib::decode_dib(best_icon)?; - - Ok(ShorCutImg { - data, - width: infoheader.width(), - height: infoheader.height() / 2, - }) - } -} - -#[napi] -pub fn exe_look_base64(file_name: String) -> napi::Result { - let look = _exelook(file_name); - match look { - Ok(l) => Ok("data:image/*;base64,".to_owned() + &general_purpose::STANDARD.encode(l.data)), - Err(e) => Err(napi::Error::from_reason(format!("{:?}", e))), - } -} diff --git a/addon/src/shotcut/mod.rs b/addon/src/shotcut/mod.rs deleted file mode 100644 index 36bc8a7..0000000 --- a/addon/src/shotcut/mod.rs +++ /dev/null @@ -1,69 +0,0 @@ -use lnk_parser::LNKParser; -use napi::Result; -use std::path::{absolute, PathBuf}; -pub mod exelook; - -#[napi] -pub fn parse_lnk(path: String) -> Result { - let lnk_file = LNKParser::from_path(&path); - match lnk_file { - Ok(f) => { - let name_string = f.get_name_string().as_ref().map(|f| f.to_string()); - let full_path = f - .get_target_full_path() - .as_ref() - .map(|f| { - if f.starts_with("MY_COMPUTER\\") { - Some(f.to_string().replace("MY_COMPUTER\\", "")) - } else { - Some(f.to_string()) - } - }) - .map_or(None, |f| f); - let working_dir = f.get_working_dir().as_ref().map(|f| f.to_string()); - let icon_location = f.get_icon_location().as_ref().map(|f| f.to_string()); - - Ok(LnkData { - name_string, - full_path, - working_dir, - icon_location, - }) - } - Err(_) => { - let lnk_path = std::path::Path::new(&path); - let lnk = parselnk::Lnk::try_from(lnk_path); - match lnk { - Ok(l) => { - let s = absolute( - PathBuf::from(lnk_path) - .parent() - .unwrap() - .join(l.string_data.relative_path.unwrap()), - ) - .map_or(None, |f| Some(f)); - - Ok(LnkData { - name_string: l.string_data.name_string, - full_path: convert(s), - working_dir: convert(l.string_data.working_dir), - icon_location: convert(l.string_data.icon_location), - }) - } - Err(e) => Err(napi::Error::from_reason(e.to_string())), - } - } - } -} - -#[napi] -pub struct LnkData { - pub name_string: Option, - pub full_path: Option, - pub working_dir: Option, - pub icon_location: Option, -} - -fn convert(p: Option) -> Option { - p.map(|f| f.to_string_lossy().to_string()) -} diff --git a/addon/src/simulation/mod.rs b/addon/src/simulation/mod.rs deleted file mode 100644 index 9358790..0000000 --- a/addon/src/simulation/mod.rs +++ /dev/null @@ -1,122 +0,0 @@ -use enigo::{Enigo, KeyboardControllable, MouseButton, MouseControllable}; -use napi::Result; - -#[napi] -pub fn send_keyboard_simulation(cmd: String) -> Result<()> { - let mut enigo = Enigo::new(); - if let Err(e) = enigo.key_sequence_parse_try(&cmd) { - Err(napi::Error::from_reason(e.to_string())) - } else { - Ok(()) - } -} - -#[napi] -#[derive(Debug)] -pub enum MouseBtn { - Left, - Middle, - Right, - Back, - Forward, -} - -#[napi] -pub enum MouseAction { - Locaion, - MoveRelative, - MoveTo, - ScrollX, - ScrollY, - Up, - Down, - Click, -} - -#[napi(object)] -pub struct MouseActionInput { - pub action: MouseAction, - pub data: Option, - pub button: Option, -} - -#[napi(object)] -pub struct Position { - pub x: i32, - pub y: i32, -} - -fn convert_btn(btn: Option) -> Option { - match btn { - Some(MouseBtn::Left) => Some(MouseButton::Left), - Some(MouseBtn::Middle) => Some(MouseButton::Middle), - Some(MouseBtn::Right) => Some(MouseButton::Right), - #[cfg(any(target_os = "windows", target_os = "linux"))] - Some(MouseBtn::Back) => Some(MouseButton::Back), - #[cfg(any(target_os = "windows", target_os = "linux"))] - Some(MouseBtn::Forward) => Some(MouseButton::Forward), - #[allow(unreachable_patterns)] - Some(b) => { - println!("未识别按钮: {:#?}", b); - None - } - None => { - println!("未输入按钮"); - None - } - } -} - -#[napi] -pub fn send_mouse_simulation(input: MouseActionInput) -> Option { - let mut enigo = Enigo::new(); - - match input.action { - MouseAction::MoveRelative => { - if let Some(p) = input.data { - enigo.mouse_move_relative(p.x, p.y); - } - None - } - MouseAction::MoveTo => { - if let Some(p) = input.data { - enigo.mouse_move_to(p.x, p.y); - } - None - } - MouseAction::ScrollX => { - if let Some(p) = input.data { - enigo.mouse_scroll_x(p.x); - } - None - } - MouseAction::ScrollY => { - if let Some(p) = input.data { - enigo.mouse_scroll_y(p.y); - } - None - } - MouseAction::Locaion => { - let (x, y) = enigo.mouse_location(); - Some(Position { x, y }) - } - MouseAction::Down => { - if let Some(b) = convert_btn(input.button) { - enigo.mouse_down(b); - } - None - } - MouseAction::Up => { - if let Some(b) = convert_btn(input.button) { - enigo.mouse_up(b); - } - None - } - MouseAction::Click => { - if let Some(b) = convert_btn(input.button) { - enigo.mouse_click(b); - } - None - } - } -} diff --git a/package.json b/package.json index 6f9a8dd..76e90b2 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,62 @@ -{ - "name": "rubick-native", - "version": "0.0.16", - "type": "module", - "main": "dist/index.cjs", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "cd addon && npm run build && cd .. && tsup --cjsInterop", - "prepublishOnly": "node ./prepub.js" - }, - "devDependencies": { - "@types/node": "^20.10.3", - "picomatch": "^3.0.1", - "tsup": "^8.0.1", - "typescript": "^5.3.2" - }, - "dependencies": { - "@miniben90/x-win": "^1.3.1", - "execa": "^8.0.1", - "fdir": "^6.1.1" - }, - "files": [ - "README.md", - "LICENSE", - "dist/" - ], - "tsup": { - "entry": [ - "src/index.ts" - ], - "format": [ - "cjs", - "esm" - ], - "clean": true, - "dts": true, - "treeshake": true, - "shims": true - } +{ + "name": "rubick-native", + "version": "0.0.16", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "module": "./dist/index.mjs", + "napi": { + "name": "rubick-native", + "triples": { + "additional": [ + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "x86_64-unknown-linux-musl", + "aarch64-apple-darwin", + "universal-apple-darwin", + "aarch64-pc-windows-msvc", + "i686-pc-windows-msvc" + ] + } + }, + "engines": { + "node": ">= 10" + }, + "scripts": { + "artifacts": "napi artifacts", + "build": "napi build --platform --release && node ./postbuild.js && tsup --cjsInterop", + "build:debug": "napi build --platform", + "prepublishOnly": "napi prepublish -t npm", + "universal": "napi universal", + "version": "napi version" + }, + "devDependencies": { + "@napi-rs/cli": "^2.16.5", + "@types/node": "^20.10.3", + "picomatch": "^3.0.1", + "tsup": "^8.0.1", + "typescript": "^5.3.2" + }, + "dependencies": { + "@miniben90/x-win": "^1.3.1", + "execa": "^8.0.1", + "fdir": "^6.1.1" + }, + "files": [ + "README.md", + "LICENSE", + "dist/" + ], + "tsup": { + "entry": [ + "lib/index.ts" + ], + "format": [ + "cjs", + "esm" + ], + "clean": true, + "dts": true, + "treeshake": true, + "shims": true + } } \ No newline at end of file diff --git a/prepub.js b/prepub.js deleted file mode 100644 index 9822df2..0000000 --- a/prepub.js +++ /dev/null @@ -1,5 +0,0 @@ -import { readFileSync, writeFileSync } from "fs" - -const pkg = { ...readFileSync('./package.json', 'utf8'), optionalDependencies: readFileSync('./addon/package.json', 'utf8').optionalDependencies } - -writeFileSync('./package.json', pkg) \ No newline at end of file diff --git a/src/clipboard.ts b/src/clipboard.ts deleted file mode 100644 index 84dc59a..0000000 --- a/src/clipboard.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { getClipboardContent as gcbc } from "../addon" - -interface ClipboardContentText { - type: "text", - content: string -} - -interface ClipboardContentFile { - type: "file", - content: string[] -} - -export type ClipboardContent = ClipboardContentText | ClipboardContentFile | null - -export const getClipboardContent = (): ClipboardContent => { - const c = gcbc() - if (c?.type === 'text') { - return { - type: "text", - content: c.content.at(0) - } - } else { - return c as ClipboardContent - } -} \ No newline at end of file diff --git a/src/deprecated/cb.ts b/src/deprecated/cb.ts deleted file mode 100644 index 1fa1ebe..0000000 --- a/src/deprecated/cb.ts +++ /dev/null @@ -1,76 +0,0 @@ -// import { arch, platform, homedir } from "os" -// import { onClipboardChange } from "../../addon" -// import got from "got" -// import { Extract } from "unzip-stream" -// import { access, mkdir, constants } from "fs/promises" -// import { join } from "path" -// import { execaCommand } from "execa" -// const getKey = (stdout: string, key: string) => stdout.split(`"${key}": `).at(1)?.split(`,\r\n`).at(0)! -// import { asyncFolderWalker } from "async-folder-walker" - -// // 启动剪切板程序 -// export default async () => { -// let latestNum = 0 -// const repoURL = "https://ghproxy.com/https://github.com/Slackadays/Clipboard" -// let a = arch() -// let p: string = platform() -// // 确保目录存在 -// const dirPath = join(homedir(), "cb") -// try { -// await access(dirPath, constants.O_DIRECTORY) -// } catch { -// await mkdir(dirPath) -// } -// // cb 路径 -// const cbPath = join(dirPath, 'bin', p === "win32" ? "cb.exe" : "cb") -// // 同步剪切板内容 -// const execCB = async () => { -// const stdout = (await execaCommand(cbPath + " info", { env: { "CLIPBOARD_SILENT": "true" } })).stdout -// // 最新缓存 -// latestNum = Number(getKey(stdout, "totalEntries")) - 1 -// return stdout -// } -// try { -// await access(cbPath) -// } catch { -// switch (a) { -// case "arm64": -// break; -// case "x64": -// a = "amd64" -// break; -// default: -// throw new Error("Not Support Your Sys Arch") -// } -// switch (p) { -// case "freebsd": -// case "linux": -// case "netbsd": -// case "openbsd": -// break; -// case "win32": -// p = "windows" -// break; -// case "darwin": -// p = "macos" -// break; -// default: -// throw new Error("Not Support Your Sys Arch") -// } -// const latest = (await fetch(repoURL + "/releases/latest")).url.split("/").pop() -// const durl = repoURL + `/releases/download/${latest}/clipboard-${p}-${p === "macos" ? 'arm64-amd64' : a}.zip` -// got.stream(durl).pipe(Extract({ path: dirPath })) -// } finally { -// // 剪切板历史路径 -// const basePath = join(getKey(await execCB(), "path").replaceAll('"', ''), "data") -// // 剪切板监听 -// onClipboardChange(execCB) -// return { -// latest: () => { -// const latestPath = join(basePath, latestNum.toString()) -// const walker = asyncFolderWalker(latestPath, { maxDepth: 0 }) -// return walker -// } -// } -// } -// } diff --git a/src/deprecated/package.json b/src/deprecated/package.json deleted file mode 100644 index 652ba33..0000000 --- a/src/deprecated/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "module", - "devDependencies": { - "@types/got": "^9.6.12", - "@types/node": "^20.7.1", - "@types/unzip-stream": "^0.3.2" - }, - "dependencies": { - "async-folder-walker": "^2.2.1", - "execa": "^8.0.1", - "got": "^13.0.0", - "unzip-stream": "^0.3.1" - } -} \ No newline at end of file diff --git a/src/folder.ts b/src/folder.ts deleted file mode 100644 index b4a48c3..0000000 --- a/src/folder.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { activeWindow } from "@miniben90/x-win" -import { lstat } from "fs/promises" -import { homedir } from "os" -import { join } from "path" - -// 获取活动的文件夹路径 -export const getFolderOpenPath = async () => { - if (process.platform === 'darwin') { - const { execa } = await import("execa") - const res = await execa('osascript', ['-e', ` - tell app "Finder" - try - POSIX path of (insertion location as alias) - on error - POSIX path of (path to desktop folder as alias) - end try - end tell - `]) - return res.stdout; - } - - if (process.platform === 'win32') { - const win = activeWindow() - if (win.info.execName === 'explorer') { - const base = homedir() - let path: string - switch (win.title) { - case 'Home': - case '主文件夹': - path = base - break; - - case 'Downloads': - case '下载': - path = join(base, 'Downloads') - break; - - case 'Documents': - case '文档': - path = join(base, 'Documents') - break; - - case 'Desktop': - case '桌面': - path = join(base, 'Desktop') - break; - - case 'Videos': - case '视频': - path = join(base, 'Videos') - break; - - case 'Pictures': - case '图片': - path = join(base, 'Pictures') - break; - - case 'Music': - case '音乐': - path = join(base, 'Music') - break; - - case 'Links': - case '链接': - path = join(base, 'Music') - break; - - default: - path = win.title - break; - } - try { - const s = await lstat(path) - if (s.isDirectory()) { - return path - } - } catch { - return null - } - } - } - - // todo linux - return null -} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 6b7a6bd..0000000 --- a/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { activeWindow as getActiveWin, openWindows as getOpenWin } from "@miniben90/x-win" -export * from "./clipboard" -export * from "./folder" -export * from "./simulation" -export * from "./monitor" -export * from './sysapp' \ No newline at end of file diff --git a/src/monitor.ts b/src/monitor.ts deleted file mode 100644 index 4c77ffd..0000000 --- a/src/monitor.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { onInputEvent as oie, grabInputEvent as gie } from "../addon" - -export type EventKeyType = "Alt" | - "AltGr" | - "Backspace" | - "CapsLock" | - "ControlLeft" | - "ControlRight" | - "Delete" | - "DownArrow" | - "End" | - "Escape" | - "F1" | - "F10" | - "F11" | - "F12" | - "F2" | - "F3" | - "F4" | - "F5" | - "F6" | - "F7" | - "F8" | - "F9" | - "Home" | - "LeftArrow" | - "MetaLeft" | - "MetaRight" | - "PageDown" | - "PageUp" | - "Return" | - "RightArrow" | - "ShiftLeft" | - "ShiftRight" | - "Space" | - "Tab" | - "UpArrow" | - "PrintScreen" | - "ScrollLock" | - "Pause" | - "NumLock" | - "BackQuote" | - "Num1" | - "Num2" | - "Num3" | - "Num4" | - "Num5" | - "Num6" | - "Num7" | - "Num8" | - "Num9" | - "Num0" | - "Minus" | - "Equal" | - "KeyQ" | - "KeyW" | - "KeyE" | - "KeyR" | - "KeyT" | - "KeyY" | - "KeyU" | - "KeyI" | - "KeyO" | - "KeyP" | - "LeftBracket" | - "RightBracket" | - "KeyA" | - "KeyS" | - "KeyD" | - "KeyF" | - "KeyG" | - "KeyH" | - "KeyJ" | - "KeyK" | - "KeyL" | - "SemiColon" | - "Quote" | - "BackSlash" | - "IntlBackslash" | - "KeyZ" | - "KeyX" | - "KeyC" | - "KeyV" | - "KeyB" | - "KeyN" | - "KeyM" | - "Comma" | - "Dot" | - "Slash" | - "Insert" | - "KpReturn" | - "KpMinus" | - "KpPlus" | - "KpMultiply" | - "KpDivide" | - "Kp0" | - "Kp1" | - "Kp2" | - "Kp3" | - "Kp4" | - "Kp5" | - "Kp6" | - "Kp7" | - "Kp8" | - "Kp9" | - "KpDelete" | - "Function" | { - Unknown: number - } - -export type EventBtnType = "Left" | - "Right" | - "Middle" | { - Unknown: number - } - -export interface MouseKeyBoardEventOther { - time: { - secs_since_epoch: number, - nanos_since_epoch: number - }, - name: null, - event: { - type: "KeyRelease" | "ButtonPress" | "ButtonRelease" - value: EventKeyType - } | { - type: "MouseMove" - value: { x: number, y: number } - } | { - type: "Wheel", - value: { delta_x: number, delta_y: number } - } -} - -export interface MouseKeyBoardEventKeyPress { - time: { - secs_since_epoch: number, - nanos_since_epoch: number - }, - name: string, - event: { - type: "KeyPress" - value: EventKeyType - } -} - -export type MouseKeyBoardEvent = MouseKeyBoardEventOther | MouseKeyBoardEventKeyPress -const parse = (e: string) => { - const event = JSON.parse(e) - const [type, value] = Object.entries(event.event_type).pop()! - return { - time: event.time, - name: event.name, - event: { type, value } - } as MouseKeyBoardEvent -} -export const onInputEvent = (callback: (event: MouseKeyBoardEvent) => void) => oie((event) => callback(parse(event))) -export const grabInputEvent = (callback: (event: MouseKeyBoardEvent) => boolean) => gie((event) => callback(parse(event))) \ No newline at end of file diff --git a/src/simulation.ts b/src/simulation.ts deleted file mode 100644 index 4ebad03..0000000 --- a/src/simulation.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - Position, - sendKeyboardSimulation as ks, - sendMouseSimulation as ms, -} from "../addon"; - -export type MouseBtn = - | "Left" - | "Middle" - | "Right" - | "Back" - | "Forward" - -export interface MoveMoveInput { - type: "relative" | "absolute"; - data: Position; -} - -// example: {+CTRL}a{-CTRL}{+SHIFT}Hello World{-SHIFT} -// 所有可用键 https://github.com/enigo-rs/enigo/blob/master/src/keycodes.rs -export const sendKeyboardSimulation = (cmd: string) => ks(cmd); - -export const mouseScrollX = (len: number) => { - ms({ action: 3, data: { x: len, y: 0 } }); -} - -export const mouseScrollY = (len: number) => { - ms({ action: 4, data: { x: 0, y: len } }); -}; - -export const mouseMove = (input: MoveMoveInput) => { - ms({ action: input.type === "absolute" ? 2 : 1, data: input.data }); -}; - -export const mouseLocaion = () => ms({ action: 0 }) - -const mouseDUC = (btn: MouseBtn, action: 5 | 6 | 7) => { - let button = 0; - switch (btn) { - case "Left": - break; - case "Middle": - button = 1; - break; - case "Right": - button = 2; - break; - case "Back": - button = 3; - break; - case "Forward": - button = 4; - break; - default: - break; - } - ms({ action, button }); -}; - -export const mouseDown = (btn: MouseBtn) => mouseDUC(btn, 6) -export const mouseUp = (btn: MouseBtn) => mouseDUC(btn, 5) -export const mouseClick = (btn: MouseBtn) => mouseDUC(btn, 7) diff --git a/src/sysapp/index.ts b/src/sysapp/index.ts deleted file mode 100644 index 6684fe2..0000000 --- a/src/sysapp/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { shortcutWin } from "./windows" -import { platform } from "os" -import { exeLookBase64 } from "../../addon" -import { ParsedPath } from "path"; - -export type CallBack = (app: App) => void | Promise - -export interface App extends ParsedPath { - name: string; - description: string; - execPath: string; - shortCutPath: string; - workingDir: string; -} - -// todo linux/macos -export const getSystemApp = async (callback: CallBack, extraPath?: string[]) => { - switch (platform()) { - case "win32": - return await shortcutWin(callback, extraPath) - - // case "linux": - // break; - - // case "darwin": - // break; - - default: - throw new Error("Your System is Not Supported"); - } -} - -export const getAppIcon = (path: string): string => { - switch (platform()) { - case "win32": - return exeLookBase64(path) - - // case "linux": - // break; - - // case "darwin": - // break; - - default: - throw new Error("Your System is Not Supported"); - } - -} \ No newline at end of file diff --git a/src/sysapp/windows.ts b/src/sysapp/windows.ts deleted file mode 100644 index d9495fe..0000000 --- a/src/sysapp/windows.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { join, parse } from "path"; -import { homedir } from "os" -import { fdir } from "fdir"; -import { parseLnk } from "../../addon" -import { CallBack } from "."; - -export const shortcutWin = async (callback: CallBack, extraPath: string[] = []) => { - const hdir = homedir() - const f = new fdir().glob("./**/*.lnk").withFullPaths() - .filter((t) => { - const d = parseLnk(t) - callback({ - ...parse(t), - description: d.nameString, - execPath: d.fullPath, - shortCutPath: t, - workingDir: d.workingDir - }) - return true - }) - const defaultPaths = [ - join(process.env.ProgramData, "/Microsoft/Windows/Start Menu/Programs"), - join(process.env.AppData, "/Microsoft/Windows/Start Menu/Programs"), - join(process.env.PUBLIC, 'Desktop'), - join(hdir, 'Desktop'), - ...extraPath - ] - await Promise.allSettled(defaultPaths.map(path => f.crawl(path).withPromise())) -} diff --git a/test.ts b/test.ts deleted file mode 100644 index 11d204c..0000000 --- a/test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { existsSync } from "fs"; -import { getSystemApp } from "./src" - -console.time("1") -await getSystemApp((e) => { - if (!existsSync(e.execPath)) { - console.log(e); - } -}) -console.timeEnd("1") diff --git a/tsconfig.json b/tsconfig.json index 5afb62b..5ce0819 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "outDir": "dist", "esModuleInterop": true, "module": "ESNext", "moduleResolution": "Node", @@ -8,9 +7,12 @@ "lib": [ "ESNext", "DOM" - ] - }, - "include": [ - "./src/**/*" - ] + ], + "baseUrl": ".", + "paths": { + "addon": [ + "./index" + ] + } + } } \ No newline at end of file