extracted 4 copies of identical code into a function
[wxWidgets.git] / src / gtk1 / settings.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: settings.cpp
3 // Purpose:
4 // Author: Robert Roebling
5 // Id: $Id$
6 // Copyright: (c) 1998 Robert Roebling
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10
11 #ifdef __GNUG__
12 #pragma implementation "settings.h"
13 #endif
14
15 #include "wx/settings.h"
16 #include "wx/debug.h"
17
18 #include "wx/cmndata.h"
19
20 #include <gdk/gdk.h>
21 #include <gdk/gdkprivate.h>
22 #include <gtk/gtk.h>
23
24 extern GdkFont *GtkGetDefaultGuiFont();
25
26
27 /*
28 #define wxSYS_COLOUR_SCROLLBAR 0
29 #define wxSYS_COLOUR_BACKGROUND 1
30 #define wxSYS_COLOUR_ACTIVECAPTION 2
31 #define wxSYS_COLOUR_INACTIVECAPTION 3
32 #define wxSYS_COLOUR_MENU 4
33 #define wxSYS_COLOUR_WINDOW 5
34 #define wxSYS_COLOUR_WINDOWFRAME 6
35 #define wxSYS_COLOUR_MENUTEXT 7
36 #define wxSYS_COLOUR_WINDOWTEXT 8
37 #define wxSYS_COLOUR_CAPTIONTEXT 9
38 #define wxSYS_COLOUR_ACTIVEBORDER 10
39 #define wxSYS_COLOUR_INACTIVEBORDER 11
40 #define wxSYS_COLOUR_APPWORKSPACE 12
41 #define wxSYS_COLOUR_HIGHLIGHT 13
42 #define wxSYS_COLOUR_HIGHLIGHTTEXT 14
43 #define wxSYS_COLOUR_BTNFACE 15
44 #define wxSYS_COLOUR_BTNSHADOW 16
45 #define wxSYS_COLOUR_GRAYTEXT 17
46 #define wxSYS_COLOUR_BTNTEXT 18
47 #define wxSYS_COLOUR_INACTIVECAPTIONTEXT 19
48 #define wxSYS_COLOUR_BTNHIGHLIGHT 20
49
50 #define wxSYS_COLOUR_3DDKSHADOW 21
51 #define wxSYS_COLOUR_3DLIGHT 22
52 #define wxSYS_COLOUR_INFOTEXT 23
53 #define wxSYS_COLOUR_INFOBK 24
54
55 #define wxSYS_COLOUR_DESKTOP wxSYS_COLOUR_BACKGROUND
56 #define wxSYS_COLOUR_3DFACE wxSYS_COLOUR_BTNFACE
57 #define wxSYS_COLOUR_3DSHADOW wxSYS_COLOUR_BTNSHADOW
58 #define wxSYS_COLOUR_3DHIGHLIGHT wxSYS_COLOUR_BTNHIGHLIGHT
59 #define wxSYS_COLOUR_3DHILIGHT wxSYS_COLOUR_BTNHIGHLIGHT
60 #define wxSYS_COLOUR_BTNHILIGHT wxSYS_COLOUR_BTNHIGHLIGHT
61 */
62
63 #define SHIFT (8*(sizeof(short int)-sizeof(char)))
64
65 //wxColour *g_systemWinColour = (wxColour *) NULL;
66 wxColour *g_systemBtnFaceColour = (wxColour *) NULL;
67 wxColour *g_systemBtnShadowColour = (wxColour *) NULL;
68 wxColour *g_systemBtnHighlightColour = (wxColour *) NULL;
69 wxColour *g_systemHighlightColour = (wxColour *) NULL;
70 wxColour *g_systemHighlightTextColour = (wxColour *) NULL;
71 wxColour *g_systemListBoxColour = (wxColour *) NULL;
72 wxColour *g_systemBtnTextColour = (wxColour *) NULL;
73
74 wxFont *g_systemFont = (wxFont *) NULL;
75
76 void wxSystemSettings::Done()
77 {
78 // delete g_systemWinColour;
79 delete g_systemBtnFaceColour;
80 delete g_systemBtnShadowColour;
81 delete g_systemBtnHighlightColour;
82 delete g_systemHighlightColour;
83 delete g_systemHighlightTextColour;
84 delete g_systemListBoxColour;
85 delete g_systemFont;
86 delete g_systemBtnTextColour;
87 }
88
89 // kind of widget to use in GetColourFromGTKWidget
90 enum GtkWidgetType
91 {
92 GTK_BUTTON,
93 GTK_LIST
94 };
95
96 // wxSystemSettings::GetSystemColour() helper: get the colours from a GTK+
97 // widget style, return true if we did get them, false to use defaults
98 static bool GetColourFromGTKWidget(GtkWidgetType type, GtkStateType state,
99 int& red, int& green, int& blue)
100 {
101 GtkWidget *widget = type == GTK_BUTTON ? gtk_button_new() : gtk_list_new();
102 GtkStyle *def = gtk_rc_get_style( widget );
103 if ( !def )
104 def = gtk_widget_get_default_style();
105
106 bool ok;
107 if ( def )
108 {
109 red = def->bg[state].red;
110 green = def->bg[state].green;
111 blue = def->bg[state].blue;
112
113 ok = TRUE;
114 }
115 else
116 {
117 ok = FALSE;
118 }
119
120 gtk_widget_destroy( widget );
121
122 return ok;
123 }
124
125 wxColour wxSystemSettings::GetSystemColour( int index )
126 {
127 switch (index)
128 {
129 case wxSYS_COLOUR_SCROLLBAR:
130 case wxSYS_COLOUR_BACKGROUND:
131 case wxSYS_COLOUR_ACTIVECAPTION:
132 case wxSYS_COLOUR_INACTIVECAPTION:
133 case wxSYS_COLOUR_MENU:
134 case wxSYS_COLOUR_WINDOWFRAME:
135 case wxSYS_COLOUR_ACTIVEBORDER:
136 case wxSYS_COLOUR_INACTIVEBORDER:
137 case wxSYS_COLOUR_BTNFACE:
138 case wxSYS_COLOUR_3DLIGHT:
139 if (!g_systemBtnFaceColour)
140 {
141 int red, green, blue;
142 if ( !GetColourFromGTKWidget(GTK_BUTTON, GTK_STATE_NORMAL,
143 red, green, blue) )
144 {
145 red =
146 green = 0;
147 blue = 0x9c40;
148 }
149
150 g_systemBtnFaceColour = new wxColour( red >> SHIFT,
151 green >> SHIFT,
152 blue >> SHIFT );
153 }
154 return *g_systemBtnFaceColour;
155
156 case wxSYS_COLOUR_WINDOW:
157 return *wxWHITE;
158
159 case wxSYS_COLOUR_3DDKSHADOW:
160 return *wxBLACK;
161
162 case wxSYS_COLOUR_GRAYTEXT:
163 case wxSYS_COLOUR_BTNSHADOW:
164 //case wxSYS_COLOUR_3DSHADOW:
165 if (!g_systemBtnShadowColour)
166 {
167 wxColour faceColour(GetSystemColour(wxSYS_COLOUR_3DFACE));
168 g_systemBtnShadowColour =
169 new wxColour((unsigned char) (faceColour.Red() * 0.666),
170 (unsigned char) (faceColour.Green() * 0.666),
171 (unsigned char) (faceColour.Blue() * 0.666));
172 }
173
174 return *g_systemBtnShadowColour;
175
176 case wxSYS_COLOUR_3DHIGHLIGHT:
177 //case wxSYS_COLOUR_BTNHIGHLIGHT:
178 return * wxWHITE;
179 /* I think this should normally be white (JACS 8/2000)
180
181 Hmm, I'm quite sure it shouldn't ... (VZ 20.08.01)
182 if (!g_systemBtnHighlightColour)
183 {
184 g_systemBtnHighlightColour =
185 new wxColour( 0xea60 >> SHIFT,
186 0xea60 >> SHIFT,
187 0xea60 >> SHIFT );
188 }
189 return *g_systemBtnHighlightColour;
190 */
191
192 case wxSYS_COLOUR_HIGHLIGHT:
193 if (!g_systemHighlightColour)
194 {
195 int red, green, blue;
196 if ( !GetColourFromGTKWidget(GTK_BUTTON, GTK_STATE_SELECTED,
197 red, green, blue) )
198 {
199 red =
200 green = 0;
201 blue = 0x9c40;
202 }
203
204 g_systemHighlightColour = new wxColour( red >> SHIFT,
205 green >> SHIFT,
206 blue >> SHIFT );
207 }
208 return *g_systemHighlightColour;
209
210 case wxSYS_COLOUR_LISTBOX:
211 if (!g_systemListBoxColour)
212 {
213 int red, green, blue;
214 if ( GetColourFromGTKWidget(GTK_LIST, GTK_STATE_NORMAL,
215 red, green, blue) )
216 {
217 g_systemListBoxColour = new wxColour( red >> SHIFT,
218 green >> SHIFT,
219 blue >> SHIFT );
220 }
221 else
222 {
223 g_systemListBoxColour = new wxColour(*wxWHITE);
224 }
225 }
226 return *g_systemListBoxColour;
227
228 case wxSYS_COLOUR_MENUTEXT:
229 case wxSYS_COLOUR_WINDOWTEXT:
230 case wxSYS_COLOUR_CAPTIONTEXT:
231 case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
232 case wxSYS_COLOUR_BTNTEXT:
233 case wxSYS_COLOUR_INFOTEXT:
234 if (!g_systemBtnTextColour)
235 {
236 GtkWidget *widget = gtk_button_new();
237 GtkStyle *def = gtk_rc_get_style( widget );
238 if (!def)
239 def = gtk_widget_get_default_style();
240 if (def)
241 {
242 int red = def->fg[GTK_STATE_NORMAL].red;
243 int green = def->fg[GTK_STATE_NORMAL].green;
244 int blue = def->fg[GTK_STATE_NORMAL].blue;
245 g_systemBtnTextColour =
246 new wxColour( red >> SHIFT,
247 green >> SHIFT,
248 blue >> SHIFT );
249 }
250 else
251 {
252 g_systemBtnTextColour =
253 new wxColour(0, 0, 0);
254 }
255 gtk_widget_destroy( widget );
256 }
257 return *g_systemBtnTextColour;
258
259 case wxSYS_COLOUR_HIGHLIGHTTEXT:
260 if (!g_systemHighlightTextColour)
261 {
262 wxColour hclr = GetSystemColour(wxSYS_COLOUR_HIGHLIGHT);
263 if (hclr.Red() > 200 && hclr.Green() > 200 && hclr.Blue() > 200)
264 g_systemHighlightTextColour = new wxColour(*wxBLACK);
265 else
266 g_systemHighlightTextColour = new wxColour(*wxWHITE);
267 }
268 return *g_systemHighlightTextColour;
269
270 case wxSYS_COLOUR_INFOBK:
271 case wxSYS_COLOUR_APPWORKSPACE:
272 return *wxWHITE; // ?
273 }
274
275 return *wxWHITE;
276 }
277
278 wxFont wxSystemSettings::GetSystemFont( int index )
279 {
280 switch (index)
281 {
282 case wxSYS_OEM_FIXED_FONT:
283 case wxSYS_ANSI_FIXED_FONT:
284 case wxSYS_SYSTEM_FIXED_FONT:
285 {
286 return *wxNORMAL_FONT;
287 }
288 case wxSYS_ANSI_VAR_FONT:
289 case wxSYS_SYSTEM_FONT:
290 case wxSYS_DEVICE_DEFAULT_FONT:
291 case wxSYS_DEFAULT_GUI_FONT:
292 {
293 if (!g_systemFont)
294 {
295 #if 0
296 GdkFont *gdk_font = GtkGetDefaultGuiFont();
297 if (gdk_font)
298 {
299 GSList *font_list = ((GdkFontPrivate*)gdk_font)->names;
300 char *name = (char*)font_list->data;
301 wxString font_string( name );
302 wxFontData font_data;
303 g_systemFont = new wxFont( font_string, font_data );
304 }
305 gtk_widget_destroy( widget );
306 #endif
307
308 g_systemFont = new wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL );
309
310 }
311 return *g_systemFont;
312 }
313 }
314
315 return wxNullFont;
316 }
317
318 int wxSystemSettings::GetSystemMetric( int index )
319 {
320 switch (index)
321 {
322 case wxSYS_SCREEN_X: return gdk_screen_width();
323 case wxSYS_SCREEN_Y: return gdk_screen_height();
324 case wxSYS_HSCROLL_Y: return 15;
325 case wxSYS_VSCROLL_X: return 15;
326 }
327
328 wxCHECK_MSG( index, 0, wxT("wxSystemSettings::GetSystemMetric not fully implemented") );
329
330 return 0;
331 }