diff --git a/include/wx/gtk/toplevel.h b/include/wx/gtk/toplevel.h index bd58083b8a..a84cf8a87e 100644 --- a/include/wx/gtk/toplevel.h +++ b/include/wx/gtk/toplevel.h @@ -95,6 +95,8 @@ public: // GTK callbacks virtual void OnInternalIdle(); + virtual void GTKHandleRealized(); + // do *not* call this to iconize the frame, this is a private function! void SetIconizeState(bool iconic); diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 8155d24305..5af2602f75 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -187,6 +187,10 @@ public: void GTKHandleFocusOutNoDeferring(); 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: // for controls composed of multiple GTK widgets, return true to eliminate // spurious focus events if the focus changes between GTK+ children within diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 5062335525..4a8bd7c5d8 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -308,32 +308,30 @@ gtk_frame_configure_callback( GtkWidget* widget, // we cannot the WM hints and icons before the widget has been realized, // so we do this directly after realization -extern "C" { -static void -gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), - wxTopLevelWindowGTK *win ) +void wxTopLevelWindowGTK::GTKHandleRealized() { - gdk_window_set_decorations(gtk_widget_get_window(win->m_widget), - (GdkWMDecoration)win->m_gdkDecor); - gdk_window_set_functions(gtk_widget_get_window(win->m_widget), - (GdkWMFunction)win->m_gdkFunc); + wxNonOwnedWindow::GTKHandleRealized(); + + gdk_window_set_decorations(gtk_widget_get_window(m_widget), + (GdkWMDecoration)m_gdkDecor); + gdk_window_set_functions(gtk_widget_get_window(m_widget), + (GdkWMFunction)m_gdkFunc); // GTK's shrinking/growing policy - if ( !(win->m_gdkFunc & GDK_FUNC_RESIZE) ) - gtk_window_set_resizable(GTK_WINDOW(win->m_widget), FALSE); + if ( !(m_gdkFunc & GDK_FUNC_RESIZE) ) + gtk_window_set_resizable(GTK_WINDOW(m_widget), FALSE); #if !GTK_CHECK_VERSION(3,0,0) && !defined(GTK_DISABLE_DEPRECATED) 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 - const wxIconBundle& icons = win->GetIcons(); + const wxIconBundle& icons = GetIcons(); if (icons.GetIconCount()) - win->SetIcons(icons); + SetIcons(icons); if (win->HasFlag(wxFRAME_SHAPED)) win->SetShape(win->m_shape); // it will really set the window shape now } -} //----------------------------------------------------------------------------- // "map_event" from m_widget @@ -632,11 +630,6 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, gtk_widget_set_uposition( m_widget, m_x, m_y ); #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 g_signal_connect (m_widget, "map_event", G_CALLBACK (gtk_frame_map_callback), this); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index f710cce243..a7ff360ffd 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1914,29 +1914,38 @@ gtk_scrollbar_button_release_event(GtkRange* range, GdkEventButton*, wxWindow* w //----------------------------------------------------------------------------- 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() +{ + if (m_imData) { - gtk_im_context_set_client_window( win->m_imData->context, - 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 // been realized, so we do this directly after realization // or otherwise in idle time - if (win->m_needsStyleChange) + if (m_needsStyleChange) { - win->SetBackgroundStyle(win->GetBackgroundStyle()); - win->m_needsStyleChange = false; + SetBackgroundStyle(GetBackgroundStyle()); + m_needsStyleChange = false; } - wxWindowCreateEvent event( win ); - event.SetEventObject( win ); - win->GTKProcessEvent( event ); + wxWindowCreateEvent event( this ); + event.SetEventObject( this ); + GTKProcessEvent( event ); - win->GTKUpdateCursor(true, false); + GTKUpdateCursor(true, false); } //-----------------------------------------------------------------------------