jdk/src/windows/native/sun/windows/awt_Toolkit.cpp
author amenkov
Wed, 20 Oct 2010 15:08:39 +0400
changeset 7004 3f92ea1ffcac
parent 6642 9d6f6dbb16a4
child 7018 154795ed10de
permissions -rw-r--r--
6867515: Reduce impact of D3D initializion on startup time 6891435: Improve D3D preloading 6946559: AWTToolKit thread crashes in JNU_GetEnv 6987967: D3D preloading thread should initialize COM Reviewed-by: igor, art, uta
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
     2
 * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4831
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
    26
#include "awt.h"
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#include <signal.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
#include <windowsx.h>
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
    29
#include <process.h>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
    31
//#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
    32
//#include <crtdbg.h>
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
    33
//#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#define _JNI_IMPLEMENTATION_
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
    36
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
#include "awt_DrawingSurface.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
#include "awt_AWTEvent.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
#include "awt_Component.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
#include "awt_Canvas.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
#include "awt_Clipboard.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
#include "awt_Frame.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
#include "awt_Dialog.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
#include "awt_Font.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
#include "awt_Cursor.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
#include "awt_InputEvent.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
#include "awt_KeyEvent.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
#include "awt_List.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
#include "awt_Palette.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
#include "awt_PopupMenu.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
#include "awt_Toolkit.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
#include "awt_DesktopProperties.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
#include "awt_FileDialog.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
#include "CmdIDList.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
#include "awt_new.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
#include "debug_trace.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
#include "debug_mem.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
#include "ComCtl32Util.h"
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
    60
#include "DllUtil.h"
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
887
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
    62
