pidgin/gtkconv.c

branch
next.minor
changeset 31565
1138b2c998ec
parent 31322
cdd35d85f754
parent 31440
00da8d0ad9a9
child 31580
026433ae8014
child 32424
be4a642b2d45
equal deleted inserted replaced
31397:b50f1cf05a5e 31565:1138b2c998ec
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

mercurial