blob: bb0da8ea096d776af2364dea1681420fb5382785 [file] [log] [blame]
/*
* Copyright (c) 2002, Adam Dunkels.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgement:
* This product includes software developed by Adam Dunkels.
* 4. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the "ctk" console GUI toolkit for cc65
*
* $Id: ctk.h,v 1.2 2003/04/09 19:15:27 adamdunkels Exp $
*
*/
#ifndef __CTK_H__
#define __CTK_H__
#include "ctk-conf.h"
#include "ek.h"
#include "cc.h"
/* Defintions for the CTK widget types. */
#define CTK_WIDGET_SEPARATOR 1
#define CTK_WIDGET_LABEL 2
#define CTK_WIDGET_BUTTON 3
#define CTK_WIDGET_HYPERLINK 4
#define CTK_WIDGET_TEXTENTRY 5
#define CTK_WIDGET_BITMAP 6
#define CTK_WIDGET_ICON 7
struct ctk_widget;
#define CTK_SEPARATOR(x, y, w) \
NULL, NULL, x, y, CTK_WIDGET_SEPARATOR, w
struct ctk_separator {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
};
#define CTK_BUTTON(x, y, w, text) \
NULL, NULL, x, y, CTK_WIDGET_BUTTON, w, text
struct ctk_button {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
char *text;
};
#define CTK_LABEL(x, y, w, h, text) \
NULL, NULL, x, y, CTK_WIDGET_LABEL, w, text, h
struct ctk_label {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
char *text;
unsigned char h;
};
#define CTK_HYPERLINK(x, y, w, text, url) \
NULL, NULL, x, y, CTK_WIDGET_HYPERLINK, w, text, url
struct ctk_hyperlink {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
char *text;
char *url;
};
/* Editing modes of the CTK textentry widget. */
#define CTK_TEXTENTRY_NORMAL 0
#define CTK_TEXTENTRY_EDIT 1
#define CTK_TEXTENTRY(x, y, w, h, text, len) \
NULL, NULL, x, y, CTK_WIDGET_TEXTENTRY, w, text, h, len, \
CTK_TEXTENTRY_NORMAL, 0, 0
struct ctk_textentry {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
char *text;
unsigned char h;
unsigned char len;
unsigned char state;
unsigned char xpos, ypos;
};
#define CTK_ICON(title, bitmap, textmap) \
NULL, NULL, 0, 0, CTK_WIDGET_ICON, 0, title, 4, 0, bitmap, textmap
struct ctk_icon {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
char *title;
unsigned char h;
ek_id_t owner;
unsigned char *bitmap;
char *textmap;
};
#define CTK_BITMAP(x, y, w, h, bitmap) \
NULL, NULL, x, y, CTK_WIDGET_BITMAP, w, bitmap, h
struct ctk_bitmap {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
unsigned char *bitmap;
unsigned char h;
};
struct ctk_widget_button {
char *text;
};
struct ctk_widget_label {
char *text;
unsigned char h;
};
struct ctk_widget_hyperlink {
char *text;
char *url;
};
struct ctk_widget_textentry {
char *text;
unsigned char h;
unsigned char len;
unsigned char state;
unsigned char xpos, ypos;
};
struct ctk_widget_icon {
char *title;
unsigned char h;
ek_id_t owner;
unsigned char *bitmap;
char *textmap;
};
struct ctk_widget_bitmap {
unsigned char *bitmap;
unsigned char h;
};
struct ctk_widget {
struct ctk_widget *next;
struct ctk_window *window;
unsigned char x, y;
unsigned char type;
unsigned char w;
union {
struct ctk_widget_label label;
struct ctk_widget_button button;
struct ctk_widget_hyperlink hyperlink;
struct ctk_widget_textentry textentry;
struct ctk_widget_icon icon;
struct ctk_widget_bitmap bitmap;
} widget;
};
/* Definition of the CTK window structure. */
struct ctk_window {
struct ctk_window *next, *prev;
ek_id_t owner;
char *title;
unsigned char titlelen;
#if CTK_CONF_WINDOWCLOSE
struct ctk_button closebutton;
#else /* CTK_CONF_WINDOWCLOSE */
struct ctk_label closebutton;
#endif /* CTK_CONF_WINDOWCLOSE */
#if CTK_CONF_WINDOWMOVE
struct ctk_button titlebutton;
#else /* CTK_CONF_WINDOWMOVE */
struct ctk_label titlebutton;
#endif /* CTK_CONF_WINDOWMOVE */
unsigned char x, y;
unsigned char w, h;
struct ctk_widget *inactive;
struct ctk_widget *active;
struct ctk_widget *focused;
};
struct ctk_menuitem {
char *title;
unsigned char titlelen;
};
struct ctk_menu {
struct ctk_menu *next;
char *title;
unsigned char titlelen;
#if CC_UNSIGNED_CHAR_BUGS
unsigned char nitems;
unsigned char active;
#else /* CC_UNSIGNED_CHAR_BUGS */
unsigned char nitems;
unsigned char active;
#endif /* CC_UNSIGNED_CHAR_BUGS */
struct ctk_menuitem items[CTK_CONF_MAXMENUITEMS];
};
struct ctk_menus {
struct ctk_menu *menus;
struct ctk_menu *open;
struct ctk_menu *desktopmenu;
};
/* Global CTK modes. */
#define CTK_MODE_NORMAL 0
#define CTK_MODE_WINDOWMOVE 1
#define CTK_MODE_SCREENSAVER 2
#define CTK_MODE_EXTERNAL 3
/* General ctk functions. */
void ctk_init(void);
void ctk_mode_set(unsigned char mode);
unsigned char ctk_mode_get(void);
void ctk_redraw(void);
/* Functions for manipulating windows. */
void ctk_window_new(struct ctk_window *window,
unsigned char w, unsigned char h,
char *title);
void ctk_window_clear(struct ctk_window *w);
void ctk_window_open(struct ctk_window *w);
#define ctk_window_move(w,xpos,ypos) do {(w)->x=xpos; (w)->y=ypos;}while(0)
void ctk_window_close(struct ctk_window *w);
void ctk_window_redraw(struct ctk_window *w);
#define ctk_window_isopen(w) ((w)->next != NULL)
/* Functions for manipulating dialogs. */
void ctk_dialog_new(struct ctk_window *window,
unsigned char w, unsigned char h);
void ctk_dialog_open(struct ctk_window *d);
void ctk_dialog_close(void);
/* Functions for manipulating menus. */
void ctk_menu_new(struct ctk_menu *menu, char *title);
void ctk_menu_add(struct ctk_menu *menu);
void ctk_menu_remove(struct ctk_menu *menu);
unsigned char ctk_menuitem_add(struct ctk_menu *menu, char *name);
/* Functions for icons. */
#define CTK_ICON_ADD(icon, id) ctk_icon_add((struct ctk_widget *)icon, id)
void ctk_icon_add(struct ctk_widget *icon, ek_id_t id);
/* Functions for manipulating widgets. */
#define CTK_WIDGET_ADD(win, widg) \
ctk_widget_add(win, (struct ctk_widget *)widg)
void ctk_widget_add(struct ctk_window *window,
struct ctk_widget *widget);
#define CTK_WIDGET_FOCUS(win, widg) \
(win)->focused = (struct ctk_widget *)(widg)
#define CTK_WIDGET_REDRAW(widg) \
ctk_widget_redraw((struct ctk_widget *)widg)
void ctk_widget_redraw(struct ctk_widget *w);
#define CTK_WIDGET_YPOS(w) (((struct ctk_widget *)(w))->y)
#define ctk_textentry_set_height(w, height) \
(w)->widget.textentry.h = (height)
#define ctk_label_set_height(w, height) \
(w)->widget.label.h = (height)
#define ctk_label_set_text(l, t) (l)->text = (t)
#define ctk_button_set_text(b, t) (b)->text = (t)
#define CTK_BUTTON_NEW(widg, xpos, ypos, width, buttontext) \
(widg)->window = NULL; \
(widg)->next = NULL; \
(widg)->type = CTK_WIDGET_BUTTON; \
(widg)->x = (xpos); \
(widg)->y = (ypos); \
(widg)->w = (width); \
(widg)->text = (buttontext)
#define CTK_LABEL_NEW(widg, xpos, ypos, width, height, labeltext) \
(widg)->window = NULL; \
(widg)->next = NULL; \
(widg)->type = CTK_WIDGET_LABEL; \
(widg)->x = (xpos); \
(widg)->y = (ypos); \
(widg)->w = (width); \
(widg)->h = (height); \
(widg)->text = (labeltext)
#define CTK_TEXTENTRY_NEW(widg, xxpos, yypos, width, height, textptr, textlen) \
(widg)->window = NULL; \
(widg)->next = NULL; \
(widg)->type = CTK_WIDGET_TEXTENTRY; \
(widg)->x = (xxpos); \
(widg)->y = (yypos); \
(widg)->w = (width); \
(widg)->h = (height); \
(widg)->text = (textptr); \
(widg)->len = (textlen); \
(widg)->state = CTK_TEXTENTRY_NORMAL; \
(widg)->xpos = 0; \
(widg)->ypos = 0
#define CTK_HYPERLINK_NEW(widg, xpos, ypos, width, linktext, linkurl) \
(widg)->window = NULL; \
(widg)->next = NULL; \
(widg)->type = CTK_WIDGET_HYPERLINK; \
(widg)->x = (xpos); \
(widg)->y = (ypos); \
(widg)->w = (width); \
(widg)->text = (linktext); \
(widg)->url = (linkurl)
/* Signals. */
extern ek_signal_t ctk_signal_keypress,
ctk_signal_timer,
ctk_signal_button_activate,
ctk_signal_button_hover,
ctk_signal_hyperlink_activate,
ctk_signal_hyperlink_hover,
ctk_signal_menu_activate,
ctk_signal_window_close,
ctk_signal_pointer_move,
ctk_signal_pointer_down,
ctk_signal_pointer_up;
/* Focus flags */
#define CTK_FOCUS_NONE 0
#define CTK_FOCUS_WIDGET 1
#define CTK_FOCUS_WINDOW 2
#define CTK_FOCUS_DIALOG 4
#endif /* __CTK_H__ */