#include "wx/unix/utilsx11.h"
+// XA_CARDINAL
+#include <X11/Xatom.h>
+
// ----------------------------------------------------------------------------
// idle system
// ----------------------------------------------------------------------------
wxapp_install_idle_handler();
if (win->IsEnabled() &&
- (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)))
+ (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
+ win->IsGrabbed()))
win->Close();
return TRUE;
m_miniTitle = 0;
m_mainWidget = (GtkWidget*) NULL;
m_insertInClientArea = TRUE;
- m_isFrame = TRUE;
m_isIconized = FALSE;
m_fsIsShowing = FALSE;
m_themeEnabled = TRUE;
m_gdkDecor = m_gdkFunc = 0;
+ m_grabbed = FALSE;
}
bool wxTopLevelWindowGTK::Create( wxWindow *parent,
wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
{
+ if (m_grabbed)
+ {
+ wxASSERT_MSG( FALSE, "Window still grabbed");
+ RemoveGrab();
+ }
+
m_isBeingDeleted = TRUE;
// it may also be GtkScrolledWindow in the case of an MDI child
}
}
+
+// 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)
+{
+ 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;
+}
+
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;
if (show)
GetPosition( &m_fsSaveFrame.x, &m_fsSaveFrame.y );
GetSize( &m_fsSaveFrame.width, &m_fsSaveFrame.height );
- gtk_widget_hide( m_widget );
- gtk_widget_unrealize( m_widget );
-
- m_gdkDecor = (long) GDK_DECOR_BORDER;
- m_gdkFunc = (long) GDK_FUNC_MOVE;
+ int screen_width,screen_height;
+ wxDisplaySize( &screen_width, &screen_height );
+
+ gint client_x, client_y, root_x, root_y;
+ gint width, height;
- int x;
- int y;
- wxDisplaySize( &x, &y );
- SetSize( 0, 0, x, y );
+ 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 );
- gtk_widget_realize( m_widget );
- gtk_widget_show( m_widget );
+ gdk_window_move_resize (m_widget->window, -client_x, -client_y,
+ screen_width + 1, screen_height + 1);
}
else
{
- gtk_widget_hide( m_widget );
- gtk_widget_unrealize( m_widget );
-
- m_gdkFunc = m_fsSaveGdkFunc;
- m_gdkDecor = m_fsSaveGdkDecor;
-
+ wx_win_hints_set_layer( m_widget, WIN_LAYER_NORMAL );
+
SetSize( m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height );
-
- gtk_widget_realize( m_widget );
- gtk_widget_show( m_widget );
}
return TRUE;
{
if (x != -1) m_x = x;
if (y != -1) m_y = y;
- if (width != -1) m_width = width;
- if (height != -1) m_height = height;
}
else
{
m_x = x;
m_y = y;
- m_width = width;
- m_height = height;
}
+ if (width != -1) m_width = width;
+ if (height != -1) m_height = height;
/*
if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
if (m_mainWidget)
{
// set size hints
- gint flag = 0; // GDK_HINT_POS;
+ gint flag = 0; // GDK_HINT_POS;
+ GdkGeometry geom;
+
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;
+
+ // Because of the way we set GDK_HINT_MAX_SIZE above, if either of
+ // maxHeight or maxWidth is set, we must set them both, else the
+ // remaining -1 will be taken literally.
+
+ // I'm certain this also happens elsewhere, and is the probable
+ // cause of other such things as:
+ // Gtk-WARNING **: gtk_widget_size_allocate():
+ // attempt to allocate widget with width 65535 and height 600
+ // but I don't have time to track them all now..
+ //
+ // Really we need to encapulate all this height/width business and
+ // stop any old method from ripping at the members directly and
+ // scattering -1's without regard for who might resolve them later.
+
+ geom.max_width = ( maxHeight == -1 ) ? maxWidth
+ : ( maxWidth == -1 ) ? wxGetDisplaySize().GetWidth()
+ : maxWidth ;
+
+ geom.max_height = ( maxWidth == -1 ) ? maxHeight // ( == -1 here )
+ : ( maxHeight == -1 ) ? wxGetDisplaySize().GetHeight()
+ : maxHeight ;
+
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
(GtkWidget*) NULL,
&geom,
int client_y = m_miniEdge + m_miniTitle;
int client_w = m_width - 2*m_miniEdge;
int client_h = m_height - 2*m_miniEdge - m_miniTitle;
+
gtk_pizza_set_size( GTK_PIZZA(m_mainWidget),
m_wxwindow,
client_x, client_y, client_w, client_h );
// set the focus if not done yet and if we can already do it
if ( GTK_WIDGET_REALIZED(m_wxwindow) )
{
- if ( g_delayedFocus && wxGetTopLevelParent(g_delayedFocus) == this )
+ if ( g_delayedFocus &&
+ wxGetTopLevelParent((wxWindow*)g_delayedFocus) == this )
{
g_delayedFocus->SetFocus();
g_delayedFocus = NULL;
}
}
+void wxTopLevelWindowGTK::AddGrab()
+{
+ if (!m_grabbed)
+ {
+ m_grabbed = TRUE;
+ gtk_grab_add( m_widget );
+ gtk_main();
+ gtk_grab_remove( m_widget );
+ }
+}
+
+void wxTopLevelWindowGTK::RemoveGrab()
+{
+ if (m_grabbed)
+ {
+ gtk_main_quit();
+ m_grabbed = FALSE;
+ }
+}
+
+// vi:sts=4:sw=4:et