diff --git a/checkin_notes b/checkin_notes index 36c5e0ca2c..702e421a38 100644 --- a/checkin_notes +++ b/checkin_notes @@ -9434,3 +9434,22 @@ David 23 Nov 2009 cpu_sched.cpp clientgui/ ViewWork.cpp + +Charlie 23 Nov 2009 + - MGR: In Simple View, have Mac screen reader tell user to switch to + Advanced View. + - Mac Installer: update ReadMe files to emphasize that installer may + take longer than expected. + + clientgui/ + BOINCSimpleGUI.cpp, .h + ProjectListCtrl.cpp, .h + Mac/ + MacAccessibility.cpp + mac_build/ + boinc.xcodeproj/ + project.pbxproj + mac_installer/ + GR-ReadMe.rtf + PTP-ReadMe.rtf + ReadMe.rtf diff --git a/clientgui/mac/MacAccessiblity.cpp b/clientgui/mac/MacAccessiblity.cpp index d34bb688ff..8674f5487d 100755 --- a/clientgui/mac/MacAccessiblity.cpp +++ b/clientgui/mac/MacAccessiblity.cpp @@ -15,7 +15,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . -// mac_accessiblity.cpp +// macAccessiblity.cpp #include @@ -27,10 +27,29 @@ #include "AdvancedFrame.h" #include "BOINCListCtrl.h" #include "ProjectListCtrl.h" +#include "sg_BoincSimpleGUI.h" #include "Events.h" +#include "macAccessiblity.h" #define MAX_LIST_COL 100 +void AccessibilityIgnoreAllChildren(HIViewRef parent, int recursionLevel) { + HIViewRef child; + OSStatus err; + + if (recursionLevel > 100) { + fprintf(stderr, "Error: AccessibilityIgnoreAllChildren recursion level > 100\n"); + return; + } + + child = HIViewGetFirstSubview(parent); + while (child) { + err = HIObjectSetAccessibilityIgnored((HIObjectRef)child, true); + AccessibilityIgnoreAllChildren(child, recursionLevel + 1); + child = HIViewGetNextView(child); + } +} + OSStatus BOINCListAccessibilityEventHandler( EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void* pData, Boolean isHeader); @@ -63,6 +82,15 @@ pascal OSStatus AttachListAccessibilityEventHandler( EventHandlerCallRef inHandl }; + static EventTypeSpec sg_AccessibilityEvents[] = { + { kEventClassAccessibility, kEventAccessibleGetNamedAttribute } + }; + +extern pascal OSStatus SimpleGUIAccessibilityEventHandler( EventHandlerCallRef inHandlerCallRef, + EventRef inEvent, void* pData); + + + void CBOINCListCtrl::SetupMacListControlAccessibilitySupport() { #if !USE_NATIVE_LISTCONTROL HIViewRef listControlView; @@ -121,6 +149,29 @@ void CProjectListCtrlAccessible::RemoveMacListControlAccessibilitySupport() { } +void CSimplePanel::SetupMacAccessibilitySupport() { + OSStatus err; + wxString str = _("for accessibility support, please select advanced from the view menu or type command shift a"); + HIViewRef simple = (HIViewRef)GetHandle(); + CFStringRef description = CFStringCreateWithCString(NULL, str.char_str(), kCFStringEncodingUTF8); + + // Have the screen reader tell user to switch to advanced view. + HIObjectSetAuxiliaryAccessibilityAttribute((HIObjectRef)simple, 0, kAXDescriptionAttribute, description); + CFRelease( description ); + + err = InstallHIObjectEventHandler((HIObjectRef)simple, NewEventHandlerUPP(SimpleGUIAccessibilityEventHandler), + sizeof(sg_AccessibilityEvents) / sizeof(EventTypeSpec), sg_AccessibilityEvents, + this, &m_pSGAccessibilityEventHandlerRef); +} + + +void CSimplePanel::RemoveMacAccessibilitySupport() { + if (m_pSGAccessibilityEventHandlerRef) { + ::RemoveEventHandler(m_pSGAccessibilityEventHandlerRef); + } +} + + OSStatus BOINCListAccessibilityEventHandler( EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void* pData, Boolean isHeader) { const UInt32 eventClass = GetEventClass(inEvent); @@ -1207,3 +1258,40 @@ pascal OSStatus AttachListAccessibilityEventHandler( EventHandlerCallRef inHandl return eventNotHandledErr; } + +pascal OSStatus SimpleGUIAccessibilityEventHandler( EventHandlerCallRef inHandlerCallRef, + EventRef inEvent, void* pData) { + const UInt32 eventClass = GetEventClass(inEvent); + const UInt32 eventKind = GetEventKind(inEvent); + OSStatus err; + + if (eventClass != kEventClassAccessibility) { + return eventNotHandledErr; + } + + switch (eventKind) { + + case kEventAccessibleGetNamedAttribute: + CFStringRef attribute; + + err = GetEventParameter (inEvent, kEventParamAccessibleAttributeName, + typeCFStringRef, NULL, sizeof(typeCFStringRef), NULL, &attribute); + if (err) return err; + + if ( CFStringCompare( attribute, kAXRoleAttribute, 0 ) == kCFCompareEqualTo ) { + CFStringRef role = kAXStaticTextRole; // kAXRowRole; + + SetEventParameter( inEvent, kEventParamAccessibleAttributeValue, typeCFTypeRef, sizeof( role ), &role ); + return noErr; + } + + return eventNotHandledErr; + break; + + + default: + return eventNotHandledErr; + } + + return eventNotHandledErr; +} \ No newline at end of file diff --git a/clientgui/sg_BoincSimpleGUI.cpp b/clientgui/sg_BoincSimpleGUI.cpp index 5ca26da1c9..fdd4ac34ea 100644 --- a/clientgui/sg_BoincSimpleGUI.cpp +++ b/clientgui/sg_BoincSimpleGUI.cpp @@ -39,6 +39,7 @@ #include "WizardAttachProject.h" #include "error_numbers.h" #include "version.h" +#include "macAccessiblity.h" #include "sg_BoincSimpleGUI.h" #include "sg_ImageLoader.h" @@ -437,7 +438,6 @@ CSimplePanel::CSimplePanel() { wxLogTrace(wxT("Function Start/End"), wxT("CSimplePanel::CSimplePanel - Default Constructor Function End")); } - CSimplePanel::CSimplePanel(wxWindow* parent) : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxNO_BORDER) { @@ -454,6 +454,13 @@ CSimplePanel::CSimplePanel(wxWindow* parent) : InitEmptyView(); +#ifdef __WXMAC__ + // Have the screen reader tell user to switch to advanced view. + oldSimpleGUIWorkCount = -1; + + SetupMacAccessibilitySupport(); +#endif + wxLogTrace(wxT("Function Start/End"), wxT("CSimplePanel::CSimplePanel - Overloaded Constructor Function End")); } @@ -462,6 +469,10 @@ CSimplePanel::~CSimplePanel() { wxLogTrace(wxT("Function Start/End"), wxT("CSimplePanel::CSimplePanel - Destructor Function Begin")); +#ifdef __WXMAC__ + RemoveMacAccessibilitySupport(); +#endif + wxLogTrace(wxT("Function Start/End"), wxT("CSimplePanel::CSimplePanel - Destructor Function End")); } @@ -508,8 +519,9 @@ void CSimplePanel::OnProjectsAttachToProject() { // called from CSimpleFrame::OnRefreshView() void CSimplePanel::OnFrameRender() { - CMainDocument* pDoc = wxGetApp().GetDocument(); + CMainDocument* pDoc = wxGetApp().GetDocument(); wxASSERT(pDoc); + int workCount = pDoc->GetSimpleGUIWorkCount(); // OnFrameRender() may be called while SimpleGUI initialization is // in progress due to completion of a periodic get_messages RPC, @@ -527,7 +539,7 @@ void CSimplePanel::OnFrameRender() { } // Now check to see if we show the empty state or results - if ( pDoc->GetSimpleGUIWorkCount() > 0 ) { + if ( workCount > 0 ) { // State changes can cause the BSG to crash if a dialogue is open. // Defer state change until after the dialogue is closed if ( (emptyViewInitialized || !notebookViewInitialized) && dlgOpen ) { @@ -543,6 +555,7 @@ void CSimplePanel::OnFrameRender() { InitNotebook(); } wrkUnitNB->Update(); + } else { // State changes can cause the BSG to crash if a dialogue is open. // Defer state change until after the dialogue is closed @@ -558,6 +571,17 @@ void CSimplePanel::OnFrameRender() { } UpdateEmptyView(); } + +#ifdef __WXMAC__ + //Accessibility + // Hide all but top level view from accessibility support so that + // the screen reader will tell user to switch to advanced view. + if (oldSimpleGUIWorkCount != workCount) { + oldSimpleGUIWorkCount = workCount; + HIViewRef simple = (HIViewRef)GetHandle(); + AccessibilityIgnoreAllChildren(simple, 1); + } +#endif } } diff --git a/clientgui/sg_BoincSimpleGUI.h b/clientgui/sg_BoincSimpleGUI.h index d2ba09ce2c..bafdb9573d 100644 --- a/clientgui/sg_BoincSimpleGUI.h +++ b/clientgui/sg_BoincSimpleGUI.h @@ -92,6 +92,14 @@ public: protected: void OnEraseBackground(wxEraseEvent& event); +#ifdef __WXMAC__ + void SetupMacAccessibilitySupport(); + void RemoveMacAccessibilitySupport(); + + int oldSimpleGUIWorkCount; + EventHandlerRef m_pSGAccessibilityEventHandlerRef; + +#endif private: bool dlgOpen; @@ -128,7 +136,7 @@ protected: virtual int _GetCurrentViewPage(); #ifdef __WXMAC__ - wxMenuBar* m_pMenubar; + wxMenuBar* m_pMenubar; #endif wxAcceleratorEntry m_Shortcuts[1]; wxAcceleratorTable* m_pAccelTable; diff --git a/mac_build/boinc.xcodeproj/project.pbxproj b/mac_build/boinc.xcodeproj/project.pbxproj index 3d5aee3bb4..2460547588 100755 --- a/mac_build/boinc.xcodeproj/project.pbxproj +++ b/mac_build/boinc.xcodeproj/project.pbxproj @@ -630,6 +630,7 @@ DD247AF70AEA308A0034104A /* SkinManager.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SkinManager.cpp; path = ../clientgui/SkinManager.cpp; sourceTree = SOURCE_ROOT; }; DD247AF80AEA308A0034104A /* SkinManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SkinManager.h; path = ../clientgui/SkinManager.h; sourceTree = SOURCE_ROOT; }; DD252F3009E3E014006454D7 /* boinc_glut.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = boinc_glut.h; path = ../api/boinc_glut.h; sourceTree = SOURCE_ROOT; }; + DD29728E10BB657A00DF3C2E /* MacAccessiblity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MacAccessiblity.h; path = ../clientgui/mac/MacAccessiblity.h; sourceTree = SOURCE_ROOT; }; DD2D25CB07FAB41700151141 /* DlgSelectComputer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DlgSelectComputer.cpp; path = ../clientgui/DlgSelectComputer.cpp; sourceTree = SOURCE_ROOT; }; DD2D25CC07FAB41700151141 /* DlgSelectComputer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = DlgSelectComputer.h; path = ../clientgui/DlgSelectComputer.h; sourceTree = SOURCE_ROOT; }; DD2F32EF07F2A83E00645DDC /* MacSysMenu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = MacSysMenu.h; path = ../clientgui/mac/MacSysMenu.h; sourceTree = SOURCE_ROOT; }; @@ -1673,6 +1674,7 @@ DD30446A0864332D00D73756 /* config.h */, DD1F0ACD0822069E00AFC5FA /* MacGUI.pch */, DDA99BF31099AF18002F8E9B /* MacAccessiblity.cpp */, + DD29728E10BB657A00DF3C2E /* MacAccessiblity.h */, DD2F32F707F2A88B00645DDC /* MacSysMenu.cpp */, DDA9D3BB09189A8C0060E7A7 /* Mac_GUI.cpp */, DD2F32EF07F2A83E00645DDC /* MacSysMenu.h */, diff --git a/mac_installer/GR-ReadMe.rtf b/mac_installer/GR-ReadMe.rtf index 4d223d5bb5..5e751f0b3e 100644 --- a/mac_installer/GR-ReadMe.rtf +++ b/mac_installer/GR-ReadMe.rtf @@ -12,7 +12,9 @@ \cf0 http://gridrepublic.org\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural \cf0 \ -Installing GridRepublic Desktop may take several minutes; please be patient.\ + +\b Installing GridRepublic Desktop may take several minutes; please be patient. +\b0 \ \ If you are upgrading from a version earlier than 6.8.0, you may see a message "Failed to convert file GridRepublic Desktop Preferences to Unicode." This is due to our addition of full Unicode support to the GridRepublic Desktop. If you get this message, you may need to readjust your column widths and other GridRepublic Desktop view options, but no other problems will result. When you quit GridRepublic Desktop, these settings will be saved in the new Unicode format.\ \ diff --git a/mac_installer/PTP-ReadMe.rtf b/mac_installer/PTP-ReadMe.rtf index e175bc98e2..aa6bedfa8e 100644 --- a/mac_installer/PTP-ReadMe.rtf +++ b/mac_installer/PTP-ReadMe.rtf @@ -12,7 +12,9 @@ \cf0 http://gridrepublic.org\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural \cf0 \ -Installing ProgressThruProcessors Desktop may take several minutes; please be patient.\ + +\b Installing ProgressThruProcessors Desktop may take several minutes; please be patient. +\b0 \ \ If you are upgrading from a version earlier than 6.8.0, you may see a message "Failed to convert file ProgressThruProcessors Desktop Preferences to Unicode." This is due to our addition of full Unicode support to the ProgressThruProcessors Desktop. If you get this message, you may need to readjust your column widths and other ProgressThruProcessors Desktop view options, but no other problems will result. When you quit ProgressThruProcessors Desktop, these settings will be saved in the new Unicode format.\ \ diff --git a/mac_installer/ReadMe.rtf b/mac_installer/ReadMe.rtf index bcb90e8c23..61b27a46da 100644 --- a/mac_installer/ReadMe.rtf +++ b/mac_installer/ReadMe.rtf @@ -11,10 +11,11 @@ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc \cf0 http://boinc.berkeley.edu/\ \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640 -\cf0 Installing BOINC may take several minutes; please be patient.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural -\cf0 \ + +\b \cf0 Installing BOINC may take several minutes; please be patient. +\b0 \ +\ If you are upgrading from a version earlier than 6.8.0, you may see a message "Failed to convert file BOINC Manager Preferences to Unicode." This is due to our addition of full Unicode support to the BOINC Manager. If you get this message, you may need to readjust your column widths and other BOINC Manager view options, but no other problems will result. When you quit BOINC Manager, these settings will be saved in the new Unicode format.\ \ Due to new restrictions imposed by OS 10.6 Snow Leopard, there has been a change in BOINC's security implementation. Non-administrative users can no longer run BOINC Manager unless they are added to group boinc_master. As of BOINC 6.10.5, the BOINC installer asks whether or not you wish to allow this.\