]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-individual-menu.c
translate "Call $NUMBER" menu items
[empathy.git] / libempathy-gtk / empathy-individual-menu.c
index 51b954819193cf94b449a11fd92ab78f01806796..5dc1309839142c6c0bcda24124c97ee2c61070ef 100644 (file)
 #include "empathy-individual-menu.h"
 
 #include <glib/gi18n-lib.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
 
 #include "empathy-account-selector-dialog.h"
 #include "empathy-call-utils.h"
-#include "empathy-camera-monitor.h"
 #include "empathy-chatroom-manager.h"
 #include "empathy-gtk-enum-types.h"
 #include "empathy-images.h"
@@ -62,12 +63,19 @@ enum {
   PROP_STORE,
 };
 
+enum {
+  MENU_ITEM_ACTIVATED,
+  LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0 };
+
 G_DEFINE_TYPE (EmpathyIndividualMenu, empathy_individual_menu, GTK_TYPE_MENU);
 
 static GtkWidget * empathy_individual_chat_menu_item_new (
-    FolksIndividual *individual);
+    EmpathyIndividualMenu *self, FolksIndividual *individual);
 static GtkWidget * empathy_individual_sms_menu_item_new (
-    FolksIndividual *individual);
+    EmpathyIndividualMenu *self, FolksIndividual *individual);
 static GtkWidget * empathy_individual_log_menu_item_new  (
     FolksIndividual *individual);
 static GtkWidget * empathy_individual_info_menu_item_new (
@@ -78,9 +86,9 @@ static GtkWidget * empathy_individual_invite_menu_item_new (
     FolksIndividual *individual,
     EmpathyContact *contact);
 static GtkWidget * empathy_individual_file_transfer_menu_item_new (
-    FolksIndividual *individual);
+    EmpathyIndividualMenu *self, FolksIndividual *individual);
 static GtkWidget * empathy_individual_share_my_desktop_menu_item_new (
-    FolksIndividual *individual);
+    EmpathyIndividualMenu *self, FolksIndividual *individual);
 static GtkWidget * empathy_individual_favourite_menu_item_new (
     FolksIndividual *individual);
 static GtkWidget * empathy_individual_add_menu_item_new (
@@ -92,7 +100,8 @@ static GtkWidget * empathy_individiual_remove_menu_item_new (
     EmpathyIndividualMenu *self);
 
 static void
-individual_menu_add_personas (GtkMenuShell *menu,
+individual_menu_add_personas (EmpathyIndividualMenu *self,
+    GtkMenuShell *menu,
     FolksIndividual *individual,
     EmpathyIndividualFeatureFlags features)
 {
@@ -183,7 +192,8 @@ individual_menu_add_personas (GtkMenuShell *menu,
       /* Chat */
       if (features & EMPATHY_INDIVIDUAL_FEATURE_CHAT)
         {
-          action = empathy_individual_chat_menu_item_new (single_individual);
+          action = empathy_individual_chat_menu_item_new (self,
+              single_individual);
           gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
           gtk_widget_show (action);
         }
@@ -191,7 +201,8 @@ individual_menu_add_personas (GtkMenuShell *menu,
       /* SMS */
       if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
         {
-          action = empathy_individual_sms_menu_item_new (single_individual);
+          action = empathy_individual_sms_menu_item_new (self,
+              single_individual);
           gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
           gtk_widget_show (action);
         }
@@ -200,13 +211,13 @@ individual_menu_add_personas (GtkMenuShell *menu,
         {
           /* Audio Call */
           action = empathy_individual_audio_call_menu_item_new (
-              single_individual);
+              self, single_individual);
           gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
           gtk_widget_show (action);
 
           /* Video Call */
           action = empathy_individual_video_call_menu_item_new (
-              single_individual);
+              self, single_individual);
           gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
           gtk_widget_show (action);
         }
@@ -228,14 +239,14 @@ individual_menu_add_personas (GtkMenuShell *menu,
       if (features & EMPATHY_INDIVIDUAL_FEATURE_FILE_TRANSFER)
         {
           action = empathy_individual_file_transfer_menu_item_new (
-              single_individual);
+              self, single_individual);
           gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
           gtk_widget_show (action);
         }
 
       /* Share my desktop */
       action = empathy_individual_share_my_desktop_menu_item_new (
-          single_individual);
+          self, single_individual);
       gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
       gtk_widget_show (action);
 
@@ -447,13 +458,16 @@ add_phone_numbers (EmpathyIndividualMenu *self)
 
       if (type != NULL)
         {
-          tmp = g_strdup_printf ("Call %s (%s)",
+          /* translators: first argument is a phone number like +32123456 and
+           * the second one is something like 'home' or 'work'. */
+          tmp = g_strdup_printf (_("Call %s (%s)"),
               folks_phone_field_details_get_normalised (details),
               type);
         }
       else
         {
-          tmp = g_strdup_printf ("Call %s",
+          /* translators: argument is a phone number like +32123456 */
+          tmp = g_strdup_printf (_("Call %s"),
               folks_phone_field_details_get_normalised (details));
         }
 
@@ -959,7 +973,7 @@ constructed (GObject *object)
   /* Chat */
   if (features & EMPATHY_INDIVIDUAL_FEATURE_CHAT)
     {
-      item = empathy_individual_chat_menu_item_new (individual);
+      item = empathy_individual_chat_menu_item_new (self, individual);
       if (item != NULL)
         {
           gtk_menu_shell_append (shell, item);
@@ -970,7 +984,7 @@ constructed (GObject *object)
   /* SMS */
   if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
     {
-      item = empathy_individual_sms_menu_item_new (individual);
+      item = empathy_individual_sms_menu_item_new (self, individual);
       if (item != NULL)
         {
           gtk_menu_shell_append (shell, item);
@@ -981,12 +995,12 @@ constructed (GObject *object)
   if (features & EMPATHY_INDIVIDUAL_FEATURE_CALL)
     {
       /* Audio Call */
-      item = empathy_individual_audio_call_menu_item_new (individual);
+      item = empathy_individual_audio_call_menu_item_new (self, individual);
       gtk_menu_shell_append (shell, item);
       gtk_widget_show (item);
 
       /* Video Call */
-      item = empathy_individual_video_call_menu_item_new (individual);
+      item = empathy_individual_video_call_menu_item_new (self, individual);
       gtk_menu_shell_append (shell, item);
       gtk_widget_show (item);
     }
@@ -1002,7 +1016,7 @@ constructed (GObject *object)
   /* File transfer */
   if (features & EMPATHY_INDIVIDUAL_FEATURE_FILE_TRANSFER)
     {
-      item = empathy_individual_file_transfer_menu_item_new (individual);
+      item = empathy_individual_file_transfer_menu_item_new (self, individual);
       gtk_menu_shell_append (shell, item);
       gtk_widget_show (item);
     }
@@ -1010,12 +1024,13 @@ constructed (GObject *object)
   /* Share my desktop */
   /* FIXME we should add the "Share my desktop" menu item if Vino is
   a registered handler in MC5 */
-  item = empathy_individual_share_my_desktop_menu_item_new (individual);
+  item = empathy_individual_share_my_desktop_menu_item_new (self, individual);
   gtk_menu_shell_append (shell, item);
   gtk_widget_show (item);
 
   /* Menu items to target specific contacts */
-  individual_menu_add_personas (GTK_MENU_SHELL (object), individual, features);
+  individual_menu_add_personas (self, GTK_MENU_SHELL (object),
+      individual, features);
 
   /* Separator */
   if (features & (EMPATHY_INDIVIDUAL_FEATURE_EDIT |
@@ -1223,6 +1238,16 @@ empathy_individual_menu_class_init (EmpathyIndividualMenuClass *klass)
           EMPATHY_TYPE_INDIVIDUAL_STORE,
           G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
 
+  signals[MENU_ITEM_ACTIVATED] =
+      g_signal_new ("menu-item-activated",
+          G_TYPE_FROM_CLASS (klass),
+          G_SIGNAL_RUN_LAST,
+          0,
+          NULL, NULL,
+          g_cclosure_marshal_generic,
+          G_TYPE_NONE,
+          0);
+
   g_type_class_add_private (object_class, sizeof (EmpathyIndividualMenuPriv));
 }
 
@@ -1296,6 +1321,16 @@ menu_item_set_first_contact (GtkWidget *item,
   return item;
 }
 
+static void
+emit_menu_item_activated (GtkMenuItem *item)
+{
+  EmpathyIndividualMenu *self;
+
+  self = EMPATHY_INDIVIDUAL_MENU (g_object_get_data (G_OBJECT (item),
+      "individual-menu"));
+  g_signal_emit (self, signals [MENU_ITEM_ACTIVATED], 0);
+}
+
 static void
 empathy_individual_chat_menu_item_activated (GtkMenuItem *item,
   EmpathyContact *contact)
@@ -1303,10 +1338,13 @@ empathy_individual_chat_menu_item_activated (GtkMenuItem *item,
   g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
   empathy_chat_with_contact (contact, empathy_get_current_action_time ());
+
+  emit_menu_item_activated (item);
 }
 
 static GtkWidget *
-empathy_individual_chat_menu_item_new (FolksIndividual *individual)
+empathy_individual_chat_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
@@ -1320,6 +1358,7 @@ empathy_individual_chat_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_chat_menu_item_activated),
       EMPATHY_ACTION_CHAT);
@@ -1338,10 +1377,13 @@ empathy_individual_sms_menu_item_activated (GtkMenuItem *item,
       empathy_contact_get_id (contact),
       empathy_get_current_action_time (),
       NULL, NULL);
+
+  emit_menu_item_activated (item);
 }
 
 static GtkWidget *
-empathy_individual_sms_menu_item_new (FolksIndividual *individual)
+empathy_individual_sms_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
@@ -1355,6 +1397,7 @@ empathy_individual_sms_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_sms_menu_item_activated),
       EMPATHY_ACTION_SMS);
@@ -1372,10 +1415,13 @@ empathy_individual_audio_call_menu_item_activated (GtkMenuItem *item,
       empathy_contact_get_account (contact),
       TRUE, FALSE,
       empathy_get_current_action_time ());
+
+  emit_menu_item_activated (item);
 }
 
 GtkWidget *
-empathy_individual_audio_call_menu_item_new (FolksIndividual *individual)
+empathy_individual_audio_call_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
@@ -1387,6 +1433,7 @@ empathy_individual_audio_call_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_audio_call_menu_item_activated),
       EMPATHY_ACTION_AUDIO_CALL);
@@ -1404,14 +1451,17 @@ empathy_individual_video_call_menu_item_activated (GtkMenuItem *item,
       empathy_contact_get_account (contact),
       TRUE, TRUE,
       empathy_get_current_action_time ());
+
+  emit_menu_item_activated (item);
 }
 
 GtkWidget *
-empathy_individual_video_call_menu_item_new (FolksIndividual *individual)
+empathy_individual_video_call_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
-  EmpathyCameraMonitor *monitor;
+  TpawCameraMonitor *monitor;
 
   g_return_val_if_fail (FOLKS_IS_INDIVIDUAL (individual), NULL);
 
@@ -1421,6 +1471,7 @@ empathy_individual_video_call_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_video_call_menu_item_activated),
       EMPATHY_ACTION_VIDEO_CALL);
