Revision: 13047 http://sourceforge.net/p/skim-app/code/13047 Author: hofman Date: 2022-07-25 14:07:10 +0000 (Mon, 25 Jul 2022) Log Message: ----------- swizzle methods on accessibility nodes for annotations to implement press, pick, and show menu accessibility actions
Modified Paths: -------------- trunk/PDFAnnotation_SKExtensions.m trunk/PDFDocumentView_SKExtensions.h trunk/PDFDocumentView_SKExtensions.m trunk/SKPDFView.m Modified: trunk/PDFAnnotation_SKExtensions.m =================================================================== --- trunk/PDFAnnotation_SKExtensions.m 2022-07-24 09:40:21 UTC (rev 13046) +++ trunk/PDFAnnotation_SKExtensions.m 2022-07-25 14:07:10 UTC (rev 13047) @@ -668,4 +668,46 @@ } } +- (BOOL)accessibilityPerformPress { + if ([self isSkimNote] == NO) + return NO; + NSDocument *doc = [[self page] containingDocument]; + if ([doc respondsToSelector:@selector(pdfView)] == NO) + return NO; + [[(SKMainDocument *)doc pdfView] editAnnotation:self]; + return YES; +} + +- (BOOL)accessibilityPerformPick { + if ([self isSkimNote] == NO) + return NO; + NSDocument *doc = [[self page] containingDocument]; + if ([doc respondsToSelector:@selector(pdfView)] == NO) + return NO; + [[(SKMainDocument *)doc pdfView] setActiveAnnotation:self]; + return YES; +} + +- (BOOL)accessibilityPerformShowMenu { + if ([self isSkimNote] == NO) + return NO; + NSDocument *doc = [[self page] containingDocument]; + if ([doc respondsToSelector:@selector(pdfView)] == NO) + return NO; + PDFView *pdfView = [(SKMainDocument *)doc pdfView]; + NSPoint point = SKCenterPoint([pdfView convertRect:[self bounds] fromPage:[self page]]); + NSEvent *event = [NSEvent mouseEventWithType:NSRightMouseDown + location:[pdfView convertPoint:point toView:nil] + modifierFlags:0 + timestamp:0 + windowNumber:[[pdfView window] windowNumber] + context:nil + eventNumber:0 + clickCount:1 + pressure:0.0]; + NSMenu *menu = [pdfView menuForEvent:event]; + [NSMenu popUpContextMenu:menu withEvent:event forView:pdfView]; + return YES; +} + @end Modified: trunk/PDFDocumentView_SKExtensions.h =================================================================== --- trunk/PDFDocumentView_SKExtensions.h 2022-07-24 09:40:21 UTC (rev 13046) +++ trunk/PDFDocumentView_SKExtensions.h 2022-07-25 14:07:10 UTC (rev 13047) @@ -40,3 +40,4 @@ #import <Quartz/Quartz.h> extern void SKSwizzlePDFDocumentViewMethods(); +extern void SKSwizzlePDFAccessibilityNodeAnnotationMethods(); Modified: trunk/PDFDocumentView_SKExtensions.m =================================================================== --- trunk/PDFDocumentView_SKExtensions.m 2022-07-24 09:40:21 UTC (rev 13046) +++ trunk/PDFDocumentView_SKExtensions.m 2022-07-25 14:07:10 UTC (rev 13047) @@ -43,10 +43,12 @@ #import "SKRuntime.h" #import "NSView_SKExtensions.h" #import <objc/objc-runtime.h> +#import <SkimNotes/SkimNotes.h> @interface NSView (SKPDFDisplayViewPrivateDeclarations) - (id)pdfView; - (id)getPDFView; +- (id)annotation; @end #pragma mark - @@ -73,6 +75,9 @@ static BOOL (*original_accessibilityPerformShowAlternateUI)(id, SEL) = NULL; static BOOL (*original_accessibilityPerformShowDefaultUI)(id, SEL) = NULL; static BOOL (*original_accessibilityPerformShowMenu)(id, SEL) = NULL; +static BOOL (*original_annotation_accessibilityPerformPress)(id, SEL) = NULL; +static BOOL (*original_annotation_accessibilityPerformPick)(id, SEL) = NULL; +static BOOL (*original_annotation_accessibilityPerformShowMenu)(id, SEL) = NULL; #pragma mark PDFPageView fix @@ -114,6 +119,27 @@ return [pdfView accessibilityPerformShowMenu]; } +static BOOL replacement_annotation_accessibilityPerformPress(id self, SEL _cmd) { + id annotation = [self annotation]; + if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation isSkimNote] && [annotation respondsToSelector:_cmd]) + return [annotation accessibilityPerformPress]; + return original_annotation_accessibilityPerformPress(self, _cmd); +} + +static BOOL replacement_annotation_accessibilityPerformPick(id self, SEL _cmd) { + id annotation = [self annotation]; + if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation isSkimNote] && [annotation respondsToSelector:_cmd]) + return [annotation accessibilityPerformPick]; + return original_annotation_accessibilityPerformPick(self, _cmd); +} + +static BOOL replacement_annotation_accessibilityPerformShowMenu(id self, SEL _cmd) { + id annotation = [self annotation]; + if ([annotation respondsToSelector:@selector(isSkimNote)] && [annotation isSkimNote] && [annotation respondsToSelector:_cmd]) + return [annotation accessibilityPerformShowMenu]; + return original_accessibilityPerformShowMenu(self, _cmd); +} + #pragma mark SKSwizzlePDFDocumentViewMethods void SKSwizzlePDFDocumentViewMethods() { @@ -145,3 +171,17 @@ original_accessibilityPerformShowDefaultUI = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(accessibilityPerformShowDefaultUI), (IMP)replacement_accessibilityPerformShowDefaultUI); original_accessibilityPerformShowMenu = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(accessibilityPerformShowMenu), (IMP)replacement_accessibilityPerformShowMenu); } + +void SKSwizzlePDFAccessibilityNodeAnnotationMethods() { + if (RUNNING_BEFORE(10_13)) + return; + + Class PDFAccessibilityNodeAnnotationClass = NSClassFromString(@"PDFAccessibilityNodeAnnotation"); + + if (PDFAccessibilityNodeAnnotationClass == Nil || [PDFAccessibilityNodeAnnotationClass instancesRespondToSelector:@selector(annotation)] == NO) + return; + + original_annotation_accessibilityPerformPress = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, @selector(accessibilityPerformPress), (IMP)replacement_annotation_accessibilityPerformPress); + original_annotation_accessibilityPerformPick = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, @selector(accessibilityPerformPick), (IMP)replacement_annotation_accessibilityPerformPick); + original_annotation_accessibilityPerformShowMenu = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFAccessibilityNodeAnnotationClass, @selector(accessibilityPerformShowMenu), (IMP)replacement_annotation_accessibilityPerformShowMenu); +} Modified: trunk/SKPDFView.m =================================================================== --- trunk/SKPDFView.m 2022-07-24 09:40:21 UTC (rev 13046) +++ trunk/SKPDFView.m 2022-07-25 14:07:10 UTC (rev 13047) @@ -270,6 +270,7 @@ useToolModeCursors = [[NSUserDefaults standardUserDefaults] boolForKey:SKUseToolModeCursorsKey]; SKSwizzlePDFDocumentViewMethods(); + SKSwizzlePDFAccessibilityNodeAnnotationMethods(); } + (NSArray *)defaultKeysToObserve { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit