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)
28 using System.Runtime.InteropServices;
30 namespace System.Windows.Forms {
31 internal class X11DesktopColors {
32 #region Structs & Enums
33 [StructLayout(LayoutKind.Sequential)]
34 internal struct GdkColorStruct {
41 [StructLayout(LayoutKind.Sequential)]
42 internal struct GtkStyleStruct {
43 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=12)]
44 internal byte[] obj; /* GObject is 12 bytes*/
45 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
46 internal GdkColorStruct[] fg;
47 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
48 internal GdkColorStruct[] bg;
49 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
50 internal GdkColorStruct[] light;
51 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
52 internal GdkColorStruct[] dark;
53 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
54 internal GdkColorStruct[] mid;
55 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
56 internal GdkColorStruct[] text;
57 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
58 internal GdkColorStruct[] baseclr;
59 [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=5)]
60 internal GdkColorStruct[] text_aa; /* Halfway between text/base */
62 internal GdkColorStruct black;
63 internal GdkColorStruct white;
65 /* TODO: There is more stuff that we will add when we need it*/
68 private enum Desktop {
73 #endregion // Structs & Enums
75 #region Local Variables
76 static private Desktop desktop;
77 #endregion // Local Variables
80 static X11DesktopColors() {
81 // FIXME - figure out what desktop manager we're using; for now we hardcode gtk
82 desktop = Desktop.Gtk;
95 gtk_init_check (out argc, argv);
96 //dispmgr = gdk_display_manager_get ();
97 //gdkdisplay = gdk_display_manager_get_default_display (dispmgr);
98 gtk_init_check (out argc, argv);
100 widget = gtk_invisible_new ();
101 gtk_widget_ensure_style (widget);
102 style_ptr = gtk_widget_get_style (widget);
104 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
106 ThemeEngine.Current.ColorControl = ColorFromGdkColor (style.bg[0]);
107 ThemeEngine.Current.ColorControlText = ColorFromGdkColor (style.fg[0]);
108 ThemeEngine.Current.ColorControlDark = ColorFromGdkColor (style.dark[0]);
109 ThemeEngine.Current.ColorControlLight = ColorFromGdkColor (style.light[0]);
110 ThemeEngine.Current.ColorControlLightLight = ControlPaint.Light(ColorFromGdkColor (style.light[0]));
111 ThemeEngine.Current.ColorControlDarkDark = ControlPaint.Dark(ColorFromGdkColor (style.dark[0]));
113 widget = gtk_menu_new ();
114 gtk_widget_ensure_style (widget);
115 style_ptr = gtk_widget_get_style (widget);
117 style = (GtkStyleStruct) Marshal.PtrToStructure (style_ptr, typeof (GtkStyleStruct));
119 ThemeEngine.Current.ColorMenu = ColorFromGdkColor (style.bg [0]);
120 ThemeEngine.Current.ColorMenuText = ColorFromGdkColor (style.text [0]);
121 Console.WriteLine("Gtk colorscheme read");
124 catch (DllNotFoundException) {
125 Console.WriteLine("Gtk not found (missing LD_LIBRARY_PATH to libgtk-x11-2.0.so?), using built-in colorscheme");
129 Console.WriteLine("Gtk colorscheme read failure, using built-in colorscheme");
135 Console.WriteLine("Unknown destop manager, using default colors");
140 #endregion // Constructors
143 #endregion // Properties
146 static internal void Initialize() {
147 // Do nothing; all is done in our static ctor
150 private static Color ColorFromGdkColor (GdkColorStruct gtkcolor) {
151 return Color.FromArgb (255,
152 (gtkcolor.red >> 8) & 0xff,
153 (gtkcolor.green >> 8) & 0xff,
154 (gtkcolor.blue >> 8) & 0xff );
157 #endregion // Methods
160 [DllImport("libgtk-x11-2.0.so")]
161 static extern bool gtk_init_check (out int argc, string argv);
163 [DllImport("libgdk-x11-2.0.so")]
164 internal static extern IntPtr gdk_display_manager_get ();
166 [DllImport("libgdk-x11-2.0.so")]
167 internal static extern IntPtr gdk_display_manager_get_default_display (IntPtr display_manager);
169 [DllImport("libgtk-x11-2.0.so")]
170 static extern IntPtr gtk_invisible_new ();
172 [DllImport("libgtk-x11-2.0.so")]
173 static extern IntPtr gtk_menu_new ();
175 [DllImport("libgtk-x11-2.0.so")]
176 static extern IntPtr gtk_menu_item_new_with_label (string label);
178 [DllImport("libgtk-x11-2.0.so")]
179 static extern void gtk_widget_ensure_style (IntPtr raw);
181 [DllImport("libgtk-x11-2.0.so")]
182 static extern IntPtr gtk_widget_get_style (IntPtr raw);
183 #endregion // DllImports