📄 utils.cpp
字号:
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;
GetMouse( &pt );
LocalToGlobal( &pt );
*x = pt.h;
*y = pt.v;
};
// Return true if we have a colour display
bool wxColourDisplay()
{
return true;
}
// Returns depth of screen
int wxDisplayDepth()
{
Rect globRect;
SetRect(&globRect, -32760, -32760, 32760, 32760);
GDHandle theMaxDevice;
int theDepth = 8;
theMaxDevice = GetMaxDevice(&globRect);
if (theMaxDevice != NULL)
theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
return theDepth;
}
// Get size of display
void wxDisplaySize(int *width, int *height)
{
BitMap screenBits;
GetQDGlobalsScreenBits( &screenBits );
if (width != NULL)
*width = screenBits.bounds.right - screenBits.bounds.left;
if (height != NULL)
*height = screenBits.bounds.bottom - screenBits.bounds.top;
}
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)
{
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;
}
wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
{
return wxGenericFindWindowAtPoint(pt);
}
#endif // wxUSE_GUI
#if wxUSE_BASE
wxString 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
// ----------------------------------------------------------------------------
wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl )
{
Init();
m_peer = peer;
m_isRootControl = isRootControl;
m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing();
}
wxMacControl::wxMacControl( wxWindow* peer , ControlRef control )
{
Init();
m_peer = peer;
m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing();
m_controlRef = control;
}
wxMacControl::wxMacControl( wxWindow* peer , WXWidget control )
{
Init();
m_peer = peer;
m_isCompositing = peer->MacGetTopLevelWindow()->MacUsesCompositing();
m_controlRef = (ControlRef) control;
}
wxMacControl::~wxMacControl()
{
}
void wxMacControl::Init()
{
m_peer = NULL;
m_controlRef = NULL;
m_needsFocusRect = false;
m_isCompositing = false;
m_isRootControl = false;
}
void wxMacControl::Dispose()
{
::DisposeControl( m_controlRef );
m_controlRef = NULL;
}
void wxMacControl::SetReference( SInt32 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 );
}
void wxMacControl::SetValue( SInt32 v )
{
::SetControl32BitValue( m_controlRef , v );
}
void wxMacControl::SetMinimum( SInt32 v )
{
::SetControl32BitMinimum( m_controlRef , v );
}
void wxMacControl::SetMaximum( SInt32 v )
{
::SetControl32BitMaximum( m_controlRef , v );
}
void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
{
::SetControl32BitMinimum( m_controlRef , minimum );
::SetControl32BitMaximum( m_controlRef , maximum );
::SetControl32BitValue( m_controlRef , value );
}
OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
{
return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart );
}
bool wxMacControl::HasFocus() const
{
ControlRef control;
GetKeyboardFocus( GetUserFocusWindow() , &control );
return control == m_controlRef;
}
void wxMacControl::SetNeedsFocusRect( bool needs )
{
m_needsFocusRect = needs;
}
bool wxMacControl::NeedsFocusRect() const
{
return m_needsFocusRect;
}
void wxMacControl::VisibilityChanged(bool shown)
{
}
void wxMacControl::SuperChangedPosition()
{
}
void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
{
m_font = font;
ControlFontStyleRec fontStyle;
if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
{
switch ( font.MacGetThemeFontID() )
{
case kThemeSmallSystemFont :
fontStyle.font = kControlFontSmallSystemFont;
break;
case 109 : // mini font
fontStyle.font = -5;
break;
case kThemeSystemFont :
fontStyle.font = kControlFontBigSystemFont;
break;
default :
fontStyle.font = kControlFontBigSystemFont;
break;
}
fontStyle.flags = kControlUseFontMask;
}
else
{
fontStyle.font = font.MacGetFontNum();
fontStyle.style = font.MacGetFontStyle();
fontStyle.size = font.MacGetFontSize();
fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask;
}
fontStyle.just = teJustLeft;
fontStyle.flags |= kControlUseJustMask;
if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
fontStyle.just = teJustCenter;
else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
fontStyle.just = teJustRight;
// we only should do this in case of a non-standard color, as otherwise 'disabled' controls
// won't get grayed out by the system anymore
if ( foreground != *wxBLACK )
{
fontStyle.foreColor = MAC_WXCOLORREF( foreground.GetPixel() );
fontStyle.flags |= kControlUseForeColorMask;
}
::SetControlFontStyle( m_controlRef , &fontStyle );
}
void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
{
// TODO
// setting up a color proc is not recommended anymore
}
void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
{
::SetControl32BitMinimum( m_controlRef , minimum );
::SetControl32BitMaximum( m_controlRef , maximum );
}
short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
{
return HandleControlKey( m_controlRef , keyCode , charCode , modifiers );
}
void wxMacControl::SetActionProc( ControlActionUPP actionProc )
{
SetControlAction( m_controlRef , actionProc );
}
void wxMacControl::SetViewSize( SInt32 viewSize )
{
SetControlViewSize(m_controlRef , viewSize );
}
SInt32 wxMacControl::GetViewSize() const
{
return GetControlViewSize( m_controlRef );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -