Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.desktop/macosx/classes/sun/lwawt/LWCursorManager.java
41153 views
1
/*
2
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package sun.lwawt;
27
28
import java.awt.Component;
29
import java.awt.Container;
30
import java.awt.Cursor;
31
import java.awt.Point;
32
33
import java.util.concurrent.atomic.AtomicBoolean;
34
35
import sun.awt.AWTAccessor;
36
import sun.awt.SunToolkit;
37
38
public abstract class LWCursorManager {
39
40
/**
41
* A flag to indicate if the update is scheduled, so we don't process it
42
* twice.
43
*/
44
private final AtomicBoolean updatePending = new AtomicBoolean(false);
45
46
protected LWCursorManager() {
47
}
48
49
/**
50
* Sets the cursor to correspond the component currently under mouse.
51
*
52
* This method should not be executed on the toolkit thread as it
53
* calls to user code (e.g. Container.findComponentAt).
54
*/
55
public final void updateCursor() {
56
updatePending.set(false);
57
updateCursorImpl();
58
}
59
60
/**
61
* Schedules updating the cursor on the corresponding event dispatch
62
* thread for the given window.
63
*
64
* This method is called on the toolkit thread as a result of a
65
* native update cursor request (e.g. WM_SETCURSOR on Windows).
66
*/
67
public final void updateCursorLater(final LWWindowPeer window) {
68
if (updatePending.compareAndSet(false, true)) {
69
Runnable r = new Runnable() {
70
@Override
71
public void run() {
72
updateCursor();
73
}
74
};
75
SunToolkit.executeOnEventHandlerThread(window.getTarget(), r);
76
}
77
}
78
79
private void updateCursorImpl() {
80
final Point cursorPos = getCursorPosition();
81
final Component c = findComponent(cursorPos);
82
final Cursor cursor;
83
final Object peer = LWToolkit.targetToPeer(c);
84
if (peer instanceof LWComponentPeer) {
85
final LWComponentPeer<?, ?> lwpeer = (LWComponentPeer<?, ?>) peer;
86
final Point p = lwpeer.getLocationOnScreen();
87
cursor = lwpeer.getCursor(new Point(cursorPos.x - p.x,
88
cursorPos.y - p.y));
89
} else {
90
cursor = (c != null) ? c.getCursor() : null;
91
}
92
setCursor(cursor);
93
}
94
95
/**
96
* Returns the first visible, enabled and showing component under cursor.
97
* Returns null for modal blocked windows.
98
*
99
* @param cursorPos Current cursor position.
100
* @return Component or null.
101
*/
102
private static final Component findComponent(final Point cursorPos) {
103
final LWComponentPeer<?, ?> peer = LWWindowPeer.getPeerUnderCursor();
104
Component c = null;
105
if (peer != null && peer.getWindowPeerOrSelf().getBlocker() == null) {
106
c = peer.getTarget();
107
if (c instanceof Container) {
108
final Point p = peer.getLocationOnScreen();
109
c = AWTAccessor.getContainerAccessor().findComponentAt(
110
(Container) c, cursorPos.x - p.x, cursorPos.y - p.y, false);
111
112
}
113
while (c != null) {
114
final Object p = AWTAccessor.getComponentAccessor().getPeer(c);
115
if (c.isVisible() && c.isEnabled() && p != null) {
116
break;
117
}
118
c = c.getParent();
119
}
120
}
121
return c;
122
}
123
124
/**
125
* Returns the current cursor position.
126
*/
127
// TODO: make it public to reuse for MouseInfo
128
protected abstract Point getCursorPosition();
129
130
/**
131
* Sets a cursor. The cursor can be null if the mouse is not over a Java
132
* window.
133
* @param cursor the new {@code Cursor}.
134
*/
135
protected abstract void setCursor(Cursor cursor);
136
}
137
138