Added wxWindow::GTKHandleRealized() virtual method to wxGTK.

This allows to easily do something in the derived classes when the widget is
realized, without having to deal with GTK+ signals. In particular, get rid of
another "realize" signal handler in wxTopLevelWindow and simply override this
virtual method there.

It also incidentally makes the callback code simpler as the window doesn't
need to be constantly dereferenced.

This shouldn't result in any changes to behaviour.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69390 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-10-12 16:22:14 +00:00
parent f854ecb5a8
commit 612515aff1
4 changed files with 38 additions and 30 deletions

View File

@@ -95,6 +95,8 @@ public:
// GTK callbacks // GTK callbacks
virtual void OnInternalIdle(); virtual void OnInternalIdle();
virtual void GTKHandleRealized();
// do *not* call this to iconize the frame, this is a private function! // do *not* call this to iconize the frame, this is a private function!
void SetIconizeState(bool iconic); void SetIconizeState(bool iconic);

View File

@@ -187,6 +187,10 @@ public:
void GTKHandleFocusOutNoDeferring(); void GTKHandleFocusOutNoDeferring();
static void GTKHandleDeferredFocusOut(); static void GTKHandleDeferredFocusOut();
// Called when m_widget becomes realized. Derived classes must call the
// base class method if they override it.
virtual void GTKHandleRealized();
protected: protected:
// for controls composed of multiple GTK widgets, return true to eliminate // for controls composed of multiple GTK widgets, return true to eliminate
// spurious focus events if the focus changes between GTK+ children within // spurious focus events if the focus changes between GTK+ children within

View File

@@ -308,32 +308,30 @@ gtk_frame_configure_callback( GtkWidget* widget,
// we cannot the WM hints and icons before the widget has been realized, // we cannot the WM hints and icons before the widget has been realized,
// so we do this directly after realization // so we do this directly after realization
extern "C" { void wxTopLevelWindowGTK::GTKHandleRealized()
static void
gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget),
wxTopLevelWindowGTK *win )
{ {
gdk_window_set_decorations(gtk_widget_get_window(win->m_widget), wxNonOwnedWindow::GTKHandleRealized();
(GdkWMDecoration)win->m_gdkDecor);
gdk_window_set_functions(gtk_widget_get_window(win->m_widget), gdk_window_set_decorations(gtk_widget_get_window(m_widget),
(GdkWMFunction)win->m_gdkFunc); (GdkWMDecoration)m_gdkDecor);
gdk_window_set_functions(gtk_widget_get_window(m_widget),
(GdkWMFunction)m_gdkFunc);
// GTK's shrinking/growing policy // GTK's shrinking/growing policy
if ( !(win->m_gdkFunc & GDK_FUNC_RESIZE) ) if ( !(m_gdkFunc & GDK_FUNC_RESIZE) )
gtk_window_set_resizable(GTK_WINDOW(win->m_widget), FALSE); gtk_window_set_resizable(GTK_WINDOW(m_widget), FALSE);
#if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) #if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED)
else else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
#endif #endif
const wxIconBundle& icons = win->GetIcons(); const wxIconBundle& icons = GetIcons();
if (icons.GetIconCount()) if (icons.GetIconCount())
win->SetIcons(icons); SetIcons(icons);
if (win->HasFlag(wxFRAME_SHAPED)) if (win->HasFlag(wxFRAME_SHAPED))
win->SetShape(win->m_shape); // it will really set the window shape now win->SetShape(win->m_shape); // it will really set the window shape now
} }
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "map_event" from m_widget // "map_event" from m_widget
@@ -632,11 +630,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
gtk_widget_set_uposition( m_widget, m_x, m_y ); gtk_widget_set_uposition( m_widget, m_x, m_y );
#endif #endif
// we cannot set MWM hints and icons before the widget has
// been realized, so we do this directly after realization
g_signal_connect (m_widget, "realize",
G_CALLBACK (gtk_frame_realized_callback), this);
// for some reported size corrections // for some reported size corrections
g_signal_connect (m_widget, "map_event", g_signal_connect (m_widget, "map_event",
G_CALLBACK (gtk_frame_map_callback), this); G_CALLBACK (gtk_frame_map_callback), this);

View File

@@ -1914,29 +1914,38 @@ gtk_scrollbar_button_release_event(GtkRange* range, GdkEventButton*, wxWindow* w
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void static void
gtk_window_realized_callback(GtkWidget* widget, wxWindow* win) gtk_window_realized_callback(GtkWidget* WXUNUSED(widget), wxWindow* win)
{ {
if (win->m_imData) win->GTKHandleRealized();
}
void wxWindowGTK::GTKHandleRealized()
{ {
gtk_im_context_set_client_window( win->m_imData->context, if (m_imData)
win->m_wxwindow ? win->GTKGetDrawingWindow() : gtk_widget_get_window(widget)); {
gtk_im_context_set_client_window
(
m_imData->context,
m_wxwindow ? GTKGetDrawingWindow()
: gtk_widget_get_window(m_widget)
);
} }
// We cannot set colours and fonts before the widget // We cannot set colours and fonts before the widget
// been realized, so we do this directly after realization // been realized, so we do this directly after realization
// or otherwise in idle time // or otherwise in idle time
if (win->m_needsStyleChange) if (m_needsStyleChange)
{ {
win->SetBackgroundStyle(win->GetBackgroundStyle()); SetBackgroundStyle(GetBackgroundStyle());
win->m_needsStyleChange = false; m_needsStyleChange = false;
} }
wxWindowCreateEvent event( win ); wxWindowCreateEvent event( this );
event.SetEventObject( win ); event.SetEventObject( this );
win->GTKProcessEvent( event ); GTKProcessEvent( event );
win->GTKUpdateCursor(true, false); GTKUpdateCursor(true, false);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------