This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_QuartzWindow.m
214 lines (159 loc) · 6.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
22
#include "SDL_config.h"
23
24
25
#include "SDL_QuartzVideo.h"
#include "SDL_QuartzWindow.h"
26
27
28
29
30
31
/*
This function makes the *SDL region* of the window 100% opaque.
The genie effect uses the alpha component. Otherwise,
it doesn't seem to matter what value it has.
*/
32
33
34
35
static void
QZ_SetPortAlphaOpaque ()
{
36
37
SDL_Surface *surface = current_video->screen;
int bpp;
38
39
bpp = surface->format->BitsPerPixel;
40
41
if (bpp == 32) {
42
43
44
45
46
Uint32 *pixels = (Uint32 *) surface->pixels;
Uint32 rowPixels = surface->pitch / 4;
Uint32 i, j;
47
48
for (i = 0; i < surface->h; i++)
for (j = 0; j < surface->w; j++) {
49
50
pixels[(i * rowPixels) + j] |= 0xFF000000;
51
52
53
54
}
}
}
55
@implementation SDL_QuartzWindow
56
/* we override these methods to fix the miniaturize animation/dock icon bug */
57
58
59
- (void) miniaturize:(id) sender {
if (SDL_VideoSurface->flags & SDL_INTERNALOPENGL) {
60
/*
61
62
63
64
65
Future: Grab framebuffer and put into NSImage
[ qz_window setMiniwindowImage:image ];
*/
} else {
66
67
/* make the alpha channel opaque so anim won't have holes in it */
QZ_SetPortAlphaOpaque ();
68
}
69
70
71
/* window is hidden now */
SDL_PrivateAppActive (0, SDL_APPACTIVE);
72
73
[super miniaturize:sender];
74
75
}
76
-(void) display {
77
/*
78
79
80
81
82
83
84
85
This method fires just before the window deminaturizes from the Dock.
We'll save the current visible surface, let the window manager redraw any
UI elements, and restore the SDL surface. This way, no expose event
is required, and the deminiaturize works perfectly.
*/
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
86
/* make sure pixels are fully opaque */
87
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
88
QZ_SetPortAlphaOpaque ();
89
90
/* save current visible SDL surface */
91
92
[self cacheImageInRect:[window_view frame]];
93
/* let the window manager redraw controls, border, etc */
94
95
[super display];
96
/* restore visible SDL surface */
97
98
[self restoreCachedImage];
99
100
/* window is visible again */
SDL_PrivateAppActive (1, SDL_APPACTIVE);
101
102
}
103
104
-(void) setFrame:(NSRect)
frameRect display:(BOOL) flag
105
{
106
107
/*
108
109
110
111
112
If the video surface is NULL, this originated from QZ_SetVideoMode,
so don't send the resize event.
*/
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
113
if (this && SDL_VideoSurface == NULL) {
114
115
116
[super setFrame: frameRect display:flag];
} else if (this && qz_window) {
117
118
NSRect newViewFrame;
119
120
121
122
123
[super setFrame: frameRect display:flag];
newViewFrame =[window_view frame];
124
SDL_PrivateResize (newViewFrame.size.width, newViewFrame.size.height);
125
126
/* If not OpenGL, we have to update the pixels and pitch */
127
128
129
130
131
132
133
134
135
136
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL)) {
CGrafPtr thePort =[window_view qdPort];
LockPortBits (thePort);
SDL_VideoSurface->pixels =
GetPixBaseAddr (GetPortPixMap (thePort));
SDL_VideoSurface->pitch =
GetPixRowBytes (GetPortPixMap (thePort));
137
/*
138
139
140
141
142
SDL_VideoSurface->pixels now points to the window's pixels
We want it to point to the *view's* pixels
*/
{
int vOffset =[qz_window frame].size.height -
143
newViewFrame.size.height - newViewFrame.origin.y;
144
145
int hOffset = newViewFrame.origin.x;
146
147
148
149
150
SDL_VideoSurface->pixels =
(Uint8 *) SDL_VideoSurface->pixels +
(vOffset * SDL_VideoSurface->pitch) +
hOffset * (device_bpp / 8);
151
}
152
153
UnlockPortBits (thePort);
154
155
}
}
156
}
157
158
-(void) appDidHide:(NSNotification *) note {
159
160
161
SDL_PrivateAppActive (0, SDL_APPACTIVE);
}
162
163
164
165
166
-(void) appWillUnhide:(NSNotification *) note {
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
if (this) {
167
/* make sure pixels are fully opaque */
168
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
169
QZ_SetPortAlphaOpaque ();
170
171
/* save current visible SDL surface */
172
[self cacheImageInRect:[window_view frame]];
173
174
175
}
}
176
-(void) appDidUnhide:(NSNotification *) note {
177
/* restore cached image, since it may not be current, post expose event too */
178
179
180
181
[self restoreCachedImage];
/*SDL_PrivateExpose (); */
182
183
184
SDL_PrivateAppActive (1, SDL_APPACTIVE);
}
185
186
187
188
-(id) initWithContentRect:(NSRect)
contentRect styleMask:(unsigned int)
styleMask backing:(NSBackingStoreType)
backingType defer:(BOOL) flag
189
190
{
/* Make our window subclass receive these application notifications */
191
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidHide: )name: NSApplicationDidHideNotification object:NSApp];
192
193
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidUnhide: )name: NSApplicationDidUnhideNotification object:NSApp];
194
195
196
197
198
199
200
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appWillUnhide: )name: NSApplicationWillUnhideNotification object:NSApp];
return[super initWithContentRect: contentRect styleMask: styleMask backing: backingType defer:flag];
}
@end @ implementation SDL_QuartzWindowDelegate - (BOOL) windowShouldClose:(id) sender
201
{
202
SDL_PrivateQuit ();
203
204
return NO;
}
205
206
-(void) windowDidBecomeKey:(NSNotification *) aNotification {
207
QZ_DoActivate (current_video);
208
209
}
210
-(void) windowDidResignKey:(NSNotification *) aNotification {
211
QZ_DoDeactivate (current_video);
212
213
}
214
@end