| #if defined(SK_BUILD_FOR_MAC) && !defined(SK_USE_WXWIDGETS) |
| #include <Carbon/Carbon.h> |
| #include <unistd.h> |
| #include <cerrno> |
| #include "SkApplication.h" |
| #include "SkTypes.h" |
| |
| extern void get_preferred_size(int*, int*, int*, int* ); |
| |
| int main(int argc, char* argv[]) |
| { |
| |
| #if 0 |
| { |
| FILE* f = ::fopen("/whereami.txt", "w"); |
| for (int i = 0; i < argc; i++) |
| fprintf(f, "[%d] %s\n", i, argv[i]); |
| ::fclose(f); |
| } |
| #else |
| // argv[0] is set to the execution path of the application, e.g. |
| // /Users/caryclark/android/device/build/ide/xcode/animatorTest/build/Debug/animatorTest.app/Contents/MacOS/animatorTest |
| // the desired directory path is : |
| // /Users/caryclark/android/device/jsapps |
| // the variable (client-specific) part is : |
| // /Users/caryclark/android/ |
| // since different applications share this library, they only have in common: |
| // {client}/device/build/ide/xcode/{application} |
| { |
| const char* applicationPath = argv[0]; |
| const char* common = strstr(applicationPath, "build/ide/xcode/"); |
| const char systemParent[] = "apps/"; |
| if (common != 0) { |
| size_t prefixLength = common - applicationPath; |
| char* workingDirectory = new char[prefixLength + sizeof(systemParent)]; |
| strncpy(workingDirectory, applicationPath, prefixLength); |
| strcpy(&workingDirectory[prefixLength], systemParent); |
| int error = chdir(workingDirectory); |
| if (error != 0) { |
| error = errno; |
| SkASSERT(error != ENOENT); |
| SkASSERT(error != ENOTDIR); |
| SkASSERT(error != EACCES); |
| SkASSERT(error != EIO); |
| SkASSERT(0); |
| } |
| delete workingDirectory; |
| } |
| } |
| #endif |
| IBNibRef nibRef; |
| WindowRef window; |
| |
| OSStatus err; |
| |
| // Create a Nib reference passing the name of the nib file (without the .nib extension) |
| // CreateNibReference only searches into the application bundle. |
| err = CreateNibReference(CFSTR("main"), &nibRef); |
| require_noerr( err, CantGetNibRef ); |
| |
| // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar |
| // object. This name is set in InterfaceBuilder when the nib is created. |
| err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar")); |
| require_noerr( err, CantSetMenuBar ); |
| |
| // Then create a window. "MainWindow" is the name of the window object. This name is set in |
| // InterfaceBuilder when the nib is created. |
| err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window); |
| require_noerr( err, CantCreateWindow ); |
| |
| // We don't need the nib reference anymore. |
| DisposeNibReference(nibRef); |
| { |
| // if we get here, we can start our normal Skia sequence |
| application_init(); |
| (void)create_sk_window(window); |
| int x =0, y =0, width =640, height=480; |
| get_preferred_size(&x, &y, &width, &height); |
| MoveWindow(window, x, y, false); |
| SizeWindow(window, width, height, false); |
| } |
| // The window was created hidden so show it. |
| ShowWindow( window ); |
| |
| // Call the event loop |
| RunApplicationEventLoop(); |
| |
| application_term(); |
| |
| CantCreateWindow: |
| CantSetMenuBar: |
| CantGetNibRef: |
| return err; |
| } |
| |
| #endif |