Skip to content

[Win32] Move OS-version-related functionality to OsVersion class #2099

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 0 additions & 36 deletions bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os.c
Original file line number Diff line number Diff line change
Expand Up @@ -6519,18 +6519,6 @@ JNIEXPORT void JNICALL OS_NATIVE(NotifyWinEvent)
}
#endif

#ifndef NO_OSVERSIONINFOEX_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(OSVERSIONINFOEX_1sizeof)
(JNIEnv *env, jclass that)
{
jint rc = 0;
OS_NATIVE_ENTER(env, that, OSVERSIONINFOEX_1sizeof_FUNC);
rc = (jint)OSVERSIONINFOEX_sizeof();
OS_NATIVE_EXIT(env, that, OSVERSIONINFOEX_1sizeof_FUNC);
return rc;
}
#endif

#ifndef NO_OUTLINETEXTMETRIC_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(OUTLINETEXTMETRIC_1sizeof)
(JNIEnv *env, jclass that)
Expand Down Expand Up @@ -7322,30 +7310,6 @@ JNIEXPORT jboolean JNICALL OS_NATIVE(RoundRect)
}
#endif

#ifndef NO_RtlGetVersion
JNIEXPORT jint JNICALL OS_NATIVE(RtlGetVersion)
(JNIEnv *env, jclass that, jobject arg0)
{
OSVERSIONINFOEX _arg0, *lparg0=NULL;
jint rc = 0;
OS_NATIVE_ENTER(env, that, RtlGetVersion_FUNC);
if (arg0) if ((lparg0 = getOSVERSIONINFOEXFields(env, arg0, &_arg0)) == NULL) goto fail;
/*
rc = (jint)RtlGetVersion(lparg0);
*/
{
OS_LOAD_FUNCTION(fp, RtlGetVersion)
if (fp) {
rc = (jint)((jint (CALLING_CONVENTION*)(OSVERSIONINFOEX *))fp)(lparg0);
}
}
fail:
if (arg0 && lparg0) setOSVERSIONINFOEXFields(env, arg0, lparg0);
OS_NATIVE_EXIT(env, that, RtlGetVersion_FUNC);
return rc;
}
#endif

#ifndef NO_SAFEARRAYBOUND_1sizeof
JNIEXPORT jint JNICALL OS_NATIVE(SAFEARRAYBOUND_1sizeof)
(JNIEnv *env, jclass that)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,6 @@ typedef enum {
NONCLIENTMETRICS_1sizeof_FUNC,
NOTIFYICONDATA_1V2_1SIZE_FUNC,
NotifyWinEvent_FUNC,
OSVERSIONINFOEX_1sizeof_FUNC,
OUTLINETEXTMETRIC_1sizeof_FUNC,
OffsetRect_FUNC,
OffsetRgn_FUNC,
Expand Down Expand Up @@ -554,7 +553,6 @@ typedef enum {
ReplyMessage_FUNC,
RestoreDC_FUNC,
RoundRect_FUNC,
RtlGetVersion_FUNC,
SAFEARRAYBOUND_1sizeof_FUNC,
SAFEARRAY_1sizeof_FUNC,
SCRIPT_1ANALYSIS_1sizeof_FUNC,
Expand Down
67 changes: 0 additions & 67 deletions bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.c
Original file line number Diff line number Diff line change
Expand Up @@ -4213,73 +4213,6 @@ void setNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpSt
}
#endif

#ifndef NO_OSVERSIONINFOEX
typedef struct OSVERSIONINFOEX_FID_CACHE {
int cached;
jclass clazz;
jfieldID dwOSVersionInfoSize, dwMajorVersion, dwMinorVersion, dwBuildNumber, dwPlatformId, szCSDVersion, wServicePackMajor, wServicePackMinor, wSuiteMask, wProductType, wReserved;
} OSVERSIONINFOEX_FID_CACHE;

OSVERSIONINFOEX_FID_CACHE OSVERSIONINFOEXFc;

void cacheOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject)
{
if (OSVERSIONINFOEXFc.cached) return;
OSVERSIONINFOEXFc.clazz = (*env)->GetObjectClass(env, lpObject);
OSVERSIONINFOEXFc.dwOSVersionInfoSize = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "dwOSVersionInfoSize", "I");
OSVERSIONINFOEXFc.dwMajorVersion = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "dwMajorVersion", "I");
OSVERSIONINFOEXFc.dwMinorVersion = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "dwMinorVersion", "I");
OSVERSIONINFOEXFc.dwBuildNumber = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "dwBuildNumber", "I");
OSVERSIONINFOEXFc.dwPlatformId = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "dwPlatformId", "I");
OSVERSIONINFOEXFc.szCSDVersion = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "szCSDVersion", "[C");
OSVERSIONINFOEXFc.wServicePackMajor = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "wServicePackMajor", "I");
OSVERSIONINFOEXFc.wServicePackMinor = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "wServicePackMinor", "I");
OSVERSIONINFOEXFc.wSuiteMask = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "wSuiteMask", "I");
OSVERSIONINFOEXFc.wProductType = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "wProductType", "I");
OSVERSIONINFOEXFc.wReserved = (*env)->GetFieldID(env, OSVERSIONINFOEXFc.clazz, "wReserved", "I");
OSVERSIONINFOEXFc.cached = 1;
}

