]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/toplevel.cpp
build fix
[wxWidgets.git] / src / gtk / toplevel.cpp
index d87eec8b6a45f3ab0f3a7bf75a5982a70bb0444d..cf37ab6b711115727566dbfe2dd1dfe1dc5fa7ab 100644 (file)
@@ -296,7 +296,7 @@ gtk_frame_configure_callback( GtkWidget* widget,
 // "realize" from m_widget
 //-----------------------------------------------------------------------------
 
-// we cannot MWM hints and icons before the widget has been realized,
+// we cannot the WM hints and icons before the widget has been realized,
 // so we do this directly after realization
 
 extern "C" {
@@ -304,26 +304,20 @@ static void
 gtk_frame_realized_callback( GtkWidget * WXUNUSED(widget),
                              wxTopLevelWindowGTK *win )
 {
-    // All this is for Motif Window Manager "hints" and is supposed to be
-    // recognized by other WM as well. Not tested.
     gdk_window_set_decorations(win->m_widget->window,
                                (GdkWMDecoration)win->m_gdkDecor);
     gdk_window_set_functions(win->m_widget->window,
                                (GdkWMFunction)win->m_gdkFunc);
 
     // GTK's shrinking/growing policy
-    if ((win->m_gdkFunc & GDK_FUNC_RESIZE) == 0)
+    if ( !(win->m_gdkFunc & GDK_FUNC_RESIZE) )
         gtk_window_set_resizable(GTK_WINDOW(win->m_widget), FALSE);
     else
         gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
 
-    // reset the icon
-    wxIconBundle iconsOld = win->GetIcons();
-    if ( !iconsOld.IsEmpty() )
-    {
-        win->SetIcon( wxNullIcon );
-        win->SetIcons( iconsOld );
-    }
+    const wxIconBundle& icons = win->GetIcons();
+    if (icons.GetIconCount())
+        win->SetIcons(icons);
 
     if (win->HasFlag(wxFRAME_SHAPED))
         win->SetShape(win->m_shape); // it will really set the window shape now
@@ -341,9 +335,7 @@ gtk_frame_map_callback( GtkWidget*,
                         wxTopLevelWindow *win )
 {
     const bool wasIconized = win->IsIconized();
-
     win->SetIconizeState(false);
-
     if (wasIconized)
     {
         // Because GetClientSize() returns (0,0) when IsIconized() is true,
@@ -355,7 +347,13 @@ gtk_frame_map_callback( GtkWidget*,
         win->m_oldClientWidth = 0;
         gtk_widget_queue_resize(win->m_wxwindow);
     }
-
+    // it is possible for m_isShown to be false here, see bug #9909
+    if (win->wxWindowBase::Show(true))
+    {
+        wxShowEvent eventShow(win->GetId(), true);
+        eventShow.SetEventObject(win);
+        win->GetEventHandler()->ProcessEvent(eventShow);
+    }
     return false;
 }
 }
@@ -430,10 +428,6 @@ static gboolean property_notify_event(
 }
 }
 
-BEGIN_EVENT_TABLE(wxTopLevelWindowGTK, wxTopLevelWindowBase)
-    EVT_SYS_COLOUR_CHANGED(wxTopLevelWindowGTK::OnSysColourChanged)
-END_EVENT_TABLE()
-
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowGTK creation
 // ----------------------------------------------------------------------------
@@ -444,9 +438,11 @@ void wxTopLevelWindowGTK::Init()
     m_isIconized = false;
     m_fsIsShowing = false;
     m_themeEnabled = true;
-    m_gdkDecor = m_gdkFunc = 0;
+    m_gdkDecor =
+    m_gdkFunc = 0;
     m_grabbed = false;
     m_deferShow = true;
+    m_updateDecorSize = true;
 
     m_urgency_hint = -2;
 }
@@ -515,6 +511,8 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
             }
         }
 #endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON
+
+        g_object_ref(m_widget);
     }
 
     wxWindow *topParent = wxGetTopLevelParent(m_parent);
@@ -599,42 +597,43 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
     g_signal_connect(m_widget, "property_notify_event",
         G_CALLBACK(property_notify_event), this);
 
