Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 2 additions & 12 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,10 @@ root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.swift]
indent_style = space
indent_size = 2

[*.{md,yml,yaml,json}]
indent_style = space
indent_size = 2

[.swift-format]
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[Makefile]
indent_style = tab
70 changes: 0 additions & 70 deletions .github/ISSUE_TEMPLATE/bug_report.yml

This file was deleted.

5 changes: 0 additions & 5 deletions .github/ISSUE_TEMPLATE/config.yml

This file was deleted.

52 changes: 0 additions & 52 deletions .github/ISSUE_TEMPLATE/feature_request.yml

This file was deleted.

19 changes: 4 additions & 15 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,13 @@

-

## Scope

-

## Validation

- [ ] `make check`
- [ ] Tests added or updated for behavior changes, or not needed
- [ ] Documentation or `CHANGELOG.md` updated if needed
- [ ] Documentation or `CHANGELOG.md` updated if public behavior changed

## Checklist

- [ ] Public API changes are intentional and documented.
- [ ] PointerGestureKit scope and host-app responsibility boundaries are respected.
- [ ] No generated build output, dependency caches, local state, secrets, tokens, private keys,
personal data, local paths, private app metadata, or app-specific internal references are
included.

## Notes

-
- [ ] Public API changes are intentional.
- [ ] Host-app responsibilities stay outside this package.
- [ ] No generated output, dependency caches, local state, secrets, private logs, local paths, or app-internal references are included.
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ jobs:
name: SwiftPM
runs-on: macos-15
timeout-minutes: 15
env:
DEVELOPER_DIR: /Applications/Xcode_26.3.app/Contents/Developer

steps:
- name: Check out repository
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
persist-credentials: false

Expand Down
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
.build/
.swiftpm/
.DS_Store
.envrc
.env
.env.*
!.env.example
Package.resolved
*.doccarchive
DerivedData/
xcuserdata/
*.xcodeproj
*.xcworkspace
*.xcresult
*.log
55 changes: 49 additions & 6 deletions .swift-format
Original file line number Diff line number Diff line change
@@ -1,11 +1,54 @@
{
"indentation": {
"spaces": 2
},
"lineLength": 100,
"maximumBlankLines": 1,
"respectsExistingLineBreaks": true,
"rules": {
"AllPublicDeclarationsHaveDocumentation": true,
"BeginDocumentationCommentWithOneLineSummary": true,
"NeverForceUnwrap": true,
"NeverUseForceTry": true,
"NeverUseImplicitlyUnwrappedOptionals": true,
"ValidateDocumentationComments": true
"AllPublicDeclarationsHaveDocumentation": false,
"AlwaysUseLiteralForEmptyCollectionInit": false,
"AlwaysUseLowerCamelCase": false,
"AmbiguousTrailingClosureOverload": false,
"AvoidRetroactiveConformances": false,
"BeginDocumentationCommentWithOneLineSummary": false,
"DoNotUseSemicolons": false,
"DontRepeatTypeInStaticProperties": false,
"FileScopedDeclarationPrivacy": false,
"FullyIndirectEnum": false,
"GroupNumericLiterals": false,
"IdentifiersMustBeASCII": false,
"NeverForceUnwrap": false,
"NeverUseForceTry": false,
"NeverUseImplicitlyUnwrappedOptionals": false,
"NoAccessLevelOnExtensionDeclaration": false,
"NoAssignmentInExpressions": false,
"NoBlockComments": false,
"NoCasesWithOnlyFallthrough": false,
"NoEmptyLinesOpeningClosingBraces": false,
"NoEmptyTrailingClosureParentheses": false,
"NoLabelsInCasePatterns": false,
"NoLeadingUnderscores": false,
"NoParensAroundConditions": false,
"NoPlaygroundLiterals": false,
"NoVoidReturnOnFunctionSignature": false,
"OmitExplicitReturns": false,
"OneCasePerLine": false,
"OneVariableDeclarationPerLine": false,
"OnlyOneTrailingClosureArgument": false,
"OrderedImports": false,
"ReplaceForEachWithForLoop": false,
"ReturnVoidInsteadOfEmptyTuple": false,
"TypeNamesShouldBeCapitalized": false,
"UseEarlyExits": false,
"UseExplicitNilCheckInConditions": false,
"UseLetInEveryBoundCaseVariable": false,
"UseShorthandTypeNames": false,
"UseSingleLinePropertyGetter": false,
"UseSynthesizedInitializer": false,
"UseTripleSlashForDocumentationComments": false,
"UseWhereClausesInForLoops": false,
"ValidateDocumentationComments": false
},
"version": 1
}
63 changes: 63 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,69 @@ Released versions follow semantic versioning.

No changes yet.

## [0.2.0] - 2026-07-12

### Changed

