]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/popupwin.cpp
don't use -q option with egrep, Solaris doesn't have it (bug 517145)
[wxWidgets.git] / src / x11 / popupwin.cpp
index fe1d27c1ed175719281d77f5991f1b8d2386e734..debfbf577ba383558178b3288dc311c69661073c 100644 (file)
 #if wxUSE_POPUPWIN
 
 #include "wx/popupwin.h"
-#include "wx/frame.h"
 #include "wx/app.h"
-#include "wx/cursor.h"
 
 #include "wx/x11/private.h"
+#include "X11/Xatom.h"
+#include "X11/Xutil.h"
 
 //-----------------------------------------------------------------------------
 // wxPopupWindow
@@ -40,11 +40,69 @@ 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 );
 
+    m_parent = parent;
     if (m_parent) m_parent->AddChild( this );
 
-    // TODO: implementation
+    wxTopLevelWindows.Append(this);
+    
+    Display *xdisplay = wxGlobalDisplay();
+    int xscreen = DefaultScreen( xdisplay );
+    Visual *xvisual = DefaultVisual( xdisplay, xscreen );
+    Window xparent = RootWindow( xdisplay, xscreen );
+    
+    XSetWindowAttributes xattributes;
+    XSizeHints size_hints;
+    XWMHints wm_hints;
+    
+    long xattributes_mask =
+        CWOverrideRedirect |
+        CWSaveUnder |
+        CWBorderPixel | CWBackPixel;
+    xattributes.background_pixel = BlackPixel( xdisplay, xscreen );
+    xattributes.border_pixel = BlackPixel( xdisplay, xscreen );
+    xattributes.override_redirect = True;
+    xattributes.save_under = True;
+
+    Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y, 
+       0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes );
+    
+    XSelectInput( xdisplay, xwindow,
+        ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+        ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask |
+        KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask |
+        PropertyChangeMask );
+
+    m_mainWidget = (WXWindow) xwindow;
+    wxAddWindowToTable( xwindow, (wxWindow*) this );
+
+    // Probably shouldn't be here for an unmanaged window
+    //XSetTransientForHint( xdisplay, xwindow, xparent );
+
+    // TODO: Will these calls cause decoration??
+
+    size_hints.flags = PSize;
+    size_hints.width = size.x;
+    size_hints.height = size.y;
+    XSetWMNormalHints( xdisplay, xwindow, &size_hints);
+    
+    wm_hints.flags = InputHint | StateHint /* | WindowGroupHint */;
+    wm_hints.input = True;
+    wm_hints.initial_state = NormalState;
+    XSetWMHints( xdisplay, xwindow, &wm_hints);
+    // No decorations for this window
+#if 0
+    Atom wm_delete_window = XInternAtom( xdisplay, "WM_DELETE_WINDOW", False);
+    XSetWMProtocols( xdisplay, xwindow, &wm_delete_window, 1);
+    
+    wxSetWMDecorations((Window) GetMainWindow(), style);
+#endif
 
     return TRUE;
 }
@@ -56,14 +114,12 @@ void wxPopupWindow::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(
 
 void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 {
-    // TODO
+    wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
 }
+
 bool wxPopupWindow::Show( bool show )
 {
-    // TODO?
-    bool ret = wxWindow::Show( show );
-
-    return ret;
+    return wxWindowX11::Show( show );
 }
 
 #endif // wxUSE_POPUPWIN