Skip to content

Commit

Permalink
Merge remote-tracking branch 'gouessej/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
sgothel committed Apr 11, 2013
2 parents 294294c + 4db745e commit db255a2
Show file tree
Hide file tree
Showing 2 changed files with 167 additions and 29 deletions.
82 changes: 53 additions & 29 deletions src/newt/native/WindowsWindow.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ static RECT* UpdateInsets(JNIEnv *env, jobject window, HWND hwnd);
typedef struct {
JNIEnv* jenv;
jobject jinstance;
int pointerVisible;
} WindowUserData;

typedef struct {
Expand Down Expand Up @@ -1037,8 +1038,26 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lP
useDefWindowProc = 0;
res = 1; // return 1 == done, OpenGL, etc .. erases the background, hence we claim to have just done this
break;


case WM_SETCURSOR :
if (0 != wud->pointerVisible) {
BOOL visibilityChangeSuccessful;
if (1 == wud->pointerVisible) {
visibilityChangeSuccessful = SafeShowCursor(TRUE);
} else {
if (-1 == wud->pointerVisible) {
visibilityChangeSuccessful = SafeShowCursor(FALSE);
} else {
// it should never happen
visibilityChangeSuccessful = FALSE;
}
}
useDefWindowProc = visibilityChangeSuccessful ? 1 : 0;
pointerVisible = 0;
DBG_PRINT("*** WindowsWindow: WM_SETCURSOR requested visibility: %d success: %d\n", wud->pointerVisible, visibilityChangeSuccessful);
} else {
useDefWindowProc = 0;
}
break;
default:
useDefWindowProc = 1;
}
Expand All @@ -1049,6 +1068,28 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lP
return res;
}

static BOOL SafeShowCursor(BOOL show) {
int attempt = 0, maxAttempt, previousDisplayCount, currentDisplayCount;
currentDisplayCount = ShowCursor(show);
if (show) {
success = currentDisplayCount >= 0;
maxAttempt = -currentDisplayCount;
} else {
success = currentDisplayCount < 0;
maxAttempt = currentDisplayCount + 1;
}
while (!success && attempt < maxAttempt) {
previousDisplayCount = currentDisplayCount;
currentDisplayCount = ShowCursor(show);
success = show ? currentDisplayCount >= 0 : currentDisplayCount < 0;
attempt++;
if (previousDisplayCount == currentDisplayCount) {
break;
}
}
return success;
}

