]> git.saurik.com Git - wxWidgets.git/commitdiff
maintaint the mouse capture stack in all ports, not just wxUniv
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Jan 2002 19:31:19 +0000 (19:31 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Jan 2002 19:31:19 +0000 (19:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/window.h
include/wx/gtk1/window.h
include/wx/msw/window.h
include/wx/univ/window.h
include/wx/window.h
src/common/wincmn.cpp
src/gtk/window.cpp
src/gtk1/window.cpp
src/msw/window.cpp
src/univ/winuniv.cpp

index ce6b0332d4226c3137102f77969d91d3fa8669b8..746f9c61a695d5077326a0d0bfde4807065b554e 100644 (file)
@@ -65,8 +65,6 @@ public:
     virtual bool Reparent( wxWindowBase *newParent );
 
     virtual void WarpPointer(int x, int y);
-    virtual void CaptureMouse();
-    virtual void ReleaseMouse();
 
     virtual void Refresh( bool eraseBackground = TRUE,
                           const wxRect *rect = (const wxRect *) NULL );
@@ -159,7 +157,7 @@ public:
     // the layouting functions have to be called later on
     // (i.e. in idle time, implemented in OnInternalIdle() ).
     void GtkUpdateSize() { m_sizeSet = FALSE; }
-    
+
     // position and size of the window
     int                  m_x, m_y;
     int                  m_width, m_height;
@@ -168,7 +166,7 @@ public:
     // see the docs in src/gtk/window.cpp
     GtkWidget           *m_widget;          // mostly the widget seen by the rest of GTK
     GtkWidget           *m_wxwindow;        // mostly the client area as per wxWindows
-    
+
     // this widget will be queried for GTK's focus events
     GtkWidget           *m_focusWidget;
 
@@ -229,6 +227,9 @@ public:
     virtual void DoSetClientSize(int width, int height);
     virtual void DoMoveWindow(int x, int y, int width, int height);
 
+    virtual void DoCaptureMouse();
+    virtual void DoReleaseMouse();
+
 #if wxUSE_TOOLTIPS
     virtual void DoSetToolTip( wxToolTip *tip );
 #endif // wxUSE_TOOLTIPS
index ce6b0332d4226c3137102f77969d91d3fa8669b8..746f9c61a695d5077326a0d0bfde4807065b554e 100644 (file)
@@ -65,8 +65,6 @@ public:
     virtual bool Reparent( wxWindowBase *newParent );
 
     virtual void WarpPointer(int x, int y);
-    virtual void CaptureMouse();
-    virtual void ReleaseMouse();
 
     virtual void Refresh( bool eraseBackground = TRUE,
                           const wxRect *rect = (const wxRect *) NULL );
@@ -159,7 +157,7 @@ public:
     // the layouting functions have to be called later on
     // (i.e. in idle time, implemented in OnInternalIdle() ).
     void GtkUpdateSize() { m_sizeSet = FALSE; }
-    
+
     // position and size of the window
     int                  m_x, m_y;
     int                  m_width, m_height;
@@ -168,7 +166,7 @@ public:
     // see the docs in src/gtk/window.cpp
     GtkWidget           *m_widget;          // mostly the widget seen by the rest of GTK
     GtkWidget           *m_wxwindow;        // mostly the client area as per wxWindows
-    
+
     // this widget will be queried for GTK's focus events
     GtkWidget           *m_focusWidget;
 
@@ -229,6 +227,9 @@ public:
     virtual void DoSetClientSize(int width, int height);
     virtual void DoMoveWindow(int x, int y, int width, int height);
 
+    virtual void DoCaptureMouse();
+    virtual void DoReleaseMouse();
+
 #if wxUSE_TOOLTIPS
     virtual void DoSetToolTip( wxToolTip *tip );
 #endif // wxUSE_TOOLTIPS
index aa039d5869e7829656a9caeb9c6c5c668864de72..ec980f4392a8ed170516ed0f90e8ae3f923cc7db 100644 (file)
@@ -90,8 +90,6 @@ public:
     virtual bool Reparent(wxWindowBase *newParent);
 
     virtual void WarpPointer(int x, int y);
-    virtual void CaptureMouse();
-    virtual void ReleaseMouse();
 
     virtual void Refresh( bool eraseBackground = TRUE,
                           const wxRect *rect = (const wxRect *) NULL );
@@ -438,6 +436,9 @@ protected:
                            int sizeFlags = wxSIZE_AUTO);
     virtual void DoSetClientSize(int width, int height);
 
+    virtual void DoCaptureMouse();
+    virtual void DoReleaseMouse();
+
     // move the window to the specified location and resize it: this is called
     // from both DoSetSize() and DoSetClientSize() and would usually just call
     // ::MoveWindow() except for composite controls which will want to arrange
index cfe3c89bb7e729cbed19fee165db2e2ffe8248bb..78cf266257dd70d345de21bcfd2493696aaa6b23 100644 (file)
@@ -200,13 +200,6 @@ public:
     // we refresh the window when it is dis/enabled
     virtual bool Enable(bool enable = TRUE);
 
-    // our Capture/ReleaseMouse() maintains the stack of windows which had
-    // captured the mouse and when ReleaseMouse() is called, the mouse freed
-    // only if the stack is empty, otherwise it is captured back by the window
-    // on top of the stack
-    virtual void CaptureMouse();
-    virtual void ReleaseMouse();
-
 protected:
     // common part of all ctors
     void Init();
index 3abbf6a33029957f7dd474462f591e2543db901f..b84b83dd60300beac811eb11a3f9ca32eebce7e5 100644 (file)
@@ -460,9 +460,12 @@ public:
         // move the mouse to the specified position
     virtual void WarpPointer(int x, int y) = 0;
 
-        // start or end mouse capture
-    virtual void CaptureMouse() = 0;
-    virtual void ReleaseMouse() = 0;
+        // start or end mouse capture, these functions maintain the stack of
+        // windows having captured the mouse and after calling ReleaseMouse()
+        // the mouse is not released but returns to the window which had had
+        // captured it previously (if any)
+    void CaptureMouse();
+    void ReleaseMouse();
 
         // get the window which currently captures the mouse or NULL
     static wxWindow *GetCapture();
@@ -883,6 +886,10 @@ protected:
 
     virtual wxHitTest DoHitTest(wxCoord x, wxCoord y) const;
 
+    // capture/release the mouse, used by Capture/ReleaseMouse()
+    virtual void DoCaptureMouse();
+    virtual void DoReleaseMouse();
+
     // retrieve the position/size of the window
     virtual void DoGetPosition( int *x, int *y ) const = 0;
     virtual void DoGetSize( int *width, int *height ) const = 0;
index 3a1fd0f2d867caefbdf4f80e884bf32a5f938165..bd4ec6de1e3897b3def2d833a25709603bbdb86b 100644 (file)
@@ -1612,3 +1612,50 @@ wxHitTest wxWindowBase::DoHitTest(wxCoord x, wxCoord y) const
     return outside ? wxHT_WINDOW_OUTSIDE : wxHT_WINDOW_INSIDE;
 }
 
