00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
#include "precomp.h"
00020 
#pragma hdrstop
00021 
00022 
#if defined(FE_IME)
00023 
00024 
00025 
00026 
00027 
VOID
00028 LinkConversionArea(
00029     IN 
PCONSOLE_INFORMATION Console,
00030     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo
00031     )
00032 {
00033     PCONVERSIONAREA_INFORMATION PrevConvAreaInfo;
00034 
00035     
if (Console->ConsoleIme.ConvAreaRoot == 
NULL) {
00036         Console->ConsoleIme.ConvAreaRoot = ConvAreaInfo;
00037     }
00038     
else {
00039         PrevConvAreaInfo = Console->ConsoleIme.ConvAreaRoot;
00040         
while (PrevConvAreaInfo->ConvAreaNext)
00041             PrevConvAreaInfo = PrevConvAreaInfo->ConvAreaNext;
00042         PrevConvAreaInfo->ConvAreaNext = ConvAreaInfo;
00043     }
00044 }
00045 
00046 
00047 
NTSTATUS
00048 FreeConvAreaScreenBuffer(
00049     IN 
PSCREEN_INFORMATION ScreenInfo
00050     )
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 {
00069     
return FreeScreenBuffer(ScreenInfo);
00070 }
00071 
00072 
00073 
00074 
NTSTATUS
00075 AllocateConversionArea(
00076     IN 
PCONSOLE_INFORMATION Console,
00077     IN COORD dwScreenBufferSize,
00078     OUT PCONVERSIONAREA_INFORMATION *ConvAreaInfo
00079     )
00080 {
00081     COORD dwWindowSize;
00082     CHAR_INFO Fill, PopupFill;
00083     PCONVERSIONAREA_INFORMATION ca;
00084     
int FontIndex;
00085     
NTSTATUS Status;
00086 
00087     
00088     
00089     
00090 
00091     ca = (PCONVERSIONAREA_INFORMATION)
ConsoleHeapAlloc(
00092                                                 
MAKE_TAG( CONVAREA_TAG ),
00093                                                 
sizeof(CONVERSIONAREA_INFORMATION));
00094     
if (ca == 
NULL) {
00095         
return STATUS_NO_MEMORY;
00096     }
00097 
00098     dwWindowSize.X = 
CONSOLE_WINDOW_SIZE_X(Console->CurrentScreenBuffer);
00099     dwWindowSize.Y = 
CONSOLE_WINDOW_SIZE_Y(Console->CurrentScreenBuffer);
00100     Fill.Attributes = Console->CurrentScreenBuffer->Attributes;
00101     PopupFill.Attributes = Console->CurrentScreenBuffer->PopupAttributes;
00102     FontIndex = 
FindCreateFont(
CON_FAMILY(Console),
00103                                
CON_FACENAME(Console),
00104                                
CON_FONTSIZE(Console),
00105                                
CON_FONTWEIGHT(Console),
00106                                
CON_FONTCODEPAGE(Console)
00107                               );
00108     
Status = 
CreateScreenBuffer(&ca->ScreenBuffer,
00109                                 dwWindowSize,
00110                                 FontIndex,
00111                                 dwScreenBufferSize,
00112                                 Fill,
00113                                 PopupFill,
00114                                 Console,
00115                                 CONSOLE_TEXTMODE_BUFFER,
00116                                 NULL,
00117                                 NULL,
00118                                 NULL,
00119                                 CURSOR_SMALL_SIZE,
00120                                 NULL
00121                                );
00122     
if (!
NT_SUCCESS(Status)) {
00123         
ConsoleHeapFree(ca);
00124         
return Status;
00125     }
00126 
00127     *ConvAreaInfo = ca;
00128 
00129     
return STATUS_SUCCESS;
00130 }
00131 
00132 
00133 
00134 
NTSTATUS
00135 SetUpConversionArea(
00136     IN 
PCONSOLE_INFORMATION Console,
00137     IN COORD coordCaBuffer,
00138     IN SMALL_RECT rcViewCaWindow,
00139     IN COORD coordConView,
00140     IN DWORD dwOption,
00141     OUT PCONVERSIONAREA_INFORMATION *ConvAreaInfo
00142     )
00143 {
00144     
NTSTATUS Status;
00145     PCONVERSIONAREA_INFORMATION ca;
00146 
00147     
Status = AllocateConversionArea(Console, coordCaBuffer, &ca);
00148     
if (!
NT_SUCCESS(Status)) {
00149         
return Status;
00150     }
00151 
00152     ca->ConversionAreaMode    = dwOption;
00153     ca->CaInfo.coordCaBuffer  = coordCaBuffer;
00154     ca->CaInfo.rcViewCaWindow = rcViewCaWindow;
00155     ca->CaInfo.coordConView   = coordConView;
00156 
00157     ca->ConvAreaNext = 
NULL;
00158 
00159     ca->ScreenBuffer->ConvScreenInfo = ca;
00160 
00161     LinkConversionArea(Console, ca);
00162 
00163     SetUndetermineAttribute( Console ) ;
00164 
00165     *ConvAreaInfo = ca;
00166 
00167     
return STATUS_SUCCESS;
00168 }
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
VOID
00180 WriteConvRegionToScreen(
00181     IN 
PSCREEN_INFORMATION ScreenInfo,
00182     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo,
00183     IN PSMALL_RECT ConvRegion
00184     )
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 {
00199     SMALL_RECT Region;
00200     SMALL_RECT ClippedRegion;
00201 
00202     
if (ScreenInfo->Console->CurrentScreenBuffer->Flags & 
CONSOLE_GRAPHICS_BUFFER)
00203         
return;
00204 
00205     
while (ConvAreaInfo) {
00206 
00207         
if ((ConvAreaInfo->ConversionAreaMode & (CA_HIDDEN+CA_HIDE_FOR_SCROLL))==0) {
00208             
00209             
00210             
00211             Region.Left   = ScreenInfo->Window.Left +
00212                             ConvAreaInfo->CaInfo.rcViewCaWindow.Left +
00213                             ConvAreaInfo->CaInfo.coordConView.X;
00214             Region.Right  = Region.Left +
00215                             (ConvAreaInfo->CaInfo.rcViewCaWindow.Right -
00216                              ConvAreaInfo->CaInfo.rcViewCaWindow.Left);
00217             Region.Top    = ScreenInfo->Window.Top +
00218                             ConvAreaInfo->CaInfo.rcViewCaWindow.Top +
00219                             ConvAreaInfo->CaInfo.coordConView.Y;
00220             Region.Bottom = Region.Top +
00221                             (ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom -
00222                              ConvAreaInfo->CaInfo.rcViewCaWindow.Top);
00223             ClippedRegion.Left   = 
max(Region.Left,   ScreenInfo->Window.Left);
00224             ClippedRegion.Top    = 
max(Region.Top,    ScreenInfo->Window.Top);
00225             ClippedRegion.Right  = 
min(Region.Right,  ScreenInfo->Window.Right);
00226             ClippedRegion.Bottom = 
min(Region.Bottom, ScreenInfo->Window.Bottom);
00227             
if (ClippedRegion.Right < ClippedRegion.Left ||
00228                 ClippedRegion.Bottom < ClippedRegion.Top) {
00229                 ;
00230             }
00231             
else {
00232                 Region = ClippedRegion;
00233                 ClippedRegion.Left   = 
max(Region.Left,   ConvRegion->Left);
00234                 ClippedRegion.Top    = 
max(Region.Top,    ConvRegion->Top);
00235                 ClippedRegion.Right  = 
min(Region.Right,  ConvRegion->Right);
00236                 ClippedRegion.Bottom = 
min(Region.Bottom, ConvRegion->Bottom);
00237                 
if (ClippedRegion.Right < ClippedRegion.Left ||
00238                     ClippedRegion.Bottom < ClippedRegion.Top) {
00239                     ;
00240                 }
00241                 
else {
00242                     ConvAreaInfo->ScreenBuffer->BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
00243                     ConvAreaInfo->ScreenBuffer->BufferInfo.TextInfo.Flags |= CONSOLE_CONVERSION_AREA_REDRAW;
00244                     
WriteRegionToScreen(ConvAreaInfo->ScreenBuffer,
00245                                         &ClippedRegion
00246                                        );
00247                     ConvAreaInfo->ScreenBuffer->BufferInfo.TextInfo.Flags &= ~CONSOLE_CONVERSION_AREA_REDRAW;
00248                 }
00249             }
00250         }
00251         ConvAreaInfo = ConvAreaInfo->ConvAreaNext;
00252     }
00253 }
00254 
00255 
00256 
BOOL
00257 ConsoleImeBottomLineUse(
00258     IN 
PSCREEN_INFORMATION ScreenInfo,
00259     IN SHORT ScrollOffset
00260     )
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 {
00277     SMALL_RECT ScrollRectangle;
00278     COORD DestinationOrigin;
00279     CHAR_INFO Fill;
00280     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00281     SMALL_RECT WriteRegion;
00282     
BOOL fRedraw = 
FALSE;
00283 
00284     
if (!(ScreenInfo->Console->ConsoleIme.ScrollFlag & HIDE_FOR_SCROLL)) {
00285         ScreenInfo->Console->ConsoleIme.ScrollFlag |= HIDE_FOR_SCROLL;
00286         
if (ConvAreaInfo = ScreenInfo->Console->ConsoleIme.ConvAreaRoot) {
00287             
do {
00288                 
if ((ConvAreaInfo->ConversionAreaMode & (CA_STATUS_LINE))==0) {
00289                     ConvAreaInfo->ConversionAreaMode |= CA_HIDE_FOR_SCROLL;
00290                     fRedraw = 
TRUE;
00291                 }
00292             } 
while (ConvAreaInfo = ConvAreaInfo->ConvAreaNext);
00293 
00294             
if (fRedraw) {
00295                 
00296                 
if (ScreenInfo->Flags & 
CONSOLE_GRAPHICS_BUFFER)
00297                 {
00298                     
ASSERT(FALSE);
00299                 }
00300                 
else {
00301                     WriteRegion = ScreenInfo->Window;
00302                     WriteRegion.Bottom--;
00303                     ScreenInfo->BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
00304                     ScreenInfo->BufferInfo.TextInfo.Flags |= CONSOLE_CONVERSION_AREA_REDRAW;
00305                     
WriteToScreen(ScreenInfo,&WriteRegion);
00306                     ScreenInfo->BufferInfo.TextInfo.Flags &= ~CONSOLE_CONVERSION_AREA_REDRAW;
00307                 }
00308             }
00309         }
00310     }
00311 
00312     
if (ScrollOffset) {
00313         ScrollRectangle.Top = 1 ;
00314         ScrollRectangle.Left = 0 ;
00315         ScrollRectangle.Right = ScreenInfo->ScreenBufferSize.X-1;
00316         ScrollRectangle.Bottom = ScreenInfo->ScreenBufferSize.Y-1;
00317         ScrollRectangle.Bottom -= (ScrollOffset-1);
00318         DestinationOrigin.X = ScrollRectangle.Left;
00319         DestinationOrigin.Y = ScrollRectangle.Top-1;
00320         Fill.Char.UnicodeChar = 
'\0';
00321         Fill.Attributes = 0;
00322         
ScrollRegion(ScreenInfo,
00323                      &ScrollRectangle,
00324                      NULL,
00325                      DestinationOrigin,
00326                      Fill
00327                     );
00328 
#if defined(FE_SB)
00329 
#if defined(FE_IME)
00330 
        if ( ! (ScreenInfo->Console->InputBuffer.ImeMode.Disable) &&
00331              ! (ScreenInfo->Console->InputBuffer.ImeMode.Unavailable) &&
00332              (ScreenInfo->Console->InputBuffer.ImeMode.Open) &&
00333              (ScrollRectangle.Left == ScreenInfo->Window.Left) &&
00334              (ScrollRectangle.Right == ScreenInfo->Window.Right) ) {
00335             ScrollRectangle.Top = ScreenInfo->Window.Bottom ;
00336             ScrollRectangle.Bottom = ScreenInfo->Window.Bottom ;
00337             
WriteToScreen(ScreenInfo,&ScrollRectangle);
00338             WriteConvRegionToScreen(ScreenInfo,
00339                                     ScreenInfo->Console->ConsoleIme.ConvAreaRoot,
00340                                     &ScrollRectangle);
00341         }
00342 
#endif
00343 
#endif
00344 
    }
00345     
else {
00346         ScreenInfo->Console->ConsoleIme.ScrollWaitCountDown = ScreenInfo->Console->ConsoleIme.ScrollWaitTimeout;
00347     }
00348     
return TRUE;
00349 }
00350 
00351 
00352 
00353 
VOID
00354 ConsoleImeBottomLineInUse(
00355     IN 
PSCREEN_INFORMATION ScreenInfo
00356     )
00357 
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 {
00371     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00372     SMALL_RECT WriteRegion;
00373     
BOOL fRedraw = 
FALSE;
00374     COORD CursorPosition;
00375 
00376     ScreenInfo->Console->ConsoleIme.ScrollFlag &= ~HIDE_FOR_SCROLL;
00377     
if (ConvAreaInfo = ScreenInfo->Console->ConsoleIme.ConvAreaRoot) {
00378         
do {
00379             
if (ConvAreaInfo->ConversionAreaMode & CA_HIDE_FOR_SCROLL) {
00380                 ConvAreaInfo->ConversionAreaMode &= ~CA_HIDE_FOR_SCROLL;
00381                 fRedraw = 
TRUE;
00382             }
00383         } 
while (ConvAreaInfo = ConvAreaInfo->ConvAreaNext);
00384 
00385         
if (fRedraw) {
00386             
00387             
if (ScreenInfo->Flags & 
CONSOLE_GRAPHICS_BUFFER)
00388             {
00389                 
ASSERT(FALSE);
00390             }
00391             
else {
00392                 
if (ScreenInfo->BufferInfo.TextInfo.CursorPosition.Y == (ScreenInfo->ScreenBufferSize.Y-1)) {
00393                     
ConsoleHideCursor(ScreenInfo);
00394                     ConsoleImeBottomLineUse(ScreenInfo,1);
00395                     CursorPosition = ScreenInfo->BufferInfo.TextInfo.CursorPosition;
00396                     CursorPosition.Y--;
00397                     
SetCursorPosition(ScreenInfo,CursorPosition,TRUE);
00398                     
if (ScreenInfo->Console->lpCookedReadData) {
00399                         ((
PCOOKED_READ_DATA)(ScreenInfo->Console->lpCookedReadData))->OriginalCursorPosition.Y--;
00400                     }
00401                     
ConsoleShowCursor(ScreenInfo);
00402                 }
00403                 
else if (ScreenInfo->BufferInfo.TextInfo.CursorPosition.Y == ScreenInfo->Window.Bottom) {
00404                     ;
00405                 }
00406 
00407                 WriteRegion.Top = 0;
00408                 WriteRegion.Bottom = (
SHORT)(ScreenInfo->ScreenBufferSize.Y-1);
00409                 WriteRegion.Left = 0;
00410                 WriteRegion.Right = (
SHORT)(ScreenInfo->ScreenBufferSize.X-1);
00411                 ScreenInfo->BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
00412                 ScreenInfo->BufferInfo.TextInfo.Flags |= CONSOLE_CONVERSION_AREA_REDRAW;
00413                 
WriteToScreen(ScreenInfo,&WriteRegion);
00414                 ScreenInfo->BufferInfo.TextInfo.Flags &= ~CONSOLE_CONVERSION_AREA_REDRAW;
00415             }
00416         }
00417     }
00418 }
00419 
00420 
00421 
00422 
NTSTATUS
00423 CreateConvAreaUndetermine(
00424     
PCONSOLE_INFORMATION Console
00425     )
00426 {
00427     PCONSOLE_IME_INFORMATION ConsoleIme = &Console->ConsoleIme;
00428     
NTSTATUS Status;
00429     COORD coordCaBuffer;
00430     SMALL_RECT rcViewCaWindow;
00431     COORD coordConView;
00432     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00433 
00434     
if (ConsoleIme->ConvAreaCompStr) {
00435         ConsoleIme->ConvAreaCompStr =
00436             
ConsoleHeapReAlloc(
00437                         0,
00438                         ConsoleIme->ConvAreaCompStr,
00439                         
ConsoleHeapSize(
00440                                  ConsoleIme->ConvAreaCompStr)+
sizeof(PCONVERSIONAREA_INFORMATION));
00441         
if (ConsoleIme->ConvAreaCompStr == 
NULL)
00442             
return STATUS_NO_MEMORY;
00443     }
00444     
else {
00445         ConsoleIme->ConvAreaCompStr =
00446             
ConsoleHeapAlloc(
00447                       
MAKE_TAG( CONVAREA_TAG ),
00448                       
sizeof(PCONVERSIONAREA_INFORMATION));
00449         
if (ConsoleIme->ConvAreaCompStr == 
NULL)
00450             
return STATUS_NO_MEMORY;
00451     }
00452 
00453     coordCaBuffer = Console->
CurrentScreenBuffer->
ScreenBufferSize;
00454     coordCaBuffer.Y = 1;
00455     rcViewCaWindow.Top    = 0;
00456     rcViewCaWindow.Left   = 0;
00457     rcViewCaWindow.Bottom = 0;
00458     rcViewCaWindow.Right  = 0;
00459     coordConView.X = 0;
00460     coordConView.Y = 0;
00461     
Status = SetUpConversionArea(Console,
00462                                  coordCaBuffer,
00463                                  rcViewCaWindow,
00464                                  coordConView,
00465                                  (Console->ConsoleIme.ScrollFlag & HIDE_FOR_SCROLL) ?
00466                                      CA_HIDE_FOR_SCROLL :
00467                                      CA_HIDDEN,
00468                                  &ConvAreaInfo
00469                                 );
00470     
if (!
NT_SUCCESS(Status)) {
00471         
return Status;
00472     }
00473 
00474     ConsoleIme->ConvAreaCompStr[ConsoleIme->NumberOfConvAreaCompStr] = ConvAreaInfo;
00475     ConsoleIme->NumberOfConvAreaCompStr++;
00476 
00477     
return Status;
00478 }
00479 
00480 
00481 
NTSTATUS
00482 CreateConvAreaModeSystem(
00483     
PCONSOLE_INFORMATION Console
00484     )
00485 {
00486     PCONSOLE_IME_INFORMATION ConsoleIme = &Console->ConsoleIme;
00487     
NTSTATUS Status;
00488     COORD coordCaBuffer;
00489     SMALL_RECT rcViewCaWindow;
00490     COORD coordConView;
00491     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00492 
00493     
00494 
00495 
00496     coordCaBuffer = Console->
CurrentScreenBuffer->
ScreenBufferSize;
00497     coordCaBuffer.Y = 1;
00498     rcViewCaWindow.Top    = 0;
00499     rcViewCaWindow.Left   = 0;
00500     rcViewCaWindow.Bottom = 0;
00501     rcViewCaWindow.Right  = 0;
00502     coordConView.X = 0;
00503     coordConView.Y = 0;
00504     
Status = SetUpConversionArea(Console,
00505                                  coordCaBuffer,
00506                                  rcViewCaWindow,
00507                                  coordConView,
00508                                  CA_HIDDEN+CA_STATUS_LINE,
00509                                  &ConvAreaInfo
00510                                 );
00511     
if (!
NT_SUCCESS(Status)) {
00512         
return Status;
00513     }
00514 
00515     ConsoleIme->ConvAreaMode = ConvAreaInfo;
00516 
00517     
00518 
00519 
00520     
Status = SetUpConversionArea(Console,
00521                                  coordCaBuffer,
00522                                  rcViewCaWindow,
00523                                  coordConView,
00524                                  CA_HIDDEN+CA_STATUS_LINE,
00525                                  &ConvAreaInfo
00526                                 );
00527     
if (!
NT_SUCCESS(Status)) {
00528         
return Status;
00529     }
00530 
00531     ConsoleIme->ConvAreaSystem = ConvAreaInfo;
00532 
00533     
return Status;
00534 }
00535 
00536 
00537 
#define LOCAL_BUFFER_SIZE 100
00538 
NTSTATUS
00539 WriteUndetermineChars(
00540     
PCONSOLE_INFORMATION Console,
00541     LPWSTR lpString,
00542     PBYTE  lpAtr,
00543     PWORD  lpAtrIdx,
00544     DWORD  NumChars  
00545     )
00546 {
00547     
PSCREEN_INFORMATION ScreenInfo;
00548     
PSCREEN_INFORMATION ConvScreenInfo;
00549     WCHAR LocalBuffer[
LOCAL_BUFFER_SIZE];
00550     
BYTE LocalBufferA[
LOCAL_BUFFER_SIZE];
00551     PWCHAR LocalBufPtr;
00552     
PBYTE LocalBufPtrA;
00553     
DWORD BufferSize;
00554     COORD Position;
00555     ULONG i;
00556     SMALL_RECT Region;
00557     COORD CursorPosition;
00558     WCHAR Char;
00559     WORD Attr;
00560     PCONSOLE_IME_INFORMATION ConsoleIme;
00561     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00562     
DWORD ConvAreaIndex;
00563     
NTSTATUS Status;
00564     ULONG NumStr ;
00565     
int WholeLen ;
00566     
int WholeRow ;
00567     
SHORT PosY ;
00568     
BOOL UndetAreaUp = 
FALSE ;
00569 
00570     ConsoleIme = &Console->ConsoleIme;
00571     ScreenInfo = Console->
CurrentScreenBuffer;
00572 
00573     
00574     
ASSERT(!(ScreenInfo->
Flags & CONSOLE_GRAPHICS_BUFFER));
00575 
00576     Position = ScreenInfo->
BufferInfo.TextInfo.CursorPosition;
00577 
00578         
if ((ScreenInfo->
Window.Left <= Position.X && Position.X <= ScreenInfo->
Window.Right) &&
00579             (ScreenInfo->
Window.Top  <= Position.Y && Position.Y <= ScreenInfo->
Window.Bottom)  ) {
00580             Position.X = ScreenInfo->
BufferInfo.TextInfo.CursorPosition.X - ScreenInfo->
Window.Left;
00581             Position.Y = ScreenInfo->
BufferInfo.TextInfo.CursorPosition.Y - ScreenInfo->
Window.Top;
00582         }
00583         
else {
00584             Position.X = 0;
00585             Position.Y = 
CONSOLE_WINDOW_SIZE_Y(ScreenInfo) - 2;
00586         }
00587 
00588     PosY = Position.Y ;
00589     
RtlUnicodeToMultiByteSize(&NumStr, lpString, NumChars*
sizeof(WCHAR));
00590 
00591     WholeLen = (
int)Position.X + (
int)NumStr ;
00592     WholeRow = WholeLen / 
CONSOLE_WINDOW_SIZE_X(ScreenInfo);
00593     
if ( ( PosY + WholeRow ) > ( 
CONSOLE_WINDOW_SIZE_Y(ScreenInfo) - 2) ) {
00594         PosY = 
CONSOLE_WINDOW_SIZE_Y(ScreenInfo) - 2 - WholeRow ;
00595         
if (PosY < 0) {
00596             PosY = ScreenInfo->
Window.Top ;
00597         }
00598     }
00599     
if (PosY != Position.Y) {
00600         Position.Y = PosY ;
00601         UndetAreaUp = 
TRUE ;
00602     }
00603 
00604     ConvAreaIndex = 0;
00605 
00606     
BufferSize = NumChars;
00607     NumChars = 0;
00608 
00609     
for (ConvAreaIndex = 0; NumChars < 
BufferSize; ConvAreaIndex++) {
00610 
00611         
if (ConvAreaIndex+1 > ConsoleIme->NumberOfConvAreaCompStr) {
00612             
Status = CreateConvAreaUndetermine(Console);
00613             
if (!
NT_SUCCESS(Status)) {
00614                 
return Status;
00615             }
00616         }
00617         ConvAreaInfo = ConsoleIme->ConvAreaCompStr[ConvAreaIndex];
00618         ConvScreenInfo = ConvAreaInfo->ScreenBuffer;
00619         ConvScreenInfo->
BufferInfo.TextInfo.CursorPosition.X = Position.X;
00620 
00621         
if ((ConvAreaInfo->ConversionAreaMode & CA_HIDDEN) ||
00622             (UndetAreaUp)) {
00623             
00624 
00625 
00626             CursorPosition.X = 0;
00627             CursorPosition.Y = (
SHORT)(Position.Y + ConvAreaIndex);
00628             ConsoleImeViewInfo(Console,ConvAreaInfo,CursorPosition);
00629         }
00630 
00631         Region.Left = ConvScreenInfo->
BufferInfo.TextInfo.CursorPosition.X;
00632         Region.Top = 0;
00633         Region.Bottom = 0;
00634 
00635         
while (NumChars < 
BufferSize) {
00636             i=0;
00637             LocalBufPtr = LocalBuffer;
00638             LocalBufPtrA = LocalBufferA;
00639 
00640             
while (NumChars < 
BufferSize &&
00641                    i < 
LOCAL_BUFFER_SIZE &&
00642                    Position.X < 
CONSOLE_WINDOW_SIZE_X(ScreenInfo)) {
00643                 Char = *lpString;
00644                 Attr = *lpAtr;
00645                 
if (Char >= (WCHAR)
' ') {
00646                     
if (IsConsoleFullWidth(Console->
hDC,Console->
OutputCP,Char)) {
00647                         
if (i < (
LOCAL_BUFFER_SIZE-1) &&
00648                             Position.X < 
CONSOLE_WINDOW_SIZE_X(ScreenInfo)-1) {
00649                             *LocalBufPtr++ = Char;
00650                             *LocalBufPtrA++ = ATTR_LEADING_BYTE;
00651                             *LocalBufPtr++ = Char;
00652                             *LocalBufPtrA++ = ATTR_TRAILING_BYTE;
00653                             Position.X+=2;
00654                             i+=2;
00655                         }
00656                         
else {
00657                             Position.X++;
00658                             
break;
00659                         }
00660                     }
00661                     
else {
00662                         *LocalBufPtr++ = Char;
00663                         *LocalBufPtrA++ = 0;
00664                         Position.X++;
00665                         i++;
00666                     }
00667                 }
00668                 lpString++;
00669                 lpAtr++;
00670                 NumChars++;
00671 
00672                 
if (NumChars < 
BufferSize &&
00673                     Attr != *lpAtr)
00674                     
break;
00675             }
00676             
if (i != 0) {
00677                 ConvScreenInfo->
Attributes = lpAtrIdx[Attr & 0x07];
00678                 
if (Attr & 0x10)
00679                     ConvScreenInfo->
Attributes |= (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_RVERTICAL) ;
00680                 
else if (Attr & 0x20)
00681                     ConvScreenInfo->
Attributes |= (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_LVERTICAL) ;
00682                 StreamWriteToScreenBufferIME(LocalBuffer,
00683                                           (SHORT)i,
00684                                           ConvScreenInfo,
00685                                           LocalBufferA
00686                                          );
00687 
00688                 ConvScreenInfo->
BufferInfo.TextInfo.CursorPosition.X += (
SHORT)i;
00689 
00690                 
if (NumChars == 
BufferSize ||
00691                     Position.X >= 
CONSOLE_WINDOW_SIZE_X(ScreenInfo) ||
00692                     ( (Char >= (WCHAR)
' ' &&
00693                       IsConsoleFullWidth(Console->
hDC,Console->
OutputCP,Char) &&
00694                       Position.X >= 
CONSOLE_WINDOW_SIZE_X(ScreenInfo)-1) )
00695                    ) {
00696 
00697                     Region.Right = (
SHORT)(ConvScreenInfo->
BufferInfo.TextInfo.CursorPosition.X - 1);
00698                     ConsoleImeWindowInfo(Console,ConvAreaInfo,Region);
00699 
00700                     ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN;
00701 
00702                     ConsoleImePaint(Console,ConvAreaInfo);
00703 
00704                     Position.X = 0;
00705                     
break;
00706                 }
00707 
00708                 
if (NumChars == 
BufferSize) {
00709                     
return STATUS_SUCCESS;
00710                 }
00711                 
continue;
00712 
00713             } 
else if (NumChars == 
BufferSize) {
00714                 
return STATUS_SUCCESS;
00715             }
00716             
if (!
NT_SUCCESS(Status)) {
00717                 
return Status;
00718             }
00719             
if (Position.X >= 
CONSOLE_WINDOW_SIZE_X(ScreenInfo)) {
00720                 Position.X = 0;
00721                 
break;
00722             }
00723         }
00724 
00725     }
00726 
00727     
for ( ; ConvAreaIndex < ConsoleIme->NumberOfConvAreaCompStr; ConvAreaIndex++) {
00728         ConvAreaInfo = ConsoleIme->ConvAreaCompStr[ConvAreaIndex];
00729         
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
00730             ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
00731             ConsoleImePaint(Console,ConvAreaInfo);
00732         }
00733     }
00734 
00735     
return STATUS_SUCCESS;
00736 }
00737 
00738 
00739 
VOID
00740 WriteModeSystemChars(
00741     
PCONSOLE_INFORMATION Console,
00742     PCONVERSIONAREA_INFORMATION ConvAreaInfo,
00743     PCHAR_INFO Buffer,
00744     DWORD NumberOfChars,
00745     DWORD ViewPosition
00746     )
00747 {
00748     SMALL_RECT CharRegion;
00749     COORD CursorPosition;
00750 
00751     
if (
Buffer) {
00752         CharRegion.Left   = 0;
00753         CharRegion.Top    = 0;
00754         CharRegion.Right  = CalcWideCharToColumn(Console,Buffer,NumberOfChars);
00755         CharRegion.Right  = (CharRegion.Right ? CharRegion.Right-1 : 0);
00756         CharRegion.Bottom = 0;
00757     }
00758     
else {
00759         CharRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
00760     }
00761     
if (ConvAreaInfo) {
00762         
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
00763             
if (CharRegion.Left   != ConvAreaInfo->CaInfo.rcViewCaWindow.Left ||
00764                 CharRegion.Top    != ConvAreaInfo->CaInfo.rcViewCaWindow.Top ||
00765                 CharRegion.Right  != ConvAreaInfo->CaInfo.rcViewCaWindow.Right ||
00766                 CharRegion.Bottom != ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom) {
00767                 
switch (ViewPosition) {
00768                     
case VIEW_LEFT:
00769                         CursorPosition.X = 0;
00770                         
break;
00771                     
case VIEW_RIGHT:
00772                         CursorPosition.X = 
CONSOLE_WINDOW_SIZE_X(Console->
CurrentScreenBuffer) - (CharRegion.Right + 1);
00773                         
break;
00774                 }
00775                 CursorPosition.Y = 
CONSOLE_WINDOW_SIZE_Y(Console->
CurrentScreenBuffer) - 1;
00776                 ConsoleImeViewInfo(Console,ConvAreaInfo,CursorPosition);
00777 
00778                 ConsoleImeWindowInfo(Console,ConvAreaInfo,CharRegion);
00779             }
00780         }
00781         
else {
00782             
00783 
00784 
00785             
switch (ViewPosition) {
00786                 
case VIEW_LEFT:
00787                     CursorPosition.X = 0;
00788                     
break;
00789                 
case VIEW_RIGHT:
00790                     CursorPosition.X = 
CONSOLE_WINDOW_SIZE_X(Console->
CurrentScreenBuffer) - (CharRegion.Right + 1);
00791                     
break;
00792             }
00793             CursorPosition.Y = 
CONSOLE_WINDOW_SIZE_Y(Console->
CurrentScreenBuffer) - 1;
00794             ConsoleImeViewInfo(Console,ConvAreaInfo,CursorPosition);
00795 
00796             ConsoleImeWindowInfo(Console,ConvAreaInfo,CharRegion);
00797         }
00798 
00799         
if (
Buffer) {
00800             ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN;
00801             ConsoleImeWriteOutput(Console,ConvAreaInfo,Buffer,CharRegion,TRUE);
00802         }
00803         
else {
00804             ConsoleImePaint(Console,ConvAreaInfo);
00805         }
00806     }
00807 }
00808 
00809 
00810 
NTSTATUS
00811 FillUndetermineChars(
00812     
PCONSOLE_INFORMATION Console,
00813     PCONVERSIONAREA_INFORMATION ConvAreaInfo
00814     )
00815 {
00816     COORD Coord;
00817     
DWORD CharsToWrite;
00818 
00819     ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
00820     Coord.X = 0;
00821     Coord.Y = 0;
00822     CharsToWrite = ConvAreaInfo->ScreenBuffer->ScreenBufferSize.X;
00823     
FillOutput(ConvAreaInfo->ScreenBuffer,
00824                (WCHAR)
' ',
00825                Coord,
00826                CONSOLE_FALSE_UNICODE, 
00827                &CharsToWrite
00828               );
00829     CharsToWrite = ConvAreaInfo->ScreenBuffer->ScreenBufferSize.X;
00830     
FillOutput(ConvAreaInfo->ScreenBuffer,
00831                Console->
CurrentScreenBuffer->
Attributes,
00832                Coord,
00833                CONSOLE_ATTRIBUTE,
00834                &CharsToWrite
00835               );
00836     ConsoleImePaint(Console,ConvAreaInfo);
00837     
return STATUS_SUCCESS;
00838 }
00839 
00840 
00841 
NTSTATUS
00842 ConsoleImeCompStr(
00843     IN 
PCONSOLE_INFORMATION Console,
00844     IN 
LPCONIME_UICOMPMESSAGE CompStr
00845     )
00846 {
00847     
UINT i;
00848     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00849 
00850     
if (CompStr->dwCompStrLen == 0 ||
00851         CompStr->dwResultStrLen != 0
00852        ) {
00853 
00854         
00855         
if ((Console->CurrentScreenBuffer->Flags & 
CONSOLE_TEXTMODE_BUFFER) &&
00856              Console->ConsoleIme.SavedCursorVisible                             )
00857         {
00858             Console->ConsoleIme.SavedCursorVisible = 
FALSE;
00859             
SetCursorInformation(Console->CurrentScreenBuffer,
00860                                  Console->CurrentScreenBuffer->BufferInfo.TextInfo.CursorSize,
00861                                  TRUE);
00862         }
00863 
00864         
00865 
00866 
00867         
for (i=0; i<Console->ConsoleIme.NumberOfConvAreaCompStr; i++) {
00868             ConvAreaInfo = Console->ConsoleIme.ConvAreaCompStr[i];
00869             
if (ConvAreaInfo &&
00870                 (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
00871                 FillUndetermineChars(Console,ConvAreaInfo);
00872             }
00873         }
00874 
00875         
if (CompStr->dwResultStrLen != 0)
00876         {
00877             
if (!InsertConverTedString(Console, (LPWSTR)((PBYTE)CompStr + CompStr->dwResultStrOffset))) {
00878                 
return STATUS_INVALID_HANDLE;
00879             }
00880         }
00881         
if (Console->ConsoleIme.CompStrData) {
00882             
ConsoleHeapFree(Console->ConsoleIme.CompStrData);
00883             Console->ConsoleIme.CompStrData = 
NULL;
00884         }
00885     }
00886     
else {
00887         LPWSTR lpStr;
00888         
PBYTE  lpAtr;
00889         PWORD  lpAtrIdx;
00890 
00891         
00892         
if ((Console->CurrentScreenBuffer->Flags & 
CONSOLE_TEXTMODE_BUFFER) &&
00893              Console->CurrentScreenBuffer->BufferInfo.TextInfo.CursorVisible  )
00894         {
00895             Console->ConsoleIme.SavedCursorVisible = 
TRUE;
00896             
SetCursorInformation(Console->CurrentScreenBuffer,
00897                                  Console->CurrentScreenBuffer->BufferInfo.TextInfo.CursorSize,
00898                                  FALSE);
00899         }
00900 
00901         
00902 
00903 
00904         
for (i=0; i<Console->ConsoleIme.NumberOfConvAreaCompStr; i++) {
00905             ConvAreaInfo = Console->ConsoleIme.ConvAreaCompStr[i];
00906             
if (ConvAreaInfo &&
00907                 (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
00908                 FillUndetermineChars(Console,ConvAreaInfo);
00909             }
00910         }
00911 
00912         lpStr = (LPWSTR)((
PBYTE)CompStr + CompStr->dwCompStrOffset);
00913         lpAtr = (
PBYTE)CompStr + CompStr->dwCompAttrOffset;
00914         lpAtrIdx = (PWORD)CompStr->CompAttrColor ;
00915         WriteUndetermineChars(Console, lpStr, lpAtr, lpAtrIdx, CompStr->dwCompStrLen / 
sizeof(WCHAR));
00916     }
00917 
00918     
return STATUS_SUCCESS;
00919 }
00920 
00921 
00922 
00923 
00924 
NTSTATUS
00925 ConsoleImeResizeModeSystemView(
00926     
PCONSOLE_INFORMATION Console,
00927     SMALL_RECT WindowRect
00928     )
00929 {
00930     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
00931     SMALL_RECT CharRegion;
00932     COORD CursorPosition;
00933 
00934     
00935 
00936 
00937 
00938     ConvAreaInfo = Console->ConsoleIme.ConvAreaMode;
00939  
00940     
if (ConvAreaInfo &&
00941         (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
00942         ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
00943         ConsoleImePaint(Console,ConvAreaInfo);
00944         CharRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
00945 
00946         
if (Console->ConsoleIme.ConvAreaModePosition == 
VIEW_LEFT){
00947             CursorPosition.X = 0;
00948         }
00949         
else{
00950             CursorPosition.X = 
CONSOLE_WINDOW_SIZE_X(Console->
CurrentScreenBuffer) - (CharRegion.Right + 1);
00951         }
00952 
00953         CursorPosition.Y = 
CONSOLE_WINDOW_SIZE_Y(Console->
CurrentScreenBuffer) - 1;
00954         ConsoleImeViewInfo(Console,ConvAreaInfo,CursorPosition);
00955         ConsoleImeWindowInfo(Console,ConvAreaInfo,CharRegion);
00956         ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN;
00957 
00958         WriteModeSystemChars(Console,
00959                              Console->ConsoleIme.ConvAreaMode,
00960                              NULL,
00961                              0,
00962                              Console->ConsoleIme.ConvAreaModePosition);
00963     }
00964 
00965     
00966 
00967 
00968     ConvAreaInfo = Console->ConsoleIme.ConvAreaSystem;
00969     
if (ConvAreaInfo &&
00970         (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
00971 
00972         ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
00973         ConsoleImePaint(Console,ConvAreaInfo);
00974 
00975         CharRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
00976         CursorPosition.X = 0;
00977         CursorPosition.Y = 
CONSOLE_WINDOW_SIZE_Y(Console->
CurrentScreenBuffer) - 1;
00978         ConsoleImeViewInfo(Console,ConvAreaInfo,CursorPosition);
00979         ConsoleImeWindowInfo(Console,ConvAreaInfo,CharRegion);
00980         ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN;
00981 
00982         WriteModeSystemChars(Console,
00983                              Console->ConsoleIme.ConvAreaSystem,
00984                              NULL,
00985                              0,
00986                              VIEW_LEFT);
00987     }
00988 
00989     
return STATUS_SUCCESS;
00990     UNREFERENCED_PARAMETER(WindowRect);
00991 }
00992 
00993 
00994 
NTSTATUS
00995 ConsoleImeResizeCompStrView(
00996     
PCONSOLE_INFORMATION Console,
00997     SMALL_RECT WindowRect
00998     )
00999 {
01000     
UINT i;
01001     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
01002     
LPCONIME_UICOMPMESSAGE CompStr;
01003     LPWSTR lpStr;
01004     
PBYTE  lpAtr;
01005     PWORD  lpAtrIdx;
01006 
01007     
01008 
01009 
01010     CompStr = Console->ConsoleIme.CompStrData;
01011     
if (CompStr) {
01012         
for (i=0; i<Console->ConsoleIme.NumberOfConvAreaCompStr; i++) {
01013             ConvAreaInfo = Console->ConsoleIme.ConvAreaCompStr[i];
01014             
if (ConvAreaInfo &&
01015                 (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
01016                 FillUndetermineChars(Console,ConvAreaInfo);
01017             }
01018         }
01019 
01020         lpStr = (LPWSTR)((
PBYTE)CompStr + CompStr->
dwCompStrOffset);
01021         lpAtr = (
PBYTE)CompStr + CompStr->
dwCompAttrOffset;
01022         lpAtrIdx = (PWORD)CompStr->
CompAttrColor ;
01023 
01024         WriteUndetermineChars(Console, lpStr, lpAtr, lpAtrIdx, CompStr->
dwCompStrLen / 
sizeof(WCHAR));
01025     }
01026     
return STATUS_SUCCESS;
01027     UNREFERENCED_PARAMETER(WindowRect);
01028 }
01029 
01030 
01031 
NTSTATUS
01032 ConsoleImeResizeModeSystemScreenBuffer(
01033     
PCONSOLE_INFORMATION Console,
01034     COORD NewScreenSize
01035     )
01036 {
01037     
NTSTATUS Status;
01038     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
01039 
01040     
01041 
01042 
01043     ConvAreaInfo = Console->ConsoleIme.ConvAreaMode;
01044     
if (ConvAreaInfo) {
01045         
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
01046             ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
01047             ConsoleImePaint(Console,ConvAreaInfo);
01048             ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN; 
01049         }
01050 
01051         
Status = ConsoleImeResizeScreenBuffer(ConvAreaInfo->ScreenBuffer,NewScreenSize,ConvAreaInfo);
01052         
if (! 
NT_SUCCESS(Status))
01053             
return Status;
01054     }
01055 
01056     
01057 
01058 
01059     ConvAreaInfo = Console->ConsoleIme.ConvAreaSystem;
01060     
if (ConvAreaInfo) {
01061         
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
01062             ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
01063             ConsoleImePaint(Console,ConvAreaInfo);
01064             ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN; 
01065         }
01066 
01067         
Status = ConsoleImeResizeScreenBuffer(ConvAreaInfo->ScreenBuffer,NewScreenSize,ConvAreaInfo);
01068         
if (! 
NT_SUCCESS(Status))
01069             
return Status;
01070     }
01071 
01072     
return STATUS_SUCCESS;
01073 }
01074 
01075 
01076 
NTSTATUS
01077 ConsoleImeResizeCompStrScreenBuffer(
01078     
PCONSOLE_INFORMATION Console,
01079     COORD NewScreenSize
01080     )
01081 {
01082     
NTSTATUS Status;
01083     
UINT i;
01084     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
01085 
01086     
01087 
01088 
01089     
for (i=0; i<Console->ConsoleIme.NumberOfConvAreaCompStr; i++) {
01090         ConvAreaInfo = Console->ConsoleIme.ConvAreaCompStr[i];
01091 
01092         
if (ConvAreaInfo) {
01093             
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
01094                 ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
01095                 ConsoleImePaint(Console,ConvAreaInfo);
01096             }
01097 
01098             
Status = ConsoleImeResizeScreenBuffer(ConvAreaInfo->ScreenBuffer,NewScreenSize,ConvAreaInfo);
01099             
if (! 
NT_SUCCESS(Status))
01100                 
return Status;
01101         }
01102 
01103     }
01104     
return STATUS_SUCCESS;
01105 }
01106 
01107 
01108 
SHORT
01109 CalcWideCharToColumn(
01110     IN 
PCONSOLE_INFORMATION Console,
01111     IN PCHAR_INFO Buffer,
01112     IN DWORD NumberOfChars
01113     )
01114 {
01115     
SHORT Column = 0;
01116 
01117     
while (NumberOfChars--) {
01118         
if (IsConsoleFullWidth(Console->hDC,Console->OutputCP,
Buffer->Char.UnicodeChar))
01119             Column += 2;
01120         
else
01121             Column++;
01122         
Buffer++;
01123     }
01124     
return Column;
01125 }
01126 
01127 
01128 
01129 
01130 
01131 
01132 
01133 
01134 
01135 
01136 
01137 
01138 
01139 LONG
01140 ConsoleImePaint(
01141     IN 
PCONSOLE_INFORMATION Console,
01142     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo
01143     )
01144 
01145 
01146 
01147 
01148 
01149 
01150 
01151 {
01152     
PSCREEN_INFORMATION ScreenInfo;
01153     SMALL_RECT WriteRegion;
01154     COORD CursorPosition;
01155 
01156     
if (!ConvAreaInfo)
01157         
return FALSE;
01158 
01159     ScreenInfo = Console->CurrentScreenBuffer;
01160     
if (!ScreenInfo)
01161         
return FALSE;
01162 
01163     
01164     
ASSERT(!(ScreenInfo->
Flags & CONSOLE_GRAPHICS_BUFFER));
01165 
01166     WriteRegion.Left   = ScreenInfo->
Window.Left
01167                          + ConvAreaInfo->CaInfo.coordConView.X
01168                          + ConvAreaInfo->CaInfo.rcViewCaWindow.Left;
01169     WriteRegion.Right  = WriteRegion.Left
01170                          + (ConvAreaInfo->CaInfo.rcViewCaWindow.Right - ConvAreaInfo->CaInfo.rcViewCaWindow.Left);
01171     WriteRegion.Top    = ScreenInfo->
Window.Top
01172                          + ConvAreaInfo->CaInfo.coordConView.Y
01173                          + ConvAreaInfo->CaInfo.rcViewCaWindow.Top;
01174     WriteRegion.Bottom = WriteRegion.Top
01175                          + (ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom - ConvAreaInfo->CaInfo.rcViewCaWindow.Top);
01176 
01177     
if ((ConvAreaInfo->ConversionAreaMode & (CA_HIDDEN+CA_STATUS_LINE))==(CA_STATUS_LINE)) {
01178         
if (ScreenInfo->
BufferInfo.TextInfo.CursorPosition.Y == (ScreenInfo->
ScreenBufferSize.Y-1)) {
01179             
ConsoleHideCursor(ScreenInfo);
01180             ConsoleImeBottomLineUse(ScreenInfo,1);
01181             CursorPosition = ScreenInfo->
BufferInfo.TextInfo.CursorPosition;
01182             CursorPosition.Y--;
01183             
SetCursorPosition(ScreenInfo,CursorPosition,TRUE);
01184             
if (ScreenInfo->
Console->lpCookedReadData) {
01185                 ((
PCOOKED_READ_DATA)(ScreenInfo->
Console->lpCookedReadData))->OriginalCursorPosition.Y--;
01186             }
01187             
ConsoleShowCursor(ScreenInfo);
01188         }
01189         
else if (ScreenInfo->
BufferInfo.TextInfo.CursorPosition.Y == ScreenInfo->
Window.Bottom) {
01190             WriteRegion.Top    = ScreenInfo->
Window.Top
01191                                  + ConvAreaInfo->CaInfo.coordConView.Y
01192                                  + ConvAreaInfo->CaInfo.rcViewCaWindow.Top;
01193             WriteRegion.Bottom = WriteRegion.Top
01194                                  + (ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom - ConvAreaInfo->CaInfo.rcViewCaWindow.Top);
01195         }
01196     }
01197 
01198     ScreenInfo->
BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
01199     ScreenInfo->
BufferInfo.TextInfo.Flags |= CONSOLE_CONVERSION_AREA_REDRAW;
01200     
if (!(ConvAreaInfo->ConversionAreaMode & (CA_HIDDEN | CA_HIDE_FOR_SCROLL))) {
01201         WriteConvRegionToScreen(ScreenInfo,
01202                                 ConvAreaInfo,
01203                                 &WriteRegion
01204                                );
01205     }
01206     
else {
01207         
WriteToScreen(ScreenInfo,&WriteRegion);
01208     }
01209     ScreenInfo->
BufferInfo.TextInfo.Flags &= ~CONSOLE_CONVERSION_AREA_REDRAW;
01210 
01211     
return TRUE;
01212 }
01213 
01214 
VOID
01215 ConsoleImeViewInfo(
01216     IN 
PCONSOLE_INFORMATION Console,
01217     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo,
01218     IN COORD coordConView
01219     )
01220 {
01221     SMALL_RECT OldRegion;
01222     SMALL_RECT NewRegion;
01223 
01224     
if (ConvAreaInfo->ConversionAreaMode & CA_HIDDEN) {
01225         ConvAreaInfo->CaInfo.coordConView = coordConView;
01226         NewRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
01227         NewRegion.Left   += ConvAreaInfo->CaInfo.coordConView.X;
01228         NewRegion.Right  += ConvAreaInfo->CaInfo.coordConView.X;
01229         NewRegion.Top    += ConvAreaInfo->CaInfo.coordConView.Y;
01230         NewRegion.Bottom += ConvAreaInfo->CaInfo.coordConView.Y;
01231     }
01232     
else {
01233         OldRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
01234         OldRegion.Left   += ConvAreaInfo->CaInfo.coordConView.X;
01235         OldRegion.Right  += ConvAreaInfo->CaInfo.coordConView.X;
01236         OldRegion.Top    += ConvAreaInfo->CaInfo.coordConView.Y;
01237         OldRegion.Bottom += ConvAreaInfo->CaInfo.coordConView.Y;
01238         ConvAreaInfo->CaInfo.coordConView = coordConView;
01239 
01240         
01241         
ASSERT(!(Console->CurrentScreenBuffer->Flags & CONSOLE_GRAPHICS_BUFFER));
01242 
01243         Console->CurrentScreenBuffer->BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
01244         Console->CurrentScreenBuffer->BufferInfo.TextInfo.Flags |= CONSOLE_CONVERSION_AREA_REDRAW;
01245         
WriteToScreen(Console->CurrentScreenBuffer,&OldRegion);
01246 
01247         NewRegion = ConvAreaInfo->CaInfo.rcViewCaWindow;
01248         NewRegion.Left   += ConvAreaInfo->CaInfo.coordConView.X;
01249         NewRegion.Right  += ConvAreaInfo->CaInfo.coordConView.X;
01250         NewRegion.Top    += ConvAreaInfo->CaInfo.coordConView.Y;
01251         NewRegion.Bottom += ConvAreaInfo->CaInfo.coordConView.Y;
01252         Console->CurrentScreenBuffer->BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
01253         
WriteToScreen(Console->CurrentScreenBuffer,&NewRegion);
01254         Console->CurrentScreenBuffer->BufferInfo.TextInfo.Flags &= ~CONSOLE_CONVERSION_AREA_REDRAW;
01255     }
01256 }
01257 
01258 
VOID
01259 ConsoleImeWindowInfo(
01260     IN 
PCONSOLE_INFORMATION Console,
01261     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo,
01262     IN SMALL_RECT rcViewCaWindow
01263     )
01264 {
01265     
if (rcViewCaWindow.Left   != ConvAreaInfo->CaInfo.rcViewCaWindow.Left ||
01266         rcViewCaWindow.Top    != ConvAreaInfo->CaInfo.rcViewCaWindow.Top ||
01267         rcViewCaWindow.Right  != ConvAreaInfo->CaInfo.rcViewCaWindow.Right ||
01268         rcViewCaWindow.Bottom != ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom) {
01269         
if (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN)) {
01270             ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
01271             ConsoleImePaint(Console,ConvAreaInfo);
01272 
01273             ConvAreaInfo->CaInfo.rcViewCaWindow = rcViewCaWindow;
01274             ConvAreaInfo->ConversionAreaMode &= ~CA_HIDDEN;
01275             ConvAreaInfo->ScreenBuffer->BisectFlag &= ~(BISECT_LEFT | BISECT_RIGHT | BISECT_TOP | BISECT_BOTTOM);
01276             ConsoleImePaint(Console,ConvAreaInfo);
01277         }
01278         
else
01279             ConvAreaInfo->CaInfo.rcViewCaWindow = rcViewCaWindow;
01280     }
01281 }
01282 
01283 
NTSTATUS
01284 ConsoleImeResizeScreenBuffer(
01285     IN 
PSCREEN_INFORMATION ScreenInfo,
01286     IN COORD NewScreenSize,
01287     PCONVERSIONAREA_INFORMATION ConvAreaInfo
01288     )
01289 {
01290     
NTSTATUS Status;
01291 
01292     
Status = 
ResizeScreenBuffer(ScreenInfo,
01293                                 NewScreenSize,
01294                                 FALSE);
01295     
if (
NT_SUCCESS(Status)) {
01296         ConvAreaInfo->CaInfo.coordCaBuffer = NewScreenSize;
01297         
if (ConvAreaInfo->CaInfo.rcViewCaWindow.Left   > NewScreenSize.X-1)
01298             ConvAreaInfo->CaInfo.rcViewCaWindow.Left   = NewScreenSize.X-1;
01299         
if (ConvAreaInfo->CaInfo.rcViewCaWindow.Right  > NewScreenSize.X-1)
01300             ConvAreaInfo->CaInfo.rcViewCaWindow.Right  = NewScreenSize.X-1;
01301         
if (ConvAreaInfo->CaInfo.rcViewCaWindow.Top    > NewScreenSize.Y-1)
01302             ConvAreaInfo->CaInfo.rcViewCaWindow.Top    = NewScreenSize.Y-1;
01303         
if (ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom > NewScreenSize.Y-1)
01304             ConvAreaInfo->CaInfo.rcViewCaWindow.Bottom = NewScreenSize.Y-1;
01305 
01306     }
01307 
01308     
return Status;
01309 }
01310 
01311 
NTSTATUS
01312 ConsoleImeWriteOutput(
01313     IN 
PCONSOLE_INFORMATION Console,
01314     IN PCONVERSIONAREA_INFORMATION ConvAreaInfo,
01315     IN PCHAR_INFO Buffer,
01316     IN SMALL_RECT CharRegion,
01317     IN BOOL fUnicode
01318     )
01319 {
01320     
NTSTATUS Status;
01321     
PSCREEN_INFORMATION ScreenInfo;
01322     COORD 
BufferSize;
01323     SMALL_RECT ConvRegion;
01324     COORD CursorPosition;
01325 
01326     
BufferSize.X = (
SHORT)(CharRegion.Right - CharRegion.Left + 1);
01327     
BufferSize.Y = (
SHORT)(CharRegion.Bottom - CharRegion.Top + 1);
01328 
01329     ConvRegion = CharRegion;
01330 
01331     ScreenInfo = ConvAreaInfo->ScreenBuffer;
01332 
01333     
if (!fUnicode) {
01334         
TranslateOutputToUnicode(Console,
01335                                  Buffer,
01336                                  BufferSize
01337                                 );
01338         
Status = 
WriteScreenBuffer(ScreenInfo,
01339                                    Buffer,
01340                                    &ConvRegion
01341                                   );
01342     } 
else {
01343         CHAR_INFO StackBuffer[
STACK_BUFFER_SIZE * 2];
01344         PCHAR_INFO TransBuffer;
01345         
BOOL StackBufferF = 
FALSE;
01346 
01347         
if (
BufferSize.Y * 
BufferSize.X <= 
STACK_BUFFER_SIZE) {
01348             TransBuffer = StackBuffer;
01349             StackBufferF = 
TRUE;
01350         } 
else {
01351             TransBuffer = (PCHAR_INFO)
ConsoleHeapAlloc(
MAKE_TAG( TMP_DBCS_TAG ),(
BufferSize.Y * 
BufferSize.X) * 2 * 
sizeof(CHAR_INFO));
01352             
if (TransBuffer == 
NULL) {
01353                 
return STATUS_NO_MEMORY;
01354             }
01355         }
01356         
if ((Console->CurrentScreenBuffer->Flags & 
CONSOLE_OEMFONT_DISPLAY) &&
01357                 ((Console->FullScreenFlags & CONSOLE_FULLSCREEN) == 0)) {
01358             
TranslateOutputToAnsiUnicode(Console,
01359                                          Buffer,
01360                                          BufferSize,
01361                                          &TransBuffer[0]
01362                                         );
01363         }
01364         
else {
01365             
TranslateOutputToPaddingUnicode(Console,
01366                                             Buffer,
01367                                             BufferSize,
01368                                             &TransBuffer[0]
01369                                            );
01370         }
01371 
01372         
Status = 
WriteScreenBuffer(ScreenInfo,
01373                                    &TransBuffer[0],
01374                                    &ConvRegion
01375                                   );
01376         
if (!StackBufferF)
01377             
ConsoleHeapFree(TransBuffer);
01378     }
01379 
01380     
if (
NT_SUCCESS(Status)) {
01381 
01382         ScreenInfo = Console->CurrentScreenBuffer;
01383 
01384 
01385         
01386         
if (ScreenInfo->
Flags & 
CONSOLE_GRAPHICS_BUFFER) {
01387             
ASSERT(FALSE);
01388         }
01389         
else if ((ConvAreaInfo->ConversionAreaMode & (CA_HIDDEN+CA_STATUS_LINE))==(CA_STATUS_LINE)) {
01390             
if (ScreenInfo->
BufferInfo.TextInfo.CursorPosition.Y == (ScreenInfo->
ScreenBufferSize.Y-1)
01391                )
01392             {
01393                 
ConsoleHideCursor(ScreenInfo);
01394                 ConsoleImeBottomLineUse(ScreenInfo,1);
01395                 CursorPosition = ScreenInfo->
BufferInfo.TextInfo.CursorPosition;
01396                 CursorPosition.Y--;
01397                 
SetCursorPosition(ScreenInfo,CursorPosition,TRUE);
01398                 
if (ScreenInfo->
Console->lpCookedReadData) {
01399                     ((
PCOOKED_READ_DATA)(ScreenInfo->
Console->lpCookedReadData))->OriginalCursorPosition.Y--;
01400                 }
01401                 
ConsoleShowCursor(ScreenInfo);
01402             }
01403             
else if (ScreenInfo->
BufferInfo.TextInfo.CursorPosition.Y == ScreenInfo->
Window.Bottom) {
01404                 COORD WindowOrigin ;
01405                 WindowOrigin.X = ScreenInfo->
Window.Left ;
01406                 WindowOrigin.Y = ScreenInfo->
Window.Top+1 ;
01407                 
SetWindowOrigin(ScreenInfo, TRUE, WindowOrigin) ;
01408                 
if ( ! (ScreenInfo->
Console->
InputBuffer.ImeMode.Disable) &&
01409                      ! (ScreenInfo->
Console->
InputBuffer.ImeMode.Unavailable) &&
01410                      (ScreenInfo->
Console->
InputBuffer.ImeMode.Open) ) {
01411                     SMALL_RECT Rectangle;
01412                     Rectangle.Left = ScreenInfo->
Window.Left ;
01413                     Rectangle.Right = ScreenInfo->
Window.Right ;
01414                     Rectangle.Top = ScreenInfo->
Window.Bottom ;
01415                     Rectangle.Bottom = ScreenInfo->
Window.Bottom ;
01416                     ScreenInfo->
BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
01417                     
WriteToScreen(ScreenInfo,&Rectangle);
01418                     ScreenInfo->
BufferInfo.TextInfo.Flags |= 
TEXT_VALID_HINT;
01419                     WriteConvRegionToScreen(ScreenInfo,
01420                                             ScreenInfo->
Console->ConsoleIme.ConvAreaRoot,
01421                                             &Rectangle);
01422                 }
01423             }
01424         }
01425 
01426         
01427         
01428         
01429         ConvRegion.Left   += (ScreenInfo->
Window.Left + ConvAreaInfo->CaInfo.coordConView.X);
01430         ConvRegion.Right  += (ScreenInfo->
Window.Left + ConvAreaInfo->CaInfo.coordConView.X);
01431         ConvRegion.Top    += (ScreenInfo->
Window.Top + ConvAreaInfo->CaInfo.coordConView.Y);
01432         ConvRegion.Bottom += (ScreenInfo->
Window.Top + ConvAreaInfo->CaInfo.coordConView.Y);
01433 
01434 
01435         
01436         
if (ScreenInfo->
Flags & 
CONSOLE_GRAPHICS_BUFFER) {
01437             
ASSERT(FALSE);
01438         }
01439         
else
01440             ScreenInfo->
BufferInfo.TextInfo.Flags &= ~
TEXT_VALID_HINT;
01441         WriteConvRegionToScreen(ScreenInfo,
01442                                 ConvAreaInfo,
01443                                 &ConvRegion
01444                                );
01445         ConvAreaInfo->ScreenBuffer->BisectFlag &= ~(BISECT_LEFT | BISECT_RIGHT | BISECT_TOP | BISECT_BOTTOM);
01446     }
01447     
return Status;
01448 }
01449 
01450 
01451 
01452 
01453 
01454 
01455 
01456 
01457 
NTSTATUS
01458 ImeControl(
01459     IN 
PCONSOLE_INFORMATION Console,
01460     IN HWND hWndConsoleIME,
01461     IN PCOPYDATASTRUCT lParam
01462     )
01463 
01464 
01465 
01466 
01467 
01468 
01469 
01470 
01471 
01472 
01473 
01474 
01475 
01476 
01477 
01478 
01479 
01480 
01481 
01482 {
01483     
PSCREEN_INFORMATION ScreenInfo;
01484     PCONVERSIONAREA_INFORMATION ConvAreaInfo;
01485     PCHAR_INFO SystemString ;
01486     
DWORD i ;
01487     
DWORD j ;
01488 
01489     
if (lParam == 
NULL) {
01490         
01491         
return STATUS_SUCCESS;
01492     }
01493 
01494     ScreenInfo = Console->CurrentScreenBuffer;
01495     
switch ((LONG)lParam->dwData) {
01496         
case CI_CONIMECOMPOSITION:
01497             
if (lParam->cbData >= 
sizeof(
CONIME_UICOMPMESSAGE)) {
01498                 
LPCONIME_UICOMPMESSAGE CompStr;
01499 
01500                 
DBGPRINT((
"CONSRV: Get IR_CONIMECOMPOSITION Message\n"));
01501                 CompStr = (
LPCONIME_UICOMPMESSAGE)lParam->lpData;
01502                 
if (CompStr && CompStr->
dwSize == lParam->cbData) {
01503                     
if (Console->ConsoleIme.CompStrData)
01504                         
ConsoleHeapFree(Console->ConsoleIme.CompStrData);
01505                     Console->ConsoleIme.CompStrData = 
ConsoleHeapAlloc(
01506                                                                 
MAKE_TAG( IME_TAG ),
01507                                                                 CompStr->
dwSize);
01508                     
if (Console->ConsoleIme.CompStrData == 
NULL)
01509                         
break;
01510                     memmove(Console->ConsoleIme.CompStrData,CompStr,CompStr->
dwSize);
01511                     ConsoleImeCompStr(Console, Console->ConsoleIme.CompStrData);
01512                 }
01513             }
01514             
break;
01515         
case CI_CONIMEMODEINFO:
01516             
if (lParam->cbData == 
sizeof(
CONIME_UIMODEINFO)) {
01517                 
LPCONIME_UIMODEINFO lpModeInfo ;
01518 
01519                 
DBGPRINT((
"CONSRV: Get IR_CONIMEMODEINFO Message\n"));
01520 
01521                 lpModeInfo = (
LPCONIME_UIMODEINFO)lParam->lpData ;
01522                 
if (lpModeInfo != 
NULL) {
01523                     
if (! Console->InputBuffer.ImeMode.Disable) {
01524                         
if (lpModeInfo->
ModeStringLen != 0){
01525                             
for (j = 0 ; j < lpModeInfo->
ModeStringLen ; j++ )
01526                                 lpModeInfo->
ModeString[j].Attributes = Console->CurrentScreenBuffer->Attributes ;
01527                             Console->ConsoleIme.ConvAreaModePosition = lpModeInfo->
Position;
01528                             WriteModeSystemChars(Console,
01529                                                  Console->ConsoleIme.ConvAreaMode,
01530                                                  (PCHAR_INFO)&lpModeInfo->
ModeString,
01531                                                  lpModeInfo->
ModeStringLen,
01532                                                  Console->ConsoleIme.ConvAreaModePosition);
01533                         }
01534                         
else{
01535                             ConvAreaInfo = Console->ConsoleIme.ConvAreaMode;
01536                             
if (ConvAreaInfo &&
01537                                 (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
01538                                 FillUndetermineChars(Console,ConvAreaInfo);
01539                             }
01540                             ConvAreaInfo = Console->ConsoleIme.ConvAreaSystem ;
01541                             
if (ConvAreaInfo &&
01542                                 (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
01543                                 FillUndetermineChars(Console,ConvAreaInfo);
01544                             }
01545                         }
01546                     }
01547                 }
01548             }
01549             
break;
01550         
case CI_CONIMESYSINFO: {
01551             PWCHAR 
SourceString ;
01552 
01553             
DBGPRINT((
"CONSRV: Get IR_CONIMESYSINFO Message\n"));
01554 
01555             
if ((lParam->cbData != 0) &&
01556                 (lParam->lpData != 
NULL) &&
01557                 (! Console->InputBuffer.ImeMode.Disable)) {
01558                 i = (lParam->cbData / 
sizeof(WCHAR))-1 ;
01559                 
SourceString = ((
LPCONIME_UIMESSAGE)(lParam->lpData))->String ;
01560                 SystemString = (PCHAR_INFO)
ConsoleHeapAlloc(
01561                                                  
MAKE_TAG( IME_TAG ),
01562                                                  
sizeof(CHAR_INFO)*i) ;
01563                 
if (SystemString == 
NULL) {
01564                     
break ;
01565                 }
01566                 
for (j = 0 ; j < i ; j++ ) {
01567                     SystemString[j].Char.UnicodeChar = *
SourceString ;
01568                     SystemString[j].Attributes = Console->CurrentScreenBuffer->Attributes ;
01569                     
SourceString++ ;
01570                 }
01571                 WriteModeSystemChars(Console,
01572                                      Console->ConsoleIme.ConvAreaSystem,
01573                                      (PCHAR_INFO)SystemString,
01574                                      i,
01575                                      VIEW_LEFT);
01576                 
ConsoleHeapFree(SystemString);
01577             }
01578             
else {
01579                 ConvAreaInfo = Console->ConsoleIme.ConvAreaSystem ;
01580                 
if (ConvAreaInfo &&
01581                     (!(ConvAreaInfo->ConversionAreaMode & CA_HIDDEN))) {
01582                     FillUndetermineChars(Console,ConvAreaInfo);
01583                 }
01584             }
01585             
break;
01586         }
01587         
case CI_CONIMECANDINFO:{
01588             PWCHAR 
SourceString;
01589             PUCHAR SourceAttr;
01590             
DWORD LengthToWrite;
01591             
LPCONIME_CANDMESSAGE CandInfo = (
LPCONIME_CANDMESSAGE)(lParam->lpData);
01592 
01593             
DBGPRINT((
"CONSRV: Get IR_CONIMESYSINFO Message\n"));
01594 
01595             
if ((lParam->cbData != 0) &&
01596                 (CandInfo != 
NULL) ){
01597                 
SourceString = CandInfo->
String;
01598                 SourceAttr = (PUCHAR)((
PBYTE)CandInfo + CandInfo->
AttrOff);
01599                 LengthToWrite = lstrlenW(SourceString);
01600                 SystemString = (PCHAR_INFO)
ConsoleHeapAlloc(
01601                                                  
MAKE_TAG( IME_TAG ),
01602                                                  
sizeof(CHAR_INFO) * LengthToWrite);
01603                 
if (SystemString == 
NULL) {
01604                     
break ;
01605                 }
01606                 
for (j = 0 ; j < LengthToWrite ; j++ ) {
01607                     SystemString[j].Char.UnicodeChar = *
SourceString ;
01608                     
if (*SourceAttr == 1 &&
01609                         Console->ConsoleIme.CompStrData != 
NULL) {
01610                         SystemString[j].Attributes = Console->ConsoleIme.CompStrData->CompAttrColor[1];
01611                     }
01612                     
else {
01613                         SystemString[j].Attributes = Console->CurrentScreenBuffer->Attributes ;
01614                     }
01615                     
SourceString++ ;
01616                     SourceAttr++ ;
01617                 }
01618                 WriteModeSystemChars(Console,
01619                                      Console->ConsoleIme.ConvAreaSystem,
01620                                      (PCHAR_INFO)SystemString,
01621                                      LengthToWrite,
01622                                      VIEW_LEFT);
01623                 
ConsoleHeapFree(SystemString);
01624             }
01625             
else {
01626                 ConvAreaInfo = Console->ConsoleIme.ConvAreaSystem;
01627                 
if (ConvAreaInfo) {
01628                     SMALL_RECT rcViewCaWindow = {0, 0, 0, 0};
01629                     FillUndetermineChars(Console,ConvAreaInfo);
01630                     ConvAreaInfo->ConversionAreaMode |= CA_HIDDEN;
01631                     ConsoleImeWindowInfo(Console,ConvAreaInfo,rcViewCaWindow);
01632                 }
01633             }
01634             
break;
01635         }
01636         
case CI_CONIMEPROPERTYINFO:{
01637             WPARAM* wParam = (WPARAM*)(lParam->lpData);
01638 
01639             
if ((lParam->cbData != 0) &&
01640                 (wParam != 
NULL) ){
01641                 
switch (*wParam) {
01642                     
case IMS_OPENPROPERTYWINDOW:
01643                         Console->InputBuffer.hWndConsoleIME = hWndConsoleIME;
01644                         
break;
01645                     
case IMS_CLOSEPROPERTYWINDOW:
01646                         Console->InputBuffer.hWndConsoleIME = 
NULL;
01647                         
SetFocus(Console->hWnd);
01648                         
break;
01649                 }
01650             }
01651             
break;
01652         }
01653     }
01654 
01655     
return STATUS_SUCCESS;
01656 }
01657 
01658 
BOOL
01659 InsertConverTedString(
01660     IN 
PCONSOLE_INFORMATION Console,
01661     LPWSTR lpStr
01662     )
01663 {
01664     ULONG EventsWritten;
01665     PINPUT_RECORD InputEvent,TmpInputEvent;
01666     
DWORD dwControlKeyState;
01667     
DWORD dwLen;
01668     
DWORD dwConversion;
01669     
BOOL fResult = 
FALSE;
01670 
01671     
01672     
if (Console->CurrentScreenBuffer->Flags & 
CONSOLE_GRAPHICS_BUFFER) {
01673         
ASSERT(FALSE);
01674     }
01675     
else if(Console->CurrentScreenBuffer->BufferInfo.TextInfo.CursorOn){
01676         
CursorTimerRoutine(Console->CurrentScreenBuffer) ;
01677     }
01678 
01679     dwLen = wcslen(lpStr)+1;
01680     InputEvent = 
ConsoleHeapAlloc(
MAKE_TAG( IME_TAG ),
sizeof(INPUT_RECORD)*dwLen);
01681     
if (InputEvent == 
NULL) {
01682         
return FALSE;
01683     }
01684 
01685     TmpInputEvent = InputEvent;
01686     dwControlKeyState = 
GetControlKeyState(0);
01687 
01688     
if (!
NT_SUCCESS(GetImeKeyState(Console, &dwConversion))) {
01689         
goto skip_and_return;
01690     }
01691 
01692     dwControlKeyState |= 
ImmConversionToConsole(dwConversion);
01693 
01694     
while (*lpStr) {
01695         TmpInputEvent->EventType = KEY_EVENT;
01696         TmpInputEvent->Event.KeyEvent.bKeyDown = 
TRUE;
01697         TmpInputEvent->Event.KeyEvent.wVirtualKeyCode = 0;
01698         TmpInputEvent->Event.KeyEvent.wVirtualScanCode = 0;
01699         TmpInputEvent->Event.KeyEvent.dwControlKeyState = dwControlKeyState;
01700         TmpInputEvent->Event.KeyEvent.uChar.UnicodeChar = *lpStr++;
01701         TmpInputEvent->Event.KeyEvent.wRepeatCount = 1;
01702         TmpInputEvent++;
01703     }
01704 
01705     EventsWritten = 
WriteInputBuffer( Console,
01706                                       &Console->InputBuffer,
01707                                       InputEvent,
01708                                       dwLen-1
01709                                      );
01710 
01711     fResult = 
TRUE;
01712 
01713 skip_and_return:
01714     
ConsoleHeapFree(InputEvent);
01715     
return fResult;
01716 }
01717 
01718 
01719 
VOID
01720 SetUndetermineAttribute(
01721     IN 
PCONSOLE_INFORMATION Console
01722     )
01723 {
01724 
01725     
PSCREEN_INFORMATION ScreenInfo;
01726     PCONVERSIONAREA_INFORMATION ConvAreaInfo ;
01727 
01728     ScreenInfo = Console->CurrentScreenBuffer;
01729 
01730     ConvAreaInfo = Console->ConsoleIme.ConvAreaRoot ;
01731     
if (ConvAreaInfo != 
NULL) {
01732         
do {
01733             ConvAreaInfo->ScreenBuffer->
Attributes = ScreenInfo->
Attributes;
01734             ConvAreaInfo = ConvAreaInfo->ConvAreaNext ;
01735         } 
while (ConvAreaInfo != 
NULL);
01736     }
01737 
01738     
if (Console->ConsoleIme.ConvAreaMode != 
NULL)
01739         Console->ConsoleIme.ConvAreaMode->ScreenBuffer->Attributes = ScreenInfo->
Attributes;
01740 
01741     
if (Console->ConsoleIme.ConvAreaSystem != 
NULL)
01742         Console->ConsoleIme.ConvAreaSystem->ScreenBuffer->Attributes = ScreenInfo->
Attributes;
01743 }
01744 
01745 
01746 
VOID
01747 StreamWriteToScreenBufferIME(
01748     IN PWCHAR String,
01749     IN SHORT StringLength,
01750     IN 
PSCREEN_INFORMATION ScreenInfo,
01751     IN PCHAR StringA
01752     )
01753 {
01754     
SHORT RowIndex;
01755     
PROW Row;
01756     PWCHAR Char;
01757     COORD TargetPoint;
01758 
01759     
DBGOUTPUT((
"StreamWriteToScreenBuffer\n"));
01760 
01761     
01762     
ASSERT(!(ScreenInfo->Flags & CONSOLE_GRAPHICS_BUFFER));
01763 
01764     ScreenInfo->BufferInfo.TextInfo.Flags |= 
TEXT_VALID_HINT;
01765     TargetPoint = ScreenInfo->BufferInfo.TextInfo.CursorPosition;
01766     RowIndex = (ScreenInfo->BufferInfo.TextInfo.FirstRow+TargetPoint.Y) % ScreenInfo->ScreenBufferSize.Y;
01767     Row = &ScreenInfo->BufferInfo.TextInfo.Rows[RowIndex];
01768     
DBGOUTPUT((
"RowIndex = %lx, Row = %lx, TargetPoint = (%d,%d)\n",
01769             RowIndex, Row, TargetPoint.X, TargetPoint.Y));
01770 
01771     
01772     
01773     
01774 
01775 
01776     
BisectWrite(StringLength,TargetPoint,ScreenInfo);
01777     
if (TargetPoint.Y == ScreenInfo->ScreenBufferSize.Y-1 &&
01778         TargetPoint.X+
StringLength >= ScreenInfo->ScreenBufferSize.X &&
01779         *(StringA+ScreenInfo->ScreenBufferSize.X-TargetPoint.X-1) & ATTR_LEADING_BYTE
01780        ) {
01781         *(
String+ScreenInfo->ScreenBufferSize.X-TargetPoint.X-1) = 
UNICODE_SPACE;
01782         *(StringA+ScreenInfo->ScreenBufferSize.X-TargetPoint.X-1) = 0;
01783         
if (
StringLength > ScreenInfo->ScreenBufferSize.X-TargetPoint.X-1) {
01784             *(
String+ScreenInfo->ScreenBufferSize.X-TargetPoint.X) = 
UNICODE_SPACE;
01785             *(StringA+ScreenInfo->ScreenBufferSize.X-TargetPoint.X) = 0;
01786         }
01787     }
01788 
01789     RtlCopyMemory(&Row->
CharRow.
Chars[TargetPoint.X],String,StringLength*
sizeof(WCHAR));
01790 
01791     RtlCopyMemory(&Row->
CharRow.KAttrs[TargetPoint.X],StringA,StringLength*
sizeof(CHAR));
01792 
01793 
01794     
01795 
01796     Row->
CharRow.
OldLeft = Row->
CharRow.
Left;
01797     
if (TargetPoint.X < Row->
CharRow.
Left) {
01798 
01799         
01800 
01801 
01802 
01803         PWCHAR LastChar = &Row->
CharRow.
Chars[ScreenInfo->ScreenBufferSize.X-1];
01804 
01805 
01806 
01807 
01808         
for (Char=&Row->
CharRow.
Chars[TargetPoint.X];Char < LastChar && *Char==(WCHAR)
' ';Char++)
01809             ;
01810         Row->
CharRow.
Left = (
SHORT)(Char-Row->
CharRow.
Chars);
01811     }
01812 
01813     Row->
CharRow.
OldRight = Row->
CharRow.
Right;
01814     
if ((TargetPoint.X+
StringLength) >= Row->
CharRow.
Right) {
01815         PWCHAR FirstChar = Row->
CharRow.
Chars;
01816 
01817         
for (Char=&Row->
CharRow.
Chars[TargetPoint.X+
StringLength-1];*Char==(WCHAR)
' ' && Char >= FirstChar;Char--)
01818             ;
01819         Row->
CharRow.
Right = (
SHORT)(Char+1-FirstChar);
01820     }
01821 
01822     
01823     
01824     
01825     
01826 
01827     
if (Row->
AttrRow.
Length != 1 ||
01828         Row->
AttrRow.
Attrs->
Attr != ScreenInfo->Attributes) {
01829         
PATTR_PAIR NewAttrs;
01830         WORD NewAttrsLength;
01831         
ATTR_PAIR Attrs;
01832 
01833 
01834         
if ((ScreenInfo->Attributes & (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_RVERTICAL)) ==
01835             (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_RVERTICAL)){
01836             
SHORT i ;
01837             
for (i = 0 ; i < 
StringLength ; i++ ) {
01838                 Attrs.
Length = 1 ;
01839                 
if (*(StringA + i) & ATTR_LEADING_BYTE)
01840                     Attrs.
Attr = ScreenInfo->Attributes & ~(COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_RVERTICAL) ;
01841                 
else
01842                     Attrs.
Attr = ScreenInfo->Attributes & ~COMMON_LVB_GRID_SINGLEFLAG ;
01843 
01844                 
if (!
NT_SUCCESS(
MergeAttrStrings(Row->
AttrRow.
Attrs,
01845                                  Row->
AttrRow.
Length,
01846                                  &Attrs,
01847                                  1,
01848                                  &NewAttrs,
01849                                  &NewAttrsLength,
01850                                  (SHORT)(TargetPoint.X+i),
01851                                  (SHORT)(TargetPoint.X+i),
01852                                  Row,
01853                                  ScreenInfo
01854                                 ))) {
01855                     
return;
01856                 }
01857                 
if (Row->
AttrRow.
Length > 1) {
01858                     
ConsoleHeapFree(Row->
AttrRow.
Attrs);
01859                 }
01860                 
else {
01861                     
ASSERT(Row->
AttrRow.
Attrs == &Row->
AttrRow.
AttrPair);
01862                 }
01863                 Row->
AttrRow.
Attrs = NewAttrs;
01864                 Row->
AttrRow.
Length = NewAttrsLength;
01865             }
01866             Row->
CharRow.
OldLeft = 
INVALID_OLD_LENGTH;
01867             Row->
CharRow.
OldRight = 
INVALID_OLD_LENGTH;
01868         }
01869         
else if ((ScreenInfo->Attributes & (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_LVERTICAL)) ==
01870             (COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_LVERTICAL)){
01871             
SHORT i ;
01872             
for (i = 0 ; i < 
StringLength ; i++ ) {
01873                 Attrs.
Length = 1 ;
01874                 
if (*(StringA + i) & ATTR_TRAILING_BYTE)
01875                     Attrs.
Attr = ScreenInfo->Attributes & ~(COMMON_LVB_GRID_SINGLEFLAG + COMMON_LVB_GRID_LVERTICAL);
01876                 
else
01877                     Attrs.
Attr = ScreenInfo->Attributes & ~COMMON_LVB_GRID_SINGLEFLAG ;
01878 
01879                 
if (!
NT_SUCCESS(
MergeAttrStrings(Row->
AttrRow.
Attrs,
01880                                  Row->
AttrRow.
Length,
01881                                  &Attrs,
01882                                  1,
01883                                  &NewAttrs,
01884                                  &NewAttrsLength,
01885                                  (SHORT)(TargetPoint.X+i),
01886                                  (SHORT)(TargetPoint.X+i),
01887                                  Row,
01888                                  ScreenInfo
01889                                 ))) {
01890                     
return;
01891                 }
01892                 
if (Row->
AttrRow.
Length > 1) {
01893                     
ConsoleHeapFree(Row->
AttrRow.
Attrs);
01894                 }
01895                 
else {
01896                     
ASSERT(Row->
AttrRow.
Attrs == &Row->
AttrRow.
AttrPair);
01897                 }
01898                 Row->
AttrRow.
Attrs = NewAttrs;
01899                 Row->
AttrRow.
Length = NewAttrsLength;
01900             }
01901             Row->
CharRow.
OldLeft = 
INVALID_OLD_LENGTH;
01902             Row->
CharRow.
OldRight = 
INVALID_OLD_LENGTH;
01903         }
01904         
else{
01905 
01906         Attrs.
Length = 
StringLength;
01907         Attrs.
Attr = ScreenInfo->Attributes;
01908         
if (!
NT_SUCCESS(
MergeAttrStrings(Row->
AttrRow.
Attrs,
01909                          Row->
AttrRow.
Length,
01910                          &Attrs,
01911                          1,
01912                          &NewAttrs,
01913                          &NewAttrsLength,
01914                          TargetPoint.X,
01915                          (SHORT)(TargetPoint.X+StringLength-1),
01916                          Row,
01917                          ScreenInfo
01918                         ))) {
01919             
return;
01920         }
01921         
if (Row->
AttrRow.
Length > 1) {
01922             
ConsoleHeapFree(Row->
AttrRow.
Attrs);
01923         }
01924         
else {
01925             
ASSERT(Row->
AttrRow.
Attrs == &Row->
AttrRow.
AttrPair);
01926         }
01927         Row->
AttrRow.
Attrs = NewAttrs;
01928         Row->
AttrRow.
Length = NewAttrsLength;
01929         Row->
CharRow.
OldLeft = 
INVALID_OLD_LENGTH;
01930         Row->
CharRow.
OldRight = 
INVALID_OLD_LENGTH;
01931 
01932     }
01933 
01934     }
01935     
ResetTextFlags(ScreenInfo,TargetPoint.Y,TargetPoint.Y);
01936 }
01937 
01938 
#endif // FE_IME