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 );
// 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;
// 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;
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
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 );
// 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;
// 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;
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
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 );
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
// 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();
// 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();
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;
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());
+}
+
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;
AdjustEventButtonState(event);
// wxListBox actually get mouse events from the item
-
+
if (win->m_isListBox)
{
event.m_x += widget->allocation.x;
m_noExpose = FALSE;
m_nativeSizeEvent = FALSE;
-
+
m_hasScrolling = FALSE;
m_isScrolling = FALSE;
if (m_parent)
m_parent->DoAddChild( this );
-
+
m_focusWidget = m_wxwindow;
PostCreation();
void wxWindowGTK::PostCreation()
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
-
+
if (m_wxwindow)
{
if (!m_noExpose)
dx = pizza->xoffset;
dy = pizza->yoffset;
}
-
+
if (x) (*x) = m_x - dx;
if (y) (*y) = m_y - dy;
}
// ?
}
}
-
+
#if 0
wxPrintf( "SetFocus finished in " );
if (GetClassInfo() && GetClassInfo()->GetClassName())
return TRUE;
}
-void wxWindowGTK::CaptureMouse()
+void wxWindowGTK::DoCaptureMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
g_captureWindowHasMouse = TRUE;
}
-void wxWindowGTK::ReleaseMouse()
+void wxWindowGTK::DoReleaseMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
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;
AdjustEventButtonState(event);
// wxListBox actually get mouse events from the item
-
+
if (win->m_isListBox)
{
event.m_x += widget->allocation.x;
m_noExpose = FALSE;
m_nativeSizeEvent = FALSE;
-
+
m_hasScrolling = FALSE;
m_isScrolling = FALSE;
if (m_parent)
m_parent->DoAddChild( this );
-
+
m_focusWidget = m_wxwindow;
PostCreation();
void wxWindowGTK::PostCreation()
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
-
+
if (m_wxwindow)
{
if (!m_noExpose)
dx = pizza->xoffset;
dy = pizza->yoffset;
}
-
+
if (x) (*x) = m_x - dx;
if (y) (*y) = m_y - dy;
}
// ?
}
}
-
+
#if 0
wxPrintf( "SetFocus finished in " );
if (GetClassInfo() && GetClassInfo()->GetClassName())
return TRUE;
}
-void wxWindowGTK::CaptureMouse()
+void wxWindowGTK::DoCaptureMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
g_captureWindowHasMouse = TRUE;
}
-void wxWindowGTK::ReleaseMouse()
+void wxWindowGTK::DoReleaseMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
return wxGetWindowText(GetHWND());
}
-void wxWindowMSW::CaptureMouse()
+void wxWindowMSW::DoCaptureMouse()
{
HWND hWnd = GetHwnd();
if ( hWnd )
}
}
-void wxWindowMSW::ReleaseMouse()
+void wxWindowMSW::DoReleaseMouse()
{
if ( !::ReleaseCapture() )
{
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
// ----------------------------------------------------------------------------