--- old/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifDesktopIconUI.java 2017-09-21 16:24:22.000000000 +0100
+++ new/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifDesktopIconUI.java 2017-09-21 16:24:21.000000000 +0100
@@ -36,6 +36,8 @@
import java.util.EventListener;
import java.io.Serializable;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
/**
* Motif rendition of the component.
@@ -238,11 +240,15 @@
}
@SuppressWarnings("deprecation")
void forwardEventToParent(MouseEvent e) {
- getParent().dispatchEvent(new MouseEvent(
+ MouseEvent newEvent = new MouseEvent(
getParent(), e.getID(), e.getWhen(), e.getModifiers(),
e.getX(), e.getY(), e.getXOnScreen(),
e.getYOnScreen(), e.getClickCount(),
- e.isPopupTrigger(), MouseEvent.NOBUTTON));
+ e.isPopupTrigger(), MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(e));
+ getParent().dispatchEvent(newEvent);
}
@SuppressWarnings("deprecation")
@@ -331,10 +337,14 @@
}
@SuppressWarnings("deprecation")
void forwardEventToParent(MouseEvent e) {
- getParent().dispatchEvent(new MouseEvent(
+ MouseEvent newEvent = new MouseEvent(
getParent(), e.getID(), e.getWhen(), e.getModifiers(),
e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(),
- e.getClickCount(), e.isPopupTrigger(), MouseEvent.NOBUTTON ));
+ e.getClickCount(), e.isPopupTrigger(), MouseEvent.NOBUTTON );
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(e));
+ getParent().dispatchEvent(newEvent);
}
@SuppressWarnings("deprecation")
--- old/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java 2017-09-21 16:24:23.000000000 +0100
+++ new/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameTitlePane.java 2017-09-21 16:24:22.000000000 +0100
@@ -37,6 +37,9 @@
import java.beans.VetoableChangeListener;
import java.beans.PropertyVetoException;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
+
/**
* Class that manages a Motif title bar
*
@@ -363,11 +366,15 @@
}
@SuppressWarnings("deprecation")
void forwardEventToParent(MouseEvent e) {
- getParent().dispatchEvent(new MouseEvent(
+ MouseEvent newEvent = new MouseEvent(
getParent(), e.getID(), e.getWhen(), e.getModifiers(),
e.getX(), e.getY(), e.getXOnScreen(),
e.getYOnScreen(), e.getClickCount(),
- e.isPopupTrigger(), MouseEvent.NOBUTTON));
+ e.isPopupTrigger(), MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(e));
+ getParent().dispatchEvent(newEvent);
}
public void paintComponent(Graphics g) {
--- old/src/java.desktop/share/classes/java/awt/Component.java 2017-09-21 16:24:24.000000000 +0100
+++ new/src/java.desktop/share/classes/java/awt/Component.java 2017-09-21 16:24:23.000000000 +0100
@@ -5022,6 +5022,12 @@
tpeer.handleEvent(e);
}
}
+
+ if (SunToolkit.isTouchKeyboardAutoShowEnabled() &&
+ (toolkit instanceof SunToolkit) &&
+ ((e instanceof MouseEvent) || (e instanceof FocusEvent))) {
+ ((SunToolkit)toolkit).showOrHideTouchKeyboard(this, e);
+ }
} // dispatchEventImpl()
/*
--- old/src/java.desktop/share/classes/java/awt/Container.java 2017-09-21 16:24:25.000000000 +0100
+++ new/src/java.desktop/share/classes/java/awt/Container.java 2017-09-21 16:24:25.000000000 +0100
@@ -55,6 +55,7 @@
import sun.awt.AppContext;
import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
@@ -4783,6 +4784,9 @@
srcEvent.getClickCount(),
srcEvent.isPopupTrigger(),
srcEvent.getButton());
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(me,
+ meAccessor.isCausedByTouchEvent(srcEvent));
((AWTEvent)srcEvent).copyPrivateDataInto(me);
// translate coordinates to this native container
final Point ptSrcOrigin = srcComponent.getLocationOnScreen();
@@ -4884,6 +4888,9 @@
e.getClickCount(),
e.isPopupTrigger(),
e.getButton());
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(retargeted,
+ meAccessor.isCausedByTouchEvent(e));
}
((AWTEvent)e).copyPrivateDataInto(retargeted);
--- old/src/java.desktop/share/classes/java/awt/event/MouseEvent.java 2017-09-21 16:24:26.000000000 +0100
+++ new/src/java.desktop/share/classes/java/awt/event/MouseEvent.java 2017-09-21 16:24:26.000000000 +0100
@@ -33,6 +33,8 @@
import java.io.ObjectInputStream;
import java.awt.IllegalComponentStateException;
import java.awt.MouseInfo;
+
+import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
/**
@@ -332,6 +334,11 @@
int clickCount;
/**
+ * Indicates whether the event is a result of a touch event.
+ */
+ private boolean causedByTouchEvent;
+
+ /**
* Indicates which, if any, of the mouse buttons has changed state.
*
* The valid values are ranged from 0 to the value returned by the
@@ -399,6 +406,17 @@
//whatever besides SunToolkit) could also operate.
cachedNumberOfButtons = 3;
}
+ AWTAccessor.setMouseEventAccessor(
+ new AWTAccessor.MouseEventAccessor() {
+ public boolean isCausedByTouchEvent(MouseEvent ev) {
+ return ev.causedByTouchEvent;
+ }
+
+ public void setCausedByTouchEvent(MouseEvent ev,
+ boolean causedByTouchEvent) {
+ ev.causedByTouchEvent = causedByTouchEvent;
+ }
+ });
}
/**
--- old/src/java.desktop/share/classes/javax/swing/Autoscroller.java 2017-09-21 16:24:27.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/Autoscroller.java 2017-09-21 16:24:27.000000000 +0100
@@ -28,6 +28,9 @@
import java.awt.*;
import java.awt.event.*;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
+
/**
* Autoscroller is responsible for generating synthetic mouse dragged
* events. It is the responsibility of the Component (or its MouseListeners)
@@ -97,6 +100,9 @@
e.getYOnScreen(),
e.getClickCount(), e.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(event,
+ meAccessor.isCausedByTouchEvent(e));
if (timer == null) {
timer = new Timer(100, this);
@@ -175,6 +181,9 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(e,
+ meAccessor.isCausedByTouchEvent(event));
component.superProcessMouseMotionEvent(e);
}
--- old/src/java.desktop/share/classes/javax/swing/JList.java 2017-09-21 16:24:28.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/JList.java 2017-09-21 16:24:28.000000000 +0100
@@ -48,6 +48,8 @@
import java.io.IOException;
import java.io.Serializable;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.swing.SwingUtilities2;
import sun.swing.SwingUtilities2.Section;
import static sun.swing.SwingUtilities2.Section.*;
@@ -1552,6 +1554,10 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor =
+ AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(event));
String tip = ((JComponent)rComponent).getToolTipText(
newEvent);
--- old/src/java.desktop/share/classes/javax/swing/JTable.java 2017-09-21 16:24:29.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/JTable.java 2017-09-21 16:24:29.000000000 +0100
@@ -56,6 +56,8 @@
import javax.print.attribute.*;
import javax.print.PrintService;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.reflect.misc.ReflectUtil;
import sun.swing.SwingUtilities2;
@@ -3420,6 +3422,9 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(event));
tip = ((JComponent)component).getToolTipText(newEvent);
}
--- old/src/java.desktop/share/classes/javax/swing/JTree.java 2017-09-21 16:24:31.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/JTree.java 2017-09-21 16:24:30.000000000 +0100
@@ -39,6 +39,8 @@
import javax.swing.text.Position;
import javax.accessibility.*;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.swing.SwingUtilities2;
import sun.swing.SwingUtilities2.Section;
import static sun.swing.SwingUtilities2.Section.*;
@@ -1578,6 +1580,10 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor =
+ AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(event));
tip = ((JComponent)rComponent).getToolTipText(newEvent);
}
--- old/src/java.desktop/share/classes/javax/swing/MenuSelectionManager.java 2017-09-21 16:24:32.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/MenuSelectionManager.java 2017-09-21 16:24:32.000000000 +0100
@@ -30,6 +30,8 @@
import javax.swing.event.*;
import sun.awt.AppContext;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.swing.SwingUtilities2;
/**
@@ -308,6 +310,9 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(exitEvent,
+ meAccessor.isCausedByTouchEvent(event));
currentSelection[currentSelection.length-1].
processMouseEvent(exitEvent, path, this);
@@ -320,6 +325,8 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ meAccessor.setCausedByTouchEvent(enterEvent,
+ meAccessor.isCausedByTouchEvent(event));
subElements[j].processMouseEvent(enterEvent, path, this);
}
MouseEvent mouseEvent = new MouseEvent(mc, event.getID(),event. getWhen(),
@@ -329,6 +336,9 @@
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(mouseEvent,
+ meAccessor.isCausedByTouchEvent(event));
subElements[j].processMouseEvent(mouseEvent, path, this);
success = true;
event.consume();
--- old/src/java.desktop/share/classes/javax/swing/SwingUtilities.java 2017-09-21 16:24:33.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/SwingUtilities.java 2017-09-21 16:24:33.000000000 +0100
@@ -44,6 +44,8 @@
import sun.security.action.GetPropertyAction;
import sun.awt.AppContext;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
/**
* A collection of utility methods for Swing.
@@ -405,6 +407,9 @@
sourceEvent.getClickCount(),
sourceEvent.isPopupTrigger(),
sourceEvent.getButton());
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(sourceEvent));
}
return newEvent;
}
--- old/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicComboPopup.java 2017-09-21 16:24:34.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicComboPopup.java 2017-09-21 16:24:34.000000000 +0100
@@ -36,6 +36,8 @@
import java.beans.PropertyChangeEvent;
import java.io.Serializable;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
/**
* This is a basic implementation of the ComboPopup
interface.
@@ -534,13 +536,18 @@
// Fix for 4234053. Filter out the Control Key from the list.
// ie., don't allow CTRL key deselection.
Toolkit toolkit = Toolkit.getDefaultToolkit();
- e = new MouseEvent((Component)e.getSource(), e.getID(), e.getWhen(),
+ MouseEvent newEvent = new MouseEvent(
+ (Component)e.getSource(), e.getID(), e.getWhen(),
e.getModifiers() ^ toolkit.getMenuShortcutKeyMask(),
e.getX(), e.getY(),
e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(e));
+ e = newEvent;
}
super.processMouseEvent(e);
}
@@ -1251,6 +1258,9 @@
e.getClickCount(),
e.isPopupTrigger(),
MouseEvent.NOBUTTON );
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(e));
return newEvent;
}
--- old/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java 2017-09-21 16:24:35.000000000 +0100
+++ new/src/java.desktop/share/classes/javax/swing/table/JTableHeader.java 2017-09-21 16:24:35.000000000 +0100
@@ -42,6 +42,9 @@
import java.io.ObjectOutputStream;
import java.io.IOException;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
+
/**
* This is the object which manages the header of the JTable
.
*
@@ -414,6 +417,9 @@
p.x, p.y, event.getXOnScreen(), event.getYOnScreen(),
event.getClickCount(),
event.isPopupTrigger(), MouseEvent.NOBUTTON);
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(event));
tip = ((JComponent)component).getToolTipText(newEvent);
}
--- old/src/java.desktop/share/classes/sun/awt/AWTAccessor.java 2017-09-21 16:24:36.000000000 +0100
+++ new/src/java.desktop/share/classes/sun/awt/AWTAccessor.java 2017-09-21 16:24:36.000000000 +0100
@@ -38,6 +38,7 @@
import java.awt.event.InputEvent;
import java.awt.event.InvocationEvent;
import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.image.BufferStrategy;
import java.awt.peer.ComponentPeer;
@@ -412,6 +413,21 @@
boolean canAccessSystemClipboard);
}
+ /**
+ * An accessor for the MouseEvent class.
+ */
+ public interface MouseEventAccessor {
+ /**
+ * Indicates whether the event is a result of a touch event.
+ */
+ boolean isCausedByTouchEvent(MouseEvent ev);
+
+ /**
+ * Sets whether the event is a result of a touch event.
+ */
+ void setCausedByTouchEvent(MouseEvent ev, boolean causedByTouchEvent);
+ }
+
/*
* An accessor for the java.awt.Frame class.
*/
@@ -851,6 +867,7 @@
private static WindowAccessor windowAccessor;
private static AWTEventAccessor awtEventAccessor;
private static InputEventAccessor inputEventAccessor;
+ private static MouseEventAccessor mouseEventAccessor;
private static FrameAccessor frameAccessor;
private static KeyboardFocusManagerAccessor kfmAccessor;
private static MenuComponentAccessor menuComponentAccessor;
@@ -965,6 +982,23 @@
}
/*
+ * Set an accessor object for the java.awt.event.MouseEvent class.
+ */
+ public static void setMouseEventAccessor(MouseEventAccessor mea) {
+ mouseEventAccessor = mea;
+ }
+
+ /*
+ * Retrieve the accessor object for the java.awt.event.MouseEvent class.
+ */
+ public static MouseEventAccessor getMouseEventAccessor() {
+ if (mouseEventAccessor == null) {
+ unsafe.ensureClassInitialized(MouseEvent.class);
+ }
+ return mouseEventAccessor;
+ }
+
+ /*
* Set an accessor object for the java.awt.Frame class.
*/
public static void setFrameAccessor(FrameAccessor fa) {
--- old/src/java.desktop/share/classes/sun/awt/SunToolkit.java 2017-09-21 16:24:37.000000000 +0100
+++ new/src/java.desktop/share/classes/sun/awt/SunToolkit.java 2017-09-21 16:24:37.000000000 +0100
@@ -84,6 +84,9 @@
if (AccessController.doPrivileged(new GetBooleanAction("sun.awt.nativedebug"))) {
DebugSettings.init();
}
+ touchKeyboardAutoShowIsEnabled = Boolean.valueOf(
+ GetPropertyAction.privilegedGetProperty(
+ "awt.touchKeyboardAutoShowIsEnabled", "true"));
};
/**
@@ -1614,6 +1617,13 @@
*/
public abstract void ungrab(Window w);
+ public void showOrHideTouchKeyboard(Component comp, AWTEvent e) {}
+
+ private static boolean touchKeyboardAutoShowIsEnabled;
+
+ public static boolean isTouchKeyboardAutoShowEnabled() {
+ return touchKeyboardAutoShowIsEnabled;
+ }
/**
* Locates the splash screen library in a platform dependent way and closes
--- old/src/java.desktop/share/classes/sun/swing/FilePane.java 2017-09-21 16:24:38.000000000 +0100
+++ new/src/java.desktop/share/classes/sun/swing/FilePane.java 2017-09-21 16:24:38.000000000 +0100
@@ -44,6 +44,8 @@
import javax.swing.table.*;
import javax.swing.text.*;
+import sun.awt.AWTAccessor;
+import sun.awt.AWTAccessor.MouseEventAccessor;
import sun.awt.shell.*;
/**
@@ -1858,13 +1860,17 @@
// Make a new event with the list as source, placing the
// click in the corresponding list cell.
Rectangle r = list.getCellBounds(index, index);
- evt = new MouseEvent(list, evt.getID(),
+ MouseEvent newEvent = new MouseEvent(list, evt.getID(),
evt.getWhen(), evt.getModifiers(),
r.x + 1, r.y + r.height/2,
evt.getXOnScreen(),
evt.getYOnScreen(),
evt.getClickCount(), evt.isPopupTrigger(),
evt.getButton());
+ MouseEventAccessor meAccessor = AWTAccessor.getMouseEventAccessor();
+ meAccessor.setCausedByTouchEvent(newEvent,
+ meAccessor.isCausedByTouchEvent(evt));
+ evt = newEvent;
}
} else {
return;
--- old/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java 2017-09-21 16:24:39.000000000 +0100
+++ new/src/java.desktop/windows/classes/sun/awt/windows/WToolkit.java 2017-09-21 16:24:39.000000000 +0100
@@ -31,12 +31,16 @@
import java.awt.im.spi.InputMethodDescriptor;
import java.awt.image.*;
import java.awt.peer.*;
+import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
import java.awt.datatransfer.Clipboard;
+import java.awt.TextComponent;
import java.awt.TrayIcon;
import java.beans.PropertyChangeListener;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import javax.swing.text.JTextComponent;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
@@ -1084,6 +1088,61 @@
}
}
+ ///////////////////////////////////////////////////////////////////////////
+ // The following code is used for support of automatic showing of the touch
+ // keyboard for text components and is accessed only from EDT.
+ ///////////////////////////////////////////////////////////////////////////
+ private volatile Component compOnTouchDownEvent;
+ private volatile Component compOnMousePressedEvent;
+
+ @Override
+ public void showOrHideTouchKeyboard(Component comp, AWTEvent e) {
+ if ((comp == null) || (e == null) ||
+ (!(comp instanceof TextComponent) &&
+ !(comp instanceof JTextComponent))) {
+ return;
+ }
+
+ if ((e instanceof MouseEvent) && comp.isEnabled() &&
+ (((comp instanceof TextComponent) &&
+ ((TextComponent)comp).isEditable()) ||
+ ((comp instanceof JTextComponent) &&
+ ((JTextComponent)comp).isEditable()))) {
+ MouseEvent me = (MouseEvent)e;
+ if (me.getID() == MouseEvent.MOUSE_PRESSED) {
+ if (AWTAccessor.getMouseEventAccessor()
+ .isCausedByTouchEvent(me)) {
+ compOnTouchDownEvent = comp;
+ } else {
+ compOnMousePressedEvent = comp;
+ }
+ } else if (me.getID() == MouseEvent.MOUSE_RELEASED) {
+ if (AWTAccessor.getMouseEventAccessor()
+ .isCausedByTouchEvent(me)) {
+ if (compOnTouchDownEvent == comp) {
+ showTouchKeyboard(true);
+ }
+ compOnTouchDownEvent = null;
+ } else {
+ if (compOnMousePressedEvent == comp) {
+ showTouchKeyboard(false);
+ }
+ compOnMousePressedEvent = null;
+ }
+ }
+ } else if (e instanceof FocusEvent) {
+ if (e.getID() == FocusEvent.FOCUS_LOST) {
+ hideTouchKeyboard();
+ }
+ }
+ }
+
+ private native void showTouchKeyboard(boolean causedByTouchEvent);
+ private native void hideTouchKeyboard();
+ ///////////////////////////////////////////////////////////////////////////
+ // End of the touch keyboard related code.
+ ///////////////////////////////////////////////////////////////////////////
+
@Override
public native boolean syncNativeQueue(final long timeout);
--- old/src/java.desktop/windows/native/libawt/windows/awt.h 2017-09-21 16:24:40.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt.h 2017-09-21 16:24:40.000000000 +0100
@@ -163,6 +163,9 @@
#define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5)
#define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#define IS_WINVISTA (LOBYTE(LOWORD(::GetVersion())) >= 6)
+#define IS_WIN8 ( \
+ (IS_WINVISTA && (HIBYTE(LOWORD(::GetVersion())) >= 2)) || \
+ (LOBYTE(LOWORD(::GetVersion())) > 6))
#define IS_WINVER_ATLEAST(maj, min) \
((maj) < LOBYTE(LOWORD(::GetVersion())) || \
--- old/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp 2017-09-21 16:24:41.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp 2017-09-21 16:24:41.000000000 +0100
@@ -217,6 +217,10 @@
AwtComponent::AwtComponent()
{
m_mouseButtonClickAllowed = 0;
+ m_touchDownOccurred = FALSE;
+ m_touchUpOccurred = FALSE;
+ m_touchDownPoint.x = m_touchDownPoint.y = 0;
+ m_touchUpPoint.x = m_touchUpPoint.y = 0;
m_callbacksEnabled = FALSE;
m_hwnd = NULL;
@@ -582,6 +586,11 @@
/* Subclass the window now so that we can snoop on its messages */
SubclassHWND();
+ AwtToolkit& tk = AwtToolkit::GetInstance();
+ if (tk.IsWin8OrLater() && tk.IsTouchKeyboardAutoShowEnabled()) {
+ tk.TIRegisterTouchWindow(GetHWnd(), TWF_WANTPALM);
+ }
+
/*
* Fix for 4046446.
*/
@@ -1713,6 +1722,9 @@
break;
}
break;
+ case WM_TOUCH:
+ WmTouch(wParam, lParam);
+ break;
case WM_SETCURSOR:
mr = mrDoDefault;
if (LOWORD(lParam) == HTCLIENT) {
@@ -2295,6 +2307,38 @@
return mrDoDefault;
}
+void AwtComponent::WmTouch(WPARAM wParam, LPARAM lParam) {
+ AwtToolkit& tk = AwtToolkit::GetInstance();
+ if (!tk.IsWin8OrLater() || !tk.IsTouchKeyboardAutoShowEnabled()) {
+ return;
+ }
+
+ UINT inputsCount = LOWORD(wParam);
+ TOUCHINPUT* pInputs = new TOUCHINPUT[inputsCount];
+ if (pInputs != NULL) {
+ if (tk.TIGetTouchInputInfo((HTOUCHINPUT)lParam, inputsCount, pInputs,
+ sizeof(TOUCHINPUT)) != 0) {
+ for (UINT i = 0; i < inputsCount; i++) {
+ TOUCHINPUT ti = pInputs[i];
+ if (ti.dwFlags & TOUCHEVENTF_PRIMARY) {
+ if (ti.dwFlags & TOUCHEVENTF_DOWN) {
+ m_touchDownPoint.x = ti.x / 100;
+ m_touchDownPoint.y = ti.y / 100;
+ ::ScreenToClient(GetHWnd(), &m_touchDownPoint);
+ m_touchDownOccurred = TRUE;
+ } else if (ti.dwFlags & TOUCHEVENTF_UP) {
+ m_touchUpPoint.x = ti.x / 100;
+ m_touchUpPoint.y = ti.y / 100;
+ ::ScreenToClient(GetHWnd(), &m_touchUpPoint);
+ m_touchUpOccurred = TRUE;
+ }
+ }
+ }
+ }
+ delete[] pInputs;
+ }
+}
+
/* Double-click variables. */
static jlong multiClickTime = ::GetDoubleClickTime();
static int multiClickMaxX = ::GetSystemMetrics(SM_CXDOUBLECLK);
@@ -2337,6 +2381,14 @@
m_mouseButtonClickAllowed |= GetButtonMK(button);
lastTime = now;
+ BOOL causedByTouchEvent = FALSE;
+ if (m_touchDownOccurred &&
+ (abs(m_touchDownPoint.x - x) <= TOUCH_MOUSE_COORDS_DELTA) &&
+ (abs(m_touchDownPoint.y - y) <= TOUCH_MOUSE_COORDS_DELTA)) {
+ causedByTouchEvent = TRUE;
+ m_touchDownOccurred = FALSE;
+ }
+
MSG msg;
InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y);
@@ -2355,7 +2407,7 @@
SendMouseEvent(java_awt_event_MouseEvent_MOUSE_PRESSED, now, x, y,
GetJavaModifiers(), clickCount, JNI_FALSE,
- GetButton(button), &msg);
+ GetButton(button), &msg, causedByTouchEvent);
/*
* NOTE: this call is intentionally placed after all other code,
* since AwtComponent::WmMouseDown() assumes that the cached id of the
@@ -2377,13 +2429,21 @@
MsgRouting AwtComponent::WmMouseUp(UINT flags, int x, int y, int button)
{
+ BOOL causedByTouchEvent = FALSE;
+ if (m_touchUpOccurred &&
+ (abs(m_touchUpPoint.x - x) <= TOUCH_MOUSE_COORDS_DELTA) &&
+ (abs(m_touchUpPoint.y - y) <= TOUCH_MOUSE_COORDS_DELTA)) {
+ causedByTouchEvent = TRUE;
+ m_touchUpOccurred = FALSE;
+ }
+
MSG msg;
InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y);
SendMouseEvent(java_awt_event_MouseEvent_MOUSE_RELEASED, ::JVM_CurrentTimeMillis(NULL, 0),
x, y, GetJavaModifiers(), clickCount,
(GetButton(button) == java_awt_event_MouseEvent_BUTTON3 ?
- TRUE : FALSE), GetButton(button), &msg);
+ TRUE : FALSE), GetButton(button), &msg, causedByTouchEvent);
/*
* If no movement, then report a click following the button release.
* When WM_MOUSEUP comes to a window without previous WM_MOUSEDOWN,
@@ -4970,7 +5030,7 @@
void AwtComponent::SendMouseEvent(jint id, jlong when, jint x, jint y,
jint modifiers, jint clickCount,
jboolean popupTrigger, jint button,
- MSG *pMsg)
+ MSG *pMsg, BOOL causedByTouchEvent)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
CriticalSection::Lock l(GetLock());
@@ -5020,6 +5080,10 @@
DASSERT(mouseEvent != NULL);
CHECK_NULL(mouseEvent);
+ if (causedByTouchEvent) {
+ env->SetBooleanField(mouseEvent, AwtMouseEvent::causedByTouchEventID,
+ JNI_TRUE);
+ }
if (pMsg != 0) {
AwtAWTEvent::saveMSG(env, pMsg, mouseEvent);
}
--- old/src/java.desktop/windows/native/libawt/windows/awt_Component.h 2017-09-21 16:24:43.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt_Component.h 2017-09-21 16:24:42.000000000 +0100
@@ -67,7 +67,10 @@
const int ALL_MK_BUTTONS = MK_LBUTTON|MK_MBUTTON|MK_RBUTTON;
const int X_BUTTONS = MK_XBUTTON1|MK_XBUTTON2;
-
+// The allowable difference between coordinates of the WM_TOUCH event and the
+// corresponding WM_LBUTTONDOWN/WM_LBUTTONUP event letting to associate these
+// events, when their coordinates are slightly different.
+const int TOUCH_MOUSE_COORDS_DELTA = 10;
// Whether to check for embedded frame and adjust location
#define CHECK_EMBEDDED 0
@@ -385,7 +388,7 @@
void SendMouseEvent(jint id, jlong when, jint x, jint y,
jint modifiers, jint clickCount,
jboolean popupTrigger, jint button = 0,
- MSG *msg = NULL);
+ MSG *msg = NULL, BOOL causedByTouchEvent = FALSE);
/*
* Allocate and initialize a new java.awt.event.MouseWheelEvent, and
@@ -528,6 +531,7 @@
virtual MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button);
virtual MsgRouting WmWindowPosChanging(LPARAM windowPos);
virtual MsgRouting WmWindowPosChanged(LPARAM windowPos);
+ virtual void WmTouch(WPARAM wParam, LPARAM lParam);
// NB: 64-bit: vkey is wParam of the message, but other API's take
// vkey parameters of type UINT, so we do the cast before dispatching.
@@ -764,6 +768,11 @@
*/
UINT m_mouseButtonClickAllowed;
+ BOOL m_touchDownOccurred;
+ BOOL m_touchUpOccurred;
+ POINT m_touchDownPoint;
+ POINT m_touchUpPoint;
+
BOOL m_bSubclassed;
BOOL m_bPauseDestroy;
--- old/src/java.desktop/windows/native/libawt/windows/awt_MouseEvent.cpp 2017-09-21 16:24:44.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt_MouseEvent.cpp 2017-09-21 16:24:43.000000000 +0100
@@ -32,6 +32,7 @@
jfieldID AwtMouseEvent::xID;
jfieldID AwtMouseEvent::yID;
+jfieldID AwtMouseEvent::causedByTouchEventID;
jfieldID AwtMouseEvent::buttonID;
/************************************************************************
@@ -52,6 +53,11 @@
DASSERT(AwtMouseEvent::yID != NULL);
CHECK_NULL(AwtMouseEvent::yID);
+ AwtMouseEvent::causedByTouchEventID = env->GetFieldID(
+ cls, "causedByTouchEvent", "Z");
+ DASSERT(AwtMouseEvent::causedByTouchEventID != NULL);
+ CHECK_NULL(AwtMouseEvent::causedByTouchEventID);
+
AwtMouseEvent::buttonID = env->GetFieldID(cls, "button", "I");
DASSERT(AwtMouseEvent::buttonID != NULL);
CHECK_NULL(AwtMouseEvent::buttonID);
--- old/src/java.desktop/windows/native/libawt/windows/awt_MouseEvent.h 2017-09-21 16:24:45.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt_MouseEvent.h 2017-09-21 16:24:44.000000000 +0100
@@ -39,6 +39,7 @@
/* java.awt.MouseEvent field ids */
static jfieldID xID;
static jfieldID yID;
+ static jfieldID causedByTouchEventID;
static jfieldID buttonID;
};
--- old/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2017-09-21 16:24:46.000000000 +0100
+++ new/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2017-09-21 16:24:45.000000000 +0100
@@ -29,6 +29,8 @@
#include