1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/utils.cpp
3 // Purpose: Various utilities
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
16 #include "wx/apptrait.h"
19 #include "wx/mac/uma.h"
21 #include "wx/toplevel.h"
33 #include "MoreFilesX.h"
41 #if TARGET_API_MAC_OSX
42 #include <CoreServices/CoreServices.h>
44 #include <DriverServices.h>
45 #include <Multiprocessing.h>
49 #include <Carbon/Carbon.h>
51 #include <ATSUnicode.h>
52 #include <TextCommon.h>
53 #include <TextEncodingConverter.h>
57 #include "wx/mac/private.h" // includes mac headers
59 #if defined(__MWERKS__) && wxUSE_UNICODE
63 // ---------------------------------------------------------------------------
64 // code used in both base and GUI compilation
65 // ---------------------------------------------------------------------------
67 // our OS version is the same in non GUI and GUI cases
68 static int DoGetOSVersion(int *majorVsn
, int *minorVsn
)
72 // are there x-platform conventions ?
74 Gestalt(gestaltSystemVersion
, &theSystem
) ;
75 if (minorVsn
!= NULL
) {
76 *minorVsn
= (theSystem
& 0xFF ) ;
78 if (majorVsn
!= NULL
) {
79 *majorVsn
= (theSystem
>> 8 ) ;
91 // ----------------------------------------------------------------------------
93 // ----------------------------------------------------------------------------
95 #if defined(__WXDEBUG__) && defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
97 // MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
99 #ifndef __MetroNubUtils__
100 #include "MetroNubUtils.h"
107 #if TARGET_API_MAC_CARBON
109 #include <CodeFragments.h>
111 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr
, ProcInfoType procInfo
, ...);
113 ProcPtr gCallUniversalProc_Proc
= NULL
;
117 static MetroNubUserEntryBlock
* gMetroNubEntry
= NULL
;
119 static long fRunOnce
= false;
121 /* ---------------------------------------------------------------------------
123 --------------------------------------------------------------------------- */
125 Boolean
IsMetroNubInstalled()
132 gMetroNubEntry
= NULL
;
134 if (Gestalt(gestaltSystemVersion
, &value
) == noErr
&& value
< 0x1000)
136 /* look for MetroNub's Gestalt selector */
137 if (Gestalt(kMetroNubUserSignature
, &result
) == noErr
)
140 #if TARGET_API_MAC_CARBON
141 if (gCallUniversalProc_Proc
== NULL
)
143 CFragConnectionID connectionID
;
146 ProcPtr symbolAddress
;
148 CFragSymbolClass symbolClass
;
150 symbolAddress
= NULL
;
151 err
= GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch
, kFindCFrag
,
152 &connectionID
, &mainAddress
, errorString
);
156 gCallUniversalProc_Proc
= NULL
;
160 err
= FindSymbol(connectionID
, "\pCallUniversalProc",
161 (Ptr
*) &gCallUniversalProc_Proc
, &symbolClass
);
165 gCallUniversalProc_Proc
= NULL
;
172 MetroNubUserEntryBlock
* block
= (MetroNubUserEntryBlock
*)result
;
174 /* make sure the version of the API is compatible */
175 if (block
->apiLowVersion
<= kMetroNubUserAPIVersion
&&
176 kMetroNubUserAPIVersion
<= block
->apiHiVersion
)
177 gMetroNubEntry
= block
; /* success! */
186 #if TARGET_API_MAC_CARBON
187 return (gMetroNubEntry
!= NULL
&& gCallUniversalProc_Proc
!= NULL
);
189 return (gMetroNubEntry
!= NULL
);
193 /* ---------------------------------------------------------------------------
194 IsMWDebuggerRunning [v1 API]
195 --------------------------------------------------------------------------- */
197 Boolean
IsMWDebuggerRunning()
199 if (IsMetroNubInstalled())
200 return CallIsDebuggerRunningProc(gMetroNubEntry
->isDebuggerRunning
);
205 /* ---------------------------------------------------------------------------
206 AmIBeingMWDebugged [v1 API]
207 --------------------------------------------------------------------------- */
209 Boolean
AmIBeingMWDebugged()
211 if (IsMetroNubInstalled())
212 return CallAmIBeingDebuggedProc(gMetroNubEntry
->amIBeingDebugged
);
217 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
219 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
224 extern bool WXDLLEXPORT
wxIsDebuggerRunning()
229 #endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
233 // defined in unix/utilsunx.cpp for Mac OS X
235 // get full hostname (with domain name if possible)
236 bool wxGetFullHostName(wxChar
*buf
, int maxSize
)
238 return wxGetHostName(buf
, maxSize
);
241 // Get hostname only (without domain name)
242 bool wxGetHostName(wxChar
*buf
, int maxSize
)
244 // Gets Chooser name of user by examining a System resource.
246 const short kComputerNameID
= -16413;
248 short oldResFile
= CurResFile() ;
250 StringHandle chooserName
= (StringHandle
)::GetString(kComputerNameID
);
251 UseResFile(oldResFile
);
253 if (chooserName
&& *chooserName
)
255 HLock( (Handle
) chooserName
) ;
256 wxString name
= wxMacMakeStringFromPascal( *chooserName
) ;
257 HUnlock( (Handle
) chooserName
) ;
258 ReleaseResource( (Handle
) chooserName
) ;
259 wxStrncpy( buf
, name
, maxSize
- 1 ) ;
267 // Get user ID e.g. jacs
268 bool wxGetUserId(wxChar
*buf
, int maxSize
)
270 return wxGetUserName( buf
, maxSize
) ;
273 const wxChar
* wxGetHomeDir(wxString
*pstr
)
275 *pstr
= wxMacFindFolder( (short) kOnSystemDisk
, kPreferencesFolderType
, kDontCreateFolder
) ;
276 return pstr
->c_str() ;
279 // Get user name e.g. Stefan Csomor
280 bool wxGetUserName(wxChar
*buf
, int maxSize
)
282 // Gets Chooser name of user by examining a System resource.
284 const short kChooserNameID
= -16096;
286 short oldResFile
= CurResFile() ;
288 StringHandle chooserName
= (StringHandle
)::GetString(kChooserNameID
);
289 UseResFile(oldResFile
);
291 if (chooserName
&& *chooserName
)
293 HLock( (Handle
) chooserName
) ;
294 wxString name
= wxMacMakeStringFromPascal( *chooserName
) ;
295 HUnlock( (Handle
) chooserName
) ;
296 ReleaseResource( (Handle
) chooserName
) ;
297 wxStrncpy( buf
, name
, maxSize
- 1 ) ;
305 int wxKill(long pid
, wxSignal sig
, wxKillError
*rc
, int flags
)
311 WXDLLEXPORT
bool wxGetEnv(const wxString
& var
, wxString
*value
)
313 // TODO : under classic there is no environement support, under X yes
317 // set the env var name to the given value, return true on success
318 WXDLLEXPORT
bool wxSetEnv(const wxString
& var
, const wxChar
*value
)
320 // TODO : under classic there is no environement support, under X yes
325 // Execute a program in an Interactive Shell
327 bool wxShell(const wxString
& command
)
333 // Shutdown or reboot the PC
334 bool wxShutdown(wxShutdownFlags wFlags
)
340 wxPowerType
wxGetPowerType()
343 return wxPOWER_UNKNOWN
;
346 wxBatteryState
wxGetBatteryState()
349 return wxBATTERY_UNKNOWN_STATE
;
352 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
353 wxMemorySize
wxGetFreeMemory()
355 return (wxMemorySize
)FreeMem() ;
360 void wxMicroSleep(unsigned long microseconds
)
362 AbsoluteTime wakeup
= AddDurationToAbsolute( microseconds
* durationMicrosecond
, UpTime());
363 MPDelayUntil( & wakeup
);
366 void wxMilliSleep(unsigned long milliseconds
)
368 AbsoluteTime wakeup
= AddDurationToAbsolute( milliseconds
, UpTime());
369 MPDelayUntil( & wakeup
);
372 void wxSleep(int nSecs
)
374 wxMilliSleep(1000*nSecs
);
379 // Consume all events until no more left
384 #endif // !__DARWIN__
392 wxToolkitInfo
& wxConsoleAppTraits::GetToolkitInfo()
394 static wxToolkitInfo info
;
395 info
.os
= DoGetOSVersion(&info
.versionMajor
, &info
.versionMinor
);
396 info
.name
= _T("wxBase");
404 wxToolkitInfo
& wxGUIAppTraits::GetToolkitInfo()
406 static wxToolkitInfo info
;
407 info
.os
= DoGetOSVersion(&info
.versionMajor
, &info
.versionMinor
);
408 info
.shortName
= _T("mac");
409 info
.name
= _T("wxMac");
410 #ifdef __WXUNIVERSAL__
411 info
.shortName
<< _T("univ");
412 info
.name
<< _T("/wxUniversal");
417 // Reading and writing resources (eg WIN.INI, .Xdefaults)
419 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, const wxString
& value
, const wxString
& file
)
425 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, float value
, const wxString
& file
)
428 buf
.Printf(wxT("%.4f"), value
);
430 return wxWriteResource(section
, entry
, buf
, file
);
433 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, long value
, const wxString
& file
)
436 buf
.Printf(wxT("%ld"), value
);
438 return wxWriteResource(section
, entry
, buf
, file
);
441 bool wxWriteResource(const wxString
& section
, const wxString
& entry
, int value
, const wxString
& file
)
444 buf
.Printf(wxT("%d"), value
);
446 return wxWriteResource(section
, entry
, buf
, file
);
449 bool wxGetResource(const wxString
& section
, const wxString
& entry
, char **value
, const wxString
& file
)
455 bool wxGetResource(const wxString
& section
, const wxString
& entry
, float *value
, const wxString
& file
)
458 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
461 *value
= (float)strtod(s
, NULL
);
468 bool wxGetResource(const wxString
& section
, const wxString
& entry
, long *value
, const wxString
& file
)
471 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
474 *value
= strtol(s
, NULL
, 10);
481 bool wxGetResource(const wxString
& section
, const wxString
& entry
, int *value
, const wxString
& file
)
484 bool succ
= wxGetResource(section
, entry
, (char **)&s
, file
);
487 *value
= (int)strtol(s
, NULL
, 10);
493 #endif // wxUSE_RESOURCES
495 int gs_wxBusyCursorCount
= 0;
496 extern wxCursor gMacCurrentCursor
;
497 wxCursor gMacStoredActiveCursor
;
499 // Set the cursor to the busy cursor for all windows
500 void wxBeginBusyCursor(wxCursor
*cursor
)
502 if (gs_wxBusyCursorCount
++ == 0)
504 gMacStoredActiveCursor
= gMacCurrentCursor
;
505 cursor
->MacInstall() ;
507 //else: nothing to do, already set
510 // Restore cursor to normal
511 void wxEndBusyCursor()
513 wxCHECK_RET( gs_wxBusyCursorCount
> 0,
514 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
516 if (--gs_wxBusyCursorCount
== 0)
518 gMacStoredActiveCursor
.MacInstall() ;
519 gMacStoredActiveCursor
= wxNullCursor
;
523 // true if we're between the above two calls
526 return (gs_wxBusyCursorCount
> 0);
533 wxString
wxMacFindFolder( short vol
,
535 Boolean createFolder
)
540 if ( FSFindFolder( vol
, folderType
, createFolder
, &fsRef
) == noErr
)
541 strDir
= wxMacFSRefToPath( &fsRef
) + wxFILE_SEP_PATH
;
550 // Check whether this window wants to process messages, e.g. Stop button
551 // in long calculations.
552 bool wxCheckForInterrupt(wxWindow
*wnd
)
558 void wxGetMousePosition( int* x
, int* y
)
563 LocalToGlobal( &pt
) ;
568 // Return true if we have a colour display
569 bool wxColourDisplay()
574 // Returns depth of screen
578 SetRect(&globRect
, -32760, -32760, 32760, 32760);
579 GDHandle theMaxDevice
;
582 theMaxDevice
= GetMaxDevice(&globRect
);
583 if (theMaxDevice
!= nil
)
584 theDepth
= (**(**theMaxDevice
).gdPMap
).pixelSize
;
589 // Get size of display
590 void wxDisplaySize(int *width
, int *height
)
593 GetQDGlobalsScreenBits( &screenBits
);
596 *width
= screenBits
.bounds
.right
- screenBits
.bounds
.left
;
598 if (height
!= NULL
) {
599 *height
= screenBits
.bounds
.bottom
- screenBits
.bounds
.top
;
603 void wxDisplaySizeMM(int *width
, int *height
)
605 wxDisplaySize(width
, height
);
606 // on mac 72 is fixed (at least now ;-)
607 float cvPt2Mm
= 25.4 / 72;
610 *width
= int( *width
* cvPt2Mm
);
612 if (height
!= NULL
) {
613 *height
= int( *height
* cvPt2Mm
);
617 void wxClientDisplayRect(int *x
, int *y
, int *width
, int *height
)
620 GetAvailableWindowPositioningBounds( GetMainDevice() , &r
) ;
626 *width
= r
.right
- r
.left
;
628 *height
= r
.bottom
- r
.top
;
631 wxWindow
* wxFindWindowAtPoint(const wxPoint
& pt
)
633 return wxGenericFindWindowAtPoint(pt
);
640 wxString
wxGetOsDescription()
642 #ifdef WXWIN_OS_DESCRIPTION
643 // use configure generated description if available
644 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION
) + wxString(wxT(")"));
646 return wxT("MacOS") ; //TODO:define further
651 wxChar
*wxGetUserHome (const wxString
& user
)
657 bool wxGetDiskSpace(const wxString
& path
, wxLongLong
*pTotal
, wxLongLong
*pFree
)
667 int pos
= p
.Find(':') ;
668 if ( pos
!= wxNOT_FOUND
) {
677 err
= wxMacPathToFSRef( p
, &fsRef
) ;
680 FSVolumeRefNum vRefNum
;
681 err
= FSGetVRefNum( &fsRef
, &vRefNum
) ;
684 UInt64 freeBytes
, totalBytes
;
685 err
= FSGetVInfo( vRefNum
, NULL
, &freeBytes
, &totalBytes
) ;
689 *pTotal
= wxLongLong( totalBytes
) ;
691 *pFree
= wxLongLong( freeBytes
) ;
696 return err
== noErr
;
698 #endif // !__DARWIN__
700 //---------------------------------------------------------------------------
701 // wxMac Specific utility functions
702 //---------------------------------------------------------------------------
704 void wxMacStringToPascal( const wxString
&from
, StringPtr to
)
706 wxCharBuffer buf
= from
.mb_str( wxConvLocal
) ;
707 int len
= strlen(buf
) ;
712 memcpy( (char*) &to
[1] , buf
, len
) ;
715 wxString
wxMacMakeStringFromPascal( ConstStringPtr from
)
717 return wxString( (char*) &from
[1] , wxConvLocal
, from
[0] ) ;
721 // ----------------------------------------------------------------------------
722 // Common Event Support
723 // ----------------------------------------------------------------------------
726 extern ProcessSerialNumber gAppProcess
;
730 ProcessSerialNumber psn
;
732 psn
.highLongOfPSN
= 0 ;
733 psn
.lowLongOfPSN
= kCurrentProcess
;
734 SameProcess( &gAppProcess
, &psn
, &isSame
) ;
738 static wxMacCarbonEvent s_wakeupEvent
;
739 OSStatus err
= noErr
;
740 if ( !s_wakeupEvent
.IsValid() )
742 err
= s_wakeupEvent
.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
743 kEventAttributeNone
) ;
747 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent
) )
749 s_wakeupEvent
.SetCurrentTime() ;
750 err
= PostEventToQueue(GetMainEventQueue(), s_wakeupEvent
,
754 PostEvent( nullEvent
, 0 ) ;
759 WakeUpProcess( &gAppProcess
) ;
767 // ----------------------------------------------------------------------------
768 // Native Struct Conversions
769 // ----------------------------------------------------------------------------
772 void wxMacRectToNative( const wxRect
*wx
, Rect
*n
)
776 n
->right
= wx
->x
+ wx
->width
;
777 n
->bottom
= wx
->y
+ wx
->height
;
780 void wxMacNativeToRect( const Rect
*n
, wxRect
* wx
)
784 wx
->width
= n
->right
- n
->left
;
785 wx
->height
= n
->bottom
- n
->top
;
788 void wxMacPointToNative( const wxPoint
* wx
, Point
*n
)
794 void wxMacNativeToPoint( const Point
*n
, wxPoint
* wx
)
800 // ----------------------------------------------------------------------------
801 // Carbon Event Support
802 // ----------------------------------------------------------------------------
805 OSStatus
wxMacCarbonEvent::GetParameter(EventParamName inName
, EventParamType inDesiredType
, UInt32 inBufferSize
, void * outData
)
807 return ::GetEventParameter( m_eventRef
, inName
, inDesiredType
, NULL
, inBufferSize
, NULL
, outData
) ;
810 OSStatus
wxMacCarbonEvent::SetParameter(EventParamName inName
, EventParamType inType
, UInt32 inBufferSize
, const void * inData
)
812 return ::SetEventParameter( m_eventRef
, inName
, inType
, inBufferSize
, inData
) ;
815 // ----------------------------------------------------------------------------
816 // Control Access Support
817 // ----------------------------------------------------------------------------
819 wxMacControl::wxMacControl(wxWindow
* peer
, bool isRootControl
)
823 m_isRootControl
= isRootControl
;
824 m_isCompositing
= peer
->MacGetTopLevelWindow()->MacUsesCompositing() ;
827 wxMacControl::wxMacControl( wxWindow
* peer
, ControlRef control
)
831 m_isCompositing
= peer
->MacGetTopLevelWindow()->MacUsesCompositing() ;
832 m_controlRef
= control
;
835 wxMacControl::wxMacControl( wxWindow
* peer
, WXWidget control
)
839 m_isCompositing
= peer
->MacGetTopLevelWindow()->MacUsesCompositing() ;
840 m_controlRef
= (ControlRef
) control
;
843 wxMacControl::~wxMacControl()
847 void wxMacControl::Init()
850 m_controlRef
= NULL
;
851 m_needsFocusRect
= false ;
852 m_isCompositing
= false ;
853 m_isRootControl
= false ;
856 void wxMacControl::Dispose()
858 ::DisposeControl( m_controlRef
) ;
859 m_controlRef
= NULL
;
862 void wxMacControl::SetReference( SInt32 data
)
864 SetControlReference( m_controlRef
, data
) ;
867 OSStatus
wxMacControl::GetData(ControlPartCode inPartCode
, ResType inTag
, Size inBufferSize
, void * inOutBuffer
, Size
* outActualSize
) const
869 return ::GetControlData( m_controlRef
, inPartCode
, inTag
, inBufferSize
, inOutBuffer
, outActualSize
) ;
872 OSStatus
wxMacControl::GetDataSize(ControlPartCode inPartCode
, ResType inTag
, Size
* outActualSize
) const
874 return ::GetControlDataSize( m_controlRef
, inPartCode
, inTag
, outActualSize
) ;
877 OSStatus
wxMacControl::SetData(ControlPartCode inPartCode
, ResType inTag
, Size inSize
, const void * inData
)
879 return ::SetControlData( m_controlRef
, inPartCode
, inTag
, inSize
, inData
) ;
882 OSStatus
wxMacControl::SendEvent( EventRef event
, OptionBits inOptions
)
884 #if TARGET_API_MAC_OSX
885 return SendEventToEventTargetWithOptions( event
,
886 HIObjectGetEventTarget( (HIObjectRef
) m_controlRef
), inOptions
);
888 #pragma unused(inOptions)
889 return SendEventToEventTarget(event
,GetControlEventTarget( m_controlRef
) ) ;
893 OSStatus
wxMacControl::SendHICommand( HICommand
&command
, OptionBits inOptions
)
895 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
) ;
896 event
.SetParameter
<HICommand
>(kEventParamDirectObject
,command
) ;
897 return SendEvent( event
, inOptions
) ;
900 OSStatus
wxMacControl::SendHICommand( UInt32 commandID
, OptionBits inOptions
)
903 memset( &command
, 0 , sizeof(command
) ) ;
904 command
.commandID
= commandID
;
905 return SendHICommand( command
, inOptions
) ;
908 void wxMacControl::Flash( ControlPartCode part
, UInt32 ticks
)
910 HiliteControl( m_controlRef
, part
) ;
911 unsigned long finalTicks
;
912 Delay( ticks
, &finalTicks
) ;
913 HiliteControl( m_controlRef
, kControlNoPart
) ;
916 SInt32
wxMacControl::GetValue() const
918 return ::GetControl32BitValue( m_controlRef
) ;
921 SInt32
wxMacControl::GetMaximum() const
923 return ::GetControl32BitMaximum( m_controlRef
) ;
926 SInt32
wxMacControl::GetMinimum() const
928 return ::GetControl32BitMinimum( m_controlRef
) ;
931 void wxMacControl::SetValue( SInt32 v
)
933 ::SetControl32BitValue( m_controlRef
, v
) ;
936 void wxMacControl::SetMinimum( SInt32 v
)
938 ::SetControl32BitMinimum( m_controlRef
, v
) ;
941 void wxMacControl::SetMaximum( SInt32 v
)
943 ::SetControl32BitMaximum( m_controlRef
, v
) ;
946 void wxMacControl::SetValueAndRange( SInt32 value
, SInt32 minimum
, SInt32 maximum
)
948 ::SetControl32BitMinimum( m_controlRef
, minimum
) ;
949 ::SetControl32BitMaximum( m_controlRef
, maximum
) ;
950 ::SetControl32BitValue( m_controlRef
, value
) ;
953 OSStatus
wxMacControl::SetFocus( ControlFocusPart focusPart
)
955 return SetKeyboardFocus( GetControlOwner( m_controlRef
) ,
956 m_controlRef
, focusPart
) ;
959 bool wxMacControl::HasFocus() const
962 GetKeyboardFocus( GetUserFocusWindow() , &control
) ;
963 return control
== m_controlRef
;
966 void wxMacControl::SetNeedsFocusRect( bool needs
)
968 m_needsFocusRect
= needs
;
971 bool wxMacControl::NeedsFocusRect() const
973 return m_needsFocusRect
;
976 void wxMacControl::VisibilityChanged(bool shown
)
980 void wxMacControl::SuperChangedPosition()
984 void wxMacControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
987 ControlFontStyleRec fontStyle
;
988 if ( font
.MacGetThemeFontID() != kThemeCurrentPortFont
)
990 switch( font
.MacGetThemeFontID() )
992 case kThemeSmallSystemFont
: fontStyle
.font
= kControlFontSmallSystemFont
; break ;
993 case 109 /*mini font */ : fontStyle
.font
= -5 ; break ;
994 case kThemeSystemFont
: fontStyle
.font
= kControlFontBigSystemFont
; break ;
995 default : fontStyle
.font
= kControlFontBigSystemFont
; break ;
997 fontStyle
.flags
= kControlUseFontMask
;
1001 fontStyle
.font
= font
.MacGetFontNum() ;
1002 fontStyle
.style
= font
.MacGetFontStyle() ;
1003 fontStyle
.size
= font
.MacGetFontSize() ;
1004 fontStyle
.flags
= kControlUseFontMask
| kControlUseFaceMask
| kControlUseSizeMask
;
1007 fontStyle
.just
= teJustLeft
;
1008 fontStyle
.flags
|= kControlUseJustMask
;
1009 if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_CENTER_HORIZONTAL
)
1010 fontStyle
.just
= teJustCenter
;
1011 else if ( ( windowStyle
& wxALIGN_MASK
) & wxALIGN_RIGHT
)
1012 fontStyle
.just
= teJustRight
;
1015 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
1016 // won't get grayed out by the system anymore
1018 if ( foreground
!= *wxBLACK
)
1020 fontStyle
.foreColor
= MAC_WXCOLORREF(foreground
.GetPixel() ) ;
1021 fontStyle
.flags
|= kControlUseForeColorMask
;
1024 ::SetControlFontStyle( m_controlRef
, &fontStyle
);
1027 void wxMacControl::SetBackground( const wxBrush
&WXUNUSED(brush
) )
1030 // setting up a color proc is not recommended anymore
1033 void wxMacControl::SetRange( SInt32 minimum
, SInt32 maximum
)
1035 ::SetControl32BitMinimum( m_controlRef
, minimum
) ;
1036 ::SetControl32BitMaximum( m_controlRef
, maximum
) ;
1039 short wxMacControl::HandleKey( SInt16 keyCode
, SInt16 charCode
, EventModifiers modifiers
)
1041 return HandleControlKey( m_controlRef
, keyCode
, charCode
, modifiers
) ;
1044 void wxMacControl::SetActionProc( ControlActionUPP actionProc
)
1046 SetControlAction( m_controlRef
, actionProc
) ;
1049 void wxMacControl::SetViewSize( SInt32 viewSize
)
1051 SetControlViewSize(m_controlRef
, viewSize
) ;
1054 SInt32
wxMacControl::GetViewSize() const
1056 return GetControlViewSize( m_controlRef
) ;
1059 bool wxMacControl::IsVisible() const
1061 return IsControlVisible( m_controlRef
) ;
1064 void wxMacControl::SetVisibility( bool visible
, bool redraw
)
1066 SetControlVisibility( m_controlRef
, visible
, redraw
) ;
1069 bool wxMacControl::IsEnabled() const
1071 #if TARGET_API_MAC_OSX
1072 return IsControlEnabled( m_controlRef
) ;
1074 return IsControlActive( m_controlRef
) ;
1078 bool wxMacControl::IsActive() const
1080 return IsControlActive( m_controlRef
) ;
1083 void wxMacControl::Enable( bool enable
)
1085 #if TARGET_API_MAC_OSX
1087 EnableControl( m_controlRef
) ;
1089 DisableControl( m_controlRef
) ;
1092 ActivateControl( m_controlRef
) ;
1094 DeactivateControl( m_controlRef
) ;
1098 void wxMacControl::SetDrawingEnabled( bool enable
)
1100 #if TARGET_API_MAC_OSX
1101 HIViewSetDrawingEnabled( m_controlRef
, enable
) ;
1105 #if TARGET_API_MAC_OSX
1106 bool wxMacControl::GetNeedsDisplay() const
1108 #if TARGET_API_MAC_OSX
1109 if ( m_isCompositing
)
1111 return HIViewGetNeedsDisplay( m_controlRef
) ;
1119 Rect controlBounds
;
1120 GetControlBounds( m_controlRef
, &controlBounds
) ;
1121 RgnHandle rgn
= NewRgn() ;
1122 GetWindowRegion ( GetControlOwner( m_controlRef
) , kWindowUpdateRgn
, rgn
) ;
1123 Boolean intersect
= RectInRgn ( &controlBounds
, rgn
) ;
1131 void wxMacControl::SetNeedsDisplay( RgnHandle where
)
1136 #if TARGET_API_MAC_OSX
1137 if ( m_isCompositing
)
1139 HIViewSetNeedsDisplayInRegion( m_controlRef
, where
, true ) ;
1144 Rect controlBounds
;
1145 GetControlBounds( m_controlRef
, &controlBounds
) ;
1146 RgnHandle update
= NewRgn() ;
1147 CopyRgn( where
, update
) ;
1148 OffsetRgn( update
, controlBounds
.left
, controlBounds
.top
) ;
1149 InvalWindowRgn( GetControlOwner( m_controlRef
) , update
) ;
1153 void wxMacControl::SetNeedsDisplay( Rect
* where
)
1158 #if TARGET_API_MAC_OSX
1159 if ( m_isCompositing
)
1161 if ( where
!= NULL
)
1163 RgnHandle update
= NewRgn() ;
1164 RectRgn( update
, where
) ;
1165 HIViewSetNeedsDisplayInRegion( m_controlRef
, update
, true ) ;
1166 DisposeRgn( update
) ;
1169 HIViewSetNeedsDisplay( m_controlRef
, true ) ;
1174 Rect controlBounds
;
1175 GetControlBounds( m_controlRef
, &controlBounds
) ;
1178 Rect whereLocal
= *where
;
1179 OffsetRect( &whereLocal
, controlBounds
.left
, controlBounds
.top
) ;
1180 SectRect( &controlBounds
, &whereLocal
, &controlBounds
) ;
1182 InvalWindowRect( GetControlOwner( m_controlRef
) , &controlBounds
) ;
1186 void wxMacControl::Convert( wxPoint
*pt
, wxMacControl
*from
, wxMacControl
*to
)
1188 #if TARGET_API_MAC_OSX
1189 if ( from
->m_peer
->MacGetTopLevelWindow()->MacUsesCompositing() )
1194 HIViewConvertPoint( &hiPoint
, from
->m_controlRef
, to
->m_controlRef
) ;
1195 pt
->x
= (int)hiPoint
.x
;
1196 pt
->y
= (int)hiPoint
.y
;
1203 GetControlBounds( from
->m_controlRef
, &fromRect
) ;
1204 GetControlBounds( to
->m_controlRef
, &toRect
) ;
1205 if ( from
->m_isRootControl
)
1206 fromRect
.left
= fromRect
.top
= 0 ;
1207 if ( to
->m_isRootControl
)
1208 toRect
.left
= toRect
.top
= 0 ;
1210 pt
->x
= pt
->x
+ fromRect
.left
- toRect
.left
;
1211 pt
->y
= pt
->y
+ fromRect
.top
- toRect
.top
;
1215 void wxMacControl::SetRect( Rect
*r
)
1217 #if TARGET_API_MAC_OSX
1218 if ( m_isCompositing
)
1220 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1221 //CGPoint and CGSize, which have two floats each
1222 HIRect hir
= { { r
->left
, r
->top
}, { r
->right
- r
->left
, r
->bottom
- r
->top
} } ;
1223 HIViewSetFrame ( m_controlRef
, &hir
) ;
1224 // eventuall we might have to do a SetVisibility( false , true ) ;
1225 // before and a SetVisibility( true , true ) ; after
1230 bool vis
= IsVisible() ;
1234 GetControlBounds( m_controlRef
, &former
) ;
1235 InvalWindowRect( GetControlOwner( m_controlRef
) , &former
) ;
1238 Rect controlBounds
= *r
;
1240 // since the rect passed in is always (even in non-compositing) relative
1241 // to the (native) parent, we have to adjust to window relative here
1242 wxMacControl
* parent
= m_peer
->GetParent()->GetPeer() ;
1243 if( parent
->m_isRootControl
== false )
1246 GetControlBounds( parent
->m_controlRef
, &superRect
) ;
1247 OffsetRect( &controlBounds
, superRect
.left
, superRect
.top
) ;
1250 SetControlBounds( m_controlRef
, &controlBounds
) ;
1253 InvalWindowRect( GetControlOwner( m_controlRef
) , &controlBounds
) ;
1258 void wxMacControl::GetRect( Rect
*r
)
1260 GetControlBounds( m_controlRef
, r
) ;
1261 if ( m_isCompositing
== false )
1263 // correct the case of the root control
1264 if ( m_isRootControl
)
1266 WindowRef wr
= GetControlOwner( m_controlRef
) ;
1267 GetWindowBounds( wr
, kWindowContentRgn
, r
) ;
1268 r
->right
-= r
->left
;
1269 r
->bottom
-= r
->top
;
1275 wxMacControl
* parent
= m_peer
->GetParent()->GetPeer() ;
1276 if( parent
->m_isRootControl
== false )
1279 GetControlBounds( parent
->m_controlRef
, &superRect
) ;
1280 OffsetRect( r
, -superRect
.left
, -superRect
.top
) ;
1286 void wxMacControl::GetRectInWindowCoords( Rect
*r
)
1288 UMAGetControlBoundsInWindowCoords( m_controlRef
, r
) ;
1291 void wxMacControl::GetBestRect( Rect
*r
)
1293 short baselineoffset
;
1294 GetBestControlRect( m_controlRef
, r
, &baselineoffset
) ;
1297 void wxMacControl::SetLabel( const wxString
&title
)
1299 wxFontEncoding encoding
;
1302 encoding
= m_font
.GetEncoding();
1304 encoding
= wxFont::GetDefaultEncoding();
1306 UMASetControlTitle( m_controlRef
, title
, encoding
) ;
1309 void wxMacControl::GetFeatures( UInt32
* features
)
1311 GetControlFeatures( m_controlRef
, features
) ;
1314 OSStatus
wxMacControl::GetRegion( ControlPartCode partCode
, RgnHandle region
)
1316 OSStatus err
= GetControlRegion( m_controlRef
, partCode
, region
) ;
1317 if ( m_isCompositing
== false )
1319 if ( !m_isRootControl
)
1322 GetControlBounds(m_controlRef
, &r
) ;
1323 if ( !EmptyRgn( region
) )
1324 OffsetRgn( region
, -r
.left
, -r
.top
) ;
1330 OSStatus
wxMacControl::SetZOrder( bool above
, wxMacControl
* other
)
1332 #if TARGET_API_MAC_OSX
1333 return HIViewSetZOrder( m_controlRef
,above
? kHIViewZOrderAbove
: kHIViewZOrderBelow
,
1334 (other
!= NULL
) ? other
->m_controlRef
: NULL
) ;
1341 #if TARGET_API_MAC_OSX
1342 // SetNeedsDisplay would not invalidate the children
1343 static void InvalidateControlAndChildren( HIViewRef control
)
1345 HIViewSetNeedsDisplay( control
, true ) ;
1346 UInt16 childrenCount
= 0 ;
1347 OSStatus err
= CountSubControls( control
, &childrenCount
) ;
1348 if ( err
== errControlIsNotEmbedder
)
1350 wxASSERT_MSG( err
== noErr
, wxT("Unexpected error when accessing subcontrols") ) ;
1352 for ( UInt16 i
= childrenCount
; i
>=1 ; --i
)
1355 err
= GetIndexedSubControl( control
, i
, & child
) ;
1356 if ( err
== errControlIsNotEmbedder
)
1358 InvalidateControlAndChildren( child
) ;
1363 void wxMacControl::InvalidateWithChildren()
1365 #if TARGET_API_MAC_OSX
1366 InvalidateControlAndChildren( m_controlRef
) ;
1370 void wxMacControl::ScrollRect( wxRect
*r
, int dx
, int dy
)
1372 wxASSERT( r
!= NULL
) ;
1373 #if TARGET_API_MAC_OSX
1374 if ( m_isCompositing
)
1376 HIRect scrollarea
= CGRectMake( r
->x
, r
->y
, r
->width
, r
->height
) ;
1377 HIViewScrollRect ( m_controlRef
, &scrollarea
, dx
,dy
) ;
1383 GetControlBounds( m_controlRef
, &bounds
) ;
1384 bounds
.left
+= r
->x
;
1385 bounds
.top
+= r
->y
;
1386 bounds
.bottom
= bounds
.top
+ r
->height
;
1387 bounds
.right
= bounds
.left
+ r
->width
;
1388 wxMacWindowClipper
clip( m_peer
) ;
1389 RgnHandle updateRgn
= NewRgn() ;
1390 ::ScrollRect( &bounds
, dx
, dy
, updateRgn
) ;
1391 InvalWindowRgn( GetControlOwner( m_controlRef
) , updateRgn
) ;
1396 // SetNeedsDisplay would not invalidate the children
1402 OSStatus
wxMacControl::SetSelectionFlags( DataBrowserSelectionFlags options
)
1404 return SetDataBrowserSelectionFlags( m_controlRef
, options
) ;
1407 OSStatus
wxMacControl::AddListViewColumn( DataBrowserListViewColumnDesc
*columnDesc
,
1408 DataBrowserTableViewColumnIndex position
)
1410 return AddDataBrowserListViewColumn( m_controlRef
, columnDesc
, position
) ;
1413 OSStatus
wxMacControl::AutoSizeListViewColumns()
1415 return AutoSizeDataBrowserListViewColumns(m_controlRef
) ;
1418 OSStatus
wxMacControl::SetHasScrollBars( bool horiz
, bool vert
)
1420 return SetDataBrowserHasScrollBars( m_controlRef
, horiz
, vert
) ;
1423 OSStatus
wxMacControl::SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle
)
1425 return SetDataBrowserTableViewHiliteStyle( m_controlRef
, hiliteStyle
) ;
1428 OSStatus
wxMacControl::SetListViewHeaderBtnHeight(UInt16 height
)
1430 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef
,height
) ;
1433 OSStatus
wxMacControl::SetCallbacks(const DataBrowserCallbacks
* callbacks
)
1435 return SetDataBrowserCallbacks( m_controlRef
, callbacks
) ;
1438 OSStatus
wxMacControl::UpdateItems( DataBrowserItemID container
, UInt32 numItems
,
1439 const DataBrowserItemID
* items
,
1440 DataBrowserPropertyID preSortProperty
,
1441 DataBrowserPropertyID propertyID
)
1443 return UpdateDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
, propertyID
) ;
1446 bool wxMacControl::IsItemSelected( DataBrowserItemID item
)
1448 return IsDataBrowserItemSelected( m_controlRef
, item
) ;
1451 OSStatus
wxMacControl::AddItems( DataBrowserItemID container
, UInt32 numItems
,
1452 const DataBrowserItemID
* items
,
1453 DataBrowserPropertyID preSortProperty
)
1455 return AddDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
) ;
1458 OSStatus
wxMacControl::RemoveItems( DataBrowserItemID container
, UInt32 numItems
,
1459 const DataBrowserItemID
* items
,
1460 DataBrowserPropertyID preSortProperty
)
1462 return RemoveDataBrowserItems( m_controlRef
, container
, numItems
, items
, preSortProperty
) ;
1465 OSStatus
wxMacControl::RevealItem( DataBrowserItemID item
,
1466 DataBrowserPropertyID propertyID
,
1467 DataBrowserRevealOptions options
)
1469 return RevealDataBrowserItem( m_controlRef
, item
, propertyID
, options
) ;
1472 OSStatus
wxMacControl::SetSelectedItems(UInt32 numItems
,
1473 const DataBrowserItemID
* items
,
1474 DataBrowserSetOption operation
)
1476 return SetDataBrowserSelectedItems( m_controlRef
, numItems
, items
, operation
) ;
1479 OSStatus
wxMacControl::GetSelectionAnchor( DataBrowserItemID
* first
, DataBrowserItemID
* last
)
1481 return GetDataBrowserSelectionAnchor( m_controlRef
, first
, last
) ;
1488 OSStatus
wxMacControl::SetTabEnabled( SInt16 tabNo
, bool enable
)
1490 return ::SetTabEnabled( m_controlRef
, tabNo
, enable
) ;
1497 #ifdef __WXMAC_OSX__
1498 // snippets from Sketch Sample from Apple :
1500 #define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
1502 This function locates, opens, and returns the profile reference for the calibrated
1503 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
1504 with the profile reference this function returns.
1506 CMProfileRef
wxMacOpenGenericProfile(void)
1508 static CMProfileRef cachedRGBProfileRef
= NULL
;
1510 // we only create the profile reference once
1511 if (cachedRGBProfileRef
== NULL
)
1513 CMProfileLocation loc
;
1515 loc
.locType
= cmPathBasedProfile
;
1516 strcpy(loc
.u
.pathLoc
.path
, kGenericRGBProfilePathStr
);
1518 verify_noerr( CMOpenProfile(&cachedRGBProfileRef
, &loc
) );
1521 if (cachedRGBProfileRef
)
1523 // clone the profile reference so that the caller has their own reference, not our cached one
1524 CMCloneProfileRef(cachedRGBProfileRef
);
1527 return cachedRGBProfileRef
;
1531 Return the generic RGB color space. This is a 'get' function and the caller should
1532 not release the returned value unless the caller retains it first. Usually callers
1533 of this routine will immediately use the returned colorspace with CoreGraphics
1534 so they typically do not need to retain it themselves.
1536 This function creates the generic RGB color space once and hangs onto it so it can
1537 return it whenever this function is called.
1540 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
1541 #define kCGColorSpaceGenericRGB CFSTR("kCGColorSpaceGenericRGB")
1544 CGColorSpaceRef
wxMacGetGenericRGBColorSpace()
1546 static wxMacCFRefHolder
<CGColorSpaceRef
> genericRGBColorSpace
;
1548 if (genericRGBColorSpace
== NULL
)
1550 if ( UMAGetSystemVersion() >= 0x1040 )
1552 genericRGBColorSpace
.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB
) ) ;
1556 CMProfileRef genericRGBProfile
= wxMacOpenGenericProfile();
1558 if (genericRGBProfile
)
1560 genericRGBColorSpace
.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile
) ) ;
1561 wxASSERT_MSG( genericRGBColorSpace
!= NULL
, wxT("couldn't create the generic RGB color space") ) ;
1563 // we opened the profile so it is up to us to close it
1564 CMCloseProfile(genericRGBProfile
);
1568 return genericRGBColorSpace
;