xref: /reactos/dll/cpl/console/colors.c (revision 40462c92)
1 /*
2  * PROJECT:         ReactOS Console Configuration DLL
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * FILE:            dll/cpl/console/colors.c
5  * PURPOSE:         Colors dialog
6  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
7  *                  Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 #include "console.h"
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 static DWORD ActiveStaticControl = 0;
16 
17 static VOID
18 PaintStaticControls(
19     IN LPDRAWITEMSTRUCT drawItem,
20     IN PCONSOLE_STATE_INFO pConInfo)
21 {
22     HBRUSH hBrush;
23     DWORD index;
24 
25     index = min(drawItem->CtlID - IDC_STATIC_COLOR1,
26                 ARRAYSIZE(pConInfo->ColorTable) - 1);
27 
28     hBrush = CreateSolidBrush(pConInfo->ColorTable[index]);
29     if (!hBrush) return;
30 
31     FillRect(drawItem->hDC, &drawItem->rcItem, hBrush);
32     DeleteObject(hBrush);
33 
34     if (ActiveStaticControl == index)
35         DrawFocusRect(drawItem->hDC, &drawItem->rcItem);
36 }
37 
38 INT_PTR CALLBACK
39 ColorsProc(HWND hDlg,
40            UINT uMsg,
41            WPARAM wParam,
42            LPARAM lParam)
43 {
44     DWORD colorIndex;
45     COLORREF color;
46 
47     switch (uMsg)
48     {
49         case WM_INITDIALOG:
50         {
51             /* Set the valid range of the colour indicators */
52             SendDlgItemMessageW(hDlg, IDC_UPDOWN_COLOR_RED  , UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0));
53             SendDlgItemMessageW(hDlg, IDC_UPDOWN_COLOR_GREEN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0));
54             SendDlgItemMessageW(hDlg, IDC_UPDOWN_COLOR_BLUE , UDM_SETRANGE, 0, (LPARAM)MAKELONG(255, 0));
55 
56             /* Select by default the screen background option */
57             CheckRadioButton(hDlg, IDC_RADIO_SCREEN_TEXT, IDC_RADIO_POPUP_BACKGROUND, IDC_RADIO_SCREEN_BACKGROUND);
58             SendMessageW(hDlg, WM_COMMAND, IDC_RADIO_SCREEN_BACKGROUND, 0);
59 
60             return TRUE;
61         }
62 
63         case WM_DRAWITEM:
64         {
65             LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam;
66 
67             if (IDC_STATIC_COLOR1 <= drawItem->CtlID && drawItem->CtlID <= IDC_STATIC_COLOR16)
68                 PaintStaticControls(drawItem, ConInfo);
69             else if (drawItem->CtlID == IDC_STATIC_SCREEN_COLOR)
70                 PaintText(drawItem, ConInfo, Screen);
71             else if (drawItem->CtlID == IDC_STATIC_POPUP_COLOR)
72                 PaintText(drawItem, ConInfo, Popup);
73 
74             return TRUE;
75         }
76 
77         case WM_NOTIFY:
78         {
79             switch (((LPNMHDR)lParam)->code)
80             {
81                 case PSN_APPLY:
82                 {
83                     ApplyConsoleInfo(hDlg);
84                     return TRUE;
85                 }
86 
87                 case UDN_DELTAPOS:
88                 {
89                     LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
90 
91                     /* Get the current color */
92                     colorIndex = ActiveStaticControl;
93                     color = ConInfo->ColorTable[colorIndex];
94 
95                     if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_RED)
96                     {
97                         lpnmud->iPos = min(max(lpnmud->iPos + lpnmud->iDelta, 0), 255);
98                         color = RGB(lpnmud->iPos, GetGValue(color), GetBValue(color));
99                     }
100                     else if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_GREEN)
101                     {
102                         lpnmud->iPos = min(max(lpnmud->iPos + lpnmud->iDelta, 0), 255);
103                         color = RGB(GetRValue(color), lpnmud->iPos, GetBValue(color));
104                     }
105                     else if (lpnmud->hdr.idFrom == IDC_UPDOWN_COLOR_BLUE)
106                     {
107                         lpnmud->iPos = min(max(lpnmud->iPos + lpnmud->iDelta, 0), 255);
108                         color = RGB(GetRValue(color), GetGValue(color), lpnmud->iPos);
109                     }
110                     else
111                     {
112                         break;
113                     }
114 
115                     ConInfo->ColorTable[colorIndex] = color;
116                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + colorIndex), NULL, TRUE);
117                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE);
118                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_POPUP_COLOR) , NULL, TRUE);
119 
120                     PropSheet_Changed(GetParent(hDlg), hDlg);
121                     break;
122                 }
123             }
124 
125             break;
126         }
127 
128         case WM_COMMAND:
129         {
130             /* NOTE: both BN_CLICKED and STN_CLICKED == 0 */
131             if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == STN_CLICKED)
132             {
133                 if (LOWORD(wParam) == IDC_RADIO_SCREEN_TEXT       ||
134                     LOWORD(wParam) == IDC_RADIO_SCREEN_BACKGROUND ||
135                     LOWORD(wParam) == IDC_RADIO_POPUP_TEXT        ||
136                     LOWORD(wParam) == IDC_RADIO_POPUP_BACKGROUND)
137                 {
138                     switch (LOWORD(wParam))
139                     {
140                     case IDC_RADIO_SCREEN_TEXT:
141                         /* Get the colour of the screen foreground */
142                         colorIndex = TextAttribFromAttrib(ConInfo->ScreenAttributes);
143                         break;
144 
145                     case IDC_RADIO_SCREEN_BACKGROUND:
146                         /* Get the colour of the screen background */
147                         colorIndex = BkgdAttribFromAttrib(ConInfo->ScreenAttributes);
148                         break;
149 
150                     case IDC_RADIO_POPUP_TEXT:
151                         /* Get the colour of the popup foreground */
152                         colorIndex = TextAttribFromAttrib(ConInfo->PopupAttributes);
153                         break;
154 
155                     case IDC_RADIO_POPUP_BACKGROUND:
156                         /* Get the colour of the popup background */
157                         colorIndex = BkgdAttribFromAttrib(ConInfo->PopupAttributes);
158                         break;
159                     }
160 
161                     color = ConInfo->ColorTable[colorIndex];
162 
163                     /* Set the values of the colour indicators */
164                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_RED  , GetRValue(color), FALSE);
165                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_GREEN, GetGValue(color), FALSE);
166                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_BLUE , GetBValue(color), FALSE);
167 
168                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + ActiveStaticControl), NULL, TRUE);
169                     ActiveStaticControl = colorIndex;
170                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + ActiveStaticControl), NULL, TRUE);
171                     break;
172                 }
173                 else
174                 if (IDC_STATIC_COLOR1 <= LOWORD(wParam) && LOWORD(wParam) <= IDC_STATIC_COLOR16)
175                 {
176                     colorIndex = LOWORD(wParam) - IDC_STATIC_COLOR1;
177 
178                     /* If the same static control was re-clicked, don't take it into account */
179                     if (colorIndex == ActiveStaticControl)
180                         break;
181 
182                     color = ConInfo->ColorTable[colorIndex];
183 
184                     /* Set the values of the colour indicators */
185                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_RED  , GetRValue(color), FALSE);
186                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_GREEN, GetGValue(color), FALSE);
187                     SetDlgItemInt(hDlg, IDC_EDIT_COLOR_BLUE , GetBValue(color), FALSE);
188 
189                     if (IsDlgButtonChecked(hDlg, IDC_RADIO_SCREEN_TEXT))
190                     {
191                         ConInfo->ScreenAttributes = MakeAttrib(colorIndex, BkgdAttribFromAttrib(ConInfo->ScreenAttributes));
192                     }
193                     else if (IsDlgButtonChecked(hDlg, IDC_RADIO_SCREEN_BACKGROUND))
194                     {
195                         ConInfo->ScreenAttributes = MakeAttrib(TextAttribFromAttrib(ConInfo->ScreenAttributes), colorIndex);
196                     }
197                     else if (IsDlgButtonChecked(hDlg, IDC_RADIO_POPUP_TEXT))
198                     {
199                         ConInfo->PopupAttributes = MakeAttrib(colorIndex, BkgdAttribFromAttrib(ConInfo->PopupAttributes));
200                     }
201                     else if (IsDlgButtonChecked(hDlg, IDC_RADIO_POPUP_BACKGROUND))
202                     {
203                         ConInfo->PopupAttributes = MakeAttrib(TextAttribFromAttrib(ConInfo->PopupAttributes), colorIndex);
204                     }
205 
206                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + ActiveStaticControl), NULL, TRUE);
207                     ActiveStaticControl = colorIndex;
208                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + ActiveStaticControl), NULL, TRUE);
209                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE);
210                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_POPUP_COLOR) , NULL, TRUE);
211 
212                     PropSheet_Changed(GetParent(hDlg), hDlg);
213                     break;
214                 }
215             }
216             else if (HIWORD(wParam) == EN_KILLFOCUS)
217             {
218                 if (LOWORD(wParam) == IDC_EDIT_COLOR_RED   ||
219                     LOWORD(wParam) == IDC_EDIT_COLOR_GREEN ||
220                     LOWORD(wParam) == IDC_EDIT_COLOR_BLUE)
221                 {
222                     DWORD value;
223 
224                     /* Get the current colour */
225                     colorIndex = ActiveStaticControl;
226                     color = ConInfo->ColorTable[colorIndex];
227 
228                     /* Modify the colour component */
229                     switch (LOWORD(wParam))
230                     {
231                     case IDC_EDIT_COLOR_RED:
232                         value = GetDlgItemInt(hDlg, IDC_EDIT_COLOR_RED, NULL, FALSE);
233                         value = min(max(value, 0), 255);
234                         color = RGB(value, GetGValue(color), GetBValue(color));
235                         break;
236 
237                     case IDC_EDIT_COLOR_GREEN:
238                         value = GetDlgItemInt(hDlg, IDC_EDIT_COLOR_GREEN, NULL, FALSE);
239                         value = min(max(value, 0), 255);
240                         color = RGB(GetRValue(color), value, GetBValue(color));
241                         break;
242 
243                     case IDC_EDIT_COLOR_BLUE:
244                         value = GetDlgItemInt(hDlg, IDC_EDIT_COLOR_BLUE, NULL, FALSE);
245                         value = min(max(value, 0), 255);
246                         color = RGB(GetRValue(color), GetGValue(color), value);
247                         break;
248                     }
249 
250                     ConInfo->ColorTable[colorIndex] = color;
251                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_COLOR1 + colorIndex), NULL, TRUE);
252                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_SCREEN_COLOR), NULL, TRUE);
253                     InvalidateRect(GetDlgItem(hDlg, IDC_STATIC_POPUP_COLOR) , NULL, TRUE);
254 
255                     PropSheet_Changed(GetParent(hDlg), hDlg);
256                     break;
257                 }
258             }
259 
260             break;
261         }
262 
263         default:
264             break;
265     }
266 
267     return FALSE;
268 }
269