Various changes to focus handling when TLW start.

Changed wxWindow::Clear() to use m_clearRegion.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15191 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-04-17 22:44:31 +00:00
parent 82550f2324
commit d7fa7eaa2d
17 changed files with 286 additions and 108 deletions

View File

@@ -1403,6 +1403,8 @@ void wxFileDialog::OnHome( wxCommandEvent &WXUNUSED(event) )
wxString dir; wxString dir;
m_list->GetDir( dir ); m_list->GetDir( dir );
m_static->SetLabel( dir ); m_static->SetLabel( dir );
m_text->SetFocus();
} }
void wxFileDialog::OnNew( wxCommandEvent &WXUNUSED(event) ) void wxFileDialog::OnNew( wxCommandEvent &WXUNUSED(event) )

View File

@@ -33,6 +33,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -206,6 +207,15 @@ void wxCheckBox::OnInternalIdle()
gdk_window_set_cursor( event_window, cursor.GetCursor() ); gdk_window_set_cursor( event_window, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -62,6 +62,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern bool g_blockEventsOnScroll; extern bool g_blockEventsOnScroll;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
static bool g_hasDoubleClicked = FALSE; static bool g_hasDoubleClicked = FALSE;
@@ -1023,6 +1024,15 @@ void wxListBox::OnInternalIdle()
} }
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -38,6 +38,7 @@ extern bool g_isIdle;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -455,7 +456,6 @@ void wxRadioBox::SetFocus()
} }
node = node->Next(); node = node->Next();
} }
} }
void wxRadioBox::SetSelection( int n ) void wxRadioBox::SetSelection( int n )
@@ -711,6 +711,15 @@ void wxRadioBox::OnInternalIdle()
(void)GetEventHandler()->ProcessEvent( event ); (void)GetEventHandler()->ProcessEvent( event );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
g_delayedFocus = NULL;
SetFocus();
}
}
} }
#endif // wxUSE_RADIOBOX #endif // wxUSE_RADIOBOX

View File

