[ekiga] AssistantWindow/AddressBookWindow: Build those windows on demand.



commit f1dca921fb8a3b791afef6b8f492303d5ae3f040
Author: Damien Sandras <dsandras beip be>
Date:   Wed Jan 8 20:16:11 2014 +0100

    AssistantWindow/AddressBookWindow: Build those windows on demand.
    
    The code has been modified so that those windows can be build only when
    requested. That way, we do not have to keep them in memory when they are
    not used most of the time.

 lib/engine/gui/gtk-frontend/addressbook-window.cpp |    2 +
 lib/engine/gui/gtk-frontend/assistant-window.cpp   |   17 ++----
 lib/engine/gui/gtk-frontend/gtk-frontend.cpp       |   42 ++++++-------
 lib/engine/gui/gtk-frontend/gtk-frontend.h         |    9 +--
 lib/engine/gui/gtk-frontend/main_window.cpp        |   69 ++++++++++++++-----
 src/main.cpp                                       |    4 +-
 6 files changed, 82 insertions(+), 61 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/addressbook-window.cpp 
b/lib/engine/gui/gtk-frontend/addressbook-window.cpp
index 4bb31f0..cc587a8 100644
--- a/lib/engine/gui/gtk-frontend/addressbook-window.cpp
+++ b/lib/engine/gui/gtk-frontend/addressbook-window.cpp
@@ -733,5 +733,7 @@ addressbook_window_new (boost::shared_ptr<Ekiga::ContactCore> core,
 
   core->visit_sources (boost::bind (on_visit_sources, _1, (gpointer) self));
 
+  gtk_widget_show_all (vbox);
+
   return GTK_WIDGET (self);
 }
diff --git a/lib/engine/gui/gtk-frontend/assistant-window.cpp 
b/lib/engine/gui/gtk-frontend/assistant-window.cpp
index 14d0974..d525112 100644
--- a/lib/engine/gui/gtk-frontend/assistant-window.cpp
+++ b/lib/engine/gui/gtk-frontend/assistant-window.cpp
@@ -807,23 +807,15 @@ assistant_window_apply (GtkAssistant *gtkassistant)
   apply_personal_data_page (assistant);
   apply_ekiga_net_page (assistant);
   apply_ekiga_out_page (assistant);
-
-  /* Hide the assistant and show the main Ekiga window */
-  gtk_widget_hide (GTK_WIDGET (assistant));
-  gtk_assistant_set_current_page (gtkassistant, 0);
-  boost::shared_ptr<GtkFrontend> gtk_frontend
-    = assistant->priv->service_core->get<GtkFrontend>("gtk-frontend");
-  gtk_widget_show (GTK_WIDGET (gtk_frontend->get_main_window ()));
 }
 
 
 static void
-assistant_window_cancel (GtkAssistant *gtkassistant)
+assistant_window_close (GtkAssistant *gtkassistant)
 {
   AssistantWindow *assistant = ASSISTANT_WINDOW (gtkassistant);
 
-  gtk_assistant_set_current_page (gtkassistant, 0);
-  gtk_widget_hide (GTK_WIDGET (gtkassistant));
+  gtk_widget_destroy (GTK_WIDGET (gtkassistant));
   boost::shared_ptr<GtkFrontend> gtk_frontend
     = assistant->priv->service_core->get<GtkFrontend>("gtk-frontend");
   gtk_widget_show (GTK_WIDGET (gtk_frontend->get_main_window ()));
@@ -849,7 +841,8 @@ assistant_window_class_init (AssistantWindowClass *klass)
 
   assistant_class->prepare = assistant_window_prepare;
   assistant_class->apply = assistant_window_apply;
-  assistant_class->cancel = assistant_window_cancel;
+  assistant_class->cancel = assistant_window_close;
+  assistant_class->close = assistant_window_close;
 
   object_class->finalize = assistant_window_finalize;
 }
