Виявляється ніхто не зробив способу підключити iPad 2, якому 15 років і останнє оновлення софту якого було років 10 тому, нормального способу використовувати цей гарний девайс як другий (або третій) дисплей. Після фрустрації з (неуспішними) спробами завести корпоративний легасі софт я здався та навайбкодив рішення проблеми. Бо e-waste це жахливо, і будь яка техніка заслуговує на ще один шанс.
- З'єднання по USB, ніяких затримоч через стрімінг по WiFi
- Кросплатформа, тестував на macOS, на вінді працює після танців з бубном, в теорії повинно працювати на лінукс, але я не перевіряв (страшно думати про пекло x11/wayland)
- Кліки мишкою через тачскрін, тап одним пальцем - лкм, двома пальцями - пкм
- Гарячий реконект
Спочатку встановлюємо Theos - боже благослови розробників, які підтримують відкритий тулчейн для збірки під 10 річну систему, про яку всі забули:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/theos/theos/master/bin/install-theos)"
На macOS потрібно встановити ці залежності:
# JPEG бібліотека, бо ми стрімимо його
brew install jpeg-turbo
# Для крос компіляції під вінду
brew install mingw-w64 cmake nasm
Залежності для Linux (я не тестував, ви можете бути першими!):
# Debian/Ubuntu
sudo apt install build-essential libturbojpeg0-dev libx11-dev libxext-dev
# Fedora
sudo dnf install gcc libjpeg-turbo-devel libX11-devel libXext-devel
# Arch
sudo pacman -S base-devel libjpeg-turbo libx11 libxext
Для запуску на вінді потрібно встановити наступні залежності (вищезгадані танці з бубном):
Власне сама збірка:
./build-ipad.sh # Збираємо .deb (не знаю чому на iOS використовується dpkg але чом би й ні)
./build-macos.sh
./build-windows.sh
./build-linux.sh
Бінарники будуть доступні в ./dist
Для інталяції потрібен iPad 2 з jailbreak та iOS 9.3.5 (остання доступна версія).
Джейлбрейк робиться дуже просто, встановивши сертифікат (посилання зверху сторінки)
та натиснувши, можливо кілька разів, кнопку Run на carbon.sep.lol
(потрібно виконувати після кожного ребуту, джейлбрейк не персистентний), після
успішного виконання айпад перезвавнтажиться і з'явиться альтернативний "магазин"
Cydia. Опціонально раджу звідти встановити iFile - можна закидати файли по http
та Filza - зручно встановлювати .deb файли. Якщо ви ватажили файл через iFile,
то він буде лежать в руті пристрою.
./dist/fwdisplay-sender-macos # Або система, під яку ви зібрали
Voilà тепер у вас є гарний другий (або третій) монітор
Тут даю слово архітектору цього невеличкого технічого чуда, а саме Claude (Opus 4.6)
┌──────────────┐ USB/usbmuxd ┌──────────────────┐
│ Відправник │ ──────────────> │ Застосунок iPad │
│ │ JPEG кадри │ │
│ захоплення │ │ декодування │
│ кодування │ <────────────── │ відображення │
│ потік │ події дотику │ ввід дотиком │
└──────────────┘ └──────────────────┘
Кадри (відправник -> iPad): [4-байтна BE uint32 довжина][JPEG дані]
Дотик (iPad -> відправник): [1 байт: тип 0x01][1 байт: фаза][4 байти: float BE x][4 байти: float BE y]
Фази дотику: 0=початок, 1=рух, 2=кінець, 3=скасовано, 4=правий клік
Віртуальний дисплей створюється автоматично за допомогою приватних API CoreGraphics (macOS 12.4+). Дисплей з'являється та зникає разом з підключенням iPad. Події дотику перетворюються на події миші через CoreGraphics.
Windows потребує сторонній драйвер віртуального дисплея для функціональності другого екрана. Відправник автоматично виявляє поширені драйвери (VDD, IddSampleDriver тощо). Без драйвера він захоплює основний монітор.
Для USB-комунікації необхідно встановити Apple Mobile Device Support.
Відправник захоплює екрани X11 за допомогою XShm. За потреби віртуальні дисплеї можна створювати за допомогою xrandr.
fwdisplay/
├── sender/ # C відправник (кросплатформний)
│ ├── sender.c # Головний цикл, JPEG кодування, потокова передача
│ ├── usbmux.c/h # Клієнт протоколу usbmuxd
│ ├── capture.h # Платформо-незалежний інтерфейс захоплення
│ ├── capture_mac.c # macOS: захоплення через CoreGraphics
│ ├── capture_win.c # Windows: захоплення через GDI + виявлення віртуального дисплея
│ ├── capture_linux.c # Linux: захоплення через X11/XShm
│ ├── virtual_display.m # macOS: віртуальний дисплей через приватний API
│ ├── cursor_mac.m # macOS: композитинг курсора через AppKit
│ ├── touch.c # macOS: перетворення дотику в мишу
│ └── Makefile
├── ipad/ # Додаток-приймач для iPad (Theos/Objective-C)
│ ├── FWDAppDelegate.m # Життєвий цикл додатку, пропуск кадрів
│ ├── FWDViewController.m # Відображення + ввід дотиком
│ ├── FWDTCPServer.m # TCP сервер, зчитування кадрів
│ └── Makefile
├── build-macos.sh
├── build-windows.sh
├── build-linux.sh
└── build-ipad.sh
Питання: чому рідмі не англійською
Відповідь: це спеціальна програма навчання вестерняків української, якщо вони натраплять на цей репозиторій
Питання: чи можу я (автор питання) покращити цей проєкт?
Відповідь: звісно!
Зроблено з любов'ю за один вечір
Volbil