LWToolkit.java revision 4665
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This code is free software; you can redistribute it and/or modify it
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * under the terms of the GNU General Public License version 2 only, as
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * published by the Free Software Foundation. Oracle designates this
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * particular file as subject to the "Classpath" exception as provided
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * by Oracle in the LICENSE file that accompanied this code.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This code is distributed in the hope that it will be useful, but WITHOUT
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * version 2 for more details (a copy is included in the LICENSE file that
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * accompanied this code).
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * You should have received a copy of the GNU General Public License version
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * 2 along with this work; if not, write to the Free Software Foundation,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * or visit www.oracle.com if you need additional information or have any
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonpublic abstract class LWToolkit extends SunToolkit implements Runnable {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_MESSAGELOOP = 2;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private static Map<PlatformWindow, LWWindowPeer> delegateMap =
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called by subclasses to start this toolkit
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * by launching the message loop.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method waits for the toolkit to be completely initialized
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and returns before the message pump is started.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected final void init() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ThreadGroup mainTG = AccessController.doPrivileged(
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void run() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon Thread toolkitThread = new Thread(mainTG, this, "AWT-LW");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to initialize platform-dependent
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * part of the toolkit (open X display connection, create
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * toolkit HWND, etc.)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called on the toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformInit();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Sends a request to stop the message pump.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void shutdown() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to release all the platform-
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * dependent resources. Called after the message loop is
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * terminated.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Could be called (always called?) on a non-toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformShutdown();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to release all the platform
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * resources before the application is terminated.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called on the toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformCleanup();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private synchronized int getRunState() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private synchronized void setRunState(int state) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isTerminating() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon synchronized (this) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void run() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (AppContext.getAppContext().isDisposed()) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //XXX: if there isn't native code on the stack, the VM just
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //kills the thread right away. Do we expect to catch it
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //nevertheless?
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon System.err.println("Exception on the toolkit thread");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //XXX: if that's a secondary loop, jump back to the STATE_MESSAGELOOP
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Process the next message(s) from the native event queue.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Initially, all the LWToolkit implementations were supposed
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * to have the similar message loop sequence: check if any events
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * available, peek events, wait. However, the later analysis shown
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * that X11 and Windows implementations are really different, so
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * let the subclasses do whatever they require.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformRunMessage();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (LWToolkit)Toolkit.getDefaultToolkit();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- TOPLEVEL PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Note that LWWindowPeer implements WindowPeer, FramePeer
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and DialogPeer interfaces.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private LWWindowPeer createDelegatedPeer(Window target, PlatformComponent platformComponent,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public WindowPeer createWindow(Window target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.SIMPLEWINDOW);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.FRAME);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDEDFRAME);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon CPrinterDialogPeer peer = new CPrinterDialogPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public DialogPeer createDialog(Dialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createCPrinterDialog((CPrinterDialog)target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public FileDialogPeer createFileDialog(FileDialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon FileDialogPeer peer = createFileDialogPeer(target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- LIGHTWEIGHT COMPONENT PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ButtonPeer createButton(Button target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWButtonPeer peer = new LWButtonPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CheckboxPeer createCheckbox(Checkbox target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWCheckboxPeer peer = new LWCheckboxPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ChoicePeer createChoice(Choice target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWChoicePeer peer = new LWChoicePeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWLabelPeer peer = new LWLabelPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CanvasPeer createCanvas(Canvas target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWCanvasPeer peer = new LWCanvasPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWListPeer peer = new LWListPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public MenuBarPeer createMenuBar(MenuBar target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public MenuItemPeer createMenuItem(MenuItem target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWPanelPeer peer = new LWPanelPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PopupMenuPeer createPopupMenu(PopupMenu target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ScrollPanePeer createScrollPane(ScrollPane target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWScrollPanePeer peer = new LWScrollPanePeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ScrollbarPeer createScrollbar(Scrollbar target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWScrollBarPeer peer = new LWScrollBarPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TextAreaPeer createTextArea(TextArea target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWTextAreaPeer peer = new LWTextAreaPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TextFieldPeer createTextField(TextField target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWTextFieldPeer peer = new LWTextFieldPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- NON-COMPONENT PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ColorModel getColorModel() throws HeadlessException {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getColorModel();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isDesktopSupported() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected DesktopPeer createDesktopPeer(Desktop target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon DragSourceContextPeer dscp = CDragSourceContextPeer.createDragSourceContextPeer(dge);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return LWKeyboardFocusManagerPeer.getInstance(manager);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public synchronized MouseInfoPeer getMouseInfoPeer() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected MouseInfoPeer createMouseInfoPeerImpl() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PrintJob getPrintJob(Frame frame, String doctitle, Properties props) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return getPrintJob(frame, doctitle, null, null);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PrintJob getPrintJob(Frame frame, String doctitle, JobAttributes jobAttributes, PageAttributes pageAttributes) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PrintJob2D printJob = new PrintJob2D(frame, doctitle, jobAttributes, pageAttributes);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public RobotPeer createRobot(Robot target, GraphicsDevice screen) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isTraySupported() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public SystemTrayPeer createSystemTray(SystemTray target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TrayIconPeer createTrayIcon(TrayIcon target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon SecurityManager security = System.getSecurityManager();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon synchronized (this) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- DELEGATES ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public abstract Clipboard createPlatformClipboard();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Creates a delegate for the given peer type (window, frame, dialog, etc.)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract PlatformWindow createPlatformWindow(LWWindowPeer.PeerType peerType);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract PlatformComponent createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract FileDialogPeer createFileDialogPeer(FileDialog target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static void targetDelegate(PlatformWindow delegate, LWWindowPeer peer) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static LWWindowPeer delegateToPeer(PlatformWindow delegate) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- UTILITY METHODS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Expose non-public targetToPeer() method.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public final static Object targetToPeer(Object target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Expose non-public targetDisposedPeer() method.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public final static void targetDisposedPeer(Object target, Object peer) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Returns the current cursor manager.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public abstract LWCursorManager getCursorManager();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static void postEvent(AWTEvent event) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon postEvent(targetToAppContext(event.getSource()), event);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // use peer's back buffer to implement non-opaque windows.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean needUpdateWindow() {