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
12 changes: 7 additions & 5 deletions driver/Sources/NibCore/EventEmitter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,14 @@ public final class EventEmitter {
private func postPointer(_ s: PenSample) {
let pt = mapping.point(x: s.x, y: s.y)

// Contact: the eraser end reports touch via the Eraser bit, not Tip Switch.
let contact = s.tipDown || s.eraser
let type: CGEventType
if s.tipDown && !wasTipDown { type = .leftMouseDown }
else if !s.tipDown && wasTipDown { type = .leftMouseUp }
else if s.tipDown { type = .leftMouseDragged }
if contact && !wasTipDown { type = .leftMouseDown }
else if !contact && wasTipDown { type = .leftMouseUp }
else if contact { type = .leftMouseDragged }
else { type = .mouseMoved }
wasTipDown = s.tipDown
wasTipDown = contact
if type == .leftMouseDown { tipClickState = tipClicks.down(at: pt, time: now()) }

guard let e = CGEvent(mouseEventSource: nil, mouseType: type,
Expand All @@ -167,7 +169,7 @@ public final class EventEmitter {
e.setIntegerValueField(.tabletEventDeviceID, value: Int64(deviceID))
// Button mask: bit0 tip, bit1 barrel, bit2 secondary barrel.
var buttons: Int64 = 0
if s.tipDown { buttons |= 0x1 }
if contact { buttons |= 0x1 }
if s.barrelButton { buttons |= 0x2 }
if s.secondaryBarrel { buttons |= 0x4 }
e.setIntegerValueField(.tabletEventPointButtons, value: buttons)
Expand Down
16 changes: 16 additions & 0 deletions driver/Tests/NibCoreTests/EventEmitterTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,22 @@ final class EventEmitterTests: XCTestCase {
sink: sink)
}

func testEraserContactIsAClick() {
let sink = RecordingSink(), em = makeEmitter(sink)
var s = sample(); s.inverted = true
em.handle(s) // eraser hovering
var down = s; down.eraser = true; down.pressure = 3000
em.handle(down); em.handle(down) // eraser pressed (Tip bit stays 0)
em.handle(s) // lifted
XCTAssertEqual(sink.clicks.map { $0.type }, [.leftMouseDown, .leftMouseUp])
XCTAssertTrue(sink.types.contains(.leftMouseDragged))
let prox = sink.events.first { $0.type == .tabletProximity }!
XCTAssertEqual(prox.getIntegerValueField(.tabletProximityEventPointerType), 3)
let press = sink.events.first { $0.type == .leftMouseDown }!
XCTAssertGreaterThan(press.getDoubleValueField(.tabletEventPointPressure), 0)
XCTAssertEqual(press.getIntegerValueField(.tabletEventPointButtons) & 0x1, 1)
}

func testLeavingProximityWithTipDownReleasesTip() {
let sink = RecordingSink(), em = makeEmitter(sink)
em.handle(sample(tip: true))
Expand Down
Loading