Atlas - SDL_windowevents.c
Home / ext / SDL2 / src / events Lines: 1 | Size: 7210 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20*/ 21#include "../SDL_internal.h" 22 23/* Window event handling code for SDL */ 24 25#include "SDL_events.h" 26#include "SDL_events_c.h" 27#include "SDL_mouse_c.h" 28 29 30static int SDLCALL 31RemovePendingResizedEvents(void * userdata, SDL_Event *event) 32{ 33 SDL_Event *new_event = (SDL_Event *)userdata; 34 35 if (event->type == SDL_WINDOWEVENT && 36 event->window.event == SDL_WINDOWEVENT_RESIZED && 37 event->window.windowID == new_event->window.windowID) { 38 /* We're about to post a new size event, drop the old one */ 39 return 0; 40 } 41 return 1; 42} 43 44static int SDLCALL 45RemovePendingSizeChangedEvents(void * userdata, SDL_Event *event) 46{ 47 SDL_Event *new_event = (SDL_Event *)userdata; 48 49 if (event->type == SDL_WINDOWEVENT && 50 event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED && 51 event->window.windowID == new_event->window.windowID) { 52 /* We're about to post a new size event, drop the old one */ 53 return 0; 54 } 55 return 1; 56} 57 58static int SDLCALL 59RemovePendingMoveEvents(void * userdata, SDL_Event *event) 60{ 61 SDL_Event *new_event = (SDL_Event *)userdata; 62 63 if (event->type == SDL_WINDOWEVENT && 64 event->window.event == SDL_WINDOWEVENT_MOVED && 65 event->window.windowID == new_event->window.windowID) { 66 /* We're about to post a new move event, drop the old one */ 67 return 0; 68 } 69 return 1; 70} 71 72static int SDLCALL 73RemovePendingExposedEvents(void * userdata, SDL_Event *event) 74{ 75 SDL_Event *new_event = (SDL_Event *)userdata; 76 77 if (event->type == SDL_WINDOWEVENT && 78 event->window.event == SDL_WINDOWEVENT_EXPOSED && 79 event->window.windowID == new_event->window.windowID) { 80 /* We're about to post a new exposed event, drop the old one */ 81 return 0; 82 } 83 return 1; 84} 85 86int 87SDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent, int data1, 88 int data2) 89{ 90 int posted; 91 92 if (!window) { 93 return 0; 94 } 95 switch (windowevent) { 96 case SDL_WINDOWEVENT_SHOWN: 97 if (window->flags & SDL_WINDOW_SHOWN) { 98 return 0; 99 } 100 window->flags &= ~SDL_WINDOW_HIDDEN; 101 window->flags |= SDL_WINDOW_SHOWN; 102 SDL_OnWindowShown(window); 103 break; 104 case SDL_WINDOWEVENT_HIDDEN: 105 if (!(window->flags & SDL_WINDOW_SHOWN)) { 106 return 0; 107 } 108 window->flags &= ~SDL_WINDOW_SHOWN; 109 window->flags |= SDL_WINDOW_HIDDEN; 110 SDL_OnWindowHidden(window); 111 break; 112 case SDL_WINDOWEVENT_MOVED: 113 if (SDL_WINDOWPOS_ISUNDEFINED(data1) || 114 SDL_WINDOWPOS_ISUNDEFINED(data2)) { 115 return 0; 116 } 117 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { 118 window->windowed.x = data1; 119 window->windowed.y = data2; 120 } 121 if (data1 == window->x && data2 == window->y) { 122 return 0; 123 } 124 window->x = data1; 125 window->y = data2; 126 break; 127 case SDL_WINDOWEVENT_RESIZED: 128 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { 129 window->windowed.w = data1; 130 window->windowed.h = data2; 131 } 132 if (data1 == window->w && data2 == window->h) { 133 return 0; 134 } 135 window->w = data1; 136 window->h = data2; 137 SDL_OnWindowResized(window); 138 break; 139 case SDL_WINDOWEVENT_MINIMIZED: 140 if (window->flags & SDL_WINDOW_MINIMIZED) { 141 return 0; 142 } 143 window->flags &= ~SDL_WINDOW_MAXIMIZED; 144 window->flags |= SDL_WINDOW_MINIMIZED; 145 SDL_OnWindowMinimized(window); 146 break; 147 case SDL_WINDOWEVENT_MAXIMIZED: 148 if (window->flags & SDL_WINDOW_MAXIMIZED) { 149 return 0; 150 } 151 window->flags &= ~SDL_WINDOW_MINIMIZED; 152 window->flags |= SDL_WINDOW_MAXIMIZED; 153 break; 154 case SDL_WINDOWEVENT_RESTORED: 155 if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) { 156 return 0; 157 } 158 window->flags &= ~(SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED); 159 SDL_OnWindowRestored(window); 160 break; 161 case SDL_WINDOWEVENT_ENTER: 162 if (window->flags & SDL_WINDOW_MOUSE_FOCUS) { 163 return 0; 164 } 165 window->flags |= SDL_WINDOW_MOUSE_FOCUS; 166 SDL_OnWindowEnter(window); 167 break; 168 case SDL_WINDOWEVENT_LEAVE: 169 if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) { 170 return 0; 171 } 172 window->flags &= ~SDL_WINDOW_MOUSE_FOCUS; 173 SDL_OnWindowLeave(window); 174 break; 175 case SDL_WINDOWEVENT_FOCUS_GAINED: 176 if (window->flags & SDL_WINDOW_INPUT_FOCUS) { 177 return 0; 178 } 179 window->flags |= SDL_WINDOW_INPUT_FOCUS; 180 SDL_OnWindowFocusGained(window); 181 break; 182 case SDL_WINDOWEVENT_FOCUS_LOST: 183 if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) { 184 return 0; 185 } 186 window->flags &= ~SDL_WINDOW_INPUT_FOCUS; 187 SDL_OnWindowFocusLost(window); 188 break; 189 } 190 191 /* Post the event, if desired */ 192 posted = 0; 193 if (SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE) { 194 SDL_Event event; 195 event.type = SDL_WINDOWEVENT; 196 event.window.event = windowevent; 197 event.window.data1 = data1; 198 event.window.data2 = data2; 199 event.window.windowID = window->id; 200 201 /* Fixes queue overflow with resize events that aren't processed */ 202 if (windowevent == SDL_WINDOWEVENT_RESIZED) { 203 SDL_FilterEvents(RemovePendingResizedEvents, &event); 204 } 205 if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) { 206 SDL_FilterEvents(RemovePendingSizeChangedEvents, &event); 207 } 208 if (windowevent == SDL_WINDOWEVENT_MOVED) { 209 SDL_FilterEvents(RemovePendingMoveEvents, &event); 210 } 211 if (windowevent == SDL_WINDOWEVENT_EXPOSED) { 212 SDL_FilterEvents(RemovePendingExposedEvents, &event); 213 } 214 posted = (SDL_PushEvent(&event) > 0); 215 } 216 217 if (windowevent == SDL_WINDOWEVENT_CLOSE) { 218 if ( !window->prev && !window->next ) { 219 /* This is the last window in the list so send the SDL_QUIT event */ 220 SDL_SendQuit(); 221 } 222 } 223 224 return (posted); 225} 226 227/* vi: set ts=4 sw=4 expandtab: */ 228[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.