X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/848332140be2d53aea32d0702f4c0e06c149d24b..8168167976dc3cc5f5223a21e1a62ba91a4f77b3:/src/gtk/frame.cpp diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index e35a025f7a..b7b4fec93a 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: frame.cpp +// Name: src/gtk/frame.cpp // Purpose: // Author: Robert Roebling // Id: $Id$ @@ -7,46 +7,26 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/defs.h" - #include "wx/frame.h" -#include "wx/dialog.h" -#include "wx/control.h" -#include "wx/app.h" -#include "wx/menu.h" -#if wxUSE_TOOLBAR + +#ifndef WX_PRECOMP + #include "wx/menu.h" #include "wx/toolbar.h" -#endif -#if wxUSE_STATUSBAR #include "wx/statusbr.h" -#endif -#include "wx/dcclient.h" +#endif // WX_PRECOMP -#include #include "wx/gtk/private.h" - -#include -#include - #include "wx/gtk/win_gtk.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -const int wxSTATUS_HEIGHT = 25; -const int wxPLACE_HOLDER = 0; +static const int wxSTATUS_HEIGHT = 25; +static const int wxPLACE_HOLDER = 0; // ---------------------------------------------------------------------------- // event tables @@ -193,9 +173,6 @@ static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child ) child->m_width, child->m_height ); } - - // Resize on OnInternalIdle - parent->GtkUpdateSize(); } // ---------------------------------------------------------------------------- @@ -244,7 +221,7 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const { #if wxUSE_MENUS_NATIVE // menu bar - if (m_frameMenuBar) + if (m_frameMenuBar && !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOMENUBAR != 0))) { if (!m_menuBarDetached) (*height) -= m_menuBarHeight; @@ -255,34 +232,43 @@ void wxFrame::DoGetClientSize( int *width, int *height ) const #if wxUSE_STATUSBAR // status bar - if (m_frameStatusBar && m_frameStatusBar->IsShown()) + if (m_frameStatusBar && m_frameStatusBar->IsShown() && + !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOSTATUSBAR != 0))) (*height) -= wxSTATUS_HEIGHT; #endif // wxUSE_STATUSBAR + } #if wxUSE_TOOLBAR - // tool bar - if (m_frameToolBar && m_frameToolBar->IsShown()) + // tool bar + if (m_frameToolBar && m_frameToolBar->IsShown()) + { + if (m_toolBarDetached) { - if (m_toolBarDetached) - { + if (height != NULL) *height -= wxPLACE_HOLDER; + } + else + { + int x, y; + m_frameToolBar->GetSize( &x, &y ); + if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL ) + { + if (width != NULL) + *width -= x; } else { - int x, y; - m_frameToolBar->GetSize( &x, &y ); - if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL ) - { - *width -= x; - } - else - { + if (height != NULL) *height -= y; - } } } -#endif // wxUSE_TOOLBAR } +#endif // wxUSE_TOOLBAR + + if (width != NULL && *width < 0) + *width = 0; + if (height != NULL && *height < 0) + *height = 0; } void wxFrame::DoSetClientSize( int width, int height ) @@ -291,7 +277,7 @@ void wxFrame::DoSetClientSize( int width, int height ) #if wxUSE_MENUS_NATIVE // menu bar - if (m_frameMenuBar) + if (m_frameMenuBar && !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOMENUBAR != 0))) { if (!m_menuBarDetached) height += m_menuBarHeight; @@ -302,7 +288,9 @@ void wxFrame::DoSetClientSize( int width, int height ) #if wxUSE_STATUSBAR // status bar - if (m_frameStatusBar && m_frameStatusBar->IsShown()) height += wxSTATUS_HEIGHT; + if (m_frameStatusBar && m_frameStatusBar->IsShown() && + !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOSTATUSBAR != 0))) + height += wxSTATUS_HEIGHT; #endif #if wxUSE_TOOLBAR @@ -332,13 +320,8 @@ void wxFrame::DoSetClientSize( int width, int height ) wxTopLevelWindow::DoSetClientSize( width, height ); } -void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), - int width, int height ) +void wxFrame::GtkOnSize() { - // due to a bug in gtk, x,y are always 0 - // m_x = x; - // m_y = y; - // avoid recursions if (m_resizing) return; m_resizing = true; @@ -346,9 +329,6 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), // this shouldn't happen: wxFrame, wxMDIParentFrame and wxMDIChildFrame have m_wxwindow wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid frame") ); - m_width = width; - m_height = height; - // space occupied by m_frameToolBar and m_frameMenuBar int client_area_x_offset = 0, client_area_y_offset = 0; @@ -385,19 +365,22 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), (GtkWidget*) NULL, &geom, (GdkWindowHints) flag ); + // TODO + // Rewrite this terrible code to using GtkVBox - // 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. + // m_mainWidget holds the menubar, the toolbar and the client + // area, which is represented by m_wxwindow. #if wxUSE_MENUS_NATIVE - if (m_frameMenuBar) + if (m_frameMenuBar && !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOMENUBAR != 0))) { + if (!GTK_WIDGET_VISIBLE(m_frameMenuBar->m_widget)) + gtk_widget_show( m_frameMenuBar->m_widget ); int xx = m_miniEdge; int yy = m_miniEdge + m_miniTitle; int ww = m_width - 2*m_miniEdge; + if (ww < 0) + ww = 0; int hh = m_menuBarHeight; if (m_menuBarDetached) hh = wxPLACE_HOLDER; m_frameMenuBar->m_x = xx; @@ -409,6 +392,14 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), xx, yy, ww, hh ); client_area_y_offset += hh; } + else + { + if (m_frameMenuBar) + { + if (GTK_WIDGET_VISIBLE(m_frameMenuBar->m_widget)) + gtk_widget_hide( m_frameMenuBar->m_widget ); + } + } #endif // wxUSE_MENUS_NATIVE #if wxUSE_TOOLBAR @@ -440,6 +431,19 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), client_area_x_offset += ww; } + else if( m_frameToolBar->GetWindowStyle() & wxTB_BOTTOM ) + { + xx = m_miniEdge; + yy = GetClientSize().y; +#if wxUSE_MENUS_NATIVE + yy += m_menuBarHeight; +#endif // wxUSE_MENU_NATIVE + m_frameToolBar->m_x = xx; + m_frameToolBar->m_y = yy; + ww = m_width - 2*m_miniEdge; + hh = m_toolBarDetached ? wxPLACE_HOLDER + : m_frameToolBar->m_height; + } else { ww = m_width - 2*m_miniEdge; @@ -449,6 +453,10 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), client_area_y_offset += hh; } + if (ww < 0) + ww = 0; + if (hh < 0) + hh = 0; gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), m_frameToolBar->m_widget, xx, yy, ww, hh ); @@ -459,6 +467,10 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int client_y = client_area_y_offset + m_miniEdge + m_miniTitle; int client_w = m_width - client_area_x_offset - 2*m_miniEdge; int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle; + if (client_w < 0) + client_w = 0; + if (client_h < 0) + client_h = 0; gtk_pizza_set_size( GTK_PIZZA(m_mainWidget), m_wxwindow, client_x, client_y, client_w, client_h ); @@ -470,11 +482,17 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), } #if wxUSE_STATUSBAR - if (m_frameStatusBar && m_frameStatusBar->IsShown()) + if (m_frameStatusBar && m_frameStatusBar->IsShown() && + !(m_fsIsShowing && (m_fsSaveFlag & wxFULLSCREEN_NOSTATUSBAR != 0))) { + if (!GTK_WIDGET_VISIBLE(m_frameStatusBar->m_widget)) + gtk_widget_show( m_frameStatusBar->m_widget ); + int xx = 0 + m_miniEdge; int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset; int ww = m_width - 2*m_miniEdge; + if (ww < 0) + ww = 0; int hh = wxSTATUS_HEIGHT; m_frameStatusBar->m_x = xx; m_frameStatusBar->m_y = yy; @@ -483,11 +501,13 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), gtk_pizza_set_size( GTK_PIZZA(m_wxwindow), m_frameStatusBar->m_widget, xx, yy, ww, hh ); - if (GTK_WIDGET_DRAWABLE (m_frameStatusBar->m_widget)) + } + else + { + if (m_frameStatusBar) { - gtk_widget_queue_draw (m_frameStatusBar->m_widget); - // FIXME: Do we really want to force an immediate redraw? - gdk_window_process_updates (m_frameStatusBar->m_widget->window, TRUE); + if (GTK_WIDGET_VISIBLE(m_frameStatusBar->m_widget)) + gtk_widget_hide( m_frameStatusBar->m_widget ); } } #endif // wxUSE_STATUSBAR