/*
* Class: jogamp_newt_driver_windows_DisplayDriver
* Method: DispatchMessages
Expand Down Expand Up @@ -1460,6 +1501,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_windows_WindowDriver_CreateWindo
WindowUserData * wud = (WindowUserData *) malloc(sizeof(WindowUserData));
wud->jinstance = (*env)->NewGlobalRef(env, obj);
wud->jenv = env;
wud->pointerVisible = 0;
#if !defined(__MINGW64__) && ( defined(UNDER_CE) || _MSC_VER <= 1200 )
SetWindowLong(window, GWL_USERDATA, (intptr_t) wud);
#else
Expand Down Expand Up @@ -1668,34 +1710,16 @@ JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_windows_WindowDriver_setPoint
(JNIEnv *env, jclass clazz, jlong window, jboolean mouseVisible)
{
HWND hwnd = (HWND) (intptr_t) window;
int res, resOld, i;
jboolean b;

if(JNI_TRUE == mouseVisible) {
res = ShowCursor(TRUE);
if(res < 0) {
i=0;
do {
resOld = res;
res = ShowCursor(TRUE);
} while(res!=resOld && res<0 && ++i<10);
}
b = res>=0 ? JNI_TRUE : JNI_FALSE;
} else {
res = ShowCursor(FALSE);
if(res >= 0) {
i=0;
do {
resOld = res;
res = ShowCursor(FALSE);
} while(res!=resOld && res>=0 && ++i<10);
}
b = res<0 ? JNI_TRUE : JNI_FALSE;
}

DBG_PRINT( "*** WindowsWindow: setPointerVisible0: %d, res %d/%d\n", mouseVisible, res, b);
WindowUserData * wud;
#if !defined(__MINGW64__) && ( defined(UNDER_CE) || _MSC_VER <= 1200 )
wud = (WindowUserData *) GetWindowLong(hwnd, GWL_USERDATA);
#else
wud = (WindowUserData *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
#endif
wud->pointerVisible = mouseVisible ? 1 : -1;
SendMessage(hwnd, WM_SETCURSOR, 0, 0);

return b;
return JNI_TRUE;
}

/*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package com.jogamp.opengl.test.junit.newt;

import java.io.IOException;

import javax.media.nativewindow.AbstractGraphicsDevice;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLCapabilitiesImmutable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.jogamp.newt.Screen;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.jogl.demos.es1.GearsES1;
import com.jogamp.opengl.test.junit.util.UITestCase;
import com.jogamp.opengl.util.Animator;

public class TestGLWindowInvisiblePointer01NEWT extends UITestCase {
static GLProfile glp;
static int width, height;
static long durationPerTest = 4000; // ms

@BeforeClass
public static void initClass() {
width = 640;
height = 480;
glp = GLProfile.getDefault();
}

static GLWindow createWindow(Screen screen, GLCapabilitiesImmutable caps)
throws InterruptedException
{
Assert.assertNotNull(caps);
//
// Create native windowing resources .. X11/Win/OSX
//
GLWindow glWindow;
if(null!=screen) {
glWindow = GLWindow.create(screen, caps);
Assert.assertNotNull(glWindow);
} else {
glWindow = GLWindow.create(caps);
Assert.assertNotNull(glWindow);
}
glWindow.setUpdateFPSFrames(1, null);

GLEventListener demo = new GearsES1();
glWindow.addGLEventListener(demo);

glWindow.setSize(512, 512);
glWindow.setVisible(true);
Assert.assertEquals(true,glWindow.isVisible());
Assert.assertEquals(true,glWindow.isNativeValid());

return glWindow;
}

static void destroyWindow(GLWindow glWindow) {
if(null!=glWindow) {
glWindow.destroy();
Assert.assertEquals(false,glWindow.isNativeValid());
}
}

@Test
public void testWindow00() throws InterruptedException {
GLCapabilities caps = new GLCapabilities(glp);
Assert.assertNotNull(caps);
GLWindow window1 = createWindow(null, caps); // local
Assert.assertEquals(true,window1.isNativeValid());
Assert.assertEquals(true,window1.isVisible());
Animator animator = new Animator();
animator.setUpdateFPSFrames(1, null);
animator.add(window1);
animator.start();
AbstractGraphicsDevice device1 = window1.getScreen().getDisplay().getGraphicsDevice();

System.err.println("GLProfiles window1: "+device1.getConnection()+": "+GLProfile.glAvailabilityToString(device1));

window1.warpPointer(width / 2, height / 2);
window1.requestFocus();
while(animator.isAnimating() && animator.getTotalFPSDuration()<durationPerTest) {
boolean pointerVisibleNewVal = (animator.getTotalFPSDuration()/100)%2==0;
window1.setPointerVisible(pointerVisibleNewVal);
Assert.assertEquals(pointerVisibleNewVal,window1.isPointerVisible());
Thread.sleep(100);
}

destroyWindow(window1);
}

static int atoi(String a) {
int i=0;
try {
i = Integer.parseInt(a);
} catch (Exception ex) { ex.printStackTrace(); }
return i;
}

public static void main(String args[]) throws IOException {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-time")) {
durationPerTest = atoi(args[++i]);
}
}
System.out.println("durationPerTest: "+durationPerTest);
String tstname = TestGLWindowInvisiblePointer01NEWT.class.getName();
org.junit.runner.JUnitCore.main(tstname);
}

}

0 comments on commit db255a2

Please sign in to comment.