glom r2015 - in trunk: . glom glom/bakery



Author: murrayc
Date: Sun Mar 22 18:03:47 2009
New Revision: 2015
URL: http://svn.gnome.org/viewvc/glom?rev=2015&view=rev

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

Reverted this change because each instance is now an independent 
process, or soon will be when I have made some more changes:

* configure.ac: Depend on libunique-1.0
* glom/bakery/App_WithDoc_Gtk.[h|cc]: Added set_unique_app(), to make 
the app handle UniqueApp messages, to start new instances or open files.
* glom/main.cc: Use set_unique_app() and send messages to the existing 
instance instead of starting a new instance, if one is already running.

Modified:
   trunk/ChangeLog
   trunk/configure.ac
   trunk/glom/bakery/App_WithDoc_Gtk.cc
   trunk/glom/bakery/App_WithDoc_Gtk.h
   trunk/glom/main.cc

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Sun Mar 22 18:03:47 2009
@@ -106,7 +106,7 @@
 
 
 # Do not require, goocanvas and gtksourceviewmm in client only mode
-REQUIRED_LIBS="gtkmm-2.4 >= 2.14 gthread-2.0 gconfmm-2.6 libxml++-2.6 libxslt >= 1.1.10 pygda-4.0 >= 2.25.3 pygtk-2.0 >= 2.6.0 libgdamm-4.0 >= 3.99.14 libgda-4.0 >= 4.0.0 libgda-postgres-4.0 goocanvasmm-1.0 >= 0.13.0 unique-1.0"
+REQUIRED_LIBS="gtkmm-2.4 >= 2.14 gthread-2.0 gconfmm-2.6 libxml++-2.6 libxslt >= 1.1.10 pygda-4.0 >= 2.25.3 pygtk-2.0 >= 2.6.0 libgdamm-4.0 >= 3.99.14 libgda-4.0 >= 4.0.0 libgda-postgres-4.0 goocanvasmm-1.0 >= 0.13.0"
 if test $enable_client_only != yes; then
 	REQUIRED_LIBS="$REQUIRED_LIBS gtksourceviewmm-2.0"
 fi

Modified: trunk/glom/bakery/App_WithDoc_Gtk.cc
==============================================================================
--- trunk/glom/bakery/App_WithDoc_Gtk.cc	(original)
+++ trunk/glom/bakery/App_WithDoc_Gtk.cc	Sun Mar 22 18:03:47 2009
@@ -295,76 +295,4 @@
     document_history_remove(uri);
 }
 
-void App_WithDoc_Gtk::set_unique_app(UniqueApp* unique_app)
-{
-  if(!unique_app)
-    return;
-
-  m_unique_app = unique_app;
-  g_object_ref(m_unique_app); //Keep it alive. unrefed in the destructor.
-
-  // The UniqueApp instance must "watch" all the top-level windows the application
-  // creates, so that it can terminate the startup notification sequence for us
-  unique_app_watch_window (unique_app, GTK_WINDOW(gobj()));
-
-  // Handle messages from other instances that try to start:
-  g_signal_connect (unique_app, "message-received", G_CALLBACK(&App_WithDoc_Gtk::on_unique_app_message_received), this /* user_data */);
-
-}
-
-// This handles messages from other UniqueApp instances,
-// to our single instance,
-// sent to the signal instance before the extra instances quit, 
-// soon after they start.
-UniqueResponse App_WithDoc_Gtk::on_unique_app_message_received(UniqueApp* app,
-  UniqueCommand command,
-  UniqueMessageData* message,
-  guint time_,
-  gpointer user_data)
-{
-  App_WithDoc_Gtk* pApp = static_cast<App_WithDoc_Gtk*>(user_data);
-  if(!pApp)
-    return UNIQUE_RESPONSE_FAIL;
-
-  switch(command)
-  {
-    case UNIQUE_ACTIVATE:
-    {
-      Glib::RefPtr<Gdk::Screen> screen = Glib::wrap(unique_message_data_get_screen(message), true);
-      pApp->set_screen(screen);
-      pApp->present();
-      
-      return UNIQUE_RESPONSE_OK;
-    }
-
-    case UNIQUE_NEW:
-    {
-      pApp->on_menu_file_new();
-
-      return UNIQUE_RESPONSE_OK;
-      break;
-    }
-
-    case UNIQUE_OPEN:
-    {
-      char* uri = unique_message_data_get_text(message);
-      std::cout << "DEBUG: uri=" << uri << std::endl;
-      
-      pApp->open_document(uri);
-      pApp->present();
-
-      g_free(uri);
-
-      return UNIQUE_RESPONSE_OK;
-      break;
-    }
-
-    default:
-    {
-      std::cerr << "Unexpected UniqueApp command: " << command << std::endl;
-      return UNIQUE_RESPONSE_FAIL;
-    }
-  }
-}
-
 } //namespace

