classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] fix mouse event modifiers


From: Thomas Fitzsimmons
Subject: [cp-patches] fix mouse event modifiers
Date: Sun, 11 Sep 2005 23:45:46 -0400

Hi,

We weren't properly handling mouse event modifiers.  I've committed two
tests to Mauve gnu.testlet.java.awt.event.MouseEvent.modifiersEx,
gnu.testlet.java.awt.event.MouseEvent.modifiers which demonstrate the
expected behaviour.  With this patch these two tests pass.

Tom

2005-09-11  Thomas Fitzsimmons  <address@hidden>

        PR swing/22922
        * java/awt/event/InputEvent.java (modifiersEx): New field.
        (InputEvent): Assume modifiers parameter contains both new- and
        old-style masks.
        (isShiftDown): Check modifiers for old-style shift mask and
        modifiersEx for new-style shift mask.
        (isControlDown): Likewise for control mask.
        (isMetaDown): Likewise for meta mask.
        (isAltDown): Likewise for alt mask.
        (isAltGraphDown): Likewise for alt-graph mask.
        (getModifiers): Return value of modifiers field.
        (getModifiersEx): Return value of modifiersEx field.
        * java/awt/event/MouseEvent.java
        (MouseEvent(Component,int,long,int,int,int,int,boolean,int)):
        Clear button new-style mask for mouse released events.
        (paramString): Remove old-style modifier handling.
        (readObject): Extend modifiers and assign to modifiersEx.
        * java/awt/event/KeyEvent.java (readObject): Extend modifiers and
        assign to modifiersEx.
        * native/jni/gtk-peer/gtkpeer.h: Define macros for new-style mouse
        masks.  Define macros for old-style key masks.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c:
        Remove macros for old-style key masks.
        (button_to_awt_mods): Always return bitwise OR of new- and
        old-style modifiers.
        (cp_gtk_state_to_awt_mods): Likewise.
        (state_to_awt_mods_with_button_states): Likewise.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (keyevent_state_to_awt_mods): Likewise.

