Fixed binary search: no more infinite loops when vendor is unknown.
[tangerine.git] / workbench / classes / zune / betterstring / mcc / hotkeystring / HandleInput.c
blob86fa1c4ccc4c844850e07f9df269aca755aeece6
1 /***************************************************************************
3 BetterString.mcc - A better String gadget MUI Custom Class
4 Copyright (C) 1997-2000 Allan Odgaard
5 Copyright (C) 2005 by BetterString.mcc Open Source Team
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but 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.
17 BetterString class Support Site: http://www.sf.net/projects/bstring-mcc/
19 $Id$
21 ***************************************************************************/
23 #include <string.h>
25 #include <clib/alib_protos.h>
26 #include <proto/intuition.h>
27 #include <proto/keymap.h>
28 #include <proto/muimaster.h>
29 #include <proto/utility.h>
30 #include <devices/inputevent.h>
31 #include <libraries/mui.h>
33 #ifndef __AROS__
34 #include <newmouse.h>
35 #else
36 #include <devices/rawkeycodes.h>
37 #define NM_WHEEL_UP RAWKEY_NM_WHEEL_UP
38 #define NM_WHEEL_DOWN RAWKEY_NM_WHEEL_DOWN
39 #define NM_WHEEL_LEFT RAWKEY_NM_WHEEL_LEFT
40 #define NM_WHEEL_RIGHT RAWKEY_NM_WHEEL_RIGHT
41 #define NM_BUTTON_FOURTH 0x7E
42 #endif
44 #include "HotkeyString_mcc.h"
46 #include "private.h"
48 ULONG ConvertKey (struct IntuiMessage *imsg)
50 struct InputEvent event;
51 event.ie_NextEvent = NULL;
52 event.ie_Class = IECLASS_RAWKEY;
53 event.ie_SubClass = 0;
54 event.ie_Code = imsg->Code;
55 event.ie_Qualifier = 0; /* imsg->Qualifier; */
56 event.ie_EventAddress = 0; /* (APTR *) *((ULONG *)imsg->IAddress); */
58 UBYTE code = 0;
59 return MapRawKey(&event, &code, 1, NULL), code;
62 #define BETWEEN(a, min, max) (a >= min && a <= max)
64 /* wheel mouse support */
65 #undef IECODE_KEY_CODE_LAST
66 #define IECODE_KEY_CODE_LAST 0x7e
68 ULONG HandleInput(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg)
70 struct InstData *data = (struct InstData *)INST_DATA(cl, obj);
71 ULONG result = 0;
72 BOOL nokey = FALSE, backspace = FALSE, qual_only;
74 qual_only = BETWEEN(msg->imsg->Code, 0x60, 0x67);
75 if(qual_only || (data->Flags & FLG_Snoop && data->Flags & FLG_Active && msg->imsg->Class == IDCMP_RAWKEY && BETWEEN(msg->imsg->Code, IECODE_KEY_CODE_FIRST, IECODE_KEY_CODE_LAST) && msg->muikey != MUIKEY_GADGET_NEXT && msg->muikey != MUIKEY_GADGET_PREV))
77 const STRPTR qualifier_name[] =
79 "lshift", "rshift", "capslock", "control", "lalt",
80 "ralt", "lcommand", "rcommand", "numericpad", "repeat",
81 NULL
84 UBYTE buffer[256] = { '\0' };
85 ULONG qualifier = msg->imsg->Qualifier;
86 ULONG i;
88 for(i=0; qualifier_name[i]; i++)
90 if(qualifier & (1 << i))
92 strcat(buffer, qualifier_name[i]);
93 strcat(buffer, " ");
97 if(qual_only)
99 if(*buffer)
100 buffer[strlen(buffer)-1] = '\0';
102 else
104 UWORD code = msg->imsg->Code;
105 if(code >= 76 && code <= 89)
107 const STRPTR key_name[] =
109 "up", "down", "right", "left",
110 "f1", "f2", "f3", "f4", "f5",
111 "f6", "f7", "f8", "f9", "f10"
113 strcat(buffer, key_name[code-76]);
115 else switch(code)
117 case 95:
118 strcat(buffer, "help");
119 break;
121 case NM_WHEEL_UP:
122 strcat(buffer, "wheel_up");
123 break;
125 case NM_WHEEL_DOWN:
126 strcat(buffer, "wheel_down");
127 break;
129 case NM_WHEEL_LEFT:
130 strcat(buffer, "wheel_left");
131 break;
133 case NM_WHEEL_RIGHT:
134 strcat(buffer, "wheel_right");
135 break;
137 case NM_BUTTON_FOURTH:
138 strcat(buffer, "wheel_button");
139 break;
141 default:
143 STRPTR append = NULL;
144 UBYTE key;
145 switch(key = ConvertKey(msg->imsg))
147 case 0:
148 nokey = TRUE;
149 break;
151 case 8:
152 backspace = TRUE;
153 append = "backspace";
154 break;
156 case 9:
157 append = "tab";
158 break;
160 case 13:
161 append = ((qualifier & IEQUALIFIER_NUMERICPAD) ? "enter" : "return");
162 break;
164 case 27:
165 append = "esc";
166 break;
168 case 32:
169 append = "space";
170 break;
172 case 0x7f:
173 append = "del";
174 break;
176 default:
177 strncat(buffer, &key, 1);
178 break;
181 if(append)
182 strcat(buffer, append);
184 break;
188 if(!nokey)
190 if(backspace)
192 if(data->Flags & FLG_Backspace)
194 *buffer = '\0';
195 data->Flags &= ~FLG_Backspace;
197 else
199 data->Flags |= FLG_Backspace;
202 else
204 data->Flags &= ~FLG_Backspace;
206 SetAttrs(obj, MUIA_String_Contents, buffer, TAG_DONE);
208 result = MUI_EventHandlerRC_Eat;
210 return result;