pidgin/pidgindebug.c

changeset 41267
330cfcc1404d
parent 41250
e82d07ed6862
child 41275
3c11bbd93e97
equal deleted inserted replaced
41266:64805b295a5c 41267:330cfcc1404d
67 gboolean invert; 67 gboolean invert;
68 gboolean highlight; 68 gboolean highlight;
69 GRegex *regex; 69 GRegex *regex;
70 }; 70 };
71 71
72 typedef struct {
73 GDateTime *timestamp;
74 PurpleDebugLevel level;
75 gchar *domain;
76 gchar *message;
77 } PidginDebugMessage;
78
72 static gboolean debug_print_enabled = FALSE; 79 static gboolean debug_print_enabled = FALSE;
73 static PidginDebugWindow *debug_win = NULL; 80 static PidginDebugWindow *debug_win = NULL;
74 static guint debug_enabled_timer = 0; 81 static guint debug_enabled_timer = 0;
75 82
76 G_DEFINE_TYPE(PidginDebugWindow, pidgin_debug_window, GTK_TYPE_WINDOW); 83 G_DEFINE_TYPE(PidginDebugWindow, pidgin_debug_window, GTK_TYPE_WINDOW);
680 { 687 {
681 debug_enabled_timer = g_timeout_add(0, debug_enabled_timeout_cb, 688 debug_enabled_timer = g_timeout_add(0, debug_enabled_timeout_cb,
682 (gpointer)value); 689 (gpointer)value);
683 } 690 }
684 691
685 static GLogWriterOutput 692 static gboolean
686 pidgin_debug_g_log_handler(GLogLevelFlags log_level, const GLogField *fields, 693 pidgin_debug_g_log_handler_cb(gpointer data)
687 gsize n_fields, G_GNUC_UNUSED gpointer user_data) 694 {
688 { 695 PidginDebugMessage *message = data;
689 const gchar *domain = NULL;
690 const gchar *arg_s = NULL;
691 GtkTextTag *level_tag = NULL; 696 GtkTextTag *level_tag = NULL;
692 GDateTime *local_date_time = NULL;
693 gchar *local_time = NULL; 697 gchar *local_time = NULL;
694 GtkTextIter end; 698 GtkTextIter end;
695 gboolean scroll; 699 gboolean scroll;
696 gsize i;
697 700
698 if (debug_win == NULL || 701 if (debug_win == NULL ||
699 !purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled")) { 702 !purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/debug/enabled")) {
700 if (debug_print_enabled) { 703 /* The Debug Window may have been closed/disabled after the thread that
701 return g_log_writer_default(log_level, fields, n_fields, user_data); 704 * sent this message. */
702 } else { 705 g_date_time_unref(message->timestamp);
703 return G_LOG_WRITER_UNHANDLED; 706 g_free(message->domain);
704 } 707 g_free(message->message);
705 } 708 g_free(message);
706 709 return FALSE;
707 for (i = 0; i < n_fields; i++) {
708 if (purple_strequal(fields[i].key, "GLIB_DOMAIN")) {
709 domain = fields[i].value;
710 } else if (purple_strequal(fields[i].key, "MESSAGE")) {
711 arg_s = fields[i].value;
712 }
713 }
714
715 if((log_level & G_LOG_LEVEL_ERROR) != 0) {
716 level_tag = debug_win->tags.level[PURPLE_DEBUG_ERROR];
717 } else if((log_level & G_LOG_LEVEL_CRITICAL) != 0) {
718 level_tag = debug_win->tags.level[PURPLE_DEBUG_FATAL];
719 } else if((log_level & G_LOG_LEVEL_WARNING) != 0) {
720 level_tag = debug_win->tags.level[PURPLE_DEBUG_WARNING];
721 } else if((log_level & G_LOG_LEVEL_MESSAGE) != 0) {
722 level_tag = debug_win->tags.level[PURPLE_DEBUG_INFO];
723 } else if((log_level & G_LOG_LEVEL_INFO) != 0) {
724 level_tag = debug_win->tags.level[PURPLE_DEBUG_INFO];
725 } else if((log_level & G_LOG_LEVEL_DEBUG) != 0) {
726 level_tag = debug_win->tags.level[PURPLE_DEBUG_MISC];
727 } else {
728 level_tag = debug_win->tags.level[PURPLE_DEBUG_MISC];
729 } 710 }
730 711
731 scroll = view_near_bottom(debug_win); 712 scroll = view_near_bottom(debug_win);
732 gtk_text_buffer_get_end_iter(debug_win->buffer, &end); 713 gtk_text_buffer_get_end_iter(debug_win->buffer, &end);
733 gtk_text_buffer_move_mark(debug_win->buffer, debug_win->start_mark, &end); 714 gtk_text_buffer_move_mark(debug_win->buffer, debug_win->start_mark, &end);
734 715
735 local_date_time = g_date_time_new_now_local(); 716 level_tag = debug_win->tags.level[message->level];
736 local_time = g_date_time_format(local_date_time, "(%H:%M:%S) "); 717 local_time = g_date_time_format(message->timestamp, "(%H:%M:%S) ");
737 g_date_time_unref(local_date_time);
738 718
739 gtk_text_buffer_insert_with_tags( 719 gtk_text_buffer_insert_with_tags(
740 debug_win->buffer, 720 debug_win->buffer,
741 &end, 721 &end,
742 local_time, 722 local_time,
743 -1, 723 -1,
744 level_tag, 724 level_tag,
745 debug_win->paused ? debug_win->tags.paused : NULL, 725 debug_win->paused ? debug_win->tags.paused : NULL,
746 NULL); 726 NULL);
747 727
748 g_free(local_time); 728 if (message->domain != NULL && *message->domain != '\0') {
749
750 if (domain != NULL && *domain != '\0') {
751 gtk_text_buffer_insert_with_tags( 729 gtk_text_buffer_insert_with_tags(
752 debug_win->buffer, 730 debug_win->buffer,
753 &end, 731 &end,
754 domain, 732 message->domain,
755 -1, 733 -1,
756 level_tag, 734 level_tag,
757 debug_win->tags.category, 735 debug_win->tags.category,
758 debug_win->paused ? debug_win->tags.paused : NULL, 736 debug_win->paused ? debug_win->tags.paused : NULL,
759 NULL); 737 NULL);
769 } 747 }
770 748
771 gtk_text_buffer_insert_with_tags( 749 gtk_text_buffer_insert_with_tags(
772 debug_win->buffer, 750 debug_win->buffer,
773 &end, 751 &end,
774 arg_s, 752 message->message,
775 -1, 753 -1,
776 level_tag, 754 level_tag,
777 debug_win->paused ? debug_win->tags.paused : NULL, 755 debug_win->paused ? debug_win->tags.paused : NULL,
778 NULL); 756 NULL);
779 gtk_text_buffer_insert_with_tags( 757 gtk_text_buffer_insert_with_tags(
802 gtk_text_view_scroll_to_mark( 780 gtk_text_view_scroll_to_mark(
803 GTK_TEXT_VIEW(debug_win->textview), 781 GTK_TEXT_VIEW(debug_win->textview),
804 debug_win->end_mark, 0, TRUE, 0, 1); 782 debug_win->end_mark, 0, TRUE, 0, 1);
805 } 783 }
806 784
785 g_free(local_time);
786 g_date_time_unref(message->timestamp);
787 g_free(message->domain);
788 g_free(message->message);
789 g_free(message);
790
791 return FALSE;
792 }
793
794 static GLogWriterOutput
795 pidgin_debug_g_log_handler(GLogLevelFlags log_level, const GLogField *fields,
796 gsize n_fields, G_GNUC_UNUSED gpointer user_data)
797 {
798 PidginDebugMessage *message = NULL;
799 gsize i;
800
801 if (debug_win == NULL) {
802 if (debug_print_enabled) {
803 return g_log_writer_default(log_level, fields, n_fields, user_data);
804 } else {
805 return G_LOG_WRITER_UNHANDLED;
806 }
807 }
808
809 message = g_new0(PidginDebugMessage, 1);
810 message->timestamp = g_date_time_new_now_local();
811
812 for (i = 0; i < n_fields; i++) {
813 if (purple_strequal(fields[i].key, "GLIB_DOMAIN")) {
814 message->domain = g_strdup(fields[i].value);
815 } else if (purple_strequal(fields[i].key, "MESSAGE")) {
816 message->message = g_strdup(fields[i].value);
817 }
818 }
819
820 if((log_level & G_LOG_LEVEL_ERROR) != 0) {
821 message->level = PURPLE_DEBUG_ERROR;
822 } else if((log_level & G_LOG_LEVEL_CRITICAL) != 0) {
823 message->level = PURPLE_DEBUG_FATAL;
824 } else if((log_level & G_LOG_LEVEL_WARNING) != 0) {
825 message->level = PURPLE_DEBUG_WARNING;
826 } else if((log_level & G_LOG_LEVEL_MESSAGE) != 0) {
827 message->level = PURPLE_DEBUG_INFO;
828 } else if((log_level & G_LOG_LEVEL_INFO) != 0) {
829 message->level = PURPLE_DEBUG_INFO;
830 } else if((log_level & G_LOG_LEVEL_DEBUG) != 0) {
831 message->level = PURPLE_DEBUG_MISC;
832 } else {
833 message->level = PURPLE_DEBUG_MISC;
834 }
835
836 g_timeout_add(0, pidgin_debug_g_log_handler_cb, message);
837
807 if (debug_print_enabled) { 838 if (debug_print_enabled) {
808 return g_log_writer_default(log_level, fields, n_fields, user_data); 839 return g_log_writer_default(log_level, fields, n_fields, user_data);
809 } else { 840 } else {
810 return G_LOG_WRITER_HANDLED; 841 return G_LOG_WRITER_HANDLED;
811 } 842 }

mercurial