Programming => Bug Reports / RFE => Topic started by: atalanteIT on March 05, 2015, 15:12:25

Title: Mouse.getDX() / getDY() do not work properly on PC
Post by: atalanteIT on March 05, 2015, 15:12:25
... however it works on mac.

Hi everybody!

This is happening if my I set Mouse.setGrabbed(true);

double dx = Mouse.getDX() * SPEED_MOUSE;
double dy = Mouse.getDY() * SPEED_MOUSE;

This simple kind of line do not return correct DX/DY on PC (work fine on MAC) - I use it for camera mvt.

In my pom.xml (Maven) if I called the version of LWGJL

the problem is gone (however I have some issue on mac with fullscreen) but this is fixed with the 2.9.3 and it is not the pb here  ;)

Now if I put the last version 2.9.3, the getDx() or getDy() do not work. I notice also a weird stuff.
It looks like the cursor is set on 0,0 and if I move my mouse to the left (in  grabbed = true mode) dx = 0  but getDx() works only if my mouse is moving to the right.)

I also tried to put
int dx = Mouse.getEventDx(); but I have -1 here ...

Does someone had such problem ? (again it work perfectly with 2.9.1 in Mac and PC and it does not work on PC only for 2.9.3)

Thanks a lot if you have any clue ...


ok now this is a code that you execute (copy paste it, it is a stand alone class)
The application is simple : you move your mouse cursor, you have output in console.

so with the same code :

use org.lwjgl.lwjgl 2.9.1 - the output of DX/DY if the mouse move to the left on X, and nothing on Y : (it is an example - important is the numbers are negative)
Mouse -24 0
Mouse -27 0
Mouse -51 0
Mouse -34 0
Mouse -21 0

now with org.lwjgl.lwjgl 2.9.3 :
Mouse 0 -499
Mouse 0 -499
Mouse 0 -499

please try this following code :

Code: [Select]
package be;

