Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Many changes, preparing to pull/merge main repo to get SDL_GetKeyboar…

…dFocus.
  • Loading branch information
dewyatt committed Jul 6, 2010
1 parent 458b461 commit ba3a2361a54d9b176a23b042fb57178a5814bf91
Showing with 117 additions and 12 deletions.
  1. +11 −0 EXCLUDE/GLIMM/include/IMM.hpp
  2. +9 −0 EXCLUDE/GLIMM/include/Window_Listener.hpp
  3. +84 −12 EXCLUDE/GLIMM/src/IMM.cpp
  4. +13 −0 EXCLUDE/GLIMM/src/Window.cpp
@@ -16,15 +16,26 @@ class IMM

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;
HWND my_Window;
HIMC my_Context;
HKL my_HKL;
bool my_Vertical_Candidates;
bool my_Enabled;
};

#endif
@@ -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 @@ class Window_Listener
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
@@ -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,28 +29,30 @@ 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");
}
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);
}
}
@@ -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;

0 comments on commit ba3a236

Please sign in to comment.