Modified: trunk/glom/bakery/App_WithDoc_Gtk.h
==============================================================================
--- trunk/glom/bakery/App_WithDoc_Gtk.h	(original)
+++ trunk/glom/bakery/App_WithDoc_Gtk.h	Sun Mar 22 18:03:47 2009
@@ -25,7 +25,6 @@
 #include <gtkmm/toolbutton.h>
 #include <gtkmm/recentmanager.h>
 #include <gtkmm/recentchooser.h>
-#include <unique/unique.h>
 
 namespace GlomBakery
 {
@@ -53,12 +52,6 @@
 
   virtual void init(); //Unique final overrider.
 
-  /** Connect a signal handler for UniqueApp messages,
-   * which handles the default commands, for instance to open new instances 
-   * an to open files.
-   */
-  virtual void set_unique_app(UniqueApp* unique_app);
-
 protected:
   virtual void init_menus_file(); //overridden to add open/save/save as.
   virtual void init_menus_file_recentfiles(const Glib::ustring& path); // call this in init_menus_file()
@@ -77,14 +70,8 @@
 
   void on_recent_files_activate(Gtk::RecentChooser& recent_chooser);
 
-  static UniqueResponse on_unique_app_message_received(UniqueApp* app, UniqueCommand command, UniqueMessageData* message, guint time_, gpointer user_data);
-
   //Menu stuff:
   Glib::RefPtr<Gtk::Action> m_action_save, m_action_saveas;
-
-  //We keep this around just so we can keep a ref on it.
-  //This will only be non-null for the first instance.
-  UniqueApp* m_unique_app;
 };
 
 } //namespace

Modified: trunk/glom/main.cc
==============================================================================
--- trunk/glom/main.cc	(original)
+++ trunk/glom/main.cc	Sun Mar 22 18:03:47 2009
@@ -112,17 +112,15 @@
   //to help valgrind to detect memory leaks:
   atexit(__libc_freeres);
 #else
-  //Allow use of the Windows Sockets API:
   WSADATA data;
-  const int errcode = WSAStartup(MAKEWORD(2, 0), &data);
+  int errcode = WSAStartup(MAKEWORD(2, 0), &data);
   if(errcode != 0)
   {
     std::cerr << "Failed to initialize WinSock: " << errcode << std::endl;
     return -1;
   }
 
-  //Get the installation directory for use in other MS Windows initialization later:
-  gchar* installation_dir_c = g_win32_get_package_installation_directory_of_module(0);
+  gchar* installation_dir_c = g_win32_get_package_installation_directory_of_module(NULL);
   const std::string installation_dir(installation_dir_c);
   g_free(installation_dir_c);
 #endif
@@ -131,7 +129,7 @@
   // correctly according to getenv(), but python still does not look in it.
   // For now, the installer installs all the python stuff directly into the 
   // application directory, although I would like to move this to a python/
-  // subdirectory. Armin.
+  // subdirectory.
 #if 0
 #ifdef G_OS_WIN32
   // Set PYTHONPATH to point to python/ because that's where the installer
@@ -152,20 +150,16 @@
   Glib::setenv("PATH", Glib::getenv("PATH") + ";" + Glib::build_filename(installation_dir, "bin"));
 #endif
 
-
-  // Make this application use the current locale for _() translation:
 #ifdef G_OS_WIN32
-  // Load translations relative to glom.exe on Windows:
+  // Load translations relative to glom.exe on Windows
   bindtextdomain(GETTEXT_PACKAGE, Glib::build_filename(installation_dir, "share/locale").c_str());
 #else
+  //Make this application use the current locale for _() translation:
   bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);  //LOCALEDIR is defined in the Makefile.am
 #endif
   bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
   textdomain(GETTEXT_PACKAGE);
 
-
-  //Initialize gtkmm, Python, etc:
-
   g_thread_init(NULL); //So we can use GMutex.
 
   Gnome::Gda::init();
@@ -173,35 +167,31 @@
   Hildon::init();
 #endif
 
-  //We use python for calculated-fields:
-  Py_Initialize();
-  PySys_SetArgv(argc, argv);
-
-
-  //Parse command-line arguments:
   Glib::OptionContext context;
