1/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
2
3#include <gtk/gtk.h>
4#include <math.h>
5
6#include "frame-stats.h"
7
8
9/* Stub definition of MyTextView which is used in the
10 * widget-factory.ui file. We just need this so the
11 * test keeps working
12 */
13typedef struct
14{
15 GtkTextView tv;
16} MyTextView;
17
18typedef GtkTextViewClass MyTextViewClass;
19
20static GType my_text_view_get_type (void);
21G_DEFINE_TYPE (MyTextView, my_text_view, GTK_TYPE_TEXT_VIEW)
22
23static void
24my_text_view_init (MyTextView *tv) {}
25
26static void
27my_text_view_class_init (MyTextViewClass *tv_class) {}
28
29
30
31static GtkWidget *
32create_widget_factory_content (void)
33{
34 GError *error = NULL;
35 GtkBuilder *builder;
36 GtkWidget *result;
37
38 g_type_ensure (type: my_text_view_get_type ());
39 builder = gtk_builder_new ();
40 gtk_builder_add_from_file (builder, filename: "./testsuite/gtk/focus-chain/widget-factory.ui", error: &error);
41 if (error != NULL)
42 g_error ("Failed to create widgets: %s", error->message);
43
44 result = GTK_WIDGET (gtk_builder_get_object (builder, "box1"));
45 g_object_ref (result);
46 gtk_window_set_child (GTK_WINDOW (gtk_widget_get_parent (result)), NULL);
47 g_object_unref (object: builder);
48
49 return result;
50}
51
52static void
53set_adjustment_to_fraction (GtkAdjustment *adjustment,
54 double fraction)
55{
56 double upper = gtk_adjustment_get_upper (adjustment);
57 double lower = gtk_adjustment_get_lower (adjustment);
58 double page_size = gtk_adjustment_get_page_size (adjustment);
59
60 gtk_adjustment_set_value (adjustment,
61 value: (1 - fraction) * lower +
62 fraction * (upper - page_size));
63}
64
65static gboolean
66scroll_viewport (GtkWidget *viewport,
67 GdkFrameClock *frame_clock,
68 gpointer user_data)
69{
70 static gint64 start_time;
71 gint64 now = gdk_frame_clock_get_frame_time (frame_clock);
72 double elapsed;
73 GtkAdjustment *hadjustment, *vadjustment;
74
75 if (start_time == 0)
76 start_time = now;
77
78 elapsed = (now - start_time) / 1000000.;
79
80 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (viewport));
81 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (viewport));
82
83 set_adjustment_to_fraction (adjustment: hadjustment, fraction: 0.5 + 0.5 * sin (x: elapsed));
84 set_adjustment_to_fraction (adjustment: vadjustment, fraction: 0.5 + 0.5 * cos (x: elapsed));
85
86 return TRUE;
87}
88
89static GOptionEntry options[] = {
90 { NULL }
91};
92
93static void
94quit_cb (GtkWidget *widget,
95 gpointer data)
96{
97 gboolean *done = data;
98
99 *done = TRUE;
100
101 g_main_context_wakeup (NULL);
102}
103
104int
105main (int argc, char **argv)
106{
107 GtkWidget *window;
108 GtkWidget *scrolled_window;
109 GtkWidget *viewport;
110 GtkWidget *grid;
111 GError *error = NULL;
112 int i;
113 gboolean done = FALSE;
114
115 GOptionContext *context = g_option_context_new (NULL);
116 g_option_context_add_main_entries (context, entries: options, NULL);
117 frame_stats_add_options (group: g_option_context_get_main_group (context));
118
119 if (!g_option_context_parse (context, argc: &argc, argv: &argv, error: &error))
120 {
121 g_printerr (format: "Option parsing failed: %s\n", error->message);
122 return 1;
123 }
124
125 gtk_init ();
126
127 window = gtk_window_new ();
128 frame_stats_ensure (GTK_WINDOW (window));
129 gtk_window_set_default_size (GTK_WINDOW (window), width: 800, height: 600);
130
131 scrolled_window = gtk_scrolled_window_new ();
132 gtk_window_set_child (GTK_WINDOW (window), child: scrolled_window);
133
134 viewport = gtk_viewport_new (NULL, NULL);
135 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), child: viewport);
136
137 grid = gtk_grid_new ();
138 gtk_viewport_set_child (GTK_VIEWPORT (viewport), child: grid);
139
140 for (i = 0; i < 4; i++)
141 {
142 GtkWidget *content = create_widget_factory_content ();
143 gtk_grid_attach (GTK_GRID (grid), child: content,
144 column: i % 2, row: i / 2, width: 1, height: 1);
145 g_object_unref (object: content);
146 }
147
148 gtk_widget_add_tick_callback (widget: viewport,
149 callback: scroll_viewport,
150 NULL,
151 NULL);
152
153 gtk_widget_show (widget: window);
154 g_signal_connect (window, "destroy",
155 G_CALLBACK (quit_cb), &done);
156
157 while (!done)
158 g_main_context_iteration (NULL, TRUE);
159
160 return 0;
161}
162

source code of gtk/tests/scrolling-performance.c