X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1afe597ebaa6bf9410bbc3c8e73ed7791aa4d640..74cf9763b4cd29d2a8acd27da76573a0fd164254:/src/motif/window.cpp?ds=sidebyside diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 7eff6fe36c..85a9fd34fe 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -21,6 +21,12 @@ #pragma implementation "window.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#define XtWindow XTWINDOW +#define XtScreen XTSCREEN +#endif + #include "wx/setup.h" #include "wx/menu.h" #include "wx/dc.h" @@ -44,6 +50,25 @@ #include "wx/dnd.h" #endif +// DoSetSizeIntr and CanvasSetSizeIntr +// PROBLEM: +// under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl +// don't work and/or segfault because +// 1) wxWindow::Create calls SetSize, +// which results in a call to DoSetSize much earlier than in the other ports +// 2) if wxWindow::Create is called (wxControl::Create calls it) +// then DoSetSize is never called, causing layout problems in composite +// controls +// +// SOLUTION: +// 1) don't call SetSize, DoSetSize, DoMoveWindow, DoGetPosition, +// DoSetPosition directly or indirectly from wxWindow::Create +// 2) call DoMoveWindow from DoSetSize, allowing controls to override it, +// but make wxWindow::DoMoveWindow a no-op if it is called from +// an overridden DoMoveWindow (i.e. wxFoo::DoMoveWindow calls +// wxWindow::DoMoveWindow; this is to preserve the behaviour +// before this change + #ifdef __VMS__ #pragma message disable nosimpint #endif @@ -74,6 +99,8 @@ static const int SCROLL_MARGIN = 4; // ---------------------------------------------------------------------------- extern wxHashTable *wxWidgetHashTable; +static wxWindow* g_captureWindow = NULL; + // ---------------------------------------------------------------------------- // private functions @@ -218,7 +245,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, parent->AddChild(this); - m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); m_foregroundColour = *wxBLACK; //// TODO: we should probably optimize by only creating a @@ -349,7 +376,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // Scrolled widget needs to have its colour changed or we get a little blue // square where the scrollbars abutt - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); DoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE); DoChangeBackgroundColour(m_drawingArea, backgroundColour, TRUE); @@ -368,15 +395,17 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // Without this, the cursor may not be restored properly (e.g. in splitter // sample). SetCursor(*wxSTANDARD_CURSOR); - SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); - SetSize(pos.x, pos.y, size.x, size.y); - + SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE); return TRUE; } // Destructor wxWindow::~wxWindow() { + if (g_captureWindow == this) + g_captureWindow = NULL; + m_isBeingDeleted = TRUE; // Motif-specific actions first @@ -408,10 +437,9 @@ wxWindow::~wxWindow() if (w) { XtDestroyWidget(w); + m_drawingArea = (WXWidget) 0; } - m_mainWidget = (WXWidget) 0; - // Only if we're _really_ a canvas (not a dialog box/panel) if (m_scrolledWindow) { @@ -421,14 +449,19 @@ wxWindow::~wxWindow() if (m_hScrollBar) { wxDeleteWindowFromTable((Widget) m_hScrollBar); + XtUnmanageChild((Widget) m_hScrollBar); } if (m_vScrollBar) { wxDeleteWindowFromTable((Widget) m_vScrollBar); + XtUnmanageChild((Widget) m_vScrollBar); } - UnmanageAndDestroy(m_hScrollBar); - UnmanageAndDestroy(m_vScrollBar); + if (m_hScrollBar) + XtDestroyWidget((Widget) m_hScrollBar); + if (m_vScrollBar) + XtDestroyWidget((Widget) m_vScrollBar); + UnmanageAndDestroy(m_scrolledWindow); if (m_borderWidget) @@ -437,6 +470,9 @@ wxWindow::~wxWindow() m_borderWidget = (WXWidget) 0; } } + else // Why wasn't this here before? JACS 8/3/2000 + DestroyChildren(); + // Destroy the window if (GetMainWidget()) @@ -446,6 +482,12 @@ wxWindow::~wxWindow() // or dialog is destroyed, but before that you may get some memory // leaks and potential layout problems if you delete and then add // child windows. + + // GRG, Feb/2000: commented this out when adding support for + // wxSCROLL[WIN]_THUMBRELEASE events. Also it was reported + // that this call crashed wxMotif under OS/2, so it seems + // that leaving it out is the right thing to do. + // SN, Feb/2000: newgrid/griddemo shows why it is needed :-( XtDestroyWidget((Widget) GetMainWidget()); SetMainWidget((WXWidget) NULL); } @@ -469,7 +511,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) xmScrollBarWidgetClass, (Widget) m_scrolledWindow, XmNorientation, XmHORIZONTAL, NULL); - // XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); + XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); @@ -485,7 +527,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) m_hScrollBar = (WXWidget) hScrollBar; - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); DoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE); XtRealizeWidget(hScrollBar); @@ -505,7 +547,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) xmScrollBarWidgetClass, (Widget) m_scrolledWindow, XmNorientation, XmVERTICAL, NULL); - // XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); + XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); @@ -520,7 +562,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) NULL); m_vScrollBar = (WXWidget) vScrollBar; - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); DoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE); XtRealizeWidget(vScrollBar); @@ -567,7 +609,7 @@ void wxWindow::DestroyScrollbar(wxOrientation orientation) XtDestroyWidget((Widget) m_vScrollBar); } m_vScrollBar = (WXWidget) 0; - m_vScroll = TRUE; + m_vScroll = FALSE; XtVaSetValues((Widget) m_scrolledWindow, XmNverticalScrollBar, (Widget) 0, @@ -689,8 +731,9 @@ wxString wxWindow::GetTitle() const return wxString(title); } -void wxWindow::CaptureMouse() +void wxWindow::DoCaptureMouse() { + g_captureWindow = this; if ( m_winCaptured ) return; @@ -701,8 +744,9 @@ void wxWindow::CaptureMouse() m_winCaptured = TRUE; } -void wxWindow::ReleaseMouse() +void wxWindow::DoReleaseMouse() { + g_captureWindow = NULL; if ( !m_winCaptured ) return; @@ -734,11 +778,16 @@ bool wxWindow::SetCursor(const wxCursor& cursor) return FALSE; } - wxASSERT_MSG( m_cursor.Ok(), - wxT("cursor must be valid after call to the base version")); + // wxASSERT_MSG( m_cursor.Ok(), + // wxT("cursor must be valid after call to the base version")); + wxCursor* cursor2 = NULL; + if (m_cursor.Ok()) + cursor2 = & m_cursor; + else + cursor2 = wxSTANDARD_CURSOR; WXDisplay *dpy = GetXDisplay(); - WXCursor x_cursor = m_cursor.GetXCursor(dpy); + WXCursor x_cursor = cursor2->GetXCursor(dpy); Widget w = (Widget) GetMainWidget(); Window win = XtWindow(w); @@ -786,8 +835,9 @@ int wxWindow::GetScrollRange(int orient) const Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); - int range; - XtVaGetValues(scrollBar, XmNmaximum, &range, NULL); + int range = 0; + if (scrollBar) + XtVaGetValues(scrollBar, XmNmaximum, &range, NULL); return range; } @@ -1157,6 +1207,34 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) XmMenuPosition (menuWidget, &event); XtManageChild (menuWidget); + XEvent x_event; + // The ID of a pop-up menu is 1 when active, and is set to 0 by the + // idle-time destroy routine. + // Waiting until this ID changes causes this function to block until + // the menu has been dismissed and the widgets cleaned up. + // In other words, once this routine returns, it is safe to delete + // the menu object. + // Ian Brown + while (menu->GetId() == 1) + { + XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &x_event); + + wxTheApp->ProcessXEvent((WXEvent*) & x_event); + + if (XtAppPending( (XtAppContext) wxTheApp->GetAppContext() ) == 0) + { + if (!wxTheApp->ProcessIdle()) + { +#if wxUSE_THREADS + // leave the main loop to give other threads a chance to + // perform their GUI work + wxMutexGuiLeave(); + wxUsleep(20); + wxMutexGuiEnter(); +#endif + } + } + } return TRUE; } @@ -1181,7 +1259,7 @@ void wxWindow::DoGetSize(int *x, int *y) const Widget widget = (Widget) GetTopWidget(); Dimension xx, yy; XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL); - *x = xx; *y = yy; + if(x) *x = xx; if(y) *y = yy; } void wxWindow::DoGetPosition(int *x, int *y) const @@ -1204,7 +1282,7 @@ void wxWindow::DoGetPosition(int *x, int *y) const yy -= pt.y; } - *x = xx; *y = yy; + if(x) *x = xx; if(y) *y = yy; } void wxWindow::DoScreenToClient(int *x, int *y) const @@ -1240,79 +1318,81 @@ void wxWindow::DoGetClientSize(int *x, int *y) const Widget widget = (Widget) GetClientWidget(); Dimension xx, yy; XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL); - *x = xx; *y = yy; + if(x) *x = xx; if(y) *y = yy; } void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + DoSetSizeIntr(x, y, width, height, sizeFlags, FALSE); +} + +void wxWindow::DoSetSizeIntr(int x, int y, int width, int height, + int sizeFlags, bool fromCtor) { // A bit of optimization to help sort out the flickers. - int oldX, oldY, oldW, oldH; - GetSize(& oldW, & oldH); - GetPosition(& oldX, & oldY); + int oldX = -1, oldY = -1, oldW = -1, oldH = -1; + if( !fromCtor ) + { + GetSize(& oldW, & oldH); + GetPosition(& oldX, & oldY); + } - bool useOldPos = FALSE; - bool useOldSize = FALSE; + if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + { + if ( x == -1 ) + x = oldX; + if ( y == -1 ) + y = oldY; + } - if ((x == -1) && (x == -1) && ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)) - useOldPos = TRUE; - else if (x == oldX && y == oldY) - useOldPos = TRUE; + if ( width == -1 ) + width = oldW; + if ( height == -1 ) + height = oldH; - if ((width == -1) && (height == -1)) - useOldSize = TRUE; - else if (width == oldW && height == oldH) - useOldSize = TRUE; + bool nothingChanged = (x == oldX) && (y == oldY) && + (width == oldW) && (height == oldH); if (!wxNoOptimize::CanOptimize()) { - useOldSize = FALSE; useOldPos = FALSE; + nothingChanged = FALSE; } - if (useOldPos && useOldSize) - return; - - if (m_drawingArea) + if ( !nothingChanged ) { - CanvasSetSize(x, y, width, height, sizeFlags); - return; - } - Widget widget = (Widget) GetTopWidget(); - if (!widget) - return; + if (m_drawingArea) + { + CanvasSetSizeIntr(x, y, width, height, sizeFlags, fromCtor); + if( !fromCtor ) DoMoveWindow(x, y, width, height); + return; + } - bool managed = XtIsManaged( widget ); - if (managed) - XtUnmanageChild(widget); + Widget widget = (Widget) GetTopWidget(); + if (!widget) + return; - int xx = x; int yy = y; - AdjustForParentClientOrigin(xx, yy, sizeFlags); + bool managed = XtIsManaged( widget ); + if (managed) + XtUnmanageChild(widget); - if (!useOldPos) - { - if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues(widget, XmNx, xx, NULL); - if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues(widget, XmNy, yy, NULL); - } - if (!useOldSize) - { - if (width > -1) - XtVaSetValues(widget, XmNwidth, width, NULL); - if (height > -1) - XtVaSetValues(widget, XmNheight, height, NULL); - } + int xx = x; + int yy = y; + AdjustForParentClientOrigin(xx, yy, sizeFlags); - if (managed) - XtManageChild(widget); + DoMoveWindow(xx, yy, width, height); - // How about this bit. Maybe we don't need to generate size events - // all the time -- they'll be generated when the window is sized anyway. + if (managed) + XtManageChild(widget); + + // How about this bit. Maybe we don't need to generate size events + // all the time -- they'll be generated when the window is sized anyway. #if 0 - wxSizeEvent sizeEvent(wxSize(width, height), GetId()); - sizeEvent.SetEventObject(this); + wxSizeEvent sizeEvent(wxSize(width, height), GetId()); + sizeEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(sizeEvent); + GetEventHandler()->ProcessEvent(sizeEvent); #endif // 0 + } } void wxWindow::DoSetClientSize(int width, int height) @@ -1343,17 +1423,6 @@ wxPoint wxWindow::GetClientAreaOrigin() const return wxPoint(0, 0); } -// Makes an adjustment to the window position (for example, a frame that has -// a toolbar that it manages itself). -void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) -{ - if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) - { - wxPoint pt(GetParent()->GetClientAreaOrigin()); - x += pt.x; y += pt.y; - } -} - void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH) { m_minWidth = minW; @@ -1384,6 +1453,20 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in XtVaSetValues(widget, XmNheightInc, incH, NULL); } +void wxWindow::DoMoveWindow(int x, int y, int width, int height) +{ + // see the top of the file, near DoSetSizeIntr + if (m_drawingArea) + return; + + XtVaSetValues((Widget)GetTopWidget(), + XmNx, x, + XmNy, y, + XmNwidth, width, + XmNheight, height, + NULL); +} + // --------------------------------------------------------------------------- // text metrics // --------------------------------------------------------------------------- @@ -1428,7 +1511,7 @@ void wxWindow::GetTextExtent(const wxString& string, wxCHECK_RET( fontToUse->Ok(), "valid window font needed" ); - WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay()); + WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay()); int direction, ascent, descent2; XCharStruct overall; @@ -1643,8 +1726,8 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) wxAcceleratorEntry* entry = & (entries[i]); if (entry->MatchesEvent(event)) { - // Bingo, we have a match. Now find a control that matches the entry - // command id. + // Bingo, we have a match. Now find a control that matches the + // entry command id. // Need to go up to the top of the window hierarchy, since it might // be e.g. a menu item @@ -1718,7 +1801,7 @@ bool wxAddWindowToTable(Widget w, wxWindow *win) wxWidgetHashTable->Put((long) w, win); - wxLogDebug("Widget 0x%08x <-> window %p (%s)", + wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)", w, win, win->GetClassInfo()->GetClassName()); return TRUE; @@ -2029,7 +2112,7 @@ static void wxCanvasInputEvent(Widget drawingArea, wxevent.m_metaDown = local_event.xbutton.state & Mod1Mask; wxevent.SetTimestamp(local_event.xbutton.time); - if (eventType = wxEVT_MOTION) + if ( eventType == wxEVT_MOTION ) { if (local_event.xmotion.is_hint == NotifyHint) { @@ -2073,22 +2156,21 @@ static void wxCanvasInputEvent(Widget drawingArea, { // I have a dclick canvas->SetLastClick(0, ts); - switch ( eventType ) + + wxEventType typeDouble; + if ( eventType == wxEVT_LEFT_DOWN ) + typeDouble = wxEVT_LEFT_DCLICK; + else if ( eventType == wxEVT_MIDDLE_DOWN ) + typeDouble = wxEVT_MIDDLE_DCLICK; + else if ( eventType == wxEVT_RIGHT_DOWN ) + typeDouble = wxEVT_RIGHT_DCLICK; + else + typeDouble = wxEVT_NULL; + + if ( typeDouble != wxEVT_NULL ) { - case wxEVT_LEFT_DOWN: - wxevent.SetEventType(wxEVT_LEFT_DCLICK); - break; - case wxEVT_MIDDLE_DOWN: - wxevent.SetEventType(wxEVT_MIDDLE_DCLICK); - break; - case wxEVT_RIGHT_DOWN: - wxevent.SetEventType(wxEVT_RIGHT_DCLICK); - break; - - default : - break; + wxevent.SetEventType(typeDouble); } - } else { @@ -2115,12 +2197,13 @@ static void wxCanvasInputEvent(Widget drawingArea, case KeyPress: { KeySym keySym; + static char buf[100]; #if 0 XComposeStatus compose; - (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, &compose); + (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, &compose); #endif // 0 - (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL); + (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL); int id = wxCharCodeXToWX (keySym); wxEventType eventType = wxEVT_CHAR; @@ -2168,8 +2251,9 @@ static void wxCanvasInputEvent(Widget drawingArea, } case KeyRelease: { + static char buf[100]; KeySym keySym; - (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL); + (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL); int id = wxCharCodeXToWX (keySym); wxKeyEvent event (wxEVT_KEY_UP); @@ -2271,9 +2355,7 @@ static void wxScrollBarCallback(Widget scrollbar, } case XmCR_VALUE_CHANGED: { - // TODO: Should this be intercepted too, or will it cause - // duplicate events? - eventType = wxEVT_SCROLLWIN_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBRELEASE; break; } case XmCR_PAGE_INCREMENT: @@ -2350,13 +2432,23 @@ void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, // CanvaseXXXSize() functions // ---------------------------------------------------------------------------- +void wxWindow::CanvasSetSize(int x, int y, int w, int h, int sizeFlags) +{ + CanvasSetSizeIntr(x, y, w, h, sizeFlags, FALSE); +} + // SetSize, but as per old wxCanvas (with drawing widget etc.) -void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags) +void wxWindow::CanvasSetSizeIntr(int x, int y, int w, int h, int sizeFlags, + bool fromCtor) { // A bit of optimization to help sort out the flickers. - int oldX, oldY, oldW, oldH; - GetSize(& oldW, & oldH); - GetPosition(& oldX, & oldY); + int oldX = -1, oldY = -1, oldW = -1, oldH = -1; + // see the top of the file, near DoSetSizeIntr + if( !fromCtor ) + { + GetSize(& oldW, & oldH); + GetPosition(& oldX, & oldY); + } bool useOldPos = FALSE; bool useOldSize = FALSE; @@ -2632,22 +2724,12 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, { // I have a dclick win->SetLastClick(0, ts); - switch ( eventType ) - { - case wxEVT_LEFT_DOWN: - eventType = wxEVT_LEFT_DCLICK; - break; - case wxEVT_MIDDLE_DOWN: - eventType = wxEVT_MIDDLE_DCLICK; - break; - case wxEVT_RIGHT_DOWN: - eventType = wxEVT_RIGHT_DCLICK; - break; - - default : - break; - } - + if ( eventType == wxEVT_LEFT_DOWN ) + eventType = wxEVT_LEFT_DCLICK; + else if ( eventType == wxEVT_MIDDLE_DOWN ) + eventType = wxEVT_MIDDLE_DCLICK; + else if ( eventType == wxEVT_RIGHT_DOWN ) + eventType = wxEVT_RIGHT_DCLICK; } else { @@ -2850,7 +2932,7 @@ void wxWindow::ChangeBackgroundColour() DoChangeBackgroundColour(m_scrolledWindow, m_backgroundColour); // Have to set the scrollbar colours back since // the scrolled window seemed to change them - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); if (m_hScrollBar) DoChangeBackgroundColour(m_hScrollBar, backgroundColour); @@ -2960,15 +3042,45 @@ void wxWindow::ChangeFont(bool keepOriginalSize) wxWindow *wxGetActiveWindow() { // TODO + wxFAIL_MSG("Not implemented"); return NULL; } +/* static */ +wxWindow *wxWindowBase::GetCapture() +{ + return (wxWindow *)g_captureWindow; +} + + +// Find the wxWindow at the current mouse position, returning the mouse +// position. +wxWindow* wxFindWindowAtPointer(wxPoint& pt) +{ + return wxFindWindowAtPoint(wxGetMousePosition()); +} + +// Get the current mouse position. +wxPoint wxGetMousePosition() +{ + Display *display = (Display*) wxGetDisplay(); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); +} + + // ---------------------------------------------------------------------------- // wxNoOptimize: switch off size optimization // ---------------------------------------------------------------------------- int wxNoOptimize::ms_count = 0; - - -