Rewrote small parts in order to reduce code size.
diff --git a/contiki/ctk/ctk.c b/contiki/ctk/ctk.c
index 61cd3e6..76a1a62 100644
--- a/contiki/ctk/ctk.c
+++ b/contiki/ctk/ctk.c
@@ -32,7 +32,7 @@
*
* This file is part of the "ctk" console GUI toolkit for cc65
*
- * $Id: ctk.c,v 1.26 2003/08/12 21:12:59 adamdunkels Exp $
+ * $Id: ctk.c,v 1.27 2003/08/15 18:49:22 adamdunkels Exp $
*
*/
@@ -294,7 +294,7 @@
void
ctk_window_close(struct ctk_window *w)
{
- struct ctk_window *w2;
+ static struct ctk_window *w2;
if(w == NULL) {
return;
@@ -407,7 +407,7 @@
do_redraw_all(unsigned char clipy1, unsigned char clipy2)
{
struct ctk_window *w;
- struct ctk_widget *widget;
+ static struct ctk_widget *widget;
if(mode != CTK_MODE_NORMAL &&
mode != CTK_MODE_WINDOWMOVE) {
@@ -931,7 +931,7 @@
activate_menu(void)
{
struct ctk_window *w;
-
+
lastmenu = menus.open;
if(menus.open == &desktopmenu) {
for(w = windows; w != NULL; w = w->next) {
@@ -1009,6 +1009,20 @@
}
/*-----------------------------------------------------------------------------------*/
static void
+unfocus_widget(CC_REGISTER_ARG struct ctk_widget *w)
+{
+ if(w != NULL) {
+ redraw |= REDRAW_WIDGETS;
+ add_redrawwidget(w);
+ if(CTK_WIDGET_TYPE(w) == CTK_WIDGET_TEXTENTRY) {
+ ((struct ctk_textentry *)w)->state =
+ CTK_TEXTENTRY_NORMAL;
+ }
+ w->window->focused = NULL;
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
ctk_idle(void)
{
static ctk_arch_key_t c;
@@ -1071,7 +1085,7 @@
#if CTK_CONF_MOUSE_SUPPORT
|| mouse_moved || mouse_button_changed
#endif /* CTK_CONF_MOUSE_SUPPORT */
- ) {
+ ) {
dispatcher_emit(ctk_signal_screensaver_stop, NULL,
DISPATCHER_BROADCAST);
mode = CTK_MODE_NORMAL;
@@ -1091,17 +1105,21 @@
/* Here we should do whatever needs to be done when the mouse
moves around and clicks in the menubar. */
if(mouse_clicked) {
+ static unsigned char titlelen;
+
/* Find out which menu that the mouse pointer is in. Start
with the ->next menu after the desktop menu. We assume
that the menus start one character from the left screen
side and that the desktop menu is farthest to the
right. */
menux = 1;
- for(menu = menus.menus->next; menu != NULL; menu = menu->next) {
- if(mxc >= menux && mxc <= menux + menu->titlelen) {
+ for(menu = menus.menus->next;
+ menu != NULL; menu = menu->next) {
+ titlelen = menu->titlelen;
+ if(mxc >= menux && mxc <= menux + titlelen) {
break;
}
- menux += menu->titlelen;
+ menux += titlelen;
}
/* Also check desktop menu. */
@@ -1117,6 +1135,8 @@
--myc;
if(menus.open != NULL) {
+ static unsigned char nitems;
+
/* Do whatever needs to be done when a menu is open. */
/* First check if the mouse pointer is in the currently open
@@ -1131,19 +1151,20 @@
}
}
+ nitems = menus.open->nitems;
/* Find out which of the menu items the mouse is pointing
to. */
- if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH) {
- if(myc <= menus.open->nitems) {
+ if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH) {
+ if(myc <= nitems) {
menus.open->active = myc;
} else {
- menus.open->active = menus.open->nitems - 1;
+ menus.open->active = nitems - 1;
}
}
if(mouse_clicked) {
if(mxc >= menux && mxc <= menux + CTK_CONF_MENUWIDTH &&
- myc <= menus.open->nitems) {
+ myc <= nitems) {
redraw |= activate_menu();
} else {
lastmenu = menus.open;
@@ -1160,7 +1181,9 @@
if(dialog != NULL) {
window = dialog;
} else {
- for(window = windows; window != NULL; window = window->next) {
+ for(window = windows; window != NULL;
+ window = window->next) {
+
/* Check if the mouse is within the window. */
if(mxc >= window->x &&
mxc <= window->x + window->w &&
@@ -1186,9 +1209,10 @@
if(windows != NULL &&
window != windows &&
windows->focused != NULL){
- add_redrawwidget(windows->focused);
+ /*add_redrawwidget(windows->focused);
windows->focused = NULL;
- redraw |= REDRAW_WIDGETS;
+ redraw |= REDRAW_WIDGETS;*/
+ unfocus_widget(windows->focused);
}
if(window != NULL) {
@@ -1214,6 +1238,7 @@
activated. */
for(widget = window->active; widget != NULL;
widget = widget->next) {
+
if(mxc >= widget->x &&
mxc <= widget->x + widget->w &&
(myc == widget->y ||
@@ -1221,27 +1246,36 @@
/*widget->type == CTK_WIDGET_TEXTMAP ||*/
widget->type == CTK_WIDGET_ICON) &&
(myc >= widget->y &&
- myc <= widget->y + ((struct ctk_bitmap *)widget)->h)))) {
+ myc <= widget->y +
+ ((struct ctk_bitmap *)widget)->h)))) {
break;
}
}
-
+
+ /* if the mouse is moved in the focused window, we emit
+ a ctk_signal_pointer_move signal to the owner of the
+ window. */
if(mouse_moved &&
(window != &desktop_window ||
windows == NULL)) {
+
dispatcher_emit(ctk_signal_pointer_move, NULL,
window->owner);
-
+
+ /* If there was a focused widget that is not below the
+ mouse pointer, we remove focus from the widget and
+ redraw it. */
if(window->focused != NULL &&
widget != window->focused) {
- add_redrawwidget(window->focused);
+ /* add_redrawwidget(window->focused);
if(CTK_WIDGET_TYPE(window->focused) ==
CTK_WIDGET_TEXTENTRY) {
((struct ctk_textentry *)(window->focused))->state =
CTK_TEXTENTRY_NORMAL;
}
- window->focused = NULL;
+ window->focused = NULL;*/
+ unfocus_widget(window->focused);
}
redraw |= REDRAW_WIDGETS;
if(widget != NULL) {
@@ -1325,13 +1359,14 @@
widget != NULL) {
redraw |= activate(widget);
} else {
- add_redrawwidget(widget);
if(widget != NULL &&
widget->type == CTK_WIDGET_TEXTENTRY) {
widget->widget.textentry.state = CTK_TEXTENTRY_EDIT;
textentry_input(c, (struct ctk_textentry *)widget);
+ add_redrawwidget(widget);
} else {
- window->focused = NULL;
+ /* window->focused = NULL;*/
+ unfocus_widget(window->focused);
dispatcher_emit(ctk_signal_keypress, (void *)c,
window->owner);
}
@@ -1343,10 +1378,6 @@
if(redraw & REDRAW_WIDGETS) {
widgetptr = redraw_widgets;
for(i = 0; i < MAX_REDRAWWIDGETS; ++i) {
- /* if(redraw_widgets[i] != NULL) {
- ctk_widget_redraw(redraw_widgets[i]);
- }
- redraw_widgets[i] = NULL;*/
ctk_widget_redraw(*widgetptr);
*widgetptr = NULL;
++widgetptr;
@@ -1427,17 +1458,12 @@
}
redraw = REDRAW_ALL;
break;
- case CH_ENTER:
- case CH_ESC:
+ default:
mode = CTK_MODE_NORMAL;
redraw = REDRAW_ALL;
break;
}
}
- /* if(redraw & REDRAW_ALL) {
- do_redraw_all(1, height);
- }
- redraw = 0;*/
#endif /* CTK_CONF_WINDOWMOVE */
}
@@ -1459,9 +1485,6 @@
}
} else if(redraw & REDRAW_WIDGETS) {
widgetptr = redraw_widgets;
- /* for(i = 0; i < redraw_widgetptr; ++i) {
- ctk_widget_redraw(redraw_widgets[i]);
- }*/
for(i = 0; i < MAX_REDRAWWIDGETS; ++i) {
ctk_widget_redraw(*widgetptr);
*widgetptr = NULL;
@@ -1473,30 +1496,3 @@
}
/*-----------------------------------------------------------------------------------*/
-#if 0
-static
-DISPATCHER_SIGHANDLER(ctk_sighandler, s, data)
-{
- DISPATCHER_SIGHANDLER_ARGS(s, data);
-
- if(s == ctk_signal_timer) {
- if(mode == CTK_MODE_NORMAL) {
- ++screensaver_timer;
- if(screensaver_timer == ctk_screensaver_timeout) {
-#if CTK_CONF_SCREENSAVER
- dispatcher_emit(ctk_signal_screensaver_start, NULL,
- DISPATCHER_BROADCAST);
-#ifdef CTK_SCREENSAVER_INIT
- CTK_SCREENSAVER_INIT();
-#endif /* CTK_SCREENSAVER_INIT */
- mode = CTK_MODE_SCREENSAVER;
-#endif /* CTK_CONF_SCREENSAVER */
- screensaver_timer = 0;
- }
- }
- dispatcher_timer(ctk_signal_timer, data, CLK_TCK);
- }
-}
-#endif /* 0 */
-/*-----------------------------------------------------------------------------------*/
-