From 612515aff12d2a36f993767954eaa370a545af51 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 12 Oct 2011 16:22:14 +0000 Subject: [PATCH] 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 --- include/wx/gtk/toplevel.h | 2 ++ include/wx/gtk/window.h | 4 ++++ src/gtk/toplevel.cpp | 31 ++++++++++++------------------- src/gtk/window.cpp | 31 ++++++++++++++++++++----------- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/include/wx/gtk/toplevel.h b/include/wx/gtk/toplevel.h index bd58083..a84cf8a 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 8155d24..5af2602 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 5062335..4a8bd7c 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 f710cce..a7ff360 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); } //----------------------------------------------------------------------------- -- 2.7.4