src/events/SDL_windowevents.c
author Sam Lantinga <slouken@libsdl.org>
Fri, 11 Feb 2011 00:25:44 -0800
changeset 5249 7a963be087ef
parent 5166 4d39eeaad00b
child 5261 595814f561f7
permissions -rw-r--r--
Mostly fixed fullscreen mode on Mac OS X, and you can toggle it on and off.

There are still some problems with the ConvertNSRect() calculations when switching video modes, which causes wierd window positioning issues, and the fullscreen window is still minimized on exit.
slouken@1895
     1
/*
slouken@1895
     2
    SDL - Simple DirectMedia Layer
slouken@3697
     3
    Copyright (C) 1997-2010 Sam Lantinga
slouken@1895
     4
slouken@1895
     5
    This library is free software; you can redistribute it and/or
slouken@1895
     6
    modify it under the terms of the GNU Lesser General Public
slouken@1895
     7
    License as published by the Free Software Foundation; either
slouken@1895
     8
    version 2.1 of the License, or (at your option) any later version.
slouken@1895
     9
slouken@1895
    10
    This library is distributed in the hope that it will be useful,
slouken@1895
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
slouken@1895
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
slouken@1895
    13
    Lesser General Public License for more details.
slouken@1895
    14
slouken@1895
    15
    You should have received a copy of the GNU Lesser General Public
slouken@1895
    16
    License along with this library; if not, write to the Free Software
slouken@1895
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
slouken@1895
    18
slouken@1895
    19
    Sam Lantinga
slouken@1895
    20
    slouken@libsdl.org
slouken@1895
    21
*/
slouken@1895
    22
#include "SDL_config.h"
slouken@1895
    23
slouken@1895
    24
/* Window event handling code for SDL */
slouken@1895
    25
slouken@1895
    26
#include "SDL_events.h"
slouken@1895
    27
#include "SDL_events_c.h"
slouken@2794
    28
#include "SDL_mouse_c.h"
slouken@1895
    29
#include "../video/SDL_sysvideo.h"
slouken@1895
    30
slouken@3573
    31
slouken@3573
    32
static int
slouken@3573
    33
RemovePendingSizeEvents(void * userdata, SDL_Event *event)
slouken@3573
    34
{
slouken@3573
    35
    SDL_Event *new_event = (SDL_Event *)userdata;
slouken@3573
    36
slouken@3573
    37
    if (event->type == SDL_WINDOWEVENT &&
slouken@3573
    38
        event->window.event == SDL_WINDOWEVENT_RESIZED &&
slouken@3573
    39
        event->window.windowID == new_event->window.windowID) {
slouken@3573
    40
        /* We're about to post a new size event, drop the old one */
slouken@3573
    41
        return 0;
slouken@3573
    42
    }
slouken@3573
    43
    return 1;
slouken@3573
    44
}
slouken@3573
    45
slouken@5042
    46
static int
slouken@5042
    47
RemovePendingMoveEvents(void * userdata, SDL_Event *event)
slouken@5042
    48
{
slouken@5042
    49
    SDL_Event *new_event = (SDL_Event *)userdata;
slouken@5042
    50
slouken@5042
    51
    if (event->type == SDL_WINDOWEVENT &&
slouken@5042
    52
        event->window.event == SDL_WINDOWEVENT_MOVED &&
slouken@5042
    53
        event->window.windowID == new_event->window.windowID) {
slouken@5042
    54
        /* We're about to post a new move event, drop the old one */
slouken@5042
    55
        return 0;
slouken@5042
    56
    }
slouken@5042
    57
    return 1;
slouken@5042
    58
}
slouken@5042
    59
slouken@1895
    60
int
slouken@3685
    61
SDL_SendWindowEvent(SDL_Window * window, Uint8 windowevent, int data1,
slouken@1895
    62
                    int data2)
