X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/593354ca47abaae8a434f99642acc57f7834f77b..e333075415c35d2e869ea585fa41f01a2c938897:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 158ff23132..f79d8234e5 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -57,8 +57,6 @@ // this is incremented while a modal dialog is shown int wxOpenModalDialogsCount = 0; -extern wxWindowGTK *g_delayedFocus; - // the frame that is currently active (i.e. its child has focus). It is // used to generate wxActivateEvents static wxTopLevelWindowGTK *g_activeFrame = (wxTopLevelWindowGTK*) NULL; @@ -760,8 +758,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; + 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 @@ -771,30 +780,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)); @@ -814,7 +810,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 @@ -1001,11 +997,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) @@ -1027,22 +1020,6 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) void wxTopLevelWindowGTK::OnInternalIdle() { - // set the focus if not done yet and if we can already do it - if ( GTK_WIDGET_REALIZED(m_wxwindow) ) - { - if ( g_delayedFocus && - wxGetTopLevelParent((wxWindow*)g_delayedFocus) == this ) - { - wxLogTrace(_T("focus"), - _T("Setting focus from wxTLW::OnIdle() to %s(%s)"), - g_delayedFocus->GetClassInfo()->GetClassName(), - g_delayedFocus->GetLabel().c_str()); - - g_delayedFocus->SetFocus(); - g_delayedFocus = NULL; - } - } - wxWindow::OnInternalIdle(); // Synthetize activate events.