banshee r3372 - in trunk/banshee: . src/Libraries/Hyena src/Libraries/Hyena/Hyena



Author: abock
Date: Tue Mar  4 16:47:23 2008
New Revision: 3372
URL: http://svn.gnome.org/viewvc/banshee?rev=3372&view=rev

Log:
2008-03-04  Aaron Bockover  <abock gnome org>

    * src/Libraries/Hyena/Hyena/ConsoleCrayon.cs: A workaround for the somewhat
    broken terminfo driver for setting console colors in System.Console on
    Mono. If xterm and tty is detected, ANSI control codes will be used to
    color the console, otherwise if the runtime is not mono and the OS is
    not unix, the regular System.Console API will be used

    * src/Libraries/Hyena/Hyena/Log.cs: Use Hyena.ConsoleCrayon instead of
    System.Console to set/reset the terminal colors



Added:
   trunk/banshee/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Libraries/Hyena/Hyena.mdp
   trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs
   trunk/banshee/src/Libraries/Hyena/Makefile.am

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.mdp	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.mdp	Tue Mar  4 16:47:23 2008
@@ -81,6 +81,7 @@
     <File name="Hyena/Log.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/CryptoUtil.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/IntegerKeyedObjectQueryValue.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena/ConsoleCrayon.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

Added: trunk/banshee/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Libraries/Hyena/Hyena/ConsoleCrayon.cs	Tue Mar  4 16:47:23 2008
@@ -0,0 +1,252 @@
+//
+// ConsoleCrayon.cs
+//
+// Author:
+//   Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace Hyena
+{
+    public static class ConsoleCrayon
+    {
+
+#region Public API
+
+        private static ConsoleColor foreground_color;
+        public static ConsoleColor ForegroundColor {
+            get { return foreground_color; }
+            set {
+                foreground_color = value;
+                SetColor (foreground_color, true);
+            }
+        }
+
+        private static ConsoleColor background_color;
+        public static ConsoleColor BackgroundColor {
+            get { return background_color; }
+            set {
+                background_color = value;
+                SetColor (background_color, false);
+            }
+        }
+
+        public static void ResetColor ()
+        {
+            if (XtermColors) {
+                Console.Write (GetAnsiResetControlCode ());
+            } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) {
+                Console.ResetColor ();
+            }
+        }
+
+        private static void SetColor (ConsoleColor color, bool isForeground)
+        {
+            if (color < ConsoleColor.Black || color > ConsoleColor.White) {
+                throw new ArgumentOutOfRangeException ("color", "Not a ConsoleColor value.");
+            }
+
+            if (XtermColors) {
+                Console.Write (GetAnsiColorControlCode (color, isForeground));
+            } else if (Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) {
+                if (isForeground) {
+                    Console.ForegroundColor = color;
+                } else {
+                    Console.BackgroundColor = color;
+                }
+            }
+        }
+
+#endregion
+
+#region Ansi/VT Code Calculation
+
+        // FIXME: These may not be the best mappings.
+        //        << 8 indicates the color as a high code
+        //        which will make it bold (1;)
+        private static int ConsoleColorToAnsiIndex (ConsoleColor color)
+        {
+            switch (color) {
+                case ConsoleColor.Red: return 1 << 8;
+                case ConsoleColor.Green: return 2 << 8;
+                case ConsoleColor.Yellow: return 3 << 8;
+                case ConsoleColor.Blue: return 4 << 8;
+                case ConsoleColor.Magenta: return 5 << 8;
+                case ConsoleColor.Cyan: return 6 << 8;
+                case ConsoleColor.Black: return 0;
+                case ConsoleColor.DarkRed: return 1;
+                case ConsoleColor.DarkGreen: return 2;
+                case ConsoleColor.DarkYellow: return 3;
+                case ConsoleColor.DarkBlue: return 4;
+                case ConsoleColor.DarkMagenta: return 5;
+                case ConsoleColor.DarkCyan: return 6;
+                case ConsoleColor.DarkGray:
+                case ConsoleColor.Gray:
+                case ConsoleColor.White:
+                default: return 7;
+            }
+        }
+
+        private static string GetAnsiColorControlCode (ConsoleColor color, bool isForeground)
+        {
+            int index = ConsoleColorToAnsiIndex (color);
+            string highcode = String.Empty;
+
+            if ((index >> 8) > 0) {
+                highcode = "1;";
+                index >>= 8;
+            }
+
+            return String.Format ("\x001b[{0}{1}m", highcode, (isForeground ? 30 : 40) + index);
+        }
+
+        private static string GetAnsiResetControlCode ()
+        {
+            return "\x001b[0m";
+        }
+
+#endregion
+
+#region xterm Detection
+
+        private static bool? xterm_colors = null;
+        public static bool XtermColors { 
+            get {
+                if (xterm_colors == null) {
+                    DetectXtermColors ();
+                }
+
+                return xterm_colors.Value;
+            }
+        }
+
+        [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")]
+        private extern static int _isatty (int fd);
+            
+        private static bool isatty (int fd)
+        {
+            try {
+                return _isatty (fd) == 1;
+            } catch {
+                return false;
+            }
+        }
+
+        private static void DetectXtermColors ()
+        {
+            bool _xterm_colors = false;
+                
+            switch (Environment.GetEnvironmentVariable ("TERM")){
+                case "xterm":
+                case "rxvt":
+                case "rxvt-unicode": 
+                    if (Environment.GetEnvironmentVariable ("COLORTERM") != null) {
+                        _xterm_colors = true;
+                    }
+                    break;
+                case "xterm-color":
+                    _xterm_colors = true;
+                    break;
+            }
+
+            Console.WriteLine (_xterm_colors);
+            
+            xterm_colors = _xterm_colors && isatty (1) && isatty (2);
+        }
+
+#endregion
+
+#region Runtime Detection
+
+        private static bool? runtime_is_mono;
+        public static bool RuntimeIsMono {
+            get { 
+                if (runtime_is_mono == null) {
+                    runtime_is_mono = Type.GetType ("System.MonoType") != null;
+                }
+
+                return runtime_is_mono.Value;
+            }
+        }
+
+#endregion
+
+#region Tests
+
+        public static void Test ()
+        {
+            TestSelf ();
+            Console.WriteLine ();
+            TestAnsi ();
+            Console.WriteLine ();
+            TestRuntime ();
+        }
+
+        private static void TestSelf ()
+        {
+            Console.WriteLine ("==SELF TEST==");
+            foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) {
+                ForegroundColor = color;
+                Console.Write (color);
+                ResetColor ();
+                Console.Write (" :: ");
+                BackgroundColor = color;
+                Console.Write (color);
+                ResetColor ();
+                Console.WriteLine ();
+            }
+        }
+
+        private static void TestAnsi ()
+        {
+            Console.WriteLine ("==ANSI TEST==");
+            foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) {
+                string color_code_fg = GetAnsiColorControlCode (color, true);
+                string color_code_bg = GetAnsiColorControlCode (color, false);
+                Console.Write ("{0}{1}: {2}{3} :: {4}{1}: {5}{3}", color_code_fg, color, color_code_fg.Substring (2),
+                    GetAnsiResetControlCode (), color_code_bg, color_code_bg.Substring (2));
+                Console.WriteLine ();
+            }
+        }
+
+        private static void TestRuntime ()
+        {
+            Console.WriteLine ("==RUNTIME TEST==");
+            foreach (ConsoleColor color in Enum.GetValues (typeof (ConsoleColor))) {
+                Console.ForegroundColor = color;
+                Console.Write (color);
+                Console.ResetColor ();
+                Console.Write (" :: ");
+                Console.BackgroundColor = color;
+                Console.Write (color);
+                Console.ResetColor ();
+                Console.WriteLine ();
+            }
+        }
+
+#endregion
+
+    }
+}

