Changeset 21308 for trunk/src/user32


Ignore:
Timestamp:
Jun 18, 2009, 6:27:45 PM (16 years ago)
Author:
ydario
Message:

Minor updates, backout imm changes.

Location:
trunk/src/user32
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/Makefile

    r21303 r21308  
    130130$(ODIN32_LIB)/libuls.lib \
    131131$(ODIN32_LIB)/$(ODINCRT).lib \
     132$(ODIN32_LIB)/imm32os2.lib \
    132133OS2386.LIB \
    133134$(RTLLIB_O)
  • trunk/src/user32/USER32.DEF

    r21303 r21308  
    750750    _clipboardPMToOdinFormat@4                                   @2043 NONAME
    751751    _clipboardOdinToPMFormat@4                                   @2044 NONAME
     752
     753    _GetOS2Icon@4                                                @2045 NONAME
  • trunk/src/user32/edit.c

    r21303 r21308  
    3131#include "ctrlconf.h"
    3232#include <heapstring.h>
     33#include <imm.h>
    3334#endif
    3435
     
    128129    HLOCAL hloc32A;     /* alias for ANSI control receiving EM_GETHANDLE
    129130                   or EM_SETHANDLE */
     131#ifdef __WIN32OS2__
     132    LPWSTR  compStr;
     133    INT     compStrLen;
     134    BOOL    moveCaret;
     135    DWORD   sentenceMode;
     136#endif
    130137} EDITSTATE;
    131138
     
    11131120            // always DBCS char
    11141121            CHAR charA[ 2 ];
    1115 
     1122            INT  lenA = 1;
     1123
     1124            if( IsDBCSLeadByte(( CHAR )( wParam >> 8 )))
     1125            {
    11161126                charA[ 0 ] = ( CHAR )( wParam >> 8 );
    11171127                charA[ 1 ] = ( CHAR )wParam;
    1118 
    1119             MultiByteToWideChar( CP_ACP, 0, ( LPSTR )charA, 2, ( LPWSTR )&charW, 1);
     1128                lenA = 2;
     1129            }
     1130            else
     1131                charA[ 0 ] = ( CHAR )wParam;
     1132
     1133            MultiByteToWideChar( CP_ACP, 0, ( LPSTR )charA, lenA, ( LPWSTR )&charW, 1);
    11201134        }
    11211135
     
    11231137        break;
    11241138    }
     1139
     1140    case WM_IME_COMPOSITION:
     1141    {
     1142        HIMC    himc;
     1143        LONG    bufSize;
     1144        INT     i;
     1145        BOOL    passToDefWnd = FALSE;
     1146#ifdef DEBUG
     1147        LPSTR   strA;
     1148        INT     lenA;
     1149#endif
     1150
     1151        DPRINTF_EDIT_MSG32("WM_IME_COMPOSITION");
     1152
     1153        himc = ImmGetContext( hwnd );
     1154
     1155        if( es->sentenceMode )
     1156            passToDefWnd = TRUE;
     1157        else if( lParam & GCS_RESULTSTR )
     1158        {
     1159            LPWSTR  resultStr = NULL;
     1160            INT     resultStrLen = 0;
     1161
     1162            dprintf(("WM_IME_COMPOSITION : GCS_RESULTSTR"));
     1163
     1164            bufSize = ImmGetCompositionStringW( himc, GCS_RESULTSTR, NULL, 0 );
     1165            if( bufSize > 0 )
     1166            {
     1167                INT i;
     1168
     1169                resultStrLen = bufSize / sizeof( WCHAR );
     1170                resultStr = malloc( bufSize + sizeof( WCHAR ));
     1171                resultStr[ resultStrLen ] = 0;
     1172
     1173                ImmGetCompositionStringW( himc, GCS_RESULTSTR, resultStr, bufSize );
     1174
     1175#ifdef DEBUG
     1176                lenA = WideCharToMultiByte( CP_ACP, 0, resultStr, resultStrLen, 0, 0, 0, 0 );
     1177                strA = malloc( lenA + 1 );
     1178                WideCharToMultiByte( CP_ACP, 0, resultStr, resultStrLen, strA, lenA, 0, 0 );
     1179                strA[ lenA ] = 0;
     1180                dprintf(("Result String : '%s'", strA ));
     1181                free( strA );
     1182                dprintf(("Composition Len %d", es->compStrLen ));
     1183#endif
     1184                DestroyCaret();
     1185                if( es->compStrLen > 0 )
     1186                {
     1187                    EDIT_EM_SetSel(hwnd, es, (UINT)-1, 0, FALSE);
     1188                    for( i = 0; i < es->compStrLen; i++ )
     1189                        EDIT_MoveForward(hwnd, es, TRUE);
     1190                    EDIT_WM_Clear(hwnd, es);
     1191                }
     1192
     1193                EDIT_EM_ReplaceSel(hwnd, es, TRUE, resultStr, TRUE);
     1194
     1195                CreateCaret(hwnd, 0, 2, es->line_height);
     1196                EDIT_SetCaretPos(hwnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
     1197                ShowCaret(hwnd);
     1198
     1199                free( resultStr );
     1200
     1201            }
     1202
     1203            if( es->compStr )
     1204                free( es->compStr );
     1205
     1206            es->compStr = NULL;
     1207            es->compStrLen = 0;
     1208        }
     1209        else if( lParam & GCS_COMPSTR )
     1210        {
     1211            INT prevLen = es->compStrLen;
     1212
     1213            dprintf(("WM_IME_COMPOSITION : GCS_COMPSTR"));
     1214
     1215            if( es->compStr )
     1216                free( es->compStr );
     1217
     1218            es->compStr = NULL;
     1219            es->compStrLen = 0;
     1220
     1221            bufSize = ImmGetCompositionStringW( himc, GCS_COMPSTR, NULL, 0 );
     1222            if( bufSize > 0 )
     1223            {
     1224                HDC     hdc;
     1225                SIZE    size;
     1226                BOOL    oldMoveCaret;
     1227
     1228                es->compStrLen = bufSize / sizeof( WCHAR );
     1229                es->compStr = malloc( bufSize + sizeof( WCHAR ));
     1230                es->compStr[ es->compStrLen ] = 0;
     1231
     1232                ImmGetCompositionStringW( himc, GCS_COMPSTR, es->compStr, bufSize );
     1233
     1234#ifdef DEBUG
     1235                lenA = WideCharToMultiByte( CP_ACP, 0, es->compStr, es->compStrLen, 0, 0, 0, 0 );
     1236                strA = malloc( lenA + 1 );
     1237                WideCharToMultiByte( CP_ACP, 0, es->compStr, es->compStrLen, strA, lenA, 0, 0  );
     1238                strA[ lenA ] = 0;
     1239                dprintf(("Composition String : '%s'", strA ));
     1240                free( strA );
     1241#endif
     1242                hdc = GetDC( hwnd );
     1243                GetTextExtentPoint32W( hdc, es->compStr, es->compStrLen, &size);
     1244                ReleaseDC( hwnd, hdc );
     1245
     1246                oldMoveCaret = es->moveCaret;
     1247
     1248                es->moveCaret = FALSE; // to prevent cursor from flashing too many
     1249
     1250                if( prevLen > 0 )
     1251                {
     1252                    EDIT_EM_SetSel(hwnd, es, (UINT)-1, 0, FALSE);
     1253                    for( i = 0; i < prevLen; i++ )
     1254                        EDIT_MoveForward(hwnd, es, TRUE);
     1255                    EDIT_WM_Clear(hwnd, es);
     1256                }
     1257
     1258                EDIT_EM_ReplaceSel(hwnd, es, TRUE, es->compStr, TRUE);
     1259
     1260                for( i = 0; i < es->compStrLen; i++ )
     1261                    EDIT_MoveBackward(hwnd, es, FALSE);
     1262
     1263                es->moveCaret = oldMoveCaret;
     1264
     1265                CreateCaret(hwnd, 0, size.cx, es->line_height);
     1266                EDIT_SetCaretPos(hwnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
     1267                ShowCaret(hwnd);
     1268            }
     1269        }
     1270        else
     1271            passToDefWnd = TRUE;
     1272
     1273        ImmReleaseContext( hwnd, himc );
     1274
     1275        if( passToDefWnd )
     1276        {
     1277            if( unicode )
     1278                result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1279            else
     1280                result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1281        }
     1282        break;
     1283    }
     1284
     1285    case WM_IME_COMPOSITIONFULL:
     1286        DPRINTF_EDIT_MSG32("WM_IME_COMPOSITIONFULL");
     1287        if( unicode )
     1288            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1289        else
     1290            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1291        break;
     1292
     1293    case WM_IME_CONTROL:
     1294        DPRINTF_EDIT_MSG32("WM_IME_CONTROL");
     1295        if( unicode )
     1296            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1297        else
     1298            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1299        break;
     1300
     1301    case WM_IME_ENDCOMPOSITION:
     1302        DPRINTF_EDIT_MSG32("WM_IME_ENDCOMPOSITION");
     1303
     1304        if( es->compStr )
     1305        {
     1306            INT i;
     1307
     1308            DestroyCaret();
     1309
     1310            EDIT_EM_SetSel(hwnd, es, (UINT)-1, 0, FALSE);
     1311            for( i = 0; i < es->compStrLen; i++ )
     1312                EDIT_MoveForward(hwnd, es, TRUE);
     1313            EDIT_WM_Clear(hwnd, es);
     1314
     1315            CreateCaret(hwnd, 0, 2, es->line_height);
     1316            EDIT_SetCaretPos(hwnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
     1317            ShowCaret(hwnd);
     1318
     1319            free( es->compStr );
     1320        }
     1321
     1322        es->compStr = NULL;
     1323        es->compStrLen = 0;
     1324
     1325        if( unicode )
     1326            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1327        else
     1328            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1329        break;
     1330
     1331    case WM_IME_NOTIFY:
     1332        DPRINTF_EDIT_MSG32("WM_IME_NOTIFY");
     1333
     1334        if( wParam == IMN_SETSENTENCEMODE )
     1335        {
     1336            HIMC  himc;
     1337            DWORD conversionMode;
     1338
     1339            himc = ImmGetContext( hwnd );
     1340
     1341            ImmGetConversionStatus( himc, &conversionMode, &es->sentenceMode );
     1342
     1343            ImmReleaseContext( hwnd, himc );
     1344        }
     1345
     1346        if( unicode )
     1347            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1348        else
     1349            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1350        break;
     1351
     1352    case WM_IME_REQUEST:
     1353        DPRINTF_EDIT_MSG32("WM_IME_REQUEST");
     1354        if( unicode )
     1355            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1356        else
     1357            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1358        break;
     1359
     1360    case WM_IME_SELECT:
     1361        DPRINTF_EDIT_MSG32("WM_IME_SELECT");
     1362        if( unicode )
     1363            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1364        else
     1365            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1366        break;
     1367
     1368    case WM_IME_SETCONTEXT:
     1369        DPRINTF_EDIT_MSG32("WM_IME_SETCONTEXT");
     1370
     1371        dprintf(("ImmGetProperty %08lx", ImmGetProperty( 0, IGP_CONVERSION )));
     1372
     1373        if( unicode )
     1374            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1375        else
     1376            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1377        break;
     1378
     1379    case WM_IME_STARTCOMPOSITION:
     1380        DPRINTF_EDIT_MSG32("WM_IME_STARTCOMPOSITION");
     1381
     1382        es->compStr = NULL;
     1383        es->compStrLen = 0;
     1384
     1385        if( unicode )
     1386            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1387        else
     1388            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1389        break;
     1390
     1391    case EM_GETIMESTATUS:
     1392        DPRINTF_EDIT_MSG32("EM_GETIMESTATUS");
     1393        if( unicode )
     1394            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1395        else
     1396            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1397        break;
     1398
     1399    case EM_SETIMESTATUS:
     1400        DPRINTF_EDIT_MSG32("EM_SETIMESTATUS");
     1401        if( unicode )
     1402            result = DefWindowProcW( hwnd, msg, wParam, lParam );
     1403        else
     1404            result = DefWindowProcA( hwnd, msg, wParam, lParam );
     1405        break;
    11251406#endif
    11261407
     
    24402721{
    24412722    LRESULT res = EDIT_EM_PosFromChar(hwnd, es, pos, after_wrap);
     2723
     2724#ifdef __WIN32OS2__
     2725    if( es->moveCaret )
     2726    {
     2727        HIMC            himc;
     2728        CANDIDATEFORM   candForm;
     2729
     2730        himc = ImmGetContext( hwnd );
     2731
     2732#endif
     2733
    24422734    SetCaretPos(SLOWORD(res), SHIWORD(res));
     2735
     2736#ifdef __WIN32OS2__
     2737        if( es->sentenceMode )
     2738        {
     2739            COMPOSITIONFORM cf;
     2740
     2741            cf.dwStyle = CFS_POINT;
     2742            cf.ptCurrentPos.x = SLOWORD( res );
     2743            cf.ptCurrentPos.y = SHIWORD( res );
     2744
     2745            ImmSetCompositionWindow( himc, &cf );
     2746        }
     2747
     2748        candForm.dwIndex = 0;
     2749        candForm.dwStyle = CFS_CANDIDATEPOS;
     2750        candForm.ptCurrentPos.x = SLOWORD( res );
     2751        candForm.ptCurrentPos.y = SHIWORD( res ) + es->line_height;
     2752
     2753        ImmSetCandidateWindow( himc, &candForm );
     2754
     2755        ImmReleaseContext( hwnd, himc );
     2756    }
     2757#endif
    24432758}
    24442759
     
    47735088    }
    47745089
     5090#ifdef __WIN32OS2__
     5091    es->compStr = NULL;
     5092    es->compStrLen = 0;
     5093    es->moveCaret = TRUE;
     5094    {
     5095        HIMC  himc;
     5096        DWORD conversionMode;
     5097
     5098        himc = ImmGetContext( hwnd );
     5099
     5100        ImmGetConversionStatus( himc, &conversionMode, &es->sentenceMode );
     5101
     5102        ImmReleaseContext( hwnd, himc );
     5103    }
     5104#endif
     5105
    47755106    return TRUE;
    47765107}
     
    49045235    es->font = font;
    49055236    dc = GetDC(hwnd);
     5237#ifdef __WIN32OS2__
     5238    // todo : set font of IME window
     5239#endif
    49065240    if (font)
    49075241        old_font = SelectObject(dc, font);
  • trunk/src/user32/listbox.c

    r21303 r21308  
    30283028            // always DBCS char
    30293029            CHAR charA[ 2 ];
    3030 
     3030            INT  lenA = 1;
     3031
     3032            if( IsDBCSLeadByte(( CHAR )( wParam >> 8 )))
     3033            {
    30313034                charA[ 0 ] = ( CHAR )( wParam >> 8 );
    30323035                charA[ 1 ] = ( CHAR )wParam;
    3033 
    3034             MultiByteToWideChar( CP_ACP, 0, ( LPSTR )charA, 2, ( LPWSTR )&charW, 1);
     3036                lenA = 2;
     3037            }
     3038            else
     3039                charA[ 0 ] = ( CHAR )wParam;
     3040
     3041            MultiByteToWideChar( CP_ACP, 0, ( LPSTR )charA, lenA, ( LPWSTR )&charW, 1);
    30353042        }
    30363043        return LISTBOX_HandleChar( hwnd, descr, charW );
  • trunk/src/user32/oslibmsgtranslate.cpp

    r21303 r21308  
    1515 *
    1616 */
     17#define  INCL_NLS
     18#define  INCL_GPI
    1719#define  INCL_WIN
    1820#define  INCL_PM
     
    4244#include "user32api.h"
    4345
     46#include <os2im.h>
     47#include <im32.h>
    4448
    4549#define DBG_LOCALLOG    DBG_oslibmsgtranslate
     
    4852static BOOL fGenerateDoubleClick = FALSE;
    4953static MSG  doubleClickMsg = {0};
     54
     55extern UINT WINAPI GetACP(void); // from winnls.h
    5056
    5157//For wheel mouse translation
     
    753759        if( scanCode != 0 )
    754760        {
     761            switch( SHORT2FROMMP( os2Msg->mp2 ))
     762            {
     763                // for Korean
     764                case VK_DBE_HANJA :
     765                    bWinVKey = 0x19;
     766                    break;
     767
     768                case VK_DBE_HANGEUL :
     769                    bWinVKey = 0x15;
     770                    break;
     771
     772                case VK_DBE_JAMO :
     773                    bWinVKey = 0;
     774                    break;
     775
     776                // for Japan
     777                case VK_DBE_KATAKANA :
     778                    bWinVKey = 0;
     779                    break;
     780
     781                case VK_DBE_HIRAGANA :
     782                    bWinVKey = 0;
     783                    break;
     784
     785                case VK_DBE_SBCSCHAR :
     786                    bWinVKey = 0;
     787                    break;
     788
     789                case VK_DBE_DBCSCHAR :
     790                    bWinVKey = 0;
     791                    break;
     792
     793                case VK_DBE_SBCSDBCSCHAR :
     794                    bWinVKey = 0;
     795                    break;
     796
     797                case VK_DBE_ROMAN :
     798                    bWinVKey = 0;
     799                    break;
     800
     801                // for PRC-Chinese
     802                case VK_DBE_HANZI :
     803                    bWinVKey = 0;
     804                    break;
     805
     806                // for Taiwan
     807                case VK_DBE_TSANGJYE :
     808                    bWinVKey = 0;
     809                    break;
     810
     811                case VK_DBE_PHONETIC :
     812                    bWinVKey = 0;
     813                    break;
     814
     815                case VK_DBE_CONV :
     816                    bWinVKey = 0;
     817                    break;
     818
     819                case VK_DBE_NOCONV :
     820                    bWinVKey = 0;
     821                    break;
     822
     823                case VK_DBE_ALPHANUMERIC :
     824                    switch( GetACP())
     825                    {
     826                        case 949 :  // Korea
     827                        case 1361 :
     828                            bWinVKey = 0x15;
     829                            break;
     830
     831                        case 932 :  // Japan
     832                        case 942 :
     833                        case 943 :
     834
     835                        case 936 :  // PRC
     836                        case 1381 :
     837
     838                        case 950 :  // Taiwan
     839                        default :
     840                            bWinVKey = 0;
     841                    }
     842                    break;
     843
     844                default :
    755845                    KeyTranslatePMScanToWinVKey(usPMScanCode,
    756846                                                FALSE,
     
    758848                                                &wWinScan,
    759849                                                &fWinExtended);
     850            }
     851
    760852            winMsg->wParam = bWinVKey;
    761853        }
     
    10791171        break;
    10801172
     1173    case WM_IMENOTIFY:
     1174        dprintf(("WM_IMENOTIFY"));
     1175
     1176        winMsg->wParam = 0;
     1177        winMsg->lParam = 0;
     1178
     1179        switch(( ULONG )os2Msg->mp1 )
     1180        {
     1181            case IMN_STARTCONVERSION :
     1182                winMsg->message = WM_IME_STARTCOMPOSITION_W;
     1183                break;
     1184
     1185            case IMN_ENDCONVERSION :
     1186                winMsg->message = WM_IME_ENDCOMPOSITION_W;
     1187                break;
     1188
     1189            case IMN_CONVERSIONFULL :
     1190                winMsg->message = WM_IME_COMPOSITIONFULL_W;
     1191                break;
     1192
     1193            case IMN_IMECHANGED :
     1194                winMsg->message = WM_IME_SELECT_W;
     1195                // todo
     1196                // fall through
     1197
     1198            default :
     1199                goto dummymessage;
     1200
     1201        }
     1202        break;
     1203
     1204    case WM_IMEREQUEST:
     1205        winMsg->wParam = 0;
     1206        winMsg->lParam = 0;
     1207
     1208        switch(( ULONG )os2Msg->mp1 )
     1209        {
     1210            case IMR_INSTANCEACTIVATE :
     1211            {
     1212                USHORT usIMR_IA = LOUSHORT( os2Msg->mp2 );
     1213
     1214                winMsg->message = WM_IME_SETCONTEXT_W;
     1215                winMsg->wParam = HIUSHORT( os2Msg->mp2 );
     1216
     1217                if( usIMR_IA & IMR_IA_STATUS )
     1218                    winMsg->lParam |= ISC_SHOWUIGUIDELINE_W;
     1219
     1220                if( usIMR_IA & IMR_IA_CONVERSION )
     1221                    winMsg->lParam |= ISC_SHOWUICOMPOSITIONWINDOW_W;
     1222
     1223                if( usIMR_IA & IMR_IA_CANDIDATE )
     1224                    winMsg->lParam |= ISC_SHOWUIALLCANDIDATEWINDOW_W;
     1225
     1226                if( usIMR_IA & IMR_IA_INFOMSG )
     1227                    winMsg->lParam |= 0; // todo
     1228
     1229                if( usIMR_IA & IMR_IA_REGWORD )
     1230                    winMsg->lParam |= 0; // todo
     1231                break;
     1232            }
     1233
     1234            case IMR_STATUS :
     1235                winMsg->message = WM_IME_NOTIFY_W;
     1236
     1237                switch(( ULONG )os2Msg->mp2 )
     1238                {
     1239                    case IMR_STATUS_SHOW :
     1240                        winMsg->wParam = IMN_OPENSTATUSWINDOW_W;
     1241                        break;
     1242
     1243                    case IMR_STATUS_HIDE :
     1244                        winMsg->wParam = IMN_CLOSESTATUSWINDOW_W;
     1245                        break;
     1246
     1247                    case IMR_STATUS_INPUTMODE : // IMN_SETOPENSTATUS followed by IMN_SETCONVERSIONMODE
     1248                        winMsg->wParam = IMN_SETOPENSTATUS_W;
     1249                        break;
     1250
     1251                    case IMR_STATUS_CONVERSIONMODE :
     1252                        winMsg->wParam = IMN_SETSENTENCEMODE_W;
     1253                        break;
     1254
     1255                    case IMR_STATUS_STATUSPOS :
     1256                        winMsg->wParam = IMN_SETSTATUSWINDOWPOS_W;
     1257                        break;
     1258
     1259                    case IMR_STATUS_STRING :
     1260                    case IMR_STATUS_STRINGATTR :
     1261                    case IMR_STATUS_CURSORPOS :
     1262                    case IMR_STATUS_CURSORATTR :
     1263
     1264                    default :
     1265                        // todo
     1266                        goto dummymessage;
     1267
     1268                }
     1269                break;
     1270
     1271            case IMR_CONVRESULT :
     1272            {
     1273                ULONG ulIMR = ( ULONG )os2Msg->mp2;
     1274
     1275                winMsg->message = WM_IME_COMPOSITION_W;
     1276                winMsg->wParam = 0; // todo : current DBCS char
     1277
     1278                if( ulIMR & IMR_CONV_CONVERSIONSTRING )
     1279                    winMsg->lParam |= GCS_COMPSTR_W;
     1280
     1281                if( ulIMR & IMR_CONV_CONVERSIONATTR )
     1282                    winMsg->lParam |= GCS_COMPATTR_W;
     1283
     1284                if( ulIMR & IMR_CONV_CONVERSIONCLAUSE )
     1285                    winMsg->lParam |= GCS_COMPCLAUSE_W;
     1286
     1287                if( ulIMR & IMR_CONV_READINGSTRING )
     1288                    winMsg->lParam |= GCS_COMPREADSTR_W;
     1289
     1290                if( ulIMR & IMR_CONV_READINGATTR )
     1291                    winMsg->lParam |= GCS_COMPREADATTR_W;
     1292
     1293                if( ulIMR & IMR_CONV_READINGCLAUSE )
     1294                    winMsg->lParam |= GCS_COMPREADCLAUSE_W;
     1295
     1296                if( ulIMR & IMR_CONV_CURSORPOS )
     1297                    winMsg->lParam |= GCS_CURSORPOS_W;
     1298
     1299                if( ulIMR & IMR_CONV_CURSORATTR )
     1300                    winMsg->lParam |= 0; // todo
     1301
     1302                if( ulIMR & IMR_CONV_CHANGESTART )
     1303                    winMsg->lParam |= GCS_DELTASTART_W;
     1304
     1305                if( ulIMR & IMR_CONV_INSERTCHAR )
     1306                    winMsg->lParam |= CS_INSERTCHAR_W;
     1307
     1308                if( ulIMR & IMR_CONV_NOMOVECARET )
     1309                    winMsg->lParam |= CS_NOMOVECARET_W;
     1310
     1311                if( ulIMR & IMR_CONV_CONVERSIONFONT )
     1312                    winMsg->lParam |= 0; // todo
     1313
     1314                if( ulIMR & IMR_CONV_CONVERSIONPOS )
     1315                    winMsg->lParam |= 0; // todo
     1316
     1317                if( ulIMR & IMR_RESULT_RESULTSTRING )
     1318                    winMsg->lParam = GCS_RESULTSTR_W; // clear all composition info
     1319
     1320                if( ulIMR & IMR_RESULT_RESULTATTR )
     1321                    winMsg->lParam |= 0; // todo
     1322
     1323                if( ulIMR & IMR_RESULT_RESULTCLAUSE )
     1324                    winMsg->lParam |= GCS_RESULTCLAUSE_W;
     1325
     1326                if( ulIMR & IMR_RESULT_READINGSTRING )
     1327                    winMsg->lParam |= GCS_RESULTREADSTR_W;
     1328
     1329                if( ulIMR & IMR_RESULT_READINGATTR )
     1330                    winMsg->lParam |= 0; // todo
     1331
     1332                if( ulIMR & IMR_RESULT_READINGCLAUSE )
     1333                    winMsg->lParam |= GCS_RESULTREADCLAUSE_W;
     1334
     1335                if( ulIMR && ( winMsg->lParam == 0 ))
     1336                    goto dummymessage;
     1337                break;
     1338            }
     1339
     1340            case IMR_CANDIDATE :
     1341                winMsg->message = WM_IME_NOTIFY_W;
     1342                switch(( ULONG )os2Msg->mp2 )
     1343                {
     1344                    case IMR_CANDIDATE_SHOW :
     1345                    case IMR_CANDIDATE_HIDE :
     1346                    case IMR_CANDIDATE_SELECT :
     1347                    case IMR_CANDIDATE_CHANGE :
     1348                    case IMR_CANDIDATE_CANDIDATEPOS :
     1349                    default :
     1350                        // todo
     1351                        goto dummymessage;
     1352                }
     1353                break;
     1354
     1355            case IMR_INFOMSG :
     1356                winMsg->message = WM_IME_NOTIFY_W;
     1357                winMsg->wParam = IMN_GUIDELINE_W;
     1358                break;
     1359
     1360            case IMR_REGWORD :
     1361                goto dummymessage;
     1362
     1363            case IMR_IMECHANGE :
     1364                winMsg->message = WM_IME_SELECT_W;
     1365                // todo
     1366                goto dummymessage;
     1367
     1368            case IMR_CONFIG :
     1369                // todo
     1370                goto dummymessage;
     1371
     1372            case IMR_DICTIONARY :
     1373                // todo
     1374                goto dummymessage;
     1375
     1376            case IMR_OTHERINFO :
     1377                // todo
     1378                goto dummymessage;
     1379        }
     1380        break;
     1381
     1382#if 0 // application cannot receive this message
     1383    case WM_IMECONTROL:
     1384#endif
    10811385    case WM_INITMENU:
    10821386    case WM_MENUSELECT:
  • trunk/src/user32/pmwindow.cpp

    r21303 r21308  
    6161#include "user32api.h"
    6262#include <kbdhook.h>
     63#include <heapstring.h>
     64
     65#include <os2im.h>
     66#include <im32.h>
    6367
    6468#define DBG_LOCALLOG    DBG_pmwindow
     
    140144#endif
    141145
     146extern "C" ULONG OSLibImSetMsgQueueProperty( ULONG, ULONG );
     147
    142148//******************************************************************************
    143149// Initialize PM; create hab, message queue and register special Win32 window classes
     
    194200    BOOL rc = WinSetCp(hmq, GetDisplayCodepage());
    195201    dprintf(("InitPM: WinSetCP was %sOK", rc ? "" : "not "));
     202
     203    /* IM instace is created per message queue, that is, thread */
     204    if( IsDBCSEnv())
     205        OSLibImSetMsgQueueProperty( hmq, MQP_INSTANCE_PERMQ );
    196206
    197207    //CD polling window class
     
    10041014        dprintf(("OS2: %s %x %x %x", (msg == WM_HSCROLL) ? "WM_HSCROLL" : "WM_VSCROLL", win32wnd->getWindowHandle(), mp1, mp2));
    10051015        win32wnd->DispatchMsgA(pWinMsg);
     1016        break;
     1017
     1018    case WM_IMEREQUEST:
     1019    case WM_IMECONTROL:
     1020    case WM_IMENOTIFY:
     1021        if( pWinMsg->message )
     1022        {
     1023            win32wnd->DispatchMsgA( pWinMsg );
     1024
     1025            if(( pWinMsg->message = WM_IME_NOTIFY_W ) &&
     1026               ( pWinMsg->wParam == IMN_SETOPENSTATUS_W ))
     1027            {
     1028                MSG m;
     1029
     1030                m.message = WM_IME_NOTIFY_W;
     1031                m.wParam = IMN_SETCONVERSIONMODE_W;
     1032                m.lParam = 0;
     1033
     1034                win32wnd->DispatchMsgA( &m );
     1035            }
     1036        }
     1037        else
     1038            goto RunDefWndProc;
    10061039        break;
    10071040
     
    22102243        break;
    22112244
     2245    case WM_IMEREQUEST:
     2246    case WM_IMECONTROL:
     2247    case WM_IMENOTIFY:
     2248        if( pWinMsg->message )
     2249        {
     2250            dprintf(("Frame window received IME message"));
     2251            win32wnd->DispatchMsgA( pWinMsg );
     2252
     2253            if(( pWinMsg->message = WM_IME_NOTIFY_W ) &&
     2254               ( pWinMsg->wParam == IMN_SETOPENSTATUS_W ))
     2255            {
     2256                MSG m;
     2257
     2258                m.message = WM_IME_NOTIFY_W;
     2259                m.wParam = IMN_SETCONVERSIONMODE_W;
     2260                m.lParam = 0;
     2261
     2262                win32wnd->DispatchMsgA( &m );
     2263            }
     2264        }
     2265        else
     2266            goto RunDefWndProc;
     2267        break;
     2268
    22122269#ifdef DEBUG
    22132270    case WM_DDE_INITIATE:
Note: See TracChangeset for help on using the changeset viewer.