src/video/win32/SDL_win32keyboard.c
author dewyatt
Tue, 03 Aug 2010 16:57:49 -0400
changeset 4759 863ba7d1f029
parent 4753 11b0a6a3eb4d
child 4760 c40027ee6d47
permissions -rw-r--r--
Large commit with initial reading string support, TSF UILess code, etc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     1
/*
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     2
    SDL - Simple DirectMedia Layer
3697
f7b03b6838cb Fixed bug #926
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
     3
    Copyright (C) 1997-2010 Sam Lantinga
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     4
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     5
    This library is free software; you can redistribute it and/or
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     6
    modify it under the terms of the GNU Lesser General Public
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     7
    License as published by the Free Software Foundation; either
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     8
    version 2.1 of the License, or (at your option) any later version.
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     9
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    10
    This library is distributed in the hope that it will be useful,
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    13
    Lesser General Public License for more details.
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    14
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    15
    You should have received a copy of the GNU Lesser General Public
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    16
    License along with this library; if not, write to the Free Software
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    18
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    19
    Sam Lantinga
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    20
    slouken@libsdl.org
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    21
*/
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    22
#include "SDL_config.h"
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    23
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    24
#include "SDL_win32video.h"
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    25
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    26
#include "../../events/SDL_keyboard_c.h"
2308
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
    27
