X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8601b2e15bf924d4be6b7843064028e514a71ec8..83a16cfa8c82898eac3a38f547ce48839adda2de:/src/x11/window.cpp diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 493e7d51c3..ad5607f4d2 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -127,15 +127,6 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, parent->AddChild(this); - int w = size.GetWidth(); - int h = size.GetHeight(); - int x = size.GetX(); - int y = size.GetY(); - if (w == -1) w = 20; - if (h == -1) h = 20; - if (x == -1) x = 0; - if (y == -1) y = 0; - Display *xdisplay = (Display*) wxGlobalDisplay(); int xscreen = DefaultScreen( xdisplay ); Visual *xvisual = DefaultVisual( xdisplay, xscreen ); @@ -147,7 +138,7 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, m_foregroundColour = *wxBLACK; m_foregroundColour.CalcPixel( (WXColormap) cm ); - Window xparent = (Window) parent->GetClientWindow(); + Window xparent = (Window) parent->GetClientAreaWindow(); // Add window's own scrollbars to main window, not to client window if (parent->GetInsertIntoMain()) @@ -156,17 +147,19 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, xparent = (Window) parent->GetMainWindow(); } + // Size (not including the border) must be nonzero (or a Value error results)! + // Note: The Xlib manual doesn't mention this restriction of XCreateWindow. wxSize size2(size); - if (size2.x == -1) - size2.x = 20; - if (size2.y == -1) - size2.y = 20; + if (size2.x <= 0) + size2.x = 20; + if (size2.y <= 0) + size2.y = 20; wxPoint pos2(pos); if (pos2.x == -1) - pos2.x = 0; + pos2.x = 0; if (pos2.y == -1) - pos2.y = 0; + pos2.y = 0; #if wxUSE_TWO_WINDOWS bool need_two_windows = @@ -242,18 +235,26 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, pos2.y = 2; size2.x -= 4; size2.y -= 4; - } else - if (HasFlag( wxSIMPLE_BORDER )) + } + else if (HasFlag( wxSIMPLE_BORDER )) { pos2.x = 1; pos2.y = 1; size2.x -= 2; size2.y -= 2; - } else + } + else { pos2.x = 0; pos2.y = 0; } + + // Make again sure the size is nonzero. + if (size2.x <= 0) + size2.x = 1; + if (size2.y <= 0) + size2.y = 1; + #if wxUSE_NANOX backColor = GR_RGB(m_backgroundColour.Red(), m_backgroundColour.Green(), m_backgroundColour.Blue()); foreColor = GR_RGB(m_foregroundColour.Red(), m_foregroundColour.Green(), m_foregroundColour.Blue()); @@ -386,7 +387,9 @@ void wxWindowX11::SetFocus() if (wxWindowIsVisible(xwindow)) { - XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime ); + wxLogTrace( _T("focus"), _T("wxWindowX11::SetFocus: %s"), GetClassInfo()->GetClassName()); + // XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime ); + XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToNone, CurrentTime ); m_needsInputFocus = FALSE; } else @@ -600,7 +603,7 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect) m_clearRegion.Intersect( 0, 0, cw, ch ); } - Window xwindow = (Window) GetClientWindow(); + Window xwindow = (Window) GetClientAreaWindow(); wxCHECK_RET( xwindow, wxT("invalid window") ); @@ -1127,7 +1130,7 @@ void wxWindowX11::SendEraseEvents() if (!GetEventHandler()->ProcessEvent(erase_event) ) { Display *xdisplay = wxGlobalDisplay(); - Window xwindow = (Window) GetClientWindow(); + Window xwindow = (Window) GetClientAreaWindow(); XSetForeground( xdisplay, g_eraseGC, m_backgroundColour.GetPixel() ); wxRegionIterator upd( m_clearRegion ); @@ -1220,6 +1223,9 @@ void wxWindowX11::OnSysColourChanged(wxSysColourChangedEvent& event) } } +// See handler for InFocus case in app.cpp for details. +wxWindow* g_GettingFocus = NULL; + void wxWindowX11::OnInternalIdle() { // Update invalidated regions. @@ -1232,8 +1238,17 @@ void wxWindowX11::OnInternalIdle() // Set the input focus if couldn't do it before if (m_needsInputFocus) { +#if 0 + wxString msg; + msg.Printf("Setting focus for %s from OnInternalIdle\n", GetClassInfo()->GetClassName()); + printf(msg.c_str()); +#endif SetFocus(); + // If it couldn't set the focus now, there's + // no point in trying again. + m_needsInputFocus = FALSE; } + g_GettingFocus = NULL; } // ---------------------------------------------------------------------------- @@ -1253,7 +1268,7 @@ bool wxAddWindowToTable(Window w, wxWindow *win) wxWidgetHashTable->Put((long) w, win); wxLogTrace("widget", "XWindow 0x%08x <-> window %p (%s)", - w, win, win->GetClassInfo()->GetClassName()); + (unsigned int) w, win, win->GetClassInfo()->GetClassName()); return TRUE; } @@ -1285,7 +1300,7 @@ bool wxAddClientWindowToTable(Window w, wxWindow *win) wxClientWidgetHashTable->Put((long) w, win); wxLogTrace("widget", "XWindow 0x%08x <-> window %p (%s)", - w, win, win->GetClassInfo()->GetClassName()); + (unsigned int) w, win, win->GetClassInfo()->GetClassName()); return TRUE; } @@ -1313,7 +1328,7 @@ WXWindow wxWindowX11::GetMainWindow() const return m_mainWindow; } -WXWindow wxWindowX11::GetClientWindow() const +WXWindow wxWindowX11::GetClientAreaWindow() const { return m_clientWindow; }