1 #include <stdlib.h>
2 #include <goocanvas.h>
3 
4 cairo_pattern_t *flower_pattern;
5 gdouble flower_width, flower_height;
6 
7 
8 static gboolean
on_motion_notify(GooCanvasItem * item,GooCanvasItem * target,GdkEventMotion * event,gpointer data)9 on_motion_notify (GooCanvasItem *item,
10 		  GooCanvasItem *target,
11 		  GdkEventMotion *event,
12 		  gpointer data)
13 {
14   gchar *id = g_object_get_data (G_OBJECT (item), "id");
15 
16   g_print ("%s item received 'motion-notify' signal\n", id ? id : "Unknown");
17 
18   return FALSE;
19 }
20 
21 
22 static void
setup_canvas(GtkWidget * canvas,GtkUnit units,gchar * units_name)23 setup_canvas (GtkWidget *canvas,
24 	      GtkUnit    units,
25 	      gchar     *units_name)
26 {
27   GooCanvasItem *root, *item;
28   gchar buffer[256], font_desc[64];
29   double *d;
30   double data[4][12] = {
31     /* Pixels */
32     { 100, 100, 200, 20, 10,
33       200, 310, 24,
34       310, 100, 20, 20
35     },
36 
37     /* Points */
38     { 100, 100, 200, 20, 10,
39       200, 310, 24,
40       310, 100, 20, 20
41     },
42 
43     /* Inches */
44     { 1, 1, 3, 0.5, 0.16,
45       3, 4, 0.3,
46       4.2, 1, 0.5, 0.5
47     },
48 
49     /* MM */
50     { 30, 30, 100, 10, 5,
51       80, 60, 10,
52       135, 30, 10, 10
53     }
54   };
55 
56   d = data[units];
57 
58   root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
59 
60   item = goo_canvas_rect_new (root, d[0], d[1], d[2], d[3],
61 			      NULL);
62   g_signal_connect (item, "motion_notify_event",
63 		    G_CALLBACK (on_motion_notify), NULL);
64 
65   sprintf (buffer, "This box is %gx%g %s", d[2], d[3], units_name);
66   sprintf (font_desc, "Sans %gpx", d[4]);
67   item = goo_canvas_text_new (root, buffer, d[0] + d[2] / 2, d[1] + d[3] / 2,
68 			      -1, GOO_CANVAS_ANCHOR_CENTER,
69 			      "font", font_desc,
70 			      NULL);
71 
72 
73   sprintf (buffer, "This font is %g %s high", d[7], units_name);
74   sprintf (font_desc, "Sans %gpx", d[7]);
75   item = goo_canvas_text_new (root, buffer, d[5], d[6], -1,
76 			      GOO_CANVAS_ANCHOR_CENTER,
77 			      "font", font_desc,
78 			      NULL);
79 
80   item = goo_canvas_image_new (root, NULL, d[8], d[9],
81 			       "pattern", flower_pattern,
82 			       "width", d[10],
83 			       "height", d[11],
84 			       "scale-to-fit", TRUE,
85 			       NULL);
86 }
87 
88 
89 static void
zoom_changed(GtkAdjustment * adj,GooCanvas * canvas)90 zoom_changed (GtkAdjustment *adj, GooCanvas *canvas)
91 {
92   goo_canvas_set_scale (canvas, gtk_adjustment_get_value (adj));
93 }
94 
95 
96 GtkWidget *
create_canvas(GtkUnit units,gchar * units_name)97 create_canvas (GtkUnit         units,
98 	       gchar          *units_name)
99 {
100   GtkWidget *vbox, *hbox, *w, *scrolled_win, *canvas;
101   GtkAdjustment *adj;
102 
103   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
104   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
105   gtk_widget_show (vbox);
106 
107   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
108   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
109   gtk_widget_show (hbox);
110 
111   canvas = goo_canvas_new ();
112 
113   w = gtk_label_new ("Zoom:");
114   gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
115   gtk_widget_show (w);
116 
117   adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.05, 100.00, 0.05, 0.50, 0.50));
118   w = gtk_spin_button_new (adj, 0.0, 2);
119   g_signal_connect (adj, "value_changed",
120 		    G_CALLBACK (zoom_changed),
121 		    canvas);
122   gtk_widget_set_size_request (w, 50, -1);
123   gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
124   gtk_widget_show (w);
125 
126   scrolled_win = gtk_scrolled_window_new (NULL, NULL);
127   gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
128   gtk_widget_show (scrolled_win);
129 
130   /* Create the canvas. */
131   gtk_widget_set_size_request (canvas, 600, 450);
132   setup_canvas (canvas, units, units_name);
133 
134   goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
135   g_object_set (canvas,
136 		"units", units,
137 		"anchor", GOO_CANVAS_ANCHOR_CENTER,
138 		NULL);
139 
140   gtk_widget_show (canvas);
141   gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
142 
143   return vbox;
144 }
145 
146 
147 static gboolean
on_delete_event(GtkWidget * window,GdkEvent * event,gpointer unused_data)148 on_delete_event (GtkWidget *window,
149 		 GdkEvent  *event,
150 		 gpointer   unused_data)
151 {
152   gtk_main_quit ();
153   return FALSE;
154 }
155 
156 
157 int
main(int argc,char * argv[])158 main (int argc, char *argv[])
159 {
160   GtkWidget *window, *notebook;
161   cairo_surface_t *surface;
162 
163   gtk_init (&argc, &argv);
164 
165   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
166   gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
167   gtk_widget_show (window);
168   g_signal_connect (window, "delete_event", G_CALLBACK (on_delete_event),
169 		    NULL);
170 
171   notebook = gtk_notebook_new ();
172   gtk_widget_show (notebook);
173   gtk_container_add (GTK_CONTAINER (window), notebook);
174 
175   surface = cairo_image_surface_create_from_png ("flower.png");
176   flower_width = cairo_image_surface_get_width (surface);
177   flower_height = cairo_image_surface_get_height (surface);
178   flower_pattern = cairo_pattern_create_for_surface (surface);
179   cairo_surface_destroy (surface);
180 
181   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
182 			    create_canvas (GTK_UNIT_PIXEL, "pixels"),
183 			    gtk_label_new ("Pixels"));
184 
185   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
186 			    create_canvas (GTK_UNIT_POINTS, "points"),
187 			    gtk_label_new ("Points"));
188 
189   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
190 			    create_canvas (GTK_UNIT_INCH, "inches"),
191 			    gtk_label_new ("Inches"));
192 
193   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
194 			    create_canvas (GTK_UNIT_MM, "millimeters"),
195 			    gtk_label_new ("Millimeters"));
196 
197   gtk_main ();
198 
199   return 0;
200 }
201 
202 
203