]> git.saurik.com Git - wxWidgets.git/blob - include/wx/platform.h
wxCocoa: Add native file dialog from Ryan Norton. Modified patch #1039368
[wxWidgets.git] / include / wx / platform.h
1 /**
2 * Name: wx/platform.h
3 * Purpose: define the OS and compiler identification macros
4 * Author: Vadim Zeitlin
5 * Modified by:
6 * Created: 29.10.01 (extracted from wx/defs.h)
7 * RCS-ID: $Id$
8 * Copyright: (c) 1997-2001 wxWidgets team
9 * Licence: wxWindows licence
10 */
11
12 /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
13
14 #ifndef _WX_PLATFORM_H_
15 #define _WX_PLATFORM_H_
16
17
18 /*
19 Codewarrior doesn't define any Windows symbols until some headers
20 are included
21 */
22 #if __MWERKS__
23 # include <stddef.h>
24 #endif
25
26 /*
27 WXMAC variants
28 __WXMAC_CLASSIC__ means ppc non-carbon builds, __WXMAC_CARBON__ means
29 carbon API available (mach or cfm builds) , __WXMAC_OSX__ means mach-o
30 builds, running under 10.2 + only
31 */
32 #ifdef __WXMAC__
33 #if defined(__MACH__)
34 #define __WXMAC_OSX__ 1
35 #define __WXMAC_CARBON__ 1
36 #ifdef __WXMAC_XCODE__
37 #include "wx/mac/carbon/config_xcode.h"
38 #endif
39 #else
40 #if TARGET_CARBON
41 #define __WXMAC_CARBON__ 1
42 #else
43 #define __WXMAC_CLASSIC__ 1
44 #endif
45 #endif
46 #endif
47
48 /*
49 first define Windows symbols if they're not defined on the command line: we
50 can autodetect everything we need if _WIN32 is defined
51 */
52 #if defined(__CYGWIN32__) && !defined(__WXMOTIF__) && !defined(__WXGTK__) \
53 && !defined(__WXX11__)
54 /* for Cygwin, default to wxMSW unless otherwise specified */
55 # ifndef __WXMSW__
56 # define __WXMSW__
57 # endif
58
59 # ifndef _WIN32
60 # define _WIN32
61 # endif
62
63 # ifndef WIN32
64 # define WIN32
65 # endif
66 #endif
67
68 #if defined(_WIN64)
69 # ifndef _WIN32
70 /*
71 a lot of code (mistakenly) uses #ifdef _WIN32 to either test for
72 Windows or to test for !__WIN16__, so we must define _WIN32 for
73 Win64 as well to ensure that the existing code continues to work.
74 */
75 # define _WIN32
76 # endif /* !_WIN32 */
77
78 # ifndef __WIN64__
79 # define __WIN64__
80 # endif /* !__WIN64__ */
81 #endif /* _WIN64 */
82
83 #if (defined(_WIN32) || defined(WIN32) || defined(__NT__) || defined(__WXWINCE__)) \
84 && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__)
85 # ifndef __WXMSW__
86 # define __WXMSW__
87 # endif
88
89 # ifndef __WIN32__
90 # define __WIN32__
91 # endif
92
93 /*
94 The library user may override the default setting of WINVER by defining
95 it in his own makefile or project file -- if it is defined, we don't
96 touch it at all.
97
98 It makes sense to define WINVER as:
99 - either some lowish value (e.g. 0x0302) to not even compile in the
100 features not available in Windows version lower than some given
101 one
102 - or to a higher value than the one used by default for the given
103 compiler if you updated its headers to newer version of Platform
104 SDK, e.g. VC6 ships with 0x0400 headers by default but may also
105 work with 0x0500 headers and beyond
106 */
107 # ifndef WINVER
108 # if defined(_MSC_VER) && _MSC_VER < 1300
109 /*
110 VC6 defines some stuff in its default headers which is normally
111 only present if WINVER >= 0x0500 (FLASHW_XXX constants) which
112 means that our usual tests not involving WINVER sometimes fail
113 with it, hence explicitly define a lower WINVER value for it.
114 */
115 # define WINVER 0x0400
116 # elif defined(__DMC__)
117 /*
118 Digital Mars is distributed with a little outdated headers.
119 */
120 # define WINVER 0x0400
121 # else /* !VC++ 6 */
122 /*
123 see MSDN for the description of possible WINVER values, this one
124 is the highest one defined right now (Windows Server 2003) and
125 we use it unless it was explicitly overridden by the user to
126 disable recent features support as we check for all of the
127 features we use which could be not available on earlier Windows
128 systems during run-time anyhow, so there is almost no
129 disadvantage in using it.
130 */
131 # define WINVER 0x0502
132 # endif /* VC++ 6/!VC++6 */
133 # endif
134
135 /* Win95 means Win95-style UI, i.e. Win9x/NT 4+ */
136 # if !defined(__WIN95__) && (WINVER >= 0x0400)
137 # define __WIN95__
138 # endif
139 #endif /* Win32 */
140
141 #if defined(__WXMSW__) || defined(__WIN32__)
142 # if !defined(__WINDOWS__)
143 # define __WINDOWS__
144 # endif
145 #endif
146
147 #ifdef __WINE__
148 # ifndef __WIN95__
149 # define __WIN95__
150 # endif
151 #endif /* WINE */
152
153 /* detect MS SmartPhone */
154 #if defined( WIN32_PLATFORM_WFSP )
155 # ifndef __SMARTPHONE__
156 # define __SMARTPHONE__
157 # endif
158 # ifndef __WXWINCE__
159 # define __WXWINCE__
160 # endif
161 #endif
162
163 /* detect PocketPC */
164 #if defined( WIN32_PLATFORM_PSPC )
165 # ifndef __POCKETPC__
166 # define __POCKETPC__
167 # endif
168 # ifndef __WXWINCE__
169 # define __WXWINCE__
170 # endif
171 #endif
172
173 /* detect Standard WinCE SDK */
174 #if defined( WCE_PLATFORM_STANDARDSDK )
175 # ifndef __WINCE_STANDARDSDK__
176 # define __WINCE_STANDARDSDK__
177 # endif
178 # ifndef __WXWINCE__
179 # define __WXWINCE__
180 # endif
181 #endif
182
183 #if defined(_WIN32_WCE) && !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC)
184 # if (_WIN32_WCE >= 400)
185 # ifndef __WINCE_NET__
186 # define __WINCE_NET__
187 # endif
188 # elif (_WIN32_WCE >= 200)
189 # ifndef __HANDHELDPC__
190 # define __HANDHELDPC__
191 # endif
192 # endif
193 # ifndef __WXWINCE__
194 # define __WXWINCE__
195 # endif
196 #endif
197
198 /*
199 Include wx/setup.h for the Unix platform defines generated by configure and
200 the library compilation options
201 */
202 #include "wx/setup.h"
203
204 /* check the consistency of the settings in setup.h */
205 #include "wx/chkconf.h"
206
207 /*
208 adjust the Unicode setting: wxUSE_UNICODE should be defined as 0 or 1
209 and is used by wxWidgets, _UNICODE and/or UNICODE may be defined or used by
210 the system headers so bring these settings in sync
211 */
212
213 /* set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined */
214 #if defined(_UNICODE) || defined(UNICODE)
215 # undef wxUSE_UNICODE
216 # define wxUSE_UNICODE 1
217 #else /* !UNICODE */
218 # ifndef wxUSE_UNICODE
219 # define wxUSE_UNICODE 0
220 # endif
221 #endif /* UNICODE/!UNICODE */
222
223 /* and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1 */
224 #if wxUSE_UNICODE
225 # ifndef _UNICODE
226 # define _UNICODE
227 # endif
228 # ifndef UNICODE
229 # define UNICODE
230 # endif
231 #endif /* wxUSE_UNICODE */
232
233 #if defined( __MWERKS__ ) && !defined(__INTEL__)
234 // otherwise MSL headers bring in WIN32 dependant APIs
235 #undef UNICODE
236 #endif
237 /*
238 some compilers don't support iostream.h any longer, while some of theme
239 are not updated with <iostream> yet, so override the users setting here
240 in such case.
241 */
242 #if defined(_MSC_VER) && (_MSC_VER >= 1310)
243 # undef wxUSE_IOSTREAMH
244 # define wxUSE_IOSTREAMH 0
245 #elif defined(__DMC__) || defined(__WATCOMC__)
246 # undef wxUSE_IOSTREAMH
247 # define wxUSE_IOSTREAMH 1
248 #elif defined(__MINGW32__)
249 # undef wxUSE_IOSTREAMH
250 # define wxUSE_IOSTREAMH 0
251 #endif /* compilers with/without iostream.h */
252
253 /*
254 old C++ headers (like <iostream.h>) declare classes in the global namespace
255 while the new, standard ones (like <iostream>) do it in std:: namespace
256
257 using this macro allows constuctions like "wxSTD iostream" to work in
258 either case
259 */
260 #if !wxUSE_IOSTREAMH
261 # define wxSTD std::
262 #else
263 # define wxSTD
264 #endif
265
266 /*
267 OS: first of all, test for MS-DOS platform. We must do this before testing
268 for Unix, because DJGPP compiler defines __unix__ under MS-DOS
269 */
270 #if defined(__GO32__) || defined(__DJGPP__) || defined(__DOS__)
271 # ifndef __DOS__
272 # define __DOS__
273 # endif
274 /* size_t is the same as unsigned int for Watcom 11 compiler, */
275 /* so define it if it hadn't been done by configure yet */
276 # if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG)
277 # ifdef __WATCOMC__
278 # define wxSIZE_T_IS_UINT
279 # endif
280 # ifdef __DJGPP__
281 # define wxSIZE_T_IS_ULONG
282 # endif
283 # endif
284
285 /*
286 OS: then test for generic Unix defines, then for particular flavours and
287 finally for Unix-like systems
288 */
289 #elif defined(__UNIX__) || defined(__unix) || defined(__unix__) || \
290 defined(____SVR4____) || defined(__LINUX__) || defined(__sgi) || \
291 defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX) || \
292 defined(__EMX__) || defined(__VMS) || defined(__BEOS__)
293
294 # define __UNIX_LIKE__
295
296 /* Helps SGI compilation, apparently */
297 # ifdef __SGI__
298 # ifdef __GNUG__
299 # define __need_wchar_t
300 # else /* !gcc */
301 /*
302 Note I use the term __SGI_CC__ for both cc and CC, its not a good
303 idea to mix gcc and cc/CC, the name mangling is different
304 */
305 # define __SGI_CC__
306 # endif /* gcc/!gcc */
307 # endif /* SGI */
308
309 # if defined(sun) || defined(__SUN__)
310 # ifndef __GNUG__
311 # ifndef __SUNCC__
312 # define __SUNCC__
313 # endif /* Sun CC */
314 # endif
315 # endif /* Sun */
316
317 # ifdef __EMX__
318 # define OS2EMX_PLAIN_CHAR
319 # endif
320
321 /* define __HPUX__ for HP-UX where standard macro is __hpux */
322 # if defined(__hpux) && !defined(__HPUX__)
323 # define __HPUX__
324 # endif /* HP-UX */
325
326 # if defined(__CYGWIN__) || defined(__WINE__)
327 # if !defined(wxSIZE_T_IS_UINT)
328 # define wxSIZE_T_IS_UINT
329 # endif
330 # endif
331 #elif defined(applec) || \
332 defined(THINK_C) || \
333 (defined(__MWERKS__) && !defined(__INTEL__))
334 /* MacOS */
335 # if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG)
336 # define wxSIZE_T_IS_ULONG
337 # endif
338 #elif defined(__WXMAC__) && defined(__APPLE__)
339 /* Mac OS X */
340 # define __UNIX_LIKE__
341
342 /*
343 These defines are needed when compiling using Project Builder
344 with a non generated setup0.h
345 */
346 # ifndef __UNIX__
347 # define __UNIX__ 1
348 # endif
349 # ifndef __BSD__
350 # define __BSD__ 1
351 # endif
352 # ifndef __DARWIN__
353 # define __DARWIN__ 1
354 # endif
355 # ifndef __POWERPC__
356 # define __POWERPC__ 1
357 # endif
358 # ifndef TARGET_CARBON
359 # define TARGET_CARBON 1
360 # endif
361
362 # if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG)
363 # define wxSIZE_T_IS_ULONG
364 # endif
365 /*
366 Some code has been added to workaround defects(?) in the
367 bundled gcc compiler. These corrections are identified by
368 __DARWIN__ for Darwin related corrections (wxMac, wxMotif)
369 */
370 #elif defined(__OS2__)
371 # if defined(__IBMCPP__)
372 # define __VISAGEAVER__ __IBMCPP__
373 # endif
374 # ifndef __WXOS2__
375 # define __WXOS2__
376 # endif
377 # ifndef __WXPM__
378 # define __WXPM__
379 # endif
380
381 /* Place other OS/2 compiler environment defines here */
382 # if defined(__VISAGECPP__)
383 /* VisualAge is the only thing that understands _Optlink */
384 # define LINKAGEMODE _Optlink
385 # endif
386 # define wxSIZE_T_IS_UINT
387
388 #else /* Windows */
389 # ifndef __WINDOWS__
390 # define __WINDOWS__
391 # endif /* Windows */
392
393 /* to be changed for Win64! */
394 # ifndef __WIN32__
395 # error "__WIN32__ should be defined for Win32 and Win64, Win16 is not supported"
396 # endif
397
398 /*
399 define another standard symbol for Microsoft Visual C++: the standard
400 one (_MSC_VER) is also defined by Metrowerks compiler
401 */
402 # if defined(_MSC_VER) && !defined(__MWERKS__)
403 # define __VISUALC__ _MSC_VER
404 # elif defined(__BCPLUSPLUS__) && !defined(__BORLANDC__)
405 # define __BORLANDC__
406 # elif defined(__WATCOMC__)
407 # elif defined(__SC__)
408 # define __SYMANTECC__
409 # endif /* compiler */
410
411 /* size_t is the same as unsigned int for all Windows compilers we know, */
412 /* so define it if it hadn't been done by configure yet */
413 # if !defined(wxSIZE_T_IS_UINT) && !defined(wxSIZE_T_IS_ULONG)
414 # define wxSIZE_T_IS_UINT
415 # endif
416 #endif /* OS */
417
418 /*
419 if we're on a Unix system but didn't use configure (so that setup.h didn't
420 define __UNIX__), do define __UNIX__ now
421 */
422 #if !defined(__UNIX__) && defined(__UNIX_LIKE__)
423 # define __UNIX__
424 #endif /* Unix */
425
426 #if defined(__WXMOTIF__) || defined(__WXX11__)
427 # define __X__
428 #endif
429
430 #ifdef __SC__
431 # ifdef __DMC__
432 # define __DIGITALMARS__
433 # else
434 # define __SYMANTEC__
435 # endif
436 #endif
437
438 /* Force linking against required libraries under Windows CE: */
439 #ifdef __WXWINCE__
440 # include "wx/msw/wince/libraries.h"
441 #endif
442
443 /*
444 This macro can be used to test the gcc version and can be used like this:
445
446 # if wxCHECK_GCC_VERSION(3, 1)
447 ... we have gcc 3.1 or later ...
448 # else
449 ... no gcc at all or gcc < 3.1 ...
450 # endif
451 */
452 #define wxCHECK_GCC_VERSION( major, minor ) \
453 ( defined(__GNUC__) && defined(__GNUC_MINOR__) \
454 && ( ( __GNUC__ > (major) ) \
455 || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) )
456
457 /*
458 This macro can be used to check that the version of mingw32 compiler is
459 at least maj.min
460 */
461 #if ( defined( __GNUWIN32__ ) || defined( __MINGW32__ ) || \
462 defined( __CYGWIN__ ) || \
463 (defined(__WATCOMC__) && __WATCOMC__ >= 1200) ) && \
464 !defined(__DOS__) && !defined(__WXMOTIF__) && !defined(__WXGTK__) && !defined(__WXX11__)
465 # include "wx/msw/gccpriv.h"
466 #else
467 # undef wxCHECK_W32API_VERSION
468 # define wxCHECK_W32API_VERSION(maj, min) (0)
469 #endif
470
471 #if defined (__WXMSW__)
472 # if !defined(__WATCOMC__)
473 # define wxHAVE_RAW_BITMAP
474 # endif
475 #endif
476
477 #if defined (__WXMAC__)
478 # ifndef WORDS_BIGENDIAN
479 # define WORDS_BIGENDIAN 1
480 # endif
481 #endif
482
483 /* Choose which method we will use for updating menus
484 * - in OnIdle, or when we receive a wxEVT_MENU_OPEN event.
485 * Presently, only Windows and GTK+ support wxEVT_MENU_OPEN.
486 */
487 #ifndef wxUSE_IDLEMENUUPDATES
488 # if (defined(__WXMSW__) || defined(__WXGTK__)) && !defined(__WXUNIVERSAL__)
489 # define wxUSE_IDLEMENUUPDATES 0
490 # else
491 # define wxUSE_IDLEMENUUPDATES 1
492 # endif
493 #endif
494
495 /*
496 * Define symbols that are not yet in
497 * configure or possibly some setup.h files.
498 * They will need to be added.
499 */
500
501 #ifndef wxUSE_FILECONFIG
502 # if wxUSE_CONFIG
503 # define wxUSE_FILECONFIG 1
504 # else
505 # define wxUSE_FILECONFIG 0
506 # endif
507 #endif
508
509 #ifndef wxUSE_HOTKEY
510 # define wxUSE_HOTKEY 0
511 #endif
512
513 #if !defined(wxUSE_WXDIB) && defined(__WXMSW__)
514 # define wxUSE_WXDIB 1
515 #endif
516
517 /*
518 We need AvailabilityMacros.h for ifdefing out things that don't exist on
519 OSX 10.2 and lower
520 FIXME: We need a better way to detect for 10.3 then including a system header
521 */
522 #ifdef __DARWIN__
523 #include <AvailabilityMacros.h>
524 #endif
525
526 #endif /* _WX_PLATFORM_H_ */
527