/* Terminality - a portable terminal handling library * Copyright (C) 1998-2002, Emil Mikulic. * This is LGPL - look at COPYING.LIB */ /* Project: Terminality * File: keyhndl.c * Authors: Michal Safranek * Description: Keyboard handler */ #include "keyhndl.h" #include "elements.h" const char keyhndl_rcsid[] = "$Id: keyhndl.c,v 1.8 2002/07/26 01:39:40 darkmoon Exp $"; /* keys */ tn_list *handled_keys = NULL; /* Returns position # in list by key, -1 if not found */ int real_get_key_position(tn_list *v, key k) { int i; key_struct *tmp = NULL; for(i = 0; i < tn_list_size(v); i++) { tmp = (key_struct *) tn_list_getdata(v, i); assert(tmp != NULL); if(tmp->name == k) return i; } return -1; } /* Registers key */ int real_register_key(tn_list **v, key k, key (*fce)(key, element_type, void *), int overwrite) { int pos; key_struct *ks = NULL, *tmp = NULL; if ((pos = real_get_key_position(*v, k)) != -1) { if(!overwrite) return 0; tmp = (key_struct *) tn_list_getdata(*v, pos); assert(tmp != NULL); tmp->fce = fce; return 1; } ks = (key_struct *) xmalloc(sizeof(key_struct)); ks->name = k; ks->fce = fce; if (*v) tn_list_add(*v, ks); else *v = tn_list_new(ks); return 1; } /* Unregisters key */ int real_unregister_key(tn_list **v, key k) { int pos; key_struct *ks = NULL; if ((pos = real_get_key_position(*v, k)) == -1) return 0; ks = tn_list_getdata(*v, pos); xfree(ks); tn_list_delete(*v, pos); return 1; } /* Default redraw handler */ int dflt_rdrw_hndlr(key k, element_type t, void *p) { elements_redraw(1); return KEY_NOTHING; } /* Set default keys */ void default_keys(void) { real_delete_keys(&handled_keys); real_register_key(&handled_keys, KEY_REDRAW, &dflt_rdrw_hndlr, 0); } /* Delete all keys */ void real_delete_keys(tn_list **v) { int i; if (*v) { for (i = 0; i < tn_list_size(*v); i++) { xfree(tn_list_getdata(*v, i)); } tn_list_free(*v); tn_list_kill(*v); *v = NULL; } } /* Handles pressed key (from element type=type, address=ptr) */ int real_handle_key(tn_list **v, key k, element_type type, void *ptr) { int pos; key_struct *tmp = NULL; if(k == KEY_NOTHING) return KEY_NOTHING; #if 1 // 'Supervise' key patch if((pos = real_get_key_position(*v, KEY_SUPERVISE)) != -1){ // Do we have? tmp = tn_list_getdata(*v, pos); assert(tmp != NULL); k = tmp->fce(k, type, ptr); } if(k == KEY_NOTHING) return KEY_NOTHING; #endif if((pos = real_get_key_position(*v, k)) == -1) return k; tmp = tn_list_getdata(*v, pos); assert(tmp != NULL); return tmp->fce(k, type, ptr); }