[gtk/theme-load] Add a theme loading benchmark
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/theme-load] Add a theme loading benchmark
- Date: Wed, 5 Jun 2019 03:24:44 +0000 (UTC)
commit 97d7f1046f4486cabb404fd7956743b37993db17
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Jun 5 03:23:13 2019 +0000
Add a theme loading benchmark
demos/gtk-demo/demo.gresource.xml | 4 +
demos/gtk-demo/meson.build | 1 +
demos/gtk-demo/themes.c | 139 ++++++++++++++++++++++
demos/gtk-demo/themes.ui | 242 ++++++++++++++++++++++++++++++++++++++
4 files changed, 386 insertions(+)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index a71adcee26..ca8558dc29 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -37,6 +37,9 @@
<gresource prefix="/theming_style_classes">
<file>theming.ui</file>
</gresource>
+ <gresource prefix="/themes">
+ <file>themes.ui</file>
+ </gresource>
<gresource prefix="/css_pixbufs">
<file alias="gtk.css">css_pixbufs.css</file>
<file>cssview.css</file>
@@ -212,6 +215,7 @@
<file>textview.c</file>
<file>textscroll.c</file>
<file>theming_style_classes.c</file>
+ <file>themes.c</file>
<file>transparent.c</file>
<file>tree_store.c</file>
<file>textmask.c</file>
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index aba44c976c..87e5ae4f85 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -70,6 +70,7 @@ demos = files([
'textmask.c',
'textview.c',
'textscroll.c',
+ 'themes.c',
'theming_style_classes.c',
'transparent.c',
'tree_store.c',
diff --git a/demos/gtk-demo/themes.c b/demos/gtk-demo/themes.c
new file mode 100644
index 0000000000..d53afdd30a
--- /dev/null
+++ b/demos/gtk-demo/themes.c
@@ -0,0 +1,139 @@
+/* Benchmark/Themes
+ *
+ * This demo switches themes like a maniac, like some of you.
+ */
+
+#include <gtk/gtk.h>
+
+static guint tick_cb;
+
+static gint64
+guess_refresh_interval (GdkFrameClock *frame_clock)
+{
+ gint64 interval;
+ gint64 i;
+
+ interval = G_MAXINT64;
+
+ for (i = gdk_frame_clock_get_history_start (frame_clock);
+ i < gdk_frame_clock_get_frame_counter (frame_clock);
+ i++)
+ {
+ GdkFrameTimings *t, *before;
+ gint64 ts, before_ts;
+
+ t = gdk_frame_clock_get_timings (frame_clock, i);
+ before = gdk_frame_clock_get_timings (frame_clock, i - 1);
+ if (t == NULL || before == NULL)
+ continue;
+
+ ts = gdk_frame_timings_get_frame_time (t);
+ before_ts = gdk_frame_timings_get_frame_time (before);
+ if (ts == 0 || before_ts == 0)
+ continue;
+
+ interval = MIN (interval, ts - before_ts);
+ }
+
+ if (interval == G_MAXINT64)
+ return 0;
+
+ return interval;
+}
+
+static double
+frame_clock_get_fps (GdkFrameClock *frame_clock)
+{
+ GdkFrameTimings *start, *end;
+ gint64 start_counter, end_counter;
+ gint64 start_timestamp, end_timestamp;
+ gint64 interval;
+
+ start_counter = gdk_frame_clock_get_history_start (frame_clock);
+ end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
+ start = gdk_frame_clock_get_timings (frame_clock, start_counter);
+ for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
+ end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end);
+ end = gdk_frame_clock_get_timings (frame_clock, end_counter))
+ end_counter--;
+ if (end_counter - start_counter < 4)
+ return 0.0;
+
+ start_timestamp = gdk_frame_timings_get_presentation_time (start);
+ end_timestamp = gdk_frame_timings_get_presentation_time (end);
+ if (start_timestamp == 0 || end_timestamp == 0)
+ {
+ start_timestamp = gdk_frame_timings_get_frame_time (start);
+ end_timestamp = gdk_frame_timings_get_frame_time (end);
+ }
+ interval = gdk_frame_timings_get_refresh_interval (end);
+ if (interval == 0)
+ {
+ interval = guess_refresh_interval (frame_clock);
+ if (interval == 0)
+ return 0.0;
+ }
+
+ return ((double) end_counter - start_counter) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
+}
+
+static const char *themes[] = {
+ "Adwaita",
+ "Adwaita-dark",
+ "HighContrast",
+ "HighContrastInverse"
+};
+
+static int theme;
+
+static gboolean
+change_theme (GtkWidget *widget,
+ GdkFrameClock *frame_clock,
+ GtkBuilder *builder)
+{
+ GtkWidget *label;
+ GtkWidget *header;
+ char *fps;
+ const char *next = themes[theme++ % G_N_ELEMENTS (themes)];
+
+ g_object_set (gtk_settings_get_default (), "gtk-theme-name", next, NULL);
+
+ label = gtk_builder_get_object (builder, "fps");
+ fps = g_strdup_printf ("%.2f fps", frame_clock_get_fps (frame_clock));
+ gtk_label_set_label (GTK_LABEL (label), fps);
+ g_free (fps);
+
+ header = gtk_builder_get_object (builder, "header");
+ gtk_header_bar_set_title (GTK_HEADER_BAR (header), next);
+}
+
+GtkWidget *
+do_themes (GtkWidget *do_widget)
+{
+ static GtkWidget *window = NULL;
+
+ if (!window)
+ {
+ GtkBuilder *builder;
+
+ builder = gtk_builder_new_from_resource ("/themes/themes.ui");
+ window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &window);
+ gtk_window_set_display (GTK_WINDOW (window),
+ gtk_widget_get_display (do_widget));
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed), &window);
+
+ tick_cb = gtk_widget_add_tick_callback (window, change_theme, builder, NULL);
+
+ gtk_widget_realize (window);
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show (window);
+ else
+ gtk_widget_destroy (window);
+
+ return window;
+}
diff --git a/demos/gtk-demo/themes.ui b/demos/gtk-demo/themes.ui
new file mode 100644
index 0000000000..f4cc3dc7ea
--- /dev/null
+++ b/demos/gtk-demo/themes.ui
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkWindow" id="window">
+ <property name="resizable">0</property>
+ <child type="titlebar">
+ <object class="GtkHeaderBar" id="header">
+ <property name="show-title-buttons">1</property>
+ <child type="end">
+ <object class="GtkLabel" id="fps">
+ <property name="label">0 fps</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid">
+ <property name="margin">10</property>
+ <property name="row-spacing">10</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkToolbar">
+ <property name="hexpand">1</property>
+ <property name="show-arrow">0</property>
+ <style>
+ <class name="primary-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Normal</property>
+ <property name="use-underline">1</property>
+ <property name="is-important">1</property>
+ <property name="icon-name">edit-find</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Active</property>
+ <property name="use-underline">1</property>
+ <property name="is-important">1</property>
+ <property name="icon-name">edit-find</property>
+ <property name="active">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="sensitive">0</property>
+ <property name="label" translatable="yes">Insensitive</property>
+ <property name="use-underline">1</property>
+ <property name="is-important">1</property>
+ <property name="icon-name">edit-find</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Raised</property>
+ <property name="use-underline">1</property>
+ <property name="is-important">1</property>
+ <property name="icon-name">edit-find</property>
+ <style>
+ <class name="raised"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Raised Active</property>
+ <property name="use-underline">1</property>
+ <property name="is-important">1</property>
+ <property name="icon-name">edit-find</property>
+ <property name="active">1</property>
+ <style>
+ <class name="raised"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="sensitive">0</property>
+ <property name="label" translatable="yes">Insensitive Active</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">edit-find</property>
+ <property name="is-important">1</property>
+ <property name="active">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolItem">
+ <child>
+ <object class="GtkEntry" id="entry1">
+ <property name="can-focus">1</property>
+ <property name="width-chars">10</property>
+ <property name="invisible-char">•</property>
+ <property name="placeholder-text" translatable="yes">Search...</property>
+ <property name="secondary-icon-name">edit-find-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolItem">
+ <child>
+ <object class="GtkSwitch" id="switch1">
+ <property name="can-focus">1</property>
+ <property name="valign">center</property>
+ <property name="tooltip_text">Switch it</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="halign">center</property>
+ <style>
+ <class name="linked"/>
+ </style>
+ <child>
+ <object class="GtkButton">
+ <property name="label" translatable="yes">Hi, I am a button</property>
+ <property name="can-focus">1</property>
+ <property name="receives-default">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="label" translatable="yes">And I'm another button</property>
+ <property name="can-focus">1</property>
+ <property name="receives-default">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="label" translatable="yes">This is a button party!</property>
+ <property name="can-focus">1</property>
+ <property name="receives-default">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolbar">
+ <property name="hexpand">1</property>
+ <property name="toolbar-style">icons</property>
+ <style>
+ <class name="inline-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Normal</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">list-add-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Normal</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">list-add-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Active</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">list-remove-symbolic</property>
+ <property name="active">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="label" translatable="yes">Active</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">list-remove-symbolic</property>
+ <property name="active">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="sensitive">0</property>
+ <property name="label" translatable="yes">Insensitive</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">edit-find-symbolic</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton">
+ <property name="homogeneous">1</property>
+ <property name="sensitive">0</property>
+ <property name="label" translatable="yes">Insensitive Active</property>
+ <property name="use-underline">1</property>
+ <property name="icon-name">go-up-symbolic</property>
+ <property name="active">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkButton">
+ <property name="label">Plain</property>
+ <property name="halign">end</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="label">Destructive</property>
+ <style>
+ <class name="destructive-action"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="label">Suggested</property>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]