@@ -862,7 +855,7 @@ assistant_window_key_press_cb (GtkWidget *widget,
 {
   if (event->keyval == GDK_KEY_Escape) {
 
-    gtk_widget_hide (widget);
+    gtk_widget_destroy (widget);
     return TRUE;  /* do not propagate the key to parent */
   }
 
diff --git a/lib/engine/gui/gtk-frontend/gtk-frontend.cpp b/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
index 8d2b5d7..283573b 100644
--- a/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
+++ b/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
@@ -165,21 +165,13 @@ GtkFrontend::build ()
   gnomemeeting_stock_icons_init ();
   gtk_window_set_default_icon_name (GM_ICON_LOGO);
 
-  addressbook_window =
-    boost::shared_ptr<GtkWidget>(addressbook_window_new (contact_core,
-                                                        USER_INTERFACE ".addressbook-window"),
-                                gtk_widget_destroy);
-
   accounts_window =
     boost::shared_ptr<GtkWidget>(accounts_window_new (account_core,
-                                                     details, 
+                                                     details,
                                                      USER_INTERFACE ".accounts-window"),
                                 gtk_widget_destroy);
 
   // BEWARE: uses the main window during runtime
-  assistant_window =
-    boost::shared_ptr<GtkWidget> (assistant_window_new (core), gtk_widget_destroy);
-
   call_window =
     boost::shared_ptr<GtkWidget> (call_window_new (core), gtk_widget_destroy);
 
@@ -205,8 +197,6 @@ GtkFrontend::build ()
   main_window =
     boost::shared_ptr<GtkWidget> (gm_main_window_new (core),
                                   gtk_widget_destroy);
-
-  gtk_window_set_transient_for (GTK_WINDOW (assistant_window.get ()), GTK_WINDOW (main_window.get ()));
 }
 
 
@@ -223,11 +213,6 @@ GtkFrontend::get_description () const
   return "\tGtk+ frontend support";
 }
 
-const GtkWidget*
-GtkFrontend::get_assistant_window () const
-{
-  return assistant_window.get ();
-}
 
 const GtkWidget*
 GtkFrontend::get_main_window () const
@@ -237,13 +222,6 @@ GtkFrontend::get_main_window () const
 
 
 const GtkWidget*
-GtkFrontend::get_addressbook_window () const
-{
-  return addressbook_window.get ();
-}
-
-
-const GtkWidget*
 GtkFrontend::get_accounts_window () const
 {
   return accounts_window.get ();
@@ -285,3 +263,21 @@ GtkFrontend::build_preferences_window ()
                                  audio_output_core,
                                  video_input_core);
 }
+
+
+GtkWidget*
+GtkFrontend::build_addressbook_window ()
+{
+  boost::shared_ptr<Ekiga::ContactCore> contact_core =
+    core.get<Ekiga::ContactCore> ("contact-core");
+
+  return addressbook_window_new (contact_core,
+                                 USER_INTERFACE ".addressbook-window");
+}
+
+
+GtkWidget*
+GtkFrontend::build_assistant_window ()
+{
+  return assistant_window_new (core);
+}
diff --git a/lib/engine/gui/gtk-frontend/gtk-frontend.h b/lib/engine/gui/gtk-frontend/gtk-frontend.h
index 27bc164..b2d8099 100644
--- a/lib/engine/gui/gtk-frontend/gtk-frontend.h
+++ b/lib/engine/gui/gtk-frontend/gtk-frontend.h
@@ -66,8 +66,6 @@ public:
 
   const GtkWidget* get_main_window () const;
 
-  const GtkWidget *get_addressbook_window () const;
-
   const GtkWidget *get_accounts_window () const;
 
   const GtkWidget *get_call_window () const;
@@ -78,12 +76,13 @@ public:
 
   GtkWidget* build_preferences_window ();
 
+  GtkWidget* build_addressbook_window ();
+
+  GtkWidget* build_assistant_window ();
+
 private :
 
-  boost::shared_ptr<GtkWidget> assistant_window;
   boost::shared_ptr<GtkWidget> main_window;