- Raised the package requirement to Swift 6.2 and kept lifetime cleanup compatible with Swift 6.2
runtimes.
- Moved recognizer deinitialization cleanup into a non-generic lifetime owner so optimized Release
builds preserve replay and event-source shutdown behavior without triggering a compiler crash.
- Avoided actor-isolated deinitializers that abort under Swift 6.2.4 while preserving synchronous
main-thread cleanup and safe main-actor handoff from other threads.
- Updated installation guidance to use the 0.2.0 release line.
- Removed the redundant `GesturePatternCatalog` and `GesturePatternValidator` wrappers. Pattern
registration reports an empty pattern directly; duplicate registration intentionally replaces
the previous match, while settings-level conflict policy remains with the host.
- Recording mode now records directions without requesting a matcher, while
still respecting `isRecognitionEnabled` for the active context.
- `GestureObservationToken` is main-actor isolated and exposes one synchronous, idempotent
`cancel()` operation.
- `GestureRecognizerTuning.standard` provides production defaults, while
`validated(...)` rejects invalid custom values instead of silently changing behavior.
- `GestureRecognizerState.Trace` now exposes `tailPoint` for low-latency live
rendering without publishing the full raw-point history on every pointer move.
- `GestureRecognizerConfiguration` now accepts `passesThroughEmptyMatcher` so hosts can leave
pointer input untouched when the active matcher contains no patterns.
- `PointerButton.additionalButtonNumber` and its initializer are now named `auxiliaryButtonID`
to match the package's primary, secondary, middle, and auxiliary button terminology.
- `GestureEventSource` is main-actor isolated instead of requiring `Sendable`, matching its UI
event-loop lifecycle and delivery contract.
- Replay requests now include `dragStart(button:points:)` for replaying a consumed button-down and
drag prefix when recognition stops before the physical button is released.
- Core Graphics replay docs now describe empty and single-point drag replay
behavior and replayed-event suppression.
- `GesturePatternMatcher.register(pattern:match:)` returns whether the non-empty pattern was
registered.
- `GesturePatternMatcher.match(pattern:)` is available for exact-pattern lookup
in host-app tests.
- `GestureEventDisposition` now exposes whether the original platform event
should be consumed through `consumesOriginalEvent`.
- `GestureInputEvent.Kind.buttonDragged(_:)` is now
`GestureInputEvent.Kind.buttonMoved(_:)` so the platform-neutral input model
describes pointer movement instead of Core Graphics dragged-event naming.
- Recognizer lifecycle, failure, and event-disposition values are finite enums
while observable state, input, replay, context, and geometry remain comparable
value models.
- Added README links to release notes.
- Clarified that security updates target the latest released version.

### Removed

- Removed `GestureEventDisposition` `CaseIterable`/`allCases` conformance so
event-disposition policy exposes only the returned action and
`consumesOriginalEvent` decision instead of a redundant enumeration helper.
- Removed the `GestureInputEvent.Kind.buttonDragged(_:)` spelling; no alias is
kept because platform-specific dragged terminology belongs in adapters.
- Removed `GestureDirection` `CaseIterable`/`allCases` conformance so the
public geometry contract is the four direction cases themselves rather than
an ordered collection helper.
- Removed `GesturePatternValidator`; settings-level duplicate policy is outside matching.
- Removed public replay-request convenience properties that duplicated enum
payload pattern matching.
- Removed `Hashable` from observable input, replay, context, geometry, tuning, and recognizer-state
values whose public contract only requires equality and concurrency safety.

## [0.1.0] - 2026-05-29

### Added
Expand Down
44 changes: 4 additions & 40 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,49 +1,13 @@
# Contributing

Thank you for your interest in improving PointerGestureKit.

## Scope

PointerGestureKit focuses on macOS pointer-gesture recognition, direction matching, recognizer
state observation, and the macOS Core Graphics event-tap adapter. Host-app concerns such as
command catalogs, overlay UI, Accessibility onboarding copy, persistence, syncing, telemetry, and
action execution should stay outside this package.

Keep changes focused. Avoid bundling unrelated refactors, formatting-only rewrites, and behavior
changes in the same pull request.

## Development

Local development commands use `make`.

Run the full local check before opening a pull request:
Run the package check before submitting changes:

```sh
make check
```

For focused local work, run checks separately:

```sh
make format
make lint
make test
make build
make docc
```

## Pull Requests

Before submitting a pull request:

- Keep the public API surface minimal and documented.
- Add or update tests for behavior changes.
- Update README, DocC, or `CHANGELOG.md` when user-facing behavior changes.
- Do not commit generated build output, dependency caches, editor state, local tool state, secrets,
tokens, private keys, personal data, local paths, private app metadata, or app-specific internal
references.
Keep changes focused. Update README.md or CHANGELOG.md when public behavior changes.

## Security
Do not commit generated output, dependency caches, local tool state, secrets, tokens, private keys, personal data, local paths, private app metadata, or app-specific internal references.

Do not report vulnerabilities in public issues, pull requests, or discussions. Follow
[SECURITY.md](SECURITY.md) instead.
Report vulnerabilities privately. See SECURITY.md.
Loading