X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ef4e126a2198e33ad3ec09a0211d5579865d880..ff42758536f8d573409bf6c35528497ba36b4d0e:/src/mac/carbon/utils.cpp diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp index b4ac2b78d6..9afe0b6d5b 100644 --- a/src/mac/carbon/utils.cpp +++ b/src/mac/carbon/utils.cpp @@ -57,8 +57,11 @@ #include #include #endif + +#include "wx/mac/private/timer.h" #endif // wxUSE_GUI +#include "wx/evtloop.h" #include "wx/mac/private.h" #if defined(__MWERKS__) && wxUSE_UNICODE @@ -72,7 +75,7 @@ // our OS version is the same in non GUI and GUI cases wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn) { - long theSystem; + SInt32 theSystem; Gestalt(gestaltSystemVersion, &theSystem); if ( majorVsn != NULL ) @@ -303,7 +306,13 @@ WXDLLEXPORT bool wxGetEnv(const wxString& var, wxString *value) } // set the env var name to the given value, return true on success -WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value) +WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxString& value) +{ + // TODO : under classic there is no environement support, under X yes + return false; +} + +WXDLLEXPORT bool wxUnsetEnv(const wxString& var) { // TODO : under classic there is no environement support, under X yes return false; @@ -360,7 +369,9 @@ void wxFlushEvents() // Emit a beeeeeep void wxBell() { +#ifndef __LP64__ SysBeep(30); +#endif } @@ -376,83 +387,15 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const return wxPORT_MAC; } -// Reading and writing resources (eg WIN.INI, .Xdefaults) -#if wxUSE_RESOURCES -bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) -{ - // TODO - return false; -} - -bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%.4f"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%ld"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) -{ - wxString buf; - buf.Printf(wxT("%d"), value); - - return wxWriteResource(section, entry, buf, file); -} - -bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file) +wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() { - // TODO - return false; -} - -bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) -{ - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); - if (succ) - { - *value = (float)strtod(s, NULL); - delete[] s; - } - - return succ; -} - -bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file) -{ - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); - if (succ) - { - *value = strtol(s, NULL, 10); - delete[] s; - } - - return succ; + return new wxEventLoop; } -bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) +wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); - if (succ) - { - *value = (int)strtol(s, NULL, 10); - delete[] s; - } - - return succ; + return new wxCarbonTimerImpl(timer); } -#endif // wxUSE_RESOURCES int gs_wxBusyCursorCount = 0; extern wxCursor gMacCurrentCursor; @@ -529,9 +472,12 @@ bool wxCheckForInterrupt(wxWindow *wnd) 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; }; @@ -545,21 +491,32 @@ bool wxColourDisplay() // Returns depth of screen int wxDisplayDepth() { + int theDepth = 8; +#if wxMAC_USE_CORE_GRAPHICS + theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID()); +#else Rect globRect; SetRect(&globRect, -32760, -32760, 32760, 32760); GDHandle theMaxDevice; - int theDepth = 8; theMaxDevice = GetMaxDevice(&globRect); if (theMaxDevice != NULL) theDepth = (**(**theMaxDevice).gdPMap).pixelSize; - +#endif return theDepth; } // 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 ); @@ -568,6 +525,7 @@ void wxDisplaySize(int *width, int *height) if (height != NULL) *height = screenBits.bounds.bottom - screenBits.bounds.top; +#endif } void wxDisplaySizeMM(int *width, int *height) @@ -585,8 +543,20 @@ 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 + 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; @@ -596,6 +566,7 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) *width = r.right - r.left; if ( height ) *height = r.bottom - r.top; +#endif } wxWindow* wxFindWindowAtPoint(const wxPoint& pt) @@ -791,6 +762,13 @@ OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType in // Control Access Support // ---------------------------------------------------------------------------- +IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject ) + +wxMacControl::wxMacControl() +{ + Init(); +} + wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl ) { Init(); @@ -826,16 +804,18 @@ void wxMacControl::Init() void wxMacControl::Dispose() { + wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") ); wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") ); - CFIndex count = CFGetRetainCount( m_controlRef ) ; - wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in Dispose") ); - - ::DisposeControl( m_controlRef ); + // we cannot check the ref count here anymore, as autorelease objects might delete their refs later + // we can have situations when being embedded, where the control gets deleted behind our back, so only + // CFRelease if we are safe + if ( IsValidControlHandle(m_controlRef) ) + CFRelease(m_controlRef); m_controlRef = NULL; } -void wxMacControl::SetReference( SInt32 data ) +void wxMacControl::SetReference( URefCon data ) { SetControlReference( m_controlRef , data ); } @@ -1029,7 +1009,11 @@ void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum ) short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ) { +#ifndef __LP64__ return HandleControlKey( m_controlRef , keyCode , charCode , modifiers ); +#else + return 0; +#endif } void wxMacControl::SetActionProc( ControlActionUPP actionProc ) @@ -1237,7 +1221,7 @@ void wxMacControl::SetReferenceInNativeControl() wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control) { wxMacControl* ctl = NULL; - UInt32 actualSize; + ByteCount actualSize; if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) , &actualSize , &ctl ) == noErr ) { @@ -1253,13 +1237,15 @@ wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control) // basing on DataBrowserItemIDs // +IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl ) + pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc( ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData ) { - wxMacDataBrowserControl* ctl = dynamic_cast( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { ctl->ItemNotification(itemID, message, itemData); @@ -1274,7 +1260,7 @@ pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc( Boolean changeValue ) { OSStatus err = errDataBrowserPropertyNotSupported; - wxMacDataBrowserControl* ctl = dynamic_cast( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { err = ctl->GetSetItemData(itemID, property, itemData, changeValue); @@ -1288,7 +1274,7 @@ pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc( DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) { - wxMacDataBrowserControl* ctl = dynamic_cast( wxMacControl::GetReferenceFromNativeControl( browser ) ); + wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl); if ( ctl != 0 ) { return ctl->CompareItems(itemOneID, itemTwoID, sortProperty); @@ -1335,7 +1321,7 @@ wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer, const wxPoint& OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container, Boolean recurse, DataBrowserItemState state, - UInt32 *numItems) const + ItemCount *numItems) const { return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems ); } @@ -1360,12 +1346,12 @@ OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *colu } OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){ - return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id ); + return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id ); } OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position ) { - DataBrowserTableViewColumnID id; + DataBrowserTableViewColumnID id; GetColumnIDFromIndex( position, &id ); return RemoveDataBrowserTableViewColumn( m_controlRef, id ); } @@ -1510,12 +1496,12 @@ OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const } OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column, - UInt32 *position) const + DataBrowserTableViewColumnIndex *position) const { return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position); } -OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, UInt32 position) +OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position) { return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position); } @@ -1590,6 +1576,7 @@ OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID pro wxMacDataItem::wxMacDataItem() { m_data = NULL; + m_order = 0; m_colId = kTextColumnId; // for compat with existing wx*ListBox impls. } @@ -1626,7 +1613,7 @@ short wxMacDataItem::GetColumn() void wxMacDataItem::SetColumn( short col ) { m_colId = col; -} +} void wxMacDataItem::SetLabel( const wxString& str) { @@ -1643,14 +1630,14 @@ bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *owner , const wxMacDataItem* rhs, DataBrowserPropertyID sortProperty) const { - const wxMacDataItem* otherItem = dynamic_cast(rhs); + const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs); bool retval = false; - - if ( sortProperty == m_colId && owner->GetSortOrder() != SortOrder_None){ + + if ( sortProperty == m_colId ){ retval = m_label.CmpNoCase( otherItem->m_label) < 0; } - - else if ( owner->GetSortOrder() == SortOrder_None || sortProperty == kNumericOrderColumnId ) + + else if ( sortProperty == kNumericOrderColumnId ) retval = m_order < otherItem->m_order; return retval; @@ -1694,6 +1681,7 @@ void wxMacDataItem::Notification(wxMacDataItemBrowserControl *owner , { } +IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl ) wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) : wxMacDataBrowserControl( peer, pos, size, style ) @@ -1703,16 +1691,6 @@ wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const m_clientDataItemsType = wxClientData_None; } -ListSortOrder wxMacDataItemBrowserControl::GetSortOrder() const -{ - return m_sortOrder; -} - -void wxMacDataItemBrowserControl::SetSortOrder(const ListSortOrder sort) -{ - m_sortOrder = sort; -} - wxMacDataItem* wxMacDataItemBrowserControl::CreateItem() { return new wxMacDataItem(); @@ -1781,7 +1759,7 @@ OSStatus wxMacDataItemBrowserControl::GetSetItemData( // right now default behaviour on these break; default : - + if ( item != NULL ){ err = item->GetSetData( this, property , itemData , changeValue ); } @@ -1812,13 +1790,13 @@ void wxMacDataItemBrowserControl::ItemNotification( unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container, bool recurse , DataBrowserItemState state) const { - UInt32 numItems = 0; + ItemCount numItems = 0; verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container, recurse, state, &numItems ) ); return numItems; } -unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container, +unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container, bool recurse ) const { return GetItemCount( container, recurse, kDataBrowserItemIsSelected ); @@ -1889,11 +1867,11 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp columnDesc.headerBtnDesc.btnFontStyle.flags = kControlUseFontMask | kControlUseJustMask; - columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly; + columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly; columnDesc.headerBtnDesc.btnFontStyle.just = just; columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont; columnDesc.headerBtnDesc.btnFontStyle.style = normal; - + // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is // defined for other modes? wxFontEncoding enc; @@ -1903,17 +1881,20 @@ void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyTyp enc = wxLocale::GetSystemEncoding(); wxMacCFStringHolder cfTitle; cfTitle.Assign( title, enc ); - columnDesc.headerBtnDesc.titleString = cfTitle; + columnDesc.headerBtnDesc.titleString = cfTitle; columnDesc.headerBtnDesc.minimumWidth = 0; columnDesc.headerBtnDesc.maximumWidth = 30000; columnDesc.propertyDesc.propertyID = (kMinColumnId + colId); columnDesc.propertyDesc.propertyType = colType; - columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewDefaultColumnFlags | kDataBrowserListViewNoGapForIconInHeaderButton; + columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn; #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; #endif +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton; +#endif verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) ); @@ -1960,7 +1941,7 @@ void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacD void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item) { OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1, - (UInt32*) &item, kDataBrowserItemNoProperty ); + (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ); verify_noerr( err ); } @@ -1972,7 +1953,7 @@ void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayM items[i] = (DataBrowserItemID) itemArray[i]; OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems, - (UInt32*) items, kDataBrowserItemNoProperty ); + (DataBrowserItemID*) items, kDataBrowserItemNoProperty ); verify_noerr( err ); delete [] items; } @@ -2101,7 +2082,7 @@ void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxArrayString item->SetLabel( items[i]); if ( column != -1 ) item->SetColumn( kMinColumnId + column ); - + if ( m_sortOrder == SortOrder_None ) item->SetOrder( frontLineOrder + 1 + i ); @@ -2313,6 +2294,8 @@ CGColorSpaceRef wxMacGetGenericRGBColorSpace() } #endif +#ifndef __LP64__ + wxMacPortSaver::wxMacPortSaver( GrafPtr port ) { ::GetPort( &m_port ); @@ -2323,5 +2306,36 @@ wxMacPortSaver::~wxMacPortSaver() { ::SetPort( m_port ); } +#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 +} + +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 +} #endif // wxUSE_GUI