diff --git a/app/actions/dashboard-commands.c b/app/actions/dashboard-commands.c index 1f35d1ac93..c1112aa941 100644 --- a/app/actions/dashboard-commands.c +++ b/app/actions/dashboard-commands.c @@ -212,9 +212,24 @@ dashboard_log_record_cmd_callback (GimpAction *action, G_CALLBACK (gimp_toggle_button_update), &info->params.backtrace); + toggle = gtk_check_button_new_with_mnemonic (_("_Messages")); + gimp_help_set_help_data (toggle, + _("Include diagnostic messages in log"), + NULL); + gtk_box_pack_start (GTK_BOX (hbox), toggle, FALSE, FALSE, 0); + gtk_widget_show (toggle); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), + info->params.messages); + + g_signal_connect (toggle, "toggled", + G_CALLBACK (gimp_toggle_button_update), + &info->params.messages); + toggle = gtk_check_button_new_with_mnemonic (_("Progressi_ve")); - gimp_help_set_help_data (toggle, _("Produce complete log " - "even if not properly terminated"), + gimp_help_set_help_data (toggle, + _("Produce complete log " + "even if not properly terminated"), NULL); gtk_box_pack_start (GTK_BOX (hbox), toggle, FALSE, FALSE, 0); gtk_widget_show (toggle); diff --git a/app/widgets/gimpdashboard.c b/app/widgets/gimpdashboard.c index 2bde88fd61..bc98f3cbd8 100644 --- a/app/widgets/gimpdashboard.c +++ b/app/widgets/gimpdashboard.c @@ -81,6 +81,7 @@ #include "gimpwindowstrategy.h" #include "gimp-intl.h" +#include "gimp-log.h" #include "gimp-version.h" @@ -99,6 +100,7 @@ #define LOG_SAMPLE_FREQUENCY_MAX 1000 /* samples per second */ #define LOG_DEFAULT_SAMPLE_FREQUENCY 10 /* samples per second */ #define LOG_DEFAULT_BACKTRACE TRUE +#define LOG_DEFAULT_MESSAGES TRUE #define LOG_DEFAULT_PROGRESSIVE FALSE @@ -323,6 +325,7 @@ struct _GimpDashboardPrivate VariableData log_variables[N_VARIABLES]; GimpBacktrace *log_backtrace; GHashTable *log_addresses; + GimpLogHandler log_log_handler; GimpHighlightableButton *log_record_button; GtkLabel *log_add_marker_label; @@ -437,7 +440,10 @@ static gboolean gimp_dashboard_log_print_escaped (GimpDashboard const gchar *string); static gint64 gimp_dashboard_log_time (GimpDashboard *dashboard); static void gimp_dashboard_log_sample (GimpDashboard *dashboard, - gboolean variables_changed); + gboolean variables_changed, + gboolean include_current_thread); +static void gimp_dashboard_log_add_marker_unlocked (GimpDashboard *dashboard, + const gchar *description); static void gimp_dashboard_log_update_highlight (GimpDashboard *dashboard); static void gimp_dashboard_log_update_n_markers (GimpDashboard *dashboard); @@ -447,6 +453,10 @@ static void gimp_dashboard_log_write_address_map (GimpDashboard GimpAsync *async); static void gimp_dashboard_log_write_global_address_map (GimpAsync *async, GimpDashboard *dashboard); +static void gimp_dashboard_log_log_func (const gchar *log_domain, + GLogLevelFlags log_levels, + const gchar *message, + GimpDashboard *dashboard); static gboolean gimp_dashboard_field_use_meter_underlay (Group group, gint field); @@ -1815,7 +1825,7 @@ gimp_dashboard_sample (GimpDashboard *dashboard) /* log sample */ if (priv->log_output) - gimp_dashboard_log_sample (dashboard, variables_changed); + gimp_dashboard_log_sample (dashboard, variables_changed, FALSE); /* update gui */ if (priv->update_now || @@ -3557,7 +3567,8 @@ gimp_dashboard_log_time (GimpDashboard *dashboard) static void gimp_dashboard_log_sample (GimpDashboard *dashboard, - gboolean variables_changed) + gboolean variables_changed, + gboolean include_current_thread) { GimpDashboardPrivate *priv = dashboard->priv; GimpBacktrace *backtrace = NULL; @@ -3694,7 +3705,7 @@ gimp_dashboard_log_sample (GimpDashboard *dashboard, } if (priv->log_params.backtrace) - backtrace = gimp_backtrace_new (FALSE); + backtrace = gimp_backtrace_new (include_current_thread); if (backtrace) { @@ -3952,6 +3963,38 @@ gimp_dashboard_log_sample (GimpDashboard *dashboard, priv->log_n_samples++; } +static void +gimp_dashboard_log_add_marker_unlocked (GimpDashboard *dashboard, + const gchar *description) +{ + GimpDashboardPrivate *priv = dashboard->priv; + + priv->log_n_markers++; + + gimp_dashboard_log_printf (dashboard, + "\n" + "log_n_markers, + (long long) gimp_dashboard_log_time (dashboard)); + + if (description && description[0]) + { + gimp_dashboard_log_printf (dashboard, + ">\n"); + gimp_dashboard_log_print_escaped (dashboard, description); + gimp_dashboard_log_printf (dashboard, + "\n" + "\n"); + } + else + { + gimp_dashboard_log_printf (dashboard, + " />\n"); + } + + gimp_dashboard_log_update_n_markers (dashboard); +} + static void gimp_dashboard_log_update_highlight (GimpDashboard *dashboard) { @@ -4191,6 +4234,40 @@ gimp_dashboard_log_write_global_address_map (GimpAsync *async, gimp_async_finish (async, NULL); } +static void +gimp_dashboard_log_log_func (const gchar *log_domain, + GLogLevelFlags log_levels, + const gchar *message, + GimpDashboard *dashboard) +{ + GimpDashboardPrivate *priv = dashboard->priv; + const gchar *log_level = NULL; + gchar *description; + + g_mutex_lock (&priv->mutex); + + switch (log_levels & G_LOG_LEVEL_MASK) + { + case G_LOG_LEVEL_ERROR: log_level = "ERROR"; break; + case G_LOG_LEVEL_CRITICAL: log_level = "CRITICAL"; break; + case G_LOG_LEVEL_WARNING: log_level = "WARNING"; break; + case G_LOG_LEVEL_MESSAGE: log_level = "MESSAGE"; break; + case G_LOG_LEVEL_INFO: log_level = "INFO"; break; + case G_LOG_LEVEL_DEBUG: log_level = "DEBUG"; break; + default: log_level = "UNKNOWN"; break; + } + + description = g_strdup_printf ("[%s] %s: %s", log_domain, log_level, message); + + gimp_dashboard_log_add_marker_unlocked (dashboard, description); + + gimp_dashboard_log_sample (dashboard, FALSE, TRUE); + + g_free (description); + + g_mutex_unlock (&priv->mutex); +} + static gboolean gimp_dashboard_field_use_meter_underlay (Group group, gint field) @@ -4374,6 +4451,12 @@ gimp_dashboard_log_start_recording (GimpDashboard *dashboard, atoi (g_getenv ("GIMP_PERFORMANCE_LOG_BACKTRACE")) ? 1 : 0; } + if (g_getenv ("GIMP_PERFORMANCE_LOG_MESSAGES")) + { + priv->log_params.messages = + atoi (g_getenv ("GIMP_PERFORMANCE_LOG_MESSAGES")) ? 1 : 0; + } + if (g_getenv ("GIMP_PERFORMANCE_LOG_PROGRESSIVE")) { priv->log_params.progressive = @@ -4428,10 +4511,12 @@ gimp_dashboard_log_start_recording (GimpDashboard *dashboard, "\n" "%d\n" "%d\n" + "%d\n" "%d\n" "\n", priv->log_params.sample_frequency, has_backtrace, + priv->log_params.messages, priv->log_params.progressive); gimp_dashboard_log_printf (dashboard, @@ -4599,6 +4684,15 @@ gimp_dashboard_log_start_recording (GimpDashboard *dashboard, gimp_dashboard_reset_unlocked (dashboard); + if (priv->log_params.messages) + { + priv->log_log_handler = gimp_log_set_handler ( + TRUE, + G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, + (GLogFunc) gimp_dashboard_log_log_func, + dashboard); + } + priv->update_now = TRUE; g_cond_signal (&priv->cond); @@ -4635,6 +4729,13 @@ gimp_dashboard_log_stop_recording (GimpDashboard *dashboard, g_mutex_lock (&priv->mutex); + if (priv->log_log_handler) + { + gimp_log_remove_handler (priv->log_log_handler); + + priv->log_log_handler = 0; + } + gimp_dashboard_log_printf (dashboard, "\n" "\n"); @@ -4720,6 +4821,7 @@ gimp_dashboard_log_get_default_params (GimpDashboard *dashboard) { .sample_frequency = LOG_DEFAULT_SAMPLE_FREQUENCY, .backtrace = LOG_DEFAULT_BACKTRACE, + .messages = LOG_DEFAULT_MESSAGES, .progressive = LOG_DEFAULT_PROGRESSIVE }; @@ -4741,32 +4843,9 @@ gimp_dashboard_log_add_marker (GimpDashboard *dashboard, g_mutex_lock (&priv->mutex); - priv->log_n_markers++; - - gimp_dashboard_log_printf (dashboard, - "\n" - "log_n_markers, - (long long) gimp_dashboard_log_time (dashboard)); - - if (description && description[0]) - { - gimp_dashboard_log_printf (dashboard, - ">\n"); - gimp_dashboard_log_print_escaped (dashboard, description); - gimp_dashboard_log_printf (dashboard, - "\n" - "\n"); - } - else - { - gimp_dashboard_log_printf (dashboard, - " />\n"); - } + gimp_dashboard_log_add_marker_unlocked (dashboard, description); g_mutex_unlock (&priv->mutex); - - gimp_dashboard_log_update_n_markers (dashboard); } void diff --git a/app/widgets/gimpdashboard.h b/app/widgets/gimpdashboard.h index 136b39e86e..5d8a73f63c 100644 --- a/app/widgets/gimpdashboard.h +++ b/app/widgets/gimpdashboard.h @@ -29,6 +29,7 @@ struct _GimpDashboardLogParams { gint sample_frequency; gboolean backtrace; + gboolean messages; gboolean progressive; };