Merge
This commit is contained in:
commit
e1f54b3780
@ -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
|
||||
|
@ -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
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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:");
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -23,6 +23,8 @@
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
#include "D3DPipeline.h"
|
||||
|
||||
#include "sun_java2d_d3d_D3DRenderer.h"
|
||||
|
||||
#include "D3DContext.h"
|
||||
|
@ -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"
|
||||
|
@ -23,6 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
#include "awt.h"
|
||||
#include <sun_java2d_windows_GDIBlitLoops.h>
|
||||
#include "gdefs.h"
|
||||
#include "Trace.h"
|
||||
|
@ -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)
|
||||
|
@ -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) ) {
|
||||
|
@ -23,8 +23,6 @@
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
|
||||
#include <jni.h>
|
||||
#include <awt.h>
|
||||
#include "Trace.h"
|
||||
#include "WindowsFlags.h"
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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.");
|
||||
|
@ -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_
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
@ -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; }
|
||||
};
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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" {
|
||||
|
||||
/************************************************************************
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
*/
|
||||
|
||||
#define _JNI_IMPLEMENTATION_
|
||||
|
||||
#include "awt.h"
|
||||
#include "awt_DrawingSurface.h"
|
||||
#include "awt_Component.h"
|
||||
|
||||
|
@ -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)));
|
||||
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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>(
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
);
|
||||
}
|
@ -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 */
|
@ -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);
|
||||
|
@ -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
|
@ -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. */
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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)>e, (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;
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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())
|
||||
|
@ -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)");
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
@ -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 */
|
@ -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
|
||||
|
@ -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"
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user