Modified wxTranslateMouseEvent so that it can recognize double clicks.
This allows double click events to be intercepted by panel items. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3681 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1922,6 +1922,9 @@ static void wxCanvasInputEvent(Widget drawingArea,
|
|||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
{
|
{
|
||||||
|
// FIXME: most of this mouse event code is more or less
|
||||||
|
// duplicated in wxTranslateMouseEvent
|
||||||
|
//
|
||||||
wxEventType eventType = wxEVT_NULL;
|
wxEventType eventType = wxEVT_NULL;
|
||||||
|
|
||||||
if (local_event.xany.type == EnterNotify)
|
if (local_event.xany.type == EnterNotify)
|
||||||
@@ -1933,7 +1936,7 @@ static void wxCanvasInputEvent(Widget drawingArea,
|
|||||||
}
|
}
|
||||||
else if (local_event.xany.type == LeaveNotify)
|
else if (local_event.xany.type == LeaveNotify)
|
||||||
{
|
{
|
||||||
//if (local_event.xcrossing.mode!=NotifyNormal)
|
//if (local_event.xcrossingr.mode!=NotifyNormal)
|
||||||
// return ; // Ignore grab events
|
// return ; // Ignore grab events
|
||||||
eventType = wxEVT_LEAVE_WINDOW;
|
eventType = wxEVT_LEAVE_WINDOW;
|
||||||
// canvas->GetEventHandler()->OnKillFocus();
|
// canvas->GetEventHandler()->OnKillFocus();
|
||||||
@@ -2542,14 +2545,16 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
|
|||||||
{
|
{
|
||||||
switch (xevent->xany.type)
|
switch (xevent->xany.type)
|
||||||
{
|
{
|
||||||
case EnterNotify:
|
case EnterNotify: // never received here - yes ? MB
|
||||||
case LeaveNotify:
|
case LeaveNotify: // never received here - yes ? MB
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
{
|
{
|
||||||
wxEventType eventType = wxEVT_NULL;
|
wxEventType eventType = wxEVT_NULL;
|
||||||
|
|
||||||
|
// FIXME: this is never true I think - MB
|
||||||
|
//
|
||||||
if (xevent->xany.type == LeaveNotify)
|
if (xevent->xany.type == LeaveNotify)
|
||||||
{
|
{
|
||||||
win->SetButton1(FALSE);
|
win->SetButton1(FALSE);
|
||||||
@@ -2563,20 +2568,59 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
|
|||||||
}
|
}
|
||||||
else if (xevent->xany.type == ButtonPress)
|
else if (xevent->xany.type == ButtonPress)
|
||||||
{
|
{
|
||||||
|
wxevent.SetTimestamp(xevent->xbutton.time);
|
||||||
|
int button = 0;
|
||||||
if (xevent->xbutton.button == Button1)
|
if (xevent->xbutton.button == Button1)
|
||||||
{
|
{
|
||||||
eventType = wxEVT_LEFT_DOWN;
|
eventType = wxEVT_LEFT_DOWN;
|
||||||
win->SetButton1(TRUE);
|
win->SetButton1(TRUE);
|
||||||
|
button = 1;
|
||||||
}
|
}
|
||||||
else if (xevent->xbutton.button == Button2)
|
else if (xevent->xbutton.button == Button2)
|
||||||
{
|
{
|
||||||
eventType = wxEVT_MIDDLE_DOWN;
|
eventType = wxEVT_MIDDLE_DOWN;
|
||||||
win->SetButton2(TRUE);
|
win->SetButton2(TRUE);
|
||||||
|
button = 2;
|
||||||
}
|
}
|
||||||
else if (xevent->xbutton.button == Button3)
|
else if (xevent->xbutton.button == Button3)
|
||||||
{
|
{
|
||||||
eventType = wxEVT_RIGHT_DOWN;
|
eventType = wxEVT_RIGHT_DOWN;
|
||||||
win->SetButton3(TRUE);
|
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);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// not fast enough or different button
|
||||||
|
win->SetLastClick(button, ts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (xevent->xany.type == ButtonRelease)
|
else if (xevent->xany.type == ButtonRelease)
|
||||||
@@ -2637,6 +2681,12 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
|
|||||||
|
|
||||||
wxevent.m_shiftDown = xevent->xbutton.state & ShiftMask;
|
wxevent.m_shiftDown = xevent->xbutton.state & ShiftMask;
|
||||||
wxevent.m_controlDown = xevent->xbutton.state & ControlMask;
|
wxevent.m_controlDown = xevent->xbutton.state & ControlMask;
|
||||||
|
wxevent.m_altDown = xevent->xbutton.state & Mod3Mask;
|
||||||
|
wxevent.m_metaDown = xevent->xbutton.state & Mod1Mask;
|
||||||
|
|
||||||
|
wxevent.SetId(win->GetId());
|
||||||
|
wxevent.SetEventObject(win);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user