| 81 |
81 |
| 82 static GHashTable *log_viewers = NULL; |
82 static GHashTable *log_viewers = NULL; |
| 83 static void populate_log_tree(PidginLogViewer *lv); |
83 static void populate_log_tree(PidginLogViewer *lv); |
| 84 static PidginLogViewer *syslog_viewer = NULL; |
84 static PidginLogViewer *syslog_viewer = NULL; |
| 85 |
85 |
| 86 struct log_viewer_hash_t { |
86 struct log_viewer_hash { |
| 87 PurpleLogType type; |
87 PurpleLogType type; |
| 88 char *buddyname; |
88 char *buddyname; |
| 89 PurpleAccount *account; |
89 PurpleAccount *account; |
| 90 PurpleContact *contact; |
90 PurpleContact *contact; |
| 91 }; |
91 }; |
| 92 |
92 |
| 93 static guint log_viewer_hash(gconstpointer data) |
93 static guint log_viewer_hash(gconstpointer data) |
| 94 { |
94 { |
| 95 const struct log_viewer_hash_t *viewer = data; |
95 const struct log_viewer_hash *viewer = data; |
| 96 |
96 |
| 97 if (viewer->contact != NULL) |
97 if (viewer->contact != NULL) |
| 98 return g_direct_hash(viewer->contact); |
98 return g_direct_hash(viewer->contact); |
| 99 |
99 |
| 100 return g_str_hash(viewer->buddyname) + |
100 return g_str_hash(viewer->buddyname) + |
| 101 g_str_hash(purple_account_get_username(viewer->account)); |
101 g_str_hash(purple_account_get_username(viewer->account)); |
| 102 } |
102 } |
| 103 |
103 |
| 104 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
104 static gboolean log_viewer_equal(gconstpointer y, gconstpointer z) |
| 105 { |
105 { |
| 106 const struct log_viewer_hash_t *a, *b; |
106 const struct log_viewer_hash *a, *b; |
| 107 int ret; |
107 int ret; |
| 108 char *normal; |
108 char *normal; |
| 109 |
109 |
| 110 a = y; |
110 a = y; |
| 111 b = z; |
111 b = z; |
| 215 |
215 |
| 216 select_first_log(lv); |
216 select_first_log(lv); |
| 217 pidgin_clear_cursor(GTK_WIDGET(lv)); |
217 pidgin_clear_cursor(GTK_WIDGET(lv)); |
| 218 } |
218 } |
| 219 |
219 |
| 220 static void destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash_t *ht) { |
220 static void |
| |
221 destroy_cb(GtkWidget *w, gint resp, struct log_viewer_hash *ht) |
| |
222 { |
| 221 PidginLogViewer *lv = syslog_viewer; |
223 PidginLogViewer *lv = syslog_viewer; |
| 222 |
224 |
| 223 #ifdef _WIN32 |
225 #ifdef _WIN32 |
| 224 if (resp == GTK_RESPONSE_HELP) { |
226 if (resp == GTK_RESPONSE_HELP) { |
| 225 GtkTreeSelection *sel; |
227 GtkTreeSelection *sel; |
| 580 g_date_time_unref(dt); |
582 g_date_time_unref(dt); |
| 581 logs = logs->next; |
583 logs = logs->next; |
| 582 } |
584 } |
| 583 } |
585 } |
| 584 |
586 |
| 585 static PidginLogViewer *display_log_viewer(struct log_viewer_hash_t *ht, GList *logs, |
587 static PidginLogViewer * |
| 586 const char *title, GtkWidget *icon, int log_size) |
588 display_log_viewer(struct log_viewer_hash *ht, GList *logs, const char *title, |
| |
589 GtkWidget *icon, int log_size) |
| 587 { |
590 { |
| 588 PidginLogViewer *lv; |
591 PidginLogViewer *lv; |
| 589 |
592 |
| 590 if (logs == NULL) |
593 if (logs == NULL) |
| 591 { |
594 { |
| 716 /**************************************************************************** |
719 /**************************************************************************** |
| 717 * Public API |
720 * Public API |
| 718 ****************************************************************************/ |
721 ****************************************************************************/ |
| 719 |
722 |
| 720 void pidgin_log_show(PurpleLogType type, const char *buddyname, PurpleAccount *account) { |
723 void pidgin_log_show(PurpleLogType type, const char *buddyname, PurpleAccount *account) { |
| 721 struct log_viewer_hash_t *ht; |
724 struct log_viewer_hash *ht; |
| 722 PidginLogViewer *lv = NULL; |
725 PidginLogViewer *lv = NULL; |
| 723 const char *name = buddyname; |
726 const char *name = buddyname; |
| 724 char *title; |
727 char *title; |
| 725 GdkPixbuf *protocol_icon; |
728 GdkPixbuf *protocol_icon; |
| 726 |
729 |
| 727 g_return_if_fail(account != NULL); |
730 g_return_if_fail(account != NULL); |
| 728 g_return_if_fail(buddyname != NULL); |
731 g_return_if_fail(buddyname != NULL); |
| 729 |
732 |
| 730 ht = g_new0(struct log_viewer_hash_t, 1); |
733 ht = g_new0(struct log_viewer_hash, 1); |
| 731 |
734 |
| 732 ht->type = type; |
735 ht->type = type; |
| 733 ht->buddyname = g_strdup(buddyname); |
736 ht->buddyname = g_strdup(buddyname); |
| 734 ht->account = account; |
737 ht->account = account; |
| 735 |
738 |
| 770 g_object_unref(protocol_icon); |
773 g_object_unref(protocol_icon); |
| 771 g_free(title); |
774 g_free(title); |
| 772 } |
775 } |
| 773 |
776 |
| 774 void pidgin_log_show_contact(PurpleContact *contact) { |
777 void pidgin_log_show_contact(PurpleContact *contact) { |
| 775 struct log_viewer_hash_t *ht; |
778 struct log_viewer_hash *ht; |
| 776 PurpleBlistNode *child; |
779 PurpleBlistNode *child; |
| 777 PidginLogViewer *lv = NULL; |
780 PidginLogViewer *lv = NULL; |
| 778 GList *logs = NULL; |
781 GList *logs = NULL; |
| 779 GdkPixbuf *pixbuf; |
782 GdkPixbuf *pixbuf; |
| 780 GtkWidget *image; |
783 GtkWidget *image; |
| 782 char *title; |
785 char *title; |
| 783 int total_log_size = 0; |
786 int total_log_size = 0; |
| 784 |
787 |
| 785 g_return_if_fail(contact != NULL); |
788 g_return_if_fail(contact != NULL); |
| 786 |
789 |
| 787 ht = g_new0(struct log_viewer_hash_t, 1); |
790 ht = g_new0(struct log_viewer_hash, 1); |
| 788 ht->type = PURPLE_LOG_IM; |
791 ht->type = PURPLE_LOG_IM; |
| 789 ht->contact = contact; |
792 ht->contact = contact; |
| 790 |
793 |
| 791 if (log_viewers == NULL) { |
794 if (log_viewers == NULL) { |
| 792 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); |
795 log_viewers = g_hash_table_new(log_viewer_hash, log_viewer_equal); |