OSVERSIONINFOEX *getOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject, OSVERSIONINFOEX *lpStruct)
{
if (!OSVERSIONINFOEXFc.cached) cacheOSVERSIONINFOEXFields(env, lpObject);
lpStruct->dwOSVersionInfoSize = (*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.dwOSVersionInfoSize);
lpStruct->dwMajorVersion = (*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.dwMajorVersion);
lpStruct->dwMinorVersion = (*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.dwMinorVersion);
lpStruct->dwBuildNumber = (*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.dwBuildNumber);
lpStruct->dwPlatformId = (*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.dwPlatformId);
{
jcharArray lpObject1 = (jcharArray)(*env)->GetObjectField(env, lpObject, OSVERSIONINFOEXFc.szCSDVersion);
(*env)->GetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szCSDVersion) / sizeof(jchar), (jchar *)lpStruct->szCSDVersion);
}
lpStruct->wServicePackMajor = (WORD)(*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.wServicePackMajor);
lpStruct->wServicePackMinor = (WORD)(*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.wServicePackMinor);
lpStruct->wSuiteMask = (WORD)(*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.wSuiteMask);
lpStruct->wProductType = (BYTE)(*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.wProductType);
lpStruct->wReserved = (BYTE)(*env)->GetIntField(env, lpObject, OSVERSIONINFOEXFc.wReserved);
return lpStruct;
}

void setOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject, OSVERSIONINFOEX *lpStruct)
{
if (!OSVERSIONINFOEXFc.cached) cacheOSVERSIONINFOEXFields(env, lpObject);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.dwOSVersionInfoSize, (jint)lpStruct->dwOSVersionInfoSize);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.dwMajorVersion, (jint)lpStruct->dwMajorVersion);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.dwMinorVersion, (jint)lpStruct->dwMinorVersion);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.dwBuildNumber, (jint)lpStruct->dwBuildNumber);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.dwPlatformId, (jint)lpStruct->dwPlatformId);
{
jcharArray lpObject1 = (jcharArray)(*env)->GetObjectField(env, lpObject, OSVERSIONINFOEXFc.szCSDVersion);
(*env)->SetCharArrayRegion(env, lpObject1, 0, sizeof(lpStruct->szCSDVersion) / sizeof(jchar), (jchar *)lpStruct->szCSDVersion);
}
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.wServicePackMajor, (jint)lpStruct->wServicePackMajor);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.wServicePackMinor, (jint)lpStruct->wServicePackMinor);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.wSuiteMask, (jint)lpStruct->wSuiteMask);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.wProductType, (jint)lpStruct->wProductType);
(*env)->SetIntField(env, lpObject, OSVERSIONINFOEXFc.wReserved, (jint)lpStruct->wReserved);
}
#endif

#ifndef NO_OUTLINETEXTMETRIC
typedef struct OUTLINETEXTMETRIC_FID_CACHE {
int cached;
Expand Down
12 changes: 0 additions & 12 deletions bundles/org.eclipse.swt/Eclipse SWT PI/win32/library/os_structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -965,18 +965,6 @@ void setNOTIFYICONDATAFields(JNIEnv *env, jobject lpObject, NOTIFYICONDATA *lpSt
#define NOTIFYICONDATA_sizeof() 0
#endif

#ifndef NO_OSVERSIONINFOEX
void cacheOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject);
OSVERSIONINFOEX *getOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject, OSVERSIONINFOEX *lpStruct);
void setOSVERSIONINFOEXFields(JNIEnv *env, jobject lpObject, OSVERSIONINFOEX *lpStruct);
#define OSVERSIONINFOEX_sizeof() sizeof(OSVERSIONINFOEX)
#else
#define cacheOSVERSIONINFOEXFields(a,b)
#define getOSVERSIONINFOEXFields(a,b,c) NULL
#define setOSVERSIONINFOEXFields(a,b,c)
#define OSVERSIONINFOEX_sizeof() 0
#endif