@@ -33,6 +33,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -219,6 +220,15 @@ void wxRadioButton::OnInternalIdle()
gdk_window_set_cursor( win, cursor.GetCursor() ); gdk_window_set_cursor( win, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -44,6 +44,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// helpers // helpers
@@ -1245,6 +1246,15 @@ void wxTextCtrl::OnInternalIdle()
gdk_window_set_cursor( window, cursor.GetCursor() ); gdk_window_set_cursor( window, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -21,9 +21,8 @@ extern void wxapp_install_idle_handler();
extern bool g_isIdle; extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk.
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb) static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{ {
if (g_isIdle) if (g_isIdle)

View File

@@ -46,11 +46,6 @@
extern void wxapp_install_idle_handler(); extern void wxapp_install_idle_handler();
extern bool g_isIdle; extern bool g_isIdle;
extern int g_openDialogs;
// ----------------------------------------------------------------------------
// event tables
// ----------------------------------------------------------------------------
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// data // data
@@ -58,6 +53,9 @@ extern int g_openDialogs;
extern wxList wxPendingDelete; extern wxList wxPendingDelete;
extern int g_openDialogs;
extern wxWindowGTK *g_delayedFocus;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// debug // debug
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -68,14 +66,6 @@ extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar
#endif #endif
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// GTK callbacks
// ----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "focus" from m_window // "focus" from m_window
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -164,6 +154,18 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WX
return FALSE; return FALSE;
} }
//-----------------------------------------------------------------------------
// local code
//-----------------------------------------------------------------------------
static wxWindow* wxGetTopLevelParent(wxWindow *win)
{
wxWindow *p = win;
while (p && !p->IsTopLevel())
p = p->GetParent();
return p;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "realize" from m_widget // "realize" from m_widget
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -200,8 +202,30 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *
win->SetIcons( iconsOld ); win->SetIcons( iconsOld );
} }
// we set the focus to the child that accepts the focus. this // We need to set the focus to some child. Either, this
// doesn't really have to be done in "realize" but why not? // has been done already or will be done in the next
// idle cycle, or we will set it ourselves.
if (g_delayedFocus)
{
if (wxGetTopLevelParent(g_delayedFocus))
return;
else
g_delayedFocus = NULL;
}
wxWindow *currentFocus = wxWindow::FindFocus();
if (currentFocus)
{
// I am not sure if this ever can happen,
// since the TLW is just about to get
// created and its children probably don't
// have any focus.
if (wxGetTopLevelParent(currentFocus) == win)
return;
}
// We set the focus to the child that accepts the focus.
wxWindowList::Node *node = win->GetChildren().GetFirst(); wxWindowList::Node *node = win->GetChildren().GetFirst();
while (node) while (node)
{ {

View File

@@ -232,13 +232,17 @@ static bool g_captureWindowHasMouse = FALSE;
// the last window which had the focus - this is normally never NULL (except // the last window which had the focus - this is normally never NULL (except
// if we never had focus at all) as even when g_focusWindow is NULL it still // if we never had focus at all) as even when g_focusWindow is NULL it still
// keeps its previous value // keeps its previous value
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK *)NULL; static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
// the frame that is currently active (i.e. its child has focus). It is // the frame that is currently active (i.e. its child has focus). It is
// used to generate wxActivateEvents // used to generate wxActivateEvents
static wxWindowGTK *g_activeFrame = (wxWindowGTK *)NULL; static wxWindowGTK *g_activeFrame = (wxWindowGTK*) NULL;
static bool g_activeFrameLostFocus = FALSE; static bool g_activeFrameLostFocus = FALSE;
// If a window get the focus set but has not been realized
// yet, defer setting the focus to idle time.
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
// if we detect that the app has got/lost the focus, we set this variable to // if we detect that the app has got/lost the focus, we set this variable to
// either TRUE or FALSE and an activate event will be sent during the next // either TRUE or FALSE and an activate event will be sent during the next
// OnIdle() call and it is reset to -1: this value means that we shouldn't // OnIdle() call and it is reset to -1: this value means that we shouldn't
@@ -534,8 +538,8 @@ static int gtk_window_expose_callback( GtkWidget *widget,
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
/* #if 0
if (win->GetName() == wxT("panel")) if (win->GetName())
{ {
wxPrintf( wxT("OnExpose from ") ); wxPrintf( wxT("OnExpose from ") );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -545,7 +549,7 @@ static int gtk_window_expose_callback( GtkWidget *widget,
(int)gdk_event->area.width, (int)gdk_event->area.width,
(int)gdk_event->area.height ); (int)gdk_event->area.height );
} }
*/ #endif
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA (widget); GtkPizza *pizza = GTK_PIZZA (widget);
@@ -635,8 +639,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
return; return;
} }
/* #if 0
if (win->GetName() == wxT("panel")) if (win->GetName())
{ {
wxPrintf( wxT("OnDraw from ") ); wxPrintf( wxT("OnDraw from ") );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -646,7 +650,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
(int)rect->width, (int)rect->width,
(int)rect->height ); (int)rect->height );
} }
*/ #endif
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA (widget); GtkPizza *pizza = GTK_PIZZA (widget);
@@ -1797,11 +1801,11 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
g_focusWindow = win; g_focusWindow = win;
#if 0 #if 0
wxLogDebug( wxT("OnSetFocus from %s\n"), win->GetName().c_str() ); printf( "OnSetFocus 2 from %s\n", win->GetName().c_str() );
#endif #endif
// notify the parent keeping track of focus for the kbd navigation // Notify the parent keeping track of focus for the kbd navigation
// purposes that we got it // purposes that we got it.
wxChildFocusEvent eventFocus(win); wxChildFocusEvent eventFocus(win);
(void)win->GetEventHandler()->ProcessEvent(eventFocus); (void)win->GetEventHandler()->ProcessEvent(eventFocus);
@@ -1819,6 +1823,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
} }
#endif // wxUSE_CARET #endif // wxUSE_CARET
g_activeFrameLostFocus = FALSE;
wxWindowGTK *active = wxGetTopLevelParent(win); wxWindowGTK *active = wxGetTopLevelParent(win);
if ( active != g_activeFrame ) if ( active != g_activeFrame )
{ {
@@ -1835,8 +1841,11 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId()); wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
event.SetEventObject(g_activeFrame); event.SetEventObject(g_activeFrame);
g_activeFrame->GetEventHandler()->ProcessEvent(event); g_activeFrame->GetEventHandler()->ProcessEvent(event);
// Don't send focus events in addition to activate
// if (win == g_activeFrame)
// return TRUE;
} }
g_activeFrameLostFocus = FALSE;
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
@@ -1848,7 +1857,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
@@ -2920,6 +2928,15 @@ void wxWindowGTK::OnInternalIdle()
g_activeFrameLostFocus = FALSE; g_activeFrameLostFocus = FALSE;
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
wxCursor cursor = m_cursor; wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor; if (g_globalCursor.Ok()) cursor = g_globalCursor;
@@ -3274,13 +3291,6 @@ void wxWindowGTK::SetFocus()
{ {
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") ); wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
#if 0
wxPrintf( "SetFocus from " );
if (GetClassInfo() && GetClassInfo()->GetClassName())
wxPrintf( GetClassInfo()->GetClassName() );
wxPrintf( ".\n" );
#endif
if (m_wxwindow) if (m_wxwindow)
{ {
if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow)) if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow))
@@ -3292,6 +3302,9 @@ void wxWindowGTK::SetFocus()
{ {
if (GTK_WIDGET_CAN_FOCUS(m_widget) && !GTK_WIDGET_HAS_FOCUS (m_widget) ) if (GTK_WIDGET_CAN_FOCUS(m_widget) && !GTK_WIDGET_HAS_FOCUS (m_widget) )
{ {
if (!GTK_WIDGET_REALIZED(m_widget))
g_delayedFocus = this;
else
gtk_widget_grab_focus (m_widget); gtk_widget_grab_focus (m_widget);
} }
else if (GTK_IS_CONTAINER(m_widget)) else if (GTK_IS_CONTAINER(m_widget))
@@ -3599,11 +3612,14 @@ void wxWindowGTK::Clear()
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window) if (m_wxwindow && m_wxwindow->window)
{ {
gdk_window_clear( m_wxwindow->window ); m_clearRegion.Clear();
wxSize size( GetClientSize() );
m_clearRegion.Union( 0,0,size.x,size.y );
// Better do this in idle?
Update();
} }
} }

