// 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;
win->SetIcon( wxNullIcon );
win->SetIcons( iconsOld );
}
+
+ if (win->HasFlag(wxFRAME_SHAPED))
+ win->SetShape(win->m_shape); // it will really set the window shape now
}
}
{
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
// 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));
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
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)
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.
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) )
+ {
+ if ( m_wxwindow )
+ do_shape_combine_region(m_wxwindow->window, region);
+
+ return do_shape_combine_region(m_widget->window, region);
+ }
+ else // not realized yet
{
- do_shape_combine_region(m_wxwindow->window, region);
+ // 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()