@@ -1428,7 +1479,7 @@ empathy_individual_video_call_menu_item_new (FolksIndividual *individual)
   /* Only follow available cameras if the contact can do Video calls */
   if (gtk_widget_get_sensitive (item))
     {
-      monitor = empathy_camera_monitor_dup_singleton ();
+      monitor = tpaw_camera_monitor_dup_singleton ();
       g_object_set_data_full (G_OBJECT (item),
           "monitor", monitor, g_object_unref);
       g_object_bind_property (monitor, "available", item, "sensitive",
@@ -1475,10 +1526,13 @@ empathy_individual_file_transfer_menu_item_activated (GtkMenuItem *item,
   g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
   empathy_send_file_with_file_chooser (contact);
+
+  emit_menu_item_activated (item);
 }
 
 static GtkWidget *
-empathy_individual_file_transfer_menu_item_new (FolksIndividual *individual)
+empathy_individual_file_transfer_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
@@ -1491,6 +1545,7 @@ empathy_individual_file_transfer_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_file_transfer_menu_item_activated),
       EMPATHY_ACTION_SEND_FILE);
@@ -1505,10 +1560,13 @@ empathy_individual_share_my_desktop_menu_item_activated (GtkMenuItem *item,
   g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
   empathy_share_my_desktop_share_with_contact (contact);
+
+  emit_menu_item_activated (item);
 }
 
 static GtkWidget *
-empathy_individual_share_my_desktop_menu_item_new (FolksIndividual *individual)
+empathy_individual_share_my_desktop_menu_item_new (EmpathyIndividualMenu *self,
+    FolksIndividual *individual)
 {
   GtkWidget *item;
   GtkWidget *image;
@@ -1520,6 +1578,7 @@ empathy_individual_share_my_desktop_menu_item_new (FolksIndividual *individual)
   gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
   gtk_widget_show (image);
 
+  g_object_set_data (G_OBJECT (item), "individual-menu", self);
   menu_item_set_first_contact (item, individual,
       G_CALLBACK (empathy_individual_share_my_desktop_menu_item_activated),
       EMPATHY_ACTION_SHARE_MY_DESKTOP);