bool wxFrame::ShowFullScreen(bool show, long style) { if (!wxFrameBase::ShowFullScreen(show, style)) return false; #if wxUSE_MENUS && wxUSE_ACCEL if (show && GetMenuBar()) { wxAcceleratorTable table(wxCreateAcceleratorTableForMenuBar(GetMenuBar())); if (table.IsOk()) SetAcceleratorTable(table); } #endif // wxUSE_MENUS && wxUSE_ACCEL wxWindow* const bar[] = { #if wxUSE_MENUS m_frameMenuBar, #else NULL, #endif #if wxUSE_TOOLBAR m_frameToolBar, #else NULL, #endif #if wxUSE_STATUSBAR m_frameStatusBar, #else NULL, #endif }; const long fsNoBar[] = { wxFULLSCREEN_NOMENUBAR, wxFULLSCREEN_NOTOOLBAR, wxFULLSCREEN_NOSTATUSBAR }; for (int i = 0; i < 3; i++) { if (show) { if (bar[i] && (style & fsNoBar[i])) { if (bar[i]->IsShown()) bar[i]->Show(false); else style &= ~fsNoBar[i]; } } else { if (bar[i] && (m_fsSaveFlag & fsNoBar[i])) bar[i]->Show(true); } } if (show) m_fsSaveFlag = style; return true; }
bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) { if (show == m_fsIsShowing) return false; // return what? if (show) { // Preserve menubar accelerators during full-screen operation wxFrame* frame = wxDynamicCast(this, wxFrame); if (frame) { if (frame->GetMenuBar()) { wxAcceleratorTable table(wxCreateAcceleratorTableForMenuBar(frame->GetMenuBar())); if (table.IsOk()) SetAcceleratorTable(table); } #if wxUSE_TOOLBAR if (frame->GetToolBar() && frame->GetToolBar()->IsShown()) { frame->GetToolBar()->Show(false); } #endif } } #if wxUSE_TOOLBAR else { // FIXME: we need to remember whether the toolbar was previously hidden wxFrame* frame = wxDynamicCast(this, wxFrame); if (frame && frame->GetToolBar()) { frame->GetToolBar()->Show(true); } } #endif m_fsIsShowing = show; wxX11FullScreenMethod method = wxGetFullScreenMethodX11((WXDisplay*)GDK_DISPLAY(), (WXWindow)GDK_ROOT_WINDOW()); #if GTK_CHECK_VERSION(2,2,0) // NB: gtk_window_fullscreen() uses freedesktop.org's WMspec extensions // to switch to fullscreen, which is not always available. We must // check if WM supports the spec and use legacy methods if it // doesn't. if ( (method == wxX11_FS_WMSPEC) && !gtk_check_version(2,2,0) ) { if (show) { m_fsSaveFlag = style; gtk_window_fullscreen( GTK_WINDOW( m_widget ) ); } else { m_fsSaveFlag = 0; gtk_window_unfullscreen( GTK_WINDOW( m_widget ) ); } } else #endif // GTK+ >= 2.2.0 { GdkWindow *window = m_widget->window; if (show) { m_fsSaveFlag = style; GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y ); GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height ); int screen_width,screen_height; wxDisplaySize( &screen_width, &screen_height ); gint client_x, client_y, root_x, root_y; gint width, height; if (method != wxX11_FS_WMSPEC) { // don't do it always, Metacity hates it m_fsSaveGdkFunc = m_gdkFunc; m_fsSaveGdkDecor = m_gdkDecor; m_gdkFunc = m_gdkDecor = 0; gdk_window_set_decorations(window, (GdkWMDecoration)0); gdk_window_set_functions(window, (GdkWMFunction)0); } gdk_window_get_origin (m_widget->window, &root_x, &root_y); gdk_window_get_geometry (m_widget->window, &client_x, &client_y, &width, &height, NULL); gdk_window_move_resize (m_widget->window, -client_x, -client_y, screen_width + 1, screen_height + 1); wxSetFullScreenStateX11((WXDisplay*)GDK_DISPLAY(), (WXWindow)GDK_ROOT_WINDOW(), (WXWindow)GDK_WINDOW_XWINDOW(window), show, &m_fsSaveFrame, method); } else // hide { m_fsSaveFlag = 0; if (method != wxX11_FS_WMSPEC) { // don't do it always, Metacity hates it m_gdkFunc = m_fsSaveGdkFunc; m_gdkDecor = m_fsSaveGdkDecor; gdk_window_set_decorations(window, (GdkWMDecoration)m_gdkDecor); gdk_window_set_functions(window, (GdkWMFunction)m_gdkFunc); } wxSetFullScreenStateX11((WXDisplay*)GDK_DISPLAY(), (WXWindow)GDK_ROOT_WINDOW(), (WXWindow)GDK_WINDOW_XWINDOW(window), show, &m_fsSaveFrame, method); SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height); } } // documented behaviour is to show the window if it's still hidden when // showing it full screen if ( show && !IsShown() ) Show(); return true; }