[gtk/popover-state-sync: 1/2] Add a theme loading benchmark



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&apos;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]