Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * A simple animation using cairo and GTK+
- *
- * This program shows high /usr/libexec/Xorg load while running full screen on Linux
- *
- * Compile with:
- * gcc `pkg-config --cflags --libs gtk+-3.0` -lm main.c
- */
- #include <gtk/gtk.h>
- #include <math.h>
- #define NUM_WINDOWS (1u)
- #define NUM_POINTS (1000u)
- #define PERIOD (100u)
- /* Local function prototypes */
- static gboolean invalidate_cb(void *);
- static gboolean drawing_area_draw_cb(GtkWidget *, cairo_t *, void *);
- int main(int argc, char **argv)
- {
- int i;
- gtk_init(&argc, &argv);
- for (i = 0; i < NUM_WINDOWS; i++)
- {
- GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(main_window), "Drawing example");
- gtk_window_set_default_size(GTK_WINDOW(main_window), 400, 400);
- GtkWidget *drawing_area = gtk_drawing_area_new();
- gtk_container_add(GTK_CONTAINER(main_window), drawing_area);
- gtk_widget_show_all(main_window);
- /* Create a timer to invalidate our window at 60Hz */
- g_timeout_add(1000 / 60, invalidate_cb, drawing_area);
- /* Connect our redraw callback */
- g_signal_connect(drawing_area, "draw", G_CALLBACK(drawing_area_draw_cb), NULL);
- /* Connect the destroy signal */
- g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
- }
- gtk_main();
- }
- static gboolean invalidate_cb(void *ptr)
- {
- if (GTK_IS_WIDGET(ptr))
- {
- gtk_widget_queue_draw(GTK_WIDGET(ptr));
- return TRUE;
- }
- return FALSE;
- }
- static inline float sine_to_point(int x, int width, int height)
- {
- return (height / 2.0) * sin(x * 2 * M_PI / (PERIOD)) + height / 2.0;
- }
- static gboolean drawing_area_draw_cb(GtkWidget *widget, cairo_t *context, void *ptr)
- {
- static int redraw_number = 0;
- int width, height, i;
- width = gtk_widget_get_allocated_width(widget);
- height = gtk_widget_get_allocated_height(widget);
- /* Draw the background */
- cairo_set_source_rgb(context, 1, 1, 1);
- cairo_rectangle(context, 0, 0, width, height);
- cairo_fill(context);
- /* Draw a moving sine wave */
- cairo_set_source_rgb(context, 0.5, 0.5, 0);
- cairo_move_to(context, 0, sine_to_point(0 + redraw_number, width, height));
- for (i = 1; i < NUM_POINTS; i++)
- {
- cairo_line_to(context, i, sine_to_point(i + redraw_number, width, height));
- }
- cairo_stroke(context);
- redraw_number++;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement