X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b886fae6484edbb3a2fdbe8be74b3a840e9c84ee..80f3f3beb68c3aabfdf521e78b383c41399ac75e:/src/x11/window.cpp diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 9c5f6f49b8..d7bac60b2a 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -122,6 +122,11 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, { wxCHECK_MSG( parent, false, wxT("can't create wxWindow without parent") ); + // Get default border + wxBorder border = GetBorder(style); + style &= ~wxBORDER_MASK; + style |= border; + CreateBase(parent, id, pos, size, style, wxDefaultValidator, name); parent->AddChild(this); @@ -160,9 +165,11 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, if (pos2.y == wxDefaultCoord) pos2.y = 0; + AdjustForParentClientOrigin(pos2.x, pos2.y); + #if wxUSE_TWO_WINDOWS bool need_two_windows = - ((( wxSUNKEN_BORDER | wxRAISED_BORDER | wxSIMPLE_BORDER | wxHSCROLL | wxVSCROLL ) & m_windowStyle) != 0); + ((( wxSUNKEN_BORDER | wxBORDER_THEME | wxRAISED_BORDER | wxSIMPLE_BORDER | wxHSCROLL | wxVSCROLL ) & m_windowStyle) != 0); #else bool need_two_windows = false; #endif @@ -228,7 +235,7 @@ bool wxWindowX11::Create(wxWindow *parent, wxWindowID id, } #endif - if (HasFlag( wxSUNKEN_BORDER) || HasFlag( wxRAISED_BORDER)) + if (HasFlag(wxSUNKEN_BORDER) || HasFlag(wxRAISED_BORDER) || HasFlag(wxBORDER_THEME)) { pos2.x = 2; pos2.y = 2; @@ -357,10 +364,13 @@ wxWindowX11::~wxWindowX11() } // Destroy the window - Window xwindow = (Window) m_mainWindow; - wxDeleteWindowFromTable( xwindow ); - XDestroyWindow( wxGlobalDisplay(), xwindow ); - m_mainWindow = NULL; + if ( m_mainWindow ) + { + Window xwindow = (Window) m_mainWindow; + wxDeleteWindowFromTable( xwindow ); + XDestroyWindow( wxGlobalDisplay(), xwindow ); + m_mainWindow = NULL; + } } // --------------------------------------------------------------------------- @@ -671,8 +681,8 @@ void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect) if (dx < 0) s_x += -dx; if (dy < 0) s_y += -dy; - if (dx > 0) d_x = dx + offset.x; - if (dy > 0) d_y = dy + offset.y; + if (dx > 0) d_x += dx + offset.x; + if (dy > 0) d_y += dy + offset.y; XCopyArea( xdisplay, xwindow, xwindow, xgc, s_x, s_y, w, h, d_x, d_y ); @@ -802,9 +812,11 @@ void wxWindowX11::DoScreenToClient(int *x, int *y) const Window thisWindow = (Window) m_clientWindow; Window childWindow; - int xx = *x; - int yy = *y; - XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow); + int xx = x ? *x : 0; + int yy = y ? *y : 0; + XTranslateCoordinates(display, rootWindow, thisWindow, + xx, yy, x ? x : &xx, y ? y : &yy, + &childWindow); } void wxWindowX11::DoClientToScreen(int *x, int *y) const @@ -814,9 +826,11 @@ void wxWindowX11::DoClientToScreen(int *x, int *y) const Window thisWindow = (Window) m_clientWindow; Window childWindow; - int xx = *x; - int yy = *y; - XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow); + int xx = x ? *x : 0; + int yy = y ? *y : 0; + XTranslateCoordinates(display, thisWindow, rootWindow, + xx, yy, x ? x : &xx, y ? y : &yy, + &childWindow); } @@ -1113,7 +1127,7 @@ void wxWindowX11::GetTextExtent(const wxString& string, XCharStruct overall; int slen = string.length(); - XTextExtents((XFontStruct*) pFontStruct, (char*) string.c_str(), slen, + XTextExtents((XFontStruct*) pFontStruct, (const char*) string.c_str(), slen, &direction, &ascent, &descent2, &overall); if ( x ) @@ -1303,7 +1317,7 @@ void wxWindowX11::OnInternalIdle() // This calls the UI-update mechanism (querying windows for // menu/toolbar/control state information) - if (wxUpdateUIEvent::CanUpdate((wxWindow*) this)) + if (wxUpdateUIEvent::CanUpdate((wxWindow*) this) && IsShown()) UpdateWindowUI(wxUPDATE_UI_FROMIDLE); // Set the input focus if couldn't do it before @@ -1407,7 +1421,10 @@ WXWindow wxWindowX11::GetClientAreaWindow() const // TranslateXXXEvent() functions // ---------------------------------------------------------------------------- -bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Window window, XEvent *xevent) +bool wxTranslateMouseEvent(wxMouseEvent& wxevent, + wxWindow *win, + Window WXUNUSED(window), + XEvent *xevent) { switch (XEventGetType(xevent)) { @@ -1456,6 +1473,22 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Window window, eventType = wxEVT_RIGHT_DOWN; button = 3; } + else if ( xevent->xbutton.button == Button4 || + xevent->xbutton.button == Button5 ) + { + // this is the same value as used under wxMSW + static const int WHEEL_DELTA = 120; + + eventType = wxEVT_MOUSEWHEEL; + button = xevent->xbutton.button; + + wxevent.m_linesPerAction = 3; + wxevent.m_wheelDelta = WHEEL_DELTA; + + // Button 4 means mousewheel up, 5 means down + wxevent.m_wheelRotation = button == Button4 ? WHEEL_DELTA + : -WHEEL_DELTA; + } // check for a double click // TODO: where can we get this value from? @@ -1623,7 +1656,8 @@ wxWindow *wxWindowBase::GetCapture() // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - return wxFindWindowAtPoint(wxGetMousePosition()); + pt = wxGetMousePosition(); + return wxFindWindowAtPoint(pt); } void wxGetMouseState(int& rootX, int& rootY, unsigned& maskReturn)