]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/popupwin.cpp
Preserve previous state of sizers.
[wxWidgets.git] / src / x11 / popupwin.cpp
index 6f9c4b7e500957d798d5982f494d0d7783fb6903..34d95b1f2c880fb8caa68f6d7e901a7d87cba62c 100644 (file)
@@ -7,18 +7,22 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "popupwin.h"
 #endif
 
 #include "wx/defs.h"
+#include "wx/log.h"
 
 #if wxUSE_POPUPWIN
 
 #include "wx/popupwin.h"
 #include "wx/app.h"
+#include "wx/settings.h"
 
 #include "wx/x11/private.h"
+#include "X11/Xatom.h"
+#include "X11/Xutil.h"
 
 //-----------------------------------------------------------------------------
 // wxPopupWindow
@@ -29,9 +33,13 @@ END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow)
 
+wxPopupWindow::~wxPopupWindow()
+{
+}
+
 bool wxPopupWindow::Create( wxWindow *parent, int style )
 {
-    if (!CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, "popup" ))
+    if (!CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, wxT("popup") ))
     {
         wxFAIL_MSG( wxT("wxPopupWindow creation failed") );
         return FALSE;
@@ -40,63 +48,181 @@ bool wxPopupWindow::Create( wxWindow *parent, int style )
     // All dialogs should really have this style
     m_windowStyle = style;
     m_windowStyle |= wxTAB_TRAVERSAL;
+    
+    wxPoint pos( 20,20 );
+    wxSize size( 20,20 );
+    wxPoint pos2 = pos;
+    wxSize size2 = size;
 
     m_parent = parent;
     if (m_parent) m_parent->AddChild( this );
 
-    wxTopLevelWindows.Append(this);
-    
     Display *xdisplay = wxGlobalDisplay();
     int xscreen = DefaultScreen( xdisplay );
     Visual *xvisual = DefaultVisual( xdisplay, xscreen );
     Window xparent = RootWindow( xdisplay, xscreen );
+    Colormap cm = DefaultColormap( xdisplay, xscreen);
+    
+#if wxUSE_TWO_WINDOWS
+    bool need_two_windows = 
+        ((( wxSUNKEN_BORDER | wxRAISED_BORDER | wxSIMPLE_BORDER | wxHSCROLL | wxVSCROLL ) & m_windowStyle) != 0);
+#else
+    bool need_two_windows = FALSE;
+#endif
+
+#if wxUSE_NANOX
+    long xattributes_mask = 0;
+#else
     
     XSetWindowAttributes xattributes;
-    XSizeHints size_hints;
-    XWMHints wm_hints;
+    long xattributes_mask = 0;
+
+    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
+    m_backgroundColour.CalcPixel( (WXColormap) cm);
+    
+    m_foregroundColour = *wxBLACK;
+    m_foregroundColour.CalcPixel( (WXColormap) cm);
+    
+    xattributes_mask |= CWBackPixel;
+    xattributes.background_pixel = m_backgroundColour.GetPixel();
     
-    long xattributes_mask =
-        CWEventMask |
-        CWBorderPixel | CWBackPixel;
-    xattributes.background_pixel = BlackPixel( xdisplay, xscreen );
+    xattributes_mask |= CWBorderPixel;
     xattributes.border_pixel = BlackPixel( xdisplay, xscreen );
-    xattributes.override_redirect = False;
     
-    Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y, 
-       0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+    xattributes_mask |= CWOverrideRedirect | CWSaveUnder;
+    xattributes.override_redirect = True;
+    xattributes.save_under = True;
     
-    XSelectInput( xdisplay, xwindow,
-        ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
-        ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
-        KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
-        PropertyChangeMask );
-
-    m_mainWindow = (WXWindow) xwindow;
-    wxAddWindowToTable( xwindow, (wxWindow*) this );
+    xattributes_mask |= CWEventMask;
+#endif
+    
+    if (need_two_windows)
+    {
+#if !wxUSE_NANOX
+        xattributes.event_mask = 
+            ExposureMask | StructureNotifyMask | ColormapChangeMask;
+#endif
+        
+        Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y, 
+            0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+
+#if wxUSE_NANOX    
+        XSelectInput( xdisplay, xwindow,
+          ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+          ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+          KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+          PropertyChangeMask );
+#endif
     
-    XSetTransientForHint( xdisplay, xwindow, xparent );
+        // Set background to None which will prevent X11 from clearing the
+        // background comletely.
+        XSetWindowBackgroundPixmap( xdisplay, xwindow, None );
     
-    size_hints.flags = PSize;
-    size_hints.width = size.x;
-    size_hints.height = size.y;
-    XSetWMNormalHints( xdisplay, xwindow, &size_hints);
+        m_mainWindow = (WXWindow) xwindow;
+        wxAddWindowToTable( xwindow, (wxWindow*) this );
+        
+        // XMapWindow( xdisplay, xwindow );
+#if !wxUSE_NANOX    
+        xattributes.event_mask = 
+            ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+            ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+            KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+            PropertyChangeMask | VisibilityChangeMask ;
+#endif
+        
+        if (HasFlag( wxSUNKEN_BORDER) || HasFlag( wxRAISED_BORDER))
+        {
+            pos2.x = 2;
+            pos2.y = 2;
+            size2.x -= 4;
+            size2.y -= 4;
+        } else
+        if (HasFlag( wxSIMPLE_BORDER ))
+        {
+            pos2.x = 1;
+            pos2.y = 1;
+            size2.x -= 2;
+            size2.y -= 2;
+        } else
+        {
+            pos2.x = 0;
+            pos2.y = 0;
+        }
+        
+        xwindow = XCreateWindow( xdisplay, xwindow, pos2.x, pos2.y, size2.x, size2.y, 
+            0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+    
+        // Set background to None which will prevent X11 from clearing the
+        // background comletely.
+        XSetWindowBackgroundPixmap( xdisplay, xwindow, None );
+    
+#if wxUSE_NANOX    
+        XSelectInput( xdisplay, xwindow,
+            ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+            ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+            KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+            PropertyChangeMask );
+#endif
+    
+        m_clientWindow = (WXWindow) xwindow;
+        wxAddClientWindowToTable( xwindow, (wxWindow*) this );
+        
+        m_isShown = FALSE;
+        XMapWindow( xdisplay, xwindow );
+    }
+    else
+    {
+        // One window
+#if !wxUSE_NANOX
+        xattributes.event_mask = 
+            ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+            ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+            KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+            PropertyChangeMask | VisibilityChangeMask ;
+#endif
+        
+        Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y, 
+            0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+
+#if wxUSE_NANOX
+        XSelectInput( xdisplay, xwindow,
+          ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+          ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+          KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+          PropertyChangeMask );
+#endif
+        
+        // Set background to None which will prevent X11 from clearing the
+        // background comletely.
+        XSetWindowBackgroundPixmap( xdisplay, xwindow, None );
     
+        m_mainWindow = (WXWindow) xwindow;
+        m_clientWindow = (WXWindow) xwindow;
+        wxAddWindowToTable( xwindow, (wxWindow*) this );
+        
+        m_isShown = FALSE;
+        // XMapWindow( xdisplay, xwindow );
+    }
+
+    XSetTransientForHint( xdisplay, (Window) m_mainWindow, xparent );
+
+#if wxUSE_NANOX
+    // Switch off WM
+    wxSetWMDecorations( (Window) m_mainWindow, 0 );
+#else
+    XWMHints wm_hints;
     wm_hints.flags = InputHint | StateHint /* | WindowGroupHint */;
     wm_hints.input = True;
     wm_hints.initial_state = NormalState;
-    XSetWMHints( xdisplay, xwindow, &wm_hints);
-    
-    Atom wm_delete_window = XInternAtom( xdisplay, "WM_DELETE_WINDOW", False);
-    XSetWMProtocols( xdisplay, xwindow, &wm_delete_window, 1);
+    XSetWMHints( xdisplay, (Window) m_mainWindow, &wm_hints);
+#endif
     
-    wxSetWMDecorations((Window) GetMainWindow(), style);
-
     return TRUE;
 }
 
-void wxPopupWindow::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
+void wxPopupWindow::DoMoveWindow(int x, int y, int width, int height )
 {
-    wxFAIL_MSG( wxT("DoMoveWindow called for wxPopupWindow") );
+    wxWindowX11::DoMoveWindow( x, y, width, height );
 }
 
 void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
@@ -106,7 +232,11 @@ void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlag
 
 bool wxPopupWindow::Show( bool show )
 {
-    return wxWindow11::Show( show );
+    bool ret = wxWindowX11::Show( show );
+
+    Raise();
+    
+    return ret;
 }
 
 #endif // wxUSE_POPUPWIN