-
-
Save Dantee296/486a6f1d875fbe81f4818484ca464a5f to your computer and use it in GitHub Desktop.
a gross way to use raw iokit events to detect pinch gestures
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <UIKit/UIKit.h> | |
#include <IOKit/hid/IOHIDEventSystem.h> | |
#include <IOKit/hid/IOHIDEventSystemClient.h> | |
#include "CDTContextHostProvider.h" | |
#include <stdio.h> | |
#include <dlfcn.h> | |
UIView *contextView; | |
int IOHIDEventSystemClientSetMatching(IOHIDEventSystemClientRef client, CFDictionaryRef match); | |
CFArrayRef IOHIDEventSystemClientCopyServices(IOHIDEventSystemClientRef, int); | |
typedef struct __IOHIDServiceClient * IOHIDServiceClientRef; | |
int IOHIDServiceClientSetProperty(IOHIDServiceClientRef, CFStringRef, CFNumberRef); | |
typedef void* (*clientCreatePointer)(const CFAllocatorRef); | |
extern "C" void BKSHIDServicesCancelTouchesOnMainDisplay(); | |
void touch_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) { | |
if (IOHIDEventGetType(event) == kIOHIDEventTypeDigitizer) { | |
//get child events (individual finger) | |
NSArray *children = (NSArray *)IOHIDEventGetChildren(event); | |
if ([children count] == 2) { //pinch | |
CGFloat p1x = IOHIDEventGetFloatValue((__IOHIDEvent *)children[0], (IOHIDEventField)kIOHIDEventFieldDigitizerX); | |
CGFloat p1y = IOHIDEventGetFloatValue((__IOHIDEvent *)children[0], (IOHIDEventField)kIOHIDEventFieldDigitizerY); | |
CGFloat p2x = IOHIDEventGetFloatValue((__IOHIDEvent *)children[1], (IOHIDEventField)kIOHIDEventFieldDigitizerX); | |
CGFloat p2y = IOHIDEventGetFloatValue((__IOHIDEvent *)children[1], (IOHIDEventField)kIOHIDEventFieldDigitizerY); | |
CGFloat diff = sqrt(((p2x - p1x) * (p2x - p1x)) + ((p2y - p1y) * (p2y - p1y))); | |
diff = (diff > 1) ? 1 : diff; | |
NSLog(@"pinch : %f", diff); | |
//do stuff | |
if (contextView) { | |
//block other touches | |
BKSHIDServicesCancelTouchesOnMainDisplay(); | |
//resize app window | |
[contextView setTransform:CGAffineTransformMakeScale(diff, diff)]; | |
} | |
} | |
} | |
} | |
%hook SBLockScreenManager | |
- (void)_finishUIUnlockFromSource:(int)source withOptions:(id)options { | |
%orig; | |
//my IOKit's symbol table is fucked so we doin lookups | |
clientCreatePointer clientCreate; | |
void *handle = dlopen(0, 9); | |
*(void**)(&clientCreate) = dlsym(handle,"IOHIDEventSystemClientCreate"); | |
IOHIDEventSystemClientRef ioHIDEventSystem = (__IOHIDEventSystemClient *)clientCreate(kCFAllocatorDefault); | |
IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); | |
IOHIDEventSystemClientRegisterEventCallback(ioHIDEventSystem, (IOHIDEventSystemClientEventCallback)touch_event, NULL, NULL); | |
//throw a weather host view up on unlock to demonstrate | |
CDTContextHostProvider *contextProvider = [[CDTContextHostProvider alloc] init]; | |
contextView = [contextProvider hostViewForApplicationWithBundleID:@"com.apple.weather"]; | |
[contextProvider setStatusBarHidden:@(1) onApplicationWithBundleID:@"com.apple.weather"]; | |
[contextView setTransform:CGAffineTransformMakeScale(.6, .6)]; | |
[[[UIApplication sharedApplication] keyWindow] addSubview:contextView]; | |
} | |
%end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment