SDL  2.0
SDL_windowevents.c File Reference
#include "../SDL_internal.h"
#include "SDL_events.h"
#include "SDL_events_c.h"
#include "SDL_mouse_c.h"
#include "../video/SDL_sysvideo.h"
+ Include dependency graph for SDL_windowevents.c:

Go to the source code of this file.

Functions

static int RemovePendingResizedEvents (void *userdata, SDL_Event *event)
 
static int RemovePendingSizeChangedEvents (void *userdata, SDL_Event *event)
 
static int RemovePendingMoveEvents (void *userdata, SDL_Event *event)
 
static int RemovePendingExposedEvents (void *userdata, SDL_Event *event)
 
int SDL_SendWindowEvent (SDL_Window *window, Uint8 windowevent, int data1, int data2)
 

Function Documentation

◆ RemovePendingExposedEvents()

static int RemovePendingExposedEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 74 of file SDL_windowevents.c.

References SDL_WindowEvent::event, SDL_WINDOWEVENT, SDL_WINDOWEVENT_EXPOSED, SDL_Event::type, SDL_Event::window, and SDL_WindowEvent::windowID.

Referenced by SDL_SendWindowEvent().

75 {
76  SDL_Event *new_event = (SDL_Event *)userdata;
77 
78  if (event->type == SDL_WINDOWEVENT &&
80  event->window.windowID == new_event->window.windowID) {
81  /* We're about to post a new exposed event, drop the old one */
82  return 0;
83  }
84  return 1;
85 }
SDL_WindowEvent window
Definition: SDL_events.h:529
General event structure.
Definition: SDL_events.h:525
Uint32 type
Definition: SDL_events.h:527

◆ RemovePendingMoveEvents()

static int RemovePendingMoveEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 60 of file SDL_windowevents.c.

References SDL_WindowEvent::event, SDL_WINDOWEVENT, SDL_WINDOWEVENT_MOVED, SDLCALL, SDL_Event::type, SDL_Event::window, and SDL_WindowEvent::windowID.

Referenced by SDL_SendWindowEvent().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:529
General event structure.
Definition: SDL_events.h:525
Uint32 type
Definition: SDL_events.h:527

◆ RemovePendingResizedEvents()

static int RemovePendingResizedEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 32 of file SDL_windowevents.c.

References SDL_WindowEvent::event, SDL_WINDOWEVENT, SDL_WINDOWEVENT_RESIZED, SDLCALL, SDL_Event::type, SDL_Event::window, and SDL_WindowEvent::windowID.

Referenced by SDL_SendWindowEvent().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:529
General event structure.
Definition: SDL_events.h:525
Uint32 type
Definition: SDL_events.h:527

◆ RemovePendingSizeChangedEvents()

static int RemovePendingSizeChangedEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 46 of file SDL_windowevents.c.

References SDL_WindowEvent::event, SDL_WINDOWEVENT, SDL_WINDOWEVENT_SIZE_CHANGED, SDLCALL, SDL_Event::type, SDL_Event::window, and SDL_WindowEvent::windowID.

Referenced by SDL_SendWindowEvent().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:529
General event structure.
Definition: SDL_events.h:525
Uint32 type
Definition: SDL_events.h:527

◆ SDL_SendWindowEvent()

int SDL_SendWindowEvent ( SDL_Window window,
Uint8  windowevent,
int  data1,
int  data2 
)

Definition at line 88 of file SDL_windowevents.c.

References SDL_Window::flags, SDL_Rect::h, SDL_Window::h, SDL_Window::id, SDL_Window::next, SDL_Window::prev, RemovePendingExposedEvents(), RemovePendingMoveEvents(), RemovePendingResizedEvents(), RemovePendingSizeChangedEvents(), SDL_ENABLE, SDL_FilterEvents, SDL_GetEventState, SDL_OnWindowEnter(), SDL_OnWindowFocusGained(), SDL_OnWindowFocusLost(), SDL_OnWindowHidden(), SDL_OnWindowLeave(), SDL_OnWindowMinimized(), SDL_OnWindowResized(), SDL_OnWindowRestored(), SDL_OnWindowShown(), SDL_PushEvent, SDL_SendQuit(), SDL_WINDOW_FULLSCREEN, SDL_WINDOW_HIDDEN, SDL_WINDOW_INPUT_FOCUS, SDL_WINDOW_MAXIMIZED, SDL_WINDOW_MINIMIZED, SDL_WINDOW_MOUSE_FOCUS, SDL_WINDOW_SHOWN, SDL_WINDOWEVENT, SDL_WINDOWEVENT_CLOSE, SDL_WINDOWEVENT_ENTER, SDL_WINDOWEVENT_EXPOSED, SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_FOCUS_LOST, SDL_WINDOWEVENT_HIDDEN, SDL_WINDOWEVENT_LEAVE, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_MINIMIZED, SDL_WINDOWEVENT_MOVED, SDL_WINDOWEVENT_RESIZED, SDL_WINDOWEVENT_RESTORED, SDL_WINDOWEVENT_SHOWN, SDL_WINDOWEVENT_SIZE_CHANGED, SDL_WINDOWPOS_ISUNDEFINED, SDL_Rect::w, SDL_Window::w, SDL_Window::windowed, SDL_Rect::x, SDL_Window::x, SDL_Rect::y, and SDL_Window::y.

