Revision: 13026 http://sourceforge.net/p/skim-app/code/13026 Author: hofman Date: 2022-07-16 14:32:14 +0000 (Sat, 16 Jul 2022) Log Message: ----------- accessibility support for presentation navigation button
Modified Paths: -------------- trunk/PDFDocumentView_SKExtensions.m trunk/SKMainWindowController_FullScreen.m trunk/SKSecondaryPDFView.h trunk/SKSecondaryPDFView.m trunk/SKSnapshotPDFView.h trunk/SKSnapshotPDFView.m Modified: trunk/PDFDocumentView_SKExtensions.m =================================================================== --- trunk/PDFDocumentView_SKExtensions.m 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/PDFDocumentView_SKExtensions.m 2022-07-16 14:32:14 UTC (rev 13026) @@ -69,6 +69,10 @@ static void (*original_updateTrackingAreas)(id, SEL) = NULL; +static BOOL (*original_accessibilityPerformShowAlternateUI)(id, SEL) = NULL; +static BOOL (*original_accessibilityPerformShowDefaultUI)(id, SEL) = NULL; +static BOOL (*original_isAccessibilityAlternateUIVisible)(id, SEL) = NULL; + #pragma mark PDFPageView fix // On Sierra and later menuForEvent: is forwarded to the PDFView of the PDFPage rather than the actual PDFView, @@ -89,6 +93,21 @@ [pdfView resetPDFToolTipRects]; } +static BOOL replacement_accessibilityPerformShowAlternateUI(id self, SEL _cmd) { + id pdfView = [self pdfView]; + return [pdfView accessibilityPerformShowAlternateUI]; +} + +static BOOL replacement_accessibilityPerformShowDefaultUI(id self, SEL _cmd) { + id pdfView = [self pdfView]; + return [pdfView accessibilityPerformShowDefaultUI]; +} + +static BOOL replacement_isAccessibilityAlternateUIVisible(id self, SEL _cmd) { + id pdfView = [self pdfView]; + return [pdfView isAccessibilityAlternateUIVisible]; +} + #pragma mark SKSwizzlePDFDocumentViewMethods void SKSwizzlePDFDocumentViewMethods() { @@ -115,4 +134,7 @@ original_updateTrackingAreas = (void (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(updateTrackingAreas), (IMP)replacement_updateTrackingAreas); + original_accessibilityPerformShowAlternateUI = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(accessibilityPerformShowAlternateUI), (IMP)replacement_accessibilityPerformShowAlternateUI); + original_accessibilityPerformShowDefaultUI = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(accessibilityPerformShowDefaultUI), (IMP)replacement_accessibilityPerformShowDefaultUI); + original_isAccessibilityAlternateUIVisible = (BOOL (*)(id, SEL))SKReplaceInstanceMethodImplementation(PDFDocumentViewClass, @selector(isAccessibilityAlternateUIVisible), (IMP)replacement_isAccessibilityAlternateUIVisible); } Modified: trunk/SKMainWindowController_FullScreen.m =================================================================== --- trunk/SKMainWindowController_FullScreen.m 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/SKMainWindowController_FullScreen.m 2022-07-16 14:32:14 UTC (rev 13026) @@ -739,6 +739,7 @@ [presentationNotesButton setTarget:self]; [presentationNotesButton setAction:@selector(doGoToNextPage:)]; [presentationNotesButton setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin]; + [[presentationNotesButton cell] setAccessibilityLabel:NSLocalizedString(@"Next", @"")]; } [presentationNotesButton setAlphaValue:0.0]; [presentationNotesButton setFrame:SKRectFromCenterAndSize(SKCenterPoint([notesView frame]), [presentationNotesButton frame].size)]; @@ -746,6 +747,7 @@ [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ [[presentationNotesButton animator] setAlphaValue:1.0]; } completionHandler:^{}]; + NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor(notesView), NSAccessibilityLayoutChangedNotification, [NSDictionary dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildren([NSArray arrayWithObjects:presentationNotesButton, nil]), NSAccessibilityUIElementsKey, nil]); } else if ([[SKMainWindowController superclass] instancesRespondToSelector:_cmd]) { [super mouseEntered:event]; } @@ -758,6 +760,7 @@ } completionHandler:^{ [presentationNotesButton removeFromSuperview]; }]; + NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self presentationNotesView]), NSAccessibilityLayoutChangedNotification, nil); } else if ([[SKMainWindowController superclass] instancesRespondToSelector:_cmd]) { [super mouseExited:event]; } Modified: trunk/SKSecondaryPDFView.h =================================================================== --- trunk/SKSecondaryPDFView.h 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/SKSecondaryPDFView.h 2022-07-16 14:32:14 UTC (rev 13026) @@ -51,6 +51,7 @@ BOOL synchronizeZoom; BOOL switching; BOOL selectsText; + BOOL transientControlView; CGFloat startScale; } Modified: trunk/SKSecondaryPDFView.m =================================================================== --- trunk/SKSecondaryPDFView.m 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/SKSecondaryPDFView.m 2022-07-16 14:32:14 UTC (rev 13026) @@ -307,6 +307,16 @@ NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, [NSDictionary dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildren([NSArray arrayWithObjects:controlView, nil]), NSAccessibilityUIElementsKey, nil]); } +- (void)hideControlView { + if ([controlView superview]) + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ + [[controlView animator] setAlphaValue:0.0]; + } completionHandler:^{ + [controlView removeFromSuperview]; + NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, nil); + }]; +} + - (void)mouseEntered:(NSEvent *)theEvent { if ([[SKSecondaryPDFView superclass] instancesRespondToSelector:_cmd]) [super mouseEntered:theEvent]; @@ -321,12 +331,7 @@ [super mouseExited:theEvent]; if (trackingArea && [theEvent trackingArea] == trackingArea) { [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(showControlView) object:nil]; - [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ - [[controlView animator] setAlphaValue:0.0]; - } completionHandler:^{ - [controlView removeFromSuperview]; - NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, nil); - }]; + [self hideControlView]; } } @@ -352,14 +357,20 @@ [self setSynchronizeZoom:YES adjustPopup:NO]; else [self setAutoScales:YES adjustPopup:NO]; + if (transientControlView) + [self hideControlView]; } - (void)pagePopUpAction:(id)sender { [self goToPage:[[self document] pageAtIndex:[sender indexOfSelectedItem]]]; + if (transientControlView) + [self hideControlView]; } - (void)toolModeButtonAction:(id)sender { [self setSelectsText:[(NSButton *)sender state]]; + if (transientControlView) + [self hideControlView]; } - (void)setSynchronizedPDFView:(PDFView *)newSynchronizedPDFView { @@ -800,4 +811,19 @@ [self setScaleFactor:fmax([self scaleFactor], SKMinDefaultScaleMenuFactor) adjustPopup:YES]; } +- (BOOL)accessibilityPerformShowAlternateUI { + [self showControlView]; + transientControlView = YES; + return YES; +} + +- (BOOL)accessibilityPerformShowDefaultUI { + [self hideControlView]; + return YES; +} + +- (BOOL)isAccessibilityAlternateUIVisible { + return [controlView superview] != nil; +} + @end Modified: trunk/SKSnapshotPDFView.h =================================================================== --- trunk/SKSnapshotPDFView.h 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/SKSnapshotPDFView.h 2022-07-16 14:32:14 UTC (rev 13026) @@ -51,6 +51,7 @@ BOOL autoFits; BOOL shouldAutoFit; BOOL switching; + BOOL transientControlView; CGFloat startScale; NSInteger minHistoryIndex; } Modified: trunk/SKSnapshotPDFView.m =================================================================== --- trunk/SKSnapshotPDFView.m 2022-07-16 09:38:26 UTC (rev 13025) +++ trunk/SKSnapshotPDFView.m 2022-07-16 14:32:14 UTC (rev 13026) @@ -210,6 +210,17 @@ NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, [NSDictionary dictionaryWithObjectsAndKeys:NSAccessibilityUnignoredChildren([NSArray arrayWithObjects:controlView, nil]), NSAccessibilityUIElementsKey, nil]); } +- (void)hideControlView { + transientControlView = NO; + if ([controlView superview]) + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ + [[controlView animator] setAlphaValue:0.0]; + } completionHandler:^{ + [controlView removeFromSuperview]; + NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, nil); + }]; +} + - (void)mouseEntered:(NSEvent *)theEvent { if ([[SKSnapshotPDFView superclass] instancesRespondToSelector:_cmd]) [super mouseEntered:theEvent]; @@ -224,12 +235,7 @@ [super mouseExited:theEvent]; if (trackingArea && [theEvent trackingArea] == trackingArea) { [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(showControlView) object:nil]; - [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){ - [[controlView animator] setAlphaValue:0.0]; - } completionHandler:^{ - [controlView removeFromSuperview]; - NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, nil); - }]; + [self hideControlView]; } } @@ -298,6 +304,8 @@ [self setAutoFits:YES adjustPopup:NO]; else [self setAutoScales:YES adjustPopup:NO]; + if (transientControlView) + [self hideControlView]; } - (void)setAutoFits:(BOOL)newAuto { @@ -571,6 +579,7 @@ if ([theEvent firstCharacter] == '?' && ([theEvent standardModifierFlags] & ~NSShiftKeyMask) == 0) { [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(showControlView) object:nil]; if ([controlView superview]) { + transientControlView = NO; [controlView removeFromSuperview]; NSAccessibilityPostNotificationWithUserInfo(NSAccessibilityUnignoredAncestor([self documentView]), NSAccessibilityLayoutChangedNotification, nil); } else { @@ -669,4 +678,19 @@ [super setCursorForAreaOfInterest:area]; } +- (BOOL)accessibilityPerformShowAlternateUI { + [self showControlView]; + transientControlView = YES; + return YES; +} + +- (BOOL)accessibilityPerformShowDefaultUI { + [self hideControlView]; + return YES; +} + +- (BOOL)isAccessibilityAlternateUIVisible { + return [controlView superview] != nil; +} + @end 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