glom r2016 - in trunk: . glom glom/bakery glom/libglom



Author: murrayc
Date: Sun Mar 22 22:30:56 2009
New Revision: 2016
URL: http://svn.gnome.org/viewvc/glom?rev=2016&view=rev

Log:
2009-03-22  Murray Cumming  <murrayc murrayc com>

* glom/application.[h|cc]: new_instance(): Spawn a new process via a 
a command line command.
* glom/bakery/App.[h|cc]: new_instance(): Take a uri parameter.
on_menu_file_new():
* glom/bakery/App_WithDoc.cc: open_document():
new_instance() is now expected to start a new process instead of 
returning a new C++ instance.

This means that File/New and File/Open will start a new independent 
process.

Modified:
   trunk/ChangeLog
   trunk/glom/application.cc
   trunk/glom/application.h
   trunk/glom/bakery/App.cc
   trunk/glom/bakery/App.h
   trunk/glom/bakery/App_WithDoc.cc
   trunk/glom/libglom/spawn_with_feedback.cc

Modified: trunk/glom/application.cc
==============================================================================
--- trunk/glom/application.cc	(original)
+++ trunk/glom/application.cc	Sun Mar 22 22:30:56 2009
@@ -846,21 +846,20 @@
   }
 }
 
-GlomBakery::App* App_Glom::new_instance() //Override
+void App_Glom::new_instance(const Glib::ustring& uri) //Override
 {
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "window_main");
-#else
-  std::auto_ptr<Glib::Error> error;
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "window_main", "", error);
-  if(error.get())
-    return 0;
-#endif
-
-  App_Glom* pApp_Glom = 0;
-  refXml->get_widget_derived("window_main", pApp_Glom);
-
-  return pApp_Glom;
+  Glib::ustring command = "glom";
+  if(!uri.empty())
+    command += " " + uri;
+
+  GError* gerror = 0;
+  gdk_spawn_command_line_on_screen(Glib::unwrap(get_screen()),
+    command.c_str(),
+    &gerror);
+  if(gerror)
+  {
+    std::cerr << "App_Glom::new_instance(): error calling gdk_spawn_command_line_on_screen(): " << gerror->message << std::endl;
+  }
 }
 
 void App_Glom::init_create_document()

Modified: trunk/glom/application.h
==============================================================================
--- trunk/glom/application.h	(original)
+++ trunk/glom/application.h	Sun Mar 22 22:30:56 2009
@@ -132,7 +132,7 @@
   virtual void on_menu_file_close(); //override.
   virtual void document_history_add(const Glib::ustring& file_uri); //overridden.
 
-  virtual GlomBakery::App* new_instance(); //Override
+  virtual void new_instance(const Glib::ustring& uri = Glib::ustring()); //Override
 
 #ifndef G_OS_WIN32
   void open_browsed_document(const EpcServiceInfo* server, const Glib::ustring& service_name);

Modified: trunk/glom/bakery/App.cc
==============================================================================
--- trunk/glom/bakery/App.cc	(original)
+++ trunk/glom/bakery/App.cc	Sun Mar 22 22:30:56 2009
@@ -84,8 +84,7 @@
 
 void App::on_menu_file_new()
 {
-  App* pApp = new_instance();
-  pApp->init(); 
+  new_instance();
 }
 
 void App::on_menu_file_close()

Modified: trunk/glom/bakery/App.h
==============================================================================
--- trunk/glom/bakery/App.h	(original)
+++ trunk/glom/bakery/App.h	Sun Mar 22 22:30:56 2009
@@ -108,7 +108,7 @@
 
   virtual void init_toolbars();
   
-  virtual App* new_instance() = 0; //Must override in order to new() the derived document class.
+  virtual void new_instance(const Glib::ustring& uri = Glib::ustring()) = 0; //Must override in order to new() the derived document class.
 
 //  virtual void close_window() = 0;
 //  virtual void bring_to_front() = 0;

Modified: trunk/glom/bakery/App_WithDoc.cc
==============================================================================
--- trunk/glom/bakery/App_WithDoc.cc	(original)
+++ trunk/glom/bakery/App_WithDoc.cc	Sun Mar 22 22:30:56 2009
@@ -104,19 +104,14 @@
     //Open it:
         
     //Load it into a new instance unless the current document is just a default new.
-    App_WithDoc* pApp = 0;
-    bool bUsingNewInstance = false;
     if(!(get_document()->get_is_new())) //if it's not new.
     {
       //New instance:
-      pApp = dynamic_cast<App_WithDoc*>(new_instance());
-      pApp->init(); //It's shown too.
-      bUsingNewInstance = true;
-    }
-    else
-    {
-      pApp = this; //Replace the default new document in this instance.
+      new_instance(file_uri);
+      return true;
     }
+    
+    App_WithDoc* pApp = this; //Replace the default new document in this instance.
 
     //Open it.
     pApp->m_pDocument->set_file_uri(file_uri);
@@ -150,19 +145,10 @@
     {
       ui_warning(_("Open failed."), _("The document could not be opened."));
 
-      if(bUsingNewInstance)
-      {
-        //Remove new instance:
-        pApp->get_document()->set_modified(false); //avoid 'do you want to save?' dialog.
-        pApp->on_menu_file_close();
-      }
-      else
-      {
-        //re-initialize document.
-        delete pApp->m_pDocument;
-        pApp->m_pDocument = 0;
-        pApp->init_create_document();
-      }
+      //re-initialize document.
+      delete pApp->m_pDocument;
+      pApp->m_pDocument = 0;
+      pApp->init_create_document();
 
       return false; //failed.
     }

Modified: trunk/glom/libglom/spawn_with_feedback.cc
==============================================================================
--- trunk/glom/libglom/spawn_with_feedback.cc	(original)
+++ trunk/glom/libglom/spawn_with_feedback.cc	Sun Mar 22 22:30:56 2009
@@ -63,7 +63,9 @@
 class SpawnError: public std::runtime_error
 {
 public:
-  SpawnError(const std::string& error_message): std::runtime_error(error_message) {}
+  SpawnError(const std::string& error_message)
+  : std::runtime_error(error_message)
+  {}
 };
 #endif
 
@@ -318,17 +320,26 @@
 
 bool spawn_async_end(std::auto_ptr<const SpawnInfo> info, std::string* stdout_text = NULL, std::string* stderr_text = NULL, int* return_status = NULL)
 {
-  if(stdout_text) info->get_stdout(*stdout_text);
-  if(stderr_text) info->get_stderr(*stderr_text);
-  if(return_status) *return_status = info->get_return_status();
+  if(stdout_text)
+    info->get_stdout(*stdout_text);
+
+  if(stderr_text)
+    info->get_stderr(*stderr_text);
+
+  if(return_status)
+    *return_status = info->get_return_status();
+
   return !info->is_running();
 }
 
 int spawn_sync(const Glib::ustring& command_line, std::string* stdout_text, std::string* stderr_text)
 {
   int redirect_flags = 0;
-  if(stdout_text) redirect_flags |= REDIRECT_STDOUT;
-  if(stderr_text) redirect_flags |= REDIRECT_STDERR;
+  if(stdout_text)
+    redirect_flags |= REDIRECT_STDOUT;
+
+  if(stderr_text)
+    redirect_flags |= REDIRECT_STDERR;
 
   std::auto_ptr<const SpawnInfo> info = spawn_async(command_line, redirect_flags);
   info->signal_finished().connect(sigc::ptr_fun(&Gtk::Main::quit));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]