]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
Missing header.
[wxWidgets.git] / src / mac / carbon / window.cpp
index ace53ef96b9bcd39c9863ecd5288e60c52ceae75..dbf267960f8ad2fbc6b47911c69196e01f2e6e9f 100644 (file)
 
 #include "wx/wxprec.h"
 
-#include "wx/menu.h"
 #include "wx/window.h"
-#include "wx/dc.h"
-#include "wx/dcclient.h"
-#include "wx/utils.h"
-#include "wx/app.h"
-#include "wx/panel.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/panel.h"
+    #include "wx/frame.h"
+    #include "wx/dc.h"
+    #include "wx/dcclient.h"
+    #include "wx/button.h"
+    #include "wx/menu.h"
+    #include "wx/dialog.h"
+    #include "wx/settings.h"
+    #include "wx/msgdlg.h"
+#endif
+
 #include "wx/layout.h"
-#include "wx/dialog.h"
 #include "wx/scrolbar.h"
 #include "wx/statbox.h"
-#include "wx/button.h"
-#include "wx/settings.h"
-#include "wx/msgdlg.h"
-#include "wx/frame.h"
 #include "wx/tooltip.h"
 #include "wx/statusbr.h"
 #include "wx/menuitem.h"
 #include "wx/spinctrl.h"
-#include "wx/log.h"
 #include "wx/geometry.h"
 #include "wx/textctrl.h"
 
 #include "wx/toolbar.h"
-#include "wx/dc.h"
 
 #if wxUSE_CARET
     #include "wx/caret.h"
 #endif
 
-#define MAC_SCROLLBAR_SIZE 15
-#define MAC_SMALL_SCROLLBAR_SIZE 11
+#if wxUSE_DRAG_AND_DROP
+#include "wx/dnd.h"
+#endif
 
 #include "wx/mac/uma.h"
 
+#define MAC_SCROLLBAR_SIZE 15
+#define MAC_SMALL_SCROLLBAR_SIZE 11
+
 #ifndef __DARWIN__
 #include <Windows.h>
 #include <ToolUtils.h>
 #endif
 #endif
 
-#if  wxUSE_DRAG_AND_DROP
-#include "wx/dnd.h"
-#endif
-
 #include <string.h>
 
-extern wxList wxPendingDelete;
-
 #ifdef __WXUNIVERSAL__
     IMPLEMENT_ABSTRACT_CLASS(wxWindowMac, wxWindowBase)
 #else