+
   Glom::OptionGroup group;
   context.set_main_group(group);
-  Gtk::Main mainInstance(argc, argv, context); //Parses standard GTK+ command-line arguments.
+  //We use python for calculated-fields:
+  Py_Initialize();
+  PySys_SetArgv(argc, argv);
+  Gtk::Main mainInstance(argc, argv, context);
 
 #ifdef GLIBMM_EXCEPTIONS_ENABLED
   try
-  {
 #else
   std::auto_ptr<Glib::Error> error;
 #endif // GLIBMM_EXCEPTIONS_ENABLED
-
+  {
 #ifdef GLIBMM_EXCEPTIONS_ENABLED
     context.parse(argc, argv);
 #else
     context.parse(argc, argv, error);
 #endif // GLIBMM_EXCEPTIONS_ENABLED
-
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
   }
+#ifdef GLIBMM_EXCEPTIONS_ENABLED
   catch(const Glib::OptionError& ex)
 #else
-  if(error.get())
+  if(error.get() != NULL)
 #endif
   {
 #ifndef GLIBMM_EXCEPTIONS_ENABLED
@@ -225,12 +215,7 @@
     return 0;
   }
 
-#ifndef GLOM_ENABLE_CLIENT_ONLY
-    gtksourceview::init();
-    Goocanvas::init(PACKAGE, VERSION, argc, argv ) ;
-#endif //!GLOM_ENABLE_CLIENT_ONLY
 
-  //Show the application version:
   if(group.m_arg_version)
   {
     std::cout << VERSION << std::endl;
@@ -241,6 +226,11 @@
   try
 #endif
   {
+#ifndef GLOM_ENABLE_CLIENT_ONLY
+    gtksourceview::init();
+    Goocanvas::init(PACKAGE, VERSION, argc, argv ) ;
+#endif //!GLOM_ENABLE_CLIENT_ONLY
+
     //Get command-line parameters, if any:
     Glib::ustring input_uri = group.m_arg_filename;
 
@@ -265,42 +255,6 @@
     //debugging:
     //input_uri = "file:///home/murrayc/cvs/gnome212/glom/examples/example_smallbusiness.glom";
 
-
-    //Ensure that only one instance of Glom is ever started,
-    //so that the file menu's new/open/quit menu items can be aware of other open files/windows:
-    //
-    //If an instance is already running then ask that instance to do something instead,
-    //and close this instance.
-    UniqueApp* unique_app = unique_app_new("org.glom", NULL /* startup_id */);
-    if( unique_app_is_running(unique_app) )
-    {
-      //There is an existing instance:
-
-      UniqueResponse response = UNIQUE_RESPONSE_OK;
-
-      if(!input_uri.empty())
-      {
-        //Tell the existing instance to do a File/Open:
-        UniqueMessageData *message = unique_message_data_new();
-        unique_message_data_set_text(message, input_uri.c_str(), -1); //TODO: Use set_uris().
-        response = unique_app_send_message(unique_app, UNIQUE_OPEN, message);
-        unique_message_data_free(message);
-      }
-      else
-      {
-        //Tell the existing instance to do a File/New:
-        response = unique_app_send_message(unique_app, UNIQUE_NEW, 0);
-      }
-
-      g_object_unref(unique_app);
-      unique_app = 0;
-      if(response != UNIQUE_RESPONSE_OK)
-        std::cerr << "unique_app_send_message() failed." << std::endl;
-
-      return 0;
-    }
-    //Else this is the first instance:
-
 #ifdef GLOM_ENABLE_POSTGRESQL
     bool install_complete = false;
 #ifndef GLOM_ENABLE_CLIENT_ONLY
@@ -346,20 +300,18 @@
     }
 #endif
 
-    //Create the main window (the application):
+
     Glom::App_Glom* pApp_Glom = 0;
     refXml->get_widget_derived("window_main", pApp_Glom);
 
-    pApp_Glom->set_unique_app(unique_app);
-    g_object_unref(unique_app);
-    unique_app = 0;
-
     pApp_Glom->set_command_line_args(argc, argv);
     pApp_Glom->set_show_sql_debug(group.m_arg_debug_sql);
 
-    const bool test = pApp_Glom->init(input_uri); //Sets it up and shows it.
+    bool test = pApp_Glom->init(input_uri); //Sets it up and shows it.
     if(test) //The user could cancel the offer of a new or existing database.
+    {
       Gtk::Main::run();
+    }
     else
       delete pApp_Glom;
   }



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