diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 967307c7a8..9ac6ebb88c 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -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 ] ; diff --git a/src/add-ons/input_server/methods/canna/CannaLooper.cpp b/src/add-ons/input_server/methods/canna/CannaLooper.cpp index 66fc573901..61fd9a2f8f 100644 --- a/src/add-ons/input_server/methods/canna/CannaLooper.cpp +++ b/src/add-ons/input_server/methods/canna/CannaLooper.cpp @@ -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 +#include + #include #include #include @@ -19,96 +21,75 @@ #include #include -#ifdef DEBUG -# include -#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")); } diff --git a/src/add-ons/input_server/methods/canna/CannaLooper.h b/src/add-ons/input_server/methods/canna/CannaLooper.h index a8c52bae81..4d6fcbff9b 100644 --- a/src/add-ons/input_server/methods/canna/CannaLooper.h +++ b/src/add-ons/input_server/methods/canna/CannaLooper.h @@ -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 #include @@ -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 diff --git a/src/add-ons/input_server/methods/canna/CannaMethod.cpp b/src/add-ons/input_server/methods/canna/CannaMethod.cpp index 4d4d0e170c..972df41fa8 100644 --- a/src/add-ons/input_server/methods/canna/CannaMethod.cpp +++ b/src/add-ons/input_server/methods/canna/CannaMethod.cpp @@ -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