@@ -160,16 +161,18 @@ static const EventTypeSpec eventList[] =
 {
     { kEventClassCommand, kEventProcessCommand } ,
     { kEventClassCommand, kEventCommandUpdateStatus } ,
-    
+
     { kEventClassControl , kEventControlHit } ,
 
     { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } ,
     { kEventClassTextInput, kEventTextInputUpdateActiveInputArea } ,
-        
+
     { kEventClassControl , kEventControlDraw } ,
+#if TARGET_API_MAC_OSX
     { kEventClassControl , kEventControlVisibilityChanged } ,
     { kEventClassControl , kEventControlEnabledStateChanged } ,
     { kEventClassControl , kEventControlHiliteChanged } ,
+#endif
     { kEventClassControl , kEventControlSetFocusPart } ,
 
     { kEventClassService , kEventServiceGetTypes },
@@ -492,36 +495,37 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
 {
     OSStatus result = eventNotHandledErr ;
     wxWindowMac* focus = (wxWindowMac*) data ;
-    
+
     wchar_t* uniChars = NULL ;
     UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
-    
-    UniChar* charBuf;
+
+    UniChar* charBuf = NULL;
     UInt32 dataSize = 0 ;
     int numChars = 0 ;
     UniChar buf[2] ;
     if ( GetEventParameter( event, kEventParamTextInputSendText, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr )
     {
-        numChars = dataSize / sizeof( UniChar) ;
+        numChars = dataSize / sizeof( UniChar) + 1;
         charBuf = buf ;
-        
-        if ( dataSize > sizeof(buf) )
+
+        if ( (size_t) numChars * 2 > sizeof(buf) )
             charBuf = new UniChar[ numChars ] ;
         else
             charBuf = buf ;
-        
+
         uniChars = new wchar_t[ numChars ] ;
         GetEventParameter( event, kEventParamTextInputSendText, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ;
+        charBuf[ numChars - 1 ] = 0;
 #if SIZEOF_WCHAR_T == 2
-        uniChars = charBuf ;
-        memcpy( uniChars , charBuf , dataSize ) ;
+        uniChars = (wchar_t*) charBuf ;
+        memcpy( uniChars , charBuf , numChars * 2 ) ;
 #else
         // the resulting string will never have more chars than the utf16 version, so this is safe
         wxMBConvUTF16 converter ;
         numChars = converter.MB2WC( uniChars , (const char*)charBuf , numChars ) ;
 #endif
     }
-    
+
     switch ( GetEventKind( event ) )
     {
         case kEventTextInputUpdateActiveInputArea :
@@ -530,18 +534,17 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
                 // EVT_CHAR
                 for (int pos=0 ; pos < numChars ; pos++)
                 {
-                    
                     WXEVENTREF formerEvent = wxTheApp->MacGetCurrentEvent() ;
                     WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
                     wxTheApp->MacSetCurrentEvent( event , handler ) ;
-                    
+
                     UInt32 message = (0  << 8) + ((char)uniChars[pos] );
                     if ( wxTheApp->MacSendCharEvent(
                                                     focus , message , 0 , when , 0 , 0 , uniChars[pos] ) )
                     {
                         result = noErr ;
                     }
-                    
+
                     wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ;
                 }
             }
@@ -558,24 +561,23 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
                 GetEventParameter( rawEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
                 GetEventParameter( rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );
                 GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );
-                
+
                 UInt32 message = (keyCode << 8) + charCode;
 
                 // An IME input event may return several characters, but we need to send one char at a time to
                 // EVT_CHAR
                 for (int pos=0 ; pos < numChars ; pos++)
                 {
-                    
                     WXEVENTREF formerEvent = wxTheApp->MacGetCurrentEvent() ;
                     WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
                     wxTheApp->MacSetCurrentEvent( event , handler ) ;
-                    
+
                     if ( wxTheApp->MacSendCharEvent(
                         focus , message , modifiers , when , point.h , point.v , uniChars[pos] ) )
                     {
                         result = noErr ;
                     }
-                    
+
                     wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ;
                 }
             }
@@ -583,40 +585,39 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
         default:
             break ;
     }
-    
-    delete[] uniChars ;
+
+    delete [] uniChars ;
     if ( charBuf != buf )
-        delete[] charBuf ;
-    
+        delete [] charBuf ;
+
     return result ;
-    
 }
 
 static pascal OSStatus wxMacWindowCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
     OSStatus result = eventNotHandledErr ;
     wxWindowMac* focus = (wxWindowMac*) data ;
-    
+
     HICommand command ;
-    
+
     wxMacCarbonEvent cEvent( event ) ;
     cEvent.GetParameter<HICommand>(kEventParamDirectObject,typeHICommand,&command) ;
-    
+
     wxMenuItem* item = NULL ;
     wxMenu* itemMenu = wxFindMenuFromMacCommand( command , item ) ;
     int id = wxMacCommandToId( command.commandID ) ;
-    
+
     if ( item )
     {
         wxASSERT( itemMenu != NULL ) ;
-        
+
         switch ( cEvent.GetKind() )
         {
             case kEventProcessCommand :
                 {
                     if (item->IsCheckable())
                         item->Check( !item->IsChecked() ) ;
-                    
+
                     if ( itemMenu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) )
                         result = noErr ;
                     else
@@ -624,27 +625,27 @@ static pascal OSStatus wxMacWindowCommandEventHandler( EventHandlerCallRef handl
                         wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED , id);
                         event.SetEventObject(focus);
                         event.SetInt(item->IsCheckable() ? item->IsChecked() : -1);
-                        
+
                         if ( focus->GetEventHandler()->ProcessEvent(event) )
                             result = noErr ;
                     }
                 }
             break ;
-                
+
             case kEventCommandUpdateStatus:
                 {
                     wxUpdateUIEvent event(id);
                     event.SetEventObject( itemMenu );
-                    
+
                     bool processed = false;
-                    
+
                     // Try the menu's event handler
                     {
                         wxEvtHandler *handler = itemMenu->GetEventHandler();
                         if ( handler )
                             processed = handler->ProcessEvent(event);
                     }
-                    
+
                     // Try the window the menu was popped up from
                     // (and up through the hierarchy)
                     if ( !processed )
@@ -658,16 +659,16 @@ static pascal OSStatus wxMacWindowCommandEventHandler( EventHandlerCallRef handl
                                 processed = win->GetEventHandler()->ProcessEvent(event);
                                 break;
                             }
-                            
+
                             menu = menu->GetParent();
                         }
                     }
-                    
+
                     if ( !processed )
                     {
                         processed = focus->GetEventHandler()->ProcessEvent(event);
                     }
