Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.desktop/macosx/classes/sun/lwawt/LWToolkit.java
41153 views
1
/*
2
* Copyright (c) 2011, 2021, 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.*;
29
import java.awt.List;
30
import java.awt.datatransfer.*;
31
import java.awt.dnd.DropTarget;
32
import java.awt.image.*;
33
import java.awt.peer.*;
34
import java.security.*;
35
import java.util.*;
36
37
import sun.awt.*;
38
import sun.print.*;
39
import sun.awt.util.ThreadGroupUtils;
40
41
import static sun.lwawt.LWWindowPeer.PeerType;
42
43
public abstract class LWToolkit extends SunToolkit implements Runnable {
44
45
private static final int STATE_NONE = 0;
46
private static final int STATE_INIT = 1;
47
private static final int STATE_MESSAGELOOP = 2;
48
private static final int STATE_SHUTDOWN = 3;
49
private static final int STATE_CLEANUP = 4;
50
private static final int STATE_DONE = 5;
51
52
private int runState = STATE_NONE;
53
54
private Clipboard clipboard;
55
private MouseInfoPeer mouseInfoPeer;
56
57
/**
58
* Dynamic Layout Resize client code setting.
59
*/
60
private volatile boolean dynamicLayoutSetting = true;
61
62
protected LWToolkit() {
63
}
64
65
/*
66
* This method is called by subclasses to start this toolkit
67
* by launching the message loop.
68
*
69
* This method waits for the toolkit to be completely initialized
70
* and returns before the message pump is started.
71
*/
72
@SuppressWarnings("removal")
73
protected final void init() {
74
AWTAutoShutdown.notifyToolkitThreadBusy();
75
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
76
Runnable shutdownRunnable = () -> {
77
shutdown();
78
waitForRunState(STATE_CLEANUP);
79
};
80
Thread shutdown = new Thread(
81
ThreadGroupUtils.getRootThreadGroup(), shutdownRunnable,
82
"AWT-Shutdown", 0, false);
83
shutdown.setContextClassLoader(null);
84
Runtime.getRuntime().addShutdownHook(shutdown);
85
String name = "AWT-LW";
86
Thread toolkitThread = new Thread(
87
ThreadGroupUtils.getRootThreadGroup(), this, name, 0, false);
88
toolkitThread.setDaemon(true);
89
toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
90
toolkitThread.start();
91
return null;
92
});
93
waitForRunState(STATE_MESSAGELOOP);
94
}
95
96
/*
97
* Implemented in subclasses to initialize platform-dependent
98
* part of the toolkit (open X display connection, create
99
* toolkit HWND, etc.)
100
*
101
* This method is called on the toolkit thread.
102
*/
103
protected abstract void platformInit();
104
105
/*
106
* Sends a request to stop the message pump.
107
*/
108
public final void shutdown() {
109
setRunState(STATE_SHUTDOWN);
110
platformShutdown();
111
}
112
113
/*
114
* Implemented in subclasses to release all the platform-
115
* dependent resources. Called after the message loop is
116
* terminated.
117
*
118
* Could be called (always called?) on a non-toolkit thread.
119
*/
120
protected abstract void platformShutdown();
121
122
/*
123
* Implemented in subclasses to release all the platform
124
* resources before the application is terminated.
125
*
126
* This method is called on the toolkit thread.
127
*/
128
protected abstract void platformCleanup();
129
130
private synchronized int getRunState() {
131
return runState;
132
}
133
134
private synchronized void setRunState(int state) {
135
runState = state;
136
notifyAll();
137
}
138
139
public final boolean isTerminating() {
140
return getRunState() >= STATE_SHUTDOWN;
141
}
142
143
private void waitForRunState(int state) {
144
while (getRunState() < state) {
145
try {
146
synchronized (this) {
147
wait();
148
}
149
} catch (InterruptedException z) {
150
// TODO: log
151
break;
152
}
153
}
154
}
155
156
@Override
157
public final void run() {
158
setRunState(STATE_INIT);
159
platformInit();
160
AWTAutoShutdown.notifyToolkitThreadFree();
161
setRunState(STATE_MESSAGELOOP);
162
while (getRunState() < STATE_SHUTDOWN) {
163
try {
164
platformRunMessage();
165
if (Thread.currentThread().isInterrupted()) {
166
if (AppContext.getAppContext().isDisposed()) {
167
break;
168
}
169
}
170
} catch (ThreadDeath td) {
171
//XXX: if there isn't native code on the stack, the VM just
172
//kills the thread right away. Do we expect to catch it
173
//nevertheless?
174
break;
175
} catch (Throwable t) {
176
// TODO: log
177
System.err.println("Exception on the toolkit thread");
178
t.printStackTrace(System.err);
179
}
180
}
181
//XXX: if that's a secondary loop, jump back to the STATE_MESSAGELOOP
182
setRunState(STATE_CLEANUP);
183
AWTAutoShutdown.notifyToolkitThreadFree();
184
platformCleanup();
185
setRunState(STATE_DONE);
186
}
187
188
/*
189
* Process the next message(s) from the native event queue.
190
*
191
* Initially, all the LWToolkit implementations were supposed
192
* to have the similar message loop sequence: check if any events
193
* available, peek events, wait. However, the later analysis shown
194
* that X11 and Windows implementations are really different, so
195
* let the subclasses do whatever they require.
196
*/
197
protected abstract void platformRunMessage();
198
199
public static LWToolkit getLWToolkit() {
200
return (LWToolkit)Toolkit.getDefaultToolkit();
201
}
202
203
// ---- TOPLEVEL PEERS ---- //
204
205
/*
206
* Note that LWWindowPeer implements WindowPeer, FramePeer
207
* and DialogPeer interfaces.
208
*/
209
protected LWWindowPeer createDelegatedPeer(Window target,
210
PlatformComponent platformComponent,
211
PlatformWindow platformWindow,
212
PeerType peerType) {
213
LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow, peerType);
214
targetCreatedPeer(target, peer);
215
peer.initialize();
216
return peer;
217
}
218
219
@Override
220
public final FramePeer createLightweightFrame(LightweightFrame target) {
221
PlatformComponent platformComponent = createLwPlatformComponent();
222
PlatformWindow platformWindow = createPlatformWindow(PeerType.LW_FRAME);
223
LWLightweightFramePeer peer = new LWLightweightFramePeer(target,
224
platformComponent,
225
platformWindow);
226
targetCreatedPeer(target, peer);
227
peer.initialize();
228
return peer;
229
}
230
231
@Override
232
public final WindowPeer createWindow(Window target) {
233
PlatformComponent platformComponent = createPlatformComponent();
234
PlatformWindow platformWindow = createPlatformWindow(PeerType.SIMPLEWINDOW);
235
return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.SIMPLEWINDOW);
236
}
237
238
@Override
239
public final FramePeer createFrame(Frame target) {
240
PlatformComponent platformComponent = createPlatformComponent();
241
PlatformWindow platformWindow = createPlatformWindow(PeerType.FRAME);
242
return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.FRAME);
243
}
244
245
@Override
246
public DialogPeer createDialog(Dialog target) {
247
PlatformComponent platformComponent = createPlatformComponent();
248
PlatformWindow platformWindow = createPlatformWindow(PeerType.DIALOG);
249
return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.DIALOG);
250
}
251
252
@Override
253
public final FileDialogPeer createFileDialog(FileDialog target) {
254
FileDialogPeer peer = createFileDialogPeer(target);
255
targetCreatedPeer(target, peer);
256
return peer;
257
}
258
259
// ---- LIGHTWEIGHT COMPONENT PEERS ---- //
260
261
@Override
262
public final ButtonPeer createButton(Button target) {
263
PlatformComponent platformComponent = createPlatformComponent();
264
LWButtonPeer peer = new LWButtonPeer(target, platformComponent);
265
targetCreatedPeer(target, peer);
266
peer.initialize();
267
return peer;
268
}
269
270
@Override
271
public final CheckboxPeer createCheckbox(Checkbox target) {
272
PlatformComponent platformComponent = createPlatformComponent();
273
LWCheckboxPeer peer = new LWCheckboxPeer(target, platformComponent);
274
targetCreatedPeer(target, peer);
275
peer.initialize();
276
return peer;
277
}
278
279
@Override
280
public final ChoicePeer createChoice(Choice target) {
281
PlatformComponent platformComponent = createPlatformComponent();
282
LWChoicePeer peer = new LWChoicePeer(target, platformComponent);
283
targetCreatedPeer(target, peer);
284
peer.initialize();
285
return peer;
286
}
287
288
@Override
289
public final LabelPeer createLabel(Label target) {
290
PlatformComponent platformComponent = createPlatformComponent();
291
LWLabelPeer peer = new LWLabelPeer(target, platformComponent);
292
targetCreatedPeer(target, peer);
293
peer.initialize();
294
return peer;
295
}
296
297
@Override
298
public final CanvasPeer createCanvas(Canvas target) {
299
PlatformComponent platformComponent = createPlatformComponent();
300
LWCanvasPeer<?, ?> peer = new LWCanvasPeer<>(target, platformComponent);
301
targetCreatedPeer(target, peer);
302
peer.initialize();
303
return peer;
304
}
305
306
@Override
307
public final ListPeer createList(List target) {
308
PlatformComponent platformComponent = createPlatformComponent();
309
LWListPeer peer = new LWListPeer(target, platformComponent);
310
targetCreatedPeer(target, peer);
311
peer.initialize();
312
return peer;
313
}
314
315
@Override
316
public final PanelPeer createPanel(Panel target) {
317
PlatformComponent platformComponent = createPlatformComponent();
318
LWPanelPeer peer = new LWPanelPeer(target, platformComponent);
319
targetCreatedPeer(target, peer);
320
peer.initialize();
321
return peer;
322
}
323
324
@Override
325
public final ScrollPanePeer createScrollPane(ScrollPane target) {
326
PlatformComponent platformComponent = createPlatformComponent();
327
LWScrollPanePeer peer = new LWScrollPanePeer(target, platformComponent);
328
targetCreatedPeer(target, peer);
329
peer.initialize();
330
return peer;
331
}
332
333
@Override
334
public final ScrollbarPeer createScrollbar(Scrollbar target) {
335
PlatformComponent platformComponent = createPlatformComponent();
336
LWScrollBarPeer peer = new LWScrollBarPeer(target, platformComponent);
337
targetCreatedPeer(target, peer);
338
peer.initialize();
339
return peer;
340
}
341
342
@Override
343
public final TextAreaPeer createTextArea(TextArea target) {
344
PlatformComponent platformComponent = createPlatformComponent();
345
LWTextAreaPeer peer = new LWTextAreaPeer(target, platformComponent);
346
targetCreatedPeer(target, peer);
347
peer.initialize();
348
return peer;
349
}
350
351
@Override
352
public final TextFieldPeer createTextField(TextField target) {
353
PlatformComponent platformComponent = createPlatformComponent();
354
LWTextFieldPeer peer = new LWTextFieldPeer(target, platformComponent);
355
targetCreatedPeer(target, peer);
356
peer.initialize();
357
return peer;
358
}
359
360
// ---- NON-COMPONENT PEERS ---- //
361
362
@Override
363
public final boolean isDesktopSupported() {
364
return true;
365
}
366
367
@Override
368
public final boolean isTaskbarSupported() {
369
return true;
370
}
371
372
@Override
373
public final KeyboardFocusManagerPeer getKeyboardFocusManagerPeer() {
374
return LWKeyboardFocusManagerPeer.getInstance();
375
}
376
377
@Override
378
public final synchronized MouseInfoPeer getMouseInfoPeer() {
379
if (mouseInfoPeer == null) {
380
mouseInfoPeer = createMouseInfoPeerImpl();
381
}
382
return mouseInfoPeer;
383
}
384
385
protected final MouseInfoPeer createMouseInfoPeerImpl() {
386
return new LWMouseInfoPeer();
387
}
388
389
protected abstract PlatformWindow getPlatformWindowUnderMouse();
390
391
@Override
392
public final PrintJob getPrintJob(Frame frame, String doctitle,
393
Properties props) {
394
return getPrintJob(frame, doctitle, null, null);
395
}
396
397
@Override
398
public final PrintJob getPrintJob(Frame frame, String doctitle,
399
JobAttributes jobAttributes,
400
PageAttributes pageAttributes) {
401
if (frame == null) {
402
throw new NullPointerException("frame must not be null");
403
}
404
405
if (GraphicsEnvironment.isHeadless()) {
406
throw new IllegalArgumentException();
407
}
408
409
PrintJob2D printJob = new PrintJob2D(frame, doctitle, jobAttributes, pageAttributes);
410
411
if (!printJob.printDialog()) {
412
printJob = null;
413
}
414
415
return printJob;
416
}
417
418
@Override
419
public final Clipboard getSystemClipboard() {
420
@SuppressWarnings("removal")
421
SecurityManager security = System.getSecurityManager();
422
if (security != null) {
423
security.checkPermission(AWTPermissions.ACCESS_CLIPBOARD_PERMISSION);
424
}
425
426
synchronized (this) {
427
if (clipboard == null) {
428
clipboard = createPlatformClipboard();
429
}
430
}
431
return clipboard;
432
}
433
434
protected abstract SecurityWarningWindow createSecurityWarning(
435
Window ownerWindow, LWWindowPeer ownerPeer);
436
437
// ---- DELEGATES ---- //
438
439
public abstract Clipboard createPlatformClipboard();
440
441
/*
442
* Creates a delegate for the given peer type (window, frame, dialog, etc.)
443
*/
444
protected abstract PlatformWindow createPlatformWindow(PeerType peerType);
445
446
protected abstract PlatformComponent createPlatformComponent();
447
448
protected abstract PlatformComponent createLwPlatformComponent();
449
450
protected abstract FileDialogPeer createFileDialogPeer(FileDialog target);
451
452
protected abstract PlatformDropTarget createDropTarget(DropTarget dropTarget,
453
Component component,
454
LWComponentPeer<?, ?> peer);
455
456
// ---- UTILITY METHODS ---- //
457
458
/*
459
* Expose non-public targetToPeer() method.
460
*/
461
public static final Object targetToPeer(Object target) {
462
return SunToolkit.targetToPeer(target);
463
}
464
465
/*
466
* Expose non-public targetDisposedPeer() method.
467
*/
468
public static final void targetDisposedPeer(Object target, Object peer) {
469
SunToolkit.targetDisposedPeer(target, peer);
470
}
471
472
/*
473
* Returns the current cursor manager.
474
*/
475
public abstract LWCursorManager getCursorManager();
476
477
public static void postEvent(AWTEvent event) {
478
postEvent(targetToAppContext(event.getSource()), event);
479
}
480
481
@Override
482
public final void grab(final Window w) {
483
final Object peer = AWTAccessor.getComponentAccessor().getPeer(w);
484
if (peer != null) {
485
((LWWindowPeer) peer).grab();
486
}
487
}
488
489
@Override
490
public final void ungrab(final Window w) {
491
final Object peer = AWTAccessor.getComponentAccessor().getPeer(w);
492
if (peer != null) {
493
((LWWindowPeer) peer).ungrab(false);
494
}
495
}
496
497
@Override
498
protected final Object lazilyLoadDesktopProperty(final String name) {
499
if (name.equals("awt.dynamicLayoutSupported")) {
500
return isDynamicLayoutSupported();
501
}
502
return super.lazilyLoadDesktopProperty(name);
503
}
504
505
@Override
506
public final void setDynamicLayout(final boolean dynamic) {
507
dynamicLayoutSetting = dynamic;
508
}
509
510
@Override
511
protected final boolean isDynamicLayoutSet() {
512
return dynamicLayoutSetting;
513
}
514
515
@Override
516
public final boolean isDynamicLayoutActive() {
517
// "Live resizing" is active by default and user's data is ignored.
518
return isDynamicLayoutSupported();
519
}
520
521
/**
522
* Returns true if dynamic layout of Containers on resize is supported by
523
* the underlying operating system and/or window manager.
524
*/
525
protected final boolean isDynamicLayoutSupported() {
526
// "Live resizing" is supported by default.
527
return true;
528
}
529
}
530
531