summaryrefslogtreecommitdiff
path: root/gnu/java/awt
diff options
context:
space:
mode:
authorRobert Schuster <theBohemian@gmx.net>2007-05-22 22:25:14 +0000
committerRobert Schuster <theBohemian@gmx.net>2007-05-22 22:25:14 +0000
commit35e903eed5f6b9e4218671420dd73d7cb5ac960c (patch)
treeadb44a97bdabfc71e8caf9f2dbd0700a41eade55 /gnu/java/awt
parent749652a3da630325e6610940b21c313a48a3beac (diff)
downloadclasspath-35e903eed5f6b9e4218671420dd73d7cb5ac960c.tar.gz
Makes modifiers for button events work correctly.
2007-05-22 Robert Schuster <robertschuster@fsfe.org> * gnu/java/awt/peer/x/XEventQueue.java: (handleEvent): Calculate modifier value for mouse presse and release events, clip button values. (buttonToModifier): New method. * gnu/java/awt/peer/x/KeyboardMapping.java: (mapModifiers): Added cases for alt gr and the meta key.
Diffstat (limited to 'gnu/java/awt')
-rw-r--r--gnu/java/awt/peer/x/KeyboardMapping.java4
-rw-r--r--gnu/java/awt/peer/x/XEventPump.java36
2 files changed, 36 insertions, 4 deletions
diff --git a/gnu/java/awt/peer/x/KeyboardMapping.java b/gnu/java/awt/peer/x/KeyboardMapping.java
index 8e0a31f5d..8cda31d81 100644
--- a/gnu/java/awt/peer/x/KeyboardMapping.java
+++ b/gnu/java/awt/peer/x/KeyboardMapping.java
@@ -405,8 +405,12 @@ final class KeyboardMapping
if ((xMods & Input.SHIFT_MASK) != 0)
mods |= KeyEvent.SHIFT_MASK | KeyEvent.SHIFT_DOWN_MASK;
+ if ((xMods & Input.META_MASK) != 0)
+ mods |= KeyEvent.META_MASK | KeyEvent.META_DOWN_MASK;
if ((xMods & Input.ALT_MASK) != 0)
mods |= KeyEvent.ALT_MASK | KeyEvent.ALT_DOWN_MASK;
+ if ((xMods & Input.MOD5_MASK) != 0)
+ mods |= KeyEvent.ALT_GRAPH_MASK | KeyEvent.ALT_GRAPH_DOWN_MASK;
if ((xMods & Input.CONTROL_MASK) != 0)
mods |= KeyEvent.CTRL_MASK | KeyEvent.CTRL_DOWN_MASK;
diff --git a/gnu/java/awt/peer/x/XEventPump.java b/gnu/java/awt/peer/x/XEventPump.java
index d4cc9f509..09da06a7d 100644
--- a/gnu/java/awt/peer/x/XEventPump.java
+++ b/gnu/java/awt/peer/x/XEventPump.java
@@ -162,10 +162,15 @@ public class XEventPump
awtWindow = (Window) windows.get(key);
// Create and post the mouse event.
int button = bp.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
drag = button;
MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
- System.currentTimeMillis(), 0,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(bp.state()) | buttonToModifier(button),
bp.event_x(), bp.event_y(),
1, false, button);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
@@ -174,11 +179,17 @@ public class XEventPump
ButtonRelease br = (ButtonRelease) xEvent;
key= new Integer(br.event_window_id);
awtWindow = (Window) windows.get(key);
+
+ button = br.detail();
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
drag = -1;
MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
- System.currentTimeMillis(), 0,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(br.state()) | buttonToModifier(button),
br.event_x(), br.event_y(),
- 1, false, br.detail());
+ 1, false, button);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
break;
case MotionNotify.CODE:
@@ -297,6 +308,23 @@ public class XEventPump
}
+ /** Translates an X button identifier to the AWT's MouseEvent modifier
+ * mask. As the AWT cannot handle more than 3 buttons those return
+ * <code>0</code>.
+ */
+ static int buttonToModifier(int button)
+ {
+ switch (button)
+ {
+ case gnu.x11.Input.BUTTON1:
+ return MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON1_MASK;
+ case gnu.x11.Input.BUTTON2:
+ return MouseEvent.BUTTON2_DOWN_MASK | MouseEvent.BUTTON2_MASK;
+ case gnu.x11.Input.BUTTON3:
+ return MouseEvent.BUTTON3_DOWN_MASK | MouseEvent.BUTTON3_MASK;
+ }
+
+ return 0;
+ }
}
-