Give mouse position relative to window position, and do not generate mouse button event if outside of the window
authorPatrice Mandin <patmandin@gmail.com>
Tue, 10 Aug 2004 18:53:38 +0000
changeset 926 83db694556eb
parent 925 15ff92ae7e1b
child 927 c5689bd09eaa
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
src/video/gem/SDL_gemvideo.c
src/video/gem/SDL_gemvideo.h
--- a/src/video/gem/SDL_gemevents.c	Mon Aug 09 11:53:14 2004 +0000
+++ b/src/video/gem/SDL_gemevents.c	Tue Aug 10 18:53:38 2004 +0000
@@ -298,6 +298,18 @@
 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) || (mx>=x2+w2) || (my<y2) || (my>=y2+h2)) {
+			mb=prevmouseb;
+		}
+	}
 
 	/* Mouse motion ? */
 	if ((prevmousex!=mx) || (prevmousey!=my)) {
@@ -305,7 +317,17 @@
 			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;
--- a/src/video/gem/SDL_gemvideo.c	Mon Aug 09 11:53:14 2004 +0000
+++ b/src/video/gem/SDL_gemvideo.c	Tue Aug 10 18:53:38 2004 +0000
@@ -400,6 +400,7 @@
 	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 @@
 		} else {
 			modeflags |= SDL_SWSURFACE;
 		}
+
+		GEM_fullscreen = SDL_TRUE;
 	} else {
 		int old_win_type;
 		short x2,y2,w2,h2;
@@ -701,6 +704,8 @@
 	
 		/* Open the window */
 		wind_open(GEM_handle,x2,y2,w2,h2);
+
+		GEM_fullscreen = SDL_FALSE;
 	}
 
 	/* Set up the new mode framebuffer */
--- a/src/video/gem/SDL_gemvideo.h	Mon Aug 09 11:53:14 2004 +0000
+++ b/src/video/gem/SDL_gemvideo.h	Tue Aug 10 18:53:38 2004 +0000
@@ -80,6 +80,8 @@
 	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 @@
 #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)