diff options
author | Timm Bäder <mail@baedert.org> | 2018-07-07 11:37:24 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2018-07-08 09:41:15 +0200 |
commit | dbf32933bff50eda20684c4248ac158b76ec8b79 (patch) | |
tree | 0f7cd676b35b800eeff02615e79f3b0027ebcea7 | |
parent | af8fe182c85611b35b953ffd05d65f4bdf05cc3c (diff) | |
download | gtk+-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.c | 15 | ||||
-rw-r--r-- | gtk/gtkprivate.h | 3 |
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; }; \ |