aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-11 17:09:15 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-25 21:21:50 +0800
commit091002b85df80403470285c6e8d85617306467a8 (patch)
tree9d7f1347157717985f61a6ec80779c302beaf5b5
parentc19df458d8846dc961984990f103b79bb39f9bf9 (diff)
downloadgsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar.gz
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar.bz2
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar.lz
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar.xz
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.tar.zst
gsoc2013-empathy-091002b85df80403470285c6e8d85617306467a8.zip
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.
-rw-r--r--src/empathy-roster-window.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/empathy-roster-window.c b/src/empathy-roster-window.c
index b79c5f89c..018e2200a 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 },