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 */
13 typedef struct
14 {
15 GtkTextView tv;
16 } MyTextView;
17
18 typedef GtkTextViewClass MyTextViewClass;
19
G_DEFINE_TYPE(MyTextView,my_text_view,GTK_TYPE_TEXT_VIEW)20 G_DEFINE_TYPE (MyTextView, my_text_view, GTK_TYPE_TEXT_VIEW)
21
22 static void
23 my_text_view_init (MyTextView *tv) {}
24
25 static void
my_text_view_class_init(MyTextViewClass * tv_class)26 my_text_view_class_init (MyTextViewClass *tv_class) {}
27
28
29
30 GtkWidget *
create_widget_factory_content(void)31 create_widget_factory_content (void)
32 {
33 GError *error = NULL;
34 GtkBuilder *builder;
35 GtkWidget *result;
36
37 g_type_ensure (my_text_view_get_type ());
38 builder = gtk_builder_new ();
39 gtk_builder_add_from_file (builder,
40 "../demos/widget-factory/widget-factory.ui",
41 &error);
42 if (error != NULL)
43 g_error ("Failed to create widgets: %s", error->message);
44
45 result = GTK_WIDGET (gtk_builder_get_object (builder, "box1"));
46 g_object_ref (result);
47 gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (result)),
48 result);
49 g_object_unref (builder);
50
51 return result;
52 }
53
54 static void
set_adjustment_to_fraction(GtkAdjustment * adjustment,gdouble fraction)55 set_adjustment_to_fraction (GtkAdjustment *adjustment,
56 gdouble fraction)
57 {
58 gdouble upper = gtk_adjustment_get_upper (adjustment);
59 gdouble lower = gtk_adjustment_get_lower (adjustment);
60 gdouble page_size = gtk_adjustment_get_page_size (adjustment);
61
62 gtk_adjustment_set_value (adjustment,
63 (1 - fraction) * lower +
64 fraction * (upper - page_size));
65 }
66
67 gboolean
scroll_viewport(GtkWidget * viewport,GdkFrameClock * frame_clock,gpointer user_data)68 scroll_viewport (GtkWidget *viewport,
69 GdkFrameClock *frame_clock,
70 gpointer user_data)
71 {
72 static gint64 start_time;
73 gint64 now = gdk_frame_clock_get_frame_time (frame_clock);
74 gdouble elapsed;
75 GtkAdjustment *hadjustment, *vadjustment;
76
77 if (start_time == 0)
78 start_time = now;
79
80 elapsed = (now - start_time) / 1000000.;
81
82 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (viewport));
83 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (viewport));
84
85 set_adjustment_to_fraction (hadjustment, 0.5 + 0.5 * sin (elapsed));
86 set_adjustment_to_fraction (vadjustment, 0.5 + 0.5 * cos (elapsed));
87
88 return TRUE;
89 }
90
91 static GOptionEntry options[] = {
92 { NULL }
93 };
94
95 int
main(int argc,char ** argv)96 main (int argc, char **argv)
97 {
98 GtkWidget *window;
99 GtkWidget *scrolled_window;
100 GtkWidget *viewport;
101 GtkWidget *grid;
102 GError *error = NULL;
103 int i;
104
105 GOptionContext *context = g_option_context_new (NULL);
106 g_option_context_add_main_entries (context, options, NULL);
107 frame_stats_add_options (g_option_context_get_main_group (context));
108 g_option_context_add_group (context,
109 gtk_get_option_group (TRUE));
110
111 if (!g_option_context_parse (context, &argc, &argv, &error))
112 {
113 g_printerr ("Option parsing failed: %s\n", error->message);
114 return 1;
115 }
116
117 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
118 frame_stats_ensure (GTK_WINDOW (window));
119 gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
120
121 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
122 gtk_container_add (GTK_CONTAINER (window), scrolled_window);
123
124 viewport = gtk_viewport_new (NULL, NULL);
125 gtk_container_add (GTK_CONTAINER (scrolled_window), viewport);
126
127 grid = gtk_grid_new ();
128 gtk_container_add (GTK_CONTAINER (viewport), grid);
129
130 for (i = 0; i < 4; i++)
131 {
132 GtkWidget *content = create_widget_factory_content ();
133 gtk_grid_attach (GTK_GRID (grid), content,
134 i % 2, i / 2, 1, 1);
135 g_object_unref (content);
136 }
137
138 gtk_widget_add_tick_callback (viewport,
139 scroll_viewport,
140 NULL,
141 NULL);
142
143 gtk_widget_show_all (window);
144 g_signal_connect (window, "destroy",
145 G_CALLBACK (gtk_main_quit), NULL);
146 gtk_main ();
147
148 return 0;
149 }
150