* TabControl.cs: Show the tooltip depending on the value
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / X11DesktopColors.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Authors:
23 //      Peter Dennis Bartok     (pbartok@novell.com)
24 //      Alexander Olk           (alex.olk@googlemail.com)
25 //
26 //
27
28 using System.Drawing;
29 using System.Runtime.InteropServices;
30 using System.IO;
31 using System;
32
33 namespace System.Windows.Forms {
34         internal class X11DesktopColors {
35                 #region Structs & Enums
36                 [StructLayout(LayoutKind.Sequential)]   
37                 internal struct GdkColorStruct {
38                         internal int pixel;
39                         internal short red;
40                         internal short green;
41                         internal short blue;
42                 }
43
44                 [StructLayout(LayoutKind.Sequential)]   
45                 internal struct GObjectStruct {
46                         public IntPtr Instance;
47                         public IntPtr ref_count;
48                         public IntPtr data;
49                 }
50
51                 [StructLayout(LayoutKind.Sequential)]
52                 internal struct GtkStyleStruct {
53                         internal GObjectStruct obj;
54                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
55                         internal GdkColorStruct[] fg;
56                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
57                         internal GdkColorStruct[] bg;
58                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
59                         internal GdkColorStruct[] light;
60                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
61                         internal GdkColorStruct[] dark;
62                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
63                         internal GdkColorStruct[] mid;
64                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
65                         internal GdkColorStruct[] text;
66                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
67                         internal GdkColorStruct[] baseclr;
68                         [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
69                         internal GdkColorStruct[] text_aa;              /* Halfway between text/base */
70
71                         internal GdkColorStruct black;
72                         internal GdkColorStruct white;
73
74                         /* TODO: There is more stuff that we will add when we need it*/
75                 }
76
77                 private enum Desktop {
78                         Gtk,
79                         KDE,
80                         Unknown
81                 }
82                 #endregion      // Structs & Enums
83
84                 #region Local Variables
85                 static private Desktop          desktop;
86                 #endregion      // Local Variables
87
88                 #region Constructors
89                 static X11DesktopColors() {
90                         FindDesktopEnvironment();
91                         
92                         switch(desktop) {
93                                 case Desktop.Gtk: {
94                                         //IntPtr                dispmgr;
95                                         //IntPtr                gdkdisplay;
96                                         IntPtr          widget;
97                                         IntPtr          style_ptr;
98                                         GtkStyleStruct  style;
99
100                                         try {
101                                                 GtkInit();
102                                                 //dispmgr =  gdk_display_manager_get ();
103                                                 //gdkdisplay =  gdk_display_manager_get_default_display (dispmgr);
104
105                                                 widget = gtk_invisible_new ();
106                                                 gtk_widget_ensure_style (widget);
107                                                 style_ptr = gtk_widget_get_style (widget);
108
109                                                 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
110                                                 
111                                                 ThemeEngine.Current.ColorControl = ColorFromGdkColor (style.bg[0]);
112                                                 ThemeEngine.Current.ColorControlText = ColorFromGdkColor (style.fg[0]);
113                                                 ThemeEngine.Current.ColorControlDark = ColorFromGdkColor (style.dark[0]);
114                                                 ThemeEngine.Current.ColorControlLight = ColorFromGdkColor (style.light[0]);
115                                                 ThemeEngine.Current.ColorControlLightLight = ControlPaint.Light(ColorFromGdkColor (style.light[0]));
116                                                 ThemeEngine.Current.ColorControlDarkDark = ControlPaint.Dark(ColorFromGdkColor (style.dark[0]));
117
118                                                 widget = gtk_menu_new ();
119                                                 gtk_widget_ensure_style (widget);
120                                                 style_ptr = gtk_widget_get_style (widget);
121
122                                                 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
123
124                                                 ThemeEngine.Current.ColorMenu = ColorFromGdkColor (style.bg [0]);
125                                                 ThemeEngine.Current.ColorMenuText = ColorFromGdkColor (style.text [0]);
126                                         }
127
128                                         catch (DllNotFoundException) {
129                                                 Console.Error.WriteLine("Gtk not found (missing LD_LIBRARY_PATH to libgtk-x11-2.0.so.0?), using built-in colorscheme");
130                                         }
131
132                                         catch {
133                                                 Console.Error.WriteLine("Gtk colorscheme read failure, using built-in colorscheme");
134                                         }
135                                         break;
136                                 }
137                                         
138                                 case Desktop.KDE: {
139                                                 if (! ReadKDEColorsheme() )
140                                                         Console.Error.WriteLine("KDE colorscheme read failure, using built-in colorscheme");
141                                                 break;
142                                         }
143                                         
144                                 default: {
145                                         break;
146                                 }
147                         }
148                 }
149
150                 static void GtkInit ()
151                 {
152                         gtk_init_check (IntPtr.Zero, IntPtr.Zero);
153                 }
154                 #endregion      // Constructors
155
156                 #region Properties
157                 static void FindDesktopEnvironment() {
158                         desktop = Desktop.Gtk;
159                         string session =  Environment.GetEnvironmentVariable("DESKTOP_SESSION");
160                                 
161                         if ( session != null ) {
162                                 session = session.ToUpper( );
163                                         
164                                 if ( session == "DEFAULT" ) {
165                                         string helper = Environment.GetEnvironmentVariable("KDE_FULL_SESSION");
166                                                 
167                                         if ( helper != null )
168                                                 desktop = Desktop.KDE;
169                                 } else
170                                 if ( session.StartsWith("KDE") )
171                                         desktop = Desktop.KDE;
172                         }
173                 }
174                 #endregion      // Properties
175
176                 #region Methods
177                 static internal void Initialize() {
178                         // Do nothing; all is done in our static ctor
179                 }
180
181                 private static Color ColorFromGdkColor (GdkColorStruct gtkcolor) {
182                         return Color.FromArgb (255, 
183                                 (gtkcolor.red >> 8)  & 0xff, 
184                                 (gtkcolor.green  >> 8) & 0xff,
185                                 (gtkcolor.blue >> 8) & 0xff );
186                 }
187                 
188                 private static bool ReadKDEColorsheme() {
189                         string full_kdegloabals_filename = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
190                                 + "/"
191                                 + ".kde/share/config/kdeglobals";
192                         
193                         if (!File.Exists(full_kdegloabals_filename)) 
194                                 return false;
195                         
196                         StreamReader sr = new StreamReader(full_kdegloabals_filename);
197                         
198                         string line = sr.ReadLine();
199                         
200                         Color tmp_color;
201                         
202                         while (line != null) {
203                                 line = line.Trim();
204                                 
205                                 if (line.StartsWith( "background=")) {
206                                         tmp_color = GetColorFromKDEString(line);
207                                         
208                                         if (tmp_color != Color.Empty) {
209                                                 ThemeEngine.Current.ColorControl = tmp_color;
210                                                 ThemeEngine.Current.ColorMenu = tmp_color;
211                                         }
212                                 } else
213                                 if (line.StartsWith( "foreground=")) {
214                                         tmp_color = GetColorFromKDEString(line);
215                                         
216                                         if (tmp_color != Color.Empty) {
217                                                 ThemeEngine.Current.ColorControlText = tmp_color;
218                                                 ThemeEngine.Current.ColorMenuText = tmp_color;                                          
219                                         }
220                                 } else
221                                 if (line.StartsWith("selectBackground")) {
222                                         tmp_color = GetColorFromKDEString(line);
223                                         
224                                         if (tmp_color != Color.Empty) {
225                                                 ThemeEngine.Current.ColorHighlight = tmp_color;
226                                         }
227                                 } else
228                                 if (line.StartsWith("selectForeground")) {
229                                         tmp_color = GetColorFromKDEString(line);
230                                         
231                                         if (tmp_color != Color.Empty) {
232                                                 ThemeEngine.Current.ColorHighlightText = tmp_color;
233                                         }
234                                 }
235                                 
236                                 line = sr.ReadLine();
237                         }
238                         
239                         sr.Close();
240                         
241                         return true;
242                 }
243                 
244                 private static Color GetColorFromKDEString(string line) {
245                         string[] split = line.Split(new char[] {'='});
246                         
247                         if (split.Length > 0) {
248                                 line = split[1];
249                                 
250                                 split = line.Split(new char[] {','});
251                                 
252                                 if (split.Length == 3) {
253                                         int r = System.Convert.ToInt32(split[0]);
254                                         int g = System.Convert.ToInt32(split[1]);
255                                         int b = System.Convert.ToInt32(split[2]);
256                                         
257                                         return Color.FromArgb(r, g, b);
258                                 }
259                         }
260                         
261                         return Color.Empty;
262                 }
263                 #endregion      // Methods
264
265                 #region DllImports
266                 const string libgdk = "libgdk-x11-2.0.so.0";
267                 const string libgtk = "libgtk-x11-2.0.so.0";
268                 
269                 [DllImport(libgtk)]
270                 static extern bool gtk_init_check (IntPtr argc, IntPtr argv);
271
272                 [DllImport(libgdk)]
273                 internal static extern IntPtr gdk_display_manager_get ();
274
275                 [DllImport(libgdk)]
276                 internal static extern IntPtr gdk_display_manager_get_default_display (IntPtr display_manager);
277
278                 [DllImport(libgtk)]
279                 static extern IntPtr gtk_invisible_new ();
280
281                 [DllImport(libgtk)]
282                 static extern IntPtr gtk_menu_new ();
283
284                 //[DllImport(libgtk)]
285                 //static extern IntPtr gtk_menu_item_new_with_label (string label);
286
287                 [DllImport(libgtk)]
288                 static extern void gtk_widget_ensure_style (IntPtr raw);
289
290                 [DllImport(libgtk)]
291                 static extern IntPtr gtk_widget_get_style (IntPtr raw);
292                 #endregion      // DllImports
293         }
294 }