Index: java/awt/event/InputEvent.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/event/InputEvent.java,v
retrieving revision 1.10
diff -u -r1.10 InputEvent.java
--- java/awt/event/InputEvent.java      2 Jul 2005 20:32:28 -0000       1.10
+++ java/awt/event/InputEvent.java      12 Sep 2005 03:44:12 -0000
@@ -197,17 +197,28 @@
   private final long when;
 
   /**
-   * The modifiers in effect for this event. Package visible for use by
-   * subclasses. The old style (bitmask 0x3f) should not be mixed with the
-   * new style (bitmasks 0xffffffc0).
+   * The old-style modifiers in effect for this event. Package visible
+   * for use by subclasses. The old style (bitmask 0x3f) should not be
+   * mixed with the new style (bitmasks 0xffffffc0).
    *
    * @see #getModifiers()
    * @see MouseEvent
-   * @serial the modifier state, stored in the new style
+   * @serial the modifier state, stored in the old style
    */
   int modifiers;
 
   /**
+   * The new-style modifiers in effect for this event. Package visible
+   * for use by subclasses. The old style (bitmask 0x3f) should not be
+   * mixed with the new style (bitmasks 0xffffffc0).
+   *
+   * @see #getModifiersEx()
+   * @see MouseEvent
+   * @serial the modifier state, stored in the new style
+   */
+  int modifiersEx;
+
+  /**
    * Initializes a new instance of <code>InputEvent</code> with the specified
    * source, id, timestamp, and modifiers. Note that an invalid id leads to
    * unspecified results.
@@ -222,7 +233,8 @@
   {
     super(source, id);
     this.when = when;
-    this.modifiers = EventModifier.extend(modifiers);
+    this.modifiers = modifiers & EventModifier.OLD_MASK;
+    this.modifiersEx = modifiers & EventModifier.NEW_MASK;
   }
 
   /**
@@ -232,7 +244,8 @@
    */
   public boolean isShiftDown()
   {
-    return (modifiers & SHIFT_DOWN_MASK) != 0;
+    return ((modifiers & SHIFT_MASK) != 0)
+      || ((modifiersEx & SHIFT_DOWN_MASK) != 0);
   }
 
   /**
@@ -243,7 +256,8 @@
    */
   public boolean isControlDown()
   {
-    return (modifiers & CTRL_DOWN_MASK) != 0;
+    return ((modifiers & CTRL_MASK) != 0)
+      || ((modifiersEx & CTRL_DOWN_MASK) != 0);
   }
 
   /**
@@ -253,7 +267,8 @@
    */
   public boolean isMetaDown()
   {
-    return (modifiers & META_DOWN_MASK) != 0;
+    return ((modifiers & META_MASK) != 0)
+      || ((modifiersEx & META_DOWN_MASK) != 0);
   }
 
   /**
@@ -263,7 +278,8 @@
    */
   public boolean isAltDown()
   {
-    return (modifiers & ALT_DOWN_MASK) != 0;
+    return ((modifiers & ALT_MASK) != 0)
+      || ((modifiersEx & ALT_DOWN_MASK) != 0);
   }
 
   /**
@@ -274,7 +290,8 @@
    */
   public boolean isAltGraphDown()
   {
-    return (modifiers & ALT_GRAPH_DOWN_MASK) != 0;
+    return ((modifiers & ALT_GRAPH_MASK) != 0)
+      || ((modifiersEx & ALT_GRAPH_DOWN_MASK) != 0);
   }
 
   /**
@@ -300,7 +317,7 @@
    */
   public int getModifiers()
   {
-    return EventModifier.revert(modifiers);
+    return modifiers;
   }
 
   /**
@@ -321,7 +338,7 @@
    */
   public int getModifiersEx()
   {
-    return modifiers;
+    return modifiersEx;
   }
 
   /**
Index: java/awt/event/KeyEvent.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/event/KeyEvent.java,v
retrieving revision 1.13
diff -u -r1.13 KeyEvent.java
--- java/awt/event/KeyEvent.java        2 Jul 2005 20:32:28 -0000       1.13
+++ java/awt/event/KeyEvent.java        12 Sep 2005 03:44:12 -0000
@@ -1735,6 +1735,6 @@
     throws IOException, ClassNotFoundException
   {
     s.defaultReadObject();
-    modifiers = EventModifier.extend(modifiers);
+    modifiersEx = EventModifier.extend(modifiers) & EventModifier.NEW_MASK;
   }
 } // class KeyEvent
Index: java/awt/event/MouseEvent.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/event/MouseEvent.java,v
retrieving revision 1.10
diff -u -r1.10 MouseEvent.java
--- java/awt/event/MouseEvent.java      2 Jul 2005 20:32:28 -0000       1.10
+++ java/awt/event/MouseEvent.java      12 Sep 2005 03:44:12 -0000
@@ -227,6 +227,12 @@
         else if ((modifiers & BUTTON3_MASK) != 0)
           this.button = BUTTON3;
       }
+    // clear the mouse button modifier masks if this is a button
+    // release event.
+    if (id == MOUSE_RELEASED)
+      this.modifiersEx &= ~(BUTTON1_DOWN_MASK
+                           | BUTTON2_DOWN_MASK
+                           | BUTTON3_DOWN_MASK);
   }
 
   /**
@@ -392,17 +398,9 @@
         s.append("unknown type,(");
       }
     s.append(x).append(',').append(y).append("),button=").append(button);
-    if ((modifiers & EventModifier.NEW_MASK) != 0)
-      {
-        int mod = modifiers;
-        if ((mod & (ALT_DOWN_MASK | BUTTON2_DOWN_MASK)) != 0)
-          mod |= ALT_DOWN_MASK | BUTTON2_DOWN_MASK;
-        if ((mod & (META_DOWN_MASK | BUTTON3_DOWN_MASK)) != 0)
-          mod |= META_DOWN_MASK | BUTTON3_DOWN_MASK;
-        s.append(",modifiers=").append(getModifiersExText(mod));
-      }
-    if (modifiers != 0)
-      s.append(",extModifiers=").append(getModifiersExText(modifiers));
+    // FIXME: need a mauve test for this method
+    if (modifiersEx != 0)
+      s.append(",extModifiers=").append(getModifiersExText(modifiersEx));
     return s.append(",clickCount=").append(clickCount).toString();
   }
 
@@ -426,7 +424,7 @@
           button = BUTTON2;
         else if ((modifiers & BUTTON3_MASK) != 0)
           button = BUTTON3;
-        modifiers = EventModifier.extend(modifiers);
+        modifiersEx = EventModifier.extend(modifiers) & EventModifier.NEW_MASK;
       }
   }
 } // class MouseEvent
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.52
diff -u -r1.52 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        25 Aug 
2005 02:26:50 -0000      1.52
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c        12 Sep 
2005 03:44:12 -0000
@@ -56,10 +56,6 @@
 #define AWT_HAND_CURSOR 12
 #define AWT_MOVE_CURSOR 13
 
-#define AWT_BUTTON1_DOWN_MASK (1 << 10)
-#define AWT_BUTTON2_DOWN_MASK (1 << 11)
-#define AWT_BUTTON3_DOWN_MASK (1 << 12)
-
 /* FIXME: use gtk-double-click-time, gtk-double-click-distance */
 #define MULTI_CLICK_TIME   250
 /* as opposed to a MULTI_PASS_TIME :) */
