]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/topluniv.cpp
first stab at supporting custom renderers
[wxWidgets.git] / src / univ / topluniv.cpp
index b3c6585e3e9b2c628116a6bb5acc0f04770a664b..06afa0f3039a726ee5f445c2f745dbb589f576fd 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        topluniv.cpp
+// Name:        src/univ/topluniv.cpp
 // Author:      Vaclav Slavik
 // Id:          $Id$
 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // Author:      Vaclav Slavik
 // Id:          $Id$
 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "univtoplevel.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #endif
 
-#include "wx/defs.h"
+#include "wx/toplevel.h"
 
 #ifndef WX_PRECOMP
     #include "wx/dcclient.h"
     #include "wx/settings.h"
 
 #ifndef WX_PRECOMP
     #include "wx/dcclient.h"
     #include "wx/settings.h"
+    #include "wx/bitmap.h"
+    #include "wx/image.h"
+    #include "wx/frame.h"
 #endif
 
 #endif
 
-#include "wx/toplevel.h"
 #include "wx/univ/renderer.h"
 #include "wx/univ/renderer.h"
-#include "wx/bitmap.h"
-#include "wx/image.h"
 #include "wx/cshelp.h"
 #include "wx/evtloop.h"
 
 #include "wx/cshelp.h"
 #include "wx/evtloop.h"
 
+// ----------------------------------------------------------------------------
+// wxStdTLWInputHandler: handles focus, resizing and titlebar buttons clicks
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxStdTLWInputHandler : public wxStdInputHandler
+{
+public:
+    wxStdTLWInputHandler(wxInputHandler *inphand);
+
+    virtual bool HandleMouse(wxInputConsumer *consumer,
+                             const wxMouseEvent& event);
+    virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
+    virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
+
+private:
+    // the window (button) which has capture or NULL and the last hittest result
+    wxTopLevelWindow *m_winCapture;
+    long              m_winHitTest;
+    long              m_winPressed;
+    bool              m_borderCursorOn;
+    wxCursor          m_origCursor;
+};
+
 
 // ----------------------------------------------------------------------------
 // event tables
 
 // ----------------------------------------------------------------------------
 // event tables
@@ -61,7 +80,16 @@ int wxTopLevelWindow::ms_canIconize = -1;
 
 void wxTopLevelWindow::Init()
 {
 
 void wxTopLevelWindow::Init()
 {
-    m_isActive = FALSE;
+    // once-only ms_drawDecorations initialization
+    if ( ms_drawDecorations == -1 )
+    {
+        ms_drawDecorations =
+            !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS) ||
+            wxGetEnv(wxT("WXDECOR"), NULL);
+    }
+
+    m_usingNativeDecorations = ms_drawDecorations == 0;
+    m_isActive = false;
     m_windowStyle = 0;
     m_pressedButton = 0;
 }
     m_windowStyle = 0;
     m_pressedButton = 0;
 }
@@ -78,21 +106,7 @@ bool wxTopLevelWindow::Create(wxWindow *parent,
     long styleOrig = 0,
          exstyleOrig = 0;
 
     long styleOrig = 0,
          exstyleOrig = 0;
 
-    if ( ms_drawDecorations == -1 )
-    {
-        ms_drawDecorations = 
-            !wxSystemSettings::HasFeature(wxSYS_CAN_DRAW_FRAME_DECORATIONS) 
-            || wxGetEnv(wxT("WXDECOR"), NULL);
-        // FIXME -- wxUniv should provide a way to force non-native decorations!
-        //          $WXDECOR is just a hack in absence of better wxUniv solution
-    }
-
-    if ( ms_canIconize == -1 )
-    {
-        ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME);
-    }
-
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         CreateInputHandler(wxINP_HANDLER_TOPLEVEL);
 
     {
         CreateInputHandler(wxINP_HANDLER_TOPLEVEL);
 
@@ -100,30 +114,29 @@ bool wxTopLevelWindow::Create(wxWindow *parent,
         exstyleOrig = GetExtraStyle();
         style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
                    wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
         exstyleOrig = GetExtraStyle();
         style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
                    wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
-                   wxTHICK_FRAME);
-        style = wxSIMPLE_BORDER;
-        SetExtraStyle(exstyleOrig &
-                      ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP));
+                   wxRESIZE_BORDER);
+        style |= wxBORDER_NONE;
+        SetExtraStyle(exstyleOrig & ~wxWS_EX_CONTEXTHELP);
     }
 
     if ( !wxTopLevelWindowNative::Create(parent, id, title, pos,
                                          size, style, name) )
     }
 
     if ( !wxTopLevelWindowNative::Create(parent, id, title, pos,
                                          size, style, name) )
