diff options
Diffstat (limited to 'aewl/button.c')
-rw-r--r-- | aewl/button.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/aewl/button.c b/aewl/button.c new file mode 100644 index 0000000..3112a1c --- /dev/null +++ b/aewl/button.c @@ -0,0 +1,96 @@ +/* +Copyright (c) 2003 Bruno T. C. de Oliveira + +LICENSE INFORMATION: +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Copyright (c) 2002 Bruno T. C. de Oliveira + +INFORMAÇÕES DE LICENÇA: +Este programa é um software de livre distribuição; você pode +redistribuí-lo e/ou modificá-lo sob os termos da GNU General +Public License, conforme publicado pela Free Software Foundation, +pela versão 2 da licença ou qualquer versão posterior. + +Este programa é distribuído na esperança de que ele será útil +aos seus usuários, porém, SEM QUAISQUER GARANTIAS; sem sequer +a garantia implícita de COMERCIABILIDADE ou DE ADEQUAÇÃO A +QUALQUER FINALIDADE ESPECÍFICA. Consulte a GNU General Public +License para obter mais detalhes (uma cópia acompanha este +programa, armazenada no arquivo COPYING). +*/ + +#include "aewl.h" +#include "button.h" +#include "util.h" +#include <string.h> +#include <stdlib.h> + +AewlWidget *aewl_button_create(int x, int y, int width, int shortcut, + int result, const char *caption) { + AewlButton *b = malloc(sizeof(AewlButton)); + if (!b) return NULL; + memset(b, 0, sizeof(AewlButton)); + + if (width <= 0) width = aewl_util_strlen_esc(caption) + 2; + + aewl_widget_fill_defaults(&(b->base)); + b->base.x = x; + b->base.y = y; + b->base.height = 1; + b->base.width = width; + b->base.focusable = true; + b->base.shortcut = shortcut; + + b->base.fn_repaint = aewl_button_repaint; + b->base.fn_destroy = aewl_button_destroy; + b->base.fn_handlekey = aewl_button_handlekey; + + b->caption = strdup(caption); + b->result = result; + + return (AewlWidget*) b; +} + +void aewl_button_destroy(AewlWidget *button) { + AewlButton *b = (AewlButton*) button; + if (b->caption) free(b->caption); + free(b); +} + +void aewl_button_repaint(AewlWidget *button, bool focused) { + AewlButton *b = (AewlButton*) button; + int i; + int cx; + + wattrset(b->base.win, AEWL_ATTR(button, focused, false)); + + /* print button background by just placing spaces */ + wmove(b->base.win, b->base.y, b->base.x); + for (i = 0; i < b->base.width; i++) waddch(b->base.win, ' '); + + /* center caption and print it */ + cx = (2 * b->base.x + b->base.width - strlen(b->caption)) / 2; + aewl_util_mvwaddstr(b->base.win, b->base.y, cx, + AEWL_ATTR(button, focused, false), + AEWL_ATTR(button, focused, true), + b->caption); +} + +int aewl_button_handlekey(AewlWidget *button, int ch) { + AewlButton *b = (AewlButton*) button; + return (ch == 10 || ch == ' ') ? b->result : 0; +} + + |