diff src/video/gem/SDL_gemevents.c @ 1067:f73b199bcd75

Better mouse lose/gain focus
author Patrice Mandin <patmandin@gmail.com>
date Fri, 03 Jun 2005 08:18:55 +0000
parents 5d9947da7510
children 6d3c1134cd19
line wrap: on
line diff
--- a/src/video/gem/SDL_gemevents.c	Thu Jun 02 22:02:18 2005 +0000
+++ b/src/video/gem/SDL_gemevents.c	Fri Jun 03 08:18:55 2005 +0000
@@ -140,14 +140,23 @@
 	{
 		int quit, resultat;
 		short buffer[8], kc;
+		short x2,y2,w2,h2;
 
 		quit = 0;
 
+		event_mask = MU_MESAG|MU_TIMER|MU_KEYBD;
+		if (!GEM_fullscreen && (GEM_handle>=0)) {
+			wind_get (GEM_handle, WF_WORKXYWH, &x2, &y2, &w2, &h2);
+			event_mask |= MU_M1|MU_M2;
+		} else {
+			x2=y2=w2=h2=0;
+		}
+
 		resultat = evnt_multi(
-			MU_MESAG|MU_TIMER|MU_KEYBD,
+			event_mask,
 			0,0,0,
-			0,0,0,0,0,
-			0,0,0,0,0,
+			MO_ENTER,x2,y2,w2,h2,
+			MO_LEAVE,x2,y2,w2,h2,
 			buffer,
 			10,
 			&dummy,&dummy,&dummy,&kstate,&kc,&dummy
@@ -167,6 +176,18 @@
 			}
 		}
 
+		/* Mouse entering/leaving window */
+		if (resultat & MU_M1) {
+			if (this->input_grab == SDL_GRAB_OFF) {
+				SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
+			}
+		}
+		if (resultat & MU_M2) {
+			if (this->input_grab == SDL_GRAB_OFF) {
+				SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
+			}
+		}
+
 		/* Timer event ? */
 		if ((resultat & MU_TIMER) || quit)
 			break;
@@ -224,9 +245,6 @@
 		case WM_TOPPED:
 			wind_set(message[3],WF_TOP,message[4],0,0,0);
 			SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
-			if (this->input_grab == SDL_GRAB_OFF) {
-				SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
-			}
 			break;
 		case WM_REDRAW:
 			if (!GEM_lock_redraw) {
@@ -289,9 +307,6 @@
 		case WM_BOTTOMED:
 		case WM_UNTOPPED:
 			SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
-			if (this->input_grab == SDL_GRAB_OFF) {
-				SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
-			}
 			break;
 	}
 	
@@ -326,6 +341,11 @@
 	static short prevmousex=0, prevmousey=0, prevmouseb=0;
 	short x2, y2, w2, h2;
 
+	/* Don't return mouse events if out of window */
+	if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS)==0) {
+		return;
+	}
+
 	/* Retrieve window coords, and generate mouse events accordingly */
 	x2 = y2 = 0;
 	w2 = VDI_w;