提交 331aa437 编写于 作者: A art

6585765: RFE: Remove Unicows-related code from AWT

6733976: VS2008 errors compiling AWT files - explicit casts need to be added
6728735: VS2008 errors compiling UnicowsLoader.h and fatal error in awtmsg.h
Summary: Unicows-related and Win95/98/Me-related code is removed
Reviewed-by: uta, tdv
上级 813a907e
...@@ -153,7 +153,6 @@ FILES_cpp = \ ...@@ -153,7 +153,6 @@ FILES_cpp = \
awt_Menu.cpp \ awt_Menu.cpp \
awt_MenuBar.cpp \ awt_MenuBar.cpp \
awt_MenuItem.cpp \ awt_MenuItem.cpp \
awt_MMStub.cpp \
awt_MouseEvent.cpp \ awt_MouseEvent.cpp \
awt_Object.cpp \ awt_Object.cpp \
awt_Palette.cpp \ awt_Palette.cpp \
...@@ -171,7 +170,6 @@ FILES_cpp = \ ...@@ -171,7 +170,6 @@ FILES_cpp = \
awt_TextComponent.cpp \ awt_TextComponent.cpp \
awt_TextField.cpp \ awt_TextField.cpp \
awt_Toolkit.cpp \ awt_Toolkit.cpp \
awt_Unicode.cpp \
awt_Window.cpp \ awt_Window.cpp \
awt_Win32GraphicsEnv.cpp \ awt_Win32GraphicsEnv.cpp \
awt_Win32GraphicsDevice.cpp \ awt_Win32GraphicsDevice.cpp \
...@@ -202,6 +200,4 @@ FILES_cpp = \ ...@@ -202,6 +200,4 @@ FILES_cpp = \
ThemeReader.cpp \ ThemeReader.cpp \
ComCtl32Util.cpp \ ComCtl32Util.cpp \
initIDs.cpp \ initIDs.cpp \
awt_dlls.cpp \
UnicowsLoader.cpp \
MouseInfo.cpp MouseInfo.cpp
...@@ -251,8 +251,14 @@ endif # PLATFORM ...@@ -251,8 +251,14 @@ endif # PLATFORM
ifeq ($(PLATFORM), windows) ifeq ($(PLATFORM), windows)
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WINDOWS # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WINDOWS
OTHER_LDLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib \ OTHER_LDLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib \
imm32.lib ole32.lib uuid.lib $(JVMLIB) \ imm32.lib ole32.lib uuid.lib shell32.lib \
shell32.lib comdlg32.lib winmm.lib comctl32.lib delayimp.lib \
$(JVMLIB) \
/DELAYLOAD:user32.dll /DELAYLOAD:gdi32.dll \
/DELAYLOAD:shell32.dll /DELAYLOAD:winmm.dll \
/DELAYLOAD:winspool.drv /DELAYLOAD:imm32.dll \
/DELAYLOAD:ole32.dll /DELAYLOAD:comdlg32.dll \
/DELAYLOAD:comctl32.dll
clean:: awt.clean clean:: awt.clean
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
$(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/UnicowsLoader.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/stdhdrs.h
...@@ -67,7 +67,7 @@ ifneq ($(PLATFORM), windows) ...@@ -67,7 +67,7 @@ ifneq ($(PLATFORM), windows)
OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread
else # PLATFORM else # PLATFORM
CFLAGS += -DWITH_WIN32 CFLAGS += -DWITH_WIN32
OTHER_LDLIBS += kernel32.lib user32.lib gdi32.lib OTHER_LDLIBS += kernel32.lib user32.lib gdi32.lib delayimp.lib /DELAYLOAD:user32.dll
#$(JVMLIB) $(OBJDIR)/../../jpeg/$(OBJDIRNAME)/jpeg$(SUFFIX).lib #$(JVMLIB) $(OBJDIR)/../../jpeg/$(OBJDIRNAME)/jpeg$(SUFFIX).lib
endif # PLATFORM endif # PLATFORM
......
...@@ -68,13 +68,6 @@ public abstract class WComponentPeer extends WObjectPeer ...@@ -68,13 +68,6 @@ public abstract class WComponentPeer extends WObjectPeer
private static final Logger log = Logger.getLogger("sun.awt.windows.WComponentPeer"); private static final Logger log = Logger.getLogger("sun.awt.windows.WComponentPeer");
private static final Logger shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer"); private static final Logger shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer");
static {
wheelInit();
}
// Only actually does stuff if running on 95
native static void wheelInit();
// ComponentPeer implementation // ComponentPeer implementation
SurfaceData surfaceData; SurfaceData surfaceData;
......
/* /*
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,24 +23,21 @@ ...@@ -23,24 +23,21 @@
* have any questions. * have any questions.
*/ */
// copy from awt.h
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
// copy from awt.h
#ifndef _WIN32_IE
#define _WIN32_IE 0x0600
#endif
#include "splashscreen_impl.h" #include "splashscreen_impl.h"
#include <windowsx.h> #include <windowsx.h>
#include <windows.h> #include <windows.h>
#include <winuser.h> #include <winuser.h>
/* layered windows api prototypes. wouldn't be needed if we could use an updated version of the MS PSDK. */
typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered window
HDC hdcDst, // handle to screen DC
POINT * pptDst, // new screen position
SIZE * psize, // new size of the layered window
HDC hdcSrc, // handle to surface DC
POINT * pptSrc, // layer position
COLORREF crKey, // color key
BLENDFUNCTION * pblend, // blend function
DWORD dwFlags // options
);
#ifndef WS_EX_LAYERED #ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0x80000 #define WS_EX_LAYERED 0x80000
#endif #endif
...@@ -57,21 +54,6 @@ typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered win ...@@ -57,21 +54,6 @@ typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered win
#define AC_SRC_ALPHA 0x01 #define AC_SRC_ALPHA 0x01
#endif #endif
static UpdateLayeredWindowT *UpdateLayeredWindow = NULL;
/* Get/SetWindowLongPtr prototypes, for the case we're compiling with old headers for a 32-bit platform
copied from Component.cpp
FIXME: remove this as soon as the build process is using up-to-date headers */
#if !defined(__int3264)
#define GetWindowLongPtr GetWindowLong
#define SetWindowLongPtr SetWindowLong
#define GWLP_USERDATA GWL_USERDATA
#define GWLP_WNDPROC GWL_WNDPROC
typedef __int32 LONG_PTR;
typedef unsigned __int32 ULONG_PTR;
#endif // __int3264
#define WM_SPLASHUPDATE WM_USER+1 #define WM_SPLASHUPDATE WM_USER+1
#define WM_SPLASHRECONFIGURE WM_USER+2 #define WM_SPLASHRECONFIGURE WM_USER+2
...@@ -436,16 +418,11 @@ SplashUnlock(Splash * splash) ...@@ -436,16 +418,11 @@ SplashUnlock(Splash * splash)
void void
SplashInitPlatform(Splash * splash) SplashInitPlatform(Splash * splash)
{ {
HMODULE user32 = LoadLibrary("user32.dll");
HDC hdc; HDC hdc;
int paletteMode; int paletteMode;
InitializeCriticalSection(&splash->lock); InitializeCriticalSection(&splash->lock);
splash->isLayered = FALSE; splash->isLayered = FALSE;
if (user32) {
UpdateLayeredWindow = (UpdateLayeredWindowT *)
GetProcAddress(user32, "UpdateLayeredWindow");
}
hdc = GetDC(NULL); hdc = GetDC(NULL);
paletteMode = (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0; paletteMode = (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0;
if (UpdateLayeredWindow && !paletteMode) { if (UpdateLayeredWindow && !paletteMode) {
......
...@@ -184,7 +184,7 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter, ...@@ -184,7 +184,7 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter,
pMgr = D3DPipelineManager::GetInstance(); pMgr = D3DPipelineManager::GetInstance();
RETURN_IF_NULL(pMgr); RETURN_IF_NULL(pMgr);
hMon = pMgr->pd3d9->GetAdapterMonitor(adapter); hMon = pMgr->pd3d9->GetAdapterMonitor(adapter);
gdiScreen = AwtWin32GraphicsDevice::GetScreenFromMHND((MHND)hMon); gdiScreen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hMon);
JNU_CallStaticMethodByName(env, NULL, JNU_CallStaticMethodByName(env, NULL,
"sun/java2d/pipe/hw/AccelDeviceEventNotifier", "sun/java2d/pipe/hw/AccelDeviceEventNotifier",
...@@ -194,21 +194,21 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter, ...@@ -194,21 +194,21 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter,
UINT D3DPipelineManager::GetAdapterOrdinalForScreen(jint gdiScreen) UINT D3DPipelineManager::GetAdapterOrdinalForScreen(jint gdiScreen)
{ {
MHND mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen); HMONITOR mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen);
if (mHnd == (MHND)0) { if (mHnd == (HMONITOR)0) {
return D3DADAPTER_DEFAULT; return D3DADAPTER_DEFAULT;
} }
return GetAdapterOrdinalByHmon((HMONITOR)mHnd); return GetAdapterOrdinalByHmon((HMONITOR)mHnd);
} }
// static // static
HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum) HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pHMONITORs, UINT monNum)
{ {
HRESULT res = S_OK; HRESULT res = S_OK;
BOOL bResetD3D = FALSE, bFound; BOOL bResetD3D = FALSE, bFound;
D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance(); D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance();
RETURN_STATUS_IF_NULL(pMHNDs, E_FAIL); RETURN_STATUS_IF_NULL(pHMONITORs, E_FAIL);
if (pMgr == NULL) { if (pMgr == NULL) {
// NULL pMgr is valid when the pipeline is not enabled or if it hasn't // NULL pMgr is valid when the pipeline is not enabled or if it hasn't
// been created yet // been created yet
...@@ -234,7 +234,7 @@ HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum) ...@@ -234,7 +234,7 @@ HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum)
} }
bFound = FALSE; bFound = FALSE;
for (UINT mon = 0; mon < monNum; mon++) { for (UINT mon = 0; mon < monNum; mon++) {
if (pMHNDs[mon] == hMon) { if (pHMONITORs[mon] == hMon) {
J2dTraceLn3(J2D_TRACE_VERBOSE, J2dTraceLn3(J2D_TRACE_VERBOSE,
" adapter %d: found hmnd[%d]=0x%x", i, mon, hMon); " adapter %d: found hmnd[%d]=0x%x", i, mon, hMon);
bFound = TRUE; bFound = TRUE;
...@@ -364,8 +364,8 @@ D3DPipelineManager::CheckOSVersion() ...@@ -364,8 +364,8 @@ D3DPipelineManager::CheckOSVersion()
HRESULT HRESULT
D3DPipelineManager::GDICheckForBadHardware() D3DPipelineManager::GDICheckForBadHardware()
{ {
_DISPLAY_DEVICE dd; DISPLAY_DEVICE dd;
dd.dwSize = sizeof(DISPLAY_DEVICE); dd.cb = sizeof(DISPLAY_DEVICE);
int failedDevices = 0; int failedDevices = 0;
int attachedDevices = 0; int attachedDevices = 0;
...@@ -379,9 +379,9 @@ D3DPipelineManager::GDICheckForBadHardware() ...@@ -379,9 +379,9 @@ D3DPipelineManager::GDICheckForBadHardware()
// i<20 is to guard against buggy drivers // i<20 is to guard against buggy drivers
while (EnumDisplayDevices(NULL, i, &dd, 0) && i < 20) { while (EnumDisplayDevices(NULL, i, &dd, 0) && i < 20) {
if (dd.dwFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
attachedDevices++; attachedDevices++;
id = dd.deviceID; id = dd.DeviceID;
if (wcslen(id) > 21) { if (wcslen(id) > 21) {
// get vendor ID // get vendor ID
wcsncpy(vendorId, id+8, 4); wcsncpy(vendorId, id+8, 4);
...@@ -796,7 +796,7 @@ HWND D3DPipelineManager::CreateDefaultFocusWindow() ...@@ -796,7 +796,7 @@ HWND D3DPipelineManager::CreateDefaultFocusWindow()
ZeroMemory(&mi, sizeof(MONITORINFO)); ZeroMemory(&mi, sizeof(MONITORINFO));
mi.cbSize = sizeof(MONITORINFO); mi.cbSize = sizeof(MONITORINFO);
HMONITOR hMon = pd3d9->GetAdapterMonitor(adapterOrdinal); HMONITOR hMon = pd3d9->GetAdapterMonitor(adapterOrdinal);
if (hMon == 0 || !GetMonitorInfo(hMon, (PMONITOR_INFO)&mi)) { if (hMon == 0 || !GetMonitorInfo(hMon, (LPMONITORINFO)&mi)) {
J2dRlsTraceLn1(J2D_TRACE_ERROR, J2dRlsTraceLn1(J2D_TRACE_ERROR,
"D3DPPLM::CreateDefaultFocusWindow: "\ "D3DPPLM::CreateDefaultFocusWindow: "\
"error getting monitor info for adapter=%d", adapterOrdinal); "error getting monitor info for adapter=%d", adapterOrdinal);
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
* have any questions. * have any questions.
*/ */
#include "D3DPipeline.h"
#include <malloc.h> #include <malloc.h>
#include <jni.h>
#include "sun_java2d_pipe_BufferedOpCodes.h" #include "sun_java2d_pipe_BufferedOpCodes.h"
#include "jlong.h" #include "jlong.h"
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
* have any questions. * have any questions.
*/ */
#include "D3DPipeline.h"
#include "sun_java2d_d3d_D3DRenderer.h" #include "sun_java2d_d3d_D3DRenderer.h"
#include "D3DContext.h" #include "D3DContext.h"
......
...@@ -23,8 +23,7 @@ ...@@ -23,8 +23,7 @@
* have any questions. * have any questions.
*/ */
#include <jni.h> #include "D3DPipeline.h"
#include <jni_util.h>
#include <jlong.h> #include <jlong.h>
#include "D3DSurfaceData.h" #include "D3DSurfaceData.h"
#include "D3DPipelineManager.h" #include "D3DPipelineManager.h"
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include <sun_java2d_windows_GDIBlitLoops.h> #include <sun_java2d_windows_GDIBlitLoops.h>
#include "gdefs.h" #include "gdefs.h"
#include "Trace.h" #include "Trace.h"
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "sun_java2d_windows_GDIRenderer.h" #include "sun_java2d_windows_GDIRenderer.h"
#include "java_awt_geom_PathIterator.h" #include "java_awt_geom_PathIterator.h"
...@@ -31,11 +32,8 @@ ...@@ -31,11 +32,8 @@
#include "awt_Pen.h" #include "awt_Pen.h"
#include "awt_Brush.h" #include "awt_Brush.h"
#include "jni.h"
#include "GraphicsPrimitiveMgr.h" #include "GraphicsPrimitiveMgr.h"
#include <windows.h>
#include <math.h> /* for cos(), sin(), etc */ #include <math.h> /* for cos(), sin(), etc */
#define MAX_CLAMP_BND (1<<26) #define MAX_CLAMP_BND (1<<26)
......
...@@ -246,7 +246,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo, ...@@ -246,7 +246,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo,
} }
if( numScreens > 1 ) { if( numScreens > 1 ) {
MONITOR_INFO *miInfo; LPMONITORINFO miInfo;
RECT rSect ={0,0,0,0}; RECT rSect ={0,0,0,0};
RECT rView ={bounds->x1, bounds->y1, bounds->x2, bounds->y2}; RECT rView ={bounds->x1, bounds->y1, bounds->x2, bounds->y2};
retCode = FALSE; retCode = FALSE;
...@@ -258,7 +258,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo, ...@@ -258,7 +258,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo,
::OffsetRect(&rView, ::OffsetRect(&rView,
(ptOrig.x), (ptOrig.y)); (ptOrig.x), (ptOrig.y));
::IntersectRect(&rSect,&rView,&(miInfo->rMonitor)); ::IntersectRect(&rSect,&rView,&(miInfo->rcMonitor));
if( FALSE == ::IsRectEmpty(&rSect) ) { if( FALSE == ::IsRectEmpty(&rSect) ) {
if( TRUE == ::EqualRect(&rSect,&rView) ) { if( TRUE == ::EqualRect(&rSect,&rView) ) {
......
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
* have any questions. * have any questions.
*/ */
#include <jni.h>
#include <awt.h> #include <awt.h>
#include "Trace.h" #include "Trace.h"
#include "WindowsFlags.h" #include "WindowsFlags.h"
......
/* /*
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,54 +23,26 @@ ...@@ -23,54 +23,26 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "ComCtl32Util.h" #include "ComCtl32Util.h"
ComCtl32Util::ComCtl32Util() { ComCtl32Util::ComCtl32Util() {
hModComCtl32 = NULL;
m_bNewSubclassing = FALSE;
m_lpfnSetWindowSubclass = NULL;
m_lpfnRemoveWindowSubclass = NULL;
m_lpfnDefSubclassProc = NULL;
} }
ComCtl32Util::~ComCtl32Util() { ComCtl32Util::~ComCtl32Util() {
DASSERT(hModComCtl32 == NULL);
} }
void ComCtl32Util::InitLibraries() { void ComCtl32Util::InitLibraries() {
if (hModComCtl32 == NULL) { INITCOMMONCONTROLSEX iccex;
hModComCtl32 = ::LoadLibrary(TEXT("comctl32.dll")); memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX));
if (hModComCtl32 != NULL) { iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
m_lpfnSetWindowSubclass = (PFNSETWINDOWSUBCLASS)::GetProcAddress(hModComCtl32, "SetWindowSubclass"); ::InitCommonControlsEx(&iccex);
m_lpfnRemoveWindowSubclass = (PFNREMOVEWINDOWSUBCLASS)::GetProcAddress(hModComCtl32, "RemoveWindowSubclass");
m_lpfnDefSubclassProc = (PFNDEFSUBCLASSPROC)::GetProcAddress(hModComCtl32, "DefSubclassProc");
m_bNewSubclassing = (m_lpfnSetWindowSubclass != NULL) &&
(m_lpfnRemoveWindowSubclass != NULL) &&
(m_lpfnDefSubclassProc != NULL);
fn_InitCommonControlsEx = (ComCtl32Util::InitCommonControlsExType)::GetProcAddress(hModComCtl32, "InitCommonControlsEx");
InitCommonControls();
}
}
}
void ComCtl32Util::FreeLibraries() {
if (hModComCtl32 != NULL) {
m_lpfnSetWindowSubclass = NULL;
m_lpfnRemoveWindowSubclass = NULL;
m_lpfnDefSubclassProc = NULL;
::FreeLibrary(hModComCtl32);
hModComCtl32 = NULL;
}
} }
WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) {
if (m_bNewSubclassing) { if (IS_WINXP) {
DASSERT(hModComCtl32 != NULL);
const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc
m_lpfnSetWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc, NULL); // _WindowProc is used as subclass ID ::SetWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc, NULL); // _WindowProc is used as subclass ID
return NULL; return NULL;
} else { } else {
return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_WindowProc); return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_WindowProc);
...@@ -78,21 +50,17 @@ WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { ...@@ -78,21 +50,17 @@ WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) {
} }
void ComCtl32Util::UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc) { void ComCtl32Util::UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc) {
if (m_bNewSubclassing) { if (IS_WINXP) {
DASSERT(hModComCtl32 != NULL);
DASSERT(_DefWindowProc == NULL);
const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc
m_lpfnRemoveWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc); // _WindowProc is used as subclass ID ::RemoveWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc); // _WindowProc is used as subclass ID
} else { } else {
::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_DefWindowProc); ::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_DefWindowProc);
} }
} }
LRESULT ComCtl32Util::DefWindowProc(WNDPROC _DefWindowProc, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT ComCtl32Util::DefWindowProc(WNDPROC _DefWindowProc, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (m_bNewSubclassing) { if (IS_WINXP) {
DASSERT(hModComCtl32 != NULL); return ::DefSubclassProc(hwnd, msg, wParam, lParam);
DASSERT(_DefWindowProc == NULL);
return m_lpfnDefSubclassProc(hwnd, msg, wParam, lParam);
} else if (_DefWindowProc != NULL) { } else if (_DefWindowProc != NULL) {
return ::CallWindowProc(_DefWindowProc, hwnd, msg, wParam, lParam); return ::CallWindowProc(_DefWindowProc, hwnd, msg, wParam, lParam);
} else { } else {
...@@ -111,15 +79,3 @@ LRESULT ComCtl32Util::SharedWindowProc(HWND hwnd, UINT msg, ...@@ -111,15 +79,3 @@ LRESULT ComCtl32Util::SharedWindowProc(HWND hwnd, UINT msg,
CATCH_BAD_ALLOC_RET(0); CATCH_BAD_ALLOC_RET(0);
} }
void ComCtl32Util::InitCommonControls()
{
if (fn_InitCommonControlsEx == NULL) {
return;
}
INITCOMMONCONTROLSEX iccex;
memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX));
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
fn_InitCommonControlsEx(&iccex);
}
/* /*
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -30,20 +30,6 @@ ...@@ -30,20 +30,6 @@
#ifndef _COMCTL32UTIL_H #ifndef _COMCTL32UTIL_H
#define _COMCTL32UTIL_H #define _COMCTL32UTIL_H
/*
* comctl32.dll version 6 subclassing - taken from PlatformSDK/Include/commctrl.h
*/
typedef LRESULT (CALLBACK *SUBCLASSPROC)(HWND hWnd, UINT uMsg, WPARAM wParam, \
LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData);
typedef BOOL (WINAPI *PFNSETWINDOWSUBCLASS)(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, \
DWORD_PTR dwRefData);
typedef BOOL (WINAPI *PFNREMOVEWINDOWSUBCLASS)(HWND hWnd, SUBCLASSPROC pfnSubclass, \
UINT_PTR uIdSubclass);
typedef LRESULT (WINAPI *PFNDEFSUBCLASSPROC)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
class ComCtl32Util class ComCtl32Util
{ {
public: public:
...@@ -52,21 +38,8 @@ class ComCtl32Util ...@@ -52,21 +38,8 @@ class ComCtl32Util
return theInstance; return theInstance;
} }
// loads comctl32.dll and checks if required routines are available
// called from AwtToolkit::AwtToolkit()
void InitLibraries(); void InitLibraries();
// unloads comctl32.dll
// called from AwtToolkit::Dispose()
void FreeLibraries();
//-- comctl32.dll version 6 subclassing API --//
INLINE BOOL IsNewSubclassing() {
return m_bNewSubclassing;
}
// if comctl32.dll version 6 is used returns NULL, otherwise
// returns default window proc
WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc); WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc);
// DefWindowProc is the same as returned from SubclassHWND // DefWindowProc is the same as returned from SubclassHWND
void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc); void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc);
...@@ -77,19 +50,6 @@ class ComCtl32Util ...@@ -77,19 +50,6 @@ class ComCtl32Util
ComCtl32Util(); ComCtl32Util();
~ComCtl32Util(); ~ComCtl32Util();
HMODULE hModComCtl32;
PFNSETWINDOWSUBCLASS m_lpfnSetWindowSubclass;
PFNREMOVEWINDOWSUBCLASS m_lpfnRemoveWindowSubclass;
PFNDEFSUBCLASSPROC m_lpfnDefSubclassProc;
typedef BOOL (WINAPI * InitCommonControlsExType)(const LPINITCOMMONCONTROLSEX lpInitCtrls);
InitCommonControlsExType fn_InitCommonControlsEx;
void InitCommonControls();
BOOL m_bNewSubclassing;
// comctl32.dll version 6 window proc // comctl32.dll version 6 window proc
static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message, static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam, WPARAM wParam, LPARAM lParam,
......
...@@ -83,9 +83,83 @@ ...@@ -83,9 +83,83 @@
#include "Devices.h" #include "Devices.h"
#include "Trace.h" #include "Trace.h"
#include "awt_Multimon.h"
#include "D3DPipelineManager.h" #include "D3DPipelineManager.h"
/* Some helper functions (from awt_MMStub.h/cpp) */
int g_nMonitorCounter;
int g_nMonitorLimit;
HMONITOR* g_hmpMonitors;
// Callback for CountMonitors below
BOOL WINAPI clb_fCountMonitors(HMONITOR hMon, HDC hDC, LPRECT rRect, LPARAM lP)
{
g_nMonitorCounter ++;
return TRUE;
}
int WINAPI CountMonitors(void)
{
g_nMonitorCounter = 0;
::EnumDisplayMonitors(NULL, NULL, clb_fCountMonitors, 0L);
return g_nMonitorCounter;
}
// Callback for CollectMonitors below
BOOL WINAPI clb_fCollectMonitors(HMONITOR hMon, HDC hDC, LPRECT rRect, LPARAM lP)
{
if ((g_nMonitorCounter < g_nMonitorLimit) && (NULL != g_hmpMonitors)) {
g_hmpMonitors[g_nMonitorCounter] = hMon;
g_nMonitorCounter ++;
}
return TRUE;
}
int WINAPI CollectMonitors(HMONITOR* hmpMonitors, int nNum)
{
int retCode = 0;
if (NULL != hmpMonitors) {
g_nMonitorCounter = 0;
g_nMonitorLimit = nNum;
g_hmpMonitors = hmpMonitors;
::EnumDisplayMonitors(NULL, NULL, clb_fCollectMonitors, 0L);
retCode = g_nMonitorCounter;
g_nMonitorCounter = 0;
g_nMonitorLimit = 0;
g_hmpMonitors = NULL;
}
return retCode;
}
BOOL WINAPI MonitorBounds(HMONITOR hmMonitor, RECT* rpBounds)
{
BOOL retCode = FALSE;
if ((NULL != hmMonitor) && (NULL != rpBounds)) {
MONITORINFOEX miInfo;
memset((void*)(&miInfo), 0, sizeof(MONITORINFOEX));
miInfo.cbSize = sizeof(MONITORINFOEX);
if (TRUE == (retCode = ::GetMonitorInfo(hmMonitor, &miInfo))) {
(*rpBounds) = miInfo.rcMonitor;
}
}
return retCode;
}
/* End of helper functions */
Devices* Devices::theInstance = NULL; Devices* Devices::theInstance = NULL;
CriticalSection Devices::arrayLock; CriticalSection Devices::arrayLock;
...@@ -113,9 +187,9 @@ BOOL Devices::UpdateInstance(JNIEnv *env) ...@@ -113,9 +187,9 @@ BOOL Devices::UpdateInstance(JNIEnv *env)
{ {
J2dTraceLn(J2D_TRACE_INFO, "Devices::UpdateInstance"); J2dTraceLn(J2D_TRACE_INFO, "Devices::UpdateInstance");
int numScreens = ::CountMonitors(); int numScreens = CountMonitors();
MHND *monHds = (MHND *)safe_Malloc(numScreens * sizeof(MHND)); HMONITOR *monHds = (HMONITOR *)safe_Malloc(numScreens * sizeof(HMONITOR));
if (numScreens != ::CollectMonitors(monHds, numScreens)) { if (numScreens != CollectMonitors(monHds, numScreens)) {
J2dRlsTraceLn(J2D_TRACE_ERROR, J2dRlsTraceLn(J2D_TRACE_ERROR,
"Devices::UpdateInstance: Failed to get all "\ "Devices::UpdateInstance: Failed to get all "\
"monitor handles."); "monitor handles.");
......
/* /*
* Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -70,4 +70,8 @@ static CriticalSection arrayLock; ...@@ -70,4 +70,8 @@ static CriticalSection arrayLock;
}; };
// Some helper functions (from awt_MMStub.h/cpp)
BOOL WINAPI MonitorBounds (HMONITOR, RECT*);
#endif _DEVICES_H_ #endif _DEVICES_H_
/* /*
* Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include "GDIHashtable.h" #include "GDIHashtable.h"
#include "awt_GDIObject.h" #include "awt_GDIObject.h"
#include "awt_dlls.h"
GDIHashtable::BatchDestructionManager GDIHashtable::manager; GDIHashtable::BatchDestructionManager GDIHashtable::manager;
...@@ -46,7 +45,6 @@ void GDIHashtable::release(void* key) { ...@@ -46,7 +45,6 @@ void GDIHashtable::release(void* key) {
DASSERT(value != NULL); DASSERT(value != NULL);
m_deleteProc(value); m_deleteProc(value);
} }
manager.update();
} }
void GDIHashtable::flush() { void GDIHashtable::flush() {
...@@ -128,9 +126,6 @@ void GDIHashtable::List::clear() { ...@@ -128,9 +126,6 @@ void GDIHashtable::List::clear() {
} }
} }
#undef GFSR_GDIRESOURCES
#define GFSR_GDIRESOURCES 0x0001
GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThreshold, GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThreshold,
UINT nSecondThreshold, UINT nSecondThreshold,
UINT nDestroyPeriod) : UINT nDestroyPeriod) :
...@@ -138,48 +133,6 @@ GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThresh ...@@ -138,48 +133,6 @@ GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThresh
m_nSecondThreshold(nSecondThreshold), m_nSecondThreshold(nSecondThreshold),
m_nDestroyPeriod(nDestroyPeriod), m_nDestroyPeriod(nDestroyPeriod),
m_nCounter(0), m_nCounter(0),
m_bBatchingEnabled(TRUE) { m_bBatchingEnabled(TRUE)
load_rsrc32_procs(); {
}
void GDIHashtable::BatchDestructionManager::update() {
if (get_free_system_resources != NULL) {
CriticalSection::Lock l(m_managerLock);
if (m_nCounter < 0) {
UINT nFreeResources = (*get_free_system_resources)(GFSR_GDIRESOURCES);
/*
* If m_bBatchingEnabled is FALSE there is no need
* to flush since we have been destroying all
* GDI resources as soon as they were released.
*/
if (m_bBatchingEnabled) {
if (nFreeResources < m_nFirstThreshold) {
flushAll();
nFreeResources = (*get_free_system_resources)(GFSR_GDIRESOURCES);
}
}
if (nFreeResources < m_nSecondThreshold) {
m_bBatchingEnabled = FALSE;
m_nCounter = m_nDestroyPeriod;
} else {
m_bBatchingEnabled = TRUE;
/*
* The frequency of checks must depend on the currect amount
* of free space in GDI heaps. Otherwise we can run into the
* Resource Meter warning dialog when GDI resources are low.
* This is a heuristic rule that provides this dependency.
* These numbers have been chosen because:
* Resource Meter posts a warning dialog when less than 10%
* of GDI resources are free.
* 5 pens/brushes take 1%. So 3 is the upper bound.
* When changing this rule you should check that performance
* isn't affected (with Caffeine Mark and JMark).
*/
m_nCounter = (nFreeResources - 10) * 3;
}
}
}
} }
/* /*
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -151,12 +151,6 @@ class GDIHashtable : public Hashtable { ...@@ -151,12 +151,6 @@ class GDIHashtable : public Hashtable {
*/ */
INLINE void decrementCounter() { m_nCounter--; } INLINE void decrementCounter() { m_nCounter--; }
/**
* Depending on the amount of free space in GDI heaps flushes
* all GDIHashtables and sets the initial counter value.
*/
void update();
INLINE CriticalSection& getLock() { return m_managerLock; } INLINE CriticalSection& getLock() { return m_managerLock; }
}; };
......
/* /*
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -31,17 +31,27 @@ ...@@ -31,17 +31,27 @@
// This file should stand independent of AWT and should ultimately be // This file should stand independent of AWT and should ultimately be
// put into its own DLL. // put into its own DLL.
#include <awt.h> #include <awt.h>
#endif #else
// Include jni_util.h first, so JNU_* macros can be redefined
#include "jni_util.h"
// Borrow some macros from awt.h
#define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast<jchar*>(x), static_cast<jsize>(_tcslen(x)))
#define JNU_GetStringPlatformChars(env, x, y) reinterpret_cast<LPCWSTR>(env->GetStringChars(x, y))
#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, reinterpret_cast<const jchar*>(y))
#endif // DEBUG
#include <windows.h> #include <windows.h>
#include <shlobj.h> #include <shlobj.h>
#include <shellapi.h> #include <shellapi.h>
#include "jni_util.h"
#include "jlong.h" #include "jlong.h"
#include "alloc.h" #include "alloc.h"
#include "stdhdrs.h" #include "stdhdrs.h"
#include "UnicowsLoader.h"
// Copy from shlguid.h which is no longer in PlatformSDK
#ifndef DEFINE_SHLGUID
#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_GUID(name, l, w1, w2, 0xC0, 0, 0, 0, 0, 0, 0, 0x46)
#endif
// {93F2F68C-1D1B-11d3-A30E-00C04F79ABD1} // {93F2F68C-1D1B-11d3-A30E-00C04F79ABD1}
DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3, 0xe, 0x0, 0xc0, 0x4f, 0x79, 0xab, 0xd1); DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3, 0xe, 0x0, 0xc0, 0x4f, 0x79, 0xab, 0xd1);
...@@ -86,13 +96,15 @@ static jfieldID FID_folderType; ...@@ -86,13 +96,15 @@ static jfieldID FID_folderType;
static IMalloc* pMalloc; static IMalloc* pMalloc;
static IShellFolder* pDesktop; static IShellFolder* pDesktop;
static BOOL isXP; // Some macros from awt.h, because it is not included in release
#ifndef IS_WIN2000
// copied from awt.h, because it is not included in release #define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5)
#if defined (WIN32) #endif
#define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6) #ifndef IS_WINXP
#else #define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#define IS_WINVISTA FALSE #endif
#ifndef IS_WINVISTA
#define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6)
#endif #endif
...@@ -103,7 +115,6 @@ static BOOL initShellProcs() ...@@ -103,7 +115,6 @@ static BOOL initShellProcs()
static HMODULE libShell32 = NULL; static HMODULE libShell32 = NULL;
static HMODULE libUser32 = NULL; static HMODULE libUser32 = NULL;
static HMODULE libComCtl32 = NULL; static HMODULE libComCtl32 = NULL;
static HMODULE libUnicows = UnicowsLoader::GetModuleHandle();
// If already initialized, return TRUE // If already initialized, return TRUE
if (libShell32 != NULL && libUser32 != NULL) { if (libShell32 != NULL && libUser32 != NULL) {
return TRUE; return TRUE;
...@@ -130,7 +141,7 @@ static BOOL initShellProcs() ...@@ -130,7 +141,7 @@ static BOOL initShellProcs()
// Set up procs - libShell32 // Set up procs - libShell32
fn_FindExecutable = (FindExecutableType)GetProcAddress( fn_FindExecutable = (FindExecutableType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "FindExecutableW"); libShell32, "FindExecutableW");
if (fn_FindExecutable == NULL) { if (fn_FindExecutable == NULL) {
return FALSE; return FALSE;
} }
...@@ -140,7 +151,7 @@ static BOOL initShellProcs() ...@@ -140,7 +151,7 @@ static BOOL initShellProcs()
return FALSE; return FALSE;
} }
fn_SHGetFileInfo = (SHGetFileInfoType)GetProcAddress( fn_SHGetFileInfo = (SHGetFileInfoType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "SHGetFileInfoW"); libShell32, "SHGetFileInfoW");
if (fn_SHGetFileInfo == NULL) { if (fn_SHGetFileInfo == NULL) {
return FALSE; return FALSE;
} }
...@@ -154,7 +165,7 @@ static BOOL initShellProcs() ...@@ -154,7 +165,7 @@ static BOOL initShellProcs()
return FALSE; return FALSE;
} }
fn_SHGetPathFromIDList = (SHGetPathFromIDListType)GetProcAddress( fn_SHGetPathFromIDList = (SHGetPathFromIDListType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "SHGetPathFromIDListW"); libShell32, "SHGetPathFromIDListW");
if (fn_SHGetPathFromIDList == NULL) { if (fn_SHGetPathFromIDList == NULL) {
return FALSE; return FALSE;
} }
...@@ -181,19 +192,19 @@ static BOOL initShellProcs() ...@@ -181,19 +192,19 @@ static BOOL initShellProcs()
static jstring jstringFromSTRRET(JNIEnv* env, LPITEMIDLIST pidl, STRRET* pStrret) { static jstring jstringFromSTRRET(JNIEnv* env, LPITEMIDLIST pidl, STRRET* pStrret) {
switch (pStrret->uType) { switch (pStrret->uType) {
case STRRET_CSTR : case STRRET_CSTR :
return JNU_NewStringPlatform(env, pStrret->cStr); return JNU_NewStringPlatform(env, reinterpret_cast<const char*>(pStrret->cStr));
case STRRET_OFFSET : case STRRET_OFFSET :
// Note : this may need to be WCHAR instead // Note : this may need to be WCHAR instead
return JNU_NewStringPlatform(env, return JNU_NewStringPlatform(env,
(CHAR*)pidl + pStrret->uOffset); (CHAR*)pidl + pStrret->uOffset);
case STRRET_WSTR : case STRRET_WSTR :
return env->NewString(pStrret->pOleStr, return env->NewString(reinterpret_cast<const jchar*>(pStrret->pOleStr),
static_cast<jsize>(wcslen(pStrret->pOleStr))); static_cast<jsize>(wcslen(pStrret->pOleStr)));
} }
return NULL; return NULL;
} }
// restoring the original definition // restoring the original definition
#define JNU_NewStringPlatform(env, x) env->NewString(x, static_cast<jsize>(_tcslen(x))) #define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast<jchar*>(x), static_cast<jsize>(_tcslen(x)))
/* /*
* Class: sun_awt_shell_Win32ShellFolder2 * Class: sun_awt_shell_Win32ShellFolder2
...@@ -212,13 +223,6 @@ JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initIDs ...@@ -212,13 +223,6 @@ JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initIDs
MID_relativePIDL = env->GetMethodID(cls, "setRelativePIDL", "(J)V"); MID_relativePIDL = env->GetMethodID(cls, "setRelativePIDL", "(J)V");
FID_displayName = env->GetFieldID(cls, "displayName", "Ljava/lang/String;"); FID_displayName = env->GetFieldID(cls, "displayName", "Ljava/lang/String;");
FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;"); FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;");
// Find out if we are on XP or later
long version = GetVersion();
isXP = (!(version & 0x80000000) &&
(LOBYTE(LOWORD(version)) == 5 &&
HIBYTE(LOWORD(version)) >= 1) ||
LOBYTE(LOWORD(version)) > 5);
} }
static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) { static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) {
...@@ -669,7 +673,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation ...@@ -669,7 +673,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation
if (!CoInit(doCoUninit)) { if (!CoInit(doCoUninit)) {
return 0; return 0;
} }
if (IS_NT) {
IShellLinkW* psl; IShellLinkW* psl;
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl); hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl);
if (SUCCEEDED(hres)) { if (SUCCEEDED(hres)) {
...@@ -689,27 +692,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation ...@@ -689,27 +692,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation
} }
psl->Release(); psl->Release();
} }
} else {
IShellLinkA* psl;
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (LPVOID *)&psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres)) {
hres = ppf->Load(wstr, STGM_READ);
if (SUCCEEDED(hres)) {
if (resolve) {
hres = psl->Resolve(NULL, 0);
// Ignore failure
}
pidl = (LPITEMIDLIST)NULL;
hres = psl->GetIDList(&pidl);
}
ppf->Release();
}
psl->Release();
}
}
if (doCoUninit) { if (doCoUninit) {
::CoUninitialize(); ::CoUninitialize();
} }
...@@ -742,10 +724,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_parseDisplayName0 ...@@ -742,10 +724,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_parseDisplayName0
int nLength = env->GetStringLength(jname); int nLength = env->GetStringLength(jname);
jchar* wszPath = new jchar[nLength + 1]; jchar* wszPath = new jchar[nLength + 1];
const jchar* strPath = env->GetStringChars(jname, NULL); const jchar* strPath = env->GetStringChars(jname, NULL);
wcsncpy(wszPath, strPath, nLength); wcsncpy(reinterpret_cast<LPWSTR>(wszPath), reinterpret_cast<LPCWSTR>(strPath), nLength);
wszPath[nLength] = 0; wszPath[nLength] = 0;
HRESULT res = pIShellFolder->ParseDisplayName(NULL, NULL, HRESULT res = pIShellFolder->ParseDisplayName(NULL, NULL,
const_cast<jchar*>(wszPath), NULL, &pIDL, NULL); reinterpret_cast<LPWSTR>(wszPath), NULL, &pIDL, NULL);
if (res != S_OK) { if (res != S_OK) {
JNU_ThrowIOException(env, "Could not parse name"); JNU_ThrowIOException(env, "Could not parse name");
pIDL = 0; pIDL = 0;
...@@ -804,7 +786,7 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getExecutableType ...@@ -804,7 +786,7 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getExecutableType
(JNIEnv* env, jobject folder, jstring path) (JNIEnv* env, jobject folder, jstring path)
{ {
TCHAR szBuf[MAX_PATH]; TCHAR szBuf[MAX_PATH];
LPCTSTR szPath = (LPCTSTR)JNU_GetStringPlatformChars(env, path, NULL); LPCTSTR szPath = JNU_GetStringPlatformChars(env, path, NULL);
if (szPath == NULL) { if (szPath == NULL) {
return NULL; return NULL;
} }
...@@ -827,7 +809,7 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIcon ...@@ -827,7 +809,7 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIcon
{ {
HICON hIcon = NULL; HICON hIcon = NULL;
SHFILEINFO fileInfo; SHFILEINFO fileInfo;
LPCTSTR pathStr = (LPCTSTR)JNU_GetStringPlatformChars(env, absolutePath, NULL); LPCTSTR pathStr = JNU_GetStringPlatformChars(env, absolutePath, NULL);
if (fn_SHGetFileInfo(pathStr, 0L, &fileInfo, sizeof(fileInfo), if (fn_SHGetFileInfo(pathStr, 0L, &fileInfo, sizeof(fileInfo),
SHGFI_ICON | (getLargeIcon ? 0 : SHGFI_SMALLICON)) != 0) { SHGFI_ICON | (getLargeIcon ? 0 : SHGFI_SMALLICON)) != 0) {
hIcon = fileInfo.hIcon; hIcon = fileInfo.hIcon;
...@@ -890,7 +872,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon ...@@ -890,7 +872,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
} }
HRESULT hres; HRESULT hres;
if (IS_NT) {
IExtractIconW* pIcon; IExtractIconW* pIcon;
hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl), hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
IID_IExtractIconW, NULL, (void**)&pIcon); IID_IExtractIconW, NULL, (void**)&pIcon);
...@@ -913,30 +894,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon ...@@ -913,30 +894,6 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
} }
pIcon->Release(); pIcon->Release();
} }
} else {
IExtractIconA* pIcon;
hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
IID_IExtractIconA, NULL, (void**)&pIcon);
if (SUCCEEDED(hres)) {
CHAR szBuf[MAX_PATH];
INT index;
UINT flags;
hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags);
if (SUCCEEDED(hres)) {
HICON hIconLarge;
hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
if (SUCCEEDED(hres)) {
if (getLargeIcon) {
fn_DestroyIcon((HICON)hIcon);
hIcon = hIconLarge;
} else {
fn_DestroyIcon((HICON)hIconLarge);
}
}
}
pIcon->Release();
}
}
if (doCoUninit) { if (doCoUninit) {
::CoUninitialize(); ::CoUninitialize();
} }
...@@ -987,7 +944,7 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits ...@@ -987,7 +944,7 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits
// XP supports alpha in some icons, and depending on device. // XP supports alpha in some icons, and depending on device.
// This should take precedence over the icon mask bits. // This should take precedence over the icon mask bits.
BOOL hasAlpha = FALSE; BOOL hasAlpha = FALSE;
if (isXP) { if (IS_WINXP) {
for (int i = 0; i < nBits; i++) { for (int i = 0; i < nBits; i++) {
if ((colorBits[i] & 0xff000000) != 0) { if ((colorBits[i] & 0xff000000) != 0) {
hasAlpha = TRUE; hasAlpha = TRUE;
...@@ -1127,9 +1084,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource ...@@ -1127,9 +1084,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource
(JNIEnv* env, jclass cls, jstring libName, jint iconID, (JNIEnv* env, jclass cls, jstring libName, jint iconID,
jint cxDesired, jint cyDesired, jboolean useVGAColors) jint cxDesired, jint cyDesired, jboolean useVGAColors)
{ {
HINSTANCE libHandle = LoadLibrary(env->GetStringChars(libName, NULL)); HINSTANCE libHandle = LoadLibrary(JNU_GetStringPlatformChars(env, libName, NULL));
if (libHandle != NULL) { if (libHandle != NULL) {
UINT fuLoad = (useVGAColors && !isXP) ? LR_VGACOLOR : 0; UINT fuLoad = (useVGAColors && !IS_WINXP) ? LR_VGACOLOR : 0;
return ptr_to_jlong(LoadImage(libHandle, MAKEINTRESOURCE(iconID), return ptr_to_jlong(LoadImage(libHandle, MAKEINTRESOURCE(iconID),
IMAGE_ICON, cxDesired, cyDesired, IMAGE_ICON, cxDesired, cyDesired,
fuLoad)); fuLoad));
......
/*
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include <float.h>
#include "alloc.h"
#include "UnicowsLoader.h"
/*
* Support functions for the Microsoft Layer for Unicode (MSLU).
*
* The MSLU maps the wide char version of Windows APIs with strings
* to their ANSI version equivalent on Win98/ME platforms.
*
* For more details on the MSLU, please refer to the MSDN webpage at:
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mslu/winprog/microsoft_layer_for_unicode_on_windows_95_98_me_systems.asp
*/
// The MSLU module handle. Only initialized on Win9x/ME.
HMODULE UnicowsLoader::hmodUnicows = NULL;
// MSLU loader entry point, which is called when the module
// is initialized.
extern "C" HMODULE (__stdcall *_PfnLoadUnicows)(void) =
&UnicowsLoader::LoadUnicows;
// Overriede APIs that are not supported by MSLU.
extern "C" FARPROC Unicows_GetPrinterW =
(FARPROC)&UnicowsLoader::GetPrinterWImpl;
extern "C" FARPROC Unicows_EnumPrintersW =
(FARPROC)&UnicowsLoader::EnumPrintersWImpl;
HMODULE __stdcall UnicowsLoader::LoadUnicows(void)
{
if (hmodUnicows != NULL) {
return hmodUnicows;
}
// Unfortunately, some DLLs that are loaded in conjunction with
// unicows.dll may blow the FPU's control word. So save it here.
unsigned int fpu_cw = _CW_DEFAULT;
fpu_cw = _control87(0, 0);
// Loads the DLL, assuming that the DLL resides in the same directory
// as the AWT(_G).DLL. We cannot use "sun.boot.library.path" system
// property since there is no way to issue JNI calls at this point
// (JNI_OnLoad is not yet called so it cannot obtain JavaVM structure)
//
// To obtain the AWT module handle, call GetModuleHandleA() directly,
// instead of AwtToolkit.GetModuleHandle(). Otherwise it could cause
// an infinite loop if some W call were made inside AwtToolkit class
// initialization.
HMODULE hmodAWT = GetModuleHandleA("awt");
LPSTR abspath = (LPSTR)safe_Malloc(MAX_PATH);
if (abspath != NULL) {
GetModuleFileNameA(hmodAWT, abspath, MAX_PATH);
*strrchr(abspath, '\\') = '\0';
strcat(abspath, "\\unicows.dll");
hmodUnicows = LoadLibraryA(abspath);
free(abspath);
}
// Restore the FPU control word if needed.
if ( _control87(0, 0) != fpu_cw) {
_control87(fpu_cw, 0xfffff);
}
return hmodUnicows;
}
HMODULE UnicowsLoader::GetModuleHandle(void)
{
return hmodUnicows;
}
// Convenient functions to convert DEVMODEA -> DEVMODEW
void UnicowsLoader::DevModeA2DevModeW(
const DEVMODEA * dma,
DEVMODEW * dmw)
{
// convert string portions
::MultiByteToWideChar(CP_ACP, 0, (CHAR *)dma->dmDeviceName, CCHDEVICENAME,
dmw->dmDeviceName, CCHDEVICENAME);
::MultiByteToWideChar(CP_ACP, 0, (CHAR *)dma->dmFormName, CCHDEVICENAME,
dmw->dmFormName, CCHDEVICENAME);
// copy driver specific data if exists
if (dma->dmDriverExtra != 0) {
PBYTE pExtraA = (PBYTE)(dma + 1);
PBYTE pExtraW = (PBYTE)(dmw + 1);
memcpy(pExtraW, pExtraA, dma->dmDriverExtra);
}
// copy normal struct members
dmw->dmSpecVersion = dma->dmSpecVersion;
dmw->dmDriverVersion = dma->dmDriverVersion;
dmw->dmSize = dma->dmSize;
dmw->dmDriverExtra = dma->dmDriverExtra;
dmw->dmFields = dma->dmFields;
dmw->dmPosition = dma->dmPosition;
dmw->dmScale = dma->dmScale;
dmw->dmCopies = dma->dmCopies;
dmw->dmDefaultSource = dma->dmDefaultSource;
dmw->dmPrintQuality = dma->dmPrintQuality;
dmw->dmColor = dma->dmColor;
dmw->dmDuplex = dma->dmDuplex;
dmw->dmYResolution = dma->dmYResolution;
dmw->dmTTOption = dma->dmTTOption;
dmw->dmCollate = dma->dmCollate;
dmw->dmLogPixels = dma->dmLogPixels;
dmw->dmBitsPerPel = dma->dmBitsPerPel;
dmw->dmPelsWidth = dma->dmPelsWidth;
dmw->dmPelsHeight = dma->dmPelsHeight;
dmw->dmDisplayFlags = dma->dmDisplayFlags;
dmw->dmDisplayFrequency = dma->dmDisplayFrequency;
#if(WINVER >= 0x0400)
dmw->dmICMMethod = dma->dmICMMethod;
dmw->dmICMIntent = dma->dmICMIntent;
dmw->dmMediaType = dma->dmMediaType;
dmw->dmDitherType = dma->dmDitherType;
dmw->dmReserved1 = dma->dmReserved1;
dmw->dmReserved2 = dma->dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
dmw->dmPanningWidth = dma->dmPanningWidth;
dmw->dmPanningHeight = dma->dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
}
// PRINTER_INFO_1 struct converter
void UnicowsLoader::PrinterInfo1A2W(
const LPPRINTER_INFO_1A pi1A,
LPPRINTER_INFO_1W pi1W,
const DWORD num)
{
LPWSTR pwstrbuf = (LPWSTR)(pi1W + num);
DWORD current;
// loop through all structures
for (current = 0; current < num; current ++) {
LPPRINTER_INFO_1A curPi1A = pi1A + current;
LPPRINTER_INFO_1W curPi1W = pi1W + current;
// copy the structure itself
memcpy(curPi1W, curPi1A, sizeof(_PRINTER_INFO_1W));
// copy string members
StringA2W(curPi1A->pDescription, &(curPi1W->pDescription), &pwstrbuf);
StringA2W(curPi1A->pName, &(curPi1W->pName), &pwstrbuf);
StringA2W(curPi1A->pComment, &(curPi1W->pComment), &pwstrbuf);
}
}
// PRINTER_INFO_2 struct converter
void UnicowsLoader::PrinterInfo2A2W(
const LPPRINTER_INFO_2A pi2A,
LPPRINTER_INFO_2W pi2W,
const DWORD num)
{
PBYTE pbytebuf = (PBYTE)(pi2W + num);
DWORD current;
// loop through all structures
for (current = 0; current < num; current ++) {
LPPRINTER_INFO_2A curPi2A = pi2A + current;
LPPRINTER_INFO_2W curPi2W = pi2W + current;
// copy the structure itself
memcpy(curPi2W, curPi2A, sizeof(_PRINTER_INFO_2W));
// copy string members
StringA2W(curPi2A->pServerName, &(curPi2W->pServerName), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pPrinterName, &(curPi2W->pPrinterName), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pShareName, &(curPi2W->pShareName), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pPortName, &(curPi2W->pPortName), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pDriverName, &(curPi2W->pDriverName), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pComment, &(curPi2W->pComment), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pLocation, &(curPi2W->pLocation), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pSepFile, &(curPi2W->pSepFile), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pPrintProcessor, &(curPi2W->pPrintProcessor), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pDatatype, &(curPi2W->pDatatype), (LPWSTR *)&pbytebuf);
StringA2W(curPi2A->pParameters, &(curPi2W->pParameters), (LPWSTR *)&pbytebuf);
// copy DEVMODE structure
if (curPi2A->pDevMode != NULL) {
curPi2W->pDevMode = (LPDEVMODEW)pbytebuf;
DevModeA2DevModeW(curPi2A->pDevMode, curPi2W->pDevMode);
pbytebuf += sizeof(DEVMODEW) + curPi2A->pDevMode->dmDriverExtra;
}
}
}
// PRINTER_INFO_5 struct converter
void UnicowsLoader::PrinterInfo5A2W(
const LPPRINTER_INFO_5A pi5A,
LPPRINTER_INFO_5W pi5W,
const DWORD num)
{
LPWSTR pbuf = (LPWSTR)(pi5W + num);
DWORD current;
// loop through all structures
for (current = 0; current < num; current ++) {
LPPRINTER_INFO_5A curPi5A = pi5A + current;
LPPRINTER_INFO_5W curPi5W = pi5W + current;
// copy the structure itself
memcpy(curPi5W, curPi5A, sizeof(_PRINTER_INFO_5W));
// copy string members
StringA2W(curPi5A->pPrinterName, &(curPi5W->pPrinterName), &pbuf);
StringA2W(curPi5A->pPortName, &(curPi5W->pPortName), &pbuf);
}
}
// PRINTER_INFO_* struct converter. Supported levels are 1, 2, and 5.
void UnicowsLoader::PrinterInfoA2W(
const PVOID piA,
PVOID piW,
const DWORD Level,
const DWORD num)
{
switch (Level) {
case 1:
PrinterInfo1A2W((LPPRINTER_INFO_1A)piA, (LPPRINTER_INFO_1W)piW, num);
break;
case 2:
PrinterInfo2A2W((LPPRINTER_INFO_2A)piA, (LPPRINTER_INFO_2W)piW, num);
break;
case 5:
PrinterInfo5A2W((LPPRINTER_INFO_5A)piA, (LPPRINTER_INFO_5W)piW, num);
break;
}
}
// converts string members in PRINTER_INFO_* struct.
void UnicowsLoader::StringA2W(
LPCSTR pSrcA,
LPWSTR * ppwstrDest,
LPWSTR * ppwstrbuf)
{
if (pSrcA != NULL) {
DWORD cchWideChar = ::MultiByteToWideChar(CP_ACP, 0, pSrcA, -1, NULL, 0);
*ppwstrDest = *ppwstrbuf;
::MultiByteToWideChar(CP_ACP, 0, pSrcA, -1, *ppwstrbuf, cchWideChar);
*ppwstrbuf += cchWideChar;
} else {
*ppwstrDest = NULL;
}
}
// GetPrinterW implementation. Level 1, 2, and 5 are the only supported levels.
BOOL __stdcall UnicowsLoader::GetPrinterWImpl(
HANDLE hPrinter,
DWORD Level,
LPBYTE pPrinter,
DWORD cbBuf,
LPDWORD pcbNeeded)
{
if ((Level != 1) && (Level != 2) && (Level != 5)) {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
DWORD cbBufA = (cbBuf != 0 ? cbBuf / 2 : 0); // dirty estimation...
LPBYTE pPrinterA = NULL;
DWORD cbNeededA = 0;
BOOL ret;
if (cbBufA != 0) {
pPrinterA = (LPBYTE)safe_Malloc(cbBufA);
memset(pPrinterA, 0, cbBufA);
}
ret = ::GetPrinterA(hPrinter, Level, pPrinterA, cbBufA, &cbNeededA);
*pcbNeeded = cbNeededA * 2; // dirty estimation...
if (pPrinterA != NULL) {
if (ret) {
PrinterInfoA2W(pPrinterA, pPrinter, Level, 1);
}
free(pPrinterA);
}
return ret;
}
// EnumPrintersW implementation. Level 1, 2, and 5 are the only supported levels.
BOOL __stdcall UnicowsLoader::EnumPrintersWImpl(
DWORD Flags,
LPWSTR Name,
DWORD Level,
LPBYTE pPrinterEnum,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned)
{
if ((Level != 1) && (Level != 2) && (Level != 5)) {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
LPSTR pNameA = NULL;
DWORD cbBufA = (cbBuf != 0 ? cbBuf / 2 : 0); // dirty estimation...
LPBYTE pPrinterEnumA = NULL;
DWORD cbNeededA = 0;
BOOL ret;
if (Name != NULL) {
DWORD len = static_cast<DWORD>(wcslen(Name)) + 1;
pNameA = (LPSTR)safe_Malloc(len);
::WideCharToMultiByte(CP_ACP, 0, Name, -1, pNameA, len, NULL, NULL);
}
if (cbBufA != 0) {
pPrinterEnumA = (LPBYTE)safe_Malloc(cbBufA);
memset(pPrinterEnumA, 0, cbBufA);
}
ret = ::EnumPrintersA(Flags, pNameA, Level, pPrinterEnumA,
cbBufA, &cbNeededA, pcReturned);
*pcbNeeded = cbNeededA * 2; // dirty estimation...
if (pPrinterEnumA != NULL) {
if (ret) {
PrinterInfoA2W(pPrinterEnumA, pPrinterEnum, Level, *pcReturned);
}
free(pPrinterEnumA);
}
if (pNameA != NULL) {
free(pNameA);
}
return ret;
}
// wchar CRT implementations that VC6 does not support on Win9x.
// These implementations are used on both Win9x/ME *and* WinNT/2K/XP.
#undef _waccess
#undef _wchmod
#undef _wfullpath
#undef _wremove
#undef _wrename
#undef _wstat
#undef _wstati64
#undef _wstat64
#undef _wunlink
#undef _wfopen
#undef _wfreopen
#undef _wfsopen
#undef _wcreat
#undef _wopen
#undef _wsopen
#undef _wfindfirst
#undef _wfindfirst64
#undef _wfindnext
#undef _wfindnext64
#undef _wsystem
#undef _wexcel
#undef _wexcele
#undef _wexelp
#undef _wexelpe
#undef _wexecv
#undef _wexecve
#undef _wexecvp
#undef _wexecvpe
#undef _wpopen
#undef _wputenv
#undef _wspawnl
#undef _wspawnle
#undef _wspawnlp
#undef _wspawnlpe
#undef _wspawnv
#undef _wspawnve
#undef _wspawnvp
#undef _wspawnvpe
// _wfullpath implementation
wchar_t * __cdecl UnicowsLoader::_wfullpathImpl(
wchar_t * absPath,
const wchar_t * relPath,
size_t maxLength)
{
if (IS_NT) {
return _wfullpath(absPath, relPath, maxLength);
} else {
wchar_t * ret = NULL;
char * absPathA = (char *)safe_Malloc(maxLength);
char * relPathA = (char *)safe_Malloc(maxLength);
::WideCharToMultiByte(CP_ACP, 0, relPath, -1, relPathA,
static_cast<DWORD>(maxLength), NULL, NULL);
char * retA = _fullpath(absPathA, relPathA, maxLength);
if (retA != NULL) {
::MultiByteToWideChar(CP_ACP, 0, absPathA, -1,
absPath, static_cast<DWORD>(maxLength));
ret = absPath;
}
free(absPathA);
free(relPathA);
return ret;
}
}
/*
* Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#ifndef UNICOWSLOADER_H
#define UNICOWSLOADER_H
#if !defined(UNICODE) || !defined(_UNICODE)
#error UnicowsLoader module needs UNICODE and _UNICODE flags to be set on compiling
#endif
#include <winspool.h>
// A class to load the Microsoft Layer for Unicode (unicows.dll)
class UnicowsLoader {
public:
// this is called when the client DLL (this case, AWT) is loaded
static HMODULE __stdcall LoadUnicows(void);
// this is provided to pass the MSLU module handle
static HMODULE GetModuleHandle(void);
// member functions that implements functions that MSLU does not support
static BOOL __stdcall GetPrinterWImpl(HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
static BOOL __stdcall EnumPrintersWImpl(DWORD, LPWSTR, DWORD, LPBYTE,
DWORD, LPDWORD, LPDWORD);
// member functions that implements functions that VC6 CRT does not support
// on Win9x
static wchar_t * __cdecl _wfullpathImpl(wchar_t *, const wchar_t *, size_t);
private:
// The module handle
static HMODULE hmodUnicows;
// utility member functions
static void DevModeA2DevModeW(const DEVMODEA *, DEVMODEW *);
static void PrinterInfo1A2W(const LPPRINTER_INFO_1A, LPPRINTER_INFO_1W, const DWORD);
static void PrinterInfo2A2W(const LPPRINTER_INFO_2A, LPPRINTER_INFO_2W, const DWORD);
static void PrinterInfo5A2W(const LPPRINTER_INFO_5A, LPPRINTER_INFO_5W, const DWORD);
static void PrinterInfoA2W(const PVOID, PVOID, DWORD, DWORD);
static void StringA2W(LPCSTR, LPWSTR *, LPWSTR *);
};
#ifndef AWT_H
// copied from awt.h
#if defined (WIN32)
#define IS_WIN32 TRUE
#else
#define IS_WIN32 FALSE
#endif
#define IS_NT (IS_WIN32 && !(::GetVersion() & 0x80000000))
#endif // AWT_H
// Now the platform encoding is Unicode (UTF-16), re-define JNU_ functions
// to proper JNI functions.
#define JNU_NewStringPlatform(env, x) env->NewString(x, static_cast<jsize>(_tcslen(x)))
#define JNU_GetStringPlatformChars(env, x, y) (LPWSTR)env->GetStringChars(x, y)
#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, y)
// The following Windows W-APIs are not supported by the MSLU.
// You need to implement a stub to use these APIs. Or, if it is
// apparent that the API is used only on WindowsNT/2K/XP, wrap
// the call site with #undef - #define, e.g:
//
// #undef SomeFunctionW
// call SomeFunctionW
// #define SomeFunctionW NotSupportedByMSLU
#define AcquireCredentialsHandleW NotSupportedByMSLU
#define CreateNamedPipeW NotSupportedByMSLU
#define CryptAcquireContextW NotSupportedByMSLU
#define CryptEnumProvidersW NotSupportedByMSLU
#define CryptEnumProviderTypesW NotSupportedByMSLU
#define CryptGetDefaultProviderW NotSupportedByMSLU
#define CryptSetProviderW NotSupportedByMSLU
#define CryptSetProviderExW NotSupportedByMSLU
#define CryptSignHashW NotSupportedByMSLU
#define CryptVerifySignatureW NotSupportedByMSLU
#define EnumerateSecurityPackagesW NotSupportedByMSLU
#define EnumMonitorsW NotSupportedByMSLU
#define EnumPortsW NotSupportedByMSLU
#define EnumPrinterDriversW NotSupportedByMSLU
//#define EnumPrintersW NotSupportedByMSLU
#define EnumPrintProcessorDatatypesW NotSupportedByMSLU
#define EnumPrintProcessorsW NotSupportedByMSLU
#define FreeContextBufferW NotSupportedByMSLU
#define GetCharABCWidthsFloatW NotSupportedByMSLU
#define GetJobW NotSupportedByMSLU
#define GetOpenFileNamePreviewW NotSupportedByMSLU
//#define GetPrinterW NotSupportedByMSLU
#define GetPrinterDataW NotSupportedByMSLU
#define GetPrinterDriverW NotSupportedByMSLU
#define GetSaveFileNamePreviewW NotSupportedByMSLU
#define InitializeSecurityContextW NotSupportedByMSLU
#define mciSendCommandW NotSupportedByMSLU
#define mixerGetControlDetailsW NotSupportedByMSLU
#define mixerGetLineControlsW NotSupportedByMSLU
#define mixerGetLineInfoW NotSupportedByMSLU
#define mmioInstallIOProcW NotSupportedByMSLU
#define OleUIChangeSourceW NotSupportedByMSLU
#define OleUIConvertW NotSupportedByMSLU
#define OleUIEditLinksW NotSupportedByMSLU
#define OleUIInsertObjectW NotSupportedByMSLU
#define OleUIObjectPropertiesW NotSupportedByMSLU
#define OleUIPasteSpecialW NotSupportedByMSLU
#define OleUIPromptUserW NotSupportedByMSLU
#define OleUIUpdateLinksW NotSupportedByMSLU
#define PolyTextOutW NotSupportedByMSLU
#define QueryContextAttributesW NotSupportedByMSLU
#define QueryCredentialsAttributesW NotSupportedByMSLU
#define QuerySecurityPackageInfoW NotSupportedByMSLU
#define RasDeleteSubEntryW NotSupportedByMSLU
#define RasSetSubEntryPropertiesW NotSupportedByMSLU
#define ResetPrinterW NotSupportedByMSLU
// The following Shell COM interfaces are not supported by the MSLU.
// See ShellFolder2.cpp
#define IID_IFileViewerW NotSupportedByMSLU
#define IID_IShellLinkW NotSupportedByMSLU
#define IID_IExtractIconW NotSupportedByMSLU
#define IID_IShellCopyHookW NotSupportedByMSLU
#define IID_IShellExecuteHookW NotSupportedByMSLU
#define IID_INewShortcutHookW NotSupportedByMSLU
// The following CRT functions should fail on compiling, as it does not work on
// Win9x/ME platform. If you need these CRTs, write a wrapper for ANSI version
// equivalents, in which it converts to/from Unicode using WideCharToMultiByte.
//
// Or, if it is apparent that the function is used only on WindowsNT/2K/XP, wrap
// the call site with #undef - #define, e.g:
//
// #undef _wsomefunc
// call _wsomefunc
// #define _wsomefunc NotSupportedOnWin9X
#define _waccess NotSupportedOnWin9X
#define _wchmod NotSupportedOnWin9X
#define _wfullpath UnicowsLoader::_wfullpathImpl
#define _wremove NotSupportedOnWin9X
#define _wrename NotSupportedOnWin9X
#define _wstat NotSupportedOnWin9X
#define _wstati64 NotSupportedOnWin9X
#define _wstat64 NotSupportedOnWin9X
#define _wunlink NotSupportedOnWin9X
#define _wfopen NotSupportedOnWin9X
#define _wfreopen NotSupportedOnWin9X
#define _wfsopen NotSupportedOnWin9X
#define _wcreat NotSupportedOnWin9X
#define _wopen NotSupportedOnWin9X
#define _wsopen NotSupportedOnWin9X
#define _wfindfirst NotSupportedOnWin9X
#define _wfindfirst64 NotSupportedOnWin9X
#define _wfindnext NotSupportedOnWin9X
#define _wfindnext64 NotSupportedOnWin9X
#define _wsystem NotSupportedOnWin9X
#define _wexcel NotSupportedOnWin9X
#define _wexcele NotSupportedOnWin9X
#define _wexelp NotSupportedOnWin9X
#define _wexelpe NotSupportedOnWin9X
#define _wexecv NotSupportedOnWin9X
#define _wexecve NotSupportedOnWin9X
#define _wexecvp NotSupportedOnWin9X
#define _wexecvpe NotSupportedOnWin9X
#define _wpopen NotSupportedOnWin9X
#define _wputenv NotSupportedOnWin9X
#define _wspawnl NotSupportedOnWin9X
#define _wspawnle NotSupportedOnWin9X
#define _wspawnlp NotSupportedOnWin9X
#define _wspawnlpe NotSupportedOnWin9X
#define _wspawnv NotSupportedOnWin9X
#define _wspawnve NotSupportedOnWin9X
#define _wspawnvp NotSupportedOnWin9X
#define _wspawnvpe NotSupportedOnWin9X
#endif // UNICOWSLOADER_H
/* /*
* Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,14 +23,14 @@ ...@@ -23,14 +23,14 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "stdhdrs.h" #include "stdhdrs.h"
#include <commdlg.h> #include <commdlg.h>
#include <winspool.h> #include <winspool.h>
#include <limits.h> #include <limits.h>
#include <float.h> #include <float.h>
#include "awt.h"
#include "awt_dlls.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_PrintControl.h" #include "awt_PrintControl.h"
...@@ -74,7 +74,6 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env, ...@@ -74,7 +74,6 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
TRY; TRY;
TCHAR cBuffer[250]; TCHAR cBuffer[250];
BOOL bFlag;
OSVERSIONINFO osv; OSVERSIONINFO osv;
PRINTER_INFO_2 *ppi2 = NULL; PRINTER_INFO_2 *ppi2 = NULL;
DWORD dwNeeded = 0; DWORD dwNeeded = 0;
...@@ -86,39 +85,8 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env, ...@@ -86,39 +85,8 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osv); GetVersionEx(&osv);
// If Windows 95 or 98, use EnumPrinters... // If Windows 2000, XP, Vista
if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// The first EnumPrinters() tells you how big our buffer should
// be in order to hold ALL of PRINTER_INFO_2. Note that this will
// usually return FALSE. This only means that the buffer (the 4th
// parameter) was not filled in. You don't want it filled in here...
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2,
NULL, 0, &dwNeeded, &dwReturned);
if (dwNeeded == 0) {
return NULL;
}
// Allocate enough space for PRINTER_INFO_2...
ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (!ppi2) {
return NULL;
}
// The second EnumPrinters() will fill in all the current information.
bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2,
(LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned);
if (!bFlag) {
GlobalFree(ppi2);
return NULL;
}
jPrinterName = JNU_NewStringPlatform(env, ppi2->pPrinterName);
GlobalFree(ppi2);
return jPrinterName;
} else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// Retrieve the default string from Win.ini (the registry). // Retrieve the default string from Win.ini (the registry).
// String will be in form "printername,drivername,portname". // String will be in form "printername,drivername,portname".
...@@ -165,7 +133,6 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env, ...@@ -165,7 +133,6 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
jobjectArray nameArray; jobjectArray nameArray;
try { try {
if (IS_NT) {
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, NULL, 0, &cbNeeded, &cReturned); NULL, 4, NULL, 0, &cbNeeded, &cReturned);
pPrinterEnum = new BYTE[cbNeeded]; pPrinterEnum = new BYTE[cbNeeded];
...@@ -193,35 +160,6 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env, ...@@ -193,35 +160,6 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
env->SetObjectArrayElement(nameArray, i, utf_str); env->SetObjectArrayElement(nameArray, i, utf_str);
env->DeleteLocalRef(utf_str); env->DeleteLocalRef(utf_str);
} }
} else {
::EnumPrinters(PRINTER_ENUM_LOCAL,
NULL, 5, NULL, 0, &cbNeeded, &cReturned);
pPrinterEnum = new BYTE[cbNeeded];
::EnumPrinters(PRINTER_ENUM_LOCAL,
NULL, 5, pPrinterEnum, cbNeeded, &cbNeeded,
&cReturned);
if (cReturned > 0) {
nameArray = env->NewObjectArray(cReturned, clazz, NULL);
if (nameArray == NULL) {
throw std::bad_alloc();
}
} else {
nameArray = NULL;
}
for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_5));
utf_str = JNU_NewStringPlatform(env, info5->pPrinterName);
if (utf_str == NULL) {
throw std::bad_alloc();
}
env->SetObjectArrayElement(nameArray, i, utf_str);
env->DeleteLocalRef(utf_str);
}
}
} catch (std::bad_alloc&) { } catch (std::bad_alloc&) {
delete [] pPrinterEnum; delete [] pPrinterEnum;
throw; throw;
...@@ -872,7 +810,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, ...@@ -872,7 +810,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
int numSizes = ::DeviceCapabilities(printerName, printerPort, int numSizes = ::DeviceCapabilities(printerName, printerPort,
DC_PAPERS, NULL, NULL); DC_PAPERS, NULL, NULL);
if (numSizes > 0) { if (numSizes > 0) {
LPWORD papers = (LPWORD)safe_Malloc(numSizes * sizeof(WORD)); LPTSTR papers = (LPTSTR)safe_Malloc(numSizes * sizeof(WORD));
if (papers != NULL && if (papers != NULL &&
::DeviceCapabilities(printerName, printerPort, ::DeviceCapabilities(printerName, printerPort,
DC_PAPERS, papers, NULL) != -1) { DC_PAPERS, papers, NULL) != -1) {
......
...@@ -26,10 +26,21 @@ ...@@ -26,10 +26,21 @@
#ifndef _AWT_H_ #ifndef _AWT_H_
#define _AWT_H_ #define _AWT_H_
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
#ifndef _WIN32_IE
#define _WIN32_IE 0x0600
#endif
//#ifndef NTDDI_VERSION
//#define NTDDI_VERSION NTDDI_LONGHORN
//#endif
#include "stdhdrs.h" #include "stdhdrs.h"
#include "alloc.h" #include "alloc.h"
#include "awt_Debug.h" #include "awt_Debug.h"
#include "UnicowsLoader.h"
extern COLORREF DesktopColor2RGB(int colorIndex); extern COLORREF DesktopColor2RGB(int colorIndex);
...@@ -129,40 +140,23 @@ typedef AwtObject* PDATA; ...@@ -129,40 +140,23 @@ typedef AwtObject* PDATA;
/* /NEW JNI */ /* /NEW JNI */
/* /*
* IS_NT returns TRUE on NT, 2000, XP
* IS_WIN2000 returns TRUE on 2000, XP
* IS_WINXP returns TRUE on XP
* IS_WIN95 returns TRUE on 95, 98, ME
* IS_WIN98 returns TRUE on 98, ME
* IS_WINME returns TRUE on ME
* IS_WIN32 returns TRUE on 32-bit Pentium and
* 64-bit Itanium.
* IS_WIN64 returns TRUE on 64-bit Itanium * IS_WIN64 returns TRUE on 64-bit Itanium
*
* uname -s returns Windows_95 on 95
* uname -s returns Windows_98 on 98 and ME
* uname -s returns Windows_NT on NT and 2000 and XP
*/ */
#if defined (WIN32)
#define IS_WIN32 TRUE
#else
#define IS_WIN32 FALSE
#endif
#if defined (_WIN64) #if defined (_WIN64)
#define IS_WIN64 TRUE #define IS_WIN64 TRUE
#else #else
#define IS_WIN64 FALSE #define IS_WIN64 FALSE
#endif #endif
#define IS_NT (IS_WIN32 && !(::GetVersion() & 0x80000000))
#define IS_WIN2000 (IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 5) /*
#define IS_WIN2003 (IS_NT && LOBYTE(LOWORD(::GetVersion())) == 5 && HIBYTE(LOWORD(::GetVersion())) >= 2) * IS_WIN2000 returns TRUE on 2000, XP and Vista
#define IS_WINXP (IS_NT && (IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5) * IS_WINXP returns TRUE on XP and Vista
#define IS_WINVISTA (IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 6) * IS_WINVISTA returns TRUE on Vista
#define IS_WIN32S (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) < 4) */
#define IS_WIN95 (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 4) #define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5)
#define IS_WIN98 (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 10) #define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#define IS_WINME (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 90) #define IS_WINVISTA (LOBYTE(LOWORD(::GetVersion())) >= 6)
#define IS_WIN4X (IS_WIN32 && LOBYTE(::GetVersion()) >= 4)
#define IS_WINVER_ATLEAST(maj, min) \ #define IS_WINVER_ATLEAST(maj, min) \
((maj) < LOBYTE(LOWORD(::GetVersion())) || \ ((maj) < LOBYTE(LOWORD(::GetVersion())) || \
(maj) == LOBYTE(LOWORD(::GetVersion())) && \ (maj) == LOBYTE(LOWORD(::GetVersion())) && \
...@@ -177,6 +171,12 @@ typedef AwtObject* PDATA; ...@@ -177,6 +171,12 @@ typedef AwtObject* PDATA;
extern JavaVM *jvm; extern JavaVM *jvm;
// Platform encoding is Unicode (UTF-16), re-define JNU_ functions
// to proper JNI functions.
#define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast<jchar*>(x), static_cast<jsize>(_tcslen(x)))
#define JNU_GetStringPlatformChars(env, x, y) reinterpret_cast<LPCWSTR>(env->GetStringChars(x, y))
#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, reinterpret_cast<const jchar*>(y))
/* /*
* Itanium symbols needed for 64-bit compilation. * Itanium symbols needed for 64-bit compilation.
* These are defined in winuser.h in the August 2001 MSDN update. * These are defined in winuser.h in the August 2001 MSDN update.
...@@ -211,16 +211,11 @@ extern JavaVM *jvm; ...@@ -211,16 +211,11 @@ extern JavaVM *jvm;
* NOTE: float.h must be defined if using these macros * NOTE: float.h must be defined if using these macros
*/ */
#define SAVE_CONTROLWORD \ #define SAVE_CONTROLWORD \
unsigned int fpu_cw = _CW_DEFAULT; \ unsigned int fpu_cw = _control87(0, 0);
if (IS_WIN95) { \
fpu_cw = _control87(0, 0); \
}
#define RESTORE_CONTROLWORD \ #define RESTORE_CONTROLWORD \
if (IS_WIN95) { \ if (_control87(0, 0) != fpu_cw) { \
if ( _control87(0, 0) != fpu_cw) { \ _control87(fpu_cw, 0xffffffff); \
_control87(fpu_cw, 0xfffff); \
} \
} }
/* /*
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* have any questions. * have any questions.
*/ */
#include <jni.h> #include "awt.h"
#include "awt_Object.h" /* wop_pDataID */ #include "awt_Object.h" /* wop_pDataID */
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
...@@ -106,7 +106,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent) ...@@ -106,7 +106,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent)
if (label == NULL) { if (label == NULL) {
labelStr = L""; labelStr = L"";
} else { } else {
labelStr = env->GetStringChars(label, JNI_FALSE); labelStr = JNU_GetStringPlatformChars(env, label, JNI_FALSE);
} }
style = 0; style = 0;
...@@ -128,7 +128,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent) ...@@ -128,7 +128,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent)
c->m_backgroundColorSet = TRUE; // suppress inheriting parent's color c->m_backgroundColorSet = TRUE; // suppress inheriting parent's color
c->UpdateBackground(env, target); c->UpdateBackground(env, target);
if (label != NULL) if (label != NULL)
env->ReleaseStringChars(label, labelStr); JNU_ReleaseStringPlatformChars(env, label, labelStr);
} catch (...) { } catch (...) {
env->DeleteLocalRef(target); env->DeleteLocalRef(target);
if (label != NULL) if (label != NULL)
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Checkbox.h" #include "awt_Checkbox.h"
#include "awt_KeyboardFocusManager.h" #include "awt_KeyboardFocusManager.h"
...@@ -106,7 +107,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent) ...@@ -106,7 +107,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID); label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
if (label != NULL) { if (label != NULL) {
labelStr = env->GetStringChars(label, 0); labelStr = JNU_GetStringPlatformChars(env, label, 0);
} }
if (labelStr != 0) { if (labelStr != 0) {
jint x = env->GetIntField(target, AwtComponent::xID); jint x = env->GetIntField(target, AwtComponent::xID);
...@@ -123,7 +124,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent) ...@@ -123,7 +124,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
peer); peer);
if (labelStr != defaultLabelStr) { if (labelStr != defaultLabelStr) {
env->ReleaseStringChars(label, labelStr); JNU_ReleaseStringPlatformChars(env, label, labelStr);
} }
} else { } else {
throw std::bad_alloc(); throw std::bad_alloc();
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -206,7 +206,7 @@ int AwtChoice::GetFieldHeight() ...@@ -206,7 +206,7 @@ int AwtChoice::GetFieldHeight()
fieldHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)-1, 0); fieldHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)-1, 0);
// add top and bottom border lines; border size is different for // add top and bottom border lines; border size is different for
// Win 4.x (3d edge) vs 3.x (1 pixel line) // Win 4.x (3d edge) vs 3.x (1 pixel line)
borderHeight = ::GetSystemMetrics(IS_WIN4X ? SM_CYEDGE : SM_CYBORDER); borderHeight = ::GetSystemMetrics(SM_CYEDGE);
fieldHeight += borderHeight*2; fieldHeight += borderHeight*2;
return fieldHeight; return fieldHeight;
} }
...@@ -424,6 +424,9 @@ AwtChoice::WmKillFocus(HWND hWndGotFocus) ...@@ -424,6 +424,9 @@ AwtChoice::WmKillFocus(HWND hWndGotFocus)
case mrPassAlong: case mrPassAlong:
return AwtComponent::WmKillFocus(hWndGotFocus); return AwtComponent::WmKillFocus(hWndGotFocus);
} }
DASSERT(false); // must never reach here
return mrDoDefault;
} }
MsgRouting MsgRouting
......
/* /*
* Copyright 1996-1999 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -97,7 +97,7 @@ Java_sun_awt_windows_WColor_getDefaultColor(JNIEnv *env, jclass cls, ...@@ -97,7 +97,7 @@ Java_sun_awt_windows_WColor_getDefaultColor(JNIEnv *env, jclass cls,
iColor = COLOR_MENUTEXT; iColor = COLOR_MENUTEXT;
break; break;
case sun_awt_windows_WColor_BUTTON_BKGND: case sun_awt_windows_WColor_BUTTON_BKGND:
iColor = (IS_NT) ? COLOR_BTNFACE : COLOR_3DFACE; iColor = COLOR_BTNFACE;
break; break;
case sun_awt_windows_WColor_BUTTON_TEXT: case sun_awt_windows_WColor_BUTTON_TEXT:
iColor = COLOR_BTNTEXT; iColor = COLOR_BTNTEXT;
......
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
* have any questions. * have any questions.
*/ */
#include "windows.h" #include "awt.h"
#include <windowsx.h> #include <windowsx.h>
#include <zmouse.h> #include <zmouse.h>
...@@ -42,7 +43,6 @@ ...@@ -42,7 +43,6 @@
#include "awt_MouseEvent.h" #include "awt_MouseEvent.h"
#include "awt_Palette.h" #include "awt_Palette.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Unicode.h"
#include "awt_Window.h" #include "awt_Window.h"
#include "awt_Win32GraphicsDevice.h" #include "awt_Win32GraphicsDevice.h"
#include "Hashtable.h" #include "Hashtable.h"
...@@ -67,30 +67,10 @@ ...@@ -67,30 +67,10 @@
#include <java_awt_event_MouseWheelEvent.h> #include <java_awt_event_MouseWheelEvent.h>
// Begin -- Win32 SDK include files // Begin -- Win32 SDK include files
#include <tchar.h>
#include <imm.h> #include <imm.h>
#include <ime.h> #include <ime.h>
// End -- Win32 SDK include files // End -- Win32 SDK include files
#ifndef GET_KEYSTATE_WPARAM // defined for (_WIN32_WINNT >= 0x0400)
#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))
#endif
#ifndef GET_WHEEL_DELTA_WPARAM // defined for (_WIN32_WINNT >= 0x0500)
#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
#endif
// <XXX> <!-- TEMPORARY HACK TO TEST AGAINST OLD VC INLCUDES -->
#if !defined(__int3264)
#define GetWindowLongPtr GetWindowLong
#define SetWindowLongPtr SetWindowLong
#define GWLP_USERDATA GWL_USERDATA
#define GWLP_WNDPROC GWL_WNDPROC
typedef __int32 LONG_PTR;
typedef unsigned __int32 ULONG_PTR;
#endif // __int3264
// </XXX>
#include <awt_DnDDT.h> #include <awt_DnDDT.h>
LPCTSTR szAwtComponentClassName = TEXT("SunAwtComponent"); LPCTSTR szAwtComponentClassName = TEXT("SunAwtComponent");
...@@ -207,10 +187,6 @@ LANGID AwtComponent::m_idLang = LOWORD(::GetKeyboardLayout(0)); ...@@ -207,10 +187,6 @@ LANGID AwtComponent::m_idLang = LOWORD(::GetKeyboardLayout(0));
UINT AwtComponent::m_CodePage UINT AwtComponent::m_CodePage
= AwtComponent::LangToCodePage(m_idLang); = AwtComponent::LangToCodePage(m_idLang);
BOOL AwtComponent::m_isWin95 = IS_WIN95;
BOOL AwtComponent::m_isWin2000 = IS_WIN2000;
BOOL AwtComponent::m_isWinNT = IS_NT;
static BOOL bLeftShiftIsDown = false; static BOOL bLeftShiftIsDown = false;
static BOOL bRightShiftIsDown = false; static BOOL bRightShiftIsDown = false;
static UINT lastShiftKeyPressed = 0; // init to safe value static UINT lastShiftKeyPressed = 0; // init to safe value
...@@ -544,7 +520,7 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title, ...@@ -544,7 +520,7 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title,
jobject createError = NULL; jobject createError = NULL;
if (dw == ERROR_OUTOFMEMORY) if (dw == ERROR_OUTOFMEMORY)
{ {
jstring errorMsg = env->NewStringUTF("too many window handles"); jstring errorMsg = JNU_NewStringPlatform(env, L"too many window handles");
createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError",
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
errorMsg); errorMsg);
...@@ -1347,17 +1323,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) ...@@ -1347,17 +1323,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return (LRESULT)TRUE; return (LRESULT)TRUE;
} }
UINT switchMessage; DWORD curPos = 0;
if (IS_WIN95 && !IS_WIN98 && message == Wheel95GetMsg()) {
// Wheel message is generated dynamically on 95. A quick swap and
// we're good to go.
DTRACE_PRINTLN1("got wheel event on 95. msg is %i\n", message);
switchMessage = WM_MOUSEWHEEL;
}
else {
switchMessage = message;
}
UINT switchMessage = message;
switch (switchMessage) { switch (switchMessage) {
case WM_AWT_GETDC: case WM_AWT_GETDC:
{ {
...@@ -1648,32 +1616,37 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) ...@@ -1648,32 +1616,37 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
case WM_AWT_MOUSEENTER: case WM_AWT_MOUSEENTER:
case WM_AWT_MOUSEEXIT: case WM_AWT_MOUSEEXIT:
{ curPos = ::GetMessagePos();
DWORD curPos = ::GetMessagePos();
POINT myPos; POINT myPos;
myPos.x = GET_X_LPARAM(curPos); myPos.x = GET_X_LPARAM(curPos);
myPos.y = GET_Y_LPARAM(curPos); myPos.y = GET_Y_LPARAM(curPos);
::ScreenToClient(GetHWnd(), &myPos); ::ScreenToClient(GetHWnd(), &myPos);
switch(switchMessage) { switch(switchMessage) {
case WM_AWT_MOUSEENTER: case WM_AWT_MOUSEENTER:
mr = WmMouseEnter(static_cast<UINT>(wParam), myPos.x, myPos.y); break; mr = WmMouseEnter(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y, mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON); break; LEFT_BUTTON);
break;
case WM_LBUTTONUP: case WM_LBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y, mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON); break; LEFT_BUTTON);
break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
mr = WmMouseMove(static_cast<UINT>(wParam), myPos.x, myPos.y); break; mr = WmMouseMove(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_MBUTTONDOWN: case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK: case WM_MBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y, mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON); break; MIDDLE_BUTTON);
break;
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK: case WM_RBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y, mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON); break; RIGHT_BUTTON);
break;
case WM_RBUTTONUP: case WM_RBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y, mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON); RIGHT_BUTTON);
...@@ -1686,25 +1659,12 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) ...@@ -1686,25 +1659,12 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
mr = WmMouseExit(static_cast<UINT>(wParam), myPos.x, myPos.y); mr = WmMouseExit(static_cast<UINT>(wParam), myPos.x, myPos.y);
break; break;
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
if (IS_WIN95 && !IS_WIN98) {
// On 95, the wParam doesn't contain the keystate flags, just
// the wheel rotation. The keystates are fetched in WmMouseWheel
// using GetJavaModifiers().
mr = WmMouseWheel(0,
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
(int)wParam);
return FALSE;
}
else {
mr = WmMouseWheel(GET_KEYSTATE_WPARAM(wParam), mr = WmMouseWheel(GET_KEYSTATE_WPARAM(wParam),
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
GET_WHEEL_DELTA_WPARAM(wParam)); GET_WHEEL_DELTA_WPARAM(wParam));
}
break; break;
} }
}
break; break;
case WM_SETCURSOR: case WM_SETCURSOR:
mr = mrDoDefault; mr = mrDoDefault;
if (LOWORD(lParam) == HTCLIENT) { if (LOWORD(lParam) == HTCLIENT) {
...@@ -2649,21 +2609,10 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, ...@@ -2649,21 +2609,10 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y,
jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA); jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA);
MSG msg; MSG msg;
if (IS_WIN95 && !IS_WIN98) {
// 95 doesn't understand the SPI_GETWHEELSCROLLLINES - get the user
// preference by other means
DTRACE_PRINTLN("WmMouseWheel: using 95 branch");
platformLines = Wheel95GetScrLines();
result = true;
InitMessage(&msg, lastMessage, wheelRotation, MAKELPARAM(x, y));
}
else {
result = ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, result = ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
&platformLines, 0); &platformLines, 0);
InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation), InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation),
MAKELPARAM(x, y)); MAKELPARAM(x, y));
}
if (result) { if (result) {
if (platformLines == WHEEL_PAGESCROLL) { if (platformLines == WHEEL_PAGESCROLL) {
...@@ -2743,7 +2692,6 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags) ...@@ -2743,7 +2692,6 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags)
"AwtComponent::GetShiftKeyLocation vkey = %d = 0x%x scan = %d", "AwtComponent::GetShiftKeyLocation vkey = %d = 0x%x scan = %d",
vkey, vkey, keyScanCode); vkey, vkey, keyScanCode);
if (m_isWinNT) {
leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0); leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0);
rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0); rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0);
...@@ -2755,144 +2703,10 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags) ...@@ -2755,144 +2703,10 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags)
} }
DASSERT(false); DASSERT(false);
// Note: the above should not fail on NT (or 2000), // Note: the above should not fail on NT (or 2000)
// but just in case it does, try the more complicated method
// we use for Win9x below.
}
// "Transition" bit = 0 if keyPressed, 1 if keyReleased
BOOL released = ((1<<15) & flags);
DTRACE_PRINTLN2(
"AwtComponent::GetShiftKeyLocation bLeftShiftIsDown = %d bRightShiftIsDown == %d",
bLeftShiftIsDown, bRightShiftIsDown);
DTRACE_PRINTLN2(
"AwtComponent::GetShiftKeyLocation lastShiftKeyPressed = %d released = %d",
lastShiftKeyPressed, released);
jint keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN;
// It is possible for somebody to hold down one or both
// Shift keys, causing repeat key events. We need to
// handle all the cases.
//
// Just a side-note: if two or more keys are being held down,
// and then one key is released, whether more key presses are
// generated for the keys that are still held down depends on
// which keys they are, and whether you released the right or
// the left shift/ctrl/etc. key first. This also differs
// between Win9x and NT. Just plain screwy.
//
// Note: on my PC, the repeat count is always 1. Yup, we need
// 16 bits to handle that, all right.
// Handle the case where only one of the Shift keys
// was down before this event took place
if (bLeftShiftIsDown && !bRightShiftIsDown) {
if (released) {
// This is a left Shift release
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
} else {
// This is a right Shift press
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
}
} else if (!bLeftShiftIsDown && bRightShiftIsDown) {
if (released) {
// This is a right Shift release
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
} else {
// This is a left Shift press
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
}
}
// Handle the case where neither of the Shift keys
// were down before this event took place
if (!bLeftShiftIsDown && !bRightShiftIsDown) {
DASSERT(!released);
if (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0) {
// This is a left Shift press
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
} else if (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0) {
// This is a right Shift press
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
} else {
DASSERT(false);
}
}
// Handle the case where both Shift keys were down before
// this event took place
if (bLeftShiftIsDown && bRightShiftIsDown) {
// If this is a key release event, we can just check to see
// what the keyboard state is after the event
if (released) {
if (HIBYTE(::GetKeyState(VK_RSHIFT)) == 0) {
// This is a right Shift release
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
} else if (HIBYTE(::GetKeyState(VK_LSHIFT)) == 0) {
// This is a left Shift release
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
} else {
DASSERT(false);
}
} else {
// If this is a key press event, and both Shift keys were
// already down, this is going to be a repeat of the last
// Shift press
if (lastShiftKeyPressed == VK_LSHIFT) {
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
} else if (lastShiftKeyPressed == VK_RSHIFT) {
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
} else {
DASSERT(false);
}
}
}
if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN) {
// Nothing we tried above worked for some reason. Sigh.
// Make a last-ditch effort to guess what happened:
// guess that the Shift scancodes are usually the same
// from system to system, even though this isn't guaranteed.
DTRACE_PRINTLN("Last-ditch effort at guessing Shift keyLocation");
// Tested on a couple of Windows keyboards: these are standard values // default value
leftShiftScancode = 42; return java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
rightShiftScancode = 54;
if (keyScanCode == leftShiftScancode) {
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
} else if (keyScanCode == rightShiftScancode) {
keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
}
}
// Set the Shift flags with the new key state.
bLeftShiftIsDown = (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0);
bRightShiftIsDown = (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0);
// Update lastShiftKeyPressed
if (released) {
// At most one shift key is down now, so just check which one
if (bLeftShiftIsDown) {
lastShiftKeyPressed = VK_LSHIFT;
DASSERT(!bRightShiftIsDown);
} else if (bRightShiftIsDown) {
lastShiftKeyPressed = VK_RSHIFT;
} else {
lastShiftKeyPressed = 0;
}
} else {
// It was a press, so at least one shift key is down now
if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_LEFT) {
lastShiftKeyPressed = VK_LSHIFT;
} else if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_RIGHT) {
lastShiftKeyPressed = VK_RSHIFT;
}
}
return keyLocation;
} }
/* Returns Java extended InputEvent modifieres. /* Returns Java extended InputEvent modifieres.
...@@ -3786,22 +3600,6 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, ...@@ -3786,22 +3600,6 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags,
// via WM_AWT_FORWARD_BYTE, but the Edit classes don't seem to // via WM_AWT_FORWARD_BYTE, but the Edit classes don't seem to
// like that. // like that.
// Begin pollution
if (!m_isWinNT && IsDBCSLeadByteEx(GetCodePage(), BYTE(character))) {
if (GetDBCSEditHandle() != NULL) {
return mrDoDefault;
} else {
// Kludge: Some Chinese IMEs, e.g. QuanPin, sends two WM_CHAR
// messages for some punctuations (e.g. full stop) without sending
// WM_IME_CHAR message beforehand.
if (m_PendingLeadByte == 0) {
m_PendingLeadByte = character;
return mrConsume;
}
}
}
// End pollution
// We will simply create Java events here. // We will simply create Java events here.
UINT message = system ? WM_SYSCHAR : WM_CHAR; UINT message = system ? WM_SYSCHAR : WM_CHAR;
...@@ -3861,44 +3659,9 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, ...@@ -3861,44 +3659,9 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags,
MsgRouting AwtComponent::WmForwardChar(WCHAR character, LPARAM lParam, MsgRouting AwtComponent::WmForwardChar(WCHAR character, LPARAM lParam,
BOOL synthetic) BOOL synthetic)
{ {
if (m_isWinNT) {
// just post WM_CHAR with unicode key value // just post WM_CHAR with unicode key value
DefWindowProc(WM_CHAR, (WPARAM)character, lParam); DefWindowProc(WM_CHAR, (WPARAM)character, lParam);
return mrConsume; return mrConsume;
}
// This message is sent from the Java key event handler.
CHAR mbChar[2] = {'\0', '\0'};
int cBytes = ::WideCharToMultiByte(GetCodePage(), 0, &character, 1, mbChar, 2, NULL, NULL);
if (cBytes!=1 && cBytes!=2) return mrConsume;
HWND hDBCSEditHandle = GetDBCSEditHandle();
if (hDBCSEditHandle != NULL && cBytes==2)
{
// The first WM_CHAR message will get handled by the WmChar, but
// the second WM_CHAR message will get picked off by the Edit class.
// WmChar will never see it.
// If an Edit class gets a lead byte, it immediately calls PeekMessage
// and pulls the trail byte out of the message queue.
::PostMessage(hDBCSEditHandle, WM_CHAR, mbChar[0] & 0x00ff, lParam);
::PostMessage(hDBCSEditHandle, WM_CHAR, mbChar[1] & 0x00ff, lParam);
}
else
{
MSG* pMsg;
pMsg = CreateMessage(WM_CHAR, mbChar[0] & 0x00ff, lParam);
::PostMessage(GetHWnd(), WM_AWT_FORWARD_BYTE, (WPARAM)synthetic,
(LPARAM)pMsg);
if (mbChar[1])
{
pMsg = CreateMessage(WM_CHAR, mbChar[1] & 0x00ff, lParam);
::PostMessage(GetHWnd(), WM_AWT_FORWARD_BYTE, (WPARAM)synthetic,
(LPARAM)pMsg);
}
}
return mrConsume;
} }
MsgRouting AwtComponent::WmPaste() MsgRouting AwtComponent::WmPaste()
...@@ -4543,7 +4306,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags) ...@@ -4543,7 +4306,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags)
// Special case for components with a sunken border. Windows does not // Special case for components with a sunken border. Windows does not
// print the border correctly on PCL printers, so we have to do it ourselves. // print the border correctly on PCL printers, so we have to do it ourselves.
if (IS_WIN4X && (GetStyleEx() & WS_EX_CLIENTEDGE)) { if (GetStyleEx() & WS_EX_CLIENTEDGE) {
RECT r; RECT r;
VERIFY(::GetWindowRect(GetHWnd(), &r)); VERIFY(::GetWindowRect(GetHWnd(), &r));
VERIFY(::OffsetRect(&r, -r.left, -r.top)); VERIFY(::OffsetRect(&r, -r.left, -r.top));
...@@ -4559,7 +4322,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags) ...@@ -4559,7 +4322,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags)
* We will first print the non-client area with the original offset, * We will first print the non-client area with the original offset,
* then the client area with a corrected offset. * then the client area with a corrected offset.
*/ */
if (IS_WIN4X && (GetStyleEx() & WS_EX_CLIENTEDGE)) { if (GetStyleEx() & WS_EX_CLIENTEDGE) {
int nEdgeWidth = ::GetSystemMetrics(SM_CXEDGE); int nEdgeWidth = ::GetSystemMetrics(SM_CXEDGE);
int nEdgeHeight = ::GetSystemMetrics(SM_CYEDGE); int nEdgeHeight = ::GetSystemMetrics(SM_CYEDGE);
...@@ -5319,18 +5082,8 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent) ...@@ -5319,18 +5082,8 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent)
// convert Java wheel amount value to Win32 // convert Java wheel amount value to Win32
wheelAmt *= -1 * WHEEL_DELTA; wheelAmt *= -1 * WHEEL_DELTA;
if (IS_WIN95 && !IS_WIN98) {
// 95 doesn't understand WM_MOUSEWHEEL, so plug in value of
// mouse wheel event on 95
DTRACE_PRINTLN("awt_C::synthmm - 95 case");
DASSERT(Wheel95GetMsg() != NULL);
message = Wheel95GetMsg();
wParam = wheelAmt;
}
else {
message = WM_MOUSEWHEEL; message = WM_MOUSEWHEEL;
wParam = MAKEWPARAM(wLow, wheelAmt); wParam = MAKEWPARAM(wLow, wheelAmt);
}
break; break;
default: default:
...@@ -5445,45 +5198,6 @@ void AwtComponent::Enable(BOOL bEnable) ...@@ -5445,45 +5198,6 @@ void AwtComponent::Enable(BOOL bEnable)
VerifyState(); VerifyState();
} }
/* Initialization of MouseWheel support on Windows 95 */
void AwtComponent::Wheel95Init() {
DASSERT(IS_WIN95 && !IS_WIN98);
HWND mwHWND = NULL;
UINT wheelMSG = WM_NULL;
UINT suppMSG = WM_NULL;
UINT linesMSG = WM_NULL;
BOOL wheelActive;
INT lines;
mwHWND = HwndMSWheel(&wheelMSG, &suppMSG, &linesMSG, &wheelActive, &lines);
if (mwHWND != WM_NULL) {
sm_95WheelMessage = wheelMSG;
sm_95WheelSupport = suppMSG;
}
}
/* Win95 only
* Return the user's preferred number of lines of test to scroll when the
* mouse wheel is rotated.
*/
UINT AwtComponent::Wheel95GetScrLines() {
DASSERT(IS_WIN95 && !IS_WIN98);
DASSERT(sm_95WheelSupport != NULL);
HWND mwHWND = NULL;
UINT linesMSG = WM_NULL;
INT numLines = 3;
linesMSG = RegisterWindowMessage(MSH_SCROLL_LINES);
mwHWND = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);
if (mwHWND && linesMSG) {
numLines = (INT)::SendMessage(mwHWND, linesMSG, 0, 0);
}
return numLines;
}
/* /*
* associate an AwtDropTarget with this AwtComponent * associate an AwtDropTarget with this AwtComponent
*/ */
...@@ -7025,20 +6739,6 @@ Java_sun_awt_windows_WComponentPeer_isObscured(JNIEnv* env, ...@@ -7025,20 +6739,6 @@ Java_sun_awt_windows_WComponentPeer_isObscured(JNIEnv* env,
CATCH_BAD_ALLOC_RET(NULL); CATCH_BAD_ALLOC_RET(NULL);
} }
/*
* Class: sun_awt_windows_WComponentPeer
* Method: wheelInit
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WComponentPeer_wheelInit(JNIEnv *env, jclass cls)
{
// Only necessary on Win95
if (IS_WIN95 && !IS_WIN98) {
AwtComponent::Wheel95Init();
}
}
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls, Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls,
jobject heavyweight, jobject heavyweight,
...@@ -7217,7 +6917,9 @@ void AwtComponent::VerifyState() ...@@ -7217,7 +6917,9 @@ void AwtComponent::VerifyState()
"getName", "getName",
"()Ljava/lang/String;").l; "()Ljava/lang/String;").l;
DASSERT(!safe_ExceptionOccurred(env)); DASSERT(!safe_ExceptionOccurred(env));
printf("\t%S\n", TO_WSTRING(targetStr)); LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL);
printf("\t%S\n", targetStrW);
JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW);
} }
printf("\twas: [%d,%d,%dx%d]\n", x, y, width, height); printf("\twas: [%d,%d,%dx%d]\n", x, y, width, height);
if (!fSizeValid) { if (!fSizeValid) {
......
...@@ -675,10 +675,6 @@ public: ...@@ -675,10 +675,6 @@ public:
static HWND sm_focusOwner; static HWND sm_focusOwner;
static HWND sm_focusedWindow; static HWND sm_focusedWindow;
static BOOL m_isWin95;
static BOOL m_isWin2000;
static BOOL m_isWinNT;
static BOOL sm_bMenuLoop; static BOOL sm_bMenuLoop;
static INLINE BOOL isMenuLoopActive() { static INLINE BOOL isMenuLoopActive() {
return sm_bMenuLoop; return sm_bMenuLoop;
......
/* /*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -79,10 +79,6 @@ AwtCursor::AwtCursor(JNIEnv *env, HCURSOR hCur, jobject jCur, int xH, int yH, ...@@ -79,10 +79,6 @@ AwtCursor::AwtCursor(JNIEnv *env, HCURSOR hCur, jobject jCur, int xH, int yH,
custom = TRUE; custom = TRUE;
dirty = FALSE; dirty = FALSE;
if (IsWin95Cursor()) {
customCursors.Add(this);
}
} }
AwtCursor::~AwtCursor() AwtCursor::~AwtCursor()
...@@ -96,9 +92,6 @@ void AwtCursor::Dispose() ...@@ -96,9 +92,6 @@ void AwtCursor::Dispose()
if (custom) { if (custom) {
::DestroyIcon(hCursor); ::DestroyIcon(hCursor);
if (IsWin95Cursor()) {
customCursors.Remove(this);
}
} }
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
...@@ -256,16 +249,6 @@ void AwtCursor::UpdateCursor(AwtComponent *comp) { ...@@ -256,16 +249,6 @@ void AwtCursor::UpdateCursor(AwtComponent *comp) {
env->DeleteLocalRef(jcomp); env->DeleteLocalRef(jcomp);
} }
void AwtCursor::DirtyAllCustomCursors() {
if (IsWin95Cursor()) {
AwtObjectListItem *cur = customCursors.m_head;
while (cur != NULL) {
((AwtCursor *)(cur->obj))->dirty = TRUE;
cur = cur->next;
}
}
}
void AwtCursor::Rebuild() { void AwtCursor::Rebuild() {
if (!dirty) { if (!dirty) {
return; return;
...@@ -294,23 +277,6 @@ void AwtCursor::Rebuild() { ...@@ -294,23 +277,6 @@ void AwtCursor::Rebuild() {
dirty = FALSE; dirty = FALSE;
} }
/* Bug fix for 4205805:
Custom cursor on WIN95 needs more effort, the same API works fine on NT
and WIN98. On Win95, DDB has to be passed in when calling createIconIndirect
Since DDB depends on the DISPLAY, we have to rebuild all the custom cursors
when user changes the display settings.
*/
BOOL AwtCursor::IsWin95Cursor() {
static BOOL val;
static BOOL known = FALSE;
if (!known) {
val = (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) == 4 &&
HIBYTE(LOWORD(::GetVersion())) == 0);
known = TRUE;
}
return val;
}
extern "C" { extern "C" {
/************************************************************************ /************************************************************************
......
/* /*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -66,7 +66,6 @@ public: ...@@ -66,7 +66,6 @@ public:
} }
static AwtCursor * CreateSystemCursor(jobject jCursor); static AwtCursor * CreateSystemCursor(jobject jCursor);
static void UpdateCursor(AwtComponent *comp); static void UpdateCursor(AwtComponent *comp);
static void DirtyAllCustomCursors();
static HCURSOR GetCursor(JNIEnv *env, AwtComponent *comp); static HCURSOR GetCursor(JNIEnv *env, AwtComponent *comp);
static void setPData(jobject cursor, jlong pdata) { static void setPData(jobject cursor, jlong pdata) {
...@@ -76,7 +75,6 @@ public: ...@@ -76,7 +75,6 @@ public:
private: private:
void Rebuild(); void Rebuild();
static BOOL IsWin95Cursor();
HCURSOR hCursor; HCURSOR hCursor;
jweak jCursor; jweak jCursor;
......
/* /*
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,12 +24,11 @@ ...@@ -24,12 +24,11 @@
*/ */
#include "awt.h" #include "awt.h"
#include "awt_dlls.h"
#include "awt_DataTransferer.h" #include "awt_DataTransferer.h"
#include "awt_DnDDT.h" #include "awt_DnDDT.h"
#include "awt_TextComponent.h" #include "awt_TextComponent.h"
#include "awt_Unicode.h"
#include <shlobj.h> #include <shlobj.h>
#include <shellapi.h>
#include <sun_awt_datatransfer_DataTransferer.h> #include <sun_awt_datatransfer_DataTransferer.h>
#include <sun_awt_windows_WDataTransferer.h> #include <sun_awt_windows_WDataTransferer.h>
...@@ -271,9 +270,7 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile ...@@ -271,9 +270,7 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile
hdrop = (HDROP)bBytes; hdrop = (HDROP)bBytes;
load_shell_procs(); UINT nFilenames = ::DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0);
UINT nFilenames = (*do_drag_query_file)(hdrop, 0xFFFFFFFF, NULL, 0);
jclass str_clazz = env->FindClass("java/lang/String"); jclass str_clazz = env->FindClass("java/lang/String");
DASSERT(str_clazz != NULL); DASSERT(str_clazz != NULL);
...@@ -287,12 +284,12 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile ...@@ -287,12 +284,12 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile
buffer = (LPTSTR)safe_Malloc(bufsize*sizeof(TCHAR)); buffer = (LPTSTR)safe_Malloc(bufsize*sizeof(TCHAR));
for (UINT i = 0; i < nFilenames; i++) { for (UINT i = 0; i < nFilenames; i++) {
UINT size = (*do_drag_query_file)(hdrop, i, NULL, 0); UINT size = ::DragQueryFile(hdrop, i, NULL, 0);
if (size > bufsize) { if (size > bufsize) {
bufsize = size; bufsize = size;
buffer = (LPTSTR)safe_Realloc(buffer, bufsize*sizeof(TCHAR)); buffer = (LPTSTR)safe_Realloc(buffer, bufsize*sizeof(TCHAR));
} }
(*do_drag_query_file)(hdrop, i, buffer, bufsize); ::DragQueryFile(hdrop, i, buffer, bufsize);
jstring name = JNU_NewStringPlatform(env, buffer); jstring name = JNU_NewStringPlatform(env, buffer);
if (name == NULL) { if (name == NULL) {
...@@ -454,11 +451,6 @@ Java_sun_awt_windows_WDataTransferer_platformImageBytesToImageData( ...@@ -454,11 +451,6 @@ Java_sun_awt_windows_WDataTransferer_platformImageBytesToImageData(
width = p.x; width = p.x;
height = -p.y; height = -p.y;
// Win9X supports only 16-bit signed coordinates.
if (IS_WIN95) {
if (width > 0x7FFF) { width = 0x7FFF; }
if (height > 0x7FFF) { height = 0x7FFF; }
}
free(lpemh); free(lpemh);
} }
break; break;
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include <jni.h> #include <jni.h>
#include <Windows.h>
#include <shellapi.h> #include <shellapi.h>
#include <float.h> #include <float.h>
...@@ -40,32 +40,32 @@ extern "C" { ...@@ -40,32 +40,32 @@ extern "C" {
JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute
(JNIEnv *env, jclass cls, jstring uri_j, jstring verb_j) (JNIEnv *env, jclass cls, jstring uri_j, jstring verb_j)
{ {
const WCHAR* uri_c = env->GetStringChars(uri_j, JNI_FALSE); LPCWSTR uri_c = JNU_GetStringPlatformChars(env, uri_j, JNI_FALSE);
const WCHAR* verb_c = env->GetStringChars(verb_j, JNI_FALSE); LPCWSTR verb_c = JNU_GetStringPlatformChars(env, verb_j, JNI_FALSE);
// 6457572: ShellExecute possibly changes FPU control word - saving it here // 6457572: ShellExecute possibly changes FPU control word - saving it here
unsigned oldcontrol87 = _control87(0, 0); unsigned oldcontrol87 = _control87(0, 0);
HINSTANCE retval = ShellExecuteW(NULL, verb_c, uri_c, NULL, NULL, SW_SHOWNORMAL); HINSTANCE retval = ::ShellExecute(NULL, verb_c, uri_c, NULL, NULL, SW_SHOWNORMAL);
_control87(oldcontrol87, 0xffffffff); _control87(oldcontrol87, 0xffffffff);
env->ReleaseStringChars(uri_j, uri_c); JNU_ReleaseStringPlatformChars(env, uri_j, uri_c);
env->ReleaseStringChars(verb_j, verb_c); JNU_ReleaseStringPlatformChars(env, verb_j, verb_c);
if ((int)retval <= 32) { if ((int)retval <= 32) {
// ShellExecute failed. // ShellExecute failed.
LPVOID buffer; LPTSTR buffer = NULL;
int len = FormatMessageW( int len = ::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, NULL,
GetLastError(), GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPWSTR) &buffer, (LPTSTR)&buffer,
0, 0,
NULL ); NULL );
jstring errmsg = env->NewString((LPCWSTR)buffer, len); jstring errmsg = JNU_NewStringPlatform(env, buffer, len);
LocalFree(buffer); LocalFree(buffer);
return errmsg; return errmsg;
} }
......
/* /*
* Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,17 +23,17 @@ ...@@ -23,17 +23,17 @@
* have any questions. * have any questions.
*/ */
#include "stdhdrs.h" #include "awt.h"
#include "mmsystem.h" #include "mmsystem.h"
#include "jlong.h" #include "jlong.h"
#include "awt.h"
#include "awt_DesktopProperties.h" #include "awt_DesktopProperties.h"
#include "awt_dlls.h" #include "awt_Toolkit.h"
#include "sun_awt_windows_WDesktopProperties.h" #include "sun_awt_windows_WDesktopProperties.h"
#include "java_awt_Font.h" #include "java_awt_Font.h"
#include "awtmsg.h" #include "awtmsg.h"
#include "Zmouse.h" #include "zmouse.h"
#include "shellapi.h" #include <shellapi.h>
#include <shlobj.h>
// WDesktopProperties fields // WDesktopProperties fields
jfieldID AwtDesktopProperties::pDataID = 0; jfieldID AwtDesktopProperties::pDataID = 0;
...@@ -44,10 +44,6 @@ jmethodID AwtDesktopProperties::setColorPropertyID = 0; ...@@ -44,10 +44,6 @@ jmethodID AwtDesktopProperties::setColorPropertyID = 0;
jmethodID AwtDesktopProperties::setFontPropertyID = 0; jmethodID AwtDesktopProperties::setFontPropertyID = 0;
jmethodID AwtDesktopProperties::setSoundPropertyID = 0; jmethodID AwtDesktopProperties::setSoundPropertyID = 0;
typedef VOID (WINAPI *SHGetSettingsType)(LPSHELLFLAGSTATE, DWORD);
static HMODULE libShell32 = NULL;
static SHGetSettingsType fn_SHGetSettings;
AwtDesktopProperties::AwtDesktopProperties(jobject self) { AwtDesktopProperties::AwtDesktopProperties(jobject self) {
this->self = GetEnv()->NewGlobalRef(self); this->self = GetEnv()->NewGlobalRef(self);
GetEnv()->SetLongField( self, AwtDesktopProperties::pDataID, GetEnv()->SetLongField( self, AwtDesktopProperties::pDataID,
...@@ -431,14 +427,12 @@ void CheckFontSmoothingSettings(HWND hWnd) { ...@@ -431,14 +427,12 @@ void CheckFontSmoothingSettings(HWND hWnd) {
void AwtDesktopProperties::GetColorParameters() { void AwtDesktopProperties::GetColorParameters() {
if (IS_WIN98 || IS_WIN2000) {
SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"), SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTACTIVECAPTION)); GetSysColor(COLOR_GRADIENTACTIVECAPTION));
SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"), SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTINACTIVECAPTION)); GetSysColor(COLOR_GRADIENTINACTIVECAPTION));
SetColorProperty(TEXT("win.item.hotTrackedColor"), SetColorProperty(TEXT("win.item.hotTrackedColor"),
GetSysColor(COLOR_HOTLIGHT)); GetSysColor(COLOR_HOTLIGHT));
}
SetColorProperty(TEXT("win.3d.darkShadowColor"), GetSysColor(COLOR_3DDKSHADOW)); SetColorProperty(TEXT("win.3d.darkShadowColor"), GetSysColor(COLOR_3DDKSHADOW));
SetColorProperty(TEXT("win.3d.backgroundColor"), GetSysColor(COLOR_3DFACE)); SetColorProperty(TEXT("win.3d.backgroundColor"), GetSysColor(COLOR_3DFACE));
SetColorProperty(TEXT("win.3d.highlightColor"), GetSysColor(COLOR_3DHIGHLIGHT)); SetColorProperty(TEXT("win.3d.highlightColor"), GetSysColor(COLOR_3DHIGHLIGHT));
...@@ -510,40 +504,18 @@ void AwtDesktopProperties::GetOtherParameters() { ...@@ -510,40 +504,18 @@ void AwtDesktopProperties::GetOtherParameters() {
// This property is called "win.frame.fullWindowDragsOn" above // This property is called "win.frame.fullWindowDragsOn" above
// This is one of the properties that don't trigger WM_SETTINGCHANGE // This is one of the properties that don't trigger WM_SETTINGCHANGE
SetBooleanProperty(TEXT("awt.dynamicLayoutSupported"), GetBooleanParameter(SPI_GETDRAGFULLWINDOWS)); SetBooleanProperty(TEXT("awt.dynamicLayoutSupported"), GetBooleanParameter(SPI_GETDRAGFULLWINDOWS));
// 95 MouseWheel support
// More or less copied from the MSH_MOUSEWHEEL MSDN entry
if (IS_WIN95 && !IS_WIN98) {
HWND hdlMSHWHEEL = NULL;
UINT msgMSHWheelSupported = NULL;
BOOL wheelSupported = FALSE;
msgMSHWheelSupported = RegisterWindowMessage(MSH_WHEELSUPPORT);
hdlMSHWHEEL = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);
if (hdlMSHWHEEL && msgMSHWheelSupported) {
wheelSupported = (BOOL)::SendMessage(hdlMSHWHEEL,
msgMSHWheelSupported, 0, 0);
}
SetBooleanProperty(TEXT("awt.wheelMousePresent"), wheelSupported);
}
else {
SetBooleanProperty(TEXT("awt.wheelMousePresent"), SetBooleanProperty(TEXT("awt.wheelMousePresent"),
::GetSystemMetrics(SM_MOUSEWHEELPRESENT)); ::GetSystemMetrics(SM_MOUSEWHEELPRESENT));
}
// END cross-platform properties // END cross-platform properties
if (IS_WIN98 || IS_WIN2000) {
//DWORD menuShowDelay; //DWORD menuShowDelay;
//SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0); //SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0);
// SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay); // SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay);
SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS)); SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS));
SetBooleanProperty(TEXT("win.item.hotTrackingOn"), GetBooleanParameter(SPI_GETHOTTRACKING)); SetBooleanProperty(TEXT("win.item.hotTrackingOn"), GetBooleanParameter(SPI_GETHOTTRACKING));
}
if (IS_WIN2000) {
SetBooleanProperty(TEXT("win.menu.keyboardCuesOn"), GetBooleanParameter(SPI_GETKEYBOARDCUES)); SetBooleanProperty(TEXT("win.menu.keyboardCuesOn"), GetBooleanParameter(SPI_GETKEYBOARDCUES));
}
// High contrast accessibility property // High contrast accessibility property
HIGHCONTRAST contrast; HIGHCONTRAST contrast;
...@@ -557,9 +529,8 @@ void AwtDesktopProperties::GetOtherParameters() { ...@@ -557,9 +529,8 @@ void AwtDesktopProperties::GetOtherParameters() {
SetBooleanProperty(TEXT("win.highContrast.on"), FALSE); SetBooleanProperty(TEXT("win.highContrast.on"), FALSE);
} }
if (fn_SHGetSettings != NULL) {
SHELLFLAGSTATE sfs; SHELLFLAGSTATE sfs;
fn_SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL); ::SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL);
if (sfs.fShowAllObjects) { if (sfs.fShowAllObjects) {
SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE); SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE);
} }
...@@ -572,7 +543,6 @@ void AwtDesktopProperties::GetOtherParameters() { ...@@ -572,7 +543,6 @@ void AwtDesktopProperties::GetOtherParameters() {
else { else {
SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE); SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE);
} }
}
LPTSTR value; LPTSTR value;
DWORD valueType; DWORD valueType;
...@@ -667,7 +637,7 @@ UINT AwtDesktopProperties::GetIntegerParameter(UINT spi) { ...@@ -667,7 +637,7 @@ UINT AwtDesktopProperties::GetIntegerParameter(UINT spi) {
} }
void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setStringPropertyID, AwtDesktopProperties::setStringPropertyID,
key, JNU_NewStringPlatform(GetEnv(), value)); key, JNU_NewStringPlatform(GetEnv(), value));
...@@ -675,7 +645,7 @@ void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { ...@@ -675,7 +645,7 @@ void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) {
} }
void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setIntegerPropertyID, AwtDesktopProperties::setIntegerPropertyID,
key, (jint)value); key, (jint)value);
...@@ -683,7 +653,7 @@ void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { ...@@ -683,7 +653,7 @@ void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) {
} }
void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) { void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setBooleanPropertyID, AwtDesktopProperties::setBooleanPropertyID,
key, value ? JNI_TRUE : JNI_FALSE); key, value ? JNI_TRUE : JNI_FALSE);
...@@ -691,7 +661,7 @@ void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) { ...@@ -691,7 +661,7 @@ void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) {
} }
void AwtDesktopProperties::SetColorProperty(LPCTSTR propName, DWORD value) { void AwtDesktopProperties::SetColorProperty(LPCTSTR propName, DWORD value) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setColorPropertyID, AwtDesktopProperties::setColorPropertyID,
key, GetRValue(value), GetGValue(value), key, GetRValue(value), GetGValue(value),
...@@ -743,7 +713,7 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, ...@@ -743,7 +713,7 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID,
style |= java_awt_Font_ITALIC; style |= java_awt_Font_ITALIC;
} }
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setFontPropertyID, AwtDesktopProperties::setFontPropertyID,
key, fontName, style, pointSize); key, fontName, style, pointSize);
...@@ -761,7 +731,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon ...@@ -761,7 +731,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
jint pointSize; jint pointSize;
jint style; jint style;
fontName = JNU_NewStringPlatform(GetEnv(), font.lfFaceName); fontName = JNU_NewStringPlatform(GetEnv(), const_cast<LPWSTR>(font.lfFaceName));
#if 0 #if 0
HDC hdc; HDC hdc;
...@@ -784,7 +754,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon ...@@ -784,7 +754,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
style |= java_awt_Font_ITALIC; style |= java_awt_Font_ITALIC;
} }
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID, GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID,
key, fontName, style, pointSize); key, fontName, style, pointSize);
...@@ -793,8 +763,8 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon ...@@ -793,8 +763,8 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
} }
void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventName) { void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventName) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName); jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
jstring event = JNU_NewStringPlatform(GetEnv(), winEventName); jstring event = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(winEventName));
GetEnv()->CallVoidMethod(self, GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setSoundPropertyID, AwtDesktopProperties::setSoundPropertyID,
key, event); key, event);
...@@ -805,9 +775,9 @@ void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventNa ...@@ -805,9 +775,9 @@ void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventNa
void AwtDesktopProperties::PlayWindowsSound(LPCTSTR event) { void AwtDesktopProperties::PlayWindowsSound(LPCTSTR event) {
// stop any currently playing sounds // stop any currently playing sounds
AwtWinMM::PlaySoundWrapper(NULL, NULL, SND_PURGE); ::PlaySound(NULL, NULL, SND_PURGE);
// play the sound for the given event name // play the sound for the given event name
AwtWinMM::PlaySoundWrapper(event, NULL, SND_ASYNC|SND_ALIAS|SND_NODEFAULT); ::PlaySound(event, NULL, SND_ASYNC|SND_ALIAS|SND_NODEFAULT);
} }
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
...@@ -852,16 +822,6 @@ JNIEXPORT void JNICALL ...@@ -852,16 +822,6 @@ JNIEXPORT void JNICALL
Java_sun_awt_windows_WDesktopProperties_init(JNIEnv *env, jobject self) { Java_sun_awt_windows_WDesktopProperties_init(JNIEnv *env, jobject self) {
TRY; TRY;
// Open shell32.dll, get the symbol for SHGetSettings
libShell32 = LoadLibrary(TEXT("shell32.dll"));
if (libShell32 == NULL) {
fn_SHGetSettings = NULL;
}
else {
fn_SHGetSettings = (SHGetSettingsType)GetProcAddress(
libShell32, "SHGetSettings");
}
new AwtDesktopProperties(self); new AwtDesktopProperties(self);
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
......
...@@ -132,14 +132,13 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent) ...@@ -132,14 +132,13 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent)
dialog = new AwtDialog(); dialog = new AwtDialog();
{ {
int colorId = IS_WIN4X ? COLOR_3DFACE : COLOR_WINDOW; int colorId = COLOR_3DFACE;
DWORD style = WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN; DWORD style = WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN;
if (hwndParent != NULL) { if (hwndParent != NULL) {
style |= WS_POPUP; style |= WS_POPUP;
} }
style &= ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX); style &= ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
DWORD exStyle = IS_WIN4X ? WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME DWORD exStyle = WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME;
: 0;
if (GetRTL()) { if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
...@@ -663,7 +662,7 @@ void AwtDialog::_SetIMMOption(void *param) ...@@ -663,7 +662,7 @@ void AwtDialog::_SetIMMOption(void *param)
int badAlloc = 0; int badAlloc = 0;
LPCTSTR coption; LPCTSTR coption;
LPTSTR empty = TEXT("InputMethod"); LPCTSTR empty = TEXT("InputMethod");
AwtDialog *d = NULL; AwtDialog *d = NULL;
PDATA pData; PDATA pData;
......
/* /*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "jlong.h" #include "jlong.h"
#include "awt_DataTransferer.h" #include "awt_DataTransferer.h"
#include "awt_DnDDS.h" #include "awt_DnDDS.h"
...@@ -36,8 +37,6 @@ ...@@ -36,8 +37,6 @@
#include "sun_awt_dnd_SunDragSourceContextPeer.h" #include "sun_awt_dnd_SunDragSourceContextPeer.h"
#include "sun_awt_windows_WDragSourceContextPeer.h" #include "sun_awt_windows_WDragSourceContextPeer.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <shlobj.h> #include <shlobj.h>
......
/* /*
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -30,11 +30,8 @@ ...@@ -30,11 +30,8 @@
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "java_awt_dnd_DnDConstants.h" #include "java_awt_dnd_DnDConstants.h"
#include "sun_awt_windows_WDropTargetContextPeer.h" #include "sun_awt_windows_WDropTargetContextPeer.h"
#include "awt_dlls.h"
#include "awt_Container.h" #include "awt_Container.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h> #include <memory.h>
#include <shellapi.h> #include <shellapi.h>
...@@ -555,8 +552,7 @@ jobject AwtDropTarget::GetData(jlong fmt) { ...@@ -555,8 +552,7 @@ jobject AwtDropTarget::GetData(jlong fmt) {
break; break;
} }
case TYMED_FILE: { case TYMED_FILE: {
jobject local = JNU_NewStringPlatform(env, (LPCTSTR) jobject local = JNU_NewStringPlatform(env, stgmedium.lpszFileName);
stgmedium.lpszFileName);
jstring fileName = (jstring)env->NewGlobalRef(local); jstring fileName = (jstring)env->NewGlobalRef(local);
env->DeleteLocalRef(local); env->DeleteLocalRef(local);
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
*/ */
#define _JNI_IMPLEMENTATION_ #define _JNI_IMPLEMENTATION_
#include "awt.h"
#include "awt_DrawingSurface.h" #include "awt_DrawingSurface.h"
#include "awt_Component.h" #include "awt_Component.h"
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include "awt_FileDialog.h" #include "awt_FileDialog.h"
#include "awt_Dialog.h" #include "awt_Dialog.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_dlls.h"
#include "ComCtl32Util.h" #include "ComCtl32Util.h"
#include <commdlg.h> #include <commdlg.h>
#include <cderr.h> #include <cderr.h>
...@@ -65,7 +64,7 @@ AwtFileDialog::Initialize(JNIEnv *env, jstring filterDescription) ...@@ -65,7 +64,7 @@ AwtFileDialog::Initialize(JNIEnv *env, jstring filterDescription)
{ {
int length = env->GetStringLength(filterDescription); int length = env->GetStringLength(filterDescription);
DASSERT(length + 1 < MAX_FILTER_STRING); DASSERT(length + 1 < MAX_FILTER_STRING);
LPCTSTR tmp = (LPTSTR)JNU_GetStringPlatformChars(env, filterDescription, NULL); LPCTSTR tmp = JNU_GetStringPlatformChars(env, filterDescription, NULL);
_tcscpy(s_fileFilterString, tmp); _tcscpy(s_fileFilterString, tmp);
JNU_ReleaseStringPlatformChars(env, filterDescription, tmp); JNU_ReleaseStringPlatformChars(env, filterDescription, tmp);
...@@ -156,7 +155,7 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) ...@@ -156,7 +155,7 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
LPITEMIDLIST pidl = (LPITEMIDLIST)notifyEx->pidl; LPITEMIDLIST pidl = (LPITEMIDLIST)notifyEx->pidl;
// Get the filename and directory // Get the filename and directory
TCHAR szPath[MAX_PATH]; TCHAR szPath[MAX_PATH];
if (!get_path_from_idlist(pidl,szPath)) { if (!::SHGetPathFromIDList(pidl, szPath)) {
return TRUE; return TRUE;
} }
jstring strPath = JNU_NewStringPlatform(env, szPath); jstring strPath = JNU_NewStringPlatform(env, szPath);
...@@ -190,7 +189,7 @@ AwtFileDialog::Show(void *p) ...@@ -190,7 +189,7 @@ AwtFileDialog::Show(void *p)
WCHAR unicodeChar = L' '; WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL; LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL; LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn; OPENFILENAME ofn;
jint mode = 0; jint mode = 0;
BOOL result = FALSE; BOOL result = FALSE;
DWORD dlgerr; DWORD dlgerr;
...@@ -222,7 +221,7 @@ AwtFileDialog::Show(void *p) ...@@ -222,7 +221,7 @@ AwtFileDialog::Show(void *p)
HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL; HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
if (title == NULL || env->GetStringLength(title)==0) { if (title == NULL || env->GetStringLength(title)==0) {
title = env->NewString(&unicodeChar, 1); title = JNU_NewStringPlatform(env, &unicodeChar);
} }
JavaStringBuffer titleBuffer(env, title); JavaStringBuffer titleBuffer(env, title);
...@@ -243,14 +242,7 @@ AwtFileDialog::Show(void *p) ...@@ -243,14 +242,7 @@ AwtFileDialog::Show(void *p)
memset(&ofn, 0, sizeof(ofn)); memset(&ofn, 0, sizeof(ofn));
// According to the MSDN docs, lStructSize must be set to
// OPENFILENAME_SIZE_VERSION_400 on NT4.0.
if (IS_NT && !(IS_WIN2000)) {
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
}
else {
ofn.lStructSize = sizeof(ofn); ofn.lStructSize = sizeof(ofn);
}
ofn.lpstrFilter = s_fileFilterString; ofn.lpstrFilter = s_fileFilterString;
ofn.nFilterIndex = 1; ofn.nFilterIndex = 1;
/* /*
...@@ -289,9 +281,6 @@ AwtFileDialog::Show(void *p) ...@@ -289,9 +281,6 @@ AwtFileDialog::Show(void *p)
mode = env->GetIntField(target, AwtFileDialog::modeID); mode = env->GetIntField(target, AwtFileDialog::modeID);
// Fix for 4364256 : call load_shell_procs()
load_shell_procs();
AwtDialog::CheckInstallModalHook(); AwtDialog::CheckInstallModalHook();
// show the Win32 file dialog // show the Win32 file dialog
...@@ -304,7 +293,7 @@ AwtFileDialog::Show(void *p) ...@@ -304,7 +293,7 @@ AwtFileDialog::Show(void *p)
// If the dialog is not shown because of invalid file name // If the dialog is not shown because of invalid file name
// replace the file name by empty string. // replace the file name by empty string.
if (!result) { if (!result) {
dlgerr = AwtCommDialog::CommDlgExtendedError(); dlgerr = ::CommDlgExtendedError();
if (dlgerr == FNERR_INVALIDFILENAME) { if (dlgerr == FNERR_INVALIDFILENAME) {
_tcscpy(fileBuffer, TEXT("")); _tcscpy(fileBuffer, TEXT(""));
if (mode == java_awt_FileDialog_LOAD) { if (mode == java_awt_FileDialog_LOAD) {
...@@ -326,7 +315,7 @@ AwtFileDialog::Show(void *p) ...@@ -326,7 +315,7 @@ AwtFileDialog::Show(void *p)
// Report result to peer. // Report result to peer.
if (result) { if (result) {
jstring tmpJString = (_tcslen(ofn.lpstrFile) == 0 ? jstring tmpJString = (_tcslen(ofn.lpstrFile) == 0 ?
env->NewStringUTF("") : JNU_NewStringPlatform(env, L"") :
JNU_NewStringPlatform(env, ofn.lpstrFile)); JNU_NewStringPlatform(env, ofn.lpstrFile));
env->CallVoidMethod(peer, AwtFileDialog::handleSelectedMID, tmpJString); env->CallVoidMethod(peer, AwtFileDialog::handleSelectedMID, tmpJString);
env->DeleteLocalRef(tmpJString); env->DeleteLocalRef(tmpJString);
...@@ -362,20 +351,18 @@ AwtFileDialog::Show(void *p) ...@@ -362,20 +351,18 @@ AwtFileDialog::Show(void *p)
} }
BOOL BOOL
AwtFileDialog::GetOpenFileName(LPAWTOPENFILENAME data) { AwtFileDialog::GetOpenFileName(LPOPENFILENAME data) {
AwtCommDialog::load_comdlg_procs();
return static_cast<BOOL>(reinterpret_cast<INT_PTR>( return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*)) AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*))
AwtCommDialog::GetOpenFileNameWrapper, data))); ::GetOpenFileName, data)));
} }
BOOL BOOL
AwtFileDialog::GetSaveFileName(LPAWTOPENFILENAME data) { AwtFileDialog::GetSaveFileName(LPOPENFILENAME data) {
AwtCommDialog::load_comdlg_procs();
return static_cast<BOOL>(reinterpret_cast<INT_PTR>( return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *)) AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *))
AwtCommDialog::GetSaveFileNameWrapper, data))); ::GetSaveFileName, data)));
} }
......
/* /*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -36,43 +36,6 @@ ...@@ -36,43 +36,6 @@
#include "java_awt_FileDialog.h" #include "java_awt_FileDialog.h"
#include "sun_awt_windows_WFileDialogPeer.h" #include "sun_awt_windows_WFileDialogPeer.h"
// The VC6 headers don't include this, but it's necessary for
// backward-compatibility with NT4.0, so we fake it.
#ifndef OPENFILENAME_SIZE_VERSION_400
// Determined via sizeof(OPENFILENAME)
#define OPENFILENAME_SIZE_VERSION_400 76
#endif
// 4859390
// For the Places Bar to show up, we need the "full" OPENFILENAME struct
typedef struct tagAWTOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
//#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
//#endif // (_WIN32_WINNT >= 0x0500)
} AWTOPENFILENAME, *LPAWTOPENFILENAME;
/************************************************************************ /************************************************************************
* AwtFileDialog class * AwtFileDialog class
*/ */
...@@ -96,8 +59,8 @@ public: ...@@ -96,8 +59,8 @@ public:
static void Initialize(JNIEnv *env, jstring filterDescription); static void Initialize(JNIEnv *env, jstring filterDescription);
static void Show(void *peer); static void Show(void *peer);
static BOOL GetOpenFileName(LPAWTOPENFILENAME); static BOOL GetOpenFileName(LPOPENFILENAME);
static BOOL GetSaveFileName(LPAWTOPENFILENAME); static BOOL GetSaveFileName(LPOPENFILENAME);
virtual BOOL InheritsNativeMouseWheelBehavior(); virtual BOOL InheritsNativeMouseWheelBehavior();
......
/* /*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include <math.h> #include <math.h>
#include "jlong.h" #include "jlong.h"
#include "awt_Font.h" #include "awt_Font.h"
...@@ -195,7 +196,7 @@ AwtFont* AwtFont::GetFont(JNIEnv *env, jobject font, ...@@ -195,7 +196,7 @@ AwtFont* AwtFont::GetFont(JNIEnv *env, jobject font,
} }
// Get suitable CHARSET from charset string provided by font configuration. // Get suitable CHARSET from charset string provided by font configuration.
static int GetNativeCharset(WCHAR* name) static int GetNativeCharset(LPCWSTR name)
{ {
if (wcsstr(name, L"ANSI_CHARSET")) if (wcsstr(name, L"ANSI_CHARSET"))
return ANSI_CHARSET; return ANSI_CHARSET;
...@@ -259,7 +260,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -259,7 +260,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
cfnum = 0; cfnum = 0;
} }
WCHAR* wName; LPCWSTR wName;
awtFont = new AwtFont(cfnum, env, font); awtFont = new AwtFont(cfnum, env, font);
...@@ -269,9 +270,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -269,9 +270,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
if (cfnum > 0) { if (cfnum > 0) {
// Ask peer class for the text component font name // Ask peer class for the text component font name
jstring jTextComponentFontName = GetTextComponentFontName(env, font); jstring jTextComponentFontName = GetTextComponentFontName(env, font);
WCHAR* textComponentFontName = TO_WSTRING(jTextComponentFontName); LPCWSTR textComponentFontName = JNU_GetStringPlatformChars(env, jTextComponentFontName, NULL);
env->DeleteLocalRef(jTextComponentFontName);
awtFont->m_textInput = -1; awtFont->m_textInput = -1;
for (int i = 0; i < cfnum; i++) { for (int i = 0; i < cfnum; i++) {
...@@ -282,13 +281,13 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -282,13 +281,13 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
jstring nativeName = jstring nativeName =
(jstring)env->GetObjectField(fontDescriptor, (jstring)env->GetObjectField(fontDescriptor,
AwtFont::nativeNameID); AwtFont::nativeNameID);
wName = TO_WSTRING(nativeName); wName = JNU_GetStringPlatformChars(env, nativeName, NULL);
DASSERT(wName); DASSERT(wName);
//On NT platforms, if the font is not Symbol or Dingbats //On NT platforms, if the font is not Symbol or Dingbats
//use "W" version of Win32 APIs directly, info the FontDescription //use "W" version of Win32 APIs directly, info the FontDescription
//no need to convert characters from Unicode to locale encodings. //no need to convert characters from Unicode to locale encodings.
if (IS_NT && GetNativeCharset(wName) != SYMBOL_CHARSET) { if (GetNativeCharset(wName) != SYMBOL_CHARSET) {
env->SetBooleanField(fontDescriptor, AwtFont::useUnicodeID, TRUE); env->SetBooleanField(fontDescriptor, AwtFont::useUnicodeID, TRUE);
} }
...@@ -299,10 +298,12 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -299,10 +298,12 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
(wcscmp(wName, textComponentFontName) == 0)) { (wcscmp(wName, textComponentFontName) == 0)) {
awtFont->m_textInput = i; awtFont->m_textInput = i;
} }
HFONT hfonttmp = CreateHFont(wName, fontStyle, fontSize, HFONT hfonttmp = CreateHFont(const_cast<LPWSTR>(wName), fontStyle, fontSize,
angle, awScale); angle, awScale);
awtFont->m_hFont[i] = hfonttmp; awtFont->m_hFont[i] = hfonttmp;
JNU_ReleaseStringPlatformChars(env, nativeName, wName);
env->DeleteLocalRef(fontDescriptor); env->DeleteLocalRef(fontDescriptor);
env->DeleteLocalRef(nativeName); env->DeleteLocalRef(nativeName);
} }
...@@ -311,11 +312,14 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -311,11 +312,14 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
// to first component // to first component
awtFont->m_textInput = 0; awtFont->m_textInput = 0;
} }
JNU_ReleaseStringPlatformChars(env, jTextComponentFontName, textComponentFontName);
env->DeleteLocalRef(jTextComponentFontName);
} else { } else {
// Instantiation for English version. // Instantiation for English version.
jstring fontName = (jstring)env->GetObjectField(font, jstring fontName = (jstring)env->GetObjectField(font,
AwtFont::nameID); AwtFont::nameID);
wName = TO_WSTRING(fontName); wName = JNU_GetStringPlatformChars(env, fontName, NULL);
WCHAR* wEName; WCHAR* wEName;
if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) { if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) {
...@@ -338,6 +342,9 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) ...@@ -338,6 +342,9 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
awtFont->m_textInput = 0; awtFont->m_textInput = 0;
awtFont->m_hFont[0] = CreateHFont(wEName, fontStyle, fontSize, awtFont->m_hFont[0] = CreateHFont(wEName, fontStyle, fontSize,
angle, awScale); angle, awScale);
JNU_ReleaseStringPlatformChars(env, fontName, wName);
env->DeleteLocalRef(fontName); env->DeleteLocalRef(fontName);
} }
/* The several callers of this method also set the pData field. /* The several callers of this method also set the pData field.
...@@ -381,7 +388,7 @@ static void strip_tail(wchar_t* text, wchar_t* tail) { // strips tail and any po ...@@ -381,7 +388,7 @@ static void strip_tail(wchar_t* text, wchar_t* tail) { // strips tail and any po
} }
static HFONT CreateHFont_sub(WCHAR* name, int style, int height, static HFONT CreateHFont_sub(LPCWSTR name, int style, int height,
int angle=0, float awScale=1.0f) int angle=0, float awScale=1.0f)
{ {
LOGFONTW logFont; LOGFONTW logFont;
...@@ -420,18 +427,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height, ...@@ -420,18 +427,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height,
strip_tail(tmpname,L"Italic"); strip_tail(tmpname,L"Italic");
strip_tail(tmpname,L"Bold"); strip_tail(tmpname,L"Bold");
wcscpy(&(logFont.lfFaceName[0]), tmpname); wcscpy(&(logFont.lfFaceName[0]), tmpname);
HFONT hFont; HFONT hFont = ::CreateFontIndirect(&logFont);
if (IS_WIN95) {
#ifdef WIN32
DASSERT(IS_WIN95);
#endif
HDC hdc = ::GetDC(NULL);
::EnumFontFamiliesEx(hdc, &logFont, (FONTENUMPROC)FindFamilyName,
(LPARAM)tmpname, 0L);
::ReleaseDC(NULL, hdc);
wcscpy(&logFont.lfFaceName[0], tmpname);
}
hFont = ::CreateFontIndirectW(&logFont);
DASSERT(hFont != NULL); DASSERT(hFont != NULL);
// get a expanded or condensed version if its specified. // get a expanded or condensed version if its specified.
if (awScale != 1.0f) { if (awScale != 1.0f) {
...@@ -446,7 +442,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height, ...@@ -446,7 +442,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height,
} }
avgWidth = tm.tmAveCharWidth; avgWidth = tm.tmAveCharWidth;
logFont.lfWidth = (LONG)((fabs)(avgWidth*awScale)); logFont.lfWidth = (LONG)((fabs)(avgWidth*awScale));
hFont = CreateFontIndirectW(&logFont); hFont = ::CreateFontIndirect(&logFont);
DASSERT(hFont != NULL); DASSERT(hFont != NULL);
VERIFY(::ReleaseDC(0, hDC)); VERIFY(::ReleaseDC(0, hDC));
} }
...@@ -460,15 +456,8 @@ HFONT AwtFont::CreateHFont(WCHAR* name, int style, int height, ...@@ -460,15 +456,8 @@ HFONT AwtFont::CreateHFont(WCHAR* name, int style, int height,
WCHAR longName[80]; WCHAR longName[80];
// 80 > (max face name(=30) + strlen("CHINESEBIG5_CHARSET")) // 80 > (max face name(=30) + strlen("CHINESEBIG5_CHARSET"))
// longName doesn't have to be printable. So, it is OK not to convert. // longName doesn't have to be printable. So, it is OK not to convert.
if (IS_NT) {
//wsprintfW only works on NT. See bugid 4123362 wsprintf(longName, L"%ls-%d-%d", name, style, height);
wsprintfW(longName, L"%ls-%d-%d", name, style, height);
} else {
#ifdef WIN32
DASSERT(IS_WIN95);
#endif
swprintf(longName, L"%ls-%d-%d", name, style, height);
}
HFONT hFont = NULL; HFONT hFont = NULL;
...@@ -682,28 +671,16 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC, ...@@ -682,28 +671,16 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC,
if (arrayLength == 0) { if (arrayLength == 0) {
int length = env->GetStringLength(str); int length = env->GetStringLength(str);
WCHAR* string = TO_WSTRING(str); LPCWSTR strW = JNU_GetStringPlatformChars(env, str, NULL);
VERIFY(::SelectObject(hDC, awtFont->GetHFont())); VERIFY(::SelectObject(hDC, awtFont->GetHFont()));
if (AwtComponent::GetRTLReadingOrder()){ if (AwtComponent::GetRTLReadingOrder()){
if (IS_WIN95) { VERIFY(!draw || ::ExtTextOut(hDC, x, y, ETO_RTLREADING, NULL,
// Start of conversion Code to fix arabic shaping problems strW, length, NULL));
// with unicode support in win 95
LPSTR buffer = (LPSTR) alloca((wcslen(string) + 1) * 2);
int count = ::WideCharToMultiByte(codePage, 0, string, length,
buffer,
static_cast<int>((wcslen(string) + 1) * 2),
NULL, NULL);
VERIFY(!draw || ::ExtTextOutA(hDC, x, y, ETO_RTLREADING, NULL,
buffer, count, NULL));
// End Of Conversion Code
} else {
VERIFY(!draw || ::ExtTextOutW(hDC, x, y, ETO_RTLREADING, NULL,
string, length, NULL));
}
} else { } else {
VERIFY(!draw || ::TextOutW(hDC, x, y, string, length)); VERIFY(!draw || ::TextOut(hDC, x, y, strW, length));
} }
VERIFY(::GetTextExtentPoint32W(hDC, string, length, &size)); VERIFY(::GetTextExtentPoint32(hDC, strW, length, &size));
JNU_ReleaseStringPlatformChars(env, str, strW);
} else { } else {
for (int i = 0; i < arrayLength; i = i + 2) { for (int i = 0; i < arrayLength; i = i + 2) {
jobject fontDescriptor = env->GetObjectArrayElement(array, i); jobject fontDescriptor = env->GetObjectArrayElement(array, i);
...@@ -732,7 +709,7 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC, ...@@ -732,7 +709,7 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC,
* extend buflen and bad things will happen. * extend buflen and bad things will happen.
*/ */
unsigned char* buffer = NULL; unsigned char* buffer = NULL;
jboolean unicodeUsed = env->GetBooleanField(fontDescriptor,AwtFont::useUnicodeID); jboolean unicodeUsed = env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID);
try { try {
buffer = (unsigned char *) buffer = (unsigned char *)
env->GetPrimitiveArrayCritical(convertedBytes, 0); env->GetPrimitiveArrayCritical(convertedBytes, 0);
...@@ -1231,7 +1208,7 @@ class CSegTableComponent ...@@ -1231,7 +1208,7 @@ class CSegTableComponent
public: public:
CSegTableComponent(); CSegTableComponent();
virtual ~CSegTableComponent(); virtual ~CSegTableComponent();
virtual void Create(LPWSTR name); virtual void Create(LPCWSTR name);
virtual BOOL In(USHORT iChar) { DASSERT(FALSE); return FALSE; }; virtual BOOL In(USHORT iChar) { DASSERT(FALSE); return FALSE; };
LPWSTR GetFontName(){ LPWSTR GetFontName(){
DASSERT(m_lpszFontName != NULL); return m_lpszFontName; DASSERT(m_lpszFontName != NULL); return m_lpszFontName;
...@@ -1254,7 +1231,7 @@ CSegTableComponent::~CSegTableComponent() ...@@ -1254,7 +1231,7 @@ CSegTableComponent::~CSegTableComponent()
} }
} }
void CSegTableComponent::Create(LPWSTR name) void CSegTableComponent::Create(LPCWSTR name)
{ {
if (m_lpszFontName != NULL) { if (m_lpszFontName != NULL) {
free(m_lpszFontName); free(m_lpszFontName);
...@@ -1453,7 +1430,7 @@ public: ...@@ -1453,7 +1430,7 @@ public:
CStdSegTable(); CStdSegTable();
virtual ~CStdSegTable(); virtual ~CStdSegTable();
BOOL IsEUDC() { return FALSE; }; BOOL IsEUDC() { return FALSE; };
virtual void Create(LPWSTR name); virtual void Create(LPCWSTR name);
protected: protected:
void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData); void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData);
...@@ -1481,7 +1458,7 @@ inline void CStdSegTable::GetData(DWORD dwOffset, ...@@ -1481,7 +1458,7 @@ inline void CStdSegTable::GetData(DWORD dwOffset,
DASSERT(nBytes != GDI_ERROR); DASSERT(nBytes != GDI_ERROR);
} }
void CStdSegTable::Create(LPWSTR name) void CStdSegTable::Create(LPCWSTR name)
{ {
CSegTableComponent::Create(name); CSegTableComponent::Create(name);
...@@ -1509,7 +1486,7 @@ public: ...@@ -1509,7 +1486,7 @@ public:
CEUDCSegTable(); CEUDCSegTable();
virtual ~CEUDCSegTable(); virtual ~CEUDCSegTable();
BOOL IsEUDC() { return TRUE; }; BOOL IsEUDC() { return TRUE; };
virtual void Create(LPWSTR name); virtual void Create(LPCWSTR name);
protected: protected:
void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData); void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData);
...@@ -1543,7 +1520,7 @@ inline void CEUDCSegTable::GetData(DWORD dwOffset, ...@@ -1543,7 +1520,7 @@ inline void CEUDCSegTable::GetData(DWORD dwOffset,
DASSERT(dwRead == cbData); DASSERT(dwRead == cbData);
} }
void CEUDCSegTable::Create(LPWSTR name) void CEUDCSegTable::Create(LPCWSTR name)
{ {
typedef struct tagHEAD{ typedef struct tagHEAD{
FIXED sfnt_version; FIXED sfnt_version;
...@@ -1564,19 +1541,8 @@ typedef struct tagENTRY{ ...@@ -1564,19 +1541,8 @@ typedef struct tagENTRY{
// create EUDC font file and make EUDCSegTable // create EUDC font file and make EUDCSegTable
// after wrapper function for CreateFileW, we use only CreateFileW // after wrapper function for CreateFileW, we use only CreateFileW
if (IS_NT) { m_hTmpFile = ::CreateFile(name, GENERIC_READ,
m_hTmpFile = ::CreateFileW(name, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
} else {
#ifdef WIN32
DASSERT(IS_WIN95);
#endif
char szFileName[_MAX_PATH];
::WideCharToMultiByte(CP_ACP, 0, name, -1,
szFileName, sizeof(szFileName), NULL, NULL);
m_hTmpFile = ::CreateFileA(szFileName, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
if (m_hTmpFile == INVALID_HANDLE_VALUE){ if (m_hTmpFile == INVALID_HANDLE_VALUE){
m_hTmpFile = NULL; m_hTmpFile = NULL;
return; return;
...@@ -1654,10 +1620,10 @@ void CSegTableManagerComponent::MakeBiggerTable() ...@@ -1654,10 +1620,10 @@ void CSegTableManagerComponent::MakeBiggerTable()
class CSegTableManager : public CSegTableManagerComponent class CSegTableManager : public CSegTableManagerComponent
{ {
public: public:
CSegTable* GetTable(LPWSTR lpszFontName, BOOL fEUDC); CSegTable* GetTable(LPCWSTR lpszFontName, BOOL fEUDC);
}; };
CSegTable* CSegTableManager::GetTable(LPWSTR lpszFontName, BOOL fEUDC) CSegTable* CSegTableManager::GetTable(LPCWSTR lpszFontName, BOOL fEUDC)
{ {
for (int i = 0; i < m_nTable; i++) { for (int i = 0; i < m_nTable; i++) {
if ((((CSegTable*)m_tables[i])->IsEUDC() == fEUDC) && if ((((CSegTable*)m_tables[i])->IsEUDC() == fEUDC) &&
...@@ -1685,7 +1651,7 @@ class CCombinedSegTable : public CSegTableComponent ...@@ -1685,7 +1651,7 @@ class CCombinedSegTable : public CSegTableComponent
{ {
public: public:
CCombinedSegTable(); CCombinedSegTable();
void Create(LPWSTR name); void Create(LPCWSTR name);
BOOL In(USHORT iChar); BOOL In(USHORT iChar);
private: private:
...@@ -1807,7 +1773,7 @@ void CCombinedSegTable::GetEUDCFileName(LPWSTR lpszFileName, int cchFileName) ...@@ -1807,7 +1773,7 @@ void CCombinedSegTable::GetEUDCFileName(LPWSTR lpszFileName, int cchFileName)
wcscpy(m_szDefaultEUDCFile, lpszFileName); wcscpy(m_szDefaultEUDCFile, lpszFileName);
} }
void CCombinedSegTable::Create(LPWSTR name) void CCombinedSegTable::Create(LPCWSTR name)
{ {
CSegTableComponent::Create(name); CSegTableComponent::Create(name);
...@@ -1840,10 +1806,10 @@ BOOL CCombinedSegTable::In(USHORT iChar) ...@@ -1840,10 +1806,10 @@ BOOL CCombinedSegTable::In(USHORT iChar)
class CCombinedSegTableManager : public CSegTableManagerComponent class CCombinedSegTableManager : public CSegTableManagerComponent
{ {
public: public:
CCombinedSegTable* GetTable(LPWSTR lpszFontName); CCombinedSegTable* GetTable(LPCWSTR lpszFontName);
}; };
CCombinedSegTable* CCombinedSegTableManager::GetTable(LPWSTR lpszFontName) CCombinedSegTable* CCombinedSegTableManager::GetTable(LPCWSTR lpszFontName)
{ {
for (int i = 0; i < m_nTable; i++) { for (int i = 0; i < m_nTable; i++) {
if (wcscmp(m_tables[i]->GetFontName(),lpszFontName) == 0) if (wcscmp(m_tables[i]->GetFontName(),lpszFontName) == 0)
...@@ -1901,8 +1867,9 @@ Java_sun_awt_windows_WDefaultFontCharset_canConvert(JNIEnv *env, jobject self, ...@@ -1901,8 +1867,9 @@ Java_sun_awt_windows_WDefaultFontCharset_canConvert(JNIEnv *env, jobject self,
jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID); jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID);
DASSERT(fontName != NULL); DASSERT(fontName != NULL);
LPWSTR fontNameWStr = TO_WSTRING(fontName); LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
CCombinedSegTable* pTable = tableManager.GetTable(fontNameWStr); CCombinedSegTable* pTable = tableManager.GetTable(fontNameW);
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE); return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE);
CATCH_BAD_ALLOC_RET(FALSE); CATCH_BAD_ALLOC_RET(FALSE);
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include "awt.h" #include "awt.h"
#include "awt_Object.h" #include "awt_Object.h"
#include "awt_Unicode.h"
#include "java_awt_Font.h" #include "java_awt_Font.h"
#include "sun_awt_windows_WFontMetrics.h" #include "sun_awt_windows_WFontMetrics.h"
......
...@@ -1472,7 +1472,7 @@ void AwtFrame::_SetIMMOption(void *param) ...@@ -1472,7 +1472,7 @@ void AwtFrame::_SetIMMOption(void *param)
int badAlloc = 0; int badAlloc = 0;
LPCTSTR coption; LPCTSTR coption;
LPTSTR empty = TEXT("InputMethod"); LPCTSTR empty = TEXT("InputMethod");
AwtFrame *f = NULL; AwtFrame *f = NULL;
PDATA pData; PDATA pData;
......
/* /*
* Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -580,18 +580,10 @@ HKL getDefaultKeyboardLayout() { ...@@ -580,18 +580,10 @@ HKL getDefaultKeyboardLayout() {
DWORD cbHKL = 16; DWORD cbHKL = 16;
LPTSTR end; LPTSTR end;
if (IS_NT) {
ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), NULL, KEY_READ, &hKey); ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), NULL, KEY_READ, &hKey);
} else {
ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("keyboard layout\\preload\\1"), NULL, KEY_READ, &hKey);
}
if (ret == ERROR_SUCCESS) { if (ret == ERROR_SUCCESS) {
if (IS_NT) {
ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL); ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL);
} else {
ret = ::RegQueryValueEx(hKey, NULL, 0, 0, szHKL, &cbHKL);
}
if (ret == ERROR_SUCCESS) { if (ret == ERROR_SUCCESS) {
hkl = reinterpret_cast<HKL>(static_cast<INT_PTR>( hkl = reinterpret_cast<HKL>(static_cast<INT_PTR>(
......
/* /*
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -22,10 +22,9 @@ ...@@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or * CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions. * have any questions.
*/ */
#include <windows.h>
#include <jni.h>
#include <imm.h>
#include "awt.h" #include "awt.h"
#include <imm.h>
#include "awt_Component.h" #include "awt_Component.h"
#include "awt_InputTextInfor.h" #include "awt_InputTextInfor.h"
...@@ -91,12 +90,12 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) { ...@@ -91,12 +90,12 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) {
LONG cbData[5] = {0}; LONG cbData[5] = {0};
LPVOID lpData[5] = {NULL}; LPVOID lpData[5] = {NULL};
for (int i = startIndex, j = 0; i <= endIndex; i++, j++) { for (int i = startIndex, j = 0; i <= endIndex; i++, j++) {
cbData[j] = ImmGetCompositionStringW(hIMC, GCS_INDEX[i], NULL, 0); cbData[j] = ::ImmGetCompositionString(hIMC, GCS_INDEX[i], NULL, 0);
if (cbData[j] == 0) { if (cbData[j] == 0) {
lpData[j] = NULL; lpData[j] = NULL;
} else { } else {
LPBYTE lpTemp = new BYTE[cbData[j]]; LPBYTE lpTemp = new BYTE[cbData[j]];
cbData[j] = ImmGetCompositionStringW(hIMC, GCS_INDEX[i], lpTemp, cbData[j]); cbData[j] = ::ImmGetCompositionString(hIMC, GCS_INDEX[i], lpTemp, cbData[j]);
if (IMM_ERROR_GENERAL != cbData[j]) { if (IMM_ERROR_GENERAL != cbData[j]) {
lpData[j] = (LPVOID)lpTemp; lpData[j] = (LPVOID)lpTemp;
} else { } else {
...@@ -126,13 +125,13 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) { ...@@ -126,13 +125,13 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) {
// Get the cursor position // Get the cursor position
if (flags & GCS_COMPSTR) { if (flags & GCS_COMPSTR) {
m_cursorPosW = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, m_cursorPosW = ::ImmGetCompositionString(hIMC, GCS_CURSORPOS,
NULL, 0); NULL, 0);
} }
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (m_cStrW > 0) { if (m_cStrW > 0) {
m_jtext = MakeJavaString(env, m_lpStrW, m_cStrW); m_jtext = MakeJavaString(env, m_lpStrW);
} }
// Merge the string if necessary // Merge the string if necessary
...@@ -183,11 +182,13 @@ AwtInputTextInfor::~AwtInputTextInfor() { ...@@ -183,11 +182,13 @@ AwtInputTextInfor::~AwtInputTextInfor() {
} }
jstring AwtInputTextInfor::MakeJavaString(JNIEnv* env, LPWSTR lpStrW, int cStrW) { jstring AwtInputTextInfor::MakeJavaString(JNIEnv* env, LPWSTR lpStrW) {
if (env == NULL || lpStrW == NULL || cStrW == 0) return NULL; if (env == NULL || lpStrW == NULL) {
return NULL;
return env->NewString(lpStrW, cStrW); } else {
return JNU_NewStringPlatform(env, lpStrW);
}
} }
// //
...@@ -232,7 +233,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla ...@@ -232,7 +233,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla
LCID lcJPN = MAKELCID(MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),SORT_DEFAULT); LCID lcJPN = MAKELCID(MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),SORT_DEFAULT);
// Reading string is given in half width katakana in Japanese Windows // Reading string is given in half width katakana in Japanese Windows
// Convert it to full width katakana. // Convert it to full width katakana.
int cFWStrW = LCMapStringW( lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, NULL, 0 ); int cFWStrW = ::LCMapString(lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, NULL, 0);
LPWSTR lpFWStrW; LPWSTR lpFWStrW;
try { try {
lpFWStrW = new WCHAR[cFWStrW]; lpFWStrW = new WCHAR[cFWStrW];
...@@ -244,15 +245,15 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla ...@@ -244,15 +245,15 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla
throw; throw;
} }
LCMapStringW( lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW ); ::LCMapString(lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW);
readingClauseW[cls] = MakeJavaString(env, lpFWStrW, cFWStrW); readingClauseW[cls] = MakeJavaString(env, lpFWStrW);
delete [] lpFWStrW; delete [] lpFWStrW;
} else { } else {
readingClauseW[cls] = MakeJavaString(env, lpHWStrW, cHWStrW); readingClauseW[cls] = MakeJavaString(env, lpHWStrW);
} }
} }
else { else {
readingClauseW[cls] = MakeJavaString(env, (LPWSTR)NULL, 0); readingClauseW[cls] = MakeJavaString(env, (LPWSTR)NULL);
} }
} }
......
...@@ -58,7 +58,7 @@ class AwtInputTextInfor { ...@@ -58,7 +58,7 @@ class AwtInputTextInfor {
~AwtInputTextInfor(); ~AwtInputTextInfor();
private: private:
/* helper function to return a java string.*/ /* helper function to return a java string.*/
static jstring MakeJavaString(JNIEnv* env, LPWSTR lpStrW, int cStrW); static jstring MakeJavaString(JNIEnv* env, LPWSTR lpStrW);
LPARAM m_flags; /* The message LPARAM. */ LPARAM m_flags; /* The message LPARAM. */
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include "awt_KeyboardFocusManager.h" #include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h" #include "awt_Canvas.h"
#include "awt_Dimension.h" #include "awt_Dimension.h"
#include "awt_Unicode.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Window.h" #include "awt_Window.h"
...@@ -112,9 +111,8 @@ AwtList* AwtList::Create(jobject peer, jobject parent) ...@@ -112,9 +111,8 @@ AwtList* AwtList::Create(jobject peer, jobject parent)
DWORD wrapExStyle = 0; DWORD wrapExStyle = 0;
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL | DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL |
LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED;
(IS_WIN4X ? 0 : WS_BORDER); DWORD exStyle = WS_EX_CLIENTEDGE;
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
/* /*
* NOTE: WS_VISIBLE is always set for the listbox. Listbox * NOTE: WS_VISIBLE is always set for the listbox. Listbox
...@@ -571,10 +569,10 @@ MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic) ...@@ -571,10 +569,10 @@ MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic)
// operate WM_PRINT to be compatible with the "smooth scrolling" feature. // operate WM_PRINT to be compatible with the "smooth scrolling" feature.
MsgRouting AwtList::WmPrint(HDC hDC, LPARAM flags) MsgRouting AwtList::WmPrint(HDC hDC, LPARAM flags)
{ {
if (!isWrapperPrint && IS_WIN4X if (!isWrapperPrint &&
&& (flags & PRF_CLIENT) (flags & PRF_CLIENT) &&
&& (GetStyleEx() & WS_EX_CLIENTEDGE)) { (GetStyleEx() & WS_EX_CLIENTEDGE))
{
int nOriginalDC = ::SaveDC(hDC); int nOriginalDC = ::SaveDC(hDC);
DASSERT(nOriginalDC != 0); DASSERT(nOriginalDC != 0);
// Save a copy of the DC for WmPrintClient // Save a copy of the DC for WmPrintClient
......
/*
* Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include "awt_MMStub.h"
//---------------------------------------------------------------------------
// Basic API
//---------------------------------------------------------------------------
int (WINAPI* g_pfnGetSystemMetrics) (int);
MHND (WINAPI* g_pfnMonitorFromWindow) (HWND,BOOL);
MHND (WINAPI* g_pfnMonitorFromRect) (LPCRECT,BOOL);
MHND (WINAPI* g_pfnMonitorFromPoint) (POINT,BOOL);
BOOL (WINAPI* g_pfnGetMonitorInfo) (MHND,PMONITOR_INFO);
BOOL (WINAPI* g_pfnEnumDisplayMonitors) (HDC,LPCRECT,MON_ENUM_CALLBACK_PROC,LPARAM);
BOOL (WINAPI* g_pfnEnumDisplayDevices) (LPVOID,int,P_DISPLAY_DEVICE,DWORD);
BOOL __initMultipleMonitorStubs(void);
BOOL __initMultipleMonitorStubs(void)
{
static BOOL fInitDone;
HMODULE hUser32;
HMODULE hUnicows = UnicowsLoader::GetModuleHandle();
BOOL retCode = FALSE;
if (fInitDone)
{
retCode = g_pfnGetMonitorInfo != NULL;
goto _RET_;
}
if ((hUser32 = GetModuleHandle(TEXT("USER32"))) &&
(*(FARPROC*)&g_pfnGetSystemMetrics = GetProcAddress(hUser32,"GetSystemMetrics")) &&
(*(FARPROC*)&g_pfnMonitorFromWindow = GetProcAddress(hUser32,"MonitorFromWindow")) &&
(*(FARPROC*)&g_pfnMonitorFromRect = GetProcAddress(hUser32,"MonitorFromRect")) &&
(*(FARPROC*)&g_pfnMonitorFromPoint = GetProcAddress(hUser32,"MonitorFromPoint")) &&
(*(FARPROC*)&g_pfnEnumDisplayMonitors = GetProcAddress(hUser32,"EnumDisplayMonitors")) &&
(*(FARPROC*)&g_pfnGetMonitorInfo = GetProcAddress(IS_WIN95 ? hUnicows : hUser32,"GetMonitorInfoW")) &&
(*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(IS_WIN95 ? hUnicows : hUser32,"EnumDisplayDevicesW")) &&
(GetSystemMetrics(SM_CXVSCREEN) >= GetSystemMetrics(SM_CXSCREEN)) &&
(GetSystemMetrics(SM_CYVSCREEN) >= GetSystemMetrics(SM_CYSCREEN)) )
{
fInitDone = TRUE;
retCode = TRUE;
goto _RET_;
}
g_pfnGetSystemMetrics = NULL;
g_pfnMonitorFromWindow = NULL;
g_pfnMonitorFromRect = NULL;
g_pfnMonitorFromPoint = NULL;
g_pfnGetMonitorInfo = NULL;
g_pfnEnumDisplayMonitors = NULL;
g_pfnEnumDisplayDevices = NULL;
fInitDone = TRUE;
retCode = FALSE;
_RET_:
return retCode;
}
int WINAPI _getSystemMetrics(int nCode)
{
int retCode;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnGetSystemMetrics(nCode);
goto _RET_;
}
switch( nCode )
{
case SM_CMONITORS:
case SM_SAMEDSPLFORMAT:
return 1;
case SM_XVSCREEN:
case SM_YVSCREEN:
return 0;
case SM_CXVSCREEN:
nCode = SM_CXSCREEN;
break;
case SM_CYVSCREEN:
nCode = SM_CYSCREEN;
break;
}
retCode = GetSystemMetrics(nCode);
_RET_:
return retCode;
}
MHND WINAPI _monitorFromRect(LPCRECT prScreen, UINT nFlags)
{
MHND retCode = NULL;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnMonitorFromRect(prScreen, nFlags);
goto _RET_;
}
if( (prScreen->right < 0) || (prScreen->bottom < 0) )
{
goto _RET_;
}
{
POINT pP = {0,0};
pP.x = prScreen->left;
pP.y = prScreen->top;
retCode = _monitorFromPoint(pP,nFlags);
}
_RET_:
return retCode;
}
MHND WINAPI _monitorFromWindow(HWND hwProbe, UINT nFlags)
{
RECT rR;
MHND retCode = NULL;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnMonitorFromWindow(hwProbe, nFlags);
goto _RET_;
}
if( nFlags & (MONITOR_DEFAULT_TO_PRIMARY | MONITOR_DEFAULT_TO_NEAR) )
{
retCode = PRIMARY_MONITOR;
goto _RET_;
}
if( GetWindowRect(hwProbe, &rR) )
{
retCode = _monitorFromRect(&rR, nFlags);
goto _RET_;
}
_RET_:
return retCode;
}
MHND WINAPI _monitorFromPoint(POINT ptProbe, UINT nFlags)
{
MHND retCode = NULL;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnMonitorFromPoint(ptProbe,nFlags);
goto _RET_;
}
if( nFlags & (MONITOR_DEFAULT_TO_PRIMARY | MONITOR_DEFAULT_TO_NEAR) )
{
goto _ASSIGN_;
}
if( (ptProbe.x <= 0) || (ptProbe.x > GetSystemMetrics(SM_CXSCREEN)) )
{
goto _RET_;
}
if( (ptProbe.y <= 0) || (ptProbe.y < GetSystemMetrics(SM_CYSCREEN)) )
{
goto _RET_;
}
_ASSIGN_:
retCode = PRIMARY_MONITOR;
_RET_:
return retCode;
}
BOOL WINAPI _getMonitorInfo(MHND mhMon, PMONITOR_INFO pmMonInfo)
{
RECT rArea;
BOOL retCode = FALSE;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnGetMonitorInfo(mhMon, pmMonInfo);
goto _RET_;
}
if( mhMon != PRIMARY_MONITOR )
{
goto _RET_;
}
if( NULL == pmMonInfo )
{
goto _RET_;
}
if( FALSE == SystemParametersInfo(SPI_GETWORKAREA,0,&rArea,0) )
{
goto _RET_;
}
if( pmMonInfo->dwSize >= sizeof(MONITOR_INFO) )
{
pmMonInfo->rMonitor.left = 0;
pmMonInfo->rMonitor.top = 0;
pmMonInfo->rMonitor.right = GetSystemMetrics(SM_CXSCREEN);
pmMonInfo->rMonitor.bottom = GetSystemMetrics(SM_CYSCREEN);
pmMonInfo->rWork = rArea;
pmMonInfo->dwFlags = MONITOR_INFO_FLAG_PRIMARY;
if( pmMonInfo->dwSize >= sizeof(MONITOR_INFO_EXTENDED))
{
lstrcpy(((PMONITOR_INFO_EXTENDED)pmMonInfo)->strDevice,
TEXT("DISPLAY") );
}
retCode = TRUE;
}
_RET_:
return retCode;
}
BOOL WINAPI _enumDisplayMonitors(
HDC hDC,LPCRECT lrcSect,
MON_ENUM_CALLBACK_PROC lpfnEnumProc,
LPARAM lData
)
{
BOOL retCode = FALSE;
RECT rToPass = {0,0,0,0};
RECT rBorder = {0,0,0,0};
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnEnumDisplayMonitors (
hDC, lrcSect,
lpfnEnumProc,lData
);
goto _RET_;
}
if( !lpfnEnumProc )
{
goto _RET_;
}
rBorder.left = 0;
rBorder.top = 0;
rBorder.right = GetSystemMetrics(SM_CXSCREEN);
rBorder.bottom = GetSystemMetrics(SM_CYSCREEN);
if( hDC )
{
RECT rSect = {0,0,0,0};
HWND hWnd = NULL;
if( NULL == (hWnd = WindowFromDC(hDC)) )
{
goto _RET_;
}
switch( GetClipBox(hDC,&rSect) )
{
case NULLREGION:
goto _ASSIGN_;
case ERROR:
goto _RET_;
default:
MapWindowPoints(NULL, hWnd, (LPPOINT)&rBorder, 2);
if( TRUE == IntersectRect(&rToPass,&rSect,&rBorder) )
{
break;
}
}
rBorder = rToPass;
}
if( (NULL == lrcSect) || (TRUE == IntersectRect(&rToPass,lrcSect,&rBorder)) )
{
lpfnEnumProc(PRIMARY_MONITOR,hDC,&rToPass,lData);
}
_ASSIGN_:
retCode = TRUE;
_RET_:
return retCode;
}
BOOL WINAPI _enumDisplayDevices (
LPVOID lpReserved, int iDeviceNum,
_DISPLAY_DEVICE * pDisplayDevice, DWORD dwFlags
)
{
BOOL retCode = FALSE;
if( __initMultipleMonitorStubs() )
{
retCode = g_pfnEnumDisplayDevices(lpReserved,iDeviceNum,pDisplayDevice,dwFlags);
}
return retCode;
}
//---------------------------------------------------------------------------
// Extended API.
//---------------------------------------------------------------------------
// Globais
int g_nMonitorCounter;
int g_nMonitorLimit;
MHND* g_hmpMonitors;
// Callbacks
BOOL WINAPI clb_fCountMonitors(MHND,HDC,LPRECT,LPARAM);
BOOL WINAPI clb_fCountMonitors(MHND hMon,HDC hDC,LPRECT rRect,LPARAM lP)
{
g_nMonitorCounter ++;
return TRUE;
}
BOOL WINAPI clb_fCollectMonitors(MHND,HDC,LPRECT,LPARAM);
BOOL WINAPI clb_fCollectMonitors(MHND hMon,HDC hDC,LPRECT rRect,LPARAM lP)
{
if( (g_nMonitorCounter < g_nMonitorLimit) && (NULL != g_hmpMonitors) )
{
g_hmpMonitors[g_nMonitorCounter] = hMon;
g_nMonitorCounter ++;
}
return TRUE;
}
// Tools
void __normaRectPos(RECT*,RECT,RECT);
HWND __createWindow0(MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,HANDLE,LPVOID);
HWND __createWindow1(MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,HANDLE,LPVOID);
void __normaRectPos(RECT* rDest,RECT rSrc,RECT rNorma)
{
int nDX = rSrc.right - rSrc.left;
int nDY = rSrc.bottom - rSrc.top;
rDest->left = rSrc.left + rNorma.left;
rDest->top = rSrc.top + rNorma.top;
rDest->right = rDest->left + nDX;
rDest->bottom = rDest->top + nDY;
}
HWND __createWindow0( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName,
DWORD dwStyle,int x,int y,int nWidth,
int nHeight,HWND hWndParent,HMENU hMenu,
HANDLE hInstance,LPVOID lpParam )
{
HWND retCode = NULL;
if( (NULL != hmMonitor) && (NULL != lpClassName) &&
(NULL != lpWindowName) && (NULL != hInstance) )
{
RECT rRW = {0,0,0,0};
RECT rRM = {0,0,0,0};
RECT rSect = {0,0,0,0};
SetRect(&rRW,x,y,x+nWidth,y+nHeight);
if( TRUE == _monitorBounds(hmMonitor,&rRM) )
{
__normaRectPos(&rRW,rRW,rRM);
IntersectRect(&rSect,&rRM,&rRW);
if( TRUE == EqualRect(&rSect,&rRW) )
{
x = rSect.left;
y = rSect.top;
nWidth = rSect.right - rSect.left;
nHeight = rSect.bottom - rSect.top;
retCode = CreateWindow(
lpClassName,lpWindowName,
dwStyle,x,y,nWidth,
nHeight,hWndParent,hMenu,
(HINSTANCE)hInstance,lpParam
);
} else {
// A coisa indefinida. Nao tenho sabdoria o que
// fazer aqui mesmo
// E necessario perguntar Jeannette
}
}
}
return retCode;
}
HWND __createWindow1( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName,
DWORD dwStyle,int x,int y,int nWidth,
int nHeight,HWND hWndParent,HMENU hMenu,
HANDLE hInstance,LPVOID lpParam )
{
HWND retCode = NULL;
if( (NULL != hmMonitor) && (NULL != lpClassName) &&
(NULL != lpWindowName) && (NULL != hInstance) )
{
RECT rRM = {0,0,0,0};
if( TRUE == _monitorBounds(hmMonitor,&rRM) )
{
HWND wW = NULL;
BOOL wasVisible = (0 != (dwStyle & WS_VISIBLE));
if( TRUE == wasVisible )
{
dwStyle &= ~WS_VISIBLE;
}
if( NULL != (wW = CreateWindow(
lpClassName,lpWindowName,
dwStyle,x,y,nWidth,
nHeight,hWndParent,hMenu,
(HINSTANCE)hInstance,lpParam
)) )
{
RECT rRW = {0,0,0,0};
RECT rSect = {0,0,0,0};
GetWindowRect(wW,&rRW);
__normaRectPos(&rRW,rRW,rRM);
IntersectRect(&rSect,&rRM,&rRW);
if( TRUE == EqualRect(&rSect,&rRW) )
{
x = rSect.left;
y = rSect.top;
nWidth = rSect.right - rSect.left;
nHeight = rSect.bottom - rSect.top;
MoveWindow(wW,x,y,nWidth,nHeight,FALSE);
if( TRUE == wasVisible )
{
UpdateWindow(wW);
ShowWindow(wW,SW_SHOW);
}
retCode = wW;
} else {
// A coisa indefinida. Nao sei o que
// fazer aqui. E necessario perguntar Jeannette
DestroyWindow(wW);
}
}
}
}
return retCode;
}
// Implementations
int WINAPI _countMonitors(void)
{
g_nMonitorCounter = 0;
_enumDisplayMonitors(NULL,NULL,clb_fCountMonitors,0L);
return g_nMonitorCounter;
}
int WINAPI _collectMonitors(MHND* hmpMonitors,int nNum)
{
int retCode = 0;
if( NULL != hmpMonitors )
{
g_nMonitorCounter = 0;
g_nMonitorLimit = nNum;
g_hmpMonitors = hmpMonitors;
_enumDisplayMonitors(NULL,NULL,clb_fCollectMonitors,0L);
retCode = g_nMonitorCounter;
g_nMonitorCounter = 0;
g_nMonitorLimit = 0;
g_hmpMonitors = NULL;
}
return retCode;
}
BOOL WINAPI _monitorBounds(MHND hmMonitor,RECT* rpBounds)
{
BOOL retCode = FALSE;
if( (NULL != hmMonitor) && (NULL != rpBounds) )
{
MONITOR_INFO miInfo;
memset((void*)(&miInfo),0,sizeof(MONITOR_INFO));
miInfo.dwSize = sizeof(MONITOR_INFO);
if( TRUE == (retCode = _getMonitorInfo(hmMonitor,&(miInfo))) )
{
(*rpBounds) = miInfo.rMonitor;
}
}
return retCode;
}
HDC WINAPI _makeDCFromMonitor(MHND hmMonitor) {
HDC retCode = NULL;
if( NULL != hmMonitor ) {
MONITOR_INFO_EXTENDED mieInfo;
memset((void*)(&mieInfo),0,sizeof(MONITOR_INFO_EXTENDED));
mieInfo.dwSize = sizeof(MONITOR_INFO_EXTENDED);
if( TRUE == _getMonitorInfo(hmMonitor,(PMONITOR_INFO)(&mieInfo)) ) {
HDC hDC = CreateDC(mieInfo.strDevice,NULL,NULL,NULL);
if( NULL != hDC ) {
retCode = hDC;
}
}
}
return retCode;
}
HWND WINAPI _createWindowOM( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName,
DWORD dwStyle,int x,int y,int nWidth,
int nHeight,HWND hWndParent,HMENU hMenu,
HANDLE hInstance,LPVOID lpParam )
{
if( (CW_USEDEFAULT == x) || (CW_USEDEFAULT == y) ||
(CW_USEDEFAULT == nWidth) || (CW_USEDEFAULT == nHeight) )
{
return __createWindow1 (
hmMonitor,lpClassName,lpWindowName,
dwStyle,x,y,nWidth,
nHeight,hWndParent,hMenu,
hInstance,lpParam
);
}
return __createWindow0 (
hmMonitor,lpClassName,lpWindowName,
dwStyle,x,y,nWidth,
nHeight,hWndParent,hMenu,
hInstance,lpParam
);
}
/*
* Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#ifndef _INC_MMSTUB
#define _INC_MMSTUB
#ifndef _WINDOWS_
#include "windows.h"
#endif
#ifndef _AWT_H_
#include "awt.h"
#endif
#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
/* Cdecl for C++ */
#ifdef __cplusplus
extern "C" {
#endif
/* Constants */
#define SM_XVSCREEN 76
#define SM_YVSCREEN 77
#define SM_CXVSCREEN 78
#define SM_CYVSCREEN 79
#define SM_CMONITORS 80
#define SM_SAMEDSPLFORMAT 81
#define MONITOR_DEFAULT_TO_NULL 0x00000000
#define MONITOR_DEFAULT_TO_PRIMARY 0x00000001
#define MONITOR_DEFAULT_TO_NEAR 0x00000002
#define MONITOR_INFO_FLAG_PRIMARY 0x00000001
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001
#define DISPLAY_DEVICE_MULTY_DRIVER 0x00000002
#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004
#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008
#define DISPLAY_DEVICE_VGA 0x00000010
#define ENUM_CURRENT_SETTINGS ((DWORD)-1)
#define ENUM_REGISTRY_SETTINGS ((DWORD)-2)
#define PRIMARY_MONITOR ((MHND)0x42)
#define DEV_NAME_LEN 32
#define DEV_STR_LEN 128
// Datatypes
typedef HANDLE MHND;
typedef BOOL (CALLBACK* MON_ENUM_CALLBACK_PROC)(MHND,HDC,LPRECT,LPARAM);
typedef struct tagMONITOR_INFO
{
DWORD dwSize;
RECT rMonitor;
RECT rWork;
DWORD dwFlags;
} MONITOR_INFO, *PMONITOR_INFO;
typedef struct tagMONITOR_INFO_EXTENDED
{
DWORD dwSize;
RECT rMonitor;
RECT rWork;
DWORD dwFlags;
TCHAR strDevice[DEV_NAME_LEN];
} MONITOR_INFO_EXTENDED, *PMONITOR_INFO_EXTENDED;
typedef struct tagDISPLAY_DEVICE
{
DWORD dwSize;
WCHAR strDevName[DEV_NAME_LEN];
WCHAR strDevString[DEV_STR_LEN];
DWORD dwFlags;
WCHAR deviceID[128];
WCHAR deviceKey[128];
} _DISPLAY_DEVICE, *P_DISPLAY_DEVICE;
/* Basic API's */
BOOL WINAPI _enumDisplayMonitors(HDC,LPCRECT,MON_ENUM_CALLBACK_PROC,LPARAM);
BOOL WINAPI _enumDisplayDevices (LPVOID,int,P_DISPLAY_DEVICE,DWORD);
BOOL WINAPI _getMonitorInfo (MHND,PMONITOR_INFO);
MHND WINAPI _monitorFromPoint (POINT,UINT);
MHND WINAPI _monitorFromWindow (HWND,UINT);
MHND WINAPI _monitorFromRect (LPCRECT,UINT);
int WINAPI _getSystemMetrics (int);
/* Additional API's */
int WINAPI _countMonitors (void);
int WINAPI _collectMonitors (MHND*,int);
BOOL WINAPI _monitorBounds (MHND,RECT*);
HDC WINAPI _makeDCFromMonitor (MHND);
HWND WINAPI _createWindowOM (MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int,
int,HWND,HMENU,HANDLE,LPVOID);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) */
#endif /* _INC_MMSTUB */
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "awt_MenuItem.h" #include "awt_MenuItem.h"
#include "awt_Menu.h" #include "awt_Menu.h"
#include "awt_MenuBar.h" #include "awt_MenuBar.h"
...@@ -70,7 +71,6 @@ jmethodID AwtMenuItem::getDefaultFontMID; ...@@ -70,7 +71,6 @@ jmethodID AwtMenuItem::getDefaultFontMID;
LANGID AwtMenuItem::m_idLang = LOWORD(GetKeyboardLayout(0)); LANGID AwtMenuItem::m_idLang = LOWORD(GetKeyboardLayout(0));
UINT AwtMenuItem::m_CodePage = UINT AwtMenuItem::m_CodePage =
AwtMenuItem::LangToCodePage(AwtMenuItem::m_idLang); AwtMenuItem::LangToCodePage(AwtMenuItem::m_idLang);
BOOL AwtMenuItem::m_isWin95 = IS_WIN95;
BOOL AwtMenuItem::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC || BOOL AwtMenuItem::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC ||
PRIMARYLANGID(GetInputLanguage()) == LANG_HEBREW; PRIMARYLANGID(GetInputLanguage()) == LANG_HEBREW;
BOOL AwtMenuItem::sm_rtlReadingOrder = BOOL AwtMenuItem::sm_rtlReadingOrder =
...@@ -150,7 +150,7 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu) ...@@ -150,7 +150,7 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu)
jobject createError = NULL; jobject createError = NULL;
if (dw == ERROR_OUTOFMEMORY) if (dw == ERROR_OUTOFMEMORY)
{ {
jstring errorMsg = env->NewStringUTF("too many menu handles"); jstring errorMsg = JNU_NewStringPlatform(env, L"too many menu handles");
createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError",
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
errorMsg); errorMsg);
...@@ -435,15 +435,6 @@ void AwtMenuItem::DrawItem(DRAWITEMSTRUCT& drawInfo) ...@@ -435,15 +435,6 @@ void AwtMenuItem::DrawItem(DRAWITEMSTRUCT& drawInfo)
if (drawInfo.itemID != m_Id) if (drawInfo.itemID != m_Id)
return; return;
/* Fixed bug 4349969. Since the problem occurs on Windows 98 and not on
Windows NT, the fix is to check for Windows 95/98 and to check if the
handle to the menu of the item to be drawn is the same as the handle to the
menu of the menu object. If they're not the same, just return and don't do
the drawing.
*/
if ( IS_WIN95 && drawInfo.hwndItem != (HWND)this->m_menuContainer->GetHMenu()) {
return;
} else
DrawSelf(drawInfo); DrawSelf(drawInfo);
} }
...@@ -802,8 +793,9 @@ BOOL AwtMenuItem::IsSeparator() { ...@@ -802,8 +793,9 @@ BOOL AwtMenuItem::IsSeparator() {
jobject jitem = GetTarget(env); jobject jitem = GetTarget(env);
jstring label = jstring label =
(jstring)(env)->GetObjectField(jitem, AwtMenuItem::labelID); (jstring)(env)->GetObjectField(jitem, AwtMenuItem::labelID);
LPWSTR labelW = TO_WSTRING(label); LPCWSTR labelW = JNU_GetStringPlatformChars(env, label, NULL);
BOOL isSeparator = (labelW && (wcscmp(labelW, L"-") == 0)); BOOL isSeparator = (labelW && (wcscmp(labelW, L"-") == 0));
JNU_ReleaseStringPlatformChars(env, label, labelW);
env->DeleteLocalRef(label); env->DeleteLocalRef(label);
env->DeleteLocalRef(jitem); env->DeleteLocalRef(jitem);
......
/*
* Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#ifndef _INC_MULTIMON_
#define _INC_MULTIMON_
#endif
//
// build defines that replace the regular APIs with our versions
//
#undef GetMonitorInfo
#undef GetSystemMetrics
#undef MonitorFromWindow
#undef MonitorFromRect
#undef MonitorFromPoint
#undef EnumDisplayMonitors
#undef EnumDisplayDevices
#include "awt_MMStub.h"
#define GetSystemMetricsMM _getSystemMetrics
#define MonitorFromWindow _monitorFromWindow
#define MonitorFromRect _monitorFromRect
#define MonitorFromPoint _monitorFromPoint
#define GetMonitorInfo _getMonitorInfo
#define EnumDisplayMonitors _enumDisplayMonitors
#define EnumDisplayDevices _enumDisplayDevices
#define CountMonitors _countMonitors
#define CollectMonitors _collectMonitors
#define MonitorBounds _monitorBounds
#define MakeDCFromMonitor _makeDCFromMonitor
#define CreateWindowOnMonitor _createWindowOM
...@@ -25,9 +25,6 @@ ...@@ -25,9 +25,6 @@
#include "awt_Object.h" #include "awt_Object.h"
#include "ObjectList.h" #include "ObjectList.h"
#ifdef DEBUG
#include "awt_Unicode.h"
#endif
#ifdef DEBUG #ifdef DEBUG
static BOOL reportEvents = FALSE; static BOOL reportEvents = FALSE;
...@@ -116,8 +113,9 @@ AwtObject::DoCallback(const char* methodName, const char* methodSig, ...) ...@@ -116,8 +113,9 @@ AwtObject::DoCallback(const char* methodName, const char* methodSig, ...)
"getName", "getName",
"()Ljava/lang/String;").l; "()Ljava/lang/String;").l;
DASSERT(!safe_ExceptionOccurred(env)); DASSERT(!safe_ExceptionOccurred(env));
printf("Posting %s%s method to %S\n", methodName, methodSig, LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL);
TO_WSTRING(targetStr)); printf("Posting %s%s method to %S\n", methodName, methodSig, targetStrW);
JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW);
} }
#endif #endif
/* caching would do much good here */ /* caching would do much good here */
...@@ -148,8 +146,11 @@ void AwtObject::SendEvent(jobject event) ...@@ -148,8 +146,11 @@ void AwtObject::SendEvent(jobject event)
(jstring)JNU_CallMethodByName(env, NULL, GetTarget(env),"getName", (jstring)JNU_CallMethodByName(env, NULL, GetTarget(env),"getName",
"()Ljava/lang/String;").l; "()Ljava/lang/String;").l;
DASSERT(!safe_ExceptionOccurred(env)); DASSERT(!safe_ExceptionOccurred(env));
printf("Posting %S to %S\n", TO_WSTRING(eventStr), LPCWSTR eventStrW = JNU_GetStringPlatformChars(env, eventStr, NULL);
TO_WSTRING(targetStr)); LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL);
printf("Posting %S to %S\n", eventStrW, targetStrW);
JNU_ReleaseStringPlatformChars(env, eventStr, eventStrW);
JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW);
} }
#endif #endif
/* Post event to the system EventQueue. */ /* Post event to the system EventQueue. */
......
/* /*
* Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* have any questions. * have any questions.
*/ */
#include <windows.h> #include "awt.h"
#include "awt_Palette.h" #include "awt_Palette.h"
#include "awt_Component.h" #include "awt_Component.h"
#include "img_util_md.h" #include "img_util_md.h"
......
...@@ -234,11 +234,13 @@ void AwtPopupMenu::Enable(BOOL isEnabled) ...@@ -234,11 +234,13 @@ void AwtPopupMenu::Enable(BOOL isEnabled)
jobject jitem = item->GetTarget(env); jobject jitem = item->GetTarget(env);
BOOL bItemEnabled = isEnabled && (jboolean)env->GetBooleanField(jitem, BOOL bItemEnabled = isEnabled && (jboolean)env->GetBooleanField(jitem,
AwtMenuItem::enabledID); AwtMenuItem::enabledID);
LPWSTR labelW = TO_WSTRING((jstring)env->GetObjectField(jitem, jstring labelStr = static_cast<jstring>(env->GetObjectField(jitem, AwtMenuItem::labelID));
AwtMenuItem::labelID)); LPCWSTR labelStrW = JNU_GetStringPlatformChars(env, labelStr, NULL);
if (labelW != NULL && wcscmp(labelW,L"-") != 0) { if (labelStrW && wcscmp(labelStrW, L"-") != 0) {
item->Enable(bItemEnabled); item->Enable(bItemEnabled);
} }
JNU_ReleaseStringPlatformChars(env, labelStr, labelStrW);
env->DeleteLocalRef(labelStr);
env->DeleteLocalRef(jitem); env->DeleteLocalRef(jitem);
} }
env->DeleteLocalRef(target); env->DeleteLocalRef(target);
......
/* /*
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -108,16 +108,13 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, ...@@ -108,16 +108,13 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
{ {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
BOOL nt = IS_NT;
DWORD cReturned = 0; DWORD cReturned = 0;
if (pPrinterEnum == NULL) { if (pPrinterEnum == NULL) {
// Compute size of buffer // Compute size of buffer
DWORD cbNeeded = 0; DWORD cbNeeded = 0;
if (nt) {
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 2, NULL, 0, &cbNeeded, &cReturned); NULL, 2, NULL, 0, &cbNeeded, &cReturned);
}
::EnumPrinters(PRINTER_ENUM_LOCAL, ::EnumPrinters(PRINTER_ENUM_LOCAL,
NULL, 5, NULL, 0, pcbBuf, &cReturned); NULL, 5, NULL, 0, pcbBuf, &cReturned);
if (cbNeeded > (*pcbBuf)) { if (cbNeeded > (*pcbBuf)) {
...@@ -139,7 +136,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, ...@@ -139,7 +136,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
// doesn't support port searches. So, if the user has specified the // doesn't support port searches. So, if the user has specified the
// printer name as "LPT1:" (even though this is actually a port // printer name as "LPT1:" (even though this is actually a port
// name), we won't find the printer here. // name), we won't find the printer here.
if (nt) {
if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) { NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) {
return FALSE; return FALSE;
...@@ -195,9 +191,8 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, ...@@ -195,9 +191,8 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
return FALSE; return FALSE;
} }
} }
}
// We still haven't found the printer, or we're using 95/98. // We still haven't found the printer, /* or we're using 95/98. */
// PRINTER_INFO_5 supports both printer name and port name, so // PRINTER_INFO_5 supports both printer name and port name, so
// we'll test both. On NT, PRINTER_ENUM_LOCAL means just local // we'll test both. On NT, PRINTER_ENUM_LOCAL means just local
// printers. This is what we want, because we already tested all // printers. This is what we want, because we already tested all
...@@ -213,7 +208,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, ...@@ -213,7 +208,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
for (DWORD i = 0; i < cReturned; i++) { for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *) PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_5)); (pPrinterEnum + i * sizeof(PRINTER_INFO_5));
if (nt) {
// pPortName can specify multiple ports. Test them one at // pPortName can specify multiple ports. Test them one at
// a time. // a time.
if (info5->pPortName != NULL) { if (info5->pPortName != NULL) {
...@@ -227,16 +221,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, ...@@ -227,16 +221,6 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
port = _tcstok(NULL, TEXT(",")); port = _tcstok(NULL, TEXT(","));
} }
} }
} else {
if ((info5->pPrinterName != NULL &&
_tcsicmp(lpcPrinterName, info5->pPrinterName) == 0) ||
(info5->pPortName != NULL &&
_tcsicmp(lpcPrinterName, info5->pPortName) == 0)) {
*foundPrinter = info5->pPrinterName;
*foundPort = info5->pPortName;
return TRUE;
}
}
} }
return FALSE; return FALSE;
...@@ -400,14 +384,12 @@ BOOL AwtPrintControl::CreateDevModeAndDevNames(PRINTDLG *ppd, ...@@ -400,14 +384,12 @@ BOOL AwtPrintControl::CreateDevModeAndDevNames(PRINTDLG *ppd,
} }
// Create DEVNAMES. // Create DEVNAMES.
if (IS_NT) {
if (pPortName != NULL) { if (pPortName != NULL) {
info2->pPortName = pPortName; info2->pPortName = pPortName;
} else if (info2->pPortName != NULL) { } else if (info2->pPortName != NULL) {
// pPortName may specify multiple ports. We only want one. // pPortName may specify multiple ports. We only want one.
info2->pPortName = _tcstok(info2->pPortName, TEXT(",")); info2->pPortName = _tcstok(info2->pPortName, TEXT(","));
} }
}
size_t lenDriverName = ((info2->pDriverName != NULL) size_t lenDriverName = ((info2->pDriverName != NULL)
? _tcslen(info2->pDriverName) ? _tcslen(info2->pDriverName)
......
/* /*
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "awt_PrintDialog.h" #include "awt_PrintDialog.h"
#include "awt_Dialog.h" #include "awt_Dialog.h"
#include "awt_PrintControl.h" #include "awt_PrintControl.h"
#include "awt_dlls.h"
#include "awt_Window.h" #include "awt_Window.h"
#include "ComCtl32Util.h" #include "ComCtl32Util.h"
#include <sun_awt_windows_WPrintDialog.h> #include <sun_awt_windows_WPrintDialog.h>
...@@ -39,11 +39,9 @@ jmethodID AwtPrintDialog::setHWndMID; ...@@ -39,11 +39,9 @@ jmethodID AwtPrintDialog::setHWndMID;
BOOL BOOL
AwtPrintDialog::PrintDlg(LPPRINTDLG data) { AwtPrintDialog::PrintDlg(LPPRINTDLG data) {
AwtCommDialog::load_comdlg_procs();
return static_cast<BOOL>(reinterpret_cast<INT_PTR>( return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().InvokeFunction( AwtToolkit::GetInstance().InvokeFunction(
reinterpret_cast<void *(*)(void *)>(AwtCommDialog::PrintDlgWrapper), reinterpret_cast<void *(*)(void *)>(::PrintDlg), data)));
data)));
} }
LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message, LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message,
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include <math.h> #include <math.h>
#include <windef.h> #include <windef.h>
#include <wtypes.h> #include <wtypes.h>
...@@ -30,10 +31,9 @@ ...@@ -30,10 +31,9 @@
#include <commdlg.h> #include <commdlg.h>
#include <winspool.h> #include <winspool.h>
#include "awt.h"
#include "awt_dlls.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Component.h" #include "awt_Component.h"
#include "awt_Dialog.h"
#include "awt_Font.h" #include "awt_Font.h"
#include "awt_PrintDialog.h" #include "awt_PrintDialog.h"
#include "awt_PrintControl.h" #include "awt_PrintControl.h"
...@@ -422,7 +422,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) ...@@ -422,7 +422,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
*/ */
if (AwtPrintControl::getPrintHDMode(env, self) == NULL || if (AwtPrintControl::getPrintHDMode(env, self) == NULL ||
AwtPrintControl::getPrintHDName(env,self) == NULL) { AwtPrintControl::getPrintHDName(env,self) == NULL) {
(void)AwtCommDialog::PageSetupDlg(&setup); (void)::PageSetupDlg(&setup);
/* check if hDevMode and hDevNames are set. /* check if hDevMode and hDevNames are set.
* If both are null, then there is no default printer. * If both are null, then there is no default printer.
*/ */
...@@ -460,7 +460,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) ...@@ -460,7 +460,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
AwtDialog::CheckInstallModalHook(); AwtDialog::CheckInstallModalHook();
BOOL ret = AwtCommDialog::PageSetupDlg(&setup); BOOL ret = ::PageSetupDlg(&setup);
if (ret) { if (ret) {
jobject paper = getPaper(env, page); jobject paper = getPaper(env, page);
...@@ -733,7 +733,7 @@ Java_sun_awt_windows_WPrinterJob_validatePaper(JNIEnv *env, jobject self, ...@@ -733,7 +733,7 @@ Java_sun_awt_windows_WPrinterJob_validatePaper(JNIEnv *env, jobject self,
pd.lStructSize = sizeof(PRINTDLG); pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC; pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
if (AwtCommDialog::PrintDlg(&pd)) { if (::PrintDlg(&pd)) {
printDC = pd.hDC; printDC = pd.hDC;
hDevMode = pd.hDevMode; hDevMode = pd.hDevMode;
hDevNames = pd.hDevNames; hDevNames = pd.hDevNames;
...@@ -1838,10 +1838,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_selectStylePen ...@@ -1838,10 +1838,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_selectStylePen
(JNIEnv *env, jobject self, jlong printDC, jlong cap, jlong join, jfloat width, (JNIEnv *env, jobject self, jlong printDC, jlong cap, jlong join, jfloat width,
jint red, jint green, jint blue) { jint red, jint green, jint blue) {
/* End cap and line join styles are not supported in Win 9x. */
if (IS_WIN95)
return JNI_FALSE;
TRY; TRY;
LOGBRUSH logBrush; LOGBRUSH logBrush;
...@@ -1879,7 +1875,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont ...@@ -1879,7 +1875,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont
{ {
jboolean didSetFont = JNI_FALSE; jboolean didSetFont = JNI_FALSE;
if (IS_NT) {
didSetFont = jFontToWFontW(env, (HDC)printDC, didSetFont = jFontToWFontW(env, (HDC)printDC,
fontName, fontName,
fontSize, fontSize,
...@@ -1887,15 +1882,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont ...@@ -1887,15 +1882,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont
isItalic, isItalic,
rotation, rotation,
awScale); awScale);
} else {
didSetFont = jFontToWFontA(env, (HDC)printDC,
fontName,
fontSize,
isBold,
isItalic,
rotation,
awScale);
}
return didSetFont; return didSetFont;
} }
...@@ -1919,7 +1905,7 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -1919,7 +1905,7 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
memset(&matchedLogFont, 0, sizeof(matchedLogFont)); memset(&matchedLogFont, 0, sizeof(matchedLogFont));
WCHAR* name = TO_WSTRING(fontName); LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
/* Some fontnames of Non-ASCII fonts like 'MS Minchou' are themselves /* Some fontnames of Non-ASCII fonts like 'MS Minchou' are themselves
...@@ -1930,12 +1916,12 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -1930,12 +1916,12 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
// maxlen is int due to cbMultiByte parameter is int // maxlen is int due to cbMultiByte parameter is int
int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page
0, // flags 0, // flags
name, // Unicode string fontNameW, // Unicode string
-1, // Unicode length is calculated automatically -1, // Unicode length is calculated automatically
lf.lfFaceName, // Put ASCII string here lf.lfFaceName, // Put ASCII string here
maxlen, // max len maxlen, // max len
NULL, // default handling of unmappables NULL, // default handling of unmappables
NULL);// do not care if def char is used NULL); // do not care if def char is used
/* If WideCharToMultiByte succeeded then the number /* If WideCharToMultiByte succeeded then the number
* of bytes it copied into the face name buffer will * of bytes it copied into the face name buffer will
...@@ -2018,9 +2004,10 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -2018,9 +2004,10 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
} else { } else {
foundFont = false; foundFont = false;
} }
} }
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return foundFont ? JNI_TRUE : JNI_FALSE; return foundFont ? JNI_TRUE : JNI_FALSE;
} }
...@@ -2043,27 +2030,29 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -2043,27 +2030,29 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
memset(&matchedLogFont, 0, sizeof(matchedLogFont)); memset(&matchedLogFont, 0, sizeof(matchedLogFont));
LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
/* Describe the GDI fonts we want enumerated. We /* Describe the GDI fonts we want enumerated. We
* simply supply the java font name and let GDI * simply supply the java font name and let GDI
* do the matching. If the java font name is * do the matching. If the java font name is
* longer than the GDI maximum font lenght then * longer than the GDI maximum font lenght then
* we can't convert the font. * we can't convert the font.
*/ */
WCHAR* name = TO_WSTRING(fontName); size_t nameLen = wcslen(fontNameW);
size_t nameLen = wcslen(name);
if (nameLen < (sizeof(lf.lfFaceName) / sizeof(lf.lfFaceName[0]))) { if (nameLen < (sizeof(lf.lfFaceName) / sizeof(lf.lfFaceName[0]))) {
wcscpy(lf.lfFaceName, name); wcscpy(lf.lfFaceName, fontNameW);
lf.lfCharSet = DEFAULT_CHARSET; lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = 0; lf.lfPitchAndFamily = 0;
foundFont = !EnumFontFamiliesExW((HDC)printDC, &lf, foundFont = !::EnumFontFamiliesEx((HDC)printDC, &lf,
(FONTENUMPROCW) fontEnumProcW, (FONTENUMPROCW) fontEnumProcW,
(LPARAM) &matchedLogFont, 0); (LPARAM) &matchedLogFont, 0);
} }
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
if (!foundFont) { if (!foundFont) {
return JNI_FALSE; return JNI_FALSE;
} }
...@@ -2100,7 +2089,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -2100,7 +2089,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
//Debug: dumpLogFont(&matchedLogFont); //Debug: dumpLogFont(&matchedLogFont);
HFONT font = CreateFontIndirectW(&matchedLogFont); HFONT font = ::CreateFontIndirect(&matchedLogFont);
if (font == NULL) { if (font == NULL) {
return JNI_FALSE; return JNI_FALSE;
} }
...@@ -2123,7 +2112,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, ...@@ -2123,7 +2112,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
GetTextMetrics(printDC, &tm); GetTextMetrics(printDC, &tm);
avgWidth = tm.tmAveCharWidth; avgWidth = tm.tmAveCharWidth;
matchedLogFont.lfWidth = (LONG)((fabs)(avgWidth*awScale)); matchedLogFont.lfWidth = (LONG)((fabs)(avgWidth*awScale));
font = CreateFontIndirectW(&matchedLogFont); font = ::CreateFontIndirect(&matchedLogFont);
if (font == NULL) { if (font == NULL) {
return JNI_FALSE; return JNI_FALSE;
} }
...@@ -2230,14 +2219,11 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getGDIAdvance ...@@ -2230,14 +2219,11 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getGDIAdvance
(JNIEnv *env, jobject self, jlong printDC, jstring text) (JNIEnv *env, jobject self, jlong printDC, jstring text)
{ {
SIZE size; SIZE size;
LPWSTR wText = TO_WSTRING(text); LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL);
size_t strLen = wcslen(wText); size_t strLen = wcslen(wText);
BOOL ok = GetTextExtentPoint32((HDC)printDC, wText, (int)strLen, &size); BOOL ok = GetTextExtentPoint32((HDC)printDC, wText, (int)strLen, &size);
if (ok) { JNU_ReleaseStringPlatformChars(env, text, wText);
return size.cx; return ok ? size.cx : 0;
} else {
return 0;
}
} }
...@@ -2288,7 +2274,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut ...@@ -2288,7 +2274,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
long posX = ROUND_TO_LONG(x); long posX = ROUND_TO_LONG(x);
long posY = ROUND_TO_LONG(y); long posY = ROUND_TO_LONG(y);
int flags = (glyphCodes !=0) ? ETO_GLYPH_INDEX : 0; int flags = (glyphCodes !=0) ? ETO_GLYPH_INDEX : 0;
LPWSTR wText = TO_WSTRING(text); LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL);
int *advances = NULL, *xadvances = NULL, *xyadvances = NULL; int *advances = NULL, *xadvances = NULL, *xyadvances = NULL;
BOOL useYAdvances = FALSE; BOOL useYAdvances = FALSE;
...@@ -2359,7 +2345,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut ...@@ -2359,7 +2345,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
*inxyAdvances = 0; *inxyAdvances = 0;
} }
if (useYAdvances && IS_WIN2000) { if (useYAdvances) {
advances = xyadvances; advances = xyadvances;
flags |= J2D_ETO_PDY; flags |= J2D_ETO_PDY;
} else { } else {
...@@ -2371,7 +2357,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut ...@@ -2371,7 +2357,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
env->ReleaseFloatArrayElements(positions, glyphPos, JNI_ABORT); env->ReleaseFloatArrayElements(positions, glyphPos, JNI_ABORT);
} }
BOOL drawn = ::ExtTextOutW( (HDC)printDC, BOOL drawn = ::ExtTextOut((HDC)printDC,
posX, posY, // starting position for the text posX, posY, // starting position for the text
flags, // glyphCodes?, y advances? flags, // glyphCodes?, y advances?
NULL, // optional clipping-opaquing rectangle NULL, // optional clipping-opaquing rectangle
...@@ -2385,6 +2371,8 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut ...@@ -2385,6 +2371,8 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
if (xyadvances != NULL) { if (xyadvances != NULL) {
free(xyadvances); free(xyadvances);
} }
JNU_ReleaseStringPlatformChars(env, text, wText);
} }
/** /**
...@@ -2968,7 +2956,7 @@ static HDC getDefaultPrinterDC(JNIEnv *env, jobject printerJob) { ...@@ -2968,7 +2956,7 @@ static HDC getDefaultPrinterDC(JNIEnv *env, jobject printerJob) {
pd.lStructSize = sizeof(PRINTDLG); pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC; pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
if (AwtCommDialog::PrintDlg(&pd)) { if (::PrintDlg(&pd)) {
printDC = pd.hDC; printDC = pd.hDC;
/* Find out how many copies the driver can do, and use driver's /* Find out how many copies the driver can do, and use driver's
......
/* /*
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Component.h" #include "awt_Component.h"
#include "awt_Robot.h" #include "awt_Robot.h"
...@@ -141,45 +142,7 @@ void AwtRobot::MouseRelease( jint buttonMask ) ...@@ -141,45 +142,7 @@ void AwtRobot::MouseRelease( jint buttonMask )
} }
void AwtRobot::MouseWheel (jint wheelAmt) { void AwtRobot::MouseWheel (jint wheelAmt) {
if (IS_WIN95 && !IS_WIN98) {
// Other win32 platforms do nothing for mouse_event(0), so
// do nothing on 95, too.
if (wheelAmt == 0) {
return;
}
// Win95 doesn't understand MOUSEEVENTF_WHEEL, so use PostEvent
POINT curPos;
HWND mouseOver = NULL;
HWND topLevel = NULL;
UINT wheelMsg = NULL;
if (::GetCursorPos((LPPOINT)&curPos) == 0) {
return;
}
// get hwnd of top-level container
mouseOver = ::WindowFromPoint(curPos);
DASSERT(mouseOver);
topLevel = AwtComponent::GetTopLevelParentForWindow(mouseOver);
DASSERT(topLevel);
if (::ScreenToClient(topLevel, (LPPOINT)&curPos) == 0) {
return;
}
wheelMsg = AwtComponent::Wheel95GetMsg();
if (wheelMsg == NULL) {
return;
}
::PostMessage(topLevel,
wheelMsg,
wheelAmt * -1 * WHEEL_DELTA,
MAKELPARAM((WORD)curPos.x, (WORD)curPos.y));
}
else {
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, wheelAmt * -1 * WHEEL_DELTA, 0); mouse_event(MOUSEEVENTF_WHEEL, 0, 0, wheelAmt * -1 * WHEEL_DELTA, 0);
}
} }
inline jint AwtRobot::WinToJavaPixel(USHORT r, USHORT g, USHORT b) inline jint AwtRobot::WinToJavaPixel(USHORT r, USHORT g, USHORT b)
......
/* /*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -108,13 +108,6 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent) ...@@ -108,13 +108,6 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
{ {
DWORD style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; DWORD style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
if (!IS_WIN4X) {
/*
* It's been decided by the UI folks that 3.X ScrollPanes
* should have borders...
*/
style |= WS_BORDER;
}
jint scrollbarDisplayPolicy = jint scrollbarDisplayPolicy =
env->GetIntField(target, scrollbarDisplayPolicyID); env->GetIntField(target, scrollbarDisplayPolicyID);
...@@ -122,7 +115,7 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent) ...@@ -122,7 +115,7 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
== java_awt_ScrollPane_SCROLLBARS_ALWAYS) { == java_awt_ScrollPane_SCROLLBARS_ALWAYS) {
style |= WS_HSCROLL | WS_VSCROLL; style |= WS_HSCROLL | WS_VSCROLL;
} }
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0; DWORD exStyle = WS_EX_CLIENTEDGE;
if (GetRTL()) { if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
...@@ -225,15 +218,8 @@ void AwtScrollPane::RecalcSizes(int parentWidth, int parentHeight, ...@@ -225,15 +218,8 @@ void AwtScrollPane::RecalcSizes(int parentWidth, int parentHeight,
} }
/* Determine border width without scrollbars. */ /* Determine border width without scrollbars. */
int horzBorder; int horzBorder = ::GetSystemMetrics(SM_CXEDGE);;
int vertBorder; int vertBorder = ::GetSystemMetrics(SM_CYEDGE);;
if (IS_WIN4X) {
horzBorder = ::GetSystemMetrics(SM_CXEDGE);
vertBorder = ::GetSystemMetrics(SM_CYEDGE);
} else {
horzBorder = ::GetSystemMetrics(SM_CXBORDER);
vertBorder = ::GetSystemMetrics(SM_CYBORDER);
}
parentWidth -= (horzBorder * 2); parentWidth -= (horzBorder * 2);
parentHeight -= (vertBorder * 2); parentHeight -= (vertBorder * 2);
......
/* /*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,10 +26,8 @@ ...@@ -26,10 +26,8 @@
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_TextArea.h" #include "awt_TextArea.h"
#include "awt_TextComponent.h" #include "awt_TextComponent.h"
#include "awt_dlls.h"
#include "awt_KeyboardFocusManager.h" #include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h" #include "awt_Canvas.h"
#include "awt_Unicode.h"
#include "awt_Window.h" #include "awt_Window.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
...@@ -50,7 +48,6 @@ struct ReplaceTextStruct { ...@@ -50,7 +48,6 @@ struct ReplaceTextStruct {
jfieldID AwtTextArea::scrollbarVisibilityID; jfieldID AwtTextArea::scrollbarVisibilityID;
WNDPROC AwtTextArea::sm_pDefWindowProc = NULL; WNDPROC AwtTextArea::sm_pDefWindowProc = NULL;
BOOL AwtTextArea::sm_RichEdit20 = (IS_WIN98 || IS_NT);
/************************************************************************ /************************************************************************
* AwtTextArea methods * AwtTextArea methods
...@@ -78,8 +75,12 @@ void AwtTextArea::Dispose() ...@@ -78,8 +75,12 @@ void AwtTextArea::Dispose()
} }
LPCTSTR AwtTextArea::GetClassName() { LPCTSTR AwtTextArea::GetClassName() {
load_rich_edit_library(); static BOOL richedLibraryLoaded = FALSE;
return sm_RichEdit20 ? RICHEDIT_CLASS : TEXT("RICHEDIT"); if (!richedLibraryLoaded) {
::LoadLibrary(TEXT("RICHED20.DLL"));
richedLibraryLoaded = TRUE;
}
return RICHEDIT_CLASS;
} }
/* Create a new AwtTextArea object and window. */ /* Create a new AwtTextArea object and window. */
...@@ -134,9 +135,8 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent) ...@@ -134,9 +135,8 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent)
* scrollbars instead of hiding them when not needed. * scrollbars instead of hiding them when not needed.
*/ */
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT | ES_MULTILINE | DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT | ES_MULTILINE |
ES_WANTRETURN | scroll_style | ES_WANTRETURN | scroll_style | ES_DISABLENOSCROLL;
(IS_WIN4X ? 0 : WS_BORDER) | ES_DISABLENOSCROLL; DWORD exStyle = WS_EX_CLIENTEDGE;
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
if (GetRTL()) { if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder()) if (GetRTLReadingOrder())
...@@ -169,9 +169,7 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent) ...@@ -169,9 +169,7 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent)
// end-of-document marker or carriage return, // end-of-document marker or carriage return,
// to format paragraphs. // to format paragraphs.
// kdm@sparc.spb.su // kdm@sparc.spb.su
if (sm_RichEdit20) {
c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0); c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0);
}
c->m_backgroundColorSet = TRUE; c->m_backgroundColorSet = TRUE;
/* suppress inheriting parent's color. */ /* suppress inheriting parent's color. */
...@@ -242,7 +240,7 @@ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen) ...@@ -242,7 +240,7 @@ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen)
*/ */
size_t length = env->GetStringLength(jStr) + 1; size_t length = env->GetStringLength(jStr) + 1;
WCHAR *string = new WCHAR[length]; WCHAR *string = new WCHAR[length];
env->GetStringRegion(jStr, 0, static_cast<jsize>(length - 1), string); env->GetStringRegion(jStr, 0, static_cast<jsize>(length - 1), reinterpret_cast<jchar*>(string));
string[length-1] = '\0'; string[length-1] = '\0';
for (size_t i = 0; i < maxlen && i < length - 1; i++) { for (size_t i = 0; i < maxlen && i < length - 1; i++) {
if (string[i] == L'\n') { if (string[i] == L'\n') {
...@@ -461,12 +459,7 @@ AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { ...@@ -461,12 +459,7 @@ AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
/* Check if all the text is selected. */ /* Check if all the text is selected. */
if (cr.cpMin == 0) { if (cr.cpMin == 0) {
int len = 0; int len = ::GetWindowTextLength(GetHWnd());
if (m_isWin95) {
len = ::GetWindowTextLengthA(GetHWnd());
} else {
len = ::GetWindowTextLengthW(GetHWnd());
}
if (cr.cpMin == 0 && cr.cpMax >= len) { if (cr.cpMin == 0 && cr.cpMax >= len) {
/* /*
* All the text is selected in RichEdit - select all the * All the text is selected in RichEdit - select all the
...@@ -738,14 +731,8 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) ...@@ -738,14 +731,8 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
// kdm@sparc.spb.su // kdm@sparc.spb.su
UINT platfScrollLines = 3; UINT platfScrollLines = 3;
// Retrieve a number of scroll lines. // Retrieve a number of scroll lines.
if (!sm_RichEdit20) {
// 95 doesn't understand the SPI_GETWHEELSCROLLLINES - get the user
// preference by other means
platfScrollLines = Wheel95GetScrLines();
} else {
::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
&platfScrollLines, 0); &platfScrollLines, 0);
}
if (platfScrollLines > 0) { if (platfScrollLines > 0) {
HWND hWnd = GetHWnd(); HWND hWnd = GetHWnd();
...@@ -838,23 +825,6 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) ...@@ -838,23 +825,6 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
return returnVal; return returnVal;
} }
int AwtTextArea::GetText(LPTSTR buffer, int size)
{
// Due to a known limitation of the MSLU, GetWindowText cannot be
// issued for the Unicode RichEdit control on Win9x. Use EM_GETTEXTEX instead.
if (sm_RichEdit20 && !IS_NT) {
GETTEXTEX gte;
gte.cb = size * sizeof(TCHAR);
gte.flags = GT_USECRLF;
gte.codepage = 1200; // implies Unicode
gte.lpDefaultChar = NULL;
gte.lpUsedDefChar = NULL;
return (int)SendMessage(EM_GETTEXTEX, (WPARAM)&gte, (LPARAM)buffer);
} else {
return ::GetWindowText(GetHWnd(), buffer, size);
}
}
/* /*
* WM_CTLCOLOR is not sent by rich edit controls. * WM_CTLCOLOR is not sent by rich edit controls.
* Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set * Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set
...@@ -984,16 +954,16 @@ void AwtTextArea::_ReplaceText(void *param) ...@@ -984,16 +954,16 @@ void AwtTextArea::_ReplaceText(void *param)
jsize length = env->GetStringLength(text) + 1; jsize length = env->GetStringLength(text) + 1;
// Bugid 4141477 - Can't use TO_WSTRING here because it uses alloca // Bugid 4141477 - Can't use TO_WSTRING here because it uses alloca
// WCHAR* buffer = TO_WSTRING(text); // WCHAR* buffer = TO_WSTRING(text);
WCHAR *buffer = new WCHAR[length]; TCHAR *buffer = new TCHAR[length];
env->GetStringRegion(text, 0, length-1, buffer); env->GetStringRegion(text, 0, length-1, reinterpret_cast<jchar*>(buffer));
buffer[length-1] = '\0'; buffer[length-1] = '\0';
c->CheckLineSeparator(buffer); c->CheckLineSeparator(buffer);
c->RemoveCR(buffer); c->RemoveCR(buffer);
// Fix for 5003402: added restoring/hiding selection to enable automatic scrolling // Fix for 5003402: added restoring/hiding selection to enable automatic scrolling
c->SendMessage(EM_HIDESELECTION, FALSE, TRUE); c->SendMessage(EM_HIDESELECTION, FALSE, TRUE);
c->SendMessageW(EM_SETSEL, start, end); c->SendMessage(EM_SETSEL, start, end);
c->SendMessageW(EM_REPLACESEL, FALSE, (LPARAM)buffer); c->SendMessage(EM_REPLACESEL, FALSE, (LPARAM)buffer);
c->SendMessage(EM_HIDESELECTION, TRUE, TRUE); c->SendMessage(EM_HIDESELECTION, TRUE, TRUE);
delete[] buffer; delete[] buffer;
...@@ -1187,12 +1157,11 @@ AwtTextArea::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj, ...@@ -1187,12 +1157,11 @@ AwtTextArea::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj,
HGLOBAL hMetaPict) { HGLOBAL hMetaPict) {
if (reco == RECO_PASTE) { if (reco == RECO_PASTE) {
// If CF_TEXT format is available edit controls will select it, // If CF_TEXT format is available edit controls will select it,
// otherwise if it is WinNT or Win2000 and CF_UNICODETEXT is // otherwise if it is CF_UNICODETEXT is available it will be
// available it will be selected, otherwise if CF_OEMTEXT is // selected, otherwise if CF_OEMTEXT is available it will be selected.
// available it will be selected.
if (::IsClipboardFormatAvailable(CF_TEXT)) { if (::IsClipboardFormatAvailable(CF_TEXT)) {
*pcfFormat = CF_TEXT; *pcfFormat = CF_TEXT;
} else if (!m_isWin95 && ::IsClipboardFormatAvailable(CF_UNICODETEXT)) { } else if (::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
*pcfFormat = CF_UNICODETEXT; *pcfFormat = CF_UNICODETEXT;
} else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) { } else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) {
*pcfFormat = CF_OEMTEXT; *pcfFormat = CF_OEMTEXT;
......
/* /*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -73,8 +73,6 @@ public: ...@@ -73,8 +73,6 @@ public:
MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal); MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal);
MsgRouting HandleEvent(MSG *msg, BOOL synthetic); MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
INLINE virtual int GetText(LPTSTR buffer, int size);
INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; } INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; }
virtual void SetColor(COLORREF c); virtual void SetColor(COLORREF c);
...@@ -96,10 +94,6 @@ protected: ...@@ -96,10 +94,6 @@ protected:
void EditGetSel(CHARRANGE &cr); void EditGetSel(CHARRANGE &cr);
LONG EditGetCharFromPos(POINT& pt); LONG EditGetCharFromPos(POINT& pt);
private: private:
// TRUE if the rich edit version is 2.0
static BOOL sm_RichEdit20;
// RichEdit 1.0 control generates EN_CHANGE notifications not only // RichEdit 1.0 control generates EN_CHANGE notifications not only
// on text changes, but also on any character formatting change. // on text changes, but also on any character formatting change.
// This flag is true when the latter case is detected. // This flag is true when the latter case is detected.
......
/* /*
* Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -326,7 +326,7 @@ jstring AwtTextComponent::_GetText(void *param) ...@@ -326,7 +326,7 @@ jstring AwtTextComponent::_GetText(void *param)
WCHAR* buf = new WCHAR[len + 1]; WCHAR* buf = new WCHAR[len + 1];
c->GetText(buf, len + 1); c->GetText(buf, len + 1);
c->RemoveCR(buf); c->RemoveCR(buf);
result = env->NewString(buf, static_cast<jsize>(wcslen(buf))); result = JNU_NewStringPlatform(env, buf);
delete [] buf; delete [] buf;
} }
} }
...@@ -362,7 +362,7 @@ void AwtTextComponent::_SetText(void *param) ...@@ -362,7 +362,7 @@ void AwtTextComponent::_SetText(void *param)
{ {
int length = env->GetStringLength(text); int length = env->GetStringLength(text);
WCHAR* buffer = new WCHAR[length + 1]; WCHAR* buffer = new WCHAR[length + 1];
env->GetStringRegion(text, 0, length, buffer); env->GetStringRegion(text, 0, length, reinterpret_cast<jchar*>(buffer));
buffer[length] = 0; buffer[length] = 0;
c->CheckLineSeparator(buffer); c->CheckLineSeparator(buffer);
c->RemoveCR(buffer); c->RemoveCR(buffer);
......
/* /*
* Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -70,15 +70,6 @@ public: ...@@ -70,15 +70,6 @@ public:
static jstring _GetText(void *param); static jstring _GetText(void *param);
BOOL ActMouseMessage(MSG* pMsg); BOOL ActMouseMessage(MSG* pMsg);
/*
* For TextComponents that contains WCHAR strings or messages with
* WCHAR parameters.
*/
INLINE LRESULT SendMessageW(UINT msg, WPARAM wParam = 0, LPARAM lParam = 0)
{
DASSERT(GetHWnd());
return ::SendMessageW(GetHWnd(), msg, wParam, lParam);
}
void SetFont(AwtFont* font); void SetFont(AwtFont* font);
......
/* /*
* Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_TextField.h" #include "awt_TextField.h"
#include "awt_TextComponent.h" #include "awt_TextComponent.h"
#include "awt_dlls.h"
#include "awt_KeyboardFocusManager.h" #include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h" #include "awt_Canvas.h"
...@@ -69,9 +68,8 @@ AwtTextField* AwtTextField::Create(jobject peer, jobject parent) ...@@ -69,9 +68,8 @@ AwtTextField* AwtTextField::Create(jobject peer, jobject parent)
{ {
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | DWORD style = WS_CHILD | WS_CLIPSIBLINGS |
ES_LEFT | ES_AUTOHSCROLL | ES_LEFT | ES_AUTOHSCROLL;
(IS_WIN4X ? 0 : WS_BORDER); DWORD exStyle = WS_EX_CLIENTEDGE;
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
if (GetRTL()) { if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder()) if (GetRTLReadingOrder())
......
...@@ -23,15 +23,16 @@ ...@@ -23,15 +23,16 @@
* have any questions. * have any questions.
*/ */
#include "awt.h"
#include <signal.h> #include <signal.h>
#include <windowsx.h> #include <windowsx.h>
#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000 //#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000
#include <crtdbg.h> //#include <crtdbg.h>
#endif //#endif
#define _JNI_IMPLEMENTATION_ #define _JNI_IMPLEMENTATION_
#include "stdhdrs.h"
#include "awt_DrawingSurface.h" #include "awt_DrawingSurface.h"
#include "awt_AWTEvent.h" #include "awt_AWTEvent.h"
#include "awt_Component.h" #include "awt_Component.h"
...@@ -51,7 +52,6 @@ ...@@ -51,7 +52,6 @@
#include "awt_FileDialog.h" #include "awt_FileDialog.h"
#include "CmdIDList.h" #include "CmdIDList.h"
#include "awt_new.h" #include "awt_new.h"
#include "awt_Unicode.h"
#include "debug_trace.h" #include "debug_trace.h"
#include "debug_mem.h" #include "debug_mem.h"
...@@ -225,8 +225,7 @@ BOOL AwtToolkit::activateKeyboardLayout(HKL hkl) { ...@@ -225,8 +225,7 @@ BOOL AwtToolkit::activateKeyboardLayout(HKL hkl) {
HKL prev = ::ActivateKeyboardLayout(hkl, 0); HKL prev = ::ActivateKeyboardLayout(hkl, 0);
// If the above call fails, try loading the layout in case of NT // If the above call fails, try loading the layout in case of NT
if ((prev == 0) && IS_NT) { if (!prev) {
// create input locale string, e.g., "00000409", from hkl. // create input locale string, e.g., "00000409", from hkl.
TCHAR inputLocale[9]; TCHAR inputLocale[9];
TCHAR buf[9]; TCHAR buf[9];
...@@ -297,7 +296,7 @@ JavaStringBuffer::JavaStringBuffer(JNIEnv *env, jstring jstr) { ...@@ -297,7 +296,7 @@ JavaStringBuffer::JavaStringBuffer(JNIEnv *env, jstring jstr) {
if (jstr != NULL) { if (jstr != NULL) {
int length = env->GetStringLength(jstr); int length = env->GetStringLength(jstr);
buffer = new TCHAR[length + 1]; buffer = new TCHAR[length + 1];
LPCTSTR tmp = (LPCTSTR)JNU_GetStringPlatformChars(env, jstr, NULL); LPCTSTR tmp = JNU_GetStringPlatformChars(env, jstr, NULL);
_tcscpy(buffer, tmp); _tcscpy(buffer, tmp);
JNU_ReleaseStringPlatformChars(env, jstr, tmp); JNU_ReleaseStringPlatformChars(env, jstr, tmp);
} else { } else {
...@@ -490,8 +489,6 @@ BOOL AwtToolkit::Dispose() { ...@@ -490,8 +489,6 @@ BOOL AwtToolkit::Dispose() {
::CloseHandle(m_waitEvent); ::CloseHandle(m_waitEvent);
ComCtl32Util::GetInstance().FreeLibraries();
tk.m_isDisposed = TRUE; tk.m_isDisposed = TRUE;
return TRUE; return TRUE;
...@@ -886,8 +883,6 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message, ...@@ -886,8 +883,6 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message,
return (DWORD)ImmGetOpenStatus((HIMC)wParam); return (DWORD)ImmGetOpenStatus((HIMC)wParam);
} }
case WM_DISPLAYCHANGE: { case WM_DISPLAYCHANGE: {
AwtCursor::DirtyAllCustomCursors();
// Reinitialize screens // Reinitialize screens
initScreens(env); initScreens(env);
...@@ -1161,9 +1156,7 @@ BOOL AwtToolkit::PreProcessMsg(MSG& msg) ...@@ -1161,9 +1156,7 @@ BOOL AwtToolkit::PreProcessMsg(MSG& msg)
if (p && p->PreProcessMsg(msg) == mrConsume) if (p && p->PreProcessMsg(msg) == mrConsume)
return TRUE; return TRUE;
if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST) || if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) ||
(IS_WIN95 && !IS_WIN98 &&
msg.message == AwtComponent::Wheel95GetMsg()) ||
(msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK)) { (msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK)) {
if (PreProcessMouseMsg(p, msg)) { if (PreProcessMouseMsg(p, msg)) {
return TRUE; return TRUE;
...@@ -1190,9 +1183,7 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) ...@@ -1190,9 +1183,7 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg)
return FALSE; return FALSE;
} }
if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST || if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) {
(IS_WIN95 && !IS_WIN98 && msg.message == AwtComponent::Wheel95GetMsg()))
{
mouseWParam = msg.wParam; mouseWParam = msg.wParam;
mouseLParam = msg.lParam; mouseLParam = msg.lParam;
} else { } else {
...@@ -1287,21 +1278,6 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) ...@@ -1287,21 +1278,6 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg)
//window //window
msg.hwnd = hWndForWheel; msg.hwnd = hWndForWheel;
} }
else if (IS_WIN95 && !IS_WIN98 &&
msg.message == AwtComponent::Wheel95GetMsg() &&
mouseWheelComp != NULL) {
// On Win95, mouse wheels are _always_ delivered to the top level
// Frame. Default behavior only takes place if the message's hwnd
// remains that of the Frame. We only want to change the hwnd if
// we're changing it to a Component that DOESN'T handle the
// mousewheel natively.
if (!mouseWheelComp->InheritsNativeMouseWheelBehavior()) {
DTRACE_PRINTLN("AwtT::PPMM: changing hwnd on 95");
msg.hwnd = hWndForWheel;
}
}
/* /*
* Make sure we get at least one last chance to check for transitions * Make sure we get at least one last chance to check for transitions
...@@ -1792,7 +1768,7 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, ...@@ -1792,7 +1768,7 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
{ {
jobject insets = NULL; jobject insets = NULL;
RECT rRW; RECT rRW;
MONITOR_INFO *miInfo; LPMONITORINFO miInfo;
TRY; TRY;
...@@ -1814,10 +1790,10 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, ...@@ -1814,10 +1790,10 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
if (miInfo) { if (miInfo) {
insets = env->NewObject(env->FindClass("java/awt/Insets"), insets = env->NewObject(env->FindClass("java/awt/Insets"),
AwtToolkit::insetsMID, AwtToolkit::insetsMID,
miInfo->rWork.top - miInfo->rMonitor.top, miInfo->rcWork.top - miInfo->rcMonitor.top,
miInfo->rWork.left - miInfo->rMonitor.left, miInfo->rcWork.left - miInfo->rcMonitor.left,
miInfo->rMonitor.bottom - miInfo->rWork.bottom, miInfo->rcMonitor.bottom - miInfo->rcWork.bottom,
miInfo->rMonitor.right - miInfo->rWork.right); miInfo->rcMonitor.right - miInfo->rcWork.right);
} }
} }
...@@ -2057,17 +2033,6 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls) ...@@ -2057,17 +2033,6 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls)
swprintf(szVer, L"0x%x = %ld", version, version); swprintf(szVer, L"0x%x = %ld", version, version);
int l = lstrlen(szVer); int l = lstrlen(szVer);
if (IS_WIN95) {
if (IS_WIN98) {
if (IS_WINME) {
swprintf(szVer + l, L" (Windows ME)");
} else {
swprintf(szVer + l, L" (Windows 98)");
}
} else {
swprintf(szVer + l, L" (Windows 95)");
}
} else if (IS_NT) {
if (IS_WIN2000) { if (IS_WIN2000) {
if (IS_WINXP) { if (IS_WINXP) {
if (IS_WINVISTA) { if (IS_WINVISTA) {
...@@ -2078,9 +2043,6 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls) ...@@ -2078,9 +2043,6 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls)
} else { } else {
swprintf(szVer + l, L" (Windows 2000)"); swprintf(szVer + l, L" (Windows 2000)");
} }
} else {
swprintf(szVer + l, L" (Windows NT)");
}
} else { } else {
swprintf(szVer + l, L" (Unknown)"); swprintf(szVer + l, L" (Unknown)");
} }
......
...@@ -50,7 +50,6 @@ ...@@ -50,7 +50,6 @@
#include "awt.h" #include "awt.h"
#include "awtmsg.h" #include "awtmsg.h"
#include "awt_Multimon.h"
#include "Trace.h" #include "Trace.h"
#include "sun_awt_windows_WToolkit.h" #include "sun_awt_windows_WToolkit.h"
...@@ -89,11 +88,8 @@ class JNILocalFrame { ...@@ -89,11 +88,8 @@ class JNILocalFrame {
*/ */
class CriticalSection { class CriticalSection {
public: public:
INLINE CriticalSection() { ::InitializeCriticalSection(&rep); INLINE CriticalSection() { ::InitializeCriticalSection(&rep); }
::InitializeCriticalSection(&tryrep); INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep); }
tryEntered = 0; }
INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep);
::DeleteCriticalSection(&tryrep); }
class Lock { class Lock {
public: public:
...@@ -111,50 +107,18 @@ class CriticalSection { ...@@ -111,50 +107,18 @@ class CriticalSection {
private: private:
CRITICAL_SECTION rep; CRITICAL_SECTION rep;
CRITICAL_SECTION tryrep;
long tryEntered;
CriticalSection(const CriticalSection&); CriticalSection(const CriticalSection&);
const CriticalSection& operator =(const CriticalSection&); const CriticalSection& operator =(const CriticalSection&);
public: public:
virtual void Enter (void) virtual void Enter() {
{
::EnterCriticalSection(&tryrep);
tryEntered++;
if (tryEntered == 1) {
::EnterCriticalSection(&rep);
::LeaveCriticalSection(&tryrep);
} else {
::LeaveCriticalSection(&tryrep);
::EnterCriticalSection(&rep);
}
}
// we cannot use ::TryEnterCriticalSection as it is not supported on Win9x/Me
virtual BOOL TryEnter (void)
{
BOOL result = FALSE;
::EnterCriticalSection(&tryrep);
if (tryEntered == 0) {
::EnterCriticalSection(&rep); ::EnterCriticalSection(&rep);
tryEntered++;
result = TRUE;
}
::LeaveCriticalSection(&tryrep);
return result;
} }
virtual void Leave (void) virtual BOOL TryEnter() {
{ return ::TryEnterCriticalSection(&rep);
::EnterCriticalSection(&tryrep);
if (tryEntered > 0) {
tryEntered--;
} else {
// this may happen only if we call to Leave() before
// Enter() so this is definitely a bug
DASSERT(FALSE);
} }
virtual void Leave() {
::LeaveCriticalSection(&rep); ::LeaveCriticalSection(&rep);
::LeaveCriticalSection(&tryrep);
} }
}; };
......
...@@ -23,9 +23,10 @@ ...@@ -23,9 +23,10 @@
* have any questions. * have any questions.
*/ */
#include <windows.h> #include "awt.h"
#include <windowsx.h> #include <windowsx.h>
#include <shellapi.h> #include <shellapi.h>
#include <shlwapi.h>
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_TrayIcon.h" #include "awt_TrayIcon.h"
...@@ -173,27 +174,20 @@ AwtTrayIcon* AwtTrayIcon::Create(jobject self, jobject parent) ...@@ -173,27 +174,20 @@ AwtTrayIcon* AwtTrayIcon::Create(jobject self, jobject parent)
env->DeleteLocalRef(target); env->DeleteLocalRef(target);
return awtTrayIcon; return awtTrayIcon;
} }
typedef struct _SDLLVERSIONINFO
{
DWORD cbSize;
DWORD dwMajorVersion; // Major version
DWORD dwMinorVersion; // Minor version
DWORD dwBuildNumber; // Build number
DWORD dwPlatformID; // DLLVER_PLATFORM_*
} SDLLVERSIONINFO;
typedef HRESULT (CALLBACK* SDLLGETVERSIONPROC)(SDLLVERSIONINFO *);
void AwtTrayIcon::InitNID(UINT uID) void AwtTrayIcon::InitNID(UINT uID)
{ {
// fix for 6271589: we MUST set the size of the structure to match // fix for 6271589: we MUST set the size of the structure to match
// the shell version, otherwise some errors may occur (like missing // the shell version, otherwise some errors may occur (like missing
// balloon messages on win2k) // balloon messages on win2k)
SDLLVERSIONINFO dllVersionInfo; DLLVERSIONINFO dllVersionInfo;
dllVersionInfo.cbSize = sizeof(SDLLVERSIONINFO); dllVersionInfo.cbSize = sizeof(DLLVERSIONINFO);
int shellVersion = 4; // WIN_98 int shellVersion = 5; // WIN_2000
// MSDN: DllGetVersion should not be implicitly called, but rather
// loaded using GetProcAddress
HMODULE hShell = LoadLibrary(TEXT("Shell32.dll")); HMODULE hShell = LoadLibrary(TEXT("Shell32.dll"));
if (hShell != NULL) { if (hShell != NULL) {
SDLLGETVERSIONPROC proc = (SDLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion"); DLLGETVERSIONPROC proc = (DLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion");
if (proc != NULL) { if (proc != NULL) {
if (proc(&dllVersionInfo) == NOERROR) { if (proc(&dllVersionInfo) == NOERROR) {
shellVersion = dllVersionInfo.dwMajorVersion; shellVersion = dllVersionInfo.dwMajorVersion;
...@@ -202,14 +196,16 @@ void AwtTrayIcon::InitNID(UINT uID) ...@@ -202,14 +196,16 @@ void AwtTrayIcon::InitNID(UINT uID)
} }
FreeLibrary(hShell); FreeLibrary(hShell);
switch (shellVersion) { switch (shellVersion) {
case 5: // WIN_2000, WIN_ME case 5: // WIN_2000
m_nid.cbSize = (BYTE *)(&m_nid.guidItem) - (BYTE *)(&m_nid.cbSize); m_nid.cbSize = (BYTE *)(&m_nid.guidItem) - (BYTE *)(&m_nid.cbSize);
break; break;
case 6: // WIN_XP case 6: // WIN_XP
// Uncomment these two lines when moving to VS2008
// m_nid.cbSize = (BYTE *)(&m_nid.hBalloonIcon) - (BYTE *)(&m_nid.cbSize);
// break;
default: // WIN_VISTA?
m_nid.cbSize = sizeof(m_nid); m_nid.cbSize = sizeof(m_nid);
break; break;
default: // WIN_98, WIN_NT
m_nid.cbSize = (BYTE *)(&m_nid.szTip) - (BYTE *)(&m_nid.cbSize) + sizeof(m_nid.szTip) / 2;
} }
m_nid.hWnd = AwtTrayIcon::sm_msgWindow; m_nid.hWnd = AwtTrayIcon::sm_msgWindow;
m_nid.uID = uID; m_nid.uID = uID;
...@@ -217,7 +213,7 @@ void AwtTrayIcon::InitNID(UINT uID) ...@@ -217,7 +213,7 @@ void AwtTrayIcon::InitNID(UINT uID)
m_nid.uCallbackMessage = WM_AWT_TRAY_NOTIFY; m_nid.uCallbackMessage = WM_AWT_TRAY_NOTIFY;
m_nid.hIcon = AwtToolkit::GetInstance().GetAwtIcon(); m_nid.hIcon = AwtToolkit::GetInstance().GetAwtIcon();
m_nid.szTip[0] = '\0'; m_nid.szTip[0] = '\0';
m_nid.uVersion = IS_WIN2000 ? AWT_NOTIFYICON_VERSION : 0; m_nid.uVersion = NOTIFYICON_VERSION;
} }
BOOL AwtTrayIcon::SendTrayMessage(DWORD dwMessage) BOOL AwtTrayIcon::SendTrayMessage(DWORD dwMessage)
...@@ -304,13 +300,13 @@ MsgRouting AwtTrayIcon::WmAwtTrayNotify(WPARAM wParam, LPARAM lParam) ...@@ -304,13 +300,13 @@ MsgRouting AwtTrayIcon::WmAwtTrayNotify(WPARAM wParam, LPARAM lParam)
case WM_CONTEXTMENU: case WM_CONTEXTMENU:
mr = WmContextMenu(0, pos.x, pos.y); mr = WmContextMenu(0, pos.x, pos.y);
break; break;
case AWT_NIN_KEYSELECT: case NIN_KEYSELECT:
mr = WmKeySelect(0, pos.x, pos.y); mr = WmKeySelect(0, pos.x, pos.y);
break; break;
case AWT_NIN_SELECT: case NIN_SELECT:
mr = WmSelect(0, pos.x, pos.y); mr = WmSelect(0, pos.x, pos.y);
break; break;
case AWT_NIN_BALLOONUSERCLICK: case NIN_BALLOONUSERCLICK:
mr = WmBalloonUserClick(0, pos.x, pos.y); mr = WmBalloonUserClick(0, pos.x, pos.y);
break; break;
} }
...@@ -473,7 +469,7 @@ MsgRouting AwtTrayIcon::WmTaskbarCreated() { ...@@ -473,7 +469,7 @@ MsgRouting AwtTrayIcon::WmTaskbarCreated() {
BOOL result = item->m_trayIcon->SendTrayMessage(NIM_ADD); BOOL result = item->m_trayIcon->SendTrayMessage(NIM_ADD);
// 6270114: Instructs the taskbar to behave according to the Shell version 5.0 // 6270114: Instructs the taskbar to behave according to the Shell version 5.0
if (result) { if (result) {
item->m_trayIcon->SendTrayMessage(AWT_NIM_SETVERSION); item->m_trayIcon->SendTrayMessage(NIM_SETVERSION);
} }
} }
return mrDoDefault; return mrDoDefault;
...@@ -733,9 +729,9 @@ void AwtTrayIcon::_SetToolTip(void *param) ...@@ -733,9 +729,9 @@ void AwtTrayIcon::_SetToolTip(void *param)
goto ret; goto ret;
} }
tooltipStr = env->GetStringChars(jtooltip, (jboolean *)NULL); tooltipStr = JNU_GetStringPlatformChars(env, jtooltip, (jboolean *)NULL);
trayIcon->SetToolTip(tooltipStr); trayIcon->SetToolTip(tooltipStr);
env->ReleaseStringChars(jtooltip, tooltipStr); JNU_ReleaseStringPlatformChars(env, jtooltip, tooltipStr);
ret: ret:
env->DeleteGlobalRef(self); env->DeleteGlobalRef(self);
env->DeleteGlobalRef(jtooltip); env->DeleteGlobalRef(jtooltip);
...@@ -782,7 +778,7 @@ void AwtTrayIcon::_UpdateIcon(void *param) ...@@ -782,7 +778,7 @@ void AwtTrayIcon::_UpdateIcon(void *param)
BOOL result = trayIcon->SendTrayMessage(jupdate == JNI_TRUE ? NIM_MODIFY : NIM_ADD); BOOL result = trayIcon->SendTrayMessage(jupdate == JNI_TRUE ? NIM_MODIFY : NIM_ADD);
// 6270114: Instructs the taskbar to behave according to the Shell version 5.0 // 6270114: Instructs the taskbar to behave according to the Shell version 5.0
if (result && jupdate == JNI_FALSE) { if (result && jupdate == JNI_FALSE) {
trayIcon->SendTrayMessage(AWT_NIM_SETVERSION); trayIcon->SendTrayMessage(NIM_SETVERSION);
} }
ret: ret:
env->DeleteGlobalRef(self); env->DeleteGlobalRef(self);
...@@ -791,22 +787,19 @@ ret: ...@@ -791,22 +787,19 @@ ret:
void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType) void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType)
{ {
if (!IS_WIN2000) m_nid.uFlags |= NIF_INFO;
return;
m_nid.uFlags |= AWT_NIF_INFO;
m_nid.uTimeout = 10000; m_nid.uTimeout = 10000;
if (lstrcmp(msgType, TEXT("ERROR")) == 0) { if (lstrcmp(msgType, TEXT("ERROR")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_ERROR; m_nid.dwInfoFlags = NIIF_ERROR;
} else if (lstrcmp(msgType, TEXT("WARNING")) == 0) { } else if (lstrcmp(msgType, TEXT("WARNING")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_WARNING; m_nid.dwInfoFlags = NIIF_WARNING;
} else if (lstrcmp(msgType, TEXT("INFO")) == 0) { } else if (lstrcmp(msgType, TEXT("INFO")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_INFO; m_nid.dwInfoFlags = NIIF_INFO;
} else if (lstrcmp(msgType, TEXT("NONE")) == 0) { } else if (lstrcmp(msgType, TEXT("NONE")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_NONE; m_nid.dwInfoFlags = NIIF_NONE;
} else { } else {
m_nid.dwInfoFlags = AWT_NIIF_NONE; m_nid.dwInfoFlags = NIIF_NONE;
} }
if (caption[0] == '\0') { if (caption[0] == '\0') {
...@@ -835,7 +828,7 @@ void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType) ...@@ -835,7 +828,7 @@ void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType)
} }
SendTrayMessage(NIM_MODIFY); SendTrayMessage(NIM_MODIFY);
m_nid.uFlags &= ~AWT_NIF_INFO; m_nid.uFlags &= ~NIF_INFO;
} }
void AwtTrayIcon::_DisplayMessage(void *param) void AwtTrayIcon::_DisplayMessage(void *param)
...@@ -855,15 +848,15 @@ void AwtTrayIcon::_DisplayMessage(void *param) ...@@ -855,15 +848,15 @@ void AwtTrayIcon::_DisplayMessage(void *param)
JNI_CHECK_PEER_GOTO(self, ret); JNI_CHECK_PEER_GOTO(self, ret);
trayIcon = (AwtTrayIcon *)pData; trayIcon = (AwtTrayIcon *)pData;
captionStr = env->GetStringChars(jcaption, (jboolean *)NULL); captionStr = JNU_GetStringPlatformChars(env, jcaption, (jboolean *)NULL);
textStr = env->GetStringChars(jtext, (jboolean *)NULL); textStr = JNU_GetStringPlatformChars(env, jtext, (jboolean *)NULL);
msgTypeStr = env->GetStringChars(jmsgType, (jboolean *)NULL); msgTypeStr = JNU_GetStringPlatformChars(env, jmsgType, (jboolean *)NULL);
trayIcon->DisplayMessage(captionStr, textStr, msgTypeStr); trayIcon->DisplayMessage(captionStr, textStr, msgTypeStr);
env->ReleaseStringChars(jcaption, captionStr); JNU_ReleaseStringPlatformChars(env, jcaption, captionStr);
env->ReleaseStringChars(jtext, textStr); JNU_ReleaseStringPlatformChars(env, jtext, textStr);
env->ReleaseStringChars(jmsgType, msgTypeStr); JNU_ReleaseStringPlatformChars(env, jmsgType, msgTypeStr);
ret: ret:
env->DeleteGlobalRef(self); env->DeleteGlobalRef(self);
env->DeleteGlobalRef(jcaption); env->DeleteGlobalRef(jcaption);
...@@ -1057,7 +1050,6 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self, ...@@ -1057,7 +1050,6 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self,
{ {
TRY; TRY;
if (IS_WIN2000) {
DisplayMessageStruct *dms = new DisplayMessageStruct; DisplayMessageStruct *dms = new DisplayMessageStruct;
dms->trayIcon = env->NewGlobalRef(self); dms->trayIcon = env->NewGlobalRef(self);
dms->caption = (jstring)env->NewGlobalRef(caption); dms->caption = (jstring)env->NewGlobalRef(caption);
...@@ -1066,7 +1058,6 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self, ...@@ -1066,7 +1058,6 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self,
AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms); AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms);
// global ref is deleted in _DisplayMessage // global ref is deleted in _DisplayMessage
}
CATCH_BAD_ALLOC(NULL); CATCH_BAD_ALLOC(NULL);
} }
......
...@@ -36,57 +36,11 @@ ...@@ -36,57 +36,11 @@
#define TRAY_ICON_X_HOTSPOT 0 #define TRAY_ICON_X_HOTSPOT 0
#define TRAY_ICON_Y_HOTSPOT 0 #define TRAY_ICON_Y_HOTSPOT 0
#define TRAY_ICON_TOOLTIP_MAX_SIZE (IS_WIN2000 ? 128 : 64) #define TRAY_ICON_TOOLTIP_MAX_SIZE 128
#define TRAY_ICON_BALLOON_TITLE_MAX_SIZE 64 #define TRAY_ICON_BALLOON_TITLE_MAX_SIZE 64
#define TRAY_ICON_BALLOON_INFO_MAX_SIZE 256 #define TRAY_ICON_BALLOON_INFO_MAX_SIZE 256
// **********************************************************************
// The following definitions are duplicates for those from the shellapi.h
// **********************************************************************
#define AWT_NOTIFYICON_VERSION 3
#define AWT_NIM_SETVERSION 0x00000004
#define AWT_NIN_SELECT (WM_USER + 0)
#define AWT_NINF_KEY 0x1
#define AWT_NIN_KEYSELECT (AWT_NIN_SELECT | AWT_NINF_KEY)
#define AWT_NIN_BALLOONSHOW (WM_USER + 2)
#define AWT_NIN_BALLOONHIDE (WM_USER + 3)
#define AWT_NIN_BALLOONTIMEOUT (WM_USER + 4)
#define AWT_NIN_BALLOONUSERCLICK (WM_USER + 5)
#define AWT_NIIF_NONE 0x00000000
#define AWT_NIIF_INFO 0x00000001
#define AWT_NIIF_WARNING 0x00000002
#define AWT_NIIF_ERROR 0x00000003
#define AWT_NIF_INFO 0x00000010
typedef struct _AWT_NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[128];
DWORD dwState; // _WIN32_IE >= 0x0500
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem; // _WIN32_IE >= 0x600
} AWT_NOTIFYICONDATA, *PAWT_NOTIFYICONDATA;
/************************************************************************ /************************************************************************
* AwtTrayIcon class * AwtTrayIcon class
*/ */
...@@ -174,7 +128,7 @@ public: ...@@ -174,7 +128,7 @@ public:
static int sm_instCount; static int sm_instCount;
private: private:
AWT_NOTIFYICONDATA m_nid; NOTIFYICONDATA m_nid;
/* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON /* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON
* which are allowed to * which are allowed to
......
/*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include "awt.h"
LPWSTR J2WHelper1(LPWSTR lpw, LPWSTR lpj, int offset, int nChars) {
memcpy(lpw, lpj + offset, nChars*2);
lpw[nChars] = '\0';
return lpw;
}
LPWSTR JNI_J2WHelper1(JNIEnv *env, LPWSTR lpwstr, jstring jstr) {
int len = env->GetStringLength(jstr);
env->GetStringRegion(jstr, 0, len, lpwstr);
lpwstr[len] = '\0';
return lpwstr;
}
LPWSTR J2WHelper(LPWSTR lpw, LPWSTR lpj, int nChars) {
return J2WHelper1(lpw, lpj, 0, nChars);
}
/*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* Unicode to ANSI string conversion macros, based on a slide from a
* presentation by Asmus Freytag. These must be macros, since the
* alloca() has to be in the caller's stack space.
*/
#ifndef AWT_UNICODE_H
#define AWT_UNICODE_H
#include <malloc.h>
// Get a Unicode string copy of a Java String object (Java String aren't
// null-terminated).
extern LPWSTR J2WHelper(LPWSTR lpw, LPWSTR lpj, int nChars);
extern LPWSTR J2WHelper1(LPWSTR lpw, LPWSTR lpj, int offset, int nChars);
extern LPWSTR JNI_J2WHelper1(JNIEnv *env, LPWSTR lpw, jstring jstr);
#define TO_WSTRING(jstr) \
((jstr == NULL) ? NULL : \
(JNI_J2WHelper1(env, (LPWSTR) alloca((env->GetStringLength(jstr)+1)*2), \
jstr) \
))
#endif // AWT_UNICODE_H
/* /*
* Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,12 +23,12 @@ ...@@ -23,12 +23,12 @@
* have any questions. * have any questions.
*/ */
#include <windows.h>
#include "awt.h" #include "awt.h"
#include <sun_awt_Win32GraphicsConfig.h> #include <sun_awt_Win32GraphicsConfig.h>
#include "awt_Win32GraphicsConfig.h" #include "awt_Win32GraphicsConfig.h"
#include "awt_Canvas.h" #include "awt_Canvas.h"
#include "awt_Win32GraphicsDevice.h" #include "awt_Win32GraphicsDevice.h"
#include "Devices.h"
//Info for building a ColorModel //Info for building a ColorModel
#include "java_awt_image_DataBuffer.h" #include "java_awt_image_DataBuffer.h"
...@@ -93,8 +93,8 @@ JNIEXPORT jobject JNICALL ...@@ -93,8 +93,8 @@ JNIEXPORT jobject JNICALL
clazz = env->FindClass("java/awt/Rectangle"); clazz = env->FindClass("java/awt/Rectangle");
mid = env->GetMethodID(clazz, "<init>", "(IIII)V"); mid = env->GetMethodID(clazz, "<init>", "(IIII)V");
if (mid != 0) { if (mid != 0) {
RECT rRW = {0,0,0,0}; RECT rRW = {0, 0, 0, 0};
if( TRUE == ::MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW) ) { if (TRUE == MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW)) {
bounds = env->NewObject(clazz, mid, bounds = env->NewObject(clazz, mid,
rRW.left, rRW.top, rRW.left, rRW.top,
rRW.right - rRW.left, rRW.right - rRW.left,
......
...@@ -37,19 +37,17 @@ ...@@ -37,19 +37,17 @@
* array index. * array index.
*/ */
#include <windows.h>
#include <jni.h>
#include <awt.h> #include <awt.h>
#include <sun_awt_Win32GraphicsDevice.h> #include <sun_awt_Win32GraphicsDevice.h>
#include "awt_Canvas.h" #include "awt_Canvas.h"
#include "awt_Win32GraphicsDevice.h" #include "awt_Win32GraphicsDevice.h"
#include "awt_Window.h"
#include "java_awt_Transparency.h" #include "java_awt_Transparency.h"
#include "java_awt_color_ColorSpace.h" #include "java_awt_color_ColorSpace.h"
#include "sun_awt_Win32GraphicsDevice.h" #include "sun_awt_Win32GraphicsDevice.h"
#include "java_awt_image_DataBuffer.h" #include "java_awt_image_DataBuffer.h"
#include "dither.h" #include "dither.h"
#include "img_util_md.h" #include "img_util_md.h"
#include "awt_dlls.h"
#include "Devices.h" #include "Devices.h"
uns_ordered_dither_array img_oda_alpha; uns_ordered_dither_array img_oda_alpha;
...@@ -72,7 +70,7 @@ int AwtWin32GraphicsDevice::primaryIndex = 0; ...@@ -72,7 +70,7 @@ int AwtWin32GraphicsDevice::primaryIndex = 0;
* device, and information on whether the primary device is palettized. * device, and information on whether the primary device is palettized.
*/ */
AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
MHND mhnd, Devices *arr) HMONITOR mhnd, Devices *arr)
{ {
this->screen = screen; this->screen = screen;
this->devicesArray = arr; this->devicesArray = arr;
...@@ -83,8 +81,8 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, ...@@ -83,8 +81,8 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
cData = NULL; cData = NULL;
gpBitmapInfo = NULL; gpBitmapInfo = NULL;
monitor = mhnd; monitor = mhnd;
pMonitorInfo = (PMONITOR_INFO)new MONITOR_INFO_EXTENDED; pMonitorInfo = new MONITORINFOEX;
pMonitorInfo->dwSize = sizeof(MONITOR_INFO_EXTENDED); pMonitorInfo->cbSize = sizeof(MONITORINFOEX);
::GetMonitorInfo(monitor, pMonitorInfo); ::GetMonitorInfo(monitor, pMonitorInfo);
// Set primary device info: other devices will need to know // Set primary device info: other devices will need to know
...@@ -93,7 +91,7 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, ...@@ -93,7 +91,7 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
HDC hDC = this->GetDC(); HDC hDC = this->GetDC();
colorData->bitsperpixel = ::GetDeviceCaps(hDC, BITSPIXEL); colorData->bitsperpixel = ::GetDeviceCaps(hDC, BITSPIXEL);
this->ReleaseDC(hDC); this->ReleaseDC(hDC);
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryIndex = screen; primaryIndex = screen;
if (colorData->bitsperpixel > 8) { if (colorData->bitsperpixel > 8) {
primaryPalettized = FALSE; primaryPalettized = FALSE;
...@@ -124,6 +122,24 @@ AwtWin32GraphicsDevice::~AwtWin32GraphicsDevice() ...@@ -124,6 +122,24 @@ AwtWin32GraphicsDevice::~AwtWin32GraphicsDevice()
} }
} }
HDC AwtWin32GraphicsDevice::MakeDCFromMonitor(HMONITOR hmMonitor) {
HDC retCode = NULL;
if (NULL != hmMonitor) {
MONITORINFOEX mieInfo;
memset((void*)(&mieInfo), 0, sizeof(MONITORINFOEX));
mieInfo.cbSize = sizeof(MONITORINFOEX);
if (TRUE == ::GetMonitorInfo(hmMonitor, (LPMONITORINFOEX)(&mieInfo))) {
HDC hDC = CreateDC(mieInfo.szDevice, NULL, NULL, NULL);
if (NULL != hDC) {
retCode = hDC;
}
}
}
return retCode;
}
HDC AwtWin32GraphicsDevice::GetDC() HDC AwtWin32GraphicsDevice::GetDC()
{ {
return MakeDCFromMonitor(monitor); return MakeDCFromMonitor(monitor);
...@@ -164,7 +180,7 @@ void AwtWin32GraphicsDevice::Initialize() ...@@ -164,7 +180,7 @@ void AwtWin32GraphicsDevice::Initialize()
VERIFY(::GetDIBits(hBMDC, hBM, 0, 1, NULL, gpBitmapInfo, DIB_RGB_COLORS)); VERIFY(::GetDIBits(hBMDC, hBM, 0, 1, NULL, gpBitmapInfo, DIB_RGB_COLORS));
if (colorData->bitsperpixel > 8) { if (colorData->bitsperpixel > 8) {
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryPalettized = FALSE; primaryPalettized = FALSE;
} }
if (colorData->bitsperpixel != 24) { // 15, 16, or 32 bpp if (colorData->bitsperpixel != 24) { // 15, 16, or 32 bpp
...@@ -250,7 +266,7 @@ void AwtWin32GraphicsDevice::Initialize() ...@@ -250,7 +266,7 @@ void AwtWin32GraphicsDevice::Initialize()
((int *)gpBitmapInfo->bmiColors)[2] = 0xff0000; ((int *)gpBitmapInfo->bmiColors)[2] = 0xff0000;
} }
} else { } else {
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryPalettized = TRUE; primaryPalettized = TRUE;
} }
gpBitmapInfo->bmiHeader.biBitCount = 8; gpBitmapInfo->bmiHeader.biBitCount = 8;
...@@ -565,8 +581,8 @@ void AwtWin32GraphicsDevice::RealizePalette(HDC hDC) ...@@ -565,8 +581,8 @@ void AwtWin32GraphicsDevice::RealizePalette(HDC hDC)
*/ */
int AwtWin32GraphicsDevice::DeviceIndexForWindow(HWND hWnd) int AwtWin32GraphicsDevice::DeviceIndexForWindow(HWND hWnd)
{ {
MHND mon = MonitorFromWindow(hWnd, MONITOR_DEFAULT_TO_NEAR); HMONITOR mon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
int screen = AwtWin32GraphicsDevice::GetScreenFromMHND(mon); int screen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(mon);
return screen; return screen;
} }
...@@ -645,14 +661,14 @@ jobject AwtWin32GraphicsDevice::GetColorModel(JNIEnv *env, jboolean dynamic, ...@@ -645,14 +661,14 @@ jobject AwtWin32GraphicsDevice::GetColorModel(JNIEnv *env, jboolean dynamic,
return devices->GetDevice(deviceIndex)->GetColorModel(env, dynamic); return devices->GetDevice(deviceIndex)->GetColorModel(env, dynamic);
} }
MONITOR_INFO *AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex) LPMONITORINFO AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex)
{ {
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
return devices->GetDevice(deviceIndex)->GetMonitorInfo(); return devices->GetDevice(deviceIndex)->GetMonitorInfo();
} }
/** /**
* This function updates the data in the MONITOR_INFO structure pointed to by * This function updates the data in the MONITORINFOEX structure pointed to by
* pMonitorInfo for all monitors on the system. Added for 4654713. * pMonitorInfo for all monitors on the system. Added for 4654713.
*/ */
void AwtWin32GraphicsDevice::ResetAllMonitorInfo() void AwtWin32GraphicsDevice::ResetAllMonitorInfo()
...@@ -660,14 +676,14 @@ void AwtWin32GraphicsDevice::ResetAllMonitorInfo() ...@@ -660,14 +676,14 @@ void AwtWin32GraphicsDevice::ResetAllMonitorInfo()
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
int devicesNum = devices->GetNumDevices(); int devicesNum = devices->GetNumDevices();
for (int deviceIndex = 0; deviceIndex < devicesNum; deviceIndex++) { for (int deviceIndex = 0; deviceIndex < devicesNum; deviceIndex++) {
MHND monitor = devices->GetDevice(deviceIndex)->GetMonitor(); HMONITOR monitor = devices->GetDevice(deviceIndex)->GetMonitor();
::GetMonitorInfo(monitor, ::GetMonitorInfo(monitor,
devices->GetDevice(deviceIndex)->pMonitorInfo); devices->GetDevice(deviceIndex)->pMonitorInfo);
} }
} }
void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice( void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice(
MHND hMonitor) HMONITOR hMonitor)
{ {
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
if (hMonitor == NULL) { if (hMonitor == NULL) {
...@@ -682,7 +698,7 @@ void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice( ...@@ -682,7 +698,7 @@ void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice(
} }
} }
MHND AwtWin32GraphicsDevice::GetMonitor(int deviceIndex) HMONITOR AwtWin32GraphicsDevice::GetMonitor(int deviceIndex)
{ {
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
return devices->GetDevice(deviceIndex)->GetMonitor(); return devices->GetDevice(deviceIndex)->GetMonitor();
...@@ -741,30 +757,31 @@ HDC AwtWin32GraphicsDevice::GetDCFromScreen(int screen) { ...@@ -741,30 +757,31 @@ HDC AwtWin32GraphicsDevice::GetDCFromScreen(int screen) {
return MakeDCFromMonitor(dev->GetMonitor()); return MakeDCFromMonitor(dev->GetMonitor());
} }
/** Compare elements of MONITOR_INFO structures for the given MHNDs. /** Compare elements of MONITORINFOEX structures for the given HMONITORs.
* If equal, return TRUE * If equal, return TRUE
*/ */
BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) { BOOL AwtWin32GraphicsDevice::AreSameMonitors(HMONITOR mon1, HMONITOR mon2) {
J2dTraceLn2(J2D_TRACE_INFO, J2dTraceLn2(J2D_TRACE_INFO,
"AwtWin32GraphicsDevice::AreSameMonitors mhnd1=%x mhnd2=%x", "AwtWin32GraphicsDevice::AreSameMonitors mhnd1=%x mhnd2=%x",
mon1, mon2); mon1, mon2);
DASSERT(mon1 != NULL); DASSERT(mon1 != NULL);
DASSERT(mon2 != NULL); DASSERT(mon2 != NULL);
MONITOR_INFO mi1; MONITORINFOEX mi1;
MONITOR_INFO mi2; MONITORINFOEX mi2;
memset((void*)(&mi1),0,sizeof(MONITOR_INFO));
mi1.dwSize = sizeof(MONITOR_INFO);
memset((void*)(&mi2),0,sizeof(MONITOR_INFO));
mi2.dwSize = sizeof(MONITOR_INFO);
if (::GetMonitorInfo(mon1,&mi1) != 0 && memset((void*)(&mi1), 0, sizeof(MONITORINFOEX));
::GetMonitorInfo(mon2,&mi2) != 0 ) { mi1.cbSize = sizeof(MONITORINFOEX);
memset((void*)(&mi2), 0, sizeof(MONITORINFOEX));
mi2.cbSize = sizeof(MONITORINFOEX);
if (::EqualRect(&mi1.rMonitor,&mi2.rMonitor) && if (::GetMonitorInfo(mon1, &mi1) != 0 &&
::EqualRect(&mi1.rWork,&mi2.rWork) && ::GetMonitorInfo(mon2, &mi2) != 0 )
mi1.dwFlags == mi1.dwFlags) { {
if (::EqualRect(&mi1.rcMonitor, &mi2.rcMonitor) &&
::EqualRect(&mi1.rcWork, &mi2.rcWork) &&
(mi1.dwFlags == mi1.dwFlags))
{
J2dTraceLn(J2D_TRACE_VERBOSE, " the monitors are the same"); J2dTraceLn(J2D_TRACE_VERBOSE, " the monitors are the same");
return TRUE; return TRUE;
...@@ -774,15 +791,15 @@ BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) { ...@@ -774,15 +791,15 @@ BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) {
return FALSE; return FALSE;
} }
int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) { int AwtWin32GraphicsDevice::GetScreenFromHMONITOR(HMONITOR mon) {
J2dTraceLn1(J2D_TRACE_INFO, J2dTraceLn1(J2D_TRACE_INFO,
"AwtWin32GraphicsDevice::GetScreenFromMHND mhnd=%x", mon); "AwtWin32GraphicsDevice::GetScreenFromHMONITOR mhnd=%x", mon);
DASSERT(mon != NULL); DASSERT(mon != NULL);
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
for (int i = 0; i < devices->GetNumDevices(); i++) { for (int i = 0; i < devices->GetNumDevices(); i++) {
MHND mhnd = devices->GetDevice(i)->GetMonitor(); HMONITOR mhnd = devices->GetDevice(i)->GetMonitor();
if (AreSameMonitors(mon, mhnd)) { if (AreSameMonitors(mon, mhnd)) {
J2dTraceLn1(J2D_TRACE_VERBOSE, " Found device: %d", i); J2dTraceLn1(J2D_TRACE_VERBOSE, " Found device: %d", i);
return i; return i;
...@@ -790,8 +807,8 @@ int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) { ...@@ -790,8 +807,8 @@ int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) {
} }
J2dTraceLn1(J2D_TRACE_WARNING, J2dTraceLn1(J2D_TRACE_WARNING,
"AwtWin32GraphicsDevice::GetScreenFromMHND(): "\ "AwtWin32GraphicsDevice::GetScreenFromHMONITOR(): "\
"couldn't find screen for MHND %x, returning default", mon); "couldn't find screen for HMONITOR %x, returning default", mon);
return AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); return AwtWin32GraphicsDevice::GetDefaultDeviceIndex();
} }
...@@ -1076,19 +1093,19 @@ jobject CreateDisplayMode(JNIEnv* env, jint width, jint height, ...@@ -1076,19 +1093,19 @@ jobject CreateDisplayMode(JNIEnv* env, jint width, jint height,
* of the structure pointed to by lpDisplayDevice is undefined. * of the structure pointed to by lpDisplayDevice is undefined.
*/ */
static BOOL static BOOL
GetAttachedDisplayDevice(int screen, _DISPLAY_DEVICE *lpDisplayDevice) GetAttachedDisplayDevice(int screen, DISPLAY_DEVICE *lpDisplayDevice)
{ {
DWORD dwDeviceNum = 0; DWORD dwDeviceNum = 0;
lpDisplayDevice->dwSize = sizeof(_DISPLAY_DEVICE); lpDisplayDevice->cb = sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, dwDeviceNum, lpDisplayDevice, 0) && while (EnumDisplayDevices(NULL, dwDeviceNum, lpDisplayDevice, 0) &&
dwDeviceNum < 20) // avoid infinite loop with buggy drivers dwDeviceNum < 20) // avoid infinite loop with buggy drivers
{ {
if (lpDisplayDevice->dwFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { if (lpDisplayDevice->StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) {
Devices::InstanceAccess devices; Devices::InstanceAccess devices;
MONITOR_INFO_EXTENDED *pMonInfo = MONITORINFOEX *pMonInfo =
(PMONITOR_INFO_EXTENDED) devices->GetDevice(screen)->GetMonitorInfo(); (LPMONITORINFOEX)devices->GetDevice(screen)->GetMonitorInfo();
// make sure the device names match // make sure the device names match
if (wcscmp(pMonInfo->strDevice, lpDisplayDevice->strDevName) == 0) { if (wcscmp(pMonInfo->szDevice, lpDisplayDevice->DeviceName) == 0) {
return TRUE; return TRUE;
} }
} }
...@@ -1114,9 +1131,9 @@ Java_sun_awt_Win32GraphicsDevice_getCurrentDisplayMode ...@@ -1114,9 +1131,9 @@ Java_sun_awt_Win32GraphicsDevice_getCurrentDisplayMode
dm.dmSize = sizeof(dm); dm.dmSize = sizeof(dm);
dm.dmDriverExtra = 0; dm.dmDriverExtra = 0;
_DISPLAY_DEVICE displayDevice; DISPLAY_DEVICE displayDevice;
if (GetAttachedDisplayDevice(screen, &displayDevice)) { if (GetAttachedDisplayDevice(screen, &displayDevice)) {
pName = displayDevice.strDevName; pName = displayDevice.DeviceName;
} }
if (!EnumDisplaySettings(pName, ENUM_CURRENT_SETTINGS, &dm)) if (!EnumDisplaySettings(pName, ENUM_CURRENT_SETTINGS, &dm))
{ {
...@@ -1156,7 +1173,7 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode ...@@ -1156,7 +1173,7 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode
// ChangeDisplaySettingsEx is not available on NT, // ChangeDisplaySettingsEx is not available on NT,
// so it'd be nice not to break it if we can help it. // so it'd be nice not to break it if we can help it.
if (screen == AwtWin32GraphicsDevice::GetDefaultDeviceIndex()) { if (screen == AwtWin32GraphicsDevice::GetDefaultDeviceIndex()) {
if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) != if (::ChangeDisplaySettings(&dm, CDS_FULLSCREEN) !=
DISP_CHANGE_SUCCESSFUL) DISP_CHANGE_SUCCESSFUL)
{ {
JNU_ThrowInternalError(env, JNU_ThrowInternalError(env,
...@@ -1165,15 +1182,9 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode ...@@ -1165,15 +1182,9 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode
return; return;
} }
// make sure the function pointer for fn_change_display_settings_ex DISPLAY_DEVICE displayDevice;
// is initialized if (!GetAttachedDisplayDevice(screen, &displayDevice) ||
load_user_procs(); (::ChangeDisplaySettingsEx(displayDevice.DeviceName, &dm, NULL, CDS_FULLSCREEN, NULL) !=
_DISPLAY_DEVICE displayDevice;
if (fn_change_display_settings_ex == NULL ||
!GetAttachedDisplayDevice(screen, &displayDevice) ||
((*fn_change_display_settings_ex)
(displayDevice.strDevName, &dm, NULL, CDS_FULLSCREEN, NULL) !=
DISP_CHANGE_SUCCESSFUL)) DISP_CHANGE_SUCCESSFUL))
{ {
JNU_ThrowInternalError(env, JNU_ThrowInternalError(env,
...@@ -1231,11 +1242,11 @@ JNIEXPORT void JNICALL Java_sun_awt_Win32GraphicsDevice_enumDisplayModes ...@@ -1231,11 +1242,11 @@ JNIEXPORT void JNICALL Java_sun_awt_Win32GraphicsDevice_enumDisplayModes
DEVMODE dm; DEVMODE dm;
LPTSTR pName = NULL; LPTSTR pName = NULL;
_DISPLAY_DEVICE displayDevice; DISPLAY_DEVICE displayDevice;
if (GetAttachedDisplayDevice(screen, &displayDevice)) { if (GetAttachedDisplayDevice(screen, &displayDevice)) {
pName = displayDevice.strDevName; pName = displayDevice.DeviceName;
} }
dm.dmSize = sizeof(dm); dm.dmSize = sizeof(dm);
......
...@@ -32,7 +32,6 @@ extern "C" { ...@@ -32,7 +32,6 @@ extern "C" {
} // extern "C" } // extern "C"
#include "colordata.h" #include "colordata.h"
#include "awt_Palette.h" #include "awt_Palette.h"
#include "awt_MMStub.h"
#include "Devices.h" #include "Devices.h"
class AwtPalette; class AwtPalette;
...@@ -40,7 +39,7 @@ class Devices; ...@@ -40,7 +39,7 @@ class Devices;
class AwtWin32GraphicsDevice { class AwtWin32GraphicsDevice {
public: public:
AwtWin32GraphicsDevice(int screen, MHND mhnd, Devices *arr); AwtWin32GraphicsDevice(int screen, HMONITOR mhnd, Devices *arr);
~AwtWin32GraphicsDevice(); ~AwtWin32GraphicsDevice();
void UpdateDeviceColorState(); void UpdateDeviceColorState();
void SetGrayness(int grayValue); void SetGrayness(int grayValue);
...@@ -60,8 +59,8 @@ public: ...@@ -60,8 +59,8 @@ public:
HPALETTE GetPalette(); HPALETTE GetPalette();
ColorData *GetColorData() { return cData; } ColorData *GetColorData() { return cData; }
int GetBitDepth() { return colorData->bitsperpixel; } int GetBitDepth() { return colorData->bitsperpixel; }
MHND GetMonitor() { return monitor; } HMONITOR GetMonitor() { return monitor; }
MONITOR_INFO *GetMonitorInfo() { return pMonitorInfo; } LPMONITORINFO GetMonitorInfo() { return pMonitorInfo; }
jobject GetJavaDevice() { return javaDevice; } jobject GetJavaDevice() { return javaDevice; }
int GetDeviceIndex() { return screen; } int GetDeviceIndex() { return screen; }
void Release(); void Release();
...@@ -78,14 +77,14 @@ public: ...@@ -78,14 +77,14 @@ public:
static void UpdateDynamicColorModel(int deviceIndex); static void UpdateDynamicColorModel(int deviceIndex);
static BOOL UpdateSystemPalette(int deviceIndex); static BOOL UpdateSystemPalette(int deviceIndex);
static HPALETTE GetPalette(int deviceIndex); static HPALETTE GetPalette(int deviceIndex);
static MHND GetMonitor(int deviceIndex); static HMONITOR GetMonitor(int deviceIndex);
static MONITOR_INFO *GetMonitorInfo(int deviceIndex); static LPMONITORINFO GetMonitorInfo(int deviceIndex);
static void ResetAllMonitorInfo(); static void ResetAllMonitorInfo();
static BOOL IsPrimaryPalettized() { return primaryPalettized; } static BOOL IsPrimaryPalettized() { return primaryPalettized; }
static int GetDefaultDeviceIndex() { return primaryIndex; } static int GetDefaultDeviceIndex() { return primaryIndex; }
static void DisableOffscreenAccelerationForDevice(MHND hMonitor); static void DisableOffscreenAccelerationForDevice(HMONITOR hMonitor);
static HDC GetDCFromScreen(int screen); static HDC GetDCFromScreen(int screen);
static int GetScreenFromMHND(MHND mon); static int GetScreenFromHMONITOR(HMONITOR mon);
static int primaryIndex; static int primaryIndex;
static BOOL primaryPalettized; static BOOL primaryPalettized;
...@@ -97,17 +96,19 @@ public: ...@@ -97,17 +96,19 @@ public:
static jmethodID paletteChangedMID; static jmethodID paletteChangedMID;
private: private:
static BOOL AreSameMonitors(MHND mon1, MHND mon2); static BOOL AreSameMonitors(HMONITOR mon1, HMONITOR mon2);
ImgColorData *colorData; ImgColorData *colorData;
AwtPalette *palette; AwtPalette *palette;
ColorData *cData; // Could be static, but may sometime ColorData *cData; // Could be static, but may sometime
// have per-device info in this structure // have per-device info in this structure
BITMAPINFO *gpBitmapInfo; BITMAPINFO *gpBitmapInfo;
int screen; int screen;
MHND monitor; HMONITOR monitor;
MONITOR_INFO *pMonitorInfo; LPMONITORINFO pMonitorInfo;
jobject javaDevice; jobject javaDevice;
Devices *devicesArray; Devices *devicesArray;
static HDC MakeDCFromMonitor(HMONITOR);
}; };
#endif AWT_WIN32GRAPHICSDEVICE_H #endif AWT_WIN32GRAPHICSDEVICE_H
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
* have any questions. * have any questions.
*/ */
#include <windows.h>
#include <jni.h>
#include <awt.h> #include <awt.h>
#include <sun_awt_Win32GraphicsEnvironment.h> #include <sun_awt_Win32GraphicsEnvironment.h>
#include "awt_Canvas.h" #include "awt_Canvas.h"
...@@ -188,44 +186,6 @@ Java_sun_awt_Win32GraphicsEnvironment_getDefaultScreen(JNIEnv *env, ...@@ -188,44 +186,6 @@ Java_sun_awt_Win32GraphicsEnvironment_getDefaultScreen(JNIEnv *env,
return AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); return AwtWin32GraphicsDevice::GetDefaultDeviceIndex();
} }
#define FR_PRIVATE 0x10 /* from wingdi.h */
typedef int (WINAPI *AddFontResourceExType)(LPCTSTR,DWORD,VOID*);
typedef int (WINAPI *RemoveFontResourceExType)(LPCTSTR,DWORD,VOID*);
static AddFontResourceExType procAddFontResourceEx = NULL;
static RemoveFontResourceExType procRemoveFontResourceEx = NULL;
static int winVer = -1;
static int getWinVer() {
if (winVer == -1) {
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
winVer = osvi.dwMajorVersion;
if (winVer >= 5) {
// REMIND verify on 64 bit windows
HMODULE hGDI = LoadLibrary(TEXT("gdi32.dll"));
if (hGDI != NULL) {
procAddFontResourceEx =
(AddFontResourceExType)GetProcAddress(hGDI,"AddFontResourceExW");
if (procAddFontResourceEx == NULL) {
winVer = 0;
}
procRemoveFontResourceEx =
(RemoveFontResourceExType)GetProcAddress(hGDI,
"RemoveFontResourceExW");
if (procRemoveFontResourceEx == NULL) {
winVer = 0;
}
FreeLibrary(hGDI);
}
}
}
return winVer;
}
/* /*
* Class: sun_awt_Win32GraphicsEnvironment * Class: sun_awt_Win32GraphicsEnvironment
* Method: registerFontWithPlatform * Method: registerFontWithPlatform
...@@ -236,9 +196,10 @@ Java_sun_awt_Win32GraphicsEnvironment_registerFontWithPlatform(JNIEnv *env, ...@@ -236,9 +196,10 @@ Java_sun_awt_Win32GraphicsEnvironment_registerFontWithPlatform(JNIEnv *env,
jclass cl, jclass cl,
jstring fontName) jstring fontName)
{ {
if (getWinVer() >= 5 && procAddFontResourceEx != NULL) { LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE);
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL); if (file) {
(*procAddFontResourceEx)(file, FR_PRIVATE, NULL); ::AddFontResourceEx(file, FR_PRIVATE, NULL);
JNU_ReleaseStringPlatformChars(env, fontName, file);
} }
} }
...@@ -255,9 +216,10 @@ Java_sun_awt_Win32GraphicsEnvironment_deRegisterFontWithPlatform(JNIEnv *env, ...@@ -255,9 +216,10 @@ Java_sun_awt_Win32GraphicsEnvironment_deRegisterFontWithPlatform(JNIEnv *env,
jclass cl, jclass cl,
jstring fontName) jstring fontName)
{ {
if (getWinVer() >= 5 && procRemoveFontResourceEx != NULL) { LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE);
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL); if (file) {
(*procRemoveFontResourceEx)(file, FR_PRIVATE, NULL); ::RemoveFontResourceEx(file, FR_PRIVATE, NULL);
JNU_ReleaseStringPlatformChars(env, fontName, file);
} }
} }
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* have any questions. * have any questions.
*/ */
#include <windowsx.h> #include "awt.h"
#include "awt_Component.h" #include "awt_Component.h"
#include "awt_Container.h" #include "awt_Container.h"
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include "awt_Panel.h" #include "awt_Panel.h"
#include "awt_Toolkit.h" #include "awt_Toolkit.h"
#include "awt_Window.h" #include "awt_Window.h"
#include "awt_dlls.h"
#include "awt_Win32GraphicsDevice.h" #include "awt_Win32GraphicsDevice.h"
#include "awt_BitmapUtil.h" #include "awt_BitmapUtil.h"
#include "awt_IconCursor.h" #include "awt_IconCursor.h"
...@@ -42,6 +41,8 @@ ...@@ -42,6 +41,8 @@
#include <java_awt_event_ComponentEvent.h> #include <java_awt_event_ComponentEvent.h>
#include "sun_awt_windows_WCanvasPeer.h" #include "sun_awt_windows_WCanvasPeer.h"
#include <windowsx.h>
#if !defined(__int3264) #if !defined(__int3264)
typedef __int32 LONG_PTR; typedef __int32 LONG_PTR;
#endif // __int3264 #endif // __int3264
...@@ -501,8 +502,7 @@ void AwtWindow::Show() ...@@ -501,8 +502,7 @@ void AwtWindow::Show()
// which might involve tagging java.awt.Window instances with a semantic // which might involve tagging java.awt.Window instances with a semantic
// property so platforms can animate/decorate/etc accordingly. // property so platforms can animate/decorate/etc accordingly.
// //
if ((IS_WIN98 || IS_WIN2000) && if (JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0)
JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0)
{ {
// need this global ref to make the class unloadable (see 6500204) // need this global ref to make the class unloadable (see 6500204)
static jclass windowsPopupWindowCls; static jclass windowsPopupWindowCls;
...@@ -535,13 +535,8 @@ void AwtWindow::Show() ...@@ -535,13 +535,8 @@ void AwtWindow::Show()
windowType = env->GetIntField(target, windowTypeFID); windowType = env->GetIntField(target, windowTypeFID);
if (windowType == windowTYPES[TOOLTIP]) { if (windowType == windowTYPES[TOOLTIP]) {
if (IS_WIN2000) {
SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0); SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0);
SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0); SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0);
} else {
// use same setting as menus
SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0);
}
if (animateflag) { if (animateflag) {
// AW_BLEND currently produces runtime parameter error // AW_BLEND currently produces runtime parameter error
// animateStyle = fadeflag? AW_BLEND : AW_SLIDE | AW_VER_POSITIVE; // animateStyle = fadeflag? AW_BLEND : AW_SLIDE | AW_VER_POSITIVE;
...@@ -551,14 +546,11 @@ void AwtWindow::Show() ...@@ -551,14 +546,11 @@ void AwtWindow::Show()
windowType == windowTYPES[POPUPMENU]) { windowType == windowTYPES[POPUPMENU]) {
SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0); SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0);
if (animateflag) { if (animateflag) {
if (IS_WIN2000) {
SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0); SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0);
if (fadeflag) { if (fadeflag) {
// AW_BLEND currently produces runtime parameter error // AW_BLEND currently produces runtime parameter error
//animateStyle = AW_BLEND; //animateStyle = AW_BLEND;
} }
}
if (animateStyle == 0 && !fadeflag) { if (animateStyle == 0 && !fadeflag) {
animateStyle = AW_SLIDE; animateStyle = AW_SLIDE;
if (windowType == windowTYPES[MENU]) { if (windowType == windowTYPES[MENU]) {
...@@ -578,41 +570,21 @@ void AwtWindow::Show() ...@@ -578,41 +570,21 @@ void AwtWindow::Show()
} }
if (animateStyle != 0) { if (animateStyle != 0) {
load_user_procs(); BOOL result = ::AnimateWindow(hWnd, (DWORD)200, animateStyle);
if (!result) {
if (fn_animate_window != NULL) { // TODO: log message
BOOL result = (*fn_animate_window)(hWnd, (DWORD)200, animateStyle);
if (result == 0) {
LPTSTR msgBuffer = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&msgBuffer, // it's an output parameter when allocate buffer is used
0,
NULL);
if (msgBuffer == NULL) {
msgBuffer = TEXT("<Could not get GetLastError() message text>");
}
_ftprintf(stderr,TEXT("AwtWindow::Show: AnimateWindow: "));
_ftprintf(stderr,msgBuffer);
LocalFree(msgBuffer);
} else { } else {
// WM_PAINT is not automatically sent when invoking AnimateWindow, // WM_PAINT is not automatically sent when invoking AnimateWindow,
// so force an expose event // so force an expose event
RECT rect; RECT rect;
::GetWindowRect(hWnd,&rect); ::GetWindowRect(hWnd,&rect);
::ScreenToClient(hWnd, (LPPOINT)&rect); ::ScreenToClient(hWnd, (LPPOINT)&rect);
::InvalidateRect(hWnd,&rect,TRUE); ::InvalidateRect(hWnd, &rect, TRUE);
::UpdateWindow(hWnd); ::UpdateWindow(hWnd);
done = TRUE; done = TRUE;
} }
} }
} }
}
if (!done) { if (!done) {
::ShowWindow(GetHWnd(), nCmdShow); ::ShowWindow(GetHWnd(), nCmdShow);
} }
...@@ -1205,16 +1177,17 @@ MsgRouting AwtWindow::WmNcPaint(HRGN hrgn) ...@@ -1205,16 +1177,17 @@ MsgRouting AwtWindow::WmNcPaint(HRGN hrgn)
} }
/* draw warning text */ /* draw warning text */
LPWSTR text = TO_WSTRING(warningString); LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL);
VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID); VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID);
VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID); VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID);
VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL); VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL);
VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR); VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR);
VERIFY(::ExtTextOutW(hDC, r.left+2, r.bottom-1, VERIFY(::ExtTextOut(hDC, r.left+2, r.bottom-1,
ETO_CLIPPED | ETO_OPAQUE, ETO_CLIPPED | ETO_OPAQUE,
&r, text, static_cast<UINT>(wcslen(text)), NULL)); &r, text, static_cast<UINT>(wcslen(text)), NULL));
VERIFY(::RestoreDC(hDC, iSaveDC)); VERIFY(::RestoreDC(hDC, iSaveDC));
::ReleaseDC(GetHWnd(), hDC); ::ReleaseDC(GetHWnd(), hDC);
JNU_ReleaseStringPlatformChars(env, warningString, text);
} }
env->DeleteLocalRef(target); env->DeleteLocalRef(target);
...@@ -1360,13 +1333,13 @@ void AwtWindow::RedrawNonClient() ...@@ -1360,13 +1333,13 @@ void AwtWindow::RedrawNonClient()
} }
int AwtWindow::GetScreenImOn() { int AwtWindow::GetScreenImOn() {
MHND hmon; HMONITOR hmon;
int scrnNum; int scrnNum;
hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULT_TO_PRIMARY); hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY);
DASSERT(hmon != NULL); DASSERT(hmon != NULL);
scrnNum = AwtWin32GraphicsDevice::GetScreenFromMHND(hmon); scrnNum = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hmon);
DASSERT(scrnNum > -1); DASSERT(scrnNum > -1);
return scrnNum; return scrnNum;
...@@ -1619,10 +1592,10 @@ void AwtWindow::_SetTitle(void *param) ...@@ -1619,10 +1592,10 @@ void AwtWindow::_SetTitle(void *param)
if (::IsWindow(w->GetHWnd())) if (::IsWindow(w->GetHWnd()))
{ {
int length = env->GetStringLength(title); int length = env->GetStringLength(title);
WCHAR *buffer = new WCHAR[length + 1]; TCHAR *buffer = new TCHAR[length + 1];
env->GetStringRegion(title, 0, length, buffer); env->GetStringRegion(title, 0, length, reinterpret_cast<jchar*>(buffer));
buffer[length] = L'\0'; buffer[length] = L'\0';
VERIFY(::SetWindowTextW(w->GetHWnd(), buffer)); VERIFY(::SetWindowText(w->GetHWnd(), buffer));
delete[] buffer; delete[] buffer;
} }
ret: ret:
...@@ -1967,14 +1940,12 @@ void AwtWindow::_SetFocusableWindow(void *param) ...@@ -1967,14 +1940,12 @@ void AwtWindow::_SetFocusableWindow(void *param)
window->m_isFocusableWindow = isFocusableWindow; window->m_isFocusableWindow = isFocusableWindow;
if (IS_WIN2000) {
if (!window->m_isFocusableWindow) { if (!window->m_isFocusableWindow) {
LONG isPopup = window->GetStyle() & WS_POPUP; LONG isPopup = window->GetStyle() & WS_POPUP;
window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE); window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE);
} else { } else {
window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE); window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE);
} }
}
ret: ret:
env->DeleteGlobalRef(self); env->DeleteGlobalRef(self);
......
/*
* Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include "awt.h"
#include "awt_dlls.h"
/*
* To reduce memory footprint we don't statically link to COMDLG32.DLL
* and SHELL32. Instead we programatically load them only when they are
* needed.
*/
PrintDlgType AwtCommDialog::do_print_dlg;
PageSetupDlgType AwtCommDialog::do_page_setup_dlg;
GetOpenFileNameType AwtCommDialog::get_open_file_name;
GetSaveFileNameType AwtCommDialog::get_save_file_name;
GetExtendedErrorType AwtCommDialog::get_dlg_extended_error;
/***********************************************************************/
DWORD
AwtCommDialog::CommDlgExtendedError(VOID) {
AwtCommDialog::load_comdlg_procs();
return static_cast<DWORD>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().
InvokeFunction(reinterpret_cast<void *(*)(void)>
(AwtCommDialog::GetExtendedErrorWrapper))));
}
BOOL
AwtCommDialog::PrintDlg(LPPRINTDLG data) {
AwtCommDialog::load_comdlg_procs();
return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().
InvokeFunction(reinterpret_cast<void *(*)(void *)>
(AwtCommDialog::PrintDlgWrapper), data)));
}
BOOL
AwtCommDialog::PageSetupDlg(LPPAGESETUPDLG data) {
AwtCommDialog::load_comdlg_procs();
return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().
InvokeFunction(reinterpret_cast<void *(*)(void *)>
(AwtCommDialog::PageSetupDlgWrapper), data)));
}
/*
* Load the COMDLG32.dll and get pointers to various procedures.
*/
void
AwtCommDialog::load_comdlg_procs()
{
static int initialized = 0;
HMODULE lib = NULL;
if (initialized) {
return;
}
lib = LoadLibrary(TEXT("COMDLG32.DLL"));
HMODULE libUnicows = UnicowsLoader::GetModuleHandle();
do_print_dlg = (PrintDlgType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "PrintDlgW");
do_page_setup_dlg = (PageSetupDlgType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "PageSetupDlgW");
get_open_file_name = (GetOpenFileNameType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "GetOpenFileNameW");
get_save_file_name = (GetSaveFileNameType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "GetSaveFileNameW");
get_dlg_extended_error = (GetExtendedErrorType)GetProcAddress(lib, "CommDlgExtendedError");
initialized = 1;
}
/***********************************************************************/
DragQueryFileType do_drag_query_file;
GetPathFromIDListType get_path_from_idlist;
/*
* Load the SHELL32.dll and get pointers to various procedures.
*/
void
load_shell_procs()
{
static int initialized = 0;
HMODULE lib = NULL;
if (initialized) {
return;
}
if (IS_WIN95) {
lib = UnicowsLoader::GetModuleHandle();
} else {
lib = LoadLibrary(TEXT("SHELL32.DLL"));
}
do_drag_query_file = (DragQueryFileType)GetProcAddress(lib, "DragQueryFileW");
get_path_from_idlist = (GetPathFromIDListType)GetProcAddress(lib,
"SHGetPathFromIDListW");
initialized = 1;
}
/***********************************************************************/
AnimateWindowType fn_animate_window;
ChangeDisplaySettingsExType fn_change_display_settings_ex;
/*
* Load the USER32.dll and get pointers to various procedures.
*/
void
load_user_procs()
{
static int initialized = 0;
HMODULE lib = NULL;
if (initialized) {
return;
}
lib = LoadLibrary(TEXT("USER32.DLL"));
HMODULE libUnicows = UnicowsLoader::GetModuleHandle();
fn_animate_window = (AnimateWindowType)GetProcAddress(lib, "AnimateWindow");
fn_change_display_settings_ex = (ChangeDisplaySettingsExType)
GetProcAddress(IS_WIN95 ? libUnicows : lib, "ChangeDisplaySettingsExW");
initialized = 1;
}
/***********************************************************************/
GetFileVersionInfoSizeType get_file_version_info_size;
GetFileVersionInfoType get_file_version_info;
VerQueryValueType do_ver_query_value;
/*
* Load the VERSION.dll and get pointers to various procedures.
*/
void
load_version_procs()
{
static int initialized = 0;
HMODULE lib = NULL;
if (initialized) {
return;
}
if (IS_WIN95) {
lib = UnicowsLoader::GetModuleHandle();
} else {
lib = LoadLibrary(TEXT("VERSION.DLL"));
}
get_file_version_info_size =
(GetFileVersionInfoSizeType)GetProcAddress(lib, "GetFileVersionInfoSizeW");
get_file_version_info =
(GetFileVersionInfoType)GetProcAddress(lib, "GetFileVersionInfoW");
do_ver_query_value =
(VerQueryValueType)GetProcAddress(lib, "VerQueryValueW");
initialized = 1;
}
/***********************************************************************/
#define MAX_KNOWN_VERSION 4
/*
* We are going to use an undocumented procedure RSRC32.DLL.
* The safest will be to use it only for a finite set of known versions.
*/
DWORD known_versions[MAX_KNOWN_VERSION][2] = {
{ 0x00040000, 0x000003B6 }, // WIN95\RETAIL
// WIN95\RETAIL\UPGRADE
// WIN95\OSR2
// WIN95\OSR25
// WIN95\international\RETAIL
// WIN95\international\OSR2
{ 0x0004000A, 0x00000672 }, // WIN98\international\win98beta3
{ 0x0004000A, 0x000007CE }, // WIN98\RETAIL
// WIN98\international\RETAIL
// WIN98\SE
{ 0x0004005A, 0x00000BB8 } // WIN98ME
};
GetFreeSystemResourcesType get_free_system_resources = NULL;
/*
* Load the RSRC32.dll, check that it is a known version
* and get the pointer to the undocumented procedure.
*/
void
load_rsrc32_procs()
{
static int initialized = 0;
if (initialized) {
return;
}
if (IS_NT) {
// 4310028: Only load library on non-NT systems. The load
// will always fail anyways. However, if a Win 9x OS is
// also installed on the system, and the user's path
// includes C:\WINDOWS\SYSTEM, or the equivalent, a really
// ugly and annoying warning dialog will appear.
initialized = 1;
return;
}
HMODULE lib = LoadLibrary(TEXT("RSRC32.DLL"));
if (lib != NULL) {
TCHAR szFullPath[_MAX_PATH];
DWORD dwVerHnd = 0;
DWORD dwVersionInfoSize;
LPBYTE lpVersionInfo;
LPVOID lpBuffer;
UINT uLength = 0;
/*
* We use undocumented procedure exported by RSRC32.DLL, so the
* safest will be to check the library's version and only attempt
* to get the procedure address if it's a known version.
*/
if (::GetModuleFileName(lib, szFullPath, sizeof(szFullPath))) {
load_version_procs();
dwVersionInfoSize = (*get_file_version_info_size)(szFullPath, &dwVerHnd);
if (dwVersionInfoSize) {
lpVersionInfo = new BYTE[dwVersionInfoSize];
(*get_file_version_info)(szFullPath, dwVerHnd,
dwVersionInfoSize, lpVersionInfo);
if ((*do_ver_query_value)(lpVersionInfo, TEXT("\\"), &lpBuffer, &uLength)) {
VS_FIXEDFILEINFO *lpvsFixedFileInfo = (VS_FIXEDFILEINFO *)lpBuffer;
DWORD dwFileVersionMS = lpvsFixedFileInfo->dwFileVersionMS;
DWORD dwFileVersionLS = lpvsFixedFileInfo->dwFileVersionLS;
for (int i = 0; i < MAX_KNOWN_VERSION; i++) {
if ((known_versions[i][0] == dwFileVersionMS) &&
(known_versions[i][1] == dwFileVersionLS)) {
get_free_system_resources =
(GetFreeSystemResourcesType)
::GetProcAddress(lib, "_MyGetFreeSystemResources32@4");
break;
}
}
}
delete[] lpVersionInfo;
}
}
}
initialized = 1;
}
void
load_rich_edit_library() {
static int initialized = 0;
BOOL isRichEdit32Needed = IS_WIN95 && !IS_WIN98;
if (initialized) {
return;
}
HMODULE lib = NULL;
if (isRichEdit32Needed) {
lib = ::LoadLibrary(TEXT("RICHED32.DLL"));
} else {
lib = ::LoadLibrary(TEXT("RICHED20.DLL"));
}
if (lib == NULL) {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
JNU_ThrowInternalError(env, "Can't load a rich edit DLL");
} else if (isRichEdit32Needed) {
// Richedit language checking logic is needed for RICHED32.DLL only.
LPTSTR szFullPath = new TCHAR[_MAX_PATH];
DWORD dwVerHnd = 0;
DWORD dwVersionInfoSize;
LPVOID lpVersionInfo;
UINT uLength = 0;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
try {
if (!IS_WIN2000 && ::GetModuleFileName(lib, szFullPath, _MAX_PATH)) {
load_version_procs();
dwVersionInfoSize = (*get_file_version_info_size)(szFullPath, &dwVerHnd);
if (dwVersionInfoSize) {
lpVersionInfo = new BYTE[dwVersionInfoSize];
try {
if ((*get_file_version_info)(szFullPath,
dwVerHnd,
dwVersionInfoSize,
lpVersionInfo)
&& (*do_ver_query_value)(lpVersionInfo,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&uLength)) {
if (::GetSystemMetrics(SM_DBCSENABLED)
&& LANGIDFROMLCID(::GetThreadLocale()) != lpTranslate[0].wLanguage) {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env->PushLocalFrame(6) >= 0) {
jstring keystr = env->NewStringUTF("AWT.InconsistentDLLsWarning");
jstring defstr = env->NewStringUTF(
"Text based operations may not work correctly due to \
an inconsistent set of dynamic linking libraries (DLLs) installed on your \
system. For more information on this problem and a suggested workaround \
please see the Java(TM) 2 SDK, Standard Edition Release Notes \
on java.sun.com.");
jstring retstr =
(jstring) JNU_CallStaticMethodByName(
env,
NULL,
"java/awt/Toolkit",
"getProperty",
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
keystr,
defstr).l;
jboolean exception;
jstring pkgstr = env->NewStringUTF("java.awt");
jobject logger =
(jobject) JNU_CallStaticMethodByName(
env,
&exception,
"java/util/logging/Logger",
"getLogger",
"(Ljava/lang/String;)Ljava/util/logging/Logger;",
pkgstr).l;
jstring msgstr = (retstr) ? retstr : defstr;
if (!exception) {
JNU_CallMethodByName(
env,
NULL,
logger,
"warning",
"(Ljava/lang/String;)V",
msgstr);
} else {
LPCTSTR outstr = JNU_GetStringPlatformChars(env, msgstr, NULL);
_ftprintf(stdout, TEXT("\nWARNING: %s\n"), outstr);
fflush(stdout);
JNU_ReleaseStringPlatformChars(env, msgstr, outstr);
}
env->PopLocalFrame(NULL);
}
}
}
} catch (...) {
delete[] lpVersionInfo;
throw;
}
delete[] lpVersionInfo;
}
}
} catch (...) {
delete[] szFullPath;
throw;
}
delete[] szFullPath;
}
initialized = 1;
}
/***********************************************************************/
bool AwtWinMM::initialized = false;
AwtWinMM::PlaySoundWFunc* AwtWinMM::playSoundFunc = NULL;
BOOL AwtWinMM::PlaySoundWrapper(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound) {
load_winmm_procs();
if (playSoundFunc == NULL) {
return FALSE;
}
return (*playSoundFunc)(pszSound, hmod, fdwSound);
}
void AwtWinMM::load_winmm_procs() {
if (initialized) {
return;
}
HMODULE dll = NULL;
if (IS_WIN95) {
dll = UnicowsLoader::GetModuleHandle();
} else {
dll = ::LoadLibrary(TEXT("winmm.dll"));
}
if (dll == NULL) {
return;
}
playSoundFunc =
(PlaySoundWFunc*) GetProcAddress(dll, "PlaySoundW");
if (playSoundFunc == NULL) {
return;
}
initialized = true;
}
/*
* Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#ifndef AWT_DLLS_H
#define AWT_DLLS_H
#include <commdlg.h>
#include <shellapi.h>
#include <shlobj.h>
#include "awt_FileDialog.h"
#include "awt_PrintDialog.h"
/*
* To reduce memory footprint we don't statically link to COMDLG32.DLL
* and SHELL32. Instead we programatically load them only when they are
* needed.
*/
//---------------------------------------------------------------------------
typedef BOOL (APIENTRY *PrintDlgType)(LPPRINTDLGW);
typedef BOOL (APIENTRY *PageSetupDlgType)(LPPAGESETUPDLGW);
typedef BOOL (APIENTRY *GetOpenFileNameType)(LPOPENFILENAMEW);
typedef BOOL (APIENTRY *GetSaveFileNameType)(LPOPENFILENAMEW);
typedef DWORD (APIENTRY *GetExtendedErrorType)(VOID);
class AwtCommDialog {
public:
static DWORD CommDlgExtendedError(VOID);
static BOOL PrintDlg(LPPRINTDLG data);
static BOOL PageSetupDlg(LPPAGESETUPDLG data);
private:
static void load_comdlg_procs();
// Use wrapper functions with default calling convention. If the
// default isn't __stdcall, accessing the Win32 functions directly
// will cause stack corruption if we cast away __stdcall.
static BOOL PrintDlgWrapper(LPPRINTDLG data) {
return (*do_print_dlg)(data);
}
static BOOL PageSetupDlgWrapper(LPPAGESETUPDLG data) {
return (*do_page_setup_dlg)(data);
}
static BOOL GetOpenFileNameWrapper(LPOPENFILENAME data) {
return (*get_open_file_name)(data);
}
static BOOL GetSaveFileNameWrapper(LPOPENFILENAME data) {
return (*get_save_file_name)(data);
}
static DWORD GetExtendedErrorWrapper(VOID) {
return (*get_dlg_extended_error)();
}
friend BOOL AwtFileDialog::GetOpenFileName(LPAWTOPENFILENAME);
friend BOOL AwtFileDialog::GetSaveFileName(LPAWTOPENFILENAME);
friend BOOL AwtPrintDialog::PrintDlg(LPPRINTDLG);
static PrintDlgType do_print_dlg;
static PageSetupDlgType do_page_setup_dlg;
static GetOpenFileNameType get_open_file_name;
static GetSaveFileNameType get_save_file_name;
static GetExtendedErrorType get_dlg_extended_error;
};
//---------------------------------------------------------------------------
// Dynamically load in SHELL32.DLL and define the procedure pointers listed below.
extern void load_shell_procs();
// Procedure pointers obtained from SHELL32.DLL
// You must call load_shell_procs() before using any of these.
typedef UINT (APIENTRY *DragQueryFileType)(HDROP,UINT,LPTSTR,UINT);
typedef BOOL (APIENTRY *GetPathFromIDListType)(LPCITEMIDLIST,LPTSTR);
extern DragQueryFileType do_drag_query_file;
extern GetPathFromIDListType get_path_from_idlist;
//---------------------------------------------------------------------------
// Dynamically load in USER32.DLL and define the procedure pointers listed below.
extern void load_user_procs();
// Procedure pointers obtained from USER32.DLL
// You must call load_user_procs() before using any of these.
typedef BOOL (WINAPI *AnimateWindowType)(HWND,DWORD,DWORD);
typedef LONG (WINAPI *ChangeDisplaySettingsExType)(LPCTSTR,LPDEVMODE,HWND,DWORD,LPVOID lParam);
extern AnimateWindowType fn_animate_window;
extern ChangeDisplaySettingsExType fn_change_display_settings_ex;
//---------------------------------------------------------------------------
// Dynamically load in VERSION.DLL and define the procedure pointers listed below.
extern void load_version_procs();
// Procedure pointers obtained from VERSION.DLL
// You must call load_version_procs() before using any of these.
typedef DWORD (APIENTRY *GetFileVersionInfoSizeType)(LPTSTR,LPDWORD);
typedef BOOL (APIENTRY *GetFileVersionInfoType)(LPTSTR,DWORD,DWORD,LPVOID);
typedef BOOL (APIENTRY *VerQueryValueType)(const LPVOID,LPTSTR,LPVOID*,PUINT);
extern GetFileVersionInfoSizeType get_file_version_info_size;
extern GetFileVersionInfoType get_file_version_info;
extern VerQueryValueType do_ver_query_value;
//---------------------------------------------------------------------------
// Dynamically load in RSRC32.DLL and define the procedure pointers listed below.
extern void load_rsrc32_procs();
// Procedure pointers obtained from RSRC32.DLL
// You must call load_rsrc32_procs() before using this procedure.
/*
* NOTE: even after load_rsrc32_procs() you must check that
* the function pointer is valid before use.
* It will be NULL in three cases:
* 1.RSRC32.DLL not found. This means that Resource Meter
* isn't installed.
* 2.RSRC32.DLL can't be loaded. This happens on WinNT.
* 3.Unknown version of RSRC32.DLL. This is undocumented
* procedure, so the safest will be to use it only for
* a finite set of known versions.
*/
typedef UINT (APIENTRY *GetFreeSystemResourcesType)(UINT);
extern GetFreeSystemResourcesType get_free_system_resources;
extern void load_rich_edit_library();
//---------------------------------------------------------------------------
/*
* Loading WINMM.DLL (the Windows MultiMedia library) is extremely
* expensive. The AWT only uses it to play certain Windows sounds
* (which are off by default) so we dynamically load it upon demand
* instead of statically linking to it.
*/
class AwtWinMM {
public:
static BOOL PlaySoundWrapper(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound);
private:
static void load_winmm_procs();
static bool initialized;
typedef BOOL WINAPI PlaySoundWFunc(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound);
static PlaySoundWFunc* playSoundFunc;
};
#endif /* AWT_DLLS_H */
...@@ -182,18 +182,6 @@ extern const UINT SYSCOMMAND_IMM; ...@@ -182,18 +182,6 @@ extern const UINT SYSCOMMAND_IMM;
#endif //AW_BLEND #endif //AW_BLEND
// WM_MOUSEWHEEL should be WM_MOUSELAST, but
// is not being defined. See winuser.h
#ifdef WM_MOUSELAST
#if WM_MOUSELAST <= 0x020A
#define WM_AWT_MOUSELAST 0x020A
#else
#error Unexpected value of WM_MOUSELAST
#endif //WM_MOUSELAST <= 0x0209
#endif //WM_MOUSELAST
// AwtComponent messages // AwtComponent messages
enum { enum {
// 6427323: unfortunately WM_APP+nnn conflicts with edit control messages // 6427323: unfortunately WM_APP+nnn conflicts with edit control messages
......
/* /*
* Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1999-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#define _JNI_IMPLEMENTATION_ #define _JNI_IMPLEMENTATION_
#include <jawt.h> #include <jawt.h>
#include "awt.h"
#include "awt_DrawingSurface.h" #include "awt_DrawingSurface.h"
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册