X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/788519c6055dc2290c40fb1569d2889d8ef8e76b..71a0c62f2f9b5ee66b5c84ad82a9fc3bde02a8df:/src/x11/popupwin.cpp diff --git a/src/x11/popupwin.cpp b/src/x11/popupwin.cpp index 6f767a6ef6..35bbf8c99f 100644 --- a/src/x11/popupwin.cpp +++ b/src/x11/popupwin.cpp @@ -7,7 +7,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "popupwin.h" #endif @@ -17,6 +17,7 @@ #include "wx/popupwin.h" #include "wx/app.h" +#include "wx/settings.h" #include "wx/x11/private.h" #include "X11/Xatom.h" @@ -33,7 +34,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow) 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; @@ -45,6 +46,8 @@ bool wxPopupWindow::Create( wxWindow *parent, int style ) wxPoint pos( 20,20 ); wxSize size( 20,20 ); + wxPoint pos2 = pos; + wxSize size2 = size; m_parent = parent; if (m_parent) m_parent->AddChild( this ); @@ -54,45 +57,152 @@ bool wxPopupWindow::Create( wxWindow *parent, int style ) Visual *xvisual = DefaultVisual( xdisplay, xscreen ); Window xparent = RootWindow( 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; + long xattributes_mask = 0; + + xattributes_mask |= CWBackPixel; + xattributes.background_pixel = m_backgroundColour.GetPixel(); - long xattributes_mask = - CWOverrideRedirect | - CWSaveUnder | - CWBorderPixel | CWBackPixel; - xattributes.background_pixel = BlackPixel( xdisplay, xscreen ); + xattributes_mask |= CWBorderPixel; xattributes.border_pixel = BlackPixel( xdisplay, xscreen ); + + xattributes_mask |= CWOverrideRedirect | CWSaveUnder; xattributes.override_redirect = True; xattributes.save_under = True; + + xattributes_mask |= CWEventMask; #endif - Window xwindow = XCreateWindow( xdisplay, xparent, pos.x, pos.y, size.x, size.y, - 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); + 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 - 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 ); + // Set background to None which will prevent X11 from clearing the + // background comletely. + XSetWindowBackgroundPixmap( xdisplay, xwindow, None ); + + 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 ); - // 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 + + // 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, xwindow, xparent ); + XSetTransientForHint( xdisplay, (Window) m_mainWindow, xparent ); -#if !wxUSE_NANOX +#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); + XSetWMHints( xdisplay, (Window) m_mainWindow, &wm_hints); #endif return TRUE;