Mercurial > pidgin
changeset 3570:b791019b2492
[gaim-migrate @ 3666]
You win, McQueen.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 29 Sep 2002 04:48:40 +0000 |
parents | d6468f276d24 |
children | a88c62c5b7da |
files | plugins/SIGNALS plugins/docklet/docklet.c src/buddy.c src/multi.c src/server.c src/ui.h |
diffstat | 6 files changed, 143 insertions(+), 174 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/SIGNALS Sun Sep 29 04:26:50 2002 +0000 +++ b/plugins/SIGNALS Sun Sep 29 04:48:40 2002 +0000 @@ -344,8 +344,8 @@ access any data related to the conversation without breaking anything. - 'c' is he conversation being closed. - + 'c' is the conversation being closed. + event_connecting: struct aim_user *u @@ -355,5 +355,5 @@ being called, depending upon whether the attempt was a sucess or a failure. In both cases, u->connecting is set to false and the counter decremented. - + 'u' is the account being connected.
--- a/plugins/docklet/docklet.c Sun Sep 29 04:26:50 2002 +0000 +++ b/plugins/docklet/docklet.c Sun Sep 29 04:48:40 2002 +0000 @@ -63,10 +63,17 @@ away_options ^= OPT_AWAY_QUEUE_UNREAD; save_prefs(); } - + +/* static void docklet_toggle_blist_show(GtkWidget *widget, void *data) { + blist_options ^= OPT_BLIST_APP_BUDDY_SHOW; + save_prefs(); +} */ + static void docklet_flush_queue() { - purge_away_queue(unread_message_queue); - unread_message_queue = NULL; + if (unread_message_queue) { + purge_away_queue(unread_message_queue); + unread_message_queue = NULL; + } } static void docklet_menu(GdkEventButton *event) { @@ -158,10 +165,9 @@ switch (event->button) { case 1: if (unread_message_queue) { - docklet_flush_queue(); + docklet_flush_queue(); docklet_update_status(); - } - else { + } else { docklet_toggle(); } break; @@ -187,8 +193,7 @@ case away_pending: filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgpend.png", NULL); break; - case unread_pending: - /* XXX MAKE ME BLINK! */ + case unread_pending: filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgunread.png", NULL); break; case connecting: @@ -249,30 +254,27 @@ } static void docklet_embedded(GtkWidget *widget, void *data) { - debug_printf("Docklet: embedded\n"); - docklet_add(); + debug_printf("Docklet: embedded\n"); + docklet_add(); } static void docklet_destroyed(GtkWidget *widget, void *data) { - debug_printf("Docklet: destroyed\n"); - docklet_flush_queue(); - docklet_remove(); - docklet_create(); + debug_printf("Docklet: destroyed\n"); + docklet_flush_queue(); + docklet_remove(); + docklet_create(); } static void docklet_create() { GtkWidget *box; - if (docklet) { - /* if this is being called when a docklet exists, it's because that - docklet is in the process of being destroyed. all we need to do - is tell gobject we're not interested in it any more, and throw - the pointer away. Alan Cox said so. */ - - /* Ooooh, look at me! I'm Robot101! I know Alan Cox! I talk to him - all the time! I'm sooooo special! --Sean Egan */ - g_object_unref(G_OBJECT(docklet)); - docklet = NULL; + if (docklet) { + /* if this is being called when a docklet exists, it's because that + docklet is in the process of being destroyed. all we need to do + is tell gobject we're not interested in it any more, and throw + the pointer away. */ + g_object_unref(G_OBJECT(docklet)); + docklet = NULL; } docklet = egg_tray_icon_new("Gaim"); @@ -312,13 +314,13 @@ docklet_update_status(); } -static void gaim_im_recv(struct gaim_connection *gc, char **who, char **what, void *data) { +static void gaim_im_displayed_recv(struct gaim_connection *gc, char **who, char **what, void *data) { /* if message queuing while away is enabled, this event could be the first message so we need to see if the status (and hence icon) needs changing */ docklet_update_status(); } -static void gaim_buddy_signon(struct gaim_connection *gc, char *who, void *data) { +/* static void gaim_buddy_signon(struct gaim_connection *gc, char *who, void *data) { } static void gaim_buddy_signoff(struct gaim_connection *gc, char *who, void *data) { @@ -331,7 +333,7 @@ } static void gaim_new_conversation(char *who, void *data) { -} +} */ char *gaim_plugin_init(GModule *handle) { docklet_create(); @@ -340,74 +342,71 @@ gaim_signal_connect(handle, event_signoff, gaim_signoff, NULL); gaim_signal_connect(handle, event_connecting, gaim_connecting, NULL); gaim_signal_connect(handle, event_away, gaim_away, NULL); - gaim_signal_connect(handle, event_im_displayed_rcvd, gaim_im_recv, NULL); - gaim_signal_connect(handle, event_im_recv, gaim_im_recv, NULL); - gaim_signal_connect(handle, event_buddy_signon, gaim_buddy_signon, NULL); + gaim_signal_connect(handle, event_im_displayed_rcvd, gaim_im_displayed_recv, NULL); +/* gaim_signal_connect(handle, event_buddy_signon, gaim_buddy_signon, NULL); gaim_signal_connect(handle, event_buddy_signoff, gaim_buddy_signoff, NULL); gaim_signal_connect(handle, event_buddy_away, gaim_buddy_away, NULL); gaim_signal_connect(handle, event_buddy_back, gaim_buddy_back, NULL); - gaim_signal_connect(handle, event_new_conversation, gaim_new_conversation, NULL); + gaim_signal_connect(handle, event_new_conversation, gaim_new_conversation, NULL); */ return NULL; } void gaim_plugin_remove() { - if (GTK_WIDGET_VISIBLE(docklet)) { - docklet_remove(); - } + if (GTK_WIDGET_VISIBLE(docklet)) { + docklet_remove(); + } - docklet_flush_queue(); + docklet_flush_queue(); - g_object_unref(G_OBJECT(docklet)); - g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_destroyed), NULL); - gtk_widget_destroy(GTK_WIDGET(docklet)); + g_object_unref(G_OBJECT(docklet)); + g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_destroyed), NULL); + gtk_widget_destroy(GTK_WIDGET(docklet)); - debug_printf("Docklet: removed\n"); -} - -static void config_close() { - configwin = NULL; + debug_printf("Docklet: removed\n"); } -void gaim_plugin_config() { - /* This is the sorriest dialog ever written ever */ - /* It's a good thing I plan on rewriting it later tonight */ - GtkWidget *button; - GtkWidget *vbox; +GtkWidget *gaim_plugin_config_gtk() { + GtkWidget *frame; + GtkWidget *vbox, *hbox; + GtkWidget *toggle; - if (configwin) - return; - GAIM_DIALOG(configwin); - g_signal_connect(G_OBJECT(configwin), "destroy", GTK_SIGNAL_FUNC(config_close), NULL); + frame = gtk_vbox_new(FALSE, 18); + gtk_container_set_border_width(GTK_CONTAINER(frame), 12); + + vbox = make_frame(frame, _("Docklet Configuration")); + hbox = gtk_hbox_new(FALSE, 18); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - vbox = gtk_vbox_new(0, 6); - gtk_container_add(GTK_CONTAINER(configwin), vbox); - gtk_window_set_title(GTK_WINDOW(configwin), "Docklet Configuration"); - - button = gtk_check_button_new_with_mnemonic("_Hide new messages until docklet is clicked"); - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), away_options & OPT_AWAY_QUEUE_UNREAD); - g_signal_connect(G_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(docklet_toggle_queue), NULL); - gtk_box_pack_end(GTK_BOX(vbox), button, 0, 0, 0); +/* toggle = gtk_check_button_new_with_mnemonic(_("_Automatically show buddy list on sign on")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), blist_options & OPT_BLIST_APP_BUDDY_SHOW); + g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_blist_show), NULL); + gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); */ - gtk_widget_show_all(configwin); + toggle = gtk_check_button_new_with_mnemonic(_("_Hide new messages until docklet is clicked")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), away_options & OPT_AWAY_QUEUE_UNREAD); + g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_queue), NULL); + gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); + + gtk_widget_show_all(frame); + return frame; } - + struct gaim_plugin_description desc; struct gaim_plugin_description *gaim_plugin_desc() { desc.api_version = PLUGIN_API_VERSION; - desc.name = g_strdup("System Tray Docklet"); + desc.name = g_strdup(_("System Tray Docklet")); desc.version = g_strdup(VERSION); - desc.description = g_strdup("Interacts with a System Tray applet (in GNOME or KDE, for example) to display the current status of Gaim, allow fast access to commonly used functions, and to toggle display of the buddy list or login window."); - desc.authors = g_strdup("Robert McQueen <robot101@debian.org>"); + desc.description = g_strdup(_("Interacts with a System Tray applet (in GNOME or KDE, for example) to display the current status of Gaim, allow fast access to commonly used functions, and to toggle display of the buddy list or login window.")); + desc.authors = g_strdup(_("Robert McQueen <robot101@debian.org>")); desc.url = g_strdup(WEBSITE); return &desc; } - -const char *name() { +char *name() { return _("System Tray Docklet"); } -const char *description() { +char *description() { return _("Interacts with a System Tray applet (in GNOME or KDE, for example) to display the current status of Gaim, allow fast access to commonly used functions, and to toggle display of the buddy list or login window."); }
--- a/src/buddy.c Sun Sep 29 04:26:50 2002 +0000 +++ b/src/buddy.c Sun Sep 29 04:48:40 2002 +0000 @@ -1993,35 +1993,6 @@ return g; } - -void docklet_toggle() { - /* Useful for the docklet plugin and also for the win32 tray icon*/ - /* This is called when one of those is clicked--it will show/hide the - buddy list/login window--depending on which is active */ - if (connections) { - if (GTK_WIDGET_VISIBLE(blist)) { - if (GAIM_WINDOW_ICONIFIED(blist)) { - unhide_buddy_list(); - } else { - hide_buddy_list(); - } - } else { - unhide_buddy_list(); - } - } else { - if (GTK_WIDGET_VISIBLE(mainwindow)) { - if (GAIM_WINDOW_ICONIFIED(mainwindow)) { - gtk_window_present(GTK_WINDOW(mainwindow)); - } else { - gtk_widget_hide(mainwindow); - } - } else { - gtk_window_present(GTK_WINDOW(mainwindow)); - } - } -} - - /* used by this file, and by iconaway.so */ void hide_buddy_list() { if (blist) { @@ -2072,6 +2043,33 @@ } } +void docklet_toggle() { + /* Useful for the docklet plugin and also for the win32 tray icon*/ + /* This is called when one of those is clicked--it will show/hide the + buddy list/login window--depending on which is active */ + if (connections) { + if (GTK_WIDGET_VISIBLE(blist)) { + if (GAIM_WINDOW_ICONIFIED(blist)) { + unhide_buddy_list(); + } else { + hide_buddy_list(); + } + } else { + unhide_buddy_list(); + } + } else { + if (GTK_WIDGET_VISIBLE(mainwindow)) { + if (GAIM_WINDOW_ICONIFIED(mainwindow)) { + gtk_window_present(GTK_WINDOW(mainwindow)); + } else { + gtk_widget_hide(mainwindow); + } + } else { + gtk_window_present(GTK_WINDOW(mainwindow)); + } + } +} + static gint log_timeout(struct buddy_show *b) { /* this part is really just a bad hack because of a bug I can't find */ @@ -2460,10 +2458,10 @@ } static void change_state_blist_window(GtkWidget *w, GdkEventWindowState *event, void *dummy) { - if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED && - docklet_count) { - gtk_widget_hide(blist); - } + if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED && + docklet_count) { + gtk_widget_hide(blist); + } } /******************************************************************* @@ -2501,7 +2499,7 @@ gtk_widget_add_accelerator(menuitem, "activate", accel, str[0], GDK_MOD1_MASK, GTK_ACCEL_LOCKED); - + return menuitem; } @@ -2625,7 +2623,7 @@ } } -void show_buddy_list() +void make_buddy_list() { /* Build the buddy list, based on *config */ @@ -2648,28 +2646,26 @@ GtkWidget *tbox; if (blist) { - unhide_buddy_list(); return; } blist = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_gravity(GTK_WINDOW(blist), GDK_GRAVITY_STATIC); + gtk_window_set_policy(GTK_WINDOW(blist), TRUE, TRUE, TRUE); + gtk_window_set_title(GTK_WINDOW(blist), _("Gaim - Buddy List")); gtk_window_set_wmclass(GTK_WINDOW(blist), "buddy_list", "Gaim"); gtk_widget_realize(blist); - gtk_window_set_gravity(GTK_WINDOW(blist), GDK_GRAVITY_STATIC); - gtk_window_set_policy(GTK_WINDOW(blist), TRUE, TRUE, TRUE); - accel = gtk_accel_group_new(); - gtk_window_add_accel_group(G_OBJECT(blist), accel); + gtk_window_add_accel_group(GTK_WINDOW(blist), accel); menubar = gtk_menu_bar_new(); menu = gtk_menu_new(); gtk_menu_set_accel_group(GTK_MENU(menu), accel); - menuitem = gaim_new_item(NULL, _("File")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); gtk_menu_bar_append(GTK_MENU_BAR(menubar), menuitem); @@ -2687,15 +2683,13 @@ gaim_new_item_with_pixmap(menu, _("Import Buddy List"), import_small_xpm, GTK_SIGNAL_FUNC(import_callback), NULL, 0, 0, 0); - /*gaim_new_item_with_pixmap(menu, _("Export Buddy List"), export_small_xpm, - GTK_SIGNAL_FUNC(show_export_dialog), 0, 0, 0); */ + gaim_separator(menu); + gaim_new_item_with_pixmap(menu, _("Signoff"), logout_menu_xpm, GTK_SIGNAL_FUNC(signoff_all), (void*)1, 'd', GDK_CONTROL_MASK, "Ctl+D"); - gaim_new_item_with_pixmap(menu, _("Hide"), close_small_xpm, GTK_SIGNAL_FUNC(hide_buddy_list), NULL, 'h', GDK_CONTROL_MASK, "Ctl+H"); - gaim_new_item_with_pixmap(menu, _("Quit"), exit_small_xpm, GTK_SIGNAL_FUNC(do_quit), NULL, 'q', GDK_CONTROL_MASK, "Ctl+Q"); @@ -2723,8 +2717,7 @@ #endif protomenu = gtk_menu_new(); - menuitem = - gaim_new_item_with_pixmap(menu, _("Protocol Actions"), prefs_small_xpm, NULL, NULL, 0, 0, 0); + menuitem = gaim_new_item_with_pixmap(menu, _("Protocol Actions"), prefs_small_xpm, NULL, NULL, 0, 0, 0); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), protomenu); do_proto_menu(); @@ -2745,7 +2738,6 @@ gaim_new_item_with_pixmap(menu, _("Debug Window"), search_small_xpm, GTK_SIGNAL_FUNC(clicked_debug), NULL, 0, 0, NULL); gaim_new_item_with_pixmap(menu, _("About Gaim"), about_small_xpm, GTK_SIGNAL_FUNC(show_about), NULL, GDK_F1, GDK_CONTROL_MASK, NULL); - gtk_widget_show(menubar); vbox = gtk_vbox_new(FALSE, 0); @@ -2777,20 +2769,9 @@ if (!(blist_options & OPT_BLIST_NO_BUTTONS)) build_imchat_box(TRUE); - /* Swing the edit buddy */ editpane = gtk_vbox_new(FALSE, 1); - addbutton = gtk_button_new_with_label(_("Add")); - groupbutton = gtk_button_new_with_label(_("Group")); - rembutton = gtk_button_new_with_label(_("Remove")); - - if (misc_options & OPT_MISC_COOL_LOOK) { - gtk_button_set_relief(GTK_BUTTON(addbutton), GTK_RELIEF_NONE); - gtk_button_set_relief(GTK_BUTTON(groupbutton), GTK_RELIEF_NONE); - gtk_button_set_relief(GTK_BUTTON(rembutton), GTK_RELIEF_NONE); - } - edittree = gtk_ctree_new(1, 0); gtk_ctree_set_line_style(GTK_CTREE(edittree), GTK_CTREE_LINES_SOLID);; gtk_ctree_set_expander_style(GTK_CTREE(edittree), GTK_CTREE_EXPANDER_SQUARE); @@ -2809,7 +2790,18 @@ bbox = gtk_hbox_new(TRUE, 5); gtk_container_set_border_width(GTK_CONTAINER(bbox), 5); tbox = gtk_scrolled_window_new(NULL, NULL); - /* Put the buttons in the box */ + + /* buttons */ + addbutton = gtk_button_new_with_label(_("Add")); + groupbutton = gtk_button_new_with_label(_("Group")); + rembutton = gtk_button_new_with_label(_("Remove")); + + if (misc_options & OPT_MISC_COOL_LOOK) { + gtk_button_set_relief(GTK_BUTTON(addbutton), GTK_RELIEF_NONE); + gtk_button_set_relief(GTK_BUTTON(groupbutton), GTK_RELIEF_NONE); + gtk_button_set_relief(GTK_BUTTON(rembutton), GTK_RELIEF_NONE); + } + gtk_box_pack_start(GTK_BOX(bbox), addbutton, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bbox), groupbutton, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bbox), rembutton, TRUE, TRUE, 0); @@ -2818,14 +2810,14 @@ gtk_tooltips_set_tip(tips, groupbutton, _("Add a new Group"), "Penguin"); gtk_tooltips_set_tip(tips, rembutton, _("Remove selected Buddy/Group"), "Penguin"); + g_signal_connect(G_OBJECT(rembutton), "clicked", G_CALLBACK(do_del_buddy), edittree); + g_signal_connect(G_OBJECT(addbutton), "clicked", G_CALLBACK(add_buddy_callback), NULL); + g_signal_connect(G_OBJECT(groupbutton), "clicked", G_CALLBACK(add_group_callback), NULL); + /* And the boxes in the box */ gtk_box_pack_start(GTK_BOX(editpane), tbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(editpane), bbox, FALSE, FALSE, 0); - /* Handle closes right */ - - - /* Finish up */ gtk_widget_show(addbutton); gtk_widget_show(groupbutton); @@ -2835,12 +2827,8 @@ gtk_widget_show(bbox); gtk_widget_show(editpane); - - update_button_pix(); - - label = gtk_label_new(_("Online")); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), buddypane, label); label = gtk_label_new(_("Edit Buddies")); @@ -2853,47 +2841,24 @@ /* Pack things in the vbox */ gtk_widget_show(vbox); - - - gtk_widget_show(notebook); - - /* Enable buttons */ - - gtk_signal_connect(GTK_OBJECT(rembutton), "clicked", GTK_SIGNAL_FUNC(do_del_buddy), edittree); - gtk_signal_connect(GTK_OBJECT(addbutton), "clicked", GTK_SIGNAL_FUNC(add_buddy_callback), NULL); - gtk_signal_connect(GTK_OBJECT(groupbutton), "clicked", GTK_SIGNAL_FUNC(add_group_callback), - NULL); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(blist), vbox); - gtk_signal_connect(GTK_OBJECT(blist), "delete_event", GTK_SIGNAL_FUNC(close_buddy_list), - NULL); - - gtk_signal_connect(GTK_OBJECT(blist), "configure_event", GTK_SIGNAL_FUNC(configure_blist_window), - NULL); - gtk_signal_connect(GTK_OBJECT(blist), "window_state_event", GTK_SIGNAL_FUNC(change_state_blist_window), - NULL); - - + g_signal_connect(G_OBJECT(blist), "delete_event", G_CALLBACK(close_buddy_list), NULL); + g_signal_connect(G_OBJECT(blist), "configure_event", G_CALLBACK(configure_blist_window), NULL); + g_signal_connect(G_OBJECT(blist), "window_state_event", G_CALLBACK(change_state_blist_window), NULL); /* The edit tree */ gtk_container_add(GTK_CONTAINER(tbox), edittree); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tbox), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - - gtk_window_set_title(GTK_WINDOW(blist), _("Gaim - Buddy List")); - - /* this conveniently moves it to the right place and stuff */ - unhide_buddy_list(); } -void refresh_buddy_window() +void show_buddy_list() { + make_buddy_list(); + unhide_buddy_list(); build_edit_tree(); - update_button_pix(); - gtk_widget_show(blist); }
--- a/src/multi.c Sun Sep 29 04:26:50 2002 +0000 +++ b/src/multi.c Sun Sep 29 04:48:40 2002 +0000 @@ -1132,7 +1132,6 @@ gtk_widget_hide(mainwindow); show_buddy_list(); - refresh_buddy_window(); update_privacy_connections(); do_away_menu(); @@ -1141,8 +1140,11 @@ gaim_setup(gc); gc->user->connecting = FALSE; - connecting_count--; - + if (connecting_count) { + connecting_count--; + } + debug_printf("connecting_count: %d\n", connecting_count); + plugin_event(event_signon, gc); system_log(log_signon, gc, NULL, OPT_LOG_BUDDY_SIGNON | OPT_LOG_MY_SIGNON); @@ -1439,8 +1441,11 @@ this user was ever on-line or not */ if (gc->user->connecting) { gc->user->connecting = FALSE; - connecting_count--; + if (connecting_count) { + connecting_count--; + } } + debug_printf("connecting_count: %d\n", connecting_count); serv_close(gc); /* more UI stuff */
--- a/src/server.c Sun Sep 29 04:26:50 2002 +0000 +++ b/src/server.c Sun Sep 29 04:48:40 2002 +0000 @@ -56,6 +56,7 @@ debug_printf(PACKAGE " " VERSION " logging in %s using %s\n", user->username, p->name()); user->connecting = TRUE; connecting_count++; + debug_printf("connecting_count: %d\n", connecting_count); plugin_event(event_connecting, user); p->login(user); }
--- a/src/ui.h Sun Sep 29 04:26:50 2002 +0000 +++ b/src/ui.h Sun Sep 29 04:48:40 2002 +0000 @@ -31,7 +31,6 @@ #define GAIM_DIALOG(x) x = gtk_window_new(GTK_WINDOW_TOPLEVEL); \ gtk_window_set_type_hint(GTK_WINDOW(x), GDK_WINDOW_TYPE_HINT_DIALOG) - #define GAIM_WINDOW_ICONIFIED(x) (gdk_window_get_state(GTK_WIDGET(x)->window) & GDK_WINDOW_STATE_ICONIFIED) #define DEFAULT_FONT_FACE "Helvetica" @@ -331,7 +330,6 @@ extern void update_all_buddies(); extern void update_num_groups(void); extern void show_buddy_list(); -extern void refresh_buddy_window(); extern void signoff_all(); extern void do_im_back(); extern void set_buddy(struct gaim_connection *, struct buddy *); @@ -349,6 +347,7 @@ extern void unhide_buddy_list(); extern void docklet_add(); extern void docklet_remove(); +extern void docklet_toggle(); /* Functions in buddy_chat.c */ extern void join_chat();