/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * cairo_test.c */ #include #include #include #include #include #include #define UI_STRING " \ \ \ \ False \ center \ 450 \ 450 \ \ \ \ True \ False \ vertical \ 5 \ \ \ \ \ \ True \ True \ False \ \ \ \ True \ True \ 1 \ \ \ \ \ True \ False \ 5 \ start \ \ \ Draw \ True \ True \ True \ \ \ \ False \ True \ 0 \ \ \ \ \ \ \ \ \ \ \ False \ True \ 2 \ \ \ \ \ \ " /* * Da builder - variabile globale */ GtkBuilder *builder; float thick = 1.0; /* Called when the window is closed */ G_MODULE_EXPORT void on_window_destroy(GtkWidget *self, gpointer data) { gtk_main_quit(); } void draw_me(GtkWidget *self, cairo_t *cr) { GdkRGBA rosa, bianco, nero, rosso; gint width, height; gdouble dash[] = {10.0, 10.0}; rosa.red = 1; rosa.green = 0.2; rosa.blue = 0.2; rosa.alpha = 0.6; rosso.red = 1; rosso.green = 0; rosso.blue = 0; rosso.alpha = 0.6; bianco.red = 1; bianco.green = 1; bianco.blue = 1; bianco.alpha = 1; nero.red = 0; nero.green = 0; nero.blue = 0; nero.alpha = 1; //cairo_set_source_rgba(cr, 1, 0.2, 0.2, 0.6); gdk_cairo_set_source_rgba(cr, &rosa); cairo_set_line_width(cr, thick); cairo_set_dash(cr, dash, 2, 0); gdk_window_set_background_rgba(gtk_widget_get_window(self), &bianco); cairo_move_to(cr, 128.0, 25.6); cairo_line_to(cr, 230.4, 230.4); cairo_stroke(cr); gdk_cairo_set_source_rgba(cr, &rosso); cairo_set_dash(cr, dash, 0, 0); cairo_move_to(cr, 230.4, 230.4); cairo_rel_line_to(cr, -102.4, 0.0); cairo_rel_line_to(cr, 100, 100); cairo_stroke(cr); gdk_cairo_set_source_rgba(cr, &nero); cairo_move_to(cr, 250, 250); cairo_set_font_size(cr, 16.0); cairo_show_text(cr, "A ciccio"); gdk_window_get_geometry(gtk_widget_get_window(self), NULL, NULL, &width, &height); cairo_rectangle(cr, 0, 0, width, height); cairo_stroke(cr); } /** @fn on_btnQuit_clicked(GtkButton *, gpointer) * Callback collegata al pulsante "Quit". */ G_MODULE_EXPORT void on_btnDraw_clicked(GtkButton *self, gpointer data) { GtkWidget *da; cairo_rectangle_int_t rec; g_print("drawing...\n"); if (thick < 10.0) { thick *= 1.5; } else { thick = 1.0; } da = GTK_WIDGET(gtk_builder_get_object(builder, "window")); rec.x = 0; rec.y = 0; gdk_window_get_geometry(gtk_widget_get_window(da), NULL, NULL, &(rec.width), &(rec.height)); gdk_window_invalidate_rect(gtk_widget_get_window(da), &rec, TRUE); } G_MODULE_EXPORT gboolean on_daCairo_draw(GtkWidget *self, cairo_t *cr, gpointer data) { g_print("draw+"); /* all drawing actions are performed by this function */ draw_me(self, cr); return FALSE; } static GtkWidget *create_window(void) { GtkWidget *window; GError *error = NULL; /* * Load UI from file */ builder = gtk_builder_new(); //if (!gtk_builder_add_from_file(builder, "./cairo_test.ui", &error)) if (!gtk_builder_add_from_string(builder, UI_STRING, -1, &error)) { g_critical("Couldn't load builder file: %s", error->message); g_error_free(error); } /* * Get the window object from the ui file */ window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); if (!window) { g_critical("Widget \"%s\" is missing in file %s.", "window", "./cairo_test.ui"); } /* * Auto-connect signal handlers */ gtk_builder_connect_signals(builder, window); return window; } int main(int argc, char *argv[]) { GtkWidget *window; /* * Prima di invocare il main loop, imposto il locale * di default ("C", per leggere i float con il punto) */ setlocale(/*LC_NUMERIC*/1, "C"); gtk_disable_setlocale(); gtk_init(&argc, &argv); window = create_window(); gtk_widget_show(window); gtk_main(); g_object_unref(builder); return 0; }