+
+ else if ( action == wxACTION_TOPLEVEL_BUTTON_RELEASE )
+ {
+ m_pressedButton = 0;
+ RefreshTitleBar();
+ return TRUE;
+ }
+
+ else if ( action == wxACTION_TOPLEVEL_BUTTON_CLICK )
+ {
+ m_pressedButton = 0;
+ RefreshTitleBar();
+ ClickTitleBarButton(numArg);
+ return TRUE;
+ }
+
+ else
+ return FALSE;
+}
+
+
+// ============================================================================
+// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
+// ============================================================================
+
+wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand)
+ : wxStdInputHandler(inphand)
+{
+ m_winCapture = NULL;
+ m_winHitTest = 0;
+ m_winPressed = 0;
+}
+
+bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
+{
+ // the button has 2 states: pressed and normal with the following
+ // transitions between them:
+ //
+ // normal -> left down -> capture mouse and go to pressed state
+ // pressed -> left up inside -> generate click -> go to normal
+ // outside ------------------>
+ //
+ // the other mouse buttons are ignored
+ if ( event.Button(1) )
+ {
+ if ( event.ButtonDown(1) )
+ {
+ wxTopLevelWindow *w = wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow);
+ long hit = w->HitTest(event.GetPosition());
+
+ if ( hit & wxHT_TOPLEVEL_ANY_BUTTON )
+ {
+ m_winCapture = w;
+ m_winCapture->CaptureMouse();
+ m_winHitTest = hit;
+ m_winPressed = hit;
+ consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
+ return TRUE;
+ }
+ }
+
+ else // up
+ {
+ if ( m_winCapture )
+ {
+ m_winCapture->ReleaseMouse();
+ m_winCapture = NULL;
+
+ if ( m_winHitTest == m_winPressed )
+ {
+ consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, m_winPressed);
+ return TRUE;
+ }
+ }
+ //else: the mouse was released outside the window, this doesn't
+ // count as a click
+ }
+ }
+
+ return wxStdInputHandler::HandleMouse(consumer, event);
+}
+
+bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
+ const wxMouseEvent& event)
+{
+ // we only have to do something when the mouse leaves/enters the pressed
+ // button and don't care about the other ones
+ if ( event.GetEventObject() == m_winCapture )
+ {
+ long hit = m_winCapture->HitTest(event.GetPosition());
+
+ if ( hit != m_winHitTest )
+ {
+ if ( hit != m_winPressed )
+ consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_RELEASE, m_winPressed);
+ else
+ consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
+
+ m_winHitTest = hit;
+ return TRUE;
+ }
+ }
+
+ return wxStdInputHandler::HandleMouseMove(consumer, event);
+}
+
+bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer,
+ bool activated)
+{
+ consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated);
+ return FALSE;