bool wxPopupWindow::Create( wxWindow *parent, int style ) { if (!CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, wxT("popup") )) { wxFAIL_MSG( wxT("wxPopupWindow creation failed") ); return false; } // 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 ); 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; 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(); 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 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 // 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 ); #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, (Window) m_mainWindow, &wm_hints); #endif return true; }
bool wxTopLevelWindowX11::Create(wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { // init our fields Init(); m_windowStyle = style; m_parent = parent; SetName(name); m_windowId = id == wxID_ANY ? NewControlId() : id; if (parent) 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 (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); else m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE); m_backgroundColour.CalcPixel( (WXColormap) cm ); m_hasBgCol = true; m_x = pos.x; if (m_x < -1) m_x = 10; m_y = pos.y; if (m_y < 0) m_y = 10; m_width = size.x; if (m_width < 0) m_width = 500; m_height = size.y; if (m_height < 0) m_height = 380; #if !wxUSE_NANOX XSetWindowAttributes xattributes; long xattributes_mask = CWBorderPixel | CWBackPixel; xattributes.background_pixel = m_backgroundColour.GetPixel(); xattributes.border_pixel = BlackPixel( xdisplay, xscreen ); if (HasFlag( wxNO_BORDER )) { xattributes_mask |= CWOverrideRedirect; xattributes.override_redirect = True; } if (!HasFlag( wxFULL_REPAINT_ON_RESIZE )) { xattributes_mask |= CWBitGravity; xattributes.bit_gravity = NorthWestGravity; } xattributes_mask |= CWEventMask; xattributes.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | KeymapStateMask | FocusChangeMask | ColormapChangeMask | StructureNotifyMask | PropertyChangeMask; Window xwindow = XCreateWindow( xdisplay, xparent, m_x, m_y, m_width, m_height, 0, DefaultDepth(xdisplay,xscreen), InputOutput, xvisual, xattributes_mask, &xattributes ); #else long backColor, foreColor; backColor = GR_RGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue()); foreColor = GR_RGB(m_foregroundColour.Red(), m_foregroundColour.Green(), m_foregroundColour.Blue()); Window xwindow = XCreateWindowWithColor( xdisplay, xparent, m_x, m_y, m_width, m_height, 0, 0, InputOutput, xvisual, backColor, foreColor); #endif m_mainWindow = (WXWindow) xwindow; m_clientWindow = (WXWindow) xwindow; wxAddWindowToTable( xwindow, (wxWindow*) this ); #if wxUSE_NANOX XSelectInput( xdisplay, xwindow, GR_EVENT_MASK_CLOSE_REQ | 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 completely. XSetWindowBackgroundPixmap( xdisplay, xwindow, None ); #if !wxUSE_NANOX if (HasFlag( wxSTAY_ON_TOP )) { Window xroot = RootWindow( xdisplay, xscreen ); XSetTransientForHint( xdisplay, xwindow, xroot ); } else { if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) { if (GetParent() && GetParent()->X11GetMainWindow()) { Window xparentwindow = (Window) GetParent()->X11GetMainWindow(); XSetTransientForHint( xdisplay, xwindow, xparentwindow ); } } } XSizeHints size_hints; size_hints.flags = PSize | PPosition | PWinGravity; size_hints.x = m_x; size_hints.y = m_y; size_hints.width = m_width; size_hints.height = m_height; size_hints.win_gravity = NorthWestGravity; XSetWMNormalHints( xdisplay, xwindow, &size_hints); XWMHints wm_hints; wm_hints.flags = InputHint | StateHint; if (GetParent()) { wm_hints.flags |= WindowGroupHint; wm_hints.window_group = (Window) GetParent()->X11GetMainWindow(); } wm_hints.input = True; wm_hints.initial_state = NormalState; XSetWMHints( xdisplay, xwindow, &wm_hints); Atom wm_protocols[2]; wm_protocols[0] = XInternAtom( xdisplay, "WM_DELETE_WINDOW", False ); wm_protocols[1] = XInternAtom( xdisplay, "WM_TAKE_FOCUS", False ); XSetWMProtocols( xdisplay, xwindow, wm_protocols, 2); #endif wxSetWMDecorations( xwindow, style); SetTitle(title); return true; }