| 76 |
76 |
| 77 #define CLOSE_CONV_TIMEOUT_SECS (10 * 60) |
77 #define CLOSE_CONV_TIMEOUT_SECS (10 * 60) |
| 78 |
78 |
| 79 #define AUTO_RESPONSE "<AUTO-REPLY> : " |
79 #define AUTO_RESPONSE "<AUTO-REPLY> : " |
| 80 |
80 |
| 81 typedef enum |
81 typedef enum |
| 82 { |
82 { |
| 83 PIDGIN_CONV_SET_TITLE = 1 << 0, |
83 PIDGIN_CONV_SET_TITLE = 1 << 0, |
| 84 PIDGIN_CONV_BUDDY_ICON = 1 << 1, |
84 PIDGIN_CONV_BUDDY_ICON = 1 << 1, |
| 85 PIDGIN_CONV_MENU = 1 << 2, |
85 PIDGIN_CONV_MENU = 1 << 2, |
| 86 PIDGIN_CONV_TAB_ICON = 1 << 3, |
86 PIDGIN_CONV_TAB_ICON = 1 << 3, |
| 87 PIDGIN_CONV_TOPIC = 1 << 4, |
87 PIDGIN_CONV_TOPIC = 1 << 4, |
| 88 PIDGIN_CONV_SMILEY_THEME = 1 << 5, |
88 PIDGIN_CONV_SMILEY_THEME = 1 << 5, |
| 139 /* Lists of status icons at all available sizes for use as window icons */ |
139 /* Lists of status icons at all available sizes for use as window icons */ |
| 140 static GList *available_list = NULL; |
140 static GList *available_list = NULL; |
| 141 static GList *away_list = NULL; |
141 static GList *away_list = NULL; |
| 142 static GList *busy_list = NULL; |
142 static GList *busy_list = NULL; |
| 143 static GList *xa_list = NULL; |
143 static GList *xa_list = NULL; |
| 144 static GList *login_list = NULL; |
|
| 145 static GList *logout_list = NULL; |
|
| 146 static GList *offline_list = NULL; |
144 static GList *offline_list = NULL; |
| 147 static GHashTable *prpl_lists = NULL; |
145 static GHashTable *prpl_lists = NULL; |
| 148 |
146 |
| 149 static gboolean update_send_to_selection(PidginWindow *win); |
147 static gboolean update_send_to_selection(PidginWindow *win); |
| 150 static void generate_send_to_items(PidginWindow *win); |
148 static void generate_send_to_items(PidginWindow *win); |
| 2190 (event->keyval == GDK_Up) || |
2188 (event->keyval == GDK_Up) || |
| 2191 (event->keyval == GDK_Down) || |
2189 (event->keyval == GDK_Down) || |
| 2192 (event->keyval == GDK_Left) || |
2190 (event->keyval == GDK_Left) || |
| 2193 (event->keyval == GDK_Right) || |
2191 (event->keyval == GDK_Right) || |
| 2194 (event->keyval == GDK_Page_Up) || |
2192 (event->keyval == GDK_Page_Up) || |
| 2195 (event->keyval == GDK_KP_Page_Up) || |
2193 (event->keyval == GDK_KP_Page_Up) || |
| 2196 (event->keyval == GDK_Page_Down) || |
2194 (event->keyval == GDK_Page_Down) || |
| 2197 (event->keyval == GDK_KP_Page_Down) || |
2195 (event->keyval == GDK_KP_Page_Down) || |
| 2198 (event->keyval == GDK_Home) || |
2196 (event->keyval == GDK_Home) || |
| 2199 (event->keyval == GDK_End) || |
2197 (event->keyval == GDK_End) || |
| 2200 (event->keyval == GDK_Tab) || |
2198 (event->keyval == GDK_Tab) || |
| 2201 (event->keyval == GDK_KP_Tab) || |
2199 (event->keyval == GDK_KP_Tab) || |
| 2202 (event->keyval == GDK_ISO_Left_Tab)) |
2200 (event->keyval == GDK_ISO_Left_Tab)) |
| 2428 |
2426 |
| 2429 /* Use the buddy icon, if possible */ |
2427 /* Use the buddy icon, if possible */ |
| 2430 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
2428 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { |
| 2431 PurpleBuddy *b = purple_find_buddy(account, name); |
2429 PurpleBuddy *b = purple_find_buddy(account, name); |
| 2432 if (b != NULL) { |
2430 if (b != NULL) { |
| 2433 PurplePresence *p; |
2431 PurplePresence *p; |
| 2434 p = purple_buddy_get_presence(b); |
2432 p = purple_buddy_get_presence(b); |
| 2435 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) |
2433 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) |
| 2436 return away_list; |
2434 return away_list; |
| 2437 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) |
2435 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) |
| 2438 return busy_list; |
2436 return busy_list; |
| 2439 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) |
2437 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) |
| 6117 l = l->next; |
6115 l = l->next; |
| 6118 } |
6116 } |
| 6119 |
6117 |
| 6120 /* Currently GTK+ maintains our sorted list after it's in the tree. |
6118 /* Currently GTK+ maintains our sorted list after it's in the tree. |
| 6121 * This may change if it turns out we can manage it faster ourselves. |
6119 * This may change if it turns out we can manage it faster ourselves. |
| 6122 */ |
6120 */ |
| 6123 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, |
6121 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, |
| 6124 GTK_SORT_ASCENDING); |
6122 GTK_SORT_ASCENDING); |
| 6125 } |
6123 } |
| 6126 |
6124 |
| 6127 static void |
6125 static void |
| 6469 gtk_widget_show(g_object_get_data(G_OBJECT(win->window), "get_attention")); |
6467 gtk_widget_show(g_object_get_data(G_OBJECT(win->window), "get_attention")); |
| 6470 gtk_widget_show(win->menu.add_pounce); |
6468 gtk_widget_show(win->menu.add_pounce); |
| 6471 gtk_widget_show(win->menu.get_info); |
6469 gtk_widget_show(win->menu.get_info); |
| 6472 gtk_widget_hide(win->menu.invite); |
6470 gtk_widget_hide(win->menu.invite); |
| 6473 gtk_widget_show(win->menu.alias); |
6471 gtk_widget_show(win->menu.alias); |
| 6474 if (purple_privacy_check(account, purple_conversation_get_name(conv))) { |
6472 if (purple_privacy_check(account, purple_conversation_get_name(conv))) { |
| 6475 gtk_widget_hide(win->menu.unblock); |
6473 gtk_widget_hide(win->menu.unblock); |
| 6476 gtk_widget_show(win->menu.block); |
6474 gtk_widget_show(win->menu.block); |
| 6477 } else { |
6475 } else { |
| 6478 gtk_widget_hide(win->menu.block); |
6476 gtk_widget_hide(win->menu.block); |
| 6479 gtk_widget_show(win->menu.unblock); |
6477 gtk_widget_show(win->menu.unblock); |
| 6480 } |
6478 } |
| 6481 |
6479 |
| 6482 if ((account == NULL) || purple_find_buddy(account, purple_conversation_get_name(conv)) == NULL) { |
6480 if ((account == NULL) || purple_find_buddy(account, purple_conversation_get_name(conv)) == NULL) { |
| 6483 gtk_widget_show(win->menu.add); |
6481 gtk_widget_show(win->menu.add); |
| 6484 gtk_widget_hide(win->menu.remove); |
6482 gtk_widget_hide(win->menu.remove); |
| 6485 } else { |
6483 } else { |
| 6696 (fields & PIDGIN_CONV_TOPIC)) |
6694 (fields & PIDGIN_CONV_TOPIC)) |
| 6697 { |
6695 { |
| 6698 char *title; |
6696 char *title; |
| 6699 PurpleConvIm *im = NULL; |
6697 PurpleConvIm *im = NULL; |
| 6700 PurpleAccount *account = purple_conversation_get_account(conv); |
6698 PurpleAccount *account = purple_conversation_get_account(conv); |
| 6701 PurpleBuddy *buddy = NULL; |
6699 PurpleBuddy *buddy = NULL; |
| 6702 char *markup = NULL; |
6700 char *markup = NULL; |
| 6703 AtkObject *accessibility_obj; |
6701 AtkObject *accessibility_obj; |
| 6704 /* I think this is a little longer than it needs to be but I'm lazy. */ |
6702 /* I think this is a little longer than it needs to be but I'm lazy. */ |
| 6705 char *style; |
6703 char *style; |
| 6706 |
6704 |
| 7557 } |
7555 } |
| 7558 list = list->next; |
7556 list = list->next; |
| 7559 } |
7557 } |
| 7560 } |
7558 } |
| 7561 |
7559 |
| 7562 struct _status_timeout_user { |
|
| 7563 gchar *name; |
|
| 7564 PurpleAccount *account; |
|
| 7565 }; |
|
| 7566 |
|
| 7567 static gboolean |
|
| 7568 update_buddy_status_timeout(struct _status_timeout_user *user) |
|
| 7569 { |
|
| 7570 /* To remove the signing-on/off door icon */ |
|
| 7571 PurpleConversation *conv; |
|
| 7572 |
|
| 7573 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, user->name, user->account); |
|
| 7574 if (conv) |
|
| 7575 pidgin_conv_update_fields(conv, PIDGIN_CONV_TAB_ICON); |
|
| 7576 |
|
| 7577 g_free(user->name); |
|
| 7578 g_free(user); |
|
| 7579 |
|
| 7580 return FALSE; |
|
| 7581 } |
|
| 7582 |
|
| 7583 static void |
7560 static void |
| 7584 update_buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus *newstatus) |
7561 update_buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus *newstatus) |
| 7585 { |
7562 { |
| 7586 PidginConversation *gtkconv; |
7563 PidginConversation *gtkconv; |
| 7587 PurpleConversation *conv; |
7564 PurpleConversation *conv; |
| 7588 struct _status_timeout_user *user; |
|
| 7589 |
7565 |
| 7590 gtkconv = get_gtkconv_with_contact(purple_buddy_get_contact(buddy)); |
7566 gtkconv = get_gtkconv_with_contact(purple_buddy_get_contact(buddy)); |
| 7591 if (gtkconv) |
7567 if (gtkconv) |
| 7592 { |
7568 { |
| 7593 conv = gtkconv->active_conv; |
7569 conv = gtkconv->active_conv; |
| 7595 | PIDGIN_CONV_COLORIZE_TITLE |
7571 | PIDGIN_CONV_COLORIZE_TITLE |
| 7596 | PIDGIN_CONV_BUDDY_ICON); |
7572 | PIDGIN_CONV_BUDDY_ICON); |
| 7597 if ((purple_status_is_online(old) ^ purple_status_is_online(newstatus)) != 0) |
7573 if ((purple_status_is_online(old) ^ purple_status_is_online(newstatus)) != 0) |
| 7598 pidgin_conv_update_fields(conv, PIDGIN_CONV_MENU); |
7574 pidgin_conv_update_fields(conv, PIDGIN_CONV_MENU); |
| 7599 } |
7575 } |
| 7600 |
|
| 7601 user = g_malloc(sizeof(struct _status_timeout_user)); |
|
| 7602 user->name = g_strdup(buddy->name); |
|
| 7603 user->account = buddy->account; |
|
| 7604 |
|
| 7605 /* In case a conversation is started after the buddy has signed-on/off */ |
|
| 7606 purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, user); |
|
| 7607 } |
7576 } |
| 7608 |
7577 |
| 7609 static void |
7578 static void |
| 7610 update_buddy_privacy_changed(PurpleBuddy *buddy) |
7579 update_buddy_privacy_changed(PurpleBuddy *buddy) |
| 7611 { |
7580 { |
| 9146 create_icon_lists(GtkWidget *w) |
9115 create_icon_lists(GtkWidget *w) |
| 9147 { |
9116 { |
| 9148 available_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AVAILABLE, w); |
9117 available_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AVAILABLE, w); |
| 9149 busy_list = make_status_icon_list(PIDGIN_STOCK_STATUS_BUSY, w); |
9118 busy_list = make_status_icon_list(PIDGIN_STOCK_STATUS_BUSY, w); |
| 9150 xa_list = make_status_icon_list(PIDGIN_STOCK_STATUS_XA, w); |
9119 xa_list = make_status_icon_list(PIDGIN_STOCK_STATUS_XA, w); |
| 9151 login_list = make_status_icon_list(PIDGIN_STOCK_STATUS_LOGIN, w); |
|
| 9152 logout_list = make_status_icon_list(PIDGIN_STOCK_STATUS_LOGOUT, w); |
|
| 9153 offline_list = make_status_icon_list(PIDGIN_STOCK_STATUS_OFFLINE, w); |
9120 offline_list = make_status_icon_list(PIDGIN_STOCK_STATUS_OFFLINE, w); |
| 9154 away_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AWAY, w); |
9121 away_list = make_status_icon_list(PIDGIN_STOCK_STATUS_AWAY, w); |
| 9155 prpl_lists = g_hash_table_new(g_str_hash, g_str_equal); |
9122 prpl_lists = g_hash_table_new(g_str_hash, g_str_equal); |
| 9156 } |
9123 } |
| 9157 |
9124 |