* Fixed Canna (and bug #3660) for real this time.

* Cleaned up CannaLooper.cpp/h to mostly conform to our coding style.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29897 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-04-04 13:35:46 +00:00
parent ded432494c
commit 4f4312b1c7
4 changed files with 377 additions and 436 deletions
+9 -9
View File
@@ -344,16 +344,16 @@ local ttFonts = [ Glob $(fontDir)/ttfonts : *.ttf ] ;
AddFilesToHaikuImage system fonts psfonts : $(psFonts) ;
AddFilesToHaikuImage system fonts ttfonts : $(ttFonts) ;
local kanbeDir = [ FDirName $(HAIKU_TOP) data etc KanBe ] ;
local kanbeDefault = [ Glob $(kanbeDir)/default : *.canna *.gz ] ;
local kanbeDic = [ Glob $(kanbeDir)/dic : *.cbp ] ;
local kanbeDicCanna = [ Glob $(kanbeDir)/dic/canna
local cannaDir = [ FDirName $(HAIKU_TOP) data etc KanBe ] ;
local cannaDefault = [ Glob $(cannaDir)/default : *.canna *.gz ] ;
local cannaDic = [ Glob $(cannaDir)/dic : *.cbp ] ;
local cannaDicCanna = [ Glob $(cannaDir)/dic/canna
: *.cld *.ctd *.cbd *.dir ] ;
AddFilesToHaikuImage system data KanBe default : $(kanbeDefault) ;
AddFilesToHaikuImage system data KanBe dic : $(kanbeDic) ;
AddFilesToHaikuImage system data KanBe dic canna : $(kanbeDicCanna) ;
AddDirectoryToHaikuImage system data KanBe dic group ;
AddDirectoryToHaikuImage system data KanBe dic user ;
AddFilesToHaikuImage system data Canna default : $(cannaDefault) ;
AddFilesToHaikuImage system data Canna dic : $(cannaDic) ;
AddFilesToHaikuImage system data Canna dic canna : $(cannaDicCanna) ;
AddDirectoryToHaikuImage system data Canna dic group ;
AddDirectoryToHaikuImage system data Canna dic user ;
local keymapFiles = [ GLOB [ FDirName $(HAIKU_TOP) src data etc keymaps ]
: *.keymap ] ;
@@ -1,15 +1,17 @@
//
// CannaLooper.cpp
// CannaIM looper object
/*
* Copyright 2007-2009 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Copyright 1999 M.Kawamura
*/
// This is a part of...
// CannaIM
// version 1.0
// (c) 1999 M.Kawamura
//
#include "CannaLooper.h"
#include <string.h>
#include <Debug.h>
#include <Alert.h>
#include <FindDirectory.h>
#include <Input.h>
@@ -19,96 +21,75 @@
#include <Path.h>
#include <Screen.h>
#ifdef DEBUG
# include <Debug.h>
#endif
#include "CannaCommon.h"
#include "CannaLooper.h"
#include "CannaMethod.h"
#include "KouhoWindow.h"
#include "PaletteWindow.h"
CannaLooper::CannaLooper(CannaMethod* method)
: BLooper("Canna Looper")
: BLooper("Canna Looper"),
fOwner(method),
fCanna(NULL),
fKouhoWindow(NULL),
fPaletteWindow(NULL)
{
owner = method;
canna = 0;
theKouhoWindow = 0;
thePalette = 0;
self = BMessenger( NULL, this );
fMenu = new BMenu(B_EMPTY_STRING);
fMenu->SetFont(be_plain_font);
fMenu->AddItem(new BMenuItem("About CannaIM" B_UTF8_ELLIPSIS,
new BMessage( B_ABOUT_REQUESTED)));
fMenu->AddSeparatorItem();
fMenu->AddItem(new BMenuItem("Convert arrow keys",
new BMessage(ARROW_KEYS_FLIPPED)));
fMenu->AddItem(new BMenuItem("Reload Init file",
new BMessage(RELOAD_INIT_FILE)));
theMenu = new BMenu( B_EMPTY_STRING );
theMenu->SetFont( be_plain_font );
theMenu->AddItem( new BMenuItem( "About CannaIM" B_UTF8_ELLIPSIS, new BMessage( B_ABOUT_REQUESTED )));
theMenu->AddSeparatorItem();
theMenu->AddItem( new BMenuItem( "Convert arrow keys", new BMessage( ARROW_KEYS_FLIPPED )));
theMenu->AddItem( new BMenuItem( "Reload Init file", new BMessage( RELOAD_INIT_FILE )));
if ( gSettings.convert_arrowkey )
{
BMenuItem *item = theMenu->FindItem( ARROW_KEYS_FLIPPED );
item->SetMarked( true );
if (gSettings.convert_arrowkey) {
BMenuItem* item = fMenu->FindItem(ARROW_KEYS_FLIPPED);
item->SetMarked(true);
}
Run();
}
status_t
CannaLooper::InitCheck()
CannaLooper::Init()
{
status_t err;
char basepath[ B_PATH_NAME_LENGTH + 1 ];
err = ReadSettings( basepath );
if ( err != B_NO_ERROR )
char basePath[B_PATH_NAME_LENGTH + 1];
status_t err = ReadSettings(basePath);
if (err != B_NO_ERROR)
return err;
canna = new CannaInterface( basepath );
err = canna->InitCheck();
if ( err != B_NO_ERROR )
return err;
// theKouhoWindow = new KouhoWindow( &kouhoFont );
return B_NO_ERROR;
fCanna = new CannaInterface(basePath);
return fCanna->InitCheck();
}
void
CannaLooper::Quit()
{
// delete palette here
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: destructor called.\n" ));
#endif
if ( canna )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: Deleting canna...\n" ));
#endif
delete canna;
SERIAL_PRINT(("CannaLooper: destructor called.\n"));
delete fCanna;
if (fKouhoWindow != NULL) {
SERIAL_PRINT(("CannaLooper: Sending QUIT to kouho window...\n"));
fKouhoWindow->Lock();
fKouhoWindow->Quit();
}
if ( theKouhoWindow )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: Sending QUIT to kouho window...\n" ));
#endif
theKouhoWindow->Lock();
theKouhoWindow->Quit();
if (fPaletteWindow) {
SERIAL_PRINT(("CannaLooper: Sending QUIT to palette...\n"));
fPaletteWindow->Lock();
fPaletteWindow->Quit();
}
if ( thePalette )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: Sending QUIT to palette...\n" ));
#endif
thePalette->Lock();
thePalette->Quit();
}
owner->SetMenu( NULL, BMessenger() );
delete theMenu;
fOwner->SetMenu(NULL, BMessenger());
delete fMenu;
BLooper::Quit();
}
@@ -121,431 +102,390 @@ CannaLooper::ReadSettings(char* basePath)
if (status != B_OK)
return status;
path.Append("KanBe");
path.Append("Canna");
strcpy(basePath, path.Path());
strlcpy(basePath, path.Path(), B_PATH_NAME_LENGTH);
strlcat(basePath, "/", B_PATH_NAME_LENGTH);
font_family family;
font_style style;
strcpy(family, "Haru");
strcpy(style, "Regular");
kouhoFont.SetFamilyAndStyle(family, style);
kouhoFont.SetSize(12);
fKouhoFont.SetFamilyAndStyle(family, style);
fKouhoFont.SetSize(12);
return B_OK;
}
void
CannaLooper::EnqueueMessage( BMessage *msg )
CannaLooper::EnqueueMessage(BMessage* msg)
{
owner->EnqueueMessage( msg );
fOwner->EnqueueMessage(msg);
}
void
CannaLooper::MessageReceived( BMessage *msg )
CannaLooper::MessageReceived(BMessage* msg)
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: Entering MessageReceived() what=%x\n", msg->what ));
#endif
switch ( msg->what )
{
SERIAL_PRINT(("CannaLooper: Entering MessageReceived() what=%.4s\n",
(char*)&msg->what));
switch (msg->what) {
case B_KEY_DOWN:
case NUM_SELECTED_FROM_KOUHO_WIN:
HandleKeyDown( msg );
_HandleKeyDown(msg);
break;
case B_INPUT_METHOD_EVENT:
uint32 opcode, result;
opcode = 0;
msg->FindInt32( "be:opcode", (int32 *)&opcode );
switch ( opcode )
{
msg->FindInt32("be:opcode", (int32*)&opcode);
switch (opcode) {
case B_INPUT_METHOD_LOCATION_REQUEST:
HandleLocationReply( msg );
_HandleLocationReply(msg);
break;
case B_INPUT_METHOD_STOPPED:
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_STOPPED received\n" ));
#endif
ForceKakutei();
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_STOPPED "
"received\n"));
_ForceKakutei();
break;
}
break;
case CANNA_METHOD_ACTIVATED:
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: CANNA_METHOD_ACTIVATED received\n" ));
#endif
HandleMethodActivated( msg->HasBool( "active" ) );
SERIAL_PRINT(("CannaLooper: CANNA_METHOD_ACTIVATED received\n"));
_HandleMethodActivated(msg->HasBool("active"));
break;
case MODE_CHANGED_FROM_PALETTE:
ForceKakutei();
_ForceKakutei();
int32 mode;
msg->FindInt32( "mode", &mode );
result = canna->ChangeMode( mode );
ProcessResult( result );
msg->FindInt32("mode", &mode);
result = fCanna->ChangeMode(mode);
_ProcessResult(result);
break;
case B_ABOUT_REQUESTED:
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_ABOUT_REQUESTED received\n" ));
#endif
BAlert *panel;
panel = new BAlert( "", "CannaIM Version 1.02\n"
" by Masao Kawamura 1999\n\n"
"Canna\n Copyright 1992 NEC Corporation, Tokyo, Japan\n"
" Special thanks to T.Murai for porting\n"
" BeOS Version 1.02",
"OK" );
{
SERIAL_PRINT(("CannaLooper: B_ABOUT_REQUESTED received\n"));
BAlert* panel = new BAlert( "", "Canna Input Method\n"
" by Masao Kawamura 1999\n\n"
"Canna\n"
" Copyright 1992 NEC Corporation, Tokyo, Japan\n"
" Special thanks to T.Murai for porting\n",
"OK");
panel->Go();
break;
}
case RELOAD_INIT_FILE:
ForceKakutei();
canna->Reset();
_ForceKakutei();
fCanna->Reset();
break;
case ARROW_KEYS_FLIPPED:
{
BMenuItem *item = theMenu->FindItem( ARROW_KEYS_FLIPPED );
gSettings.convert_arrowkey = !gSettings.convert_arrowkey;
item->SetMarked( gSettings.convert_arrowkey );
canna->SetConvertArrowKey( gSettings.convert_arrowkey );
}
break;
default:
BLooper::MessageReceived( msg );
break;
}
}
void CannaLooper::HandleKeyDown( BMessage *msg )
{
uint32 result;
uint32 modifier;
// int32 rawchar;
int32 key;
char theChar;
msg->FindInt32( "modifiers", (int32 *)&modifier );
msg->FindInt32( "key", &key );
// msg->FindInt32( "raw_char", &rawchar );
if ( ( modifier & B_COMMAND_KEY ) != 0 )
{
EnqueueMessage( DetachCurrentMessage() );
return;
}
msg->FindInt8( "byte", (int8 *)&theChar );
// The if clause below is to avoid processing key input which char code is 0x80 or more.
// if mikakutei string exists, dispose current message.
// Otherwise, send it to application as usual B_KEY_DOWN message.
// This is a bug fix for version 1.0 beta 2
if ( theChar & 0x80 )
{
if ( canna->MikakuteiLength() != 0 )
{
BMessage *blackhole = DetachCurrentMessage();
delete blackhole;
BMenuItem* item = fMenu->FindItem(ARROW_KEYS_FLIPPED);
gSettings.convert_arrowkey = !gSettings.convert_arrowkey;
item->SetMarked(gSettings.convert_arrowkey);
fCanna->SetConvertArrowKey(gSettings.convert_arrowkey);
break;
}
else
EnqueueMessage( DetachCurrentMessage() );
return;
default:
BLooper::MessageReceived(msg);
break;
}
// end of bug fix
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: HandleKeyDown() calling CannaInterface::KeyIn()...\n", result ));
#endif
result = canna->KeyIn( theChar, modifier, key );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: HandleKeyDown() received result = %d from CannaInterface.\n", result ));
#endif
ProcessResult( result );
}
void
CannaLooper::ProcessResult( uint32 result )
CannaLooper::_HandleKeyDown(BMessage* msg)
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing result = %d\n", result ));
#endif
if ( result & GUIDELINE_APPEARED )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing GUIDELINE_APPEARED\n" ));
#endif
if ( canna->MikakuteiLength() != 0 ) // usual guideline i.e. kouho
{
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_LOCATION_REQUEST );
owner->EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_LOCATION_REQUEST has been sent\n" ));
#endif
uint32 modifier;
int32 key;
msg->FindInt32("modifiers", (int32*)&modifier);
msg->FindInt32("key", &key);
if ((modifier & B_COMMAND_KEY) != 0) {
EnqueueMessage(DetachCurrentMessage());
return;
}
char character;
msg->FindInt8("byte", (int8*)&character);
// The if clause below is to avoid processing key input which char code
// is 0x80 or more.
// if mikakutei string exists, dispose current message.
// Otherwise, send it to application as usual B_KEY_DOWN message.
if ((character & 0x80) != 0) {
if (fCanna->MikakuteiLength() != 0)
delete DetachCurrentMessage();
else
EnqueueMessage(DetachCurrentMessage());
return;
}
SERIAL_PRINT(("CannaLooper: HandleKeyDown() calling "
"CannaInterface::KeyIn()...\n", result));
uint32 result = fCanna->KeyIn(character, modifier, key);
SERIAL_PRINT(("CannaLooper: HandleKeyDown() received result = %d from "
"CannaInterface.\n", result));
_ProcessResult(result);
}
void
CannaLooper::_ProcessResult(uint32 result)
{
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing result = %d\n",
result));
if ((result & GUIDELINE_APPEARED) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"GUIDELINE_APPEARED\n"));
if (fCanna->MikakuteiLength() != 0) {
// usual guideline i.e. kouho
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_LOCATION_REQUEST);
fOwner->EnqueueMessage(msg);
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_LOCATION_REQUEST has "
"been sent\n"));
} else {
// guideline exists, but no mikakutei string - means extend mode
// and such.
SERIAL_PRINT((" GUIDELINE_APPEARED: calling "
"GenerateKouho()...\n"));
fKouhoWindow->PostMessage(fCanna->GenerateKouhoString());
SERIAL_PRINT((" GUIDELINE_APPEARED: posting KouhoMsg to "
"KouhoWindow %x...\n", fKouhoWindow));
fKouhoWindow->PostMessage(KOUHO_WINDOW_SHOW_ALONE);
}
else // guideline exists, but no mikakutei string - means extend mode and such.
{
#ifdef DEBUG
SERIAL_PRINT(( " GUIDELINE_APPEARED: calling GenerateKouho()...\n" ));
#endif
theKouhoWindow->PostMessage( canna->GenerateKouhoString() );
BMessage m( KOUHO_WINDOW_SHOW_ALONE );
#ifdef DEBUG
SERIAL_PRINT(( " GUIDELINE_APPEARED: posting KouhoMsg to KouhoWindow %x...\n", theKouhoWindow ));
#endif
theKouhoWindow->PostMessage( &m );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: KOUHO_WINDOW_SHOW_ALONE has been sent\n" ));
#endif
}
}
// if ( result == MIKAKUTEI_NO_CHANGE )
// return;
if ( result & GUIDELINE_DISAPPEARED )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing GUIDELINE_DISAPPEARED\n" ));
#endif
theKouhoWindow->PostMessage( KOUHO_WINDOW_HIDE );
}
if ( result & MODE_CHANGED )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing MODE_CHANGED\n" ));
#endif
int32 mode;
mode = canna->GetMode();
BMessage m( PALETTE_WINDOW_BUTTON_UPDATE );
m.AddInt32( "mode", mode );
thePalette->PostMessage( &m );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: PALETTE_BUTTON_UPDATE has been sent. mode = %d\n", mode ));
#endif
if ((result & GUIDELINE_DISAPPEARED) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"GUIDELINE_DISAPPEARED\n"));
fKouhoWindow->PostMessage(KOUHO_WINDOW_HIDE);
}
if ( result & GUIDELINE_CHANGED )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing GUIDELINE_CHANGED\n" ));
#endif
theKouhoWindow->PostMessage( canna->GenerateKouhoString() );
if ((result & MODE_CHANGED) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"MODE_CHANGED\n"));
BMessage message(PALETTE_WINDOW_BUTTON_UPDATE);
message.AddInt32("mode", fCanna->GetMode());
fPaletteWindow->PostMessage(&message);
SERIAL_PRINT(("CannaLooper: PALETTE_BUTTON_UPDATE has been sent. "
"mode = %d\n", fCanna->GetMode()));
}
if ( result & THROUGH_INPUT )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing THROUGH_INPUT\n" ));
#endif
EnqueueMessage( DetachCurrentMessage() );
if ((result & GUIDELINE_CHANGED) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"GUIDELINE_CHANGED\n"));
fKouhoWindow->PostMessage(fCanna->GenerateKouhoString());
}
if ( result & NEW_INPUT_STARTED )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing NEW_INPUT_STARTED\n" ));
#endif
if ((result & THROUGH_INPUT) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"THROUGH_INPUT\n"));
EnqueueMessage(DetachCurrentMessage());
}
if ((result & NEW_INPUT_STARTED) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"NEW_INPUT_STARTED\n"));
SendInputStarted();
}
if ( result & KAKUTEI_EXISTS )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing KAKUTEI_EXISTS\n" ));
#endif
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_CHANGED );
msg->AddString("be:string", canna->GetKakuteiStr() );
if ((result & KAKUTEI_EXISTS) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"KAKUTEI_EXISTS\n"));
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_CHANGED);
msg->AddString("be:string", fCanna->GetKakuteiStr());
msg->AddInt32("be:clause_start", 0);
msg->AddInt32("be:clause_end", canna->KakuteiLength() );
msg->AddInt32("be:selection", canna->KakuteiLength() );
msg->AddInt32("be:selection", canna->KakuteiLength() );
msg->AddBool( "be:confirmed", true );
owner->EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_CHANGED (confired) has been sent\n" ));
#endif
if ( !(result & MIKAKUTEI_EXISTS) ) //if both kakutei and mikakutei exist, do not send B_INPUT_STOPPED
msg->AddInt32("be:clause_end", fCanna->KakuteiLength());
msg->AddInt32("be:selection", fCanna->KakuteiLength());
msg->AddInt32("be:selection", fCanna->KakuteiLength());
msg->AddBool("be:confirmed", true);
fOwner->EnqueueMessage(msg);
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_CHANGED (confired) has "
"been sent\n"));
// if both kakutei and mikakutei exist, do not send B_INPUT_STOPPED
if (!(result & MIKAKUTEI_EXISTS))
SendInputStopped();
}
if ( result & MIKAKUTEI_EXISTS )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing MIKAKUTEI_EXISTS\n" ));
#endif
if ((result & MIKAKUTEI_EXISTS) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"MIKAKUTEI_EXISTS\n" ));
int32 start, finish;
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_CHANGED );
msg->AddString("be:string", canna->GetMikakuteiStr() );
if ( canna->HasRev() )
{
canna->GetRevPosition( &start, &finish );
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_CHANGED);
msg->AddString("be:string", fCanna->GetMikakuteiStr());
if (fCanna->HasRev()) {
fCanna->GetRevPosition( &start, &finish);
msg->AddInt32("be:clause_start", 0);
msg->AddInt32("be:clause_end", start );
msg->AddInt32("be:clause_start", start );
msg->AddInt32("be:clause_end", finish );
msg->AddInt32("be:clause_start", finish );
msg->AddInt32("be:clause_end", canna->MikakuteiLength() );
}
else
{
start = finish = canna->MikakuteiLength();
msg->AddInt32("be:clause_end", start);
msg->AddInt32("be:clause_start", start);
msg->AddInt32("be:clause_end", finish);
msg->AddInt32("be:clause_start", finish);
msg->AddInt32("be:clause_end", fCanna->MikakuteiLength());
} else {
start = finish = fCanna->MikakuteiLength();
msg->AddInt32("be:clause_start", 0);
msg->AddInt32("be:clause_end", canna->MikakuteiLength() );
msg->AddInt32("be:clause_end", fCanna->MikakuteiLength());
}
msg->AddInt32("be:selection", start );
msg->AddInt32("be:selection", finish );
//msg->AddBool( "be:confirmed", false );
owner->EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_CHANGED (non-confirmed) has been sent\n" ));
#endif
msg->AddInt32("be:selection", start);
msg->AddInt32("be:selection", finish);
//msg->AddBool("be:confirmed", false);
fOwner->EnqueueMessage(msg);
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_CHANGED (non-confirmed) "
"has been sent\n"));
}
if ( result & MIKAKUTEI_BECOME_EMPTY )
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ProcessResult() processing MIKAKUTEI_BECOME_EMPTY\n" ));
#endif
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_CHANGED );
msg->AddString("be:string", B_EMPTY_STRING );
if ((result & MIKAKUTEI_BECOME_EMPTY) != 0) {
SERIAL_PRINT(("CannaLooper: _ProcessResult() processing "
"MIKAKUTEI_BECOME_EMPTY\n" ));
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_CHANGED);
msg->AddString("be:string", B_EMPTY_STRING);
msg->AddInt32("be:clause_start", 0);
msg->AddInt32("be:clause_end", 0 );
msg->AddInt32("be:selection", 0 );
msg->AddInt32("be:selection", 0 );
msg->AddBool( "be:confirmed", true );
owner->EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_CHANGED (NULL, confired) has been sent\n" ));
#endif
msg->AddInt32("be:clause_end", 0);
msg->AddInt32("be:selection", 0);
msg->AddInt32("be:selection", 0);
msg->AddBool( "be:confirmed", true);
fOwner->EnqueueMessage(msg);
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_CHANGED (NULL, confired) "
"has been sent\n"));
SendInputStopped();
}
}
void
CannaLooper::HandleLocationReply( BMessage *msg )
CannaLooper::_HandleLocationReply(BMessage* msg)
{
BPoint where = B_ORIGIN;
float height = 0.0;
int32 start;
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_LOCATION_REQUEST received\n" ));
#endif
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_LOCATION_REQUEST received\n"));
start = fCanna->GetRevStartPositionInChar();
start = canna->GetRevStartPositionInChar();
#ifdef DEBUG
type_code type;
int32 count;
msg->GetInfo( "be:location_reply", &type, &count );
SERIAL_PRINT(( "CannaLooper: LOCATION_REPLY has %d locations.\n", count ));
SERIAL_PRINT(( "CannaLooper: RevStartPosition is %d.\n", start ));
msg->GetInfo("be:location_reply", &type, &count);
SERIAL_PRINT(("CannaLooper: LOCATION_REPLY has %d locations.\n", count));
SERIAL_PRINT(("CannaLooper: RevStartPosition is %d.\n", start));
#endif
msg->FindPoint( "be:location_reply", start, &where );
msg->FindFloat( "be:height_reply", start, &height );
BMessage m( KOUHO_WINDOW_SHOWAT );
m.AddPoint( "position", where );
m.AddFloat( "height", height );
msg->FindPoint("be:location_reply", start, &where);
msg->FindFloat("be:height_reply", start, &height);
BMessage m(KOUHO_WINDOW_SHOWAT);
m.AddPoint("position", where);
m.AddFloat("height", height);
theKouhoWindow->PostMessage( canna->GenerateKouhoString() );
theKouhoWindow->PostMessage( &m );
fKouhoWindow->PostMessage(fCanna->GenerateKouhoString());
fKouhoWindow->PostMessage(&m);
}
void
CannaLooper::HandleMethodActivated( bool active )
CannaLooper::_HandleMethodActivated(bool active)
{
if ( active )
{
if ( !thePalette ) //first time input method activated
{
if (active) {
if (!fPaletteWindow) {
// first time input method activated
float x = gSettings.palette_loc.x;
float y = gSettings.palette_loc.y;
BRect frame( x, y, x + 114, y + 44 );
thePalette = new PaletteWindow( frame, this );
thePalette->Show();
theKouhoWindow = new KouhoWindow( &kouhoFont, this );
theKouhoWindow->Run();
BRect frame(x, y, x + 114, y + 44);
fPaletteWindow = new PaletteWindow(frame, this);
fPaletteWindow->Show();
fKouhoWindow = new KouhoWindow(&fKouhoFont, this);
fKouhoWindow->Run();
}
thePalette->PostMessage( PALETTE_WINDOW_SHOW );
owner->SetMenu( theMenu, self );
}
else
{
ForceKakutei();
canna->ChangeMode( CANNA_MODE_HenkanMode );
BMessage m( PALETTE_WINDOW_BUTTON_UPDATE );
m.AddInt32( "mode", CANNA_MODE_HenkanMode );
thePalette->PostMessage( &m );
thePalette->PostMessage( PALETTE_WINDOW_HIDE );
theKouhoWindow->PostMessage( KOUHO_WINDOW_HIDE );
owner->SetMenu( NULL, self );
fPaletteWindow->PostMessage(PALETTE_WINDOW_SHOW);
fOwner->SetMenu(fMenu, this);
} else {
_ForceKakutei();
fCanna->ChangeMode(CANNA_MODE_HenkanMode);
BMessage m(PALETTE_WINDOW_BUTTON_UPDATE);
m.AddInt32("mode", CANNA_MODE_HenkanMode);
fPaletteWindow->PostMessage(&m);
fPaletteWindow->PostMessage(PALETTE_WINDOW_HIDE);
fKouhoWindow->PostMessage(KOUHO_WINDOW_HIDE);
fOwner->SetMenu(NULL, this);
}
}
void
CannaLooper::ForceKakutei()
CannaLooper::_ForceKakutei()
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: ForceKakutei() called\n" ));
#endif
uint32 result = canna->Kakutei();
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: returned from Kakutei(). result = %d\n", result ));
#endif
if ( result != NOTHING_TO_KAKUTEI )
ProcessResult( result );
SERIAL_PRINT(( "CannaLooper: _ForceKakutei() called\n" ));
uint32 result = fCanna->Kakutei();
SERIAL_PRINT(("CannaLooper: returned from Kakutei(). result = %d\n",
result));
if (result != NOTHING_TO_KAKUTEI)
_ProcessResult(result);
else
SendInputStopped();
return;
}
void
CannaLooper::SendInputStopped()
{
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_STOPPED );
EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_STOPPED has been sent\n" ));
#endif
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_STOPPED);
EnqueueMessage(msg);
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_STOPPED has been sent\n"));
}
void
CannaLooper::SendInputStarted()
{
BMessage *msg = new BMessage( B_INPUT_METHOD_EVENT );
msg->AddInt32( "be:opcode", B_INPUT_METHOD_STARTED );
msg->AddMessenger( "be:reply_to", BMessenger( NULL, this ) );
EnqueueMessage( msg );
#ifdef DEBUG
SERIAL_PRINT(( "CannaLooper: B_INPUT_METHOD_STARTED has been sent\n" ));
#endif
BMessage* msg = new BMessage(B_INPUT_METHOD_EVENT);
msg->AddInt32("be:opcode", B_INPUT_METHOD_STARTED);
msg->AddMessenger("be:reply_to", BMessenger(NULL, this));
EnqueueMessage(msg);
SERIAL_PRINT(("CannaLooper: B_INPUT_METHOD_STARTED has been sent\n"));
}
@@ -1,15 +1,12 @@
//
// CannaLooper.h
// CannaIM Looper object
/*
* Copyright 2007-2009 Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Copyright 1999 M.Kawamura
*/
#ifndef CANNA_LOOPER_H
#define CANNA_LOOPER_H
// This is a part of...
// CannaIM
// version 1.0
// (c) 1999 M.Kawamura
//
#ifndef _CANNA_LOOPER_H
#define _CANNA_LOOPER_H
#include <Messenger.h>
#include <Font.h>
@@ -24,32 +21,33 @@ class BMessenger;
extern Preferences gSettings;
class CannaLooper : public BLooper
{
class CannaLooper : public BLooper {
public:
CannaLooper( CannaMethod *method );
virtual void Quit();
void MessageReceived( BMessage *msg );
void EnqueueMessage( BMessage *msg );
status_t InitCheck();
status_t ReadSettings( char *basepath );
// bool QuitRequested();
void SendInputStopped();
void SendInputStarted();
CannaLooper(CannaMethod* method);
virtual void Quit();
virtual void MessageReceived(BMessage* msg);
void EnqueueMessage(BMessage* msg);
status_t Init();
status_t ReadSettings(char* basePath);
void SendInputStopped();
void SendInputStarted();
private:
CannaMethod* owner;
CannaInterface* canna;
BFont kouhoFont;
void HandleKeyDown( BMessage *msg );
void HandleLocationReply( BMessage *msg );
void HandleMethodActivated( bool active );
void ProcessResult( uint32 result );
void ForceKakutei();
KouhoWindow* theKouhoWindow;
PaletteWindow* thePalette;
BMenu* theMenu;
BMessenger self;
void _HandleKeyDown(BMessage* msg);
void _HandleLocationReply(BMessage* msg);
void _HandleMethodActivated(bool active);
void _ProcessResult(uint32 result);
void _ForceKakutei();
CannaMethod* fOwner;
CannaInterface* fCanna;
BFont fKouhoFont;
KouhoWindow* fKouhoWindow;
PaletteWindow* fPaletteWindow;
BMenu* fMenu;
};
#endif
#endif // CANNA_LOOPER_H
@@ -23,12 +23,15 @@ Preferences gSettings;
BInputServerMethod*
instantiate_input_method()
{
return (new CannaMethod());
return new CannaMethod();
}
// #pragma mark -
CannaMethod::CannaMethod()
:BInputServerMethod( "Canna", (const uchar *)kCannaIcon )
: BInputServerMethod("Canna", (const uchar*)kCannaIcon)
{
#ifdef DEBUG
SERIAL_PRINT(( "CannaIM:Constructor called.\n" ));
@@ -87,7 +90,7 @@ CannaMethod::InitCheck()
status_t err;
looper = new CannaLooper( this );
looper->Lock();
err = looper->InitCheck();
err = looper->Init();
looper->Unlock();
cannaLooper = BMessenger( NULL, looper );
#ifdef DEBUG