-                    
+
                     if ( processed )
                     {
                         // if anything changed, update the changed attribute
@@ -677,12 +678,12 @@ static pascal OSStatus wxMacWindowCommandEventHandler( EventHandlerCallRef handl
                             itemMenu->Check(id, event.GetChecked());
                         if (event.GetSetEnabled())
                             itemMenu->Enable(id, event.GetEnabled());
-                        
+
                         result = noErr ;
                     }
                 }
                 break ;
-                
+
             default :
                 break ;
         }
@@ -714,6 +715,7 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef
         case kEventClassTextInput :
             result = wxMacUnicodeTextEventHandler( handler , event , data ) ;
             break ;
+
         default :
             break ;
     }
@@ -964,7 +966,6 @@ void wxWindowMac::Init()
     wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 }
 
-// Destructor
 wxWindowMac::~wxWindowMac()
 {
     SendDestroyEvent();
@@ -985,7 +986,7 @@ wxWindowMac::~wxWindowMac()
             break;
         }
     }
-#endif // __WXUNIVERSAL__
+#endif
 
     // destroy children before destroying this window itself
     DestroyChildren();
@@ -1259,14 +1260,24 @@ void wxWindowMac::MacSetBackgroundBrush( const wxBrush &brush )
 
 bool wxWindowMac::MacCanFocus() const
 {
-    // there is currently no way to determine whether the window is running in full keyboard
-    // access mode, therefore we cannot rely on these features, yet the only other way would be
-    // to issue a SetKeyboardFocus event and verify after whether it succeeded, this would risk problems
-    // in event handlers...
-    UInt32 features = 0 ;
-    m_peer->GetFeatures( &features ) ;
+    // TODO : evaluate performance hits by looking up this value, eventually cache the results for a 1 sec or so
+    // CAUTION : the value returned currently is 0 or 2, I've also found values of 1 having the same meaning,
+    // but the value range is nowhere documented
+    Boolean keyExistsAndHasValidFormat ;
+    CFIndex fullKeyboardAccess = CFPreferencesGetAppIntegerValue( CFSTR("AppleKeyboardUIMode" ) ,
+        kCFPreferencesCurrentApplication, &keyExistsAndHasValidFormat );
+
+    if ( keyExistsAndHasValidFormat && fullKeyboardAccess > 0 )
+    {
+        return true ;
+    }
+    else
+    {
+        UInt32 features = 0 ;
+        m_peer->GetFeatures( &features ) ;
 
-    return features & ( kControlSupportsFocus | kControlGetsFocusOnClick ) ;
+        return features & ( kControlSupportsFocus | kControlGetsFocusOnClick ) ;
+    }
 }
 
 void wxWindowMac::SetFocus()
@@ -1329,7 +1340,7 @@ void wxWindowMac::DoCaptureMouse()
     wxApp::s_captureWindow = this ;
 }
 
-wxWindow* wxWindowBase::GetCapture()
+wxWindow * wxWindowBase::GetCapture()
 {
     return wxApp::s_captureWindow ;
 }
@@ -1355,7 +1366,7 @@ void wxWindowMac::SetDropTarget(wxDropTarget *pDropTarget)
 
 #endif
 
-// Old style file-manager drag&drop
+// Old-style File Manager Drag & Drop
 void wxWindowMac::DragAcceptFiles(bool accept)
 {
     // TODO:
@@ -1378,10 +1389,7 @@ bool wxWindowMac::MacGetBoundsForControl(
     int& x, int& y,
     int& w, int& h , bool adjustOrigin ) const
 {
-    bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ;
-
     // the desired size, minus the border pixels gives the correct size of the control
-
     x = (int)pos.x;
     y = (int)pos.y;
 
@@ -1389,6 +1397,7 @@ bool wxWindowMac::MacGetBoundsForControl(
     w = wxMax(size.x, 0) ; // WidthDefault( size.x );
     h = wxMax(size.y, 0) ; // HeightDefault( size.y ) ;
 
+    bool isCompositing = MacGetTopLevelWindow()->MacUsesCompositing() ;
     if ( !isCompositing )
         GetParent()->MacWindowToRootWindow( &x , &y ) ;
 
@@ -1770,8 +1779,8 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
     {
         MenuCommand macid;
         GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &macid );
-        int id = wxMacCommandToId( macid ); 
-        wxMenuItem* item = NULL ; 
+        int id = wxMacCommandToId( macid );
+        wxMenuItem* item = NULL ;
         wxMenu* realmenu ;
         item = menu->FindItem( id, &realmenu ) ;
         if ( item )