]> git.karo-electronics.de Git - oswald.git/blob - ui/oswald-ui.c
Start drawing...
[oswald.git] / ui / oswald-ui.c
1 #include <stdio.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include <string.h>
8 #include <poll.h>
9 #include <sys/socket.h>
10 #include <sys/un.h>
11 #include <time.h>
12
13 #include <gtk/gtk.h>
14
15
16 typedef struct {
17         GtkWidget *mainwin;
18         GtkDrawingArea *darea;
19         GdkPixmap *pixmap;
20 } oswald_ui;
21
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