[ekiga/ds-opal-refactoring] CallWindow: Only show call window when call is in setup mode.



commit 912d5fcf6c3662eeca910e7b13c6bfba64142f4a
Author: Damien Sandras <dsandras seconix com>
Date:   Sun Apr 12 15:14:06 2015 +0200

    CallWindow: Only show call window when call is in setup mode.
    
    The CallWindow should not be displayed/constructed when a call is
    created. That call could be immediately rejected or fowarded.

 lib/engine/gui/gtk-frontend/call-window.cpp |  237 ++++++++++++---------------
 lib/engine/gui/gtk-frontend/call-window.h   |    8 +
 lib/engine/gui/gtk-frontend/ekiga-app.cpp   |   13 +-
 3 files changed, 122 insertions(+), 136 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/call-window.cpp b/lib/engine/gui/gtk-frontend/call-window.cpp
index 6043cbb..1a89c38 100644
--- a/lib/engine/gui/gtk-frontend/call-window.cpp
+++ b/lib/engine/gui/gtk-frontend/call-window.cpp
@@ -109,7 +109,6 @@ struct _EkigaCallWindowPrivate
   boost::shared_ptr<Ekiga::VideoOutputCore> videooutput_core;
   boost::shared_ptr<Ekiga::AudioInputCore> audioinput_core;
   boost::shared_ptr<Ekiga::AudioOutputCore> audiooutput_core;
-  boost::shared_ptr<Ekiga::CallCore> call_core;
   boost::shared_ptr<Ekiga::FriendOrFoe> friend_or_foe;
   boost::shared_ptr<Ekiga::FoeList> foe_list;
 
