Glenn Maynard's IME patch
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 4 Aug 2001 15:15:07 +0000 (15:15 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 4 Aug 2001 15:15:07 +0000 (15:15 +0000)
git-svn-id: svn://svn.tartarus.org/sgt/putty@1172 cda61777-01e9-0310-a592-d414129be87e

Makefile
window.c

index 24031c5..ff22b15 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -124,7 +124,7 @@ LRESRC = plink.$(RES)
 
 LIBS1 = advapi32.lib user32.lib gdi32.lib
 LIBS2 = comctl32.lib comdlg32.lib
-LIBS3 = shell32.lib winmm.lib
+LIBS3 = shell32.lib winmm.lib imm32.lib
 SOCK1 = wsock32.lib
 SOCK2 = ws2_32.lib
 
index 3d4f080..3fd445f 100644 (file)
--- a/window.c
+++ b/window.c
@@ -128,6 +128,8 @@ static char *window_name, *icon_name;
 
 static int compose_state = 0;
 
+static OSVERSIONINFOEX osVersion;
+
 /* Dummy routine, only required in plink. */
 void ldisc_update(int echo, int edit)
 {
@@ -166,6 +168,19 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
      * config box. */
     defuse_showwindow();
 
+    {
+       ZeroMemory(&osVersion, sizeof(osVersion));
+       osVersion.dwOSVersionInfoSize = sizeof(osVersion);
+
+       if(!GetVersionEx ((OSVERSIONINFO *) &osVersion)) {
+       // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
+
+       osVersion.dwOSVersionInfoSize = sizeof (osVersion);
+       if (!GetVersionEx ( (OSVERSIONINFO *) &osVersion))
+           return FALSE;
+       }
+    }
+
     /*
      * Process the command line.
      */
@@ -1873,6 +1888,31 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            kbd_codepage = atoi(lbuf);
        }
        break;
+      case WM_IME_COMPOSITION:
+       {
+           HIMC hIMC;
+           int n;
+           char *buff;
+   
+           if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS || 
+               osVersion.dwPlatformId == VER_PLATFORM_WIN32s) break; /* no Unicode */
+
+           if ((lParam & GCS_RESULTSTR) == 0) /* Composition unfinished. */
+               break; /* fall back to DefWindowProc */
+
+           hIMC = ImmGetContext(hwnd);
+           n = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
+
+           if (n > 0) {
+               buff = (char*) smalloc(n);
+               ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, buff, n);
+               luni_send((unsigned short *)buff, n / 2);
+               free(buff);
+           }
+           ImmReleaseContext(hwnd, hIMC);
+           return 1;
+       }
+
       case WM_IME_CHAR:
        if (wParam & 0xFF00) {
            unsigned char buf[2];
@@ -1916,8 +1956,27 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
  */
 void sys_cursor(int x, int y)
 {
-    if (has_focus)
-       SetCaretPos(x * font_width, y * font_height);
+    COMPOSITIONFORM cf;
+    HIMC hIMC;
+
+    if (!has_focus) return;
+    
+    SetCaretPos(x * font_width, y * font_height);
+
+    /* IMM calls on Win98 and beyond only */
+    if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */
+    
+    if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
+           osVersion.dwMinorVersion == 0) return; /* 95 */
+
+    /* we should have the IMM functions */
+    hIMC = ImmGetContext(hwnd);
+    cf.dwStyle = CFS_POINT;
+    cf.ptCurrentPos.x = x * font_width;
+    cf.ptCurrentPos.y = y * font_height;
+    ImmSetCompositionWindow(hIMC, &cf);
+
+    ImmReleaseContext(hwnd, hIMC);
 }
 
 /*