xref: /reactos/win32ss/user/winsrv/consrv/settings.c (revision cdf90707)
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 
26 NTSTATUS NTAPI
27 ConDrvChangeScreenBufferAttributes(IN PCONSOLE Console,
28                                    IN PTEXTMODE_SCREEN_BUFFER Buffer,
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
36 ConSrvApplyUserSettings(
37     IN PCONSRV_CONSOLE Console,
38     IN PCONSOLE_STATE_INFO ConsoleInfo)
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;
49     /// Console->InputBufferSize = 0;
50     HistoryReshapeAllBuffers(Console,
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         // ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, TRUE);    // Output
68         // ConDrvSetConsoleCP(Console, ConsoleInfo->CodePage, FALSE);   // Input
69         if (TermSetCodePage(Console, ConsoleInfo->CodePage))
70         {
71             CON_SET_OUTPUT_CP(Console, ConsoleInfo->CodePage);
72             Console->InputCodePage = ConsoleInfo->CodePage;
73         }
74     }
75 
76     // FIXME: Check ConsoleInfo->WindowSize with respect to
77     // TermGetLargestConsoleWindowSize(...).
78 
79     if (GetType(ActiveBuffer) == TEXTMODE_BUFFER)
80     {
81         /* Resize its active screen-buffer */
82         PTEXTMODE_SCREEN_BUFFER Buffer = (PTEXTMODE_SCREEN_BUFFER)ActiveBuffer;
83         COORD BufSize = ConsoleInfo->ScreenBufferSize;
84 
85         if (Console->FixedSize)
86         {
87             /*
88              * The console is in fixed-size mode, so we cannot resize anything
89              * at the moment. However, keep those settings somewhere so that
90              * we can try to set them up when we will be allowed to do so.
91              */
92             if (ConsoleInfo->WindowSize.X != ActiveBuffer->OldViewSize.X ||
93                 ConsoleInfo->WindowSize.Y != ActiveBuffer->OldViewSize.Y)
94             {
95                 ActiveBuffer->OldViewSize = ConsoleInfo->WindowSize;
96             }
97 
98             /* The buffer size is not allowed to be smaller than the view size */
99             if (BufSize.X >= ActiveBuffer->OldViewSize.X && BufSize.Y >= ActiveBuffer->OldViewSize.Y)
100             {
101                 if (BufSize.X != ActiveBuffer->OldScreenBufferSize.X ||
102                     BufSize.Y != ActiveBuffer->OldScreenBufferSize.Y)
103                 {
104                     /*
105                      * The console is in fixed-size mode, so we cannot resize anything
106                      * at the moment. However, keep those settings somewhere so that
107                      * we can try to set them up when we will be allowed to do so.
108                      */
109                     ActiveBuffer->OldScreenBufferSize = BufSize;
110                 }
111             }
112         }
113         else
114         {
115             BOOL SizeChanged = FALSE;
116 
117             /* Resize the console */
118             if (ConsoleInfo->WindowSize.X != ActiveBuffer->ViewSize.X ||
119                 ConsoleInfo->WindowSize.Y != ActiveBuffer->ViewSize.Y)
120             {
121                 ActiveBuffer->ViewSize = ConsoleInfo->WindowSize;
122                 SizeChanged = TRUE;
123             }
124 
125             /* Resize the screen-buffer */
126             if (BufSize.X != ActiveBuffer->ScreenBufferSize.X ||
127                 BufSize.Y != ActiveBuffer->ScreenBufferSize.Y)
128             {
129                 if (NT_SUCCESS(ConioResizeBuffer((PCONSOLE)Console, Buffer, BufSize)))
130                     SizeChanged = TRUE;
131             }
132 
133             if (SizeChanged) TermResizeTerminal(Console);
134         }
135 
136         /* Apply foreground and background colors for both screen and popup */
137         ConDrvChangeScreenBufferAttributes((PCONSOLE)Console,
138                                            Buffer,
139                                            ConsoleInfo->ScreenAttributes,
140                                            ConsoleInfo->PopupAttributes);
141     }
142     else // if (GetType(ActiveBuffer) == GRAPHICS_BUFFER)
143     {
144         /*
145          * In any case we do NOT modify the size of the graphics screen-buffer.
146          * We just allow resizing the view only if the new size is smaller
147          * than the older one.
148          */
149         if (Console->FixedSize)
150         {
151             /*
152              * The console is in fixed-size mode, so we cannot resize anything
153              * at the moment. However, keep those settings somewhere so that
154              * we can try to set them up when we will be allowed to do so.
155              */
156             if (ConsoleInfo->WindowSize.X <= ActiveBuffer->ViewSize.X ||
157                 ConsoleInfo->WindowSize.Y <= ActiveBuffer->ViewSize.Y)
158             {
159                 ActiveBuffer->OldViewSize = ConsoleInfo->WindowSize;
160             }
161         }
162         else
163         {
164             /* Resize the view if its size is bigger than the specified size */
165             if (ConsoleInfo->WindowSize.X <= ActiveBuffer->ViewSize.X ||
166                 ConsoleInfo->WindowSize.Y <= ActiveBuffer->ViewSize.Y)
167             {
168                 ActiveBuffer->ViewSize = ConsoleInfo->WindowSize;
169                 // SizeChanged = TRUE;
170             }
171         }
172     }
173 }
174 
175 /* EOF */
176