Oolite 1.91.0.7745-260117-205bce7
Loading...
Searching...
No Matches
OOCocoa.h
Go to the documentation of this file.
1/*
2
3OOCocoa.h
4
5Import OpenStep main headers and define some Macisms and other compatibility
6stuff.
7
8Oolite
9Copyright (C) 2004-2013 Giles C Williams and contributors
10
11This program is free software; you can redistribute it and/or
12modify it under the terms of the GNU General Public License
13as published by the Free Software Foundation; either version 2
14of the License, or (at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with this program; if not, write to the Free Software
23Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
24MA 02110-1301, USA.
25
26*/
27
28/*
29 Expressions like #define FOO (1 && !defined(NDEBUG)) are formally invalid,
30 causing a warning in Clang. This lets us write #define FOO (1 && OOLITE_DEBUG)
31 instead.
32 */
33#ifdef NDEBUG
34#define OOLITE_DEBUG 0
35#else
36#define OOLITE_DEBUG 1
37#endif
38
39#if !OOLITE_DEBUG
40#define NS_BLOCK_ASSERTIONS 1
41#endif
42
43
44#include <math.h>
45#include <stdbool.h>
46#import <Foundation/Foundation.h>
47
48#ifdef GNUSTEP
49 #define OOLITE_GNUSTEP 1
50
51 #if (((GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION >= 31) || (GNUSTEP_BASE_MAJOR_VERSION > 1)) && !OOLITE_MODERN_BUILD)
52 #error Oolite legacy build cannot be generated using GNUstep 1.31 or higher.
53 #endif
54
55 #if ((GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION < 28) && OOLITE_MODERN_BUILD)
56 #error Oolite modern build cannot be generated using GNUstep earlier than 1.28.
57 #endif
58
59 #if (GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION >= 20) || (GNUSTEP_BASE_MAJOR_VERSION > 1)
60 #define OOLITE_GNUSTEP_1_20 1
61 #else
62 #error Oolite for non-Mac targets requires GNUstep 1.20.
63 #endif
64
65 #ifndef NSIntegerMax
66 // Missing in GNUstep-base prior to 1.23.
67 #define NSIntegerMax INTPTR_MAX
68 #define NSIntegerMin INTPTR_MIN
69 #define NSUIntegerMax UINTPTR_MAX
70 #endif
71
72#else
73 #import <AppKit/AppKit.h>
74
75 #define OOLITE_MAC_OS_X 1
76 #define OOLITE_SPEECH_SYNTH 1
77
78 #if __LP64__
79 #define OOLITE_64_BIT 1
80 #endif
81
82 /* Useful macro copied from GNUstep.
83 */
84 #ifndef DESTROY
85 #define DESTROY(x) do { id x_ = x; x = nil; [x_ release]; } while (0)
86 #endif
87
88 #if defined MAC_OS_X_VERSION_10_7 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7
89 #define OOLITE_MAC_OS_X_10_7 1
90 #endif
91
92 #if defined MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8
93 #define OOLITE_MAC_OS_X_10_8 1
94 #endif
95
96 #ifndef MAC_OS_X_VERSION_10_12
97 typedef NSUInteger NSWindowStyleMask;
98 #endif
99#endif
100
101
102#ifndef OOLITE_MAC_OS_X_10_7
103 #define OOLITE_MAC_OS_X_10_7 0
104#endif
105
106#ifndef OOLITE_MAC_OS_X_10_8
107 #define OOLITE_MAC_OS_X_10_8 0
108#endif
109
110
111#ifdef __clang__
112#define OOLITE_HAVE_CLANG 1
113#else
114#define OOLITE_HAVE_CLANG 0
115#endif
116
117
118#if defined(__GNUC__) && !OOLITE_HAVE_CLANG
119// GCC version; for instance, 40300 for 4.3.0. Deliberately undefined in Clang (which defines fake __GNUC__ macros for compatibility).
120#define OOLITE_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
121#endif
122
123
124#if OOLITE_GNUSTEP
125#include <stdint.h>
126#include <limits.h> // to get UINT_MAX
127
128
129#define OOLITE_SDL 1
130
131#ifdef WIN32
132 #define OOLITE_WINDOWS 1
133 #if defined(_WIN64)
134 #define OOLITE_64_BIT 1
135 #endif
136#endif
137
138#ifdef LINUX
139#define OOLITE_LINUX 1
140#endif
141
142
143#define true 1
144#define false 0
145
146#if !defined(MAX)
147 #define MAX(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a > __b ? __a : __b; })
148#endif
149
150#if !defined(MIN)
151 #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
152#endif
153
154#ifdef HAVE_LIBESPEAK
155 #define OOLITE_SPEECH_SYNTH 1
156 #define OOLITE_ESPEAK 1
157#endif
158
159
160// Pseudo-keywords used for AppKit UI bindings.
161#ifndef IBOutlet
162#define IBOutlet /**/
163#endif
164#ifndef IBAction
165#define IBAction void
166#endif
167
168
169#import "Comparison.h"
170
171/* Define AppKit constants for events */
172enum {
173 NSUpArrowFunctionKey = 0xF700,
174 NSDownArrowFunctionKey = 0xF701,
175 NSLeftArrowFunctionKey = 0xF702,
176 NSRightArrowFunctionKey = 0xF703,
177 NSF1FunctionKey = 0xF704,
178 NSF2FunctionKey = 0xF705,
179 NSF3FunctionKey = 0xF706,
180 NSF4FunctionKey = 0xF707,
181 NSF5FunctionKey = 0xF708,
182 NSF6FunctionKey = 0xF709,
183 NSF7FunctionKey = 0xF70A,
184 NSF8FunctionKey = 0xF70B,
185 NSF9FunctionKey = 0xF70C,
186 NSF10FunctionKey = 0xF70D,
187 NSF11FunctionKey = 0xF70E,
188 NSF12FunctionKey = 0xF70F,
189 NSF13FunctionKey = 0xF710,
190 NSF14FunctionKey = 0xF711,
191 NSF15FunctionKey = 0xF712,
192 NSF16FunctionKey = 0xF713,
193 NSF17FunctionKey = 0xF714,
194 NSF18FunctionKey = 0xF715,
195 NSF19FunctionKey = 0xF716,
196 NSF20FunctionKey = 0xF717,
197 NSF21FunctionKey = 0xF718,
198 NSF22FunctionKey = 0xF719,
199 NSF23FunctionKey = 0xF71A,
200 NSF24FunctionKey = 0xF71B,
201 NSF25FunctionKey = 0xF71C,
202 NSF26FunctionKey = 0xF71D,
203 NSF27FunctionKey = 0xF71E,
204 NSF28FunctionKey = 0xF71F,
205 NSF29FunctionKey = 0xF720,
206 NSF30FunctionKey = 0xF721,
207 NSF31FunctionKey = 0xF722,
208 NSF32FunctionKey = 0xF723,
209 NSF33FunctionKey = 0xF724,
210 NSF34FunctionKey = 0xF725,
211 NSF35FunctionKey = 0xF726,
212 NSInsertFunctionKey = 0xF727,
213 NSDeleteFunctionKey = 0xF728,
214 NSHomeFunctionKey = 0xF729,
215 NSBeginFunctionKey = 0xF72A,
216 NSEndFunctionKey = 0xF72B,
217 NSPageUpFunctionKey = 0xF72C,
218 NSPageDownFunctionKey = 0xF72D,
219 NSPrintScreenFunctionKey = 0xF72E,
220 NSScrollLockFunctionKey = 0xF72F,
221 NSPauseFunctionKey = 0xF730,
222 NSSysReqFunctionKey = 0xF731,
223 NSBreakFunctionKey = 0xF732,
224 NSResetFunctionKey = 0xF733,
225 NSStopFunctionKey = 0xF734,
226 NSMenuFunctionKey = 0xF735,
227 NSUserFunctionKey = 0xF736,
228 NSSystemFunctionKey = 0xF737,
229 NSPrintFunctionKey = 0xF738,
230 NSClearLineFunctionKey = 0xF739,
231 NSClearDisplayFunctionKey = 0xF73A,
232 NSInsertLineFunctionKey = 0xF73B,
233 NSDeleteLineFunctionKey = 0xF73C,
234 NSInsertCharFunctionKey = 0xF73D,
235 NSDeleteCharFunctionKey = 0xF73E,
236 NSPrevFunctionKey = 0xF73F,
237 NSNextFunctionKey = 0xF740,
238 NSSelectFunctionKey = 0xF741,
239 NSExecuteFunctionKey = 0xF742,
240 NSUndoFunctionKey = 0xF743,
241 NSRedoFunctionKey = 0xF744,
242 NSFindFunctionKey = 0xF745,
243 NSHelpFunctionKey = 0xF746,
244 NSModeSwitchFunctionKey = 0xF747
245};
246
247#endif
248
249
250#ifndef OOLITE_GNUSTEP
251#define OOLITE_GNUSTEP 0
252#endif
253
254#ifndef OOLITE_MAC_OS_X
255#define OOLITE_MAC_OS_X 0
256#endif
257
258#ifndef OOLITE_WINDOWS
259#define OOLITE_WINDOWS 0
260#endif
261
262#ifndef OOLITE_LINUX
263#define OOLITE_LINUX 0
264#endif
265
266#ifndef OOLITE_SDL
267#define OOLITE_SDL 0
268#endif
269
270#ifndef OOLITE_SPEECH_SYNTH
271#define OOLITE_SPEECH_SYNTH 0
272#endif
273
274#ifndef OOLITE_ESPEAK
275#define OOLITE_ESPEAK 0
276#endif
277
278#ifndef OOLITE_64_BIT
279 #define OOLITE_64_BIT 0
280#endif
281
282
283#define OOLITE_PROPERTY_SYNTAX (OOLITE_MAC_OS_X || OOLITE_HAVE_CLANG)
284
285
286#import "OOLogging.h"
287
288
289@interface NSObject (OODescriptionComponents)
290
291/* In order to allow implementations of -description to inherit description
292 components from superclasses, and to allow implementations of -description
293 and -oo_jsDescription to share code, both are implemented as wrappers
294 around -descriptionComponents. -descriptionComponents should provide
295 information about an object without a class name or surrounding
296 punctuation. -description will wrap the components like this:
297 <ClassName 0xnnnnnnnn>{descriptionComponents}
298 and -oo_jsDescription will wrap them like this:
299 [oo_jsClassName descriptionComponents]
300*/
301- (NSString *)descriptionComponents;
302
303
304/* A lot of Oolite's -description implementations are rather long, and many
305 embed other descriptions. -shortDescription provides a truncated
306 alternative, while -shortDescriptionComponents provides a
307 -descriptionComponents-like mechanism to simplify implementation.
308*/
309- (NSString *) shortDescription;
310- (NSString *) shortDescriptionComponents;
311
312@end
313
314
315#if OOLITE_MAC_OS_X
316 #define OOLITE_RELEASE_PLIST_ERROR_STRINGS 1
317#else
318 #define OOLITE_RELEASE_PLIST_ERROR_STRINGS 0
319#endif
320
321
322/* For some reason, return types for some comparison callbacks are typed
323 NSInteger/int under OS X but (more sensibly) NSComparisonResult under
324 GNUstep.
325*/
326#if OOLITE_MAC_OS_X
327 typedef NSInteger OOComparisonResult;
328#else
329 typedef NSComparisonResult OOComparisonResult;
330#endif
331
332
333/* Fast enumeration (for (x in y) syntax) is supported in all Mac compilers
334 when targeting 10.5 or later, and in gcc 4.6 with the GNU libobjc runtime.
335 At the time of writing, GNUstep stable does not support gcc 4.6, but it
336 already has support for the fast enumeration protocol in its collection
337 classes.
338
339 All release versions of clang support fast enumeration, assuming libobjc2
340 or ObjectiveC2.framework is being used. We shall make that assumption.
341
342 References:
343 http://lists.gnu.org/archive/html/discuss-gnustep/2011-02/msg00019.html
344 http://wiki.gnustep.org/index.php/ObjC2_FAQ
345 -- Ahruman 2011-02-04
346*/
347#if OOLITE_MAC_OS_X
348 #define OOLITE_FAST_ENUMERATION 1
349#else
350 #if __clang__
351 #define OOLITE_FAST_ENUMERATION 1
352 #elif defined (OOLITE_GNUSTEP)
353 #define OOLITE_FAST_ENUMERATION (OOLITE_GCC_VERSION >= 40600)
354 #endif
355#endif
356
357#ifndef OOLITE_FAST_ENUMERATION
358#define OOLITE_FAST_ENUMERATION 0
359#endif
360
361
362/* Enumeration macros:
363 foreach(VAR, COLLECTION) enumerates the members of an array or set, setting
364 the variable VAR to a member on each pass.
365 foreachkey(VAR, DICT) enumerates the keys of a dictionary the same way.
366
367 Example:
368 id element = nil;
369 foreach (element, array)
370 {
371 OOLog(@"element", @"%@", element);
372 }
373
374 These are based on macros by Jens Alfke.
375*/
376#if OOLITE_FAST_ENUMERATION
377#define foreach(VAR, COLLECTION) for(VAR in COLLECTION)
378#define foreachkey(VAR, DICT) for(VAR in DICT)
379#else
380#define foreach(VAR, COLLECTION) for (NSEnumerator *ooForEachEnum = [(COLLECTION) objectEnumerator]; ((VAR) = [ooForEachEnum nextObject]); )
381#define foreachkey(VAR, DICT) for (NSEnumerator *ooForEachEnum = [(DICT) keyEnumerator]; ((VAR) = [ooForEachEnum nextObject]); )
382#endif
383
384
385/* Support for foreach() with NSEnumerators in GCC.
386 It works without this with for (x in y) support, but we leave it defined
387 to reduce differences between different build environments.
388*/
389@interface NSEnumerator (OOForEachSupport)
390- (NSEnumerator *) objectEnumerator;
391@end
392
393
394/* @optional directive for protocols: added in Objective-C 2.0.
395
396 As a nasty, nasty hack, the OOLITE_OPTIONAL(foo) macro allows an optional
397 section with or without @optional. If @optional is not available, it
398 actually ends the protocol and starts an appropriately-named informal
399 protocol, i.e. a category on NSObject. Since it ends the protocol, there
400 can only be one and there's no way to switch back to @required.
401*/
402#ifndef OOLITE_HAVE_PROTOCOL_OPTIONAL
403#define OOLITE_HAVE_PROTOCOL_OPTIONAL (OOLITE_MAC_OS_X || OOLITE_HAVE_CLANG || OOLITE_GCC_VERSION >= 40700)
404#endif
405
406#if OOLITE_HAVE_PROTOCOL_OPTIONAL
407#define OOLITE_OPTIONAL(protocolName) @optional
408#else
409#define OOLITE_OPTIONAL(protocolName) @end @interface NSObject (protocolName ## Optional)
410#endif
411
412
413/* instancetype contextual keyword; added in Clang 3.0ish.
414
415 Pseudo-type indicating that the return value of an instance method is an
416 instance of the same class as the receiver, or for a class mothod, is an
417 instance of that class.
418
419 For example, given:
420 @interface Foo: NSObject
421 + (instancetype) fooWithProperty:(id)property;
422 @end
423
424 @interface Bar: Foo
425 @end
426
427 the type of [Bar fooWithProperty] is inferred to be Bar *.
428
429 Clang treats methods of type id as instancetype when their names begin with
430 +alloc, +new, -init, -autorelease, -retain, or -self.
431
432 For compilers without instancetype support, id is appropriate but less
433 type-safe.
434
435 NOTE: it is not appropriate to use instancetype for a factory method which
436 chooses which publicly-visible subclass to instantiate based on parameters.
437 For instance, calling one of the OOMaterial convenience factory methods on
438 OOShaderMaterial might return an OOSingleTextureMaterial, so the correct
439 return type is either OOMaterial or id.
440 On the other hand, it is appropriate on factory methods which just wrap
441 the corresponding -init and/or -init + configuration through properties.
442 (Such factory methods should be implemented in terms of [[self alloc]
443 init...].)
444*/
445#if __OBJC__ && !__has_feature(objc_instancetype)
446typedef id instancetype;
447#endif
448
449
450#ifndef OO_DEBUG
451// Defined by makefile/Xcode in debug builds.
452#define OO_DEBUG 0
453#endif
454
455#if OOLITE_WINDOWS
456#ifndef OO_GAME_DATA_TO_USER_FOLDER
457#define OO_GAME_DATA_TO_USER_FOLDER 0
458#endif
459#endif
NSUInteger NSWindowStyleMask
Definition OOCocoa.h:97
NSInteger OOComparisonResult
Definition OOCocoa.h:327
NSEnumerator * objectEnumerator()
Definition OOCocoa.m:84
NSString * shortDescriptionComponents()
Definition OOCocoa.m:74