/* * gtkDPS multi context test program by Hideki FUJIMOTO */ #include #include #include "gtkDPS.h" #include #include #include #include static void init_dialog(GtkDPSArea * area1, GtkDPSArea * area2); static void dialog_close_callback (void); static void draw_circle (GtkDPSArea * area); static void draw_line (GtkDPSArea * area); static gboolean with_pixmap; /* * This is callback function. * The data arguments are ignored in this example.. * More on callbacks below. */ static void dialog_close_callback (void) { gtk_main_quit(); } /* * This callback function is to draw a circle. */ static void draw_circle (GtkDPSArea * area) { float i; gtk_dps_widget_begin(area); { for (i = 1.0; i > 0.0; i = i - 0.01) { DPSnewpath(raw_ctxt); DPSarc(raw_ctxt, 150.0, 200.0, i * 50.0, 0.0, 360.0); DPSsetrgbcolor(raw_ctxt, 1.0, i, 1.0); DPSfill(raw_ctxt); } } gtk_dps_widget_end(); if (with_pixmap) gtk_dps_area_map_area_on_screen(GTK_DPS_AREA (area), NULL); } /* * This callback function is to draw a line. */ static void draw_line (GtkDPSArea * area) { gtk_dps_widget_begin(area); { DPSnewpath(raw_ctxt); DPSmoveto(raw_ctxt, 0.0, 0.0); DPSsetrgbcolor(raw_ctxt, 0.0, 0.0, 1.0); DPSlineto(raw_ctxt, 400.0, 400.0); DPSstroke(raw_ctxt); } gtk_dps_widget_end(); if (with_pixmap) gtk_dps_area_map_area_on_screen(GTK_DPS_AREA (area), NULL); } static void init_dialog(GtkDPSArea * area1, GtkDPSArea * area2) { GtkWidget *dialog; GtkWidget *close_button; GtkWidget *button; /* create a new dialog */ dialog = gtk_dialog_new(); /* create a new button with the label "Close". */ close_button = gtk_button_new_with_label("Close"); gtk_signal_connect(GTK_OBJECT(close_button), "clicked", (GtkSignalFunc)dialog_close_callback, NULL); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), close_button, TRUE, TRUE, 0); gtk_widget_show(close_button); /* line 1 */ button = gtk_button_new_with_label("line 1"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", (GtkSignalFunc)draw_line, GTK_OBJECT(area1)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); /* line 2 */ button = gtk_button_new_with_label("line 2"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", (GtkSignalFunc)draw_line, GTK_OBJECT(area2)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); /* circle 1 */ button = gtk_button_new_with_label("circle 1"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", (GtkSignalFunc)draw_circle, GTK_OBJECT(area1)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); /* circle 2 */ button = gtk_button_new_with_label("circle 2"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", (GtkSignalFunc)draw_circle, GTK_OBJECT(area2)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); /* display the dialog */ gtk_widget_show(dialog); } /* * main function */ int main(int argc, char **argv) { /* GtkWidget is the storage type for widgets */ GtkWidget *window1; GtkWidget *window2; GtkWidget * DPS_area1; GtkWidget * DPS_area2; gint i; with_pixmap = FALSE; for (i = 1; i < argc; i++) { if (0 == strcmp (argv[i], "--help")) { const gchar * version = gtk_dps_version(); fprintf (stderr, "Usage: sample2 [OPTION]\n" "gtkDPS multiple contexts sample program.\n" "sample2 is part of gtkDPS version %s\n" "\n" " --help: print this help\n" " --with-pixmap: don't draw screen directly\n" " draw on memory the map to screen\n", version); return 0; } else if (0 == strcmp (argv[i], "--with-pixmap")) with_pixmap = TRUE; } /* * This is called in all GTK applications. Arguments are parsed from * the command line and are returned to the application. */ gtk_init(&argc, &argv); gtk_dps_init(&argc, &argv); /* create a new window */ window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window1), "window 1"); window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window2), "window 2"); /* create a new dps area 1 */ DPS_area1 = gtk_dps_area_new(with_pixmap?1:0); gtk_container_add(GTK_CONTAINER(window1), DPS_area1); gtk_dps_area_size(GTK_DPS_AREA(DPS_area1), 300, 300); gtk_widget_show(DPS_area1); /* create a new dps area 2 */ DPS_area2 = gtk_dps_area_new(with_pixmap?1:0); gtk_container_add(GTK_CONTAINER(window2), DPS_area2); gtk_dps_area_size(GTK_DPS_AREA(DPS_area2), 300, 300); gtk_widget_show(DPS_area2); /* display this window */ gtk_widget_show(window1); gtk_widget_show(window2); init_dialog(GTK_DPS_AREA(DPS_area1), GTK_DPS_AREA(DPS_area2)); gtk_main(); return 0; }