implemented captured windows stack

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-09-24 18:02:11 +00:00
parent d08e6e59ed
commit cc1e14d625
2 changed files with 84 additions and 28 deletions

View File

@@ -208,6 +208,7 @@ extern wxCursor g_globalCursor;
// inside it // inside it
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
static bool g_captureWindowHasMouse = FALSE; static bool g_captureWindowHasMouse = FALSE;
static wxWindowList g_capturedWindows;
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL; /* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
@@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
wxWindowGTK::~wxWindowGTK() wxWindowGTK::~wxWindowGTK()
{ {
wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") );
if (g_focusWindow == this) if (g_focusWindow == this)
g_focusWindow = NULL; g_focusWindow = NULL;
@@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font )
return TRUE; return TRUE;
} }
void wxWindowGTK::CaptureMouse() static void wxDoCaptureMouse(wxWindowGTK *wnd)
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (wnd->m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
else else
window = GetConnectWidget()->window; window = wnd->GetConnectWidget()->window;
wxCHECK_RET( window, _T("CaptureMouse() failed") ); wxCHECK_RET( window, _T("CaptureMouse() failed") );
wxCursor* cursor = & m_cursor; wxCursor* cursor = &wnd->GetCursor();
if (!cursor->Ok()) if (!cursor->Ok())
cursor = wxSTANDARD_CURSOR; cursor = wxSTANDARD_CURSOR;
@@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse()
(GdkWindow *) NULL, (GdkWindow *) NULL,
cursor->GetCursor(), cursor->GetCursor(),
(guint32)GDK_CURRENT_TIME ); (guint32)GDK_CURRENT_TIME );
g_captureWindow = this; g_captureWindow = wnd;
g_captureWindowHasMouse = TRUE; g_captureWindowHasMouse = TRUE;
wxLogDebug("captured %p", wnd);
} }
void wxWindowGTK::ReleaseMouse() static void wxDoReleaseMouse(wxWindowGTK *wnd)
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxLogDebug("trying to release %p", wnd);
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") ); wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (wnd->m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
else else
window = GetConnectWidget()->window; window = wnd->GetConnectWidget()->window;
if (!window) if (!window)
return; return;
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME ); gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
g_captureWindow = (wxWindowGTK*) NULL; g_captureWindow = (wxWindowGTK*) NULL;
wxLogDebug("released %p", wnd);
}
void wxWindowGTK::CaptureMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
wxLogDebug("CAPTURE %p", this);
wxWindowList::Node *last = g_capturedWindows.GetLast();
if (last)
wxDoReleaseMouse(last->GetData());
g_capturedWindows.Append(this);
wxDoCaptureMouse(this);
}
void wxWindowGTK::ReleaseMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
wxLogDebug("RELEASE %p", this);
wxDoReleaseMouse(this);
g_capturedWindows.DeleteObject(this);
wxWindowList::Node *last = g_capturedWindows.GetLast();
if (last)
wxDoCaptureMouse(last->GetData());
} }
/* static */ /* static */

View File

@@ -208,6 +208,7 @@ extern wxCursor g_globalCursor;
// inside it // inside it
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
static bool g_captureWindowHasMouse = FALSE; static bool g_captureWindowHasMouse = FALSE;
static wxWindowList g_capturedWindows;
/* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL; /* extern */ wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL;
@@ -2474,6 +2475,8 @@ bool wxWindowGTK::Create( wxWindow *parent,
wxWindowGTK::~wxWindowGTK() wxWindowGTK::~wxWindowGTK()
{ {
wxASSERT_MSG( g_capturedWindows.IndexOf(this) == wxNOT_FOUND, wxT("trying to destroy window that didn't release focus") );
if (g_focusWindow == this) if (g_focusWindow == this)
g_focusWindow = NULL; g_focusWindow = NULL;
@@ -3751,19 +3754,17 @@ bool wxWindowGTK::SetFont( const wxFont &font )
return TRUE; return TRUE;
} }
void wxWindowGTK::CaptureMouse() static void wxDoCaptureMouse(wxWindowGTK *wnd)
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (wnd->m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
else else
window = GetConnectWidget()->window; window = wnd->GetConnectWidget()->window;
wxCHECK_RET( window, _T("CaptureMouse() failed") ); wxCHECK_RET( window, _T("CaptureMouse() failed") );
wxCursor* cursor = & m_cursor; wxCursor* cursor = &wnd->GetCursor();
if (!cursor->Ok()) if (!cursor->Ok())
cursor = wxSTANDARD_CURSOR; cursor = wxSTANDARD_CURSOR;
@@ -3776,27 +3777,54 @@ void wxWindowGTK::CaptureMouse()
(GdkWindow *) NULL, (GdkWindow *) NULL,
cursor->GetCursor(), cursor->GetCursor(),
(guint32)GDK_CURRENT_TIME ); (guint32)GDK_CURRENT_TIME );
g_captureWindow = this; g_captureWindow = wnd;
g_captureWindowHasMouse = TRUE; g_captureWindowHasMouse = TRUE;
wxLogDebug("captured %p", wnd);
} }
void wxWindowGTK::ReleaseMouse() static void wxDoReleaseMouse(wxWindowGTK *wnd)
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxLogDebug("trying to release %p", wnd);
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") ); wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow) if (wnd->m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window; window = GTK_PIZZA(wnd->m_wxwindow)->bin_window;
else else
window = GetConnectWidget()->window; window = wnd->GetConnectWidget()->window;
if (!window) if (!window)
return; return;
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME ); gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
g_captureWindow = (wxWindowGTK*) NULL; g_captureWindow = (wxWindowGTK*) NULL;
wxLogDebug("released %p", wnd);
}
void wxWindowGTK::CaptureMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
wxLogDebug("CAPTURE %p", this);
wxWindowList::Node *last = g_capturedWindows.GetLast();
if (last)
wxDoReleaseMouse(last->GetData());
g_capturedWindows.Append(this);
wxDoCaptureMouse(this);
}
void wxWindowGTK::ReleaseMouse()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
wxLogDebug("RELEASE %p", this);
wxDoReleaseMouse(this);
g_capturedWindows.DeleteObject(this);
wxWindowList::Node *last = g_capturedWindows.GetLast();
if (last)
wxDoCaptureMouse(last->GetData());
} }
/* static */ /* static */