Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7e2bc15
feat: initialize DeskAct core and CI
PekingSpades Jan 18, 2026
315b0cc
Refactor multiple packages
PekingSpades Jan 18, 2026
7bf9b38
Add non-Windows DPI awareness stubs
PekingSpades Jan 19, 2026
8a0ce1f
feat(examples): add mouse demo and DPI init prompt
PekingSpades Jan 19, 2026
0a21136
feat(examples): enhance mouse demo with display-aware controls
PekingSpades Jan 25, 2026
0a2b404
fix(macos): implement real multi-click event sequence
PekingSpades Jan 25, 2026
a4e82d7
fix(mouse): use dragged events on macOS
PekingSpades Jan 25, 2026
5d2d9a7
refactor(darwin): route display drag through mouse drag
PekingSpades Jan 25, 2026
a127f39
feat(keyboardstate): add modifier and lock state API
PekingSpades Jan 26, 2026
74be2d2
feat(keyboard)!: drop key aliases and add supported key list
PekingSpades Jan 26, 2026
e8a1c8f
feat(window): add window listing and display regions
PekingSpades Jan 26, 2026
93daa83
feat(apps): add app discovery and icon export example
PekingSpades Jan 26, 2026
1342cbf
ci: upload artifacts to server and shorten retention
PekingSpades Jan 26, 2026
6487990
Fix MSI icon lookup and enhance app logs
PekingSpades Jan 26, 2026
f62bba3
Handle non-BMP Unicode input on macOS and Windows
PekingSpades Jan 28, 2026
8151c99
Fix macOS alias resolution and type conversions
PekingSpades Jan 28, 2026
4cd305a
feat(examples): extend keyboard demo and CI build
PekingSpades Jan 28, 2026
4143381
Fix darwin build: clean import and handle C.bool
PekingSpades Jan 28, 2026
687877e
Fix linux build: include stdint.h for uint32_t
PekingSpades Jan 29, 2026
29de06d
Fix CI artifact uploads (mkdir + 3xx handling)
PekingSpades Jan 29, 2026
850518d
chore(ci): force Go rebuilds to avoid stale C cache artifacts
PekingSpades Jan 30, 2026
a3f56cc
ci: use PR head sha for server upload paths
PekingSpades Jan 30, 2026
d7263ed
feat(display): add ElectronID field compatible with Electron screen API
PekingSpades Feb 27, 2026
ba903dc
fix(ci): handle macOS electron-builder output directory naming
PekingSpades Feb 27, 2026
58a301c
fix(ci): add libxrandr-dev for Linux builds
PekingSpades Feb 27, 2026
55176d0
refactor(display): move SuperFastHash from C to Go for electronId com…
PekingSpades Feb 28, 2026
bc6a4ba
Merge commit '55176d0451211b770889ca117bcb740a312625bf' into dev
PekingSpades Feb 28, 2026
4aaa7ff
fix(mouse): pass explicit start coordinates through Drag call chain
PekingSpades Feb 28, 2026
b1be287
Fix darwin build: add forward declaration for location()
PekingSpades Feb 28, 2026
b774488
Add capture backends and DXGI desktop duplication
PekingSpades Apr 4, 2026
c28a807
Trigger CI for PR #3
PekingSpades Apr 4, 2026
4bf6329
Fix CI build regressions
PekingSpades Apr 4, 2026
190569c
Restore CGDisplay as macOS default capture backend
PekingSpades Apr 4, 2026
37f2a06
Stabilize Windows DXGI capture threading
PekingSpades Apr 5, 2026
b84225e
Fix Windows DXGI D3D11 vtable calls
PekingSpades Apr 5, 2026
33ff7b9
Add secure window capture example controls
PekingSpades Apr 5, 2026
fee1e6d
Update Electron example content protection support
PekingSpades Apr 5, 2026
af5e182
Show capture backend in overview labels
PekingSpades Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions .github/workflows/build-electron-display.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
name: Build Electron Display

on:
push:
branches: [master, main]
pull_request:
branches: [master, main]
workflow_dispatch:

jobs:
build:
strategy:
matrix:
include:
- os: windows-latest
platform: win
arch: x64
artifact-name: electron-display-win-x64
- os: macos-15
platform: mac
arch: arm64
artifact-name: electron-display-mac-arm64

runs-on: ${{ matrix.os }}

defaults:
run:
working-directory: examples/display/electron

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
run: npm install

- name: Build
shell: bash
run: npx electron-builder --${{ matrix.platform }} --${{ matrix.arch }} --publish never

