This commit is contained in:
Andrei Dmitriev 2008-09-04 17:24:23 +04:00
commit e1f54b3780
88 changed files with 1030 additions and 4020 deletions

View File

@ -153,7 +153,6 @@ FILES_cpp = \
awt_Menu.cpp \
awt_MenuBar.cpp \
awt_MenuItem.cpp \
awt_MMStub.cpp \
awt_MouseEvent.cpp \
awt_Object.cpp \
awt_Palette.cpp \
@ -171,7 +170,6 @@ FILES_cpp = \
awt_TextComponent.cpp \
awt_TextField.cpp \
awt_Toolkit.cpp \
awt_Unicode.cpp \
awt_Window.cpp \
awt_Win32GraphicsEnv.cpp \
awt_Win32GraphicsDevice.cpp \
@ -202,6 +200,4 @@ FILES_cpp = \
ThemeReader.cpp \
ComCtl32Util.cpp \
initIDs.cpp \
awt_dlls.cpp \
UnicowsLoader.cpp \
MouseInfo.cpp

View File

@ -251,8 +251,14 @@ endif # PLATFORM
ifeq ($(PLATFORM), windows)
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WINDOWS
OTHER_LDLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib \
imm32.lib ole32.lib uuid.lib $(JVMLIB) \
shell32.lib
imm32.lib ole32.lib uuid.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

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
$(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

View File

@ -67,7 +67,7 @@ ifneq ($(PLATFORM), windows)
OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread
else # PLATFORM
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
endif # PLATFORM

View File

@ -1,5 +1,5 @@
/*
* Copyright 2005-2007 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -203,16 +203,18 @@ public class SystemTray {
* functionality is supported for the current platform
*/
public static boolean isSupported() {
initializeSystemTrayIfNeeded();
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (toolkit instanceof SunToolkit) {
// connecting tray to native resource
initializeSystemTrayIfNeeded();
return ((SunToolkit)toolkit).isTraySupported();
} else if (toolkit instanceof HeadlessToolkit) {
// skip initialization as the init routine
// throws HeadlessException
return ((HeadlessToolkit)toolkit).isTraySupported();
} else {
return false;
}
return false;
}
/**
@ -476,7 +478,12 @@ public class SystemTray {
synchronized void addNotify() {
if (peer == null) {
peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this);
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (toolkit instanceof SunToolkit) {
peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this);
} else if (toolkit instanceof HeadlessToolkit) {
peer = ((HeadlessToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this);
}
}
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -38,6 +38,7 @@ import java.util.EventListener;
import java.awt.peer.TrayIconPeer;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
import sun.awt.HeadlessToolkit;
import java.util.EventObject;
/**
@ -659,7 +660,12 @@ public class TrayIcon {
{
synchronized (this) {
if (peer == null) {
peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this);
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (toolkit instanceof SunToolkit) {
peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this);
} else if (toolkit instanceof HeadlessToolkit) {
peer = ((HeadlessToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this);
}
}
}
peer.setToolTip(tooltip);

View File

@ -26,7 +26,9 @@
package javax.swing;
import java.awt.*;
import sun.awt.ModalExclude;
import sun.awt.SunToolkit;
/**
* Popups are used to display a <code>Component</code> to the user, typically
@ -225,7 +227,12 @@ public class Popup {
HeavyWeightWindow(Window parent) {
super(parent);
setFocusableWindowState(false);
setName("###overrideRedirect###");
Toolkit tk = Toolkit.getDefaultToolkit();
if (tk instanceof SunToolkit) {
// all the short-lived windows like Popups should be
// OverrideRedirect on X11 platforms
((SunToolkit)tk).setOverrideRedirect(this);
}
// Popups are typically transient and most likely won't benefit
// from true double buffering. Turn it off here.
getRootPane().setUseTrueDoubleBuffering(false);

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -852,6 +852,15 @@ public abstract class SunToolkit extends Toolkit
return AccessController.doPrivileged(new GetBooleanAction("sun.awt.erasebackgroundonresize"));
}
/**
* Makes the window OverrideRedirect, on X11 platforms. See
* ICCCM specification for more details about OverrideRedirect
* windows. Implemented in XToolkit, no-op in WToolkit.
*/
public void setOverrideRedirect(Window target) {
}
static SoftCache imgCache = new SoftCache();
static synchronized Image getImageFromHash(Toolkit tk, URL url) {

View File

@ -97,6 +97,11 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
static int awt_multiclick_time;
static boolean securityWarningEnabled;
// WeakSet should be used here, but there is no such class
// in JDK (at least in JDK6 and earlier versions)
private WeakHashMap<Window, Boolean> overrideRedirectWindows =
new WeakHashMap<Window, Boolean>();
private static int screenWidth = -1, screenHeight = -1; // Dimensions of default screen
static long awt_defaultFg; // Pixel
private static XMouseInfoPeer xPeer;
@ -1248,6 +1253,19 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
}
}
@Override
public void setOverrideRedirect(Window target) {
synchronized (overrideRedirectWindows) {
overrideRedirectWindows.put(target, true);
}
}
public boolean isOverrideRedirect(Window target) {
synchronized (overrideRedirectWindows) {
return overrideRedirectWindows.containsKey(target);
}
}
static void dumpPeers() {
if (log.isLoggable(Level.FINE)) {
log.fine("Mapped windows:");

View File

@ -129,6 +129,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
void preInit(XCreateWindowParams params) {
target = (Component)params.get(TARGET);
params.put(REPARENTED,
Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
super.preInit(params);
@ -1117,6 +1118,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
boolean isOverrideRedirect() {
return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) ||
XTrayIconPeer.isTrayIconStuffWindow((Window)target);
}

View File

@ -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 shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer");
static {
wheelInit();
}
// Only actually does stuff if running on 95
native static void wheelInit();
// ComponentPeer implementation
SurfaceData surfaceData;

View File

@ -548,11 +548,15 @@ public class WInputMethod extends InputMethodAdapter
public void inquireCandidatePosition()
{
Component source = getClientComponent();
if (source == null) {
return;
}
// This call should return immediately just to cause
// InputMethodRequests.getTextLocation be called within
// AWT Event thread. Otherwise, a potential deadlock
// could happen.
java.awt.EventQueue.invokeLater(new Runnable() {
Runnable r = new Runnable() {
public void run() {
int x = 0;
int y = 0;
@ -573,7 +577,9 @@ public class WInputMethod extends InputMethodAdapter
openCandidateWindow(awtFocussedComponentPeer, x, y);
}
});
};
WToolkit.postEvent(WToolkit.targetToAppContext(source),
new InvocationEvent(source, r));
}
// java.awt.Toolkit#getNativeContainer() is not available

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,24 +23,21 @@
* 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 <windowsx.h>
#include <windows.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
#define WS_EX_LAYERED 0x80000
#endif
@ -57,21 +54,6 @@ typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered win
#define AC_SRC_ALPHA 0x01
#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_SPLASHRECONFIGURE WM_USER+2
@ -436,16 +418,11 @@ SplashUnlock(Splash * splash)
void
SplashInitPlatform(Splash * splash)
{
HMODULE user32 = LoadLibrary("user32.dll");
HDC hdc;
int paletteMode;
InitializeCriticalSection(&splash->lock);
splash->isLayered = FALSE;
if (user32) {
UpdateLayeredWindow = (UpdateLayeredWindowT *)
GetProcAddress(user32, "UpdateLayeredWindow");
}
hdc = GetDC(NULL);
paletteMode = (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0;
if (UpdateLayeredWindow && !paletteMode) {

View File

@ -184,7 +184,7 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter,
pMgr = D3DPipelineManager::GetInstance();
RETURN_IF_NULL(pMgr);
hMon = pMgr->pd3d9->GetAdapterMonitor(adapter);
gdiScreen = AwtWin32GraphicsDevice::GetScreenFromMHND((MHND)hMon);
gdiScreen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hMon);
JNU_CallStaticMethodByName(env, NULL,
"sun/java2d/pipe/hw/AccelDeviceEventNotifier",
@ -194,21 +194,21 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter,
UINT D3DPipelineManager::GetAdapterOrdinalForScreen(jint gdiScreen)
{
MHND mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen);
if (mHnd == (MHND)0) {
HMONITOR mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen);
if (mHnd == (HMONITOR)0) {
return D3DADAPTER_DEFAULT;
}
return GetAdapterOrdinalByHmon((HMONITOR)mHnd);
}
// static
HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum)
HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pHMONITORs, UINT monNum)
{
HRESULT res = S_OK;
BOOL bResetD3D = FALSE, bFound;
D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance();
RETURN_STATUS_IF_NULL(pMHNDs, E_FAIL);
RETURN_STATUS_IF_NULL(pHMONITORs, E_FAIL);
if (pMgr == NULL) {
// NULL pMgr is valid when the pipeline is not enabled or if it hasn't
// been created yet
@ -234,7 +234,7 @@ HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum)
}
bFound = FALSE;
for (UINT mon = 0; mon < monNum; mon++) {
if (pMHNDs[mon] == hMon) {
if (pHMONITORs[mon] == hMon) {
J2dTraceLn3(J2D_TRACE_VERBOSE,
" adapter %d: found hmnd[%d]=0x%x", i, mon, hMon);
bFound = TRUE;
@ -364,8 +364,8 @@ D3DPipelineManager::CheckOSVersion()
HRESULT
D3DPipelineManager::GDICheckForBadHardware()
{
_DISPLAY_DEVICE dd;
dd.dwSize = sizeof(DISPLAY_DEVICE);
DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);
int failedDevices = 0;
int attachedDevices = 0;
@ -379,9 +379,9 @@ D3DPipelineManager::GDICheckForBadHardware()
// i<20 is to guard against buggy drivers
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++;
id = dd.deviceID;
id = dd.DeviceID;
if (wcslen(id) > 21) {
// get vendor ID
wcsncpy(vendorId, id+8, 4);
@ -796,7 +796,7 @@ HWND D3DPipelineManager::CreateDefaultFocusWindow()
ZeroMemory(&mi, sizeof(MONITORINFO));
mi.cbSize = sizeof(MONITORINFO);
HMONITOR hMon = pd3d9->GetAdapterMonitor(adapterOrdinal);
if (hMon == 0 || !GetMonitorInfo(hMon, (PMONITOR_INFO)&mi)) {
if (hMon == 0 || !GetMonitorInfo(hMon, (LPMONITORINFO)&mi)) {
J2dRlsTraceLn1(J2D_TRACE_ERROR,
"D3DPPLM::CreateDefaultFocusWindow: "\
"error getting monitor info for adapter=%d", adapterOrdinal);

View File

@ -23,8 +23,8 @@
* have any questions.
*/
#include "D3DPipeline.h"
#include <malloc.h>
#include <jni.h>
#include "sun_java2d_pipe_BufferedOpCodes.h"
#include "jlong.h"

View File

@ -23,6 +23,8 @@
* have any questions.
*/
#include "D3DPipeline.h"
#include "sun_java2d_d3d_D3DRenderer.h"
#include "D3DContext.h"

View File

@ -23,8 +23,7 @@
* have any questions.
*/
#include <jni.h>
#include <jni_util.h>
#include "D3DPipeline.h"
#include <jlong.h>
#include "D3DSurfaceData.h"
#include "D3DPipelineManager.h"

View File

@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include <sun_java2d_windows_GDIBlitLoops.h>
#include "gdefs.h"
#include "Trace.h"

View File

@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include "sun_java2d_windows_GDIRenderer.h"
#include "java_awt_geom_PathIterator.h"
@ -31,11 +32,8 @@
#include "awt_Pen.h"
#include "awt_Brush.h"
#include "jni.h"
#include "GraphicsPrimitiveMgr.h"
#include <windows.h>
#include <math.h> /* for cos(), sin(), etc */
#define MAX_CLAMP_BND (1<<26)

View File

@ -246,7 +246,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo,
}
if( numScreens > 1 ) {
MONITOR_INFO *miInfo;
LPMONITORINFO miInfo;
RECT rSect ={0,0,0,0};
RECT rView ={bounds->x1, bounds->y1, bounds->x2, bounds->y2};
retCode = FALSE;
@ -258,7 +258,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo,
::OffsetRect(&rView,
(ptOrig.x), (ptOrig.y));
::IntersectRect(&rSect,&rView,&(miInfo->rMonitor));
::IntersectRect(&rSect,&rView,&(miInfo->rcMonitor));
if( FALSE == ::IsRectEmpty(&rSect) ) {
if( TRUE == ::EqualRect(&rSect,&rView) ) {

View File

@ -23,8 +23,6 @@
* have any questions.
*/
#include <jni.h>
#include <awt.h>
#include "Trace.h"
#include "WindowsFlags.h"

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,54 +23,26 @@
* have any questions.
*/
#include "awt.h"
#include "ComCtl32Util.h"
ComCtl32Util::ComCtl32Util() {
hModComCtl32 = NULL;
m_bNewSubclassing = FALSE;
m_lpfnSetWindowSubclass = NULL;
m_lpfnRemoveWindowSubclass = NULL;
m_lpfnDefSubclassProc = NULL;
}
ComCtl32Util::~ComCtl32Util() {
DASSERT(hModComCtl32 == NULL);
}
void ComCtl32Util::InitLibraries() {
if (hModComCtl32 == NULL) {
hModComCtl32 = ::LoadLibrary(TEXT("comctl32.dll"));
if (hModComCtl32 != NULL) {
m_lpfnSetWindowSubclass = (PFNSETWINDOWSUBCLASS)::GetProcAddress(hModComCtl32, "SetWindowSubclass");
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;
}
INITCOMMONCONTROLSEX iccex;
memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX));
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
::InitCommonControlsEx(&iccex);
}
WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) {
if (m_bNewSubclassing) {
DASSERT(hModComCtl32 != NULL);
if (IS_WINXP) {
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;
} else {
return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_WindowProc);
@ -78,21 +50,17 @@ WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) {
}
void ComCtl32Util::UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc) {
if (m_bNewSubclassing) {
DASSERT(hModComCtl32 != NULL);
DASSERT(_DefWindowProc == NULL);
if (IS_WINXP) {
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 {
::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_DefWindowProc);
}
}
LRESULT ComCtl32Util::DefWindowProc(WNDPROC _DefWindowProc, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (m_bNewSubclassing) {
DASSERT(hModComCtl32 != NULL);
DASSERT(_DefWindowProc == NULL);
return m_lpfnDefSubclassProc(hwnd, msg, wParam, lParam);
if (IS_WINXP) {
return ::DefSubclassProc(hwnd, msg, wParam, lParam);
} else if (_DefWindowProc != NULL) {
return ::CallWindowProc(_DefWindowProc, hwnd, msg, wParam, lParam);
} else {
@ -111,15 +79,3 @@ LRESULT ComCtl32Util::SharedWindowProc(HWND hwnd, UINT msg,
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);
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -30,20 +30,6 @@
#ifndef _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
{
public:
@ -52,21 +38,8 @@ class ComCtl32Util
return theInstance;
}
// loads comctl32.dll and checks if required routines are available
// called from AwtToolkit::AwtToolkit()
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);
// DefWindowProc is the same as returned from SubclassHWND
void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc);
@ -77,19 +50,6 @@ class 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
static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,

View File

@ -83,9 +83,83 @@
#include "Devices.h"
#include "Trace.h"
#include "awt_Multimon.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;
CriticalSection Devices::arrayLock;
@ -113,9 +187,9 @@ BOOL Devices::UpdateInstance(JNIEnv *env)
{
J2dTraceLn(J2D_TRACE_INFO, "Devices::UpdateInstance");
int numScreens = ::CountMonitors();
MHND *monHds = (MHND *)safe_Malloc(numScreens * sizeof(MHND));
if (numScreens != ::CollectMonitors(monHds, numScreens)) {
int numScreens = CountMonitors();
HMONITOR *monHds = (HMONITOR *)safe_Malloc(numScreens * sizeof(HMONITOR));
if (numScreens != CollectMonitors(monHds, numScreens)) {
J2dRlsTraceLn(J2D_TRACE_ERROR,
"Devices::UpdateInstance: Failed to get all "\
"monitor handles.");

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -70,4 +70,8 @@ static CriticalSection arrayLock;
};
// Some helper functions (from awt_MMStub.h/cpp)
BOOL WINAPI MonitorBounds (HMONITOR, RECT*);
#endif _DEVICES_H_

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,7 +25,6 @@
#include "GDIHashtable.h"
#include "awt_GDIObject.h"
#include "awt_dlls.h"
GDIHashtable::BatchDestructionManager GDIHashtable::manager;
@ -46,7 +45,6 @@ void GDIHashtable::release(void* key) {
DASSERT(value != NULL);
m_deleteProc(value);
}
manager.update();
}
void GDIHashtable::flush() {
@ -128,9 +126,6 @@ void GDIHashtable::List::clear() {
}
}
#undef GFSR_GDIRESOURCES
#define GFSR_GDIRESOURCES 0x0001
GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThreshold,
UINT nSecondThreshold,
UINT nDestroyPeriod) :
@ -138,48 +133,6 @@ GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThresh
m_nSecondThreshold(nSecondThreshold),
m_nDestroyPeriod(nDestroyPeriod),
m_nCounter(0),
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;
}
}
}
m_bBatchingEnabled(TRUE)
{
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -151,12 +151,6 @@ class GDIHashtable : public Hashtable {
*/
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; }
};

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -31,17 +31,27 @@
// This file should stand independent of AWT and should ultimately be
// put into its own DLL.
#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 <shlobj.h>
#include <shellapi.h>
#include "jni_util.h"
#include "jlong.h"
#include "alloc.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}
DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3, 0xe, 0x0, 0xc0, 0x4f, 0x79, 0xab, 0xd1);
@ -86,13 +96,15 @@ static jfieldID FID_folderType;
static IMalloc* pMalloc;
static IShellFolder* pDesktop;
static BOOL isXP;
// copied from awt.h, because it is not included in release
#if defined (WIN32)
#define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6)
#else
#define IS_WINVISTA FALSE
// Some macros from awt.h, because it is not included in release
#ifndef IS_WIN2000
#define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5)
#endif
#ifndef IS_WINXP
#define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#endif
#ifndef IS_WINVISTA
#define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6)
#endif
@ -103,7 +115,6 @@ static BOOL initShellProcs()
static HMODULE libShell32 = NULL;
static HMODULE libUser32 = NULL;
static HMODULE libComCtl32 = NULL;
static HMODULE libUnicows = UnicowsLoader::GetModuleHandle();
// If already initialized, return TRUE
if (libShell32 != NULL && libUser32 != NULL) {
return TRUE;
@ -130,7 +141,7 @@ static BOOL initShellProcs()
// Set up procs - libShell32
fn_FindExecutable = (FindExecutableType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "FindExecutableW");
libShell32, "FindExecutableW");
if (fn_FindExecutable == NULL) {
return FALSE;
}
@ -140,7 +151,7 @@ static BOOL initShellProcs()
return FALSE;
}
fn_SHGetFileInfo = (SHGetFileInfoType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "SHGetFileInfoW");
libShell32, "SHGetFileInfoW");
if (fn_SHGetFileInfo == NULL) {
return FALSE;
}
@ -154,7 +165,7 @@ static BOOL initShellProcs()
return FALSE;
}
fn_SHGetPathFromIDList = (SHGetPathFromIDListType)GetProcAddress(
(libUnicows ? libUnicows : libShell32), "SHGetPathFromIDListW");
libShell32, "SHGetPathFromIDListW");
if (fn_SHGetPathFromIDList == NULL) {
return FALSE;
}
@ -181,19 +192,19 @@ static BOOL initShellProcs()
static jstring jstringFromSTRRET(JNIEnv* env, LPITEMIDLIST pidl, STRRET* pStrret) {
switch (pStrret->uType) {
case STRRET_CSTR :
return JNU_NewStringPlatform(env, pStrret->cStr);
return JNU_NewStringPlatform(env, reinterpret_cast<const char*>(pStrret->cStr));
case STRRET_OFFSET :
// Note : this may need to be WCHAR instead
return JNU_NewStringPlatform(env,
(CHAR*)pidl + pStrret->uOffset);
case STRRET_WSTR :
return env->NewString(pStrret->pOleStr,
return env->NewString(reinterpret_cast<const jchar*>(pStrret->pOleStr),
static_cast<jsize>(wcslen(pStrret->pOleStr)));
}
return NULL;
}
// 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
@ -212,13 +223,6 @@ JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initIDs
MID_relativePIDL = env->GetMethodID(cls, "setRelativePIDL", "(J)V");
FID_displayName = env->GetFieldID(cls, "displayName", "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) {
@ -669,46 +673,24 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation
if (!CoInit(doCoUninit)) {
return 0;
}
if (IS_NT) {
IShellLinkW* psl;
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl);
IShellLinkW* psl;
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
hres = ppf->Load(wstr, STGM_READ);
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);
if (resolve) {
hres = psl->Resolve(NULL, 0);
// Ignore failure
}
ppf->Release();
pidl = (LPITEMIDLIST)NULL;
hres = psl->GetIDList(&pidl);
}
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();
ppf->Release();
}
psl->Release();
}
if (doCoUninit) {
::CoUninitialize();
@ -742,10 +724,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_parseDisplayName0
int nLength = env->GetStringLength(jname);
jchar* wszPath = new jchar[nLength + 1];
const jchar* strPath = env->GetStringChars(jname, NULL);
wcsncpy(wszPath, strPath, nLength);
wcsncpy(reinterpret_cast<LPWSTR>(wszPath), reinterpret_cast<LPCWSTR>(strPath), nLength);
wszPath[nLength] = 0;
HRESULT res = pIShellFolder->ParseDisplayName(NULL, NULL,
const_cast<jchar*>(wszPath), NULL, &pIDL, NULL);
reinterpret_cast<LPWSTR>(wszPath), NULL, &pIDL, NULL);
if (res != S_OK) {
JNU_ThrowIOException(env, "Could not parse name");
pIDL = 0;
@ -804,7 +786,7 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getExecutableType
(JNIEnv* env, jobject folder, jstring path)
{
TCHAR szBuf[MAX_PATH];
LPCTSTR szPath = (LPCTSTR)JNU_GetStringPlatformChars(env, path, NULL);
LPCTSTR szPath = JNU_GetStringPlatformChars(env, path, NULL);
if (szPath == NULL) {
return NULL;
}
@ -827,7 +809,7 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIcon
{
HICON hIcon = NULL;
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),
SHGFI_ICON | (getLargeIcon ? 0 : SHGFI_SMALLICON)) != 0) {
hIcon = fileInfo.hIcon;
@ -890,52 +872,27 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon
}
HRESULT hres;
if (IS_NT) {
IExtractIconW* pIcon;
hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
IExtractIconW* pIcon;
hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast<LPCITEMIDLIST*>(&pidl),
IID_IExtractIconW, NULL, (void**)&pIcon);
if (SUCCEEDED(hres)) {
WCHAR szBuf[MAX_PATH];
INT index;
UINT flags;
hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags);
if (SUCCEEDED(hres)) {
WCHAR szBuf[MAX_PATH];
INT index;
UINT flags;
hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags);
HICON hIconLarge;
hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32);
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);
}
if (getLargeIcon) {
fn_DestroyIcon((HICON)hIcon);
hIcon = hIconLarge;
} else {
fn_DestroyIcon((HICON)hIconLarge);
}
}
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();
}
pIcon->Release();
}
if (doCoUninit) {
::CoUninitialize();
@ -987,7 +944,7 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits
// XP supports alpha in some icons, and depending on device.
// This should take precedence over the icon mask bits.
BOOL hasAlpha = FALSE;
if (isXP) {
if (IS_WINXP) {
for (int i = 0; i < nBits; i++) {
if ((colorBits[i] & 0xff000000) != 0) {
hasAlpha = TRUE;
@ -1127,9 +1084,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource
(JNIEnv* env, jclass cls, jstring libName, jint iconID,
jint cxDesired, jint cyDesired, jboolean useVGAColors)
{
HINSTANCE libHandle = LoadLibrary(env->GetStringChars(libName, NULL));
HINSTANCE libHandle = LoadLibrary(JNU_GetStringPlatformChars(env, libName, 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),
IMAGE_ICON, cxDesired, cyDesired,
fuLoad));

View File

@ -1,430 +0,0 @@
/*
* 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;
}
}

View File

@ -1,198 +0,0 @@
/*
* 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

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,14 +23,14 @@
* have any questions.
*/
#include "awt.h"
#include "stdhdrs.h"
#include <commdlg.h>
#include <winspool.h>
#include <limits.h>
#include <float.h>
#include "awt.h"
#include "awt_dlls.h"
#include "awt_Toolkit.h"
#include "awt_PrintControl.h"
@ -74,7 +74,6 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
TRY;
TCHAR cBuffer[250];
BOOL bFlag;
OSVERSIONINFO osv;
PRINTER_INFO_2 *ppi2 = NULL;
DWORD dwNeeded = 0;
@ -86,39 +85,8 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osv);
// If Windows 95 or 98, use EnumPrinters...
if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
// 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) {
// If Windows 2000, XP, Vista
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// Retrieve the default string from Win.ini (the registry).
// String will be in form "printername,drivername,portname".
@ -165,62 +133,32 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
jobjectArray nameArray;
try {
if (IS_NT) {
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, NULL, 0, &cbNeeded, &cReturned);
pPrinterEnum = new BYTE[cbNeeded];
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded,
&cReturned);
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, NULL, 0, &cbNeeded, &cReturned);
pPrinterEnum = new BYTE[cbNeeded];
::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, 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_4 *info4 = (PRINTER_INFO_4 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_4));
utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
if (utf_str == NULL) {
throw std::bad_alloc();
}
env->SetObjectArrayElement(nameArray, i, utf_str);
env->DeleteLocalRef(utf_str);
if (cReturned > 0) {
nameArray = env->NewObjectArray(cReturned, clazz, NULL);
if (nameArray == NULL) {
throw std::bad_alloc();
}
} 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);
nameArray = NULL;
}
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);
for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_4));
utf_str = JNU_NewStringPlatform(env, info4->pPrinterName);
if (utf_str == NULL) {
throw std::bad_alloc();
}
env->SetObjectArrayElement(nameArray, i, utf_str);
env->DeleteLocalRef(utf_str);
}
} catch (std::bad_alloc&) {
delete [] pPrinterEnum;
@ -872,7 +810,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env,
int numSizes = ::DeviceCapabilities(printerName, printerPort,
DC_PAPERS, NULL, NULL);
if (numSizes > 0) {
LPWORD papers = (LPWORD)safe_Malloc(numSizes * sizeof(WORD));
LPTSTR papers = (LPTSTR)safe_Malloc(numSizes * sizeof(WORD));
if (papers != NULL &&
::DeviceCapabilities(printerName, printerPort,
DC_PAPERS, papers, NULL) != -1) {

View File

@ -26,10 +26,21 @@
#ifndef _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 "alloc.h"
#include "awt_Debug.h"
#include "UnicowsLoader.h"
extern COLORREF DesktopColor2RGB(int colorIndex);
@ -129,40 +140,23 @@ typedef AwtObject* PDATA;
/* /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
*
* 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)
#define IS_WIN64 TRUE
#else
#define IS_WIN64 FALSE
#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)
#define IS_WINXP (IS_NT && (IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#define IS_WINVISTA (IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 6)
#define IS_WIN32S (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) < 4)
#define IS_WIN95 (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 4)
#define IS_WIN98 (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 10)
#define IS_WINME (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 90)
#define IS_WIN4X (IS_WIN32 && LOBYTE(::GetVersion()) >= 4)
/*
* IS_WIN2000 returns TRUE on 2000, XP and Vista
* IS_WINXP returns TRUE on XP and Vista
* IS_WINVISTA returns TRUE on Vista
*/
#define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5)
#define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5)
#define IS_WINVISTA (LOBYTE(LOWORD(::GetVersion())) >= 6)
#define IS_WINVER_ATLEAST(maj, min) \
((maj) < LOBYTE(LOWORD(::GetVersion())) || \
(maj) == LOBYTE(LOWORD(::GetVersion())) && \
@ -177,6 +171,12 @@ typedef AwtObject* PDATA;
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.
* These are defined in winuser.h in the August 2001 MSDN update.
@ -211,17 +211,12 @@ extern JavaVM *jvm;
* NOTE: float.h must be defined if using these macros
*/
#define SAVE_CONTROLWORD \
unsigned int fpu_cw = _CW_DEFAULT; \
if (IS_WIN95) { \
fpu_cw = _control87(0, 0); \
}
unsigned int fpu_cw = _control87(0, 0);
#define RESTORE_CONTROLWORD \
if (IS_WIN95) { \
if ( _control87(0, 0) != fpu_cw) { \
_control87(fpu_cw, 0xfffff); \
} \
}
#define RESTORE_CONTROLWORD \
if (_control87(0, 0) != fpu_cw) { \
_control87(fpu_cw, 0xffffffff); \
}
/*
* checks if the current thread is/isn't the toolkit thread

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,7 +23,7 @@
* have any questions.
*/
#include <jni.h>
#include "awt.h"
#include "awt_Object.h" /* wop_pDataID */
#include "awt_Toolkit.h"
@ -106,7 +106,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent)
if (label == NULL) {
labelStr = L"";
} else {
labelStr = env->GetStringChars(label, JNI_FALSE);
labelStr = JNU_GetStringPlatformChars(env, label, JNI_FALSE);
}
style = 0;
@ -128,7 +128,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent)
c->m_backgroundColorSet = TRUE; // suppress inheriting parent's color
c->UpdateBackground(env, target);
if (label != NULL)
env->ReleaseStringChars(label, labelStr);
JNU_ReleaseStringPlatformChars(env, label, labelStr);
} catch (...) {
env->DeleteLocalRef(target);
if (label != NULL)

View File

@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include "awt_Toolkit.h"
#include "awt_Checkbox.h"
#include "awt_KeyboardFocusManager.h"
@ -106,7 +107,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
if (label != NULL) {
labelStr = env->GetStringChars(label, 0);
labelStr = JNU_GetStringPlatformChars(env, label, 0);
}
if (labelStr != 0) {
jint x = env->GetIntField(target, AwtComponent::xID);
@ -123,7 +124,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
peer);
if (labelStr != defaultLabelStr) {
env->ReleaseStringChars(label, labelStr);
JNU_ReleaseStringPlatformChars(env, label, labelStr);
}
} else {
throw std::bad_alloc();

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -206,7 +206,7 @@ int AwtChoice::GetFieldHeight()
fieldHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)-1, 0);
// add top and bottom border lines; border size is different for
// 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;
return fieldHeight;
}
@ -424,6 +424,9 @@ AwtChoice::WmKillFocus(HWND hWndGotFocus)
case mrPassAlong:
return AwtComponent::WmKillFocus(hWndGotFocus);
}
DASSERT(false); // must never reach here
return mrDoDefault;
}
MsgRouting

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* 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,
iColor = COLOR_MENUTEXT;
break;
case sun_awt_windows_WColor_BUTTON_BKGND:
iColor = (IS_NT) ? COLOR_BTNFACE : COLOR_3DFACE;
iColor = COLOR_BTNFACE;
break;
case sun_awt_windows_WColor_BUTTON_TEXT:
iColor = COLOR_BTNTEXT;

