xref: /haiku/src/servers/input/BottomlineWindow.cpp (revision f2b4344867e97c3f4e742a1b4a15e6879644601a)
1 /*
2  * Copyright 2004-2005, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Jérôme Duval
7  */
8 
9 
10 #include "BottomlineWindow.h"
11 #include "WindowPrivate.h"
12 
13 #include <String.h>
14 #include <TextView.h>
15 
16 
17 BottomlineWindow::BottomlineWindow()
18 	: BWindow(BRect(0, 0, 350, 16), "",
19 		kLeftTitledWindowLook,
20 		B_FLOATING_ALL_WINDOW_FEEL,
21 		B_NOT_V_RESIZABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE
22 			| B_AVOID_FOCUS | B_WILL_ACCEPT_FIRST_CLICK)
23 {
24 	BRect textRect = Bounds();
25 	textRect.OffsetTo(B_ORIGIN);
26 	textRect.InsetBy(2,2);
27 	fTextView = new BTextView(Bounds(), "", textRect, be_plain_font,
28 		NULL, B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS);
29 	AddChild(fTextView);
30 
31 	fTextView->SetText("");
32 
33 	BRect   screenFrame = (BScreen(B_MAIN_SCREEN_ID).Frame());
34 	BPoint pt;
35 	pt.x = 100;
36 	pt.y = screenFrame.Height()*2/3 - Bounds().Height()/2;
37 
38 	MoveTo(pt);
39 	Show();
40 
41 	SERIAL_PRINT(("BottomlineWindow created\n"));
42 }
43 
44 
45 BottomlineWindow::~BottomlineWindow()
46 {
47 
48 
49 }
50 
51 
52 void
53 BottomlineWindow::MessageReceived(BMessage *msg)
54 {
55 	switch(msg->what)
56 	{
57 		default:
58 			BWindow::MessageReceived(msg);
59 			break;
60 	}
61 }
62 
63 
64 bool
65 BottomlineWindow::QuitRequested()
66 {
67 	return true;
68 }
69 
70 
71 void
72 BottomlineWindow::HandleInputMethodEvent(BMessage* event, EventList& newEvents)
73 {
74 	CALLED();
75 
76 	PostMessage(event, fTextView);
77 
78 	const char* string;
79 	bool confirmed;
80 	int32 opcode;
81 	if (event->FindInt32("be:opcode", &opcode) != B_OK
82 		|| opcode != B_INPUT_METHOD_CHANGED
83 		|| event->FindBool("be:confirmed", &confirmed) != B_OK
84 		|| !confirmed
85 		|| event->FindString("be:string", &string) != B_OK)
86 		return;
87 
88 	SERIAL_PRINT(("IME : %i, %s\n", opcode, string));
89 	SERIAL_PRINT(("IME : confirmed\n"));
90 
91 	int32 length = strlen(string);
92 	int32 offset = 0;
93 	int32 nextOffset = 0;
94 
95 	while (offset < length) {
96 		// this is supposed to go to the next UTF-8 character
97 		for (++nextOffset; (string[nextOffset] & 0xC0) == 0x80; ++nextOffset)
98 			;
99 
100 		BMessage *newEvent = new BMessage(B_KEY_DOWN);
101 		if (newEvent != NULL) {
102 			newEvent->AddInt32("key", 0);
103 			newEvent->AddInt64("when", system_time());
104 			BString bytes(string + offset, nextOffset - offset);
105 			newEvent->AddString("bytes", bytes);
106 			newEvent->AddInt32("raw_char", 0xa);
107 			newEvents.AddItem(newEvent);
108 		}
109 
110 		offset = nextOffset;
111 	}
112 }
113 
114