aboutsummaryrefslogtreecommitdiffstats
path: root/src/nativewindow/native/win32
diff options
context:
space:
mode:
Diffstat (limited to 'src/nativewindow/native/win32')
-rw-r--r--src/nativewindow/native/win32/GDImisc.c226
-rw-r--r--src/nativewindow/native/win32/WindowsDWM.c95
-rw-r--r--src/nativewindow/native/win32/WindowsDWM.h32
3 files changed, 353 insertions, 0 deletions
diff --git a/src/nativewindow/native/win32/GDImisc.c b/src/nativewindow/native/win32/GDImisc.c
new file mode 100644
index 000000000..3ab7f9859
--- /dev/null
+++ b/src/nativewindow/native/win32/GDImisc.c
@@ -0,0 +1,226 @@
+#include <jni.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+#include <wingdi.h>
+#include <stddef.h>
+
+#include <gluegen_stdint.h>
+
+#include <stdio.h>
+
+#include "NativewindowCommon.h"
+#include "jogamp_nativewindow_windows_GDIUtil.h"
+
+// #define VERBOSE_ON 1
+
+#ifdef VERBOSE_ON
+ #define DBG_PRINT(args...) fprintf(stderr, args);
+#else
+ #define DBG_PRINT(args...)
+#endif
+
+static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point";
+static const char * const ClazzAnyCstrName = "<init>";
+static const char * const ClazzNamePointCstrSignature = "(II)V";
+
+static jclass pointClz = NULL;
+static jmethodID pointCstr = NULL;
+
+HINSTANCE GetApplicationHandle() {
+ return GetModuleHandle(NULL);
+}
+
+/* Java->C glue code:
+ * Java package: jogamp.nativewindow.windows.GDIUtil
+ * Java method: boolean CreateWindowClass(long hInstance, java.lang.String clazzName, long wndProc)
+ * C function: BOOL CreateWindowClass(HANDLE hInstance, LPCSTR clazzName, HANDLE wndProc);
+ */
+JNIEXPORT jboolean JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_CreateWindowClass
+ (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName, jlong wndProc)
+{
+ HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+ const TCHAR* clazzName = NULL;
+ WNDCLASS wc;
+ jboolean res;
+
+#ifdef UNICODE
+ clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
+#else
+ clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
+#endif
+
+ ZeroMemory( &wc, sizeof( wc ) );
+ if( GetClassInfo( hInstance, clazzName, &wc ) ) {
+ // registered already
+ res = JNI_TRUE;
+ } else {
+ // register now
+ ZeroMemory( &wc, sizeof( wc ) );
+ wc.style = CS_HREDRAW | CS_VREDRAW ;
+ wc.lpfnWndProc = (WNDPROC) (intptr_t) wndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInstance;
+ wc.hIcon = NULL;
+ wc.hCursor = LoadCursor( NULL, IDC_ARROW);
+ wc.hbrBackground = NULL; // no background paint - GetStockObject(BLACK_BRUSH);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = clazzName;
+ res = ( 0 != RegisterClass( &wc ) ) ? JNI_TRUE : JNI_FALSE ;
+ }
+
+#ifdef UNICODE
+ free((void*) clazzName);
+#else
+ (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
+#endif
+
+ return res;
+}
+
+/* Java->C glue code:
+ * Java package: jogamp.nativewindow.windows.GDIUtil
+ * Java method: boolean DestroyWindowClass(long hInstance, java.lang.String className)
+ * C function: BOOL DestroyWindowClass(HANDLE hInstance, LPCSTR className);
+ */
+JNIEXPORT jboolean JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_DestroyWindowClass
+ (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName)
+{
+ HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+ const TCHAR* clazzName = NULL;
+ jboolean res;
+
+#ifdef UNICODE
+ clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName);
+#else
+ clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL);
+#endif
+
+ res = ( 0 != UnregisterClass( clazzName, hInstance ) ) ? JNI_TRUE : JNI_FALSE ;
+
+#ifdef UNICODE
+ free((void*) clazzName);
+#else
+ (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName);
+#endif
+
+ return res;
+}
+
+
+/* Java->C glue code:
+ * Java package: jogamp.nativewindow.windows.GDIUtil
+ * Java method: long CreateDummyWindow0(long hInstance, java.lang.String className, java.lang.String windowName, int x, int y, int width, int height)
+ * C function: HANDLE CreateDummyWindow0(HANDLE hInstance, LPCSTR className, LPCSTR windowName, int x, int y, int width, int height);
+ */
+JNIEXPORT jlong JNICALL
+Java_jogamp_nativewindow_windows_GDIUtil_CreateDummyWindow0
+ (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jWndClassName, jstring jWndName, jint x, jint y, jint width, jint height)
+{
+ HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance;
+ const TCHAR* wndClassName = NULL;
+ const TCHAR* wndName = NULL;
+ DWORD dwExStyle;
+ DWORD dwStyle;
+ HWND hWnd;
+
+#ifdef UNICODE
+ wndClassName = NewtCommon_GetNullTerminatedStringChars(env, jWndClassName);
+ wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName);
+#else
+ wndClassName = (*env)->GetStringUTFChars(env, jWndClassName, NULL);
+ wndName = (*env)->GetStringUTFChars(env, jWndName, NULL);
+#endif
+
+ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ dwStyle = WS_OVERLAPPEDWINDOW;
+
+ hWnd = CreateWindowEx( dwExStyle,
+ wndClassName,
+ wndName,
+ dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+ x, y, width, height,
+ NULL, NULL, hInstance, NULL );
+
+#ifdef UNICODE
+ free((void*) wndClassName);
+ free((void*) wndName);
+#else
+ (*env)->ReleaseStringUTFChars(env, jWndClassName, wndClassName);
+ (*env)->ReleaseStringUTFChars(env, jWndName, wndName);
+#endif
+
+ return (jlong) (intptr_t) hWnd;
+}
+
+
+/*
+ * Class: jogamp_nativewindow_windows_GDIUtil
+ * Method: initIDs0
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_windows_GDIUtil_initIDs0
+ (JNIEnv *env, jclass clazz)
+{
+ if(NativewindowCommon_init(env)) {
+ jclass c = (*env)->FindClass(env, ClazzNamePoint);
+ if(NULL==c) {
+ NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't find %s", ClazzNamePoint);
+ }
+ pointClz = (jclass)(*env)->NewGlobalRef(env, c);
+ (*env)->DeleteLocalRef(env, c);
+ if(NULL==pointClz) {
+ NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't use %s", ClazzNamePoint);
+ }
+ pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature);
+ if(NULL==pointCstr) {
+ NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't fetch %s.%s %s",
+ ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature);
+ }
+ }
+ return JNI_TRUE;
+}
+
+LRESULT CALLBACK DummyWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+ return DefWindowProc(hWnd,uMsg,wParam,lParam);
+}
+
+/*
+ * Class: jogamp_nativewindow_windows_GDIUtil
+ * Method: getDummyWndProc0
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_windows_GDIUtil_getDummyWndProc0
+ (JNIEnv *env, jclass clazz)
+{
+ return (jlong) (intptr_t) DummyWndProc;
+}
+
+/*
+ * Class: jogamp_nativewindow_windows_GDIUtil
+ * Method: GetRelativeLocation0
+ * Signature: (JJII)Ljavax/media/nativewindow/util/Point;
+ */
+JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_windows_GDIUtil_GetRelativeLocation0
+ (JNIEnv *env, jclass unused, jlong jsrc_win, jlong jdest_win, jint src_x, jint src_y)
+{
+ HWND src_win = (HWND) (intptr_t) jsrc_win;
+ HWND dest_win = (HWND) (intptr_t) jdest_win;
+ POINT dest = { src_x, src_y } ;
+ int res;
+
+ res = MapWindowPoints(src_win, dest_win, &dest, 1);
+
+ DBG_PRINT("*** WindowsWindow: getRelativeLocation0: %p %d/%d -> %p %d/%d - ok: %d\n",
+ (void*)src_win, src_x, src_y, (void*)dest_win, (int)dest.x, (int)dest.y, res);
+
+ return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest.x, (jint)dest.y);
+}
+
diff --git a/src/nativewindow/native/win32/WindowsDWM.c b/src/nativewindow/native/win32/WindowsDWM.c
new file mode 100644
index 000000000..cc9ed6d8c
--- /dev/null
+++ b/src/nativewindow/native/win32/WindowsDWM.c
@@ -0,0 +1,95 @@
+
+#include "WindowsDWM.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+// #define VERBOSE_ON 1
+
+#ifdef VERBOSE_ON
+ #define DBG_PRINT(args...) fprintf(stderr, args);
+#else
+ #define DBG_PRINT(args...)
+#endif
+
+/* GetProcAddress doesn't exist in A/W variants under desktop Windows */
+#ifndef UNDER_CE
+#define GetProcAddressA GetProcAddress
+#endif
+
+typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction);
+typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled);
+typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind);
+typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset);
+
+static int _init = 0; // 1: init, 2: has DWM extension
+static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL;
+static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL;
+static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL;
+static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL;
+
+static int initWindowsDWM() {
+ if(0 == _init) {
+ _init = 1;
+ HANDLE shell = LoadLibrary(TEXT("dwmapi.dll"));
+ if (shell) {
+ _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition");
+ _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled");
+ _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow");
+ _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea");
+ if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled &&
+ NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) {
+ _init = 2;
+ }
+ }
+ // FreeLibrary (shell);
+ DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea);
+ }
+ return _init;
+}
+
+BOOL DwmIsExtensionAvailable() {
+ return (2 == initWindowsDWM()) ? TRUE : FALSE;
+}
+
+BOOL DwmIsCompositionEnabled( ) {
+ if(2 == initWindowsDWM()) {
+ BOOL fEnabled = FALSE;
+ if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) {
+ DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled);
+ return fEnabled;
+ }
+ }
+ DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n");
+ return FALSE;
+}
+
+BOOL DwmEnableComposition( UINT uCompositionAction ) {
+ if(2 == initWindowsDWM()) {
+ return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE;
+ }
+ return FALSE;
+}
+
+BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) {
+ if(2 == initWindowsDWM()) {
+ _DwmEnableBlurBehindWindow(hwnd, pBlurBehind);
+ DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n",
+ (void *)hwnd,
+ (int) pBlurBehind->dwFlags,
+ (int) pBlurBehind->fEnable,
+ (void *)pBlurBehind->hRgnBlur);
+ return TRUE;
+ }
+ DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n");
+ return FALSE;
+}
+
+BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) {
+ if(2 == initWindowsDWM()) {
+ _DwmExtendFrameIntoClientArea(hwnd, pMarInset);
+ return TRUE;
+ }
+ return FALSE;
+}
+
diff --git a/src/nativewindow/native/win32/WindowsDWM.h b/src/nativewindow/native/win32/WindowsDWM.h
new file mode 100644
index 000000000..36f82fc94
--- /dev/null
+++ b/src/nativewindow/native/win32/WindowsDWM.h
@@ -0,0 +1,32 @@
+#ifndef _WINDOWS_DWM_H_
+#define _WINDOWS_DWM_H_
+
+ #include <windows.h>
+
+ #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified
+ #define DWM_EC_DISABLECOMPOSITION 0
+ #define DWM_EC_ENABLECOMPOSITION 1
+
+ typedef struct _DWM_BLURBEHIND
+ {
+ DWORD dwFlags;
+ BOOL fEnable;
+ HRGN hRgnBlur;
+ BOOL fTransitionOnMaximized;
+ } DWM_BLURBEHIND, *PDWM_BLURBEHIND;
+
+ typedef struct _MARGINS
+ {
+ int cxLeftWidth; // width of left border that retains its size
+ int cxRightWidth; // width of right border that retains its size
+ int cyTopHeight; // height of top border that retains its size
+ int cyBottomHeight; // height of bottom border that retains its size
+ } MARGINS, *PMARGINS;
+
+ BOOL DwmIsExtensionAvailable();
+ BOOL DwmIsCompositionEnabled();
+ BOOL DwmEnableComposition( UINT uCompositionAction );
+ BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind);
+ BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset);
+
+#endif /* _WINDOWS_DWM_H_ */