1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 /* Application focus/iconification handling code for SDL */ 25 26 #include "SDL_events.h" 27 #include "SDL_events_c.h" 28 29 30 /* These are static for our active event handling code */ 31 static Uint8 SDL_appstate = 0; 32 33 /* Public functions */ 34 int SDL_AppActiveInit(void) 35 { 36 /* Start completely active */ 37 SDL_appstate = (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); 38 39 /* That's it! */ 40 return(0); 41 } 42 void SDL_AppActiveQuit(void) 43 { 44 } 45 46 Uint8 SDL_GetAppState(void) 47 { 48 return(SDL_appstate); 49 } 50 51 /* This is global for SDL_eventloop.c */ 52 int SDL_PrivateAppActive(Uint8 gain, Uint8 state) 53 { 54 int posted; 55 Uint8 new_state; 56 57 /* Modify the current state with the given mask */ 58 if ( gain ) { 59 new_state = (SDL_appstate | state); 60 } else { 61 new_state = (SDL_appstate & ~state); 62 } 63 64 /* Drop events that don't change state */ 65 if ( new_state == SDL_appstate ) { 66 return(0); 67 } 68 69 /* Update internal active state */ 70 SDL_appstate = new_state; 71 72 /* Post the event, if desired */ 73 posted = 0; 74 if ( SDL_ProcessEvents[SDL_ACTIVEEVENT] == SDL_ENABLE ) { 75 SDL_Event event; 76 SDL_memset(&event, 0, sizeof(event)); 77 event.type = SDL_ACTIVEEVENT; 78 event.active.gain = gain; 79 event.active.state = state; 80 if ( (SDL_EventOK == NULL) || (*SDL_EventOK)(&event) ) { 81 posted = 1; 82 SDL_PushEvent(&event); 83 } 84 } 85 86 /* If we lost keyboard focus, post key-up events */ 87 if ( (state & SDL_APPINPUTFOCUS) && !gain ) { 88 SDL_ResetKeyboard(); 89 } 90 /* If we were minimized, post button-up events */ 91 if ( (state & SDL_APPACTIVE) && !gain ) { 92 SDL_ResetMouse(); 93 } 94 return(posted); 95 } 96