+// ----------------------------------------------------------------------------
+// mouse capture
+// ----------------------------------------------------------------------------
+
+struct WXDLLEXPORT wxWindowNext
+{
+    wxWindow *win;
+    wxWindowNext *next;
+} *wxWindow::ms_winCaptureNext = NULL;
+
+void wxWindow::CaptureMouse()
+{
+    wxLogTrace(_T("mousecapture"), _T("CaptureMouse(0x%08x)"), this);
+
+    wxWindow *winOld = GetCapture();
+    if ( winOld )
+    {
+        // save it on stack
+        wxWindowNext *item = new wxWindowNext;
+        item->win = winOld;
+        item->next = ms_winCaptureNext;
+        ms_winCaptureNext = item;
+    }
+    //else: no mouse capture to save
+
+    DoCaptureMouse();
+}
+
+void wxWindow::ReleaseMouse()
+{
+    DoReleaseMouse();
+
+    if ( ms_winCaptureNext )
+    {
+        ms_winCaptureNext->win->CaptureMouse();
+
+        wxWindowNext *item = ms_winCaptureNext;
+        ms_winCaptureNext = item->next;
+        delete item;
+    }
+    //else: stack is empty, no previous capture
+
+    wxLogTrace(_T("mousecapture"),
+               _T("After ReleaseMouse() mouse is captured by 0x%08x"),
+               GetCapture());
+}
+
index 475c60be0fab591dd3059c2d77dccb9580b71099..21dbf1774a408460292ee5dcf36171ad798eb680 100644 (file)
@@ -1356,9 +1356,9 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
     InitMouseEvent( win, event, gdk_event );
 
     AdjustEventButtonState(event);