Referenced by SDL_BApp::_HandleBasicWindowEvent(), SDL_BApp::_HandleWindowMoved(), SDL_BApp::_HandleWindowResized(), IsSDLWindowEventPending(), SDL_HideWindow(), SDL_OnApplicationDidBecomeActive(), SDL_OnApplicationWillResignActive(), SDL_OnWindowResized(), SDL_SetKeyboardFocus(), SDL_SetMouseFocus(), SDL_SetWindowPosition(), SDL_ShowWindow(), SDL_UpdateFullscreenMode(), and WINRT_ProcessWindowSizeChange().

90 {
91  int posted;
92 
93  if (!window) {
94  return 0;
95  }
96  switch (windowevent) {
98  if (window->flags & SDL_WINDOW_SHOWN) {
99  return 0;
100  }
101  window->flags &= ~SDL_WINDOW_HIDDEN;
102  window->flags |= SDL_WINDOW_SHOWN;
103  SDL_OnWindowShown(window);
104  break;
106  if (!(window->flags & SDL_WINDOW_SHOWN)) {
107  return 0;
108  }
109  window->flags &= ~SDL_WINDOW_SHOWN;
110  window->flags |= SDL_WINDOW_HIDDEN;
111  SDL_OnWindowHidden(window);
112  break;
114  if (SDL_WINDOWPOS_ISUNDEFINED(data1) ||
115  SDL_WINDOWPOS_ISUNDEFINED(data2)) {
116  return 0;
117  }
118  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
119  window->windowed.x = data1;
120  window->windowed.y = data2;
121  }
122  if (data1 == window->x && data2 == window->y) {
123  return 0;
124  }
125  window->x = data1;
126  window->y = data2;
127  break;
129  if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
130  window->windowed.w = data1;
131  window->windowed.h = data2;
132  }
133  if (data1 == window->w && data2 == window->h) {
134  return 0;
135  }
136  window->w = data1;
137  window->h = data2;
138  SDL_OnWindowResized(window);
139  break;
141  if (window->flags & SDL_WINDOW_MINIMIZED) {
142  return 0;
143  }
144  window->flags &= ~SDL_WINDOW_MAXIMIZED;
145  window->flags |= SDL_WINDOW_MINIMIZED;
146  SDL_OnWindowMinimized(window);
147  break;
149  if (window->flags & SDL_WINDOW_MAXIMIZED) {
150  return 0;
151  }
152  window->flags &= ~SDL_WINDOW_MINIMIZED;
153  window->flags |= SDL_WINDOW_MAXIMIZED;
154  break;
156  if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) {
157  return 0;
158  }
160  SDL_OnWindowRestored(window);
161  break;
163  if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
164  return 0;
165  }
166  window->flags |= SDL_WINDOW_MOUSE_FOCUS;
167  SDL_OnWindowEnter(window);
168  break;
170  if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
171  return 0;
172  }
173  window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
174  SDL_OnWindowLeave(window);
175  break;
177  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
178  return 0;
179  }
180  window->flags |= SDL_WINDOW_INPUT_FOCUS;
181  SDL_OnWindowFocusGained(window);
182  break;
184  if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
185  return 0;
186  }
187  window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
188  SDL_OnWindowFocusLost(window);
189  break;
190  }
191 
192  /* Post the event, if desired */
193  posted = 0;
196  event.type = SDL_WINDOWEVENT;
197  event.window.event = windowevent;
198  event.window.data1 = data1;
199  event.window.data2 = data2;
200  event.window.windowID = window->id;
201 
202  /* Fixes queue overflow with resize events that aren't processed */
203  if (windowevent == SDL_WINDOWEVENT_RESIZED) {
205  }
206  if (windowevent == SDL_WINDOWEVENT_SIZE_CHANGED) {
208  }
209  if (windowevent == SDL_WINDOWEVENT_MOVED) {
211  }
212  if (windowevent == SDL_WINDOWEVENT_EXPOSED) {
214  }
215  posted = (SDL_PushEvent(&event) > 0);
216  }
217 
218  if (windowevent == SDL_WINDOWEVENT_CLOSE) {
219  if ( !window->prev && !window->next ) {
220  /* This is the last window in the list so send the SDL_QUIT event */
221  SDL_SendQuit();
222  }
223  }
224 
225  return (posted);
226 }
#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:2501
#define SDL_ENABLE
Definition: SDL_events.h:722
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2530
SDL_Rect windowed
Definition: SDL_sysvideo.h:87
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:2495
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2508
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
struct _cl_event * event
#define SDL_PushEvent
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2538
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Window * prev
Definition: SDL_sysvideo.h:113
int h
Definition: SDL_rect.h:67
Uint32 id
Definition: SDL_sysvideo.h:76
#define SDL_FilterEvents
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2578
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2514
General event structure.
Definition: SDL_events.h:525
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2489
Uint32 flags
Definition: SDL_sysvideo.h:83
int y
Definition: SDL_rect.h:66
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
int SDL_SendQuit(void)
Definition: SDL_quit.c:137
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2543