gossip r2805 - in trunk: . data/glade libgossip src
- From: mr svn gnome org
- To: svn-commits-list gnome org
- Subject: gossip r2805 - in trunk: . data/glade libgossip src
- Date: Wed, 14 May 2008 23:22:26 +0100 (BST)
Author: mr
Date: Wed May 14 22:22:25 2008
New Revision: 2805
URL: http://svn.gnome.org/viewvc/gossip?rev=2805&view=rev
Log:
Added a context menu for group chat contacts, fixes bug 522388
Modified:
trunk/ChangeLog
trunk/data/glade/chat.glade
trunk/data/glade/group-chat.glade
trunk/libgossip/gossip-jabber-vcard.c
trunk/libgossip/gossip-session.c
trunk/src/gossip-chat-window.c
trunk/src/gossip-group-chat.c
trunk/src/gossip-group-chat.h
Modified: trunk/data/glade/chat.glade
==============================================================================
--- trunk/data/glade/chat.glade (original)
+++ trunk/data/glade/chat.glade Wed May 14 22:22:25 2008
@@ -332,21 +332,21 @@
</child>
<child>
- <widget class="GtkSeparatorMenuItem" id="separator12">
+ <widget class="GtkSeparatorMenuItem" id="menu_room_separator">
<property name="visible">True</property>
</widget>
</child>
<child>
- <widget class="GtkMenuItem" id="menu_room_kick">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Kick...</property>
+ <widget class="GtkMenuItem" id="menu_room_contact">
+ <property name="visible">False</property>
+ <property name="label" translatable="yes">_Contact</property>
<property name="use_underline">True</property>
</widget>
</child>
<child>
- <widget class="GtkSeparatorMenuItem" id="separator10">
+ <widget class="GtkSeparatorMenuItem" id="menu_room_separator_bottom">
<property name="visible">True</property>
</widget>
</child>
Modified: trunk/data/glade/group-chat.glade
==============================================================================
--- trunk/data/glade/group-chat.glade (original)
+++ trunk/data/glade/group-chat.glade Wed May 14 22:22:25 2008
@@ -1133,4 +1133,60 @@
</child>
</widget>
+<widget class="GtkMenu" id="contact_menu">
+ <property name="visible">True</property>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="private_chat">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Private Chat</property>
+ <property name="use_underline">True</property>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image12">
+ <property name="visible">True</property>
+ <property name="pixbuf">gossip-message.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="contact_information">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Contact Information</property>
+ <property name="use_underline">True</property>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image13">
+ <property name="visible">True</property>
+ <property name="pixbuf">vcard_16.png</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator1">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="kick">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Kick...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+</widget>
+
</glade-interface>
Modified: trunk/libgossip/gossip-jabber-vcard.c
==============================================================================
--- trunk/libgossip/gossip-jabber-vcard.c (original)
+++ trunk/libgossip/gossip-jabber-vcard.c Wed May 14 22:22:25 2008
@@ -230,23 +230,15 @@
LmMessage *m;
LmMessageNode *node;
LmMessageHandler *handler;
- GossipJID *jid;
GossipCallbackData *data;
- const gchar *jid_without_resource;
connection = gossip_jabber_get_connection (jabber);
- jid = gossip_jid_new (jid_str);
- jid_without_resource = gossip_jid_get_without_resource (jid);
+ gossip_debug (DEBUG_DOMAIN, "Requesting VCard, JID:'%s'", jid_str);
- gossip_debug (DEBUG_DOMAIN,
- "Getting for JID:'%s'...",
- jid_without_resource);
-
- m = lm_message_new (jid_without_resource,
+ m = lm_message_new (jid_str,
LM_MESSAGE_TYPE_IQ);
- gossip_jid_unref (jid);
node = lm_message_node_add_child (m->node, "vCard", NULL);
lm_message_node_set_attribute (node, "xmlns", "vcard-temp");
@@ -262,7 +254,7 @@
if (!lm_connection_send_with_reply (connection, m, handler, error)) {
gossip_debug (DEBUG_DOMAIN,
"Failed to get VCard for JID:'%s' (could not send request)",
- jid_without_resource);
+ jid_str);
lm_message_unref (m);
lm_message_handler_unref (handler);
Modified: trunk/libgossip/gossip-session.c
==============================================================================
--- trunk/libgossip/gossip-session.c (original)
+++ trunk/libgossip/gossip-session.c Wed May 14 22:22:25 2008
@@ -1954,7 +1954,18 @@
jabber = session_get_protocol (session, contact);
if (!jabber) {
- return FALSE;
+ /* Temporary contact. Use account */
+ GossipAccount *account;
+ GossipSessionPriv *priv = GET_PRIV (session);
+
+ account = gossip_session_find_account (session, contact);
+ g_return_val_if_fail (GOSSIP_IS_ACCOUNT (account), FALSE);
+
+ jabber = g_hash_table_lookup (priv->accounts, account);
+ g_object_unref (account);
+
+ g_return_val_if_fail (jabber, FALSE);
+
}
return gossip_jabber_get_version (jabber, contact,
Modified: trunk/src/gossip-chat-window.c
==============================================================================
--- trunk/src/gossip-chat-window.c (original)
+++ trunk/src/gossip-chat-window.c Wed May 14 22:22:25 2008
@@ -95,7 +95,8 @@
GtkWidget *menu_room_add;
GtkWidget *menu_room_change_subject;
GtkWidget *menu_room_change_nick;
- GtkWidget *menu_room_kick;
+ GtkWidget *menu_room_contact;
+ GtkWidget *menu_room_separator;
GtkWidget *menu_room_show_contacts;
GtkWidget *menu_edit_cut;
@@ -165,8 +166,6 @@
GossipChatWindow *window);
static void chat_window_room_change_nick_activate_cb (GtkWidget *menuitem,
GossipChatWindow *window);
-static void chat_window_room_kick_activate_cb (GtkWidget *menuitem,
- GossipChatWindow *window);
static void chat_window_edit_activate_cb (GtkWidget *menuitem,
GossipChatWindow *window);
static void chat_window_edit_insert_smiley_activate_cb (GtkWidget *menuitem,
@@ -315,7 +314,8 @@
"menu_room_add", &priv->menu_room_add,
"menu_room_change_subject", &priv->menu_room_change_subject,
"menu_room_change_nick", &priv->menu_room_change_nick,
- "menu_room_kick", &priv->menu_room_kick,
+ "menu_room_contact", &priv->menu_room_contact,
+ "menu_room_separator", &priv->menu_room_separator,
"menu_room_show_contacts", &priv->menu_room_show_contacts,
"menu_edit_cut", &priv->menu_edit_cut,
"menu_edit_copy", &priv->menu_edit_copy,
@@ -343,7 +343,6 @@
"menu_room_add", "activate", chat_window_room_add_activate_cb,
"menu_room_change_subject", "activate", chat_window_room_change_subject_activate_cb,
"menu_room_change_nick", "activate", chat_window_room_change_nick_activate_cb,
- "menu_room_kick", "activate", chat_window_room_kick_activate_cb,
"menu_edit", "activate", chat_window_edit_activate_cb,
"menu_edit_cut", "activate", chat_window_edit_cut_activate_cb,
"menu_edit_copy", "activate", chat_window_edit_copy_activate_cb,
@@ -841,7 +840,6 @@
GossipChatroom *chatroom;
GossipChatroomId id;
gboolean saved;
- gboolean can_kick = TRUE;
gboolean can_change_subject = TRUE;
group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
@@ -861,9 +859,6 @@
id = gossip_chatroom_get_id (chatroom);
saved = gossip_chatroom_manager_find (manager, id) != NULL;
- can_kick &= is_connected;
- can_kick &= gossip_group_chat_contact_can_kick (group_chat, own_contact);
-
can_change_subject &= is_connected;
can_change_subject &= gossip_group_chat_contact_can_change_subject (group_chat, own_contact);
@@ -873,7 +868,6 @@
gtk_widget_set_sensitive (priv->menu_room_invite, is_connected);
gtk_widget_set_sensitive (priv->menu_room_change_subject, can_change_subject);
gtk_widget_set_sensitive (priv->menu_room_change_nick, is_connected);
- gtk_widget_set_sensitive (priv->menu_room_kick, can_kick);
/* We need to block the signal here because all we are
* really trying to do is check or uncheck the menu
@@ -1129,10 +1123,7 @@
{
GossipChatWindowPriv *priv;
GossipGroupChat *group_chat;
- GossipContact *contact;
- GossipContact *own_contact;
- gboolean can_kick;
- gboolean can_change_subject;
+ GtkWidget *submenu = NULL;
priv = GET_PRIV (window);
@@ -1142,19 +1133,26 @@
/* Set up 'selected contact' sensitive items */
group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
- contact = gossip_group_chat_get_selected_contact (group_chat);
- own_contact = gossip_chat_get_own_contact (priv->current_chat);
- can_kick = TRUE;
- can_kick &= contact && !gossip_contact_equal (contact, own_contact);
- can_kick &= gossip_group_chat_contact_can_kick (group_chat, own_contact);
+ submenu = gossip_group_chat_contact_menu (group_chat);
+
+ if (submenu) {
+ GtkMenuItem *item;
- gtk_widget_set_sensitive (priv->menu_room_kick, can_kick);
+ item = GTK_MENU_ITEM (priv->menu_room_contact);
+
+ gtk_menu_item_set_submenu (item, submenu);
+ gtk_widget_show (priv->menu_room_contact);
+ gtk_widget_show (priv->menu_room_separator);
+ } else {
+ GtkMenuItem *item;
- can_change_subject = TRUE;
- can_change_subject &= gossip_group_chat_contact_can_change_subject (group_chat, own_contact);
+ item = GTK_MENU_ITEM (priv->menu_room_contact);
- gtk_widget_set_sensitive (priv->menu_room_change_subject, can_change_subject);
+ gtk_menu_item_set_submenu (item, NULL);
+ gtk_widget_hide (priv->menu_room_contact);
+ gtk_widget_hide (priv->menu_room_separator);
+ }
}
static void
@@ -1253,23 +1251,6 @@
}
static void
-chat_window_room_kick_activate_cb (GtkWidget *menuitem,
- GossipChatWindow *window)
-{
- GossipChatWindowPriv *priv;
- GossipGroupChat *group_chat;
-
- priv = GET_PRIV (window);
-
- if (!gossip_chat_is_group_chat (priv->current_chat)) {
- return;
- }
-
- group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
- gossip_group_chat_contact_kick (group_chat, NULL);
-}
-
-static void
chat_window_edit_activate_cb (GtkWidget *menuitem,
GossipChatWindow *window)
{
Modified: trunk/src/gossip-group-chat.c
==============================================================================
--- trunk/src/gossip-group-chat.c (original)
+++ trunk/src/gossip-group-chat.c Wed May 14 22:22:25 2008
@@ -44,6 +44,7 @@
#include "gossip-chat-invite.h"
#include "gossip-chat-view.h"
#include "gossip-contact-list-iface.h"
+#include "gossip-contact-info-dialog.h"
#include "gossip-glade.h"
#include "gossip-group-chat.h"
#include "gossip-private-chat.h"
@@ -225,6 +226,9 @@
GtkTreePath *path,
GtkTreeViewColumn *col,
GossipGroupChat *chat);
+static gboolean group_chat_cl_button_press_event_cb (GtkTreeView *view,
+ GdkEventButton *event,
+ GossipGroupChat *chat);
static gint group_chat_cl_sort_func (GtkTreeModel *model,
GtkTreeIter *iter_a,
GtkTreeIter *iter_b,
@@ -255,6 +259,16 @@
static void group_chat_cl_set_background (GossipGroupChat *chat,
GtkCellRenderer *cell,
gboolean is_header);
+static GtkWidget * group_chat_cl_menu_create (GossipGroupChat *chat,
+ GossipContact *contact);
+static void group_chat_cl_menu_destroy (GtkWidget *menu,
+ GossipGroupChat *chat);
+static void group_chat_cl_menu_info_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat);
+static void group_chat_cl_menu_chat_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat);
+static void group_chat_cl_menu_kick_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat);
static void group_chat_set_scrolling_for_events (GossipGroupChat *chat,
gboolean disable);
static gboolean group_chat_scroll_down_when_idle_func (GossipGroupChat *chat);
@@ -593,14 +607,94 @@
group_chat_chatroom_status_update (GOSSIP_GROUP_CHAT (chat), error);
}
+static GtkWidget*
+group_chat_cl_menu_create (GossipGroupChat *chat,
+ GossipContact *contact)
+{
+ GladeXML *glade;
+ GtkWidget *menu;
+ GtkWidget *menu_item_kick;
+ GossipContact *own_contact;
+ gboolean can_kick = TRUE;
+
+ g_return_val_if_fail (GOSSIP_IS_GROUP_CHAT (chat), NULL);
+
+ glade = gossip_glade_get_file ("group-chat.glade",
+ "contact_menu",
+ NULL,
+ "contact_menu", &menu,
+ "kick", &menu_item_kick,
+ NULL);
+
+ gossip_glade_connect (glade,
+ chat,
+ "contact_menu", "selection-done", group_chat_cl_menu_destroy,
+ "private_chat", "activate", group_chat_cl_menu_chat_activate_cb,
+ "contact_information", "activate", group_chat_cl_menu_info_activate_cb,
+ "kick", "activate", group_chat_cl_menu_kick_activate_cb,
+ NULL);
+
+ own_contact = gossip_chat_get_own_contact (GOSSIP_CHAT (chat));
+ can_kick &= gossip_chat_is_connected (GOSSIP_CHAT (chat));
+ can_kick &= gossip_group_chat_contact_can_kick (chat, own_contact);
+
+ gtk_widget_set_sensitive (menu_item_kick, can_kick);
+
+ g_object_unref (glade);
+
+ return menu;
+}
+
+static void
+group_chat_cl_menu_destroy (GtkWidget *menu,
+ GossipGroupChat *chat)
+{
+ gtk_widget_destroy (menu);
+ g_object_unref (menu);
+}
+
+static void
+group_chat_cl_menu_info_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat)
+{
+ GossipContact *contact;
+
+ contact = gossip_group_chat_get_selected_contact (chat);
+
+ gossip_contact_info_dialog_show (contact,
+ NULL);
+ g_object_unref (contact);
+
+}
+static void
+group_chat_cl_menu_chat_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat)
+{
+ GossipContact *contact;
+
+ contact = gossip_group_chat_get_selected_contact(chat);
+
+ group_chat_private_chat_new (chat, contact);
+
+ g_object_unref (contact);
+
+}
+
+static void
+group_chat_cl_menu_kick_activate_cb (GtkMenuItem *menuitem,
+ GossipGroupChat *chat)
+{
+ gossip_group_chat_contact_kick (chat, NULL);
+}
+
static void
group_chat_protocol_connected_cb (GossipSession *session,
GossipAccount *account,
GossipJabber *jabber,
GossipGroupChat *chat)
{
- GossipGroupChatPriv *priv;
- GossipAccount *this_account;
+ GossipGroupChatPriv *priv;
+ GossipAccount *this_account;
priv = GET_PRIV (chat);
@@ -1474,6 +1568,50 @@
}
}
+static gboolean
+group_chat_cl_button_press_event_cb (GtkTreeView *view,
+ GdkEventButton *event,
+ GossipGroupChat *chat)
+{
+ GtkWidget *menu;
+ GtkTreePath *path;
+ GtkTreeSelection *selection;
+ gboolean row_exists;
+
+ if (event->button != 3) {
+ return FALSE;
+ }
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+
+ row_exists = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view),
+ event->x, event->y,
+ &path,
+ NULL, NULL, NULL);
+ if (!row_exists) {
+ return FALSE;
+ }
+
+ gtk_tree_selection_unselect_all (selection);
+ gtk_tree_selection_select_path (selection, path);
+
+ menu = gossip_group_chat_contact_menu (chat);
+
+ if (menu) {
+ g_object_ref (menu);
+ g_object_ref_sink (menu);
+ g_object_unref (menu);
+ gtk_widget_show (menu);
+ gtk_menu_popup (GTK_MENU (menu),
+ NULL, NULL, NULL, NULL,
+ event->button, event->time);
+ }
+
+ return TRUE;
+}
+
static void
group_chat_cl_setup (GossipGroupChat *chat)
{
@@ -1548,9 +1686,12 @@
gtk_tree_view_append_column (treeview, col);
- g_signal_connect (treeview, "row_activated",
+ g_signal_connect (treeview, "row-activated",
G_CALLBACK (group_chat_cl_row_activated_cb),
chat);
+ g_signal_connect (treeview, "button-press-event",
+ G_CALLBACK (group_chat_cl_button_press_event_cb),
+ chat);
}
static gboolean
@@ -2565,6 +2706,37 @@
}
+GtkWidget *
+gossip_group_chat_contact_menu (GossipGroupChat *group_chat)
+{
+ GossipGroupChatPriv *priv;
+ GossipContact *contact;
+ GtkWidget *menu = NULL;
+
+ g_return_val_if_fail (GOSSIP_IS_GROUP_CHAT (group_chat), NULL);
+
+ priv = GET_PRIV (group_chat);
+
+ if (!gossip_chat_is_connected (GOSSIP_CHAT (group_chat))) {
+ return NULL;
+ }
+
+ contact = gossip_group_chat_get_selected_contact (group_chat);
+ if (!contact) {
+ return NULL;
+ }
+
+ if (gossip_contact_equal (contact, priv->own_contact)) {
+ g_object_unref (contact);
+ return NULL;
+ }
+
+ menu = group_chat_cl_menu_create (group_chat, contact);
+ g_object_unref (contact);
+
+ return menu;
+}
+
void
gossip_group_chat_change_subject (GossipGroupChat *group_chat)
{
@@ -2707,3 +2879,4 @@
return gossip_chatroom_contact_can_change_role (priv->chatroom, contact_to_use);
}
+
Modified: trunk/src/gossip-group-chat.h
==============================================================================
--- trunk/src/gossip-group-chat.h (original)
+++ trunk/src/gossip-group-chat.h Wed May 14 22:22:25 2008
@@ -61,6 +61,7 @@
gossip_group_chat_get_chatroom_provider (GossipGroupChat *group_chat);
GossipChatroom * gossip_group_chat_get_chatroom (GossipGroupChat *group_chat);
GossipContact * gossip_group_chat_get_selected_contact (GossipGroupChat *group_chat);
+GtkWidget * gossip_group_chat_contact_menu (GossipGroupChat *group_chat);
/* Actions */
void gossip_group_chat_change_subject (GossipGroupChat *group_chat);
@@ -68,7 +69,6 @@
void gossip_group_chat_contact_kick (GossipGroupChat *group_chat,
GossipContact *contact);
-
/* Privileges */
gboolean gossip_group_chat_contact_can_message_all (GossipGroupChat *group_chat,
GossipContact *contact);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]