X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bd2e08d06528b2014a4acf878e91fee4696d0666..ff58644a54af11b74b8e9b33a00de8496c531566:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index ef016719cd..94b65ad038 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -324,6 +324,9 @@ gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget), win->SetIcon( wxNullIcon ); win->SetIcons( iconsOld ); } + + if (win->HasFlag(wxFRAME_SHAPED)) + win->SetShape(win->m_shape); // it will really set the window shape now } } @@ -758,13 +761,19 @@ bool wxTopLevelWindowGTK::Show( bool show ) { wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); - const bool wasRealized = GTK_WIDGET_REALIZED(m_widget); - bool deferShow = - show && m_deferShow && !wasRealized && - g_signal_handler_find(m_widget, - GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), - g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET), - 0, NULL, NULL, this); + bool deferShow = show && m_deferShow; + if (deferShow) + { + m_deferShow = + deferShow = !GTK_WIDGET_REALIZED(m_widget) && + gdk_x11_screen_supports_net_wm_hint( + gtk_widget_get_screen(m_widget), + gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false)) && + g_signal_handler_find(m_widget, + GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), + g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET), + 0, NULL, NULL, this); + } if (deferShow) { // Initial show. If WM supports _NET_REQUEST_FRAME_EXTENTS, defer @@ -774,30 +783,17 @@ bool wxTopLevelWindowGTK::Show( bool show ) // what wxWidgets expects it to be without an obvious change in the // window size immediately after it becomes visible. - // Realize m_widget, so m_widget->window can be used. Realizing causes - // the widget tree to be size_allocated, which generates size events in - // the wrong order. So temporarily remove child from m_widget while - // realizing. - GtkWidget* child = GTK_BIN(m_widget)->child; - if (child) - { - g_object_ref(child); - gtk_container_remove(GTK_CONTAINER(m_widget), child); - } + // Realize m_widget, so m_widget->window can be used. Realizing normally + // causes the widget tree to be size_allocated, which generates size + // events in the wrong order. However, the size_allocates will not be + // done if the allocation is not the default (1,1). + const int alloc_width = m_widget->allocation.width; + if (alloc_width == 1) + m_widget->allocation.width = 2; gtk_widget_realize(m_widget); - if (child) - { - gtk_container_add(GTK_CONTAINER(m_widget), child); - g_object_unref(child); - } + if (alloc_width == 1) + m_widget->allocation.width = 1; - m_deferShow = - deferShow = gdk_x11_screen_supports_net_wm_hint( - gdk_drawable_get_screen(m_widget->window), - gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false)) != 0; - } - if (deferShow) - { // send _NET_REQUEST_FRAME_EXTENTS XClientMessageEvent xevent; memset(&xevent, 0, sizeof(xevent)); @@ -817,7 +813,7 @@ bool wxTopLevelWindowGTK::Show( bool show ) return true; } - if (show && !wasRealized) + if (show && !GTK_WIDGET_REALIZED(m_widget)) { // size_allocate signals occur in reverse order (bottom to top). // Things work better if the initial wxSizeEvents are sent (from the @@ -1004,11 +1000,8 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) m_height += diff.y; if (m_width < 0) m_width = 0; if (m_height < 0) m_height = 0; - if (!m_deferShow) - { - m_oldClientWidth = 0; - gtk_widget_queue_resize(m_wxwindow); - } + m_oldClientWidth = 0; + gtk_widget_queue_resize(m_wxwindow); } } if (m_deferShow) @@ -1174,13 +1167,22 @@ bool wxTopLevelWindowGTK::SetShape(const wxRegion& region) wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false, _T("Shaped windows must be created with the wxFRAME_SHAPED style.")); - GdkWindow *window = NULL; - if (m_wxwindow) + if ( GTK_WIDGET_REALIZED(m_widget) ) { - do_shape_combine_region(m_wxwindow->window, region); + if ( m_wxwindow ) + do_shape_combine_region(m_wxwindow->window, region); + + return do_shape_combine_region(m_widget->window, region); + } + else // not realized yet + { + // store the shape to set, it will be really set once we're realized + m_shape = region; + + // we don't know if we're going to succeed or fail, be optimistic by + // default + return true; } - window = m_widget->window; - return do_shape_combine_region(window, region); } bool wxTopLevelWindowGTK::IsActive()