ReactOS  0.4.15-dev-509-g96a357b
settings.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Console Server DLL
4  * FILE: win32ss/user/winsrv/consrv/settings.c
5  * PURPOSE: Console settings management
6  * PROGRAMMERS: Johannes Anderwald
7  * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 /* INCLUDES *******************************************************************/
11 
12 #include "consrv.h"
13 #include "history.h"
14 #include "../concfg/font.h"
15 
16 #define NDEBUG
17 #include <debug.h>
18 
19 /* GLOBALS ********************************************************************/
20 
21 extern const COLORREF s_Colors[16];
22 
23 
24 /* FUNCTIONS ******************************************************************/
25 
29  IN USHORT NewScreenAttrib,
30  IN USHORT NewPopupAttrib);
31 /*
32  * NOTE: This function explicitly references Console->ActiveBuffer.
33  * It is possible that it should go into some frontend...
34  */
35 VOID
39 {
40  PCONSOLE_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer;
41 
42  /*
43  * Apply terminal-edition settings:
44  * - QuickEdit and Insert modes,
45  * - History settings.
46  */
47  Console->QuickEdit = !!ConsoleInfo->QuickEdit;
48  Console->InsertMode = !!ConsoleInfo->InsertMode;
51  ConsoleInfo->HistoryBufferSize,
52  ConsoleInfo->NumberOfHistoryBuffers,
53  ConsoleInfo->HistoryNoDup);
54 
55  /* Copy the new console palette */
56  // FIXME: Possible buffer overflow if s_colors is bigger than ConsoleInfo->ColorTable.
57  RtlCopyMemory(Console->Colors, ConsoleInfo->ColorTable, sizeof(s_Colors));
58 
59  /* Apply cursor size */
60  ActiveBuffer->CursorInfo.bVisible = (ConsoleInfo->CursorSize != 0);
61  ActiveBuffer->CursorInfo.dwSize = min(max(ConsoleInfo->CursorSize, 0), 100);
62 
63  /* Update the code page */
64  if ((Console->OutputCodePage != ConsoleInfo->CodePage) &&
65  IsValidCodePage(ConsoleInfo->CodePage))
66  {
67  Console->InputCodePage = Console->OutputCodePage = ConsoleInfo->CodePage;
68  // ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, TRUE); // Output
69  // ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, FALSE); // Input
70 
71  Console->IsCJK = IsCJKCodePage(Console->OutputCodePage);
72  }
73 
74  // FIXME: Check ConsoleInfo->WindowSize with respect to
75  // TermGetLargestConsoleWindowSize(...).
76 
77  if (GetType(ActiveBuffer) == TEXTMODE_BUFFER)
78  {
79  /* Resize its active screen-buffer */
81  COORD BufSize = ConsoleInfo->ScreenBufferSize;
82 
83  if (Console->FixedSize)
84  {
85  /*
86  * The console is in fixed-size mode, so we cannot resize anything
87  * at the moment. However, keep those settings somewhere so that
88  * we can try to set them up when we will be allowed to do so.
89  */
90  if (ConsoleInfo->WindowSize.X != ActiveBuffer->OldViewSize.X ||
91  ConsoleInfo->WindowSize.Y != ActiveBuffer->OldViewSize.Y)
92  {
93  ActiveBuffer->OldViewSize = ConsoleInfo->WindowSize;
94  }
95 
96  /* The buffer size is not allowed to be smaller than the view size */
97  if (BufSize.X >= ActiveBuffer->OldViewSize.X && BufSize.Y >= ActiveBuffer->OldViewSize.Y)
98  {
99  if (BufSize.X != ActiveBuffer->OldScreenBufferSize.X ||
100  BufSize.Y != ActiveBuffer->OldScreenBufferSize.Y)
101  {
102  /*
103  * The console is in fixed-size mode, so we cannot resize anything
104  * at the moment. However, keep those settings somewhere so that
105  * we can try to set them up when we will be allowed to do so.
106  */
107  ActiveBuffer->OldScreenBufferSize = BufSize;
108  }
109  }
110  }
111  else
112  {
113  BOOL SizeChanged = FALSE;
114 
115  /* Resize the console */
116  if (ConsoleInfo->WindowSize.X != ActiveBuffer->ViewSize.X ||
117  ConsoleInfo->WindowSize.Y != ActiveBuffer->ViewSize.Y)
118  {
119  ActiveBuffer->ViewSize = ConsoleInfo->WindowSize;
120  SizeChanged = TRUE;
121  }
122 
123  /* Resize the screen-buffer */
124  if (BufSize.X != ActiveBuffer->ScreenBufferSize.X ||
125  BufSize.Y != ActiveBuffer->ScreenBufferSize.Y)
126  {
128  SizeChanged = TRUE;
129  }
130 
131  if (SizeChanged) TermResizeTerminal(Console);
132  }
133 
134  /* Apply foreground and background colors for both screen and popup */
136  Buffer,
137  ConsoleInfo->ScreenAttributes,
138  ConsoleInfo->PopupAttributes);
139  }
140  else // if (GetType(ActiveBuffer) == GRAPHICS_BUFFER)
141  {
142  /*
143  * In any case we do NOT modify the size of the graphics screen-buffer.
144  * We just allow resizing the view only if the new size is smaller
145  * than the older one.
146  */
147  if (Console->FixedSize)
148  {
149  /*
150  * The console is in fixed-size mode, so we cannot resize anything
151  * at the moment. However, keep those settings somewhere so that
152  * we can try to set them up when we will be allowed to do so.
153  */
154  if (ConsoleInfo->WindowSize.X <= ActiveBuffer->ViewSize.X ||
155  ConsoleInfo->WindowSize.Y <= ActiveBuffer->ViewSize.Y)
156  {
157  ActiveBuffer->OldViewSize = ConsoleInfo->WindowSize;
158  }
159  }
160  else
161  {
162  /* Resize the view if its size is bigger than the specified size */
163  if (ConsoleInfo->WindowSize.X <= ActiveBuffer->ViewSize.X ||
164  ConsoleInfo->WindowSize.Y <= ActiveBuffer->ViewSize.Y)
165  {
166  ActiveBuffer->ViewSize = ConsoleInfo->WindowSize;
167  // SizeChanged = TRUE;
168  }
169  }
170  }
171 }
172 
173 /* EOF */
#define IN
Definition: typedefs.h:39
#define max(a, b)
Definition: svc.c:63
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
const COLORREF s_Colors[16]
Definition: conwnd.c:98
LONG NTSTATUS
Definition: precomp.h:26
#define TermResizeTerminal(Console)
Definition: term.h:28
COORD OldScreenBufferSize
Definition: conio.h:65
#define IsCJKCodePage(CodePage)
Definition: font.h:23
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
COORD ScreenBufferSize
Definition: conio.h:62
unsigned int BOOL
Definition: ntddk_ex.h:94
Definition: bufpool.h:45
#define BufSize
Definition: FsRtlTunnel.c:28
ULONG X
Definition: bl.h:1340
VOID HistoryReshapeAllBuffers(IN PCONSRV_CONSOLE Console, IN ULONG HistoryBufferSize, IN ULONG MaxNumberOfHistoryBuffers, IN BOOLEAN HistoryNoDup)
Definition: history.c:371
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
DWORD COLORREF
Definition: windef.h:300
NTSTATUS NTAPI ConDrvChangeScreenBufferAttributes(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN USHORT NewScreenAttrib, IN USHORT NewPopupAttrib)
Definition: text.c:497
INT GetType(BOOL bLocal, LPOSVERSIONINFOEX osvi, LPSERVER_INFO_102 pBuf102)
Definition: gettype.c:129
Definition: bl.h:1338
BOOL WINAPI IsValidCodePage(UINT CodePage)
Definition: nls.c:1479
NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size)
Definition: text.c:359
unsigned short USHORT
Definition: pedump.c:61
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: video.c:47
VOID ConSrvApplyUserSettings(IN PCONSRV_CONSOLE Console, IN PCONSOLE_STATE_INFO ConsoleInfo)
Definition: settings.c:36
#define min(a, b)
Definition: monoChain.cc:55
CConsole Console
CONSOLE_CURSOR_INFO CursorInfo
Definition: conio.h:75
ULONG Y
Definition: bl.h:1341
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER