Introduced a new parameter for ctk_draw_window() that indicates if drawing the window borders is required.
This allows to avoid unnecessary drawing of window borders on calls to ctk_window_redraw() which happen often in the web browser.
Several ctk_draw_window() implementaions don't make use of the new parameter yet.
diff --git a/contiki/ctk/ctk-conio-service.c b/contiki/ctk/ctk-conio-service.c
index f9a5e87..af2bccb 100644
--- a/contiki/ctk/ctk-conio-service.c
+++ b/contiki/ctk/ctk-conio-service.c
@@ -29,7 +29,7 @@
*
* This file is part of the "ctk" console GUI toolkit for cc65
*
- * $Id: ctk-conio-service.c,v 1.5 2005/03/15 14:19:40 oliverschmidt Exp $
+ * $Id: ctk-conio-service.c,v 1.6 2005/03/15 15:51:17 oliverschmidt Exp $
*
*/
@@ -334,7 +334,8 @@
/*-----------------------------------------------------------------------------------*/
static void
s_ctk_draw_window(struct ctk_window *window, unsigned char focus,
- unsigned char clipy1, unsigned char clipy2)
+ unsigned char clipy1, unsigned char clipy2,
+ unsigned char draw_borders)
{
unsigned char x, y;
unsigned char h;
@@ -346,53 +347,55 @@
x = window->x;
y = window->y + 1;
-
- if(focus & CTK_FOCUS_WINDOW) {
- textcolor(WINDOWCOLOR_FOCUS);
- } else {
- textcolor(WINDOWCOLOR);
- }
-
x1 = x + 1;
y1 = y + 1;
x2 = x1 + window->w;
y2 = y1 + window->h;
- /* Draw window frame. */
- if(y >= clipy1) {
- cputcxy(x, y, CH_ULCORNER);
- gotoxy(wherex() + window->titlelen + 2, wherey());
- chline(window->w - (wherex() - x) - 2);
- cputcxy(x2, y, CH_URCORNER);
- }
+ if(draw_borders) {
- h = window->h;
+ /* Draw window frame. */
+ if(focus & CTK_FOCUS_WINDOW) {
+ textcolor(WINDOWCOLOR_FOCUS);
+ } else {
+ textcolor(WINDOWCOLOR);
+ }
+
+ if(y >= clipy1) {
+ cputcxy(x, y, CH_ULCORNER);
+ gotoxy(wherex() + window->titlelen + 2, wherey());
+ chline(window->w - (wherex() - x) - 2);
+ cputcxy(x2, y, CH_URCORNER);
+ }
+
+ h = window->h;
- if(clipy1 > y1) {
- if(clipy1 - y1 < h) {
- h = clipy1 - y1;
- y1 = clipy1;
- } else {
- h = 0;
+ if(clipy1 > y1) {
+ if(clipy1 - y1 < h) {
+ h = clipy1 - y1;
+ y1 = clipy1;
+ } else {
+ h = 0;
+ }
}
- }
- if(clipy2 < y1 + h) {
- if(y1 >= clipy2) {
- h = 0;
- } else {
- h = clipy2 - y1;
+ if(clipy2 < y1 + h) {
+ if(y1 >= clipy2) {
+ h = 0;
+ } else {
+ h = clipy2 - y1;
+ }
}
- }
- cvlinexy(x, y1, h);
- cvlinexy(x2, y1, h);
+ cvlinexy(x, y1, h);
+ cvlinexy(x2, y1, h);
- if(y + window->h >= clipy1 &&
- y + window->h < clipy2) {
- cputcxy(x, y2, CH_LLCORNER);
- chlinexy(x1, y2, window->w);
- cputcxy(x2, y2, CH_LRCORNER);
+ if(y + window->h >= clipy1 &&
+ y + window->h < clipy2) {
+ cputcxy(x, y2, CH_LLCORNER);
+ chlinexy(x1, y2, window->w);
+ cputcxy(x2, y2, CH_LRCORNER);
+ }
}
draw_window_contents(window, focus, clipy1, clipy2,
diff --git a/contiki/ctk/ctk-conio.c b/contiki/ctk/ctk-conio.c
index e40d4a8..8106ee5 100644
--- a/contiki/ctk/ctk-conio.c
+++ b/contiki/ctk/ctk-conio.c
@@ -29,7 +29,7 @@
*
* This file is part of the "ctk" console GUI toolkit for cc65
*
- * $Id: ctk-conio.c,v 1.17 2005/03/15 14:19:41 oliverschmidt Exp $
+ * $Id: ctk-conio.c,v 1.18 2005/03/15 15:51:17 oliverschmidt Exp $
*
*/
@@ -335,7 +335,8 @@
/*-----------------------------------------------------------------------------------*/
void
ctk_draw_window(struct ctk_window *window, unsigned char focus,
- unsigned char clipy1, unsigned char clipy2)
+ unsigned char clipy1, unsigned char clipy2,
+ unsigned char draw_borders)
{
unsigned char x, y;
unsigned char h;
@@ -347,53 +348,55 @@
x = window->x;
y = window->y + 1;
-
- if(focus & CTK_FOCUS_WINDOW) {
- textcolor(WINDOWCOLOR_FOCUS);
- } else {
- textcolor(WINDOWCOLOR);
- }
-
x1 = x + 1;
y1 = y + 1;
x2 = x1 + window->w;
y2 = y1 + window->h;
- /* Draw window frame. */
- if(y >= clipy1) {
- cputcxy(x, y, CH_ULCORNER);
- gotoxy(wherex() + window->titlelen + 2, wherey());
- chline(window->w - (wherex() - x) - 2);
- cputcxy(x2, y, CH_URCORNER);
- }
+ if(draw_borders) {
- h = window->h;
+ /* Draw window frame. */
+ if(focus & CTK_FOCUS_WINDOW) {
+ textcolor(WINDOWCOLOR_FOCUS);
+ } else {
+ textcolor(WINDOWCOLOR);
+ }
+
+ if(y >= clipy1) {
+ cputcxy(x, y, CH_ULCORNER);
+ gotoxy(wherex() + window->titlelen + 2, wherey());
+ chline(window->w - (wherex() - x) - 2);
+ cputcxy(x2, y, CH_URCORNER);
+ }
+
+ h = window->h;
- if(clipy1 > y1) {
- if(clipy1 - y1 < h) {
- h = clipy1 - y1;
- y1 = clipy1;
- } else {
- h = 0;
+ if(clipy1 > y1) {
+ if(clipy1 - y1 < h) {
+ h = clipy1 - y1;
+ y1 = clipy1;
+ } else {
+ h = 0;
+ }
}
- }
- if(clipy2 < y1 + h) {
- if(y1 >= clipy2) {
- h = 0;
- } else {
- h = clipy2 - y1;
+ if(clipy2 < y1 + h) {
+ if(y1 >= clipy2) {
+ h = 0;
+ } else {
+ h = clipy2 - y1;
+ }
}
- }
- cvlinexy(x, y1, h);
- cvlinexy(x2, y1, h);
+ cvlinexy(x, y1, h);
+ cvlinexy(x2, y1, h);
- if(y + window->h >= clipy1 &&
- y + window->h < clipy2) {
- cputcxy(x, y2, CH_LLCORNER);
- chlinexy(x1, y2, window->w);
- cputcxy(x2, y2, CH_LRCORNER);
+ if(y + window->h >= clipy1 &&
+ y + window->h < clipy2) {
+ cputcxy(x, y2, CH_LLCORNER);
+ chlinexy(x1, y2, window->w);
+ cputcxy(x2, y2, CH_LRCORNER);
+ }
}
draw_window_contents(window, focus, clipy1, clipy2,
diff --git a/contiki/ctk/ctk-draw-service.h b/contiki/ctk/ctk-draw-service.h
index d0e572a..8b19768 100644
--- a/contiki/ctk/ctk-draw-service.h
+++ b/contiki/ctk/ctk-draw-service.h
@@ -30,7 +30,7 @@
*
* Author: Adam Dunkels <adam@sics.se>
*
- * $Id: ctk-draw-service.h,v 1.3 2004/09/12 20:24:55 adamdunkels Exp $
+ * $Id: ctk-draw-service.h,v 1.4 2005/03/15 15:51:17 oliverschmidt Exp $
*/
#ifndef __CTK_DRAW_SERVICE_H__
#define __CTK_DRAW_SERVICE_H__
@@ -56,7 +56,8 @@
void (* draw_window)(struct ctk_window *window,
unsigned char focus,
unsigned char clipy1,
- unsigned char clipy2);
+ unsigned char clipy2,
+ unsigned char draw_borders);
void (* draw_dialog)(struct ctk_window *dialog);
void (* draw_widget)(struct ctk_widget *widget,
unsigned char focus,
diff --git a/contiki/ctk/ctk-draw.c b/contiki/ctk/ctk-draw.c
index 33af1e2..7e0827a 100644
--- a/contiki/ctk/ctk-draw.c
+++ b/contiki/ctk/ctk-draw.c
@@ -30,7 +30,7 @@
*
* Author: Adam Dunkels <adam@sics.se>
*
- * $Id: ctk-draw.c,v 1.4 2004/09/12 20:24:55 adamdunkels Exp $
+ * $Id: ctk-draw.c,v 1.5 2005/03/15 15:51:17 oliverschmidt Exp $
*/
#include "ek-service.h"
@@ -101,12 +101,13 @@
ctk_draw_window(struct ctk_window *window,
unsigned char focus,
unsigned char clipy1,
- unsigned char clipy2)
+ unsigned char clipy2,
+ unsigned char draw_borders)
{
struct ctk_draw_service_interface *interface;
if((interface = find_interface()) != NULL) {
- interface->draw_window(window, focus, clipy1, clipy2);
+ interface->draw_window(window, focus, clipy1, clipy2, draw_borders);
}
}
/*---------------------------------------------------------------------------*/
diff --git a/contiki/ctk/ctk-draw.h b/contiki/ctk/ctk-draw.h
index 5783d71..c0ba064 100644
--- a/contiki/ctk/ctk-draw.h
+++ b/contiki/ctk/ctk-draw.h
@@ -45,7 +45,7 @@
*
* This file is part of the Contiki desktop OS.
*
- * $Id: ctk-draw.h,v 1.6 2004/07/04 11:40:04 adamdunkels Exp $
+ * $Id: ctk-draw.h,v 1.7 2005/03/15 15:51:17 oliverschmidt Exp $
*
*/
@@ -95,8 +95,10 @@
* screen through the function ctk_draw_window().. A pseudo-code
* implementation of this function might look like this:
* \code
- ctk_draw_window(window, focus, clipy1, clipy2) {
- draw_window_borders(window, focus, clipy1, clipy2);
+ ctk_draw_window(window, focus, clipy1, clipy2, draw_borders) {
+ if(draw_borders) {
+ draw_window_borders(window, focus, clipy1, clipy2);
+ }
foreach(widget, window->inactive) {
ctk_draw_widget(widget, focus, clipy1, clipy2);
}
@@ -205,7 +207,8 @@
void ctk_draw_window(struct ctk_window *window,
unsigned char focus,
unsigned char clipy1,
- unsigned char clipy2);
+ unsigned char clipy2,
+ unsigned char draw_borders);
/**
diff --git a/contiki/ctk/ctk-term.c b/contiki/ctk/ctk-term.c
index c83f64d..b66b268 100644
--- a/contiki/ctk/ctk-term.c
+++ b/contiki/ctk/ctk-term.c
@@ -694,7 +694,8 @@
/*-----------------------------------------------------------------------------------*/
void
ctk_draw_window(struct ctk_window *window, unsigned char focus,
- unsigned char clipy1, unsigned char clipy2)
+ unsigned char clipy1, unsigned char clipy2,
+ unsigned char draw_borders)
{
unsigned char x, y;
unsigned char h;
@@ -708,54 +709,56 @@
x = window->x;
y = window->y + 1;
-
- textcolor((unsigned char)(TERM_WINDOWCOLOR + focus));
-
x1 = x + 1;
y1 = y + 1;
x2 = x1 + window->w;
y2 = y1 + window->h;
- /* Draw window frame. */
- if(y >= clipy1) {
- cputcxy(x, y, CH_ULCORNER);
- for(i = wherex() + window->titlelen + 2; i < x2; ++i) {
- cputcxy(i, y, CH_TITLEBAR);
- }
- cputcxy(x2, y, CH_URCORNER);
- }
+ if(draw_borders) {
- h = window->h;
-
- if(clipy1 > y1) {
- if(clipy1 - y1 < h) {
- h = clipy1 - y1;
- y1 = clipy1;
- } else {
- h = 0;
- }
- }
-
- if(clipy2 < y1 + h) {
- if(y1 >= clipy2) {
- h = 0;
- } else {
- h = clipy2 - y1;
- }
- }
-
- for(i = y1; i < y1 + h; ++i) {
- cputcxy(x, i, CH_WINDOWLBORDER);
- cputcxy(x2, i, CH_WINDOWRBORDER);
- }
+ /* Draw window frame. */
+ textcolor((unsigned char)(TERM_WINDOWCOLOR + focus));
- if(y2 >= clipy1 &&
- y2 < clipy2) {
- cputcxy(x, y2, CH_LLCORNER);
- for(i = x1; i < x2; ++i) {
- cputcxy(i, y2, CH_WINDOWLOWERBORDER);
+ if(y >= clipy1) {
+ cputcxy(x, y, CH_ULCORNER);
+ for(i = wherex() + window->titlelen + 2; i < x2; ++i) {
+ cputcxy(i, y, CH_TITLEBAR);
+ }
+ cputcxy(x2, y, CH_URCORNER);
}
- cputcxy(x2, y2, CH_LRCORNER);
+
+ h = window->h;
+
+ if(clipy1 > y1) {
+ if(clipy1 - y1 < h) {
+ h = clipy1 - y1;
+ y1 = clipy1;
+ } else {
+ h = 0;
+ }
+ }
+
+ if(clipy2 < y1 + h) {
+ if(y1 >= clipy2) {
+ h = 0;
+ } else {
+ h = clipy2 - y1;
+ }
+ }
+
+ for(i = y1; i < y1 + h; ++i) {
+ cputcxy(x, i, CH_WINDOWLBORDER);
+ cputcxy(x2, i, CH_WINDOWRBORDER);
+ }
+
+ if(y2 >= clipy1 &&
+ y2 < clipy2) {
+ cputcxy(x, y2, CH_LLCORNER);
+ for(i = x1; i < x2; ++i) {
+ cputcxy(i, y2, CH_WINDOWLOWERBORDER);
+ }
+ cputcxy(x2, y2, CH_LRCORNER);
+ }
}
draw_window_contents(window, focus, clipy1, clipy2,
diff --git a/contiki/ctk/ctk-vncserver.c b/contiki/ctk/ctk-vncserver.c
index 591136d..63a772a 100644
--- a/contiki/ctk/ctk-vncserver.c
+++ b/contiki/ctk/ctk-vncserver.c
@@ -41,7 +41,7 @@
*
* This file is part of the "ctk" console GUI toolkit for cc65
*
- * $Id: ctk-vncserver.c,v 1.11 2004/12/27 22:03:04 oliverschmidt Exp $
+ * $Id: ctk-vncserver.c,v 1.12 2005/03/15 15:51:17 oliverschmidt Exp $
*
*/
@@ -666,7 +666,8 @@
/*-----------------------------------------------------------------------------------*/
void
ctk_draw_window(struct ctk_window *window, unsigned char focus,
- unsigned char clipy1, unsigned char clipy2)
+ unsigned char clipy1, unsigned char clipy2,
+ unsigned char draw_borders)
{
unsigned char x, y;
unsigned char h;
@@ -680,63 +681,65 @@
x = window->x;
y = window->y + 1;
-
- textcolor(VNC_OUT_WINDOWCOLOR + focus);
- /* if(focus & CTK_FOCUS_WINDOW) {
- textcolor(WINDOWCOLOR_FOCUS);
- } else {
- textcolor(WINDOWCOLOR);
- }*/
-
x1 = x + 1;
y1 = y + 1;
x2 = x1 + window->w;
y2 = y1 + window->h;
- /* Draw window frame. */
- if(y >= clipy1) {
- cputcxy(x, y, CH_ULCORNER);
- for(i = wherex() + window->titlelen + 2; i < x2; ++i) {
- cputcxy(i, y, CH_TITLEBAR);
- }
- cputcxy(x2, y, CH_URCORNER);
- }
+ if(draw_borders) {
- h = window->h;
-
- if(clipy1 > y1) {
- if(clipy1 - y1 < h) {
- h = clipy1 - y1;
- y1 = clipy1;
+ /* Draw window frame. */
+ textcolor(VNC_OUT_WINDOWCOLOR + focus);
+ /* if(focus & CTK_FOCUS_WINDOW) {
+ textcolor(WINDOWCOLOR_FOCUS);
} else {
- h = 0;
- }
- }
+ textcolor(WINDOWCOLOR);
+ }*/
- if(clipy2 < y1 + h) {
- if(y1 >= clipy2) {
- h = 0;
- } else {
- h = clipy2 - y1;
+ if(y >= clipy1) {
+ cputcxy(x, y, CH_ULCORNER);
+ for(i = wherex() + window->titlelen + 2; i < x2; ++i) {
+ cputcxy(i, y, CH_TITLEBAR);
+ }
+ cputcxy(x2, y, CH_URCORNER);
}
- }
+
+ h = window->h;
- for(i = y1; i < y1 + h; ++i) {
- cputcxy(x, i, CH_WINDOWLBORDER);
- cputcxy(x2, i, CH_WINDOWRBORDER);
- }
-
- /* cvlinexy(x, y1, h);
- cvlinexy(x2, y1, h); */
-
- if(y + window->h >= clipy1 &&
- y + window->h < clipy2) {
- cputcxy(x, y2, CH_LLCORNER);
- for(i = x1; i < x2; ++i) {
- cputcxy(i, y2, CH_WINDOWLOWERBORDER);
+ if(clipy1 > y1) {
+ if(clipy1 - y1 < h) {
+ h = clipy1 - y1;
+ y1 = clipy1;
+ } else {
+ h = 0;
+ }
}
- /* chlinexy(x1, y2, window->w);*/
- cputcxy(x2, y2, CH_LRCORNER);
+
+ if(clipy2 < y1 + h) {
+ if(y1 >= clipy2) {
+ h = 0;
+ } else {
+ h = clipy2 - y1;
+ }
+ }
+
+ for(i = y1; i < y1 + h; ++i) {
+ cputcxy(x, i, CH_WINDOWLBORDER);
+ cputcxy(x2, i, CH_WINDOWRBORDER);
+ }
+
+ /* cvlinexy(x, y1, h);
+ cvlinexy(x2, y1, h); */
+
+ if(y + window->h >= clipy1 &&
+ y + window->h < clipy2) {
+ cputcxy(x, y2, CH_LLCORNER);
+ for(i = x1; i < x2; ++i) {
+ cputcxy(i, y2, CH_WINDOWLOWERBORDER);
+ }
+ /* chlinexy(x1, y2, window->w);*/
+ cputcxy(x2, y2, CH_LRCORNER);
+ }
}
draw_window_contents(window, focus, clipy1, clipy2,
diff --git a/contiki/ctk/ctk.c b/contiki/ctk/ctk.c
index 701035a..7901536 100644
--- a/contiki/ctk/ctk.c
+++ b/contiki/ctk/ctk.c
@@ -43,7 +43,7 @@
*
* This file is part of the Contiki operating system.
*
- * $Id: ctk.c,v 1.44 2004/12/27 22:03:04 oliverschmidt Exp $
+ * $Id: ctk.c,v 1.45 2005/03/15 15:51:17 oliverschmidt Exp $
*
*/
@@ -646,7 +646,7 @@
/* Draw the windows from back to front. */
for(; w != windows; w = w->prev) {
ctk_draw_clear_window(w, 0, clipy1, clipy2);
- ctk_draw_window(w, 0, clipy1, clipy2);
+ ctk_draw_window(w, 0, clipy1, clipy2, 1);
}
/* Draw focused window */
@@ -654,7 +654,7 @@
CTK_FOCUS_WIDGET|CTK_FOCUS_WINDOW:
CTK_FOCUS_WINDOW;
ctk_draw_clear_window(windows, focus, clipy1, clipy2);
- ctk_draw_window(windows, focus, clipy1, clipy2);
+ ctk_draw_window(windows, focus, clipy1, clipy2, 1);
}
/* Draw dialog (if any) */
@@ -716,7 +716,7 @@
#endif /* CTK_CONF_MENUS */
windows == w) {
ctk_draw_window(w, CTK_FOCUS_WINDOW,
- 0, height);
+ 0, height, 0);
}
}
/*-----------------------------------------------------------------------------------*/
diff --git a/contiki/doc/ctk.txt b/contiki/doc/ctk.txt
index 6748d3d..a2fa85c 100644
--- a/contiki/doc/ctk.txt
+++ b/contiki/doc/ctk.txt
@@ -3,7 +3,7 @@
so-called ctk-draw and ctk-arch layers).
Author: Adam Dunkels <adam@dunkels.com>
-Version: $Id: ctk.txt,v 1.2 2003/04/02 09:54:00 adamdunkels Exp $
+Version: $Id: ctk.txt,v 1.3 2005/03/15 15:53:51 oliverschmidt Exp $
* Introduction *
@@ -83,7 +83,8 @@
void ctk_draw_window(struct ctk_window *window,
unsigned char focus,
unsigned char clipy1,
- unsigned char clipy2);
+ unsigned char clipy2,
+ unsigned char draw_borders);
void ctk_draw_dialog(struct ctk_window *dialog);
void ctk_draw_widget(struct ctk_widget *w,
unsigned char focus,
@@ -229,7 +230,8 @@
void ctk_draw_window(struct ctk_window *window,
unsigned char focus,
unsigned char clipy1,
- unsigned char clipy2);
+ unsigned char clipy2,
+ unsigned char draw_borders);
The "clipy1" and "clipy2" parameters specify the first and last + 1
lines on screen that actually should be drawn (if clipy1 = 2 and
@@ -242,6 +244,8 @@
CTK_FOCUS_WINDOW. Windows with a focus of CTK_FOCUS_WINDOW is usually
drawn in a brighter color than those with CTK_FOCUS_NONE.
+The draw_borders parameter specifies if the window frame should be drawn.
+
Finally, the "window" parameter gives the actual window to be
drawn. This is specified as a struct ctk_window, which is defined in
the file ctk/ctk.h as:
@@ -290,8 +294,10 @@
A pseudo-code implementation of a ctk_draw_window() function might
look like this:
- ctk_draw_window(window, focus, clipy1, clipy2) {
- draw_window_borders(window, focus, clipy1, clipy2);
+ ctk_draw_window(window, focus, clipy1, clipy2, draw_borders) {
+ if(draw_borders) {
+ draw_window_borders(window, focus, clipy1, clipy2);
+ }
foreach(widget, window->inactive) {
draw_widget(widget, focus, clipy1, clipy2);
}