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 
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  }
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_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_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:2594
#define SDL_ENABLE
Definition: SDL_events.h:759
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2623
SDL_Rect windowed
Definition: SDL_sysvideo.h:87
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2588
SDL_WindowEvent window
Definition: SDL_events.h:562
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2601
#define SDL_GetEventState(type)
Definition: SDL_events.h:772
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:2631
int x
Definition: SDL_rect.h:79
int w
Definition: SDL_rect.h:80
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:80
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:2680
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2607
General event structure.
Definition: SDL_events.h:557
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2582
Uint32 flags
Definition: SDL_sysvideo.h:83
#define SDLCALL
Definition: SDL_internal.h:49
int y
Definition: SDL_rect.h:79
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
Uint32 type
Definition: SDL_events.h:559
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2636