-    // decorations
-    if ((style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
+    // translate wx decorations styles into Motif WM hints (they are recognized
+    // by other WMs as well)
+
+    // always enable moving the window as we have no separate flag for enabling
+    // it
+    m_gdkFunc = GDK_FUNC_MOVE;
+
+    if ( style & wxCLOSE_BOX )
+        m_gdkFunc |= GDK_FUNC_CLOSE;
+
+    if ( style & wxMINIMIZE_BOX )
+        m_gdkFunc |= GDK_FUNC_MINIMIZE;
+
+    if ( style & wxMAXIMIZE_BOX )
+        m_gdkFunc |= GDK_FUNC_MAXIMIZE;
+
+    if ( (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER) )
     {
         m_gdkDecor = 0;
-        m_gdkFunc = 0;
     }
-    else
+    else // have border
     {
         m_gdkDecor = GDK_DECOR_BORDER;
-        m_gdkFunc = GDK_FUNC_MOVE;
 
-        // All this is for Motif Window Manager "hints" and is supposed to be
-        // recognized by other WMs as well.
-        if ((style & wxCAPTION) != 0)
-        {
+        if ( style & wxCAPTION )
             m_gdkDecor |= GDK_DECOR_TITLE;
-        }
-        if ((style & wxCLOSE_BOX) != 0)
-        {
-            m_gdkFunc |= GDK_FUNC_CLOSE;
-        }
-        if ((style & wxSYSTEM_MENU) != 0)
-        {
+
+        if ( style & wxSYSTEM_MENU )
             m_gdkDecor |= GDK_DECOR_MENU;
-        }
-        if ((style & wxMINIMIZE_BOX) != 0)
-        {
-            m_gdkFunc |= GDK_FUNC_MINIMIZE;
+
+        if ( style & wxMINIMIZE_BOX )
             m_gdkDecor |= GDK_DECOR_MINIMIZE;
-        }
-        if ((style & wxMAXIMIZE_BOX) != 0)
-        {
-            m_gdkFunc |= GDK_FUNC_MAXIMIZE;
+
+        if ( style & wxMAXIMIZE_BOX )
             m_gdkDecor |= GDK_DECOR_MAXIMIZE;
-        }
-        if ((style & wxRESIZE_BORDER) != 0)
+
+        if ( style & wxRESIZE_BORDER )
         {
            m_gdkFunc |= GDK_FUNC_RESIZE;
            m_gdkDecor |= GDK_DECOR_RESIZEH;
@@ -781,18 +780,31 @@ bool wxTopLevelWindowGTK::Show( bool show )
 {
     wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
 
-    bool deferShow = show && m_deferShow && !m_isShown;
+    bool deferShow = show && !m_isShown && 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)) &&
+        deferShow = false;
+        if (!GTK_WIDGET_REALIZED(m_widget) &&
             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);
+                0, NULL, NULL, this))
+        {
+            if (gdk_x11_screen_supports_net_wm_hint(
+                gtk_widget_get_screen(m_widget),
+                gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false)))
+            {
+                deferShow = true;
+            }
+            else
+            {
+                // Don't allow changes to m_decorSize, it breaks saving/restoring
+                // window size with GetSize()/SetSize() because it makes window
+                // bigger between each restore and save.
+                m_updateDecorSize = false;
+            }
+        }
+        m_deferShow = deferShow;
     }
     if (deferShow)
     {
@@ -997,7 +1009,7 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize)
 {
     if (!IsMaximized() && !IsFullScreen())
         GetCachedDecorSize() = decorSize;
-    if (m_decorSize != decorSize)
+    if (m_updateDecorSize && m_decorSize != decorSize)
     {
         const wxSize diff = decorSize - m_decorSize;
         m_decorSize = decorSize;
@@ -1101,16 +1113,17 @@ void wxTopLevelWindowGTK::SetIcons( const wxIconBundle &icons )
 
     wxTopLevelWindowBase::SetIcons( icons );
 
-    GList *list = NULL;
-
-    const size_t numIcons = icons.GetIconCount();
-    for ( size_t i = 0; i < numIcons; i++ )
+    // Setting icons before window is realized can cause a GTK assertion if
+    // another TLW is realized before this one, and it has this one as it's
+    // transient parent. The life demo exibits this problem.
+    if (GTK_WIDGET_REALIZED(m_widget))
     {
-        list = g_list_prepend(list, icons.GetIconByIndex(i).GetPixbuf());
+        GList* list = NULL;
+        for (size_t i = icons.GetIconCount(); i--;)
+            list = g_list_prepend(list, icons.GetIconByIndex(i).GetPixbuf());
+        gtk_window_set_icon_list(GTK_WINDOW(m_widget), list);
+        g_list_free(list);
     }
-
-    gtk_window_set_icon_list(GTK_WINDOW(m_widget), list);
-    g_list_free(list);
 }
 
 // ----------------------------------------------------------------------------
@@ -1363,16 +1376,3 @@ bool wxTopLevelWindowGTK::CanSetTransparent()
                            "Composite", &opcode, &event, &error);
 #endif
 }
-
-void wxTopLevelWindowGTK::OnSysColourChanged(wxSysColourChangedEvent& event)
-{
-    // We don't know the order in which top-level windows will
-    // be notified, so we need to clear the system objects
-    // for each top-level window.
-    extern void wxClearGtkSystemObjects();
-    wxClearGtkSystemObjects();
-
-    // wxWindowBase::OnSysColourChanged will propagate event
-    // to children
-    event.Skip();
-}