SDL  2.0
SDL_windowevents.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2018 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 &&
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 &&
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 &&
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  }
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_MINIMIZED;
131  SDL_OnWindowMinimized(window);
132  break;
134  if (window->flags & SDL_WINDOW_MAXIMIZED) {
135  return 0;
136  }
137  window->flags &= ~SDL_WINDOW_MINIMIZED;
138  window->flags |= SDL_WINDOW_MAXIMIZED;
139  break;
141  if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) {
142  return 0;
143  }
145  SDL_OnWindowRestored(window);
146  break;
148  if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
149  return 0;
150  }
151  window->flags |= SDL_WINDOW_MOUSE_FOCUS;
152  SDL_OnWindowEnter(window);
153  break;
155  if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
156  return 0;
157  }
158  window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
159  SDL_OnWindowLeave(window);
160  break;
162  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
163  return 0;
164  }
165  window->flags |= SDL_WINDOW_INPUT_FOCUS;
166  SDL_OnWindowFocusGained(window);
167  break;
169  if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
170  return 0;
171  }
172  window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
173  SDL_OnWindowFocusLost(window);
174  break;
175  }
176 
177  /* Post the event, if desired */
178  posted = 0;
181  event.type = SDL_WINDOWEVENT;
182  event.window.event = windowevent;
183  event.window.data1 = data1;
184  event.window.data2 = data2;
185  event.window.windowID = window->id;
186 
187  /* Fixes queue overflow with resize events that aren't processed */
188  if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) {
190  }
191  if (windowevent == SDL_WINDOWEVENT_MOVED) {
193  }
194  if (windowevent == SDL_WINDOWEVENT_EXPOSED) {
196  }
197  posted = (SDL_PushEvent(&event) > 0);
198  }
199 
200  if (windowevent == SDL_WINDOWEVENT_CLOSE) {
201  if ( !window->prev && !window->next ) {
202  /* This is the last window in the list so send the SDL_QUIT event */
203  SDL_SendQuit();
204  }
205  }
206 
207  return (posted);
208 }
209 
210 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:131
SDL_Window * next
Definition: SDL_sysvideo.h:114
static int RemovePendingExposedEvents(void *userdata, SDL_Event *event)
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2578
#define SDL_ENABLE
Definition: SDL_events.h:756
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2607
SDL_Rect windowed
Definition: SDL_sysvideo.h:87
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2572
SDL_WindowEvent window
Definition: SDL_events.h:562
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2585
#define SDL_GetEventState(type)
Definition: SDL_events.h:769
uint8_t Uint8
Definition: SDL_stdinc.h:179
struct _cl_event * event
#define SDL_PushEvent
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2615
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
static int RemovePendingSizeChangedAndResizedEvents(void *userdata, SDL_Event *event)
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Window * prev
Definition: SDL_sysvideo.h:113
int h
Definition: SDL_rect.h:67
The type used to identify a window.
Definition: SDL_sysvideo.h:73
Uint32 id
Definition: SDL_sysvideo.h:76
#define SDL_FilterEvents
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2655
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2591
General event structure.
Definition: SDL_events.h:557
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2566
Uint32 flags
Definition: SDL_sysvideo.h:83
#define SDLCALL
Definition: SDL_internal.h:45
int y
Definition: SDL_rect.h:66
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
int SDL_SendQuit(void)
Definition: SDL_quit.c:137
Uint32 type
Definition: SDL_events.h:559
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2620