X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/693460233749fec3bf79720268d3cd8dfc55c78d..d2b23b67301bd2d286366d4326a21da3132558fa:/src/gtk/frame.cpp?ds=inline diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 4a43ba6aee..feaf71767f 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -10,40 +10,23 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - #include "wx/frame.h" #ifndef WX_PRECOMP - #include "wx/app.h" - #include "wx/dcclient.h" #include "wx/menu.h" - #include "wx/dialog.h" - #include "wx/control.h" #include "wx/toolbar.h" #include "wx/statusbr.h" #endif // WX_PRECOMP -#include -#include "wx/gtk/private.h" - -#include -#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 @@ -82,9 +65,6 @@ static void gtk_menu_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidget * extern "C" { static void gtk_menu_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win ) { - if (g_isIdle) - wxapp_install_idle_handler(); - if (!win->m_hasVMT) return; // Raise the client area area @@ -119,9 +99,6 @@ static void gtk_toolbar_attached_callback( GtkWidget *WXUNUSED(widget), GtkWidge extern "C" { static void gtk_toolbar_detached_callback( GtkWidget *WXUNUSED(widget), GtkWidget *WXUNUSED(child), wxFrame *win ) { - if (g_isIdle) - wxapp_install_idle_handler(); - if (!win->m_hasVMT) return; // Raise the client area area @@ -156,7 +133,7 @@ static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child ) // These are outside the client area wxFrame* frame = (wxFrame*) parent; gtk_pizza_put( GTK_PIZZA(frame->m_mainWidget), - GTK_WIDGET(child->m_widget), + child->m_widget, child->m_x, child->m_y, child->m_width, @@ -184,7 +161,7 @@ static void wxInsertChildInFrame( wxFrame* parent, wxWindow* child ) { // These are inside the client area gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow), - GTK_WIDGET(child->m_widget), + child->m_widget, child->m_x, child->m_y, child->m_width, @@ -238,7 +215,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; @@ -249,36 +226,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->IsVertical() ) + { + 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 - if (*height < 0) - *height = 0; } +#endif // wxUSE_TOOLBAR + + if (width != NULL && *width < 0) + *width = 0; + if (height != NULL && *height < 0) + *height = 0; } void wxFrame::DoSetClientSize( int width, int height ) @@ -287,7 +271,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; @@ -298,7 +282,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 @@ -313,7 +299,7 @@ void wxFrame::DoSetClientSize( int width, int height ) { int x, y; m_frameToolBar->GetSize( &x, &y ); - if ( m_frameToolBar->GetWindowStyle() & wxTB_VERTICAL ) + if ( m_frameToolBar->IsVertical() ) { width += x; } @@ -360,29 +346,17 @@ 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 ); - - // 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. + // TODO + // Rewrite this terrible code to using GtkVBox + + // 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; @@ -399,6 +373,14 @@ void wxFrame::GtkOnSize() 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 @@ -427,11 +409,33 @@ void wxFrame::GtkOnSize() ww = m_toolBarDetached ? wxPLACE_HOLDER : m_frameToolBar->m_width; hh = m_height - 2*m_miniEdge; - if (hh < 0) - hh = 0; client_area_x_offset += ww; } + else if( m_frameToolBar->HasFlag(wxTB_RIGHT) ) + { + yy += 2; + ww = m_toolBarDetached ? wxPLACE_HOLDER + : m_frameToolBar->m_width; + xx = GetClientSize().x - 1; + hh = m_height - 2*m_miniEdge; + if( hh < 0 ) + hh = 0; + + } + 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; @@ -441,6 +445,10 @@ void wxFrame::GtkOnSize() 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 ); @@ -466,8 +474,12 @@ void wxFrame::GtkOnSize() } #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; @@ -482,6 +494,14 @@ void wxFrame::GtkOnSize() m_frameStatusBar->m_widget, xx, yy, ww, hh ); } + else + { + if (m_frameStatusBar) + { + if (GTK_WIDGET_VISIBLE(m_frameStatusBar->m_widget)) + gtk_widget_hide( m_frameStatusBar->m_widget ); + } + } #endif // wxUSE_STATUSBAR m_sizeSet = true; @@ -605,20 +625,22 @@ void wxFrame::AttachMenuBar( wxMenuBar *menuBar ) void wxFrame::UpdateMenuBarSize() { - GtkRequisition req; - - req.width = 2; - req.height = 2; + m_menuBarHeight = 2; // this is called after Remove with a NULL m_frameMenuBar if ( m_frameMenuBar ) - (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(m_frameMenuBar->m_widget) )->size_request ) - (m_frameMenuBar->m_widget, &req ); - - m_menuBarHeight = req.height; + { + GtkRequisition req; + gtk_widget_ensure_style(m_frameMenuBar->m_widget); + // have to call class method directly because + // "size_request" signal is overridden by wx + GTK_WIDGET_GET_CLASS(m_frameMenuBar->m_widget)->size_request( + m_frameMenuBar->m_widget, &req); + + m_menuBarHeight = req.height; + } // resize window in OnInternalIdle - GtkUpdateSize(); }