📄 utils.cpp
字号:
// Restore cursor to normalvoid wxEndBusyCursor(){ wxCHECK_RET( gs_wxBusyCursorCount > 0, wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); if (--gs_wxBusyCursorCount == 0) { gMacStoredActiveCursor.MacInstall(); gMacStoredActiveCursor = wxNullCursor; }}// true if we're between the above two callsbool wxIsBusy(){ return (gs_wxBusyCursorCount > 0);}#endif // wxUSE_GUI#if wxUSE_BASEwxString wxMacFindFolderNoSeparator( short vol, OSType folderType, Boolean createFolder){ FSRef fsRef; wxString strDir; if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr) { strDir = wxMacFSRefToPath( &fsRef ); } return strDir;}wxString wxMacFindFolder( short vol, OSType folderType, Boolean createFolder){ return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH;}#endif // wxUSE_BASE#if wxUSE_GUI// Check whether this window wants to process messages, e.g. Stop button// in long calculations.bool wxCheckForInterrupt(wxWindow *wnd){ // TODO return false;}void wxGetMousePosition( int* x, int* y ){ Point pt;#if wxMAC_USE_CORE_GRAPHICS GetGlobalMouse(&pt);#else GetMouse( &pt ); LocalToGlobal( &pt );#endif *x = pt.h; *y = pt.v;};// Return true if we have a colour displaybool wxColourDisplay(){ return true;}// Returns depth of screenint wxDisplayDepth(){ int theDepth = 8;#if wxMAC_USE_CORE_GRAPHICS theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());#else Rect globRect; SetRect(&globRect, -32760, -32760, 32760, 32760); GDHandle theMaxDevice; theMaxDevice = GetMaxDevice(&globRect); if (theMaxDevice != NULL) theDepth = (**(**theMaxDevice).gdPMap).pixelSize;#endif return theDepth;}// Get size of displayvoid wxDisplaySize(int *width, int *height){#if wxMAC_USE_CORE_GRAPHICS // TODO adapt for multi-displays CGRect bounds = CGDisplayBounds(CGMainDisplayID()); if ( width ) *width = (int)bounds.size.width ; if ( height ) *height = (int)bounds.size.height;#else BitMap screenBits; GetQDGlobalsScreenBits( &screenBits ); if (width != NULL) *width = screenBits.bounds.right - screenBits.bounds.left; if (height != NULL) *height = screenBits.bounds.bottom - screenBits.bounds.top;#endif}void wxDisplaySizeMM(int *width, int *height){ wxDisplaySize(width, height); // on mac 72 is fixed (at least now;-) float cvPt2Mm = 25.4 / 72; if (width != NULL) *width = int( *width * cvPt2Mm ); if (height != NULL) *height = int( *height * cvPt2Mm );}void wxClientDisplayRect(int *x, int *y, int *width, int *height){#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 HIRect bounds ; HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal, &bounds); if ( x ) *x = bounds.origin.x; if ( y ) *y = bounds.origin.y; if ( width ) *width = bounds.size.width; if ( height ) *height = bounds.size.height;#else Rect r; GetAvailableWindowPositioningBounds( GetMainDevice() , &r ); if ( x ) *x = r.left; if ( y ) *y = r.top; if ( width ) *width = r.right - r.left; if ( height ) *height = r.bottom - r.top;#endif}wxWindow* wxFindWindowAtPoint(const wxPoint& pt){ return wxGenericFindWindowAtPoint(pt);}#endif // wxUSE_GUI#if wxUSE_BASEwxString wxGetOsDescription(){#ifdef WXWIN_OS_DESCRIPTION // use configure generated description if available return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION) + wxString(wxT(")"));#else return wxT("MacOS"); //TODO:define further#endif}#ifndef __DARWIN__wxChar *wxGetUserHome (const wxString& user){ // TODO return NULL;}bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree){ if ( path.empty() ) return false; wxString p = path; if (p[0u] == ':' ) p = wxGetCwd() + p; int pos = p.Find(':'); if ( pos != wxNOT_FOUND ) p = p.Mid(1,pos); p = p + wxT(":"); OSErr err = noErr; FSRef fsRef; err = wxMacPathToFSRef( p , &fsRef ); if ( noErr == err ) { FSVolumeRefNum vRefNum; err = FSGetVRefNum( &fsRef , &vRefNum ); if ( noErr == err ) { UInt64 freeBytes , totalBytes; err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes ); if ( noErr == err ) { if ( pTotal ) *pTotal = wxDiskspaceSize_t( totalBytes ); if ( pFree ) *pFree = wxDiskspaceSize_t( freeBytes ); } } } return err == noErr;}#endif // !__DARWIN__//---------------------------------------------------------------------------// wxMac Specific utility functions//---------------------------------------------------------------------------void wxMacStringToPascal( const wxString&from , StringPtr to ){ wxCharBuffer buf = from.mb_str( wxConvLocal ); int len = strlen(buf); if ( len > 255 ) len = 255; to[0] = len; memcpy( (char*) &to[1] , buf , len );}wxString wxMacMakeStringFromPascal( ConstStringPtr from ){ return wxString( (char*) &from[1] , wxConvLocal , from[0] );}// ----------------------------------------------------------------------------// Common Event Support// ----------------------------------------------------------------------------extern ProcessSerialNumber gAppProcess;void wxMacWakeUp(){ ProcessSerialNumber psn; Boolean isSame; psn.highLongOfPSN = 0; psn.lowLongOfPSN = kCurrentProcess; SameProcess( &gAppProcess , &psn , &isSame ); if ( isSame ) {#if TARGET_CARBON OSStatus err = noErr;#if 0 // lead sometimes to race conditions, although all calls used should be thread safe ... static wxMacCarbonEvent s_wakeupEvent; if ( !s_wakeupEvent.IsValid() ) { err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), kEventAttributeNone ); } if ( err == noErr ) { if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) ) return; s_wakeupEvent.SetCurrentTime(); err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent, kEventPriorityHigh ); }#else wxMacCarbonEvent wakeupEvent; wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(), kEventAttributeNone ); err = PostEventToQueue(GetMainEventQueue(), wakeupEvent, kEventPriorityHigh );#endif#else PostEvent( nullEvent , 0 );#endif } else { WakeUpProcess( &gAppProcess ); }}#endif // wxUSE_BASE#if wxUSE_GUI// ----------------------------------------------------------------------------// Native Struct Conversions// ----------------------------------------------------------------------------void wxMacRectToNative( const wxRect *wx , Rect *n ){ n->left = wx->x; n->top = wx->y; n->right = wx->x + wx->width; n->bottom = wx->y + wx->height;}void wxMacNativeToRect( const Rect *n , wxRect* wx ){ wx->x = n->left; wx->y = n->top; wx->width = n->right - n->left; wx->height = n->bottom - n->top;}void wxMacPointToNative( const wxPoint* wx , Point *n ){ n->h = wx->x; n->v = wx->y;}void wxMacNativeToPoint( const Point *n , wxPoint* wx ){ wx->x = n->h; wx->y = n->v;}// ----------------------------------------------------------------------------// Carbon Event Support// ----------------------------------------------------------------------------OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData){ return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData );}OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData){ return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData );}// ----------------------------------------------------------------------------// Control Access Support// ----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )wxMacControl::wxMacControl() { Init();}wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl ){ Init(); m_peer = peer; m_isRootControl = isRootControl;}wxMacControl::wxMacControl( wxWindow* peer , ControlRef control ){ Init(); m_peer = peer; m_controlRef = control;}wxMacControl::wxMacControl( wxWindow* peer , WXWidget control ){ Init(); m_peer = peer; m_controlRef = (ControlRef) control;}wxMacControl::~wxMacControl(){}void wxMacControl::Init(){ m_peer = NULL; m_controlRef = NULL; m_needsFocusRect = false; m_isRootControl = false;}void wxMacControl::Dispose(){ wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") ); // we cannot check the ref count here anymore, as autorelease objects might delete their refs later CFRelease(m_controlRef); m_controlRef = NULL;}void wxMacControl::SetReference( URefCon data ){ SetControlReference( m_controlRef , data );}OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const{ return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize );}OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const{ return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize );}OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData){ return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData );}OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions ){#if TARGET_API_MAC_OSX return SendEventToEventTargetWithOptions( event, HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions );#else #pragma unused(inOptions) return SendEventToEventTarget(event,GetControlEventTarget( m_controlRef ) );#endif}OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions ){ wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess ); event.SetParameter<HICommand>(kEventParamDirectObject,command); return SendEvent( event , inOptions );}OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions ){ HICommand command; memset( &command, 0 , sizeof(command) ); command.commandID = commandID; return SendHICommand( command , inOptions );}void wxMacControl::Flash( ControlPartCode part , UInt32 ticks ){ unsigned long finalTicks; HiliteControl( m_controlRef , part ); Delay( ticks , &finalTicks ); HiliteControl( m_controlRef , kControlNoPart );}SInt32 wxMacControl::GetValue() const{ return ::GetControl32BitValue( m_controlRef );}SInt32 wxMacControl::GetMaximum() const{ return ::GetControl32BitMaximum( m_controlRef );}SInt32 wxMacControl::GetMinimum() const{ return ::GetControl32BitMinimum( m_controlRef );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -