1a94e6135SFrançois Revol /*
2a94e6135SFrançois Revol Copyright 2007, Francois Revol. All Rights Reserved.
3a94e6135SFrançois Revol This file may be used under the terms of the Be Sample Code License.
4a94e6135SFrançois Revol */
5a94e6135SFrançois Revol
6a94e6135SFrançois Revol //#define DEBUG 1
7a94e6135SFrançois Revol
8a94e6135SFrançois Revol #include <stdlib.h>
9a94e6135SFrançois Revol #include <string.h>
10a94e6135SFrançois Revol #include <ctype.h>
11a94e6135SFrançois Revol
12a94e6135SFrançois Revol #include <Debug.h>
13a94e6135SFrançois Revol #include <List.h>
14a94e6135SFrançois Revol #include <Message.h>
15a94e6135SFrançois Revol #include <OS.h>
16a94e6135SFrançois Revol
17a94e6135SFrançois Revol #include <Application.h>
18a94e6135SFrançois Revol #include <Menu.h>
19a94e6135SFrançois Revol #include <MenuItem.h>
20a94e6135SFrançois Revol #include <Region.h>
21a94e6135SFrançois Revol
22a94e6135SFrançois Revol #if DEBUG
23a94e6135SFrançois Revol //#include <File.h>
24a94e6135SFrançois Revol #include <Alert.h>
25a94e6135SFrançois Revol #include <Button.h>
26a94e6135SFrançois Revol #include <TextView.h>
27a94e6135SFrançois Revol #include <StringIO.h>
28a94e6135SFrançois Revol #include "DumpMessage.h"
29a94e6135SFrançois Revol #endif
30a94e6135SFrançois Revol
31a94e6135SFrançois Revol #include <add-ons/input_server/InputServerDevice.h>
32a94e6135SFrançois Revol #include <add-ons/input_server/InputServerMethod.h>
33a94e6135SFrançois Revol
34a94e6135SFrançois Revol #include "PenIcon.h"
35a94e6135SFrançois Revol
36a94e6135SFrançois Revol #include "PenInputServerMethod.h"
37a94e6135SFrançois Revol #include "PenInputLooper.h"
38a94e6135SFrançois Revol #include "PenInputStrings.h"
39a94e6135SFrançois Revol
instantiate_input_method()40a94e6135SFrançois Revol BInputServerMethod* instantiate_input_method()
41a94e6135SFrançois Revol {
42a94e6135SFrançois Revol PRINT(("%s\n", __FUNCTION__));
43a94e6135SFrançois Revol return (new PenInputServerMethod());
44a94e6135SFrançois Revol }
45a94e6135SFrançois Revol
46a94e6135SFrançois Revol
PenInputServerMethod()47a94e6135SFrançois Revol PenInputServerMethod::PenInputServerMethod()
48a94e6135SFrançois Revol : BInputServerMethod("Pen", PenIconData),
49a94e6135SFrançois Revol fEnabled(false)
50a94e6135SFrançois Revol {
51a94e6135SFrançois Revol PRINT(("%s\n", __FUNCTION__));
52a94e6135SFrançois Revol #if DEBUG
53a94e6135SFrançois Revol //fDebugFile.SetTo("/tmp/PenInputMethodMessages.txt", B_READ_WRITE|B_CREATE_FILE);
54fcc3e627SStephan Aßmus fDebugAlert = new BAlert("PenInput Debug", "Plip \n\n\n\n\n\n\n\n\n\n\n\n\n", "OK");
55a94e6135SFrançois Revol fDebugAlert->SetLook(B_TITLED_WINDOW_LOOK);
56*aed35104SHumdinger fDebugAlert->SetFlags(fDebugAlert->Flags() | B_CLOSE_ON_ESCAPE);
57a94e6135SFrançois Revol fDebugAlert->TextView()->MakeSelectable();
58a94e6135SFrançois Revol fDebugAlert->TextView()->SelectAll();
59a94e6135SFrançois Revol fDebugAlert->TextView()->Delete();
60a94e6135SFrançois Revol fDebugAlert->ButtonAt(0)->SetEnabled(false);
61a94e6135SFrançois Revol BRegion r;
62a94e6135SFrançois Revol GetScreenRegion(&r);
63a94e6135SFrançois Revol BString s;
64a94e6135SFrançois Revol s << r.CountRects() << " rects\n";
65a94e6135SFrançois Revol fDebugAlert->TextView()->Insert(s.String());
66a94e6135SFrançois Revol fDebugAlert->Go(NULL);
67a94e6135SFrançois Revol
68a94e6135SFrançois Revol
69a94e6135SFrançois Revol #endif
70a94e6135SFrançois Revol }
71a94e6135SFrançois Revol
~PenInputServerMethod()72a94e6135SFrançois Revol PenInputServerMethod::~PenInputServerMethod()
73a94e6135SFrançois Revol {
74a94e6135SFrançois Revol PRINT(("%s\n", __FUNCTION__));
75a94e6135SFrançois Revol SetMenu(NULL, BMessenger());
76a94e6135SFrançois Revol #if DEBUG
77a94e6135SFrançois Revol fDebugAlert->Lock();
78a94e6135SFrançois Revol fDebugAlert->Quit();
79a94e6135SFrançois Revol #endif
80a94e6135SFrançois Revol BLooper *looper = NULL;
81a94e6135SFrançois Revol fLooper.Target(&looper);
82a94e6135SFrançois Revol if (looper != NULL)
83a94e6135SFrançois Revol {
84a94e6135SFrançois Revol if (looper->Lock())
85a94e6135SFrançois Revol looper->Quit();
86a94e6135SFrançois Revol }
87a94e6135SFrançois Revol }
88a94e6135SFrançois Revol
InitCheck()89a94e6135SFrançois Revol status_t PenInputServerMethod::InitCheck()
90a94e6135SFrançois Revol {
91a94e6135SFrançois Revol PenInputLooper *looper;
92a94e6135SFrançois Revol status_t err;
93a94e6135SFrançois Revol PRINT(("%s\n", __FUNCTION__));
94a94e6135SFrançois Revol looper = new PenInputLooper(this);
95a94e6135SFrançois Revol looper->Lock();
96a94e6135SFrançois Revol err = looper->InitCheck();
97a94e6135SFrançois Revol looper->Unlock();
98a94e6135SFrançois Revol fLooper = BMessenger(NULL, looper);
99a94e6135SFrançois Revol return err;
100a94e6135SFrançois Revol }
101a94e6135SFrançois Revol
102a94e6135SFrançois Revol
Filter(BMessage * message,BList * outList)103a94e6135SFrançois Revol filter_result PenInputServerMethod::Filter(BMessage *message, BList *outList)
104a94e6135SFrançois Revol {
105a94e6135SFrançois Revol status_t err;
106a94e6135SFrançois Revol filter_result res = B_DISPATCH_MESSAGE;
107a94e6135SFrançois Revol
108a94e6135SFrançois Revol if (!IsEnabled())
109a94e6135SFrançois Revol return B_DISPATCH_MESSAGE;
110a94e6135SFrançois Revol
111a94e6135SFrançois Revol
112a94e6135SFrançois Revol #if 0//DEBUG
113a94e6135SFrançois Revol //message->Flatten(&fDebugFile);
114a94e6135SFrançois Revol BStringIO sio;
115a94e6135SFrançois Revol DumpMessageToStream(message, sio);
116a94e6135SFrançois Revol fDebugAlert->Lock();
117a94e6135SFrançois Revol fDebugAlert->TextView()->Insert(sio.String());
118a94e6135SFrançois Revol fDebugAlert->Unlock();
119a94e6135SFrançois Revol #endif
120a94e6135SFrançois Revol switch (message->what) {
121a94e6135SFrançois Revol case B_KEY_UP:
122a94e6135SFrançois Revol case B_KEY_DOWN:
123a94e6135SFrançois Revol case B_UNMAPPED_KEY_UP:
124a94e6135SFrançois Revol case B_UNMAPPED_KEY_DOWN:
125a94e6135SFrançois Revol case B_MODIFIERS_CHANGED:
126a94e6135SFrançois Revol case B_MOUSE_WHEEL_CHANGED:
127a94e6135SFrançois Revol return B_DISPATCH_MESSAGE;
128a94e6135SFrançois Revol default:
129a94e6135SFrançois Revol //case B_MOUSE_MOVED:
130a94e6135SFrançois Revol fLooper.SendMessage(message);
131a94e6135SFrançois Revol return B_SKIP_MESSAGE;
132a94e6135SFrançois Revol }
133a94e6135SFrançois Revol
134a94e6135SFrançois Revol
135a94e6135SFrançois Revol #if 0
136a94e6135SFrançois Revol if (message->what == B_MOUSE_MOVED) {
137a94e6135SFrançois Revol BMessage *mDown = new BMessage(B_KEY_DOWN);
138a94e6135SFrançois Revol BMessage *mUp;
139a94e6135SFrançois Revol char states[16];
140a94e6135SFrançois Revol mDown->AddInt32("modifiers", 0x0);
141a94e6135SFrançois Revol mDown->AddInt32("key", 94);
142a94e6135SFrançois Revol mDown->AddInt32("raw_char", 32);
143a94e6135SFrançois Revol mDown->AddData("states", 'UBYT', states, sizeof(states));
144a94e6135SFrançois Revol mDown->AddString("bytes", " ");
145a94e6135SFrançois Revol mDown->AddData("byte", 'BYTE', " ", 1);
146a94e6135SFrançois Revol mUp = new BMessage(*mDown);
147a94e6135SFrançois Revol mUp->what = B_KEY_UP;
148a94e6135SFrançois Revol outList->AddItem(mDown);
149a94e6135SFrançois Revol outList->AddItem(mUp);
150a94e6135SFrançois Revol }
151a94e6135SFrançois Revol #endif
152a94e6135SFrançois Revol if (message->what == B_MOUSE_DOWN) {
153a94e6135SFrançois Revol int32 buttons;
154a94e6135SFrançois Revol int32 modifiers;
155a94e6135SFrançois Revol BPoint where;
156a94e6135SFrançois Revol if (message->FindInt32("buttons", &buttons) == B_OK) {
157a94e6135SFrançois Revol /* replace first with a button that likely won't exist,
158a94e6135SFrançois Revol * and so shouldn't cause any side effect (hmm err...) */
159a94e6135SFrançois Revol /* XXX: use get_mouse_map() ? */
160a94e6135SFrançois Revol if (buttons == B_PRIMARY_MOUSE_BUTTON)
161a94e6135SFrançois Revol //message->ReplaceInt32("buttons", 0x0000);
162a94e6135SFrançois Revol message->what = B_MOUSE_UP;
163a94e6135SFrançois Revol }
164a94e6135SFrançois Revol
165a94e6135SFrançois Revol #if 0
166a94e6135SFrançois Revol outList->AddItem(new BMessage(*message));
167a94e6135SFrançois Revol BMessage *m = new BMessage(B_MOUSE_MOVED);
168a94e6135SFrançois Revol if (message->FindInt32("buttons", &buttons) == B_OK)
169a94e6135SFrançois Revol m->AddInt32("buttons", buttons);
170a94e6135SFrançois Revol if (message->FindInt32("modifiers", &modifiers) == B_OK)
171a94e6135SFrançois Revol m->AddInt32("modifiers", modifiers);
172a94e6135SFrançois Revol if (message->FindPoint("where", &where) == B_OK)
173a94e6135SFrançois Revol m->AddPoint("where", where);
174a94e6135SFrançois Revol outList->AddItem(m);
175a94e6135SFrançois Revol #endif
176a94e6135SFrançois Revol #if DEBUG
177a94e6135SFrançois Revol fDebugAlert->Lock();
178a94e6135SFrançois Revol fDebugAlert->TextView()->Insert(">>>\n");
179a94e6135SFrançois Revol fDebugAlert->Unlock();
180a94e6135SFrançois Revol #endif
181a94e6135SFrançois Revol #if 0
182a94e6135SFrançois Revol m = new BMessage(B_INPUT_METHOD_EVENT);
183a94e6135SFrançois Revol m->AddInt32("be:opcode", B_INPUT_METHOD_STARTED);
184a94e6135SFrançois Revol m->AddMessenger("be:reply_to", this);
185a94e6135SFrançois Revol EnqueueMessage(m);
186a94e6135SFrançois Revol m = new BMessage(B_INPUT_METHOD_EVENT);
187a94e6135SFrançois Revol m->AddInt32("be:opcode", B_INPUT_METHOD_LOCATION_REQUEST);
188a94e6135SFrançois Revol m->AddString("be:string", " ");
189a94e6135SFrançois Revol EnqueueMessage(m);
190a94e6135SFrançois Revol m = new BMessage(B_INPUT_METHOD_EVENT);
191a94e6135SFrançois Revol m->AddInt32("be:opcode", B_INPUT_METHOD_STOPPED);
192a94e6135SFrançois Revol EnqueueMessage(m);
193a94e6135SFrançois Revol sleep(3);
194a94e6135SFrançois Revol #endif
195a94e6135SFrançois Revol #if DEBUG
196a94e6135SFrançois Revol fDebugAlert->Lock();
197a94e6135SFrançois Revol fDebugAlert->TextView()->Insert("<<<\n");
198a94e6135SFrançois Revol fDebugAlert->Unlock();
199a94e6135SFrançois Revol #endif
200a94e6135SFrançois Revol }
201a94e6135SFrançois Revol
202a94e6135SFrançois Revol
203a94e6135SFrançois Revol
204a94e6135SFrançois Revol return (res);
205a94e6135SFrançois Revol }
206a94e6135SFrançois Revol
MethodActivated(bool active)207a94e6135SFrançois Revol status_t PenInputServerMethod::MethodActivated(bool active)
208a94e6135SFrançois Revol {
209a94e6135SFrançois Revol fEnabled = active;
210a94e6135SFrançois Revol
211a94e6135SFrançois Revol BMessage msg(MSG_METHOD_ACTIVATED);
212a94e6135SFrançois Revol if (active)
213a94e6135SFrançois Revol msg.AddBool(MSGF_ACTIVE, true);
214a94e6135SFrançois Revol fLooper.SendMessage( &msg );
215a94e6135SFrançois Revol
216a94e6135SFrançois Revol return B_OK;
217a94e6135SFrançois Revol }
218a94e6135SFrançois Revol
219