[mutter] Allow logging only specific debug topics
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Allow logging only specific debug topics
- Date: Fri, 4 Jun 2010 15:26:49 +0000 (UTC)
commit 343474a570c2302618403576ba2a5388f0acb155
Author: Colin Walters <walters verbum org>
Date: Wed Jun 2 09:26:53 2010 -0400
Allow logging only specific debug topics
While debugging a focus problem, I noticed that Mutter had exactly
the debug statements I wanted under the META_DEBUG_FOCUS topic.
However, calling meta_set_verbose (true) results in enormous amounts
of other messages, and it's inconvenient to filter after having
started mutter.
This patch allows one to call Meta.add_debug_topic(Meta.DebugTopic.FOCUS)
from a console, and get just what one wants.
https://bugzilla.gnome.org/show_bug.cgi?id=620359
src/core/util.c | 104 ++++++++++++++++++++++++++++++++++++---------------
src/include/util.h | 3 +
2 files changed, 76 insertions(+), 31 deletions(-)
---
diff --git a/src/core/util.c b/src/core/util.c
index 6a0d508..5b1ccb1 100644
--- a/src/core/util.c
+++ b/src/core/util.c
@@ -40,6 +40,12 @@
#include <X11/Xlib.h> /* must explicitly be included for Solaris; #326746 */
#include <X11/Xutil.h> /* Just for the definition of the various gravities */
+static void
+meta_topic_real_valist (MetaDebugTopic topic,
+ const char *format,
+ va_list args);
+
+
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
void
@@ -71,7 +77,7 @@ meta_print_backtrace (void)
}
#endif
-static gboolean is_verbose = FALSE;
+static gint verbose_topics = 0;
static gboolean is_debugging = FALSE;
static gboolean replace_current = FALSE;
static int no_prefix = 0;
@@ -128,7 +134,7 @@ ensure_logfile (void)
gboolean
meta_is_verbose (void)
{
- return is_verbose;
+ return verbose_topics != 0;
}
void
@@ -141,8 +147,48 @@ meta_set_verbose (gboolean setting)
if (setting)
ensure_logfile ();
#endif
-
- is_verbose = setting;
+
+ if (setting)
+ meta_add_verbose_topic (META_DEBUG_VERBOSE);
+ else
+ meta_remove_verbose_topic (META_DEBUG_VERBOSE);
+}
+
+/**
+ * meta_add_verbose_topic:
+ * @topic: Topic for which logging will be started
+ *
+ * Ensure log messages for the given topic @topic
+ * will be printed.
+ */
+void
+meta_add_verbose_topic (MetaDebugTopic topic)
+{
+ if (verbose_topics == META_DEBUG_VERBOSE)
+ return;
+ if (topic == META_DEBUG_VERBOSE)
+ verbose_topics = META_DEBUG_VERBOSE;
+ else
+ verbose_topics |= topic;
+}
+
+/**
+ * meta_remove_verbose_topic:
+ * @topic: Topic for which logging will be stopped
+ *
+ * Stop printing log messages for the given topic @topic. Note
+ * that this method does not stack with meta_add_verbose_topic();
+ * i.e. if two calls to meta_add_verbose_topic() for the same
+ * topic are made, one call to meta_remove_verbose_topic() will
+ * remove it.
+ */
+void
+meta_remove_verbose_topic (MetaDebugTopic topic)
+{
+ if (topic == META_DEBUG_VERBOSE)
+ verbose_topics = 0;
+ else
+ verbose_topics &= ~topic;
}
gboolean
@@ -250,27 +296,10 @@ void
meta_verbose_real (const char *format, ...)
{
va_list args;
- gchar *str;
- FILE *out;
- g_return_if_fail (format != NULL);
-
- if (!is_verbose)
- return;
-
va_start (args, format);
- str = g_strdup_vprintf (format, args);
+ meta_topic_real_valist (META_DEBUG_VERBOSE, format, args);
va_end (args);
-
- out = logfile ? logfile : stderr;
-
- if (no_prefix == 0)
- utf8_fputs ("Window manager: ", out);
- utf8_fputs (str, out);
-
- fflush (out);
-
- g_free (str);
}
#endif /* WITH_VERBOSE_MODE */
@@ -324,6 +353,8 @@ topic_name (MetaDebugTopic topic)
return "COMPOSITOR";
case META_DEBUG_EDGE_RESISTANCE:
return "EDGE_RESISTANCE";
+ case META_DEBUG_VERBOSE:
+ return "VERBOSE";
}
return "WM";
@@ -331,23 +362,22 @@ topic_name (MetaDebugTopic topic)
static int sync_count = 0;
-void
-meta_topic_real (MetaDebugTopic topic,
- const char *format,
- ...)
+static void
+meta_topic_real_valist (MetaDebugTopic topic,
+ const char *format,
+ va_list args)
{
- va_list args;
gchar *str;
FILE *out;
g_return_if_fail (format != NULL);
- if (!is_verbose)
+ if (verbose_topics == 0
+ || (topic == META_DEBUG_VERBOSE && verbose_topics != META_DEBUG_VERBOSE)
+ || (!(verbose_topics & topic)))
return;
-
- va_start (args, format);
+
str = g_strdup_vprintf (format, args);
- va_end (args);
out = logfile ? logfile : stderr;
@@ -366,6 +396,18 @@ meta_topic_real (MetaDebugTopic topic,
g_free (str);
}
+
+void
+meta_topic_real (MetaDebugTopic topic,
+ const char *format,
+ ...)
+{
+ va_list args;
+
+ va_start (args, format);
+ meta_topic_real_valist (topic, format, args);
+ va_end (args);
+}
#endif /* WITH_VERBOSE_MODE */
void
diff --git a/src/include/util.h b/src/include/util.h
index d1f5506..595dc30 100644
--- a/src/include/util.h
+++ b/src/include/util.h
@@ -51,6 +51,7 @@ void meta_fatal (const char *format,
typedef enum
{
+ META_DEBUG_VERBOSE = -1,
META_DEBUG_FOCUS = 1 << 0,
META_DEBUG_WORKAREA = 1 << 1,
META_DEBUG_STACK = 1 << 2,
@@ -78,6 +79,8 @@ typedef enum
void meta_topic_real (MetaDebugTopic topic,
const char *format,
...) G_GNUC_PRINTF (2, 3);
+void meta_add_verbose_topic (MetaDebugTopic topic);
+void meta_remove_verbose_topic (MetaDebugTopic topic);
void meta_push_no_msg_prefix (void);
void meta_pop_no_msg_prefix (void);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]