View File

@@ -33,6 +33,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -206,6 +207,15 @@ void wxCheckBox::OnInternalIdle()
gdk_window_set_cursor( event_window, cursor.GetCursor() ); gdk_window_set_cursor( event_window, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -62,6 +62,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern bool g_blockEventsOnScroll; extern bool g_blockEventsOnScroll;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
static bool g_hasDoubleClicked = FALSE; static bool g_hasDoubleClicked = FALSE;
@@ -1023,6 +1024,15 @@ void wxListBox::OnInternalIdle()
} }
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -38,6 +38,7 @@ extern bool g_isIdle;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -455,7 +456,6 @@ void wxRadioBox::SetFocus()
} }
node = node->Next(); node = node->Next();
} }
} }
void wxRadioBox::SetSelection( int n ) void wxRadioBox::SetSelection( int n )
@@ -711,6 +711,15 @@ void wxRadioBox::OnInternalIdle()
(void)GetEventHandler()->ProcessEvent( event ); (void)GetEventHandler()->ProcessEvent( event );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
g_delayedFocus = NULL;
SetFocus();
}
}
} }
#endif // wxUSE_RADIOBOX #endif // wxUSE_RADIOBOX

View File

@@ -33,6 +33,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" // "clicked"
@@ -219,6 +220,15 @@ void wxRadioButton::OnInternalIdle()
gdk_window_set_cursor( win, cursor.GetCursor() ); gdk_window_set_cursor( win, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -44,6 +44,7 @@ extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// helpers // helpers
@@ -1245,6 +1246,15 @@ void wxTextCtrl::OnInternalIdle()
gdk_window_set_cursor( window, cursor.GetCursor() ); gdk_window_set_cursor( window, cursor.GetCursor() );
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
UpdateWindowUI(); UpdateWindowUI();
} }

View File

