From 2a74b79d4db71a815ebbb06505faa8c137ce1b34 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Fri, 3 Jun 2005 08:18:55 +0000 Subject: [PATCH] Better mouse lose/gain focus --- src/video/gem/SDL_gemevents.c | 38 ++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/video/gem/SDL_gemevents.c b/src/video/gem/SDL_gemevents.c index 562ba0617..1a11d0a0d 100644 --- a/src/video/gem/SDL_gemevents.c +++ b/src/video/gem/SDL_gemevents.c @@ -140,14 +140,23 @@ void GEM_PumpEvents(_THIS) { 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 @@ void GEM_PumpEvents(_THIS) } } + /* 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 @@ static int do_messages(_THIS, short *message) 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 @@ static int do_messages(_THIS, short *message) 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 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; + /* 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;