001: /*
002:  *  main.c
003:  *  Bloboids
004:  *
005:  *  Created by ashley on 09/11/2009.
006:  *  Copyright __MyCompanyName__ 2009. All rights reserved.
007:  */
008: 
009: #include <gtk/gtk.h>
010: #include <math.h>
011: 
012: struct _doodahs {
013:         GRand *rand;
014:         GtkWidget *entry;
015: };
016: typedef struct _doodahs doodahs;
017: 
018: static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
019: {
020:         doodahs *user = (doodahs *)data;
021:         GRand *rand = user->rand;
022:         
023:         GtkWidget *entry = user->entry;
024:         const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
025: /*      g_print("%s\n", text); */
026:         gint n;
027:         sscanf(text, "%d", &n);
028:         
029:         cairo_t *cr;
030: 
031:     GdkWindow *window = gtk_widget_get_parent_window(widget);
032:         int width, height;
033:         gdk_drawable_get_size(GDK_WINDOW(window), &width, &height);
034:   
035: /*      g_print("expose_event: %d %d\n", width, height); */
036:         
037:         cr = gdk_cairo_create(widget->window);
038:         
039:         cairo_set_source_rgb (cr, 0.25, 0.0, 0.10);
040:         cairo_paint(cr);
041: 
042:         int i;
043:         for(i=0; i<n; i++) {
044:                 gint shape = g_rand_int_range(rand, 0, 2);
045:         
046:                 double r = g_rand_double(rand);
047:                 double g = g_rand_double(rand);
048:                 double b = g_rand_double(rand);
049:                 
050:                 double xc = width*g_rand_double(rand);
051:                 double yc = height*g_rand_double(rand);
052:                 cairo_set_source_rgb(cr, r, g, b);
053:                                 
054:                 switch (shape) {
055:                 case 0:
056: //                      g_print("Circle\n");
057:                         {
058:                                 double radius = 10.0*(1.0 + g_rand_double(rand));
059:                                 
060:                                 cairo_arc(cr, xc, yc, radius, 0, 2 * M_PI);
061:                                 cairo_fill(cr);
062:                         }
063:                         break;
064:                 case 1:
065: //                      g_print("Rectangle\n");
066:                         {
067:                                 double width = 20.0*(1.0 + g_rand_double(rand));
068:                                 double height = 10.0*(1.0 + g_rand_double(rand));
069:                                 cairo_rectangle(cr, xc, yc, width, height);
070:                                 cairo_fill(cr);
071:                         }
072:                         break;
073:                 }
074:                 
075:                 
076:         }
077:         
078:         cairo_destroy(cr);
079:         
080:         return FALSE;
081: }
082: 
083: static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
084: {
085: /*      g_print("button_press_event at (%g, %g)\n", event->x, event->y); */
086:         gtk_widget_queue_draw(widget);
087:         
088:         return FALSE;
089: }
090: 
091: static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
092: {
093: /*      g_print("Delete event.\n"); */
094:         doodahs *user = (doodahs *)data;
095:         GRand *rand = user->rand;
096:         g_rand_free(rand);
097: 
098:     gtk_main_quit();
099:         
100:     return FALSE;
101: }
102: 
103: static void redraw_callback(GtkWidget *widget, gpointer data)
104: {
105: /*    g_print ("Hello\n"); */
106:         GtkWidget *drawing_area = (GtkWidget *)data;
107:         gtk_widget_queue_draw(drawing_area);
108: } 
109: 
110: static void quit_callback(GtkWidget *widget, gpointer data)
111: {
112: /*    g_print ("Hello\n"); */
113:         delete_event(widget, NULL, data);
114: } 
115: 
116: int main(int argc, char **argv)
117: {
118:         GRand *rand;
119: 
120:     GtkWidget *window;
121: 
122:     gtk_init(&argc, &argv);
123:         
124:         rand = g_rand_new();
125:         doodahs userdata;
126:         userdata.rand = rand;
127: 
128:     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
129:         gtk_window_set_title(GTK_WINDOW(window), "Draw");
130:         gtk_window_set_default_size(GTK_WINDOW(window), 600, 450);
131:         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
132: 
133:         GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
134:         gtk_container_add(GTK_CONTAINER (window), vbox); 
135:         
136:         GtkWidget *drawing_area = gtk_drawing_area_new();
137:         gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK);
138:         gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
139:         
140:         GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
141:         
142:         GtkWidget *button = gtk_button_new_with_label("Redraw");
143:         g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(redraw_callback), drawing_area);
144:         gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); 
145:         
146:         GtkWidget *label = gtk_label_new(" Number of blobs: ");
147:         gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 
148:         
149:         GtkWidget *entry = gtk_entry_new();
150:         userdata.entry = entry;
151:         gtk_entry_set_text(GTK_ENTRY(entry), "50");
152:         gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); 
153:         
154:         button = gtk_button_new_with_label("Quit");
155:         g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(quit_callback), &userdata);
156:         gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); 
157:         
158:         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);        
159:         
160:         g_signal_connect(G_OBJECT(drawing_area), "expose_event", G_CALLBACK(expose_event), &userdata);
161:         g_signal_connect(window, "button_press_event", G_CALLBACK(button_press_event), &userdata);
162:         g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), &userdata);
163:         
164:     gtk_widget_show_all(window);
165: 
166:     gtk_main();
167: 
168:     return 0;
169: }