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 &&
36  (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED ||
37  event->window.event == SDL_WINDOWEVENT_RESIZED) &&
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 &&
51  event->window.event == SDL_WINDOWEVENT_MOVED &&
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 &&
65  event->window.event == SDL_WINDOWEVENT_EXPOSED &&
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;
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;
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;
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;
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  }
147  break;
149  if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
150  return 0;
151  }
152  window->flags |= SDL_WINDOW_MOUSE_FOCUS;
154  break;
156  if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
157  return 0;
158  }
159  window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
161  break;
163  if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
164  return 0;
165  }
166  window->flags |= SDL_WINDOW_INPUT_FOCUS;
168  break;
170  if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
171  return 0;
172  }
173  window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
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: */
SDL_OnWindowMinimized
void SDL_OnWindowMinimized(SDL_Window *window)
Definition: SDL_video.c:2604
SDL_events.h
SDL_WINDOW_MINIMIZED
@ SDL_WINDOW_MINIMIZED
Definition: SDL_video.h:106
SDL_WINDOWEVENT_FOCUS_LOST
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
SDL_WINDOWEVENT_CLOSE
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:167
SDL_WINDOWEVENT_ENTER
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:163
SDL_OnWindowHidden
void SDL_OnWindowHidden(SDL_Window *window)
Definition: SDL_video.c:2591
SDLCALL
#define SDLCALL
Definition: SDL_internal.h:49
SDL_WINDOW_FULLSCREEN
@ SDL_WINDOW_FULLSCREEN
Definition: SDL_video.h:100
SDL_WindowEvent::windowID
Uint32 windowID
Definition: SDL_events.h:199
SDL_WINDOWEVENT_RESIZED
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
SDL_mouse_c.h
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:759
SDL_WINDOW_MAXIMIZED
@ SDL_WINDOW_MAXIMIZED
Definition: SDL_video.h:107
SDL_WINDOWEVENT_MOVED
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:153
SDL_WINDOW_INPUT_FOCUS
@ SDL_WINDOW_INPUT_FOCUS
Definition: SDL_video.h:109
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:73
SDL_WINDOWEVENT_SHOWN
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_OnWindowRestored
void SDL_OnWindowRestored(SDL_Window *window)
Definition: SDL_video.c:2610
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:772
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
RemovePendingMoveEvents
static int RemovePendingMoveEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:46
SDL_PushEvent
#define SDL_PushEvent
Definition: SDL_dynapi_overrides.h:125
SDL_WINDOWEVENT_EXPOSED
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
SDL_Event::window
SDL_WindowEvent window
Definition: SDL_events.h:562
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
SDL_WINDOWEVENT_MINIMIZED
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
SDL_WINDOW_SHOWN
@ SDL_WINDOW_SHOWN
Definition: SDL_video.h:102
RemovePendingExposedEvents
static int RemovePendingExposedEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:60
SDL_OnWindowShown
void SDL_OnWindowShown(SDL_Window *window)
Definition: SDL_video.c:2585
SDL_OnWindowFocusGained
void SDL_OnWindowFocusGained(SDL_Window *window)
Definition: SDL_video.c:2639
SDL_WINDOW_HIDDEN
@ SDL_WINDOW_HIDDEN
Definition: SDL_video.h:103
SDL_FilterEvents
#define SDL_FilterEvents
Definition: SDL_dynapi_overrides.h:130
RemovePendingSizeChangedAndResizedEvents
static int RemovePendingSizeChangedAndResizedEvents(void *userdata, SDL_Event *event)
Definition: SDL_windowevents.c:31
SDL_SendWindowEvent
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
Definition: SDL_windowevents.c:74
SDL_events_c.h
SDL_OnWindowFocusLost
void SDL_OnWindowFocusLost(SDL_Window *window)
Definition: SDL_video.c:2683
SDL_OnWindowLeave
void SDL_OnWindowLeave(SDL_Window *window)
Definition: SDL_video.c:2634
SDL_WINDOW_MOUSE_FOCUS
@ SDL_WINDOW_MOUSE_FOCUS
Definition: SDL_video.h:110
SDL_WINDOWEVENT_HIDDEN
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
SDL_Event
General event structure.
Definition: SDL_events.h:557
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
SDL_WINDOWEVENT_RESTORED
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
SDL_WINDOWEVENT_FOCUS_GAINED
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
SDL_SendQuit
int SDL_SendQuit(void)
Definition: SDL_quit.c:201
SDL_WINDOWPOS_ISUNDEFINED
#define SDL_WINDOWPOS_ISUNDEFINED(X)
Definition: SDL_video.h:131
SDL_OnWindowResized
void SDL_OnWindowResized(SDL_Window *window)
Definition: SDL_video.c:2597
SDL_WINDOWEVENT_MAXIMIZED
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:160
SDL_WINDOWEVENT_LEAVE
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:164
SDL_OnWindowEnter
void SDL_OnWindowEnter(SDL_Window *window)
Definition: SDL_video.c:2626
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179