diff --git a/reactos/subsystems/win32/csrss/win32csr/conio.c b/reactos/subsystems/win32/csrss/win32csr/conio.c index e00858bf7f4..6361ed2269f 100644 --- a/reactos/subsystems/win32/csrss/win32csr/conio.c +++ b/reactos/subsystems/win32/csrss/win32csr/conio.c @@ -126,8 +126,6 @@ CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console, { ClearLineBuffer(Buffer); } - Buffer->CursorInfo.bVisible = TRUE; - Buffer->CursorInfo.dwSize = 5; Buffer->Mode = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; Buffer->CurrentX = 0; Buffer->CurrentY = 0; @@ -158,8 +156,6 @@ CsrInitConsole(PCSRSS_CONSOLE Console) Console->EarlyReturn = FALSE; Console->ActiveBuffer = NULL; InitializeListHead(&Console->InputEvents); - InitializeListHead(&Console->ProcessList); - Console->CodePage = GetOEMCP(); Console->OutputCodePage = GetOEMCP(); @@ -180,6 +176,9 @@ CsrInitConsole(PCSRSS_CONSOLE Console) /* allocate console screen buffer */ NewBuffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER)); + /* init screen buffer with defaults */ + NewBuffer->CursorInfo.bVisible = TRUE; + NewBuffer->CursorInfo.dwSize = 5; /* make console active, and insert into console list */ Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer; /* add a reference count because the buffer is tied to the console */ @@ -275,14 +274,17 @@ CSR_API(CsrAllocConsole) { /* Allocate a console structure */ NewConsole = TRUE; - Console = HeapAlloc(Win32CsrApiHeap, 0, sizeof(CSRSS_CONSOLE)); + Console = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_CONSOLE)); if (NULL == Console) { DPRINT1("Not enough memory for console\n"); Request->Status = STATUS_NO_MEMORY; return STATUS_NO_MEMORY; } - + /* initialize list head */ + InitializeListHead(&Console->ProcessList); + /* insert process data required for GUI initialization */ + InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry); /* Initialize the Console */ Request->Status = CsrInitConsole(Console); if (!NT_SUCCESS(Request->Status)) @@ -361,10 +363,12 @@ CSR_API(CsrAllocConsole) ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher; DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher); - /* Insert into the list */ -//////////////////////////// - InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry); -/////////////////////////// + if (!NewConsole) + { + /* Insert into the list if it has not been added */ + InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry); + } + return STATUS_SUCCESS; } @@ -372,7 +376,6 @@ CSR_API(CsrFreeConsole) { PCSRSS_CONSOLE Console; - DPRINT("CsrFreeConsole\n"); Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); @@ -388,7 +391,6 @@ CSR_API(CsrFreeConsole) { ConioDeleteConsole((Object_t *) Console); } - return STATUS_SUCCESS; } @@ -1999,7 +2001,8 @@ CSR_API(CsrGetCursorInfo) { return Request->Status = Status; } - Request->Data.GetCursorInfoRequest.Info = Buff->CursorInfo; + Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible; + Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize; ConioUnlockScreenBuffer(Buff); return Request->Status = STATUS_SUCCESS; @@ -2220,13 +2223,24 @@ CSR_API(CsrCreateScreenBuffer) { Buff->MaxX = Console->ActiveBuffer->MaxX; Buff->MaxY = Console->ActiveBuffer->MaxY; + Buff->CursorInfo.bVisible = Console->ActiveBuffer->CursorInfo.bVisible; + Buff->CursorInfo.dwSize = Console->ActiveBuffer->CursorInfo.dwSize; + } + else + { + Buff->CursorInfo.bVisible = TRUE; + Buff->CursorInfo.dwSize = 5; } if (Buff->MaxX == 0) - Buff->MaxX = 80; + { + Buff->MaxX = 80; + } if (Buff->MaxY == 0) - Buff->MaxY = 25; + { + Buff->MaxY = 25; + } Status = CsrInitConsoleScreenBuffer(Console, Buff); if(! NT_SUCCESS(Status)) @@ -3308,7 +3322,7 @@ CSR_API(CsrGetProcessList) current_entry = current_entry->Flink) { current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); - if(nItems++ < Request->Data.GetProcessListRequest.nMaxIds) + if(++nItems < Request->Data.GetProcessListRequest.nMaxIds) { *(Buffer++) = current->ProcessId; nCopied++; diff --git a/reactos/subsystems/win32/csrss/win32csr/en.rc b/reactos/subsystems/win32/csrss/win32csr/en.rc index d3474c1417f..dc0ac6c0dc2 100644 --- a/reactos/subsystems/win32/csrss/win32csr/en.rc +++ b/reactos/subsystems/win32/csrss/win32csr/en.rc @@ -38,4 +38,11 @@ BEGIN IDS_FIND "Find..." IDS_DEFAULTS "Defaults" IDS_PROPERTIES "Properties" + IDS_SCROLLHERE "Scroll Here" + IDS_SCROLLTOP "Scroll Top" + IDS_SCROLLBOTTOM "Scroll Bottom" + IDS_SCROLLPAGE_UP "Page Up" + IDS_SCROLLPAGE_DOWN "Page Down" + IDS_SCROLLUP "Scroll Up" + IDS_SCROLLDOWN "Scroll Down" END diff --git a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c index 5a078c93e00..2ddda23bae3 100644 --- a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c @@ -32,14 +32,26 @@ typedef struct GUI_CONSOLE_DATA_TAG BOOL MouseDown; HMODULE ConsoleLibrary; HANDLE hGuiInitEvent; + HWND hVScrollBar; + HWND hHScrollBar; WCHAR FontName[LF_FACESIZE]; DWORD FontSize; DWORD FontWeight; - DWORD CursorSize; DWORD HistoryNoDup; DWORD FullScreen; DWORD QuickEdit; DWORD InsertMode; + DWORD NumberOfHistoryBuffers; + DWORD HistoryBufferSize; + DWORD WindowPosition; + DWORD ScreenBufferSize; + DWORD UseRasterFonts; + COLORREF ScreenText; + COLORREF ScreenBackground; + COLORREF PopupBackground; + COLORREF PopupText; + COLORREF Colors[16]; + WCHAR szProcessName[MAX_PATH]; } GUI_CONSOLE_DATA, *PGUI_CONSOLE_DATA; #ifndef WM_APP @@ -49,6 +61,7 @@ typedef struct GUI_CONSOLE_DATA_TAG #define PM_DESTROY_CONSOLE (WM_APP + 2) #define CURSOR_BLINK_TIME 500 +#define DEFAULT_ATTRIB (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY) static BOOL ConsInitialized = FALSE; static HWND NotifyWnd; @@ -82,6 +95,26 @@ static const GUICONSOLE_MENUITEM GuiConsoleMainMenuItems[] = { 0, NULL, 0 } /* End of list */ }; +static const COLORREF s_Colors[] = +{ + RGB(0, 0, 0), + RGB(0, 0, 128), + RGB(0, 128, 0), + RGB(0, 128, 128), + RGB(128, 0, 0), + RGB(128, 0, 128), + RGB(128, 128, 0), + RGB(192, 192, 192), + RGB(128, 128, 128), + RGB(0, 0, 255), + RGB(0, 255, 0), + RGB(0, 255, 255), + RGB(255, 0, 0), + RGB(255, 0, 255), + RGB(255, 255, 0), + RGB(255, 255, 255) +}; + /* FUNCTIONS *****************************************************************/ static VOID FASTCALL @@ -215,7 +248,7 @@ GuiConsoleOpenUserRegistryPathPerProcessId(DWORD ProcessId, PHANDLE hProcHandle, } static BOOL FASTCALL -GuiConsoleOpenUserSettings(HWND hWnd, DWORD ProcessId, PHKEY hSubKey, REGSAM samDesired) +GuiConsoleOpenUserSettings(PGUI_CONSOLE_DATA GuiData, DWORD ProcessId, PHKEY hSubKey, REGSAM samDesired, BOOL bCreate) { WCHAR szProcessName[MAX_PATH]; WCHAR szBuffer[MAX_PATH]; @@ -224,9 +257,7 @@ GuiConsoleOpenUserSettings(HWND hWnd, DWORD ProcessId, PHKEY hSubKey, REGSAM sam WCHAR CurDrive[] = { 'A',':', 0 }; HANDLE hProcess; HKEY hKey; - WCHAR * ptr, *res; - static const WCHAR szSystemRoot[] = { '%','S','y','s','t','e','m','R','o','o','t','%', 0 }; - + WCHAR * ptr; /* * console properties are stored under @@ -243,21 +274,42 @@ GuiConsoleOpenUserSettings(HWND hWnd, DWORD ProcessId, PHKEY hSubKey, REGSAM sam * i.e. %SystemRoot%_system32_cmd.exe */ - if (!GuiConsoleOpenUserRegistryPathPerProcessId(ProcessId, &hProcess, &hKey, samDesired)) - return FALSE; + DPRINT("GuiConsoleOpenUserSettings entered\n"); - fLength = GetProcessImageFileNameW(hProcess, szProcessName, MAX_PATH); + if (!GuiConsoleOpenUserRegistryPathPerProcessId(ProcessId, &hProcess, &hKey, samDesired)) + { + DPRINT("GuiConsoleOpenUserRegistryPathPerProcessId failed\n"); + return FALSE; + } + + fLength = GetProcessImageFileNameW(hProcess, szProcessName, sizeof(GuiData->szProcessName) / sizeof(WCHAR)); CloseHandle(hProcess); if (!fLength) { - DPRINT1("GetProcessImageFileNameW failed(0x%x)ProcessId %d\n", GetLastError(),hProcess); - return FALSE; + DPRINT("GetProcessImageFileNameW failed(0x%x)ProcessId %d\n", GetLastError(),hProcess); + return FALSE; } - + /* + * try the process name as path + */ ptr = wcsrchr(szProcessName, L'\\'); + wcscpy(GuiData->szProcessName, ptr); + swprintf(szBuffer, L"Console%s",ptr); + DPRINT("#1 Path : %S\n", szBuffer); + + if (bCreate) + { + if (RegCreateKeyW(hKey, szBuffer, hSubKey) == ERROR_SUCCESS) + { + RegCloseKey(hKey); + return TRUE; + } + RegCloseKey(hKey); + return FALSE; + } if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) { @@ -265,50 +317,179 @@ GuiConsoleOpenUserSettings(HWND hWnd, DWORD ProcessId, PHKEY hSubKey, REGSAM sam return TRUE; } - dwBitmask = GetLogicalDrives(); - while(dwBitmask) - { - if (dwBitmask & 0x1) - { - dwLength = QueryDosDeviceW(CurDrive, szBuffer, MAX_PATH); - if (dwLength) - { - if (!memcmp(szBuffer, szProcessName, (dwLength-2)*sizeof(WCHAR))) - { - wcscpy(szBuffer, CurDrive); - wcscat(&szBuffer[(sizeof(CurDrive)/sizeof(WCHAR))-1], &szProcessName[dwLength-2]); - break; - } - } - } - dwBitmask = (dwBitmask >> 1); - CurDrive[0]++; - } - - wLength = GetWindowsDirectoryW(szProcessName, MAX_PATH); + /* + * try the "Shortcut to processname" as path + * FIXME: detect wheter the process was started as a shortcut + */ - if (!wcsncmp(szProcessName, szBuffer, wLength)) - { - wcscpy(szProcessName, szSystemRoot); - wcscpy(&szProcessName[(sizeof(szSystemRoot) / sizeof(WCHAR))-1], &szBuffer[wLength]); - ptr = res = szProcessName; - } - else - { - ptr = res = szBuffer; - } - - while((ptr = wcschr(szProcessName, L'\\'))) - ptr[0] = L'_'; - - if (RegOpenKeyExW(hKey, res, 0, samDesired, hSubKey) == ERROR_SUCCESS) + swprintf(szBuffer, L"Console\\Shortcut to %S", ptr); + DPRINT("#2 Path : %S\n", szBuffer); + if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) { + swprintf(GuiData->szProcessName, L"Shortcut to %S", ptr); RegCloseKey(hKey); return TRUE; } + + /* + * if the path contains \\Device\\HarddiskVolume1\... remove it + */ + + if (szProcessName[0] == L'\\') + { + dwBitmask = GetLogicalDrives(); + while(dwBitmask) + { + if (dwBitmask & 0x1) + { + dwLength = QueryDosDeviceW(CurDrive, szBuffer, MAX_PATH); + if (dwLength) + { + if (!memcmp(szBuffer, szProcessName, (dwLength-2)*sizeof(WCHAR))) + { + wcscpy(szProcessName, CurDrive); + RtlMoveMemory(&szProcessName[2], &szProcessName[dwLength-1], fLength - dwLength -1); + break; + } + } + } + dwBitmask = (dwBitmask >> 1); + CurDrive[0]++; + } + } + + /* + * last attempt: check whether the file is under %SystemRoot% + * and use path like Console\%SystemRoot%_dir_dir2_file.exe + */ + + wLength = GetWindowsDirectoryW(szBuffer, MAX_PATH); + if (wLength) + { + if (!wcsncmp(szProcessName, szBuffer, wLength)) + { + /* replace slashes by underscores */ + while((ptr = wcschr(szProcessName, L'\\'))) + ptr[0] = L'_'; + + swprintf(szBuffer, L"Console\\\%SystemRoot\%%S", &szProcessName[wLength]); + DPRINT("#3 Path : %S\n", szBuffer); + if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) + { + swprintf(GuiData->szProcessName, L"\%SystemRoot\%%S", &szProcessName[wLength]); + RegCloseKey(hKey); + return TRUE; + } + } + } RegCloseKey(hKey); return FALSE; } + +static VOID +GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData) +{ + HKEY hKey; + PCSRSS_PROCESS_DATA ProcessData; + + if (Console->ProcessList.Flink == &Console->ProcessList) + { + DPRINT("GuiConsoleWriteUserSettings: No Process!!!\n"); + return; + } + ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); + if (!GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ | KEY_WRITE, TRUE)) + { + return; + } + + if (Console->ActiveBuffer->CursorInfo.dwSize <= 1) + { + RegDeleteKeyW(hKey, L"CursorSize"); + } + else + { + RegSetValueExW(hKey, L"CursorSize", 0, REG_DWORD, (const BYTE *)&Console->ActiveBuffer->CursorInfo.dwSize, sizeof(DWORD)); + } + + if (GuiData->NumberOfHistoryBuffers == 5) + { + RegDeleteKeyW(hKey, L"NumberOfHistoryBuffers"); + } + else + { + RegSetValueExW(hKey, L"NumberOfHistoryBuffers", 0, REG_DWORD, (const BYTE *)&GuiData->NumberOfHistoryBuffers, sizeof(DWORD)); + } + + if (GuiData->HistoryBufferSize == 50) + { + RegDeleteKeyW(hKey, L"HistoryBufferSize"); + } + else + { + RegSetValueExW(hKey, L"HistoryBufferSize", 0, REG_DWORD, (const BYTE *)&GuiData->HistoryBufferSize, sizeof(DWORD)); + } + + if (GuiData->FullScreen == FALSE) + { + RegDeleteKeyW(hKey, L"FullScreen"); + } + else + { + RegSetValueExW(hKey, L"FullScreen", 0, REG_DWORD, (const BYTE *)&GuiData->FullScreen, sizeof(DWORD)); + } + + if ( GuiData->QuickEdit == FALSE) + { + RegDeleteKeyW(hKey, L"QuickEdit"); + } + else + { + RegSetValueExW(hKey, L"QuickEdit", 0, REG_DWORD, (const BYTE *)&GuiData->QuickEdit, sizeof(DWORD)); + } + + if (GuiData->InsertMode == TRUE) + { + RegDeleteKeyW(hKey, L"InsertMode"); + } + else + { + RegSetValueExW(hKey, L"InsertMode", 0, REG_DWORD, (const BYTE *)&GuiData->InsertMode, sizeof(DWORD)); + } + + if (GuiData->HistoryNoDup == FALSE) + { + RegDeleteKeyW(hKey, L"HistoryNoDup"); + } + else + { + RegSetValueExW(hKey, L"HistoryNoDup", 0, REG_DWORD, (const BYTE *)&GuiData->HistoryNoDup, sizeof(DWORD)); + } + + if (GuiData->ScreenText == RGB(192, 192, 192)) + { + /* + * MS uses console attributes instead of real color + */ + RegDeleteKeyW(hKey, L"ScreenText"); + } + else + { + RegSetValueExW(hKey, L"ScreenText", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenText, sizeof(COLORREF)); + } + + if (GuiData->ScreenBackground == RGB(0, 0, 0)) + { + RegDeleteKeyW(hKey, L"ScreenBackground"); + } + else + { + RegSetValueExW(hKey, L"ScreenBackground", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenBackground, sizeof(COLORREF)); + } + + RegCloseKey(hKey); +} + static void FASTCALL GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer) { @@ -321,7 +502,13 @@ GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA WCHAR szValue[MAX_PATH]; DWORD Value; - RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwNumSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwNumSubKeys, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + { + DPRINT("GuiConsoleReadUserSettings: RegQueryInfoKey failed\n"); + return; + } + + DPRINT("GuiConsoleReadUserSettings entered dwNumSubKeys %d\n", dwNumSubKeys); for (dwIndex = 0; dwIndex < dwNumSubKeys; dwIndex++) { @@ -343,13 +530,24 @@ GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA else break; } - if (!wcscmp(szValueName, L"CursorSize")) { if (Value == 0x32) - GuiData->CursorSize = Value; + { + Buffer->CursorInfo.dwSize = Value; + } else if (Value == 0x64) - GuiData->CursorSize = Value; + { + Buffer->CursorInfo.dwSize = Value; + } + } + else if (!wcscmp(szValueName, L"ScreenText")) + { + GuiData->ScreenText = Value; + } + else if (!wcscmp(szValueName, L"ScreenBackground")) + { + GuiData->ScreenBackground = Value; } else if (!wcscmp(szValueName, L"FaceName")) { @@ -374,11 +572,11 @@ GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA } else if (!wcscmp(szValueName, L"ScreenBufferSize")) { - if( Buffer) - { - Buffer->MaxX = LOWORD(Value); - Buffer->MaxY = HIWORD(Value); - } + if(Buffer) + { + Buffer->MaxX = LOWORD(Value); + Buffer->MaxY = HIWORD(Value); + } } else if (!wcscmp(szValueName, L"FullScreen")) { @@ -404,20 +602,31 @@ GuiConsoleUseDefaults(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_ wcscpy(GuiData->FontName, L"Bitstream Vera Sans Mono"); GuiData->FontSize = 0x0008000C; // font is 8x12 GuiData->FontWeight = FW_NORMAL; - GuiData->CursorSize = 0; GuiData->HistoryNoDup = FALSE; GuiData->FullScreen = FALSE; GuiData->QuickEdit = FALSE; GuiData->InsertMode = TRUE; + GuiData->HistoryBufferSize = 50; + GuiData->NumberOfHistoryBuffers = 5; + GuiData->ScreenText = RGB(192, 192, 192); + GuiData->ScreenBackground = RGB(0, 0, 0); + GuiData->PopupText = RGB(128, 0, 128); + GuiData->PopupBackground = RGB(255, 255, 255); + GuiData->WindowPosition = UINT_MAX; + GuiData->ScreenBufferSize = MAKELONG(80, 300); //FIXME + GuiData->UseRasterFonts = TRUE; + memcpy(GuiData->Colors, s_Colors, sizeof(s_Colors)); Console->Size.X = 80; Console->Size.Y = 25; if (Buffer) - { - Buffer->MaxX = 80; - Buffer->MaxY = 25; - } + { + Buffer->MaxX = 80; + Buffer->MaxY = 25; + Buffer->CursorInfo.bVisible = TRUE; + Buffer->CursorInfo.dwSize = 5; + } } @@ -446,7 +655,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) if (Console->ProcessList.Flink != &Console->ProcessList) { ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); - if (GuiConsoleOpenUserSettings(hWnd, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ)) + if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ, FALSE)) { GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer); RegCloseKey(hKey); @@ -528,9 +737,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) Rect.bottom - Rect.top, FALSE); SetTimer(hWnd, 1, CURSOR_BLINK_TIME, NULL); - SetEvent(GuiData->hGuiInitEvent); - GuiConsoleCreateSysMenu(Console); + SetEvent(GuiData->hGuiInitEvent); return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create); } @@ -546,10 +754,18 @@ GuiConsoleRGBFromAttribute(BYTE Attribute) } static VOID FASTCALL -GuiConsoleSetTextColors(HDC Dc, BYTE Attribute) +GuiConsoleSetTextColors(HDC Dc, BYTE Attribute, PCSRSS_SCREEN_BUFFER Buff, COLORREF TextColor, COLORREF BkColor) { - SetTextColor(Dc, GuiConsoleRGBFromAttribute(Attribute & 0x0f)); - SetBkColor(Dc, GuiConsoleRGBFromAttribute((Attribute & 0xf0) >> 4)); + if (Attribute != Buff->DefaultAttrib) + { + SetTextColor(Dc, GuiConsoleRGBFromAttribute(Attribute & 0x0f)); + SetBkColor(Dc, GuiConsoleRGBFromAttribute((Attribute & 0xf0) >> 4)); + } + else + { + SetTextColor(Dc, TextColor); + SetBkColor(Dc, BkColor); + } } static VOID FASTCALL @@ -656,7 +872,10 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, LastAttribute = Buff->Buffer[(TopLine * Buff->MaxX + LeftChar) * 2 + 1]; GuiConsoleSetTextColors(hDC, - LastAttribute); + LastAttribute, + Buff, + GuiData->ScreenText, + GuiData->ScreenBackground); EnterCriticalSection(&Buff->Header.Lock); @@ -692,7 +911,10 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, if (Attribute != LastAttribute) { GuiConsoleSetTextColors(hDC, - Attribute); + Attribute, + Buff, + GuiData->ScreenText, + GuiData->ScreenBackground); LastAttribute = Attribute; } } @@ -729,7 +951,16 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, CursorHeight = 1; } From = Buff->Buffer + (Buff->CurrentY * Buff->MaxX + Buff->CurrentX) * 2 + 1; - CursorBrush = CreateSolidBrush(GuiConsoleRGBFromAttribute(*From)); + + if (*From != DEFAULT_ATTRIB) + { + CursorBrush = CreateSolidBrush(GuiConsoleRGBFromAttribute(*From)); + } + else + { + CursorBrush = CreateSolidBrush(GuiData->ScreenText); + } + OldBrush = SelectObject(hDC, CursorBrush); PatBlt(hDC, @@ -1026,6 +1257,7 @@ GuiConsoleHandleNcDestroy(HWND hWnd) PCSRSS_CONSOLE Console; PGUI_CONSOLE_DATA GuiData; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); KillTimer(hWnd, 1); Console->PrivateData = NULL; @@ -1176,25 +1408,29 @@ GuiConsoleRightMouseDown(HWND hWnd) } + static VOID -GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults) +GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiData) { PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; APPLET_PROC CPLFunc; TCHAR szBuffer[MAX_PATH]; + ConsoleInfo SharedInfo; + + DPRINT("GuiConsoleShowConsoleProperties entered\n"); GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); if (GuiData == NULL) - { - DPRINT1("GuiConsoleGetDataPointers failed\n"); - return; - } + { + DPRINT("GuiConsoleGetDataPointers failed\n"); + return; + } + if (GuiData->ConsoleLibrary == NULL) { - GetWindowsDirectory(szBuffer,MAX_PATH); - _tcscat(szBuffer, _T("\\system32\\console.dll")); + GetWindowsDirectory(szBuffer,MAX_PATH); + _tcscat(szBuffer, _T("\\system32\\console.dll")); GuiData->ConsoleLibrary = LoadLibrary(szBuffer); if (GuiData->ConsoleLibrary == NULL) @@ -1206,39 +1442,47 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults) CPLFunc = (APPLET_PROC) GetProcAddress(GuiData->ConsoleLibrary, _T("CPlApplet")); if (!CPLFunc) - { - DPRINT("Error: Console.dll misses CPlApplet export\n"); - return; - } + { + DPRINT("Error: Console.dll misses CPlApplet export\n"); + return; + } + /* setup struct */ + SharedInfo.InsertMode = GuiData->InsertMode; + SharedInfo.HistoryBufferSize = GuiData->HistoryBufferSize; + SharedInfo.NumberOfHistoryBuffers = GuiData->NumberOfHistoryBuffers; + SharedInfo.ScreenText = GuiData->ScreenText; + SharedInfo.ScreenBackground = GuiData->ScreenBackground; + SharedInfo.PopupText = GuiData->PopupText; + SharedInfo.PopupBackground = GuiData->PopupBackground; + SharedInfo.WindowSize = (DWORD)MAKELONG(Console->Size.X, Console->Size.Y); + SharedInfo.WindowPosition = GuiData->WindowPosition; + SharedInfo.ScreenBuffer = GuiData->ScreenBufferSize; + SharedInfo.UseRasterFonts = GuiData->UseRasterFonts; + SharedInfo.FontSize = (DWORD)GuiData->FontSize; + SharedInfo.FontWeight = GuiData->FontWeight; + SharedInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize; + SharedInfo.HistoryNoDup = GuiData->HistoryNoDup; + SharedInfo.FullScreen = GuiData->FullScreen; + SharedInfo.QuickEdit = GuiData->QuickEdit; + memcpy(&SharedInfo.Colors[0], GuiData->Colors, sizeof(s_Colors)); + if (!CPLFunc(hWnd, CPL_INIT, 0, 0)) - { - DPRINT("Error: failed to initialize console.dll\n"); - return; - } + { + DPRINT("Error: failed to initialize console.dll\n"); + return; + } if (CPLFunc(hWnd, CPL_GETCOUNT, 0, 0) != 1) - { - DPRINT("Error: console.dll returned unexpected CPL count\n"); - return; - } + { + DPRINT("Error: console.dll returned unexpected CPL count\n"); + return; + } - CPLFunc(hWnd, CPL_DBLCLK, 0, Defaults); - - // TODO - // - // read back the changes from console.dll - // - // if the changes are system-wide then - // console.dll should have written it to - // registry - // - // if the changes only apply to this session - // then exchange this info with console.dll in - // some private way + CPLFunc(hWnd, CPL_DBLCLK, (LPARAM)&SharedInfo, Defaults); } static BOOL FASTCALL -GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam) +GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, PGUI_CONSOLE_DATA GuiData) { BOOL Ret = TRUE; @@ -1253,11 +1497,11 @@ GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam) break; case ID_SYSTEM_DEFAULTS: - GuiConsoleShowConsoleProperties(hWnd, TRUE); + GuiConsoleShowConsoleProperties(hWnd, TRUE, GuiData); break; case ID_SYSTEM_PROPERTIES: - GuiConsoleShowConsoleProperties(hWnd, FALSE); + GuiConsoleShowConsoleProperties(hWnd, FALSE, GuiData); break; default: @@ -1268,10 +1512,161 @@ GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam) return Ret; } +static VOID FASTCALL +GuiConsoleResize(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED) + { + DPRINT1("GuiConsoleResize X %d Y %d\n", LOWORD(lParam), HIWORD(lParam)); + } +} + +VOID FASTCALL +GuiConsoleCreateScrollBar(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, HWND NewWindow) +{ + HMENU hMenu; + HWND hVScrollBar; + HWND hHScrollBar; + SCROLLINFO sInfo; + + hMenu = CreatePopupMenu(); + if (hMenu == NULL) + { + 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); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLBOTTOM); + //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_UP); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_DOWN); + //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); + //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 +GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsoleInfo pConInfo) +{ + DWORD windx, windy; + RECT rect; + + /* apply text / background color */ + GuiData->ScreenText = pConInfo->ScreenText; + GuiData->ScreenBackground = pConInfo->ScreenBackground; + + /* apply cursor size */ + Console->ActiveBuffer->CursorInfo.dwSize = max(min(pConInfo->CursorSize, 1), 100); + + windx = LOWORD(pConInfo->ScreenBuffer); + windy = HIWORD(pConInfo->ScreenBuffer); + + if (windx != Console->ActiveBuffer->MaxX || windy != Console->ActiveBuffer->MaxY) + { + // + // TODO + // resize screen buffer + + + // Console->ActiveBuffer->MaxX = windx; + // Console->ActiveBuffer->MaxY = windy; + } + + windx = LOWORD(pConInfo->WindowSize); + windy = HIWORD(pConInfo->WindowSize); + + if (windx != Console->Size.X || windy != Console->Size.Y) + { + /* 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 < Console->ActiveBuffer->MaxX) + { + /* show scrollbar when window becomes smaller than active screen buffer */ + //ShowScrollBar(GuiData->hHScrollBar, SB_CTL, TRUE); + } + else + { + /* hide scrollbar */ + //ShowScrollBar(GuiData->hHScrollBar, SB_CTL, FALSE); + } + } + /* repaint window */ + InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE); +} + static LRESULT CALLBACK GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT Result = 0; + PGUI_CONSOLE_DATA GuiData = NULL; + PCSRSS_CONSOLE Console = NULL; + + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); switch(msg) { @@ -1309,10 +1704,20 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_MOUSEMOVE: GuiConsoleMouseMove(hWnd, wParam, lParam); break; - case WM_SYSCOMMAND: - if (!GuiConsoleHandleSysMenuCommand(hWnd, wParam)) + case WM_SYSCOMMAND: + if (!GuiConsoleHandleSysMenuCommand(hWnd, wParam, GuiData)) Result = DefWindowProcW(hWnd, msg, wParam, lParam); break; + case WM_SIZE: + GuiConsoleResize(hWnd, wParam, lParam); + break; + case PM_APPLY_CONSOLE_INFO: + GuiApplyUserSettings(Console, GuiData, (PConsoleInfo)wParam); + if (lParam) + { + GuiConsoleWriteUserSettings(Console, GuiData); + } + break; default: Result = DefWindowProcW(hWnd, msg, wParam, lParam); break; @@ -1352,7 +1757,7 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) } NewWindow = CreateWindowW(L"ConsoleWindowClass", Title, - WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, // | WS_HSCROLL | WS_VSCROLL, + WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, //WS_OVERLAPPEDWINDOW CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, @@ -1367,8 +1772,8 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) } if (NULL != NewWindow) { - //ShowScrollBar(NewWindow, SB_VERT, FALSE); - //ShowScrollBar(NewWindow, SB_HORZ, FALSE); + // scrollbar support + //GuiConsoleCreateScrollBar(Console, (PGUI_CONSOLE_DATA)Console->PrivateData, NewWindow); SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1); ShowWindow(NewWindow, SW_SHOW); } @@ -1489,7 +1894,7 @@ GuiInit(VOID) static VOID STDCALL GuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer) { - Buffer->DefaultAttrib = 0x0f; + Buffer->DefaultAttrib = DEFAULT_ATTRIB; } static BOOL STDCALL diff --git a/reactos/subsystems/win32/csrss/win32csr/resource.h b/reactos/subsystems/win32/csrss/win32csr/resource.h index 5ab16353d4d..f5491fa0091 100644 --- a/reactos/subsystems/win32/csrss/win32csr/resource.h +++ b/reactos/subsystems/win32/csrss/win32csr/resource.h @@ -36,6 +36,15 @@ #define IDS_DEFAULTS 211 #define IDS_PROPERTIES 212 +//scrollbar resource ids +#define IDS_SCROLLHERE 304 +#define IDS_SCROLLTOP 305 +#define IDS_SCROLLBOTTOM 306 +#define IDS_SCROLLPAGE_UP 307 +#define IDS_SCROLLPAGE_DOWN 308 +#define IDS_SCROLLUP 309 +#define IDS_SCROLLDOWN 310 + #endif /* WIN32CSR_RESOURCE_H_INCLUDED */ diff --git a/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c b/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c index 42811803974..e7401f7bbb4 100644 --- a/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c @@ -48,7 +48,7 @@ TuiInit(VOID) static VOID STDCALL TuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer) { - Buffer->DefaultAttrib = 0x17; + Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE; } static void FASTCALL diff --git a/reactos/subsystems/win32/csrss/win32csr/w32csr.h b/reactos/subsystems/win32/csrss/win32csr/w32csr.h index 39a6ca1e19d..150f866ad32 100644 --- a/reactos/subsystems/win32/csrss/win32csr/w32csr.h +++ b/reactos/subsystems/win32/csrss/win32csr/w32csr.h @@ -27,4 +27,6 @@ #include "resource.h" +/* shared header with console.dll */ +#include "console.h" /* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild index ad463f681a6..20cf2bf1e0d 100644 --- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -4,6 +4,7 @@ include include/reactos/subsys include/reactos/drivers + . 0x0501