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:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
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.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Peter Dennis Bartok (pbartok@novell.com)
24 // Alexander Olk (alex.olk@googlemail.com)
29 using System.Runtime.InteropServices;
33 namespace System.Windows.Forms {
34 internal class X11DesktopColors {
35 #region Structs & Enums
36 [StructLayout(LayoutKind.Sequential)]
37 internal struct GdkColorStruct {
44 [StructLayout(LayoutKind.Sequential)]
45 internal struct GObjectStruct {
46 public IntPtr Instance;
47 public IntPtr ref_count;
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 */
71 internal GdkColorStruct black;
72 internal GdkColorStruct white;
74 /* TODO: There is more stuff that we will add when we need it*/
77 private enum Desktop {
82 #endregion // Structs & Enums
84 #region Local Variables
85 static private Desktop desktop;
86 #endregion // Local Variables
89 static X11DesktopColors() {
90 FindDesktopEnvironment();
102 //dispmgr = gdk_display_manager_get ();
103 //gdkdisplay = gdk_display_manager_get_default_display (dispmgr);
105 widget = gtk_invisible_new ();
106 gtk_widget_ensure_style (widget);
107 style_ptr = gtk_widget_get_style (widget);
109 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
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]));
118 // We don't want ControlLight and ControlLightLight to disappear on a white background!
119 Color white = Color.FromArgb(255, 255, 255, 255);
120 if (ThemeEngine.Current.ColorControlLight.ToArgb() == white.ToArgb()) {
121 ThemeEngine.Current.ColorControlLight = Color.FromArgb (255, 190, 190, 190);
123 if (ThemeEngine.Current.ColorControlLightLight.ToArgb() == white.ToArgb()) {
124 ThemeEngine.Current.ColorControlLightLight = Color.FromArgb (255, 220, 220, 220);
126 widget = gtk_menu_new ();
127 gtk_widget_ensure_style (widget);
128 style_ptr = gtk_widget_get_style (widget);
130 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
132 ThemeEngine.Current.ColorMenu = ColorFromGdkColor (style.bg [0]);
133 ThemeEngine.Current.ColorMenuText = ColorFromGdkColor (style.text [0]);
136 catch (DllNotFoundException) {
137 Console.Error.WriteLine("Gtk not found (missing LD_LIBRARY_PATH to libgtk-x11-2.0.so.0?), using built-in colorscheme");
141 Console.Error.WriteLine("Gtk colorscheme read failure, using built-in colorscheme");
147 if (! ReadKDEColorsheme() )
148 Console.Error.WriteLine("KDE colorscheme read failure, using built-in colorscheme");
158 static void GtkInit ()
160 gtk_init_check (IntPtr.Zero, IntPtr.Zero);
162 #endregion // Constructors
165 static void FindDesktopEnvironment() {
166 desktop = Desktop.Gtk;
167 string session = Environment.GetEnvironmentVariable("DESKTOP_SESSION");
169 if ( session != null ) {
170 session = session.ToUpper( );
172 if ( session == "DEFAULT" ) {
173 string helper = Environment.GetEnvironmentVariable("KDE_FULL_SESSION");
175 if ( helper != null )
176 desktop = Desktop.KDE;
178 if ( session.StartsWith("KDE") )
179 desktop = Desktop.KDE;
182 #endregion // Properties
185 static internal void Initialize() {
186 // Do nothing; all is done in our static ctor
189 private static Color ColorFromGdkColor (GdkColorStruct gtkcolor) {
190 return Color.FromArgb (255,
191 (gtkcolor.red >> 8) & 0xff,
192 (gtkcolor.green >> 8) & 0xff,
193 (gtkcolor.blue >> 8) & 0xff );
196 private static bool ReadKDEColorsheme() {
197 string full_kdegloabals_filename = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
199 + ".kde/share/config/kdeglobals";
201 if (!File.Exists(full_kdegloabals_filename))
204 StreamReader sr = new StreamReader(full_kdegloabals_filename);
206 string line = sr.ReadLine();
210 while (line != null) {
213 if (line.StartsWith( "background=")) {
214 tmp_color = GetColorFromKDEString(line);
216 if (tmp_color != Color.Empty) {
217 ThemeEngine.Current.ColorControl = tmp_color;
218 ThemeEngine.Current.ColorMenu = tmp_color;
221 if (line.StartsWith( "foreground=")) {
222 tmp_color = GetColorFromKDEString(line);
224 if (tmp_color != Color.Empty) {
225 ThemeEngine.Current.ColorControlText = tmp_color;
226 ThemeEngine.Current.ColorMenuText = tmp_color;
229 if (line.StartsWith("selectBackground")) {
230 tmp_color = GetColorFromKDEString(line);
232 if (tmp_color != Color.Empty) {
233 ThemeEngine.Current.ColorHighlight = tmp_color;
236 if (line.StartsWith("selectForeground")) {
237 tmp_color = GetColorFromKDEString(line);
239 if (tmp_color != Color.Empty) {
240 ThemeEngine.Current.ColorHighlightText = tmp_color;
244 line = sr.ReadLine();
252 private static Color GetColorFromKDEString(string line) {
253 string[] split = line.Split(new char[] {'='});
255 if (split.Length > 0) {
258 split = line.Split(new char[] {','});
260 if (split.Length == 3) {
261 int r = System.Convert.ToInt32(split[0]);
262 int g = System.Convert.ToInt32(split[1]);
263 int b = System.Convert.ToInt32(split[2]);
265 return Color.FromArgb(r, g, b);
271 #endregion // Methods
274 const string libgdk = "libgdk-x11-2.0.so.0";
275 const string libgtk = "libgtk-x11-2.0.so.0";
278 static extern bool gtk_init_check (IntPtr argc, IntPtr argv);
281 internal static extern IntPtr gdk_display_manager_get ();
284 internal static extern IntPtr gdk_display_manager_get_default_display (IntPtr display_manager);
287 static extern IntPtr gtk_invisible_new ();
290 static extern IntPtr gtk_menu_new ();
292 //[DllImport(libgtk)]
293 //static extern IntPtr gtk_menu_item_new_with_label (string label);
296 static extern void gtk_widget_ensure_style (IntPtr raw);
299 static extern IntPtr gtk_widget_get_style (IntPtr raw);
300 #endregion // DllImports