summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-07-07 11:37:24 +0200
committerTimm Bäder <mail@baedert.org>2018-07-08 09:41:15 +0200
commitdbf32933bff50eda20684c4248ac158b76ec8b79 (patch)
tree0f7cd676b35b800eeff02615e79f3b0027ebcea7
parentaf8fe182c85611b35b953ffd05d65f4bdf05cc3c (diff)
downloadgtk+-dbf32933bff50eda20684c4248ac158b76ec8b79.tar.gz
main: Don't look at first GTK_DISPLAY_DEBUG_CHECK parameter...
... if none of the debug displays have any debug flags set. This way, we can ignore the first parameter to e.g. GTK_DISPLAY_NOTE, which is usually a call to gtk_widget_get_display. Before this patch, gtk_widget_get_display was the slowest part of gtk_widget_query_size_for_orientation.
-rw-r--r--gtk/gtkmain.c15
-rw-r--r--gtk/gtkprivate.h3
2 files changed, 17 insertions, 1 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 3377ee3742..56ab6167d1 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -152,6 +152,11 @@ typedef struct {
#define N_DEBUG_DISPLAYS 4
DisplayDebugFlags debug_flags[N_DEBUG_DISPLAYS];
+/* This is a flag to speed up development builds. We set it to TRUE when
+ * any of the debug displays has debug flags >0, but we never set it back
+ * to FALSE. This way we don't need to call gtk_widget_get_display() in
+ * hot paths. */
+gboolean any_display_debug_flags_set = FALSE;
#ifdef G_ENABLE_DEBUG
static const GDebugKey gtk_debug_keys[] = {
@@ -603,6 +608,7 @@ do_pre_parse_initialization (void)
debug_flags[0].flags = g_parse_debug_string (env_string,
gtk_debug_keys,
G_N_ELEMENTS (gtk_debug_keys));
+ any_display_debug_flags_set = debug_flags[0].flags > 0;
env_string = NULL;
}
#endif /* G_ENABLE_DEBUG */
@@ -688,6 +694,12 @@ gtk_get_display_debug_flags (GdkDisplay *display)
return 0;
}
+gboolean
+gtk_get_any_display_debug_flag_set (void)
+{
+ return any_display_debug_flags_set;
+}
+
void
gtk_set_display_debug_flags (GdkDisplay *display,
guint flags)
@@ -702,6 +714,9 @@ gtk_set_display_debug_flags (GdkDisplay *display,
if (debug_flags[i].display == display)
{
debug_flags[i].flags = flags;
+ if (flags > 0)
+ any_display_debug_flags_set = TRUE;
+
return;
}
}
diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
index 981e515010..3ecb4c36b7 100644
--- a/gtk/gtkprivate.h
+++ b/gtk/gtkprivate.h
@@ -120,10 +120,11 @@ gboolean gtk_simulate_touchscreen (void);
void gtk_set_display_debug_flags (GdkDisplay *display,
guint flags);
guint gtk_get_display_debug_flags (GdkDisplay *display);
+gboolean gtk_get_any_display_debug_flag_set (void);
#ifdef G_ENABLE_DEBUG
-#define GTK_DISPLAY_DEBUG_CHECK(display,type) G_UNLIKELY (gtk_get_display_debug_flags (display) & GTK_DEBUG_##type)
+#define GTK_DISPLAY_DEBUG_CHECK(display,type) (gtk_get_any_display_debug_flag_set () && G_UNLIKELY (gtk_get_display_debug_flags (display) & GTK_DEBUG_##type))
#define GTK_DISPLAY_NOTE(display,type,action) \
G_STMT_START { \
if (GTK_DISPLAY_DEBUG_CHECK (display,type)) { action; }; \