X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..f68c6b523c1117c90c1cf690745c807bc024789d:/src/gtk1/toplevel.cpp diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp index 0866c33410..d77ae76a91 100644 --- a/src/gtk1/toplevel.cpp +++ b/src/gtk1/toplevel.cpp @@ -31,6 +31,7 @@ #include "wx/app.h" #include "wx/dcclient.h" #include "wx/gtk/private.h" +#include "wx/timer.h" #include #include @@ -226,7 +227,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev (char *)"base", 0, 0, -1, -1); - return TRUE; + return FALSE; } //----------------------------------------------------------------------------- @@ -385,13 +386,16 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS ); gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget ); - // for m_mainWidget themes - gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event", + if (m_miniEdge == 0) // wxMiniFrame has its own version. + { + // For m_mainWidget themes + gtk_signal_connect( GTK_OBJECT(m_mainWidget), "expose_event", GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this ); #ifndef __WXGTK20__ - gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw", + gtk_signal_connect( GTK_OBJECT(m_mainWidget), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); #endif + } // m_wxwindow only represents the client area without toolbar and menubar m_wxwindow = gtk_pizza_new(); @@ -496,69 +500,20 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK() } -// X11 ICCCM values for window layers -#define WIN_LAYER_NORMAL 4 -#define WIN_LAYER_ABOVE_DOCK 10 - -// X11 window manager property name -#define XA_WIN_LAYER "_WIN_LAYER" - -// X11 window manager property name atom -static Atom gs_XA_WIN_LAYER = 0; - - -static void wx_win_hints_set_layer(GtkWidget *window, int layer) -{ -#ifndef __WXGTK20__ - XEvent xev; - GdkWindowPrivate *priv; - gint prev_error; - - prev_error = gdk_error_warnings; - gdk_error_warnings = 0; - priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); - - if (GTK_WIDGET_MAPPED(window)) - { - xev.type = ClientMessage; - xev.xclient.type = ClientMessage; - xev.xclient.window = priv->xwindow; - xev.xclient.message_type = gs_XA_WIN_LAYER; - xev.xclient.format = 32; - xev.xclient.data.l[0] = (long)layer; - xev.xclient.data.l[1] = gdk_time_get(); - - XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, - SubstructureNotifyMask, (XEvent*) &xev); - } - else - { - long data[1]; - - data[0] = layer; - XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, - XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); - } - gdk_error_warnings = prev_error; -#endif -} bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) { if (show == m_fsIsShowing) return FALSE; // return what? - if (gs_XA_WIN_LAYER == 0) - { - // Initialose X11 Atom only once - gs_XA_WIN_LAYER = XInternAtom( GDK_DISPLAY(), XA_WIN_LAYER, False ); - } - m_fsIsShowing = show; + GdkWindow *window = m_widget->window; + wxX11FullScreenMethod method = + wxGetFullScreenMethodX11((WXDisplay*)GDK_DISPLAY(), + (WXWindow)GDK_ROOT_WINDOW()); + if (show) { - m_fsSaveGdkFunc = m_gdkFunc; - m_fsSaveGdkDecor = m_gdkDecor; m_fsSaveFlag = style; GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y ); GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height ); @@ -569,22 +524,49 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) gint client_x, client_y, root_x, root_y; gint width, height; + if (method == wxX11_FS_GENERIC) + { + // 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); - wx_win_hints_set_layer( m_widget, WIN_LAYER_ABOVE_DOCK ); - 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 { - wx_win_hints_set_layer( m_widget, WIN_LAYER_NORMAL ); - - SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height ); + if (method == wxX11_FS_GENERIC) + { + // 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); } + return TRUE; }