-        return FALSE;
+        return false;
 
 
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         m_windowStyle = styleOrig;
         m_exStyle = exstyleOrig;
     }
 
     {
         m_windowStyle = styleOrig;
         m_exStyle = exstyleOrig;
     }
 
-    return TRUE;
+    return true;
 }
 
 bool wxTopLevelWindow::ShowFullScreen(bool show, long style)
 {
 }
 
 bool wxTopLevelWindow::ShowFullScreen(bool show, long style)
 {
-    if ( show == IsFullScreen() ) return FALSE;
+    if ( show == IsFullScreen() ) return false;
 
 
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         if ( show )
         {
     {
         if ( show )
         {
@@ -142,13 +155,38 @@ bool wxTopLevelWindow::ShowFullScreen(bool show, long style)
     return wxTopLevelWindowNative::ShowFullScreen(show, style);
 }
 
     return wxTopLevelWindowNative::ShowFullScreen(show, style);
 }
 
+/* static */
+void wxTopLevelWindow::UseNativeDecorationsByDefault(bool native)
+{
+    ms_drawDecorations = !native;
+}
+
+void wxTopLevelWindow::UseNativeDecorations(bool native)
+{
+    wxASSERT_MSG( !m_windowStyle, wxT("must be called before Create()") );
+
+    m_usingNativeDecorations = native;
+}
+
+bool wxTopLevelWindow::IsUsingNativeDecorations() const
+{
+    return m_usingNativeDecorations;
+}
+
 long wxTopLevelWindow::GetDecorationsStyle() const
 {
     long style = 0;
 
     if ( m_windowStyle & wxCAPTION )
     {
 long wxTopLevelWindow::GetDecorationsStyle() const
 {
     long style = 0;
 
     if ( m_windowStyle & wxCAPTION )
     {
-        style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE;
+        if ( ms_canIconize == -1 )
+        {
+            ms_canIconize = wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME);
+        }
+
+        style |= wxTOPLEVEL_TITLEBAR;
+        if ( m_windowStyle & wxCLOSE_BOX )
+            style |= wxTOPLEVEL_BUTTON_CLOSE;
         if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize )
             style |= wxTOPLEVEL_BUTTON_ICONIZE;
         if ( m_windowStyle & wxMAXIMIZE_BOX )
         if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize )
             style |= wxTOPLEVEL_BUTTON_ICONIZE;
         if ( m_windowStyle & wxMAXIMIZE_BOX )
@@ -159,18 +197,18 @@ long wxTopLevelWindow::GetDecorationsStyle() const
                 style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
         }
 #if wxUSE_HELP
                 style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
         }
 #if wxUSE_HELP
-        if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP))
+        if ( m_exStyle & wxWS_EX_CONTEXTHELP)
             style |= wxTOPLEVEL_BUTTON_HELP;
 #endif
     }
     if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 )
         style |= wxTOPLEVEL_BORDER;
             style |= wxTOPLEVEL_BUTTON_HELP;
 #endif
     }
     if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 )
         style |= wxTOPLEVEL_BORDER;
-    if ( m_windowStyle & (wxRESIZE_BORDER | wxTHICK_FRAME) )
+    if ( m_windowStyle & (wxRESIZE_BORDER | wxRESIZE_BORDER) )
         style |= wxTOPLEVEL_RESIZEABLE;
 
     if ( IsMaximized() )
         style |= wxTOPLEVEL_MAXIMIZED;
         style |= wxTOPLEVEL_RESIZEABLE;
 
     if ( IsMaximized() )
         style |= wxTOPLEVEL_MAXIMIZED;