@@ -135,11 +131,11 @@
   switch (button)
     {
     case 1:
-      return AWT_BUTTON1_MASK;
+      return AWT_BUTTON1_DOWN_MASK | AWT_BUTTON1_MASK;
     case 2:
-      return AWT_BUTTON2_MASK;
+      return AWT_BUTTON2_DOWN_MASK | AWT_BUTTON2_MASK;
     case 3:
-      return AWT_BUTTON3_MASK;
+      return AWT_BUTTON3_DOWN_MASK | AWT_BUTTON3_MASK;
     }
 
   return 0;
@@ -151,11 +147,11 @@
   jint result = 0;
 
   if (state & GDK_SHIFT_MASK)
-    result |= AWT_SHIFT_DOWN_MASK;
+    result |= (AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK);
   if (state & GDK_CONTROL_MASK)
-    result |= AWT_CTRL_DOWN_MASK;
+    result |= (AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK);
   if (state & GDK_MOD1_MASK)
-    result |= AWT_ALT_DOWN_MASK;
+    result |= (AWT_ALT_DOWN_MASK | AWT_ALT_MASK);
 
   return result;
 }
@@ -166,13 +162,13 @@
   jint result = 0;
 
   if (state & GDK_SHIFT_MASK)
-    result |= AWT_SHIFT_DOWN_MASK;
+    result |= AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK;
   if (state & GDK_CONTROL_MASK)
-    result |= AWT_CTRL_DOWN_MASK;
+    result |= AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK;
   if (state & GDK_MOD1_MASK)
-    result |= AWT_ALT_DOWN_MASK;
+    result |= AWT_ALT_DOWN_MASK | AWT_ALT_MASK;
   if (state & GDK_BUTTON1_MASK)
-    result |= AWT_BUTTON1_DOWN_MASK;
+    result |= AWT_BUTTON1_DOWN_MASK | AWT_BUTTON1_MASK;
   if (state & GDK_BUTTON2_MASK)
     result |= AWT_BUTTON2_DOWN_MASK;
   if (state & GDK_BUTTON3_MASK)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.59
