#include <string.h>
#include <stdarg.h>
-#include "MoreFilesX.h"
+// #include "MoreFilesX.h"
-#ifndef __DARWIN__
- #include <Threads.h>
- #include <Sound.h>
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ #include <AudioToolbox/AudioServices.h>
#endif
#if wxUSE_GUI
-#if TARGET_API_MAC_OSX
#include <CoreServices/CoreServices.h>
-#else
- #include <DriverServices.h>
- #include <Multiprocessing.h>
-#endif
-
-#ifdef __DARWIN__
#include <Carbon/Carbon.h>
-#else
- #include <ATSUnicode.h>
- #include <TextCommon.h>
- #include <TextEncodingConverter.h>
-#endif
-
-#include "wx/mac/private/timer.h"
+ #include "wx/mac/private/timer.h"
#endif // wxUSE_GUI
#include "wx/evtloop.h"
// Emit a beeeeeep
void wxBell()
{
-#ifndef __LP64__
- SysBeep(30);
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ if ( AudioServicesPlayAlertSound )
+ AudioServicesPlayAlertSound(kUserPreferredAlert);
+ else
+#endif
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ SysBeep(30);
+#else
+ {
+ }
#endif
}
{
gMacStoredActiveCursor = gMacCurrentCursor;
cursor->MacInstall();
+
+ wxSetCursor(*cursor);
}
//else: nothing to do, already set
}
{
gMacStoredActiveCursor.MacInstall();
gMacStoredActiveCursor = wxNullCursor;
+
+ wxSetCursor(wxNullCursor);
}
}
void wxGetMousePosition( int* x, int* y )
{
+#if wxMAC_USE_QUICKDRAW
Point pt;
-#if wxMAC_USE_CORE_GRAPHICS
GetGlobalMouse(&pt);
-#else
- GetMouse( &pt );
- LocalToGlobal( &pt );
-#endif
*x = pt.h;
*y = pt.v;
+#else
+ // TODO
+#endif
};
// Return true if we have a colour display
// Returns depth of screen
int wxDisplayDepth()
{
- int theDepth = 8;
-#if wxMAC_USE_CORE_GRAPHICS
- theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());
-#else
+#if wxMAC_USE_QUICKDRAW
+ int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());
Rect globRect;
SetRect(&globRect, -32760, -32760, 32760, 32760);
GDHandle theMaxDevice;
theMaxDevice = GetMaxDevice(&globRect);
if (theMaxDevice != NULL)
theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
-#endif
+
return theDepth;
+#else
+ return 32; // TODO
+#endif
}
// Get size of display
void 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)
void wxClientDisplayRect(int *x, int *y, int *width, int *height)
{
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+#if wxMAC_USE_QUICKDRAW
+
HIRect bounds ;
HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
&bounds);
*width = bounds.size.width;
if ( height )
*height = bounds.size.height;
+#else
+ int w, h;
+ wxDisplaySize(&w,&h);
+ if ( x )
+ *x = 0;
+ if ( y )
+ *y = 24;
+ if ( width )
+ *width = w;
+ if ( height )
+ *height = h-24;
+#endif
#else
Rect r;
GetAvailableWindowPositioningBounds( GetMainDevice() , &r );
#if wxUSE_BASE
+#include <sys/utsname.h>
+
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
+ char data[128];
+ struct utsname name;
+ uname(&name);
+ return wxString::Format(_T("Mac OS X (%s %s %s)"),
+ wxString::FromAscii(name.sysname).c_str(),
+ wxString::FromAscii(name.release).c_str(),
+ wxString::FromAscii(name.machine).c_str());
}
#ifndef __DARWIN__
// Common Event Support
// ----------------------------------------------------------------------------
-extern ProcessSerialNumber gAppProcess;
-
void wxMacWakeUp()
{
- ProcessSerialNumber psn;
- Boolean isSame;
- psn.highLongOfPSN = 0;
- psn.lowLongOfPSN = kCurrentProcess;
- SameProcess( &gAppProcess , &psn , &isSame );
- if ( isSame )
- {
- OSStatus err = noErr;
+ 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
+ // 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 );
}
- else
+ if ( err == noErr )
{
- WakeUpProcess( &gAppProcess );
+
+ 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
}
#endif // wxUSE_BASE
// Control Access Support
// ----------------------------------------------------------------------------
+#if wxMAC_USE_QUICKDRAW
+
IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
-wxMacControl::wxMacControl()
+wxMacControl::wxMacControl()
{
Init();
}
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 )
void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
{
m_font = font;
-#ifndef __LP64__
+#if wxMAC_USE_CORE_TEXT
+ if ( UMAGetSystemVersion() >= 0x1050 )
+ {
+ HIViewPartCode part = 0;
+ HIThemeTextHorizontalFlush flush = kHIThemeTextHorizontalFlushDefault;
+ if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
+ flush = kHIThemeTextHorizontalFlushCenter;
+ else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
+ flush = kHIThemeTextHorizontalFlushRight;
+ HIViewSetTextFont( m_controlRef , part , (CTFontRef) font.MacGetCTFont() );
+ HIViewSetTextHorizontalFlush( m_controlRef, part, flush );
+
+ if ( foreground != *wxBLACK )
+ {
+ ControlFontStyleRec fontStyle;
+ foreground.GetRGBColor( &fontStyle.foreColor );
+ fontStyle.flags = kControlUseForeColorMask;
+ ::SetControlFontStyle( m_controlRef , &fontStyle );
+ }
+
+ }
+#endif
+#if wxMAC_USE_ATSU_TEXT
ControlFontStyleRec fontStyle;
if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
{
if ( foreground != *wxBLACK )
{
- fontStyle.foreColor = MAC_WXCOLORREF( foreground.GetPixel() );
+ foreground.GetRGBColor( &fontStyle.foreColor );
fontStyle.flags |= kControlUseForeColorMask;
}
#endif
}
-void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
+void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
{
- // TODO
- // setting up a color proc is not recommended anymore
+// HITextViewSetBackgroundColor( m_textView , color );
}
void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
bool wxMacControl::IsEnabled() const
{
-#if TARGET_API_MAC_OSX
return IsControlEnabled( m_controlRef );
-#else
- return IsControlActive( m_controlRef );
-#endif
}
bool wxMacControl::IsActive() const
void wxMacControl::GetRectInWindowCoords( Rect *r )
{
- UMAGetControlBoundsInWindowCoords( m_controlRef , r );
+ GetControlBounds( m_controlRef , r ) ;
+
+ WindowRef tlwref = GetControlOwner( m_controlRef ) ;
+
+ wxTopLevelWindowMac* tlwwx = wxFindWinFromMacWindow( tlwref ) ;
+ if ( tlwwx != NULL )
+ {
+ ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ;
+ HIPoint hiPoint = CGPointMake( 0 , 0 ) ;
+ HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ;
+ OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ;
+ }
}
void wxMacControl::GetBestRect( Rect *r )
else
encoding = wxFont::GetDefaultEncoding();
- UMASetControlTitle( m_controlRef , title , encoding );
+ SetControlTitleWithCFString( m_controlRef , wxCFStringRef( title , encoding ) );
}
void wxMacControl::GetFeatures( UInt32 * features )
OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
{
-#if TARGET_API_MAC_OSX
return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
(other != NULL) ? other->m_controlRef : NULL);
-#else
- return 0;
-#endif
}
-#if TARGET_API_MAC_OSX
// SetNeedsDisplay would not invalidate the children
static void InvalidateControlAndChildren( HIViewRef control )
{
InvalidateControlAndChildren( child );
}
}
-#endif
void wxMacControl::InvalidateWithChildren()
{
-#if TARGET_API_MAC_OSX
InvalidateControlAndChildren( m_controlRef );
-#endif
}
void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
if ( gDataBrowserItemNotificationUPP == NULL )
{
gDataBrowserItemNotificationUPP =
-#if TARGET_API_MAC_OSX
(DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
-#else
- NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
-#endif
}
DataBrowserCallbacks callbacks;
void wxMacDataItem::SetLabel( const wxString& str)
{
m_label = str;
- m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
+ m_cfLabel = wxCFStringRef( str , wxLocale::GetSystemEncoding());
}
const wxString& wxMacDataItem::GetLabel() const
enc = m_font.GetEncoding();
else
enc = wxLocale::GetSystemEncoding();
- wxMacCFStringHolder cfTitle;
- cfTitle.Assign( title, enc );
+ wxCFStringRef cfTitle( title, enc );
columnDesc.headerBtnDesc.titleString = cfTitle;
columnDesc.headerBtnDesc.minimumWidth = 0;
columnDesc.propertyDesc.propertyType = colType;
columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
-#endif
verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
GetScrollPosition( &top , &left ) ;
wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
+ // there is a bug in RevealItem that leads to situations
+ // in large lists, where the item does not get scrolled
+ // into sight, so we do a pre-scroll if necessary
UInt16 height ;
GetRowHeight( (DataBrowserItemID) item , &height ) ;
- SetScrollPosition( n * ((UInt32)height) , left ) ;
+ UInt32 linetop = n * ((UInt32) height );
+ UInt32 linebottom = linetop + height;
+ Rect rect ;
+ GetRect( &rect );
+
+ if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) )
+ SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ;
RevealItem( item , kDataBrowserRevealWithoutSelecting );
}
return ::SetTabEnabled( m_controlRef , tabNo , enable );
}
+#endif
+
//
// Quartz Support
//
-// snippets from Sketch Sample from Apple :
-
-#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
-
-/*
- This function locates, opens, and returns the profile reference for the calibrated
- Generic RGB color space. It is up to the caller to call CMCloseProfile when done
- with the profile reference this function returns.
-*/
-CMProfileRef wxMacOpenGenericProfile()
-{
- static CMProfileRef cachedRGBProfileRef = NULL;
-
- // we only create the profile reference once
- if (cachedRGBProfileRef == NULL)
- {
- CMProfileLocation loc;
-
- loc.locType = cmPathBasedProfile;
- strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr);
-
- verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) );
- }
-
- // clone the profile reference so that the caller has their own reference, not our cached one
- if (cachedRGBProfileRef)
- CMCloneProfileRef(cachedRGBProfileRef);
-
- return cachedRGBProfileRef;
-}
-
/*
Return the generic RGB color space. This is a 'get' function and the caller should
not release the returned value unless the caller retains it first. Usually callers
CGColorSpaceRef wxMacGetGenericRGBColorSpace()
{
- static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
+ static wxCFRef<CGColorSpaceRef> genericRGBColorSpace;
if (genericRGBColorSpace == NULL)
{
- if ( UMAGetSystemVersion() >= 0x1040 )
- {
- genericRGBColorSpace.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
- }
- else
- {
- CMProfileRef genericRGBProfile = wxMacOpenGenericProfile();
-
- if (genericRGBProfile)
- {
- genericRGBColorSpace.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile) );
-
- wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") );
-
- // we opened the profile so it is up to us to close it
- CMCloseProfile(genericRGBProfile);
- }
- }
+ genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
}
return genericRGBColorSpace;
}
-#ifndef __LP64__
-
-wxMacPortSaver::wxMacPortSaver( GrafPtr port )
+CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
{
- ::GetPort( &m_port );
- ::SetPort( port );
+ CGColorRef color ;
+ HIThemeBrushCreateCGColor( brush, &color );
+ return color;
}
-wxMacPortSaver::~wxMacPortSaver()
+#if wxMAC_USE_QUICKDRAW
+
+static inline void PointFromHIPoint(const HIPoint& p, Point *pt)
{
- ::SetPort( m_port );
+ pt->h = wx_static_cast(short, p.x);
+ pt->v = wx_static_cast(short, p.y);
}
-#endif
void wxMacGlobalToLocal( WindowRef window , Point*pt )
{
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
HIPoint p = CGPointMake( pt->h, pt->v );
HIViewRef contentView ;
// TODO check toolbar offset
HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
- pt->h = p.x;
- pt->v = p.y;
-#else
- QDGlobalToLocalPoint( GetWindowPort(window), pt ) ;
-#endif
+ PointFromHIPoint(p, pt);
}
void wxMacLocalToGlobal( WindowRef window , Point*pt )
{
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
HIPoint p = CGPointMake( pt->h, pt->v );
HIViewRef contentView ;
// TODO check toolbar offset
HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
- pt->h = p.x;
- pt->v = p.y;
-#else
- QDLocalToGlobalPoint( GetWindowPort(window), pt ) ;
-#endif
+ PointFromHIPoint(p, pt);
}
+#endif // wxMAC_USE_QUICKDRAW
+
#endif // wxUSE_GUI
+
+#if wxUSE_BASE
+
+#endif