Qesture 手勢應用程式如何運作,以及推出首週的表現
I built a gesture app for macOS 26. Here's how it works and how launch week went
Roman 推出 macOS 26 手勢應用程式 Qesture,讓觸控板和滑鼠可用手勢操作視窗與空間,並介紹其實作方式和推出首週的情況。Qesture 以 Swift 和部分 C 開發,使用 macOS 私有 MultitouchSupport 框架,因此不能上架 Mac App Store。
I'm Roman, and last Friday I launched Qesture, a menu bar app for macOS 26 that adds gestures for windows and spaces to the trackpad and mouse. This post covers how it works under the hood, two things macOS taught me along the way, and what launch week looked like, with real numbers.
What it does
I wanted my trackpad and mouse to do more with windows and spaces, without reaching for the keyboard or Mission Control. So Qesture adds:
- Space Grid. macOS keeps spaces in one row; Qesture treats that row as a grid. Four-finger swipes up and down jump a whole row, and holding four fingers opens an overlay where you slide to pick any space.
- A window switcher that shows windows instead of apps, on Command-Tab and on a three-finger swipe. While it's open, W, M, H and Q close, minimize, hide or quit.
- Mouse: smooth scrolling with its own direction, actions for the middle and side buttons, and a middle-button drag between spaces.
- Trackpad extras: a three-finger tap for middle click, two-finger swipes on a title bar to tile a window, press and slide with three fingers to move one, Force Click actions, and a five-finger radial menu.
How it works
It's Swift with some C, and each feature sits on a different macOS API:
- Trackpad touches come from the private MultitouchSupport framework. It reports raw finger positions on every frame, which is what you need for gestures macOS doesn't offer, like a four-finger hold or a five-finger rest.
- Mouse and keyboard input goes through CGEvent taps.
- Moving and tiling windows uses the Accessibility API.
- Previews in the switcher and the grid use ScreenCaptureKit.
- Instant space switching uses jurplel's MIT-licensed InstantSpaceSwitcher.
Because of the private framework, Qesture can't be in the Mac App Store. It's signed with Developer ID and notarized, and I sell it from my own site through Stripe. The flip side is that any macOS update can break part of it, so I test every beta.
Licensing works offline. A purchase gives you an Ed25519-signed license token, and the app checks the signature on the Mac, so it keeps working for 30 days without internet. There's no analytics in the app: it goes online only for license and update checks.
Two things macOS taught me
Event taps get switched off. If an event tap's callback takes too long, macOS disables the tap and sends it kCGEventTapDisabledByTimeout instead of events. For a gesture app, that means mouse features silently stop working. Every tap in Qesture handles that event and turns itself back on. The real lesson is to keep tap callbacks short and do the heavy work somewhere else.
Accessibility can't see other spaces. The switcher builds its list from CGWindowListCopyWindowInfo and adds details from each app's Accessibility windows. But the Accessibility API only lists an app's windows on the current space. The switcher has a setting to leave out windows of hidden apps, and my first version checked it inside the Accessibility branch, so windows of hidden apps on other spaces still showed up. The fix was to check whether the app is hidden before that branch, plus a test for windows Accessibility doesn't report.
Launch week, with numbers
I launched everywhere on Friday, October 30:
- Product Hunt: 2 upvotes. Without an audience to bring along, a launch there doesn't get far.
- Show HN: didn't happen. HN currently restricts Show HN posts from new accounts, and mine had 1 karma. I've emailed the moderators.
- Reddit: posts from my low-karma account were removed by spam filters, and r/macapps asks for karma in the subreddit first.
- MacRumors forums: the thread was held for moderation because the account was new, then approved.
- Directories like AlternativeTo, SaaSHub and MacUpdate: most are still in review days later.
- Peerlist: launched on Monday, November 2.
The site counts visits without cookies. The Cloudflare Worker that serves it writes the page, the referrer's host and the country to Workers Analytics Engine, and it doesn't store IP addresses or user agents. Since I started counting on the evening of November 1, there have been about 170 visits from people, 12 DMG downloads, and the first sale, on November 2.
Most visits arrive with no referrer at all, so I can't tell exactly where they came from. Links opened from apps and chats look like that.
What I'd do differently:
- Build accounts before launch day. HN and Reddit both hold back new accounts, and that's where a lot of Mac developers and users are. A few weeks of normal participation first would have opened both.
- Submit to directories early. Most take days or weeks to review, so they don't help on launch day unless you send them well before.
-
Tag every link. A
?ref=parameter on each link I post is the only way to see where visits come from, since most arrive without a referrer.
Try it
Qesture needs macOS 26 or later. There's a 14-day free trial with every feature, with no account or card. After that it's a one-time $9.99, and for launch it's 30% off until November 30, applied at checkout.
I'd like to hear which gesture you'd add, and anything that feels laggy or clashes with your setup. I'll answer in the comments.
An AI assistant drafted this post from the Qesture code and launch data, and I reviewed it before publishing.
來源:DEV Community · dev.to