-  boost::shared_ptr<GtkWidget> preferences_window;
-  boost::shared_ptr<GtkWidget> addressbook_window;
   boost::shared_ptr<GtkWidget> accounts_window;
   boost::shared_ptr<GtkWidget> call_window;
   boost::shared_ptr<GtkWidget> chat_window;
diff --git a/lib/engine/gui/gtk-frontend/main_window.cpp b/lib/engine/gui/gtk-frontend/main_window.cpp
index ec0b5df..d098ef0 100644
--- a/lib/engine/gui/gtk-frontend/main_window.cpp
+++ b/lib/engine/gui/gtk-frontend/main_window.cpp
@@ -82,6 +82,7 @@ typedef enum {
 } PanelSection;
 
 enum DeviceType {AudioInput, AudioOutput, Ringer, VideoInput};
+
 struct deviceStruct {
   char name[256];
   DeviceType deviceType;
@@ -182,8 +183,11 @@ static void url_changed_cb (GtkEditable *e,
 static void show_dialpad_cb (GtkWidget *widget,
                              gpointer data);
 
-static void show_gm_window_cb (GtkWidget *widget,
-                               gpointer data);
+static void build_and_show_addressbook_window_cb (GtkWidget *widget,
+                                                  gpointer data);
+
+static void build_and_show_assistant_window_cb (GtkWidget *widget,
+                                                gpointer data);
 
 static void run_prefs_window_cb (G_GNUC_UNUSED GtkWidget *widget,
                                  gpointer data);
@@ -444,13 +448,41 @@ show_dialpad_cb (G_GNUC_UNUSED GtkWidget *widget,
   mw->priv->user_interface_settings->set_int ("panel-section", DIALPAD);
 }
 
+
+static void
+build_and_show_addressbook_window_cb (G_GNUC_UNUSED GtkWidget *widget,
+                                      gpointer data)
+{
+  GtkWidget *window = NULL;
+
+  g_return_if_fail (EKIGA_IS_MAIN_WINDOW (data));
+  EkigaMainWindow *self = EKIGA_MAIN_WINDOW (data);
+  boost::shared_ptr<GtkFrontend> gtk_frontend = self->priv->gtk_frontend.lock ();
+
+  window = gtk_frontend->build_addressbook_window ();
+  gm_window_set_hide_on_delete (GM_WINDOW (window), FALSE);
+  gm_window_set_hide_on_escape (GM_WINDOW (window), FALSE);
+  gtk_widget_show (window);
+}
+
+//FIXME: Is there a better way than duplicating code here
 static void
-show_gm_window_cb (G_GNUC_UNUSED GtkWidget *widget,
-                   gpointer data)
+build_and_show_assistant_window_cb (G_GNUC_UNUSED GtkWidget *widget,
+                                    gpointer data)
 {
-  gtk_widget_show (GTK_WIDGET (data));
+  GtkWidget *window = NULL;
+
+  g_return_if_fail (EKIGA_IS_MAIN_WINDOW (data));
+  EkigaMainWindow *self = EKIGA_MAIN_WINDOW (data);
+  boost::shared_ptr<GtkFrontend> gtk_frontend = self->priv->gtk_frontend.lock ();
+
+  window = gtk_frontend->build_assistant_window ();
+  gtk_window_set_transient_for (GTK_WINDOW (window),
+                                GTK_WINDOW (self));
+  gtk_widget_show (window);
 }
 
+
 static void
 run_prefs_window_cb (G_GNUC_UNUSED GtkWidget *widget,
                      gpointer data)
@@ -1100,9 +1132,7 @@ ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
 static void
 ekiga_main_window_init_menu (EkigaMainWindow *mw)
 {
-  GtkWidget *addressbook_window = NULL;
   GtkWidget *accounts_window = NULL;
-  GtkWidget *assistant_window = NULL;
 
   mw->priv->main_menu = gtk_menu_bar_new ();
 
@@ -1112,9 +1142,7 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
 
   g_return_if_fail (gtk_frontend);
 
-  addressbook_window = GTK_WIDGET (gtk_frontend->get_addressbook_window ());
   accounts_window = GTK_WIDGET (gtk_frontend->get_accounts_window ());
-  assistant_window = GTK_WIDGET (gtk_frontend->get_assistant_window ());
 
   static MenuEntry gnomemeeting_menu [] =
     {
@@ -1139,8 +1167,8 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
       GTK_MENU_THEME_ENTRY("address_book", _("Address _Book"),
                           _("Find contacts"),
                           "x-office-address-book", 'b',
-                          G_CALLBACK (show_widget_cb),
-                          (gpointer) addressbook_window, TRUE),
+                          G_CALLBACK (build_and_show_addressbook_window_cb),
+                          (gpointer) mw, TRUE),
 
       GTK_MENU_SEPARATOR,
 
@@ -1160,8 +1188,8 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
       GTK_MENU_ENTRY("configuration_assistant", _("_Configuration Assistant"),
                     _("Run the configuration assistant"),
                     NULL, 0,
-                    G_CALLBACK (show_gm_window_cb),
-                    (gpointer) assistant_window, TRUE),
+                    G_CALLBACK (build_and_show_assistant_window_cb),
+                    (gpointer) mw, TRUE),
 
       GTK_MENU_SEPARATOR,
 
@@ -1182,22 +1210,26 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
       GTK_MENU_TOGGLE_ENTRY("preview", _("_Video Preview"),
                             _("Display images from your camera device"),
                             NULL, 0,
-                           mw->priv->video_devices_settings->get_g_settings (), "enable-preview",
+                           mw->priv->video_devices_settings->get_g_settings (),
+                            "enable-preview",
                             TRUE),
 
       GTK_MENU_SEPARATOR,
 
       GTK_MENU_RADIO_ENTRY("contacts", _("Con_tacts"), _("View the contacts list"),
                           NULL, 0,
-                          mw->priv->user_interface_settings->get_g_settings (), "panel-section",
+                          mw->priv->user_interface_settings->get_g_settings (),
+                           "panel-section",
                           TRUE),
       GTK_MENU_RADIO_ENTRY("dialpad", _("_Dialpad"), _("View the dialpad"),
                           NULL, 0,
-                          mw->priv->user_interface_settings->get_g_settings (), "panel-section",
+                          mw->priv->user_interface_settings->get_g_settings (),
+                           "panel-section",
                           TRUE),
       GTK_MENU_RADIO_ENTRY("call-history", _("_Call History"), _("View the call history"),
                           NULL, 0,
-                          mw->priv->user_interface_settings->get_g_settings (), "panel-section",
+                          mw->priv->user_interface_settings->get_g_settings (),
+                           "panel-section",
                           TRUE),
 
       GTK_MENU_SEPARATOR,
@@ -1205,7 +1237,8 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
       GTK_MENU_TOGGLE_ENTRY ("showofflinecontacts", _("Show Offline _Contacts"),
                             _("Show offline contacts"),
                              NULL, 0,
-                            mw->priv->contacts_settings->get_g_settings (), "show-offline-contacts",
+                            mw->priv->contacts_settings->get_g_settings (),
+                             "show-offline-contacts",
                              TRUE),
 
       GTK_MENU_NEW(_("_Help")),
diff --git a/src/main.cpp b/src/main.cpp
index ebbfd59..8a27f48 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -220,9 +220,7 @@ main (int argc,
   int crt_version = general_settings->get_int ("version");
   if (crt_version < schema_version) {
 
-    // show the assistant if there is no config file
-    if (crt_version == 0)
-      gtk_widget_show_all (GTK_WIDGET (gtk_frontend->get_assistant_window ()));
+    gtk_widget_show_all (GTK_WIDGET (gtk_frontend->build_assistant_window ()));
 
     /* Update the version number */
     general_settings->set_int ("version", schema_version);


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