1 /* 2 * $Id: mousewget.c,v 1.24 2017/01/31 00:27:21 tom Exp $ 3 * 4 * mousewget.c -- mouse/wgetch support for dialog 5 * 6 * Copyright 2000-2016,2017 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 DLG_TRACE(("# mouse-click abs %d,%d (rel %d,%d)\n", 46 event.y, event.x, 47 event.y - getbegy(win), 48 event.x - getbegx(win))); 49 if ((p = dlg_mouse_region(event.y, event.x)) != 0) { 50 key = DLGK_MOUSE(p->code); 51 } else if ((p = dlg_mouse_bigregion(event.y, event.x)) != 0) { 52 int x = event.x - p->x; 53 int y = event.y - p->y; 54 int row = (p->X - p->x) / p->step_x; 55 56 key = -(p->code); 57 switch (p->mode) { 58 case 1: /* index by lines */ 59 key += y; 60 break; 61 case 2: /* index by columns */ 62 key += (x / p->step_x); 63 break; 64 default: 65 case 3: /* index by cells */ 66 key += (x / p->step_x) + (y * row); 67 break; 68 } 69 } else { 70 (void) beep(); 71 mouse_err = TRUE; 72 } 73 } else { 74 (void) beep(); 75 mouse_err = TRUE; 76 } 77 } 78 #endif 79 80 } while (ignore_errs && mouse_err); 81 82 return key; 83 } 84 85 int 86 dlg_mouse_wgetch(WINDOW *win, int *fkey) 87 { 88 return mouse_wgetch(win, fkey, TRUE); 89 } 90 91 int 92 dlg_mouse_wgetch_nowait(WINDOW *win, int *fkey) 93 { 94 return mouse_wgetch(win, fkey, FALSE); 95 } 96