Mercurial > pidgin
changeset 193:6af9b88e4f90
[gaim-migrate @ 203]
Added a plugin to mimic the Lag-O-Meter. Configurable, loadable whenever,
does the right thing (tm), etc. Maybe one of these days the Lag-O-Meter will
be removed from being statically in gaim. Maybe.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Fri, 28 Apr 2000 22:42:20 +0000 |
parents | e9ca9146ebf1 |
children | d7690984c0f1 |
files | plugins/Makefile.am plugins/lagmeter.c |
diffstat | 2 files changed, 177 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/Makefile.am Thu Apr 27 19:07:18 2000 +0000 +++ b/plugins/Makefile.am Fri Apr 28 22:42:20 2000 +0000 @@ -10,4 +10,4 @@ plugin_DATA = autorecon.so iconaway.so spellchk.so plugindir = $(libdir)/gaim EXTRA_DIST = CRAZY HOWTO SIGNALS autorecon.c chkmail.c filectl.c gaiminc.c \ - iconaway.c notify.c simple.c spellchk.c toc_commands.c + iconaway.c lagmeter.c notify.c simple.c spellchk.c toc_commands.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/lagmeter.c Fri Apr 28 22:42:20 2000 +0000 @@ -0,0 +1,176 @@ +/* KNOWN BUGS: + * if you are also using notify.so, it will open a new window to yourself. + * it will not, however, write anything in that window. this is a problem + * with notify.c. maybe one day i'll modify notify.c so that these two + * plugins are more compatible. we'll see. + * + * This lagometer has a tendency to not at all show the same lag that the + * built-in lagometer shows. My guess as to why this is (because they use the + * exact same code) is because it sends the string more often. That's why I + * included the configuration option to set the delay between updates. + * + * You can load this plugin even when you're not signed on, even though it + * modifies the buddy list. This is because it checks to see that the buddy + * list is actually there. In every case that I've been able to think of so + * far, it does the right thing (tm). + */ + +#define GAIM_PLUGINS +#include "gaim.h" + +#include <time.h> +#include <sys/types.h> +#include <sys/time.h> +#include <unistd.h> +#include <math.h> + +#define MY_LAG_STRING "ZYXCHECKLAGXYZ" + +void *handle; +GtkWidget *lagbox; +GtkWidget *my_lagometer; +struct timeval my_lag_tv; +int check_timeout; +guint delay = 10; +static GtkWidget *confdlg; + +void update_lag(int us) { + double pct; + + if (lagbox == NULL) { + /* guess we better build it then :P */ + GtkWidget *label = gtk_label_new("Lag-O-Meter: "); + GList *tmp = gtk_container_children(GTK_CONTAINER(blist)); + GtkWidget *vbox2 = (GtkWidget *)tmp->data; + lagbox = gtk_hbox_new(FALSE, 0); + my_lagometer = gtk_progress_bar_new(); + + gtk_box_pack_start(GTK_BOX(lagbox), label, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(lagbox), my_lagometer, TRUE, TRUE, 5); + gtk_widget_set_usize(my_lagometer, 5, 5); + + gtk_widget_show(label); + gtk_widget_show(my_lagometer); + + gtk_box_pack_start(GTK_BOX(vbox2), lagbox, FALSE, TRUE, 0); + gtk_box_reorder_child(GTK_BOX(vbox2), lagbox, 1); + gtk_widget_show(lagbox); + } + + pct = us/100000; + if (pct > 0) + pct = 25 * log(pct); + if (pct < 0) + pct = 0; + if (pct > 100) + pct = 100; + pct /= 100; + + gtk_progress_bar_update(GTK_PROGRESS_BAR(my_lagometer), pct); +} + +void check_lag(char **who, char **message, void *m) { + char *name = g_strdup(normalize(*who)); + if (!strcasecmp(current_user->username, name) && + !strcmp(*message, MY_LAG_STRING)) { + struct timeval tv; + int ms; + + gettimeofday(&tv, NULL); + + ms = 1000000 * (tv.tv_sec - my_lag_tv.tv_sec); + + ms += tv.tv_usec - my_lag_tv.tv_usec; + + update_lag(ms); + *message = NULL; + } + g_free(name); +} + +void send_lag() { + gettimeofday(&my_lag_tv, NULL); + serv_send_im(current_user->username, MY_LAG_STRING, 1); +} + +void gaim_plugin_remove() { + gtk_timeout_remove(check_timeout); + if (confdlg) + gtk_widget_destroy(confdlg); + confdlg = NULL; + gtk_widget_destroy(lagbox); +} + +void avail_now(void *m) { + update_lag(0); + gaim_signal_connect(handle, event_im_recv, check_lag, NULL); + gaim_signal_connect(handle, event_signoff, gaim_plugin_remove, NULL); + check_timeout = gtk_timeout_add(1000 * delay, (GtkFunction)send_lag, NULL); +} + +void gaim_plugin_init(void *h) { + handle = h; + + if (!blist) + gaim_signal_connect(handle, event_signon, avail_now, NULL); + else + avail_now(NULL); +} + +void adjust_timeout(GtkWidget *button, GtkWidget *spinner) { + delay = CLAMP(gtk_spin_button_get_value_as_int( + GTK_SPIN_BUTTON(spinner)), 0, 3600); + sprintf(debug_buff, "new updates: %d\n", delay); + debug_print(debug_buff); + gtk_timeout_remove(check_timeout); + check_timeout = gtk_timeout_add(1000 * delay, (GtkFunction)send_lag, NULL); + gtk_widget_destroy(confdlg); + confdlg = NULL; +} + +void gaim_plugin_config() { + GtkWidget *label; + GtkAdjustment *adj; + GtkWidget *spinner; + GtkWidget *button; + GtkWidget *box; + + if (confdlg) { + gtk_widget_show(confdlg); + return; + } + + confdlg = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_window_set_title(GTK_WINDOW(confdlg), "Gaim Lag Delay"); + + box = gtk_hbox_new(FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + gtk_container_add(GTK_CONTAINER(confdlg), box); + gtk_widget_show(box); + + label = gtk_label_new("Delay between updates: "); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0); + gtk_widget_show(label); + + adj = (GtkAdjustment *)gtk_adjustment_new(delay, 0, 3600, 1, 0, 0); + spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0, 0); + gtk_box_pack_start(GTK_BOX(box), spinner, TRUE, TRUE, 0); + gtk_widget_show(spinner); + + button = gtk_button_new_with_label("OK"); + gtk_signal_connect(GTK_OBJECT(button), "clicked", + (GtkSignalFunc)adjust_timeout, spinner); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, TRUE, 0); + gtk_widget_show(button); + + gtk_widget_show(confdlg); +} + +char *name() { + return "Lag-O-Meter, Pluggified"; +} + +char *description() { + return "Your old familiar Lag-O-Meter, in a brand new form."; +}