1 /* 2 * $Id: mousewget.c,v 1.22 2012/11/30 10:23:49 tom Exp $ 3 * 4 * mousewget.c -- mouse/wgetch support for dialog 5 * 6 * Copyright 2000-2008,2012 Thomas E. Dickey 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU Lesser General Public License, version 2.1 10 * as published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this program; if not, write to 19 * Free Software Foundation, Inc. 20 * 51 Franklin St., Fifth Floor 21 * Boston, MA 02110, USA. 22 */ 23 24 #include <dialog.h> 25 #include <dlg_keys.h> 26 27 static int 28 mouse_wgetch(WINDOW *win, int *fkey, bool ignore_errs) 29 { 30 int mouse_err = FALSE; 31 int key; 32 33 do { 34 35 key = dlg_getc(win, fkey); 36 37 #if USE_MOUSE 38 39 mouse_err = FALSE; 40 if (key == KEY_MOUSE) { 41 MEVENT event; 42 mseRegion *p; 43 44 if (getmouse(&event) != ERR) { 45 if ((p = dlg_mouse_region(event.y, event.x)) != 0) { 46 key = DLGK_MOUSE(p->code); 47 } else if ((p = dlg_mouse_bigregion(event.y, event.x)) != 0) { 48 int x = event.x - p->x; 49 int y = event.y - p->y; 50 int row = (p->X - p->x) / p->step_x; 51 52 key = -(p->code); 53 switch (p->mode) { 54 case 1: /* index by lines */ 55 key += y; 56 break; 57 case 2: /* index by columns */ 58 key += (x / p->step_x); 59 break; 60 default: 61 case 3: /* index by cells */ 62 key += (x / p->step_x) + (y * row); 63 break; 64 } 65 } else { 66 (void) beep(); 67 mouse_err = TRUE; 68 } 69 } else { 70 (void) beep(); 71 mouse_err = TRUE; 72 } 73 } 74 #endif 75 76 } while (ignore_errs && mouse_err); 77 78 return key; 79 } 80 81 int 82 dlg_mouse_wgetch(WINDOW *win, int *fkey) 83 { 84 return mouse_wgetch(win, fkey, TRUE); 85 } 86 87 int 88 dlg_mouse_wgetch_nowait(WINDOW *win, int *fkey) 89 { 90 return mouse_wgetch(win, fkey, FALSE); 91 } 92