View File

@ -23,7 +23,8 @@
* have any questions.
*/
#include "windows.h"
#include "awt.h"
#include <windowsx.h>
#include <zmouse.h>
@ -42,7 +43,6 @@
#include "awt_MouseEvent.h"
#include "awt_Palette.h"
#include "awt_Toolkit.h"
#include "awt_Unicode.h"
#include "awt_Window.h"
#include "awt_Win32GraphicsDevice.h"
#include "Hashtable.h"
@ -67,30 +67,10 @@
#include <java_awt_event_MouseWheelEvent.h>
// Begin -- Win32 SDK include files
#include <tchar.h>
#include <imm.h>
#include <ime.h>
// 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>
LPCTSTR szAwtComponentClassName = TEXT("SunAwtComponent");
@ -207,10 +187,6 @@ LANGID AwtComponent::m_idLang = LOWORD(::GetKeyboardLayout(0));
UINT AwtComponent::m_CodePage
= 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 bRightShiftIsDown = false;
static UINT lastShiftKeyPressed = 0; // init to safe value
@ -544,7 +520,7 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title,
jobject createError = NULL;
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",
"(Ljava/lang/String;)V",
errorMsg);
@ -1347,17 +1323,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return (LRESULT)TRUE;
}
UINT switchMessage;
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;
}
DWORD curPos = 0;
UINT switchMessage = message;
switch (switchMessage) {
case WM_AWT_GETDC:
{
@ -1648,63 +1616,55 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEWHEEL:
case WM_AWT_MOUSEENTER:
case WM_AWT_MOUSEEXIT:
{
DWORD curPos = ::GetMessagePos();
curPos = ::GetMessagePos();
POINT myPos;
myPos.x = GET_X_LPARAM(curPos);
myPos.y = GET_Y_LPARAM(curPos);
::ScreenToClient(GetHWnd(), &myPos);
switch(switchMessage) {
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_LBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON); break;
case WM_LBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON); break;
case WM_MOUSEMOVE:
mr = WmMouseMove(static_cast<UINT>(wParam), myPos.x, myPos.y); break;
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON); break;
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON); break;
case WM_RBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON);
break;
case WM_MBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON);
break;
case WM_AWT_MOUSEEXIT:
mr = WmMouseExit(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
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 = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON);
break;
case WM_LBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON);
break;
case WM_MOUSEMOVE:
mr = WmMouseMove(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON);
break;
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON);
break;
case WM_RBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON);
break;
case WM_MBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON);
break;
case WM_AWT_MOUSEEXIT:
mr = WmMouseExit(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_MOUSEWHEEL:
mr = WmMouseWheel(GET_KEYSTATE_WPARAM(wParam),
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
GET_WHEEL_DELTA_WPARAM(wParam));
break;
}
break;
}
}
break;
case WM_SETCURSOR:
mr = mrDoDefault;
if (LOWORD(lParam) == HTCLIENT) {
@ -2649,21 +2609,10 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y,
jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA);
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,
&platformLines, 0);
InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation),
MAKELPARAM(x, y));
}
result = ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
&platformLines, 0);
InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation),
MAKELPARAM(x, y));
if (result) {
if (platformLines == WHEEL_PAGESCROLL) {
@ -2743,156 +2692,21 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags)
"AwtComponent::GetShiftKeyLocation vkey = %d = 0x%x scan = %d",
vkey, vkey, keyScanCode);
if (m_isWinNT) {
leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0);
rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0);
leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0);
rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0);
if (keyScanCode == leftShiftScancode) {
return java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
}
if (keyScanCode == rightShiftScancode) {
return java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
}
DASSERT(false);
// 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.
if (keyScanCode == leftShiftScancode) {
return java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
}
if (keyScanCode == rightShiftScancode) {
return java_awt_event_KeyEvent_KEY_LOCATION_RIGHT;
}
// "Transition" bit = 0 if keyPressed, 1 if keyReleased
BOOL released = ((1<<15) & flags);
DASSERT(false);
// Note: the above should not fail on NT (or 2000)
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
leftShiftScancode = 42;
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;
// default value
return java_awt_event_KeyEvent_KEY_LOCATION_LEFT;
}
/* Returns Java extended InputEvent modifieres.
@ -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
// 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.
UINT message = system ? WM_SYSCHAR : WM_CHAR;
@ -3861,43 +3659,8 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags,
MsgRouting AwtComponent::WmForwardChar(WCHAR character, LPARAM lParam,
BOOL synthetic)
{
if (m_isWinNT) {
// just post WM_CHAR with unicode key value
DefWindowProc(WM_CHAR, (WPARAM)character, lParam);
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);
}
}
// just post WM_CHAR with unicode key value
DefWindowProc(WM_CHAR, (WPARAM)character, lParam);
return mrConsume;
}
@ -4543,7 +4306,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags)
// 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.
if (IS_WIN4X && (GetStyleEx() & WS_EX_CLIENTEDGE)) {
if (GetStyleEx() & WS_EX_CLIENTEDGE) {
RECT r;
VERIFY(::GetWindowRect(GetHWnd(), &r));
VERIFY(::OffsetRect(&r, -r.left, -r.top));
@ -4559,7 +4322,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags)
* We will first print the non-client area with the original 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 nEdgeHeight = ::GetSystemMetrics(SM_CYEDGE);
@ -5319,18 +5082,8 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent)
// convert Java wheel amount value to Win32
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;
wParam = MAKEWPARAM(wLow, wheelAmt);
}
message = WM_MOUSEWHEEL;
wParam = MAKEWPARAM(wLow, wheelAmt);
break;
default:
@ -5445,45 +5198,6 @@ void AwtComponent::Enable(BOOL bEnable)
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
*/
@ -5983,7 +5697,7 @@ void AwtComponent::_SetFont(void *param)
{
AwtFont *awtFont = (AwtFont *)env->GetLongField(font, AwtFont::pDataID);
if (awtFont == NULL) {
/*arguments of AwtFont::Create are changed for multifont component */
/*arguments of AwtFont::Create are changed for multifont component */
awtFont = AwtFont::Create(env, font);
}
env->SetLongField(font, AwtFont::pDataID, (jlong)awtFont);
@ -7025,20 +6739,6 @@ Java_sun_awt_windows_WComponentPeer_isObscured(JNIEnv* env,
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
Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls,
jobject heavyweight,
@ -7217,7 +6917,9 @@ void AwtComponent::VerifyState()
"getName",
"()Ljava/lang/String;").l;
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);
if (!fSizeValid) {

View File

@ -675,10 +675,6 @@ public:
static HWND sm_focusOwner;
static HWND sm_focusedWindow;
static BOOL m_isWin95;
static BOOL m_isWin2000;
static BOOL m_isWinNT;
static BOOL sm_bMenuLoop;
static INLINE BOOL isMenuLoopActive() {
return sm_bMenuLoop;

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* 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,
custom = TRUE;
dirty = FALSE;
if (IsWin95Cursor()) {
customCursors.Add(this);
}
}
AwtCursor::~AwtCursor()
@ -96,9 +92,6 @@ void AwtCursor::Dispose()
if (custom) {
::DestroyIcon(hCursor);
if (IsWin95Cursor()) {
customCursors.Remove(this);
}
}
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
@ -256,16 +249,6 @@ void AwtCursor::UpdateCursor(AwtComponent *comp) {
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() {
if (!dirty) {
return;
@ -294,23 +277,6 @@ void AwtCursor::Rebuild() {
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" {
/************************************************************************

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -66,7 +66,6 @@ public:
}
static AwtCursor * CreateSystemCursor(jobject jCursor);
static void UpdateCursor(AwtComponent *comp);
static void DirtyAllCustomCursors();
static HCURSOR GetCursor(JNIEnv *env, AwtComponent *comp);
static void setPData(jobject cursor, jlong pdata) {
@ -76,7 +75,6 @@ public:
private:
void Rebuild();
static BOOL IsWin95Cursor();
HCURSOR hCursor;
jweak jCursor;

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -24,12 +24,11 @@
*/
#include "awt.h"
#include "awt_dlls.h"
#include "awt_DataTransferer.h"
#include "awt_DnDDT.h"
#include "awt_TextComponent.h"
#include "awt_Unicode.h"
#include <shlobj.h>
#include <shellapi.h>
#include <sun_awt_datatransfer_DataTransferer.h>
#include <sun_awt_windows_WDataTransferer.h>
@ -271,9 +270,7 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile
hdrop = (HDROP)bBytes;
load_shell_procs();
UINT nFilenames = (*do_drag_query_file)(hdrop, 0xFFFFFFFF, NULL, 0);
UINT nFilenames = ::DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0);
jclass str_clazz = env->FindClass("java/lang/String");
DASSERT(str_clazz != NULL);
@ -287,12 +284,12 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile
buffer = (LPTSTR)safe_Malloc(bufsize*sizeof(TCHAR));
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) {
bufsize = size;
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);
if (name == NULL) {
@ -454,11 +451,6 @@ Java_sun_awt_windows_WDataTransferer_platformImageBytesToImageData(
width = p.x;
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);
}
break;

View File

@ -23,8 +23,8 @@
* have any questions.
*/
#include "awt.h"
#include <jni.h>
#include <Windows.h>
#include <shellapi.h>
#include <float.h>
@ -40,32 +40,32 @@ extern "C" {
JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute
(JNIEnv *env, jclass cls, jstring uri_j, jstring verb_j)
{
const WCHAR* uri_c = env->GetStringChars(uri_j, JNI_FALSE);
const WCHAR* verb_c = env->GetStringChars(verb_j, JNI_FALSE);
LPCWSTR uri_c = JNU_GetStringPlatformChars(env, uri_j, JNI_FALSE);
LPCWSTR verb_c = JNU_GetStringPlatformChars(env, verb_j, JNI_FALSE);
// 6457572: ShellExecute possibly changes FPU control word - saving it here
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);
env->ReleaseStringChars(uri_j, uri_c);
env->ReleaseStringChars(verb_j, verb_c);
JNU_ReleaseStringPlatformChars(env, uri_j, uri_c);
JNU_ReleaseStringPlatformChars(env, verb_j, verb_c);
if ((int)retval <= 32) {
// ShellExecute failed.
LPVOID buffer;
int len = FormatMessageW(
LPTSTR buffer = NULL;
int len = ::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPWSTR) &buffer,
(LPTSTR)&buffer,
0,
NULL );
jstring errmsg = env->NewString((LPCWSTR)buffer, len);
jstring errmsg = JNU_NewStringPlatform(env, buffer, len);
LocalFree(buffer);
return errmsg;
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,17 +23,17 @@
* have any questions.
*/
#include "stdhdrs.h"
#include "awt.h"
#include "mmsystem.h"
#include "jlong.h"
#include "awt.h"
#include "awt_DesktopProperties.h"
#include "awt_dlls.h"
#include "awt_Toolkit.h"
#include "sun_awt_windows_WDesktopProperties.h"
#include "java_awt_Font.h"
#include "awtmsg.h"
#include "Zmouse.h"
#include "shellapi.h"
#include "zmouse.h"
#include <shellapi.h>
#include <shlobj.h>
// WDesktopProperties fields
jfieldID AwtDesktopProperties::pDataID = 0;
@ -44,10 +44,6 @@ jmethodID AwtDesktopProperties::setColorPropertyID = 0;
jmethodID AwtDesktopProperties::setFontPropertyID = 0;
jmethodID AwtDesktopProperties::setSoundPropertyID = 0;
typedef VOID (WINAPI *SHGetSettingsType)(LPSHELLFLAGSTATE, DWORD);
static HMODULE libShell32 = NULL;
static SHGetSettingsType fn_SHGetSettings;
AwtDesktopProperties::AwtDesktopProperties(jobject self) {
this->self = GetEnv()->NewGlobalRef(self);
GetEnv()->SetLongField( self, AwtDesktopProperties::pDataID,
@ -431,14 +427,12 @@ void CheckFontSmoothingSettings(HWND hWnd) {
void AwtDesktopProperties::GetColorParameters() {
if (IS_WIN98 || IS_WIN2000) {
SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTACTIVECAPTION));
SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTINACTIVECAPTION));
SetColorProperty(TEXT("win.item.hotTrackedColor"),
GetSysColor(COLOR_HOTLIGHT));
}
SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTACTIVECAPTION));
SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"),
GetSysColor(COLOR_GRADIENTINACTIVECAPTION));
SetColorProperty(TEXT("win.item.hotTrackedColor"),
GetSysColor(COLOR_HOTLIGHT));
SetColorProperty(TEXT("win.3d.darkShadowColor"), GetSysColor(COLOR_3DDKSHADOW));
SetColorProperty(TEXT("win.3d.backgroundColor"), GetSysColor(COLOR_3DFACE));
SetColorProperty(TEXT("win.3d.highlightColor"), GetSysColor(COLOR_3DHIGHLIGHT));
@ -510,40 +504,18 @@ void AwtDesktopProperties::GetOtherParameters() {
// This property is called "win.frame.fullWindowDragsOn" above
// This is one of the properties that don't trigger WM_SETTINGCHANGE
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"),
::GetSystemMetrics(SM_MOUSEWHEELPRESENT));
}
SetBooleanProperty(TEXT("awt.wheelMousePresent"),
::GetSystemMetrics(SM_MOUSEWHEELPRESENT));
// END cross-platform properties
if (IS_WIN98 || IS_WIN2000) {
//DWORD menuShowDelay;
//SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0);
// SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay);
SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS));
SetBooleanProperty(TEXT("win.item.hotTrackingOn"), GetBooleanParameter(SPI_GETHOTTRACKING));
}
//DWORD menuShowDelay;
//SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0);
// SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay);
SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS));
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
HIGHCONTRAST contrast;
@ -557,21 +529,19 @@ void AwtDesktopProperties::GetOtherParameters() {
SetBooleanProperty(TEXT("win.highContrast.on"), FALSE);
}
if (fn_SHGetSettings != NULL) {
SHELLFLAGSTATE sfs;
fn_SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL);
if (sfs.fShowAllObjects) {
SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE);
}
else {
SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), FALSE);
}
if (sfs.fShowAttribCol) {
SetBooleanProperty(TEXT("awt.file.showAttribCol"), TRUE);
}
else {
SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE);
}
SHELLFLAGSTATE sfs;
::SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL);
if (sfs.fShowAllObjects) {
SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE);
}
else {
SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), FALSE);
}
if (sfs.fShowAttribCol) {
SetBooleanProperty(TEXT("awt.file.showAttribCol"), TRUE);
}
else {
SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE);
}
LPTSTR value;
@ -667,7 +637,7 @@ UINT AwtDesktopProperties::GetIntegerParameter(UINT spi) {
}
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,
AwtDesktopProperties::setStringPropertyID,
key, JNU_NewStringPlatform(GetEnv(), value));
@ -675,7 +645,7 @@ void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR 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,
AwtDesktopProperties::setIntegerPropertyID,
key, (jint)value);
@ -683,7 +653,7 @@ void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int 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,
AwtDesktopProperties::setBooleanPropertyID,
key, value ? JNI_TRUE : JNI_FALSE);
@ -691,7 +661,7 @@ void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL 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,
AwtDesktopProperties::setColorPropertyID,
key, GetRValue(value), GetGValue(value),
@ -743,7 +713,7 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID,
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,
key, fontName, style, pointSize);
@ -761,7 +731,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
jint pointSize;
jint style;
fontName = JNU_NewStringPlatform(GetEnv(), font.lfFaceName);
fontName = JNU_NewStringPlatform(GetEnv(), const_cast<LPWSTR>(font.lfFaceName));
#if 0
HDC hdc;
@ -784,7 +754,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
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,
key, fontName, style, pointSize);
@ -793,8 +763,8 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon
}
void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventName) {
jstring key = JNU_NewStringPlatform(GetEnv(), propName);
jstring event = JNU_NewStringPlatform(GetEnv(), winEventName);
jstring key = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(propName));
jstring event = JNU_NewStringPlatform(GetEnv(), const_cast<LPTSTR>(winEventName));
GetEnv()->CallVoidMethod(self,
AwtDesktopProperties::setSoundPropertyID,
key, event);
@ -805,9 +775,9 @@ void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventNa
void AwtDesktopProperties::PlayWindowsSound(LPCTSTR event) {
// stop any currently playing sounds
AwtWinMM::PlaySoundWrapper(NULL, NULL, SND_PURGE);
::PlaySound(NULL, NULL, SND_PURGE);
// 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
Java_sun_awt_windows_WDesktopProperties_init(JNIEnv *env, jobject self) {
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);
CATCH_BAD_ALLOC;

View File

@ -132,14 +132,13 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent)
dialog = new AwtDialog();
{
int colorId = IS_WIN4X ? COLOR_3DFACE : COLOR_WINDOW;
int colorId = COLOR_3DFACE;
DWORD style = WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN;
if (hwndParent != NULL) {
style |= WS_POPUP;
}
style &= ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
DWORD exStyle = IS_WIN4X ? WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME
: 0;
DWORD exStyle = WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
@ -663,7 +662,7 @@ void AwtDialog::_SetIMMOption(void *param)
int badAlloc = 0;
LPCTSTR coption;
LPTSTR empty = TEXT("InputMethod");
LPCTSTR empty = TEXT("InputMethod");
AwtDialog *d = NULL;
PDATA pData;

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include "jlong.h"
#include "awt_DataTransferer.h"
#include "awt_DnDDS.h"
@ -36,8 +37,6 @@
#include "sun_awt_dnd_SunDragSourceContextPeer.h"
#include "sun_awt_windows_WDragSourceContextPeer.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <shlobj.h>

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -30,11 +30,8 @@
#include "awt_Toolkit.h"
#include "java_awt_dnd_DnDConstants.h"
#include "sun_awt_windows_WDropTargetContextPeer.h"
#include "awt_dlls.h"
#include "awt_Container.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <shellapi.h>
@ -555,8 +552,7 @@ jobject AwtDropTarget::GetData(jlong fmt) {
break;
}
case TYMED_FILE: {
jobject local = JNU_NewStringPlatform(env, (LPCTSTR)
stgmedium.lpszFileName);
jobject local = JNU_NewStringPlatform(env, stgmedium.lpszFileName);
jstring fileName = (jstring)env->NewGlobalRef(local);
env->DeleteLocalRef(local);

View File

@ -24,6 +24,8 @@
*/
#define _JNI_IMPLEMENTATION_
#include "awt.h"
#include "awt_DrawingSurface.h"
#include "awt_Component.h"

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,6 @@
#include "awt_FileDialog.h"
#include "awt_Dialog.h"
#include "awt_Toolkit.h"
#include "awt_dlls.h"
#include "ComCtl32Util.h"
#include <commdlg.h>
#include <cderr.h>
@ -65,7 +64,7 @@ AwtFileDialog::Initialize(JNIEnv *env, jstring filterDescription)
{
int length = env->GetStringLength(filterDescription);
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);
JNU_ReleaseStringPlatformChars(env, filterDescription, tmp);
@ -156,7 +155,7 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
LPITEMIDLIST pidl = (LPITEMIDLIST)notifyEx->pidl;
// Get the filename and directory
TCHAR szPath[MAX_PATH];
if (!get_path_from_idlist(pidl,szPath)) {
if (!::SHGetPathFromIDList(pidl, szPath)) {
return TRUE;
}
jstring strPath = JNU_NewStringPlatform(env, szPath);
@ -190,7 +189,7 @@ AwtFileDialog::Show(void *p)
WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn;
OPENFILENAME ofn;
jint mode = 0;
BOOL result = FALSE;
DWORD dlgerr;
@ -222,7 +221,7 @@ AwtFileDialog::Show(void *p)
HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
if (title == NULL || env->GetStringLength(title)==0) {
title = env->NewString(&unicodeChar, 1);
title = JNU_NewStringPlatform(env, &unicodeChar);
}
JavaStringBuffer titleBuffer(env, title);
@ -243,14 +242,7 @@ AwtFileDialog::Show(void *p)
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.lpstrFilter = s_fileFilterString;
ofn.nFilterIndex = 1;
/*
@ -289,9 +281,6 @@ AwtFileDialog::Show(void *p)
mode = env->GetIntField(target, AwtFileDialog::modeID);
// Fix for 4364256 : call load_shell_procs()
load_shell_procs();
AwtDialog::CheckInstallModalHook();
// show the Win32 file dialog
@ -304,7 +293,7 @@ AwtFileDialog::Show(void *p)
// If the dialog is not shown because of invalid file name
// replace the file name by empty string.
if (!result) {
dlgerr = AwtCommDialog::CommDlgExtendedError();
dlgerr = ::CommDlgExtendedError();
if (dlgerr == FNERR_INVALIDFILENAME) {
_tcscpy(fileBuffer, TEXT(""));
if (mode == java_awt_FileDialog_LOAD) {
@ -326,7 +315,7 @@ AwtFileDialog::Show(void *p)
// Report result to peer.
if (result) {
jstring tmpJString = (_tcslen(ofn.lpstrFile) == 0 ?
env->NewStringUTF("") :
JNU_NewStringPlatform(env, L"") :
JNU_NewStringPlatform(env, ofn.lpstrFile));
env->CallVoidMethod(peer, AwtFileDialog::handleSelectedMID, tmpJString);
env->DeleteLocalRef(tmpJString);
@ -362,20 +351,18 @@ AwtFileDialog::Show(void *p)
}
BOOL
AwtFileDialog::GetOpenFileName(LPAWTOPENFILENAME data) {
AwtCommDialog::load_comdlg_procs();
AwtFileDialog::GetOpenFileName(LPOPENFILENAME data) {
return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*))
AwtCommDialog::GetOpenFileNameWrapper, data)));
::GetOpenFileName, data)));
}
BOOL
AwtFileDialog::GetSaveFileName(LPAWTOPENFILENAME data) {
AwtCommDialog::load_comdlg_procs();
AwtFileDialog::GetSaveFileName(LPOPENFILENAME data) {
return static_cast<BOOL>(reinterpret_cast<INT_PTR>(
AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *))
AwtCommDialog::GetSaveFileNameWrapper, data)));
::GetSaveFileName, data)));
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -36,43 +36,6 @@
#include "java_awt_FileDialog.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
*/
@ -96,8 +59,8 @@ public:
static void Initialize(JNIEnv *env, jstring filterDescription);
static void Show(void *peer);
static BOOL GetOpenFileName(LPAWTOPENFILENAME);
static BOOL GetSaveFileName(LPAWTOPENFILENAME);
static BOOL GetOpenFileName(LPOPENFILENAME);
static BOOL GetSaveFileName(LPOPENFILENAME);
virtual BOOL InheritsNativeMouseWheelBehavior();

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include <math.h>
#include "jlong.h"
#include "awt_Font.h"
@ -195,7 +196,7 @@ AwtFont* AwtFont::GetFont(JNIEnv *env, jobject font,
}
// 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"))
return ANSI_CHARSET;
@ -259,7 +260,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
cfnum = 0;
}
WCHAR* wName;
LPCWSTR wName;
awtFont = new AwtFont(cfnum, env, font);
@ -269,9 +270,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
if (cfnum > 0) {
// Ask peer class for the text component font name
jstring jTextComponentFontName = GetTextComponentFontName(env, font);
WCHAR* textComponentFontName = TO_WSTRING(jTextComponentFontName);
env->DeleteLocalRef(jTextComponentFontName);
LPCWSTR textComponentFontName = JNU_GetStringPlatformChars(env, jTextComponentFontName, NULL);
awtFont->m_textInput = -1;
for (int i = 0; i < cfnum; i++) {
@ -282,13 +281,13 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
jstring nativeName =
(jstring)env->GetObjectField(fontDescriptor,
AwtFont::nativeNameID);
wName = TO_WSTRING(nativeName);
wName = JNU_GetStringPlatformChars(env, nativeName, NULL);
DASSERT(wName);
//On NT platforms, if the font is not Symbol or Dingbats
//use "W" version of Win32 APIs directly, info the FontDescription
//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);
}
@ -299,10 +298,12 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
(wcscmp(wName, textComponentFontName) == 0)) {
awtFont->m_textInput = i;
}
HFONT hfonttmp = CreateHFont(wName, fontStyle, fontSize,
HFONT hfonttmp = CreateHFont(const_cast<LPWSTR>(wName), fontStyle, fontSize,
angle, awScale);
awtFont->m_hFont[i] = hfonttmp;
JNU_ReleaseStringPlatformChars(env, nativeName, wName);
env->DeleteLocalRef(fontDescriptor);
env->DeleteLocalRef(nativeName);
}
@ -311,11 +312,14 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
// to first component
awtFont->m_textInput = 0;
}
JNU_ReleaseStringPlatformChars(env, jTextComponentFontName, textComponentFontName);
env->DeleteLocalRef(jTextComponentFontName);
} else {
// Instantiation for English version.
jstring fontName = (jstring)env->GetObjectField(font,
AwtFont::nameID);
wName = TO_WSTRING(fontName);
wName = JNU_GetStringPlatformChars(env, fontName, NULL);
WCHAR* wEName;
if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) {
@ -338,6 +342,9 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale)
awtFont->m_textInput = 0;
awtFont->m_hFont[0] = CreateHFont(wEName, fontStyle, fontSize,
angle, awScale);
JNU_ReleaseStringPlatformChars(env, fontName, wName);
env->DeleteLocalRef(fontName);
}
/* 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
}
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)
{
LOGFONTW logFont;
@ -420,18 +427,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height,
strip_tail(tmpname,L"Italic");
strip_tail(tmpname,L"Bold");
wcscpy(&(logFont.lfFaceName[0]), tmpname);
HFONT hFont;
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);
HFONT hFont = ::CreateFontIndirect(&logFont);
DASSERT(hFont != NULL);
// get a expanded or condensed version if its specified.
if (awScale != 1.0f) {
@ -446,7 +442,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height,
}
avgWidth = tm.tmAveCharWidth;
logFont.lfWidth = (LONG)((fabs)(avgWidth*awScale));
hFont = CreateFontIndirectW(&logFont);
hFont = ::CreateFontIndirect(&logFont);
DASSERT(hFont != NULL);
VERIFY(::ReleaseDC(0, hDC));
}
@ -460,15 +456,8 @@ HFONT AwtFont::CreateHFont(WCHAR* name, int style, int height,
WCHAR longName[80];
// 80 > (max face name(=30) + strlen("CHINESEBIG5_CHARSET"))
// 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
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);
}
wsprintf(longName, L"%ls-%d-%d", name, style, height);
HFONT hFont = NULL;
@ -682,28 +671,16 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC,
if (arrayLength == 0) {
int length = env->GetStringLength(str);
WCHAR* string = TO_WSTRING(str);
LPCWSTR strW = JNU_GetStringPlatformChars(env, str, NULL);
VERIFY(::SelectObject(hDC, awtFont->GetHFont()));
if (AwtComponent::GetRTLReadingOrder()){
if (IS_WIN95) {
// Start of conversion Code to fix arabic shaping problems
// 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));
}
VERIFY(!draw || ::ExtTextOut(hDC, x, y, ETO_RTLREADING, NULL,
strW, length, NULL));
} 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 {
for (int i = 0; i < arrayLength; i = i + 2) {
jobject fontDescriptor = env->GetObjectArrayElement(array, i);
@ -732,7 +709,7 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC,
* extend buflen and bad things will happen.
*/
unsigned char* buffer = NULL;
jboolean unicodeUsed = env->GetBooleanField(fontDescriptor,AwtFont::useUnicodeID);
jboolean unicodeUsed = env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID);
try {
buffer = (unsigned char *)
env->GetPrimitiveArrayCritical(convertedBytes, 0);
@ -1231,7 +1208,7 @@ class CSegTableComponent
public:
CSegTableComponent();
virtual ~CSegTableComponent();
virtual void Create(LPWSTR name);
virtual void Create(LPCWSTR name);
virtual BOOL In(USHORT iChar) { DASSERT(FALSE); return FALSE; };
LPWSTR GetFontName(){
DASSERT(m_lpszFontName != NULL); return m_lpszFontName;
@ -1254,7 +1231,7 @@ CSegTableComponent::~CSegTableComponent()
}
}
void CSegTableComponent::Create(LPWSTR name)
void CSegTableComponent::Create(LPCWSTR name)
{
if (m_lpszFontName != NULL) {
free(m_lpszFontName);
@ -1453,7 +1430,7 @@ public:
CStdSegTable();
virtual ~CStdSegTable();
BOOL IsEUDC() { return FALSE; };
virtual void Create(LPWSTR name);
virtual void Create(LPCWSTR name);
protected:
void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData);
@ -1481,7 +1458,7 @@ inline void CStdSegTable::GetData(DWORD dwOffset,
DASSERT(nBytes != GDI_ERROR);
}
void CStdSegTable::Create(LPWSTR name)
void CStdSegTable::Create(LPCWSTR name)
{
CSegTableComponent::Create(name);
@ -1509,7 +1486,7 @@ public:
CEUDCSegTable();
virtual ~CEUDCSegTable();
BOOL IsEUDC() { return TRUE; };
virtual void Create(LPWSTR name);
virtual void Create(LPCWSTR name);
protected:
void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData);
@ -1543,7 +1520,7 @@ inline void CEUDCSegTable::GetData(DWORD dwOffset,
DASSERT(dwRead == cbData);
}
void CEUDCSegTable::Create(LPWSTR name)
void CEUDCSegTable::Create(LPCWSTR name)
{
typedef struct tagHEAD{
FIXED sfnt_version;
@ -1564,19 +1541,8 @@ typedef struct tagENTRY{
// create EUDC font file and make EUDCSegTable
// after wrapper function for CreateFileW, we use only CreateFileW
if (IS_NT) {
m_hTmpFile = ::CreateFileW(name, GENERIC_READ,
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);
}
m_hTmpFile = ::CreateFile(name, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hTmpFile == INVALID_HANDLE_VALUE){
m_hTmpFile = NULL;
return;
@ -1654,10 +1620,10 @@ void CSegTableManagerComponent::MakeBiggerTable()
class CSegTableManager : public CSegTableManagerComponent
{
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++) {
if ((((CSegTable*)m_tables[i])->IsEUDC() == fEUDC) &&
@ -1685,7 +1651,7 @@ class CCombinedSegTable : public CSegTableComponent
{
public:
CCombinedSegTable();
void Create(LPWSTR name);
void Create(LPCWSTR name);
BOOL In(USHORT iChar);
private:
@ -1807,7 +1773,7 @@ void CCombinedSegTable::GetEUDCFileName(LPWSTR lpszFileName, int cchFileName)
wcscpy(m_szDefaultEUDCFile, lpszFileName);
}
void CCombinedSegTable::Create(LPWSTR name)
void CCombinedSegTable::Create(LPCWSTR name)
{
CSegTableComponent::Create(name);
@ -1840,10 +1806,10 @@ BOOL CCombinedSegTable::In(USHORT iChar)
class CCombinedSegTableManager : public CSegTableManagerComponent
{
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++) {
if (wcscmp(m_tables[i]->GetFontName(),lpszFontName) == 0)
@ -1901,8 +1867,9 @@ Java_sun_awt_windows_WDefaultFontCharset_canConvert(JNIEnv *env, jobject self,
jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID);
DASSERT(fontName != NULL);
LPWSTR fontNameWStr = TO_WSTRING(fontName);
CCombinedSegTable* pTable = tableManager.GetTable(fontNameWStr);
LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
CCombinedSegTable* pTable = tableManager.GetTable(fontNameW);
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE);
CATCH_BAD_ALLOC_RET(FALSE);

View File

@ -28,7 +28,6 @@
#include "awt.h"
#include "awt_Object.h"
#include "awt_Unicode.h"
#include "java_awt_Font.h"
#include "sun_awt_windows_WFontMetrics.h"

View File

@ -1472,7 +1472,7 @@ void AwtFrame::_SetIMMOption(void *param)
int badAlloc = 0;
LPCTSTR coption;
LPTSTR empty = TEXT("InputMethod");
LPCTSTR empty = TEXT("InputMethod");
AwtFrame *f = NULL;
PDATA pData;

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -580,18 +580,10 @@ HKL getDefaultKeyboardLayout() {
DWORD cbHKL = 16;
LPTSTR end;
if (IS_NT) {
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);
}
ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), NULL, KEY_READ, &hKey);
if (ret == ERROR_SUCCESS) {
if (IS_NT) {
ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL);
} else {
ret = ::RegQueryValueEx(hKey, NULL, 0, 0, szHKL, &cbHKL);
}
ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL);
if (ret == ERROR_SUCCESS) {
hkl = reinterpret_cast<HKL>(static_cast<INT_PTR>(

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -22,10 +22,9 @@
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include <windows.h>
#include <jni.h>
#include <imm.h>
#include "awt.h"
#include <imm.h>
#include "awt_Component.h"
#include "awt_InputTextInfor.h"
@ -91,12 +90,12 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) {
LONG cbData[5] = {0};
LPVOID lpData[5] = {NULL};
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) {
lpData[j] = NULL;
} else {
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]) {
lpData[j] = (LPVOID)lpTemp;
} else {
@ -126,7 +125,7 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) {
// Get the cursor position
if (flags & GCS_COMPSTR) {
m_cursorPosW = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS,
m_cursorPosW = ::ImmGetCompositionString(hIMC, GCS_CURSORPOS,
NULL, 0);
}
@ -185,9 +184,11 @@ AwtInputTextInfor::~AwtInputTextInfor() {
jstring AwtInputTextInfor::MakeJavaString(JNIEnv* env, LPWSTR lpStrW, int cStrW) {
if (env == NULL || lpStrW == NULL || cStrW == 0) return NULL;
return env->NewString(lpStrW, cStrW);
if (env == NULL || lpStrW == NULL || cStrW == 0) {
return NULL;
} else {
return env->NewString(reinterpret_cast<jchar*>(lpStrW), cStrW);
}
}
//
@ -232,7 +233,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla
LCID lcJPN = MAKELCID(MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),SORT_DEFAULT);
// Reading string is given in half width katakana in Japanese Windows
// 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;
try {
lpFWStrW = new WCHAR[cFWStrW];
@ -244,7 +245,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla
throw;
}
LCMapStringW( lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW );
::LCMapString(lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW);
readingClauseW[cls] = MakeJavaString(env, lpFWStrW, cFWStrW);
delete [] lpFWStrW;
} else {
@ -252,7 +253,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla
}
}
else {
readingClauseW[cls] = MakeJavaString(env, (LPWSTR)NULL, 0);
readingClauseW[cls] = NULL;
}
}

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,7 +27,6 @@
#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Dimension.h"
#include "awt_Unicode.h"
#include "awt_Toolkit.h"
#include "awt_Window.h"
@ -112,9 +111,8 @@ AwtList* AwtList::Create(jobject peer, jobject parent)
DWORD wrapExStyle = 0;
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL |
LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED |
(IS_WIN4X ? 0 : WS_BORDER);
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED;
DWORD exStyle = WS_EX_CLIENTEDGE;
/*
* NOTE: WS_VISIBLE is always set for the listbox. Listbox
@ -571,10 +569,10 @@ MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic)
// operate WM_PRINT to be compatible with the "smooth scrolling" feature.
MsgRouting AwtList::WmPrint(HDC hDC, LPARAM flags)
{
if (!isWrapperPrint && IS_WIN4X
&& (flags & PRF_CLIENT)
&& (GetStyleEx() & WS_EX_CLIENTEDGE)) {
if (!isWrapperPrint &&
(flags & PRF_CLIENT) &&
(GetStyleEx() & WS_EX_CLIENTEDGE))
{
int nOriginalDC = ::SaveDC(hDC);
DASSERT(nOriginalDC != 0);
// Save a copy of the DC for WmPrintClient

View File

@ -1,573 +0,0 @@
/*
* 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
);
}

View File

@ -1,131 +0,0 @@
/*
* 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 */

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include "awt_MenuItem.h"
#include "awt_Menu.h"
#include "awt_MenuBar.h"
@ -70,7 +71,6 @@ jmethodID AwtMenuItem::getDefaultFontMID;
LANGID AwtMenuItem::m_idLang = LOWORD(GetKeyboardLayout(0));
UINT AwtMenuItem::m_CodePage =
AwtMenuItem::LangToCodePage(AwtMenuItem::m_idLang);
BOOL AwtMenuItem::m_isWin95 = IS_WIN95;
BOOL AwtMenuItem::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC ||
PRIMARYLANGID(GetInputLanguage()) == LANG_HEBREW;
BOOL AwtMenuItem::sm_rtlReadingOrder =
@ -150,7 +150,7 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu)
jobject createError = NULL;
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",
"(Ljava/lang/String;)V",
errorMsg);
@ -435,16 +435,7 @@ void AwtMenuItem::DrawItem(DRAWITEMSTRUCT& drawInfo)
if (drawInfo.itemID != m_Id)
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);
}
void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo)
@ -802,8 +793,9 @@ BOOL AwtMenuItem::IsSeparator() {
jobject jitem = GetTarget(env);
jstring label =
(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));
JNU_ReleaseStringPlatformChars(env, label, labelW);
env->DeleteLocalRef(label);
env->DeleteLocalRef(jitem);

