Browse code

Start drawing...

Nils Faerber authored on 31/07/2012 19:28:08
Showing 1 changed files
... ...
@@ -14,7 +14,138 @@
14 14
 
15 15
 
16 16
 typedef struct {
17
-	GtkWidget *main_win;
17
+	GtkWidget *mainwin;
18
+	GtkDrawingArea *darea;
19
+	GdkPixmap *pixmap;
18 20
 } oswald_ui;
19 21
 
20 22
 
23
+
24
+void set_pixel(oswald_ui *ui, gint x, gint y, gboolean state)
25
+{
26
+	GdkRectangle update_rect;
27
+	GdkGC *gc;
28
+	gint ix, iy;
29
+
30
+	ix = x*2;
31
+	iy = y*2;
32
+
33
+	update_rect.x = ix - 5;
34
+	update_rect.y = iy - 5;
35
+	update_rect.width = 10;
36
+	update_rect.height = 10;
37
+
38
+	gdk_draw_point(GDK_DRAWABLE(ui->pixmap), state ? ui->mainwin->style->black_gc : ui->mainwin->style->white_gc, ix, iy);
39
+	gdk_draw_point(GDK_DRAWABLE(ui->pixmap), state ? ui->mainwin->style->black_gc : ui->mainwin->style->white_gc, ix+1, iy);
40
+	gdk_draw_point(GDK_DRAWABLE(ui->pixmap), state ? ui->mainwin->style->black_gc : ui->mainwin->style->white_gc, ix, iy+1);
41
+	gdk_draw_point(GDK_DRAWABLE(ui->pixmap), state ? ui->mainwin->style->black_gc : ui->mainwin->style->white_gc, ix+1, iy+1);
42
+
43
+	gtk_widget_draw (GTK_WIDGET(ui->darea), &update_rect);
44
+}
45
+
46
+static gint
47
+configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data)
48
+{
49
+	oswald_ui *ui = (oswald_ui *)user_data;
50
+
51
+	if (ui->pixmap)
52
+		gdk_pixmap_unref(ui->pixmap);
53
+
54
+	ui->pixmap = gdk_pixmap_new(widget->window,
55
+		widget->allocation.width,
56
+		widget->allocation.height,
57
+		-1);
58
+	gdk_draw_rectangle (ui->pixmap,
59
+		widget->style->white_gc,
60
+		TRUE,
61
+		0, 0,
62
+		widget->allocation.width,
63
+		widget->allocation.height);
64
+
65
+	return TRUE;
66
+}
67
+
68
+static gint
69
+expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
70
+{
71
+	oswald_ui *ui = (oswald_ui *)user_data;
72
+
73
+	gdk_draw_pixmap(widget->window,
74
+		widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
75
+		ui->pixmap,
76
+		event->area.x, event->area.y,
77
+		event->area.x, event->area.y,
78
+		event->area.width, event->area.height);
79
+
80
+	return FALSE;
81
+}
82
+
83
+static void create_mainwin(oswald_ui *ui)
84
+{
85
+	GtkWidget *hb, *vb, *btn;
86
+
87
+	ui->pixmap = NULL;
88
+
89
+	ui->mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
90
+	// gtk_window_set_default_size (GTK_WINDOW (ui->mainwin), 440, 240);
91
+	g_signal_connect(G_OBJECT(ui->mainwin), "destroy", gtk_main_quit, NULL);
92
+
93
+	hb = gtk_hbox_new(FALSE, 5);
94
+	gtk_container_add(GTK_CONTAINER(ui->mainwin), hb);
95
+
96
+	vb = gtk_vbox_new(FALSE, 5);
97
+	gtk_box_pack_start (GTK_BOX(hb), vb, FALSE, FALSE, 5);
98
+
99
+	btn = gtk_button_new_with_label("D");
100
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
101
+
102
+	btn = gtk_button_new_with_label("E");
103
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
104
+
105
+	btn = gtk_button_new_with_label("F");
106
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
107
+
108
+	ui->darea = (GtkDrawingArea *)gtk_drawing_area_new ();
109
+	gtk_box_pack_start (GTK_BOX(hb), GTK_WIDGET(ui->darea), FALSE, FALSE, 5);
110
+	gtk_drawing_area_size (ui->darea, 192, 192);
111
+
112
+	gtk_signal_connect (GTK_OBJECT (ui->darea), "expose_event", (GtkSignalFunc) expose_event, ui);
113
+	gtk_signal_connect (GTK_OBJECT (ui->darea), "configure_event", (GtkSignalFunc) configure_event, ui);
114
+	// gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event", (GtkSignalFunc) motion_notify_event, ui);
115
+	// gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event", (GtkSignalFunc) button_press_event, ui);
116
+
117
+	gtk_widget_set_events (GTK_WIDGET(ui->darea), GDK_EXPOSURE_MASK
118
+		| GDK_LEAVE_NOTIFY_MASK
119
+		| GDK_BUTTON_PRESS_MASK
120
+		| GDK_POINTER_MOTION_MASK
121
+		| GDK_POINTER_MOTION_HINT_MASK);
122
+
123
+	vb = gtk_vbox_new(FALSE, 5);
124
+	gtk_box_pack_start (GTK_BOX(hb), vb, FALSE, FALSE, 5);
125
+
126
+	btn = gtk_button_new_with_label("A");
127
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
128
+
129
+	btn = gtk_button_new_with_label("B");
130
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
131
+
132
+	btn = gtk_button_new_with_label("C");
133
+	gtk_box_pack_start (GTK_BOX(vb), btn, FALSE, FALSE, 10);
134
+
135
+	gtk_widget_show_all(ui->mainwin);
136
+}
137
+
138
+int main(int argc , char ** argv)
139
+{
140
+	oswald_ui ui;
141
+
142
+	gtk_init (&argc, &argv);
143
+
144
+	create_mainwin(&ui);
145
+
146
+	set_pixel(&ui, 48, 48, TRUE);
147
+
148
+	gtk_main ();
149
+	return 0;
150
+}
151
+