Problem with X11 mouse events

I’m writing a windowed SDL application with the mouse switching in and
out of the grabbed state. I’m using SDL 1.2.11 on Linux. I noticed
that when the mouse was outside of the window and the keyboard input
was still on, calling grab mouse didn’t switch the app state to
SDL_APPMOUSEFOCUS.

I’m not in tune with the underlying X11 implementation, so I decided
to workaround it by warping the mouse to the center of the window
before grabbing input. Unfortunately, this still didn’t work. I choose
to make this workaround do the right thing by using the following
code. (Forgive the emacs tabbing/spacing issues)

I believe the true issue is that the X11 EnterNotify event is never
triggered if you leave a window and grab the input. I didn’t spend too
long digging through it.

— SDL-1.2.11/src/video/x11/SDL_x11mouse.c 2006-05-01
01:02:48.000000000 -0700
+++ SDL-1.2.11.orig/src/video/x11/SDL_x11mouse.c 2006-12-07
21:43:20.000000000 -0800
@@ -171,16 +171,25 @@
{
if ( using_dga & DGA_MOUSE ) {
SDL_PrivateMouseMotion(0, 0, x, y);

  •   } else if ( mouse_relative) {
    
  •   } else {
    
  •     if ( ! (SDL_GetAppState & SDL_APPMOUSEFOCUS) ) {
    
  •       Uint16 screen_w = SDL_VideoSurface->w;
    
  •       Uint16 screen_h = SDL_VideoSurface->h;
    
  •       if( x < w && y < h ) {
    
  •         SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
    
  •       }
    
  •     }
    
  •     if ( mouse_relative) {
              /*      RJR: March 28, 2000
                      leave physical cursor at center of screen if
                      mouse hidden and grabbed */
              SDL_PrivateMouseMotion(0, 0, x, y);
    
  •   } else {
    
  •           SDL_Lock_EventThread();
    
  •           XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, x, y);
    
  •           XSync(SDL_Display, False);
    
  •           SDL_Unlock_EventThread();
    
  •     } else {
    
  •       SDL_Lock_EventThread();
    
  •       XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, x, y);
    
  •       XSync(SDL_Display, False);
    
  •       SDL_Unlock_EventThread();
    
  •     }
      }
    

}

Thanks,

-Kyle

I’m writing a windowed SDL application with the mouse switching in and
out of the grabbed state. I’m using SDL 1.2.11 on Linux. I noticed
that when the mouse was outside of the window and the keyboard input
was still on, calling grab mouse didn’t switch the app state to
SDL_APPMOUSEFOCUS.

This was already fixed in Subversion:
http://bugzilla.libsdl.org/show_bug.cgi?id=299

Thanks,
–ryan.

I’m bouncing this message, who is in charge of old releases? Or,
rather, independent patches. I want to make a release, but be able to
say, “See the original SDL source.” Rather than, “Here is the modified
SDL source, and a modified library that I need at runtime.”

I’m perfectly willing to accept this patch is completely wrong. Who is
in charge of the SDL_x11 video implementation?

What is your schedule for SDL 1.2.12? Is it a dead branch?

-KyleOn 12/7/06, Kyle Hubert <@Kyle_Hubert> wrote:

I’m writing a windowed SDL application with the mouse switching in and
out of the grabbed state. I’m using SDL 1.2.11 on Linux. I noticed
that when the mouse was outside of the window and the keyboard input
was still on, calling grab mouse didn’t switch the app state to
SDL_APPMOUSEFOCUS.

I’m not in tune with the underlying X11 implementation, so I decided
to workaround it by warping the mouse to the center of the window
before grabbing input. Unfortunately, this still didn’t work. I choose
to make this workaround do the right thing by using the following
code. (Forgive the emacs tabbing/spacing issues)

I believe the true issue is that the X11 EnterNotify event is never
triggered if you leave a window and grab the input. I didn’t spend too
long digging through it.

— SDL-1.2.11/src/video/x11/SDL_x11mouse.c 2006-05-01
01:02:48.000000000 -0700
+++ SDL-1.2.11.orig/src/video/x11/SDL_x11mouse.c 2006-12-07
21:43:20.000000000 -0800
@@ -171,16 +171,25 @@
{
if ( using_dga & DGA_MOUSE ) {
SDL_PrivateMouseMotion(0, 0, x, y);

  •   } else if ( mouse_relative) {
    
  •   } else {
    
  •     if ( ! (SDL_GetAppState & SDL_APPMOUSEFOCUS) ) {
    
  •       Uint16 screen_w = SDL_VideoSurface->w;
    
  •       Uint16 screen_h = SDL_VideoSurface->h;
    
  •       if( x < w && y < h ) {
    
  •         SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
    
  •       }
    
  •     }
    
  •     if ( mouse_relative) {
              /*      RJR: March 28, 2000
                      leave physical cursor at center of screen if
                      mouse hidden and grabbed */
              SDL_PrivateMouseMotion(0, 0, x, y);
    
  •   } else {
    
  •           SDL_Lock_EventThread();
    
  •           XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, x, y);
    
  •           XSync(SDL_Display, False);
    
  •           SDL_Unlock_EventThread();
    
  •     } else {
    
  •       SDL_Lock_EventThread();
    
  •       XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, x, y);
    
  •       XSync(SDL_Display, False);
    
  •       SDL_Unlock_EventThread();
    
  •     }
      }
    

}

Thanks,

-Kyle

I’m writing a windowed SDL application with the mouse switching in and
out of the grabbed state. I’m using SDL 1.2.11 on Linux. I noticed
that when the mouse was outside of the window and the keyboard input
was still on, calling grab mouse didn’t switch the app state to
SDL_APPMOUSEFOCUS.

This was already fixed in Subversion:
http://bugzilla.libsdl.org/show_bug.cgi?id=299

Great. Thank you for the follow up. I can see this change is much
simpler than my workaround. I’ve implemented it in my local copy. When
is the next release of the SDL 1.2 branch scheduled? Presumably this
would be release 1.2.12.

-Kyle