Release 970629
[wine] / windows / syscolor.c
1 /*
2  * Support for system colors
3  *
4  * Copyright  David W. Metcalfe, 1993
5  * Copyright  Alexandre Julliard, 1994
6  *
7  */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include "gdi.h"
12 #include "syscolor.h"
13 #include "stddebug.h"
14 /* #define DEBUG_SYSCOLOR */
15 #include "debug.h"
16
17 struct SysColorObjects sysColorObjects;
18
19 static const char * const DefSysColors[] =
20 {
21     "Scrollbar", "224 224 224",      /* COLOR_SCROLLBAR           */
22     "Background", "192 192 192",     /* COLOR_BACKGROUND          */
23     "ActiveTitle", "0 64 128",       /* COLOR_ACTIVECAPTION       */
24     "InactiveTitle", "255 255 255",  /* COLOR_INACTIVECAPTION     */
25     "Menu", "0 255 255",             /* COLOR_MENU                */
26     "Window", "255 255 255",         /* COLOR_WINDOW              */
27     "WindowFrame", "0 0 0",          /* COLOR_WINDOWFRAME         */
28     "MenuText", "0 0 0",             /* COLOR_MENUTEXT            */
29     "WindowText", "0 0 0",           /* COLOR_WINDOWTEXT          */
30     "TitleText", "255 255 255",      /* COLOR_CAPTIONTEXT         */
31     "ActiveBorder", "128 128 128",   /* COLOR_ACTIVEBORDER        */
32     "InactiveBorder", "255 255 255", /* COLOR_INACTIVEBORDER      */
33     "AppWorkspace", "255 255 232",   /* COLOR_APPWORKSPACE        */
34     "Hilight", "166 202 240",        /* COLOR_HIGHLIGHT           */
35     "HilightText", "0 0 0",          /* COLOR_HIGHLIGHTTEXT       */
36     "ButtonFace", "192 192 192",     /* COLOR_BTNFACE             */
37     "ButtonShadow", "128 128 128",   /* COLOR_BTNSHADOW           */
38     "GrayText", "192 192 192",       /* COLOR_GRAYTEXT            */
39     "ButtonText", "0 0 0",           /* COLOR_BTNTEXT             */
40     "InactiveTitleText", "0 0 0",    /* COLOR_INACTIVECAPTIONTEXT */
41     "ButtonHilight", "255 255 255"   /* COLOR_BTNHIGHLIGHT        */
42 };
43
44 #define NUM_SYS_COLORS     (COLOR_BTNHIGHLIGHT+1)
45
46 static COLORREF SysColors[NUM_SYS_COLORS];
47
48 #define MAKE_SOLID(color) \
49        (PALETTEINDEX(GetNearestPaletteIndex32(STOCK_DEFAULT_PALETTE,(color))))
50
51 /*************************************************************************
52  *             SYSCOLOR_SetColor
53  */
54 static void SYSCOLOR_SetColor( int index, COLORREF color )
55 {
56     SysColors[index] = color;
57     switch(index)
58     {
59     case COLOR_SCROLLBAR:
60         DeleteObject32( sysColorObjects.hbrushScrollbar );
61         sysColorObjects.hbrushScrollbar = CreateSolidBrush32( color );
62         break;
63     case COLOR_BACKGROUND:
64         break;
65     case COLOR_ACTIVECAPTION:
66         DeleteObject32( sysColorObjects.hbrushActiveCaption );
67         sysColorObjects.hbrushActiveCaption = CreateSolidBrush32( color );
68         break;
69     case COLOR_INACTIVECAPTION:
70         DeleteObject32( sysColorObjects.hbrushInactiveCaption );
71         sysColorObjects.hbrushInactiveCaption = CreateSolidBrush32( color );
72         break;
73     case COLOR_MENU:
74         DeleteObject32( sysColorObjects.hbrushMenu );
75         sysColorObjects.hbrushMenu = CreateSolidBrush32( MAKE_SOLID(color) );
76         break;
77     case COLOR_WINDOW:
78         DeleteObject32( sysColorObjects.hbrushWindow );
79         sysColorObjects.hbrushWindow = CreateSolidBrush32( color );
80         break;
81     case COLOR_WINDOWFRAME:
82         DeleteObject32( sysColorObjects.hpenWindowFrame );
83         sysColorObjects.hpenWindowFrame = CreatePen32( PS_SOLID, 1, color );
84         break;
85     case COLOR_MENUTEXT:
86         break;
87     case COLOR_WINDOWTEXT:
88         DeleteObject32( sysColorObjects.hpenWindowText );
89         sysColorObjects.hpenWindowText = CreatePen32( PS_DOT, 1, color );
90         break;
91     case COLOR_CAPTIONTEXT:
92         break;
93     case COLOR_ACTIVEBORDER:
94         DeleteObject32( sysColorObjects.hbrushActiveBorder );
95         sysColorObjects.hbrushActiveBorder = CreateSolidBrush32( color );
96         break;
97     case COLOR_INACTIVEBORDER:
98         DeleteObject32( sysColorObjects.hbrushInactiveBorder );
99         sysColorObjects.hbrushInactiveBorder = CreateSolidBrush32( color );
100         break;
101     case COLOR_APPWORKSPACE:
102         break;
103     case COLOR_HIGHLIGHT:
104         DeleteObject32( sysColorObjects.hbrushHighlight );
105         sysColorObjects.hbrushHighlight = CreateSolidBrush32(MAKE_SOLID(color));
106         break;
107     case COLOR_HIGHLIGHTTEXT:
108         break;
109     case COLOR_BTNFACE:
110         DeleteObject32( sysColorObjects.hbrushBtnFace );
111         sysColorObjects.hbrushBtnFace = CreateSolidBrush32( color );
112         break;
113     case COLOR_BTNSHADOW:
114         DeleteObject32( sysColorObjects.hbrushBtnShadow );
115         sysColorObjects.hbrushBtnShadow = CreateSolidBrush32( color );
116         break;
117     case COLOR_GRAYTEXT:
118     case COLOR_BTNTEXT:
119     case COLOR_INACTIVECAPTIONTEXT:
120         break;
121     case COLOR_BTNHIGHLIGHT:
122         DeleteObject32( sysColorObjects.hbrushBtnHighlight );
123         sysColorObjects.hbrushBtnHighlight = CreateSolidBrush32( color );
124         break;
125     }
126 }
127
128
129 /*************************************************************************
130  *             SYSCOLOR_Init
131  */
132 void SYSCOLOR_Init(void)
133 {
134     int i, r, g, b;
135     const char * const *p;
136     char buffer[100];
137
138     for (i = 0, p = DefSysColors; i < NUM_SYS_COLORS; i++, p += 2)
139     {
140         GetProfileString32A( "colors", p[0], p[1], buffer, 100 );
141         if (!sscanf( buffer, " %d %d %d", &r, &g, &b )) r = g = b = 0;
142         SYSCOLOR_SetColor( i, RGB(r,g,b) );
143     }
144 }
145
146
147 /*************************************************************************
148  *             GetSysColor16   (USER.180)
149  */
150 COLORREF GetSysColor16( INT16 nIndex )
151 {
152     return SysColors[nIndex];
153 }
154
155
156 /*************************************************************************
157  *             GetSysColor32   (USER32.288)
158  */
159 COLORREF GetSysColor32( INT32 nIndex )
160 {
161     return SysColors[nIndex];
162 }
163
164
165 /*************************************************************************
166  *             SetSysColors16   (USER.181)
167  */
168 VOID SetSysColors16( INT16 nChanges, const INT16 *lpSysColor,
169                      const COLORREF *lpColorValues )
170 {
171     int i;
172
173     for (i = 0; i < nChanges; i++)
174     {
175         SYSCOLOR_SetColor( lpSysColor[i], lpColorValues[i] );
176     }
177
178     /* Send WM_SYSCOLORCHANGE message to all windows */
179
180     SendMessage32A( HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0 );
181
182     /* Repaint affected portions of all visible windows */
183
184     RedrawWindow32( GetDesktopWindow32(), NULL, 0,
185                 RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
186 }
187
188
189 /*************************************************************************
190  *             SetSysColors32   (USER32.504)
191  */
192 BOOL32 SetSysColors32( INT32 nChanges, const INT32 *lpSysColor,
193                        const COLORREF *lpColorValues )
194 {
195     int i;
196
197     for (i = 0; i < nChanges; i++)
198     {
199         SYSCOLOR_SetColor( lpSysColor[i], lpColorValues[i] );
200     }
201
202     /* Send WM_SYSCOLORCHANGE message to all windows */
203
204     SendMessage32A( HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0 );
205
206     /* Repaint affected portions of all visible windows */
207
208     RedrawWindow32( GetDesktopWindow32(), NULL, 0,
209                 RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
210     return TRUE;
211 }