#ifndef NO_OUTLINETEXTMETRIC
void cacheOUTLINETEXTMETRICFields(JNIEnv *env, jobject lpObject);
OUTLINETEXTMETRIC *getOUTLINETEXTMETRICFields(JNIEnv *env, jobject lpObject, OUTLINETEXTMETRIC *lpStruct);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.win32.version.*;
import org.eclipse.swt.widgets.*;

public class OS extends C {
Expand All @@ -30,18 +31,6 @@ public class OS extends C {
* SWT Windows flags
*/
public static final boolean IsDBLocale;
/**
* Always reports the correct build number, regardless of manifest and
* compatibility GUIDs. Note that build number alone is sufficient to
* identify Windows version.
*/
public static final int WIN32_BUILD;
/**
* Values taken from https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
*/
public static final int WIN32_BUILD_WIN10_1809 = 17763; // "Windows 10 October 2018 Update"
public static final int WIN32_BUILD_WIN10_2004 = 19041; // "Windows 10 May 2020 Update"
public static final int WIN32_BUILD_WIN11_21H2 = 22000; // Initial Windows 11 release

public static final String NO_MANIFEST = "org.eclipse.swt.internal.win32.OS.NO_MANIFEST";

Expand All @@ -53,20 +42,6 @@ public class OS extends C {
public static final int SM_IMMENABLED = 0x52;

static {
/*
* Starting with Windows 10, GetVersionEx() lies about version unless
* application manifest has a proper entry. RtlGetVersion() always
* reports true version.
*/
OSVERSIONINFOEX osVersionInfoEx = new OSVERSIONINFOEX ();
osVersionInfoEx.dwOSVersionInfoSize = OSVERSIONINFOEX.sizeof;
if (0 == OS.RtlGetVersion (osVersionInfoEx)) {
WIN32_BUILD = osVersionInfoEx.dwBuildNumber;
} else {
System.err.println ("SWT: OS: Failed to detect Windows build number");
WIN32_BUILD = 0;
}

/* Load the manifest to force the XP Theme */
if (System.getProperty (NO_MANIFEST) == null) {
ACTCTX pActCtx = new ACTCTX ();
Expand Down Expand Up @@ -1974,7 +1949,6 @@ public static int VERSION (int major, int minor) {
/** @method flags=const */
public static final native int NOTIFYICONDATA_V2_SIZE ();
public static final native int OUTLINETEXTMETRIC_sizeof ();
public static final native int OSVERSIONINFOEX_sizeof ();
public static final native int PAINTSTRUCT_sizeof ();
public static final native int POINT_sizeof ();
public static final native int PRINTDLG_sizeof ();
Expand Down Expand Up @@ -3964,8 +3938,6 @@ public static int HRESULT_FROM_WIN32(int x) {
public static final native boolean RestoreDC (long hdc, int nSavedDC);
/** @param hdc cast=(HDC) */
public static final native boolean RoundRect (long hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidth, int nHeight);
/** @method flags=dynamic */
public static final native int RtlGetVersion (OSVERSIONINFOEX lpVersionInformation);
/** @param hdc cast=(HDC) */
public static final native int SaveDC (long hdc);
/** @param hWnd cast=(HWND) */
Expand Down Expand Up @@ -4616,7 +4588,7 @@ public static final native boolean DuplicateHandle(long hSourceProcessHandle, lo


public static long OpenThemeData(long hwnd, char[] themeName, int dpi) {
if (OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN10_1809) {
if (OsVersion.IS_WIN10_1809) {
return OS.OpenThemeDataForDpi(hwnd, themeName, dpi);
} else {
return OS.OpenThemeData(hwnd, themeName);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,25 @@ public class OsVersion extends Platform {
* compatibility GUIDs. Note that build number alone is sufficient to
* identify Windows version.
*/
public static final int WIN32_BUILD;
private static final int WIN32_BUILD = getCurrentOsVersion();

/**
* Values taken from https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
*/
public static final int WIN32_BUILD_WIN10_1607 = 14393; // "Windows 10 August 2016 Update"
private static final int WIN10_1607 = 14393;
public static final boolean IS_WIN10_1607 = WIN32_BUILD >= WIN10_1607; // "Windows 10 August 2016 Update"
public static final boolean IS_WIN10_1809 = WIN32_BUILD >= 17763; // "Windows 10 October 2018 Update"
public static final boolean IS_WIN10_2004 = WIN32_BUILD >= 19041; // "Windows 10 May 2020 Update"
public static final boolean IS_WIN11_21H2 = WIN32_BUILD >= 22000; // Initial Windows 11 release

/**
* The minimum supported Windows build version for using this SWT version
*/
public static final int WIN32_MINIMUM_COMPATIBLE_BUILD = WIN32_BUILD_WIN10_1607;
private static final int MINIMUM_COMPATIBLE_BUILD = WIN10_1607;

private static final String DISABLE_WINDOWS_VERSION_CHECK_PROPERTY = "swt.disableWindowsVersionCheck";

static {
private static int getCurrentOsVersion() {
/*
* Starting with Windows 10, GetVersionEx() lies about version unless
* application manifest has a proper entry. RtlGetVersion() always
Expand All @@ -53,19 +58,19 @@ public class OsVersion extends Platform {
OSVERSIONINFOEX osVersionInfoEx = new OSVERSIONINFOEX ();
osVersionInfoEx.dwOSVersionInfoSize = OSVERSIONINFOEX.sizeof;
if (0 == OsVersion.RtlGetVersion (osVersionInfoEx)) {
WIN32_BUILD = osVersionInfoEx.dwBuildNumber;
return osVersionInfoEx.dwBuildNumber;
} else {
System.err.println ("SWT: OS: Failed to detect Windows build number");
WIN32_BUILD = 0;
return 0;
}
}

public static void checkCompatibleWindowsVersion() {
String disableVersionCheckPropertyValue = System.getProperty(DISABLE_WINDOWS_VERSION_CHECK_PROPERTY, Boolean.FALSE.toString());
boolean versionCheckDisabled = "".equals(disableVersionCheckPropertyValue) || Boolean.TRUE.toString().equalsIgnoreCase(disableVersionCheckPropertyValue);
if (!versionCheckDisabled && WIN32_BUILD < WIN32_MINIMUM_COMPATIBLE_BUILD) {
if (!versionCheckDisabled && WIN32_BUILD < MINIMUM_COMPATIBLE_BUILD) {
System.err.println(String.format("Incompatible OS: Minimum Windows build version is %s but current is %s",
WIN32_MINIMUM_COMPATIBLE_BUILD, WIN32_BUILD));
MINIMUM_COMPATIBLE_BUILD, WIN32_BUILD));
System.exit(1);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.win32.*;
import org.eclipse.swt.internal.win32.version.*;

/**
* Instances of this class represent a selectable user interface object that
Expand Down Expand Up @@ -1351,7 +1352,7 @@ LRESULT wmNotifyChild (NMHDR hdr, long wParam, long lParam) {

int inset = 2;
int radius = 3;
if (useDarkModeExplorerTheme && (OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN11_21H2)) {
if (useDarkModeExplorerTheme && OsVersion.IS_WIN11_21H2) {
// On Win11, Light theme and Dark theme images have different sizes
inset = 1;
radius = 4;
Expand All @@ -1362,7 +1363,7 @@ LRESULT wmNotifyChild (NMHDR hdr, long wParam, long lParam) {
int r = nmcd.right - inset;
int b = nmcd.bottom - inset;

if (OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN11_21H2) {
if (OsVersion.IS_WIN11_21H2) {
// 'RoundRect' has left/top pixel reserved for border
l += 1;
t += 1;
Expand Down Expand Up @@ -1488,7 +1489,7 @@ static int getThemeStateId(int style, boolean pressed, boolean enabled) {
* The workaround is to use hot image in place of default.
*/
boolean hot = false;
if (OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN11_21H2) {
if (OsVersion.IS_WIN11_21H2) {
if (!pressed && enabled) {
hot = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.ole.win32.*;
import org.eclipse.swt.internal.win32.*;
import org.eclipse.swt.internal.win32.version.*;

/**
* Instances of this class are responsible for managing the
Expand Down Expand Up @@ -2158,7 +2159,7 @@ public static boolean isSystemDarkTheme () {
/*
* The registry settings, and Dark Theme itself, is present since Win10 1809
*/
if (OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN10_1809) {
if (OsVersion.IS_WIN10_1809) {
int[] result = OS.readRegistryDwords(OS.HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", "AppsUseLightTheme");
if (result!=null) {
Expand Down Expand Up @@ -5397,7 +5398,7 @@ private boolean setDPIAwareness(int desiredDpiAwareness) {
}
if (desiredDpiAwareness == OS.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) {
// "Per Monitor V2" only available in more recent Windows version
boolean perMonitorV2Available = OS.WIN32_BUILD >= OS.WIN32_BUILD_WIN10_1809;
boolean perMonitorV2Available = OsVersion.IS_WIN10_1809;
if (!perMonitorV2Available) {
System.err.println("***WARNING: the OS version does not support DPI awareness mode PerMonitorV2.");
return false;
Expand Down
Loading
Loading