1217309Snwhitehorn/* 2251843Sbapt * $Id: mouse.c,v 1.20 2012/12/21 10:00:30 tom Exp $ 3217309Snwhitehorn * 4217309Snwhitehorn * mouse.c -- mouse support for dialog 5217309Snwhitehorn * 6251843Sbapt * Copyright 2002-2007,2012 Thomas E. Dickey 7217309Snwhitehorn * 8217309Snwhitehorn * This program is free software; you can redistribute it and/or modify 9217309Snwhitehorn * it under the terms of the GNU Lesser General Public License, version 2.1 10217309Snwhitehorn * as published by the Free Software Foundation. 11217309Snwhitehorn * 12217309Snwhitehorn * This program is distributed in the hope that it will be useful, but 13217309Snwhitehorn * WITHOUT ANY WARRANTY; without even the implied warranty of 14217309Snwhitehorn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15217309Snwhitehorn * Lesser General Public License for more details. 16217309Snwhitehorn * 17217309Snwhitehorn * You should have received a copy of the GNU Lesser General Public 18217309Snwhitehorn * License along with this program; if not, write to 19217309Snwhitehorn * Free Software Foundation, Inc. 20217309Snwhitehorn * 51 Franklin St., Fifth Floor 21217309Snwhitehorn * Boston, MA 02110, USA. 22217309Snwhitehorn */ 23217309Snwhitehorn 24217309Snwhitehorn#include <dialog.h> 25217309Snwhitehorn#include <dlg_keys.h> 26217309Snwhitehorn 27217309Snwhitehorn#if USE_MOUSE 28217309Snwhitehorn 29251843Sbaptstatic int basex, basey, basecode; 30217309Snwhitehorn 31217309Snwhitehornstatic mseRegion *regionList = NULL; 32217309Snwhitehorn 33217309Snwhitehorn/*=========== region related functions =============*/ 34217309Snwhitehorn 35217309Snwhitehornstatic mseRegion * 36217309Snwhitehornfind_region_by_code(int code) 37217309Snwhitehorn{ 38217309Snwhitehorn mseRegion *butPtr; 39217309Snwhitehorn 40217309Snwhitehorn for (butPtr = regionList; butPtr; butPtr = butPtr->next) { 41217309Snwhitehorn if (code == butPtr->code) 42217309Snwhitehorn break; 43217309Snwhitehorn } 44217309Snwhitehorn return butPtr; 45217309Snwhitehorn} 46217309Snwhitehorn 47217309Snwhitehornvoid 48217309Snwhitehorndlg_mouse_setbase(int x, int y) 49217309Snwhitehorn{ 50217309Snwhitehorn basex = x; 51217309Snwhitehorn basey = y; 52217309Snwhitehorn} 53217309Snwhitehorn 54217309Snwhitehornvoid 55251843Sbaptdlg_mouse_setcode(int code) 56251843Sbapt{ 57251843Sbapt basecode = code; 58251843Sbapt} 59251843Sbapt 60251843Sbaptvoid 61217309Snwhitehorndlg_mouse_mkbigregion(int y, int x, 62217309Snwhitehorn int height, int width, 63217309Snwhitehorn int code, 64217309Snwhitehorn int step_y, int step_x, 65217309Snwhitehorn int mode) 66217309Snwhitehorn{ 67217309Snwhitehorn mseRegion *butPtr = dlg_mouse_mkregion(y, x, height, width, -DLGK_MOUSE(code)); 68217309Snwhitehorn butPtr->mode = mode; 69217309Snwhitehorn butPtr->step_x = MAX(1, step_x); 70217309Snwhitehorn butPtr->step_y = MAX(1, step_y); 71217309Snwhitehorn} 72217309Snwhitehorn 73217309Snwhitehornvoid 74217309Snwhitehorndlg_mouse_free_regions(void) 75217309Snwhitehorn{ 76217309Snwhitehorn while (regionList != 0) { 77217309Snwhitehorn mseRegion *butPtr = regionList->next; 78217309Snwhitehorn free(regionList); 79217309Snwhitehorn regionList = butPtr; 80217309Snwhitehorn } 81217309Snwhitehorn} 82217309Snwhitehorn 83217309SnwhitehornmseRegion * 84217309Snwhitehorndlg_mouse_mkregion(int y, int x, int height, int width, int code) 85217309Snwhitehorn{ 86217309Snwhitehorn mseRegion *butPtr; 87217309Snwhitehorn 88251843Sbapt if ((butPtr = find_region_by_code(basecode + code)) == 0) { 89217309Snwhitehorn butPtr = dlg_malloc(mseRegion, 1); 90217309Snwhitehorn assert_ptr(butPtr, "dlg_mouse_mkregion"); 91217309Snwhitehorn butPtr->next = regionList; 92217309Snwhitehorn regionList = butPtr; 93217309Snwhitehorn } 94217309Snwhitehorn if (butPtr != 0) { 95217309Snwhitehorn butPtr->mode = -1; 96217309Snwhitehorn butPtr->step_x = 0; 97217309Snwhitehorn butPtr->step_y = 0; 98217309Snwhitehorn butPtr->y = basey + y; 99217309Snwhitehorn butPtr->Y = basey + y + height; 100217309Snwhitehorn butPtr->x = basex + x; 101217309Snwhitehorn butPtr->X = basex + x + width; 102251843Sbapt butPtr->code = basecode + code; 103217309Snwhitehorn } 104217309Snwhitehorn return butPtr; 105217309Snwhitehorn} 106217309Snwhitehorn 107217309Snwhitehorn/* retrieve the frame under the pointer */ 108217309Snwhitehornstatic mseRegion * 109217309Snwhitehornany_mouse_region(int y, int x, int small) 110217309Snwhitehorn{ 111217309Snwhitehorn mseRegion *butPtr; 112217309Snwhitehorn 113217309Snwhitehorn for (butPtr = regionList; butPtr; butPtr = butPtr->next) { 114251843Sbapt if (small ^ (butPtr->code >= 0)) { 115217309Snwhitehorn continue; 116251843Sbapt } 117251843Sbapt if (y < butPtr->y || y >= butPtr->Y) { 118217309Snwhitehorn continue; 119251843Sbapt } 120251843Sbapt if (x < butPtr->x || x >= butPtr->X) { 121217309Snwhitehorn continue; 122251843Sbapt } 123217309Snwhitehorn break; /* found */ 124217309Snwhitehorn } 125217309Snwhitehorn return butPtr; 126217309Snwhitehorn} 127217309Snwhitehorn 128217309Snwhitehorn/* retrieve the frame under the pointer */ 129217309SnwhitehornmseRegion * 130217309Snwhitehorndlg_mouse_region(int y, int x) 131217309Snwhitehorn{ 132217309Snwhitehorn return any_mouse_region(y, x, TRUE); 133217309Snwhitehorn} 134217309Snwhitehorn 135217309Snwhitehorn/* retrieve the bigframe under the pointer */ 136217309SnwhitehornmseRegion * 137217309Snwhitehorndlg_mouse_bigregion(int y, int x) 138217309Snwhitehorn{ 139217309Snwhitehorn return any_mouse_region(y, x, FALSE); 140217309Snwhitehorn} 141217309Snwhitehorn 142217309Snwhitehorn#else 143217309Snwhitehornvoid mouse_dummy(void); 144217309Snwhitehornvoid 145217309Snwhitehornmouse_dummy(void) 146217309Snwhitehorn{ 147217309Snwhitehorn} 148217309Snwhitehorn#endif /* USE_MOUSE */ 149