From 5bc6003bd66d6223b6243d0589f5963c2b29ae56 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Dec 20 2019 14:58:37 +0000 Subject: gtk3: lamps --- diff --git a/c/gtk3/lamps/lamps.c b/c/gtk3/lamps/lamps.c new file mode 100644 index 0000000..693a093 --- /dev/null +++ b/c/gtk3/lamps/lamps.c @@ -0,0 +1,90 @@ +#include +#include +#include + +#define ROWS 4 +#define COLS 4 + +const double pi = 3.141592653589793; + +const int diameter = 40; + +int board[ROWS][COLS]; +GtkWidget *drawing_area; + + +void turn(int r, int c) { + board[r][c] = !board[r][c]; + if (c > 0) board[r][c - 1] = !board[r][c - 1]; + if (c < COLS - 1) board[r][c + 1] = !board[r][c + 1]; + if (r > 0) board[r - 1][c] = !board[r - 1][c]; + if (r < ROWS - 1) board[r + 1][c] = !board[r + 1][c]; + gtk_widget_queue_draw(drawing_area); +} + +gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer data) { + cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 1); + cairo_paint(cr); + for(int r = 0; r < ROWS; ++r) { + for(int c = 0; c < COLS; ++c) { + if (board[r][c]) { + cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0); + } else { + cairo_set_source_rgba(cr, 1.0, 1.0, 0.0, 1.0); + } + cairo_arc(cr, (c + 0.5)*diameter, (r + 0.5)*diameter, 0.5*diameter, 0.0, 2.0*pi); + cairo_fill_preserve(cr); + cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); + cairo_stroke(cr); + } + } + return TRUE; +} + +gboolean button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { + int c = (int)(event->x)/diameter; + int r = (int)(event->y)/diameter; + if (r >= 0 && c >= 0 && r < ROWS && c < COLS) + turn(r, c); + return TRUE; +} + +void clicked(GtkButton *button, gpointer data) { + for(int i = 0; i < ROWS*COLS*10; ++i) { + int r = rand() % ROWS; + int c = rand() % COLS; + turn(r, c); + } +} + +void activate(GtkApplication* app, gpointer data) { + srand(time(NULL)); + + GtkWidget *window = gtk_application_window_new (app); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); + gtk_container_add(GTK_CONTAINER(window), hbox); + + drawing_area = gtk_drawing_area_new(); + gtk_widget_set_size_request(GTK_WIDGET(drawing_area), COLS*diameter, ROWS*diameter); + gtk_widget_set_hexpand(drawing_area, TRUE); + gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK); + g_signal_connect(drawing_area, "draw", G_CALLBACK(draw), NULL); + g_signal_connect(drawing_area, "button-press-event", G_CALLBACK(button_press), NULL); + gtk_container_add(GTK_CONTAINER(hbox), drawing_area); + + GtkWidget *button = gtk_button_new_with_label("Randomize"); + gtk_widget_set_valign(button, GTK_ALIGN_START); + g_signal_connect(button, "clicked", G_CALLBACK(clicked), NULL); + gtk_container_add(GTK_CONTAINER(hbox), button); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *application = gtk_application_new(NULL, 0); + g_signal_connect(application, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(application), argc, argv); + g_object_unref(application); + return status; +}