src/video/cocoa/SDL_cocoawindow.h
author Jørgen P. Tjernø <jorgen@valvesoftware.com>
Wed, 07 Aug 2013 16:29:21 -0700
changeset 7594 6abcf951af68
parent 7507 885b4aab4190
child 7595 ede2237fcebf
permissions -rw-r--r--
Mac: Don't -[NSOpenGLContext update] on (potentially) the wrong thread.

If the user is using their context from a non-main thread, we could be
calling -[NSOpenGLContext update] on our thread, while they were
accessing it on their thread.

With this change, we schedule updates when the event comes in on the
main thread, and act on them when the user calls SDL_GL_MakeCurrent or
SDL_GL_SwapWindow.
slouken@1933
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@6885
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
slouken@1933
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@1933
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@1933
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@1933
    20
*/
slouken@1933
    21
#include "SDL_config.h"
slouken@1933
    22
slouken@1933
    23
#ifndef _SDL_cocoawindow_h
slouken@1933
    24
#define _SDL_cocoawindow_h
slouken@1933
    25
slouken@3400
    26
#import <Cocoa/Cocoa.h>
slouken@3400
    27
slouken@1933
    28
typedef struct SDL_WindowData SDL_WindowData;
slouken@1933
    29
slouken@5374
    30
@interface Cocoa_WindowListener : NSResponder <NSWindowDelegate> {
slouken@1933
    31
    SDL_WindowData *_data;
jorgen@7090
    32
    BOOL observingVisible;
jorgen@7090
    33
    BOOL wasVisible;
slouken@1933
    34
}
slouken@1933
    35
slouken@1933
    36
-(void) listen:(SDL_WindowData *) data;
jorgen@7090
    37
-(void) pauseVisibleObservation;
jorgen@7090
    38
-(void) resumeVisibleObservation;
slouken@1933
    39
-(void) close;
slouken@1933
    40
slouken@1933
    41
/* Window delegate functionality */
slouken@1933
    42
-(BOOL) windowShouldClose:(id) sender;
slouken@1933
    43
-(void) windowDidExpose:(NSNotification *) aNotification;
slouken@1933
    44
-(void) windowDidMove:(NSNotification *) aNotification;
slouken@1933
    45
-(void) windowDidResize:(NSNotification *) aNotification;
slouken@1933
    46
-(void) windowDidMiniaturize:(NSNotification *) aNotification;
slouken@1933
    47
-(void) windowDidDeminiaturize:(NSNotification *) aNotification;
slouken@1933
    48
-(void) windowDidBecomeKey:(NSNotification *) aNotification;
slouken@1933
    49
-(void) windowDidResignKey:(NSNotification *) aNotification;
slouken@1933
    50
slouken@1933
    51
/* Window event handling */
slouken@1933
    52
-(void) mouseDown:(NSEvent *) theEvent;
slouken@1933
    53
-(void) rightMouseDown:(NSEvent *) theEvent;
slouken@1933
    54
-(void) otherMouseDown:(NSEvent *) theEvent;
slouken@1933
    55
-(void) mouseUp:(NSEvent *) theEvent;
slouken@1933
    56
-(void) rightMouseUp:(NSEvent *) theEvent;
slouken@1933
    57
-(void) otherMouseUp:(NSEvent *) theEvent;
slouken@1933
    58
-(void) mouseMoved:(NSEvent *) theEvent;
slouken@1957
    59
-(void) mouseDragged:(NSEvent *) theEvent;
slouken@1958
    60
-(void) rightMouseDragged:(NSEvent *) theEvent;
slouken@1958
    61
-(void) otherMouseDragged:(NSEvent *) theEvent;
slouken@1933
    62
-(void) scrollWheel:(NSEvent *) theEvent;
slouken@4673
    63
-(void) touchesBeganWithEvent:(NSEvent *) theEvent;
slouken@4673
    64
-(void) touchesMovedWithEvent:(NSEvent *) theEvent;
slouken@4673
    65
-(void) touchesEndedWithEvent:(NSEvent *) theEvent;
slouken@4673
    66
-(void) touchesCancelledWithEvent:(NSEvent *) theEvent;
slouken@4673
    67
slouken@4673
    68
/* Touch event handling */
slouken@4673
    69
typedef enum {
slouken@4673
    70
    COCOA_TOUCH_DOWN,
slouken@4673
    71
    COCOA_TOUCH_UP,
slouken@4673
    72
    COCOA_TOUCH_MOVE,
slouken@4673
    73
    COCOA_TOUCH_CANCELLED
slouken@4673
    74
} cocoaTouchType;
slouken@4673
    75
-(void) handleTouches:(cocoaTouchType)type withEvent:(NSEvent*) event;
slouken@4673
    76
slouken@1936
    77
@end
slouken@1936
    78
/* *INDENT-ON* */
slouken@1936
    79
jorgen@7594
    80
@class SDLOpenGLContext;
jorgen@7594
    81
slouken@1936
    82
struct SDL_WindowData
slouken@1933
    83
{
slouken@3685
    84
    SDL_Window *window;
slouken@3685
    85
    NSWindow *nswindow;
jorgen@7594
    86
    SDLOpenGLContext *nscontext;
slouken@1951
    87
    SDL_bool created;
slouken@1933
    88
    Cocoa_WindowListener *listener;
slouken@1933
    89
    struct SDL_VideoData *videodata;
slouken@1933
    90
};
slouken@1933
    91
slouken@1933
    92
extern int Cocoa_CreateWindow(_THIS, SDL_Window * window);
slouken@1933
    93
extern int Cocoa_CreateWindowFrom(_THIS, SDL_Window * window,
slouken@1933
    94
                                  const void *data);
slouken@1933
    95
extern void Cocoa_SetWindowTitle(_THIS, SDL_Window * window);
slouken@5375
    96
extern void Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon);
slouken@1933
    97
extern void Cocoa_SetWindowPosition(_THIS, SDL_Window * window);
slouken@1933
    98
extern void Cocoa_SetWindowSize(_THIS, SDL_Window * window);
stopiccot@6681
    99
extern void Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window);
slouken@6788
   100
extern void Cocoa_SetWindowMaximumSize(_THIS, SDL_Window * window);
slouken@1933
   101
extern void Cocoa_ShowWindow(_THIS, SDL_Window * window);
slouken@1933
   102
extern void Cocoa_HideWindow(_THIS, SDL_Window * window);
slouken@1933
   103
extern void Cocoa_RaiseWindow(_THIS, SDL_Window * window);
slouken@1933
   104
extern void Cocoa_MaximizeWindow(_THIS, SDL_Window * window);
slouken@1933
   105
extern void Cocoa_MinimizeWindow(_THIS, SDL_Window * window);
slouken@1933
   106
extern void Cocoa_RestoreWindow(_THIS, SDL_Window * window);
icculus@6422
   107
extern void Cocoa_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered);
slouken@5305
   108
extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
slouken@5466
   109
extern int Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
slouken@5466
   110
extern int Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
slouken@6662
   111
extern void Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
slouken@1933
   112
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
slouken@1933
   113
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window,
slouken@1933
   114
                                      struct SDL_SysWMinfo *info);
slouken@1933
   115
slouken@1933
   116
#endif /* _SDL_cocoawindow_h */
slouken@1933
   117
slouken@1933
   118
/* vi: set ts=4 sw=4 expandtab: */