SDL  2.0
SDL_windowevents.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2016 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 #include "../video/SDL_sysvideo.h"
29 
30 
31 static int
33 {
34  SDL_Event *new_event = (SDL_Event *)userdata;
35 
36  if (event->type == SDL_WINDOWEVENT &&
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
47 {
48  SDL_Event *new_event = (SDL_Event *)userdata;
49 
50  if (event->type == SDL_WINDOWEVENT &&
52  event->window.windowID == new_event->window.windowID) {
53  /* We're about to post a new size event, drop the old one */
54  return 0;
55  }
56  return 1;
57 }
58 
59 static int
61 {
62  SDL_Event *new_event = (SDL_Event *)userdata;
63 
64  if (event->type == SDL_WINDOWEVENT &&
66  event->window.windowID == new_event->window.windowID) {
67  /* We're about to post a new move 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  }
87  window->flags &= ~SDL_WINDOW_HIDDEN;
88  window->flags |= SDL_WINDOW_SHOWN;
89  SDL_OnWindowShown(window);
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;
97  SDL_OnWindowHidden(window);
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;
124  SDL_OnWindowResized(window);
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;
132  SDL_OnWindowMinimized(window);
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  }
146  SDL_OnWindowRestored(window);
147  break;
149  if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
150  return 0;
151  }
152  window->flags |= SDL_WINDOW_MOUSE_FOCUS;
153  SDL_OnWindowEnter(window);
154  break;
156  if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
157  return 0;
158  }
159  window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
160  SDL_OnWindowLeave(window);
161  break;
163  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
164  return 0;
165  }
166  window->flags |= SDL_WINDOW_INPUT_FOCUS;
167  SDL_OnWindowFocusGained(window);
168  break;
170  if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
171  return 0;
172  }
173  window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
174  SDL_OnWindowFocusLost(window);
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_RESIZED) {
191  }
192  if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) {
194  }
195  if (windowevent == SDL_WINDOWEVENT_MOVED) {
197  }
198 
199  posted = (SDL_PushEvent(&event) > 0);
200  }
201 
202  if (windowevent == SDL_WINDOWEVENT_CLOSE) {
203  if ( !window->prev && !window->next ) {
204  /* This is the last window in the list so send the SDL_QUIT event */
205  SDL_SendQuit();
206  }
207  }
208 
209  return (posted);
210 }
211 
212 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:121
SDL_Window * next
Definition: SDL_sysvideo.h:109
SDL_Window * window
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2301
#define SDL_ENABLE
Definition: SDL_events.h:718
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2330
SDL_Rect windowed
Definition: SDL_sysvideo.h:85
static int RemovePendingSizeChangedEvents(void *userdata, SDL_Event *event)
static int RemovePendingResizedEvents(void *userdata, SDL_Event *event)
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2295
SDL_WindowEvent window
Definition: SDL_events.h:525
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2308
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
struct _cl_event * event
#define SDL_PushEvent
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2338
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Window * prev
Definition: SDL_sysvideo.h:108
int h
Definition: SDL_rect.h:67
The type used to identify a window.
Definition: SDL_sysvideo.h:71
Uint32 id
Definition: SDL_sysvideo.h:74
#define SDL_FilterEvents
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2387
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2314
General event structure.
Definition: SDL_events.h:521
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2289
Uint32 flags
Definition: SDL_sysvideo.h:81
int y
Definition: SDL_rect.h:66
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
int SDL_SendQuit(void)
Definition: SDL_quit.c:139
Uint32 type
Definition: SDL_events.h:523
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2343