-    if ( GetIcon().Ok() )
+    if ( GetIcon().IsOk() )
         style |= wxTOPLEVEL_ICON;
     if ( m_isActive )
         style |= wxTOPLEVEL_ACTIVE;
         style |= wxTOPLEVEL_ICON;
     if ( m_isActive )
         style |= wxTOPLEVEL_ACTIVE;
@@ -191,7 +229,7 @@ void wxTopLevelWindow::RefreshTitleBar()
 
 wxPoint wxTopLevelWindow::GetClientAreaOrigin() const
 {
 
 wxPoint wxTopLevelWindow::GetClientAreaOrigin() const
 {
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         int w, h;
         wxTopLevelWindowNative::DoGetClientSize(&w, &h);
     {
         int w, h;
         wxTopLevelWindowNative::DoGetClientSize(&w, &h);
@@ -209,7 +247,7 @@ wxPoint wxTopLevelWindow::GetClientAreaOrigin() const
 
 void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const
 {
 
 void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const
 {
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         int w, h;
         wxTopLevelWindowNative::DoGetClientSize(&w, &h);
     {
         int w, h;
         wxTopLevelWindowNative::DoGetClientSize(&w, &h);
@@ -228,7 +266,7 @@ void wxTopLevelWindow::DoGetClientSize(int *width, int *height) const
 
 void wxTopLevelWindow::DoSetClientSize(int width, int height)
 {
 
 void wxTopLevelWindow::DoSetClientSize(int width, int height)
 {
-    if ( ms_drawDecorations )
+    if ( !m_usingNativeDecorations )
     {
         wxSize size = m_renderer->GetFrameTotalSize(wxSize(width, height),
                                                GetDecorationsStyle());
     {
         wxSize size = m_renderer->GetFrameTotalSize(wxSize(width, height),
                                                GetDecorationsStyle());
@@ -238,19 +276,16 @@ void wxTopLevelWindow::DoSetClientSize(int width, int height)
         wxTopLevelWindowNative::DoSetClientSize(width, height);
 }
 
         wxTopLevelWindowNative::DoSetClientSize(width, height);
 }
 
-void wxTopLevelWindow::OnNcPaint(wxPaintEvent& event)
+void wxTopLevelWindow::OnNcPaint(wxNcPaintEvent& event)
 {
 {
-    if ( !ms_drawDecorations || !m_renderer )
+    if ( m_usingNativeDecorations || !m_renderer )
+    {
         event.Skip();
         event.Skip();
-    else
+    }
+    else // we're drawing the decorations ourselves
     {
         // get the window rect
     {
         // get the window rect
-        wxRect rect;
-        wxSize size = GetSize();
-        rect.x =
-        rect.y = 0;
-        rect.width = size.x;
-        rect.height = size.y;
+        wxRect rect(GetSize());
 
         wxWindowDC dc(this);
         m_renderer->DrawFrameTitleBar(dc, rect,
 
         wxWindowDC dc(this);
         m_renderer->DrawFrameTitleBar(dc, rect,
@@ -270,26 +305,15 @@ long wxTopLevelWindow::HitTest(const wxPoint& pt) const
     return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle());
 }
 
     return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle());
 }
 
-int wxTopLevelWindow::GetMinWidth() const
+wxSize wxTopLevelWindow::GetMinSize() const
 {
 {
-    if ( ms_drawDecorations )
+    wxSize size = wxTopLevelWindowNative::GetMinSize();
+    if ( !m_usingNativeDecorations )
     {
     {
-        return wxMax(wxTopLevelWindowNative::GetMinWidth(),
-                     m_renderer->GetFrameMinSize(GetDecorationsStyle()).x);
+        size.IncTo(m_renderer->GetFrameMinSize(GetDecorationsStyle()));
     }
     }
-    else
-        return wxTopLevelWindowNative::GetMinWidth();
-}
 
 
-int wxTopLevelWindow::GetMinHeight() const
-{
-    if ( ms_drawDecorations )
-    {
-        return wxMax(wxTopLevelWindowNative::GetMinHeight(),
-                     m_renderer->GetFrameMinSize(GetDecorationsStyle()).y);
-    }
-    else
-        return wxTopLevelWindowNative::GetMinHeight();
+    return size;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -300,27 +324,29 @@ void wxTopLevelWindow::SetIcons(const wxIconBundle& icons)
 {
     wxTopLevelWindowNative::SetIcons(icons);
 
 {
     wxTopLevelWindowNative::SetIcons(icons);
 
-    if ( ms_drawDecorations && m_renderer )
+    if ( !m_usingNativeDecorations && m_renderer )
     {
         wxSize size = m_renderer->GetFrameIconSize();
         const wxIcon& icon = icons.GetIcon( size );
 
     {
         wxSize size = m_renderer->GetFrameIconSize();
         const wxIcon& icon = icons.GetIcon( size );
 
-        if ( !icon.Ok() || size.x == -1  )
+        if ( !icon.IsOk() || size.x == wxDefaultCoord  )
             m_titlebarIcon = icon;
         else
         {
             wxBitmap bmp1;
             bmp1.CopyFromIcon(icon);
             m_titlebarIcon = icon;
         else
         {
             wxBitmap bmp1;
             bmp1.CopyFromIcon(icon);
-            if ( !bmp1.Ok() )
+            if ( !bmp1.IsOk() )
                 m_titlebarIcon = wxNullIcon;
             else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y )
                 m_titlebarIcon = icon;
                 m_titlebarIcon = wxNullIcon;
             else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y )
                 m_titlebarIcon = icon;
+#if wxUSE_IMAGE
             else
             {
                 wxImage img = bmp1.ConvertToImage();
                 img.Rescale(size.x, size.y);
                 m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
             }
             else
             {
                 wxImage img = bmp1.ConvertToImage();
                 img.Rescale(size.x, size.y);
                 m_titlebarIcon.CopyFromBitmap(wxBitmap(img));
             }
+#endif // wxUSE_IMAGE
         }
     }
 }
         }
     }
 }
@@ -353,13 +379,12 @@ static bool wxGetResizingCursor(long hitTestResult, wxCursor& cursor)
                 cursor = wxCursor(wxCURSOR_SIZENWSE);
                 break;
             default:
                 cursor = wxCursor(wxCURSOR_SIZENWSE);
                 break;
             default:
-                return FALSE;
-                break;
+                return false;
         }
         }
-        return TRUE;
+        return true;
     }
     }
-    
-    return FALSE;
+
+    return false;
 }
 
 #define wxINTERACTIVE_RESIZE_DIR \
 }
 
 #define wxINTERACTIVE_RESIZE_DIR \
@@ -382,7 +407,7 @@ class wxInteractiveMoveHandler : public wxEvtHandler
 {
 public:
     wxInteractiveMoveHandler(wxInteractiveMoveData& data) : m_data(data) {}
 {
 public:
     wxInteractiveMoveHandler(wxInteractiveMoveData& data) : m_data(data) {}
-    
+
 private:
     DECLARE_EVENT_TABLE()
     void OnMouseMove(wxMouseEvent& event);
 private:
     DECLARE_EVENT_TABLE()
     void OnMouseMove(wxMouseEvent& event);
@@ -401,7 +426,7 @@ BEGIN_EVENT_TABLE(wxInteractiveMoveHandler, wxEvtHandler)
 END_EVENT_TABLE()
 
 
 END_EVENT_TABLE()
 
 
-static inline LINKAGEMODE 
+static inline LINKAGEMODE
 void wxApplyResize(wxInteractiveMoveData& data, const wxPoint& diff)
 {
     if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
 void wxApplyResize(wxInteractiveMoveData& data, const wxPoint& diff)
 {
     if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
@@ -422,26 +447,26 @@ void wxApplyResize(wxInteractiveMoveData& data, const wxPoint& diff)
     {
         data.m_rect.height += diff.y;
     }
     {
         data.m_rect.height += diff.y;
     }
-    
-    if ( data.m_minSize.x != -1 && data.m_rect.width < data.m_minSize.x )
+
+    if ( data.m_minSize.x != wxDefaultCoord && data.m_rect.width < data.m_minSize.x )
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
             data.m_rect.x -= data.m_minSize.x - data.m_rect.width;
         data.m_rect.width = data.m_minSize.x;
     }
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
             data.m_rect.x -= data.m_minSize.x - data.m_rect.width;
         data.m_rect.width = data.m_minSize.x;
     }
-    if ( data.m_maxSize.x != -1 && data.m_rect.width > data.m_maxSize.x )
+    if ( data.m_maxSize.x != wxDefaultCoord && data.m_rect.width > data.m_maxSize.x )
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
             data.m_rect.x -= data.m_minSize.x - data.m_rect.width;
         data.m_rect.width = data.m_maxSize.x;
     }
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_W )
             data.m_rect.x -= data.m_minSize.x - data.m_rect.width;
         data.m_rect.width = data.m_maxSize.x;
     }
-    if ( data.m_minSize.y != -1 && data.m_rect.height < data.m_minSize.y )
+    if ( data.m_minSize.y != wxDefaultCoord && data.m_rect.height < data.m_minSize.y )
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_N )
             data.m_rect.y -= data.m_minSize.y - data.m_rect.height;
         data.m_rect.height = data.m_minSize.y;
     }
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_N )
             data.m_rect.y -= data.m_minSize.y - data.m_rect.height;
         data.m_rect.height = data.m_minSize.y;
     }
