diff --git a/direct/src/plugin_standalone/p3dEmbed.cxx b/direct/src/plugin_standalone/p3dEmbed.cxx index ac19baacc6..4ee1ff31ca 100644 --- a/direct/src/plugin_standalone/p3dEmbed.cxx +++ b/direct/src/plugin_standalone/p3dEmbed.cxx @@ -112,8 +112,10 @@ run_embedded(streampos read_offset, int argc, char *argv[]) { // Read out the tokens that may interest us if (keyword == "width") { _win_width = atoi(value.c_str()); + _got_win_size = true; } else if (keyword == "height") { _win_height = atoi(value.c_str()); + _got_win_size = true; } else if (keyword == "log_basename") { _log_basename = value; } else if (keyword == "root_dir") { @@ -233,9 +235,7 @@ run_embedded(streampos read_offset, int argc, char *argv[]) { } // Create a plugin instance and run the program - P3D_instance *inst = create_instance - (f, true, _win_x, _win_y, _win_width, _win_height, - argv, argc, read_offset); + P3D_instance *inst = create_instance(f, true, argv, argc, read_offset); _instances.insert(inst); run_main_loop(); diff --git a/direct/src/plugin_standalone/panda3d.cxx b/direct/src/plugin_standalone/panda3d.cxx index 15e7d0d1fb..97fecbc186 100644 --- a/direct/src/plugin_standalone/panda3d.cxx +++ b/direct/src/plugin_standalone/panda3d.cxx @@ -120,6 +120,7 @@ run_command_line(int argc, char *argv[]) { cerr << "Invalid value for -s: " << optarg << "\n"; return 1; } + _got_win_size = true; break; case 'o': @@ -248,8 +249,11 @@ run_command_line(int argc, char *argv[]) { int num_y_spans = int(sqrt((double)num_instance_filenames)); int num_x_spans = (num_instance_filenames + num_y_spans - 1) / num_y_spans; - int inst_width = _win_width / num_x_spans; - int inst_height = _win_height / num_y_spans; + int origin_x = _win_x; + int origin_y = _win_y; + _win_width = _win_width / num_x_spans; + _win_height = _win_height / num_y_spans; + _got_win_size = true; for (int yi = 0; yi < num_y_spans; ++yi) { for (int xi = 0; xi < num_x_spans; ++xi) { @@ -259,12 +263,11 @@ run_command_line(int argc, char *argv[]) { } // Create instance i at window slot (xi, yi). - int inst_x = _win_x + xi * inst_width; - int inst_y = _win_y + yi * inst_height; + _win_x = origin_x + xi * _win_width; + _win_y = origin_y + yi * _win_height; P3D_instance *inst = create_instance (instance_filenames[i], true, - inst_x, inst_y, inst_width, inst_height, instance_args, num_instance_args); _instances.insert(inst); } @@ -275,7 +278,6 @@ run_command_line(int argc, char *argv[]) { for (int i = 0; i < num_instance_filenames; ++i) { P3D_instance *inst = create_instance (instance_filenames[i], true, - _win_x, _win_y, _win_width, _win_height, instance_args, num_instance_args); _instances.insert(inst); } diff --git a/direct/src/plugin_standalone/panda3dBase.cxx b/direct/src/plugin_standalone/panda3dBase.cxx index d47a3e5f4d..2d5e796e7a 100644 --- a/direct/src/plugin_standalone/panda3dBase.cxx +++ b/direct/src/plugin_standalone/panda3dBase.cxx @@ -24,6 +24,8 @@ #include "find_root_dir.h" #include "load_plugin.h" #include "executionEnvironment.h" +#include "multifile.h" +#include "tinyxml.h" // We can include this header file to get the DTOOL_PLATFORM // definition, even though we don't link with dtool. @@ -62,6 +64,7 @@ Panda3DBase(bool console_environment) { _win_y = -1; _win_width = 640; _win_height = 480; + _got_win_size = false; _exit_with_last_instance = true; _host_url = PANDA_PACKAGE_HOST_URL; @@ -330,7 +333,6 @@ make_parent_window() { //////////////////////////////////////////////////////////////////// P3D_instance *Panda3DBase:: create_instance(const string &p3d, bool start_instance, - int win_x, int win_y, int win_width, int win_height, char **args, int num_args, const int &p3d_offset) { // Check to see if the p3d filename we were given is a URL, or a // local file. @@ -346,6 +348,9 @@ create_instance(const string &p3d, bool start_instance, p3d_filename.make_absolute(); os_p3d_filename = p3d_filename.to_os_specific(); } + if (is_local) { + read_p3d_info(p3d_filename); + } // Build up the token list. Tokens tokens = _tokens; @@ -373,7 +378,7 @@ create_instance(const string &p3d, bool start_instance, token._value = "1"; tokens.push_back(token); - P3D_token *tokens_p; + P3D_token *tokens_p = NULL; size_t num_tokens = tokens.size(); if (!tokens.empty()) { tokens_p = &tokens[0]; @@ -400,7 +405,7 @@ create_instance(const string &p3d, bool start_instance, } P3D_instance_setup_window_ptr - (inst, _window_type, win_x, win_y, win_width, win_height, &_parent_window); + (inst, _window_type, _win_x, _win_y, _win_width, _win_height, &_parent_window); } return inst; @@ -432,6 +437,56 @@ delete_instance(P3D_instance *inst) { } } +//////////////////////////////////////////////////////////////////// +// Function: Panda3DBase::read_p3d_info +// Access: Protected +// Description: Opens the p3d file to read the p3d_info.xml file +// within it, looking for any locally-relevant +// parameters (like win-size). +//////////////////////////////////////////////////////////////////// +bool Panda3DBase:: +read_p3d_info(const Filename &p3d_filename) { + PT(Multifile) mf = new Multifile; + if (!mf->open_read(p3d_filename)) { + return false; + } + int si = mf->find_subfile("p3d_info.xml"); + if (si == -1) { + return false; + } + + string p3d_info; + mf->read_subfile(si, p3d_info); + istringstream strm(p3d_info); + TiXmlDocument doc; + strm >> doc; + if (strm.fail() && !strm.eof()) { + return false; + } + TiXmlElement *xpackage = doc.FirstChildElement("package"); + if (xpackage == NULL) { + return false; + } + TiXmlElement *xconfig = xpackage->FirstChildElement("config"); + if (xconfig == NULL) { + return false; + } + + // Successfully read the p3d_info.xml file. + if (!_got_win_size) { + // If the user didn't override the size on the command line, allow + // the p3d file to request a preferred size. + if (xconfig->Attribute("width", &_win_width)) { + _got_win_size = true; + } + if (xconfig->Attribute("height", &_win_height)) { + _got_win_size = true; + } + } + + return true; +} + //////////////////////////////////////////////////////////////////// // Function: Panda3DBase::parse_token // Access: Protected diff --git a/direct/src/plugin_standalone/panda3dBase.h b/direct/src/plugin_standalone/panda3dBase.h index 87d886e2bd..0adf962f39 100755 --- a/direct/src/plugin_standalone/panda3dBase.h +++ b/direct/src/plugin_standalone/panda3dBase.h @@ -49,10 +49,10 @@ protected: P3D_instance * create_instance(const string &p3d, bool start_instance, - int win_x, int win_y, int win_width, int win_height, char **args, int num_args, const int &p3d_offset = 0); void delete_instance(P3D_instance *instance); + bool read_p3d_info(const Filename &p3d_filename); bool parse_token(const char *arg); bool parse_int_pair(const char *arg, int &x, int &y); string lookup_token(const string &keyword) const; @@ -84,6 +84,7 @@ protected: P3D_window_handle _parent_window; int _win_x, _win_y; int _win_width, _win_height; + bool _got_win_size; bool _exit_with_last_instance; bool _reporting_download; diff --git a/direct/src/plugin_standalone/panda3dMac.cxx b/direct/src/plugin_standalone/panda3dMac.cxx index b35017344c..f07a477830 100644 --- a/direct/src/plugin_standalone/panda3dMac.cxx +++ b/direct/src/plugin_standalone/panda3dMac.cxx @@ -58,10 +58,7 @@ open_p3d_file(FSRef *ref) { } // Create an instance. - P3D_instance *inst = create_instance - ((char *)filename, true, - _win_x, _win_y, _win_width, _win_height, - NULL, 0); + create_instance((char *)filename, true, NULL, 0); } static pascal OSErr