Many changes, preparing to pull/merge main repo to get SDL_GetKeyboardFocus.
authordewyatt
Tue, 06 Jul 2010 02:06:17 -0400
changeset 4745 0aaa54fbd2bc
parent 4744 34c3e6d69575
child 4746 0c39b36dd104
Many changes, preparing to pull/merge main repo to get SDL_GetKeyboardFocus.
EXCLUDE/GLIMM/include/IMM.hpp
EXCLUDE/GLIMM/include/Window_Listener.hpp
EXCLUDE/GLIMM/src/IMM.cpp
EXCLUDE/GLIMM/src/Window.cpp
--- 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
--- 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
--- 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<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 @@
 	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);
+	}
+}
--- 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;