#include #include #include "main.h" #include "interface.h" #include "font.h" #include "widget.h" #include "catchkey.h" widget_t *newWidgetCatchkey(int key, int x, int y, void *event) { widget_catchkey_t *new; new = malloc(sizeof(widget_catchkey_t)); new->key = key; new->fce_event = event; new->active = FALSE; return newWidget(WIDGET_TYPE_CATCHKEY, x, y, WIDGET_CATCHKEY_WIDTH, WIDGET_CATCHKEY_HEIGHT, new); } int getWidgetCatchKey(widget_t * widget) { widget_catchkey_t *p; assert(widget != NULL); assert(widget->type == WIDGET_TYPE_CATCHKEY); p = (widget_catchkey_t *) widget->private_data; return p->key; } void setWidgetCatchKey(widget_t * widget, int key) { widget_catchkey_t *p; assert(widget != NULL); assert(widget->type == WIDGET_TYPE_CATCHKEY); p = (widget_catchkey_t *) widget->private_data; p->key = key; } void drawWidgetCatchkey(widget_t * widget) { widget_catchkey_t *p; char *name; assert(widget != NULL); assert(widget->type == WIDGET_TYPE_CATCHKEY); p = (widget_catchkey_t *) widget->private_data; name = NULL; if (p->key != WIDGET_CATCHKEY_NOKEY) { name = (char *) SDL_GetKeyName(p->key); } if (name == NULL) { name = "no key"; } if (p->active) { drawFont(name, widget->x, widget->y, COLOR_RED); } else { drawFont(name, widget->x, widget->y, COLOR_WHITE); } } static int getPessAnyKey() { Uint8 *mapa; int i; mapa = SDL_GetKeyState(NULL); for (i = SDLK_FIRST; i <= SDLK_COMPOSE; i++) { if (i == SDLK_NUMLOCK || // black key i == SDLK_CAPSLOCK || i == SDLK_SCROLLOCK) { continue; } if (mapa[i] == SDL_PRESSED) { return i; } } return WIDGET_CATCHKEY_NOKEY; } void eventWidgetCatchkey(widget_t * widget) { widget_catchkey_t *p; int x, y; assert(widget != NULL); assert(widget->type == WIDGET_TYPE_CATCHKEY); p = (widget_catchkey_t *) widget->private_data; getMousePosition(&x, &y); if (isMouseClicked()) { if (x >= widget->x && x <= widget->x + WIDGET_CATCHKEY_WIDTH && y >= widget->y && y <= widget->y + WIDGET_CATCHKEY_HEIGHT) { p->active = TRUE; } else { p->active = FALSE; } } if (p->active == TRUE) { int key; key = getPessAnyKey(); if (key != WIDGET_CATCHKEY_NOKEY) { p->key = key; p->fce_event(widget); } } } void destroyWidgetCatchkey(widget_t * widget) { widget_catchkey_t *p; assert(widget != NULL); assert(widget->type == WIDGET_TYPE_CATCHKEY); p = (widget_catchkey_t *) widget->private_data; free(p); destroyWidget(widget); }