View File

@ -1,54 +0,0 @@
/*
* 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

View File

@ -25,9 +25,6 @@
#include "awt_Object.h"
#include "ObjectList.h"
#ifdef DEBUG
#include "awt_Unicode.h"
#endif
#ifdef DEBUG
static BOOL reportEvents = FALSE;
@ -116,8 +113,9 @@ AwtObject::DoCallback(const char* methodName, const char* methodSig, ...)
"getName",
"()Ljava/lang/String;").l;
DASSERT(!safe_ExceptionOccurred(env));
printf("Posting %s%s method to %S\n", methodName, methodSig,
TO_WSTRING(targetStr));
LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL);
printf("Posting %s%s method to %S\n", methodName, methodSig, targetStrW);
JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW);
}
#endif
/* caching would do much good here */
@ -148,8 +146,11 @@ void AwtObject::SendEvent(jobject event)
(jstring)JNU_CallMethodByName(env, NULL, GetTarget(env),"getName",
"()Ljava/lang/String;").l;
DASSERT(!safe_ExceptionOccurred(env));
printf("Posting %S to %S\n", TO_WSTRING(eventStr),
TO_WSTRING(targetStr));
LPCWSTR eventStrW = JNU_GetStringPlatformChars(env, eventStr, NULL);
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
/* Post event to the system EventQueue. */

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,7 +23,7 @@
* have any questions.
*/
#include <windows.h>
#include "awt.h"
#include "awt_Palette.h"
#include "awt_Component.h"
#include "img_util_md.h"