Modified: trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena/Log.cs	Tue Mar  4 16:47:23 2008
@@ -108,16 +108,16 @@
         
             if (type != LogEntryType.Information || (type == LogEntryType.Information && !showUser)) {
                 switch (type) {
-                    case LogEntryType.Error: Console.ForegroundColor = ConsoleColor.Red; break;
-                    case LogEntryType.Warning: Console.ForegroundColor = ConsoleColor.DarkYellow; break;
-                    case LogEntryType.Information: Console.ForegroundColor = ConsoleColor.Green; break;
-                    case LogEntryType.Debug: Console.ForegroundColor = ConsoleColor.Blue; break;
+                    case LogEntryType.Error: ConsoleCrayon.ForegroundColor = ConsoleColor.Red; break;
+                    case LogEntryType.Warning: ConsoleCrayon.ForegroundColor = ConsoleColor.Yellow; break;
+                    case LogEntryType.Information: ConsoleCrayon.ForegroundColor = ConsoleColor.Green; break;
+                    case LogEntryType.Debug: ConsoleCrayon.ForegroundColor = ConsoleColor.Blue; break;
                 }
                 
                 Console.Write ("[{0} {1:00}:{2:00}:{3:00}.{4:000}]", TypeString (type), DateTime.Now.Hour,
                     DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
                 
-                Console.ResetColor ();
+                ConsoleCrayon.ResetColor ();
                                
                 if (details != null) {
                     Console.WriteLine (" {0} - {1}", message, details);

Modified: trunk/banshee/src/Libraries/Hyena/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena/Makefile.am	Tue Mar  4 16:47:23 2008
@@ -68,6 +68,7 @@
 	Hyena.SExpEngine/StringFunctionSet.cs \
 	Hyena.SExpEngine/TreeNode.cs \
 	Hyena.SExpEngine/UtilityFunctionSet.cs \
+	Hyena/ConsoleCrayon.cs \
 	Hyena/CryptoUtil.cs \
 	Hyena/DateTimeUtil.cs \
 	Hyena/IUndoAction.cs \



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]