slouken@1895
    63
{
slouken@1895
    64
    int posted;
slouken@1895
    65
slouken@1895
    66
    if (!window) {
slouken@1895
    67
        return 0;
slouken@1895
    68
    }
slouken@1895
    69
    switch (windowevent) {
slouken@1895
    70
    case SDL_WINDOWEVENT_SHOWN:
slouken@1895
    71
        if (window->flags & SDL_WINDOW_SHOWN) {
slouken@1895
    72
            return 0;
slouken@1895
    73
        }
slouken@1895
    74
        window->flags |= SDL_WINDOW_SHOWN;
slouken@1895
    75
        SDL_OnWindowShown(window);
slouken@1895
    76
        break;
slouken@1895
    77
    case SDL_WINDOWEVENT_HIDDEN:
slouken@1895
    78
        if (!(window->flags & SDL_WINDOW_SHOWN)) {
slouken@1895
    79
            return 0;
slouken@1895
    80
        }
slouken@1895
    81
        window->flags &= ~SDL_WINDOW_SHOWN;
slouken@1895
    82
        SDL_OnWindowHidden(window);
slouken@1895
    83
        break;
slouken@1895
    84
    case SDL_WINDOWEVENT_MOVED:
slouken@5249
    85
        if (SDL_WINDOWPOS_ISUNDEFINED(data1) ||
slouken@5249
    86
            SDL_WINDOWPOS_ISUNDEFINED(data2)) {
slouken@1895
    87
            return 0;
slouken@1895
    88
        }
slouken@5249
    89
        if (window->flags & SDL_WINDOW_FULLSCREEN) {
slouken@5249
    90
            window->fullscreen.x = data1;
slouken@5249
    91
            window->fullscreen.y = data1;
slouken@5249
    92
        } else {
slouken@5249
    93
            window->windowed.x = data1;
slouken@5249
    94
            window->windowed.y = data1;
slouken@2875
    95
        }
slouken@1895
    96
        if (data1 == window->x && data2 == window->y) {
slouken@1895
    97
            return 0;
slouken@1895
    98
        }
slouken@1915
    99
        window->x = data1;
slouken@1915
   100
        window->y = data2;
slouken@5249
   101
slouken@5249
   102
        if (window->flags & SDL_WINDOW_FULLSCREEN) {
slouken@5249
   103
            /* Do we really want to do this? */
slouken@5249
   104
            return 0;
slouken@5249
   105
        }
slouken@1895
   106
        break;
slouken@1895
   107
    case SDL_WINDOWEVENT_RESIZED:
slouken@1895
   108
        if (window->flags & SDL_WINDOW_FULLSCREEN) {
slouken@5249
   109
            window->fullscreen.w = data1;
slouken@5249
   110
            window->fullscreen.h = data1;
slouken@5249
   111
        } else {
slouken@5249
   112
            window->windowed.w = data1;
slouken@5249
   113
            window->windowed.h = data1;
slouken@1895
   114
        }
slouken@1895
   115
        if (data1 == window->w && data2 == window->h) {
slouken@1895
   116
            return 0;
slouken@1895
   117
        }
slouken@1915
   118
        window->w = data1;
slouken@1915
   119
        window->h = data2;
slouken@5166
   120
        SDL_OnWindowResized(window);
slouken@5249
   121
slouken@5249
   122
        if (window->flags & SDL_WINDOW_FULLSCREEN) {
slouken@5249
   123
            /* Do we really want to do this? */
slouken@5249
   124
            return 0;
slouken@5249
   125
        }
slouken@1895
   126
        break;
slouken@1895
   127
    case SDL_WINDOWEVENT_MINIMIZED:
slouken@1895
   128
        if (window->flags & SDL_WINDOW_MINIMIZED) {
slouken@1895
   129
            return 0;
slouken@1895
   130
        }
slouken@1895
   131
        window->flags |= SDL_WINDOW_MINIMIZED;
slouken@3502
   132
        SDL_OnWindowMinimized(window);
slouken@1895
   133
        break;
slouken@1895
   134
    case SDL_WINDOWEVENT_MAXIMIZED:
slouken@1895
   135
        if (window->flags & SDL_WINDOW_MAXIMIZED) {
slouken@1895
   136
            return 0;
slouken@1895
   137
        }
slouken@1895
   138
        window->flags |= SDL_WINDOW_MAXIMIZED;
slouken@1895
   139
        break;
slouken@1895
   140
    case SDL_WINDOWEVENT_RESTORED:
slouken@1895
   141
        if (!(window->flags & (SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED))) {
slouken@1895
   142
            return 0;
slouken@1895
   143
        }
slouken@1895
   144
        window->flags &= ~(SDL_WINDOW_MINIMIZED | SDL_WINDOW_MAXIMIZED);
slouken@3502
   145
        SDL_OnWindowRestored(window);
slouken@1895
   146
        break;
slouken@1895
   147
    case SDL_WINDOWEVENT_ENTER:
slouken@1895
   148
        if (window->flags & SDL_WINDOW_MOUSE_FOCUS) {
slouken@1895
   149
            return 0;
slouken@1895
   150
        }
slouken@1895
   151
        window->flags |= SDL_WINDOW_MOUSE_FOCUS;
slouken@1895
   152
        break;
slouken@1895
   153
    case SDL_WINDOWEVENT_LEAVE:
slouken@1895
   154
        if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) {
slouken@1895
   155
            return 0;
slouken@1895
   156
        }
slouken@1895
   157
        window->flags &= ~SDL_WINDOW_MOUSE_FOCUS;
slouken@1895
   158
        break;
slouken@1895
   159
    case SDL_WINDOWEVENT_FOCUS_GAINED:
slouken@1895
   160
        if (window->flags & SDL_WINDOW_INPUT_FOCUS) {
slouken@1895
   161
            return 0;
slouken@1895
   162
        }
slouken@1895
   163
        window->flags |= SDL_WINDOW_INPUT_FOCUS;
slouken@1895
   164
        SDL_OnWindowFocusGained(window);
slouken@1895
   165
        break;
slouken@1895
   166
    case SDL_WINDOWEVENT_FOCUS_LOST:
slouken@1895
   167
        if (!(window->flags & SDL_WINDOW_INPUT_FOCUS)) {
slouken@1895
   168
            return 0;
slouken@1895
   169
        }
slouken@1895
   170
        window->flags &= ~SDL_WINDOW_INPUT_FOCUS;
slouken@1895
   171
        SDL_OnWindowFocusLost(window);
slouken@1895
   172
        break;
slouken@1895
   173
    }