@@ -294,9 +293,6 @@ static void on_missed_call_cb (boost::shared_ptr<Ekiga::Call> /*call*/,
 static void on_held_call_cb (boost::shared_ptr<Ekiga::Call> /*call*/,
                              gpointer self);
 
-static void on_setup_call_cb (boost::shared_ptr<Ekiga::Call> call,
-                              gpointer self);
-
 static void on_retrieved_call_cb (boost::shared_ptr<Ekiga::Call> /*call*/,
                                   gpointer self);
 
@@ -355,8 +351,6 @@ static GtkWidget *gm_call_window_build_settings_popover (EkigaCallWindow *call_w
 
 static void ekiga_call_window_toggle_fullscreen (EkigaCallWindow *self);
 
-static void ekiga_call_window_connect_engine_signals (EkigaCallWindow *self);
-
 static void ekiga_call_window_init_gui (EkigaCallWindow *self);
 
 /**/
@@ -792,46 +786,6 @@ on_ringing_call_cb (G_GNUC_UNUSED boost::shared_ptr<Ekiga::Call>  call,
 
 
 static void
-on_setup_call_cb (boost::shared_ptr<Ekiga::Call> call,
-                  gpointer data)
-{
-  EkigaCallWindow *self = EKIGA_CALL_WINDOW (data);
-  boost::signals2::connection conn;
-
-  self->priv->menu = Ekiga::GActorMenuPtr (new Ekiga::GActorMenu (*call));
-
-  if (!call->is_outgoing ()) {
-    if (self->priv->current_call)
-      return; // No call setup needed if already in a call
-
-    self->priv->current_call = call;
-    ekiga_call_window_update_calling_state (self, Called);
-    ekiga_call_window_update_title (self, Called, call->get_remote_party_name ());
-    ekiga_call_window_update_header_bar_actions (self, Called);
-  }
-  else {
-
-    self->priv->current_call = call;
-    ekiga_call_window_update_calling_state (self, Calling);
-    ekiga_call_window_update_title (self, Calling, call->get_remote_uri ());
-    ekiga_call_window_update_header_bar_actions (self, Calling);
-  }
-
-  { // do we know about this contact already?
-    const std::string uri = self->priv->current_call->get_remote_uri ();
-    Ekiga::FriendOrFoe::Identification id = self->priv->friend_or_foe->decide ("call", uri);
-    if (id == Ekiga::FriendOrFoe::Unknown)
-      gtk_widget_set_sensitive (GTK_WIDGET (self->priv->blacklist_button), true);
-    else
-      gtk_widget_set_sensitive (GTK_WIDGET (self->priv->blacklist_button), false);
-  }
-
-  conn = call->questions.connect (boost::bind (&on_handle_questions, _1, (gpointer) self));
-  self->priv->connections.add (conn);
-}
-
-
-static void
 on_established_call_cb (boost::shared_ptr<Ekiga::Call> call,
                         gpointer data)
 {
@@ -846,6 +800,7 @@ on_established_call_cb (boost::shared_ptr<Ekiga::Call> call,
   self->priv->timeout_id = g_timeout_add_seconds (1, on_stats_refresh_cb, self);
 }
 
+
 static void
 on_cleared_call_cb (boost::shared_ptr<Ekiga::Call> call,
                     G_GNUC_UNUSED std::string reason,
@@ -1380,86 +1335,6 @@ ekiga_call_window_toggle_fullscreen (EkigaCallWindow *self)
 
 
 static void
-ekiga_call_window_connect_engine_signals (EkigaCallWindow *self)
-{
-  boost::signals2::connection conn;
-
-  g_return_if_fail (EKIGA_IS_CALL_WINDOW (self));
-
-  /* New Display Engine signals */
-  conn = self->priv->videooutput_core->device_opened.connect (boost::bind (&on_videooutput_device_opened_cb, 
_1, _2, _3, _4, _5, _6, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->videooutput_core->device_closed.connect (boost::bind (&on_videooutput_device_closed_cb, 
_1, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->videooutput_core->device_error.connect (boost::bind (&on_videooutput_device_error_cb, 
_1, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->videooutput_core->size_changed.connect (boost::bind (&on_size_changed_cb, _1, _2, _3, 
_4, (gpointer) self));
-  self->priv->connections.add (conn);
-
-
-  /* New VideoInput Engine signals */
-  conn = self->priv->videoinput_core->device_opened.connect (boost::bind (&on_videoinput_device_opened_cb, 
_1, _2, _3, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->videoinput_core->device_closed.connect (boost::bind (&on_videoinput_device_closed_cb, 
_1, _2, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->videoinput_core->device_error.connect (boost::bind (&on_videoinput_device_error_cb, _1, 
_2, _3, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  /* New AudioInput Engine signals */
-  conn = self->priv->audioinput_core->device_opened.connect (boost::bind (&on_audioinput_device_opened_cb, 
_1, _2, _3, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->audioinput_core->device_closed.connect (boost::bind (&on_audioinput_device_closed_cb, 
_1, _2, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->audioinput_core->device_error.connect (boost::bind (&on_audioinput_device_error_cb, _1, 
_2, _3, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  /* New AudioOutput Engine signals */
-  conn = self->priv->audiooutput_core->device_opened.connect (boost::bind (&on_audiooutput_device_opened_cb, 
_1, _2, _3, _4, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->audiooutput_core->device_closed.connect (boost::bind (&on_audiooutput_device_closed_cb, 
_1, _2, _3, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->audiooutput_core->device_error.connect (boost::bind (&on_audiooutput_device_error_cb, 
_1, _2, _3, _4, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  /* New Call Engine signals */
-  conn = self->priv->call_core->setup_call.connect (boost::bind (&on_setup_call_cb, _1, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->ringing_call.connect (boost::bind (&on_ringing_call_cb, _1, (gpointer) 
self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->established_call.connect (boost::bind (&on_established_call_cb, _1, 
(gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->cleared_call.connect (boost::bind (&on_cleared_call_cb, _1, _2, (gpointer) 
self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->missed_call.connect (boost::bind (&on_missed_call_cb, _1, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->held_call.connect (boost::bind (&on_held_call_cb, _1, (gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->retrieved_call.connect (boost::bind (&on_retrieved_call_cb, _1, (gpointer) 
self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->stream_opened.connect (boost::bind (&on_stream_opened_cb, _1, _2, _3, _4, 
(gpointer) self));
-  self->priv->connections.add (conn);
-
-  conn = self->priv->call_core->stream_closed.connect (boost::bind (&on_stream_closed_cb, _1, _2, _3, _4, 
(gpointer) self));
-  self->priv->connections.add (conn);
-}
-
-static void
 ekiga_call_window_init_gui (EkigaCallWindow *self)
 {
   GtkWidget *event_box = NULL;
@@ -1619,8 +1494,6 @@ ekiga_call_window_init_gui (EkigaCallWindow *self)
   gtk_widget_show (button);
 
   gtk_window_set_resizable (GTK_WINDOW (self), true);
-
-  /* Init */
   ekiga_call_window_update_header_bar_actions (self, Standby);
 }
 
@@ -1700,6 +1573,7 @@ ekiga_call_window_class_init (EkigaCallWindowClass *klass)
   widget_class->focus_in_event = ekiga_call_window_focus_in_event;
 }
 
+
 GtkWidget *
 call_window_new (GmApplication *app)
 {
@@ -1718,7 +1592,6 @@ call_window_new (GmApplication *app)
   self->priv->videooutput_core = core.get<Ekiga::VideoOutputCore> ("videooutput-core");
   self->priv->audioinput_core = core.get<Ekiga::AudioInputCore> ("audioinput-core");
   self->priv->audiooutput_core = core.get<Ekiga::AudioOutputCore> ("audiooutput-core");
-  self->priv->call_core = core.get<Ekiga::CallCore> ("call-core");
   self->priv->friend_or_foe = core.get<Ekiga::FriendOrFoe> ("friend-or-foe");
   self->priv->foe_list = core.get<Ekiga::FoeList> ("foe-list");
 
@@ -1735,7 +1608,111 @@ call_window_new (GmApplication *app)
                    "secondary_stream_display",
                    G_SETTINGS_BIND_DEFAULT);
 
-  ekiga_call_window_connect_engine_signals (self);
+  /* Display Engine signals */
+  boost::signals2::connection conn;
+  conn = self->priv->videooutput_core->device_opened.connect (boost::bind (&on_videooutput_device_opened_cb, 
_1, _2, _3, _4, _5, _6, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->videooutput_core->device_closed.connect (boost::bind (&on_videooutput_device_closed_cb, 
_1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->videooutput_core->device_error.connect (boost::bind (&on_videooutput_device_error_cb, 
_1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->videooutput_core->size_changed.connect (boost::bind (&on_size_changed_cb, _1, _2, _3, 
_4, (gpointer) self));
+  self->priv->connections.add (conn);
+
+
+  /* VideoInput Engine signals */
+  conn = self->priv->videoinput_core->device_opened.connect (boost::bind (&on_videoinput_device_opened_cb, 
_1, _2, _3, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->videoinput_core->device_closed.connect (boost::bind (&on_videoinput_device_closed_cb, 
_1, _2, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->videoinput_core->device_error.connect (boost::bind (&on_videoinput_device_error_cb, _1, 
_2, _3, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  /* AudioInput Engine signals */
+  conn = self->priv->audioinput_core->device_opened.connect (boost::bind (&on_audioinput_device_opened_cb, 
_1, _2, _3, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->audioinput_core->device_closed.connect (boost::bind (&on_audioinput_device_closed_cb, 
_1, _2, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->audioinput_core->device_error.connect (boost::bind (&on_audioinput_device_error_cb, _1, 
_2, _3, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  /* AudioOutput Engine signals */
+  conn = self->priv->audiooutput_core->device_opened.connect (boost::bind (&on_audiooutput_device_opened_cb, 
_1, _2, _3, _4, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->audiooutput_core->device_closed.connect (boost::bind (&on_audiooutput_device_closed_cb, 
_1, _2, _3, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = self->priv->audiooutput_core->device_error.connect (boost::bind (&on_audiooutput_device_error_cb, 
_1, _2, _3, _4, (gpointer) self));
+  self->priv->connections.add (conn);
 
   return GTK_WIDGET (self);
 }
+
+
+void
+call_window_add_call (GtkWidget *call_window,
+                      boost::shared_ptr<Ekiga::Call> call)
+{
+  g_return_if_fail (EKIGA_IS_CALL_WINDOW (call_window));
+
+  EkigaCallWindow *self = EKIGA_CALL_WINDOW (call_window);
+  if (self->priv->current_call)
+    return;
+
+  self->priv->current_call = call;
+
+  /* Update menu */
+  self->priv->menu = Ekiga::GActorMenuPtr (new Ekiga::GActorMenu (*call));
+
+  /* Update UI elements */
+  CallingState s = call->is_outgoing () ? Calling : Called;
+  ekiga_call_window_update_calling_state (self, s);
+  ekiga_call_window_update_title (self, s, call->is_outgoing () ? call->get_remote_uri () : 
call->get_remote_party_name ());
+  ekiga_call_window_update_header_bar_actions (self, s);
+
+  { // do we know about this contact already?
+    const std::string uri = self->priv->current_call->get_remote_uri ();
+    Ekiga::FriendOrFoe::Identification id = self->priv->friend_or_foe->decide ("call", uri);
+    if (id == Ekiga::FriendOrFoe::Unknown)
+      gtk_widget_set_sensitive (GTK_WIDGET (self->priv->blacklist_button), true);
+    else
+      gtk_widget_set_sensitive (GTK_WIDGET (self->priv->blacklist_button), false);
+  }
+
+  /* Connect new signals */
+  boost::signals2::connection conn;
+  conn = call->ringing.connect (boost::bind (&on_ringing_call_cb, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->established.connect (boost::bind (&on_established_call_cb, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->cleared.connect (boost::bind (&on_cleared_call_cb, _1, _2, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->missed.connect (boost::bind (&on_missed_call_cb, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->held.connect (boost::bind (&on_held_call_cb, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->retrieved.connect (boost::bind (&on_retrieved_call_cb, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->stream_opened.connect (boost::bind (&on_stream_opened_cb, _1, _2, _3, _4, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->stream_closed.connect (boost::bind (&on_stream_closed_cb, _1, _2, _3, _4, (gpointer) self));
+  self->priv->connections.add (conn);
+
+  conn = call->questions.connect (boost::bind (&on_handle_questions, _1, (gpointer) self));
+  self->priv->connections.add (conn);
+}
diff --git a/lib/engine/gui/gtk-frontend/call-window.h b/lib/engine/gui/gtk-frontend/call-window.h
index 9a2934d..71788f2 100644
--- a/lib/engine/gui/gtk-frontend/call-window.h
+++ b/lib/engine/gui/gtk-frontend/call-window.h
@@ -65,5 +65,13 @@ GType        ekiga_call_window_get_type   ();
 
 GtkWidget *call_window_new (GmApplication *app);
 
+// Add a call to handle to the CallWindow.
+// The call is supposed to be in "setup" mode. The reason
+// is that the CallWindow should not handle calls that do
+// not reach the "setup" phase because they are rejected,
+// or forwarded.
+void call_window_add_call (GtkWidget *call_window,
+                           boost::shared_ptr<Ekiga::Call> call);
+
 G_END_DECLS
 #endif
diff --git a/lib/engine/gui/gtk-frontend/ekiga-app.cpp b/lib/engine/gui/gtk-frontend/ekiga-app.cpp
index 4bc2629..b4ff5a9 100644
--- a/lib/engine/gui/gtk-frontend/ekiga-app.cpp
+++ b/lib/engine/gui/gtk-frontend/ekiga-app.cpp
@@ -124,8 +124,8 @@ static void gm_application_populate_application_menu (GmApplication *app);
 
 static GtkWidget *gm_application_show_call_window (GmApplication *self);
 
-static void on_created_call_cb (boost::shared_ptr<Ekiga::Call> call,
-                                gpointer data);
+static void on_setup_call_cb (boost::shared_ptr<Ekiga::Call> call,
+                              gpointer data);
 
 static bool on_visit_banks_cb (Ekiga::BankPtr bank,
                                gpointer data);
@@ -222,14 +222,15 @@ gm_application_show_call_window (GmApplication *self)
 
 /* Private callbacks */
 static void
-on_created_call_cb (G_GNUC_UNUSED boost::shared_ptr<Ekiga::Call> call,
-                    gpointer data)
+on_setup_call_cb (boost::shared_ptr<Ekiga::Call> call,
+                  gpointer data)
 {
   g_return_if_fail (GM_IS_APPLICATION (data));
 
   GmApplication *self = GM_APPLICATION (data);
 
-  gm_application_show_call_window (self);
+  GtkWidget *call_window = gm_application_show_call_window (self);
+  call_window_add_call (call_window, call);
 }
 
 
@@ -397,7 +398,7 @@ ekiga_main (int argc,
   // Connect signals
   {
     boost::shared_ptr<Ekiga::CallCore> call_core = app->priv->core.get<Ekiga::CallCore> ("call-core");
-    call_core->created_call.connect (boost::bind (&on_created_call_cb, _1, (gpointer) app));
+    call_core->setup_call.connect (boost::bind (&on_setup_call_cb, _1, (gpointer) app));
 
     boost::shared_ptr<Ekiga::AccountCore> account_core = app->priv->core.get<Ekiga::AccountCore> 
("account-core");
     app->priv->conns.add (account_core->questions.connect (boost::bind (&on_handle_questions_cb, _1, app)));


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