#include "../../events/scancodes_win32.h"
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    28
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    29
#include <imm.h>
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    30
#include <oleauto.h>
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    31
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    32
static void IME_Init(SDL_VideoData *videodata, HWND hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    33
static void IME_Enable(SDL_VideoData *videodata, HWND hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    34
static void IME_Disable(SDL_VideoData *videodata, HWND hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    35
static void IME_Quit(SDL_VideoData *videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    36
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    37
#ifndef MAPVK_VK_TO_VSC
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    38
#define MAPVK_VK_TO_VSC     0
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    39
#endif
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    40
#ifndef MAPVK_VSC_TO_VK
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    41
#define MAPVK_VSC_TO_VK     1
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    42
#endif
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    43
#ifndef MAPVK_VK_TO_CHAR
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    44
#define MAPVK_VK_TO_CHAR    2
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    45
#endif
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    46
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    47
/* Alphabetic scancodes for PC keyboards */
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    48
BYTE alpha_scancodes[26] = {
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    49
    30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24,
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    50
    25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    51
};
2735
204be4fc2726 Final merge of Google Summer of Code 2008 work...
Sam Lantinga <slouken@libsdl.org>
parents: 2726
diff changeset
    52
2317
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    53
BYTE keypad_scancodes[10] = {
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    54
    82, 79, 80, 81, 75, 76, 77, 71, 72, 73
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    55
};
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    56
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    57
void
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    58
WIN_InitKeyboard(_THIS)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    59
{
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    60
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    61
    int i;
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    62
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    63
    /* Make sure the alpha scancodes are correct.  T isn't usually remapped */
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    64
    if (MapVirtualKey('T', MAPVK_VK_TO_VSC) != alpha_scancodes['T' - 'A']) {
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    65
#if 0
2726
f23ebf1ddac4 Dynamically load wintab32.dll
Sam Lantinga <slouken@libsdl.org>
parents: 2724
diff changeset
    66
        printf
f23ebf1ddac4 Dynamically load wintab32.dll
Sam Lantinga <slouken@libsdl.org>
parents: 2724
diff changeset
    67
            ("Fixing alpha scancode map, assuming US QWERTY layout!\nPlease send the following 26 lines of output to the SDL mailing list <sdl@libsdl.org>, including a description of your keyboard hardware.\n");
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    68
#endif
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    69
        for (i = 0; i < SDL_arraysize(alpha_scancodes); ++i) {
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    70
            alpha_scancodes[i] = MapVirtualKey('A' + i, MAPVK_VK_TO_VSC);
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    71
#if 0
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    72
            printf("%d = %d\n", i, alpha_scancodes[i]);
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    73
#endif
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    74
        }
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
    75
    }
2317
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    76
    if (MapVirtualKey(VK_NUMPAD0, MAPVK_VK_TO_VSC) != keypad_scancodes[0]) {
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    77
#if 0
2726
f23ebf1ddac4 Dynamically load wintab32.dll
Sam Lantinga <slouken@libsdl.org>
parents: 2724
diff changeset
    78
        printf
f23ebf1ddac4 Dynamically load wintab32.dll
Sam Lantinga <slouken@libsdl.org>
parents: 2724
diff changeset
    79
            ("Fixing keypad scancode map!\nPlease send the following 10 lines of output to the SDL mailing list <sdl@libsdl.org>, including a description of your keyboard hardware.\n");
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    80
#endif
2317
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    81
        for (i = 0; i < SDL_arraysize(keypad_scancodes); ++i) {
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    82
            keypad_scancodes[i] =
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    83
                MapVirtualKey(VK_NUMPAD0 + i, MAPVK_VK_TO_VSC);
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    84
#if 0
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
    85
            printf("%d = %d\n", i, keypad_scancodes[i]);
2724
0e2b65f32298 Added Wacom API headers.
Sam Lantinga <slouken@libsdl.org>
parents: 2324
diff changeset
    86
#endif
2317
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    87
        }
f537a293b3da Windows also remaps the numeric keypad... grrr
Sam Lantinga <slouken@libsdl.org>
parents: 2311
diff changeset
    88
    }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    89
2308
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
    90
    data->key_layout = win32_scancode_table;
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
    91
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    92
    data->ime_com_initialized = SDL_FALSE;
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
    93
    data->ime_threadmgr = 0;
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    94
    data->ime_initialized = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    95
    data->ime_enabled = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    96
    data->ime_available = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    97
    data->ime_hwnd_main = 0;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    98
    data->ime_hwnd_current = 0;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
    99
    data->ime_himc = 0;
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   100
    data->ime_composition[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   101
    data->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   102
    data->ime_cursor = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   103
    data->ime_hkl = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   104
    data->ime_himm32 = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   105
    data->GetReadingString = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   106
    data->ShowReadingWindow = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   107
    data->ImmLockIMC = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   108
    data->ImmUnlockIMC = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   109
    data->ImmLockIMCC = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   110
    data->ImmUnlockIMCC = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   111
    data->ime_uiless = SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   112
    data->ime_threadmgrex = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   113
    data->ime_uielemsinkcookie = TF_INVALID_COOKIE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   114
    data->ime_alpnsinkcookie = TF_INVALID_COOKIE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   115
    data->ime_openmodesinkcookie = TF_INVALID_COOKIE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   116
    data->ime_convmodesinkcookie = TF_INVALID_COOKIE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   117
    data->ime_uielemsink = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   118
    data->ime_ippasink = 0;
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   119
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
   120
    WIN_UpdateKeymap();
2308
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   121
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   122
    SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu");
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   123
    SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Windows");
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   124
    SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Windows");
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   125
}
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   126
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   127
void
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
   128
WIN_UpdateKeymap()
2308
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   129
{
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   130
    int i;
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   131
    SDL_scancode scancode;
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   132
    SDLKey keymap[SDL_NUM_SCANCODES];
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   133
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   134
    SDL_GetDefaultKeymap(keymap);
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   135
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   136
    for (i = 0; i < SDL_arraysize(win32_scancode_table); i++) {
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   137
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   138
        /* Make sure this scancode is a valid character scancode */
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   139
        scancode = win32_scancode_table[i];
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   140
        if (scancode == SDL_SCANCODE_UNKNOWN ||
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   141
            (keymap[scancode] & SDLK_SCANCODE_MASK)) {
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   142
            continue;
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   143
        }
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   144
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   145
        /* Alphabetic keys are handled specially, since Windows remaps them */
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   146
        if (i >= 'A' && i <= 'Z') {
2324
3202e4826c57 more valgrind errors fixed. Plus I ran make indent which changed a few files.
Bob Pendleton <bob@pendleton.com>
parents: 2317
diff changeset
   147
            BYTE vsc = alpha_scancodes[i - 'A'];
2311
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   148
            keymap[scancode] = MapVirtualKey(vsc, MAPVK_VSC_TO_VK) + 0x20;
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   149
        } else {
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   150
            keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF);
54e21acfec5a Friggin' Windows remaps alphabetic keys based on keyboard layout.
Sam Lantinga <slouken@libsdl.org>
parents: 2308
diff changeset
   151
        }
2308
514f7c1651fc Untested Win32 keyboard scancode code.
Sam Lantinga <slouken@libsdl.org>
parents: 1895
diff changeset
   152
    }
4465
3e69e077cb95 Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.
Sam Lantinga <slouken@libsdl.org>
parents: 3697
diff changeset
   153
    SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   154
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   155
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   156
void
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   157
WIN_QuitKeyboard(_THIS)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   158
{
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   159
    IME_Quit((SDL_VideoData *)_this->driverdata);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   160
}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   161
4747
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   162
void
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   163
WIN_StartTextInput(_THIS)
4747
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   164
{
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   165
    SDL_Window *window = SDL_GetKeyboardFocus();
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   166
    if (window) {
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   167
        HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   168
        SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   169
        IME_Init(videodata, hwnd);
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   170
        IME_Enable(videodata, hwnd);
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   171
    }
4747
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   172
}
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   173
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   174
void
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   175
WIN_StopTextInput(_THIS)
4747
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   176
{
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   177
    SDL_Window *window = SDL_GetKeyboardFocus();
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   178
    if (window) {
4753
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   179
        HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   180
        SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   181
        IME_Init(videodata, hwnd);
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   182
        IME_Disable(videodata, hwnd);
11b0a6a3eb4d Changed Start/StopTextInput back to not take any parameters.
dewyatt
parents: 4752
diff changeset
   183
    }
4747
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   184
}
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   185
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   186
void
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   187
WIN_SetTextInputRect(_THIS, SDL_Rect *rect)
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   188
{
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   189
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   190
}
5284a3b3217a Added empty text input functions for win32.
dewyatt
parents: 4465
diff changeset
   191
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   192
#define LANG_CHT MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   193
#define LANG_CHS MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   194
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   195
#define MAKEIMEVERSION(major,minor) ((DWORD) (((BYTE)(major) << 24) | ((BYTE)(minor) << 16) ))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   196
#define IMEID_VER(id) ((id) & 0xffff0000)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   197
#define IMEID_LANG(id) ((id) & 0x0000ffff)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   198
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   199
#define CHT_HKL_DAYI            ((HKL)0xE0060404)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   200
#define CHT_HKL_NEW_PHONETIC    ((HKL)0xE0080404)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   201
#define CHT_HKL_NEW_CHANG_JIE   ((HKL)0xE0090404)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   202
#define CHT_HKL_NEW_QUICK       ((HKL)0xE00A0404)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   203
#define CHT_HKL_HK_CANTONESE    ((HKL)0xE00B0404)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   204
#define CHT_IMEFILENAME1        "TINTLGNT.IME"
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   205
#define CHT_IMEFILENAME2        "CINTLGNT.IME"
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   206
#define CHT_IMEFILENAME3        "MSTCIPHA.IME"
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   207
#define IMEID_CHT_VER42         (LANG_CHT | MAKEIMEVERSION(4, 2))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   208
#define IMEID_CHT_VER43         (LANG_CHT | MAKEIMEVERSION(4, 3))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   209
#define IMEID_CHT_VER44         (LANG_CHT | MAKEIMEVERSION(4, 4))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   210
#define IMEID_CHT_VER50         (LANG_CHT | MAKEIMEVERSION(5, 0))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   211
#define IMEID_CHT_VER51         (LANG_CHT | MAKEIMEVERSION(5, 1))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   212
#define IMEID_CHT_VER52         (LANG_CHT | MAKEIMEVERSION(5, 2))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   213
#define IMEID_CHT_VER60         (LANG_CHT | MAKEIMEVERSION(6, 0))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   214
#define IMEID_CHT_VER_VISTA     (LANG_CHT | MAKEIMEVERSION(7, 0))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   215
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   216
#define CHS_HKL                 ((HKL)0xE00E0804)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   217
#define CHS_IMEFILENAME1        "PINTLGNT.IME"
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   218
#define CHS_IMEFILENAME2        "MSSCIPYA.IME"
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   219
#define IMEID_CHS_VER41         (LANG_CHS | MAKEIMEVERSION(4, 1))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   220
#define IMEID_CHS_VER42         (LANG_CHS | MAKEIMEVERSION(4, 2))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   221
#define IMEID_CHS_VER53         (LANG_CHS | MAKEIMEVERSION(5, 3))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   222
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   223
#define LANG() LOWORD((videodata->ime_hkl))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   224
#define PRIMLANG() ((WORD)PRIMARYLANGID(LANG()))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   225
#define SUBLANG() SUBLANGID(LANG())
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   226
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   227
static void IME_UpdateInputLocale(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   228
static void IME_ClearComposition(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   229
static void IME_SetWindow(SDL_VideoData* videodata, HWND hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   230
static void IME_SetupAPI(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   231
static DWORD IME_GetId(SDL_VideoData *videodata, UINT uIndex);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   232
static void IME_SendEditingEvent(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   233
#define SDL_IsEqualIID(riid1, riid2) SDL_IsEqualGUID(riid1, riid2)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   234
#define SDL_IsEqualGUID(rguid1, rguid2) (!SDL_memcmp(rguid1, rguid2, sizeof(GUID)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   235
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   236
static SDL_bool UILess_SetupSinks(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   237
static void UILess_ReleaseSinks(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   238
static void UILess_EnableUIUpdates(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   239
static void UILess_DisableUIUpdates(SDL_VideoData *videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   240
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   241
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   242
IME_Init(SDL_VideoData *videodata, HWND hwnd)
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   243
{
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   244
    if (videodata->ime_initialized)
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   245
        return;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   246
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   247
    videodata->ime_hwnd_main = hwnd;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   248
    if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED))) {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   249
        videodata->ime_com_initialized = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   250
        CoCreateInstance(&CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, &videodata->ime_threadmgr);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   251
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   252
    videodata->ime_initialized = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   253
    videodata->ime_himm32 = LoadLibraryA("imm32.dll");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   254
    if (!videodata->ime_himm32) {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   255
        videodata->ime_available = SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   256
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   257
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   258
    videodata->ImmLockIMC = (LPINPUTCONTEXT2 (WINAPI *)(HIMC))GetProcAddress(videodata->ime_himm32, "ImmLockIMC");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   259
    videodata->ImmUnlockIMC = (BOOL (WINAPI *)(HIMC))GetProcAddress(videodata->ime_himm32, "ImmUnlockIMC");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   260
    videodata->ImmLockIMCC = (LPVOID (WINAPI *)(HIMCC))GetProcAddress(videodata->ime_himm32, "ImmLockIMCC");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   261
    videodata->ImmUnlockIMCC = (BOOL (WINAPI *)(HIMCC))GetProcAddress(videodata->ime_himm32, "ImmUnlockIMCC");
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   262
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   263
    IME_SetWindow(videodata, hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   264
    videodata->ime_himc = ImmGetContext(hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   265
    ImmReleaseContext(hwnd, videodata->ime_himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   266
    if (!videodata->ime_himc) {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   267
        videodata->ime_available = SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   268
        IME_Disable(videodata, hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   269
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   270
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   271
    videodata->ime_available = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   272
    IME_UpdateInputLocale(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   273
    IME_SetupAPI(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   274
    videodata->ime_uiless = UILess_SetupSinks(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   275
    IME_UpdateInputLocale(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   276
    IME_Disable(videodata, hwnd);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   277
}
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   278
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   279
static void
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   280
IME_Enable(SDL_VideoData *videodata, HWND hwnd)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   281
{
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   282
    if (!videodata->ime_initialized || !videodata->ime_hwnd_current)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   283
        return;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   284
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   285
    if (!videodata->ime_available) {
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   286
        IME_Disable(videodata, hwnd);
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   287
        return;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   288
    }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   289
    if (videodata->ime_hwnd_current == videodata->ime_hwnd_main)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   290
        ImmAssociateContext(videodata->ime_hwnd_current, videodata->ime_himc);
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   291
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   292
    videodata->ime_enabled = SDL_TRUE;
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   293
    IME_UpdateInputLocale(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   294
    UILess_EnableUIUpdates(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   295
}
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   296
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   297
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   298
IME_Disable(SDL_VideoData *videodata, HWND hwnd)
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   299
{
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   300
    if (!videodata->ime_initialized || !videodata->ime_hwnd_current)
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   301
        return;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   302
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   303
    IME_ClearComposition(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   304
    if (videodata->ime_hwnd_current == videodata->ime_hwnd_main)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   305
        ImmAssociateContext(videodata->ime_hwnd_current, NULL);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   306
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   307
    videodata->ime_enabled = SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   308
    UILess_DisableUIUpdates(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   309
}
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   310
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   311
static void
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   312
IME_Quit(SDL_VideoData *videodata)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   313
{
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   314
    if (!videodata->ime_initialized)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   315
        return;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   316
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   317
    UILess_ReleaseSinks(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   318
    if (videodata->ime_hwnd_main)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   319
        ImmAssociateContext(videodata->ime_hwnd_main, videodata->ime_himc);
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   320
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   321
    videodata->ime_hwnd_main = 0;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   322
    videodata->ime_himc = 0;
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   323
    if (videodata->ime_himm32)
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   324
    {
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   325
        FreeLibrary(videodata->ime_himm32);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   326
        videodata->ime_himm32 = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   327
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   328
    if (videodata->ime_threadmgr)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   329
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   330
        videodata->ime_threadmgr->lpVtbl->Release(videodata->ime_threadmgr);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   331
        videodata->ime_threadmgr = 0;
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   332
    }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   333
    if (videodata->ime_com_initialized)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   334
    {
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   335
        CoUninitialize();
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   336
        videodata->ime_com_initialized = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   337
    }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   338
    videodata->ime_initialized = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   339
}
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   340
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   341
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   342
IME_GetReadingString(SDL_VideoData *videodata, HWND hwnd)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   343
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   344
    DWORD id = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   345
    HIMC himc = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   346
    WCHAR buffer[16];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   347
    WCHAR *s = buffer;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   348
    DWORD len = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   349
    DWORD err = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   350
    BOOL vertical = FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   351
    UINT maxuilen = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   352
    static OSVERSIONINFOA osversion = {0};
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   353
    if (videodata->ime_uiless)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   354
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   355
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   356
    videodata->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   357
    if (!osversion.dwOSVersionInfoSize)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   358
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   359
        osversion.dwOSVersionInfoSize = sizeof(osversion);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   360
        GetVersionExA(&osversion);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   361
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   362
    id = IME_GetId(videodata, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   363
    if (!id)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   364
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   365
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   366
    himc = ImmGetContext(hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   367
    if (!himc)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   368
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   369
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   370
    if (videodata->GetReadingString)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   371
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   372
        len = videodata->GetReadingString(himc, 0, 0, &err, &vertical, &maxuilen);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   373
        if (len)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   374
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   375
            if (len > SDL_arraysize(buffer))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   376
                len = SDL_arraysize(buffer);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   377
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   378
            len = videodata->GetReadingString(himc, len, s, &err, &vertical, &maxuilen);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   379
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   380
        SDL_wcslcpy(videodata->ime_readingstring, s, len);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   381
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   382
    else
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   383
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   384
        LPINPUTCONTEXT2 lpimc = videodata->ImmLockIMC(himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   385
        LPBYTE p = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   386
        s = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   387
        switch (id)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   388
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   389
        case IMEID_CHT_VER42:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   390
        case IMEID_CHT_VER43:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   391
        case IMEID_CHT_VER44:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   392
            p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 24);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   393
            if (!p)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   394
                break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   395
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   396
            len = *(DWORD *)(p + 7*4 + 32*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   397
            s = (WCHAR *)(p + 56);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   398
            break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   399
        case IMEID_CHT_VER51:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   400
        case IMEID_CHT_VER52:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   401
        case IMEID_CHS_VER53:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   402
            p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   403
            if (!p)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   404
                break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   405
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   406
            p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   407
            if (!p)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   408
                break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   409
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   410
            len = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16*2);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   411
            s = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   412
            break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   413
        case IMEID_CHS_VER41:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   414
            {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   415
                int offset = (IME_GetId(videodata, 1) >= 0x00000002) ? 8 : 7;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   416
                p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + offset * 4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   417
                if (!p)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   418
                    break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   419
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   420
                len = *(DWORD *)(p + 7*4 + 16*2*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   421
                s = (WCHAR *)(p + 6*4 + 16*2*1);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   422
            }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   423
            break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   424
        case IMEID_CHS_VER42:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   425
            if (osversion.dwPlatformId != VER_PLATFORM_WIN32_NT)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   426
                break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   427
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   428
            p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 1*4 + 1*4 + 6*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   429
            if (!p)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   430
                break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   431
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   432
            len = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16*2);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   433
            s = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   434
            break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   435
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   436
        if (s)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   437
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   438
            SDL_wcslcpy(videodata->ime_readingstring, s, len + 1);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   439
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   440
        videodata->ImmUnlockIMCC(lpimc->hPrivate);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   441
        videodata->ImmUnlockIMC(himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   442
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   443
    ImmReleaseContext(hwnd, himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   444
    IME_SendEditingEvent(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   445
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   446
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   447
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   448
IME_InputLangChanged(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   449
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   450
    UINT uLang = PRIMLANG();
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   451
    HWND hwndime = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   452
    IME_UpdateInputLocale(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   453
    IME_SetupAPI(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   454
    if (uLang != PRIMLANG())
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   455
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   456
        IME_ClearComposition(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   457
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   458
    hwndime = ImmGetDefaultIMEWnd(videodata->ime_hwnd_current);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   459
    if (hwndime)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   460
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   461
        SendMessageA(hwndime, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   462
        SendMessageA(hwndime, WM_IME_CONTROL, IMC_CLOSESTATUSWINDOW, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   463
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   464
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   465
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   466
static DWORD
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   467
IME_GetId(SDL_VideoData *videodata, UINT uIndex)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   468
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   469
    static HKL hklprev = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   470
    static DWORD dwRet[2] = {0};
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   471
    DWORD dwVerSize = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   472
    DWORD dwVerHandle = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   473
    LPVOID lpVerBuffer = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   474
    LPVOID lpVerData = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   475
    UINT cbVerData = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   476
    char szTemp[256];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   477
    HKL hkl = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   478
    DWORD dwLang = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   479
    if (uIndex >= sizeof(dwRet) / sizeof(dwRet[0]))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   480
        return 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   481
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   482
    hkl = videodata->ime_hkl;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   483
    if (hklprev == hkl)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   484
        return dwRet[uIndex];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   485
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   486
    hklprev = hkl;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   487
    dwLang = ((DWORD)hkl & 0xffff);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   488
    if (videodata->ime_uiless && LANG() == LANG_CHT)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   489
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   490
        dwRet[0] = IMEID_CHT_VER_VISTA;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   491
        dwRet[1] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   492
        return dwRet[0];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   493
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   494
    if (hkl != CHT_HKL_NEW_PHONETIC
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   495
        && hkl != CHT_HKL_NEW_CHANG_JIE
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   496
        && hkl != CHT_HKL_NEW_QUICK
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   497
        && hkl != CHT_HKL_HK_CANTONESE
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   498
        && hkl != CHS_HKL)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   499
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   500
        dwRet[0] = dwRet[1] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   501
        return dwRet[uIndex];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   502
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   503
    if (ImmGetIMEFileNameA(hkl, szTemp, sizeof(szTemp) - 1) <= 0)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   504
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   505
        dwRet[0] = dwRet[1] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   506
        return dwRet[uIndex];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   507
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   508
    if (!videodata->GetReadingString)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   509
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   510
        #define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   511
        if (CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME1, -1) != 2
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   512
            && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME2, -1) != 2
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   513
            && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHT_IMEFILENAME3, -1) != 2
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   514
            && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHS_IMEFILENAME1, -1) != 2
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   515
            && CompareStringA(LCID_INVARIANT, NORM_IGNORECASE, szTemp, -1, CHS_IMEFILENAME2, -1) != 2
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   516
            )
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   517
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   518
            dwRet[0] = dwRet[1] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   519
            return dwRet[uIndex];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   520
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   521
        #undef LCID_INVARIANT
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   522
        dwVerSize = GetFileVersionInfoSizeA(szTemp, &dwVerHandle);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   523
        if (dwVerSize)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   524
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   525
            lpVerBuffer = SDL_malloc(dwVerSize);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   526
            if (lpVerBuffer)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   527
            {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   528
                if (GetFileVersionInfoA(szTemp, dwVerHandle, dwVerSize, lpVerBuffer))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   529
                {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   530
                    if (VerQueryValueA(lpVerBuffer, "\\", &lpVerData, &cbVerData))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   531
                    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   532
                        #define pVerFixedInfo   ((VS_FIXEDFILEINFO FAR*)lpVerData)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   533
                        DWORD dwVer = pVerFixedInfo->dwFileVersionMS;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   534
                        dwVer = (dwVer & 0x00ff0000) << 8 | (dwVer & 0x000000ff) << 16;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   535
                        if (videodata->GetReadingString ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   536
                            dwLang == LANG_CHT && (
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   537
                            dwVer == MAKEIMEVERSION(4, 2) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   538
                            dwVer == MAKEIMEVERSION(4, 3) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   539
                            dwVer == MAKEIMEVERSION(4, 4) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   540
                            dwVer == MAKEIMEVERSION(5, 0) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   541
                            dwVer == MAKEIMEVERSION(5, 1) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   542
                            dwVer == MAKEIMEVERSION(5, 2) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   543
                            dwVer == MAKEIMEVERSION(6, 0))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   544
                            ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   545
                            dwLang == LANG_CHS && (
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   546
                            dwVer == MAKEIMEVERSION(4, 1) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   547
                            dwVer == MAKEIMEVERSION(4, 2) ||
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   548
                            dwVer == MAKEIMEVERSION(5, 3))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   549
                            )
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   550
                        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   551
                            dwRet[0] = dwVer | dwLang;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   552
                            dwRet[1] = pVerFixedInfo->dwFileVersionLS;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   553
                            SDL_free(lpVerBuffer);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   554
                            return dwRet[0];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   555
                        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   556
                        #undef pVerFixedInfo
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   557
                    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   558
                }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   559
            }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   560
            SDL_free(lpVerBuffer);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   561
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   562
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   563
    dwRet[0] = dwRet[1] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   564
    return dwRet[uIndex];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   565
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   566
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   567
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   568
IME_SetupAPI(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   569
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   570
    char ime_file[MAX_PATH + 1];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   571
    HMODULE hime = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   572
    HKL hkl = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   573
    videodata->GetReadingString = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   574
    videodata->ShowReadingWindow = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   575
    if (videodata->ime_uiless)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   576
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   577
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   578
    hkl = videodata->ime_hkl;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   579
    if (ImmGetIMEFileNameA(hkl, ime_file, sizeof(ime_file) - 1) <= 0)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   580
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   581
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   582
    hime = LoadLibraryA(ime_file);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   583
    if (!hime)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   584
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   585
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   586
    videodata->GetReadingString = (UINT (WINAPI *)(HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   587
        GetProcAddress(hime, "GetReadingString");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   588
    videodata->ShowReadingWindow = (BOOL (WINAPI *)(HIMC, BOOL))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   589
        GetProcAddress(hime, "ShowReadingWindow");
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   590
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   591
    if (videodata->ShowReadingWindow)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   592
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   593
        HIMC himc = ImmGetContext(videodata->ime_hwnd_current);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   594
        if (himc)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   595
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   596
            videodata->ShowReadingWindow(himc, FALSE);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   597
            ImmReleaseContext(videodata->ime_hwnd_current, himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   598
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   599
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   600
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   601
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   602
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   603
IME_SetWindow(SDL_VideoData* videodata, HWND hwnd)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   604
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   605
    videodata->ime_hwnd_current = hwnd;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   606
    if (videodata->ime_threadmgr) {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   607
        struct ITfDocumentMgr *document_mgr = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   608
        if (SUCCEEDED(videodata->ime_threadmgr->lpVtbl->AssociateFocus(videodata->ime_threadmgr, hwnd, NULL, &document_mgr))) {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   609
            if (document_mgr)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   610
                document_mgr->lpVtbl->Release(document_mgr);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   611
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   612
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   613
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   614
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   615
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   616
IME_UpdateInputLocale(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   617
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   618
    static HKL hklPrevious = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   619
    videodata->ime_hkl = GetKeyboardLayout(0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   620
    if (hklPrevious == videodata->ime_hkl)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   621
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   622
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   623
    hklPrevious = videodata->ime_hkl;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   624
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   625
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   626
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   627
IME_ClearComposition(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   628
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   629
    HIMC himc = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   630
    if (!videodata->ime_initialized)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   631
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   632
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   633
    himc = ImmGetContext(videodata->ime_hwnd_current);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   634
    if (!himc)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   635
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   636
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   637
    ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   638
    if (videodata->ime_uiless)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   639
        ImmSetCompositionString(himc, SCS_SETSTR, TEXT(""), sizeof(TCHAR), TEXT(""), sizeof(TCHAR));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   640
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   641
    ImmNotifyIME(himc, NI_CLOSECANDIDATE, 0, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   642
    ImmReleaseContext(videodata->ime_hwnd_current, himc);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   643
    SDL_SendEditingText("", 0, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   644
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   645
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   646
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   647
IME_ClearEditing(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   648
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   649
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   650
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   651
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   652
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   653
IME_GetCompositionString(SDL_VideoData *videodata, HIMC himc, DWORD string)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   654
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   655
    LONG Length = ImmGetCompositionStringW(himc, string, videodata->ime_composition, sizeof(videodata->ime_composition));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   656
    if (Length < 0)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   657
        Length = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   658
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   659
    Length /= sizeof(videodata->ime_composition[0]);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   660
    videodata->ime_cursor = LOWORD(ImmGetCompositionStringW(himc, GCS_CURSORPOS, 0, 0));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   661
    if (videodata->ime_composition[videodata->ime_cursor] == 0x3000)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   662
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   663
        int i;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   664
        for (i = videodata->ime_cursor + 1; i < Length; ++i)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   665
            videodata->ime_composition[i - 1] = videodata->ime_composition[i];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   666
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   667
        --Length;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   668
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   669
    videodata->ime_composition[Length] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   670
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   671
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   672
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   673
IME_SendInputEvent(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   674
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   675
    char *s = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   676
    s = WIN_StringToUTF8(videodata->ime_composition);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   677
    SDL_SendKeyboardText(s);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   678
    SDL_free(s);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   679
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   680
    videodata->ime_composition[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   681
    videodata->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   682
    videodata->ime_cursor = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   683
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   684
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   685
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   686
IME_SendEditingEvent(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   687
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   688
    char *s = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   689
    WCHAR wBuffer[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   690
    wBuffer[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   691
    if (videodata->ime_readingstring[0])
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   692
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   693
        size_t len = SDL_min(SDL_wcslen(videodata->ime_composition), (size_t)videodata->ime_cursor);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   694
        SDL_wcslcpy(wBuffer, videodata->ime_composition, len + 1);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   695
        SDL_wcslcat(wBuffer, videodata->ime_readingstring, sizeof(wBuffer));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   696
        SDL_wcslcat(wBuffer, &videodata->ime_composition[len], sizeof(wBuffer) - len);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   697
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   698
    else
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   699
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   700
        SDL_wcslcpy(wBuffer, videodata->ime_composition, sizeof(videodata->ime_composition));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   701
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   702
    s = WIN_StringToUTF8(wBuffer);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   703
    SDL_SendEditingText(s, videodata->ime_cursor + SDL_wcslen(videodata->ime_readingstring), 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   704
    SDL_free(s);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   705
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   706
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   707
SDL_bool
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   708
IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, SDL_VideoData *videodata)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   709
{
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   710
    SDL_bool trap = SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   711
    HIMC himc = 0;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   712
    if (!videodata->ime_initialized || !videodata->ime_available || !videodata->ime_enabled)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   713
        return SDL_FALSE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   714
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   715
    switch (msg)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   716
    {
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   717
    case WM_INPUTLANGCHANGE:
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   718
        //IME_InputLangChanged(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   719
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   720
    case WM_IME_SETCONTEXT:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   721
        *lParam = 0;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   722
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   723
    case WM_IME_STARTCOMPOSITION:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   724
        trap = SDL_TRUE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   725
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   726
    case WM_IME_COMPOSITION:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   727
        trap = SDL_TRUE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   728
        himc = ImmGetContext(hwnd);
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   729
        if (*lParam & GCS_RESULTSTR)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   730
        {
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   731
            IME_GetCompositionString(videodata, himc, GCS_RESULTSTR);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   732
            IME_SendInputEvent(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   733
        }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   734
        if (*lParam & GCS_COMPSTR)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   735
        {
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   736
            if (!videodata->ime_uiless)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   737
                videodata->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   738
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   739
            IME_GetCompositionString(videodata, himc, GCS_COMPSTR);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   740
            IME_SendEditingEvent(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   741
        }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   742
        ImmReleaseContext(hwnd, himc);
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   743
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   744
    case WM_IME_ENDCOMPOSITION:
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   745
        videodata->ime_composition[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   746
        videodata->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   747
        videodata->ime_cursor = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   748
        SDL_SendEditingText("", 0, 0);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   749
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   750
    case WM_IME_NOTIFY:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   751
        switch (wParam)
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   752
        {
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   753
        case IMN_SETCONVERSIONMODE:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   754
        case IMN_SETOPENSTATUS:
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   755
            IME_UpdateInputLocale(videodata);
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   756
            break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   757
        case IMN_OPENCANDIDATE:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   758
        case IMN_CHANGECANDIDATE:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   759
            trap = SDL_TRUE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   760
            break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   761
        case IMN_CLOSECANDIDATE:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   762
            trap = SDL_TRUE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   763
            break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   764
        case IMN_PRIVATE:
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   765
            {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   766
                DWORD dwId = IME_GetId(videodata, 0);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   767
                IME_GetReadingString(videodata, hwnd);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   768
                switch (dwId)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   769
                {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   770
                case IMEID_CHT_VER42:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   771
                case IMEID_CHT_VER43:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   772
                case IMEID_CHT_VER44:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   773
                case IMEID_CHS_VER41:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   774
                case IMEID_CHS_VER42:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   775
                    if (*lParam == 1 || *lParam == 2)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   776
                        trap = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   777
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   778
                    break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   779
                case IMEID_CHT_VER50:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   780
                case IMEID_CHT_VER51:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   781
                case IMEID_CHT_VER52:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   782
                case IMEID_CHT_VER60:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   783
                case IMEID_CHS_VER53:
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   784
                    if (*lParam == 16
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   785
                        || *lParam == 17
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   786
                        || *lParam == 26
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   787
                        || *lParam == 27
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   788
                        || *lParam == 28)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   789
                        trap = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   790
                    break;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   791
                }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   792
            }
4752
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   793
            break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   794
        default:
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   795
            trap = SDL_TRUE;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   796
            break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   797
        }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   798
        break;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   799
    }
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   800
    return trap;
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   801
}
dc7bdcf06367 Initial IMM implementation.
dewyatt
parents: 4751
diff changeset
   802
4759
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   803
STDMETHODIMP_(ULONG) TSFSink_AddRef(TSFSink *sink)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   804
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   805
    return ++sink->refcount;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   806
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   807
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   808
STDMETHODIMP_(ULONG)TSFSink_Release(TSFSink *sink)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   809
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   810
    --sink->refcount;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   811
    if (sink->refcount == 0)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   812
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   813
        SDL_free(sink);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   814
        return 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   815
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   816
    return sink->refcount;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   817
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   818
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   819
STDMETHODIMP UIElementSink_QueryInterface(TSFSink *sink, REFIID riid, PVOID *ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   820
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   821
    if (!ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   822
        return E_INVALIDARG;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   823
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   824
    *ppv = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   825
    if (SDL_IsEqualIID(riid, &IID_IUnknown))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   826
        *ppv = (IUnknown *)sink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   827
    else if (SDL_IsEqualIID(riid, &IID_ITfUIElementSink))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   828
        *ppv = (ITfUIElementSink *)sink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   829
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   830
    if (*ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   831
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   832
        TSFSink_AddRef(sink);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   833
        return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   834
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   835
    return E_NOINTERFACE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   836
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   837
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   838
ITfUIElement *UILess_GetUIElement(SDL_VideoData *videodata, DWORD dwUIElementId)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   839
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   840
    ITfUIElementMgr *puiem = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   841
    ITfUIElement *pelem = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   842
    ITfThreadMgrEx *threadmgrex = videodata->ime_threadmgrex;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   843
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   844
    if (SUCCEEDED(threadmgrex->lpVtbl->QueryInterface(threadmgrex, &IID_ITfUIElementMgr, (LPVOID *)&puiem)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   845
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   846
        puiem->lpVtbl->GetUIElement(puiem, dwUIElementId, &pelem);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   847
        puiem->lpVtbl->Release(puiem);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   848
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   849
    return pelem;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   850
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   851
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   852
STDMETHODIMP UIElementSink_BeginUIElement(TSFSink *sink, DWORD dwUIElementId, BOOL *pbShow)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   853
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   854
    ITfUIElement *pElement = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   855
    ITfReadingInformationUIElement *preading = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   856
    ITfCandidateListUIElement *pcandidates = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   857
    SDL_VideoData *videodata = (SDL_VideoData *)sink->data;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   858
    if (!pElement)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   859
        return E_INVALIDARG;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   860
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   861
    *pbShow = FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   862
    if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   863
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   864
        BSTR bstr;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   865
        if (SUCCEEDED(preading->lpVtbl->GetString(preading, &bstr)) && bstr)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   866
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   867
            WCHAR *s = (WCHAR *)bstr;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   868
            SysFreeString(bstr);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   869
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   870
        preading->lpVtbl->Release(preading);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   871
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   872
    else if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfCandidateListUIElement, (PVOID *)&pcandidates)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   873
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   874
        pcandidates->lpVtbl->Release(pcandidates);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   875
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   876
    return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   877
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   878
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   879
STDMETHODIMP UIElementSink_UpdateUIElement(TSFSink *sink, DWORD dwUIElementId)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   880
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   881
    ITfUIElement *pElement = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   882
    ITfReadingInformationUIElement *preading = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   883
    ITfCandidateListUIElement *pcandidates = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   884
    SDL_VideoData *videodata = (SDL_VideoData *)sink->data;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   885
    if (!pElement)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   886
        return E_INVALIDARG;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   887
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   888
    if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   889
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   890
        BSTR bstr;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   891
        if (SUCCEEDED(preading->lpVtbl->GetString(preading, &bstr)) && bstr)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   892
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   893
            WCHAR *s = (WCHAR *)bstr;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   894
            SDL_wcslcpy(videodata->ime_readingstring, s, sizeof(videodata->ime_readingstring));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   895
            IME_SendEditingEvent(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   896
            SysFreeString(bstr);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   897
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   898
        preading->lpVtbl->Release(preading);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   899
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   900
    else if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfCandidateListUIElement, (PVOID *)&pcandidates)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   901
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   902
        pcandidates->lpVtbl->Release(pcandidates);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   903
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   904
    return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   905
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   906
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   907
STDMETHODIMP UIElementSink_EndUIElement(TSFSink *sink, DWORD dwUIElementId)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   908
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   909
    ITfUIElement *pElement = UILess_GetUIElement((SDL_VideoData *)sink->data, dwUIElementId);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   910
    ITfReadingInformationUIElement *preading = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   911
    ITfCandidateListUIElement *pcandidates = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   912
    SDL_VideoData *videodata = (SDL_VideoData *)sink->data;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   913
    if (!pElement)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   914
        return E_INVALIDARG;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   915
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   916
    if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfReadingInformationUIElement, (LPVOID *)&preading)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   917
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   918
        videodata->ime_readingstring[0] = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   919
        IME_SendEditingEvent(videodata);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   920
        preading->lpVtbl->Release(preading);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   921
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   922
    else if (SUCCEEDED(pElement->lpVtbl->QueryInterface(pElement, &IID_ITfCandidateListUIElement, (PVOID *)&pcandidates)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   923
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   924
        pcandidates->lpVtbl->Release(pcandidates);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   925
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   926
    return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   927
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   928
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   929
STDMETHODIMP IPPASink_QueryInterface(TSFSink *sink, REFIID riid, PVOID *ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   930
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   931
    if (!ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   932
        return E_INVALIDARG;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   933
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   934
    *ppv = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   935
    if (SDL_IsEqualIID(riid, &IID_IUnknown))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   936
        *ppv = (IUnknown *)sink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   937
    else if (SDL_IsEqualIID(riid, &IID_ITfInputProcessorProfileActivationSink))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   938
        *ppv = (ITfInputProcessorProfileActivationSink *)sink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   939
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   940
    if (*ppv)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   941
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   942
        TSFSink_AddRef(sink);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   943
        return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   944
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   945
    return E_NOINTERFACE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   946
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   947
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   948
STDMETHODIMP IPPASink_OnActivated(TSFSink *sink, DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, REFGUID guidProfile, HKL hkl, DWORD dwFlags)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   949
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   950
    if (SDL_IsEqualIID(catid, &GUID_TFCAT_TIP_KEYBOARD) && (dwFlags & TF_IPSINK_FLAG_ACTIVE))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   951
        IME_InputLangChanged((SDL_VideoData *)sink->data);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   952
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   953
    return S_OK;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   954
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   955
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   956
static void *vtUIElementSink[] = {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   957
    (void *)(UIElementSink_QueryInterface),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   958
    (void *)(TSFSink_AddRef),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   959
    (void *)(TSFSink_Release),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   960
    (void *)(UIElementSink_BeginUIElement),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   961
    (void *)(UIElementSink_UpdateUIElement),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   962
    (void *)(UIElementSink_EndUIElement)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   963
};
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   964
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   965
static void *vtIPPASink[] = {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   966
    (void *)(IPPASink_QueryInterface),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   967
    (void *)(TSFSink_AddRef),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   968
    (void *)(TSFSink_Release),
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   969
    (void *)(IPPASink_OnActivated)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   970
};
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   971
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   972
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   973
UILess_EnableUIUpdates(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   974
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   975
    ITfSource *source = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   976
    if (!videodata->ime_threadmgrex || videodata->ime_uielemsinkcookie != TF_INVALID_COOKIE)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   977
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   978
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   979
    if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   980
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   981
        source->lpVtbl->AdviseSink(source, &IID_ITfUIElementSink, (IUnknown *)videodata->ime_uielemsink, &videodata->ime_uielemsinkcookie);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   982
        source->lpVtbl->Release(source);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   983
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   984
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   985
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   986
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   987
UILess_DisableUIUpdates(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   988
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   989
    ITfSource *source = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   990
    if (!videodata->ime_threadmgrex || videodata->ime_uielemsinkcookie == TF_INVALID_COOKIE)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   991
        return;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   992
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   993
    if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   994
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   995
        source->lpVtbl->UnadviseSink(source, videodata->ime_uielemsinkcookie);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   996
        videodata->ime_uielemsinkcookie = TF_INVALID_COOKIE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   997
        source->lpVtbl->Release(source);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   998
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
   999
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1000
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1001
static SDL_bool
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1002
UILess_SetupSinks(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1003
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1004
    TfClientId clientid = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1005
    SDL_bool result = SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1006
    ITfSource *source = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1007
    if (FAILED(CoCreateInstance(&CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, &IID_ITfThreadMgrEx, &videodata->ime_threadmgrex)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1008
        return SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1009
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1010
    if (FAILED(videodata->ime_threadmgrex->lpVtbl->ActivateEx(videodata->ime_threadmgrex, &clientid, TF_TMAE_UIELEMENTENABLEDONLY)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1011
        return SDL_FALSE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1012
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1013
    videodata->ime_uielemsink = SDL_malloc(sizeof(TSFSink));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1014
    videodata->ime_ippasink = SDL_malloc(sizeof(TSFSink));
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1015
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1016
    videodata->ime_uielemsink->lpVtbl = vtUIElementSink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1017
    videodata->ime_uielemsink->refcount = 1;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1018
    videodata->ime_uielemsink->data = videodata;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1019
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1020
    videodata->ime_ippasink->lpVtbl = vtIPPASink;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1021
    videodata->ime_ippasink->refcount = 1;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1022
    videodata->ime_ippasink->data = videodata;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1023
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1024
    if (SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, (LPVOID *)&source)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1025
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1026
        if (SUCCEEDED(source->lpVtbl->AdviseSink(source, &IID_ITfUIElementSink, (IUnknown *)videodata->ime_uielemsink, &videodata->ime_uielemsinkcookie)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1027
        {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1028
            if (SUCCEEDED(source->lpVtbl->AdviseSink(source, &IID_ITfInputProcessorProfileActivationSink, (IUnknown *)videodata->ime_ippasink, &videodata->ime_alpnsinkcookie)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1029
            {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1030
                result = SDL_TRUE;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1031
            }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1032
        }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1033
        source->lpVtbl->Release(source);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1034
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1035
    return result;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1036
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1037
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1038
#define SAFE_RELEASE(p)                             \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1039
{                                                   \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1040
    if (p) {                                        \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1041
        (p)->lpVtbl->Release((p));                  \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1042
        (p) = 0;                                    \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1043
    }                                               \
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1044
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1045
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1046
static void
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1047
UILess_ReleaseSinks(SDL_VideoData *videodata)
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1048
{
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1049
    ITfSource *Source = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1050
    if (videodata->ime_threadmgrex && SUCCEEDED(videodata->ime_threadmgrex->lpVtbl->QueryInterface(videodata->ime_threadmgrex, &IID_ITfSource, &Source)))
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1051
    {
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1052
        Source->lpVtbl->UnadviseSink(Source, videodata->ime_uielemsinkcookie);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1053
        Source->lpVtbl->UnadviseSink(Source, videodata->ime_alpnsinkcookie);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1054
        SAFE_RELEASE(Source);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1055
        videodata->ime_threadmgrex->lpVtbl->Deactivate(videodata->ime_threadmgrex);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1056
        SAFE_RELEASE(videodata->ime_threadmgrex);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1057
        TSFSink_Release(videodata->ime_uielemsink);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1058
        videodata->ime_uielemsink = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1059
        TSFSink_Release(videodata->ime_ippasink);
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1060
        videodata->ime_ippasink = 0;
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1061
    }
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1062
}
863ba7d1f029 Large commit with initial reading string support, TSF UILess code, etc.
dewyatt
parents: 4753
diff changeset
  1063
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1064
/* vi: set ts=4 sw=4 expandtab: */