driver.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.Collections.Generic;
  3. using Unix.Terminal;
  4. namespace Terminal {
  5. public class ColorScheme {
  6. public int Normal;
  7. public int Focus;
  8. public int HotNormal;
  9. public int HotFocus;
  10. public int Marked => HotNormal;
  11. public int MarkedSelected => HotFocus;
  12. }
  13. public abstract class ConsoleDriver {
  14. public abstract int Cols {get;}
  15. public abstract int Rows {get;}
  16. public abstract void Init ();
  17. public abstract void Move (int line, int col);
  18. public abstract void AddCh (int ch);
  19. public abstract void PrepareToRun ();
  20. public abstract void Refresh ();
  21. public abstract void End ();
  22. public abstract void RedrawTop ();
  23. // Colors used for widgets
  24. public static ColorScheme ColorBase, ColorDialog, ColorMenu, ColorError;
  25. }
  26. public class CursesDriver : ConsoleDriver {
  27. public override int Cols => Curses.Cols;
  28. public override int Rows => Curses.Lines;
  29. public override void Move(int col, int row) => Curses.move (row, col);
  30. public override void AddCh(int ch) => Curses.addch (ch);
  31. public override void Refresh() => Curses.refresh ();
  32. public override void End() => Curses.endwin ();
  33. public override void RedrawTop() => window.redrawwin ();
  34. public Curses.Window window;
  35. static short last_color_pair;
  36. static int MakeColor (short f, short b)
  37. {
  38. Curses.InitColorPair (++last_color_pair, f, b);
  39. return Curses.ColorPair (last_color_pair);
  40. }
  41. public override void PrepareToRun()
  42. {
  43. Curses.timeout (-1);
  44. }
  45. public override void Init()
  46. {
  47. if (window != null)
  48. return;
  49. try {
  50. window = Curses.initscr ();
  51. } catch (Exception e){
  52. Console.WriteLine ("Curses failed to initialize, the exception is: " + e);
  53. }
  54. Curses.raw ();
  55. Curses.noecho ();
  56. Curses.Window.Standard.keypad (true);
  57. ColorBase = new ColorScheme ();
  58. ColorDialog = new ColorScheme ();
  59. ColorMenu = new ColorScheme ();
  60. ColorError = new ColorScheme ();
  61. if (Curses.HasColors){
  62. Curses.StartColor ();
  63. Curses.UseDefaultColors ();
  64. ColorBase.Normal = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_BLUE);
  65. ColorBase.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_CYAN);
  66. ColorBase.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLUE);
  67. ColorBase.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_CYAN);
  68. ColorMenu.Normal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_CYAN);
  69. ColorMenu.Focus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_CYAN);
  70. ColorMenu.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_BLACK);
  71. ColorMenu.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLACK);
  72. ColorDialog.Normal = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE);
  73. ColorDialog.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_CYAN);
  74. ColorDialog.HotNormal = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_WHITE);
  75. ColorDialog.HotFocus = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_CYAN);
  76. ColorError.Normal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_RED);
  77. ColorError.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE);
  78. ColorError.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_RED);
  79. ColorError.HotFocus = ColorError.HotNormal;
  80. } else {
  81. ColorBase.Normal = Curses.A_NORMAL;
  82. ColorBase.Focus = Curses.A_REVERSE;
  83. ColorBase.HotNormal = Curses.A_BOLD;
  84. ColorBase.HotFocus = Curses.A_BOLD | Curses.A_REVERSE;
  85. ColorMenu.Normal = Curses.A_REVERSE;
  86. ColorMenu.Focus = Curses.A_NORMAL;
  87. ColorMenu.HotNormal = Curses.A_BOLD;
  88. ColorMenu.HotFocus = Curses.A_NORMAL;
  89. ColorDialog.Normal = Curses.A_REVERSE;
  90. ColorDialog.Focus = Curses.A_NORMAL;
  91. ColorDialog.HotNormal = Curses.A_BOLD;
  92. ColorDialog.HotFocus = Curses.A_NORMAL;
  93. ColorError.Normal = Curses.A_BOLD;
  94. ColorError.Focus = Curses.A_BOLD | Curses.A_REVERSE;
  95. ColorError.HotNormal = Curses.A_BOLD | Curses.A_REVERSE;
  96. ColorError.HotFocus = Curses.A_REVERSE;
  97. }
  98. }
  99. }
  100. }