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

Reply via email to