NTSTATUS NTAPI ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN PCOORD Size) { NTSTATUS Status; if (Console == NULL || Buffer == NULL || Size == NULL) return STATUS_INVALID_PARAMETER; /* Validity check */ ASSERT(Console == Buffer->Header.Console); Status = ConioResizeBuffer(Console, Buffer, *Size); if (NT_SUCCESS(Status)) TermResizeTerminal(Console); return Status; }
VOID ConSrvApplyUserSettings(IN PCONSOLE Console, IN PCONSOLE_INFO ConsoleInfo) { PCONSOLE_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer; /* * Apply terminal-edition settings: * - QuickEdit and Insert modes, * - history settings. */ Console->QuickEdit = ConsoleInfo->QuickEdit; Console->InsertMode = ConsoleInfo->InsertMode; /* * Apply foreground and background colors for both screen and popup * and copy the new palette. */ if (GetType(ActiveBuffer) == TEXTMODE_BUFFER) { PTEXTMODE_SCREEN_BUFFER Buffer = (PTEXTMODE_SCREEN_BUFFER)ActiveBuffer; Buffer->ScreenDefaultAttrib = ConsoleInfo->ScreenAttrib; Buffer->PopupDefaultAttrib = ConsoleInfo->PopupAttrib; } else // if (Console->ActiveBuffer->Header.Type == GRAPHICS_BUFFER) { } // FIXME: Possible buffer overflow if s_colors is bigger than pConInfo->Colors. memcpy(Console->Colors, ConsoleInfo->Colors, sizeof(s_Colors)); // TODO: Really update the screen attributes as FillConsoleOutputAttribute does. /* Apply cursor size */ ActiveBuffer->CursorInfo.bVisible = (ConsoleInfo->CursorSize != 0); ActiveBuffer->CursorInfo.dwSize = min(max(ConsoleInfo->CursorSize, 0), 100); if (GetType(ActiveBuffer) == TEXTMODE_BUFFER) { PTEXTMODE_SCREEN_BUFFER Buffer = (PTEXTMODE_SCREEN_BUFFER)ActiveBuffer; COORD BufSize; /* Resize its active screen-buffer */ BufSize = ConsoleInfo->ScreenBufferSize; if (Console->FixedSize) { /* * The console is in fixed-size mode, so we cannot resize anything * at the moment. However, keep those settings somewhere so that * we can try to set them up when we will be allowed to do so. */ if (ConsoleInfo->ConsoleSize.X != Buffer->OldViewSize.X || ConsoleInfo->ConsoleSize.Y != Buffer->OldViewSize.Y) { Buffer->OldViewSize = ConsoleInfo->ConsoleSize; } /* Buffer size is not allowed to be smaller than the view size */ if (BufSize.X >= Buffer->OldViewSize.X && BufSize.Y >= Buffer->OldViewSize.Y) { if (BufSize.X != Buffer->OldScreenBufferSize.X || BufSize.Y != Buffer->OldScreenBufferSize.Y) { /* * The console is in fixed-size mode, so we cannot resize anything * at the moment. However, keep those settings somewhere so that * we can try to set them up when we will be allowed to do so. */ Buffer->OldScreenBufferSize = BufSize; } } } else { BOOL SizeChanged = FALSE; /* Resize the console */ if (ConsoleInfo->ConsoleSize.X != Buffer->ViewSize.X || ConsoleInfo->ConsoleSize.Y != Buffer->ViewSize.Y) { Buffer->ViewSize = ConsoleInfo->ConsoleSize; SizeChanged = TRUE; } /* Resize the screen-buffer */ if (BufSize.X != Buffer->ScreenBufferSize.X || BufSize.Y != Buffer->ScreenBufferSize.Y) { if (NT_SUCCESS(ConioResizeBuffer(Console, Buffer, BufSize))) SizeChanged = TRUE; } if (SizeChanged) ConioResizeTerminal(Console); } } else // if (GetType(ActiveBuffer) == GRAPHICS_BUFFER) { PGRAPHICS_SCREEN_BUFFER Buffer = (PGRAPHICS_SCREEN_BUFFER)ActiveBuffer; /* * In any case we do NOT modify the size of the graphics screen-buffer. * We just allow resizing the view only if the new size is smaller * than the older one. */ if (Console->FixedSize) { /* * The console is in fixed-size mode, so we cannot resize anything * at the moment. However, keep those settings somewhere so that * we can try to set them up when we will be allowed to do so. */ if (ConsoleInfo->ConsoleSize.X <= Buffer->ViewSize.X || ConsoleInfo->ConsoleSize.Y <= Buffer->ViewSize.Y) { Buffer->OldViewSize = ConsoleInfo->ConsoleSize; } } else { /* Resize the view if its size is bigger than the specified size */ if (ConsoleInfo->ConsoleSize.X <= Buffer->ViewSize.X || ConsoleInfo->ConsoleSize.Y <= Buffer->ViewSize.Y) { Buffer->ViewSize = ConsoleInfo->ConsoleSize; // SizeChanged = TRUE; } } } }