mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
- GuiConsoleInitScrollbar: Hide vertical scrollbar when not needed; use SB_VERT (not SB_HORZ) to set its information when it is; set sInfo.nPage according to window size in characters; calculate window pixel size, taking scrollbar width/height into account.
- GuiConsoleHandleNcCreate: Remove window sizing (now done in GuiConsoleInitScrollbar) - GuiApplyUserSettings: Swap transposed min/max in cursor size calculation; don't assume that the physical top of the buffer is the same as the logical top; fix broken code where HAVE_WMEMSET isn't defined (wrong loop counts, Offset wasn't incremented); fix typo in calculating height difference. If either buffer or window size has changed, call GuiConsoleInitScrollbar. svn path=/trunk/; revision=34911
This commit is contained in:
parent
7c5414460f
commit
83f07a8e37
1 changed files with 52 additions and 57 deletions
|
@ -641,35 +641,50 @@ FASTCALL
|
|||
GuiConsoleInitScrollbar(PCSRSS_CONSOLE Console, HWND hwnd)
|
||||
{
|
||||
SCROLLINFO sInfo;
|
||||
PGUI_CONSOLE_DATA GuiData = Console->PrivateData;
|
||||
|
||||
DWORD Width = Console->Size.X * GuiData->CharWidth + 2 * GetSystemMetrics(SM_CXFIXEDFRAME);
|
||||
DWORD Height = Console->Size.Y * GuiData->CharHeight + 2 * GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION);
|
||||
|
||||
/* set scrollbar sizes */
|
||||
sInfo.cbSize = sizeof(SCROLLINFO);
|
||||
sInfo.fMask = SIF_RANGE | SIF_POS;
|
||||
sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
|
||||
sInfo.nMin = 0;
|
||||
sInfo.nMax = Console->ActiveBuffer->MaxY;
|
||||
sInfo.nPos = 0;
|
||||
SetScrollInfo(hwnd, SB_HORZ, &sInfo, TRUE);
|
||||
ShowScrollBar(hwnd, SB_VERT, TRUE);
|
||||
|
||||
if (Console->ActiveBuffer->MaxX > Console->Size.X)
|
||||
if (Console->ActiveBuffer->MaxY > Console->Size.Y)
|
||||
{
|
||||
sInfo.cbSize = sizeof(SCROLLINFO);
|
||||
sInfo.fMask = SIF_RANGE | SIF_POS;
|
||||
sInfo.nMin = 0;
|
||||
sInfo.nPos = 0;
|
||||
sInfo.nMax = Console->ActiveBuffer->MaxX;
|
||||
SetScrollInfo(hwnd, SB_HORZ, &sInfo, TRUE);
|
||||
sInfo.nMax = Console->ActiveBuffer->MaxY - 1;
|
||||
sInfo.nPage = Console->Size.Y;
|
||||
sInfo.nPos = Console->ActiveBuffer->ShowY;
|
||||
SetScrollInfo(hwnd, SB_VERT, &sInfo, TRUE);
|
||||
Width += GetSystemMetrics(SM_CXVSCROLL);
|
||||
ShowScrollBar(hwnd, SB_VERT, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowScrollBar(hwnd, SB_HORZ, FALSE);
|
||||
ShowScrollBar(hwnd, SB_VERT, FALSE);
|
||||
}
|
||||
|
||||
if (Console->ActiveBuffer->MaxX > Console->Size.X)
|
||||
{
|
||||
sInfo.nMax = Console->ActiveBuffer->MaxX - 1;
|
||||
sInfo.nPage = Console->Size.X;
|
||||
sInfo.nPos = Console->ActiveBuffer->ShowX;
|
||||
SetScrollInfo(hwnd, SB_HORZ, &sInfo, TRUE);
|
||||
Height += GetSystemMetrics(SM_CYHSCROLL);
|
||||
ShowScrollBar(hwnd, SB_HORZ, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowScrollBar(hwnd, SB_HORZ, FALSE);
|
||||
}
|
||||
|
||||
SetWindowPos(hwnd, NULL, 0, 0, Width, Height,
|
||||
SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
|
||||
}
|
||||
|
||||
static BOOL FASTCALL
|
||||
GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
||||
{
|
||||
RECT Rect;
|
||||
PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Create->lpCreateParams;
|
||||
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Console->PrivateData;
|
||||
HDC Dc;
|
||||
|
@ -763,14 +778,6 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
|||
Console->PrivateData = GuiData;
|
||||
SetWindowLongPtrW(hWnd, GWL_USERDATA, (DWORD_PTR) Console);
|
||||
|
||||
GetWindowRect(hWnd, &Rect);
|
||||
Rect.right = Rect.left + Console->Size.X * GuiData->CharWidth +
|
||||
2 * GetSystemMetrics(SM_CXFIXEDFRAME);
|
||||
Rect.bottom = Rect.top + Console->Size.Y * GuiData->CharHeight +
|
||||
2 * GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION);
|
||||
MoveWindow(hWnd, Rect.left, Rect.top, Rect.right - Rect.left,
|
||||
Rect.bottom - Rect.top, FALSE);
|
||||
|
||||
SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL);
|
||||
GuiConsoleCreateSysMenu(Console);
|
||||
GuiConsoleInitScrollbar(Console, hWnd);
|
||||
|
@ -1551,8 +1558,8 @@ static VOID FASTCALL
|
|||
GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsoleInfo pConInfo)
|
||||
{
|
||||
DWORD windx, windy;
|
||||
RECT rect;
|
||||
PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
|
||||
BOOL SizeChanged = FALSE;
|
||||
|
||||
EnterCriticalSection(&ActiveBuffer->Header.Lock);
|
||||
|
||||
|
@ -1561,7 +1568,7 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
GuiData->ScreenBackground = pConInfo->ScreenBackground;
|
||||
|
||||
/* apply cursor size */
|
||||
ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100);
|
||||
ActiveBuffer->CursorInfo.dwSize = min(max(pConInfo->CursorSize, 1), 100);
|
||||
|
||||
windx = LOWORD(pConInfo->ScreenBuffer);
|
||||
windy = HIWORD(pConInfo->ScreenBuffer);
|
||||
|
@ -1573,7 +1580,7 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
if (Buffer)
|
||||
{
|
||||
DWORD Offset = 0;
|
||||
DWORD BufferOffset = 0;
|
||||
BYTE * OldPtr;
|
||||
USHORT CurrentY;
|
||||
BYTE * OldBuffer;
|
||||
USHORT value;
|
||||
|
@ -1587,17 +1594,17 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
|
||||
for (CurrentY = 0; CurrentY < min(ActiveBuffer->MaxY, windy); CurrentY++)
|
||||
{
|
||||
OldPtr = ConioCoordToPointer(ActiveBuffer, 0, CurrentY);
|
||||
if (windx <= ActiveBuffer->MaxX)
|
||||
{
|
||||
/* reduce size */
|
||||
RtlCopyMemory(&Buffer[Offset], &OldBuffer[BufferOffset], windx * 2);
|
||||
RtlCopyMemory(&Buffer[Offset], OldPtr, windx * 2);
|
||||
Offset += (windx * 2);
|
||||
BufferOffset += (ActiveBuffer->MaxX * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* enlarge size */
|
||||
RtlCopyMemory(&Buffer[Offset], &OldBuffer[BufferOffset], ActiveBuffer->MaxX * 2);
|
||||
RtlCopyMemory(&Buffer[Offset], OldPtr, ActiveBuffer->MaxX * 2);
|
||||
Offset += (ActiveBuffer->MaxX * 2);
|
||||
|
||||
diff = windx - ActiveBuffer->MaxX;
|
||||
|
@ -1605,27 +1612,25 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
#if HAVE_WMEMSET
|
||||
wmemset((WCHAR*)&Buffer[Offset], value, diff);
|
||||
#else
|
||||
for (i = 0; i < diff * 2; i++)
|
||||
for (i = 0; i < diff; i++)
|
||||
{
|
||||
Buffer[Offset * 2] = ' ';
|
||||
Buffer[Offset * 2 + 1] = ActiveBuffer->DefaultAttrib;
|
||||
Buffer[Offset++] = ' ';
|
||||
Buffer[Offset++] = ActiveBuffer->DefaultAttrib;
|
||||
}
|
||||
#endif
|
||||
Offset += (diff * 2);
|
||||
BufferOffset += (ActiveBuffer->MaxX * 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (windy > ActiveBuffer->MaxY)
|
||||
{
|
||||
diff = windy - ActiveBuffer->MaxX;
|
||||
diff = windy - ActiveBuffer->MaxY;
|
||||
#if HAVE_WMEMSET
|
||||
wmemset((WCHAR*)&Buffer[Offset], value, diff * windx);
|
||||
#else
|
||||
for (i = 0; i < diff * 2; i++)
|
||||
for (i = 0; i < diff * windx; i++)
|
||||
{
|
||||
Buffer[Offset * 2] = ' ';
|
||||
Buffer[Offset * 2 + 1] = ActiveBuffer->DefaultAttrib;
|
||||
Buffer[Offset++] = ' ';
|
||||
Buffer[Offset++] = ActiveBuffer->DefaultAttrib;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1634,7 +1639,8 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
HeapFree(Win32CsrApiHeap, 0, OldBuffer);
|
||||
ActiveBuffer->MaxX = windx;
|
||||
ActiveBuffer->MaxY = windy;
|
||||
InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE);
|
||||
ActiveBuffer->VirtualY = 0;
|
||||
SizeChanged = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1667,25 +1673,14 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
|
|||
/* resize window */
|
||||
Console->Size.X = windx;
|
||||
Console->Size.Y = windy;
|
||||
|
||||
GetWindowRect(pConInfo->hConsoleWindow, &rect);
|
||||
|
||||
rect.right = rect.left + Console->Size.X * GuiData->CharWidth + 2 * GetSystemMetrics(SM_CXFIXEDFRAME);
|
||||
rect.bottom = rect.top + Console->Size.Y * GuiData->CharHeight + 2 * GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION);
|
||||
|
||||
MoveWindow(pConInfo->hConsoleWindow, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, FALSE);
|
||||
|
||||
if (Console->Size.X < ActiveBuffer->MaxX)
|
||||
{
|
||||
/* show scrollbar when window becomes smaller than active screen buffer */
|
||||
ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* hide scrollbar */
|
||||
ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, FALSE);
|
||||
}
|
||||
SizeChanged = TRUE;
|
||||
}
|
||||
|
||||
if (SizeChanged)
|
||||
{
|
||||
GuiConsoleInitScrollbar(Console, pConInfo->hConsoleWindow);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&ActiveBuffer->Header.Lock);
|
||||
InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue