Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Input method in FreeBSD virtual terminal (Week4) ====== Date: 06/27-07/04 ===== Python Bindings ===== This week I decided to replace //SWIG// with //ctypes//. The reason is that I found it's quite complicated to return a void pointer or a C-style string in //SWIG//. While in //ctypes// I can set a functions's return type to //c_void_p// to return a void pointer, and one can even cast it into //c_char_p// to convert it into a Python string. Take function //rime_wrapper_get_input_str()// as an example: <code> rime_wrapper_get_input_str.restype = c_void_p </code> Then convert the type to char pointer, copy the string and free the origin pointer: <code> _input_str = rime_wrapper_get_input_str(self.rime_wrapper_ptr) input_str = cast(_input_str, c_char_p).value.decode('utf-8') rime_wrapper_free_str(_input_str) return input_str </code> Moreover, I found it's not as difficult as I thought few weeks ago to define the contents of a C struct in Python, and it turned out that it paid off since I could directly access the members in a structure in Python without processing them in C. ===== Tmux-rime ===== The origin idea of the server is acted as a rime session manager, which can handle multiple sessions and send different actions to different sessions depending on the //session_id// sent by the client. Later I found ''%%RimeAPI%%'' only can be initialized once during the program runtime, so the server can no longer handle multiple sessions simultaneously. Therefore I modified both client and server such that only when the user presses the tmux-rime prefix key do the server start. I also had established and implemented the six basic commands for the server: * ''%%commit_raw_str%%'': Commit the raw input text * ''%%delete_char%%'': Delete a char in composing * ''%%handle_key%%'': Handle a regular key * ''%%clear_state%%'': Clear the current composition * ''%%get_output_text%%'': Get the text that will be inserted later * ''%%get_status_str%%'': Get the display string of the status bar As for the tmux part, I had implemented these two functions: * Text inserting: Inserting the CJK characters in where the cursor places * IME status bar: Show preedit string and candidates in the tmux status bar summerofcode2021projects/inputmethodinfreebsdvirtualterminal/week4.txt Last modified: 2021/07/31 09:39by FanChung