1 /* 2 * $Id: mouse.c,v 1.20 2012/12/21 10:00:30 tom Exp $ 3 * 4 * mouse.c -- mouse support for dialog 5 * 6 * Copyright 2002-2007,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 #if USE_MOUSE 28 29 static int basex, basey, basecode; 30 31 static mseRegion *regionList = NULL; 32 33 /*=========== region related functions =============*/ 34 35 static mseRegion * 36 find_region_by_code(int code) 37 { 38 mseRegion *butPtr; 39 40 for (butPtr = regionList; butPtr; butPtr = butPtr->next) { 41 if (code == butPtr->code) 42 break; 43 } 44 return butPtr; 45 } 46 47 void 48 dlg_mouse_setbase(int x, int y) 49 { 50 basex = x; 51 basey = y; 52 } 53 54 void 55 dlg_mouse_setcode(int code) 56 { 57 basecode = code; 58 } 59 60 void 61 dlg_mouse_mkbigregion(int y, int x, 62 int height, int width, 63 int code, 64 int step_y, int step_x, 65 int mode) 66 { 67 mseRegion *butPtr = dlg_mouse_mkregion(y, x, height, width, -DLGK_MOUSE(code)); 68 butPtr->mode = mode; 69 butPtr->step_x = MAX(1, step_x); 70 butPtr->step_y = MAX(1, step_y); 71 } 72 73 void 74 dlg_mouse_free_regions(void) 75 { 76 while (regionList != 0) { 77 mseRegion *butPtr = regionList->next; 78 free(regionList); 79 regionList = butPtr; 80 } 81 } 82 83 mseRegion * 84 dlg_mouse_mkregion(int y, int x, int height, int width, int code) 85 { 86 mseRegion *butPtr; 87 88 if ((butPtr = find_region_by_code(basecode + code)) == 0) { 89 butPtr = dlg_malloc(mseRegion, 1); 90 assert_ptr(butPtr, "dlg_mouse_mkregion"); 91 butPtr->next = regionList; 92 regionList = butPtr; 93 } 94 if (butPtr != 0) { 95 butPtr->mode = -1; 96 butPtr->step_x = 0; 97 butPtr->step_y = 0; 98 butPtr->y = basey + y; 99 butPtr->Y = basey + y + height; 100 butPtr->x = basex + x; 101 butPtr->X = basex + x + width; 102 butPtr->code = basecode + code; 103 } 104 return butPtr; 105 } 106 107 /* retrieve the frame under the pointer */ 108 static mseRegion * 109 any_mouse_region(int y, int x, int small) 110 { 111 mseRegion *butPtr; 112 113 for (butPtr = regionList; butPtr; butPtr = butPtr->next) { 114 if (small ^ (butPtr->code >= 0)) { 115 continue; 116 } 117 if (y < butPtr->y || y >= butPtr->Y) { 118 continue; 119 } 120 if (x < butPtr->x || x >= butPtr->X) { 121 continue; 122 } 123 break; /* found */ 124 } 125 return butPtr; 126 } 127 128 /* retrieve the frame under the pointer */ 129 mseRegion * 130 dlg_mouse_region(int y, int x) 131 { 132 return any_mouse_region(y, x, TRUE); 133 } 134 135 /* retrieve the bigframe under the pointer */ 136 mseRegion * 137 dlg_mouse_bigregion(int y, int x) 138 { 139 return any_mouse_region(y, x, FALSE); 140 } 141 142 #else 143 void mouse_dummy(void); 144 void 145 mouse_dummy(void) 146 { 147 } 148 #endif /* USE_MOUSE */ 149