[gtk/popover-state-sync: 1/2] Add a theme loading benchmark
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/popover-state-sync: 1/2] Add a theme loading benchmark
- Date: Mon, 10 Jun 2019 18:18:15 +0000 (UTC)
commit 4dc456a86ce1f8be445cab600f3ee4ecb6286b5f
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 | 203 ++++++++++++++++++++++++++++++++
demos/gtk-demo/themes.ui | 241 ++++++++++++++++++++++++++++++++++++++
4 files changed, 449 insertions(+)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index 3fac7342eb..2d5a1c5a58 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>
@@ -200,6 +203,7 @@
<file>textscroll.c</file>
<file>theming_style_classes.c</file>
<file>toolpalette.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 82e08973a5..46c9e9b5ec 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -67,6 +67,7 @@ demos = files([
'textmask.c',
'textview.c',
'textscroll.c',
+ 'themes.c',
'theming_style_classes.c',
'toolpalette.c',
'transparent.c',
diff --git a/demos/gtk-demo/themes.c b/demos/gtk-demo/themes.c
new file mode 100644
index 0000000000..bfffc3a69a
--- /dev/null
+++ b/demos/gtk-demo/themes.c
@@ -0,0 +1,203 @@
+/* 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);
+}
+
+typedef struct {
+ const char *name;
+ gboolean dark;
+} Theme;
+
+static Theme themes[] = {
+ { "Adwaita", FALSE },
+ { "Adwaita", TRUE },
+ { "HighContrast", FALSE },
+ { "HighContrastInverse", FALSE }
+};
+
+static int theme;
+
+static gboolean
+change_theme (GtkWidget *widget,
+ GdkFrameClock *frame_clock,
+ gpointer data)
+{
+ GtkBuilder *builder = data;
+ GtkWidget *header;
+ GtkWidget *label;
+ Theme next = themes[theme++ % G_N_ELEMENTS (themes)];
+ char *name;
+
+ g_object_set (gtk_settings_get_default (),
+ "gtk-theme-name", next.name,
+ "gtk-application-prefer-dark-theme", next.dark,
+ NULL);
+
+ header = GTK_WIDGET (gtk_builder_get_object (builder, "header"));
+ name = g_strconcat (next.name, next.dark ? " (dark)" : NULL, NULL);
+ gtk_header_bar_set_title (GTK_HEADER_BAR (header), name);
+ g_free (name);
+
+ label = GTK_WIDGET (gtk_builder_get_object (builder, "fps"));
+ if (frame_clock)
+ {
+ char *fps;
+
+ fps = g_strdup_printf ("%.2f fps", frame_clock_get_fps (frame_clock));
+ gtk_label_set_label (GTK_LABEL (label), fps);
+ g_free (fps);
+ }
+ else
+ gtk_label_set_label (GTK_LABEL (label), "");
+
+ return G_SOURCE_CONTINUE;
+}
+
+static void
+clicked (GtkGestureClick *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer data)
+{
+ GtkWidget *window;
+ const GdkEvent *event;
+ GdkModifierType state;
+
+ window = gtk_widget_get_ancestor (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)),
GTK_TYPE_WINDOW);
+
+ event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), NULL);
+ gdk_event_get_state (event, &state);
+
+ if (state & GDK_CONTROL_MASK)
+ {
+ if (tick_cb)
+ {
+ gtk_widget_remove_tick_callback (window, tick_cb);
+ tick_cb = 0;
+ }
+
+ change_theme (window, NULL, data);
+ }
+ else
+ {
+ if (tick_cb)
+ {
+ gtk_widget_remove_tick_callback (window, tick_cb);
+ tick_cb = 0;
+ }
+ else
+ {
+ tick_cb = gtk_widget_add_tick_callback (window, change_theme, data, NULL);
+ }
+ }
+}
+
+GtkWidget *
+do_themes (GtkWidget *do_widget)
+{
+ static GtkWidget *window = NULL;
+
+ if (!window)
+ {
+ GtkBuilder *builder;
+ GtkWidget *header;
+ GtkGesture *gesture;
+
+ 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);
+ header = GTK_WIDGET (gtk_builder_get_object (builder, "header"));
+ gesture = gtk_gesture_click_new ();
+ g_signal_connect (gesture, "pressed", G_CALLBACK (clicked), builder);
+ gtk_widget_add_controller (header, GTK_EVENT_CONTROLLER (gesture));
+
+ 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..db6f1ebf98
--- /dev/null
+++ b/demos/gtk-demo/themes.ui
@@ -0,0 +1,241 @@
+<?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">
+ </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]