From 58ec225526177917a3806c6cd394ab56d18280e1 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 22 Apr 2002 14:33:07 +0000 Subject: [PATCH] Added some missing wxTextCtrl features to to-do list in wxX11's readme.txt Made the wxTipDialog fonts all Swiss (TODO: use current GUI setting for the font family) Worked around focus anomaly by suppressing parent's FocusIn event when child's focus is being set by clicking on it (TODO: move some of this to SetFocus() to make it work programmatically) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15237 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/x11/readme.txt | 4 +++- samples/widgets/widgets.cpp | 1 + src/generic/tipdlg.cpp | 5 ++-- src/x11/app.cpp | 46 +++++++++++++++++++++++++------------ src/x11/window.cpp | 13 ++++++----- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/docs/x11/readme.txt b/docs/x11/readme.txt index 60e1a43969..9e2d595a26 100644 --- a/docs/x11/readme.txt +++ b/docs/x11/readme.txt @@ -55,9 +55,11 @@ Many of the samples are running. Some remaining issues: - some refresh efficiency issues -- progress dialog not working (see dialogs sample) - clipboard implementation missing - drag and drop implementation missing +- wxX11's wxTextCtrl (separate from wxUniv version) + needs some work, for example to remove vertical scrollbar, + and to provide wordwrap - wxToggleButton implementation missing - wxSpinCtrl implementation missing - tooltips implementation missing diff --git a/samples/widgets/widgets.cpp b/samples/widgets/widgets.cpp index af1bb21272..b6595732cf 100644 --- a/samples/widgets/widgets.cpp +++ b/samples/widgets/widgets.cpp @@ -218,6 +218,7 @@ bool WidgetsApp::OnInit() //wxLog::AddTraceMask(_T("listbox")); //wxLog::AddTraceMask(_T("scrollbar")); + //wxLog::AddTraceMask(_T("focus")); return TRUE; } diff --git a/src/generic/tipdlg.cpp b/src/generic/tipdlg.cpp index c13b869e2b..d1ce8278e0 100644 --- a/src/generic/tipdlg.cpp +++ b/src/generic/tipdlg.cpp @@ -188,12 +188,13 @@ wxTipDialog::wxTipDialog(wxWindow *parent, wxDefaultPosition, wxSize(200, 160), wxTE_MULTILINE | wxTE_READONLY | + wxTE_NO_VSCROLL | wxTE_RICH | // a hack to get rid of vert scrollbar wxSUNKEN_BORDER); #if defined(__WXMSW__) - m_text->SetFont(wxFont(12, wxROMAN, wxNORMAL, wxNORMAL)); + m_text->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL)); #else - m_text->SetFont(wxFont(14, wxROMAN, wxNORMAL, wxNORMAL)); + m_text->SetFont(wxFont(14, wxSWISS, wxNORMAL, wxNORMAL)); #endif wxIcon icon = wxArtProvider::GetIcon(wxART_TIP, wxART_CMN_DIALOG); diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 050ac895fb..46eeb9379a 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -568,9 +568,9 @@ bool wxApp::ProcessXEvent(WXEvent* _event) { printf( "GraphicExpose event\n" ); - // wxLogDebug( "GraphicsExpose from %s", win->GetName().c_str(), - // event->xgraphicsexpose.x, event->xgraphicsexpose.y, - // event->xgraphicsexpose.width, event->xgraphicsexpose.height); + wxLogTrace( _T("expose"), _T("GraphicsExpose from %s"), win->GetName().c_str(), + event->xgraphicsexpose.x, event->xgraphicsexpose.y, + event->xgraphicsexpose.width, event->xgraphicsexpose.height); win->GetUpdateRegion().Union( event->xgraphicsexpose.x, event->xgraphicsexpose.y, event->xgraphicsexpose.width, event->xgraphicsexpose.height); @@ -758,6 +758,15 @@ bool wxApp::ProcessXEvent(WXEvent* _event) g_prevFocus = wxWindow::FindFocus(); g_nextFocus = win; + wxLogTrace( _T("focus"), _T("About to call SetFocus on %s of type %s due to button press"), win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); + + // Record the fact that this window is + // getting the focus, because we'll need to + // check if its parent is getting a bogus + // focus and duly ignore it. + // TODO: may need to have this code in SetFocus, too. + extern wxWindow* g_GettingFocus; + g_GettingFocus = win; win->SetFocus(); } } @@ -781,19 +790,26 @@ bool wxApp::ProcessXEvent(WXEvent* _event) (event->xfocus.mode == NotifyNormal)) #endif { - // wxLogDebug( "FocusIn from %s of type %s", win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); -#if 0 - wxString msg; - msg.Printf( "FocusIn from %s of type %s\n", win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); - printf(msg.c_str()); -#endif + wxLogTrace( _T("focus"), _T("FocusIn from %s of type %s"), win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); - wxFocusEvent focusEvent(wxEVT_SET_FOCUS, win->GetId()); - focusEvent.SetEventObject(win); - focusEvent.SetWindow( g_prevFocus ); - g_prevFocus = NULL; + extern wxWindow* g_GettingFocus; + if (g_GettingFocus && g_GettingFocus->GetParent() == win) + { + // Ignore this, this can be a spurious FocusIn + // caused by a child having its focus set. + g_GettingFocus = NULL; + wxLogTrace( _T("focus"), _T("FocusIn from %s of type %s being deliberately ignored"), win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); + return TRUE; + } + else + { + wxFocusEvent focusEvent(wxEVT_SET_FOCUS, win->GetId()); + focusEvent.SetEventObject(win); + focusEvent.SetWindow( g_prevFocus ); + g_prevFocus = NULL; - return win->GetEventHandler()->ProcessEvent(focusEvent); + return win->GetEventHandler()->ProcessEvent(focusEvent); + } } return FALSE; break; @@ -805,7 +821,7 @@ bool wxApp::ProcessXEvent(WXEvent* _event) (event->xfocus.mode == NotifyNormal)) #endif { - // wxLogDebug( "FocusOut from %s of type %s", win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); + wxLogTrace( _T("focus"), _T("FocusOut from %s of type %s"), win->GetName().c_str(), win->GetClassInfo()->GetClassName() ); wxFocusEvent focusEvent(wxEVT_KILL_FOCUS, win->GetId()); focusEvent.SetEventObject(win); diff --git a/src/x11/window.cpp b/src/x11/window.cpp index b04be864eb..9fa7e4d83f 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -386,18 +386,15 @@ void wxWindowX11::SetFocus() if (wxWindowIsVisible(xwindow)) { - XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime ); + wxLogTrace( _T("focus"), _T("wxWindowX11::SetFocus: %s"), GetClassInfo()->GetClassName()); + // XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime ); + XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToNone, CurrentTime ); m_needsInputFocus = FALSE; } else { m_needsInputFocus = TRUE; } -#if 0 - wxString msg; - msg.Printf("SetFocus: %s\n", GetClassInfo()->GetClassName()); - printf(msg.c_str()); -#endif } // Get the window with the focus @@ -1225,6 +1222,9 @@ void wxWindowX11::OnSysColourChanged(wxSysColourChangedEvent& event) } } +// See handler for InFocus case in app.cpp for details. +wxWindow* g_GettingFocus = NULL; + void wxWindowX11::OnInternalIdle() { // Update invalidated regions. @@ -1247,6 +1247,7 @@ void wxWindowX11::OnInternalIdle() // no point in trying again. m_needsInputFocus = FALSE; } + g_GettingFocus = NULL; } // ---------------------------------------------------------------------------- -- 2.45.2