/* * Class: com_sun_javafx_newt_windows_WindowsWindow * Method: setSize0 * Signature: (JII)V */ JNIEXPORT void JNICALL Java_com_sun_javafx_newt_windows_WindowsWindow_setSize0 (JNIEnv *env, jobject obj, jlong parent, jlong window, jint x, jint y, jint width, jint height) { HWND hwndP = (HWND) (intptr_t) parent; HWND hwnd = (HWND) (intptr_t) window; int nWidth=width, nHeight=height; int nX=x, nY=y; if(NULL==hwndP) { // since width, height are the size of the client area, we need to add // insets RECT *pInsets = UpdateInsets(env, hwnd, obj); RECT r; GetWindowRect(hwnd, &r); nWidth = width + pInsets->left + pInsets->right; nHeight = height + pInsets->top + pInsets->bottom; nX=r.left; nY=r.top; // FIXME: really ? } DBG_PRINT("*** WindowsWindow: setSize parent %p, window %p, %d/%d %dx%d -> %d/%d %dx%d\n", hwndP, hwnd, x, y, width, height, nX, nY, nWidth, nHeight); MoveWindow(hwnd, nX, nY, nWidth, nHeight, TRUE); // we report back the size of client area (*env)->CallVoidMethod(env, obj, sizeChangedID, (jint) width, (jint) height); }
static void WmSize(JNIEnv *env, HWND wnd, jobject window, UINT type) { RECT rc; int w, h; // make sure insets are up to date (void)UpdateInsets(env, wnd, window); if (type == SIZE_MINIMIZED) { // TODO: deal with minimized window sizing return; } GetClientRect(wnd, &rc); // we report back the dimensions of the client area w = rc.right - rc.left; h = rc.bottom - rc.top; (*env)->CallVoidMethod(env, window, sizeChangedID, w, h); }
static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) { int useDefWindowProc = 0; JNIEnv *env = NULL; jobject window = NULL; BOOL isKeyDown = FALSE; WindowUserData * wud; #if defined(UNDER_CE) || _MSC_VER <= 1200 wud = (WindowUserData *) GetWindowLong(wnd, GWL_USERDATA); #else wud = (WindowUserData *) GetWindowLongPtr(wnd, GWLP_USERDATA); #endif if(NULL==wud) { return DefWindowProc(wnd, message, wParam, lParam); } env = wud->jenv; window = wud->jinstance; if (NULL==window || NULL==env) { return DefWindowProc(wnd, message, wParam, lParam); } // DBG_PRINT("*** WindowsWindow: window %p -> %p, 0x%X %d/%d\n", wnd, window, message, (int)LOWORD(lParam), (int)HIWORD(lParam)); switch (message) { // // The signal pipeline for destruction is: // Java::DestroyWindow(wnd) _or_ window-close-button -> // WM_CLOSE -> Java::windowDestroyNotify -> W_DESTROY -> Java::windowDestroyed -> // Java::CleanupWindowResources() case WM_CLOSE: (*env)->CallVoidMethod(env, window, windowDestroyNotifyID); break; case WM_DESTROY: { #if defined(UNDER_CE) || _MSC_VER <= 1200 SetWindowLong(wnd, GWL_USERDATA, (intptr_t) NULL); #else SetWindowLongPtr(wnd, GWLP_USERDATA, (intptr_t) NULL); #endif free(wud); wud=NULL; (*env)->CallVoidMethod(env, window, windowDestroyedID); (*env)->DeleteGlobalRef(env, window); } break; case WM_SYSCHAR: useDefWindowProc = WmChar(env, window, wParam, LOWORD(lParam), HIWORD(lParam), FALSE); break; case WM_CHAR: useDefWindowProc = WmChar(env, window, wParam, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_KEYDOWN: useDefWindowProc = WmKeyDown(env, window, wParam, LOWORD(lParam), HIWORD(lParam), FALSE); break; case WM_KEYUP: useDefWindowProc = WmKeyUp(env, window, wParam, LOWORD(lParam), HIWORD(lParam), FALSE); break; case WM_SIZE: WmSize(env, wnd, window, (UINT)wParam); break; case WM_SETTINGCHANGE: if (wParam == SPI_SETNONCLIENTMETRICS) { // make sure insets are updated, we don't need to resize the window // because the size of the client area doesn't change (void)UpdateInsets(env, wnd, window); } else { useDefWindowProc = 1; } break; case WM_LBUTTONDOWN: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_PRESSED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 1, (jint) 0); useDefWindowProc = 1; break; case WM_LBUTTONUP: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_RELEASED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 1, (jint) 0); useDefWindowProc = 1; break; case WM_MBUTTONDOWN: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_PRESSED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 2, (jint) 0); useDefWindowProc = 1; break; case WM_MBUTTONUP: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_RELEASED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 2, (jint) 0); useDefWindowProc = 1; break; case WM_RBUTTONDOWN: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_PRESSED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 3, (jint) 0); useDefWindowProc = 1; break; case WM_RBUTTONUP: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_RELEASED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 3, (jint) 0); useDefWindowProc = 1; break; case WM_MOUSEMOVE: (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_MOVED, GetModifiers(), (jint) LOWORD(lParam), (jint) HIWORD(lParam), (jint) 0, (jint) 0); useDefWindowProc = 1; break; case WM_MOUSEWHEEL: { // need to convert the coordinates to component-relative int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); POINT eventPt; eventPt.x = x; eventPt.y = y; ScreenToClient(wnd, &eventPt); (*env)->CallVoidMethod(env, window, sendMouseEventID, (jint) EVENT_MOUSE_WHEEL_MOVED, GetModifiers(), (jint) eventPt.x, (jint) eventPt.y, (jint) 0, (jint) (GET_WHEEL_DELTA_WPARAM(wParam)/120.0f)); useDefWindowProc = 1; break; } case WM_SETFOCUS: (*env)->CallVoidMethod(env, window, focusChangedID, (jlong)wParam, JNI_TRUE); useDefWindowProc = 1; break; case WM_KILLFOCUS: (*env)->CallVoidMethod(env, window, focusChangedID, (jlong)wParam, JNI_FALSE); useDefWindowProc = 1; break; case WM_MOVE: DBG_PRINT("*** WindowsWindow: WM_MOVE window %p, %d/%d\n", wnd, (int)LOWORD(lParam), (int)HIWORD(lParam)); (*env)->CallVoidMethod(env, window, positionChangedID, (jint)LOWORD(lParam), (jint)HIWORD(lParam)); useDefWindowProc = 1; break; case WM_PAINT: { RECT r; if (GetUpdateRect(wnd, &r, FALSE)) { if ((r.right-r.left) > 0 && (r.bottom-r.top) > 0) { (*env)->CallVoidMethod(env, window, sendPaintEventID, 0, r.left, r.top, r.right-r.left, r.bottom-r.top); } ValidateRect(wnd, &r); useDefWindowProc = 0; } else { useDefWindowProc = 1; } break; } case WM_ERASEBKGND: // ignore erase background useDefWindowProc = 0; break; // FIXME: generate EVENT_MOUSE_ENTERED, EVENT_MOUSE_EXITED default: useDefWindowProc = 1; } if (useDefWindowProc) return DefWindowProc(wnd, message, wParam, lParam); return 0; }
/* * Class: com_sun_javafx_newt_windows_WindowsWindow * Method: CreateWindow * Signature: (JILjava/lang/String;JJZIIII)J */ JNIEXPORT jlong JNICALL Java_com_sun_javafx_newt_windows_WindowsWindow_CreateWindow (JNIEnv *env, jobject obj, jlong parent, jint wndClassAtom, jstring jWndName, jlong hInstance, jlong visualID, jboolean bIsUndecorated, jint jx, jint jy, jint defaultWidth, jint defaultHeight) { HWND parentWindow = (HWND) (intptr_t) parent; const TCHAR* wndName = NULL; DWORD windowStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; int x=(int)jx, y=(int)jy; int width=(int)defaultWidth, height=(int)defaultHeight; HWND window = NULL; #ifdef UNICODE wndName = GetNullTerminatedStringChars(env, jWndName); #else wndName = (*env)->GetStringUTFChars(env, jWndName, NULL); #endif if(NULL!=parentWindow) { windowStyle |= WS_CHILD ; } else if (bIsUndecorated) { windowStyle |= WS_POPUP | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX; } else { windowStyle |= WS_OVERLAPPEDWINDOW; x = CW_USEDEFAULT; y = 0; } (void) visualID; // FIXME: use the visualID .. window = CreateWindow(MAKEINTATOM(wndClassAtom), wndName, windowStyle, x, y, width, height, parentWindow, NULL, (HINSTANCE) (intptr_t) hInstance, NULL); DBG_PRINT("*** WindowsWindow: CreateWindow parent %p, window %p, %d/%d %dx%d\n", parentWindow, window, x, y, width, height); if (NULL != window) { WindowUserData * wud = (WindowUserData *) malloc(sizeof(WindowUserData)); wud->jinstance = (*env)->NewGlobalRef(env, obj); wud->jenv = env; #if defined(UNDER_CE) || _MSC_VER <= 1200 SetWindowLong(window, GWL_USERDATA, (intptr_t) wud); #else SetWindowLongPtr(window, GWLP_USERDATA, (intptr_t) wud); #endif UpdateInsets(env, window, obj); ShowWindow(window, SW_SHOWNORMAL); } #ifdef UNICODE free((void*) wndName); #else (*env)->ReleaseStringUTFChars(env, jWndName, wndName); #endif return (jlong) (intptr_t) window; }
/* * Class: com_jogamp_newt_impl_windows_WindowsWindow * Method: CreateWindow * Signature: (JILjava/lang/String;JJZIIII)J */ JNIEXPORT jlong JNICALL Java_com_jogamp_newt_impl_windows_WindowsWindow_CreateWindow (JNIEnv *env, jobject obj, jlong parent, jint wndClassAtom, jstring jWndName, jlong hInstance, jlong visualID, jboolean bIsUndecorated, jint jx, jint jy, jint defaultWidth, jint defaultHeight) { HWND parentWindow = (HWND) (intptr_t) parent; const TCHAR* wndName = NULL; DWORD windowStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE | WS_TABSTOP; int x=(int)jx, y=(int)jy; int width=(int)defaultWidth, height=(int)defaultHeight; HWND window = NULL; #ifdef UNICODE wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName); #else wndName = (*env)->GetStringUTFChars(env, jWndName, NULL); #endif if(NULL!=parentWindow) { if (!IsWindow(parentWindow)) { DBG_PRINT("*** WindowsWindow: CreateWindow failure: Passed parentWindow %p is invalid\n", parentWindow); return 0; } windowStyle |= WS_CHILD ; } else if (bIsUndecorated) { windowStyle |= WS_POPUP | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX; } else { windowStyle |= WS_OVERLAPPEDWINDOW; x = CW_USEDEFAULT; y = 0; } (void) visualID; // FIXME: use the visualID .. window = CreateWindow(MAKEINTATOM(wndClassAtom), wndName, windowStyle, x, y, width, height, parentWindow, NULL, (HINSTANCE) (intptr_t) hInstance, NULL); DBG_PRINT("*** WindowsWindow: CreateWindow parent %p, window %p, %d/%d %dx%d\n", parentWindow, window, x, y, width, height); if (NULL == window) { int lastError = (int) GetLastError(); DBG_PRINT("*** WindowsWindow: CreateWindow failure: 0x%X %d\n", lastError, lastError); return 0; } else { WindowUserData * wud = (WindowUserData *) malloc(sizeof(WindowUserData)); wud->jinstance = (*env)->NewGlobalRef(env, obj); wud->jenv = env; #if defined(UNDER_CE) || _MSC_VER <= 1200 SetWindowLong(window, GWL_USERDATA, (intptr_t) wud); #else SetWindowLongPtr(window, GWLP_USERDATA, (intptr_t) wud); #endif UpdateInsets(env, window, obj); ShowWindow(window, SW_SHOWNORMAL); if(NULL!=parentWindow) { NewtWindows_requestFocus ( window ); // request focus on this window, if not already .. } /* else { // top level already capable of receiving [keyboard] events } */ } #ifdef UNICODE free((void*) wndName); #else (*env)->ReleaseStringUTFChars(env, jWndName, wndName); #endif return (jlong) (intptr_t) window; }