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 | |
20 | static GType my_text_view_get_type (void); |
21 | G_DEFINE_TYPE (MyTextView, my_text_view, GTK_TYPE_TEXT_VIEW) |
22 | |
23 | static void |
24 | my_text_view_init (MyTextView *tv) {} |
25 | |
26 | static void |
27 | my_text_view_class_init (MyTextViewClass *tv_class) {} |
28 | |
29 | |
30 | |
31 | static GtkWidget * |
32 | create_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 | |
52 | static void |
53 | set_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 | |
65 | static gboolean |
66 | scroll_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 | |
89 | static GOptionEntry options[] = { |
90 | { NULL } |
91 | }; |
92 | |
93 | static void |
94 | quit_cb (GtkWidget *widget, |
95 | gpointer data) |
96 | { |
97 | gboolean *done = data; |
98 | |
99 | *done = TRUE; |
100 | |
101 | g_main_context_wakeup (NULL); |
102 | } |
103 | |
104 | int |
105 | main (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 | |