X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/428f841bd05025c94626d3ddf357a02901e87bc4..fd3a0ca9e1823d135bd4c43823e842aea3bb1395:/src/gtk/toplevel.cpp diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 36c2bfe160..a02c0ac69d 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -38,7 +38,7 @@ #include #include -#include "wx/gtk/win_gtk.h" +#include "wx/gtk/private/win_gtk.h" #include "wx/unix/utilsx11.h" @@ -268,7 +268,6 @@ gtk_frame_delete_callback( GtkWidget *WXUNUSED(widget), } } - //----------------------------------------------------------------------------- // "configure_event" //----------------------------------------------------------------------------- @@ -392,65 +391,19 @@ static gboolean property_notify_event( Atom type; int format; gulong nitems, bytes_after; - long* data = NULL; + 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, (guchar**)&data); + &type, &format, &nitems, &bytes_after, &data); if (status == Success && data && nitems == 4) { + long* p = (long*)data; const wxSize decorSize = - wxSize(int(data[0] + data[1]), int(data[2] + data[3])); - if (win->m_decorSize != decorSize) - { - const wxSize diff = decorSize - win->m_decorSize; - win->m_decorSize = decorSize; - bool resized = false; - if (win->m_deferShow) - { - // keep overall size unchanged by shrinking m_widget, - // if min size will allow it - const wxSize minSize = win->GetMinSize(); - int w, h; - win->GTKDoGetSize(&w, &h); - if (w >= minSize.x && h >= minSize.y) - { - gtk_window_resize(GTK_WINDOW(win->m_widget), w, h); - resized = true; - } - } - if (!resized) - { - // adjust overall size to match change in frame extents - win->m_width += diff.x; - win->m_height += diff.y; - if (win->m_width < 0) win->m_width = 0; - if (win->m_height < 0) win->m_height = 0; - if (!win->m_deferShow) - { - win->m_oldClientWidth = 0; - gtk_widget_queue_resize(win->m_wxwindow); - } - } - } - if (win->m_deferShow) - { - // gtk_widget_show() was deferred, do it now - win->m_deferShow = false; - win->GetClientSize( - &win->m_oldClientWidth, &win->m_oldClientHeight); - wxSizeEvent sizeEvent(win->GetSize(), win->GetId()); - sizeEvent.SetEventObject(win); - win->HandleWindowEvent(sizeEvent); - - gtk_widget_show(win->m_widget); - - wxShowEvent showEvent(win->GetId(), true); - showEvent.SetEventObject(win); - win->HandleWindowEvent(showEvent); - } + wxSize(int(p[0] + p[1]), int(p[2] + p[3])); + win->GTKUpdateDecorSize(decorSize); } if (data) XFree(data); @@ -463,7 +416,6 @@ BEGIN_EVENT_TABLE(wxTopLevelWindowGTK, wxTopLevelWindowBase) EVT_SYS_COLOUR_CHANGED(wxTopLevelWindowGTK::OnSysColourChanged) END_EVENT_TABLE() - // ---------------------------------------------------------------------------- // wxTopLevelWindowGTK creation // ---------------------------------------------------------------------------- @@ -809,7 +761,12 @@ 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 && !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); if (deferShow) { // Initial show. If WM supports _NET_REQUEST_FRAME_EXTENTS, defer @@ -1022,6 +979,57 @@ void wxTopLevelWindowGTK::DoSetSizeHints( int minW, int minH, (GtkWindow*)m_widget, NULL, &hints, (GdkWindowHints)hints_mask); } +void wxTopLevelWindowGTK::GTKUpdateDecorSize(const wxSize& decorSize) +{ + if (m_decorSize != decorSize) + { + const wxSize diff = decorSize - m_decorSize; + m_decorSize = decorSize; + bool resized = false; + if (m_deferShow) + { + // keep overall size unchanged by shrinking m_widget + int w, h; + GTKDoGetSize(&w, &h); + // but not if size would be less than minimum, it won't take effect + const wxSize minSize = GetMinSize(); + if (w >= minSize.x && h >= minSize.y) + { + gtk_window_resize(GTK_WINDOW(m_widget), w, h); + resized = true; + } + } + if (!resized) + { + // adjust overall size to match change in frame extents + m_width += diff.x; + 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); + } + } + } + if (m_deferShow) + { + // gtk_widget_show() was deferred, do it now + m_deferShow = false; + GetClientSize(&m_oldClientWidth, &m_oldClientHeight); + wxSizeEvent sizeEvent(GetSize(), GetId()); + sizeEvent.SetEventObject(this); + HandleWindowEvent(sizeEvent); + + gtk_widget_show(m_widget); + + wxShowEvent showEvent(GetId(), true); + showEvent.SetEventObject(this); + HandleWindowEvent(showEvent); + } +} + void wxTopLevelWindowGTK::OnInternalIdle() { // set the focus if not done yet and if we can already do it