From 9379c0d752144826342fa2688a77aa5cccea3d9b Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 29 Oct 2006 19:17:00 +0000 Subject: [PATCH] Make wxWindow::SetSizeHints() do nothing. Make wxTLW::SetSizeHints() set the various m_minWidth etc. fields. Override SetSizeHints() in wxGTK to call the relevant gtk funcion only there and not in every resize. Make GetMinWidth() etc. non-virtual. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42646 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/tlw.tex | 23 ++++++++++ docs/latex/wx/window.tex | 45 +++---------------- include/wx/gtk/toplevel.h | 4 ++ include/wx/toplevel.h | 4 ++ include/wx/window.h | 39 +++++++++-------- src/common/toplvcmn.cpp | 17 ++++++++ src/common/wincmn.cpp | 17 -------- src/gtk/frame.cpp | 13 ------ src/gtk/toplevel.cpp | 92 ++++++++++++++++++++++----------------- 9 files changed, 126 insertions(+), 128 deletions(-) diff --git a/docs/latex/wx/tlw.tex b/docs/latex/wx/tlw.tex index f0134fd902..75320a9040 100644 --- a/docs/latex/wx/tlw.tex +++ b/docs/latex/wx/tlw.tex @@ -280,6 +280,29 @@ Unavailable on full keyboard machines. \helpref{wxTopLevelWindow::SetRightMenu}{wxtoplevelwindowsetrightmenu}. +\membersection{wxTopLevelWindow::SetSizeHints}\label{wxtoplevelwindowsetsizehints} + +\func{virtual void}{SetSizeHints}{\param{int}{ minW}, \param{int}{ minH}, \param{int}{ maxW=-1}, \param{int}{ maxH=-1}, + \param{int}{ incW=-1}, \param{int}{ incH=-1}} + +\func{void}{SetSizeHints}{\param{const wxSize\&}{ minSize}, +\param{const wxSize\&}{ maxSize=wxDefaultSize}, \param{const wxSize\&}{ incSize=wxDefaultSize}} + +Allows specification of minimum and maximum window sizes, and window size increments. +If a pair of values is not set (or set to -1), the default values will be used. + +\docparam{incW}{Specifies the increment for sizing the width (Motif/Xt only).} + +\docparam{incH}{Specifies the increment for sizing the height (Motif/Xt only).} + +\docparam{incSize}{Increment size (Motif/Xt only).} + +\wxheading{Remarks} + +If this function is called, the user will not be able to size the window outside +the given bounds. The resizing increments are only significant under Motif or Xt. + + \membersection{wxTopLevelWindow::SetRightMenu}\label{wxtoplevelwindowsetrightmenu} \func{void}{SetRightMenu}{\param{int}{ id = wxID\_ANY}, \param{const wxString\&}{ label = wxEmptyString}, \param{wxMenu *}{ subMenu = NULL}} diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index 2ea573f0a9..fc2585ede5 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -767,8 +767,7 @@ Merges the window's best size into the min size and returns the result. \wxheading{See also} \helpref{wxWindow::GetBestSize}{wxwindowgetbestsize},\rtfsp -\helpref{wxWindow::SetBestFittingSize}{wxwindowsetbestfittingsize},\rtfsp -\helpref{wxWindow::SetSizeHints}{wxwindowsetsizehints} +\helpref{wxWindow::SetBestFittingSize}{wxwindowsetbestfittingsize} \membersection{wxWindow::GetBestSize}\label{wxwindowgetbestsize} @@ -2675,8 +2674,7 @@ needs of the window for layout. \helpref{wxWindow::SetSize}{wxwindowsetsize},\rtfsp \helpref{wxWindow::GetBestSize}{wxwindowgetbestsize},\rtfsp -\helpref{wxWindow::GetBestFittingSize}{wxwindowgetbestfittingsize},\rtfsp -\helpref{wxWindow::SetSizeHints}{wxwindowsetsizehints} +\helpref{wxWindow::GetBestFittingSize}{wxwindowgetbestfittingsize} \membersection{wxWindow::SetCaret}\label{wxwindowsetcaret} @@ -3292,42 +3290,9 @@ implements the following methods:\par \membersection{wxWindow::SetSizeHints}\label{wxwindowsetsizehints} -\func{virtual void}{SetSizeHints}{\param{int}{ minW}, \param{int}{ minH}, \param{int}{ maxW=-1}, \param{int}{ maxH=-1}, - \param{int}{ incW=-1}, \param{int}{ incH=-1}} - -\func{void}{SetSizeHints}{\param{const wxSize\&}{ minSize}, -\param{const wxSize\&}{ maxSize=wxDefaultSize}, \param{const wxSize\&}{ incSize=wxDefaultSize}} - - -Allows specification of minimum and maximum window sizes, and window size increments. -If a pair of values is not set (or set to -1), the default values will be used. - -\wxheading{Parameters} - -\docparam{minW}{Specifies the minimum width allowable.} - -\docparam{minH}{Specifies the minimum height allowable.} - -\docparam{maxW}{Specifies the maximum width allowable.} - -\docparam{maxH}{Specifies the maximum height allowable.} - -\docparam{incW}{Specifies the increment for sizing the width (Motif/Xt only).} - -\docparam{incH}{Specifies the increment for sizing the height (Motif/Xt only).} - -\docparam{minSize}{Minimum size.} - -\docparam{maxSize}{Maximum size.} - -\docparam{incSize}{Increment size (Motif/Xt only).} - -\wxheading{Remarks} - -If this function is called, the user will not be able to size the window outside the -given bounds. - -The resizing increments are only significant under Motif or Xt. +This method does nothing for a normal wxWindow and is only kept +for backwards compatibility. The actual implementation is in +\helpref{wxTopLevelWindow::SetSizeHints}{wxtoplevelwindowsetsizehints}. \membersection{wxWindow::SetSizer}\label{wxwindowsetsizer} diff --git a/include/wx/gtk/toplevel.h b/include/wx/gtk/toplevel.h index cd48f4f7e1..9886b2a8b1 100644 --- a/include/wx/gtk/toplevel.h +++ b/include/wx/gtk/toplevel.h @@ -121,6 +121,10 @@ protected: int width, int height, int sizeFlags = wxSIZE_AUTO); + virtual void DoSetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ); + virtual void DoSetClientSize(int width, int height); virtual void DoGetClientSize( int *width, int *height ) const; diff --git a/include/wx/toplevel.h b/include/wx/toplevel.h index 737019df45..bde3440ec7 100644 --- a/include/wx/toplevel.h +++ b/include/wx/toplevel.h @@ -250,6 +250,10 @@ public: virtual void DoUpdateWindowUI(wxUpdateUIEvent& event) ; protected: + virtual void DoSetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ); + // the frame client to screen translation should take account of the // toolbar which may shift the origin of the client area virtual void DoClientToScreen(int *x, int *y) const; diff --git a/include/wx/window.h b/include/wx/window.h index 38c73a5c10..58d24c8201 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -389,26 +389,26 @@ public: // set virtual size to satisfy children virtual void FitInside(); - // set min/max size of the window + + // Methods for setting size hints. This is only used + // for toplevel windows. + virtual void SetSizeHints( int minW, int minH, int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, int incW = wxDefaultCoord, int incH = wxDefaultCoord ) - { - DoSetSizeHints(minW, minH, maxW, maxH, incW, incH); - } + { DoSetSizeHints(minW, minH, maxW, maxH, incW, incH); } void SetSizeHints( const wxSize& minSize, const wxSize& maxSize=wxDefaultSize, const wxSize& incSize=wxDefaultSize) - { - DoSetSizeHints(minSize.x, minSize.y, - maxSize.x, maxSize.y, - incSize.x, incSize.y); - } + { DoSetSizeHints(minSize.x, minSize.y, maxSize.x, maxSize.y, incSize.x, incSize.y); } + + virtual void DoSetSizeHints( int minW, int minH, + int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, + int incW = wxDefaultCoord, int incH = wxDefaultCoord ) { } - virtual void DoSetSizeHints(int minW, int minH, - int maxW = wxDefaultCoord, int maxH = wxDefaultCoord, - int incW = wxDefaultCoord, int incH = wxDefaultCoord ); + // Methods for setting virtual size hints + // FIXME: What are virtual size hints? virtual void SetVirtualSizeHints( int minW, int minH, int maxW = wxDefaultCoord, int maxH = wxDefaultCoord ); @@ -418,17 +418,20 @@ public: SetVirtualSizeHints(minSize.x, minSize.y, maxSize.x, maxSize.y); } - virtual int GetMinWidth() const { return m_minWidth; } - virtual int GetMinHeight() const { return m_minHeight; } - int GetMaxWidth() const { return m_maxWidth; } - int GetMaxHeight() const { return m_maxHeight; } // Override this method to control the values given to Sizers etc. virtual wxSize GetMaxSize() const { return wxSize( m_maxWidth, m_maxHeight ); } virtual wxSize GetMinSize() const { return wxSize( m_minWidth, m_minHeight ); } - void SetMinSize(const wxSize& minSize) { SetSizeHints(minSize); } - void SetMaxSize(const wxSize& maxSize) { SetSizeHints(GetMinSize(), maxSize); } + // If a class doesn't override GetMinSize() or GetMaxSize() + // these values will be returned + int GetMinWidth() const { return m_minWidth; } + int GetMinHeight() const { return m_minHeight; } + int GetMaxWidth() const { return m_maxWidth; } + int GetMaxHeight() const { return m_maxHeight; } + void SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; } + void SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; } + // Methods for accessing the virtual size of a window. For most // windows this is just the client area of the window, but for diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index aa07d2f096..88350bebcf 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -140,6 +140,23 @@ bool wxTopLevelWindowBase::IsLastBeforeExit() const // wxTopLevelWindow geometry // ---------------------------------------------------------------------------- +// set the min/max size of the window +void wxTopLevelWindowBase::DoSetSizeHints(int minW, int minH, + int maxW, int maxH, + int WXUNUSED(incW), int WXUNUSED(incH)) +{ + // setting min width greater than max width leads to infinite loops under + // X11 and generally doesn't make any sense, so don't allow it + wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) && + (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH), + _T("min width/height must be less than max width/height!") ); + + m_minWidth = minW; + m_maxWidth = maxW; + m_minHeight = minH; + m_maxHeight = maxH; +} + void wxTopLevelWindowBase::GetRectForTopLevelChildren(int *x, int *y, int *w, int *h) { GetPosition(x,y); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 44b93da89d..421497abad 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -615,23 +615,6 @@ wxPoint wxWindowBase::GetClientAreaOrigin() const return wxPoint(0,0); } -// set the min/max size of the window -void wxWindowBase::DoSetSizeHints(int minW, int minH, - int maxW, int maxH, - int WXUNUSED(incW), int WXUNUSED(incH)) -{ - // setting min width greater than max width leads to infinite loops under - // X11 and generally doesn't make any sense, so don't allow it - wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) && - (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH), - _T("min width/height must be less than max width/height!") ); - - m_minWidth = minW; - m_maxWidth = maxW; - m_minHeight = minH; - m_maxHeight = maxH; -} - void wxWindowBase::SetWindowVariant( wxWindowVariant variant ) { if ( m_windowVariant != variant ) diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 5c01cae6db..08a0d0e713 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -352,19 +352,6 @@ void wxFrame::GtkOnSize() if (m_mainWidget) { - // set size hints - gint flag = 0; // GDK_HINT_POS; - if ((minWidth != -1) || (minHeight != -1)) flag |= GDK_HINT_MIN_SIZE; - if ((maxWidth != -1) || (maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE; - GdkGeometry geom; - geom.min_width = minWidth; - geom.min_height = minHeight; - geom.max_width = maxWidth; - geom.max_height = maxHeight; - gtk_window_set_geometry_hints( GTK_WINDOW(m_widget), - (GtkWidget*) NULL, - &geom, - (GdkWindowHints) flag ); // TODO // Rewrite this terrible code to using GtkVBox diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index d243ce4b58..85f4b536dd 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -958,43 +958,19 @@ void wxTopLevelWindowGTK::DoSetClientSize( int width, int height ) width + m_miniEdge*2, height + m_miniEdge*2 + m_miniTitle, 0); } -void wxTopLevelWindowGTK::GtkOnSize() +void wxTopLevelWindowGTK::DoSetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ) { - // avoid recursions - if (m_resizing) return; - m_resizing = true; - - if ( m_wxwindow == NULL ) return; - - /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses - wxWindow::Create to create it's GTK equivalent. m_mainWidget is only - set in wxFrame::Create so it is used to check what kind of frame we - have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we - skip the part which handles m_frameMenuBar, m_frameToolBar and (most - importantly) m_mainWidget */ - - int minWidth = GetMinWidth(), - minHeight = GetMinHeight(), - maxWidth = GetMaxWidth(), - maxHeight = GetMaxHeight(); - -#ifdef __WXGPE__ - // GPE's window manager doesn't like size hints - // at all, esp. when the user has to use the - // virtual keyboard. - minWidth = -1; - minHeight = -1; - maxWidth = -1; - maxHeight = -1; -#endif - - if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth; - if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight; - if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth; - if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight; - - if (m_mainWidget) + wxTopLevelWindowBase::DoSetSizeHints( minW, minH, maxW, maxH, incW, incH ); + + if (m_widget) { + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + // set size hints gint flag = 0; // GDK_HINT_POS; GdkGeometry geom; @@ -1031,13 +1007,49 @@ void wxTopLevelWindowGTK::GtkOnSize() (GtkWidget*) NULL, &geom, (GdkWindowHints) flag ); + } +} - /* I revert back to wxGTK's original behaviour. m_mainWidget holds the - * menubar, the toolbar and the client area, which is represented by - * m_wxwindow. - * this hurts in the eye, but I don't want to call SetSize() - * because I don't want to call any non-native functions here. */ +void wxTopLevelWindowGTK::GtkOnSize() +{ + // avoid recursions + if (m_resizing) return; + m_resizing = true; + + if ( m_wxwindow == NULL ) return; + + /* wxMDIChildFrame derives from wxFrame but it _is_ a wxWindow as it uses + wxWindow::Create to create it's GTK equivalent. m_mainWidget is only + set in wxFrame::Create so it is used to check what kind of frame we + have here. if m_mainWidget is NULL it is a wxMDIChildFrame and so we + skip the part which handles m_frameMenuBar, m_frameToolBar and (most + importantly) m_mainWidget */ + + int minWidth = GetMinWidth(), + minHeight = GetMinHeight(), + maxWidth = GetMaxWidth(), + maxHeight = GetMaxHeight(); + +#ifdef __WXGPE__ + // GPE's window manager doesn't like size hints + // at all, esp. when the user has to use the + // virtual keyboard. + minWidth = -1; + minHeight = -1; + maxWidth = -1; + maxHeight = -1; +#endif + + if ((minWidth != -1) && (m_width < minWidth)) m_width = minWidth; + if ((minHeight != -1) && (m_height < minHeight)) m_height = minHeight; + if ((maxWidth != -1) && (m_width > maxWidth)) m_width = maxWidth; + if ((maxHeight != -1) && (m_height > maxHeight)) m_height = maxHeight; + + if (m_mainWidget) + { + // m_mainWidget holds the menubar, the toolbar and the client area, + // which is represented by m_wxwindow. int client_x = m_miniEdge; int client_y = m_miniEdge + m_miniTitle; int client_w = m_width - 2*m_miniEdge; -- 2.47.2