From 4a33eba645f96bf7a89397d7dbadd7d62ee2fde1 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 10 Dec 1998 19:58:09 +0000 Subject: [PATCH] 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 --- src/generic/splitter.cpp | 76 +++++++++------------------------------- src/gtk/window.cpp | 45 +++++++++++++++++++++--- src/gtk1/window.cpp | 45 +++++++++++++++++++++--- 3 files changed, 98 insertions(+), 68 deletions(-) diff --git a/src/generic/splitter.cpp b/src/generic/splitter.cpp index bc24c4bae5..b3591976b0 100644 --- a/src/generic/splitter.cpp +++ b/src/generic/splitter.cpp @@ -152,41 +152,23 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { CaptureMouse(); - // Required for X to specify that - // that we wish to draw on top of all windows - // - and we optimise by specifying the area - // for creating the overlap window. - wxScreenDC::StartDrawingOnTop(this); - - // 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; + m_dragMode = wxSPLIT_DRAG_DRAGGING; + + DrawSashTracker(x, y); + m_oldX = x; + m_oldY = y; + return; } } - 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) { // We can stop dragging now and see what we've got. m_dragMode = wxSPLIT_DRAG_NONE; ReleaseMouse(); + // Erase old tracker DrawSashTracker(m_oldX, m_oldY); - // End drawing on top (frees the window used for drawing - // over the screen) - wxScreenDC::EndDrawingOnTop(); - int w, h; GetClientSize(&w, &h); if ( m_splitMode == wxSPLIT_VERTICAL ) @@ -217,7 +199,7 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) m_sashPosition = x; } } - else + else // m_splitMode == wxSPLIT_VERTICAL { if ( !OnSashPositionChange(y) ) return; @@ -244,9 +226,9 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { m_sashPosition = y; } - } + } // m_splitMode == wxSPLIT_VERTICAL SizeWindows(); - } + } // left up && dragging else if (event.Moving() && !event.Dragging()) { // Just change the cursor if required @@ -266,37 +248,14 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) SetCursor(*wxSTANDARD_CURSOR); } } - else if ( (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) || - (event.Dragging() && SashHitTest(x, y, 4)) ) + else if (event.Dragging() && (m_dragMode == wxSPLIT_DRAG_DRAGGING)) { - if ( m_splitMode == wxSPLIT_VERTICAL ) - { - SetCursor(*m_sashCursorWE); - } - else - { - SetCursor(*m_sashCursorNS); - } + // Erase old tracker + DrawSashTracker(m_oldX, m_oldY); - // Detect that this is really a drag: we've moved more than 1 pixel either way - if ((m_dragMode == wxSPLIT_DRAG_LEFT_DOWN) && -// (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); - } - } + // Draw new one + DrawSashTracker(x, y); + m_oldX = x; m_oldY = y; } @@ -304,9 +263,6 @@ void wxSplitterWindow::OnMouseEvent(wxMouseEvent& event) { OnDoubleClickSash(x, y); } - else - { - } } void wxSplitterWindow::OnSize(wxSizeEvent& WXUNUSED(event)) diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 9fb88d4e1f..c376ff0886 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -400,7 +400,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton while (node) { 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_x+child->m_width >= event.m_x) && (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) { 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_x+child->m_width >= event.m_x) && (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()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); -*/ +*/ wxMouseEvent event( wxEVT_MOTION ); 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) { 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_x+child->m_width >= event.m_x) && (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 ); 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 )) 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 ); 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 )) gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 9fb88d4e1f..c376ff0886 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -400,7 +400,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton while (node) { 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_x+child->m_width >= event.m_x) && (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) { 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_x+child->m_width >= event.m_x) && (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()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); -*/ +*/ wxMouseEvent event( wxEVT_MOTION ); 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) { 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_x+child->m_width >= event.m_x) && (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 ); 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 )) 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 ); 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 )) gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );