diff gtk/plugins/timestamp.c @ 14191:009db0b357b5

This is a hand-crafted commit to migrate across subversion revisions 16854:16861, due to some vagaries of the way the original renames were done. Witness that monotone can do in one revision what svn had to spread across several.
author Ethan Blanton <elb@pidgin.im>
date Sat, 16 Dec 2006 04:59:55 +0000
parents
children 445b2bee14b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk/plugins/timestamp.c	Sat Dec 16 04:59:55 2006 +0000
@@ -0,0 +1,282 @@
+/*
+ * Gaim - iChat-like timestamps
+ *
+ * Copyright (C) 2002-2003, Sean Egan
+ * Copyright (C) 2003, Chris J. Friesen <Darth_Sebulba04@yahoo.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "internal.h"
+
+#include "conversation.h"
+#include "debug.h"
+#include "prefs.h"
+#include "signals.h"
+#include "version.h"
+
+#include "gtkimhtml.h"
+#include "gtkplugin.h"
+#include "gtkutils.h"
+
+#define TIMESTAMP_PLUGIN_ID "gtk-timestamp"
+
+/* Set the default to 5 minutes. */
+static int interval = 5 * 60 * 1000;
+
+static GSList *timestamp_timeouts = NULL;
+
+static gboolean
+do_timestamp(gpointer data)
+{
+	GaimConversation *c = (GaimConversation *)data;
+	GaimGtkConversation *conv = GAIM_GTK_CONVERSATION(c);
+	GtkTextIter iter;
+	const char *mdate;
+	int is_conversation_active;
+	time_t tim = time(NULL);
+
+	if (!g_list_find(gaim_get_conversations(), c))
+		return FALSE;
+
+	/* is_conversation_active is true if an im has been displayed since the last timestamp */
+	is_conversation_active = GPOINTER_TO_INT(gaim_conversation_get_data(c, "timestamp-conv-active"));
+
+	if (is_conversation_active){
+		int y, height;
+		GdkRectangle rect;
+		gboolean scroll = TRUE;
+		GtkWidget *imhtml = conv->imhtml;
+		GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(imhtml));
+		gtk_text_buffer_get_end_iter(buffer, &iter);
+		gaim_conversation_set_data(c, "timestamp-conv-active", GINT_TO_POINTER(FALSE));
+		mdate = gaim_utf8_strftime("\n%H:%M", localtime(&tim));
+		gtk_text_view_get_visible_rect(GTK_TEXT_VIEW(imhtml), &rect);
+		gtk_text_view_get_line_yrange(GTK_TEXT_VIEW(imhtml), &iter, &y, &height);
+		if(((y + height) - (rect.y + rect.height)) > height
+		   && gtk_text_buffer_get_char_count(buffer)){
+			scroll = FALSE;
+		}
+		gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, mdate, strlen(mdate), "TIMESTAMP", NULL);
+		if (scroll)
+			gtk_imhtml_scroll_to_end(GTK_IMHTML(imhtml), gaim_prefs_get_bool("/gaim/gtk/conversations/use_smooth_scrolling"));
+	}
+	else
+		gaim_conversation_set_data(c, "timestamp-enabled", GINT_TO_POINTER(FALSE));
+
+	return TRUE;
+}
+
+
+static gboolean
+timestamp_displaying_conv_msg(GaimAccount *account, const char *who, char **buffer,
+				GaimConversation *conv, GaimMessageFlags flags, void *data)
+{
+	int is_timestamp_enabled;
+
+	if (!g_list_find(gaim_get_conversations(), conv))
+		return FALSE;
+
+	/* set to true, since there has been an im since the last timestamp */
+	gaim_conversation_set_data(conv, "timestamp-conv-active", GINT_TO_POINTER(TRUE));
+
+	is_timestamp_enabled = GPOINTER_TO_INT(gaim_conversation_get_data(conv, "timestamp-enabled"));
+
+	if (!is_timestamp_enabled){
+		gaim_conversation_set_data(conv, "timestamp-enabled", GINT_TO_POINTER(TRUE));
+		do_timestamp((gpointer)conv);
+	}
+
+	return FALSE;
+}
+
+static void timestamp_new_convo(GaimConversation *conv)
+{
+	GaimGtkConversation *c = GAIM_GTK_CONVERSATION(conv);
+
+	if (!g_list_find(gaim_get_conversations(), conv))
+		return;
+
+	/*
+	This if statement stops conversations that have already been initialized for timestamps
+	from being reinitialized.  This prevents every active conversation from immediately being spammed
+	with a new timestamp when the user modifies the timer interval.
+	*/
+	if (!gaim_conversation_get_data(conv, "timestamp-initialized")){
+		GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(c->imhtml));
+		gaim_conversation_set_data(conv, "timestamp-initialized", GINT_TO_POINTER(TRUE));
+		gaim_conversation_set_data(conv, "timestamp-enabled", GINT_TO_POINTER(TRUE));
+		gaim_conversation_set_data(conv, "timestamp-conv-active", GINT_TO_POINTER(TRUE));
+		gtk_text_buffer_create_tag (buffer, "TIMESTAMP", "foreground", "#888888", "justification", GTK_JUSTIFY_CENTER,
+					    "weight", PANGO_WEIGHT_BOLD, NULL);
+		do_timestamp(conv);
+	}
+
+	timestamp_timeouts = g_slist_append(timestamp_timeouts,
+			GINT_TO_POINTER(g_timeout_add(interval, do_timestamp, conv)));
+}
+
+
+static void destroy_timer_list()
+{
+	GSList *to;
+
+	for (to = timestamp_timeouts; to != NULL; to = to->next)
+		g_source_remove(GPOINTER_TO_INT(to->data));
+
+	g_slist_free(timestamp_timeouts);
+
+	timestamp_timeouts = NULL;
+}
+
+static void init_timer_list()
+{
+	GList *cnvs;
+	GaimConversation *c;
+
+	if (timestamp_timeouts != NULL)
+		destroy_timer_list();
+
+	for (cnvs = gaim_get_conversations(); cnvs != NULL; cnvs = cnvs->next) {
+		c = cnvs->data;
+		timestamp_new_convo(c);
+	}
+}
+
+
+
+static void set_timestamp(GtkWidget *spinner, void *null) {
+	int tm;
+
+	tm = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner));
+	gaim_debug(GAIM_DEBUG_MISC, "timestamp", "setting time to %d mins\n", tm);
+
+	interval = tm * 60 * 1000;
+	gaim_prefs_set_int("/plugins/gtk/timestamp/interval", interval);
+
+	destroy_timer_list();
+	init_timer_list();
+}
+
+static GtkWidget *
+get_config_frame(GaimPlugin *plugin)
+{
+	GtkWidget *ret;
+	GtkWidget *frame, *label;
+	GtkWidget *vbox, *hbox;
+	GtkAdjustment *adj;
+	GtkWidget *spinner;
+
+	ret = gtk_vbox_new(FALSE, 18);
+	gtk_container_set_border_width (GTK_CONTAINER (ret), 12);
+
+	frame = gaim_gtk_make_frame(ret, _("iChat Timestamp"));
+	vbox = gtk_vbox_new(FALSE, 5);
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+
+	hbox = gtk_hbox_new(FALSE, 5);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
+
+	label = gtk_label_new(_("Delay"));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+
+	adj = (GtkAdjustment *)gtk_adjustment_new(interval/(60*1000), 1, G_MAXINT, 1, 0, 0);
+	spinner = gtk_spin_button_new(adj, 0, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), spinner, TRUE, TRUE, 0);
+	g_signal_connect(G_OBJECT(spinner), "value-changed", G_CALLBACK(set_timestamp), NULL);
+	label = gtk_label_new(_("minutes."));
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
+
+	gtk_widget_show_all(ret);
+	return ret;
+}
+
+static gboolean
+plugin_load(GaimPlugin *plugin)
+{
+	void *conv_handle = gaim_conversations_get_handle();
+	void *gtkconv_handle = gaim_gtk_conversations_get_handle();
+
+	init_timer_list();
+
+	gaim_signal_connect(conv_handle, "conversation-created",
+					plugin, GAIM_CALLBACK(timestamp_new_convo), NULL);
+
+	gaim_signal_connect(gtkconv_handle, "displaying-chat-msg",
+					plugin, GAIM_CALLBACK(timestamp_displaying_conv_msg), NULL);
+	gaim_signal_connect(gtkconv_handle, "displaying-im-msg",
+					plugin, GAIM_CALLBACK(timestamp_displaying_conv_msg), NULL);
+
+	interval = gaim_prefs_get_int("/plugins/gtk/timestamp/interval");
+
+	return TRUE;
+}
+
+
+
+static gboolean
+plugin_unload(GaimPlugin *plugin)
+{
+	destroy_timer_list();
+
+	return TRUE;
+}
+
+static GaimGtkPluginUiInfo ui_info =
+{
+	get_config_frame,
+	0 /* page_num (Reserved) */
+};
+
+static GaimPluginInfo info =
+{
+	GAIM_PLUGIN_MAGIC,
+	GAIM_MAJOR_VERSION,
+	GAIM_MINOR_VERSION,
+	GAIM_PLUGIN_STANDARD,                             /**< type           */
+	GAIM_GTK_PLUGIN_TYPE,                             /**< ui_requirement */
+	0,                                                /**< flags          */
+	NULL,                                             /**< dependencies   */
+	GAIM_PRIORITY_DEFAULT,                            /**< priority       */
+
+	TIMESTAMP_PLUGIN_ID,                              /**< id             */
+	N_("Timestamp"),                                  /**< name           */
+	VERSION,                                          /**< version        */
+	                                                  /**  summary        */
+	N_("Adds iChat-style timestamps to conversations every N minutes."),
+	                                                  /**  description    */
+	N_("Adds iChat-style timestamps to conversations every N minutes."),
+	"Sean Egan <seanegan@gmail.com>",                 /**< author         */
+	GAIM_WEBSITE,                                     /**< homepage       */
+
+	plugin_load,                                      /**< load           */
+	plugin_unload,                                    /**< unload         */
+	NULL,                                             /**< destroy        */
+
+	&ui_info,                                         /**< ui_info        */
+	NULL,                                             /**< extra_info     */
+	NULL,
+	NULL
+};
+
+static void
+init_plugin(GaimPlugin *plugin)
+{
+	gaim_prefs_add_none("/plugins/gtk/timestamp");
+	gaim_prefs_add_int("/plugins/gtk/timestamp/interval", interval);
+}
+
+GAIM_INIT_PLUGIN(interval, init_plugin, info)