open_toontown_panda3d/direct/src/plugin_standalone/panda3dMac.cxx

117 lines
3.2 KiB
C++

// Filename: panda3dMac.cxx
// Created by: drose (23Oct09)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University. All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license. You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////
#include "panda3dMac.h"
#include "load_plugin.h"
#include <iostream>
#include <fstream>
using namespace std;
// Having a global Panda3DMac object just makes things easier.
static Panda3DMac *this_prog;
////////////////////////////////////////////////////////////////////
// Function: Panda3DMac::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
Panda3DMac::
Panda3DMac() : Panda3D(false) {
// Mac applications traditionally keep running even when all windows
// are closed.
_exit_with_last_instance = false;
// No command-line arguments, so just run.
if (!post_arg_processing()) {
exit(1);
}
}
////////////////////////////////////////////////////////////////////
// Function: Panda3DMac::open_p3d_file
// Access: Public
// Description: Opens a p3d file received via the "open documents"
// event as its own instance.
////////////////////////////////////////////////////////////////////
void Panda3DMac::
open_p3d_file(FSRef *ref) {
OSErr err;
static const size_t buffer_size = 4096;
UInt8 filename[buffer_size];
err = FSRefMakePath(ref, filename, buffer_size);
if (err) {
cerr << "Couldn't get filename\n";
return;
}
// Create an instance.
P3D_instance *inst = create_instance
((char *)filename, true,
_win_x, _win_y, _win_width, _win_height,
NULL, 0);
}
static pascal OSErr
open_documents_handler(const AppleEvent *theAppleEvent, AppleEvent *reply,
long handlerRefcon) {
AEDescList docList;
FSRef theFSRef;
long index;
long count = 0;
// Get the list of file aliases from the event.
OSErr err = AEGetParamDesc(theAppleEvent,
keyDirectObject, typeAEList, &docList);
require_noerr(err, CantGetDocList);
err = AECountItems(&docList, &count);
require_noerr(err, CantGetCount);
for (index = 1; index <= count; index++) {
err = AEGetNthPtr(&docList, index, typeFSRef,
NULL, NULL, &theFSRef, sizeof(FSRef), NULL);// 5
require_noerr(err, CantGetDocDescPtr);
// Here's the file, do something with it.
this_prog->open_p3d_file(&theFSRef);
}
// Release list of files
AEDisposeDesc(&docList);
// Error handlers.
CantGetDocList:
CantGetCount:
CantGetDocDescPtr:
return (err);
}
int
main(int argc, char *argv[]) {
OSErr err;
AEEventHandlerUPP handler;
this_prog = new Panda3DMac;
handler = NewAEEventHandlerUPP(open_documents_handler);
err = AEInstallEventHandler
(kCoreEventClass, kAEOpenDocuments, handler, 0, false);
// The command-line options are weird when we start from the
// Launcher. Just ignore them.
this_prog->run_main_loop();
return 0;
}