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 dependency graph for SDL_windowevents.c:

Go to the source code of this file.

Functions

static int RemovePendingSizeChangedAndResizedEvents (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 60 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().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:562
General event structure.
Definition: SDL_events.h:557
Uint32 type
Definition: SDL_events.h:559

◆ RemovePendingMoveEvents()

static int RemovePendingMoveEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 46 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().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:562
General event structure.
Definition: SDL_events.h:557
Uint32 type
Definition: SDL_events.h:559

◆ RemovePendingSizeChangedAndResizedEvents()

static int RemovePendingSizeChangedAndResizedEvents ( void userdata,
SDL_Event event 
)
static

Definition at line 31 of file SDL_windowevents.c.

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

Referenced by SDL_SendWindowEvent().

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 }
SDL_WindowEvent window
Definition: SDL_events.h:562
General event structure.
Definition: SDL_events.h:557
Uint32 type
Definition: SDL_events.h:559

◆ SDL_SendWindowEvent()

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

Definition at line 74 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(), RemovePendingSizeChangedAndResizedEvents(), 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().

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 }
#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
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
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2585
#define SDL_GetEventState(type)
Definition: SDL_events.h:769
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)
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: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
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:2620