-    
+
     // wxListBox actually get mouse events from the item
-    
+
     if (win->m_isListBox)
     {
         event.m_x += widget->allocation.x;
@@ -1489,7 +1489,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
     AdjustEventButtonState(event);
 
     // wxListBox actually get mouse events from the item
-    
+
     if (win->m_isListBox)
     {
         event.m_x += widget->allocation.x;
@@ -2370,7 +2370,7 @@ void wxWindowGTK::Init()
 
     m_noExpose = FALSE;
     m_nativeSizeEvent = FALSE;
-    
+
     m_hasScrolling = FALSE;
     m_isScrolling = FALSE;
 
@@ -2545,7 +2545,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
 
     if (m_parent)
         m_parent->DoAddChild( this );
-        
+
     m_focusWidget = m_wxwindow;
 
     PostCreation();
@@ -2639,7 +2639,7 @@ bool wxWindowGTK::PreCreation( wxWindowGTK *parent, const wxPoint &pos,  const w
 void wxWindowGTK::PostCreation()
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
-    
+
     if (m_wxwindow)
     {
         if (!m_noExpose)
@@ -3087,7 +3087,7 @@ void wxWindowGTK::DoGetPosition( int *x, int *y ) const
         dx = pizza->xoffset;
         dy = pizza->yoffset;
     }
-    
+
     if (x) (*x) = m_x - dx;
     if (y) (*y) = m_y - dy;
 }
@@ -3280,7 +3280,7 @@ void wxWindowGTK::SetFocus()
            // ?
         }
     }
-    
+
 #if 0
     wxPrintf( "SetFocus finished in " );
     if (GetClassInfo() && GetClassInfo()->GetClassName())
@@ -3872,7 +3872,7 @@ bool wxWindowGTK::SetFont( const wxFont &font )
     return TRUE;
 }
 
-void wxWindowGTK::CaptureMouse()
+void wxWindowGTK::DoCaptureMouse()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
 
@@ -3901,7 +3901,7 @@ void wxWindowGTK::CaptureMouse()
     g_captureWindowHasMouse = TRUE;
 }
 
-void wxWindowGTK::ReleaseMouse()
+void wxWindowGTK::DoReleaseMouse()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
 
index 475c60be0fab591dd3059c2d77dccb9580b71099..21dbf1774a408460292ee5dcf36171ad798eb680 100644 (file)
@@ -1356,9 +1356,9 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
     InitMouseEvent( win, event, gdk_event );
 
     AdjustEventButtonState(event);
-    
+
     // wxListBox actually get mouse events from the item