#include "D3DPipelineManager.h"
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
    63
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
#include <awt_DnDDT.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
#include <awt_DnDDS.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
#include <java_awt_Toolkit.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
#include <java_awt_event_InputMethodEvent.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
#include <java_awt_peer_ComponentPeer.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
extern void initScreens(JNIEnv *env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
extern "C" void awt_dnd_initialize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
extern "C" void awt_dnd_uninitialize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
extern "C" void awt_clipboard_uninitialize(JNIEnv *env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
extern "C" BOOL g_bUserHasChangedInputLang;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
extern CriticalSection windowMoveLock;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
extern BOOL windowMoveLockHeld;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
// Needed by JAWT: see awt_DrawingSurface.cpp.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
extern jclass jawtVImgClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
extern jclass jawtVSMgrClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
extern jclass jawtComponentClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
extern jfieldID jawtPDataID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
extern jfieldID jawtSDataID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
extern jfieldID jawtSMgrID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
887
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
    88
extern void DWMResetCompositionEnabled();
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
    89
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
 * Utilities
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
/* Initialize the Java VM instance variable when the library is
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
   first loaded */
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
    96
JavaVM *jvm = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
JNIEXPORT jint JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
JNI_OnLoad(JavaVM *vm, void *reserved)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
    jvm = vm;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
    return JNI_VERSION_1_2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
extern "C" JNIEXPORT jboolean JNICALL AWTIsHeadless() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    static JNIEnv *env = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    static jboolean isHeadless;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
    jmethodID headlessFn;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
    jclass graphicsEnvClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    if (env == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
        env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
        graphicsEnvClass = env->FindClass(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
            "java/awt/GraphicsEnvironment");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
        if (graphicsEnvClass == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
            return JNI_TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
        headlessFn = env->GetStaticMethodID(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
            graphicsEnvClass, "isHeadless", "()Z");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
        if (headlessFn == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
            return JNI_TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
        isHeadless = env->CallStaticBooleanMethod(graphicsEnvClass,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
            headlessFn);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
    return isHeadless;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
#define IDT_AWT_MOUSECHECK 0x101
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
static LPCTSTR szAwtToolkitClassName = TEXT("SunAwtToolkit");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
6642
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
   137
static const int MOUSE_BUTTONS_WINDOWS_SUPPORTED = 5; //three standard buttons + XBUTTON1 + XBUTTON2.
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
   138
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
UINT AwtToolkit::GetMouseKeyState()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
    static BOOL mbSwapped = ::GetSystemMetrics(SM_SWAPBUTTON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
    UINT mouseKeyState = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
    if (HIBYTE(::GetKeyState(VK_CONTROL)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
        mouseKeyState |= MK_CONTROL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
    if (HIBYTE(::GetKeyState(VK_SHIFT)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
        mouseKeyState |= MK_SHIFT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
    if (HIBYTE(::GetKeyState(VK_LBUTTON)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
        mouseKeyState |= (mbSwapped ? MK_RBUTTON : MK_LBUTTON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
    if (HIBYTE(::GetKeyState(VK_RBUTTON)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
        mouseKeyState |= (mbSwapped ? MK_LBUTTON : MK_RBUTTON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
    if (HIBYTE(::GetKeyState(VK_MBUTTON)))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
        mouseKeyState |= MK_MBUTTON;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
    return mouseKeyState;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
//
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
// Normal ::GetKeyboardState call only works if current thread has
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
// a message pump, so provide a way for other threads to get
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
// the keyboard state
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
//
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
void AwtToolkit::GetKeyboardState(PBYTE keyboardState)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
    CriticalSection::Lock       l(AwtToolkit::GetInstance().m_lockKB);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
    DASSERT(!IsBadWritePtr(keyboardState, KB_STATE_SIZE));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
    memcpy(keyboardState, AwtToolkit::GetInstance().m_lastKeyboardState,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
           KB_STATE_SIZE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
void AwtToolkit::SetBusy(BOOL busy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    static jclass awtAutoShutdownClass = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
    static jmethodID notifyBusyMethodID = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
    static jmethodID notifyFreeMethodID = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
    if (awtAutoShutdownClass == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
        jclass awtAutoShutdownClassLocal = env->FindClass("sun/awt/AWTAutoShutdown");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
        if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
            env->ExceptionDescribe();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
            env->ExceptionClear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
        DASSERT(awtAutoShutdownClassLocal != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
        if (awtAutoShutdownClassLocal == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
        awtAutoShutdownClass = (jclass)env->NewGlobalRef(awtAutoShutdownClassLocal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
        env->DeleteLocalRef(awtAutoShutdownClassLocal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        notifyBusyMethodID = env->GetStaticMethodID(awtAutoShutdownClass,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
                                                    "notifyToolkitThreadBusy", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
        if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
            env->ExceptionDescribe();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
            env->ExceptionClear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
        notifyFreeMethodID = env->GetStaticMethodID(awtAutoShutdownClass,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
                                                    "notifyToolkitThreadFree", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
        if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
            env->ExceptionDescribe();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
            env->ExceptionClear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
        DASSERT(notifyBusyMethodID != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
        DASSERT(notifyFreeMethodID != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
        if (notifyBusyMethodID == NULL || notifyFreeMethodID == NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
    } /* awtAutoShutdownClass == NULL*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
    if (busy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
        env->CallStaticVoidMethod(awtAutoShutdownClass,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
                                  notifyBusyMethodID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
        env->CallStaticVoidMethod(awtAutoShutdownClass,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
                                  notifyFreeMethodID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
        env->ExceptionDescribe();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
        env->ExceptionClear();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
BOOL AwtToolkit::activateKeyboardLayout(HKL hkl) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
    // This call should succeed in case of one of the following:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
    // 1. Win 9x
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
    // 2. NT with that HKL already loaded
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
    HKL prev = ::ActivateKeyboardLayout(hkl, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
    // If the above call fails, try loading the layout in case of NT
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
   232
    if (!prev) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
        // create input locale string, e.g., "00000409", from hkl.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
        TCHAR inputLocale[9];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
        TCHAR buf[9];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
        _tcscpy(inputLocale, TEXT("00000000"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
    // 64-bit: ::LoadKeyboardLayout() is such a weird API - a string of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
    // the hex value you want?!  Here we're converting our HKL value to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
    // a string.  Hopefully there is no 64-bit trouble.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
        _i64tot(reinterpret_cast<INT_PTR>(hkl), buf, 16);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
        size_t len = _tcslen(buf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
        memcpy(&inputLocale[8-len], buf, len);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
        // load and activate the keyboard layout
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
        hkl = ::LoadKeyboardLayout(inputLocale, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
        if (hkl != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
            prev = ::ActivateKeyboardLayout(hkl, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
    return (prev != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
 * Exported functions
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
extern "C" BOOL APIENTRY DllMain(HANDLE hInstance, DWORD ul_reason_for_call,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
                                 LPVOID)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    // Don't use the TRY and CATCH_BAD_ALLOC_RET macros if we're detaching
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
    // the library. Doing so causes awt.dll to call back into the VM during
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    // shutdown. This crashes the HotSpot VM.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
    switch (ul_reason_for_call) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
    case DLL_PROCESS_ATTACH:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
        TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
        AwtToolkit::GetInstance().SetModuleHandle((HMODULE)hInstance);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
        CATCH_BAD_ALLOC_RET(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
    case DLL_PROCESS_DETACH:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
#ifdef DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
        DTrace_DisableMutex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
        DMem_DisableMutex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
#endif DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
        break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
    return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
 * AwtToolkit fields
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
AwtToolkit AwtToolkit::theInstance;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
/* ids for WToolkit fields accessed from native code */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
jmethodID AwtToolkit::windowsSettingChangeMID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
jmethodID AwtToolkit::displayChangeMID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
/* ids for Toolkit methods */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
jmethodID AwtToolkit::getDefaultToolkitMID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
jmethodID AwtToolkit::getFontMetricsMID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
jmethodID AwtToolkit::insetsMID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
 * AwtToolkit methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
AwtToolkit::AwtToolkit() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    m_localPump = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
    m_mainThreadId = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
    m_toolkitHWnd = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
    m_inputMethodHWnd = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
    m_verbose = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
    m_isActive = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    m_isDisposed = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
    m_vmSignalled = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
    m_isDynamicLayoutSet = FALSE;
1962
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
   311
    m_areExtraMouseButtonsEnabled = TRUE;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
    m_verifyComponents = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
    m_breakOnError = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
    m_breakMessageLoop = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
    m_messageLoopResult = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
    m_lastMouseOver = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
    m_mouseDown = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
    m_hGetMessageHook = 0;
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
   323
    m_hMouseLLHook = 0;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
   324
    m_lastWindowUnderMouse = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
    m_timer = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
    m_cmdIDs = new AwtCmdIDList();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
    m_pModalDialog = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
    m_peer = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
    m_dllHandle = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
    m_displayChanged = FALSE;
105
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
   333
    m_embedderProcessID = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
    // XXX: keyboard mapping should really be moved out of AwtComponent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
    AwtComponent::InitDynamicKeyMapTable();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
    // initialize kb state array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
    ::GetKeyboardState(m_lastKeyboardState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
    m_waitEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
    eventNumber = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
AwtToolkit::~AwtToolkit() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
 *  The code has been moved to AwtToolkit::Dispose() method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
HWND AwtToolkit::CreateToolkitWnd(LPCTSTR name)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
    HWND hwnd = CreateWindow(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
        szAwtToolkitClassName,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
        (LPCTSTR)name,                    /* window name */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
        WS_DISABLED,                      /* window style */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
        -1, -1,                           /* position of window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
        0, 0,                             /* width and height */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
        NULL, NULL,                       /* hWndParent and hWndMenu */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
        GetModuleHandle(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
        NULL);                            /* lpParam */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
    DASSERT(hwnd != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
    return hwnd;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   366
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   367
struct ToolkitThreadProc_Data {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   368
    bool result;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   369
    HANDLE hCompleted;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   370
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   371
    jobject thread;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   372
};
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   373
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   374
void ToolkitThreadProc(void *param)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   375
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   376
    ToolkitThreadProc_Data *data = (ToolkitThreadProc_Data *)param;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   377
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   378
    bool bNotified = false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   379
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   380
    JNIEnv *env;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   381
    JavaVMAttachArgs attachArgs;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   382
    attachArgs.version  = JNI_VERSION_1_2;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   383
    attachArgs.name     = "AWT-Windows";
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   384
    attachArgs.group    = NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   385
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   386
    jint res = jvm->AttachCurrentThreadAsDaemon((void **)&env, &attachArgs);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   387
    if (res < 0) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   388
        return;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   389
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   390
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   391
    jobject thread = env->NewGlobalRef(data->thread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   392
    if (thread != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   393
        jclass cls = env->GetObjectClass(thread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   394
        if (cls != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   395
            jmethodID runId = env->GetMethodID(cls, "run", "()V");
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   396
            if (runId != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   397
                data->result = true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   398
                ::SetEvent(data->hCompleted);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   399
                bNotified = true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   400
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   401
                env->CallVoidMethod(thread, runId);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   402
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   403
                if (env->ExceptionCheck()) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   404
                    env->ExceptionDescribe();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   405
                    env->ExceptionClear();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   406
                    // TODO: handle
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   407
                }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   408
            }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   409
            env->DeleteLocalRef(cls);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   410
        }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   411
        env->DeleteGlobalRef(thread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   412
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   413
    if (!bNotified) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   414
        ::SetEvent(data->hCompleted);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   415
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   416
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   417
    jvm->DetachCurrentThread();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   418
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   419
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   420
/*
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   421
 * Class:     sun_awt_windows_WToolkit
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   422
 * Method:    startToolkitThread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   423
 * Signature: (Ljava/lang/Runnable;)Z
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   424
 */
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   425
JNIEXPORT jboolean JNICALL
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   426
Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   427
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   428
    AwtToolkit& tk = AwtToolkit::GetInstance();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   429
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   430
    ToolkitThreadProc_Data data;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   431
    data.result = false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   432
    data.thread = env->NewGlobalRef(thread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   433
    if (data.thread == NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   434
        return JNI_FALSE;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   435
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   436
    data.hCompleted = ::CreateEvent(NULL, FALSE, FALSE, NULL);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   437
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   438
    bool result = tk.GetPreloadThread()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   439
                    .InvokeAndTerminate(ToolkitThreadProc, &data);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   440
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   441
    if (result) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   442
        ::WaitForSingleObject(data.hCompleted, INFINITE);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   443
        result = data.result;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   444
    } else {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   445
        // no awt preloading
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   446
        // return back to the usual toolkit way
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   447
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   448
    ::CloseHandle(data.hCompleted);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   449
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   450
    env->DeleteGlobalRef(data.thread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   451
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   452
    return result ? JNI_TRUE : JNI_FALSE;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   453
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   454
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
BOOL AwtToolkit::Initialize(BOOL localPump) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
    AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
    if (!tk.m_isActive || tk.m_mainThreadId != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
        /* Already initialized. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
        return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
    // This call is moved here from AwtToolkit constructor. Having it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
    // there led to the bug 6480630: there could be a situation when
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
    // ComCtl32Util was constructed but not disposed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    ComCtl32Util::GetInstance().InitLibraries();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   468
    if (!localPump) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   469
        // if preload thread was run, terminate it
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   470
        preloadThread.Terminate(true);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   471
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   472
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
    /* Register this toolkit's helper window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
    VERIFY(tk.RegisterClass() != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
    // Set up operator new/malloc out of memory handler.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
    NewHandler::init();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
        //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
        // Bugs 4032109, 4047966, and 4071991 to fix AWT
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
        //      crash in 16 color display mode.  16 color mode is supported.  Less
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
        //      than 16 color is not.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
        // creighto@eng.sun.com 1997-10-07
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
        //
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
        // Check for at least 16 colors
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
    HDC hDC = ::GetDC(NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
        if ((::GetDeviceCaps(hDC, BITSPIXEL) * ::GetDeviceCaps(hDC, PLANES)) < 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
                ::MessageBox(NULL,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
                             TEXT("Sorry, but this release of Java requires at least 16 colors"),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
                             TEXT("AWT Initialization Error"),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
                             MB_ICONHAND | MB_APPLMODAL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
                ::DeleteDC(hDC);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
                JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
                JNU_ThrowByName(env, "java/lang/InternalError",
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
                                "unsupported screen depth");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
                return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    ::ReleaseDC(NULL, hDC);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
        ///////////////////////////////////////////////////////////////////////////
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
    tk.m_localPump = localPump;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
    tk.m_mainThreadId = ::GetCurrentThreadId();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
     * Create the one-and-only toolkit window.  This window isn't
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
     * displayed, but is used to route messages to this thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
    tk.m_toolkitHWnd = tk.CreateToolkitWnd(TEXT("theAwtToolkitWindow"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
    DASSERT(tk.m_toolkitHWnd != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
     * Setup a GetMessage filter to watch all messages coming out of our
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
     * queue from PreProcessMsg().
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
    tk.m_hGetMessageHook = ::SetWindowsHookEx(WH_GETMESSAGE,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
                                              (HOOKPROC)GetMessageFilter,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
                                              0, tk.m_mainThreadId);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
    awt_dnd_initialize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
    return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
BOOL AwtToolkit::Dispose() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
    DTRACE_PRINTLN("In AwtToolkit::Dispose()");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
    AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
    if (!tk.m_isActive || tk.m_mainThreadId != ::GetCurrentThreadId()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
        return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
    tk.m_isActive = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
    awt_dnd_uninitialize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
    awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
887
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   538
    // dispose Direct3D-related resources. This should be done
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   539
    // before AwtObjectList::Cleanup() as the d3d will attempt to
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   540
    // shutdown when the last of its windows is disposed of
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
   541
    D3DInitializer::GetInstance().Clean();
887
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   542
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
    AwtObjectList::Cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
    AwtFont::Cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
    if (tk.m_inputMethodHWnd != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
        ::SendMessage(tk.m_inputMethodHWnd, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
    tk.m_inputMethodHWnd = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
    // wait for any messages to be processed, in particular,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
    // all WM_AWT_DELETEOBJECT messages that delete components; no
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
    // new messages will appear as all the windows except toolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
    // window are unsubclassed and destroyed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
    MSG msg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
    while (::GetMessage(&msg, NULL, 0, 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
        ::TranslateMessage(&msg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
        ::DispatchMessage(&msg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
    HWND toolkitHWndToDestroy = tk.m_toolkitHWnd;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
    tk.m_toolkitHWnd = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
    VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
    tk.UnregisterClass();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
    ::UnhookWindowsHookEx(tk.m_hGetMessageHook);
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
   568
    UninstallMouseLowLevelHook();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
    tk.m_mainThreadId = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
    delete tk.m_cmdIDs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
    ::CloseHandle(m_waitEvent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
    tk.m_isDisposed = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
    return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
void AwtToolkit::SetDynamicLayout(BOOL dynamic) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
    m_isDynamicLayoutSet = dynamic;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
BOOL AwtToolkit::IsDynamicLayoutSet() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
    return m_isDynamicLayoutSet;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
BOOL AwtToolkit::IsDynamicLayoutSupported() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
    // SPI_GETDRAGFULLWINDOWS is only supported on Win95 if
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
    // Windows Plus! is installed.  Otherwise, box frame resize.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
    BOOL fullWindowDragEnabled = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
    int result = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
    result = ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
                                  &fullWindowDragEnabled, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
    return (fullWindowDragEnabled && (result != 0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
BOOL AwtToolkit::IsDynamicLayoutActive() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
    return (IsDynamicLayoutSet() && IsDynamicLayoutSupported());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
ATOM AwtToolkit::RegisterClass() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
    WNDCLASS  wc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
    wc.style         = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
    wc.lpfnWndProc   = (WNDPROC)WndProc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
    wc.cbClsExtra    = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
    wc.cbWndExtra    = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
    wc.hInstance     = AwtToolkit::GetInstance().GetModuleHandle(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
    wc.hIcon         = AwtToolkit::GetInstance().GetAwtIcon();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
    wc.hCursor       = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
    wc.lpszMenuName  = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
    wc.lpszClassName = szAwtToolkitClassName;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
    ATOM ret = ::RegisterClass(&wc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
    DASSERT(ret != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
    return ret;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
void AwtToolkit::UnregisterClass() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
    VERIFY(::UnregisterClass(szAwtToolkitClassName, AwtToolkit::GetInstance().GetModuleHandle()));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
 * Structure holding the information to create a component. This packet is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
 * sent to the toolkit window.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
struct ComponentCreatePacket {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
    void* hComponent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
    void* hParent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
    void (*factory)(void*, void*);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
};
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
 * Create an AwtXxxx component using a given factory function
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
 * Implemented by sending a message to the toolkit window to invoke the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
 * factory function from that thread
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
void AwtToolkit::CreateComponent(void* component, void* parent,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
                                 ComponentFactory compFactory, BOOL isParentALocalReference)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
    /* Since Local references are not valid in another Thread, we need to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
       create a global reference before we send this to the Toolkit thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
       In some cases this method is called with parent being a native
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
       malloced struct so we cannot and do not need to create a Global
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
       Reference from it. This is indicated by isParentALocalReference */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
    jobject gcomponent = env->NewGlobalRef((jobject)component);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
    jobject gparent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
    if (isParentALocalReference) gparent = env->NewGlobalRef((jobject)parent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
    ComponentCreatePacket ccp = { gcomponent,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
                                  isParentALocalReference == TRUE ?  gparent : parent,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
                                   compFactory };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
    AwtToolkit::GetInstance().SendMessage(WM_AWT_COMPONENT_CREATE, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
                                          (LPARAM)&ccp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
    env->DeleteGlobalRef(gcomponent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
    if (isParentALocalReference) env->DeleteGlobalRef(gparent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
 * Destroy an HWND that was created in the toolkit thread. Can be used on
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
 * Components and the toolkit window itself.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
void AwtToolkit::DestroyComponentHWND(HWND hwnd)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
    if (!::IsWindow(hwnd)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
    AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
    if ((tk.m_lastMouseOver != NULL) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
        (tk.m_lastMouseOver->GetHWnd() == hwnd))
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
        tk.m_lastMouseOver = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
    ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
    tk.SendMessage(WM_AWT_DESTROY_WINDOW, (WPARAM)hwnd, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
#ifndef SPY_MESSAGES
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
#define SpyWinMessage(hwin,msg,str)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
#else
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
void SpyWinMessage(HWND hwnd, UINT message, LPCTSTR szComment);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
 * An AwtToolkit window is just a means of routing toolkit messages to here.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
                                     WPARAM wParam, LPARAM lParam)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
    JNIEnv *env = GetEnv();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
    JNILocalFrame lframe(env, 10);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
    SpyWinMessage(hWnd, message, TEXT("AwtToolkit"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
    AwtToolkit::GetInstance().eventNumber++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
     * Awt widget creation messages are routed here so that all
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
     * widgets are created on the main thread.  Java allows widgets
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
     * to live beyond their creating thread -- by creating them on
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
     * the main thread, a widget can always be properly disposed.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
    switch (message) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
      case WM_AWT_EXECUTE_SYNC: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
          jobject peerObject = (jobject)wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
          AwtObject* object = (AwtObject *)JNI_GET_PDATA(peerObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
          DASSERT( !IsBadReadPtr(object, sizeof(AwtObject)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
          AwtObject::ExecuteArgs *args = (AwtObject::ExecuteArgs *)lParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
          DASSERT(!IsBadReadPtr(args, sizeof(AwtObject::ExecuteArgs)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
          LRESULT result = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
          if (object != NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
          {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
              result = object->WinThreadExecProc(args);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
          env->DeleteGlobalRef(peerObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
          return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
      case WM_AWT_COMPONENT_CREATE: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
          ComponentCreatePacket* ccp = (ComponentCreatePacket*)lParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
          DASSERT(ccp->factory != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
          DASSERT(ccp->hComponent != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
          (*ccp->factory)(ccp->hComponent, ccp->hParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
      case WM_AWT_DESTROY_WINDOW: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
          /* Destroy widgets from this same thread that created them */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
          VERIFY(::DestroyWindow((HWND)wParam) != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
      case WM_AWT_DISPOSE: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
          BOOL canDispose = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
          CriticalSection &syncCS = AwtToolkit::GetInstance().GetSyncCS();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
          int shouldEnterCriticalSection = (int)lParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
          if (shouldEnterCriticalSection == 1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
              canDispose = syncCS.TryEnter();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
          if (canDispose) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
              AwtObject *o = (AwtObject *)wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
              o->Dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
              if (shouldEnterCriticalSection) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
                  syncCS.Leave();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
              }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
          } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
              AwtToolkit::GetInstance().PostMessage(WM_AWT_DISPOSE, wParam, lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
      case WM_AWT_DELETEOBJECT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
          AwtObject *p = (AwtObject *)wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
          if (p->CanBeDeleted()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
              // all the messages for this component are processed, so
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
              // it can be deleted
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
              delete p;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
          } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
              // postpone deletion, waiting for all the messages for this
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
              // component to be processed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
              AwtToolkit::GetInstance().PostMessage(WM_AWT_DELETEOBJECT, wParam, (LPARAM)0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
      case WM_AWT_OBJECTLISTCLEANUP: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   771
          AwtObjectList::Cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
      case WM_SYSCOLORCHANGE: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
          jclass systemColorClass = env->FindClass("java/awt/SystemColor");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
          DASSERT(systemColorClass);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
          jmethodID mid = env->GetStaticMethodID(systemColorClass, "updateSystemColors", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
          DASSERT(mid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
          env->CallStaticVoidMethod(systemColorClass, mid);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
          /* FALL THROUGH - NO BREAK */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
      case WM_SETTINGCHANGE: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
          AwtWin32GraphicsDevice::ResetAllMonitorInfo();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
          /* FALL THROUGH - NO BREAK */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
// Remove this define when we move to newer (XP) version of SDK.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
#define WM_THEMECHANGED                 0x031A
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
      case WM_THEMECHANGED: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
          /* Upcall to WToolkit when user changes configuration.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
           *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
           * NOTE: there is a bug in Windows 98 and some older versions of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
           * Windows NT (it seems to be fixed in NT4 SP5) where no
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
           * WM_SETTINGCHANGE is sent when any of the properties under
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
           * Control Panel -> Display are changed.  You must _always_ query
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
           * the system for these - you can't rely on cached values.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
           */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
          jobject peer = AwtToolkit::GetInstance().m_peer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
          if (peer != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
              env->CallVoidMethod(peer, AwtToolkit::windowsSettingChangeMID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
      }
887
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   808
#ifndef WM_DWMCOMPOSITIONCHANGED
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   809
#define WM_DWMCOMPOSITIONCHANGED        0x031E
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   810
#define WM_DWMNCRENDERINGCHANGED        0x031F
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   811
#define WM_DWMCOLORIZATIONCOLORCHANGED  0x0320
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   812
#define WM_DWMWINDOWMAXIMIZEDCHANGED    0x0321
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   813
#endif // WM_DWMCOMPOSITIONCHANGED
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   814
      case WM_DWMCOMPOSITIONCHANGED: {
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   815
          DWMResetCompositionEnabled();
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   816
          return 0;
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   817
      }
0aab8d3fa11a 6725214: D3D: forward-port the new pipeline from 6u10
tdv
parents: 105
diff changeset
   818
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
      case WM_TIMER: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
          // 6479820. Should check if a window is in manual resizing process: skip
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
          // sending any MouseExit/Enter events while inside resize-loop.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
          // Note that window being in manual moving process could still
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
          // produce redundant enter/exit mouse events. In future, they can be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
          // made skipped in a similar way.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
           if (AwtWindow::IsResizing()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
               return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
           }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
          // Create an artifical MouseExit message if the mouse left to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
          // a non-java window (bad mouse!)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
          POINT pt;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
          AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
          if (::GetCursorPos(&pt)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
              HWND hWndOver = ::WindowFromPoint(pt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
              AwtComponent * last_M;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
              if ( AwtComponent::GetComponent(hWndOver) == NULL && tk.m_lastMouseOver != NULL ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
                  last_M = tk.m_lastMouseOver;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
                  // translate point from screen to target window
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
                  MapWindowPoints(HWND_DESKTOP, last_M->GetHWnd(), &pt, 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
                  last_M->SendMessage(WM_AWT_MOUSEEXIT,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
                                      GetMouseKeyState(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
                                      POINTTOPOINTS(pt));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
                  tk.m_lastMouseOver = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
              }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
          if (tk.m_lastMouseOver == NULL && tk.m_timer != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
              VERIFY(::KillTimer(tk.m_toolkitHWnd, tk.m_timer));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
              tk.m_timer = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
      case WM_DESTROYCLIPBOARD: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
          if (!AwtClipboard::IsGettingOwnership())
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
              AwtClipboard::LostOwnership((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
      case WM_CHANGECBCHAIN: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
          AwtClipboard::WmChangeCbChain(wParam, lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
      case WM_DRAWCLIPBOARD: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
          AwtClipboard::WmDrawClipboard((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2), wParam, lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
      case WM_AWT_LIST_SETMULTISELECT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
          jobject peerObject = (jobject)wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
          AwtList* list = (AwtList *)JNI_GET_PDATA(peerObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
          DASSERT( !IsBadReadPtr(list, sizeof(AwtObject)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
          list->SetMultiSelect(static_cast<BOOL>(lParam));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
      // Special awt message to call Imm APIs.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
      // ImmXXXX() API must be used in the main thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
      // In other thread these APIs does not work correctly even if
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
      // it returs with no error. (This restriction is not documented)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
      // So we must use thse messages to call these APIs in main thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
      case WM_AWT_CREATECONTEXT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
        return reinterpret_cast<LRESULT>(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
            reinterpret_cast<void*>(ImmCreateContext()));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
      case WM_AWT_DESTROYCONTEXT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
          ImmDestroyContext((HIMC)wParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
      case WM_AWT_ASSOCIATECONTEXT: {
2952
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   886
          EnableNativeIMEStruct *data = (EnableNativeIMEStruct*)wParam;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   887
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   888
          jobject peer = data->peer;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   889
          jobject self = data->self;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   890
          jint context = data->context;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   891
          jboolean useNativeCompWindow = data->useNativeCompWindow;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   892
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   893
          AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   894
          if (comp != NULL)
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   895
          {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   896
              comp->SetInputMethod(self, useNativeCompWindow);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   897
              comp->ImmAssociateContext((HIMC)context);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   898
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   899
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   900
          if (peer != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   901
              env->DeleteGlobalRef(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   902
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   903
          if (self != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   904
              env->DeleteGlobalRef(self);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   905
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   906
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   907
          delete data;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   908
          return 0;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   909
      }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   910
      case WM_AWT_GET_DEFAULT_IME_HANDLER: {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   911
          LRESULT ret = (LRESULT)FALSE;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   912
          jobject peer = (jobject)wParam;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   913
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   914
          AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   915
          if (comp != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   916
              HWND defaultIMEHandler = ImmGetDefaultIMEWnd(comp->GetHWnd());
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   917
              if (defaultIMEHandler != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   918
                  AwtToolkit::GetInstance().SetInputMethodWindow(defaultIMEHandler);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   919
                  ret = (LRESULT)TRUE;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   920
              }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   921
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   922
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   923
          if (peer != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   924
              env->DeleteGlobalRef(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   925
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   926
          return ret;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   927
      }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   928
      case WM_AWT_HANDLE_NATIVE_IME_EVENT: {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   929
          jobject peer = (jobject)wParam;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   930
          AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   931
          MSG* msg = (MSG*)lParam;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   932
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   933
          long modifiers = comp->GetJavaModifiers();
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   934
          if ((comp != NULL) && (msg->message==WM_CHAR || msg->message==WM_SYSCHAR)) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   935
              WCHAR unicodeChar = (WCHAR)msg->wParam;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   936
              comp->SendKeyEvent(java_awt_event_KeyEvent_KEY_TYPED,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   937
                                 0, //to be fixed nowMillis(),
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   938
                                 java_awt_event_KeyEvent_CHAR_UNDEFINED,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   939
                                 unicodeChar,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   940
                                 modifiers,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   941
                                 java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   942
                                 msg);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   943
          } else if (comp != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   944
              MSG* pCopiedMsg = new MSG;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   945
              *pCopiedMsg = *msg;
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   946
              comp->SendMessage(WM_AWT_HANDLE_EVENT, (WPARAM) FALSE,
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   947
                                (LPARAM) pCopiedMsg);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   948
          }
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   949
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   950
          if (peer != NULL) {
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   951
              env->DeleteGlobalRef(peer);
0679c7600523 6829180: Removing focused component from a window causes a JVM crash for JDK7b50+ on WinXP/Vista
dcherepanov
parents: 2810
diff changeset
   952
          }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
      case WM_AWT_ENDCOMPOSITION: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
          /*right now we just cancel the composition string
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
          may need to commit it in the furture
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
          Changed to commit it according to the flag 10/29/98*/
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
          ImmNotifyIME((HIMC)wParam, NI_COMPOSITIONSTR,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
                       (lParam ? CPS_COMPLETE : CPS_CANCEL), 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
      case WM_AWT_SETCONVERSIONSTATUS: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
          DWORD cmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
          DWORD smode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
          ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
          ImmSetConversionStatus((HIMC)wParam, (DWORD)LOWORD(lParam), smode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
      case WM_AWT_GETCONVERSIONSTATUS: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
          DWORD cmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
          DWORD smode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
          ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
          return cmode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
      case WM_AWT_ACTIVATEKEYBOARDLAYOUT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
          if (wParam && g_bUserHasChangedInputLang) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
              // Input language has been changed since the last WInputMethod.getNativeLocale()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
              // call.  So let's honor the user's selection.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
              // Note: we need to check this flag inside the toolkit thread to synchronize access
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
              // to the flag.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
              return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
          if (lParam == (LPARAM)::GetKeyboardLayout(0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
              // already active
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
              return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
          // Since ActivateKeyboardLayout does not post WM_INPUTLANGCHANGEREQUEST,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
          // we explicitly need to do the same thing here.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
          static BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
          AwtToolkit::GetKeyboardState(keyboardState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
          WORD ignored;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
          ::ToAscii(VK_SPACE, ::MapVirtualKey(VK_SPACE, 0),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
                    keyboardState, &ignored, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
          return (LRESULT)activateKeyboardLayout((HKL)lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
      case WM_AWT_OPENCANDIDATEWINDOW: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
          jobject peerObject = (jobject)wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
          AwtComponent* p = (AwtComponent*)JNI_GET_PDATA(peerObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
          DASSERT( !IsBadReadPtr(p, sizeof(AwtObject)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
          // fix for 4805862: use GET_X_LPARAM and GET_Y_LPARAM macros
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
          // instead of LOWORD and HIWORD
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
          p->OpenCandidateWindow(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
          env->DeleteGlobalRef(peerObject);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
      /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
       * send this message via ::SendMessage() and the MPT will acquire the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
       * HANDLE synchronized with the sender's thread. The HANDLE must be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
       * signalled or deadlock may occur between the MPT and the caller.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
       */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
      case WM_AWT_WAIT_FOR_SINGLE_OBJECT: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
        return ::WaitForSingleObject((HANDLE)lParam, INFINITE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
      case WM_AWT_INVOKE_METHOD: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
        return (LRESULT)(*(void*(*)(void*))wParam)((void *)lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
      case WM_AWT_INVOKE_VOID_METHOD: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
        return (LRESULT)(*(void*(*)(void))wParam)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
      case WM_AWT_SETOPENSTATUS: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
          ImmSetOpenStatus((HIMC)wParam, (BOOL)lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
          return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
      case WM_AWT_GETOPENSTATUS: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
          return (DWORD)ImmGetOpenStatus((HIMC)wParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
      case WM_DISPLAYCHANGE: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
          // Reinitialize screens
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
          initScreens(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
          // Notify Java side - call WToolkit.displayChanged()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
          jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
          env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
          GetInstance().m_displayChanged = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
          ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
          break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
      case WM_AWT_SETCURSOR: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
          ::SetCursor((HCURSOR)wParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
          return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
      /* Session management */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
      case WM_QUERYENDSESSION: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
          /* Shut down cleanly */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
          if (JVM_RaiseSignal(SIGTERM)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
              AwtToolkit::GetInstance().m_vmSignalled = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
          return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
      case WM_ENDSESSION: {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
          // Keep pumping messages until the shutdown sequence halts the VM,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
          // or we exit the MessageLoop because of a WM_QUIT message
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
          AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
          // if WM_QUERYENDSESSION hasn't successfully raised SIGTERM
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
          // we ignore the ENDSESSION message
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
          if (!tk.m_vmSignalled) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
              return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
          tk.MessageLoop(AwtToolkit::PrimaryIdleFunc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
                         AwtToolkit::CommonPeekMessageFunc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
          // Dispose here instead of in eventLoop so that we don't have
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
          // to return from the WM_ENDSESSION handler.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
          tk.Dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
          // Never return. The VM will halt the process.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
          hang_if_shutdown();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
          // Should never get here.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
          DASSERT(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
          break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
      case WM_SYNC_WAIT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
          SetEvent(AwtToolkit::GetInstance().m_waitEvent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
          break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
    return DefWindowProc(hWnd, message, wParam, lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
                                              WPARAM wParam, LPARAM lParam)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
    if (code >= 0 && wParam == PM_REMOVE && lParam != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
       if (AwtToolkit::GetInstance().PreProcessMsg(*(MSG*)lParam) !=
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
               mrPassAlong) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1101
           /* PreProcessMsg() wants us to eat it */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
           ((MSG*)lParam)->message = WM_NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
       }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
    return ::CallNextHookEx(AwtToolkit::GetInstance().m_hGetMessageHook, code,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
                            wParam, lParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1111
void AwtToolkit::InstallMouseLowLevelHook()
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1112
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1113
    // We need the low-level hook since we need to process mouse move
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1114
    // messages outside of our windows.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1115
    m_hMouseLLHook = ::SetWindowsHookEx(WH_MOUSE_LL,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1116
            (HOOKPROC)MouseLowLevelHook,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1117
            GetModuleHandle(), NULL);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1118
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1119
    // Reset the old value
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1120
    m_lastWindowUnderMouse = NULL;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1121
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1122
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1123
void AwtToolkit::UninstallMouseLowLevelHook()
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1124
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1125
    if (m_hMouseLLHook != 0) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1126
        ::UnhookWindowsHookEx(m_hMouseLLHook);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1127
        m_hMouseLLHook = 0;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1128
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1129
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1130
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1131
LRESULT CALLBACK AwtToolkit::MouseLowLevelHook(int code,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1132
        WPARAM wParam, LPARAM lParam)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1133
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1134
    TRY;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1135
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1136
    if (code >= 0 && wParam == WM_MOUSEMOVE) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1137
        POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1138
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1139
        // We can't use GA_ROOTOWNER since in this case we'll go up to
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1140
        // the root Java toplevel, not the actual owned toplevel.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1141
        HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1142
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1143
        AwtToolkit& tk = AwtToolkit::GetInstance();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1144
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1145
        if (tk.m_lastWindowUnderMouse != hwnd) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1146
            AwtWindow *fw = NULL, *tw = NULL;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1147
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1148
            if (tk.m_lastWindowUnderMouse) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1149
                fw = (AwtWindow*)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1150
                    AwtComponent::GetComponent(tk.m_lastWindowUnderMouse);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1151
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1152
            if (hwnd) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1153
                tw = (AwtWindow*)AwtComponent::GetComponent(hwnd);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1154
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1155
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1156
            tk.m_lastWindowUnderMouse = hwnd;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1157
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1158
            if (fw) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1159
                fw->UpdateSecurityWarningVisibility();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1160
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1161
            // ... however, because we use GA_ROOT, we may find the warningIcon
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1162
            // which is not a Java windows.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1163
            if (AwtWindow::IsWarningWindow(hwnd)) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1164
                hwnd = ::GetParent(hwnd);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1165
                if (hwnd) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1166
                    tw = (AwtWindow*)AwtComponent::GetComponent(hwnd);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1167
                }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1168
                tk.m_lastWindowUnderMouse = hwnd;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1169
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1170
            if (tw) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1171
                tw->UpdateSecurityWarningVisibility();
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1172
            }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1173
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1174
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1175
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1176
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1177
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1178
    return ::CallNextHookEx(AwtToolkit::GetInstance().m_hMouseLLHook, code,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1179
            wParam, lParam);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1180
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1181
    CATCH_BAD_ALLOC_RET(0);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1182
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1183
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
 * The main message loop
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
const int AwtToolkit::EXIT_ENCLOSING_LOOP      = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
const int AwtToolkit::EXIT_ALL_ENCLOSING_LOOPS = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
 * Called upon event idle to ensure that we have released any
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
 * CriticalSections that we took during window event processing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
 * Note that this gets used more often than you would think; some
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
 * window moves actually happen over more than one event burst.  So,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
 * for example, we might get a WINDOWPOSCHANGING event, then we
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
 * idle and release the lock here, then eventually we get the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
 * WINDOWPOSCHANGED event.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
 * This method may be called from WToolkit.embeddedEventLoopIdleProcessing
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
 * if there is a separate event loop that must do the same CriticalSection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
 * check.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1205
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1206
 * See bug #4526587 for more information.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1207
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1208
void VerifyWindowMoveLockReleased()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1209
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1210
    if (windowMoveLockHeld) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
        windowMoveLockHeld = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
        windowMoveLock.Leave();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1213
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1214
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1215
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1216
UINT
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1217
AwtToolkit::MessageLoop(IDLEPROC lpIdleFunc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1218
                        PEEKMESSAGEPROC lpPeekMessageFunc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1219
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1220
    DTRACE_PRINTLN("AWT event loop started");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1221
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1222
    DASSERT(lpIdleFunc != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1223
    DASSERT(lpPeekMessageFunc != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1224
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1225
    m_messageLoopResult = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1226
    while (!m_breakMessageLoop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1227
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1228
        (*lpIdleFunc)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1229
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1230
        PumpWaitingMessages(lpPeekMessageFunc); /* pumps waiting messages */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1231
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1232
        // Catch problems with windowMoveLock critical section.  In case we
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1233
        // misunderstood the way windows processes window move/resize
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1234
        // events, we don't want to hold onto the windowMoveLock CS forever.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1235
        // If we've finished processing events for now, release the lock
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1236
        // if held.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1237
        VerifyWindowMoveLockReleased();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1238
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1239
    if (m_messageLoopResult == EXIT_ALL_ENCLOSING_LOOPS)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1240
        ::PostQuitMessage(EXIT_ALL_ENCLOSING_LOOPS);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1241
    m_breakMessageLoop = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1242
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1243
    DTRACE_PRINTLN("AWT event loop ended");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1244
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1245
    return m_messageLoopResult;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1246
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1247
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1248
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1249
 * Exit the enclosing message loop(s).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1250
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1251
 * The message will be ignored if Windows is currently is in an internal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1252
 * message loop (such as a scroll bar drag). So we first send IDCANCEL and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1253
 * WM_CANCELMODE messages to every Window on the thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1254
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1255
static BOOL CALLBACK CancelAllThreadWindows(HWND hWnd, LPARAM)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1256
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1257
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1258
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1259
    ::SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)hWnd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1260
    ::SendMessage(hWnd, WM_CANCELMODE, 0, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1261
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1262
    return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1263
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1264
    CATCH_BAD_ALLOC_RET(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1265
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1266
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1267
static void DoQuitMessageLoop(void* param) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1268
    int status = *static_cast<int*>(param);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1269
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1270
    AwtToolkit::GetInstance().QuitMessageLoop(status);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1271
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1272
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1273
void AwtToolkit::QuitMessageLoop(int status) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1274
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1275
     * Fix for 4623377.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1276
     * Reinvoke QuitMessageLoop on the toolkit thread, so that
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1277
     * m_breakMessageLoop is accessed on a single thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1278
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1279
    if (!AwtToolkit::IsMainThread()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1280
        InvokeFunction(DoQuitMessageLoop, &status);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1281
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1282
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1283
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1284
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1285
     * Fix for BugTraq ID 4445747.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1286
     * EnumThreadWindows() is very slow during dnd on Win9X/ME.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1287
     * This call is unnecessary during dnd, since we postpone processing of all
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1288
     * messages that can enter internal message loop until dnd is over.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1289
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1290
      if (status == EXIT_ALL_ENCLOSING_LOOPS) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1291
          ::EnumThreadWindows(MainThread(), (WNDENUMPROC)CancelAllThreadWindows,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1292
                              0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1293
      }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1294
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1295
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1296
     * Fix for 4623377.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1297
     * Modal loop may not exit immediatelly after WM_CANCELMODE, so it still can
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1298
     * eat WM_QUIT message and the nested message loop will never exit.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1299
     * The fix is to use AwtToolkit instance variables instead of WM_QUIT to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1300
     * guarantee that we exit from the nested message loop when any possible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1301
     * modal loop quits. In this case CancelAllThreadWindows is needed only to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1302
     * ensure that the nested message loop exits quickly and doesn't wait until
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1303
     * a possible modal loop completes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1304
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1305
    m_breakMessageLoop = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1306
    m_messageLoopResult = status;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1307
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1308
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1309
     * Fix for 4683602.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1310
     * Post an empty message, to wake up the toolkit thread
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1311
     * if it is currently in WaitMessage(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1312
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1313
    PostMessage(WM_NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1314
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1315
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1316
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1317
 * Called by the message loop to pump the message queue when there are
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1318
 * messages waiting. Can also be called anywhere to pump messages.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1319
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1320
BOOL AwtToolkit::PumpWaitingMessages(PEEKMESSAGEPROC lpPeekMessageFunc)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1321
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1322
    MSG  msg;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1323
    BOOL foundOne = FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1324
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1325
    DASSERT(lpPeekMessageFunc != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1326
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1327
    while (!m_breakMessageLoop && (*lpPeekMessageFunc)(msg)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1328
        foundOne = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1329
        if (msg.message == WM_QUIT) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1330
            m_breakMessageLoop = TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1331
            m_messageLoopResult = static_cast<UINT>(msg.wParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1332
            if (m_messageLoopResult == EXIT_ALL_ENCLOSING_LOOPS)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1333
                ::PostQuitMessage(static_cast<int>(msg.wParam));  // make sure all loops exit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1334
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1335
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1336
        else if (msg.message != WM_NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1337
            /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1338
             * The AWT in standalone mode (that is, dynamically loaded from the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1339
             * Java VM) doesn't have any translation tables to worry about, so
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1340
             * TranslateAccelerator isn't called.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1341
             */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1342
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1343
            ::TranslateMessage(&msg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1344
            ::DispatchMessage(&msg);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1345
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1346
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1347
    return foundOne;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1348
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1349
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1350
VOID CALLBACK
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1351
AwtToolkit::PrimaryIdleFunc() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1352
    AwtToolkit::SetBusy(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1353
    ::WaitMessage();               /* allow system to go idle */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1354
    AwtToolkit::SetBusy(TRUE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1355
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1356
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1357
VOID CALLBACK
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1358
AwtToolkit::SecondaryIdleFunc() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1359
    ::WaitMessage();               /* allow system to go idle */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1360
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1361
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1362
BOOL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1363
AwtToolkit::CommonPeekMessageFunc(MSG& msg) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1364
    return ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1365
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1366
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1367
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1368
 * Perform pre-processing on a message before it is translated &
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1369
 * dispatched.  Returns true to eat the message
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1370
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1371
BOOL AwtToolkit::PreProcessMsg(MSG& msg)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1372
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1373
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1374
     * Offer preprocessing first to the target component, then call out to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1375
     * specific mouse and key preprocessor methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1376
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1377
    AwtComponent* p = AwtComponent::GetComponent(msg.hwnd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1378
    if (p && p->PreProcessMsg(msg) == mrConsume)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1379
        return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1380
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  1381
    if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1382
        (msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1383
        if (PreProcessMouseMsg(p, msg)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1384
            return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1385
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1386
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1387
    else if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1388
        if (PreProcessKeyMsg(p, msg))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1389
            return TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1390
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1391
    return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1392
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1393
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1394
BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1395
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1396
    WPARAM mouseWParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1397
    LPARAM mouseLParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1398
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1399
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1400
     * Fix for BugTraq ID 4395290.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1401
     * Do not synthesize mouse enter/exit events during drag-and-drop,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1402
     * since it messes up LightweightDispatcher.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1403
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1404
    if (AwtDropTarget::IsLocalDnD()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1405
        return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1406
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1407
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  1408
    if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1409
        mouseWParam = msg.wParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1410
        mouseLParam = msg.lParam;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1411
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1412
        mouseWParam = GetMouseKeyState();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1413
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1414
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1415
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1416
     * Get the window under the mouse, as it will be different if its
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1417
     * captured.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1418
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1419
    DWORD dwCurPos = ::GetMessagePos();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1420
    DWORD dwScreenPos = dwCurPos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1421
    POINT curPos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1422
    // fix for 4805862
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1423
    // According to MSDN: do not use LOWORD and HIWORD macros to extract x and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1424
    // y coordinates because these macros return incorrect results on systems
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1425
    // with multiple monitors (signed values are treated as unsigned)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1426
    curPos.x = GET_X_LPARAM(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1427
    curPos.y = GET_Y_LPARAM(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1428
    HWND hWndFromPoint = ::WindowFromPoint(curPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1429
    // hWndFromPoint == 0 if mouse is over a scrollbar
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1430
    AwtComponent* mouseComp =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1431
        AwtComponent::GetComponent(hWndFromPoint);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1432
    // Need extra copies for non-client area issues
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1433
    AwtComponent* mouseWheelComp = mouseComp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1434
    HWND hWndForWheel = hWndFromPoint;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1435
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1436
    // If the point under the mouse isn't in the client area,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1437
    // ignore it to maintain compatibility with Solaris (#4095172)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1438
    RECT windowRect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1439
    ::GetClientRect(hWndFromPoint, &windowRect);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1440
    POINT topLeft;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1441
    topLeft.x = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1442
    topLeft.y = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1443
    ::ClientToScreen(hWndFromPoint, &topLeft);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1444
    windowRect.top += topLeft.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1445
    windowRect.bottom += topLeft.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1446
    windowRect.left += topLeft.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1447
    windowRect.right += topLeft.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1448
    if ((curPos.y < windowRect.top) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1449
        (curPos.y >= windowRect.bottom) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1450
        (curPos.x < windowRect.left) ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1451
        (curPos.x >= windowRect.right)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1452
        mouseComp = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1453
        hWndFromPoint = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1454
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1455
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1456
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1457
     * Look for mouse transitions between windows & create
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1458
     * MouseExit & MouseEnter messages
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1459
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1460
    // 6479820. Should check if a window is in manual resizing process: skip
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1461
    // sending any MouseExit/Enter events while inside resize-loop.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1462
    // Note that window being in manual moving process could still
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1463
    // produce redundant enter/exit mouse events. In future, they can be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1464
    // made skipped in a similar way.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1465
    if (mouseComp != m_lastMouseOver && !AwtWindow::IsResizing()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1466
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1467
         * Send the messages right to the windows so that they are in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1468
         * the right sequence.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1469
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1470
        if (m_lastMouseOver) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1471
            dwCurPos = dwScreenPos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1472
            curPos.x = LOWORD(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1473
            curPos.y = HIWORD(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1474
            ::MapWindowPoints(HWND_DESKTOP, m_lastMouseOver->GetHWnd(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1475
                              &curPos, 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1476
            mouseLParam = MAKELPARAM((WORD)curPos.x, (WORD)curPos.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1477
            m_lastMouseOver->SendMessage(WM_AWT_MOUSEEXIT, mouseWParam,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1478
                                         mouseLParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1479
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1480
        if (mouseComp) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1481
                dwCurPos = dwScreenPos;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1482
                curPos.x = LOWORD(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1483
                curPos.y = HIWORD(dwCurPos);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1484
                ::MapWindowPoints(HWND_DESKTOP, mouseComp->GetHWnd(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1485
                                  &curPos, 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1486
                mouseLParam = MAKELPARAM((WORD)curPos.x, (WORD)curPos.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1487
            mouseComp->SendMessage(WM_AWT_MOUSEENTER, mouseWParam,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1488
                                   mouseLParam);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1489
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1490
        m_lastMouseOver = mouseComp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1491
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1492
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1493
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1494
     * For MouseWheelEvents, hwnd must be changed to be the Component under
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1495
     * the mouse, not the Component with the input focus.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1496
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1497
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1498
    if (msg.message == WM_MOUSEWHEEL &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1499
        mouseWheelComp != NULL) { //i.e. mouse is over client area for this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1500
                                  //window
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1501
        msg.hwnd = hWndForWheel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1502
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1503
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1504
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1505
     * Make sure we get at least one last chance to check for transitions
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1506
     * before we sleep
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1507
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1508
    if (m_lastMouseOver && !m_timer) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1509
        m_timer = ::SetTimer(m_toolkitHWnd, IDT_AWT_MOUSECHECK, 200, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1510
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1511
    return FALSE;  /* Now go ahead and process current message as usual */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1512
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1513
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1514
BOOL AwtToolkit::PreProcessKeyMsg(AwtComponent* p, MSG& msg)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1515
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1516
    // get keyboard state for use in AwtToolkit::GetKeyboardState
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1517
    CriticalSection::Lock       l(m_lockKB);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1518
    ::GetKeyboardState(m_lastKeyboardState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1519
    return FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1520
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1521
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1522
void *AwtToolkit::SyncCall(void *(*ftn)(void *), void *param) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1523
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1524
    if (!IsMainThread()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1525
        CriticalSection::Lock l(GetSyncCS());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1526
        return (*ftn)(param);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1527
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1528
        return (*ftn)(param);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1529
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1530
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1531
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1532
void AwtToolkit::SyncCall(void (*ftn)(void *), void *param) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1533
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1534
    if (!IsMainThread()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1535
        CriticalSection::Lock l(GetSyncCS());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1536
        (*ftn)(param);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1537
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1538
        (*ftn)(param);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1539
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1540
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1541
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1542
void *AwtToolkit::SyncCall(void *(*ftn)(void)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1543
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1544
    if (!IsMainThread()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1545
        CriticalSection::Lock l(GetSyncCS());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1546
        return (*ftn)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1547
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1548
        return (*ftn)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1549
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1550
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1551
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1552
void AwtToolkit::SyncCall(void (*ftn)(void)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1553
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1554
    if (!IsMainThread()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1555
        CriticalSection::Lock l(GetSyncCS());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1556
        (*ftn)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1557
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1558
        (*ftn)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1559
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1560
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1561
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1562
UINT AwtToolkit::CreateCmdID(AwtObject* object)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1563
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1564
    return m_cmdIDs->Add(object);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1565
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1566
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1567
void AwtToolkit::RemoveCmdID(UINT id)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1568
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1569
    m_cmdIDs->Remove(id);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1570
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1571
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1572
AwtObject* AwtToolkit::LookupCmdID(UINT id)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1573
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1574
    return m_cmdIDs->Lookup(id);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1575
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1576
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1577
HICON AwtToolkit::GetAwtIcon()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1578
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1579
    return ::LoadIcon(GetModuleHandle(), TEXT("AWT_ICON"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1580
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1581
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1582
HICON AwtToolkit::GetAwtIconSm()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1583
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1584
    static HICON defaultIconSm = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1585
    static int prevSmx = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1586
    static int prevSmy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1587
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1588
    int smx = GetSystemMetrics(SM_CXSMICON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1589
    int smy = GetSystemMetrics(SM_CYSMICON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1590
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1591
    // Fixed 6364216: LoadImage() may leak memory
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1592
    if (defaultIconSm == NULL || smx != prevSmx || smy != prevSmy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1593
        defaultIconSm = (HICON)LoadImage(GetModuleHandle(), TEXT("AWT_ICON"), IMAGE_ICON, smx, smy, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1594
        prevSmx = smx;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1595
        prevSmy = smy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1596
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1597
    return defaultIconSm;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1598
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1599
4367
e60cfd711532 6901021: Security Warning Icon not getting displayed properly when frame loses focus
anthony
parents: 3498
diff changeset
  1600
// The icon at index 0 must be gray. See AwtWindow::GetSecurityWarningIcon()
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1601
HICON AwtToolkit::GetSecurityWarningIcon(UINT index, UINT w, UINT h)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1602
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1603
    //Note: should not exceed 10 because of the current implementation.
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1604
    static const int securityWarningIconCounter = 3;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1605
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1606
    static HICON securityWarningIcon[securityWarningIconCounter]      = {NULL, NULL, NULL};;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1607
    static UINT securityWarningIconWidth[securityWarningIconCounter]  = {0, 0, 0};
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1608
    static UINT securityWarningIconHeight[securityWarningIconCounter] = {0, 0, 0};
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1609
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1610
    index = AwtToolkit::CalculateWave(index, securityWarningIconCounter);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1611
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1612
    if (securityWarningIcon[index] == NULL ||
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1613
            w != securityWarningIconWidth[index] ||
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1614
            h != securityWarningIconHeight[index])
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1615
    {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1616
        if (securityWarningIcon[index] != NULL)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1617
        {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1618
            ::DestroyIcon(securityWarningIcon[index]);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1619
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1620
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1621
        static const wchar_t securityWarningIconName[] = L"SECURITY_WARNING_";
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1622
        wchar_t iconResourceName[sizeof(securityWarningIconName) + 2];
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1623
        ::ZeroMemory(iconResourceName, sizeof(iconResourceName));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1624
        wcscpy(iconResourceName, securityWarningIconName);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1625
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1626
        wchar_t strIndex[2];
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1627
        ::ZeroMemory(strIndex, sizeof(strIndex));
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1628
        strIndex[0] = L'0' + index;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1629
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1630
        wcscat(iconResourceName, strIndex);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1631
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1632
        securityWarningIcon[index] = (HICON)::LoadImage(GetModuleHandle(),
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1633
                iconResourceName,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1634
                IMAGE_ICON, w, h, LR_DEFAULTCOLOR);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1635
        securityWarningIconWidth[index] = w;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1636
        securityWarningIconHeight[index] = h;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1637
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1638
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1639
    return securityWarningIcon[index];
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1640
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1641
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1642
void AwtToolkit::SetHeapCheck(long flag) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1643
    if (flag) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1644
        printf("heap checking not supported with this build\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1645
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1646
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1647
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1648
void throw_if_shutdown(void) throw (awt_toolkit_shutdown)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1649
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1650
    AwtToolkit::GetInstance().VerifyActive();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1651
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1652
void hang_if_shutdown(void)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1653
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1654
    try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1655
        AwtToolkit::GetInstance().VerifyActive();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1656
    } catch (awt_toolkit_shutdown&) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1657
        // Never return. The VM will halt the process.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1658
        ::WaitForSingleObject(::CreateEvent(NULL, TRUE, FALSE, NULL),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1659
                              INFINITE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1660
        // Should never get here.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1661
        DASSERT(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1662
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1663
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1664
105
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1665
// for now we support only one embedder, but should be ready for future
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1666
void AwtToolkit::RegisterEmbedderProcessId(HWND embedder)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1667
{
105
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1668
    if (m_embedderProcessID) {
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1669
        // we already set embedder process and do not expect
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1670
        // two different processes to embed the same AwtToolkit
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1671
        return;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1672
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1673
105
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1674
    embedder = ::GetAncestor(embedder, GA_ROOT);
e08ac2105adc 6595651: Focus transfers broken for applications embedding AWT across processes
son
parents: 2
diff changeset
  1675
    ::GetWindowThreadProcessId(embedder, &m_embedderProcessID);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1676
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1677
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1678
JNIEnv* AwtToolkit::m_env;
3498
dbd1b49d341b 6851688: Hung up in applet application
uta
parents: 2952
diff changeset
  1679
DWORD AwtToolkit::m_threadId;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1680
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1681
void AwtToolkit::SetEnv(JNIEnv *env) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1682
    if (m_env != NULL) { // If already cashed (by means of embeddedInit() call).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1683
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1684
    }
3498
dbd1b49d341b 6851688: Hung up in applet application
uta
parents: 2952
diff changeset
  1685
    m_threadId = GetCurrentThreadId();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1686
    m_env = env;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1687
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1688
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1689
JNIEnv* AwtToolkit::GetEnv() {
3498
dbd1b49d341b 6851688: Hung up in applet application
uta
parents: 2952
diff changeset
  1690
    return (m_env == NULL || m_threadId != GetCurrentThreadId()) ?
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1691
        (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2) : m_env;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1692
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1693
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1694
BOOL AwtToolkit::GetScreenInsets(int screenNum, RECT * rect)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1695
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1696
    /* if primary display */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1697
    if (screenNum == 0) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1698
        RECT rRW;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1699
        if (::SystemParametersInfo(SPI_GETWORKAREA,0,(void *) &rRW,0) == TRUE) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1700
            rect->top = rRW.top;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1701
            rect->left = rRW.left;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1702
            rect->bottom = ::GetSystemMetrics(SM_CYSCREEN) - rRW.bottom;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1703
            rect->right = ::GetSystemMetrics(SM_CXSCREEN) - rRW.right;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1704
            return TRUE;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1705
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1706
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1707
    /* if additional display */
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1708
    else {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1709
        MONITORINFO *miInfo;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1710
        miInfo = AwtWin32GraphicsDevice::GetMonitorInfo(screenNum);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1711
        if (miInfo) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1712
            rect->top = miInfo->rcWork.top    - miInfo->rcMonitor.top;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1713
            rect->left = miInfo->rcWork.left   - miInfo->rcMonitor.left;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1714
            rect->bottom = miInfo->rcMonitor.bottom - miInfo->rcWork.bottom;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1715
            rect->right = miInfo->rcMonitor.right - miInfo->rcWork.right;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1716
            return TRUE;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1717
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1718
    }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1719
    return FALSE;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1720
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1721
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1722
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1723
void AwtToolkit::GetWindowRect(HWND hWnd, LPRECT lpRect)
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1724
{
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1725
    try {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1726
        if (S_OK == DwmAPI::DwmGetWindowAttribute(hWnd,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1727
                DwmAPI::DWMWA_EXTENDED_FRAME_BOUNDS,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1728
                lpRect, sizeof(*lpRect)))
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1729
        {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1730
            return;
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1731
        }
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1732
    } catch (const DllUtil::Exception &) {}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1733
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1734
    ::GetWindowRect(hWnd, lpRect);
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1735
}
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  1736
7004
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1737
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1738
/************************************************************************
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1739
 * AWT preloading support
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1740
 */
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1741
bool AwtToolkit::PreloadAction::EnsureInited()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1742
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1743
    DWORD _initThreadId = GetInitThreadID();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1744
    if (_initThreadId != 0) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1745
        // already inited
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1746
        // ensure the action is inited on correct thread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1747
        PreloadThread &preloadThread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1748
            = AwtToolkit::GetInstance().GetPreloadThread();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1749
        if (_initThreadId == preloadThread.GetThreadId()) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1750
            if (!preloadThread.IsWrongThread()) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1751
                return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1752
            }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1753
            // inited on preloadThread (wrongThread), not cleaned yet
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1754
            // have to wait cleanup completion
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1755
            preloadThread.Wait4Finish();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1756
        } else {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1757
            // inited on other thread (Toolkit thread?)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1758
            // consider as correctly inited
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1759
            return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1760
        }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1761
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1762
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1763
    // init on Toolkit thread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1764
    AwtToolkit::GetInstance().InvokeFunction(InitWrapper, this);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1765
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1766
    return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1767
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1768
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1769
DWORD AwtToolkit::PreloadAction::GetInitThreadID()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1770
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1771
    CriticalSection::Lock lock(initLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1772
    return initThreadId;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1773
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1774
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1775
bool AwtToolkit::PreloadAction::Clean()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1776
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1777
    DWORD _initThreadId = GetInitThreadID();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1778
    if (_initThreadId == ::GetCurrentThreadId()) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1779
        // inited on this thread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1780
        Clean(false);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1781
        return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1782
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1783
    return false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1784
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1785
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1786
/*static*/
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1787
void AwtToolkit::PreloadAction::InitWrapper(void *param)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1788
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1789
    PreloadAction *pThis = (PreloadAction *)param;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1790
    pThis->Init();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1791
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1792
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1793
void AwtToolkit::PreloadAction::Init()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1794
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1795
    CriticalSection::Lock lock(initLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1796
    if (initThreadId == 0) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1797
        initThreadId = ::GetCurrentThreadId();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1798
        InitImpl();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1799
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1800
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1801
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1802
void AwtToolkit::PreloadAction::Clean(bool reInit) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1803
    CriticalSection::Lock lock(initLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1804
    if (initThreadId != 0) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1805
        //ASSERT(initThreadId == ::GetCurrentThreadId());
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1806
        CleanImpl(reInit);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1807
        initThreadId = 0;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1808
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1809
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1810
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1811
// PreloadThread implementation
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1812
AwtToolkit::PreloadThread::PreloadThread()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1813
    : status(None), wrongThread(false), threadId(0),
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1814
    pActionChain(NULL), pLastProcessedAction(NULL),
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1815
    execFunc(NULL), execParam(NULL)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1816
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1817
    hFinished = ::CreateEvent(NULL, TRUE, FALSE, NULL);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1818
    hAwake = ::CreateEvent(NULL, FALSE, FALSE, NULL);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1819
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1820
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1821
AwtToolkit::PreloadThread::~PreloadThread()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1822
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1823
    //Terminate(false);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1824
    ::CloseHandle(hFinished);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1825
    ::CloseHandle(hAwake);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1826
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1827
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1828
bool AwtToolkit::PreloadThread::AddAction(AwtToolkit::PreloadAction *pAction)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1829
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1830
    CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1831
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1832
    if (status > Preloading) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1833
        // too late - the thread already terminated or run as toolkit thread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1834
        return false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1835
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1836
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1837
    if (pActionChain == NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1838
        // 1st action
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1839
        pActionChain = pAction;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1840
    } else {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1841
        // add the action to the chain
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1842
        PreloadAction *pChain = pActionChain;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1843
        while (true) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1844
            PreloadAction *pNext = pChain->GetNext();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1845
            if (pNext == NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1846
                break;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1847
            }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1848
            pChain = pNext;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1849
        }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1850
        pChain->SetNext(pAction);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1851
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1852
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1853
    if (status > None) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1854
        // the thread is already running (status == Preloading)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1855
        AwakeThread();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1856
        return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1857
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1858
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1859
    // need to start thread
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1860
    ::ResetEvent(hAwake);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1861
    ::ResetEvent(hFinished);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1862
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1863
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0x100000, StaticThreadProc,
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1864
                                            this, 0, &threadId);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1865
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1866
    if (hThread == 0) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1867
        threadId = 0;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1868
        return false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1869
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1870
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1871
    status = Preloading;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1872
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1873
    ::CloseHandle(hThread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1874
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1875
    return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1876
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1877
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1878
bool AwtToolkit::PreloadThread::Terminate(bool wrongThread)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1879
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1880
    CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1881
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1882
    if (status != Preloading) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1883
        return false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1884
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1885
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1886
    execFunc = NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1887
    execParam = NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1888
    this->wrongThread = wrongThread;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1889
    status = Cleaning;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1890
    AwakeThread();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1891
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1892
    return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1893
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1894
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1895
bool AwtToolkit::PreloadThread::InvokeAndTerminate(void(_cdecl *fn)(void *), void *param)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1896
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1897
    CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1898
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1899
    if (status != Preloading) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1900
        return false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1901
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1902
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1903
    execFunc = fn;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1904
    execParam = param;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1905
    status = fn == NULL ? Cleaning : RunningToolkit;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1906
    AwakeThread();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1907
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1908
    return true;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1909
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1910
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1911
/*static*/
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1912
unsigned WINAPI AwtToolkit::PreloadThread::StaticThreadProc(void *param)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1913
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1914
    AwtToolkit::PreloadThread *pThis = (AwtToolkit::PreloadThread *)param;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1915
    return pThis->ThreadProc();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1916
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1917
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1918
unsigned AwtToolkit::PreloadThread::ThreadProc()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1919
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1920
    void(_cdecl *_execFunc)(void *) = NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1921
    void *_execParam = NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1922
    bool _wrongThread = false;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1923
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1924
    // initialization
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1925
    while (true) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1926
        PreloadAction *pAction;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1927
        {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1928
            CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1929
            if (status != Preloading) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1930
                // get invoke parameters
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1931
                _execFunc = execFunc;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1932
                _execParam = execParam;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1933
                _wrongThread = wrongThread;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1934
                break;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1935
            }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1936
            pAction = GetNextAction();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1937
        }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1938
        if (pAction != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1939
            pAction->Init();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1940
        } else {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1941
            ::WaitForSingleObject(hAwake, INFINITE);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1942
        }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1943
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1944
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1945
    // call a function from InvokeAndTerminate
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1946
    if (_execFunc != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1947
        _execFunc(_execParam);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1948
    } else {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1949
        // time to terminate..
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1950
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1951
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1952
    // cleanup
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1953
    {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1954
        CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1955
        pLastProcessedAction = NULL; // goto 1st action in the chain
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1956
        status = Cleaning;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1957
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1958
    for (PreloadAction *pAction = GetNextAction(); pAction != NULL;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1959
            pAction = GetNextAction()) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1960
        pAction->Clean(_wrongThread);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1961
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1962
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1963
    // don't clear threadId! it is used by PreloadAction::EnsureInited
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1964
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1965
    {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1966
        CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1967
        status = Finished;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1968
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1969
    ::SetEvent(hFinished);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1970
    return 0;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1971
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1972
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1973
AwtToolkit::PreloadAction* AwtToolkit::PreloadThread::GetNextAction()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1974
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1975
    CriticalSection::Lock lock(threadLock);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1976
    PreloadAction *pAction = (pLastProcessedAction == NULL)
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1977
                                    ? pActionChain
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1978
                                    : pLastProcessedAction->GetNext();
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1979
    if (pAction != NULL) {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1980
        pLastProcessedAction = pAction;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1981
    }
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1982
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1983
    return pAction;
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1984
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1985
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1986
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1987
extern "C" {
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1988
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1989
/* Terminates preload thread (if it's still alive
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1990
 * - it may occur if the application doesn't use AWT).
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1991
 * The function is called from launcher after completion main java thread.
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1992
 */
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1993
__declspec(dllexport) void preloadStop()
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1994
{
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1995
    AwtToolkit::GetInstance().GetPreloadThread().Terminate(false);
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1996
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1997
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1998
}
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  1999
3f92ea1ffcac 6867515: Reduce impact of D3D initializion on startup time
amenkov
parents: 6642
diff changeset
  2000
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2001
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2002
 * Toolkit native methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2003
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2004
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2005
extern "C" {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2006
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2007
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2008
 * Class:     java_awt_Toolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2009
 * Method:    initIDs
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2010
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2011
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2012
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2013
Java_java_awt_Toolkit_initIDs(JNIEnv *env, jclass cls) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2014
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2015
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2016
    AwtToolkit::getDefaultToolkitMID =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2017
        env->GetStaticMethodID(cls,"getDefaultToolkit","()Ljava/awt/Toolkit;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2018
    AwtToolkit::getFontMetricsMID =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2019
        env->GetMethodID(cls, "getFontMetrics",
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2020
                         "(Ljava/awt/Font;)Ljava/awt/FontMetrics;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2021
        AwtToolkit::insetsMID =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2022
                env->GetMethodID(env->FindClass("java/awt/Insets"), "<init>", "(IIII)V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2023
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2024
    DASSERT(AwtToolkit::getDefaultToolkitMID != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2025
    DASSERT(AwtToolkit::getFontMetricsMID != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2026
        DASSERT(AwtToolkit::insetsMID != NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2027
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2028
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2029
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2030
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2031
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2032
} /* extern "C" */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2033
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2034
/************************************************************************
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2035
 * WToolkit native methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2036
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2037
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2038
extern "C" {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2039
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2040
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2041
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2042
 * Method:    initIDs
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2043
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2044
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2045
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2046
Java_sun_awt_windows_WToolkit_initIDs(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2047
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2048
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2049
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2050
    AwtToolkit::windowsSettingChangeMID =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2051
        env->GetMethodID(cls, "windowsSettingChange", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2052
    DASSERT(AwtToolkit::windowsSettingChangeMID != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2053
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2054
    AwtToolkit::displayChangeMID =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2055
    env->GetStaticMethodID(cls, "displayChanged", "()V");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2056
    DASSERT(AwtToolkit::displayChangeMID != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2057
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2058
    // Set various global IDs needed by JAWT code.  Note: these
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2059
    // variables cannot be set by JAWT code directly due to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2060
    // different permissions that that code may be run under
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2061
    // (bug 4796548).  It would be nice to initialize these
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2062
    // variables lazily, but given the minimal number of calls
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2063
    // for this, it seems simpler to just do it at startup with
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2064
    // negligible penalty.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2065
    jclass sDataClassLocal = env->FindClass("sun/java2d/SurfaceData");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2066
    DASSERT(sDataClassLocal != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2067
    jclass vImgClassLocal = env->FindClass("sun/awt/image/SunVolatileImage");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2068
    DASSERT(vImgClassLocal != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2069
    jclass vSMgrClassLocal =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2070
        env->FindClass("sun/awt/image/VolatileSurfaceManager");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2071
    DASSERT(vSMgrClassLocal != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2072
    jclass componentClassLocal = env->FindClass("java/awt/Component");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2073
    DASSERT(componentClassLocal != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2074
    jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager",
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2075
                                 "Lsun/awt/image/VolatileSurfaceManager;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2076
    DASSERT(jawtSMgrID != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2077
    jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent",
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2078
                                  "Lsun/java2d/SurfaceData;");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2079
    DASSERT(jawtSDataID != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2080
    jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2081
    DASSERT(jawtPDataID != 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2082
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2083
    // Save these classes in global references for later use
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2084
    jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2085
    jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2086
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2087
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2088
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2089
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2090
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2091
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2092
 * Class:     sun_awt_windows_Toolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2093
 * Method:    disableCustomPalette
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2094
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2095
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2096
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2097
Java_sun_awt_windows_WToolkit_disableCustomPalette(JNIEnv *env, jclass cls) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2098
    AwtPalette::DisableCustomPalette();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2099
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2100
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2101
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2102
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2103
 * Method:    embeddedInit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2104
 * Signature: ()Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2105
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2106
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2107
Java_sun_awt_windows_WToolkit_embeddedInit(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2108
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2109
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2110
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2111
    AwtToolkit::SetEnv(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2112
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2113
    return AwtToolkit::GetInstance().Initialize(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2114
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2115
    CATCH_BAD_ALLOC_RET(JNI_FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2116
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2117
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2118
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2119
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2120
 * Method:    embeddedDispose
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2121
 * Signature: ()Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2122
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2123
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2124
Java_sun_awt_windows_WToolkit_embeddedDispose(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2125
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2126
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2127
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2128
    BOOL retval = AwtToolkit::GetInstance().Dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2129
    AwtToolkit::GetInstance().SetPeer(env, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2130
    return retval;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2131
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2132
    CATCH_BAD_ALLOC_RET(JNI_FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2133
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2134
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2135
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2136
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2137
 * Method:    embeddedEventLoopIdleProcessing
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2138
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2139
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2140
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2141
Java_sun_awt_windows_WToolkit_embeddedEventLoopIdleProcessing(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2142
    jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2143
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2144
    VerifyWindowMoveLockReleased();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2145
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2146
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2147
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2148
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2149
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2150
 * Method:    init
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2151
 * Signature: ()Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2152
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2153
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2154
Java_sun_awt_windows_WToolkit_init(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2155
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2156
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2157
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2158
    AwtToolkit::SetEnv(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2159
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2160
    AwtToolkit::GetInstance().SetPeer(env, self);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2161
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2162
    // This call will fail if the Toolkit was already initialized.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2163
    // In that case, we don't want to start another message pump.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2164
    return AwtToolkit::GetInstance().Initialize(TRUE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2165
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2166
    CATCH_BAD_ALLOC_RET(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2167
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2168
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2169
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2170
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2171
 * Method:    eventLoop
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2172
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2173
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2174
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2175
Java_sun_awt_windows_WToolkit_eventLoop(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2176
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2177
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2178
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2179
    DASSERT(AwtToolkit::GetInstance().localPump());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2180
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2181
    AwtToolkit::SetBusy(TRUE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2182
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2183
    AwtToolkit::GetInstance().MessageLoop(AwtToolkit::PrimaryIdleFunc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2184
                                          AwtToolkit::CommonPeekMessageFunc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2185
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2186
    AwtToolkit::GetInstance().Dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2187
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2188
    AwtToolkit::SetBusy(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2189
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2190
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2191
     * IMPORTANT NOTES:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2192
     *   The AwtToolkit has been destructed by now.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2193
     * DO NOT CALL any method of AwtToolkit!!!
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2194
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2195
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2196
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2197
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2198
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2199
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2200
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2201
 * Method:    shutdown
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2202
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2203
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2204
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2205
Java_sun_awt_windows_WToolkit_shutdown(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2206
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2207
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2208
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2209
    AwtToolkit& tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2210
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2211
    tk.QuitMessageLoop(AwtToolkit::EXIT_ALL_ENCLOSING_LOOPS);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2212
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2213
    while (!tk.IsDisposed()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2214
        Sleep(100);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2215
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2216
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2217
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2218
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2219
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2220
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2221
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2222
 * Method:    startSecondaryEventLoop
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2223
 * Signature: ()V;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2224
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2225
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2226
Java_sun_awt_windows_WToolkit_startSecondaryEventLoop(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2227
    JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2228
    jclass)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2229
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2230
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2231
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2232
    DASSERT(AwtToolkit::MainThread() == ::GetCurrentThreadId());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2233
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2234
    AwtToolkit::GetInstance().MessageLoop(AwtToolkit::SecondaryIdleFunc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2235
                                          AwtToolkit::CommonPeekMessageFunc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2236
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2237
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2238
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2239
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2240
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2241
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2242
 * Method:    quitSecondaryEventLoop
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2243
 * Signature: ()V;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2244
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2245
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2246
Java_sun_awt_windows_WToolkit_quitSecondaryEventLoop(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2247
    JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2248
    jclass)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2249
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2250
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2251
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2252
    AwtToolkit::GetInstance().QuitMessageLoop(AwtToolkit::EXIT_ENCLOSING_LOOP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2253
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2254
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2255
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2256
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2257
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2258
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2259
 * Method:    makeColorModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2260
 * Signature: ()Ljava/awt/image/ColorModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2261
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2262
JNIEXPORT jobject JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2263
Java_sun_awt_windows_WToolkit_makeColorModel(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2264
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2265
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2266
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2267
    return AwtWin32GraphicsDevice::GetColorModel(env, JNI_FALSE,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2268
        AwtWin32GraphicsDevice::GetDefaultDeviceIndex());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2269
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2270
    CATCH_BAD_ALLOC_RET(NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2271
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2272
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2273
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2274
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2275
 * Method:    getMaximumCursorColors
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2276
 * Signature: ()I
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2277
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2278
JNIEXPORT jint JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2279
Java_sun_awt_windows_WToolkit_getMaximumCursorColors(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2280
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2281
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2282
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2283
    HDC hIC = ::CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2284
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2285
    int nColor = 256;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2286
    switch (::GetDeviceCaps(hIC, BITSPIXEL) * ::GetDeviceCaps(hIC, PLANES)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2287
        case 1:         nColor = 2;             break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2288
        case 4:         nColor = 16;            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2289
        case 8:         nColor = 256;           break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2290
        case 16:        nColor = 65536;         break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2291
        case 24:        nColor = 16777216;      break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2292
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2293
    ::DeleteDC(hIC);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2294
    return nColor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2295
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2296
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2297
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2298
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2299
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2300
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2301
 * Method:    getScreenWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2302
 * Signature: ()I
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2303
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2304
JNIEXPORT jint JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2305
Java_sun_awt_windows_WToolkit_getScreenWidth(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2306
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2307
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2308
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2309
    return ::GetSystemMetrics(SM_CXSCREEN);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2310
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2311
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2312
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2313
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2314
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2315
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2316
 * Method:    getScreenHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2317
 * Signature: ()I
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2318
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2319
JNIEXPORT jint JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2320
Java_sun_awt_windows_WToolkit_getScreenHeight(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2321
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2322
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2323
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2324
    return ::GetSystemMetrics(SM_CYSCREEN);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2325
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2326
    CATCH_BAD_ALLOC_RET(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2327
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2328
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2329
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2330
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2331
 * Method:    getSreenInsets
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2332
 * Signature: (I)Ljava/awt/Insets;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2333
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2334
JNIEXPORT jobject JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2335
Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2336
                                              jobject self,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2337
                                              jint screen)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2338
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2339
    jobject insets = NULL;
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2340
    RECT rect;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2341
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2342
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2343
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2344
    if (AwtToolkit::GetScreenInsets(screen, &rect)) {
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2345
        insets = env->NewObject(env->FindClass("java/awt/Insets"),
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2346
                AwtToolkit::insetsMID,
2472
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2347
                rect.top,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2348
                rect.left,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2349
                rect.bottom,
b7aba00cabb6 6693253: Security Warning appearance requires enhancements
anthony
parents: 1962
diff changeset
  2350
                rect.right);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2351
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2352
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2353
    if (safe_ExceptionOccurred(env)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2354
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2355
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2356
    return insets;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2357
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2358
    CATCH_BAD_ALLOC_RET(NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2359
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2360
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2361
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2362
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2363
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2364
 * Method:    nativeSync
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2365
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2366
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2367
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2368
Java_sun_awt_windows_WToolkit_nativeSync(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2369
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2370
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2371
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2372
    // Synchronize both GDI and DDraw
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2373
    VERIFY(::GdiFlush());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2374
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2375
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2376
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2377
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2378
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2379
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2380
 * Method:    beep
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2381
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2382
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2383
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2384
Java_sun_awt_windows_WToolkit_beep(JNIEnv *env, jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2385
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2386
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2387
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2388
    VERIFY(::MessageBeep(MB_OK));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2389
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2390
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2391
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2392
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2393
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2394
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2395
 * Method:    getLockingKeyStateNative
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2396
 * Signature: (I)Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2397
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2398
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2399
Java_sun_awt_windows_WToolkit_getLockingKeyStateNative(JNIEnv *env, jobject self, jint javaKey)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2400
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2401
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2402
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2403
    UINT windowsKey, modifiers;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2404
    AwtComponent::JavaKeyToWindowsKey(javaKey, &windowsKey, &modifiers);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2405
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2406
    if (windowsKey == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2407
        JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "Keyboard doesn't have requested key");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2408
        return JNI_FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2409
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2410
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2411
    // low order bit in keyboardState indicates whether the key is toggled
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2412
    BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2413
    AwtToolkit::GetKeyboardState(keyboardState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2414
    return keyboardState[windowsKey] & 0x01;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2415
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2416
    CATCH_BAD_ALLOC_RET(JNI_FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2417
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2418
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2419
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2420
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2421
 * Method:    setLockingKeyStateNative
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2422
 * Signature: (IZ)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2423
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2424
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2425
Java_sun_awt_windows_WToolkit_setLockingKeyStateNative(JNIEnv *env, jobject self, jint javaKey, jboolean state)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2426
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2427
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2428
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2429
    UINT windowsKey, modifiers;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2430
    AwtComponent::JavaKeyToWindowsKey(javaKey, &windowsKey, &modifiers);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2431
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2432
    if (windowsKey == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2433
        JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "Keyboard doesn't have requested key");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2434
        return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2435
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2436
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2437
    // if the key isn't in the desired state yet, simulate key events to get there
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2438
    // low order bit in keyboardState indicates whether the key is toggled
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2439
    BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2440
    AwtToolkit::GetKeyboardState(keyboardState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2441
    if ((keyboardState[windowsKey] & 0x01) != state) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2442
        ::keybd_event(windowsKey, 0, 0, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2443
        ::keybd_event(windowsKey, 0, KEYEVENTF_KEYUP, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2444
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2445
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2446
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2447
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2448
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2449
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2450
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2451
 * Method:    loadSystemColors
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2452
 * Signature: ([I)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2453
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2454
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2455
Java_sun_awt_windows_WToolkit_loadSystemColors(JNIEnv *env, jobject self,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2456
                                               jintArray colors)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2457
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2458
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2459
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2460
    static int indexMap[] = {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2461
        COLOR_DESKTOP, /* DESKTOP */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2462
        COLOR_ACTIVECAPTION, /* ACTIVE_CAPTION */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2463
        COLOR_CAPTIONTEXT, /* ACTIVE_CAPTION_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2464
        COLOR_ACTIVEBORDER, /* ACTIVE_CAPTION_BORDER */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2465
        COLOR_INACTIVECAPTION, /* INACTIVE_CAPTION */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2466
        COLOR_INACTIVECAPTIONTEXT, /* INACTIVE_CAPTION_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2467
        COLOR_INACTIVEBORDER, /* INACTIVE_CAPTION_BORDER */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2468
        COLOR_WINDOW, /* WINDOW */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2469
        COLOR_WINDOWFRAME, /* WINDOW_BORDER */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2470
        COLOR_WINDOWTEXT, /* WINDOW_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2471
        COLOR_MENU, /* MENU */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2472
        COLOR_MENUTEXT, /* MENU_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2473
        COLOR_WINDOW, /* TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2474
        COLOR_WINDOWTEXT, /* TEXT_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2475
        COLOR_HIGHLIGHT, /* TEXT_HIGHLIGHT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2476
        COLOR_HIGHLIGHTTEXT, /* TEXT_HIGHLIGHT_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2477
        COLOR_GRAYTEXT, /* TEXT_INACTIVE_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2478
        COLOR_3DFACE, /* CONTROL */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2479
        COLOR_BTNTEXT, /* CONTROL_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2480
        COLOR_3DLIGHT, /* CONTROL_HIGHLIGHT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2481
        COLOR_3DHILIGHT, /* CONTROL_LT_HIGHLIGHT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2482
        COLOR_3DSHADOW, /* CONTROL_SHADOW */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2483
        COLOR_3DDKSHADOW, /* CONTROL_DK_SHADOW */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2484
        COLOR_SCROLLBAR, /* SCROLLBAR */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2485
        COLOR_INFOBK, /* INFO */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2486
        COLOR_INFOTEXT, /* INFO_TEXT */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2487
    };
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2488
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2489
    jint colorLen = env->GetArrayLength(colors);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2490
    jint* colorsPtr = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2491
    try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2492
        colorsPtr = (jint *)env->GetPrimitiveArrayCritical(colors, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2493
        for (int i = 0; i < sizeof indexMap && i < colorLen; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2494
            colorsPtr[i] = DesktopColor2RGB(indexMap[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2495
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2496
    } catch (...) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2497
        if (colorsPtr != NULL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2498
            env->ReleasePrimitiveArrayCritical(colors, colorsPtr, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2499
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2500
        throw;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2501
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2502
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2503
    env->ReleasePrimitiveArrayCritical(colors, colorsPtr, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2504
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2505
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2506
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2507
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2508
extern "C" JNIEXPORT jobject JNICALL DSGetComponent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2509
    (JNIEnv* env, void* platformInfo)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2510
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2511
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2512
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2513
    HWND hWnd = (HWND)platformInfo;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2514
    if (!::IsWindow(hWnd))
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2515
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2516
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2517
    AwtComponent* comp = AwtComponent::GetComponent(hWnd);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2518
    if (comp == NULL)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2519
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2520
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2521
    return comp->GetTarget(env);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2522
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2523
    CATCH_BAD_ALLOC_RET(NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2524
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2525
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2526
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2527
Java_sun_awt_windows_WToolkit_postDispose(JNIEnv *env, jclass clazz)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2528
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2529
#ifdef DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2530
    TRY_NO_VERIFY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2531
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2532
    // If this method was called, that means runFinalizersOnExit is turned
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2533
    // on and the VM is exiting cleanly. We should signal the debug memory
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2534
    // manager to generate a leaks report.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2535
    AwtDebugSupport::GenerateLeaksReport();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2536
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2537
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2538
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2539
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2540
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2541
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2542
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2543
 * Method:    setDynamicLayoutNative
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2544
 * Signature: (Z)V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2545
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2546
JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2547
Java_sun_awt_windows_WToolkit_setDynamicLayoutNative(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2548
  jobject self, jboolean dynamic)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2549
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2550
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2551
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2552
    AwtToolkit::GetInstance().SetDynamicLayout(dynamic);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2553
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2554
    CATCH_BAD_ALLOC;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2555
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2556
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2557
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2558
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2559
 * Method:    isDynamicLayoutSupportedNative
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2560
 * Signature: ()Z
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2561
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2562
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2563
Java_sun_awt_windows_WToolkit_isDynamicLayoutSupportedNative(JNIEnv *env,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2564
  jobject self)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2565
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2566
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2567
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2568
    return (jboolean) AwtToolkit::GetInstance().IsDynamicLayoutSupported();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2569
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2570
    CATCH_BAD_ALLOC_RET(FALSE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2571
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2572
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2573
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2574
 * Class:     sun_awt_windows_WToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2575
 * Method:    printWindowsVersion
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2576
 * Signature: ()Ljava/lang/String;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2577
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2578
JNIEXPORT jstring JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2579
Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2580
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2581
    TRY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2582
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2583
    WCHAR szVer[128];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2584
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2585
    DWORD version = ::GetVersion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2586
    swprintf(szVer, L"0x%x = %ld", version, version);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2587
    int l = lstrlen(szVer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2588
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2589
    if (IS_WIN2000) {
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2590
        if (IS_WINXP) {
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2591
            if (IS_WINVISTA) {
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2592
                swprintf(szVer + l, L" (Windows Vista)");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2593
            } else {
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2594
                swprintf(szVer + l, L" (Windows XP)");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2595
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2596
        } else {
1954
b93b85df3211 6585765: RFE: Remove Unicows-related code from AWT
art
parents: 887
diff changeset
  2597
            swprintf(szVer + l, L" (Windows 2000)");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2598
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2599
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2600
        swprintf(szVer + l, L" (Unknown)");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2601
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2602
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2603
    return JNU_NewStringPlatform(env, szVer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2604
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2605
    CATCH_BAD_ALLOC_RET(NULL);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2606
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2607
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2608
JNIEXPORT jboolean JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2609
Java_sun_awt_windows_WToolkit_syncNativeQueue(JNIEnv *env, jobject self, jlong timeout)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2610
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2611
    AwtToolkit & tk = AwtToolkit::GetInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2612
    DWORD eventNumber = tk.eventNumber;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2613
    tk.PostMessage(WM_SYNC_WAIT, 0, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2614
    ::WaitForSingleObject(tk.m_waitEvent, INFINITE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2615
    DWORD newEventNumber = tk.eventNumber;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2616
    return (newEventNumber - eventNumber) > 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2617
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2618
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2619
} /* extern "C" */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2620
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2621
/* Convert a Windows desktop color index into an RGB value. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2622
COLORREF DesktopColor2RGB(int colorIndex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2623
    DWORD sysColor = ::GetSysColor(colorIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2624
    return ((GetRValue(sysColor)<<16) | (GetGValue(sysColor)<<8) |
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2625
            (GetBValue(sysColor)) | 0xff000000);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2626
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2627
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2628
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2629
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2630
 * Class:     sun_awt_SunToolkit
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2631
 * Method:    closeSplashScreen
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2632
 * Signature: ()V
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2633
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2634
extern "C" JNIEXPORT void JNICALL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2635
Java_sun_awt_SunToolkit_closeSplashScreen(JNIEnv *env, jclass cls)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2636
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2637
    typedef void (*SplashClose_t)();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2638
    HMODULE hSplashDll = GetModuleHandle(_T("splashscreen.dll"));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2639
    if (!hSplashDll) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2640
        return; // dll not loaded
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2641
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2642
    SplashClose_t splashClose = (SplashClose_t)GetProcAddress(hSplashDll,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2643
        "SplashClose");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2644
    if (splashClose) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2645
        splashClose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2646
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2647
}
1962
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2648
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2649
/*
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2650
 * accessible from awt_Component
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2651
 */
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2652
BOOL AwtToolkit::areExtraMouseButtonsEnabled() {
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2653
    return m_areExtraMouseButtonsEnabled;
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2654
}
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2655
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2656
/*
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2657
 * Class:     sun_awt_windows_WToolkit
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2658
 * Method:    setExtraMouseButtonsEnabledNative
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2659
 * Signature: (Z)V
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2660
 */
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2661
extern "C" JNIEXPORT void JNICALL Java_sun_awt_windows_WToolkit_setExtraMouseButtonsEnabledNative
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2662
(JNIEnv *env, jclass self, jboolean enable){
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2663
    TRY;
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2664
    AwtToolkit::GetInstance().setExtraMouseButtonsEnabled(enable);
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2665
    CATCH_BAD_ALLOC;
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2666
}
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2667
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2668
void AwtToolkit::setExtraMouseButtonsEnabled(BOOL enable) {
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2669
    m_areExtraMouseButtonsEnabled = enable;
6c293d33645b 6315717: Support for mouse with multiple scroll wheels and 4 or more buttons
dav
parents: 1954
diff changeset
  2670
}
2810
fa49c6a06baf 6799099: All automatic regression tests that create Robot fail on X11
dav
parents: 2472
diff changeset
  2671
fa49c6a06baf 6799099: All automatic regression tests that create Robot fail on X11
dav
parents: 2472
diff changeset
  2672
JNIEXPORT jint JNICALL Java_sun_awt_windows_WToolkit_getNumberOfButtonsImpl
fa49c6a06baf 6799099: All automatic regression tests that create Robot fail on X11
dav
parents: 2472
diff changeset
  2673
(JNIEnv *, jobject self) {
6642
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
  2674
    return AwtToolkit::GetNumberOfButtons();
2810
fa49c6a06baf 6799099: All automatic regression tests that create Robot fail on X11
dav
parents: 2472
diff changeset
  2675
}
6642
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
  2676
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
  2677
UINT AwtToolkit::GetNumberOfButtons() {
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
  2678
    return MOUSE_BUTTONS_WINDOWS_SUPPORTED;
9d6f6dbb16a4 6829267: Regression test java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java fails in RHEL5
dav
parents: 5506
diff changeset
  2679
}