import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class TestMouse {
    /** time at last frame */
    long lastFrame;
    /** frames per second */
    int fps;
    /** last fps time */
    long lastFPS;
    StringBuffer sb;
    int WIDTH = 800, HEIGHT = 600;

private boolean quit = false;
    public void start() {
        try {
            Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        } catch (LWJGLException e) {
        initGL(); // init OpenGL
        getDelta(); // call once before loop to initialise lastFrame
        lastFPS = getTime(); // call before loop to initialise fps timer
        sb = new StringBuffer();
        System.out.println(" * Please use 2.9.1 and everything works fine.");
        System.out.println(" * if you use 2.9.3 DX will be set to 0 for moving your mouse to the left.");
        System.out.println(" * Mouse should get the DX / DY when mouse is moving");
        System.out.println(" * Press ESC to quit");
        System.out.println(" * Press E key to set grabbed to true");
        while (!quit) {
            int delta = getDelta();
            Display.sync(60); // cap fps to 60fps
    public void update(int delta) {
    quit = Display.isCloseRequested();
        while (Keyboard.next()) {
        if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) {
            quit  = true;
            if(Keyboard.getEventKey() == Keyboard.KEY_E) {
        sb.append("Mouse ").append(Mouse.getEventDX()).append(" ").append(Mouse.getEventDY());
        updateFPS(); // update FPS Counter
     * Set the display mode to be used
     * @param width The width of the display required
     * @param height The height of the display required
     * @param fullscreen True if we want fullscreen mode
    public void setDisplayMode(int width, int height, boolean fullscreen) {
        // return if requested DisplayMode is already set
                if ((Display.getDisplayMode().getWidth() == width) &&
            (Display.getDisplayMode().getHeight() == height) &&
            (Display.isFullscreen() == fullscreen)) {
        try {
            DisplayMode targetDisplayMode = null;
            if (fullscreen) {
                DisplayMode[] modes = Display.getAvailableDisplayModes();
                int freq = 0;
                for (int i=0;i<modes.length;i++) {
                    DisplayMode current = modes[i];
                    if ((current.getWidth() == width) && (current.getHeight() == height)) {
                        if ((targetDisplayMode == null) || (current.getFrequency() >= freq)) {
                            if ((targetDisplayMode == null) || (current.getBitsPerPixel() > targetDisplayMode.getBitsPerPixel())) {
                                targetDisplayMode = current;
                                freq = targetDisplayMode.getFrequency();
                        // if we've found a match for bpp and frequence against the
                        // original display mode then it's probably best to go for this one
                        // since it's most likely compatible with the monitor
                        if ((current.getBitsPerPixel() == Display.getDesktopDisplayMode().getBitsPerPixel()) &&
                            (current.getFrequency() == Display.getDesktopDisplayMode().getFrequency())) {
                            targetDisplayMode = current;
            } else {
                targetDisplayMode = new DisplayMode(width,height);
            if (targetDisplayMode == null) {
                System.out.println("Failed to find value mode: "+width+"x"+height+" fs="+fullscreen);
        } catch (LWJGLException e) {
            System.out.println("Unable to setup mode "+width+"x"+height+" fullscreen="+fullscreen + e);
     * Calculate how many milliseconds have passed
     * since last frame.
     * @return milliseconds passed since last frame
    public int getDelta() {
        long time = getTime();
        int delta = (int) (time - lastFrame);
        lastFrame = time;
        return delta;
     * Get the accurate system time
     * @return The system time in milliseconds
    public long getTime() {
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
     * Calculate the FPS and set it in the title bar
    public void updateFPS() {
        if (getTime() - lastFPS > 1000) {
            Display.setTitle("FPS: " + fps);
            fps = 0;
            lastFPS += 1000;
    public void initGL() {
    GL11.glOrtho(0, WIDTH, 0, HEIGHT, 1, -1);
    public void renderGL() {
        // Clear The Screen And The Depth Buffer
    public static void main(String[] argv) {
        TestMouse mouseTest = new TestMouse();

Please ignore the last line, I do not know why it appears here (conflict with CSS ?)

Now it will be a little better to see the problem.
Important : version of LWJGL and execute it on PC (here windows 7)
Title: Re: Mouse.getDX() / getDY() do not work properly on PC
Post by: atalanteIT on March 06, 2015, 09:54:21
Hi again - nobody got such issue ?
Did someone tried the code ?
Did someone tried it also on Ubuntu (difference of behavior)?

What is the reliable way to get Dx / Dy now ? (for PC,MAC and Linux)
A work-around may be ?

Title: Re: Mouse.getDX() / getDY() do not work properly on PC
Post by: spasi on March 06, 2015, 11:43:14
Your code works fine (Windows 8.1), without the issue you're describing.

Your event loop is not exactly correct though. The methods getDX/getDY return the mouse translation aggregate since the last time you called them. They are not meant to be called within a Mouse.next() loop, you can use getEventDX/getEventDY instead.

If anyone else can test the above code, please let me know if you're experiencing the same problem.
Title: Re: Mouse.getDX() / getDY() do not work properly on PC
Post by: atalanteIT on March 06, 2015, 13:05:43
Ok thanks spasi for the remark.
I update the line in the previous code.

Code: [Select]
sb.append("Mouse ").append(Mouse.getEventDX()).append(" ").append(Mouse.getEventDY());
I tried the new code with 2.9.1 and I have
Mouse -1 0
Mouse -2 0

That is correct (when I pressed E or without - means the Mouse.setGrabbed(true) the result is the good one)
so everything is fine with 2.9.1.

Now with 2.9.3
I have
Mouse -1 0
Mouse -2 0

if the mouse move to the left (so perfect).

but as soon as I hit the key E (Mouse.setGrabbed(true) ) the output is :

Mouse 0 -499
Mouse 0 -499

I guess if someone has windows 7 could have a try ...
The detail for the machine I am using right now is :
Windows 7 enterprise
Service Pack 1

Please not that the issue is NOT occurring with the version of the lib 2.9.1

P.S.²: I did not try the 2.9.2 - it is even a different behavior. The result is correct if the key E is not hit. As soon as I hit E, the output in the console frizzed and I have a huge list of
'Mouse 0 -499'  that causes a crash (I use the Alt+Tab to get back to Eclipse, and it seems to kill the application)

Anybody can try with a windows 7 with a positive / negative feedback ?