Learning_GTK4_tree/tests/scrolling-performance.c

162 lines
4.1 KiB
C
Raw Permalink Normal View History

2023-12-12 11:36:42 +01:00
/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include <gtk/gtk.h>
#include <math.h>
#include "frame-stats.h"
/* Stub definition of MyTextView which is used in the
* widget-factory.ui file. We just need this so the
* test keeps working
*/
typedef struct
{
GtkTextView tv;
} MyTextView;
typedef GtkTextViewClass MyTextViewClass;
static GType my_text_view_get_type (void);
G_DEFINE_TYPE (MyTextView, my_text_view, GTK_TYPE_TEXT_VIEW)
static void
my_text_view_init (MyTextView *tv) {}
static void
my_text_view_class_init (MyTextViewClass *tv_class) {}
static GtkWidget *
create_widget_factory_content (void)
{
GError *error = NULL;
GtkBuilder *builder;
GtkWidget *result;
g_type_ensure (my_text_view_get_type ());
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "./testsuite/gtk/focus-chain/widget-factory.ui", &error);
if (error != NULL)
g_error ("Failed to create widgets: %s", error->message);
result = GTK_WIDGET (gtk_builder_get_object (builder, "box1"));
g_object_ref (result);
gtk_window_set_child (GTK_WINDOW (gtk_widget_get_parent (result)), NULL);
g_object_unref (builder);
return result;
}
static void
set_adjustment_to_fraction (GtkAdjustment *adjustment,
double fraction)
{
double upper = gtk_adjustment_get_upper (adjustment);
double lower = gtk_adjustment_get_lower (adjustment);
double page_size = gtk_adjustment_get_page_size (adjustment);
gtk_adjustment_set_value (adjustment,
(1 - fraction) * lower +
fraction * (upper - page_size));
}
static gboolean
scroll_viewport (GtkWidget *viewport,
GdkFrameClock *frame_clock,
gpointer user_data)
{
static gint64 start_time;
gint64 now = gdk_frame_clock_get_frame_time (frame_clock);
double elapsed;
GtkAdjustment *hadjustment, *vadjustment;
if (start_time == 0)
start_time = now;
elapsed = (now - start_time) / 1000000.;
hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (viewport));
vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (viewport));
set_adjustment_to_fraction (hadjustment, 0.5 + 0.5 * sin (elapsed));
set_adjustment_to_fraction (vadjustment, 0.5 + 0.5 * cos (elapsed));
return TRUE;
}
static GOptionEntry options[] = {
{ NULL }
};
static void
quit_cb (GtkWidget *widget,
gpointer data)
{
gboolean *done = data;
*done = TRUE;
g_main_context_wakeup (NULL);
}
int
main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *scrolled_window;
GtkWidget *viewport;
GtkWidget *grid;
GError *error = NULL;
int i;
gboolean done = FALSE;
GOptionContext *context = g_option_context_new (NULL);
g_option_context_add_main_entries (context, options, NULL);
frame_stats_add_options (g_option_context_get_main_group (context));
if (!g_option_context_parse (context, &argc, &argv, &error))
{
g_printerr ("Option parsing failed: %s\n", error->message);
return 1;
}
gtk_init ();
window = gtk_window_new ();
frame_stats_ensure (GTK_WINDOW (window));
gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
scrolled_window = gtk_scrolled_window_new ();
gtk_window_set_child (GTK_WINDOW (window), scrolled_window);
viewport = gtk_viewport_new (NULL, NULL);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), viewport);
grid = gtk_grid_new ();
gtk_viewport_set_child (GTK_VIEWPORT (viewport), grid);
for (i = 0; i < 4; i++)
{
GtkWidget *content = create_widget_factory_content ();
gtk_grid_attach (GTK_GRID (grid), content,
i % 2, i / 2, 1, 1);
g_object_unref (content);
}
gtk_widget_add_tick_callback (viewport,
scroll_viewport,
NULL,
NULL);
gtk_window_present (GTK_WINDOW (window));
g_signal_connect (window, "destroy",
G_CALLBACK (quit_cb), &done);
while (!done)
g_main_context_iteration (NULL, TRUE);
return 0;
}