# HG changeset patch # User dewyatt # Date 1278396377 14400 # Node ID 0aaa54fbd2bc4f53d2e0b3fe55e45f93fd367b41 # Parent 34c3e6d6957567299ce9557255d3a1914581dc99 Many changes, preparing to pull/merge main repo to get SDL_GetKeyboardFocus. diff -r 34c3e6d69575 -r 0aaa54fbd2bc EXCLUDE/GLIMM/include/IMM.hpp --- a/EXCLUDE/GLIMM/include/IMM.hpp Tue Jul 06 02:00:15 2010 -0400 +++ b/EXCLUDE/GLIMM/include/IMM.hpp Tue Jul 06 02:06:17 2010 -0400 @@ -16,8 +16,18 @@ LRESULT Handle_Message(HWND Window, UINT Message, WPARAM wParam, LPARAM lParam, bool &Ate); + void Enable(); + void Disable(); + bool Is_Enabled(); + void Toggle(); + + void Focus_Gained(); + void Focus_Lost(); + private: void Update_Input_Locale(); + void Cancel_Composition(); + void Input_Language_Changed(); bool my_COM_Initialized; ITfThreadMgr *my_Thread_Manager; @@ -25,6 +35,7 @@ HIMC my_Context; HKL my_HKL; bool my_Vertical_Candidates; + bool my_Enabled; }; #endif diff -r 34c3e6d69575 -r 0aaa54fbd2bc EXCLUDE/GLIMM/include/Window_Listener.hpp --- a/EXCLUDE/GLIMM/include/Window_Listener.hpp Tue Jul 06 02:00:15 2010 -0400 +++ b/EXCLUDE/GLIMM/include/Window_Listener.hpp Tue Jul 06 02:06:17 2010 -0400 @@ -1,6 +1,12 @@ #ifndef WINDOW_LISTENER_HPP #define WINDOW_LISTENER_HPP +enum Mouse_Button +{ + Mouse_Button_Left, + Mouse_Button_Right +}; + class Window_Listener { public: @@ -9,6 +15,9 @@ virtual void On_Key_Up(int Key){} virtual void On_Char(unsigned int Char){} virtual void On_Resized(unsigned int Width, unsigned int Height){} + virtual void On_Mouse_Button_Down(Mouse_Button Button){} + virtual void On_Mouse_Button_Up(Mouse_Button Button){} + }; #endif diff -r 34c3e6d69575 -r 0aaa54fbd2bc EXCLUDE/GLIMM/src/IMM.cpp --- a/EXCLUDE/GLIMM/src/IMM.cpp Tue Jul 06 02:00:15 2010 -0400 +++ b/EXCLUDE/GLIMM/src/IMM.cpp Tue Jul 06 02:06:17 2010 -0400 @@ -6,7 +6,8 @@ my_Window(0), my_Context(0), my_HKL(0), - my_Vertical_Candidates(false) + my_Vertical_Candidates(false), + my_Enabled(false) { } @@ -28,11 +29,13 @@ if (SUCCEEDED(CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, reinterpret_cast(&my_Thread_Manager)))) { ITfDocumentMgr *Document_Manager = 0; - if (FAILED(my_Thread_Manager->AssociateFocus(Window, NULL, &Document_Manager))) + if (SUCCEEDED(my_Thread_Manager->AssociateFocus(Window, NULL, &Document_Manager))) + { + if (Document_Manager) + Document_Manager->Release(); + } + else printf("Warning: ITfThreadMgr->AssociateFocus failed\n"); - - if (Document_Manager) - Document_Manager->Release(); } else printf("Warning: Failed to create ITfThreadMgr instance\n"); @@ -40,16 +43,16 @@ else printf("Warning: Failed to initialize COM\n"); - ImmDisableTextFrameService(-1); + ImmDisableTextFrameService((DWORD)-1); my_Context = ImmGetContext(my_Window); - if (!ImmReleaseContext(my_Window, my_Context)) - throw std::runtime_error("Error releasing context"); - + ImmReleaseContext(my_Window, my_Context); if (!my_Context) - throw std::runtime_error("No context"); + throw std::runtime_error("No context (No IME installed?)"); Update_Input_Locale(); + Cancel_Composition(); + Disable(); } void IMM::Finalize() @@ -102,11 +105,10 @@ switch (Message) { case WM_INPUTLANGCHANGE: - Update_Input_Locale(); + Input_Language_Changed(); break; case WM_IME_SETCONTEXT: lParam = 0; - return DefWindowProcW(my_Window, Message, wParam, lParam); break; case WM_IME_STARTCOMPOSITION: Ate = true; @@ -158,8 +160,78 @@ case IMN_CHANGECANDIDATE: Ate = true; break; + case IMN_CLOSECANDIDATE: + Ate = true; + break; + default: + Ate = true; + break; } break; } return 0; } + +void IMM::Enable() +{ + ImmAssociateContext(my_Window, my_Context); + Update_Input_Locale(); + my_Enabled = true; + printf("* Enabled\n"); +} + +void IMM::Disable() +{ + ImmAssociateContext(my_Window, 0); + my_Enabled = false; + printf("* Disabled\n"); +} + +bool IMM::Is_Enabled() +{ + return my_Enabled; +} + +void IMM::Toggle() +{ + if (my_Enabled) + Disable(); + else + Enable(); +} + +void IMM::Focus_Gained() +{ + if (my_Enabled) + Enable(); +} + +void IMM::Focus_Lost() +{ + bool Enabled = my_Enabled; + Cancel_Composition(); + Disable(); + my_Enabled = Enabled; +} + +void IMM::Cancel_Composition() +{ + HIMC hIMC = ImmGetContext(my_Window); + if (!hIMC) + return; + + ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + ImmNotifyIME(hIMC, NI_CLOSECANDIDATE, 0, 0); + ImmReleaseContext(my_Window, hIMC); +} + +void IMM::Input_Language_Changed() +{ + Update_Input_Locale(); + HWND hwndImeDef = ImmGetDefaultIMEWnd(my_Window); + if (hwndImeDef) + { + SendMessageA(hwndImeDef, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0); + SendMessageA(hwndImeDef, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0); + } +} diff -r 34c3e6d69575 -r 0aaa54fbd2bc EXCLUDE/GLIMM/src/Window.cpp --- a/EXCLUDE/GLIMM/src/Window.cpp Tue Jul 06 02:00:15 2010 -0400 +++ b/EXCLUDE/GLIMM/src/Window.cpp Tue Jul 06 02:06:17 2010 -0400 @@ -31,6 +31,7 @@ my_Fullscreen = Fullscreen; Register_Class(); Create_Window(Title, Mode, Fullscreen); + Show(); my_IMM.Initialize(my_Handle); } @@ -296,6 +297,18 @@ case WM_KILLFOCUS: my_IMM.Focus_Lost(); break; + case WM_LBUTTONDOWN: + Call_Listener(On_Mouse_Button_Down(Mouse_Button_Left)); + break; + case WM_LBUTTONUP: + Call_Listener(On_Mouse_Button_Up(Mouse_Button_Left)); + break; + case WM_RBUTTONDOWN: + Call_Listener(On_Mouse_Button_Down(Mouse_Button_Right)); + break; + case WM_RBUTTONUP: + Call_Listener(On_Mouse_Button_Up(Mouse_Button_Right)); + break; default: return DefWindowProcW(Handle, Message, wParam, lParam); break;