X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb4b0165b22fef2c47e97e90ef5257ca8eadc804..0738b901b17340f09766524b8d9d79e9ed1268e7:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index a3975752f1..8d8154f246 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1833,7 +1833,7 @@ gtk_window_realized_callback(GtkWidget* widget, wxWindow* win) gtk_im_context_set_client_window( win->m_imData->context, widget->window); } - + // We cannot set colours and fonts before the widget // been realized, so we do this directly after realization // or otherwise in idle time @@ -1925,30 +1925,6 @@ void gtk_window_style_set_callback( GtkWidget *WXUNUSED(widget), } // extern "C" -// Helper to suspend colour change event event processing while we change a widget's style -class wxSuspendStyleEvents -{ -public: - wxSuspendStyleEvents(wxWindow* win) - { - m_win = NULL; - if (win->m_wxwindow && win->IsTopLevel()) - { - m_win = win; - g_signal_handlers_block_by_func( - m_win->m_wxwindow, (void*)gtk_window_style_set_callback, m_win); - } - } - ~wxSuspendStyleEvents() - { - if (m_win) - g_signal_handlers_unblock_by_func( - m_win->m_wxwindow, (void*)gtk_window_style_set_callback, m_win); - } - - wxWindow* m_win; -}; - // ---------------------------------------------------------------------------- // this wxWindowBase function is implemented here (in platform-specific file) // because it is static and so couldn't be made virtual @@ -1964,7 +1940,7 @@ wxWindow *wxWindowBase::DoFindFocus() void wxWindowGTK::AddChildGTK(wxWindowGTK* child) { wxASSERT_MSG(m_wxwindow, "Cannot add a child to a window without a client area"); - + // the window might have been scrolled already, we // have to adapt the position wxPizza* pizza = WX_PIZZA(m_wxwindow); @@ -2341,40 +2317,25 @@ void wxWindowGTK::PostCreation() G_CALLBACK(size_allocate), this); } - if (m_wxwindow) - { #if GTK_CHECK_VERSION(2, 8, 0) - if (!gtk_check_version(2,8,0)) + if ( gtk_check_version(2,8,0) == NULL ) + { + // Make sure we can notify the app when mouse capture is lost + if ( m_wxwindow ) { - // Make sure we can notify the app when mouse capture is lost g_signal_connect (m_wxwindow, "grab_broken_event", G_CALLBACK (gtk_window_grab_broken), this); } -#endif - } - if ( connect_widget != m_wxwindow ) - { -#if GTK_CHECK_VERSION(2, 8, 0) - if (!gtk_check_version(2,8,0)) + if ( connect_widget != m_wxwindow ) { - // Make sure we can notify app code when mouse capture is lost g_signal_connect (connect_widget, "grab_broken_event", G_CALLBACK (gtk_window_grab_broken), this); } -#endif } +#endif // GTK+ >= 2.8 -#ifdef GTK_IS_FILE_CHOOSER_BUTTON - if (!gtk_check_version(2,6,0) && GTK_IS_FILE_CHOOSER_BUTTON(m_widget)) - { - // If we connect to the "size_request" signal of a GtkFileChooserButton - // then that control won't be sized properly when placed inside sizers - // (this can be tested removing this elseif and running XRC or WIDGETS samples) - // FIXME: what should be done here ? - } else -#endif - if ( !IsTopLevel() ) // top level windows use their own callback + if ( GTKShouldConnectSizeRequest() ) { // This is needed if we want to add our windows into native // GTK controls, such as the toolbar. With this callback, the @@ -2397,6 +2358,11 @@ void wxWindowGTK::PostCreation() gtk_widget_show( m_widget ); } +gulong wxWindowGTK::GTKConnectWidget(const char *signal, void (*callback)()) +{ + return g_signal_connect(m_widget, signal, callback, this); +} + void wxWindowGTK::ConnectWidget( GtkWidget *widget ) { g_signal_connect (widget, "key_press_event", @@ -2443,9 +2409,9 @@ bool wxWindowGTK::Destroy() void wxWindowGTK::DoMoveWindow(int x, int y, int width, int height) { gtk_widget_set_size_request(m_widget, width, height); - + // inform the parent to perform the move - wxASSERT_MSG(m_parent && m_parent->m_wxwindow, + wxASSERT_MSG(m_parent && m_parent->m_wxwindow, "the parent window has no client area?"); WX_PIZZA(m_parent->m_wxwindow)->move(m_widget, x, y); } @@ -2542,7 +2508,7 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags event.SetEventObject( this ); HandleWindowEvent( event ); } - } else + } else if (sizeFlags & wxSIZE_FORCE_EVENT) { wxSizeEvent event( wxSize(m_width,m_height), GetId() ); @@ -3599,7 +3565,7 @@ void wxWindowGTK::Update() gdk_display_sync(display); gdk_window_process_updates(m_widget->window, TRUE); - + // Flush again, but no need to wait for it to finish gdk_display_flush(display); } @@ -3917,12 +3883,30 @@ void wxWindowGTK::GTKApplyWidgetStyle(bool forceStyle) void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style) { - wxSuspendStyleEvents s(static_cast(this)); + if ( m_wxwindow ) + { + // block the signal temporarily to avoid sending + // wxSysColourChangedEvents when we change the colours ourselves + bool unblock = false; + if ( IsTopLevel() ) + { + unblock = true; + g_signal_handlers_block_by_func( + m_wxwindow, (void *)gtk_window_style_set_callback, this); + } - if (m_wxwindow) gtk_widget_modify_style(m_wxwindow, style); + + if ( unblock ) + { + g_signal_handlers_unblock_by_func( + m_wxwindow, (void *)gtk_window_style_set_callback, this); + } + } else + { gtk_widget_modify_style(m_widget, style); + } } bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) @@ -4364,7 +4348,7 @@ void wxWindowGTK::GTKScrolledWindowSetBorder(GtkWidget* w, int wxstyle) if(wxstyle & wxBORDER_RAISED) gtkstyle = GTK_SHADOW_OUT; - else if (wxstyle & wxBORDER_SUNKEN) + else if ((wxstyle & wxBORDER_SUNKEN) || (wxstyle & wxBORDER_THEME)) gtkstyle = GTK_SHADOW_IN; #if 0 // Now obsolete