# HG changeset patch # User Sean Egan # Date 1049183833 0 # Node ID 5fe846b7603f22693530b22ea8486a6ea11a86df # Parent f0c7d092948d351062ac1f928956bfe4623a37c6 [gaim-migrate @ 5278] Fixes by Rob "Robot101" McQueen: Buddies who sign off within 10 seconds of signing on won't get stuck "online" forever Idle times refresh every minute Show icons/text on the buddy list buttons works now URL tooltips in gtkimhtml won't linger around for no good reason. Thanks, Rob. And Rob Flynn is a spoil sport ;) committer: Tailor Script diff -r f0c7d092948d -r 5fe846b7603f src/buddy.c --- a/src/buddy.c Tue Apr 01 07:48:28 2003 +0000 +++ b/src/buddy.c Tue Apr 01 07:57:13 2003 +0000 @@ -377,17 +377,7 @@ #endif } -/* This is called 10 seconds after the buddy logs in. It removes the "logged in" icon and replaces it with - * the normal status icon */ - -static gboolean gaim_reset_present_icon(GaimBlistNode *b) -{ - ((struct buddy*)b)->present = 1; - gaim_gtk_blist_update(NULL, b); - return FALSE; -} - -static void edit_mode_cb(gpointer callback_data, guint callback_action, +static void gaim_gtk_blist_edit_mode_cb(gpointer callback_data, guint callback_action, GtkWidget *checkitem) { GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); gdk_window_set_cursor(gtkblist->window->window, cursor); @@ -405,16 +395,17 @@ gaim_gtk_blist_refresh(gaim_get_blist()); } +/* This is called 10 seconds after the buddy logs in. It removes the "logged in" icon and replaces it with + * the normal status icon. Make sure they didn't sign off in the mean-time though. */ -static void gaim_gtk_blist_update_toolbar_icons (GtkWidget *widget, gpointer data) { - if (GTK_IS_IMAGE(widget)) { - if (blist_options & OPT_BLIST_SHOW_BUTTON_XPM) - gtk_widget_show(widget); - else - gtk_widget_hide(widget); - } else if (GTK_IS_CONTAINER(widget)) { - gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL); +static gboolean gaim_reset_present_icon (GaimBlistNode *b) +{ + if (((struct buddy *)b)->present == 2) { + ((struct buddy *)b)->present = 1; + gaim_gtk_blist_update(NULL, b); } + + return FALSE; } static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, @@ -657,7 +648,7 @@ /* Edit menu */ { N_("/_Edit"), NULL, NULL, 0, "" }, - { N_("/Edit/_Show Offline Buddies"), NULL, edit_mode_cb, 1, ""}, + { N_("/Edit/_Show Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, ""}, { N_("/Edit/_Add a Buddy..."), NULL, gaim_gtk_blist_add_buddy_cb, 0, "", GTK_STOCK_ADD }, { N_("/Edit/Add a _Group..."), NULL, show_add_group, 0, NULL}, { "/Edit/sep", NULL, NULL, 0, "" }, @@ -665,7 +656,6 @@ { N_("/Edit/Preferences"), "P", show_prefs, 0, "", GTK_STOCK_PREFERENCES }, { N_("/Edit/Pr_ivacy"), NULL, show_privacy_options, 0, NULL }, - /* Tools */ { N_("/_Tools"), NULL, NULL, 0, "" }, @@ -1073,6 +1063,24 @@ } } +static gboolean gaim_gtk_blist_refresh_timer(struct gaim_buddy_list *list) +{ + GaimBlistNode *group = list->root; + GaimBlistNode *buddy; + + while (group) { + buddy = group->child; + while (buddy) { + if (((struct buddy *)buddy)->idle) + gaim_gtk_blist_update(list, buddy); + buddy = buddy->next; + } + group = group->next; + } + + /* keep on going */ + return TRUE; +} /********************************************************************************** * Public API Functions * @@ -1221,15 +1229,6 @@ gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); gaim_gtk_blist_update_columns(); - /* OK... let's show this bad boy. */ - gaim_gtk_blist_refresh(list); - gaim_gtk_blist_restore_position(); - gtk_widget_show_all(gtkblist->window); - - /* the button box below is first added now, the reason is that if we - * show() it immediately, the buddy list width will be dependent of - * the button box even if the user turned the button box off. */ - /**************************** Button Box **************************************/ sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); @@ -1261,16 +1260,18 @@ gtk_size_group_add_widget(sg, button); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_blist_button_away_cb), NULL); + gaim_gtk_blist_update_toolbar(); + /* set the Show Offline Buddies option */ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (ift, N_("/Edit/Show Offline Buddies"))), blist_options & OPT_BLIST_SHOW_OFFLINE); /* OK... let's show this bad boy. */ - gaim_gtk_blist_refresh(list); gaim_gtk_blist_restore_position(); gtk_widget_show_all(gtkblist->window); - gaim_gtk_blist_update_toolbar(); + gaim_gtk_blist_refresh(list); + gtkblist->refresh_timer = g_timeout_add(30000, (GSourceFunc)gaim_gtk_blist_refresh_timer, list); } void gaim_gtk_blist_refresh(struct gaim_buddy_list *list) @@ -1322,16 +1323,42 @@ return get_iter_from_node_helper(node, iter, &root); } +/* + * These state assignments suck. I'm sorry. They're for historical reasons. + * Roll on new prefs. -Robot101 + * + * NO_BUTTON_TEXT && SHOW_BUTTON_XPM - image + * !NO_BUTTON_TEXT && !SHOW_BUTTON_XPM - text + * !NO_BUTTON_TEXT && SHOW_BUTTON_XPM - text & images + * NO_BUTTON_TEXT && !SHOW_BUTTON_XPM - none + */ + +static void gaim_gtk_blist_update_toolbar_icons (GtkWidget *widget, gpointer data) { + if (GTK_IS_IMAGE(widget)) { + if (blist_options & OPT_BLIST_SHOW_BUTTON_XPM) + gtk_widget_show(widget); + else + gtk_widget_hide(widget); + } else if (GTK_IS_LABEL(widget)) { + if (blist_options & OPT_BLIST_NO_BUTTON_TEXT) + gtk_widget_hide(widget); + else + gtk_widget_show(widget); + } else if (GTK_IS_CONTAINER(widget)) { + gtk_container_foreach(GTK_CONTAINER(widget), gaim_gtk_blist_update_toolbar_icons, NULL); + } +} + void gaim_gtk_blist_update_toolbar() { if (!gtkblist) return; - gtk_container_foreach(GTK_CONTAINER(gtkblist->bbox), gaim_gtk_blist_update_toolbar_icons, NULL); - - if (blist_options & OPT_BLIST_NO_BUTTONS) + if (blist_options & OPT_BLIST_NO_BUTTON_TEXT && !(blist_options & OPT_BLIST_SHOW_BUTTON_XPM)) gtk_widget_hide(gtkblist->bbox); - else + else { gtk_widget_show_all(gtkblist->bbox); + gtk_container_foreach(GTK_CONTAINER(gtkblist->bbox), gaim_gtk_blist_update_toolbar_icons, NULL); + } } static void gaim_gtk_blist_remove(struct gaim_buddy_list *list, GaimBlistNode *node) @@ -1572,8 +1599,16 @@ { if (!gtkblist) return; + gtk_widget_destroy(gtkblist->window); + if (gtkblist->refresh_timer) + g_source_remove(gtkblist->refresh_timer); + if (gtkblist->timeout) + g_source_remove(gtkblist->timeout); + + gtkblist->refresh_timer = 0; + gtkblist->timeout = 0; gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; gtkblist->treemodel = NULL; gtkblist->idle_column = NULL; @@ -1582,8 +1617,6 @@ protomenu = NULL; awaymenu = NULL; bpmenu = NULL; - - gtkblist->timeout = 0; } static void gaim_gtk_blist_set_visible(struct gaim_buddy_list *list, gboolean show) @@ -1655,13 +1688,12 @@ { docklet_count--; if (!docklet_count) { - if (connections) { + if (connections) gaim_blist_set_visible(TRUE); - } else if (mainwindow) { + else if (mainwindow) gtk_window_present(GTK_WINDOW(mainwindow)); - } else { + else show_login(); - } } } diff -r f0c7d092948d -r 5fe846b7603f src/gaim.h --- a/src/gaim.h Tue Apr 01 07:48:28 2003 +0000 +++ b/src/gaim.h Tue Apr 01 07:57:13 2003 +0000 @@ -157,14 +157,9 @@ /*#define OPT_ACCT_KEEPALV 0x00000002 this shouldn't be optional */ #define OPT_ACCT_REM_PASS 0x00000004 #define OPT_ACCT_MAIL_CHECK 0x00000008 -/*do not use OPT_ACCT 0x00000010 talk to robot101 about automatic - name stuff with this option - */ #define DEFAULT_INFO "Visit the Gaim website at http://gaim.sourceforge.net/." - - enum log_event { log_signon = 0, log_signoff, @@ -232,7 +227,7 @@ #define OPT_BLIST_SHOW_PIXMAPS 0x00000010 #define OPT_BLIST_SHOW_IDLETIME 0x00000020 #define OPT_BLIST_SHOW_BUTTON_XPM 0x00000040 -#define OPT_BLIST_NO_BUTTONS 0x00000080 +#define OPT_BLIST_NO_BUTTON_TEXT 0x00000080 #define OPT_BLIST_NO_MT_GRP 0x00000100 #define OPT_BLIST_SHOW_WARN 0x00000200 #define OPT_BLIST_GREY_IDLERS 0x00000400 diff -r f0c7d092948d -r 5fe846b7603f src/gaimrc.c --- a/src/gaimrc.c Tue Apr 01 07:48:28 2003 +0000 +++ b/src/gaimrc.c Tue Apr 01 07:57:13 2003 +0000 @@ -729,7 +729,7 @@ { /* OPT_DISP_SHOW_SMILEY */ 0x00000100, &convo_options, OPT_CONVO_SHOW_SMILEY }, { /* OPT_DISP_COOL_LOOK */ 0x00000400, &misc_options, 0}, { /* OPT_DISP_CHAT_LOGON */ 0x00000800, &chat_options, OPT_CHAT_LOGON }, -{ /* OPT_DISP_NO_BUTTONS */ 0x00002000, &blist_options, OPT_BLIST_NO_BUTTONS }, +{ /* OPT_DISP_NO_BUTTONS */ 0x00002000, &blist_options, OPT_BLIST_NO_BUTTON_TEXT }, { /* OPT_DISP_CONV_BUTTON_TEXT */ 0x00004000, &im_options, OPT_IM_BUTTON_TEXT }, { /* OPT_DISP_CHAT_BUTTON_TEXT */ 0x00008000, &chat_options, OPT_CHAT_BUTTON_TEXT }, { /* OPT_DISP_NO_MT_GRP */ 0x00040000, &blist_options, OPT_BLIST_NO_MT_GRP }, diff -r f0c7d092948d -r 5fe846b7603f src/gtkimhtml.c --- a/src/gtkimhtml.c Tue Apr 01 07:48:28 2003 +0000 +++ b/src/gtkimhtml.c Tue Apr 01 07:57:13 2003 +0000 @@ -54,6 +54,7 @@ #define TOOLTIP_TIMEOUT 500 static gboolean gtk_motion_event_notify(GtkWidget *imhtml, GdkEventMotion *event, gpointer user_data); +static gboolean gtk_leave_event_notify(GtkWidget *imhtml, GdkEventCrossing *event, gpointer user_data); static gboolean gtk_size_allocate_cb(GtkWidget *widget, GtkAllocation *alloc, gpointer user_data); static gint gtk_imhtml_tip (gpointer data); @@ -230,8 +231,10 @@ g_free, (GDestroyNotify)gtk_smiley_tree_destroy); imhtml->default_smilies = gtk_smiley_tree_new(); + g_signal_connect(G_OBJECT(imhtml), "size-allocate", G_CALLBACK(gtk_size_allocate_cb), NULL); g_signal_connect(G_OBJECT(imhtml), "motion-notify-event", G_CALLBACK(gtk_motion_event_notify), NULL); - g_signal_connect(G_OBJECT(imhtml), "size-allocate", G_CALLBACK(gtk_size_allocate_cb), NULL); + g_signal_connect(G_OBJECT(imhtml), "leave-notify-event", G_CALLBACK(gtk_leave_event_notify), NULL); + gtk_widget_add_events(GTK_WIDGET(imhtml), GDK_LEAVE_NOTIFY_MASK); imhtml->tip = NULL; imhtml->tip_timer = 0; @@ -393,6 +396,23 @@ return FALSE; } +gboolean gtk_leave_event_notify(GtkWidget *imhtml, GdkEventCrossing *event, gpointer data) +{ + /* when leaving the widget, clear any current & pending tooltips and restore the cursor */ + if (GTK_IMHTML(imhtml)->tip_window) { + gtk_widget_destroy(GTK_IMHTML(imhtml)->tip_window); + GTK_IMHTML(imhtml)->tip_window = NULL; + } + if (GTK_IMHTML(imhtml)->tip_timer) { + g_source_remove(GTK_IMHTML(imhtml)->tip_timer); + GTK_IMHTML(imhtml)->tip_timer = 0; + } + gdk_window_set_cursor(event->window, GTK_IMHTML(imhtml)->arrow_cursor); + + /* propogate the event normally */ + return FALSE; +} + /* this isn't used yet static void gtk_smiley_tree_remove (GtkSmileyTree *tree, diff -r f0c7d092948d -r 5fe846b7603f src/gtklist.h --- a/src/gtklist.h Tue Apr 01 07:48:28 2003 +0000 +++ b/src/gtklist.h Tue Apr 01 07:57:13 2003 +0000 @@ -51,13 +51,14 @@ GtkWidget *treeview; /**< It's a treeview... d'uh. */ GtkTreeStore *treemodel; /**< This is the treemodel. */ - GtkTreeViewColumn *idle_column, *warning_column, *buddy_icon_column; - + GtkWidget *bbox; /**< A Button Box. */ + guint refresh_timer; /**< The timer for refreshing every 30 seconds */ + guint timeout; /**< The timeout for the tooltip. */ GdkRectangle rect; /**< This is the bounding rectangle of the cell we're currently hovering over. This is diff -r f0c7d092948d -r 5fe846b7603f src/prefs.c --- a/src/prefs.c Tue Apr 01 07:48:28 2003 +0000 +++ b/src/prefs.c Tue Apr 01 07:57:13 2003 +0000 @@ -541,8 +541,11 @@ gtk_container_set_border_width (GTK_CONTAINER (ret), 12); vbox = make_frame (ret, _("Buttons")); - gaim_button(_("_Hide IM/Info/Chat buttons"), &blist_options, OPT_BLIST_NO_BUTTONS, vbox); - gaim_button(_("Show _pictures on buttons"), &blist_options, OPT_BLIST_SHOW_BUTTON_XPM, vbox); + gaim_dropdown(vbox, _("Show _buttons as:"), &blist_options, OPT_BLIST_SHOW_BUTTON_XPM | OPT_BLIST_NO_BUTTON_TEXT, + _("Pictures"), OPT_BLIST_SHOW_BUTTON_XPM | OPT_BLIST_NO_BUTTON_TEXT, + _("Text"), 0, + _("Pictures and text"), OPT_BLIST_SHOW_BUTTON_XPM, + _("None"), OPT_BLIST_NO_BUTTON_TEXT, NULL); vbox = make_frame (ret, _("Buddy List Window")); gaim_button(_("_Save window size/position"), &blist_options, OPT_BLIST_SAVED_WINDOWS, vbox); @@ -557,7 +560,7 @@ /* gaim_button(_("Show buddy t_ype icons"), &blist_options, OPT_BLIST_SHOW_PIXMAPS, vbox); */ gaim_button(_("Show _warning levels"), &blist_options, OPT_BLIST_SHOW_WARN, vbox); gaim_button(_("Show idle _times"), &blist_options, OPT_BLIST_SHOW_IDLETIME, vbox); - gaim_button(_("Grey i_dle buddies"), &blist_options, OPT_BLIST_GREY_IDLERS, vbox); + gaim_button(_("Dim i_dle buddies"), &blist_options, OPT_BLIST_GREY_IDLERS, vbox); gtk_widget_show_all(ret); return ret; @@ -1975,9 +1978,7 @@ if (!gtkblist) return; - if (option == OPT_BLIST_NO_BUTTONS || option == OPT_BLIST_NO_BUTTONS) - gaim_gtk_blist_update_toolbar(); - else if (option == OPT_BLIST_SHOW_WARN || + if (option == OPT_BLIST_SHOW_WARN || option == OPT_BLIST_SHOW_IDLETIME) gaim_gtk_blist_update_columns(); else if (option == OPT_BLIST_SHOW_ICONS) { @@ -1985,9 +1986,6 @@ gaim_gtk_blist_update_columns(); } else gaim_gtk_blist_refresh(gaim_get_blist()); - - - } static void set_convo_option(GtkWidget *w, int option) @@ -2303,6 +2301,8 @@ else gtk_widget_set_sensitive(sndcmd, FALSE); gaim_sound_change_output_method(); + } else if (option == (int*)&blist_options) { + gaim_gtk_blist_update_toolbar(); } else if (option == (int*)&im_options) { if (clear == (OPT_IM_SIDE_TAB | OPT_IM_BR_TAB)) gaim_gtkconv_update_tabs();