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