From: ryo-dairiki <ryo...@us...> - 2006-05-29 02:34:08
|
Update of /cvsroot/scim/scim-bridge/agent In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv15704/agent Modified Files: Tag: plaintext scim-bridge-agent-keyevent-utility.cpp scim-bridge-agent-exception.cpp scim-bridge-agent-keyevent-utility.h scim-bridge-agent-imcontext.h scim-bridge-agent-exception.h scim-bridge-agent-client-peer.cpp scim-bridge-agent-imcontext.cpp Removed Files: Tag: plaintext scim-bridge-agent-messenger.h Log Message: --- scim-bridge-agent-messenger.h DELETED --- Index: scim-bridge-agent-exception.h =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-exception.h,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -C2 -d -r1.2 -r1.2.2.1 *** scim-bridge-agent-exception.h 7 Apr 2006 13:08:41 -0000 1.2 --- scim-bridge-agent-exception.h 29 May 2006 02:34:04 -0000 1.2.2.1 *************** *** 6,10 **** #include "scim-bridge.h" - #include "scim-bridge-exception.h" class ScimBridgeAgentException: public std::runtime_error --- 6,9 ---- *************** *** 12,16 **** public: ScimBridgeAgentException (const std::string &message); - ScimBridgeAgentException (const ScimBridgeException &parent); ~ScimBridgeAgentException () throw (); }; --- 11,14 ---- Index: scim-bridge-agent-keyevent-utility.h =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-keyevent-utility.h,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -C2 -d -r1.3 -r1.3.2.1 *** scim-bridge-agent-keyevent-utility.h 7 Apr 2006 13:08:41 -0000 1.3 --- scim-bridge-agent-keyevent-utility.h 29 May 2006 02:34:04 -0000 1.3.2.1 *************** *** 11,15 **** typedef unsigned int ScimKeyLayout; ! ScimBridgeKeyEvent scim_bridge_keyevent_scim_to_bridge (const scim::KeyEvent &keyevent); ! scim::KeyEvent scim_bridge_keyevent_bridge_to_scim (const ScimBridgeKeyEvent &keyevent, const ScimKeyLayout &layout); #endif /*SCIMBRIDGEAGENTKEYEVENTUTILITY_H_*/ --- 11,16 ---- typedef unsigned int ScimKeyLayout; ! void scim_bridge_keyevent_scim_to_bridge (ScimBridgeKeyEvent *bridge_keyevent, const scim::KeyEvent *keyevent); ! void scim_bridge_keyevent_bridge_to_scim (scim::KeyEvent *keyevent, const ScimBridgeKeyEvent *bridge_keyevent, const ScimKeyLayout *layout); ! #endif /*SCIMBRIDGEAGENTKEYEVENTUTILITY_H_*/ Index: scim-bridge-agent-keyevent-utility.cpp =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-keyevent-utility.cpp,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -C2 -d -r1.2 -r1.2.2.1 *** scim-bridge-agent-keyevent-utility.cpp 29 Mar 2006 16:01:40 -0000 1.2 --- scim-bridge-agent-keyevent-utility.cpp 29 May 2006 02:34:04 -0000 1.2.2.1 *************** *** 1,2 **** --- 1,4 ---- + #include <pthread.h> + #include <map> *************** *** 13,16 **** --- 15,22 ---- static map <ScimKeyCode, ScimBridgeKeyCode> scim_to_bridge_map; + + static pthread_once_t static_initializer = PTHREAD_ONCE_INIT; + + /* Helper functions */ static void map_keycode (ScimKeyCode keycode, ScimBridgeKeyCode bridge_keycode) *************** *** 1856,1885 **** /* Implementations */ ! ScimBridgeKeyEvent scim_bridge_keyevent_scim_to_bridge (const ScimKeyEvent &keyevent) { ! init_trans_map (); ! ScimBridgeKeyEvent new_keyevent; ! new_keyevent.mod_state = 0; if (keyevent.is_shift_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_SHIFT; if (keyevent.is_caps_lock_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_CAPS_LOCK; if (keyevent.is_control_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_CONTROL; if (keyevent.is_alt_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_ALT; if (keyevent.is_meta_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_META; if (keyevent.is_super_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_SUPER; if (keyevent.is_hyper_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_HYPER; if (keyevent.is_num_lock_down ()) ! new_keyevent.mod_state |= SCIM_BRIDGE_MODIFIER_MASK_NUM_LOCK; if (keyevent.is_key_press ()) { ! new_keyevent.pressed = true; } else { ! new_keyevent.pressed = false; } --- 1862,1890 ---- /* Implementations */ ! void scim_bridge_keyevent_scim_to_bridge (ScimBridgeKeyEvent *bridge_keyevent, const ScimKeyEvent *keyevent) { ! pthread_once (&static_initializer, &init_trans_map); ! scim_bridge_keyevent_clear_modifiers (bridge_keyevent); if (keyevent.is_shift_down ()) ! scim_bridge_keyevent_set_shift_down (bridge_keyevent, true); if (keyevent.is_caps_lock_down ()) ! scim_bridge_keyevent_set_caps_lock_down (bridge_keyevent, true); if (keyevent.is_control_down ()) ! scim_bridge_keyevent_set_control_down (bridge_keyevent, true); if (keyevent.is_alt_down ()) ! scim_bridge_keyevent_set_alt_down (bridge_keyevent, true); if (keyevent.is_meta_down ()) ! scim_bridge_keyevent_set_meta_down (bridge_keyevent, true); if (keyevent.is_super_down ()) ! scim_bridge_keyevent_set_super_down (bridge_keyevent, true); if (keyevent.is_hyper_down ()) ! scim_bridge_keyevent_set_hyper_down (bridge_keyevent, true); if (keyevent.is_num_lock_down ()) ! scim_bridge_keyevent_set_num_lock_down (bridge_keyevent, true); if (keyevent.is_key_press ()) { ! scim_bridge_keyevent_set_pressed (bridge_keyevent, true); } else { ! scim_bridge_keyevent_set_pressed (bridge_keyevent, false); } *************** *** 1887,1926 **** if (iter == scim_to_bridge_map.end ()) { /* Is this right dicision? */ ! new_keyevent.code = SCIM_BRIDGE_KEY_NullKey; } else { pair <ScimKeyCode, ScimBridgeKeyCode> found_pair = *iter; new_keyevent.code = found_pair.second; } - - return new_keyevent; } ! ScimKeyEvent scim_bridge_keyevent_bridge_to_scim (const ScimBridgeKeyEvent &keyevent, const ScimKeyLayout &layout) { ! init_trans_map (); ScimKeyMask new_mod_state = 0; ! if (scim_bridge_keyevent_is_shift_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_ShiftMask; ! if (scim_bridge_keyevent_is_caps_lock_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_CapsLockMask; ! if (scim_bridge_keyevent_is_control_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_ControlMask; ! if (scim_bridge_keyevent_is_alt_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_AltMask; ! if (scim_bridge_keyevent_is_meta_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_MetaMask; ! if (scim_bridge_keyevent_is_super_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_SuperMask; ! if (scim_bridge_keyevent_is_hyper_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_HyperMask; ! if (scim_bridge_keyevent_is_num_lock_down (&keyevent)) new_mod_state |= scim::SCIM_KEY_NumLockMask; ! if (!scim_bridge_keyevent_is_key_pressed (&keyevent)) new_mod_state |= scim::SCIM_KEY_ReleaseMask; ScimKeyCode new_keycode; ! map <ScimBridgeKeyCode, ScimKeyCode>::iterator iter = bridge_to_scim_map.find (keyevent.code); if (iter == bridge_to_scim_map.end ()) { /* Is this right dicision? */ --- 1892,1931 ---- if (iter == scim_to_bridge_map.end ()) { /* Is this right dicision? */ ! scim_bridge_keyevent_set_code (bridge_keyevent, SCIM_BRIDGE_KEY_NullKey); } else { pair <ScimKeyCode, ScimBridgeKeyCode> found_pair = *iter; new_keyevent.code = found_pair.second; + scim_bridge_keyevent_set_code (bridge_keyevent, found_pair.second); } } ! void scim_bridge_keyevent_bridge_to_scim (ScimKeyEvent *keyevent, const ScimBridgeKeyEvent *bridge_keyevent, const ScimKeyLayout *layout) { ! pthread_once (&static_initializer, &init_trans_map); ScimKeyMask new_mod_state = 0; ! if (scim_bridge_keyevent_is_shift_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_ShiftMask; ! if (scim_bridge_keyevent_is_caps_lock_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_CapsLockMask; ! if (scim_bridge_keyevent_is_control_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_ControlMask; ! if (scim_bridge_keyevent_is_alt_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_AltMask; ! if (scim_bridge_keyevent_is_meta_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_MetaMask; ! if (scim_bridge_keyevent_is_super_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_SuperMask; ! if (scim_bridge_keyevent_is_hyper_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_HyperMask; ! if (scim_bridge_keyevent_is_num_lock_down (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_NumLockMask; ! if (!scim_bridge_keyevent_is_pressed (bridge_keyevent)) new_mod_state |= scim::SCIM_KEY_ReleaseMask; + keyevent->mask = new_mod_state; ScimKeyCode new_keycode; ! map <ScimBridgeKeyCode, ScimKeyCode>::iterator iter = bridge_to_scim_map.find (scim_bridge_keyevent_get_code (bridge_keyevent)); if (iter == bridge_to_scim_map.end ()) { /* Is this right dicision? */ *************** *** 1930,1934 **** new_keycode = found_pair.second; } ! ! return ScimKeyEvent (new_keycode, new_mod_state, layout); } --- 1935,1939 ---- new_keycode = found_pair.second; } ! keyevent->code = new_keycode; ! keyevent->layout = layout; } Index: scim-bridge-agent-client-peer.cpp =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-client-peer.cpp,v retrieving revision 1.15.2.4 retrieving revision 1.15.2.5 diff -C2 -d -r1.15.2.4 -r1.15.2.5 *** scim-bridge-agent-client-peer.cpp 28 May 2006 09:37:52 -0000 1.15.2.4 --- scim-bridge-agent-client-peer.cpp 29 May 2006 02:34:04 -0000 1.15.2.5 *************** *** 5,8 **** --- 5,10 ---- #include "scim-bridge-agent-client-peer.h" + #include "scim-bridge-agent-connection-lost-event.h" + #include "scim-bridge-messenger.h" /* Class definition */ *************** *** 14,17 **** --- 16,25 ---- ScimBridgeAgentClientPeerImpl (int new_socket_fd); ~ScimBridgeAgentClientPeerImpl (); + + /* The following methods are semi-public */ + bool is_connection_active (); + void connection_lost (); + + const ScimBridgeMessage *pop_message (); protected: *************** *** 19,22 **** --- 27,37 ---- virtual void do_close_event_client () = 0; + private: + + pthread_t socket_writer_thread; + pthread_t socket_reader_thread; + + ScimBridgeMessenger *messenger; + }; *************** *** 26,34 **** ScimBridgeAgentClientPeerImpl *client_peer = static_cast<ScimBridgeAgentClientPeerImpl*> (arg); ! while (client_peer->get_event_client_id () > 0) { const ScimBridgeAgentMessage *message; if (scim_bridge_messenger_receive_message (messenger, &message)) { ! ScimBridgeAgentException exception (scim_bridge_exception_get_message ()); ! client_peer->exception_occured (&exception); scim_bridge_free_message (message); return NULL; --- 41,48 ---- ScimBridgeAgentClientPeerImpl *client_peer = static_cast<ScimBridgeAgentClientPeerImpl*> (arg); ! while (client_peer->is_connection_active ()) { const ScimBridgeAgentMessage *message; if (scim_bridge_messenger_receive_message (messenger, &message)) { ! client_peer->connection_lost (); scim_bridge_free_message (message); return NULL; *************** *** 47,55 **** ScimBridgeAgentClientPeer *client_peer = static_cast<ScimBridgeAgentClientPeer*> (arg); ! while (client_peer->get_event_client_id () > 0) { const ScimBridgeMessage *message = client_peer->pop_message (); if (scim_bridge_messenger_send_message (messenger, message)) { - ScimBridgeAgentException exception (scim_bridge_exception_get_message ()); - client_peer->exception_occured (&exception); scim_bridge_free_message (message); return NULL; --- 61,68 ---- ScimBridgeAgentClientPeer *client_peer = static_cast<ScimBridgeAgentClientPeer*> (arg); ! while (client_peer->is_connection_active ()) { const ScimBridgeMessage *message = client_peer->pop_message (); + if (message == NULL) continue; if (scim_bridge_messenger_send_message (messenger, message)) { scim_bridge_free_message (message); return NULL; *************** *** 70,76 **** ! ScimBridgeAgentClientPeerImpl::ScimBridgeAgentClientPeerImpl (int new_socket_fd): socket_fd { messenger = scim_bridge_alloc_messenger (socket_fd); } --- 83,92 ---- ! ScimBridgeAgentClientPeerImpl::ScimBridgeAgentClientPeerImpl (int socket_fd) { messenger = scim_bridge_alloc_messenger (socket_fd); + + pthread_create (&socket_writer_thread, run_socket_writer); + pthread_create (&socket_reader_thread, run_socket_reader); } *************** *** 82,87 **** ! ScimBridgeAgentClientPeer::do_close_event_client () { ! scim_bridge_messenger_close (messenger); } --- 98,137 ---- ! bool ScimBridgeAgentClientPeerImpl::is_connection_active () { ! return !scim_bridge_messenger_is_closed (messenger); ! } ! ! ! const ScimBridgeMessage *ScimBridgeAgentClientPeerImpl::pop_message () ! { ! const ScimBridgeAgentEvent *event = pop_event (); ! ScimBridgeMessage *message = NULL; ! if (event != NULL) { ! switch (event->get_code ()) { ! default: ! break; ! } ! } ! ! delete event; ! return message; ! } ! ! ! void ScimBridgeAgentClientPeerImpl::connection_lost () ! { ! get_event_server ()->push_event (new ScimBridgeAgentConnectionLostEvent (this)); ! } ! ! ! void ScimBridgeAgentClientPeerImpl::do_close_event_client () ! { ! scim_bridge_messenger_close (messenger); ! ! pthread_kill (socket_writer_thread, SIGNOTIFY); ! pthread_join (socket_writer_thread, NULL); ! ! pthread_kill (socket_reader_thread, SIGNOTIFY); ! pthread_join (socket_reader_thread, NULL); } Index: scim-bridge-agent-exception.cpp =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-exception.cpp,v retrieving revision 1.1 retrieving revision 1.1.4.1 diff -C2 -d -r1.1 -r1.1.4.1 *** scim-bridge-agent-exception.cpp 3 Mar 2006 16:32:49 -0000 1.1 --- scim-bridge-agent-exception.cpp 29 May 2006 02:34:04 -0000 1.1.4.1 *************** *** 6,16 **** using std::string; - ScimBridgeAgentException::ScimBridgeAgentException (const string &message): runtime_error (message) - { - } - ! ScimBridgeAgentException::ScimBridgeAgentException (const ScimBridgeException &parent): ! runtime_error (string (scim_bridge_exception_get_message (&parent)) + ": " + string (scim_bridge_exception_get_strerror (&parent))) { } --- 6,11 ---- using std::string; ! ScimBridgeAgentException::ScimBridgeAgentException (const string &message): runtime_error (message) { } Index: scim-bridge-agent-imcontext.cpp =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-imcontext.cpp,v retrieving revision 1.10 retrieving revision 1.10.2.1 diff -C2 -d -r1.10 -r1.10.2.1 *** scim-bridge-agent-imcontext.cpp 7 Apr 2006 13:08:41 -0000 1.10 --- scim-bridge-agent-imcontext.cpp 29 May 2006 02:34:04 -0000 1.10.2.1 *************** *** 1,356 **** #include <assert.h> ! #include "scim-bridge-agent-imcontext.h" ! #include "scim-bridge-agent-kernel.h" ! #include "scim-bridge-imcontext-manager.h" ! ! using namespace scim; ! /* Class members */ ! bool ScimBridgeAgentIMContext::on_the_spot = true; ! bool ScimBridgeAgentIMContext::imengine_shared = false; ! IMEngineInstancePointer ScimBridgeAgentIMContext::shared_imengine = NULL; ! bool ScimBridgeAgentIMContext::is_on_the_spot_enabled () ! { ! return on_the_spot; ! } ! void ScimBridgeAgentIMContext::set_on_the_spot_enabled (bool enabled) ! { ! on_the_spot = enabled; ! } ! bool ScimBridgeAgentIMContext::is_imengine_shared () ! { ! return imengine_shared; ! } ! void ScimBridgeAgentIMContext::set_imengine_shared (bool shared) ! { ! imengine_shared = shared; ! } ! IMEngineInstancePointer ScimBridgeAgentIMContext::get_shared_imengine () { ! return shared_imengine; ! } ! void ScimBridgeAgentIMContext::set_shared_imengine (IMEngineInstancePointer new_imengine) { ! shared_imengine = new_imengine; } ! void ScimBridgeAgentIMContext::release_shared_imengine () { ! set_shared_imengine (NULL); } ! /* Object members */ ! ScimBridgeAgentIMContext::ScimBridgeAgentIMContext (): preedit_shown (false), client_peer (NULL) { ! static bool static_initialized = false; ! if (!static_initialized) { ! static_initialized = true; ! scim_bridge_initialize_imcontext_manager (); } ! ! status = false; ! ! scim_bridge_add_imcontext (this); } ! ScimBridgeAgentIMContext::~ScimBridgeAgentIMContext () { ! free (); ! } ! void ScimBridgeAgentIMContext::free () { ! if (!imengine) { ! imengine->reset (); ! imengine = NULL; ! } ! ! client_peer = NULL; ! ! scim_bridge_remove_imcontext (this); } ! ! ScimBridgeAgentIMContext *ScimBridgeAgentIMContext::find (ScimBridgeIMContextID id) { ! ScimBridgeAgentIMContext *imcontext = static_cast<ScimBridgeAgentIMContext*> (scim_bridge_find_imcontext (id)); ! assert (imcontext != NULL && imcontext->get_id () == id); ! return imcontext; } ! void ScimBridgeAgentIMContext::reset_preedit () { ! preedit_string.clear (); ! preedit_caret = 0; ! preedit_shown = false; ! preedit_attribute_list.clear (); } ! ! void ScimBridgeAgentIMContext::set_preedit_caret (int caret_pos) { ! preedit_caret = caret_pos; } ! ! const int ScimBridgeAgentIMContext::get_preedit_caret () const { ! return preedit_caret; } ! ! const bool ScimBridgeAgentIMContext::is_on () const { - return status; } ! void ScimBridgeAgentIMContext::turn_on () { ! status = true; } ! void ScimBridgeAgentIMContext::turn_off () { ! status = false; } ! const ScimBridgeIMContextID ScimBridgeAgentIMContext::get_id () const { ! return parent.id; } ! const ScimBridgeIMContextID ScimBridgeAgentIMContext::get_opponent_id () const { ! return parent.opponent_id; } ! void ScimBridgeAgentIMContext::set_opponent_id (ScimBridgeIMContextID new_opponent_id) { ! parent.opponent_id = new_opponent_id; } ! const IMEngineInstancePointer ScimBridgeAgentIMContext::get_imengine () const { ! return imengine; } ! void ScimBridgeAgentIMContext::set_imengine (scim::IMEngineInstancePointer new_imengine) { ! imengine = new_imengine; ! update_capabilities (); ! ! imengine->set_frontend_data (static_cast <void*> (this)); if (imengine_shared) { ! set_shared_imengine (new_imengine); } else { ! set_shared_imengine (NULL); } } ! const WideString &ScimBridgeAgentIMContext::get_preedit_string () ! { ! return preedit_string; ! } ! ! ! void ScimBridgeAgentIMContext::set_preedit_string (const WideString &wstr) ! { ! preedit_string = wstr; ! } ! ! ! const AttributeList &ScimBridgeAgentIMContext::get_preedit_attribute_list () ! { ! return preedit_attribute_list; ! } ! ! ! void ScimBridgeAgentIMContext::set_preedit_attribute_list (const AttributeList &attr_list) ! { ! preedit_attribute_list = attr_list; ! } ! ! ! const bool ScimBridgeAgentIMContext::is_preedit_shown () const ! { ! return preedit_shown; ! } ! ! ! void ScimBridgeAgentIMContext::set_preedit_shown (bool shown) ! { ! assert ((shown && on_the_spot) || !shown); ! preedit_shown = shown; ! ! update_capabilities (); ! } ! ! ! void ScimBridgeAgentIMContext::update_capabilities () { ! if (imengine) { ! unsigned int cap = SCIM_CLIENT_CAP_ALL_CAPABILITIES; ! ! if (!preedit_shown) ! cap -= SCIM_CLIENT_CAP_ONTHESPOT_PREEDIT; ! imengine->update_client_capabilities (cap); } } ! const ScimBridgeAgentClientPeer *ScimBridgeAgentIMContext::get_client_peer () const ! { ! return client_peer; ! } ! ! ! ScimBridgeAgentClientPeer *ScimBridgeAgentIMContext::get_client_peer () ! { ! return client_peer; ! } ! ! ! void ScimBridgeAgentIMContext::set_client_peer (ScimBridgeAgentClientPeer *new_client_peer) ! { ! client_peer = new_client_peer; ! } ! ! ! /* Calls for imengine instance */ ! ! const int ScimBridgeAgentIMContext::get_cursor_x () const ! { ! return cursor_x; ! } ! ! ! const int ScimBridgeAgentIMContext::get_cursor_y () const ! { ! return cursor_y; ! } ! ! ! void ScimBridgeAgentIMContext::set_cursor_x (int x) ! { ! cursor_x = x; ! } ! ! ! void ScimBridgeAgentIMContext::set_cursor_y (int y) ! { ! cursor_y = y; ! } ! ! ! void ScimBridgeAgentIMContext::set_cursor_location (int x, int y) ! { ! cursor_x = x; ! cursor_y = y; ! } ! ! ! bool ScimBridgeAgentIMContext::process_key_event (const KeyEvent &keyevent) ! { ! return imengine->process_key_event (keyevent); ! } ! ! ! void ScimBridgeAgentIMContext::update_lookup_table_page_size (int page_size) ! { ! imengine->update_lookup_table_page_size (page_size); ! } ! ! ! void ScimBridgeAgentIMContext::lookup_table_page_up () ! { ! imengine->lookup_table_page_up (); ! } ! ! ! void ScimBridgeAgentIMContext::lookup_table_page_down () ! { ! imengine->lookup_table_page_down (); ! } ! ! ! void ScimBridgeAgentIMContext::trigger_property (const String &property) ! { ! imengine->trigger_property (property); ! } ! ! ! const String ScimBridgeAgentIMContext::get_factory_uuid () const ! { ! return imengine->get_factory_uuid (); ! } ! ! ! void ScimBridgeAgentIMContext::process_helper_event (const String &helper_uuid, const Transaction &trans) ! { ! imengine->process_helper_event (helper_uuid, trans); ! } ! ! ! void ScimBridgeAgentIMContext::move_preedit_caret (int caret_pos) ! { ! imengine->move_preedit_caret (caret_pos); ! } ! ! ! void ScimBridgeAgentIMContext::select_candidate (int cand_index) ! { ! imengine->select_candidate (cand_index); ! } ! ! ! void ScimBridgeAgentIMContext::focus_in () ! { ! imengine->focus_in (); ! } ! ! ! void ScimBridgeAgentIMContext::focus_out () ! { ! imengine->focus_out (); ! } ! ! ! void ScimBridgeAgentIMContext::reset () ! { ! reset_preedit (); ! imengine->reset (); ! } ! ! ! bool ScimBridgeAgentIMContext::process_keyevent (const scim::KeyEvent &keyevent) { ! return imengine->process_key_event (keyevent); } --- 1,197 ---- #include <assert.h> ! #include <list> ! #include "scim-bridge-agent-imcontext.h" ! using std::list; ! using namespace scim; + /* Static variables */ + static BackEndPointer scim_backend = NULL; ! static IMEngineInstancePointer shared_imengine = NULL; ! static IMEngineInstancePointer fallback_imengine = NULL; + static String scim_language = ""; ! static bool imengine_shared = false; + static list<ScimBridgeAgentIMContext*> imcontexts; ! static unsigned int imengine_id = 0; ! /* Class definition */ ! class ScimBridgeAgentImpl: public ScimBridgeAgent { ! ! public: ! ! static void slot_fallback_commit_string (IMEngineInstanceBase *imengine, const WideString &commit_string); ! ! ScimBridgeAgentImpl (); ! ~ScimBridgeAgentImpl (); ! ! private: ! ! void alloc_imengine (); ! void free_imengine (); ! ! }; ! /* Implementations */ ! ScimBridgeAgentIMContext::ScimBridgeAgentIMContext *alloc () { ! return new ScimBridgeAgentIMContextImpl (); } ! void ScimBridgeAgentIMContext::static_initialize () { ! assert (scim_backend != NULL); ! ! IMEngineFactoryPointer fallback_imengine_factory = scim_backend->get_factory (SCIM_COMPOSE_KEY_FACTORY_UUID); ! if (fallback_imengine_factory.null ()) fallback_imengine_factory = new DummyIMEngineFactory (); ! ! fallback_imengine = fallback_imengine_factory->create_instance (String ("UTF-8"), 0); ! fallback_imengine->signal_connect_commit_string (slot (&ScimBridgeAgentIMContextImpl::slot_fallback_commit_string)); } ! void ScimBridgeAgentIMContext::static_finalize () { ! for (list<ScimBridgeAgentIMContext*>::iterator i = imcontexts.begin (); i != imcontexts.end (); ++i) { ! ScimBridgeAgentIMContext *imcontext = *i; ! delete imcontext; } ! imcontexts.clear (); ! ! shared_imengine = NULL; ! fallback_imengine = NULL; } ! BackEndPointer ScimBridgeAgentIMContext::get_scim_backend () { ! return scim_backend; ! }; ! void ScimBridgeAgentIMContext::set_scim_backend (BackEndPointer backend) { ! scim_backend = backend; } ! ! String ScimBridgeAgentIMContext::get_scim_language () { ! return scim_language; } ! void ScimBridgeAgentIMContext::set_scim_language (String language) { ! scim_language = language; } ! ! bool ScimBridgeAgentIMContext::is_imengine_shared () { ! return imengine_shared; } ! ! void ScimBridgeAgentIMContext::set_imengine_shared (bool shared) { ! imengine_shared = shared; } + ! ScimBridgeAgentIMContextImpl::ScimBridgeAgentIMContextImpl () { } ! ScimBridgeAgentIMContextImpl::~ScimBridgeAgentIMContextImpl () { ! free_imengine (); } ! BackEndPointer ScimBridgeAgentIMContextImpl::get_scim_backend () { ! return scim_backend; } ! void ScimBridgeAgentIMContextImpl::set_scim_backend (scim::BackEndPointer new_backend) { ! scim_backend = new_backend; } ! scim::String ScimBridgeAgentIMContextImpl::get_scim_language () { ! return scim_language; } ! void ScimBridgeAgentIMContextImpl::set_scim_language (scim::String language) { ! scim_language = language; } ! bool ScimBridgeAgentIMContextImpl::is_imengine_shared () { ! return imengine_shared; } ! void ScimBridgeAgentIMContextImpl::set_imengine_shared (bool shared) { ! if (imengine_shared == shared) return; + imengine_shared = shared; + shared_imengine = NULL; if (imengine_shared) { ! IMEngineFactoryPointer factory = scim_backend->get_default_factory (scim_language, "UTF-8"); ! if (factory != NULL) { ! shared_imengine = factory->create_instance ("UTF-8", imengine_id); ! ++imengine_id; ! } ! if (shared_imengine == NULL) shared_imengine = fallback_imengine; ! ! for (list<ScimBridgeAgentIMContext*>::iterator i = imcontexts.begin (); i != imcontexts.end (); ++i) { ! ScimBridgeAgentIMContext *imcontext = *i; ! imcontext->free_imengine (); ! } } else { ! for (list<ScimBridgeAgentIMContext*>::iterator i = imcontexts.begin (); i != imcontexts.end (); ++i) { ! ScimBridgeAgentIMContext *imcontext = *i; ! imcontext->alloc_imengine (); ! } } } ! void ScimBridgeAgentIMContextImpl::alloc_imengine () { ! imengine = NULL; ! IMEngineFactoryPointer factory = scim_backend->get_default_factory (scim_language, "UTF-8"); ! if (factory != NULL) { ! imengine = factory->create_instance ("UTF-8", imengine_id); ! ++imengine_id; } + if (imengine == NULL) imengine = fallback_imengine; } ! void ScimBridgeAgentIMContextImpl::free_imengine () { ! imengine = NULL; } Index: scim-bridge-agent-imcontext.h =================================================================== RCS file: /cvsroot/scim/scim-bridge/agent/scim-bridge-agent-imcontext.h,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -C2 -d -r1.5 -r1.5.2.1 *** scim-bridge-agent-imcontext.h 7 Apr 2006 13:08:41 -0000 1.5 --- scim-bridge-agent-imcontext.h 29 May 2006 02:34:04 -0000 1.5.2.1 *************** *** 9,109 **** #include "scim-bridge.h" - #include "scim-bridge-keyevent.h" - #include "scim-bridge-imcontext-common.h" - - class ScimBridgeAgentClientPeer; ! class ScimBridgeAgentIMContext: public ScimBridgeIMContext ! { public: ! ! /* static functions */ ! static void set_on_the_spot_enabled (bool enabled); ! static bool is_on_the_spot_enabled (); static bool is_imengine_shared (); static void set_imengine_shared (bool shared); ! static scim::IMEngineInstancePointer get_shared_imengine (); ! static void release_shared_imengine (); ! ! static ScimBridgeAgentIMContext *find (ScimBridgeIMContextID id); ! ! ScimBridgeAgentIMContext (); ! ~ScimBridgeAgentIMContext (); ! ! void free (); ! ! bool process_key_event (const scim::KeyEvent &keyevent); ! ! const scim::AttributeList &get_preedit_attribute_list (); ! void set_preedit_attribute_list (const scim::AttributeList &attr_list); ! const scim::WideString &get_preedit_string (); ! void set_preedit_string (const scim::WideString & wstr); ! void move_preedit_caret (int caret_pos); ! void set_preedit_caret (int caret_pos); ! const int get_preedit_caret () const; ! void set_preedit_shown (bool shown); ! const bool is_preedit_shown () const; ! void reset_preedit (); ! ! const int get_cursor_x () const; ! const int get_cursor_y () const; ! void set_cursor_x (int new_x); ! void set_cursor_y (int new_y); ! void set_cursor_location (int new_x, int new_y); ! ! const bool is_on () const; ! void turn_on (); ! void turn_off (); ! ! const ScimBridgeIMContextID get_id () const; ! const ScimBridgeIMContextID get_opponent_id () const; ! void set_opponent_id (ScimBridgeIMContextID new_opponent_id); ! ! void set_imengine (scim::IMEngineInstancePointer new_imengine); ! const scim::IMEngineInstancePointer get_imengine () const; ! ! void update_lookup_table_page_size (int page_size); ! void lookup_table_page_up (); ! void lookup_table_page_down (); ! void trigger_property (const scim::String &property); ! const scim::String get_factory_uuid () const; ! void process_helper_event (const scim::String &helper_uuid, const scim::Transaction &trans); ! void select_candidate (int cand_index); ! ! void reset (); ! void focus_in (); ! void focus_out (); ! ! bool process_keyevent (const scim::KeyEvent &keyevent); ! ! const ScimBridgeAgentClientPeer *get_client_peer () const; ! ScimBridgeAgentClientPeer *get_client_peer (); ! void set_client_peer (ScimBridgeAgentClientPeer *new_client_peer); ! ! private: ! ! static scim::IMEngineInstancePointer shared_imengine; ! ! static bool on_the_spot; ! static bool imengine_shared; ! ! static void set_shared_imengine (scim::IMEngineInstancePointer new_imengine); ! ! scim::IMEngineInstancePointer imengine; ! scim::WideString preedit_string; ! scim::AttributeList preedit_attribute_list; ! ! bool preedit_shown; ! int preedit_caret; ! ! int cursor_x; ! int cursor_y; ! ! bool status; ! ! ScimBridgeAgentClientPeer *client_peer; ! ! void update_capabilities (); ! }; ! #endif /*SCIMBRIDGEAGENTIMCONTEXT_H_*/ --- 9,38 ---- #include "scim-bridge.h" ! class ScimBridgeAgentIMContext { ! public: ! ! static ScimBridgeAgentIMContext *alloc (); ! ! static void static_initialize (); ! static void static_finalize (); ! ! static scim::BackEndPointer get_scim_backend (); ! static void set_scim_backend (scim::BackEndPointer new_backend); ! ! static scim::String get_scim_language (); ! static void set_scim_language (scim::String language); ! static bool is_imengine_shared (); static void set_imengine_shared (bool shared); ! ! virtual ~ScimBridgeAgentIMContext () {} ! ! protected: ! ! ScimBridgeAgentIMContext () {} ! }; ! ! #endif /*SCIMBRIDGEAGENTIMCONTEXT_H_*/ |