diff -u -r1.59 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   9 Sep 2005 
15:21:45 -0000       1.59
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   12 Sep 2005 
03:44:13 -0000
@@ -952,29 +952,29 @@
 
       if (event->keyval == GDK_Shift_L
           || event->keyval == GDK_Shift_R)
-        result |= AWT_SHIFT_DOWN_MASK;
+        result |= AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK;
       else
         {
           if (state & GDK_SHIFT_MASK)
-            result |= AWT_SHIFT_DOWN_MASK;
+            result |= AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK;
         }
 
       if (event->keyval == GDK_Control_L
           || event->keyval == GDK_Control_R)
-        result |= AWT_CTRL_DOWN_MASK;
+        result |= AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK;
       else
         {
           if (state & GDK_CONTROL_MASK)
-            result |= AWT_CTRL_DOWN_MASK;
+            result |= AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK;
         }
 
       if (event->keyval == GDK_Alt_L
           || event->keyval == GDK_Alt_R)
-        result |= AWT_ALT_DOWN_MASK;
+        result |= AWT_ALT_DOWN_MASK | AWT_ALT_MASK;
       else
         {
           if (state & GDK_MOD1_MASK)
-            result |= AWT_ALT_DOWN_MASK;
+            result |= AWT_ALT_DOWN_MASK | AWT_ALT_MASK;
         }
     }
   else if (event->type == GDK_KEY_RELEASE)
@@ -985,20 +985,20 @@
           && event->keyval != GDK_Shift_R)
         {
           if (state & GDK_SHIFT_MASK)
-            result |= AWT_SHIFT_DOWN_MASK;
+            result |= AWT_SHIFT_DOWN_MASK | AWT_SHIFT_MASK;
         }
       if (event->keyval != GDK_Control_L
           && event->keyval != GDK_Control_R)
         {
           if (state & GDK_CONTROL_MASK)
-            result |= AWT_CTRL_DOWN_MASK;
+            result |= AWT_CTRL_DOWN_MASK | AWT_CTRL_MASK;
         }
 
       if (event->keyval != GDK_Alt_L
           && event->keyval != GDK_Alt_R)
         {
           if (state & GDK_MOD1_MASK)
-            result |= AWT_ALT_DOWN_MASK;
+            result |= AWT_ALT_DOWN_MASK | AWT_ALT_MASK;
         }
     }
 
Index: native/jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.40
diff -u -r1.40 gtkpeer.h
--- native/jni/gtk-peer/gtkpeer.h       6 Sep 2005 04:21:14 -0000       1.40
+++ native/jni/gtk-peer/gtkpeer.h       12 Sep 2005 03:44:13 -0000
@@ -111,14 +111,25 @@
   jint x_offset, y_offset;
 };
 
+/* New-style event masks. */
+#define AWT_BUTTON1_DOWN_MASK (1 << 10)
+#define AWT_BUTTON2_DOWN_MASK (1 << 11)
+#define AWT_BUTTON3_DOWN_MASK (1 << 12)
+
 #define AWT_SHIFT_DOWN_MASK   (1 << 6)
 #define AWT_CTRL_DOWN_MASK    (1 << 7)
 #define AWT_META_DOWN_MASK    (1 << 8)
 #define AWT_ALT_DOWN_MASK     (1 << 9)
 
+/* Old-style event masks. */
 #define AWT_BUTTON1_MASK (1 << 4)
 #define AWT_BUTTON2_MASK (1 << 3)
 #define AWT_BUTTON3_MASK (1 << 2)
+
+#define AWT_SHIFT_MASK   (1 << 0)
+#define AWT_CTRL_MASK    (1 << 1)
+#define AWT_META_MASK    (1 << 2)
+#define AWT_ALT_MASK     (1 << 3)
 
 #define AWT_ITEM_SELECTED 1
 #define AWT_ITEM_DESELECTED 2

reply via email to

[Prev in Thread] Current Thread [Next in Thread]