From fc71ef6e179ee4c0dc289d025b34ba045e29d919 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 26 Mar 2001 14:49:27 +0000 Subject: [PATCH] Added focus in/out handlers for wxTextCtrl git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9584 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/textctrl.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++ src/gtk/window.cpp | 3 +- src/gtk1/textctrl.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++ src/gtk1/window.cpp | 3 +- 4 files changed, 254 insertions(+), 2 deletions(-) diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 6194b622bc..ee8855a367 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -16,6 +16,7 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/settings.h" +#include "wx/panel.h" #include #include @@ -75,6 +76,116 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) win->CalculateScrollbar(); } +//----------------------------------------------------------------------------- +// "focus_in_event" +//----------------------------------------------------------------------------- + +wxWindow *FindFocusedChild(wxWindow *win); +extern wxWindow *g_focusWindow; +extern bool g_blockEventsOnDrag; +// extern bool g_isIdle; + +static gint gtk_text_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) +{ + // Necessary? +#if 0 + if (g_isIdle) + wxapp_install_idle_handler(); +#endif + if (!win->m_hasVMT) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + + g_focusWindow = win; + + wxPanel *panel = wxDynamicCast(win->GetParent(), wxPanel); + if (panel) + { + panel->SetLastFocus(win); + } + +#ifdef HAVE_XIM + if (win->m_ic) + gdk_im_begin(win->m_ic, win->m_wxwindow->window); +#endif + +#if 0 +#ifdef wxUSE_CARET + // caret needs to be informed about focus change + wxCaret *caret = win->GetCaret(); + if ( caret ) + { + caret->OnSetFocus(); + } +#endif // wxUSE_CARET +#endif + + wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); + event.SetEventObject( win ); + + if (win->GetEventHandler()->ProcessEvent( event )) + { + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" ); + return TRUE; + } + + return FALSE; +} + +//----------------------------------------------------------------------------- +// "focus_out_event" +//----------------------------------------------------------------------------- + +static gint gtk_text_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) +{ +#if 0 + if (g_isIdle) + wxapp_install_idle_handler(); +#endif + + if (!win->m_hasVMT) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + +#if 0 + // if the focus goes out of our app alltogether, OnIdle() will send + // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset + // g_sendActivateEvent to -1 + g_sendActivateEvent = 0; +#endif + + wxWindow *winFocus = FindFocusedChild(win); + if ( winFocus ) + win = winFocus; + + g_focusWindow = (wxWindow *)NULL; + +#ifdef HAVE_XIM + if (win->m_ic) + gdk_im_end(); +#endif + +#if 0 +#ifdef wxUSE_CARET + // caret needs to be informed about focus change + wxCaret *caret = win->GetCaret(); + if ( caret ) + { + caret->OnKillFocus(); + } +#endif // wxUSE_CARET +#endif + + wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); + event.SetEventObject( win ); + + if (win->GetEventHandler()->ProcessEvent( event )) + { + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" ); + return TRUE; + } + + return FALSE; +} + //----------------------------------------------------------------------------- // wxTextCtrl //----------------------------------------------------------------------------- @@ -224,6 +335,20 @@ bool wxTextCtrl::Create( wxWindow *parent, { gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); + } + else + { + gtk_signal_connect( GTK_OBJECT(m_text), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(m_text), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); } if (!value.IsEmpty()) diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 02d5fb9d35..753c10c86d 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -322,7 +322,8 @@ extern bool g_isIdle; //----------------------------------------------------------------------------- // returns the child of win which currently has focus or NULL if not found -static wxWindow *FindFocusedChild(wxWindow *win) +// Note: can't be static, needed by textctrl.cpp. +/* static */ wxWindow *FindFocusedChild(wxWindow *win) { wxWindow *winFocus = wxWindow::FindFocus(); if ( !winFocus ) diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 6194b622bc..ee8855a367 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -16,6 +16,7 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/settings.h" +#include "wx/panel.h" #include #include @@ -75,6 +76,116 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) win->CalculateScrollbar(); } +//----------------------------------------------------------------------------- +// "focus_in_event" +//----------------------------------------------------------------------------- + +wxWindow *FindFocusedChild(wxWindow *win); +extern wxWindow *g_focusWindow; +extern bool g_blockEventsOnDrag; +// extern bool g_isIdle; + +static gint gtk_text_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) +{ + // Necessary? +#if 0 + if (g_isIdle) + wxapp_install_idle_handler(); +#endif + if (!win->m_hasVMT) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + + g_focusWindow = win; + + wxPanel *panel = wxDynamicCast(win->GetParent(), wxPanel); + if (panel) + { + panel->SetLastFocus(win); + } + +#ifdef HAVE_XIM + if (win->m_ic) + gdk_im_begin(win->m_ic, win->m_wxwindow->window); +#endif + +#if 0 +#ifdef wxUSE_CARET + // caret needs to be informed about focus change + wxCaret *caret = win->GetCaret(); + if ( caret ) + { + caret->OnSetFocus(); + } +#endif // wxUSE_CARET +#endif + + wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); + event.SetEventObject( win ); + + if (win->GetEventHandler()->ProcessEvent( event )) + { + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" ); + return TRUE; + } + + return FALSE; +} + +//----------------------------------------------------------------------------- +// "focus_out_event" +//----------------------------------------------------------------------------- + +static gint gtk_text_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) +{ +#if 0 + if (g_isIdle) + wxapp_install_idle_handler(); +#endif + + if (!win->m_hasVMT) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + +#if 0 + // if the focus goes out of our app alltogether, OnIdle() will send + // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset + // g_sendActivateEvent to -1 + g_sendActivateEvent = 0; +#endif + + wxWindow *winFocus = FindFocusedChild(win); + if ( winFocus ) + win = winFocus; + + g_focusWindow = (wxWindow *)NULL; + +#ifdef HAVE_XIM + if (win->m_ic) + gdk_im_end(); +#endif + +#if 0 +#ifdef wxUSE_CARET + // caret needs to be informed about focus change + wxCaret *caret = win->GetCaret(); + if ( caret ) + { + caret->OnKillFocus(); + } +#endif // wxUSE_CARET +#endif + + wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); + event.SetEventObject( win ); + + if (win->GetEventHandler()->ProcessEvent( event )) + { + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" ); + return TRUE; + } + + return FALSE; +} + //----------------------------------------------------------------------------- // wxTextCtrl //----------------------------------------------------------------------------- @@ -224,6 +335,20 @@ bool wxTextCtrl::Create( wxWindow *parent, { gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); + } + else + { + gtk_signal_connect( GTK_OBJECT(m_text), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(m_text), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); } if (!value.IsEmpty()) diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 02d5fb9d35..753c10c86d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -322,7 +322,8 @@ extern bool g_isIdle; //----------------------------------------------------------------------------- // returns the child of win which currently has focus or NULL if not found -static wxWindow *FindFocusedChild(wxWindow *win) +// Note: can't be static, needed by textctrl.cpp. +/* static */ wxWindow *FindFocusedChild(wxWindow *win) { wxWindow *winFocus = wxWindow::FindFocus(); if ( !winFocus ) -- 2.45.2