-    if ( data.m_maxSize.y != -1 && data.m_rect.height > data.m_maxSize.y )
+    if ( data.m_maxSize.y != wxDefaultCoord && data.m_rect.height > data.m_maxSize.y )
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_N )
             data.m_rect.y -= data.m_minSize.y - data.m_rect.height;
     {
         if ( data.m_flags & wxINTERACTIVE_RESIZE_N )
             data.m_rect.y -= data.m_minSize.y - data.m_rect.height;
@@ -481,8 +506,8 @@ void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& WXUNUSED(event))
 
 void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
 {
 
 void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
 {
-    wxPoint diff(-1,-1);
-    
+    wxPoint diff(wxDefaultCoord,wxDefaultCoord);
+
     switch ( event.GetKeyCode() )
     {
         case WXK_UP:    diff = wxPoint(0, -16); break;
     switch ( event.GetKeyCode() )
     {
         case WXK_UP:    diff = wxPoint(0, -16); break;
@@ -497,8 +522,8 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
             m_data.m_evtLoop->Exit();
             return;
     }
             m_data.m_evtLoop->Exit();
             return;
     }
-    
-    if ( diff.x != -1 )
+
+    if ( diff.x != wxDefaultCoord )
     {
         if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
         {
     {
         if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
         {
@@ -506,19 +531,19 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
             if ( m_data.m_sizingCursor )
             {
                 wxEndBusyCursor();
             if ( m_data.m_sizingCursor )
             {
                 wxEndBusyCursor();
-                m_data.m_sizingCursor = FALSE;
+                m_data.m_sizingCursor = false;
             }
 
             if ( m_data.m_flags & wxINTERACTIVE_MOVE )
             {
             }
 
             if ( m_data.m_flags & wxINTERACTIVE_MOVE )
             {
-                m_data.m_pos = m_data.m_window->GetPosition() + 
+                m_data.m_pos = m_data.m_window->GetPosition() +
                                wxPoint(m_data.m_window->GetSize().x/2, 8);
             }
         }
 
         wxPoint warp;
                                wxPoint(m_data.m_window->GetSize().x/2, 8);
             }
         }
 
         wxPoint warp;
-        bool changeCur = FALSE;
-        
+        bool changeCur = false;
+
         if ( m_data.m_flags & wxINTERACTIVE_MOVE )
         {
             m_data.m_rect.Offset(diff);
         if ( m_data.m_flags & wxINTERACTIVE_MOVE )
         {
             m_data.m_rect.Offset(diff);
@@ -527,38 +552,38 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
         }
         else /* wxINTERACTIVE_RESIZE */
         {
         }
         else /* wxINTERACTIVE_RESIZE */
         {
-            if ( !(m_data.m_flags & 
+            if ( !(m_data.m_flags &
                   (wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
             {
                 if ( diff.y < 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
                     m_data.m_pos.y = m_data.m_window->GetPosition().y;
                   (wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
             {
                 if ( diff.y < 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
                     m_data.m_pos.y = m_data.m_window->GetPosition().y;
-                    changeCur = TRUE;
+                    changeCur = true;
                 }
                 else if ( diff.y > 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
                     m_data.m_pos.y = m_data.m_window->GetPosition().y +
                                      m_data.m_window->GetSize().y;
                 }
                 else if ( diff.y > 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
                     m_data.m_pos.y = m_data.m_window->GetPosition().y +
                                      m_data.m_window->GetSize().y;
-                    changeCur = TRUE;
+                    changeCur = true;
                 }
             }
                 }
             }
-            if ( !(m_data.m_flags & 
+            if ( !(m_data.m_flags &
                   (wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
             {
                 if ( diff.x < 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
                     m_data.m_pos.x = m_data.m_window->GetPosition().x;
                   (wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
             {
                 if ( diff.x < 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
                     m_data.m_pos.x = m_data.m_window->GetPosition().x;
-                    changeCur = TRUE;
+                    changeCur = true;
                 }
                 else if ( diff.x > 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
                     m_data.m_pos.x = m_data.m_window->GetPosition().x +
                                      m_data.m_window->GetSize().x;
                 }
                 else if ( diff.x > 0 )
                 {
                     m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
                     m_data.m_pos.x = m_data.m_window->GetPosition().x +
                                      m_data.m_window->GetSize().x;
-                    changeCur = TRUE;
+                    changeCur = true;
                 }
             }
 
                 }
             }
 
@@ -592,7 +617,7 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
                 if ( m_data.m_sizingCursor )
                     wxEndBusyCursor();
                 wxBeginBusyCursor(&cur);
                 if ( m_data.m_sizingCursor )
                     wxEndBusyCursor();
                 wxBeginBusyCursor(&cur);
-                m_data.m_sizingCursor = TRUE;
+                m_data.m_sizingCursor = true;
             }
         }
     }
             }
         }
     }
@@ -609,26 +634,26 @@ void wxTopLevelWindow::InteractiveMove(int flags)
     wxASSERT_MSG( !((flags & wxINTERACTIVE_MOVE) && (flags & wxINTERACTIVE_RESIZE)),
                   wxT("can't move and resize window at the same time") );
 
     wxASSERT_MSG( !((flags & wxINTERACTIVE_MOVE) && (flags & wxINTERACTIVE_RESIZE)),
                   wxT("can't move and resize window at the same time") );
 
-    wxASSERT_MSG( !(flags & wxINTERACTIVE_RESIZE) || 
-                  (flags & wxINTERACTIVE_WAIT_FOR_INPUT) || 
+    wxASSERT_MSG( !(flags & wxINTERACTIVE_RESIZE) ||
+                  (flags & wxINTERACTIVE_WAIT_FOR_INPUT) ||
                   (flags & wxINTERACTIVE_RESIZE_DIR),
                   wxT("direction of resizing not specified") );
 
     wxInteractiveMoveData data;
     wxEventLoop loop;
                   (flags & wxINTERACTIVE_RESIZE_DIR),
                   wxT("direction of resizing not specified") );
 
     wxInteractiveMoveData data;
     wxEventLoop loop;
-    
+
     SetFocus();
 
     SetFocus();
 
-#ifndef __WXGTK__    
+#ifndef __WXGTK__
     if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
     {
         wxCursor sizingCursor(wxCURSOR_SIZING);
         wxBeginBusyCursor(&sizingCursor);
     if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
     {
         wxCursor sizingCursor(wxCURSOR_SIZING);
         wxBeginBusyCursor(&sizingCursor);
-        data.m_sizingCursor = TRUE;
+        data.m_sizingCursor = true;
     }
     else
 #endif
     }
     else
 #endif
-        data.m_sizingCursor = FALSE;
+        data.m_sizingCursor = false;
 
     data.m_window = this;
     data.m_evtLoop = &loop;
 
     data.m_window = this;
     data.m_evtLoop = &loop;
@@ -702,21 +727,21 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
             m_isActive = isActive;
             RefreshTitleBar();
         }
             m_isActive = isActive;
             RefreshTitleBar();
         }
-        return TRUE;
+        return true;
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_PRESS )
     {
         m_pressedButton = numArg;
         RefreshTitleBar();
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_PRESS )
     {
         m_pressedButton = numArg;
         RefreshTitleBar();
-        return TRUE;
+        return true;
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_RELEASE )
     {
         m_pressedButton = 0;
         RefreshTitleBar();
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_RELEASE )
     {
         m_pressedButton = 0;
         RefreshTitleBar();
-        return TRUE;
+        return true;
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_CLICK )
     }
 
     else if ( action == wxACTION_TOPLEVEL_BUTTON_CLICK )
@@ -724,13 +749,13 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
         m_pressedButton = 0;
         RefreshTitleBar();
         ClickTitleBarButton(numArg);
         m_pressedButton = 0;
         RefreshTitleBar();
         ClickTitleBarButton(numArg);
-        return TRUE;
+        return true;
     }
 
     else if ( action == wxACTION_TOPLEVEL_MOVE )
     {
         InteractiveMove(wxINTERACTIVE_MOVE);
     }
 
     else if ( action == wxACTION_TOPLEVEL_MOVE )
     {
         InteractiveMove(wxINTERACTIVE_MOVE);
-        return TRUE;
+        return true;
     }
 
     else if ( action == wxACTION_TOPLEVEL_RESIZE )
     }
 
     else if ( action == wxACTION_TOPLEVEL_RESIZE )
@@ -745,17 +770,17 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
         if ( numArg & wxHT_TOPLEVEL_BORDER_E )
             flags |= wxINTERACTIVE_RESIZE_E;
         InteractiveMove(flags);
         if ( numArg & wxHT_TOPLEVEL_BORDER_E )
             flags |= wxINTERACTIVE_RESIZE_E;
         InteractiveMove(flags);
-        return TRUE;
+        return true;
     }
 
     else
     }
 
     else
-        return FALSE;
+        return false;
 }
 
 void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
 {
 }
 
 void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
 {
-    bool ret = TRUE;
-    
+    bool ret = true;
+
     switch (event.GetId())
     {
         case wxID_CLOSE_FRAME:
     switch (event.GetId())
     {
         case wxID_CLOSE_FRAME:
@@ -782,29 +807,37 @@ void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
             break;
 
         default:
             break;
 
         default:
-            ret = FALSE;
+            ret = false;
     }
     }
-    
+
     if ( !ret )
         event.Skip();
 }
 
     if ( !ret )
         event.Skip();
 }
 
+/* static */
+wxInputHandler *
+wxTopLevelWindow::GetStdInputHandler(wxInputHandler *handlerDef)
+{
+    static wxStdTLWInputHandler s_handler(handlerDef);
+
+    return &s_handler;
+}
 
 // ============================================================================
 
 // ============================================================================
-// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
+// wxStdTLWInputHandler: handles focus, resizing and titlebar buttons clicks
 // ============================================================================
 
 // ============================================================================
 
-wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand)
-            : wxStdInputHandler(inphand)
+wxStdTLWInputHandler::wxStdTLWInputHandler(wxInputHandler *inphand)
+                    : wxStdInputHandler(inphand)
 {
     m_winCapture = NULL;
     m_winHitTest = 0;
     m_winPressed = 0;
 {
     m_winCapture = NULL;
     m_winHitTest = 0;
     m_winPressed = 0;
-    m_borderCursorOn = FALSE;
+    m_borderCursorOn = false;
 }
 
 }
 
-bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
-                                         const wxMouseEvent& event)
+bool wxStdTLWInputHandler::HandleMouse(wxInputConsumer *consumer,
+                                       const wxMouseEvent& event)
 {
     // the button has 2 states: pressed and normal with the following
     // transitions between them:
 {
     // the button has 2 states: pressed and normal with the following
     // transitions between them:
@@ -828,18 +861,18 @@ bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
                 m_winHitTest = hit;
                 m_winPressed = hit;
                 consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
                 m_winHitTest = hit;
                 m_winPressed = hit;
                 consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
-                return TRUE;
+                return true;
             }
             else if ( (hit & wxHT_TOPLEVEL_TITLEBAR) && !w->IsMaximized() )
             {
                 consumer->PerformAction(wxACTION_TOPLEVEL_MOVE);
             }
             else if ( (hit & wxHT_TOPLEVEL_TITLEBAR) && !w->IsMaximized() )
             {
                 consumer->PerformAction(wxACTION_TOPLEVEL_MOVE);
-                return TRUE;
+                return true;
             }
             else if ( (consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER)
                       && (hit & wxHT_TOPLEVEL_ANY_BORDER) )
             {
                 consumer->PerformAction(wxACTION_TOPLEVEL_RESIZE, hit);
             }
             else if ( (consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER)
                       && (hit & wxHT_TOPLEVEL_ANY_BORDER) )
             {
                 consumer->PerformAction(wxACTION_TOPLEVEL_RESIZE, hit);
-                return TRUE;
+                return true;
             }
         }
 
             }
         }
 