View File

@ -234,11 +234,13 @@ void AwtPopupMenu::Enable(BOOL isEnabled)
jobject jitem = item->GetTarget(env);
BOOL bItemEnabled = isEnabled && (jboolean)env->GetBooleanField(jitem,
AwtMenuItem::enabledID);
LPWSTR labelW = TO_WSTRING((jstring)env->GetObjectField(jitem,
AwtMenuItem::labelID));
if (labelW != NULL && wcscmp(labelW,L"-") != 0) {
jstring labelStr = static_cast<jstring>(env->GetObjectField(jitem, AwtMenuItem::labelID));
LPCWSTR labelStrW = JNU_GetStringPlatformChars(env, labelStr, NULL);
if (labelStrW && wcscmp(labelStrW, L"-") != 0) {
item->Enable(bItemEnabled);
}
JNU_ReleaseStringPlatformChars(env, labelStr, labelStrW);
env->DeleteLocalRef(labelStr);
env->DeleteLocalRef(jitem);
}
env->DeleteLocalRef(target);

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -108,16 +108,13 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
BOOL nt = IS_NT;
DWORD cReturned = 0;
if (pPrinterEnum == NULL) {
// Compute size of buffer
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);
}
::EnumPrinters(PRINTER_ENUM_LOCAL,
NULL, 5, NULL, 0, pcbBuf, &cReturned);
if (cbNeeded > (*pcbBuf)) {
@ -139,65 +136,63 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
// doesn't support port searches. So, if the user has specified the
// printer name as "LPT1:" (even though this is actually a port
// name), we won't find the printer here.
if (nt) {
if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) {
return FALSE;
}
if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) {
return FALSE;
}
for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_4));
if (info4->pPrinterName != NULL &&
_tcsicmp(lpcPrinterName, info4->pPrinterName) == 0) {
for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_4));
if (info4->pPrinterName != NULL &&
_tcsicmp(lpcPrinterName, info4->pPrinterName) == 0) {
// Fix for BugTraq Id 4281380.
// Get the port name since some drivers may require
// this name to be passed to ::DeviceCapabilities().
HANDLE hPrinter = NULL;
if (::OpenPrinter(info4->pPrinterName, &hPrinter, NULL)) {
// Fix for BugTraq Id 4286812.
// Some drivers don't support PRINTER_INFO_5.
// In this case we try PRINTER_INFO_2, and if that
// isn't supported as well return NULL port name.
try {
if (AwtPrintControl::IsSupportedLevel(hPrinter, 5)) {
VERIFY(::GetPrinter(hPrinter, 5, pPrinterEnum, cbBuf,
&dummyWord));
PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)pPrinterEnum;
*foundPrinter = info5->pPrinterName;
// pPortName may specify multiple ports. We only want one.
*foundPort = (info5->pPortName != NULL)
? _tcstok(info5->pPortName, TEXT(",")) : NULL;
} else if (AwtPrintControl::IsSupportedLevel(hPrinter, 2)) {
VERIFY(::GetPrinter(hPrinter, 2, pPrinterEnum, cbBuf,
&dummyWord));
PRINTER_INFO_2 *info2 = (PRINTER_INFO_2 *)pPrinterEnum;
*foundPrinter = info2->pPrinterName;
// pPortName may specify multiple ports. We only want one.
*foundPort = (info2->pPortName != NULL)
? _tcstok(info2->pPortName, TEXT(",")) : NULL;
} else {
*foundPrinter = info4->pPrinterName;
// We failed to determine port name for the found printer.
*foundPort = NULL;
}
} catch (std::bad_alloc&) {
VERIFY(::ClosePrinter(hPrinter));
throw;
// Fix for BugTraq Id 4281380.
// Get the port name since some drivers may require
// this name to be passed to ::DeviceCapabilities().
HANDLE hPrinter = NULL;
if (::OpenPrinter(info4->pPrinterName, &hPrinter, NULL)) {
// Fix for BugTraq Id 4286812.
// Some drivers don't support PRINTER_INFO_5.
// In this case we try PRINTER_INFO_2, and if that
// isn't supported as well return NULL port name.
try {
if (AwtPrintControl::IsSupportedLevel(hPrinter, 5)) {
VERIFY(::GetPrinter(hPrinter, 5, pPrinterEnum, cbBuf,
&dummyWord));
PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)pPrinterEnum;
*foundPrinter = info5->pPrinterName;
// pPortName may specify multiple ports. We only want one.
*foundPort = (info5->pPortName != NULL)
? _tcstok(info5->pPortName, TEXT(",")) : NULL;
} else if (AwtPrintControl::IsSupportedLevel(hPrinter, 2)) {
VERIFY(::GetPrinter(hPrinter, 2, pPrinterEnum, cbBuf,
&dummyWord));
PRINTER_INFO_2 *info2 = (PRINTER_INFO_2 *)pPrinterEnum;
*foundPrinter = info2->pPrinterName;
// pPortName may specify multiple ports. We only want one.
*foundPort = (info2->pPortName != NULL)
? _tcstok(info2->pPortName, TEXT(",")) : NULL;
} else {
*foundPrinter = info4->pPrinterName;
// We failed to determine port name for the found printer.
*foundPort = NULL;
}
} catch (std::bad_alloc&) {
VERIFY(::ClosePrinter(hPrinter));
return TRUE;
throw;
}
return FALSE;
VERIFY(::ClosePrinter(hPrinter));
return TRUE;
}
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
// we'll test both. On NT, PRINTER_ENUM_LOCAL means just local
// printers. This is what we want, because we already tested all
@ -213,28 +208,17 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum,
for (DWORD i = 0; i < cReturned; i++) {
PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)
(pPrinterEnum + i * sizeof(PRINTER_INFO_5));
if (nt) {
// pPortName can specify multiple ports. Test them one at
// a time.
if (info5->pPortName != NULL) {
LPTSTR port = _tcstok(info5->pPortName, TEXT(","));
while (port != NULL) {
if (_tcsicmp(lpcPrinterName, port) == 0) {
*foundPrinter = info5->pPrinterName;
*foundPort = port;
return TRUE;
}
port = _tcstok(NULL, TEXT(","));
// pPortName can specify multiple ports. Test them one at
// a time.
if (info5->pPortName != NULL) {
LPTSTR port = _tcstok(info5->pPortName, TEXT(","));
while (port != NULL) {
if (_tcsicmp(lpcPrinterName, port) == 0) {
*foundPrinter = info5->pPrinterName;
*foundPort = port;
return TRUE;
}
}
} 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;
port = _tcstok(NULL, TEXT(","));
}
}
}
@ -400,13 +384,11 @@ BOOL AwtPrintControl::CreateDevModeAndDevNames(PRINTDLG *ppd,
}
// Create DEVNAMES.
if (IS_NT) {
if (pPortName != NULL) {
info2->pPortName = pPortName;
} else if (info2->pPortName != NULL) {
// pPortName may specify multiple ports. We only want one.
info2->pPortName = _tcstok(info2->pPortName, TEXT(","));
}
if (pPortName != NULL) {
info2->pPortName = pPortName;
} else if (info2->pPortName != NULL) {
// pPortName may specify multiple ports. We only want one.
info2->pPortName = _tcstok(info2->pPortName, TEXT(","));
}
size_t lenDriverName = ((info2->pDriverName != NULL)

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,10 +23,10 @@
* have any questions.
*/
#include "awt.h"
#include "awt_PrintDialog.h"
#include "awt_Dialog.h"
#include "awt_PrintControl.h"
#include "awt_dlls.h"
#include "awt_Window.h"
#include "ComCtl32Util.h"
#include <sun_awt_windows_WPrintDialog.h>
@ -39,11 +39,9 @@ jmethodID AwtPrintDialog::setHWndMID;
BOOL
AwtPrintDialog::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)));
reinterpret_cast<void *(*)(void *)>(::PrintDlg), data)));
}
LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message,

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include <math.h>
#include <windef.h>
#include <wtypes.h>
@ -30,10 +31,9 @@
#include <commdlg.h>
#include <winspool.h>
#include "awt.h"
#include "awt_dlls.h"
#include "awt_Toolkit.h"
#include "awt_Component.h"
#include "awt_Dialog.h"
#include "awt_Font.h"
#include "awt_PrintDialog.h"
#include "awt_PrintControl.h"
@ -422,7 +422,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
*/
if (AwtPrintControl::getPrintHDMode(env, self) == NULL ||
AwtPrintControl::getPrintHDName(env,self) == NULL) {
(void)AwtCommDialog::PageSetupDlg(&setup);
(void)::PageSetupDlg(&setup);
/* check if hDevMode and hDevNames are set.
* If both are null, then there is no default printer.
*/
@ -460,7 +460,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer)
AwtDialog::CheckInstallModalHook();
BOOL ret = AwtCommDialog::PageSetupDlg(&setup);
BOOL ret = ::PageSetupDlg(&setup);
if (ret) {
jobject paper = getPaper(env, page);
@ -733,7 +733,7 @@ Java_sun_awt_windows_WPrinterJob_validatePaper(JNIEnv *env, jobject self,
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
if (AwtCommDialog::PrintDlg(&pd)) {
if (::PrintDlg(&pd)) {
printDC = pd.hDC;
hDevMode = pd.hDevMode;
hDevNames = pd.hDevNames;
@ -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,
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;
LOGBRUSH logBrush;
@ -1879,23 +1875,13 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont
{
jboolean didSetFont = JNI_FALSE;
if (IS_NT) {
didSetFont = jFontToWFontW(env, (HDC)printDC,
didSetFont = jFontToWFontW(env, (HDC)printDC,
fontName,
fontSize,
isBold,
isItalic,
rotation,
awScale);
} else {
didSetFont = jFontToWFontA(env, (HDC)printDC,
fontName,
fontSize,
isBold,
isItalic,
rotation,
awScale);
}
return didSetFont;
}
@ -1919,7 +1905,7 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
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
@ -1928,14 +1914,14 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
*/
int maxlen = static_cast<int>(sizeof(lf.lfFaceName)) - 1;
// maxlen is int due to cbMultiByte parameter is int
int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page
0, // flags
name, // Unicode string
-1, // Unicode length is calculated automatically
int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page
0, // flags
fontNameW, // Unicode string
-1, // Unicode length is calculated automatically
lf.lfFaceName, // Put ASCII string here
maxlen, // max len
NULL, // default handling of unmappables
NULL);// do not care if def char is used
maxlen, // max len
NULL, // default handling of unmappables
NULL); // do not care if def char is used
/* If WideCharToMultiByte succeeded then the number
* of bytes it copied into the face name buffer will
@ -2018,9 +2004,10 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName,
} else {
foundFont = false;
}
}
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
return foundFont ? JNI_TRUE : JNI_FALSE;
}
@ -2043,27 +2030,29 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
memset(&matchedLogFont, 0, sizeof(matchedLogFont));
LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL);
/* Describe the GDI fonts we want enumerated. We
* simply supply the java font name and let GDI
* do the matching. If the java font name is
* longer than the GDI maximum font lenght then
* we can't convert the font.
*/
WCHAR* name = TO_WSTRING(fontName);
size_t nameLen = wcslen(name);
size_t nameLen = wcslen(fontNameW);
if (nameLen < (sizeof(lf.lfFaceName) / sizeof(lf.lfFaceName[0]))) {
wcscpy(lf.lfFaceName, name);
wcscpy(lf.lfFaceName, fontNameW);
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfPitchAndFamily = 0;
foundFont = !EnumFontFamiliesExW((HDC)printDC, &lf,
foundFont = !::EnumFontFamiliesEx((HDC)printDC, &lf,
(FONTENUMPROCW) fontEnumProcW,
(LPARAM) &matchedLogFont, 0);
}
JNU_ReleaseStringPlatformChars(env, fontName, fontNameW);
if (!foundFont) {
return JNI_FALSE;
}
@ -2100,7 +2089,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
//Debug: dumpLogFont(&matchedLogFont);
HFONT font = CreateFontIndirectW(&matchedLogFont);
HFONT font = ::CreateFontIndirect(&matchedLogFont);
if (font == NULL) {
return JNI_FALSE;
}
@ -2123,7 +2112,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName,
GetTextMetrics(printDC, &tm);
avgWidth = tm.tmAveCharWidth;
matchedLogFont.lfWidth = (LONG)((fabs)(avgWidth*awScale));
font = CreateFontIndirectW(&matchedLogFont);
font = ::CreateFontIndirect(&matchedLogFont);
if (font == NULL) {
return JNI_FALSE;
}
@ -2230,14 +2219,11 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getGDIAdvance
(JNIEnv *env, jobject self, jlong printDC, jstring text)
{
SIZE size;
LPWSTR wText = TO_WSTRING(text);
LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL);
size_t strLen = wcslen(wText);
BOOL ok = GetTextExtentPoint32((HDC)printDC, wText, (int)strLen, &size);
if (ok) {
return size.cx;
} else {
return 0;
}
JNU_ReleaseStringPlatformChars(env, text, wText);
return ok ? size.cx : 0;
}
@ -2288,7 +2274,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
long posX = ROUND_TO_LONG(x);
long posY = ROUND_TO_LONG(y);
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;
BOOL useYAdvances = FALSE;
@ -2359,7 +2345,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
*inxyAdvances = 0;
}
if (useYAdvances && IS_WIN2000) {
if (useYAdvances) {
advances = xyadvances;
flags |= J2D_ETO_PDY;
} else {
@ -2371,7 +2357,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
env->ReleaseFloatArrayElements(positions, glyphPos, JNI_ABORT);
}
BOOL drawn = ::ExtTextOutW( (HDC)printDC,
BOOL drawn = ::ExtTextOut((HDC)printDC,
posX, posY, // starting position for the text
flags, // glyphCodes?, y advances?
NULL, // optional clipping-opaquing rectangle
@ -2385,6 +2371,8 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut
if (xyadvances != NULL) {
free(xyadvances);
}
JNU_ReleaseStringPlatformChars(env, text, wText);
}
/**
@ -2968,7 +2956,7 @@ static HDC getDefaultPrinterDC(JNIEnv *env, jobject printerJob) {
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
if (AwtCommDialog::PrintDlg(&pd)) {
if (::PrintDlg(&pd)) {
printDC = pd.hDC;
/* Find out how many copies the driver can do, and use driver's

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,6 +23,7 @@
* have any questions.
*/
#include "awt.h"
#include "awt_Toolkit.h"
#include "awt_Component.h"
#include "awt_Robot.h"
@ -44,11 +45,11 @@ AwtRobot::~AwtRobot()
}
#ifndef SPI_GETMOUSESPEED
#define SPI_GETMOUSESPEED 112
#define SPI_GETMOUSESPEED 112
#endif
#ifndef SPI_SETMOUSESPEED
#define SPI_SETMOUSESPEED 113
#define SPI_SETMOUSESPEED 113
#endif
void AwtRobot::MouseMove( jint x, jint y)
@ -141,45 +142,7 @@ void AwtRobot::MouseRelease( jint buttonMask )
}
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)

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -108,13 +108,6 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
{
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 =
env->GetIntField(target, scrollbarDisplayPolicyID);
@ -122,7 +115,7 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
== java_awt_ScrollPane_SCROLLBARS_ALWAYS) {
style |= WS_HSCROLL | WS_VSCROLL;
}
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
DWORD exStyle = WS_EX_CLIENTEDGE;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
@ -225,15 +218,8 @@ void AwtScrollPane::RecalcSizes(int parentWidth, int parentHeight,
}
/* Determine border width without scrollbars. */
int horzBorder;
int vertBorder;
if (IS_WIN4X) {
horzBorder = ::GetSystemMetrics(SM_CXEDGE);
vertBorder = ::GetSystemMetrics(SM_CYEDGE);
} else {
horzBorder = ::GetSystemMetrics(SM_CXBORDER);
vertBorder = ::GetSystemMetrics(SM_CYBORDER);
}
int horzBorder = ::GetSystemMetrics(SM_CXEDGE);;
int vertBorder = ::GetSystemMetrics(SM_CYEDGE);;
parentWidth -= (horzBorder * 2);
parentHeight -= (vertBorder * 2);

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,10 +26,8 @@
#include "awt_Toolkit.h"
#include "awt_TextArea.h"
#include "awt_TextComponent.h"
#include "awt_dlls.h"
#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
#include "awt_Unicode.h"
#include "awt_Window.h"
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
@ -50,7 +48,6 @@ struct ReplaceTextStruct {
jfieldID AwtTextArea::scrollbarVisibilityID;
WNDPROC AwtTextArea::sm_pDefWindowProc = NULL;
BOOL AwtTextArea::sm_RichEdit20 = (IS_WIN98 || IS_NT);
/************************************************************************
* AwtTextArea methods
@ -78,8 +75,12 @@ void AwtTextArea::Dispose()
}
LPCTSTR AwtTextArea::GetClassName() {
load_rich_edit_library();
return sm_RichEdit20 ? RICHEDIT_CLASS : TEXT("RICHEDIT");
static BOOL richedLibraryLoaded = FALSE;
if (!richedLibraryLoaded) {
::LoadLibrary(TEXT("RICHED20.DLL"));
richedLibraryLoaded = TRUE;
}
return RICHEDIT_CLASS;
}
/* Create a new AwtTextArea object and window. */
@ -134,9 +135,8 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent)
* scrollbars instead of hiding them when not needed.
*/
DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT | ES_MULTILINE |
ES_WANTRETURN | scroll_style |
(IS_WIN4X ? 0 : WS_BORDER) | ES_DISABLENOSCROLL;
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
ES_WANTRETURN | scroll_style | ES_DISABLENOSCROLL;
DWORD exStyle = WS_EX_CLIENTEDGE;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder())
@ -169,9 +169,7 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent)
// end-of-document marker or carriage return,
// to format paragraphs.
// 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;
/* suppress inheriting parent's color. */
@ -242,7 +240,7 @@ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen)
*/
size_t length = env->GetStringLength(jStr) + 1;
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';
for (size_t i = 0; i < maxlen && i < length - 1; i++) {
if (string[i] == L'\n') {
@ -461,12 +459,7 @@ AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
/* Check if all the text is selected. */
if (cr.cpMin == 0) {
int len = 0;
if (m_isWin95) {
len = ::GetWindowTextLengthA(GetHWnd());
} else {
len = ::GetWindowTextLengthW(GetHWnd());
}
int len = ::GetWindowTextLength(GetHWnd());
if (cr.cpMin == 0 && cr.cpMax >= len) {
/*
* All the text is selected in RichEdit - select all the
@ -738,14 +731,8 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
// kdm@sparc.spb.su
UINT platfScrollLines = 3;
// 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,
&platfScrollLines, 0);
}
::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
&platfScrollLines, 0);
if (platfScrollLines > 0) {
HWND hWnd = GetHWnd();
@ -838,23 +825,6 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic)
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.
* Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set
@ -984,16 +954,16 @@ void AwtTextArea::_ReplaceText(void *param)
jsize length = env->GetStringLength(text) + 1;
// Bugid 4141477 - Can't use TO_WSTRING here because it uses alloca
// WCHAR* buffer = TO_WSTRING(text);
WCHAR *buffer = new WCHAR[length];
env->GetStringRegion(text, 0, length-1, buffer);
TCHAR *buffer = new TCHAR[length];
env->GetStringRegion(text, 0, length-1, reinterpret_cast<jchar*>(buffer));
buffer[length-1] = '\0';
c->CheckLineSeparator(buffer);
c->RemoveCR(buffer);
// Fix for 5003402: added restoring/hiding selection to enable automatic scrolling
c->SendMessage(EM_HIDESELECTION, FALSE, TRUE);
c->SendMessageW(EM_SETSEL, start, end);
c->SendMessageW(EM_REPLACESEL, FALSE, (LPARAM)buffer);
c->SendMessage(EM_SETSEL, start, end);
c->SendMessage(EM_REPLACESEL, FALSE, (LPARAM)buffer);
c->SendMessage(EM_HIDESELECTION, TRUE, TRUE);
delete[] buffer;
@ -1187,12 +1157,11 @@ AwtTextArea::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj,
HGLOBAL hMetaPict) {
if (reco == RECO_PASTE) {
// If CF_TEXT format is available edit controls will select it,
// otherwise if it is WinNT or Win2000 and CF_UNICODETEXT is
// available it will be selected, otherwise if CF_OEMTEXT is
// available it will be selected.
// otherwise if it is CF_UNICODETEXT is available it will be
// selected, otherwise if CF_OEMTEXT is available it will be selected.
if (::IsClipboardFormatAvailable(CF_TEXT)) {
*pcfFormat = CF_TEXT;
} else if (!m_isWin95 && ::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
} else if (::IsClipboardFormatAvailable(CF_UNICODETEXT)) {
*pcfFormat = CF_UNICODETEXT;
} else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) {
*pcfFormat = CF_OEMTEXT;

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -73,8 +73,6 @@ public:
MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal);
MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
INLINE virtual int GetText(LPTSTR buffer, int size);
INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; }
virtual void SetColor(COLORREF c);
@ -96,10 +94,6 @@ protected:
void EditGetSel(CHARRANGE &cr);
LONG EditGetCharFromPos(POINT& pt);
private:
// TRUE if the rich edit version is 2.0
static BOOL sm_RichEdit20;
// RichEdit 1.0 control generates EN_CHANGE notifications not only
// on text changes, but also on any character formatting change.
// This flag is true when the latter case is detected.

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -326,7 +326,7 @@ jstring AwtTextComponent::_GetText(void *param)
WCHAR* buf = new WCHAR[len + 1];
c->GetText(buf, len + 1);
c->RemoveCR(buf);
result = env->NewString(buf, static_cast<jsize>(wcslen(buf)));
result = JNU_NewStringPlatform(env, buf);
delete [] buf;
}
}
@ -362,7 +362,7 @@ void AwtTextComponent::_SetText(void *param)
{
int length = env->GetStringLength(text);
WCHAR* buffer = new WCHAR[length + 1];
env->GetStringRegion(text, 0, length, buffer);
env->GetStringRegion(text, 0, length, reinterpret_cast<jchar*>(buffer));
buffer[length] = 0;
c->CheckLineSeparator(buffer);
c->RemoveCR(buffer);

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -70,15 +70,6 @@ public:
static jstring _GetText(void *param);
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);

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,7 +26,6 @@
#include "awt_Toolkit.h"
#include "awt_TextField.h"
#include "awt_TextComponent.h"
#include "awt_dlls.h"
#include "awt_KeyboardFocusManager.h"
#include "awt_Canvas.h"
@ -69,9 +68,8 @@ AwtTextField* AwtTextField::Create(jobject peer, jobject parent)
{
DWORD style = WS_CHILD | WS_CLIPSIBLINGS |
ES_LEFT | ES_AUTOHSCROLL |
(IS_WIN4X ? 0 : WS_BORDER);
DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0;
ES_LEFT | ES_AUTOHSCROLL;
DWORD exStyle = WS_EX_CLIENTEDGE;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder())

View File

@ -23,15 +23,16 @@
* have any questions.
*/
#include "awt.h"
#include <signal.h>
#include <windowsx.h>
#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000
#include <crtdbg.h>
#endif
//#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000
//#include <crtdbg.h>
//#endif
#define _JNI_IMPLEMENTATION_
#include "stdhdrs.h"
#include "awt_DrawingSurface.h"
#include "awt_AWTEvent.h"
#include "awt_Component.h"
@ -51,7 +52,6 @@
#include "awt_FileDialog.h"
#include "CmdIDList.h"
#include "awt_new.h"
#include "awt_Unicode.h"
#include "debug_trace.h"
#include "debug_mem.h"
@ -225,8 +225,7 @@ BOOL AwtToolkit::activateKeyboardLayout(HKL hkl) {
HKL prev = ::ActivateKeyboardLayout(hkl, 0);
// 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.
TCHAR inputLocale[9];
TCHAR buf[9];
@ -297,7 +296,7 @@ JavaStringBuffer::JavaStringBuffer(JNIEnv *env, jstring jstr) {
if (jstr != NULL) {
int length = env->GetStringLength(jstr);
buffer = new TCHAR[length + 1];
LPCTSTR tmp = (LPCTSTR)JNU_GetStringPlatformChars(env, jstr, NULL);
LPCTSTR tmp = JNU_GetStringPlatformChars(env, jstr, NULL);
_tcscpy(buffer, tmp);
JNU_ReleaseStringPlatformChars(env, jstr, tmp);
} else {
@ -490,8 +489,6 @@ BOOL AwtToolkit::Dispose() {
::CloseHandle(m_waitEvent);
ComCtl32Util::GetInstance().FreeLibraries();
tk.m_isDisposed = TRUE;
return TRUE;
@ -886,8 +883,6 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message,
return (DWORD)ImmGetOpenStatus((HIMC)wParam);
}
case WM_DISPLAYCHANGE: {
AwtCursor::DirtyAllCustomCursors();
// Reinitialize screens
initScreens(env);
@ -1161,9 +1156,7 @@ BOOL AwtToolkit::PreProcessMsg(MSG& msg)
if (p && p->PreProcessMsg(msg) == mrConsume)
return TRUE;
if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST) ||
(IS_WIN95 && !IS_WIN98 &&
msg.message == AwtComponent::Wheel95GetMsg()) ||
if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) ||
(msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK)) {
if (PreProcessMouseMsg(p, msg)) {
return TRUE;
@ -1190,9 +1183,7 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg)
return FALSE;
}
if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST ||
(IS_WIN95 && !IS_WIN98 && msg.message == AwtComponent::Wheel95GetMsg()))
{
if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) {
mouseWParam = msg.wParam;
mouseLParam = msg.lParam;
} else {
@ -1287,21 +1278,6 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg)
//window
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
@ -1792,7 +1768,7 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
{
jobject insets = NULL;
RECT rRW;
MONITOR_INFO *miInfo;
LPMONITORINFO miInfo;
TRY;
@ -1814,10 +1790,10 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env,
if (miInfo) {
insets = env->NewObject(env->FindClass("java/awt/Insets"),
AwtToolkit::insetsMID,
miInfo->rWork.top - miInfo->rMonitor.top,
miInfo->rWork.left - miInfo->rMonitor.left,
miInfo->rMonitor.bottom - miInfo->rWork.bottom,
miInfo->rMonitor.right - miInfo->rWork.right);
miInfo->rcWork.top - miInfo->rcMonitor.top,
miInfo->rcWork.left - miInfo->rcMonitor.left,
miInfo->rcMonitor.bottom - miInfo->rcWork.bottom,
miInfo->rcMonitor.right - miInfo->rcWork.right);
}
}
@ -2057,29 +2033,15 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls)
swprintf(szVer, L"0x%x = %ld", version, version);
int l = lstrlen(szVer);
if (IS_WIN95) {
if (IS_WIN98) {
if (IS_WINME) {
swprintf(szVer + l, L" (Windows ME)");
if (IS_WIN2000) {
if (IS_WINXP) {
if (IS_WINVISTA) {
swprintf(szVer + l, L" (Windows Vista)");
} else {
swprintf(szVer + l, L" (Windows 98)");
swprintf(szVer + l, L" (Windows XP)");
}
} else {
swprintf(szVer + l, L" (Windows 95)");
}
} else if (IS_NT) {
if (IS_WIN2000) {
if (IS_WINXP) {
if (IS_WINVISTA) {
swprintf(szVer + l, L" (Windows Vista)");
} else {
swprintf(szVer + l, L" (Windows XP)");
}
} else {
swprintf(szVer + l, L" (Windows 2000)");
}
} else {
swprintf(szVer + l, L" (Windows NT)");
swprintf(szVer + l, L" (Windows 2000)");
}
} else {
swprintf(szVer + l, L" (Unknown)");

View File

@ -50,7 +50,6 @@
#include "awt.h"
#include "awtmsg.h"
#include "awt_Multimon.h"
#include "Trace.h"
#include "sun_awt_windows_WToolkit.h"
@ -89,11 +88,8 @@ class JNILocalFrame {
*/
class CriticalSection {
public:
INLINE CriticalSection() { ::InitializeCriticalSection(&rep);
::InitializeCriticalSection(&tryrep);
tryEntered = 0; }
INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep);
::DeleteCriticalSection(&tryrep); }
INLINE CriticalSection() { ::InitializeCriticalSection(&rep); }
INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep); }
class Lock {
public:
@ -111,50 +107,18 @@ class CriticalSection {
private:
CRITICAL_SECTION rep;
CRITICAL_SECTION tryrep;
long tryEntered;
CriticalSection(const CriticalSection&);
const CriticalSection& operator =(const CriticalSection&);
public:
virtual void Enter (void)
{
::EnterCriticalSection(&tryrep);
tryEntered++;
if (tryEntered == 1) {
::EnterCriticalSection(&rep);
::LeaveCriticalSection(&tryrep);
} else {
::LeaveCriticalSection(&tryrep);
::EnterCriticalSection(&rep);
}
virtual void Enter() {
::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);
tryEntered++;
result = TRUE;
}
::LeaveCriticalSection(&tryrep);
return result;
virtual BOOL TryEnter() {
return ::TryEnterCriticalSection(&rep);
}
virtual void Leave (void)
{
::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(&tryrep);
}
};

View File

@ -23,9 +23,10 @@
* have any questions.
*/
#include <windows.h>
#include "awt.h"
#include <windowsx.h>
#include <shellapi.h>
#include <shlwapi.h>
#include "awt_Toolkit.h"
#include "awt_TrayIcon.h"
@ -173,27 +174,20 @@ AwtTrayIcon* AwtTrayIcon::Create(jobject self, jobject parent)
env->DeleteLocalRef(target);
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)
{
// fix for 6271589: we MUST set the size of the structure to match
// the shell version, otherwise some errors may occur (like missing
// balloon messages on win2k)
SDLLVERSIONINFO dllVersionInfo;
dllVersionInfo.cbSize = sizeof(SDLLVERSIONINFO);
int shellVersion = 4; // WIN_98
DLLVERSIONINFO dllVersionInfo;
dllVersionInfo.cbSize = sizeof(DLLVERSIONINFO);
int shellVersion = 5; // WIN_2000
// MSDN: DllGetVersion should not be implicitly called, but rather
// loaded using GetProcAddress
HMODULE hShell = LoadLibrary(TEXT("Shell32.dll"));
if (hShell != NULL) {
SDLLGETVERSIONPROC proc = (SDLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion");
DLLGETVERSIONPROC proc = (DLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion");
if (proc != NULL) {
if (proc(&dllVersionInfo) == NOERROR) {
shellVersion = dllVersionInfo.dwMajorVersion;
@ -202,14 +196,16 @@ void AwtTrayIcon::InitNID(UINT uID)
}
FreeLibrary(hShell);
switch (shellVersion) {
case 5: // WIN_2000, WIN_ME
case 5: // WIN_2000
m_nid.cbSize = (BYTE *)(&m_nid.guidItem) - (BYTE *)(&m_nid.cbSize);
break;
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);
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.uID = uID;
@ -217,7 +213,7 @@ void AwtTrayIcon::InitNID(UINT uID)
m_nid.uCallbackMessage = WM_AWT_TRAY_NOTIFY;
m_nid.hIcon = AwtToolkit::GetInstance().GetAwtIcon();
m_nid.szTip[0] = '\0';
m_nid.uVersion = IS_WIN2000 ? AWT_NOTIFYICON_VERSION : 0;
m_nid.uVersion = NOTIFYICON_VERSION;
}
BOOL AwtTrayIcon::SendTrayMessage(DWORD dwMessage)
@ -304,13 +300,13 @@ MsgRouting AwtTrayIcon::WmAwtTrayNotify(WPARAM wParam, LPARAM lParam)
case WM_CONTEXTMENU:
mr = WmContextMenu(0, pos.x, pos.y);
break;
case AWT_NIN_KEYSELECT:
case NIN_KEYSELECT:
mr = WmKeySelect(0, pos.x, pos.y);
break;
case AWT_NIN_SELECT:
case NIN_SELECT:
mr = WmSelect(0, pos.x, pos.y);
break;
case AWT_NIN_BALLOONUSERCLICK:
case NIN_BALLOONUSERCLICK:
mr = WmBalloonUserClick(0, pos.x, pos.y);
break;
}
@ -473,7 +469,7 @@ MsgRouting AwtTrayIcon::WmTaskbarCreated() {
BOOL result = item->m_trayIcon->SendTrayMessage(NIM_ADD);
// 6270114: Instructs the taskbar to behave according to the Shell version 5.0
if (result) {
item->m_trayIcon->SendTrayMessage(AWT_NIM_SETVERSION);
item->m_trayIcon->SendTrayMessage(NIM_SETVERSION);
}
}
return mrDoDefault;
@ -733,9 +729,9 @@ void AwtTrayIcon::_SetToolTip(void *param)
goto ret;
}
tooltipStr = env->GetStringChars(jtooltip, (jboolean *)NULL);
tooltipStr = JNU_GetStringPlatformChars(env, jtooltip, (jboolean *)NULL);
trayIcon->SetToolTip(tooltipStr);
env->ReleaseStringChars(jtooltip, tooltipStr);
JNU_ReleaseStringPlatformChars(env, jtooltip, tooltipStr);
ret:
env->DeleteGlobalRef(self);
env->DeleteGlobalRef(jtooltip);
@ -782,7 +778,7 @@ void AwtTrayIcon::_UpdateIcon(void *param)
BOOL result = trayIcon->SendTrayMessage(jupdate == JNI_TRUE ? NIM_MODIFY : NIM_ADD);
// 6270114: Instructs the taskbar to behave according to the Shell version 5.0
if (result && jupdate == JNI_FALSE) {
trayIcon->SendTrayMessage(AWT_NIM_SETVERSION);
trayIcon->SendTrayMessage(NIM_SETVERSION);
}
ret:
env->DeleteGlobalRef(self);
@ -791,22 +787,19 @@ ret:
void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType)
{
if (!IS_WIN2000)
return;
m_nid.uFlags |= AWT_NIF_INFO;
m_nid.uFlags |= NIF_INFO;
m_nid.uTimeout = 10000;
if (lstrcmp(msgType, TEXT("ERROR")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_ERROR;
m_nid.dwInfoFlags = NIIF_ERROR;
} 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) {
m_nid.dwInfoFlags = AWT_NIIF_INFO;
m_nid.dwInfoFlags = NIIF_INFO;
} else if (lstrcmp(msgType, TEXT("NONE")) == 0) {
m_nid.dwInfoFlags = AWT_NIIF_NONE;
m_nid.dwInfoFlags = NIIF_NONE;
} else {
m_nid.dwInfoFlags = AWT_NIIF_NONE;
m_nid.dwInfoFlags = NIIF_NONE;
}
if (caption[0] == '\0') {
@ -835,7 +828,7 @@ void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType)
}
SendTrayMessage(NIM_MODIFY);
m_nid.uFlags &= ~AWT_NIF_INFO;
m_nid.uFlags &= ~NIF_INFO;
}
void AwtTrayIcon::_DisplayMessage(void *param)
@ -855,15 +848,15 @@ void AwtTrayIcon::_DisplayMessage(void *param)
JNI_CHECK_PEER_GOTO(self, ret);
trayIcon = (AwtTrayIcon *)pData;
captionStr = env->GetStringChars(jcaption, (jboolean *)NULL);
textStr = env->GetStringChars(jtext, (jboolean *)NULL);
msgTypeStr = env->GetStringChars(jmsgType, (jboolean *)NULL);
captionStr = JNU_GetStringPlatformChars(env, jcaption, (jboolean *)NULL);
textStr = JNU_GetStringPlatformChars(env, jtext, (jboolean *)NULL);
msgTypeStr = JNU_GetStringPlatformChars(env, jmsgType, (jboolean *)NULL);
trayIcon->DisplayMessage(captionStr, textStr, msgTypeStr);
env->ReleaseStringChars(jcaption, captionStr);
env->ReleaseStringChars(jtext, textStr);
env->ReleaseStringChars(jmsgType, msgTypeStr);
JNU_ReleaseStringPlatformChars(env, jcaption, captionStr);
JNU_ReleaseStringPlatformChars(env, jtext, textStr);
JNU_ReleaseStringPlatformChars(env, jmsgType, msgTypeStr);
ret:
env->DeleteGlobalRef(self);
env->DeleteGlobalRef(jcaption);
@ -1057,16 +1050,14 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self,
{
TRY;
if (IS_WIN2000) {
DisplayMessageStruct *dms = new DisplayMessageStruct;
dms->trayIcon = env->NewGlobalRef(self);
dms->caption = (jstring)env->NewGlobalRef(caption);
dms->text = (jstring)env->NewGlobalRef(text);
dms->msgType = (jstring)env->NewGlobalRef(msgType);
DisplayMessageStruct *dms = new DisplayMessageStruct;
dms->trayIcon = env->NewGlobalRef(self);
dms->caption = (jstring)env->NewGlobalRef(caption);
dms->text = (jstring)env->NewGlobalRef(text);
dms->msgType = (jstring)env->NewGlobalRef(msgType);
AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms);
// global ref is deleted in _DisplayMessage
}
AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms);
// global ref is deleted in _DisplayMessage
CATCH_BAD_ALLOC(NULL);
}

View File

@ -36,57 +36,11 @@
#define TRAY_ICON_X_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_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
*/
@ -174,7 +128,7 @@ public:
static int sm_instCount;
private:
AWT_NOTIFYICONDATA m_nid;
NOTIFYICONDATA m_nid;
/* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON
* which are allowed to

View File

@ -1,50 +0,0 @@
/*
* 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

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,12 +23,12 @@
* have any questions.
*/
#include <windows.h>
#include "awt.h"
#include <sun_awt_Win32GraphicsConfig.h>
#include "awt_Win32GraphicsConfig.h"
#include "awt_Canvas.h"
#include "awt_Win32GraphicsDevice.h"
#include "Devices.h"
//Info for building a ColorModel
#include "java_awt_image_DataBuffer.h"
@ -93,8 +93,8 @@ JNIEXPORT jobject JNICALL
clazz = env->FindClass("java/awt/Rectangle");
mid = env->GetMethodID(clazz, "<init>", "(IIII)V");
if (mid != 0) {
RECT rRW = {0,0,0,0};
if( TRUE == ::MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW) ) {
RECT rRW = {0, 0, 0, 0};
if (TRUE == MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW)) {
bounds = env->NewObject(clazz, mid,
rRW.left, rRW.top,
rRW.right - rRW.left,

View File

@ -37,19 +37,17 @@
* array index.
*/
#include <windows.h>
#include <jni.h>
#include <awt.h>
#include <sun_awt_Win32GraphicsDevice.h>
#include "awt_Canvas.h"
#include "awt_Win32GraphicsDevice.h"
#include "awt_Window.h"
#include "java_awt_Transparency.h"
#include "java_awt_color_ColorSpace.h"
#include "sun_awt_Win32GraphicsDevice.h"
#include "java_awt_image_DataBuffer.h"
#include "dither.h"
#include "img_util_md.h"
#include "awt_dlls.h"
#include "Devices.h"
uns_ordered_dither_array img_oda_alpha;
@ -72,7 +70,7 @@ int AwtWin32GraphicsDevice::primaryIndex = 0;
* device, and information on whether the primary device is palettized.
*/
AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
MHND mhnd, Devices *arr)
HMONITOR mhnd, Devices *arr)
{
this->screen = screen;
this->devicesArray = arr;
@ -83,8 +81,8 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
cData = NULL;
gpBitmapInfo = NULL;
monitor = mhnd;
pMonitorInfo = (PMONITOR_INFO)new MONITOR_INFO_EXTENDED;
pMonitorInfo->dwSize = sizeof(MONITOR_INFO_EXTENDED);
pMonitorInfo = new MONITORINFOEX;
pMonitorInfo->cbSize = sizeof(MONITORINFOEX);
::GetMonitorInfo(monitor, pMonitorInfo);
// Set primary device info: other devices will need to know
@ -93,7 +91,7 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen,
HDC hDC = this->GetDC();
colorData->bitsperpixel = ::GetDeviceCaps(hDC, BITSPIXEL);
this->ReleaseDC(hDC);
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) {
if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryIndex = screen;
if (colorData->bitsperpixel > 8) {
primaryPalettized = FALSE;
@ -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()
{
return MakeDCFromMonitor(monitor);
@ -164,7 +180,7 @@ void AwtWin32GraphicsDevice::Initialize()
VERIFY(::GetDIBits(hBMDC, hBM, 0, 1, NULL, gpBitmapInfo, DIB_RGB_COLORS));
if (colorData->bitsperpixel > 8) {
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) {
if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryPalettized = FALSE;
}
if (colorData->bitsperpixel != 24) { // 15, 16, or 32 bpp
@ -250,7 +266,7 @@ void AwtWin32GraphicsDevice::Initialize()
((int *)gpBitmapInfo->bmiColors)[2] = 0xff0000;
}
} else {
if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) {
if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) {
primaryPalettized = TRUE;
}
gpBitmapInfo->bmiHeader.biBitCount = 8;
@ -565,8 +581,8 @@ void AwtWin32GraphicsDevice::RealizePalette(HDC hDC)
*/
int AwtWin32GraphicsDevice::DeviceIndexForWindow(HWND hWnd)
{
MHND mon = MonitorFromWindow(hWnd, MONITOR_DEFAULT_TO_NEAR);
int screen = AwtWin32GraphicsDevice::GetScreenFromMHND(mon);
HMONITOR mon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
int screen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(mon);
return screen;
}
@ -645,14 +661,14 @@ jobject AwtWin32GraphicsDevice::GetColorModel(JNIEnv *env, jboolean dynamic,
return devices->GetDevice(deviceIndex)->GetColorModel(env, dynamic);
}
MONITOR_INFO *AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex)
LPMONITORINFO AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex)
{
Devices::InstanceAccess devices;
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.
*/
void AwtWin32GraphicsDevice::ResetAllMonitorInfo()
@ -660,14 +676,14 @@ void AwtWin32GraphicsDevice::ResetAllMonitorInfo()
Devices::InstanceAccess devices;
int devicesNum = devices->GetNumDevices();
for (int deviceIndex = 0; deviceIndex < devicesNum; deviceIndex++) {
MHND monitor = devices->GetDevice(deviceIndex)->GetMonitor();
HMONITOR monitor = devices->GetDevice(deviceIndex)->GetMonitor();
::GetMonitorInfo(monitor,
devices->GetDevice(deviceIndex)->pMonitorInfo);
}
}
void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice(
MHND hMonitor)
HMONITOR hMonitor)
{
Devices::InstanceAccess devices;
if (hMonitor == NULL) {
@ -682,7 +698,7 @@ void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice(
}
}
MHND AwtWin32GraphicsDevice::GetMonitor(int deviceIndex)
HMONITOR AwtWin32GraphicsDevice::GetMonitor(int deviceIndex)
{
Devices::InstanceAccess devices;
return devices->GetDevice(deviceIndex)->GetMonitor();
@ -741,30 +757,31 @@ HDC AwtWin32GraphicsDevice::GetDCFromScreen(int screen) {
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
*/
BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) {
BOOL AwtWin32GraphicsDevice::AreSameMonitors(HMONITOR mon1, HMONITOR mon2) {
J2dTraceLn2(J2D_TRACE_INFO,
"AwtWin32GraphicsDevice::AreSameMonitors mhnd1=%x mhnd2=%x",
mon1, mon2);
DASSERT(mon1 != NULL);
DASSERT(mon2 != NULL);
MONITOR_INFO mi1;
MONITOR_INFO mi2;
MONITORINFOEX mi1;
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);
memset((void*)(&mi1), 0, sizeof(MONITORINFOEX));
mi1.cbSize = sizeof(MONITORINFOEX);
memset((void*)(&mi2), 0, sizeof(MONITORINFOEX));
mi2.cbSize = sizeof(MONITORINFOEX);
if (::GetMonitorInfo(mon1,&mi1) != 0 &&
::GetMonitorInfo(mon2,&mi2) != 0 ) {
if (::EqualRect(&mi1.rMonitor,&mi2.rMonitor) &&
::EqualRect(&mi1.rWork,&mi2.rWork) &&
mi1.dwFlags == mi1.dwFlags) {
if (::GetMonitorInfo(mon1, &mi1) != 0 &&
::GetMonitorInfo(mon2, &mi2) != 0 )
{
if (::EqualRect(&mi1.rcMonitor, &mi2.rcMonitor) &&
::EqualRect(&mi1.rcWork, &mi2.rcWork) &&
(mi1.dwFlags == mi1.dwFlags))
{
J2dTraceLn(J2D_TRACE_VERBOSE, " the monitors are the same");
return TRUE;
@ -774,15 +791,15 @@ BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) {
return FALSE;
}
int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) {
int AwtWin32GraphicsDevice::GetScreenFromHMONITOR(HMONITOR mon) {
J2dTraceLn1(J2D_TRACE_INFO,
"AwtWin32GraphicsDevice::GetScreenFromMHND mhnd=%x", mon);
"AwtWin32GraphicsDevice::GetScreenFromHMONITOR mhnd=%x", mon);
DASSERT(mon != NULL);
Devices::InstanceAccess devices;
for (int i = 0; i < devices->GetNumDevices(); i++) {
MHND mhnd = devices->GetDevice(i)->GetMonitor();
HMONITOR mhnd = devices->GetDevice(i)->GetMonitor();
if (AreSameMonitors(mon, mhnd)) {
J2dTraceLn1(J2D_TRACE_VERBOSE, " Found device: %d", i);
return i;
@ -790,8 +807,8 @@ int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) {
}
J2dTraceLn1(J2D_TRACE_WARNING,
"AwtWin32GraphicsDevice::GetScreenFromMHND(): "\
"couldn't find screen for MHND %x, returning default", mon);
"AwtWin32GraphicsDevice::GetScreenFromHMONITOR(): "\
"couldn't find screen for HMONITOR %x, returning default", mon);
return AwtWin32GraphicsDevice::GetDefaultDeviceIndex();
}
@ -1076,19 +1093,19 @@ jobject CreateDisplayMode(JNIEnv* env, jint width, jint height,
* of the structure pointed to by lpDisplayDevice is undefined.
*/
static BOOL
GetAttachedDisplayDevice(int screen, _DISPLAY_DEVICE *lpDisplayDevice)
GetAttachedDisplayDevice(int screen, DISPLAY_DEVICE *lpDisplayDevice)
{
DWORD dwDeviceNum = 0;
lpDisplayDevice->dwSize = sizeof(_DISPLAY_DEVICE);
lpDisplayDevice->cb = sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, dwDeviceNum, lpDisplayDevice, 0) &&
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;
MONITOR_INFO_EXTENDED *pMonInfo =
(PMONITOR_INFO_EXTENDED) devices->GetDevice(screen)->GetMonitorInfo();
MONITORINFOEX *pMonInfo =
(LPMONITORINFOEX)devices->GetDevice(screen)->GetMonitorInfo();
// make sure the device names match
if (wcscmp(pMonInfo->strDevice, lpDisplayDevice->strDevName) == 0) {
if (wcscmp(pMonInfo->szDevice, lpDisplayDevice->DeviceName) == 0) {
return TRUE;
}
}
@ -1114,9 +1131,9 @@ Java_sun_awt_Win32GraphicsDevice_getCurrentDisplayMode
dm.dmSize = sizeof(dm);
dm.dmDriverExtra = 0;
_DISPLAY_DEVICE displayDevice;
DISPLAY_DEVICE displayDevice;
if (GetAttachedDisplayDevice(screen, &displayDevice)) {
pName = displayDevice.strDevName;
pName = displayDevice.DeviceName;
}
if (!EnumDisplaySettings(pName, ENUM_CURRENT_SETTINGS, &dm))
{
@ -1156,7 +1173,7 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode
// ChangeDisplaySettingsEx is not available on NT,
// so it'd be nice not to break it if we can help it.
if (screen == AwtWin32GraphicsDevice::GetDefaultDeviceIndex()) {
if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) !=
if (::ChangeDisplaySettings(&dm, CDS_FULLSCREEN) !=
DISP_CHANGE_SUCCESSFUL)
{
JNU_ThrowInternalError(env,
@ -1165,15 +1182,9 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode
return;
}
// make sure the function pointer for fn_change_display_settings_ex
// is initialized
load_user_procs();
_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) !=
DISPLAY_DEVICE displayDevice;
if (!GetAttachedDisplayDevice(screen, &displayDevice) ||
(::ChangeDisplaySettingsEx(displayDevice.DeviceName, &dm, NULL, CDS_FULLSCREEN, NULL) !=
DISP_CHANGE_SUCCESSFUL))
{
JNU_ThrowInternalError(env,
@ -1231,11 +1242,11 @@ JNIEXPORT void JNICALL Java_sun_awt_Win32GraphicsDevice_enumDisplayModes
DEVMODE dm;
LPTSTR pName = NULL;
_DISPLAY_DEVICE displayDevice;
DISPLAY_DEVICE displayDevice;
if (GetAttachedDisplayDevice(screen, &displayDevice)) {
pName = displayDevice.strDevName;
pName = displayDevice.DeviceName;
}
dm.dmSize = sizeof(dm);

View File

@ -32,7 +32,6 @@ extern "C" {
} // extern "C"
#include "colordata.h"
#include "awt_Palette.h"
#include "awt_MMStub.h"
#include "Devices.h"
class AwtPalette;
@ -40,7 +39,7 @@ class Devices;
class AwtWin32GraphicsDevice {
public:
AwtWin32GraphicsDevice(int screen, MHND mhnd, Devices *arr);
AwtWin32GraphicsDevice(int screen, HMONITOR mhnd, Devices *arr);
~AwtWin32GraphicsDevice();
void UpdateDeviceColorState();
void SetGrayness(int grayValue);
@ -60,8 +59,8 @@ public:
HPALETTE GetPalette();
ColorData *GetColorData() { return cData; }
int GetBitDepth() { return colorData->bitsperpixel; }
MHND GetMonitor() { return monitor; }
MONITOR_INFO *GetMonitorInfo() { return pMonitorInfo; }
HMONITOR GetMonitor() { return monitor; }
LPMONITORINFO GetMonitorInfo() { return pMonitorInfo; }
jobject GetJavaDevice() { return javaDevice; }
int GetDeviceIndex() { return screen; }
void Release();
@ -78,14 +77,14 @@ public:
static void UpdateDynamicColorModel(int deviceIndex);
static BOOL UpdateSystemPalette(int deviceIndex);
static HPALETTE GetPalette(int deviceIndex);
static MHND GetMonitor(int deviceIndex);
static MONITOR_INFO *GetMonitorInfo(int deviceIndex);
static HMONITOR GetMonitor(int deviceIndex);
static LPMONITORINFO GetMonitorInfo(int deviceIndex);
static void ResetAllMonitorInfo();
static BOOL IsPrimaryPalettized() { return primaryPalettized; }
static int GetDefaultDeviceIndex() { return primaryIndex; }
static void DisableOffscreenAccelerationForDevice(MHND hMonitor);
static void DisableOffscreenAccelerationForDevice(HMONITOR hMonitor);
static HDC GetDCFromScreen(int screen);
static int GetScreenFromMHND(MHND mon);
static int GetScreenFromHMONITOR(HMONITOR mon);
static int primaryIndex;
static BOOL primaryPalettized;
@ -97,17 +96,19 @@ public:
static jmethodID paletteChangedMID;
private:
static BOOL AreSameMonitors(MHND mon1, MHND mon2);
static BOOL AreSameMonitors(HMONITOR mon1, HMONITOR mon2);
ImgColorData *colorData;
AwtPalette *palette;
ColorData *cData; // Could be static, but may sometime
// have per-device info in this structure
BITMAPINFO *gpBitmapInfo;
int screen;
MHND monitor;
MONITOR_INFO *pMonitorInfo;
HMONITOR monitor;
LPMONITORINFO pMonitorInfo;
jobject javaDevice;
Devices *devicesArray;
static HDC MakeDCFromMonitor(HMONITOR);
};
#endif AWT_WIN32GRAPHICSDEVICE_H

View File

@ -23,8 +23,6 @@
* have any questions.
*/
#include <windows.h>
#include <jni.h>
#include <awt.h>
#include <sun_awt_Win32GraphicsEnvironment.h>
#include "awt_Canvas.h"
@ -188,44 +186,6 @@ Java_sun_awt_Win32GraphicsEnvironment_getDefaultScreen(JNIEnv *env,
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
* Method: registerFontWithPlatform
@ -236,9 +196,10 @@ Java_sun_awt_Win32GraphicsEnvironment_registerFontWithPlatform(JNIEnv *env,
jclass cl,
jstring fontName)
{
if (getWinVer() >= 5 && procAddFontResourceEx != NULL) {
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL);
(*procAddFontResourceEx)(file, FR_PRIVATE, NULL);
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE);
if (file) {
::AddFontResourceEx(file, FR_PRIVATE, NULL);
JNU_ReleaseStringPlatformChars(env, fontName, file);
}
}
@ -255,9 +216,10 @@ Java_sun_awt_Win32GraphicsEnvironment_deRegisterFontWithPlatform(JNIEnv *env,
jclass cl,
jstring fontName)
{
if (getWinVer() >= 5 && procRemoveFontResourceEx != NULL) {
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL);
(*procRemoveFontResourceEx)(file, FR_PRIVATE, NULL);
LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE);
if (file) {
::RemoveFontResourceEx(file, FR_PRIVATE, NULL);
JNU_ReleaseStringPlatformChars(env, fontName, file);
}
}

View File

@ -23,7 +23,7 @@
* have any questions.
*/
#include <windowsx.h>
#include "awt.h"
#include "awt_Component.h"
#include "awt_Container.h"
@ -32,7 +32,6 @@
#include "awt_Panel.h"
#include "awt_Toolkit.h"
#include "awt_Window.h"
#include "awt_dlls.h"
#include "awt_Win32GraphicsDevice.h"
#include "awt_BitmapUtil.h"
#include "awt_IconCursor.h"
@ -42,6 +41,8 @@
#include <java_awt_event_ComponentEvent.h>
#include "sun_awt_windows_WCanvasPeer.h"
#include <windowsx.h>
#if !defined(__int3264)
typedef __int32 LONG_PTR;
#endif // __int3264
@ -501,8 +502,7 @@ void AwtWindow::Show()
// which might involve tagging java.awt.Window instances with a semantic
// property so platforms can animate/decorate/etc accordingly.
//
if ((IS_WIN98 || IS_WIN2000) &&
JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0)
if (JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0)
{
// need this global ref to make the class unloadable (see 6500204)
static jclass windowsPopupWindowCls;
@ -535,13 +535,8 @@ void AwtWindow::Show()
windowType = env->GetIntField(target, windowTypeFID);
if (windowType == windowTYPES[TOOLTIP]) {
if (IS_WIN2000) {
SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0);
SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0);
} else {
// use same setting as menus
SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0);
}
SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0);
SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0);
if (animateflag) {
// AW_BLEND currently produces runtime parameter error
// animateStyle = fadeflag? AW_BLEND : AW_SLIDE | AW_VER_POSITIVE;
@ -551,13 +546,10 @@ void AwtWindow::Show()
windowType == windowTYPES[POPUPMENU]) {
SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0);
if (animateflag) {
if (IS_WIN2000) {
SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0);
if (fadeflag) {
// AW_BLEND currently produces runtime parameter error
//animateStyle = AW_BLEND;
}
SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0);
if (fadeflag) {
// AW_BLEND currently produces runtime parameter error
//animateStyle = AW_BLEND;
}
if (animateStyle == 0 && !fadeflag) {
animateStyle = AW_SLIDE;
@ -578,38 +570,18 @@ void AwtWindow::Show()
}
if (animateStyle != 0) {
load_user_procs();
if (fn_animate_window != NULL) {
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 {
// WM_PAINT is not automatically sent when invoking AnimateWindow,
// so force an expose event
RECT rect;
::GetWindowRect(hWnd,&rect);
::ScreenToClient(hWnd, (LPPOINT)&rect);
::InvalidateRect(hWnd,&rect,TRUE);
::UpdateWindow(hWnd);
done = TRUE;
}
BOOL result = ::AnimateWindow(hWnd, (DWORD)200, animateStyle);
if (!result) {
// TODO: log message
} else {
// WM_PAINT is not automatically sent when invoking AnimateWindow,
// so force an expose event
RECT rect;
::GetWindowRect(hWnd,&rect);
::ScreenToClient(hWnd, (LPPOINT)&rect);
::InvalidateRect(hWnd, &rect, TRUE);
::UpdateWindow(hWnd);
done = TRUE;
}
}
}
@ -1205,16 +1177,17 @@ MsgRouting AwtWindow::WmNcPaint(HRGN hrgn)
}
/* draw warning text */
LPWSTR text = TO_WSTRING(warningString);
LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL);
VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID);
VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID);
VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL);
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,
&r, text, static_cast<UINT>(wcslen(text)), NULL));
VERIFY(::RestoreDC(hDC, iSaveDC));
::ReleaseDC(GetHWnd(), hDC);
JNU_ReleaseStringPlatformChars(env, warningString, text);
}
env->DeleteLocalRef(target);
@ -1360,13 +1333,13 @@ void AwtWindow::RedrawNonClient()
}
int AwtWindow::GetScreenImOn() {
MHND hmon;
HMONITOR hmon;
int scrnNum;
hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULT_TO_PRIMARY);
hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY);
DASSERT(hmon != NULL);
scrnNum = AwtWin32GraphicsDevice::GetScreenFromMHND(hmon);
scrnNum = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hmon);
DASSERT(scrnNum > -1);
return scrnNum;
@ -1619,10 +1592,10 @@ void AwtWindow::_SetTitle(void *param)
if (::IsWindow(w->GetHWnd()))
{
int length = env->GetStringLength(title);
WCHAR *buffer = new WCHAR[length + 1];
env->GetStringRegion(title, 0, length, buffer);
TCHAR *buffer = new TCHAR[length + 1];
env->GetStringRegion(title, 0, length, reinterpret_cast<jchar*>(buffer));
buffer[length] = L'\0';
VERIFY(::SetWindowTextW(w->GetHWnd(), buffer));
VERIFY(::SetWindowText(w->GetHWnd(), buffer));
delete[] buffer;
}
ret:
@ -1967,13 +1940,11 @@ void AwtWindow::_SetFocusableWindow(void *param)
window->m_isFocusableWindow = isFocusableWindow;
if (IS_WIN2000) {
if (!window->m_isFocusableWindow) {
LONG isPopup = window->GetStyle() & WS_POPUP;
window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE);
} else {
window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE);
}
if (!window->m_isFocusableWindow) {
LONG isPopup = window->GetStyle() & WS_POPUP;
window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE);
} else {
window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE);
}
ret:

View File

@ -1,422 +0,0 @@
/*
* 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;
}

View File

@ -1,173 +0,0 @@
/*
* 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 */

View File

@ -182,18 +182,6 @@ extern const UINT SYSCOMMAND_IMM;
#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
enum {
// 6427323: unfortunately WM_APP+nnn conflicts with edit control messages

View File

@ -1,5 +1,5 @@
/*
* 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.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
#define _JNI_IMPLEMENTATION_
#include <jawt.h>
#include "awt.h"
#include "awt_DrawingSurface.h"
/*

View File

@ -1,12 +1,10 @@
/*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2008 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.
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@ -23,24 +21,29 @@
* have any questions.
*/
#include "awt.h"
/*
@test
@bug 6737722
@summary no tray support in headless mode
@author dmitry.cherepanov: area=awt.headless
@run main HeadlessTray
*/
import java.awt.*;
public class HeadlessTray
{
public static void main (String args[]) {
System.setProperty("java.awt.headless", "true");
// We expect the method returns false and no exception thrown
boolean isSupported = SystemTray.isSupported();
if (isSupported) {
throw new RuntimeException("Tray shouldn't be supported in headless mode ");
}
}
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);
}