- name: Compress build output
shell: bash
run: |
# electron-builder output directories:
# Windows: dist/win-unpacked/
# macOS: dist/mac-arm64/ (contains .app bundle)
ls -la dist/
output_dir=""
for d in dist/*-unpacked dist/mac-*; do
if [ -d "$d" ]; then
output_dir="$d"
break
fi
done
if [ -z "$output_dir" ]; then
echo "No build output directory found"
exit 1
fi
echo "Found output dir: ${output_dir}"
archive_name="${{ matrix.artifact-name }}.zip"
if command -v zip &>/dev/null; then
(cd "$output_dir" && zip -ry "../../${archive_name}" .)
else
powershell -Command "Compress-Archive -Path '${output_dir}\*' -DestinationPath '${archive_name}'"
fi
echo "Compressed: ${archive_name}"
ls -lh "${archive_name}"

- name: Upload artifacts
id: upload_github_artifacts
uses: actions/upload-artifact@v4
continue-on-error: true
with:
name: ${{ matrix.artifact-name }}
path: examples/display/electron/${{ matrix.artifact-name }}.zip
compression-level: 0
retention-days: 7

- name: Upload artifacts to server
shell: bash
continue-on-error: true
env:
ARTIFACT_SERVER_URL: ${{ secrets.ARTIFACT_SERVER_URL }}
ARTIFACT_USER: ${{ secrets.ARTIFACT_SERVER_USER }}
ARTIFACT_PASSWORD: ${{ secrets.ARTIFACT_SERVER_PASSWORD }}
COMMIT_HASH: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
set -euo pipefail
repo_name="${GITHUB_REPOSITORY##*/}"
date_str="$(date -u +%Y-%m-%d)"
commit_hash="${COMMIT_HASH}"
base_path="/${repo_name}/${date_str}/${commit_hash}/"
server_url="${ARTIFACT_SERVER_URL%/}"
auth="${ARTIFACT_USER}:${ARTIFACT_PASSWORD}"

curl_status() {
curl --http1.1 --silent --output /dev/null -w "%{http_code}" "$@"
}

ensure_dir() {
local dir="$1"
local url="${server_url}${dir}"
local status
status=$(curl_status -u "${auth}" "${url}")
if [[ "${status}" == 2* ]]; then
echo "Dir exists: ${dir}"
return 0
fi
if [[ "${status}" != "404" ]]; then
echo "Unexpected status ${status} when checking ${dir}"
return 1
fi
local target="${dir%/}"
local parent="${target%/*}/"
local name="${target##*/}"
echo "Creating dir: ${dir}"
status=$(curl_status -u "${auth}" -F "mkdir=${name}" "${server_url}/upload?path=${parent}")
if [[ "${status}" != 2* && "${status}" != 3* ]]; then
echo "Failed to create ${dir} (HTTP ${status})"
return 1
fi
}

ensure_dir "/${repo_name}/"
ensure_dir "/${repo_name}/${date_str}/"
ensure_dir "/${repo_name}/${date_str}/${commit_hash}/"

archive_name="${{ matrix.artifact-name }}.zip"
echo "Uploading ${archive_name}..."
for attempt in 1 2 3; do
status=$(curl_status --max-time 600 -u "${auth}" -F "file=@${archive_name}" "${server_url}/upload?path=${base_path}")
if [[ "${status}" == 2* || "${status}" == 3* ]]; then
echo "${repo_name}/${date_str}/${commit_hash}/${archive_name}"
break
else
echo "Attempt ${attempt} failed (HTTP ${status})"
if [ "$attempt" -eq 3 ]; then
echo "Failed to upload after 3 attempts"
exit 1
fi
sleep 5
fi
done
166 changes: 166 additions & 0 deletions .github/workflows/build-examples.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
name: Build Examples

on:
push:
branches: [master, main]
pull_request:
branches: [master, main]
workflow_dispatch:

jobs:
build:
strategy:
matrix:
include:
- goos: darwin
goarch: amd64
runner: macos-15-intel
- goos: darwin
goarch: arm64
runner: macos-15
- goos: windows
goarch: amd64
runner: windows-latest
- goos: linux
goarch: amd64
runner: ubuntu-latest

runs-on: ${{ matrix.runner }}

steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.25.x"

- name: Install Linux dependencies
if: matrix.goos == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libx11-dev \
libxtst-dev \
libxinerama-dev \
libxrandr-dev \
libpng-dev \
xclip \
xsel

