SDL 2.0
SDL_windowevents.c
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
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
32{
33 SDL_Event *new_event = (SDL_Event *)userdata;
34
35 if (event->type == SDL_WINDOWEVENT &&
36 (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED ||
37 event->window.event == SDL_WINDOWEVENT_RESIZED) &&
38 event->window.windowID == new_event->window.windowID) {
39 /* We're about to post a new size event, drop the old one */
40 return 0;
41 }
42 return 1;
43}
44
45static int SDLCALL
47{
48 SDL_Event *new_event = (SDL_Event *)userdata;
49
50 if (event->type == SDL_WINDOWEVENT &&
51 event->window.event == SDL_WINDOWEVENT_MOVED &&
52 event->window.windowID == new_event->window.windowID) {
53 /* We're about to post a new move event, drop the old one */
54 return 0;
55 }
56 return 1;
57}
58
59static int SDLCALL
61{
62 SDL_Event *new_event = (SDL_Event *)userdata;
63
64 if (event->type == SDL_WINDOWEVENT &&
65 event->window.event == SDL_WINDOWEVENT_EXPOSED &&
66 event->window.windowID == new_event->window.windowID) {
67 /* We're about to post a new exposed event, drop the old one */
68 return 0;
69 }
70 return 1;
71}
72
73int
74SDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent, int data1,
75 int data2)
76{
77 int posted;
78
79 if (!window) {
80 return 0;
81 }
82 switch (windowevent) {
84 if (window->flags & SDL_WINDOW_SHOWN) {
85 return 0;
86 }
88 window->flags |= SDL_WINDOW_SHOWN;
90 break;
92 if (!(window->flags & SDL_WINDOW_SHOWN)) {
93 return 0;
94 }
95 window->flags &= ~SDL_WINDOW_SHOWN;
96 window->flags |= SDL_WINDOW_HIDDEN;
98 break;
100 if (SDL_WINDOWPOS_ISUNDEFINED(data1) ||
102 return 0;
103 }
104 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
105 window->windowed.x = data1;
106 window->windowed.y = data2;
107 }
108 if (data1 == window->x && data2 == window->y) {
109 return 0;
110 }
111 window->x = data1;
112 window->y = data2;
113 break;
115 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
116 window->windowed.w = data1;
117 window->windowed.h = data2;
118 }
119 if (data1 == window->w && data2 == window->h) {
120 return 0;
121 }
122 window->w = data1;
123 window->h = data2;
125 break;
127 if (window->flags & SDL_WINDOW_MINIMIZED) {
128 return 0;
129 }
130 window->flags &= ~SDL_WINDOW_MAXIMIZED;
133 break;
135 if (window->flags & SDL_WINDOW_MAXIMIZED) {
136 return 0;
137 }
138 window->flags &= ~SDL_WINDOW_MINIMIZED;
140 break;
143 return 0;
144 }
147 break;
149 if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
150 return 0;
151 }
154 break;
156 if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
157 return 0;
158 }
159 window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
161 break;
163 if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
164 return 0;
165 }
168 break;
170 if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
171 return 0;
172 }
173 window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
175 break;
176 }
177
178 /* Post the event, if desired */
179 posted = 0;
182 event.type = SDL_WINDOWEVENT;
183 event.window.event = windowevent;
184 event.window.data1 = data1;
185 event.window.data2 = data2;
186 event.window.windowID = window->id;
187
188 /* Fixes queue overflow with resize events that aren't processed */
189 if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) {
191 }
192 if (windowevent == SDL_WINDOWEVENT_MOVED) {
194 }
195 if (windowevent == SDL_WINDOWEVENT_EXPOSED) {
197 }
198 posted = (SDL_PushEvent(&event) > 0);
199 }
200
201 if (windowevent == SDL_WINDOWEVENT_CLOSE) {
202 if ( !window->prev && !window->next ) {
203 /* This is the last window in the list so send the SDL_QUIT event */
204 SDL_SendQuit();
205 }
206 }
207
208 return (posted);
209}
210
211/* vi: set ts=4 sw=4 expandtab: */
#define SDL_PushEvent
#define SDL_FilterEvents
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
#define SDL_GetEventState(type)
Definition: SDL_events.h:772
#define SDL_ENABLE
Definition: SDL_events.h:759
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
#define SDLCALL
Definition: SDL_internal.h:49
struct _cl_event * event
uint8_t Uint8
Definition: SDL_stdinc.h:179
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2631
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2601
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2680
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2588
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2582
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2594
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2623
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2607
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2636
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:131
@ SDL_WINDOW_SHOWN
Definition: SDL_video.h:102
@ SDL_WINDOW_MINIMIZED
Definition: SDL_video.h:106
@ SDL_WINDOW_MOUSE_FOCUS
Definition: SDL_video.h:110
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:100
@ SDL_WINDOW_MAXIMIZED
Definition: SDL_video.h:107
@ SDL_WINDOW_HIDDEN
Definition: SDL_video.h:103
@ SDL_WINDOW_INPUT_FOCUS
Definition: SDL_video.h:109
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:167
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:153
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:164
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:160
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:163
static int RemovePendingExposedEvents(void *userdata, SDL_Event *event)
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
static int RemovePendingSizeChangedAndResizedEvents(void *userdata, SDL_Event *event)
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
The type used to identify a window.
Definition: SDL_sysvideo.h:74
General event structure.
Definition: SDL_events.h:558
SDL_WindowEvent window
Definition: SDL_events.h:562