diff options
author | Robert Schuster <theBohemian@gmx.net> | 2007-05-22 22:25:14 +0000 |
---|---|---|
committer | Robert Schuster <theBohemian@gmx.net> | 2007-05-22 22:25:14 +0000 |
commit | 35e903eed5f6b9e4218671420dd73d7cb5ac960c (patch) | |
tree | adb44a97bdabfc71e8caf9f2dbd0700a41eade55 /gnu/java/awt | |
parent | 749652a3da630325e6610940b21c313a48a3beac (diff) | |
download | classpath-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.java | 4 | ||||
-rw-r--r-- | gnu/java/awt/peer/x/XEventPump.java | 36 |
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; + } } - |