Fixed three mouse event bugs
Fixed wxSplitterWindow (hope Julian doesn't mind) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1162 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -152,41 +152,23 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
CaptureMouse();
|
CaptureMouse();
|
||||||
|
|
||||||
// Required for X to specify that
|
m_dragMode = wxSPLIT_DRAG_DRAGGING;
|
||||||
// that we wish to draw on top of all windows
|
|
||||||
// - and we optimise by specifying the area
|
DrawSashTracker(x, y);
|
||||||
// for creating the overlap window.
|
m_oldX = x;
|
||||||
wxScreenDC::StartDrawingOnTop(this);
|
m_oldY = y;
|
||||||
|
return;
|
||||||
// We don't say we're dragging yet; we leave that
|
|
||||||
// decision for the Dragging() branch, to ensure
|
|
||||||
// the user has dragged a little bit.
|
|
||||||
m_dragMode = wxSPLIT_DRAG_LEFT_DOWN;
|
|
||||||
m_firstX = x;
|
|
||||||
m_firstY = y;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( event.LeftUp() && m_dragMode == wxSPLIT_DRAG_LEFT_DOWN )
|
|
||||||
{
|
|
||||||
// Wasn't a proper drag
|
|
||||||
ReleaseMouse();
|
|
||||||
wxScreenDC::EndDrawingOnTop();
|
|
||||||
m_dragMode = wxSPLIT_DRAG_NONE;
|
|
||||||
|
|
||||||
SetCursor(*wxSTANDARD_CURSOR);
|
|
||||||
}
|
|
||||||
else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING)
|
else if (event.LeftUp() && m_dragMode == wxSPLIT_DRAG_DRAGGING)
|
||||||
{
|
{
|
||||||
// We can stop dragging now and see what we've got.
|
// We can stop dragging now and see what we've got.
|
||||||
m_dragMode = wxSPLIT_DRAG_NONE;
|
m_dragMode = wxSPLIT_DRAG_NONE;
|
||||||
ReleaseMouse();
|
ReleaseMouse();
|
||||||
|
|
||||||
// Erase old tracker
|
// Erase old tracker
|
||||||
DrawSashTracker(m_oldX, m_oldY);
|
DrawSashTracker(m_oldX, m_oldY);
|
||||||
|
|
||||||
// End drawing on top (frees the window used for drawing
|
|
||||||
// over the screen)
|
|
||||||
wxScreenDC::EndDrawingOnTop();
|
|
||||||
|
|
||||||
int w, h;
|
int w, h;
|
||||||
GetClientSize(&w, &h);
|
GetClientSize(&w, &h);
|
||||||
if ( m_splitMode == wxSPLIT_VERTICAL )
|
if ( m_splitMode == wxSPLIT_VERTICAL )
|
||||||
@@ -217,7 +199,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
|
|||||||
m_sashPosition = x;
|
m_sashPosition = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // m_splitMode == wxSPLIT_VERTICAL
|
||||||
{
|
{
|
||||||
if ( !OnSashPositionChange(y) )
|
if ( !OnSashPositionChange(y) )
|
||||||
return;
|
return;
|
||||||
@@ -244,9 +226,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
m_sashPosition = y;
|
m_sashPosition = y;
|
||||||
}
|
}
|
||||||
}
|
} // m_splitMode == wxSPLIT_VERTICAL
|
||||||
SizeWindows();
|
SizeWindows();
|
||||||
}
|
} // left up && dragging
|
||||||
else if (event.Moving() && !event.Dragging())
|
else if (event.Moving() && !event.Dragging())
|
||||||
{
|
{
|
||||||
// Just change the cursor if required
|
// Just change the cursor if required
|
||||||
@@ -266,37 +248,14 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
|
|||||||
SetCursor(*wxSTANDARD_CURSOR);
|
SetCursor(*wxSTANDARD_CURSOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) ||
|
else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING))
|
||||||
(event.Dragging() && SashHitTest(x, y, 4)) )
|
|
||||||
{
|
{
|
||||||
if ( m_splitMode == wxSPLIT_VERTICAL )
|
// Erase old tracker
|
||||||
{
|
DrawSashTracker(m_oldX, m_oldY);
|
||||||
SetCursor(*m_sashCursorWE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetCursor(*m_sashCursorNS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect that this is really a drag: we've moved more than 1 pixel either way
|
// Draw new one
|
||||||
if ((m_dragMode == wxSPLIT_DRAG_LEFT_DOWN) &&
|
DrawSashTracker(x, y);
|
||||||
// (abs((int)x - m_firstX) > 1 || abs((int)y - m_firstY) > 1) )
|
|
||||||
(abs((int)x - m_firstX) > 0 || abs((int)y - m_firstY) > 1) )
|
|
||||||
{
|
|
||||||
m_dragMode = wxSPLIT_DRAG_DRAGGING;
|
|
||||||
DrawSashTracker(x, y);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( m_dragMode == wxSPLIT_DRAG_DRAGGING )
|
|
||||||
{
|
|
||||||
// Erase old tracker
|
|
||||||
DrawSashTracker(m_oldX, m_oldY);
|
|
||||||
|
|
||||||
// Draw new one
|
|
||||||
DrawSashTracker(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_oldX = x;
|
m_oldX = x;
|
||||||
m_oldY = y;
|
m_oldY = y;
|
||||||
}
|
}
|
||||||
@@ -304,9 +263,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
OnDoubleClickSash(x, y);
|
OnDoubleClickSash(x, y);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event))
|
void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event))
|
||||||
|
@@ -400,7 +400,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -473,7 +474,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -513,7 +515,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
|||||||
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
|
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
|
||||||
printf( win->GetClassInfo()->GetClassName() );
|
printf( win->GetClassInfo()->GetClassName() );
|
||||||
printf( ".\n" );
|
printf( ".\n" );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wxMouseEvent event( wxEVT_MOTION );
|
wxMouseEvent event( wxEVT_MOTION );
|
||||||
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
|
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
|
||||||
@@ -536,7 +538,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -654,7 +657,24 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
|
|||||||
|
|
||||||
wxMouseEvent event( wxEVT_ENTER_WINDOW );
|
wxMouseEvent event( wxEVT_ENTER_WINDOW );
|
||||||
event.SetEventObject( win );
|
event.SetEventObject( win );
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
GdkModifierType state = (GdkModifierType)0;
|
||||||
|
|
||||||
|
gdk_window_get_pointer( widget->window, &x, &y, &state );
|
||||||
|
|
||||||
|
event.m_shiftDown = (state & GDK_SHIFT_MASK);
|
||||||
|
event.m_controlDown = (state & GDK_CONTROL_MASK);
|
||||||
|
event.m_altDown = (state & GDK_MOD1_MASK);
|
||||||
|
event.m_metaDown = (state & GDK_MOD2_MASK);
|
||||||
|
event.m_leftDown = (state & GDK_BUTTON1_MASK);
|
||||||
|
event.m_middleDown = (state & GDK_BUTTON2_MASK);
|
||||||
|
event.m_rightDown = (state & GDK_BUTTON3_MASK);
|
||||||
|
|
||||||
|
event.m_x = (long)x;
|
||||||
|
event.m_y = (long)y;
|
||||||
|
|
||||||
if (win->GetEventHandler()->ProcessEvent( event ))
|
if (win->GetEventHandler()->ProcessEvent( event ))
|
||||||
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
|
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
|
||||||
|
|
||||||
@@ -686,6 +706,23 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
|
|||||||
wxMouseEvent event( wxEVT_LEAVE_WINDOW );
|
wxMouseEvent event( wxEVT_LEAVE_WINDOW );
|
||||||
event.SetEventObject( win );
|
event.SetEventObject( win );
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
GdkModifierType state = (GdkModifierType)0;
|
||||||
|
|
||||||
|
gdk_window_get_pointer( widget->window, &x, &y, &state );
|
||||||
|
|
||||||
|
event.m_shiftDown = (state & GDK_SHIFT_MASK);
|
||||||
|
event.m_controlDown = (state & GDK_CONTROL_MASK);
|
||||||
|
event.m_altDown = (state & GDK_MOD1_MASK);
|
||||||
|
event.m_metaDown = (state & GDK_MOD2_MASK);
|
||||||
|
event.m_leftDown = (state & GDK_BUTTON1_MASK);
|
||||||
|
event.m_middleDown = (state & GDK_BUTTON2_MASK);
|
||||||
|
event.m_rightDown = (state & GDK_BUTTON3_MASK);
|
||||||
|
|
||||||
|
event.m_x = (long)x;
|
||||||
|
event.m_y = (long)y;
|
||||||
|
|
||||||
if (win->GetEventHandler()->ProcessEvent( event ))
|
if (win->GetEventHandler()->ProcessEvent( event ))
|
||||||
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
|
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
|
||||||
|
|
||||||
|
@@ -400,7 +400,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -473,7 +474,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -513,7 +515,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
|||||||
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
|
if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
|
||||||
printf( win->GetClassInfo()->GetClassName() );
|
printf( win->GetClassInfo()->GetClassName() );
|
||||||
printf( ".\n" );
|
printf( ".\n" );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wxMouseEvent event( wxEVT_MOTION );
|
wxMouseEvent event( wxEVT_MOTION );
|
||||||
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
|
event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK);
|
||||||
@@ -536,7 +538,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxWindow *child = (wxWindow*)node->Data();
|
wxWindow *child = (wxWindow*)node->Data();
|
||||||
if ((child->m_x <= event.m_x) &&
|
if ((child->m_wxwindow == (GtkWidget*) NULL) &&
|
||||||
|
(child->m_x <= event.m_x) &&
|
||||||
(child->m_y <= event.m_y) &&
|
(child->m_y <= event.m_y) &&
|
||||||
(child->m_x+child->m_width >= event.m_x) &&
|
(child->m_x+child->m_width >= event.m_x) &&
|
||||||
(child->m_y+child->m_height >= event.m_y))
|
(child->m_y+child->m_height >= event.m_y))
|
||||||
@@ -654,7 +657,24 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
|
|||||||
|
|
||||||
wxMouseEvent event( wxEVT_ENTER_WINDOW );
|
wxMouseEvent event( wxEVT_ENTER_WINDOW );
|
||||||
event.SetEventObject( win );
|
event.SetEventObject( win );
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
GdkModifierType state = (GdkModifierType)0;
|
||||||
|
|
||||||
|
gdk_window_get_pointer( widget->window, &x, &y, &state );
|
||||||
|
|
||||||
|
event.m_shiftDown = (state & GDK_SHIFT_MASK);
|
||||||
|
event.m_controlDown = (state & GDK_CONTROL_MASK);
|
||||||
|
event.m_altDown = (state & GDK_MOD1_MASK);
|
||||||
|
event.m_metaDown = (state & GDK_MOD2_MASK);
|
||||||
|
event.m_leftDown = (state & GDK_BUTTON1_MASK);
|
||||||
|
event.m_middleDown = (state & GDK_BUTTON2_MASK);
|
||||||
|
event.m_rightDown = (state & GDK_BUTTON3_MASK);
|
||||||
|
|
||||||
|
event.m_x = (long)x;
|
||||||
|
event.m_y = (long)y;
|
||||||
|
|
||||||
if (win->GetEventHandler()->ProcessEvent( event ))
|
if (win->GetEventHandler()->ProcessEvent( event ))
|
||||||
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
|
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
|
||||||
|
|
||||||
@@ -686,6 +706,23 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
|
|||||||
wxMouseEvent event( wxEVT_LEAVE_WINDOW );
|
wxMouseEvent event( wxEVT_LEAVE_WINDOW );
|
||||||
event.SetEventObject( win );
|
event.SetEventObject( win );
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
GdkModifierType state = (GdkModifierType)0;
|
||||||
|
|
||||||
|
gdk_window_get_pointer( widget->window, &x, &y, &state );
|
||||||
|
|
||||||
|
event.m_shiftDown = (state & GDK_SHIFT_MASK);
|
||||||
|
event.m_controlDown = (state & GDK_CONTROL_MASK);
|
||||||
|
event.m_altDown = (state & GDK_MOD1_MASK);
|
||||||
|
event.m_metaDown = (state & GDK_MOD2_MASK);
|
||||||
|
event.m_leftDown = (state & GDK_BUTTON1_MASK);
|
||||||
|
event.m_middleDown = (state & GDK_BUTTON2_MASK);
|
||||||
|
event.m_rightDown = (state & GDK_BUTTON3_MASK);
|
||||||
|
|
||||||
|
event.m_x = (long)x;
|
||||||
|
event.m_y = (long)y;
|
||||||
|
|
||||||
if (win->GetEventHandler()->ProcessEvent( event ))
|
if (win->GetEventHandler()->ProcessEvent( event ))
|
||||||
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
|
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user