GSList *sent_messages;
gint sent_messages_index;
GList *compositors;
+ guint scroll_idle_id;
/* Used to automatically shrink a window that has temporarily
* grown due to long input.
*/
GossipContact *contact,
TelepathyChannelChatState state,
GossipChat *chat);
+static gboolean chat_scroll_down_idle_func (GossipChat *chat);
enum {
COMPOSING,
"misspelled",
"underline", PANGO_UNDERLINE_ERROR,
NULL);
+
+
+
+ /* Turn off scrolling temporarily */
+ gossip_chat_view_scroll (chat->view, FALSE);
+#if 0
+FIXME:
+ /* Add messages from last conversation */
+ log_manager = gossip_session_get_log_manager (gossip_app_get_session ());
+ messages = gossip_log_get_last_for_contact (log_manager, priv->contact);
+ num_messages = g_list_length (messages);
+
+ for (l = messages, i = 0; l; l = l->next, i++) {
+ message = l->data;
+
+ if (num_messages - i > 10) {
+ continue;
+ }
+
+ sender = gossip_message_get_sender (message);
+ if (gossip_contact_equal (priv->own_contact, sender)) {
+ gossip_chat_view_append_message_from_self (view,
+ message,
+ priv->own_contact,
+ priv->own_avatar);
+ } else {
+ gossip_chat_view_append_message_from_other (view,
+ message,
+ sender,
+ priv->other_avatar);
+ }
+ }
+
+ g_list_foreach (messages, (GFunc) g_object_unref, NULL);
+ g_list_free (messages);
+#endif
+ /* Turn back on scrolling */
+ gossip_chat_view_scroll (chat->view, TRUE);
+
+ /* Scroll to the most recent messages, we reference the chat
+ * for the duration of the scroll func.
+ */
+ priv->scroll_idle_id = g_idle_add ((GSourceFunc) chat_scroll_down_idle_func,
+ g_object_ref (chat));
+
}
static void
g_object_unref (priv->tp_chat);
}
+ if (priv->scroll_idle_id) {
+ g_source_remove (priv->scroll_idle_id);
+ }
+
g_free (priv->id);
G_OBJECT_CLASS (gossip_chat_parent_class)->finalize (object);
return;
}
+ /* FIXME: add here something to let group/privrate chat handle
+ * some special messages */
+
/* FIXME: gossip_app_set_not_away ();*/
- own_contact = gossip_chat_get_own_contact (chat);
+ own_contact = empathy_contact_manager_get_user (priv->manager, chat->account);
message = gossip_message_new (msg);
gossip_message_set_sender (message, own_contact);
}
/* Catch enter but not ctrl/shift-enter */
- if (IS_ENTER (event->keyval) && !(event->state & GDK_SHIFT_MASK)) {
+ if (IS_ENTER (event->keyval) && !(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK))) {
GtkTextView *view;
/* This is to make sure that kinput2 gets the enter. And if
}
}
+/* Scroll down after the back-log has been received. */
+static gboolean
+chat_scroll_down_idle_func (GossipChat *chat)
+{
+ GossipChatPriv *priv;
+
+ priv = GET_PRIV (chat);
+
+ gossip_chat_scroll_down (chat);
+ g_object_unref (chat);
+
+ priv->scroll_idle_id = 0;
+
+ return FALSE;
+}
+
gboolean
gossip_chat_get_is_command (const gchar *str)
{
return NULL;
}
-GossipContact *
-gossip_chat_get_contact (GossipChat *chat)
-{
- g_return_val_if_fail (GOSSIP_IS_CHAT (chat), NULL);
-
- if (GOSSIP_CHAT_GET_CLASS (chat)->get_contact) {
- return GOSSIP_CHAT_GET_CLASS (chat)->get_contact (chat);
- }
-
- return NULL;
-}
-GossipContact *
-gossip_chat_get_own_contact (GossipChat *chat)
-{
- GossipChatPriv *priv;
-
- g_return_val_if_fail (GOSSIP_IS_CHAT (chat), NULL);
-
- priv = GET_PRIV (chat);
-
- return empathy_contact_manager_get_own (priv->manager, chat->account);
-}
-
GtkWidget *
gossip_chat_get_widget (GossipChat *chat)
{
return (priv->tp_chat != NULL);
}
-gboolean
-gossip_chat_get_show_contacts (GossipChat *chat)
-{
- g_return_val_if_fail (GOSSIP_IS_CHAT (chat), FALSE);
-
- if (GOSSIP_CHAT_GET_CLASS (chat)->get_show_contacts) {
- return GOSSIP_CHAT_GET_CLASS (chat)->get_show_contacts (chat);
- }
-
- return FALSE;
-}
-
-void
-gossip_chat_set_show_contacts (GossipChat *chat,
- gboolean show)
-{
- g_return_if_fail (GOSSIP_IS_CHAT (chat));
-
- if (GOSSIP_CHAT_GET_CLASS (chat)->set_show_contacts) {
- GOSSIP_CHAT_GET_CLASS (chat)->set_show_contacts (chat, show);
- }
-}
-
void
gossip_chat_save_geometry (GossipChat *chat,
gint x,
return FALSE;
}
- my_contact = gossip_get_own_contact_from_contact (gossip_message_get_sender (message));
+ my_contact = gossip_contact_get_user (gossip_message_get_sender (message));
to = gossip_contact_get_name (my_contact);
if (!to) {
return FALSE;