From 154ff2443d4d7e67ca8872c8ff33f6c3ae9ecdd2 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Tue, 10 Aug 2004 18:53:38 +0000 Subject: [PATCH] Give mouse position relative to window position, and do not generate mouse button event if outside of the window --- src/video/gem/SDL_gemevents.c | 24 +++++++++++++++++++++++- src/video/gem/SDL_gemvideo.c | 5 +++++ src/video/gem/SDL_gemvideo.h | 3 +++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/video/gem/SDL_gemevents.c b/src/video/gem/SDL_gemevents.c index c8324e147..04320807d 100644 --- a/src/video/gem/SDL_gemevents.c +++ b/src/video/gem/SDL_gemevents.c @@ -298,6 +298,18 @@ static void do_keyboard(short kc, short ks) static void do_mouse(_THIS, short mx, short my, short mb, short ks) { static short prevmousex=0, prevmousey=0, prevmouseb=0; + short x2, y2, w2, h2; + + /* Retrieve window coords, and generate mouse events accordingly */ + x2 = y2 = 0; + if ((!GEM_fullscreen) && (GEM_handle>=0)) { + wind_get (GEM_handle, WF_WORKXYWH, &x2, &y2, &w2, &h2); + + /* Do not generate mouse button event if out of window working area */ + if ((mx=x2+w2) || (my=y2+h2)) { + mb=prevmouseb; + } + } /* Mouse motion ? */ if ((prevmousex!=mx) || (prevmousey!=my)) { @@ -305,7 +317,17 @@ static void do_mouse(_THIS, short mx, short my, short mb, short ks) SDL_PrivateMouseMotion(0, 1, SDL_AtariXbios_mousex, SDL_AtariXbios_mousey); SDL_AtariXbios_mousex = SDL_AtariXbios_mousey = 0; } else { - SDL_PrivateMouseMotion(0, 0, mx, my); + int posx, posy; + + /* Give mouse position relative to window position */ + posx = mx - x2; + if (posx<0) posx = x2; + if (posx>w2) posx = w2-1; + posy = my - y2; + if (posy<0) posy = y2; + if (posy>h2) posy = h2-1; + + SDL_PrivateMouseMotion(0, 0, posx, posy); } prevmousex = mx; prevmousey = my; diff --git a/src/video/gem/SDL_gemvideo.c b/src/video/gem/SDL_gemvideo.c index ce5cda01b..58ca469e7 100644 --- a/src/video/gem/SDL_gemvideo.c +++ b/src/video/gem/SDL_gemvideo.c @@ -400,6 +400,7 @@ int GEM_VideoInit(_THIS, SDL_PixelFormat *vformat) GEM_handle = -1; GEM_locked = SDL_FALSE; GEM_win_fulled = SDL_FALSE; + GEM_fullscreen = SDL_FALSE; VDI_screen = NULL; VDI_pitch = VDI_w * VDI_pixelsize; @@ -641,6 +642,8 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current, } else { modeflags |= SDL_SWSURFACE; } + + GEM_fullscreen = SDL_TRUE; } else { int old_win_type; short x2,y2,w2,h2; @@ -701,6 +704,8 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current, /* Open the window */ wind_open(GEM_handle,x2,y2,w2,h2); + + GEM_fullscreen = SDL_FALSE; } /* Set up the new mode framebuffer */ diff --git a/src/video/gem/SDL_gemvideo.h b/src/video/gem/SDL_gemvideo.h index 03b651c6a..6b3dcb1ac 100644 --- a/src/video/gem/SDL_gemvideo.h +++ b/src/video/gem/SDL_gemvideo.h @@ -80,6 +80,8 @@ struct SDL_PrivateVideoData { SDL_bool mouse_relative; /* Report relative mouse movement */ SDL_bool locked; /* AES locked for fullscreen ? */ short message[8]; /* To self-send an AES message */ + + SDL_bool fullscreen; /* Fullscreen or windowed mode ? */ SDL_Rect *SDL_modelist[SDL_NUMMODES+1]; /* Mode list */ SDL_Surface *icon; /* The icon */ }; @@ -121,6 +123,7 @@ struct SDL_PrivateVideoData { #define GEM_message (this->hidden->message) #define SDL_modelist (this->hidden->SDL_modelist) #define GEM_icon (this->hidden->icon) +#define GEM_fullscreen (this->hidden->fullscreen) #define GEM_buffer1 (this->hidden->buffer1) #define GEM_buffer2 (this->hidden->buffer2)