// "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" {
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
wxTopLevelWindow *win )
{
const bool wasIconized = win->IsIconized();
-
win->SetIconizeState(false);
-
if (wasIconized)
{
// Because GetClientSize() returns (0,0) when IsIconized() is true,
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;
}
}
}
}
+//-----------------------------------------------------------------------------
+
+bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int* bottom)
+{
+ static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false);
+ Atom xproperty = gdk_x11_atom_to_xatom_for_display(
+ gdk_drawable_get_display(window), property);
+ Atom type;
+ int format;
+ gulong nitems, bytes_after;
+ guchar* data;
+ Status status = XGetWindowProperty(
+ gdk_x11_drawable_get_xdisplay(window),
+ gdk_x11_drawable_get_xid(window),
+ xproperty,
+ 0, 4, false, XA_CARDINAL,
+ &type, &format, &nitems, &bytes_after, &data);
+ const bool success = status == Success && data && nitems == 4;
+ if (success)
+ {
+ long* p = (long*)data;
+ if (left) *left = int(p[0]);
+ if (right) *right = int(p[1]);
+ if (top) *top = int(p[2]);
+ if (bottom) *bottom = int(p[3]);
+ }
+ if (data)
+ XFree(data);
+ return success;
+}
+
//-----------------------------------------------------------------------------
// "property_notify_event" from m_widget
//-----------------------------------------------------------------------------
static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false);
if (event->state == GDK_PROPERTY_NEW_VALUE && event->atom == property)
{
- Atom xproperty = gdk_x11_atom_to_xatom_for_display(
- gdk_drawable_get_display(event->window), property);
- Atom type;
- int format;
- gulong nitems, bytes_after;
- guchar* data;
- Status status = XGetWindowProperty(
- gdk_x11_drawable_get_xdisplay(event->window),
- gdk_x11_drawable_get_xid(event->window),
- xproperty,
- 0, 4, false, XA_CARDINAL,
- &type, &format, &nitems, &bytes_after, &data);
- if (status == Success && data && nitems == 4)
+ int left, right, top, bottom;
+ if (wxGetFrameExtents(event->window, &left, &right, &top, &bottom))
{
- long* p = (long*)data;
const wxSize decorSize =
- wxSize(int(p[0] + p[1]), int(p[2] + p[3]));
+ wxSize(left + right, top + bottom);
win->GTKUpdateDecorSize(decorSize);
}
- if (data)
- XFree(data);
}
return false;
}
}
-BEGIN_EVENT_TABLE(wxTopLevelWindowGTK, wxTopLevelWindowBase)
- EVT_SYS_COLOUR_CHANGED(wxTopLevelWindowGTK::OnSysColourChanged)
-END_EVENT_TABLE()
-
// ----------------------------------------------------------------------------
// wxTopLevelWindowGTK creation
// ----------------------------------------------------------------------------
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;
}
}
#endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON
+
+ g_object_ref(m_widget);
}
wxWindow *topParent = wxGetTopLevelParent(m_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;
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);
}
// ----------------------------------------------------------------------------
"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();
-}