slouken@1895
   174
slouken@1895
   175
    /* Post the event, if desired */
slouken@1895
   176
    posted = 0;
slouken@4429
   177
    if (SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE) {
slouken@1895
   178
        SDL_Event event;
slouken@1895
   179
        event.type = SDL_WINDOWEVENT;
slouken@1895
   180
        event.window.event = windowevent;
slouken@1895
   181
        event.window.data1 = data1;
slouken@1895
   182
        event.window.data2 = data2;
slouken@3685
   183
        event.window.windowID = window->id;
slouken@3573
   184
slouken@3573
   185
        /* Fixes queue overflow with resize events that aren't processed */
slouken@3573
   186
        if (windowevent == SDL_WINDOWEVENT_RESIZED) {
slouken@3573
   187
            SDL_FilterEvents(RemovePendingSizeEvents, &event);
slouken@3573
   188
        }
slouken@5042
   189
        if (windowevent == SDL_WINDOWEVENT_MOVED) {
slouken@5042
   190
            SDL_FilterEvents(RemovePendingMoveEvents, &event);
slouken@5042
   191
        }
slouken@3573
   192
slouken@1895
   193
        posted = (SDL_PushEvent(&event) > 0);
slouken@1895
   194
    }
krogoway@5113
   195
	
krogoway@5113
   196
	if (windowevent == SDL_WINDOWEVENT_CLOSE) {
krogoway@5113
   197
		if ( !window->prev && !window->next ) {
krogoway@5113
   198
			// This is the last window in the list so send the SDL_QUIT event
krogoway@5113
   199
			SDL_SendQuit();
krogoway@5113
   200
		}
krogoway@5113
   201
	}
krogoway@5113
   202
slouken@1895
   203
    return (posted);
slouken@1895
   204
}
slouken@1895
   205
slouken@1895
   206
/* vi: set ts=4 sw=4 expandtab: */