@@ -853,7 +886,7 @@ bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
                 if ( m_winHitTest == m_winPressed )
                 {
                     consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, m_winPressed);
                 if ( m_winHitTest == m_winPressed )
                 {
                     consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, m_winPressed);
-                    return TRUE;
+                    return true;
                 }
             }
             //else: the mouse was released outside the window, this doesn't
                 }
             }
             //else: the mouse was released outside the window, this doesn't
@@ -864,8 +897,8 @@ bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
     return wxStdInputHandler::HandleMouse(consumer, event);
 }
 
     return wxStdInputHandler::HandleMouse(consumer, event);
 }
 
-bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
-                                             const wxMouseEvent& event)
+bool wxStdTLWInputHandler::HandleMouseMove(wxInputConsumer *consumer,
+                                           const wxMouseEvent& event)
 {
     if ( event.GetEventObject() == m_winCapture )
     {
 {
     if ( event.GetEventObject() == m_winCapture )
     {
@@ -879,7 +912,7 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
                 consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
 
             m_winHitTest = hit;
                 consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
 
             m_winHitTest = hit;
-            return TRUE;
+            return true;
         }
     }
     else if ( consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER )
         }
     }
     else if ( consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER )
@@ -894,7 +927,7 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
 
             if ( m_borderCursorOn )
             {
 
             if ( m_borderCursorOn )
             {
-                m_borderCursorOn = FALSE;
+                m_borderCursorOn = false;
                 win->SetCursor(m_origCursor);
             }
 
                 win->SetCursor(m_origCursor);
             }
 
@@ -915,14 +948,14 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
     return wxStdInputHandler::HandleMouseMove(consumer, event);
 }
 
     return wxStdInputHandler::HandleMouseMove(consumer, event);
 }
 
-bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer,
-                                              bool activated)
+bool wxStdTLWInputHandler::HandleActivation(wxInputConsumer *consumer,
+                                            bool activated)
 {
     if ( m_borderCursorOn )
     {
         consumer->GetInputWindow()->SetCursor(m_origCursor);
 {
     if ( m_borderCursorOn )
     {
         consumer->GetInputWindow()->SetCursor(m_origCursor);
-        m_borderCursorOn = FALSE;
+        m_borderCursorOn = false;
     }
     consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated);
     }
     consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated);
-    return FALSE;
+    return false;
 }
 }