-    
+
     if (win->m_isListBox)
     {
         event.m_x += widget->allocation.x;
@@ -1489,7 +1489,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
     AdjustEventButtonState(event);
 
     // wxListBox actually get mouse events from the item
-    
+
     if (win->m_isListBox)
     {
         event.m_x += widget->allocation.x;
@@ -2370,7 +2370,7 @@ void wxWindowGTK::Init()
 
     m_noExpose = FALSE;
     m_nativeSizeEvent = FALSE;
-    
+
     m_hasScrolling = FALSE;
     m_isScrolling = FALSE;
 
@@ -2545,7 +2545,7 @@ bool wxWindowGTK::Create( wxWindow *parent,
 
     if (m_parent)
         m_parent->DoAddChild( this );
-        
+
     m_focusWidget = m_wxwindow;
 
     PostCreation();
@@ -2639,7 +2639,7 @@ bool wxWindowGTK::PreCreation( wxWindowGTK *parent, const wxPoint &pos,  const w
 void wxWindowGTK::PostCreation()
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
-    
+
     if (m_wxwindow)
     {
         if (!m_noExpose)
@@ -3087,7 +3087,7 @@ void wxWindowGTK::DoGetPosition( int *x, int *y ) const
         dx = pizza->xoffset;
         dy = pizza->yoffset;
     }
-    
+
     if (x) (*x) = m_x - dx;
     if (y) (*y) = m_y - dy;
 }
@@ -3280,7 +3280,7 @@ void wxWindowGTK::SetFocus()
            // ?
         }
     }
-    
+
 #if 0
     wxPrintf( "SetFocus finished in " );
     if (GetClassInfo() && GetClassInfo()->GetClassName())
@@ -3872,7 +3872,7 @@ bool wxWindowGTK::SetFont( const wxFont &font )
     return TRUE;
 }
 
-void wxWindowGTK::CaptureMouse()
+void wxWindowGTK::DoCaptureMouse()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
 
@@ -3901,7 +3901,7 @@ void wxWindowGTK::CaptureMouse()
     g_captureWindowHasMouse = TRUE;
 }
 
-void wxWindowGTK::ReleaseMouse()
+void wxWindowGTK::DoReleaseMouse()
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
 
index 45e349fff9ff32c51e2eb507fe8fdb0abf180d44..271f8f0cb8f678137cd5a277e2a63ae8c5d11e2b 100644 (file)
@@ -546,7 +546,7 @@ wxString wxWindowMSW::GetTitle() const
     return wxGetWindowText(GetHWND());
 }
 
-void wxWindowMSW::CaptureMouse()
+void wxWindowMSW::DoCaptureMouse()
 {
     HWND hWnd = GetHwnd();
     if ( hWnd )
@@ -555,7 +555,7 @@ void wxWindowMSW::CaptureMouse()
     }
 }
 
-void wxWindowMSW::ReleaseMouse()
+void wxWindowMSW::DoReleaseMouse()
 {
     if ( !::ReleaseCapture() )
     {
index dbb420c484c78fcf24e4b33ff5d96105654a78fd..a6dad52328fa9358abfe7a4769748810e06df1b7 100644 (file)
@@ -933,53 +933,6 @@ wxRect wxWindow::ScrollNoRefresh(int dx, int dy, const wxRect *rectTotal)
     return rect;
 }
 
-// ----------------------------------------------------------------------------
-// mouse capture
-// ----------------------------------------------------------------------------
-
-struct WXDLLEXPORT wxWindowNext
-{
-    wxWindow *win;
-    wxWindowNext *next;
-} *wxWindow::ms_winCaptureNext = NULL;
-
-void wxWindow::CaptureMouse()
-{
-    wxLogTrace(_T("mousecapture"), _T("CaptureMouse(0x%08x)"), this);
-
-    wxWindow *winOld = GetCapture();
-    if ( winOld )
-    {
-        // save it on stack
-        wxWindowNext *item = new wxWindowNext;
-        item->win = winOld;
-        item->next = ms_winCaptureNext;
-        ms_winCaptureNext = item;
-    }
-    //else: no mouse capture to save
-
-    wxWindowNative::CaptureMouse();
-}
-
-void wxWindow::ReleaseMouse()
-{
-    wxWindowNative::ReleaseMouse();
-
-    if ( ms_winCaptureNext )
-    {
-        ms_winCaptureNext->win->CaptureMouse();
-
-        wxWindowNext *item = ms_winCaptureNext;
-        ms_winCaptureNext = item->next;
-        delete item;
-    }
-    //else: stack is empty, no previous capture
-
-    wxLogTrace(_T("mousecapture"),
-               _T("After ReleaseMouse() mouse is captured by 0x%08x"),
-               GetCapture());
-}
-
 // ----------------------------------------------------------------------------
 // accelerators and menu hot keys
 // ----------------------------------------------------------------------------