xref: /haiku/src/add-ons/input_server/methods/pen/PenInputServerMethod.cpp (revision 25a7b01d15612846f332751841da3579db313082)
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