- if ( GetEventHandler() )
- {
- wxEvtHandler *handlerA = GetEventHandler();
- wxEvtHandler *handlerB = handlerA->GetNextHandler();
- handlerA->SetNextHandler(NULL);
- SetEventHandler(handlerB);
- if ( deleteHandler )
- {
- delete handlerA;
- return NULL;
- }
- else
- return handlerA;
- }
- else
- return NULL;
-}
-
-#if wxUSE_DRAG_AND_DROP
-
-void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
-{
- if ( m_pDropTarget != 0 ) {
- delete m_pDropTarget;
- }
-
- m_pDropTarget = pDropTarget;
- if ( m_pDropTarget != 0 )
- {
- // TODO
- }
-}
-
-#endif
-
-// Old style file-manager drag&drop
-void wxWindow::DragAcceptFiles(bool accept)
-{
- // TODO
-}
-
-// Get total size
-void wxWindow::GetSize(int *x, int *y) const
-{
- if (m_drawingArea)
- {
- CanvasGetSize(x, y);
- return;
- }
-
- Widget widget = (Widget) GetTopWidget();
- Dimension xx, yy;
- XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
- *x = xx; *y = yy;
-}
-
-void wxWindow::GetPosition(int *x, int *y) const
-{
- if (m_drawingArea)
- {
- CanvasGetPosition(x, y);
- return;
- }
- Widget widget = (Widget) GetTopWidget();
- Position xx, yy;
- XtVaGetValues(widget, XmNx, &xx, XmNy, &yy, NULL);
-
- // We may be faking the client origin.
- // So a window that's really at (0, 30) may appear
- // (to wxWin apps) to be at (0, 0).
- if (GetParent())
- {
- wxPoint pt(GetParent()->GetClientAreaOrigin());
- xx -= pt.x;
- yy -= pt.y;
- }
-
- *x = xx; *y = yy;
-}
-
-void wxWindow::ScreenToClient(int *x, int *y) const
-{
- Widget widget = (Widget) GetClientWidget();
- Display *display = XtDisplay((Widget) GetMainWidget());
- Window rootWindow = RootWindowOfScreen(XtScreen(widget));
- Window thisWindow = XtWindow(widget);
-
- Window childWindow;
- int xx = *x;
- int yy = *y;
- XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
-}
-
-void wxWindow::ClientToScreen(int *x, int *y) const
-{
- Widget widget = (Widget) GetClientWidget();
- Display *display = XtDisplay(widget);
- Window rootWindow = RootWindowOfScreen(XtScreen(widget));
- Window thisWindow = XtWindow(widget);
-
- Window childWindow;
- int xx = *x;
- int yy = *y;
- XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow);
-}
-
-void wxWindow::SetCursor(const wxCursor& cursor)
-{
- m_windowCursor = cursor;
- if (m_windowCursor.Ok())
- {
- WXDisplay *dpy = GetXDisplay();
- WXCursor x_cursor = ((wxCursor&)cursor).GetXCursor(dpy);
-
- Widget w = (Widget) GetMainWidget();
- Window win = XtWindow(w);
- XDefineCursor((Display*) dpy, win, (Cursor) x_cursor);
- }
-}
-
-
-// Get size *available for subwindows* i.e. excluding menu bar etc.
-void wxWindow::GetClientSize(int *x, int *y) const
-{
- Widget widget = (Widget) GetClientWidget();
- Dimension xx, yy;
- XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
- *x = xx; *y = yy;
-}
-
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
- // A bit of optimization to help sort out the flickers.
- int oldX, oldY, oldW, oldH;
- GetSize(& oldW, & oldH);
- GetPosition(& oldX, & oldY);
-
- bool useOldPos = FALSE;
- bool useOldSize = FALSE;
-
- if ((x == -1) && (x == -1) && ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0))
- useOldPos = TRUE;
- else if (x == oldX && y == oldY)
- useOldPos = TRUE;
-
- if ((width == -1) && (height == -1))
- useOldSize = TRUE;
- else if (width == oldW && height == oldH)
- useOldSize = TRUE;
-
- if (!wxNoOptimize::CanOptimize())
- {
- useOldSize = FALSE; useOldPos = FALSE;
- }
-
- if (useOldPos && useOldSize)
- return;
-
- if (m_drawingArea)
- {
- CanvasSetSize(x, y, width, height, sizeFlags);
- return;
- }
- Widget widget = (Widget) GetTopWidget();
- if (!widget)
- return;
-
- bool managed = XtIsManaged( widget );
- if (managed)
- XtUnmanageChild(widget);
-
- int xx = x; int yy = y;
- AdjustForParentClientOrigin(xx, yy, sizeFlags);
-
- 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);
- }
-
- 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.
- /*
- wxSizeEvent sizeEvent(wxSize(width, height), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
- */
-}
-
-void wxWindow::SetClientSize(int width, int height)
-{
- if (m_drawingArea)
- {
- CanvasSetClientSize(width, height);
- return;
- }
-
- Widget widget = (Widget) GetTopWidget();
-
- if (width > -1)
- XtVaSetValues(widget, XmNwidth, width, NULL);
- if (height > -1)
- XtVaSetValues(widget, XmNheight, height, NULL);
-
- wxSizeEvent sizeEvent(wxSize(width, height), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
-}
-
-// For implementation purposes - sometimes decorations make the client area
-// smaller
-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;
- }
-}