diff options
author | dewyatt <none@none> | 2010-07-06 02:06:17 -0400 |
---|---|---|
committer | dewyatt <none@none> | 2010-07-06 02:06:17 -0400 |
commit | bfba97da7f3f1cc46956552a504002c34651b681 (patch) | |
tree | b42eac763e982001b03148ad4240925946ea6cf6 /EXCLUDE | |
parent | 56aecc4828cabd3c92e419d7a38faf5fef2c844f (diff) |
Many changes, preparing to pull/merge main repo to get SDL_GetKeyboardFocus.
Diffstat (limited to 'EXCLUDE')
-rw-r--r-- | EXCLUDE/GLIMM/include/IMM.hpp | 11 | ||||
-rw-r--r-- | EXCLUDE/GLIMM/include/Window_Listener.hpp | 9 | ||||
-rw-r--r-- | EXCLUDE/GLIMM/src/IMM.cpp | 96 | ||||
-rw-r--r-- | EXCLUDE/GLIMM/src/Window.cpp | 13 |
4 files changed, 117 insertions, 12 deletions
diff --git a/EXCLUDE/GLIMM/include/IMM.hpp b/EXCLUDE/GLIMM/include/IMM.hpp index ae2dfb81..45be3d61 100644 --- a/EXCLUDE/GLIMM/include/IMM.hpp +++ b/EXCLUDE/GLIMM/include/IMM.hpp @@ -16,8 +16,18 @@ public: 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 @@ private: HIMC my_Context;
HKL my_HKL;
bool my_Vertical_Candidates;
+ bool my_Enabled;
};
#endif
diff --git a/EXCLUDE/GLIMM/include/Window_Listener.hpp b/EXCLUDE/GLIMM/include/Window_Listener.hpp index a5a96e73..206dd50b 100644 --- a/EXCLUDE/GLIMM/include/Window_Listener.hpp +++ b/EXCLUDE/GLIMM/include/Window_Listener.hpp @@ -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 @@ public: 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 --git a/EXCLUDE/GLIMM/src/IMM.cpp b/EXCLUDE/GLIMM/src/IMM.cpp index 0ef3fdc9..c949ae4a 100644 --- a/EXCLUDE/GLIMM/src/IMM.cpp +++ b/EXCLUDE/GLIMM/src/IMM.cpp @@ -6,7 +6,8 @@ IMM::IMM() : my_COM_Initialized(false), my_Window(0),
my_Context(0),
my_HKL(0),
- my_Vertical_Candidates(false)
+ my_Vertical_Candidates(false),
+ my_Enabled(false)
{
}
@@ -28,11 +29,13 @@ void IMM::Initialize(HWND Window) if (SUCCEEDED(CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, reinterpret_cast<LPVOID *>(&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 @@ void IMM::Initialize(HWND Window) 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 @@ LRESULT IMM::Handle_Message(HWND Window, UINT Message, WPARAM wParam, LPARAM lPa 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 @@ LRESULT IMM::Handle_Message(HWND Window, UINT Message, WPARAM wParam, LPARAM lPa 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 --git a/EXCLUDE/GLIMM/src/Window.cpp b/EXCLUDE/GLIMM/src/Window.cpp index dc00303e..eb59121a 100644 --- a/EXCLUDE/GLIMM/src/Window.cpp +++ b/EXCLUDE/GLIMM/src/Window.cpp @@ -31,6 +31,7 @@ void Window::Initialize(const std::wstring &Title, const Video_Mode &Mode, bool my_Fullscreen = Fullscreen;
Register_Class();
Create_Window(Title, Mode, Fullscreen);
+ Show();
my_IMM.Initialize(my_Handle);
}
@@ -296,6 +297,18 @@ LRESULT Window::Handle_Message(HWND Handle, UINT Message, WPARAM wParam, LPARAM 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;
|