- }
-
- wxMouseEvent wxevent (eventType);
-
- wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN)
- || (event_left_is_down (&local_event)
- && (eventType != wxEVT_LEFT_UP)));
- wxevent.m_middleDown = ((eventType == wxEVT_MIDDLE_DOWN)
- || (event_middle_is_down (&local_event)
- && (eventType != wxEVT_MIDDLE_UP)));
- wxevent.m_rightDown = ((eventType == wxEVT_RIGHT_DOWN)
- || (event_right_is_down (&local_event)
- && (eventType != wxEVT_RIGHT_UP)));
-
- wxevent.m_shiftDown = local_event.xbutton.state & ShiftMask;
- wxevent.m_controlDown = local_event.xbutton.state & ControlMask;
- wxevent.m_altDown = local_event.xbutton.state & Mod3Mask;
- wxevent.m_metaDown = local_event.xbutton.state & Mod1Mask;
- wxevent.SetTimestamp(local_event.xbutton.time);
-
- if ( eventType == wxEVT_MOTION )
- {
- if (local_event.xmotion.is_hint == NotifyHint)
- {
- Window root, child;
- Display *dpy = XtDisplay (drawingArea);
-
- XQueryPointer (dpy, XtWindow (drawingArea),
- &root, &child,
- &local_event.xmotion.x_root,
- &local_event.xmotion.y_root,
- &local_event.xmotion.x,
- &local_event.xmotion.y,
- &local_event.xmotion.state);
- }
- else
- {
- }
- }
-
- // Now check if we need to translate this event into a double click
- if (TRUE) // canvas->doubleClickAllowed)
- {
- if (wxevent.ButtonDown())
- {
- long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
-
- // get button and time-stamp
- int button = 0;
- if (wxevent.LeftDown())
- button = 1;
- else if (wxevent.MiddleDown())
- button = 2;
- else if (wxevent.RightDown())
- button = 3;
- long ts = wxevent.GetTimestamp();
-
- // check, if single or double click
- int buttonLast = canvas->GetLastClickedButton();
- long lastTS = canvas->GetLastClickTime();
- if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime )
- {
- // I have a dclick
- canvas->SetLastClick(0, ts);
-
- 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 )
- {
- wxevent.SetEventType(typeDouble);
- }
- }
- else
- {
- // not fast enough or different button
- canvas->SetLastClick(button, ts);
- }
- }
- }
-
- wxevent.SetId(canvas->GetId());
- wxevent.SetEventObject(canvas);
- wxevent.m_x = local_event.xbutton.x;
- wxevent.m_y = local_event.xbutton.y;
- canvas->GetEventHandler()->ProcessEvent (wxevent);
-#if 0
- if (eventType == wxEVT_ENTER_WINDOW ||
- eventType == wxEVT_LEAVE_WINDOW ||
- eventType == wxEVT_MOTION
- )
- return;
-#endif // 0
- break;
- }
- case KeyPress:
- {
- KeySym keySym;
-#if 0
- XComposeStatus compose;
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, &compose);
-#endif // 0
-
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
- int id = wxCharCodeXToWX (keySym);
-
- wxEventType eventType = wxEVT_CHAR;
-
- wxKeyEvent event (eventType);
-
- if (local_event.xkey.state & ShiftMask)
- event.m_shiftDown = TRUE;
- if (local_event.xkey.state & ControlMask)
- event.m_controlDown = TRUE;
- if (local_event.xkey.state & Mod3Mask)
- event.m_altDown = TRUE;
- if (local_event.xkey.state & Mod1Mask)
- event.m_metaDown = TRUE;
- event.SetEventObject(canvas);
- event.m_keyCode = id;
- event.SetTimestamp(local_event.xkey.time);
-
- if (id > -1)
- {
- // Implement wxFrame::OnCharHook by checking ancestor.
- wxWindow *parent = canvas->GetParent();
- while (parent && !parent->IsKindOf(CLASSINFO(wxFrame)))
- parent = parent->GetParent();
-
- if (parent)
- {
- event.SetEventType(wxEVT_CHAR_HOOK);
- if (parent->GetEventHandler()->ProcessEvent(event))
- return;
- }
-
- // For simplicity, OnKeyDown is the same as OnChar
- // TODO: filter modifier key presses from OnChar
- event.SetEventType(wxEVT_KEY_DOWN);
-
- // Only process OnChar if OnKeyDown didn't swallow it
- if (!canvas->GetEventHandler()->ProcessEvent (event))
- {
- event.SetEventType(wxEVT_CHAR);
- canvas->GetEventHandler()->ProcessEvent (event);
- }
- }
- break;
- }
- case KeyRelease:
- {
- KeySym keySym;
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
- int id = wxCharCodeXToWX (keySym);
-
- wxKeyEvent event (wxEVT_KEY_UP);
-
- if (local_event.xkey.state & ShiftMask)
- event.m_shiftDown = TRUE;
- if (local_event.xkey.state & ControlMask)
- event.m_controlDown = TRUE;
- if (local_event.xkey.state & Mod3Mask)
- event.m_altDown = TRUE;
- if (local_event.xkey.state & Mod1Mask)
- event.m_metaDown = TRUE;
- event.SetEventObject(canvas);
- event.m_keyCode = id;
- event.SetTimestamp(local_event.xkey.time);
-
- if (id > -1)
- {
- canvas->GetEventHandler()->ProcessEvent (event);
- }
- break;
- }
- case FocusIn:
- {
- if (local_event.xfocus.detail != NotifyPointer)
- {
- wxFocusEvent event(wxEVT_SET_FOCUS, canvas->GetId());
- event.SetEventObject(canvas);
- canvas->GetEventHandler()->ProcessEvent(event);
- }
- break;
- }
- case FocusOut:
- {
- if (local_event.xfocus.detail != NotifyPointer)
- {
- wxFocusEvent event(wxEVT_KILL_FOCUS, canvas->GetId());
- event.SetEventObject(canvas);
- canvas->GetEventHandler()->ProcessEvent(event);
- }
- break;
- }
- default:
- break;
- }
-}
-
-static void wxPanelItemEventHandler(Widget wid,
- XtPointer WXUNUSED(client_data),
- XEvent* event,
- Boolean *continueToDispatch)
-{
- // Widget can be a label or the actual widget.
-
- wxWindow *window = wxGetWindowFromTable(wid);
- if (window)
- {
- wxMouseEvent wxevent(0);
- if (wxTranslateMouseEvent(wxevent, window, wid, event))
- {
- window->GetEventHandler()->ProcessEvent(wxevent);
- }
- }
-
- // TODO: probably the key to allowing default behaviour to happen. Say we
- // set a m_doDefault flag to FALSE at the start of this function. Then in
- // e.g. wxWindowX11::OnMouseEvent we can call Default() which sets this flag to
- // TRUE, indicating that default processing can happen. Thus, behaviour can
- // appear to be overridden just by adding an event handler and not calling
- // wxWindowX11::OnWhatever. ALSO, maybe we can use this instead of the current
- // way of handling drawing area events, to simplify things.
- *continueToDispatch = True;
-}
-
-static void wxScrollBarCallback(Widget scrollbar,
- XtPointer clientData,
- XmScrollBarCallbackStruct *cbs)
-{
- wxWindow *win = wxGetWindowFromTable(scrollbar);
- int orientation = (int) clientData;
-
- wxEventType eventType = wxEVT_NULL;
- switch (cbs->reason)
- {
- case XmCR_INCREMENT:
- {
- eventType = wxEVT_SCROLLWIN_LINEDOWN;
- break;
- }
- case XmCR_DECREMENT:
- {
- eventType = wxEVT_SCROLLWIN_LINEUP;
- break;
- }
- case XmCR_DRAG:
- {
- eventType = wxEVT_SCROLLWIN_THUMBTRACK;
- break;
- }
- case XmCR_VALUE_CHANGED:
- {
- eventType = wxEVT_SCROLLWIN_THUMBRELEASE;
- break;
- }
- case XmCR_PAGE_INCREMENT:
- {
- eventType = wxEVT_SCROLLWIN_PAGEDOWN;
- break;
- }
- case XmCR_PAGE_DECREMENT:
- {
- eventType = wxEVT_SCROLLWIN_PAGEUP;
- break;
- }
- case XmCR_TO_TOP:
- {
- eventType = wxEVT_SCROLLWIN_TOP;
- break;
- }
- case XmCR_TO_BOTTOM:
- {
- eventType = wxEVT_SCROLLWIN_BOTTOM;
- break;
- }
- default:
- {
- // Should never get here
- wxFAIL_MSG("Unknown scroll event.");
- break;
- }
- }
-
- wxScrollWinEvent event(eventType,
- cbs->value,
- ((orientation == XmHORIZONTAL) ?
- wxHORIZONTAL : wxVERTICAL));
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(event);
-}
-
-// For repainting arbitrary windows
-void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *)
-{
- Window window;
- Display *display;
-
- wxWindow* win = wxGetWindowFromTable(w);
- if (!win)
- return;
-
- switch(event -> type)
- {
- case Expose:
- {
- window = (Window) win -> GetXWindow();
- display = (Display *) win -> GetXDisplay();
-
- if (event -> xexpose.count == 0)
- {
- win->DoPaint();
-
- win->ClearUpdateRects();
- }
- else
- {
- win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
- event->xexpose.width, event->xexpose.height);
- }
-
- break;
- }
- }
-}
-
-#endif
- // 0
-
-// ----------------------------------------------------------------------------
-// CanvaseXXXSize() functions
-// ----------------------------------------------------------------------------
-
-// SetSize, but as per old wxCanvas (with drawing widget etc.)
-void wxWindowX11::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
-{
- // TODO
-#if 0
- // 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 ((w == -1) && (h == -1))
- useOldSize = TRUE;
- else if (w == oldW && h == oldH)
- useOldSize = TRUE;
-
- if (!wxNoOptimize::CanOptimize())
- {
- useOldSize = FALSE; useOldPos = FALSE;
- }
-
- if (useOldPos && useOldSize)
- return;
-
- Widget drawingArea = (Widget) m_drawingArea;
- bool managed = XtIsManaged(m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
-
- if (managed)
- XtUnmanageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
-
- int xx = x; int yy = y;
- AdjustForParentClientOrigin(xx, yy, sizeFlags);
-
- if (!useOldPos)
- {
- if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- {
- XtVaSetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow,
- XmNx, xx, NULL);
- }
-
- if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- {
- XtVaSetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow,
- XmNy, yy, NULL);
- }
- }
-
- if (!useOldSize)
- {
-
- if (w > -1)
- {
- if (m_borderWidget)
- {
- XtVaSetValues ((Widget) m_borderWidget, XmNwidth, w, NULL);
- short thick, margin;
- XtVaGetValues ((Widget) m_borderWidget,
- XmNshadowThickness, &thick,
- XmNmarginWidth, &margin,
- NULL);
- w -= 2 * (thick + margin);
- }
-
- XtVaSetValues ((Widget) m_scrolledWindow, XmNwidth, w, NULL);
-
- Dimension spacing;
- Widget sbar;
- XtVaGetValues ((Widget) m_scrolledWindow,
- XmNspacing, &spacing,
- XmNverticalScrollBar, &sbar,
- NULL);
- Dimension wsbar;
- if (sbar)
- XtVaGetValues (sbar, XmNwidth, &wsbar, NULL);
- else
- wsbar = 0;
-
- w -= (spacing + wsbar);
-
-#if 0
- XtVaSetValues(drawingArea, XmNwidth, w, NULL);
-#endif // 0
- }
- if (h > -1)
- {
- if (m_borderWidget)
- {
- XtVaSetValues ((Widget) m_borderWidget, XmNheight, h, NULL);
- short thick, margin;
- XtVaGetValues ((Widget) m_borderWidget,
- XmNshadowThickness, &thick,
- XmNmarginHeight, &margin,
- NULL);
- h -= 2 * (thick + margin);
- }
-
- XtVaSetValues ((Widget) m_scrolledWindow, XmNheight, h, NULL);
-
- Dimension spacing;
- Widget sbar;
- XtVaGetValues ((Widget) m_scrolledWindow,
- XmNspacing, &spacing,
- XmNhorizontalScrollBar, &sbar,
- NULL);
- Dimension wsbar;
- if (sbar)
- XtVaGetValues (sbar, XmNheight, &wsbar, NULL);
- else
- wsbar = 0;
-
- h -= (spacing + wsbar);
-
-#if 0
- XtVaSetValues(drawingArea, XmNheight, h, NULL);
-#endif // 0
- }
- }
-
- if (managed)
- XtManageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-#endif
- // 0
-}
-
-void wxWindowX11::CanvasSetClientSize (int w, int h)
-{
-// TODO
-#if 0
- Widget drawingArea = (Widget) m_drawingArea;
-
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
-
- if (w > -1)
- XtVaSetValues(drawingArea, XmNwidth, w, NULL);
- if (h > -1)
- XtVaSetValues(drawingArea, XmNheight, h, NULL);
-
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-#endif // 0
-}
-
-void wxWindowX11::CanvasGetClientSize (int *w, int *h) const
-{
-// TODO
-#if 0
- // Must return the same thing that was set via SetClientSize
- Dimension xx, yy;
- XtVaGetValues ((Widget) m_drawingArea, XmNwidth, &xx, XmNheight, &yy, NULL);
- *w = xx;
- *h = yy;
-#endif
-}
-
-void wxWindowX11::CanvasGetSize (int *w, int *h) const
-{
-// TODO
-#if 0
- Dimension xx, yy;
- if ((Widget) m_borderWidget)
- XtVaGetValues ((Widget) m_borderWidget, XmNwidth, &xx, XmNheight, &yy, NULL);
- else if ((Widget) m_scrolledWindow)
- XtVaGetValues ((Widget) m_scrolledWindow, XmNwidth, &xx, XmNheight, &yy, NULL);
- else
- XtVaGetValues ((Widget) m_drawingArea, XmNwidth, &xx, XmNheight, &yy, NULL);
-
- *w = xx;
- *h = yy;
-#endif
-}
-
-void wxWindowX11::CanvasGetPosition (int *x, int *y) const
-{
-// TODO
-#if 0
- Position xx, yy;
- XtVaGetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow, 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;
-#endif
-}
-
-// ----------------------------------------------------------------------------
-// TranslateXXXEvent() functions
-// ----------------------------------------------------------------------------
-
-bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent)
-{
- // TODO
-#if 0
- switch (xevent->xany.type)
- {
- case EnterNotify: // never received here - yes ? MB
- case LeaveNotify: // never received here - yes ? MB
- case ButtonPress:
- case ButtonRelease:
- case MotionNotify:
- {
- wxEventType eventType = wxEVT_NULL;
-
- // FIXME: this is never true I think - MB
- //
- if (xevent->xany.type == LeaveNotify)
- {
- win->SetButton1(FALSE);
- win->SetButton2(FALSE);
- win->SetButton3(FALSE);
- return FALSE;
- }
- else if (xevent->xany.type == MotionNotify)
- {
- eventType = wxEVT_MOTION;
- }
- else if (xevent->xany.type == ButtonPress)
- {
- wxevent.SetTimestamp(xevent->xbutton.time);
- int button = 0;
- if (xevent->xbutton.button == Button1)
- {
- eventType = wxEVT_LEFT_DOWN;
- win->SetButton1(TRUE);
- button = 1;
- }
- else if (xevent->xbutton.button == Button2)
- {
- eventType = wxEVT_MIDDLE_DOWN;
- win->SetButton2(TRUE);
- button = 2;
- }
- else if (xevent->xbutton.button == Button3)
- {
- eventType = wxEVT_RIGHT_DOWN;
- win->SetButton3(TRUE);
- button = 3;
- }
-
- // check for a double click
- //
- long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
- long ts = wxevent.GetTimestamp();
-
- int buttonLast = win->GetLastClickedButton();
- long lastTS = win->GetLastClickTime();
- if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime )
- {
- // I have a dclick
- win->SetLastClick(0, ts);
- 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
- {
- // not fast enough or different button
- win->SetLastClick(button, ts);
- }
- }
- else if (xevent->xany.type == ButtonRelease)
- {
- if (xevent->xbutton.button == Button1)
- {
- eventType = wxEVT_LEFT_UP;
- win->SetButton1(FALSE);
- }
- else if (xevent->xbutton.button == Button2)
- {
- eventType = wxEVT_MIDDLE_UP;
- win->SetButton2(FALSE);
- }
- else if (xevent->xbutton.button == Button3)
- {
- eventType = wxEVT_RIGHT_UP;
- win->SetButton3(FALSE);
- }
- else return FALSE;