@@ -21,9 +21,8 @@ extern void wxapp_install_idle_handler();
extern bool g_isIdle; extern bool g_isIdle;
extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnDrag;
extern wxCursor g_globalCursor; extern wxCursor g_globalCursor;
extern wxWindowGTK *g_delayedFocus;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk.
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb) static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{ {
if (g_isIdle) if (g_isIdle)

View File

@@ -46,11 +46,6 @@
extern void wxapp_install_idle_handler(); extern void wxapp_install_idle_handler();
extern bool g_isIdle; extern bool g_isIdle;
extern int g_openDialogs;
// ----------------------------------------------------------------------------
// event tables
// ----------------------------------------------------------------------------
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// data // data
@@ -58,6 +53,9 @@ extern int g_openDialogs;
extern wxList wxPendingDelete; extern wxList wxPendingDelete;
extern int g_openDialogs;
extern wxWindowGTK *g_delayedFocus;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// debug // debug
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -68,14 +66,6 @@ extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar
#endif #endif
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// GTK callbacks
// ----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "focus" from m_window // "focus" from m_window
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -164,6 +154,18 @@ gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *WX
return FALSE; return FALSE;
} }
//-----------------------------------------------------------------------------
// local code
//-----------------------------------------------------------------------------
static wxWindow* wxGetTopLevelParent(wxWindow *win)
{
wxWindow *p = win;
while (p && !p->IsTopLevel())
p = p->GetParent();
return p;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "realize" from m_widget // "realize" from m_widget
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -200,8 +202,30 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), wxTopLevelWindowGTK *
win->SetIcons( iconsOld ); win->SetIcons( iconsOld );
} }
// we set the focus to the child that accepts the focus. this // We need to set the focus to some child. Either, this
// doesn't really have to be done in "realize" but why not? // has been done already or will be done in the next
// idle cycle, or we will set it ourselves.
if (g_delayedFocus)
{
if (wxGetTopLevelParent(g_delayedFocus))
return;
else
g_delayedFocus = NULL;
}
wxWindow *currentFocus = wxWindow::FindFocus();
if (currentFocus)
{
// I am not sure if this ever can happen,
// since the TLW is just about to get
// created and its children probably don't
// have any focus.
if (wxGetTopLevelParent(currentFocus) == win)
return;
}
// We set the focus to the child that accepts the focus.
wxWindowList::Node *node = win->GetChildren().GetFirst(); wxWindowList::Node *node = win->GetChildren().GetFirst();
while (node) while (node)
{ {

View File

@@ -232,13 +232,17 @@ static bool g_captureWindowHasMouse = FALSE;
// the last window which had the focus - this is normally never NULL (except // the last window which had the focus - this is normally never NULL (except
// if we never had focus at all) as even when g_focusWindow is NULL it still // if we never had focus at all) as even when g_focusWindow is NULL it still
// keeps its previous value // keeps its previous value
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK *)NULL; static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
// the frame that is currently active (i.e. its child has focus). It is // the frame that is currently active (i.e. its child has focus). It is
// used to generate wxActivateEvents // used to generate wxActivateEvents
static wxWindowGTK *g_activeFrame = (wxWindowGTK *)NULL; static wxWindowGTK *g_activeFrame = (wxWindowGTK*) NULL;
static bool g_activeFrameLostFocus = FALSE; static bool g_activeFrameLostFocus = FALSE;
// If a window get the focus set but has not been realized
// yet, defer setting the focus to idle time.
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
// if we detect that the app has got/lost the focus, we set this variable to // if we detect that the app has got/lost the focus, we set this variable to
// either TRUE or FALSE and an activate event will be sent during the next // either TRUE or FALSE and an activate event will be sent during the next
// OnIdle() call and it is reset to -1: this value means that we shouldn't // OnIdle() call and it is reset to -1: this value means that we shouldn't
@@ -534,8 +538,8 @@ static int gtk_window_expose_callback( GtkWidget *widget,
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
/* #if 0
if (win->GetName() == wxT("panel")) if (win->GetName())
{ {
wxPrintf( wxT("OnExpose from ") ); wxPrintf( wxT("OnExpose from ") );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -545,7 +549,7 @@ static int gtk_window_expose_callback( GtkWidget *widget,
(int)gdk_event->area.width, (int)gdk_event->area.width,
(int)gdk_event->area.height ); (int)gdk_event->area.height );
} }
*/ #endif
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA (widget); GtkPizza *pizza = GTK_PIZZA (widget);
@@ -635,8 +639,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
return; return;
} }
/* #if 0
if (win->GetName() == wxT("panel")) if (win->GetName())
{ {
wxPrintf( wxT("OnDraw from ") ); wxPrintf( wxT("OnDraw from ") );
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -646,7 +650,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
(int)rect->width, (int)rect->width,
(int)rect->height ); (int)rect->height );
} }
*/ #endif
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
GtkPizza *pizza = GTK_PIZZA (widget); GtkPizza *pizza = GTK_PIZZA (widget);
@@ -1797,11 +1801,11 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
g_focusWindow = win; g_focusWindow = win;
#if 0 #if 0
wxLogDebug( wxT("OnSetFocus from %s\n"), win->GetName().c_str() ); printf( "OnSetFocus 2 from %s\n", win->GetName().c_str() );
#endif #endif
// notify the parent keeping track of focus for the kbd navigation // Notify the parent keeping track of focus for the kbd navigation
// purposes that we got it // purposes that we got it.
wxChildFocusEvent eventFocus(win); wxChildFocusEvent eventFocus(win);
(void)win->GetEventHandler()->ProcessEvent(eventFocus); (void)win->GetEventHandler()->ProcessEvent(eventFocus);
@@ -1819,6 +1823,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
} }
#endif // wxUSE_CARET #endif // wxUSE_CARET
g_activeFrameLostFocus = FALSE;
wxWindowGTK *active = wxGetTopLevelParent(win); wxWindowGTK *active = wxGetTopLevelParent(win);
if ( active != g_activeFrame ) if ( active != g_activeFrame )
{ {
@@ -1835,8 +1841,11 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId()); wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
event.SetEventObject(g_activeFrame); event.SetEventObject(g_activeFrame);
g_activeFrame->GetEventHandler()->ProcessEvent(event); g_activeFrame->GetEventHandler()->ProcessEvent(event);
// Don't send focus events in addition to activate
// if (win == g_activeFrame)
// return TRUE;
} }
g_activeFrameLostFocus = FALSE;
wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() );
@@ -1848,7 +1857,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
@@ -2920,6 +2928,15 @@ void wxWindowGTK::OnInternalIdle()
g_activeFrameLostFocus = FALSE; g_activeFrameLostFocus = FALSE;
} }
if (g_delayedFocus == this)
{
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_grab_focus( m_widget );
g_delayedFocus = NULL;
}
}
wxCursor cursor = m_cursor; wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor; if (g_globalCursor.Ok()) cursor = g_globalCursor;
@@ -3274,13 +3291,6 @@ void wxWindowGTK::SetFocus()
{ {
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") ); wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
#if 0
wxPrintf( "SetFocus from " );
if (GetClassInfo() && GetClassInfo()->GetClassName())
wxPrintf( GetClassInfo()->GetClassName() );
wxPrintf( ".\n" );
#endif
if (m_wxwindow) if (m_wxwindow)
{ {
if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow)) if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow))
@@ -3292,6 +3302,9 @@ void wxWindowGTK::SetFocus()
{ {
if (GTK_WIDGET_CAN_FOCUS(m_widget) && !GTK_WIDGET_HAS_FOCUS (m_widget) ) if (GTK_WIDGET_CAN_FOCUS(m_widget) && !GTK_WIDGET_HAS_FOCUS (m_widget) )
{ {
if (!GTK_WIDGET_REALIZED(m_widget))
g_delayedFocus = this;
else
gtk_widget_grab_focus (m_widget); gtk_widget_grab_focus (m_widget);
} }
else if (GTK_IS_CONTAINER(m_widget)) else if (GTK_IS_CONTAINER(m_widget))
@@ -3599,11 +3612,14 @@ void wxWindowGTK::Clear()
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window) if (m_wxwindow && m_wxwindow->window)
{ {
gdk_window_clear( m_wxwindow->window ); m_clearRegion.Clear();
wxSize size( GetClientSize() );
m_clearRegion.Union( 0,0,size.x,size.y );
// Better do this in idle?
Update();
} }
} }