- halfplement console scrolling support

svn path=/trunk/; revision=28796
This commit is contained in:
Johannes Anderwald 2007-09-03 03:29:18 +00:00
parent 574eb2daac
commit 89628d18b4

View file

@ -634,7 +634,35 @@ GuiConsoleUseDefaults(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_
}
}
VOID
FASTCALL
GuiConsoleInitScrollbar(PCSRSS_CONSOLE Console, HWND hwnd)
{
SCROLLINFO sInfo;
/* set scrollbar sizes */
sInfo.cbSize = sizeof(SCROLLINFO);
sInfo.fMask = SIF_RANGE | 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)
{
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);
}
else
{
ShowScrollBar(hwnd, SB_HORZ, FALSE);
}
}
static BOOL FASTCALL
GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
@ -743,6 +771,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL);
GuiConsoleCreateSysMenu(Console);
GuiConsoleInitScrollbar(Console, hWnd);
SetEvent(GuiData->hGuiInitEvent);
return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create);
@ -1532,14 +1561,11 @@ GuiConsoleResize(HWND hWnd, WPARAM wParam, LPARAM lParam)
DPRINT1("GuiConsoleResize X %d Y %d\n", LOWORD(lParam), HIWORD(lParam));
}
}
VOID FASTCALL
GuiConsoleCreateScrollBar(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, HWND NewWindow)
VOID
FASTCALL
GuiConsoleHandleScrollbarMenu()
{
HMENU hMenu;
HWND hVScrollBar;
HWND hHScrollBar;
SCROLLINFO sInfo;
hMenu = CreatePopupMenu();
if (hMenu == NULL)
@ -1547,7 +1573,6 @@ GuiConsoleCreateScrollBar(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, HWN
DPRINT("CreatePopupMenu failed\n");
return;
}
//InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLHERE);
//InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1);
//InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLTOP);
@ -1559,54 +1584,6 @@ GuiConsoleCreateScrollBar(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, HWN
//InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLUP);
//InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLDOWN);
hVScrollBar = CreateWindowExW(0L,
L"ScrollBar",
(LPWSTR)NULL,
WS_CHILD | WS_VSCROLL,
0,
0,
200,
50,
NewWindow,
NULL, //hMenu,
GetModuleHandleW(NULL),
(LPVOID)GuiData);
if (hVScrollBar)
{
/* set scrollbar sizes */
sInfo.cbSize = sizeof(SCROLLINFO);
sInfo.fMask = SIF_RANGE | SIF_POS;
sInfo.nMin = 0;
sInfo.nMax = Console->ActiveBuffer->MaxY;
sInfo.nPos = 0;
SetScrollInfo(hVScrollBar, SB_CTL, &sInfo, TRUE);
ShowScrollBar(NewWindow, SB_CTL, TRUE);
GuiData->hVScrollBar = hVScrollBar;
}
if (Console->ActiveBuffer->MaxX > Console->Size.X)
{
hHScrollBar = CreateWindowExW(0L,
L"ScrollBar",
(LPWSTR)NULL,
WS_CHILD | WS_HSCROLL,
0,
0,
200,
CW_USEDEFAULT,
NewWindow,
hMenu,
GetModuleHandleW(NULL),
(LPVOID)GuiData);
if (hHScrollBar)
{
sInfo.nMax = Console->ActiveBuffer->MaxX;
SetScrollInfo(hHScrollBar, SB_CTL, &sInfo, TRUE);
GuiData->hHScrollBar = hHScrollBar;
}
}
}
static VOID FASTCALL
@ -1751,12 +1728,12 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
if (Console->Size.X < Console->ActiveBuffer->MaxX)
{
/* show scrollbar when window becomes smaller than active screen buffer */
//ShowScrollBar(GuiData->hHScrollBar, SB_CTL, TRUE);
ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, TRUE);
}
else
{
/* hide scrollbar */
//ShowScrollBar(GuiData->hHScrollBar, SB_CTL, FALSE);
ShowScrollBar(pConInfo->hConsoleWindow, SB_CTL, FALSE);
}
}
if (ProcessData)
@ -1766,6 +1743,94 @@ GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsole
InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE);
}
static
LRESULT
GuiConsoleHandleScroll(HWND hwnd, UINT uMsg, WPARAM wParam)
{
SCROLLINFO sInfo;
int old_pos;
/* set scrollbar sizes */
sInfo.cbSize = sizeof(SCROLLINFO);
sInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE | SIF_TRACKPOS;
if (!GetScrollInfo(hwnd,
(uMsg == WM_HSCROLL ? SB_HORZ : SB_VERT),
&sInfo))
{
return FALSE;
}
old_pos = sInfo.nPos;
switch(LOWORD(wParam))
{
case SB_LINELEFT:
sInfo.nPos -= 1;
break;
case SB_LINERIGHT:
sInfo.nPos += 1;
break;
case SB_PAGELEFT:
sInfo.nPos -= sInfo.nPage;
break;
case SB_PAGERIGHT:
sInfo.nPos += sInfo.nPage;
break;
case SB_THUMBTRACK:
sInfo.nPage = sInfo.nTrackPos;
break;
case SB_TOP:
sInfo.nPos = sInfo.nMin;
break;
case SB_BOTTOM:
sInfo.nPos = sInfo.nMax;
break;
break;
default:
break;
}
sInfo.fMask = SIF_POS;
sInfo.cbSize = sizeof(SCROLLINFO);
SetScrollInfo(hwnd,
(uMsg == WM_HSCROLL ? SB_HORZ : SB_VERT),
&sInfo,
TRUE);
sInfo.cbSize = sizeof(SCROLLINFO);
sInfo.fMask = SIF_POS;
if (!GetScrollInfo(hwnd,
(uMsg == WM_HSCROLL ? SB_HORZ : SB_VERT),
&sInfo))
{
return 0;
}
if (old_pos != sInfo.nPos)
{
///
/// fixme scroll window
///
// ScrollWindow
//UpdateWindow(hwnd);
}
return 0;
}
static LRESULT CALLBACK
GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
@ -1814,6 +1879,10 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_SYSCOMMAND:
Result = GuiConsoleHandleSysMenuCommand(hWnd, wParam, lParam, GuiData);
break;
case WM_HSCROLL:
case WM_VSCROLL:
Result = GuiConsoleHandleScroll(hWnd, msg, wParam);
break;
case WM_SIZE:
GuiConsoleResize(hWnd, wParam, lParam);
break;
@ -1863,7 +1932,7 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
}
NewWindow = CreateWindowW(L"ConsoleWindowClass",
Title,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, //WS_OVERLAPPEDWINDOW
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_HSCROLL | WS_VSCROLL, //WS_OVERLAPPEDWINDOW
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
@ -1878,8 +1947,6 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
}
if (NULL != NewWindow)
{
// scrollbar support
//GuiConsoleCreateScrollBar(Console, (PGUI_CONSOLE_DATA)Console->PrivateData, NewWindow);
SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1);
ShowWindow(NewWindow, SW_SHOW);
}