- name: Build examples
shell: bash
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
CGO_ENABLED: 1
CGO_LDFLAGS_ALLOW: "-weak_framework|ScreenCaptureKit"
CGO_CFLAGS: ${{ matrix.goos == 'darwin' && '-mmacosx-version-min=11.0' || '' }}
CGO_LDFLAGS: ${{ matrix.goos == 'darwin' && '-mmacosx-version-min=11.0' || '' }}
run: |
suffix=""
if [ "${{ matrix.goos }}" = "windows" ]; then
suffix=".exe"
fi
go build -a -v -o "capture-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/capture
go build -a -v -o "display-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/display
go build -a -v -o "keyboard-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/keyboard
go build -a -v -o "mouse-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/mouse
go build -a -v -o "window-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/window
go build -a -v -o "apps-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./examples/apps

- name: Upload artifacts
id: upload_github_artifacts
uses: actions/upload-artifact@v4
continue-on-error: true
with:
name: examples-${{ matrix.goos }}-${{ matrix.goarch }}
path: |
capture-${{ matrix.goos }}-${{ matrix.goarch }}*
display-${{ matrix.goos }}-${{ matrix.goarch }}*
keyboard-${{ matrix.goos }}-${{ matrix.goarch }}*
mouse-${{ matrix.goos }}-${{ matrix.goarch }}*
window-${{ matrix.goos }}-${{ matrix.goarch }}*
apps-${{ matrix.goos }}-${{ matrix.goarch }}*
retention-days: 7

- name: Upload artifacts to server
shell: bash
continue-on-error: true
env:
ARTIFACT_SERVER_URL: ${{ secrets.ARTIFACT_SERVER_URL }}
ARTIFACT_USER: ${{ secrets.ARTIFACT_SERVER_USER }}
ARTIFACT_PASSWORD: ${{ secrets.ARTIFACT_SERVER_PASSWORD }}
COMMIT_HASH: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
set -euo pipefail
repo_name="${GITHUB_REPOSITORY##*/}"
date_str="$(date -u +%Y-%m-%d)"
commit_hash="${COMMIT_HASH}"
base_path="/${repo_name}/${date_str}/${commit_hash}/"
server_url="${ARTIFACT_SERVER_URL%/}"
auth="${ARTIFACT_USER}:${ARTIFACT_PASSWORD}"
curl_status() {
curl --http1.1 --silent --output /dev/null -w "%{http_code}" "$@"
}
ensure_dir() {
local dir="$1"
local url="${server_url}${dir}"
local status
status=$(curl_status -u "${auth}" "${url}")
if [[ "${status}" == 2* ]]; then
echo "Dir exists: ${dir}"
return 0
fi
if [[ "${status}" != "404" ]]; then
echo "Unexpected status ${status} when checking ${dir}"
return 1
fi
local target="${dir%/}"
local parent="${target%/*}/"
local name="${target##*/}"
echo "Creating dir: ${dir}"
status=$(curl_status -u "${auth}" -F "mkdir=${name}" "${server_url}/upload?path=${parent}")
if [[ "${status}" != 2* && "${status}" != 3* ]]; then
echo "Failed to create ${dir} (HTTP ${status})"
return 1
fi
}
ensure_dir "/${repo_name}/"
ensure_dir "/${repo_name}/${date_str}/"
ensure_dir "/${repo_name}/${date_str}/${commit_hash}/"
shopt -s nullglob
files=(
capture-${{ matrix.goos }}-${{ matrix.goarch }}*
display-${{ matrix.goos }}-${{ matrix.goarch }}*
keyboard-${{ matrix.goos }}-${{ matrix.goarch }}*
mouse-${{ matrix.goos }}-${{ matrix.goarch }}*
window-${{ matrix.goos }}-${{ matrix.goarch }}*
apps-${{ matrix.goos }}-${{ matrix.goarch }}*
)
if [ ${#files[@]} -eq 0 ]; then
echo "No artifacts found to upload"
exit 1
fi
for file in "${files[@]}"; do
if [ -f "$file" ]; then
filename=$(basename "$file")
relative_path="${repo_name}/${date_str}/${commit_hash}/${filename}"
echo "Uploading ${filename}..."
for attempt in 1 2 3; do
status=$(curl_status --max-time 300 -u "${auth}" -F "file=@${file}" "${server_url}/upload?path=${base_path}")
if [[ "${status}" == 2* || "${status}" == 3* ]]; then
echo "${relative_path}"
break
else
echo "Attempt ${attempt} failed for ${filename} (HTTP ${status})"
if [ "$attempt" -eq 3 ]; then
echo "Failed to upload ${filename} after 3 attempts"
exit 1
fi
sleep 5
fi
done
fi
done
Loading
Loading