Mercurial > pidgin.yaz
view src/prpl.c @ 1147:65e0608e19f7
[gaim-migrate @ 1157]
I think toc is mostly working, i tested it remotely. Oscar is somewhat working; switching between options doesn't force you offline anymore, so that's good. adding and removing doesn't force you offline either. another plus. but i'm not sure it always recognizes the changes on the server side. hey, that's what you get with a protocol where the only thing you know about it is what you see on the wire.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Mon, 27 Nov 2000 13:47:33 +0000 |
parents | b0b40b5faede |
children | 265abea9db72 |
line wrap: on
line source
/* * gaim * * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> * * 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 "prpl.h" #include "pixmaps/ok.xpm" #include "pixmaps/cancel.xpm" extern void toc_init(struct prpl *); extern void oscar_init(struct prpl *); GSList *protocols = NULL; struct prpl *find_prpl(int prot) { GSList *e = protocols; struct prpl *r; while (e) { r = (struct prpl *)e->data; if (r->protocol == prot) return r; e = e->next; } return NULL; } static gint proto_compare(struct prpl *a, struct prpl *b) { /* neg if a before b, 0 if equal, pos if a after b */ return a->protocol - b->protocol; } void load_protocol(proto_init pi) { struct prpl *p = g_new0(struct prpl, 1); struct prpl *old; pi(p); if ((old = find_prpl(p->protocol)) == NULL) unload_protocol(old); protocols = g_slist_insert_sorted(protocols, p, (GCompareFunc)proto_compare); } void unload_protocol(struct prpl *p) { GSList *c = connections; struct gaim_connection *g; while (c) { g = (struct gaim_connection *)c->data; if (g->prpl == p) { char buf[256]; g_snprintf(buf, sizeof buf, _("%s was using %s, which got removed." " %s is now offline."), g->username, (*p->name)(), g->username); do_error_dialog(buf, _("Disconnect")); signoff(g); c = connections; } else c = c->next; } protocols = g_slist_remove(protocols, p); g_free(p); } void static_proto_init() { load_protocol(toc_init); #ifndef DYNAMIC_OSCAR load_protocol(oscar_init); #endif } static void des_win(GtkWidget *a, GtkWidget *b) { gtk_widget_destroy(b); } static int rem_win(GtkObject *a, GtkWidget *b) { gpointer d = gtk_object_get_user_data(a); gtk_signal_disconnect_by_data(GTK_OBJECT(b), d); gtk_widget_destroy(b); return TRUE; } void do_ask_dialog(const char *text, void *data, void *doit, void *dont) { GtkWidget *window; GtkWidget *box; GtkWidget *label; GtkWidget *hbox; GtkWidget *button; window = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_wmclass(GTK_WINDOW(window), "accept", "Gaim"); gtk_window_set_policy(GTK_WINDOW(window), 0, 0, 1); gtk_window_set_title(GTK_WINDOW(window), _("Accept?")); gtk_widget_realize(window); aol_icon(window->window); if (dont) gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(dont), data); box = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), box); gtk_widget_show(box); label = gtk_label_new(text); gtk_box_pack_start(GTK_BOX(box), label, 0, 0, 5); gtk_widget_show(label); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box), hbox, 0, 0, 1); gtk_widget_show(hbox); button = picture_button(window, _("Accept"), ok_xpm); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5); gtk_object_set_user_data(GTK_OBJECT(button), data); if (doit) gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(doit), data); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(rem_win), window); button = picture_button(window, _("Cancel"), cancel_xpm); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 5); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(des_win), window); gtk_widget_show(window); }