diff --git a/Makefile.src.in b/Makefile.src.in index 06d6f43b72..8c9e4a8f83 100644 --- a/Makefile.src.in +++ b/Makefile.src.in @@ -35,9 +35,9 @@ CONFIG_CACHE_VERSION = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_VERSION!! OBJS_C := !!OBJS_C!! OBJS_CPP := !!OBJS_CPP!! -OBJS_M := !!OBJS_M!! +OBJS_MM := !!OBJS_MM!! OBJS_RC := !!OBJS_RC!! -OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_M) $(OBJS_RC) +OBJS := $(OBJS_C) $(OBJS_CPP) $(OBJS_MM) $(OBJS_RC) SRCS := !!SRCS!! # All C-files depend on those 3 files @@ -126,12 +126,12 @@ $(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP) $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_HOST) $(CFLAGS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:%.d=%.o):#' > $@ -$(OBJS_M:%.o=%.d): %.d: $(SRC_DIR)/%.m $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.m=%.m)' - $(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:%.d=%.o):#' > $@ +$(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP) + $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)' + $(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:%.d=%.o):#' > $@ $(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP) - $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.m=%.m)' + $(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)' $(Q)touch $@ else @@ -211,9 +211,9 @@ $(OBJS_CPP): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP) $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)' $(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $< -$(OBJS_M): %.o: $(SRC_DIR)/%.m $(DEP_MASK) $(FILE_DEP) - $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.m=%.m)' - $(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -c -o $@ $< +$(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP) + $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)' + $(Q)$(CC_HOST) $(CFLAGS) -c -o $@ $< $(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP) $(E) '$(STAGE) Compiling resource $(<:$(SRC_DIR)/%.rc=%.rc)' diff --git a/config.lib b/config.lib index 804de5223b..9189c30f9a 100644 --- a/config.lib +++ b/config.lib @@ -1639,7 +1639,7 @@ make_sed() { s#!!LANG_SUPPRESS!!#$lang_suppress#g; s#!!OBJS_C!!#$OBJS_C#g; s#!!OBJS_CPP!!#$OBJS_CPP#g; - s#!!OBJS_M!!#$OBJS_M#g; + s#!!OBJS_MM!!#$OBJS_MM#g; s#!!OBJS_RC!!#$OBJS_RC#g; s#!!SRCS!!#$SRCS#g; s#!!OS!!#$os#g; diff --git a/configure b/configure index 43f7347c95..c79bd606cc 100755 --- a/configure +++ b/configure @@ -100,7 +100,7 @@ SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | awk ' OBJS_C="` echo \"$SRCS\" | awk ' { ORS = " " } /\.c$/ { gsub(".c$", ".o", $0); print $0; }'`" OBJS_CPP="`echo \"$SRCS\" | awk ' { ORS = " " } /\.cpp$/ { gsub(".cpp$", ".o", $0); print $0; }'`" -OBJS_M="` echo \"$SRCS\" | awk ' { ORS = " " } /\.m$/ { gsub(".m$", ".o", $0); print $0; }'`" +OBJS_MM="` echo \"$SRCS\" | awk ' { ORS = " " } /\.mm$/ { gsub(".mm$", ".o", $0); print $0; }'`" OBJS_RC="` echo \"$SRCS\" | awk ' { ORS = " " } /\.rc$/ { gsub(".rc$", ".o", $0); print $0; }'`" SRCS="` echo \"$SRCS\" | awk ' { ORS = " " } { print $0; }'`" diff --git a/source.list b/source.list index 5966fa0db1..e13d597e8d 100644 --- a/source.list +++ b/source.list @@ -384,7 +384,7 @@ sound/null_s.cpp #if OSX # OSX Files - os/macosx/macos.m + os/macosx/macos.mm #if DEDICATED #else @@ -392,7 +392,7 @@ sound/null_s.cpp #end #if COCOA - video/cocoa_v.m + video/cocoa_v.mm sound/cocoa_s.cpp os/macosx/splash.cpp #end diff --git a/src/debug.h b/src/debug.h index 0e58dfdce6..47d7855f9d 100644 --- a/src/debug.h +++ b/src/debug.h @@ -3,10 +3,6 @@ #ifndef DEBUG_H #define DEBUG_H -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - /* Debugging messages policy: * These should be the severities used for direct DEBUG() calls * maximum debugging level should be 10 if really deep, deep @@ -111,8 +107,4 @@ const char *GetDebugString(void); }\ } -#ifdef __cplusplus -} -#endif //__cplusplus - #endif /* DEBUG_H */ diff --git a/src/gfx.h b/src/gfx.h index 2316e8e86f..3c3cc7f310 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -3,11 +3,6 @@ #ifndef GFX_H #define GFX_H -/* !!! Note that the first part of this file if enclosed in extern "C" due to cocoa/obj-C !!! */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ enum WindowKeyCodes { WKC_SHIFT = 0x8000, @@ -175,10 +170,6 @@ void HandleExitGameRequest(void); void GameSizeChanged(void); void UndrawMouseCursor(void); -#ifdef __cplusplus -}; //extern "C" -/* Following part is only for C++ */ - #include "helpers.hpp" typedef enum FontSizes { @@ -245,7 +236,7 @@ void ScreenSizeChanged(void); void UndrawMouseCursor(void); bool ChangeResInGame(int w, int h); void SortResolutions(int count); -extern "C" void ToggleFullScreen(bool fs); +void ToggleFullScreen(bool fs); /* gfx.c */ #define ASCII_LETTERSTART 32 @@ -301,6 +292,4 @@ typedef enum StringColorFlags { extern bool _dbg_screen_rect; #endif -#endif /* __cplusplus */ - #endif /* GFX_H */ diff --git a/src/hal.h b/src/hal.h index e3d051c25e..0729c6c99f 100644 --- a/src/hal.h +++ b/src/hal.h @@ -3,10 +3,6 @@ #ifndef HAL_H #define HAL_H -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - typedef struct { const char *(*start)(const char * const *parm); void (*stop)(void); @@ -46,8 +42,4 @@ enum DriverType { MUSIC_DRIVER = 2, }; -#ifdef __cplusplus -} // extern "C" -#endif //__cplusplus - #endif /* HAL_H */ diff --git a/src/md5.h b/src/md5.h index 6e1f3044b3..c3c8888d92 100644 --- a/src/md5.h +++ b/src/md5.h @@ -72,11 +72,6 @@ typedef struct md5_state_s { md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; -#ifdef __cplusplus -extern "C" -{ -#endif - /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); @@ -86,8 +81,4 @@ void md5_append(md5_state_t *pms, const void *data, size_t nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); -#ifdef __cplusplus -} /* end extern "C" */ -#endif - #endif /* MD5_INCLUDED */ diff --git a/src/os/macosx/macos.h b/src/os/macosx/macos.h index ba33ce6028..b8a6cd5110 100644 --- a/src/os/macosx/macos.h +++ b/src/os/macosx/macos.h @@ -11,15 +11,9 @@ * the function then adds text that tells the user to update and then report the bug if it's present in the newest version * It also quits in a nice way since we call it when we know something happened that will crash OpenTTD (like a needed pointer turns out to be NULL or similar) */ -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - void ShowMacDialog ( const char *title, const char *message, const char *buttonLabel ); - void ShowMacAssertDialog ( const char *function, const char *file, const int line, const char *expression ); - void ShowMacErrorDialog(const char *error); -#ifdef __cplusplus -} -#endif //__cplusplus +void ShowMacDialog ( const char *title, const char *message, const char *buttonLabel ); +void ShowMacAssertDialog ( const char *function, const char *file, const int line, const char *expression ); +void ShowMacErrorDialog(const char *error); // Since MacOS X users will never see an assert unless they started the game from a terminal // we're using a custom assert(e) macro. diff --git a/src/os/macosx/macos.m b/src/os/macosx/macos.mm similarity index 100% rename from src/os/macosx/macos.m rename to src/os/macosx/macos.mm diff --git a/src/unix.cpp b/src/unix.cpp index fa49eca4df..cee8082d9c 100644 --- a/src/unix.cpp +++ b/src/unix.cpp @@ -127,9 +127,9 @@ void ShowOSErrorBox(const char *buf) } #ifdef WITH_COCOA -extern "C" void cocoaSetWorkingDirectory(void); -extern "C" void cocoaSetupAutoreleasePool(void); -extern "C" void cocoaReleaseAutoreleasePool(void); +void cocoaSetWorkingDirectory(void); +void cocoaSetupAutoreleasePool(void); +void cocoaReleaseAutoreleasePool(void); #endif int CDECL main(int argc, char* argv[]) diff --git a/src/video/cocoa_v.h b/src/video/cocoa_v.h index 42e55bccae..1512a0b649 100644 --- a/src/video/cocoa_v.h +++ b/src/video/cocoa_v.h @@ -5,22 +5,9 @@ #include "../hal.h" -#ifndef __cplusplus -/* Really ugly workaround - * It should be solved right as soon as possible */ -typedef uint32 SpriteID; -#endif //__cplusplus - +#include "../openttd.h" #include "../gfx.h" -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - extern const HalVideoDriver _cocoa_video_driver; -#ifdef __cplusplus -} // extern "C" -#endif //__cplusplus - #endif diff --git a/src/video/cocoa_v.m b/src/video/cocoa_v.mm similarity index 96% rename from src/video/cocoa_v.m rename to src/video/cocoa_v.mm index f476c905cc..aaa9475ef0 100644 --- a/src/video/cocoa_v.m +++ b/src/video/cocoa_v.mm @@ -13,19 +13,28 @@ #import /* for MAXPATHLEN */ #import +/** + * Important notice regarding all modifications!!!!!!! + * There are certain limitations because the file is objective C++. + * gdb has limitations. + * C++ and objective C code can't be joined in all cases (classes stuff). + * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information. + */ + + /* Portions of CPS.h */ typedef struct CPSProcessSerNum { UInt32 lo; UInt32 hi; } CPSProcessSerNum; -extern OSErr CPSGetCurrentProcess(CPSProcessSerNum* psn); -extern OSErr CPSEnableForegroundOperation(CPSProcessSerNum* psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern OSErr CPSSetFrontProcess(CPSProcessSerNum* psn); +extern "C" OSErr CPSGetCurrentProcess(CPSProcessSerNum* psn); +extern "C" OSErr CPSEnableForegroundOperation(CPSProcessSerNum* psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); +extern "C" OSErr CPSSetFrontProcess(CPSProcessSerNum* psn); /* From Menus.h (according to Xcode Developer Documentation) */ -extern void ShowMenuBar(void); -extern void HideMenuBar(void); +extern "C" void ShowMenuBar(void); +extern "C" void HideMenuBar(void); /* Disables a warning. This is needed since the method exists but has been dropped from the header, supposedly as of 10.4. */ #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4) @@ -353,7 +362,7 @@ static void QZ_DoUnsidedModifiers(unsigned int newMods) const int mapping[] = { QZ_CAPSLOCK, QZ_LSHIFT, QZ_LCTRL, QZ_LALT, QZ_LMETA }; int i; - int bit; + unsigned int bit; if (_cocoa_video_data.current_mods == newMods) return; @@ -817,7 +826,7 @@ static void QZ_SetPortAlphaOpaque(void) newViewFrame = [ _cocoa_video_data.qdview frame ]; /* Update the pixels and pitch */ - thePort = [ _cocoa_video_data.qdview qdPort ]; + thePort = (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ]; LockPortBits(thePort); _cocoa_video_data.realpixels = GetPixBaseAddr(GetPortPixMap(thePort)); @@ -1083,7 +1092,7 @@ static void QZ_DrawWindow(void) QZ_DrawResizeIcon(); /* Flush the dirty region */ - QDFlushPortBuffer([ _cocoa_video_data.qdview qdPort ], dirty); + QDFlushPortBuffer( (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ], dirty); DisposeRgn(dirty); DisposeRgn(temp); @@ -1163,10 +1172,12 @@ static const char* QZ_SetVideoWindowed(uint width, uint height) [ _cocoa_video_data.window makeKeyAndOrderFront:nil ]; } - LockPortBits([ _cocoa_video_data.qdview qdPort ]); - _cocoa_video_data.realpixels = GetPixBaseAddr(GetPortPixMap([ _cocoa_video_data.qdview qdPort ])); - _cocoa_video_data.pitch = GetPixRowBytes(GetPortPixMap([ _cocoa_video_data.qdview qdPort ])); - UnlockPortBits([ _cocoa_video_data.qdview qdPort ]); + CGrafPtr thePort = (OpaqueGrafPtr*) [ _cocoa_video_data.qdview qdPort ]; + + LockPortBits(thePort); + _cocoa_video_data.realpixels = GetPixBaseAddr(GetPortPixMap(thePort)); + _cocoa_video_data.pitch = GetPixRowBytes(GetPortPixMap(thePort)); + UnlockPortBits(thePort); /* _cocoa_video_data.realpixels now points to the window's pixels * We want it to point to the *view's* pixels @@ -1294,17 +1305,17 @@ static const char* QZ_SetVideoFullScreen(int width, int height) /* If the mode wasn't an exact match, check if it has the right bpp, and update width and height */ if (!exact_match) { - number = CFDictionaryGetValue (_cocoa_video_data.mode, kCGDisplayBitsPerPixel); + number = (const __CFNumber*) CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayBitsPerPixel); CFNumberGetValue(number, kCFNumberSInt32Type, &bpp); if (bpp != 8) { errstr = "Failed to find display resolution"; goto ERR_NO_MATCH; } - number = CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayWidth); + number = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayWidth); CFNumberGetValue(number, kCFNumberSInt32Type, &width); - number = CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayHeight); + number = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayHeight); CFNumberGetValue(number, kCFNumberSInt32Type, &height); } @@ -1412,7 +1423,7 @@ static void QZ_WaitForVerticalBlank(void) double adjustment; CFNumberRef refreshRateCFNumber; - refreshRateCFNumber = CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayRefreshRate); + refreshRateCFNumber = (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.mode, kCGDisplayRefreshRate); if (refreshRateCFNumber == NULL) return; if (CFNumberGetValue(refreshRateCFNumber, kCFNumberDoubleType, &refreshRate) == 0) @@ -1487,17 +1498,17 @@ static int QZ_ListFullscreenModes(OTTDPoint* mode_list, int max_modes) bool hasMode; uint16 width, height; - onemode = CFArrayGetValueAtIndex(_cocoa_video_data.mode_list, i); - number = CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel); + onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(_cocoa_video_data.mode_list, i); + number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel); CFNumberGetValue (number, kCFNumberSInt32Type, &bpp); if (bpp != 8) continue; - number = CFDictionaryGetValue(onemode, kCGDisplayWidth); + number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth); CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue); width = (uint16)intvalue; - number = CFDictionaryGetValue(onemode, kCGDisplayHeight); + number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight); CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue); height = (uint16)intvalue; @@ -1713,17 +1724,17 @@ static void QZ_VideoInit(void) /* Gather some information that is useful to know about the display */ /* Maybe this should be moved to QZ_SetVideoMode, in case this is changed after startup */ CFNumberGetValue( - CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayBitsPerPixel), + (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayBitsPerPixel), kCFNumberSInt32Type, &_cocoa_video_data.device_bpp ); CFNumberGetValue( - CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayWidth), + (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayWidth), kCFNumberSInt32Type, &_cocoa_video_data.device_width ); CFNumberGetValue( - CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayHeight), + (const __CFNumber*)CFDictionaryGetValue(_cocoa_video_data.save_mode, kCGDisplayHeight), kCFNumberSInt32Type, &_cocoa_video_data.device_height );