[empathy] Create one single GAction to join rooms



commit 091002b85df80403470285c6e8d85617306467a8
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Wed Sep 11 11:09:15 2013 +0200

    Create one single GAction to join rooms
    
    The proper way to handle multi menu items having the same semantic is to have
    one single GAction associated with different GMenuItem having specific
    parameters instead of having one action per menu item.
    
    Fix bgo#707885 as we no longer have spaces in GMenuItem action names.

 src/empathy-roster-window.c |   80 ++++++++++++++++++++++++------------------
 1 files changed, 46 insertions(+), 34 deletions(-)
---
diff --git a/src/empathy-roster-window.c b/src/empathy-roster-window.c
index b79c5f8..018e220 100644
--- a/src/empathy-roster-window.c
+++ b/src/empathy-roster-window.c
@@ -34,6 +34,7 @@
 #include "empathy-chat-manager.h"
 #include "empathy-chatroom-manager.h"
 #include "empathy-chatrooms-window.h"
+#include "empathy-client-factory.h"
 #include "empathy-contact-blocking-dialog.h"
 #include "empathy-contact-search-dialog.h"
 #include "empathy-event-manager.h"
@@ -1272,19 +1273,44 @@ roster_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
 }
 
 static void
-roster_window_favorite_chatroom_menu_activate_cb (GAction *action,
+roster_window_join_chatroom_menu_activate_cb (GSimpleAction *action,
     GVariant *parameter,
-    EmpathyChatroom *chatroom)
+    gpointer user_data)
 {
+  EmpathyRosterWindow *self = user_data;
+  const gchar *room, *path;
+  EmpathyClientFactory *factory;
+  TpAccount *account;
+  GError *error = NULL;
+  EmpathyChatroom *chatroom;
+
+  g_variant_get (parameter, "(&s&s)", &room, &path);
+
+  factory = empathy_client_factory_dup ();
+
+  account = tp_simple_client_factory_ensure_account (
+      TP_SIMPLE_CLIENT_FACTORY (factory), path, NULL, &error);
+  if (account == NULL)
+    {
+      DEBUG ("Failed to get account '%s': %s", path, error->message);
+      g_error_free (error);
+      goto out;
+    }
+
+  chatroom = empathy_chatroom_manager_find (self->priv->chatroom_manager,
+      account, room);
+  if (chatroom == NULL)
+    {
+      DEBUG ("Failed to get chatroom '%s' on '%s': %s",
+          room, path, error->message);
+      g_error_free (error);
+      goto out;
+    }
+
   roster_window_favorite_chatroom_join (chatroom);
-}
 
-static gchar *
-dup_join_action_name (EmpathyChatroom *chatroom,
-    gboolean prefix)
-{
-  return g_strconcat (prefix ? "win." : "", "join-",
-      empathy_chatroom_get_name (chatroom), NULL);
+out:
+  g_object_unref (factory);
 }
 
 static void
@@ -1292,35 +1318,25 @@ roster_window_favorite_chatroom_menu_add (EmpathyRosterWindow *self,
     EmpathyChatroom *chatroom)
 {
   GMenuItem *item;
-  const gchar *name, *account_name;
-  gchar *label, *action_name;
-  GAction *action;
+  const gchar *name, *account_name, *account_path;
+  TpAccount *account;
+  gchar *label;
+
+  account = empathy_chatroom_get_account (chatroom);
 
   name = empathy_chatroom_get_name (chatroom);
-  account_name = tp_account_get_display_name (
-      empathy_chatroom_get_account (chatroom));
+  account_name = tp_account_get_display_name (account);
+  account_path = tp_proxy_get_object_path (account);
 
   label = g_strdup_printf ("%s (%s)", name, account_name);
-  action_name = dup_join_action_name (chatroom, FALSE);
-
-  action = (GAction *) g_simple_action_new (action_name, NULL);
-  g_free (action_name);
-
-  g_signal_connect (action, "activate",
-      G_CALLBACK (roster_window_favorite_chatroom_menu_activate_cb),
-      chatroom);
-
-  g_action_map_add_action (G_ACTION_MAP (self), action);
 
-  action_name = dup_join_action_name (chatroom, TRUE);
-
-  item = g_menu_item_new (label, action_name);
+  item = g_menu_item_new (label, NULL);
+  g_menu_item_set_action_and_target (item, "win.join", "(ss)",
+      name, account_path);
   g_menu_item_set_attribute (item, "room-name", "s", name);
   g_menu_append_item (self->priv->rooms_section, item);
 
   g_free (label);
-  g_free (action_name);
-  g_object_unref (action);
 }
 
 static void
@@ -1338,13 +1354,8 @@ roster_window_favorite_chatroom_menu_removed_cb (
     EmpathyRosterWindow *self)
 {
   GList *chatrooms;
-  gchar *act;
   gint i;
 
-  act = dup_join_action_name (chatroom, TRUE);
-
-  g_action_map_remove_action (G_ACTION_MAP (self), act);
-
   for (i = 0; i < g_menu_model_get_n_items (
         G_MENU_MODEL (self->priv->rooms_section)); i++)
     {
@@ -1855,6 +1866,7 @@ static GActionEntry menubar_entries[] = {
 
   { "room_join_new", roster_window_room_join_new_cb, NULL, NULL, NULL },
   { "room_join_favorites", roster_window_room_join_favorites_cb, NULL, NULL, NULL },
+  { "join", roster_window_join_chatroom_menu_activate_cb, "(ss)", NULL, NULL },
   { "room_manage_favorites", roster_window_room_manage_favorites_cb, NULL, NULL, NULL },
 
   { "help_contents", roster_window_help_contents_cb, NULL, NULL, NULL },


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