Fix for the irksome, 'Details' sizing bug. Or at least a patch on a hornet's
nest. Thanks to jill@emeraldgate.com for tracking this one (and the previous StatusBar patch too). There's more work here if someone wants it.. :-) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15990 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -764,6 +764,15 @@ wxLogDialog::wxLogDialog(wxWindow *parent,
|
|||||||
SetSizer(sizerTop);
|
SetSizer(sizerTop);
|
||||||
|
|
||||||
// see comments in OnDetails()
|
// see comments in OnDetails()
|
||||||
|
//
|
||||||
|
// Note: Doing this, this way, triggered a nasty bug in
|
||||||
|
// wxTopLevelWindowGTK::GtkOnSize which took -1 literally once
|
||||||
|
// either of maxWidth or maxHeight was set. This symptom has been
|
||||||
|
// fixed there, but it is a problem that remains as long as we allow
|
||||||
|
// unchecked access to the internal size members. We really need to
|
||||||
|
// encapuslate window sizes more cleanly and make it clear when -1 will
|
||||||
|
// be substituted and when it will not.
|
||||||
|
|
||||||
wxSize size = sizerTop->Fit(this);
|
wxSize size = sizerTop->Fit(this);
|
||||||
m_maxHeight = size.y;
|
m_maxHeight = size.y;
|
||||||
SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight);
|
SetSizeHints(size.x, size.y, m_maxWidth, m_maxHeight);
|
||||||
@@ -1015,6 +1024,7 @@ void wxLogDialog::OnDetails(wxCommandEvent& WXUNUSED(event))
|
|||||||
// we have to reset min size constraints or Fit() would never reduce the
|
// we have to reset min size constraints or Fit() would never reduce the
|
||||||
// dialog size when collapsing it and we have to reset max constraint
|
// dialog size when collapsing it and we have to reset max constraint
|
||||||
// because it wouldn't expand it otherwise
|
// because it wouldn't expand it otherwise
|
||||||
|
|
||||||
m_minHeight =
|
m_minHeight =
|
||||||
m_maxHeight = -1;
|
m_maxHeight = -1;
|
||||||
|
|
||||||
@@ -1146,3 +1156,4 @@ void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
|
|||||||
|
|
||||||
#endif // wxUSE_TEXTCTRL
|
#endif // wxUSE_TEXTCTRL
|
||||||
|
|
||||||
|
// vi:sts=4:sw=4:et
|
||||||
|
@@ -711,13 +711,36 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
|
|||||||
{
|
{
|
||||||
// set size hints
|
// set size hints
|
||||||
gint flag = 0; // GDK_HINT_POS;
|
gint flag = 0; // GDK_HINT_POS;
|
||||||
|
GdkGeometry geom;
|
||||||
|
|
||||||
if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
|
if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
|
||||||
if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
|
if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
|
||||||
GdkGeometry geom;
|
|
||||||
geom.min_width = minWidth;
|
geom.min_width = minWidth;
|
||||||
geom.min_height = minHeight;
|
geom.min_height = minHeight;
|
||||||
geom.max_width = maxWidth;
|
|
||||||
geom.max_height = maxHeight;
|
// Because of the way we set GDK_HINT_MAX_SIZE above, if either of
|
||||||
|
// maxHeight or maxWidth is set, we must set them both, else the
|
||||||
|
// remaining -1 will be taken literally.
|
||||||
|
|
||||||
|
// I'm certain this also happens elsewhere, and is the probable
|
||||||
|
// cause of other such things as:
|
||||||
|
// Gtk-WARNING **: gtk_widget_size_allocate():
|
||||||
|
// attempt to allocate widget with width 65535 and height 600
|
||||||
|
// but I don't have time to track them all now..
|
||||||
|
//
|
||||||
|
// Really we need to encapulate all this height/width business and
|
||||||
|
// stop any old method from ripping at the members directly and
|
||||||
|
// scattering -1's without regard for who might resolve them later.
|
||||||
|
|
||||||
|
geom.max_width = ( maxHeight == -1 ) ? maxWidth
|
||||||
|
: ( maxWidth == -1 ) ? wxGetDisplaySize().GetWidth()
|
||||||
|
: maxWidth ;
|
||||||
|
|
||||||
|
geom.max_height = ( maxWidth == -1 ) ? maxHeight // ( == -1 here )
|
||||||
|
: ( maxHeight == -1 ) ? wxGetDisplaySize().GetHeight()
|
||||||
|
: maxHeight ;
|
||||||
|
|
||||||
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
|
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
|
||||||
(GtkWidget*) NULL,
|
(GtkWidget*) NULL,
|
||||||
&geom,
|
&geom,
|
||||||
@@ -733,6 +756,7 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
|
|||||||
int client_y = m_miniEdge + m_miniTitle;
|
int client_y = m_miniEdge + m_miniTitle;
|
||||||
int client_w = m_width - 2*m_miniEdge;
|
int client_w = m_width - 2*m_miniEdge;
|
||||||
int client_h = m_height - 2*m_miniEdge - m_miniTitle;
|
int client_h = m_height - 2*m_miniEdge - m_miniTitle;
|
||||||
|
|
||||||
gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
|
gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
|
||||||
m_wxwindow,
|
m_wxwindow,
|
||||||
client_x, client_y, client_w, client_h );
|
client_x, client_y, client_w, client_h );
|
||||||
@@ -896,3 +920,5 @@ void wxTopLevelWindowGTK::RemoveGrab()
|
|||||||
m_grabbed = FALSE;
|
m_grabbed = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// vi:sts=4:sw=4:et
|
||||||
|
@@ -711,13 +711,36 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
|
|||||||
{
|
{
|
||||||
// set size hints
|
// set size hints
|
||||||
gint flag = 0; // GDK_HINT_POS;
|
gint flag = 0; // GDK_HINT_POS;
|
||||||
|
GdkGeometry geom;
|
||||||
|
|
||||||
if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
|
if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
|
||||||
if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
|
if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
|
||||||
GdkGeometry geom;
|
|
||||||
geom.min_width = minWidth;
|
geom.min_width = minWidth;
|
||||||
geom.min_height = minHeight;
|
geom.min_height = minHeight;
|
||||||
geom.max_width = maxWidth;
|
|
||||||
geom.max_height = maxHeight;
|
// Because of the way we set GDK_HINT_MAX_SIZE above, if either of
|
||||||
|
// maxHeight or maxWidth is set, we must set them both, else the
|
||||||
|
// remaining -1 will be taken literally.
|
||||||
|
|
||||||
|
// I'm certain this also happens elsewhere, and is the probable
|
||||||
|
// cause of other such things as:
|
||||||
|
// Gtk-WARNING **: gtk_widget_size_allocate():
|
||||||
|
// attempt to allocate widget with width 65535 and height 600
|
||||||
|
// but I don't have time to track them all now..
|
||||||
|
//
|
||||||
|
// Really we need to encapulate all this height/width business and
|
||||||
|
// stop any old method from ripping at the members directly and
|
||||||
|
// scattering -1's without regard for who might resolve them later.
|
||||||
|
|
||||||
|
geom.max_width = ( maxHeight == -1 ) ? maxWidth
|
||||||
|
: ( maxWidth == -1 ) ? wxGetDisplaySize().GetWidth()
|
||||||
|
: maxWidth ;
|
||||||
|
|
||||||
|
geom.max_height = ( maxWidth == -1 ) ? maxHeight // ( == -1 here )
|
||||||
|
: ( maxHeight == -1 ) ? wxGetDisplaySize().GetHeight()
|
||||||
|
: maxHeight ;
|
||||||
|
|
||||||
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
|
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
|
||||||
(GtkWidget*) NULL,
|
(GtkWidget*) NULL,
|
||||||
&geom,
|
&geom,
|
||||||
@@ -733,6 +756,7 @@ void wxTopLevelWindowGTK::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y),
|
|||||||
int client_y = m_miniEdge + m_miniTitle;
|
int client_y = m_miniEdge + m_miniTitle;
|
||||||
int client_w = m_width - 2*m_miniEdge;
|
int client_w = m_width - 2*m_miniEdge;
|
||||||
int client_h = m_height - 2*m_miniEdge - m_miniTitle;
|
int client_h = m_height - 2*m_miniEdge - m_miniTitle;
|
||||||
|
|
||||||
gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
|
gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
|
||||||
m_wxwindow,
|
m_wxwindow,
|
||||||
client_x, client_y, client_w, client_h );
|
client_x, client_y, client_w, client_h );
|
||||||
@@ -896,3 +920,5 @@ void wxTopLevelWindowGTK::RemoveGrab()
|
|||||||
m_grabbed = FALSE;
|
m_grabbed = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// vi:sts=4:sw=4:et
|
||||||
|
Reference in New Issue
Block a user