blob: 1aa6c8c612bc8b56a258822eb79bcd90c0151dbd [file] [log] [blame]
adamdunkelsee08cc92004-07-04 21:04:13 +00001
2#include "ctk-draw-service.h"
3
4#include "ctk-gtksim-draw.h"
5
6#include "ctk-gtksim.h"
7
8#include <string.h>
9
10
11#define WINDOWBORDER_WIDTH 1
12#define WINDOWBORDER_HEIGHT 1
13#define WINDOWTITLE_HEIGHT 3
14#define MENU_HEIGHT 1
15#define MENUBAR_HEIGHT 12
16
17#define FONT_BASELINE 12
18
19#define MENUBAR_FONT_BASELINE 7
20
21#define RASTER_X 8
22#define RASTER_Y 14
23
24#define BUTTON_HEIGHT 12
25#define BUTTON_X_BORDER 4
26#define BUTTON_Y_BORDER 1
27
28#define TEXTENTRY_HEIGHT 12
29#define TEXTENTRY_X_BORDER 4
30#define TEXTENTRY_Y_BORDER 1
31
32static GdkGC *white, *lightgray, *midgray, *darkgray, *ddarkgray, *black,
33 *blue;
34
35static GdkPixbuf *background, *windowborder, *menubar;
36
37static void
38draw_widget(struct ctk_widget *w,
39 unsigned char winx,
40 unsigned char winy,
41 unsigned char clipx,
42 unsigned char clipy,
43 unsigned char clipy1,
44 unsigned char clipy2,
45 unsigned char focus);
46
47/*--------------------------------------------------------------------------*/
48static void
49s_ctk_draw_init(void)
50{
51 GtkWidget *image;
52
53 image = gtk_image_new_from_file("background.png");
54 background = gtk_image_get_pixbuf(GTK_IMAGE(image));
55
56 image = gtk_image_new_from_file("windowborder.png");
57 windowborder = gtk_image_get_pixbuf(GTK_IMAGE(image));
58
59 image = gtk_image_new_from_file("menubar.png");
60 menubar = gtk_image_get_pixbuf(GTK_IMAGE(image));
61
adamdunkels77b45152004-08-11 21:21:26 +000062 ctk_gtksim_init();
adamdunkelsee08cc92004-07-04 21:04:13 +000063 ctk_gtksim_draw_init();
adamdunkels8a3c5e92004-09-01 20:31:51 +000064
65
66 blue = get_color(0, 0, 0xffff);
67 white = get_color(0xffff, 0xffff, 0xffff);
68 lightgray = get_color(0xefff, 0xefff, 0xefff);
69 midgray = get_color(0xdfff, 0xdfff, 0xdfff);
70 darkgray = get_color(0xcfff, 0xcfff, 0xcfff);
71 ddarkgray = get_color(0xafff, 0xafff, 0xafff);
72 black = get_color(0, 0, 0);
73
74
adamdunkelsee08cc92004-07-04 21:04:13 +000075}
76/*--------------------------------------------------------------------------*/
77static void
78s_ctk_draw_clear(unsigned char y1, unsigned char y2)
79{
80 if(background == NULL) {
81 gdk_draw_rectangle(ctk_gtksim_pixmap,
82 darkgray,
83 TRUE,
84 0,
85 y1 * RASTER_Y + MENUBAR_HEIGHT,
86 CTK_GTKSIM_SCREEN_WIDTH,
87 (y2 - y1) * RASTER_Y);
88 } else {
89 gdk_draw_pixbuf(ctk_gtksim_pixmap,
90 darkgray,
91 background,
92 0,
93 y1 * RASTER_Y,
94 0,
95 y1 * RASTER_Y + MENUBAR_HEIGHT,
96 CTK_GTKSIM_SCREEN_WIDTH,
97 (y2 - y1) * RASTER_Y,
adamdunkels77b45152004-08-11 21:21:26 +000098 GDK_RGB_DITHER_NONE, 0, 0);
adamdunkelsee08cc92004-07-04 21:04:13 +000099 }
100}
101/*--------------------------------------------------------------------------*/
102static void
103s_ctk_draw_clear_window(struct ctk_window *window,
104 unsigned char focus,
105 unsigned char clipy1,
106 unsigned char clipy2)
107{
108 int x, y;
109
110 x = window->x;
111 y = window->y + MENU_HEIGHT;
112
113 /* Clear window */
oliverschmidta4609462004-12-27 22:05:20 +0000114 if(focus & CTK_FOCUS_WINDOW) {
adamdunkelsee08cc92004-07-04 21:04:13 +0000115 gdk_draw_rectangle(ctk_gtksim_pixmap,
116 white,
117 TRUE,
118 x * RASTER_X - 1,
119 y * RASTER_Y - 1 + MENUBAR_HEIGHT,
120 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X + 2,
121 (window->h + WINDOWTITLE_HEIGHT +
122 WINDOWBORDER_HEIGHT) * RASTER_Y + 2);
123 } else {
124 gdk_draw_rectangle(ctk_gtksim_pixmap,
125 lightgray,
126 TRUE,
127 x * RASTER_X - 1,
128 y * RASTER_Y - 1 + MENUBAR_HEIGHT,
129 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X + 2,
130 (window->h + WINDOWTITLE_HEIGHT +
131 WINDOWBORDER_HEIGHT) * RASTER_Y + 2);
132 }
133}
134/*--------------------------------------------------------------------------*/
135static void
136s_ctk_draw_window(struct ctk_window *window,
137 unsigned char focus,
138 unsigned char clipy1,
oliverschmidt01e9ffd2005-03-15 15:57:28 +0000139 unsigned char clipy2,
140 unsigned char draw_borders)
adamdunkelsee08cc92004-07-04 21:04:13 +0000141{
142 struct ctk_widget *w;
143 unsigned char wfocus;
144 int x, y, x1, y1, x2, y2;
145
146 x = window->x;
147 y = window->y + MENU_HEIGHT;
148
149 x1 = x + WINDOWBORDER_WIDTH;
150 y1 = y + WINDOWTITLE_HEIGHT;
151 x2 = x1 + window->w;
152 y2 = y1 + window->h;
153
154 /* Draw window border */
155 gdk_draw_rectangle(ctk_gtksim_pixmap,
156 darkgray,
157 FALSE,
158 x * RASTER_X,
159 y * RASTER_Y + MENUBAR_HEIGHT,
160 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,
161 (window->h + WINDOWTITLE_HEIGHT +
162 WINDOWBORDER_HEIGHT) * RASTER_Y);
163
164 if(ctk_mode_get() == CTK_MODE_WINDOWMOVE) {
oliverschmidta4609462004-12-27 22:05:20 +0000165 if(focus & CTK_FOCUS_WINDOW) {
adamdunkelsee08cc92004-07-04 21:04:13 +0000166 gdk_draw_rectangle(ctk_gtksim_pixmap,
167 white,
168 TRUE,
169 x * RASTER_X + 1,
170 y * RASTER_Y + MENUBAR_HEIGHT + 1,
171 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,
172 (window->h + WINDOWTITLE_HEIGHT +
173 WINDOWBORDER_HEIGHT) * RASTER_Y - 2);
174 } else {
175 gdk_draw_rectangle(ctk_gtksim_pixmap,
176 midgray,
177 TRUE,
178 x * RASTER_X + 1,
179 y * RASTER_Y + MENUBAR_HEIGHT + 1,
180 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,
181 (window->h + WINDOWTITLE_HEIGHT +
182 WINDOWBORDER_HEIGHT) * RASTER_Y - 2);
183 }
184 return;
185 }
186
187 if(windowborder == NULL) {
188 gdk_draw_rectangle(ctk_gtksim_pixmap,
189 midgray,
190 TRUE,
191 x * RASTER_X,
192 y * RASTER_Y + MENUBAR_HEIGHT,
193 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,
194 WINDOWTITLE_HEIGHT * RASTER_Y);
195 } else {
196 gdk_draw_pixbuf(ctk_gtksim_pixmap,
197 midgray,
198 windowborder,
199 0, 0,
200 x * RASTER_X,
201 y * RASTER_Y + MENUBAR_HEIGHT,
202 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,
203 WINDOWTITLE_HEIGHT * RASTER_Y,
adamdunkels77b45152004-08-11 21:21:26 +0000204 GDK_RGB_DITHER_NONE, 0, 0);
adamdunkelsee08cc92004-07-04 21:04:13 +0000205 }
206
207
208 gdk_draw_line(ctk_gtksim_pixmap,
209 darkgray,
210 x * RASTER_X,
211 (y + WINDOWTITLE_HEIGHT) * RASTER_Y - 1 + MENUBAR_HEIGHT,
212 (x + window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,
213 (y + WINDOWTITLE_HEIGHT) * RASTER_Y - 1 + MENUBAR_HEIGHT);
214
215
216 /* Draw inactive widgets. */
217 for(w = window->inactive; w != NULL; w = w->next) {
218 draw_widget(w, x1, y1, x2, y2,
219 clipy1, clipy2,
220 focus);
221 }
222
223 /* Draw active widgets. */
224 for(w = window->active; w != NULL; w = w->next) {
225 wfocus = focus;
226 if(w == window->focused) {
227 wfocus |= CTK_FOCUS_WIDGET;
228 }
229
230 draw_widget(w, x1, y1, x2, y2,
231 clipy1, clipy2,
232 wfocus);
233 }
234
235 ctk_gtksim_set_redrawflag();
236}
237/*--------------------------------------------------------------------------*/
238static void
239s_ctk_draw_dialog(struct ctk_window *window)
240{
241 struct ctk_widget *w;
242 unsigned char wfocus, focus;
243 int x, y, x1, y1, x2, y2;
244
245 focus = CTK_FOCUS_DIALOG;
246
247 x = window->x;
248 y = window->y + MENU_HEIGHT;
249
250 x1 = x + WINDOWBORDER_WIDTH;
251 y1 = y + WINDOWTITLE_HEIGHT;
252 x2 = x1 + window->w;
253 y2 = y1 + window->h;
254
255 /* Draw window border */
256 gdk_draw_rectangle(ctk_gtksim_pixmap,
257 black,
258 FALSE,
259 x * RASTER_X,
260 y * RASTER_Y + MENUBAR_HEIGHT,
261 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X,
262 (window->h + WINDOWTITLE_HEIGHT +
263 WINDOWBORDER_HEIGHT) * RASTER_Y);
264
265
266
267 gdk_draw_rectangle(ctk_gtksim_pixmap,
268 white,
269 TRUE,
270 x * RASTER_X + 1,
271 y * RASTER_Y + 1 + MENUBAR_HEIGHT,
272 (window->w + 2 * WINDOWBORDER_WIDTH) * RASTER_X - 2,
273 (window->h + WINDOWTITLE_HEIGHT +
274 WINDOWBORDER_HEIGHT) * RASTER_Y - 2);
275
276 /* Draw inactive widgets. */
277 for(w = window->inactive; w != NULL; w = w->next) {
278 draw_widget(w, x1, y1, x2, y2,
279 y1, y2,
280 focus);
281 }
282
283 /* Draw active widgets. */
284 for(w = window->active; w != NULL; w = w->next) {
285 wfocus = focus;
286 if(w == window->focused) {
287 wfocus |= CTK_FOCUS_WIDGET;
288 }
289
290 draw_widget(w, x1, y1, x2, y2,
291 y1, y2,
292 wfocus);
293 }
294
295 ctk_gtksim_set_redrawflag();
296
297}
298/*--------------------------------------------------------------------------*/
299static void
300draw_widget(struct ctk_widget *w,
301 unsigned char winx, unsigned char winy,
302 unsigned char clipx,
303 unsigned char clipy,
304 unsigned char clipy1,
305 unsigned char clipy2,
306 unsigned char focus)
307{
adamdunkels8a3c5e92004-09-01 20:31:51 +0000308 unsigned char text[1000];
adamdunkelsee08cc92004-07-04 21:04:13 +0000309 unsigned char x, y;
310 int width, xpos;
adamdunkels8a3c5e92004-09-01 20:31:51 +0000311 int i, j;
312 GdkGC *bgcol, *buttoncol, *color, *inv_color;
adamdunkelsee08cc92004-07-04 21:04:13 +0000313 struct ctk_gtksim_draw_font *buttonfont, *textfont, *textfont_bold;
314 int monospace;
adamdunkels8a3c5e92004-09-01 20:31:51 +0000315 unsigned char *bitmap;
adamdunkelsee08cc92004-07-04 21:04:13 +0000316
317 x = winx + w->x;
318 y = winy + w->y;
319
320 if(focus & CTK_FOCUS_WINDOW) {
321 bgcol = white;
322 } else {
323 bgcol = lightgray;
324 }
325
326 if(focus & CTK_FOCUS_WINDOW) {
327 buttoncol = lightgray;
328 } else {
329 buttoncol = midgray;
330 }
331
332 monospace = w->flags & CTK_WIDGET_FLAG_MONOSPACE;
333 if(monospace) {
334 textfont = &ctk_gtksim_draw_font_monospace;
335 textfont_bold = &ctk_gtksim_draw_font_monospace_bold;
336 } else {
337 textfont = &ctk_gtksim_draw_font_normal;
338 textfont_bold = &ctk_gtksim_draw_font_bold;
339 }
340
341 switch(w->type) {
342 case CTK_WIDGET_SEPARATOR:
343 gdk_draw_line(ctk_gtksim_pixmap,
344 darkgray,
345 x * RASTER_X,
346 y * RASTER_Y + RASTER_Y / 2 + MENUBAR_HEIGHT,
347 (x + w->w) * RASTER_X,
348 y * RASTER_Y + RASTER_Y / 2 + MENUBAR_HEIGHT);
349 break;
350 case CTK_WIDGET_LABEL:
351 gdk_draw_rectangle(ctk_gtksim_pixmap,
352 bgcol,
353 TRUE,
354 x * RASTER_X,
355 y * RASTER_Y + MENUBAR_HEIGHT,
356 w->w * RASTER_X,
357 w->h * RASTER_Y);
358 for(i = 0; i < w->h; ++i) {
359 strncpy(text, &w->widget.label.text[i * w->w], w->w);
adamdunkels8a3c5e92004-09-01 20:31:51 +0000360 for(j = 0; j < w->w; ++j) {
361 if(text[j] >= 0x80) {
362 text[j] = text[j] & 0x7f;
363 }
364 if(text[j] == 0) {
365 text[j] = ' ';
366 }
367 }
adamdunkelsee08cc92004-07-04 21:04:13 +0000368 text[w->w] = 0;
369 ctk_gtksim_draw_string(textfont,
370 &ctk_gtksim_draw_color_black,
371 RASTER_X * x,
372 RASTER_Y * (y + i) + MENUBAR_HEIGHT,
373 text, monospace);
adamdunkels8a3c5e92004-09-01 20:31:51 +0000374
375 strncpy(text, &w->widget.label.text[i * w->w], w->w);
376 for(j = 0; j < w->w; ++j) {
377 if(text[j] >= 0x80) {
378 gdk_draw_rectangle(ctk_gtksim_pixmap,
379 black,
380 FALSE,
381 (x + j) * RASTER_X - 2,
382 y * RASTER_Y + MENUBAR_HEIGHT,
383 RASTER_X + 2,
384 BUTTON_HEIGHT + 1);
385 }
386 }
adamdunkelsee08cc92004-07-04 21:04:13 +0000387 }
388
389 break;
390 case CTK_WIDGET_BUTTON:
391 if(w == (struct ctk_widget *)&w->window->titlebutton) {
392 buttonfont = &ctk_gtksim_draw_font_bold;
393 } else {
394 buttonfont = textfont;
395 }
396
397 ++x;
398
399 width = ctk_gtksim_draw_string_width(buttonfont,
400 w->widget.button.text,
401 monospace);
adamdunkels77b45152004-08-11 21:21:26 +0000402 if(focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_WINDOW) ||
403 focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_DIALOG)) {
adamdunkelsee08cc92004-07-04 21:04:13 +0000404 gdk_draw_rectangle(ctk_gtksim_pixmap,
405 black,
406 FALSE,
407 x * RASTER_X - BUTTON_X_BORDER,
408 y * RASTER_Y - BUTTON_Y_BORDER + MENUBAR_HEIGHT,
409 w->w * RASTER_X + BUTTON_X_BORDER * 2,
410 BUTTON_HEIGHT + BUTTON_Y_BORDER);
411 /* gdk_draw_rectangle(ctk_gtksim_pixmap,
412 ctk_gtksim_drawing_area->style->black_gc,
413 FALSE,
414 x * RASTER_X - BUTTON_X_BORDER - 1,
415 y * RASTER_Y - BUTTON_Y_BORDER - 1,
416 w->w * RASTER_X + BUTTON_X_BORDER * 2 + 1,
417 RASTER_Y + BUTTON_Y_BORDER * 2 + 1);*/
418 } else {
419 gdk_draw_rectangle(ctk_gtksim_pixmap,
420 darkgray,
421 FALSE,
422 x * RASTER_X - BUTTON_X_BORDER,
423 y * RASTER_Y - BUTTON_Y_BORDER + MENUBAR_HEIGHT,
424 w->w * RASTER_X + BUTTON_X_BORDER * 2,
425 BUTTON_HEIGHT + BUTTON_Y_BORDER);
426 }
427 gdk_draw_rectangle(ctk_gtksim_pixmap,
428 buttoncol,
429 TRUE,
430 x * RASTER_X - BUTTON_X_BORDER + 1,
431 y * RASTER_Y + MENUBAR_HEIGHT,
432 w->w * RASTER_X + BUTTON_X_BORDER * 2 - 2,
433 BUTTON_HEIGHT);
434
435 gdk_draw_line(ctk_gtksim_pixmap,
436 ddarkgray,
437 x * RASTER_X - BUTTON_X_BORDER + 1,
438 y * RASTER_Y + BUTTON_HEIGHT - 1 + MENUBAR_HEIGHT,
439 x * RASTER_X + w->w * RASTER_X + BUTTON_X_BORDER - 1,
440 y * RASTER_Y + BUTTON_HEIGHT - 1 + MENUBAR_HEIGHT);
441 gdk_draw_line(ctk_gtksim_pixmap,
442 ddarkgray,
443 x * RASTER_X + w->w * RASTER_X + BUTTON_X_BORDER - 1,
444 y * RASTER_Y + BUTTON_HEIGHT - 1 + MENUBAR_HEIGHT,
445 x * RASTER_X + w->w * RASTER_X + BUTTON_X_BORDER - 1,
446 y * RASTER_Y + MENUBAR_HEIGHT);
447
adamdunkels8a3c5e92004-09-01 20:31:51 +0000448 if(w != &w->window->closebutton) {
449 ctk_gtksim_draw_string(buttonfont,
450 &ctk_gtksim_draw_color_black,
451 RASTER_X * x +
452 (w->w * RASTER_X) / 2 - width / 2,
453 RASTER_Y * y + MENUBAR_HEIGHT,
454 w->widget.button.text,
455 monospace);
456 }
adamdunkelsee08cc92004-07-04 21:04:13 +0000457 break;
458 case CTK_WIDGET_HYPERLINK:
459 strncpy(text, w->widget.hyperlink.text, w->w);
460 text[w->w] = 0;
461 width = ctk_gtksim_draw_string_width(textfont, text, monospace);
462 gdk_draw_rectangle(ctk_gtksim_pixmap,
463 bgcol,
464 TRUE,
465 x * RASTER_X,
466 y * RASTER_Y + MENUBAR_HEIGHT,
467 width,
468 RASTER_Y);
469 if(focus & CTK_FOCUS_WIDGET) {
470 ctk_gtksim_draw_string(textfont_bold,
471 &ctk_gtksim_draw_color_blue,
472 RASTER_X * x,
473 RASTER_Y * y + MENUBAR_HEIGHT,
474 text, monospace);
475 } else {
476 ctk_gtksim_draw_string(textfont,
477 &ctk_gtksim_draw_color_blue,
478 RASTER_X * x,
479 RASTER_Y * y + MENUBAR_HEIGHT,
480 text, monospace);
481 }
482 gdk_draw_line(ctk_gtksim_pixmap,
483 blue,
484 x * RASTER_X,
485 y * RASTER_Y + FONT_BASELINE + 1 + MENUBAR_HEIGHT,
486 x * RASTER_X + width,
487 y * RASTER_Y + FONT_BASELINE + 1 + MENUBAR_HEIGHT);
488
489 break;
490 case CTK_WIDGET_TEXTENTRY:
491 strncpy(text, w->widget.textentry.text, sizeof(text));
492 text[w->widget.textentry.xpos] = 0;
493 width = ctk_gtksim_draw_string_width(textfont, text, monospace);
494 gdk_draw_rectangle(ctk_gtksim_pixmap,
495 darkgray,
496 FALSE,
497 x * RASTER_X - TEXTENTRY_X_BORDER + RASTER_X,
498 y * RASTER_Y - TEXTENTRY_Y_BORDER + MENUBAR_HEIGHT,
499 w->w * RASTER_X + TEXTENTRY_X_BORDER * 2 - 1,
500 TEXTENTRY_HEIGHT + TEXTENTRY_Y_BORDER);
501 gdk_draw_rectangle(ctk_gtksim_pixmap,
502 bgcol,
503 TRUE,
504 x * RASTER_X + RASTER_X,
505 y * RASTER_Y + MENUBAR_HEIGHT,
506 w->w * RASTER_X,
507 TEXTENTRY_HEIGHT);
508 ctk_gtksim_draw_string(textfont,
509 &ctk_gtksim_draw_color_black,
510 RASTER_X * x + RASTER_X,
511 RASTER_Y * y + MENUBAR_HEIGHT,
512 w->widget.textentry.text,
513 monospace);
adamdunkels77b45152004-08-11 21:21:26 +0000514 if(focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_WINDOW) ||
515 focus == (CTK_FOCUS_WIDGET|CTK_FOCUS_DIALOG)) {
adamdunkelsee08cc92004-07-04 21:04:13 +0000516 gdk_draw_line(ctk_gtksim_pixmap,
517 black,
518 x * RASTER_X + width + RASTER_X,
519 y * RASTER_Y + MENUBAR_HEIGHT,
520 x * RASTER_X + width + RASTER_X,
521 y * RASTER_Y + TEXTENTRY_HEIGHT - 1 + MENUBAR_HEIGHT);
522 }
523 break;
524 case CTK_WIDGET_ICON:
525 width = ctk_gtksim_draw_string_width(&ctk_gtksim_draw_font_normal,
526 w->widget.icon.title, monospace);
527
528 if(x * RASTER_X + width >= CTK_GTKSIM_SCREEN_WIDTH - RASTER_X) {
529 xpos = CTK_GTKSIM_SCREEN_WIDTH - width - RASTER_X;
530 } else {
531 xpos = x * RASTER_X;
532 }
adamdunkels8a3c5e92004-09-01 20:31:51 +0000533
adamdunkelsee08cc92004-07-04 21:04:13 +0000534 if((focus & CTK_FOCUS_WIDGET) == 0) {
adamdunkels8a3c5e92004-09-01 20:31:51 +0000535 color = black;
536 inv_color = bgcol;
537 } else {
538 color = bgcol;
539 inv_color = black;
540 }
541
542 bitmap = w->widget.icon.bitmap;
543 if (bitmap != NULL) {
544 int k, c;
545
546 for (c = 0; c < 9; ++c) {
547 for (i = 0; i < 8; ++i) {
548 unsigned char b = bitmap[i + c * 8];
549 for (k = 0; k < 8; k++) {
550 gdk_draw_rectangle(ctk_gtksim_pixmap,
551 (b >> k) & 1 > 0 ? color : inv_color,
552 TRUE,
553 x * RASTER_X + 8 * (c % 3) + (8 - k),
554 y * RASTER_Y + MENUBAR_HEIGHT +
555 8 * (c / 3) + i,
556 1, 1);
557 }
558 }
559 }
560 } else {
561 gdk_draw_rectangle(ctk_gtksim_pixmap,
562 color,
563 TRUE,
564 x * RASTER_X,
565 y * RASTER_Y + MENUBAR_HEIGHT,
566 24, 24);
567 }
568
569 /* if((focus & CTK_FOCUS_WIDGET) == 0) {
adamdunkelsee08cc92004-07-04 21:04:13 +0000570 gdk_draw_rectangle(ctk_gtksim_pixmap,
571 bgcol,
572 TRUE,
573 x * RASTER_X,
574 y * RASTER_Y + MENUBAR_HEIGHT,
575 24, 24);
576 } else {
577 gdk_draw_rectangle(ctk_gtksim_pixmap,
578 black,
579 TRUE,
580 x * RASTER_X,
581 y * RASTER_Y + MENUBAR_HEIGHT,
582 24, 24);
adamdunkels8a3c5e92004-09-01 20:31:51 +0000583 }*/
adamdunkelsee08cc92004-07-04 21:04:13 +0000584
585 /* gdk_draw_rectangle(ctk_gtksim_pixmap,
586 white,
587 TRUE,
588 xpos,
589 RASTER_Y * y + 24 + 1 + MENUBAR_HEIGHT,
590 width,
591 RASTER_Y);*/
592
593 ctk_gtksim_draw_string(textfont,
594 &ctk_gtksim_draw_color_black,
595 xpos + 1,
596 RASTER_Y * y + 24 + 1 + MENUBAR_HEIGHT,
597 w->widget.icon.title,
598 monospace);
599 ctk_gtksim_draw_string(textfont,
600 &ctk_gtksim_draw_color_white,
601 xpos,
602 RASTER_Y * y + 24 + MENUBAR_HEIGHT,
603 w->widget.icon.title,
604 monospace);
605
606
607 break;
608 default:
609 break;
610 }
611}
612
613/*--------------------------------------------------------------------------*/
614static void
615s_ctk_draw_widget(struct ctk_widget *w,
616 unsigned char focus,
617 unsigned char clipy1,
618 unsigned char clipy2)
619{
620 struct ctk_window *win = w->window;
621 unsigned char posx, posy;
622
623 posx = win->x + WINDOWBORDER_WIDTH;
624 posy = win->y + WINDOWTITLE_HEIGHT + MENU_HEIGHT;
625
626 if(w == win->focused) {
627 focus |= CTK_FOCUS_WIDGET;
628 }
629
630 draw_widget(w, posx, posy,
631 posx + win->w,
632 posy + win->h,
633 clipy1, clipy2,
634 focus);
635
636 ctk_gtksim_set_redrawflag();
637}
638/*--------------------------------------------------------------------------*/
639static void
640draw_menu(struct ctk_menu *m, int x, int open)
641{
642 int i;
643 int xpos;
644
645 if(x >= CTK_GTKSIM_SCREEN_WIDTH / RASTER_X - 16) {
646 xpos = CTK_GTKSIM_SCREEN_WIDTH / RASTER_X - 16;
647 } else {
648 xpos = x;
649 }
650
651 if(open) {
652
653 gdk_draw_rectangle(ctk_gtksim_pixmap,
654 black,
655 TRUE,
656 RASTER_X * x, 0,
657 m->titlelen * RASTER_X,
658 RASTER_Y + MENUBAR_HEIGHT);
659
660 ctk_gtksim_draw_string(&ctk_gtksim_draw_font_menu,
661 &ctk_gtksim_draw_color_white,
662 RASTER_X * x + 2,
663 MENUBAR_FONT_BASELINE,
664 m->title, 0);
665
666 gdk_draw_rectangle(ctk_gtksim_pixmap,
667 white,
668 TRUE,
669 xpos * RASTER_X,
670 RASTER_Y * MENU_HEIGHT + MENUBAR_HEIGHT,
671 (xpos + 16) * RASTER_X,
672 (m->nitems) * RASTER_Y);
673
674 for(i = 0; i < m->nitems; ++i) {
675 if(i == m->active) {
676 gdk_draw_rectangle(ctk_gtksim_pixmap,
677 black,
678 TRUE,
679 RASTER_X * xpos,
680 (MENU_HEIGHT + i) * RASTER_Y + MENUBAR_HEIGHT,
681 (xpos + 16) * RASTER_X,
682 RASTER_Y);
683 ctk_gtksim_draw_string(&ctk_gtksim_draw_font_normal,
684 &ctk_gtksim_draw_color_white,
685 RASTER_X * xpos + 2,
686 (MENU_HEIGHT + i) * RASTER_Y +
687 MENUBAR_HEIGHT,
688 m->items[i].title, 0);
689
690 } else {
691 ctk_gtksim_draw_string(&ctk_gtksim_draw_font_normal,
692 &ctk_gtksim_draw_color_black,
693 RASTER_X * xpos + 2,
694 (MENU_HEIGHT + i) * RASTER_Y + MENUBAR_HEIGHT,
695 m->items[i].title, 0);
696 }
697
698 }
699 } else {
700 /* gdk_draw_rectangle(ctk_gtksim_pixmap,
701 white,
702 TRUE,
703 RASTER_X * x, 0,
704 m->titlelen * RASTER_X, RASTER_Y);*/
705
706 ctk_gtksim_draw_string(&ctk_gtksim_draw_font_menu,
707 &ctk_gtksim_draw_color_black,
708 RASTER_X * x, MENUBAR_FONT_BASELINE,
709 m->title, 0);
710
711 }
712}
713/*--------------------------------------------------------------------------*/
714static void
715s_ctk_draw_menus(struct ctk_menus *menus)
716{
717 struct ctk_menu *m;
718 int x;
719
720 if(menubar != NULL) {
721 gdk_draw_pixbuf(ctk_gtksim_pixmap,
722 darkgray,
723 menubar,
724 0, 0,
725 0, 0,
726 CTK_GTKSIM_SCREEN_WIDTH,
727 RASTER_Y + MENUBAR_HEIGHT,
adamdunkels77b45152004-08-11 21:21:26 +0000728 GDK_RGB_DITHER_NONE, 0, 0);
adamdunkelsee08cc92004-07-04 21:04:13 +0000729 }
730
731 x = 1;
732 for(m = menus->menus->next; m != NULL; m = m->next) {
733 draw_menu(m, x, m == menus->open);
734 x += strlen(m->title);
735 }
736
737 x = CTK_GTKSIM_SCREEN_WIDTH / RASTER_X - strlen(menus->menus->title);
738 draw_menu(menus->menus, x, menus->menus == menus->open);
739
740
741
742 /* gdk_draw_line(ctk_gtksim_pixmap,
743 ctk_gtksim_drawing_area->style->black_gc,
744 0, RASTER_Y,
745 CTK_GTKSIM_SCREEN_WIDTH,
746 RASTER_Y);*/
747
748 ctk_gtksim_set_redrawflag();
749}
750/*--------------------------------------------------------------------------*/
751static unsigned char
752s_ctk_draw_width(void)
753{
754 return CTK_GTKSIM_SCREEN_WIDTH / RASTER_X;
755}
756/*--------------------------------------------------------------------------*/
757static unsigned char
758s_ctk_draw_height(void)
759{
760 return CTK_GTKSIM_SCREEN_HEIGHT / RASTER_Y;
761}
762/*--------------------------------------------------------------------------*/
763static unsigned short
764s_ctk_mouse_xtoc(unsigned short x)
765{
766 return x / RASTER_X;
767}
768/*--------------------------------------------------------------------------*/
769static unsigned short
770s_ctk_mouse_ytoc(unsigned short y)
771{
772 if(y < MENUBAR_HEIGHT) {
773 return 0;
774 } else {
775 return (y - MENUBAR_HEIGHT) / RASTER_Y;
776 }
777}
778/*--------------------------------------------------------------------------*/
779static const struct ctk_draw_service_interface interface =
780 {CTK_DRAW_SERVICE_VERSION,
781 WINDOWBORDER_WIDTH,
782 WINDOWBORDER_HEIGHT,
783 WINDOWTITLE_HEIGHT,
784 s_ctk_draw_init,
785 s_ctk_draw_clear,
786 s_ctk_draw_clear_window,
787 s_ctk_draw_window,
788 s_ctk_draw_dialog,
789 s_ctk_draw_widget,
790 s_ctk_draw_menus,
791 s_ctk_draw_width,
792 s_ctk_draw_height,
793 s_ctk_mouse_xtoc,
794 s_ctk_mouse_ytoc,
795 };
796
adamdunkels77b45152004-08-11 21:21:26 +0000797EK_POLLHANDLER(pollhandler);
adamdunkelsee08cc92004-07-04 21:04:13 +0000798EK_EVENTHANDLER(eventhandler, ev, data);
799EK_PROCESS(proc, CTK_DRAW_SERVICE_NAME, EK_PRIO_NORMAL,
adamdunkels77b45152004-08-11 21:21:26 +0000800 eventhandler, pollhandler, (void *)&interface);
adamdunkelsee08cc92004-07-04 21:04:13 +0000801
802/*--------------------------------------------------------------------------*/
803EK_PROCESS_INIT(ctk_gtksim_service_init, arg)
804{
805 ek_service_start(CTK_DRAW_SERVICE_NAME, &proc);
806}
807/*--------------------------------------------------------------------------*/
808static GdkGC *
809get_color(unsigned short r, unsigned short g, unsigned short b)
810{
811 GdkGCValues values;
812 GdkColor color;
813
814 color.pixel = 0;
815 color.red = r;
816 color.green = g;
817 color.blue = b;
818
819 if(gdk_colormap_alloc_color(gdk_colormap_get_system(),
820 &color, FALSE, TRUE)) {
821 }
822
823 values.foreground = color;
824
825 return gdk_gc_new_with_values(ctk_gtksim_drawing_area->window,
826 &values,
827 GDK_GC_FOREGROUND);
828}
829/*--------------------------------------------------------------------------*/
830EK_EVENTHANDLER(eventhandler, ev, data)
831{
832 EK_EVENTHANDLER_ARGS(ev, data);
833
834 switch(ev) {
835 case EK_EVENT_INIT:
adamdunkels77b45152004-08-11 21:21:26 +0000836 case EK_EVENT_REPLACE:
adamdunkelsee08cc92004-07-04 21:04:13 +0000837 break;
838 case EK_EVENT_REQUEST_REPLACE:
839 ek_replace((struct ek_proc *)data, NULL);
840 LOADER_UNLOAD();
841 break;
842 }
843}
844/*--------------------------------------------------------------------------*/
adamdunkels77b45152004-08-11 21:21:26 +0000845EK_POLLHANDLER(pollhandler)
846{
847 ctk_gtksim_redraw();
848}
849/*--------------------------------------------------------------------------*/