]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed three mouse event bugs
authorRobert Roebling <robert@roebling.de>
Thu, 10 Dec 1998 19:58:09 +0000 (19:58 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 10 Dec 1998 19:58:09 +0000 (19:58 +0000)
  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
src/gtk/window.cpp
src/gtk1/window.cpp

index bc24c4bae5fe3e32ab7286303aeb6cc83a4fc198..b3591976b0bb36ade17e8d0626c7036ecca9e749 100644 (file)
@@ -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);
-         }
-
-        // 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);
+        // 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))
index 9fb88d4e1ff410f33ab31317235300b092b32401..c376ff0886afc931377e347474609276330bb4dc 100644 (file)
@@ -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" );
 
index 9fb88d4e1ff410f33ab31317235300b092b32401..c376ff0886afc931377e347474609276330bb4dc 100644 (file)
@@ -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" );