mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 06:00:22 +00:00
8c68050af8
Add a test that takes four copies of the widget-factory widgets and scrolls them around to test how smoothly we can scroll and draw.
127 lines
3.5 KiB
C
127 lines
3.5 KiB
C
/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
|
|
|
|
#include <gtk/gtk.h>
|
|
#include <math.h>
|
|
|
|
#include "frame-stats.h"
|
|
|
|
GtkWidget *
|
|
create_widget_factory_content (void)
|
|
{
|
|
GError *error = NULL;
|
|
GtkBuilder *builder;
|
|
GtkWidget *result;
|
|
|
|
builder = gtk_builder_new ();
|
|
gtk_builder_add_from_file (builder,
|
|
"../demos/widget-factory/widget-factory.ui",
|
|
&error);
|
|
if (error != NULL)
|
|
g_error ("Failed to create widgets: %s\n", error->message);
|
|
|
|
result = GTK_WIDGET (gtk_builder_get_object (builder, "box1"));
|
|
g_object_ref (result);
|
|
gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (result)),
|
|
result);
|
|
g_object_unref (builder);
|
|
|
|
return result;
|
|
}
|
|
|
|
static void
|
|
set_adjustment_to_fraction (GtkAdjustment *adjustment,
|
|
gdouble fraction)
|
|
{
|
|
gdouble upper = gtk_adjustment_get_upper (adjustment);
|
|
gdouble lower = gtk_adjustment_get_lower (adjustment);
|
|
gdouble page_size = gtk_adjustment_get_page_size (adjustment);
|
|
|
|
gtk_adjustment_set_value (adjustment,
|
|
(1 - fraction) * lower +
|
|
fraction * (upper - page_size));
|
|
}
|
|
|
|
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);
|
|
gdouble 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 }
|
|
};
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
GtkWidget *window;
|
|
GtkWidget *scrolled_window;
|
|
GtkWidget *viewport;
|
|
GtkWidget *grid;
|
|
GError *error = NULL;
|
|
int i;
|
|
|
|
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));
|
|
g_option_context_add_group (context,
|
|
gtk_get_option_group (TRUE));
|
|
|
|
if (!g_option_context_parse (context, &argc, &argv, &error))
|
|
{
|
|
g_printerr ("Option parsing failed: %s\n", error->message);
|
|
return 1;
|
|
}
|
|
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
frame_stats_ensure (GTK_WINDOW (window));
|
|
gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
|
|
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_add (GTK_CONTAINER (window), scrolled_window);
|
|
|
|
viewport = gtk_viewport_new (NULL, NULL);
|
|
gtk_container_add (GTK_CONTAINER (scrolled_window), viewport);
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_container_add (GTK_CONTAINER (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_widget_show_all (window);
|
|
g_signal_connect (window, "destroy",
|
|
G_CALLBACK (gtk_main_quit), NULL);
|
|
gtk_main ();
|
|
|
|
return 0;
|
|
}
|