SDL  2.0
SDL_windowevents.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 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 
30 static 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 
45 static 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 
59 static 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 
73 int
74 SDL_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) ||
101  SDL_WINDOWPOS_ISUNDEFINED(data2)) {
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;
131  window->flags |= SDL_WINDOW_MINIMIZED;
133  break;
135  if (window->flags & SDL_WINDOW_MAXIMIZED) {
136  return 0;
137  }
138  window->flags &= ~SDL_WINDOW_MINIMIZED;
139  window->flags |= SDL_WINDOW_MAXIMIZED;
140  break;
142  if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) {
143  return 0;
144  }
147  break;
149  if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
150  return 0;
151  }
152  window->flags |= SDL_WINDOW_MOUSE_FOCUS;
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  }
166  window->flags |= SDL_WINDOW_INPUT_FOCUS;
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: */
SDL_OnWindowMinimized
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2622
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179
SDL_events.h
SDL_WINDOW_MINIMIZED
@ SDL_WINDOW_MINIMIZED
Definition: SDL_video.h:105
SDL_WINDOWEVENT_FOCUS_LOST
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:165
SDL_WINDOWEVENT_CLOSE
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:166
SDL_WINDOWEVENT_ENTER
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:162
SDL_OnWindowHidden
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2609
SDLCALL
#define SDLCALL
Definition: SDL_internal.h:49
SDL_WINDOW_FULLSCREEN
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:99
SDL_WindowEvent::windowID
Uint32 windowID
Definition: SDL_events.h:199
SDL_WINDOWEVENT_RESIZED
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:154
SDL_mouse_c.h
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:760
SDL_WINDOW_MAXIMIZED
@ SDL_WINDOW_MAXIMIZED
Definition: SDL_video.h:106
SDL_WINDOWEVENT_MOVED
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:152
SDL_WINDOW_INPUT_FOCUS
@ SDL_WINDOW_INPUT_FOCUS
Definition: SDL_video.h:108
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:75
SDL_WINDOWEVENT_SHOWN
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:148
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2652
SDL_OnWindowRestored
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2628
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:773
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
RemovePendingMoveEvents
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:46
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
SDL_WINDOWEVENT_EXPOSED
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:150
SDL_Event::window
SDL_WindowEvent window
Definition: SDL_events.h:563
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:155
SDL_WINDOWEVENT_MINIMIZED
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:158
SDL_WINDOW_SHOWN
@ SDL_WINDOW_SHOWN
Definition: SDL_video.h:101
RemovePendingExposedEvents
static int RemovePendingExposedEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:60
SDL_OnWindowShown
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2603
SDL_OnWindowFocusGained
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2657
SDL_WINDOW_HIDDEN
@ SDL_WINDOW_HIDDEN
Definition: SDL_video.h:102
SDL_FilterEvents
#define SDL_FilterEvents
Definition: SDL_dynapi_overrides.h:130
RemovePendingSizeChangedAndResizedEvents
static int RemovePendingSizeChangedAndResizedEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:31
SDL_SendWindowEvent
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
Definition: SDL_windowevents.c:74
SDL_events_c.h
SDL_OnWindowFocusLost
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2701
SDL_OnWindowLeave
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2652
SDL_WINDOW_MOUSE_FOCUS
@ SDL_WINDOW_MOUSE_FOCUS
Definition: SDL_video.h:109
SDL_WINDOWEVENT_HIDDEN
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:149
SDL_Event
General event structure.
Definition: SDL_events.h:559
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
SDL_WINDOWEVENT_RESTORED
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:160
SDL_WINDOWEVENT_FOCUS_GAINED
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:164
SDL_SendQuit
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
SDL_WINDOWPOS_ISUNDEFINED
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:130
SDL_OnWindowResized
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2615
SDL_WINDOWEVENT_MAXIMIZED
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:159
SDL_WINDOWEVENT_LEAVE
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:163
SDL_OnWindowEnter
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2644