Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
214 lines (159 loc) · 6.36 KB

SDL_QuartzWindow.m

File metadata and controls

214 lines (159 loc) · 6.36 KB
 
Jan 4, 2004
Jan 4, 2004
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
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Jan 4, 2004
Jan 4, 2004
23
24
25
#include "SDL_QuartzVideo.h"
#include "SDL_QuartzWindow.h"
Oct 5, 2002
Oct 5, 2002
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.
*/
Jul 10, 2006
Jul 10, 2006
32
33
34
35
static void
QZ_SetPortAlphaOpaque ()
{
Oct 5, 2002
Oct 5, 2002
36
37
SDL_Surface *surface = current_video->screen;
int bpp;
Jul 10, 2006
Jul 10, 2006
38
Oct 5, 2002
Oct 5, 2002
39
bpp = surface->format->BitsPerPixel;
Jul 10, 2006
Jul 10, 2006
40
Jan 22, 2002
Jan 22, 2002
41
if (bpp == 32) {
Jul 10, 2006
Jul 10, 2006
42
43
44
45
46
Uint32 *pixels = (Uint32 *) surface->pixels;
Uint32 rowPixels = surface->pitch / 4;
Uint32 i, j;
Oct 5, 2002
Oct 5, 2002
47
48
for (i = 0; i < surface->h; i++)
for (j = 0; j < surface->w; j++) {
Jul 10, 2006
Jul 10, 2006
49
50
pixels[(i * rowPixels) + j] |= 0xFF000000;
Jan 22, 2002
Jan 22, 2002
51
52
53
54
}
}
}
55
@implementation SDL_QuartzWindow
Oct 5, 2002
Oct 5, 2002
56
/* we override these methods to fix the miniaturize animation/dock icon bug */
Jul 10, 2006
Jul 10, 2006
57
58
59
- (void) miniaturize:(id) sender {
if (SDL_VideoSurface->flags & SDL_INTERNALOPENGL) {
Oct 5, 2002
Oct 5, 2002
60
/*
Jul 10, 2006
Jul 10, 2006
61
62
63
64
65
Future: Grab framebuffer and put into NSImage
[ qz_window setMiniwindowImage:image ];
*/
} else {
Oct 5, 2002
Oct 5, 2002
66
67
/* make the alpha channel opaque so anim won't have holes in it */
QZ_SetPortAlphaOpaque ();
Jan 22, 2002
Jan 22, 2002
68
}
Jul 10, 2006
Jul 10, 2006
69
May 29, 2003
May 29, 2003
70
71
/* window is hidden now */
SDL_PrivateAppActive (0, SDL_APPACTIVE);
Jul 10, 2006
Jul 10, 2006
72
73
[super miniaturize:sender];
Jul 10, 2006
Jul 10, 2006
76
-(void) display {
Oct 5, 2002
Oct 5, 2002
77
/*
Jul 10, 2006
Jul 10, 2006
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;
Aug 10, 2003
Aug 10, 2003
86
/* make sure pixels are fully opaque */
Jul 10, 2006
Jul 10, 2006
87
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
Oct 5, 2002
Oct 5, 2002
88
QZ_SetPortAlphaOpaque ();
Jul 10, 2006
Jul 10, 2006
89
Aug 10, 2003
Aug 10, 2003
90
/* save current visible SDL surface */
Jul 10, 2006
Jul 10, 2006
91
92
[self cacheImageInRect:[window_view frame]];
Aug 10, 2003
Aug 10, 2003
93
/* let the window manager redraw controls, border, etc */
Jul 10, 2006
Jul 10, 2006
94
95
[super display];
Aug 10, 2003
Aug 10, 2003
96
/* restore visible SDL surface */
Jul 10, 2006
Jul 10, 2006
97
98
[self restoreCachedImage];
May 29, 2003
May 29, 2003
99
100
/* window is visible again */
SDL_PrivateAppActive (1, SDL_APPACTIVE);
Jul 10, 2006
Jul 10, 2006
103
104
-(void) setFrame:(NSRect)
frameRect display:(BOOL) flag
Jun 11, 2001
Jun 11, 2001
105
{
Oct 5, 2002
Oct 5, 2002
106
107
/*
Jul 10, 2006
Jul 10, 2006
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;
Aug 10, 2003
Aug 10, 2003
113
if (this && SDL_VideoSurface == NULL) {
Oct 5, 2002
Oct 5, 2002
114
Jul 10, 2006
Jul 10, 2006
115
116
[super setFrame: frameRect display:flag];
} else if (this && qz_window) {
Oct 5, 2002
Oct 5, 2002
117
Aug 10, 2003
Aug 10, 2003
118
NSRect newViewFrame;
Jul 10, 2006
Jul 10, 2006
119
120
121
122
123
[super setFrame: frameRect display:flag];
newViewFrame =[window_view frame];
Aug 10, 2003
Aug 10, 2003
124
SDL_PrivateResize (newViewFrame.size.width, newViewFrame.size.height);
Oct 5, 2002
Oct 5, 2002
125
126
/* If not OpenGL, we have to update the pixels and pitch */
Jul 10, 2006
Jul 10, 2006
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));
Aug 10, 2003
Aug 10, 2003
137
/*
Jul 10, 2006
Jul 10, 2006
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 -
Aug 10, 2003
Aug 10, 2003
143
newViewFrame.size.height - newViewFrame.origin.y;
Jul 10, 2006
Jul 10, 2006
144
Aug 10, 2003
Aug 10, 2003
145
int hOffset = newViewFrame.origin.x;
Jul 10, 2006
Jul 10, 2006
146
147
148
149
150
SDL_VideoSurface->pixels =
(Uint8 *) SDL_VideoSurface->pixels +
(vOffset * SDL_VideoSurface->pitch) +
hOffset * (device_bpp / 8);
Aug 10, 2003
Aug 10, 2003
151
}
Jul 10, 2006
Jul 10, 2006
152
153
UnlockPortBits (thePort);
Oct 5, 2002
Oct 5, 2002
154
155
}
}
Jun 11, 2001
Jun 11, 2001
156
}
Oct 5, 2002
Oct 5, 2002
157
Jul 10, 2006
Jul 10, 2006
158
-(void) appDidHide:(NSNotification *) note {
May 29, 2003
May 29, 2003
159
160
161
SDL_PrivateAppActive (0, SDL_APPACTIVE);
}
Jul 10, 2006
Jul 10, 2006
162
163
164
165
166
-(void) appWillUnhide:(NSNotification *) note {
SDL_VideoDevice *this = (SDL_VideoDevice *) current_video;
if (this) {
Aug 10, 2003
Aug 10, 2003
167
/* make sure pixels are fully opaque */
Jul 10, 2006
Jul 10, 2006
168
if (!(SDL_VideoSurface->flags & SDL_INTERNALOPENGL))
Aug 10, 2003
Aug 10, 2003
169
QZ_SetPortAlphaOpaque ();
Jul 10, 2006
Jul 10, 2006
170
Aug 10, 2003
Aug 10, 2003
171
/* save current visible SDL surface */
Jul 10, 2006
Jul 10, 2006
172
[self cacheImageInRect:[window_view frame]];
Aug 10, 2003
Aug 10, 2003
173
174
175
}
}
Jul 10, 2006
Jul 10, 2006
176
-(void) appDidUnhide:(NSNotification *) note {
Aug 10, 2003
Aug 10, 2003
177
/* restore cached image, since it may not be current, post expose event too */
Jul 10, 2006
Jul 10, 2006
178
179
180
181
[self restoreCachedImage];
/*SDL_PrivateExpose (); */
May 29, 2003
May 29, 2003
182
183
184
SDL_PrivateAppActive (1, SDL_APPACTIVE);
}
Jul 10, 2006
Jul 10, 2006
185
186
187
188
-(id) initWithContentRect:(NSRect)
contentRect styleMask:(unsigned int)
styleMask backing:(NSBackingStoreType)
backingType defer:(BOOL) flag
May 29, 2003
May 29, 2003
189
190
{
/* Make our window subclass receive these application notifications */
Jul 10, 2006
Jul 10, 2006
191
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidHide: )name: NSApplicationDidHideNotification object:NSApp];
May 29, 2003
May 29, 2003
192
Jul 10, 2006
Jul 10, 2006
193
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (appDidUnhide: )name: NSApplicationDidUnhideNotification object:NSApp];
Jun 11, 2001
Jun 11, 2001
194
Jul 10, 2006
Jul 10, 2006
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
Oct 5, 2002
Oct 5, 2002
201
{
Jul 10, 2006
Jul 10, 2006
202
SDL_PrivateQuit ();
Jun 11, 2001
Jun 11, 2001
203
204
return NO;
}
Jan 7, 2004
Jan 7, 2004
205
Jul 10, 2006
Jul 10, 2006
206
-(void) windowDidBecomeKey:(NSNotification *) aNotification {
Apr 13, 2006
Apr 13, 2006
207
QZ_DoActivate (current_video);
Jan 7, 2004
Jan 7, 2004
208
209
}
Jul 10, 2006
Jul 10, 2006
210
-(void) windowDidResignKey:(NSNotification *) aNotification {
Apr 13, 2006
Apr 13, 2006
211
QZ_DoDeactivate (current_video);
Jan 7, 2004
Jan 7, 2004
212
213
}
Jan 22, 2002
Jan 22, 2002
214
@end