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