/platform/unix/scaffold/cui.d

http://github.com/wilkie/djehuty · D · 180 lines · 137 code · 30 blank · 13 comment · 36 complexity · 83c6270b46b66e877f8c7b7e11faf156 MD5 · raw file

  1. /*
  2. * cui.d
  3. *
  4. * This module implements the Cui event loop.
  5. *
  6. * Author: Dave Wilkinson
  7. * Originated: August 17th 2009
  8. *
  9. */
  10. module scaffold.cui;
  11. import platform.vars.cui;
  12. import platform.unix.common;
  13. import scaffold.console;
  14. import core.definitions;
  15. import platform.application;
  16. void CuiStart(CuiPlatformVars* vars) {
  17. Curses.savetty();
  18. ApplicationController app = ApplicationController.instance();
  19. app.usingCurses = true;
  20. setvbuf (stdout, null, _IONBF, 0);
  21. Curses.initscr();
  22. setlocale(LC_ALL, "");
  23. setlocale(LC_CTYPE, "");
  24. Curses.start_color();
  25. Curses.keypad(Curses.stdscr, 1);
  26. Curses.move(0,0);
  27. Curses.nonl();
  28. Curses.cbreak();
  29. Curses.noecho();
  30. Curses.raw();
  31. Curses.mmask_t oldmask;
  32. Curses.mousemask(Curses.ALL_MOUSE_EVENTS | Curses.REPORT_MOUSE_POSITION, &oldmask);
  33. Curses.mouseinterval(0);
  34. // Get current position
  35. m_x = 0;
  36. m_y = 0;
  37. Curses.getmaxyx(Curses.stdscr, m_height, m_width);
  38. setvbuf (stdout, null, _IONBF, 0);
  39. }
  40. void CuiEnd(CuiPlatformVars* vars) {
  41. if (ApplicationController.instance.usingCurses) {
  42. ApplicationController.instance.usingCurses = false;
  43. }
  44. Curses.endwin();
  45. Curses.reset_shell_mode();
  46. Curses.resetterm();
  47. }
  48. void CuiNextEvent(CuiEvent* evt, CuiPlatformVars* vars) {
  49. start:
  50. static int mouse_x = -1;
  51. static int mouse_y = -1;
  52. //become IO bound
  53. ulong ky; uint tky;
  54. Key key = consoleGetKey();
  55. if (key.code == Curses.KEY_RESIZE) {
  56. // Resize
  57. evt.type = CuiEvent.Type.Size;
  58. return;
  59. }
  60. else if (key.code == Curses.KEY_MOUSE) {
  61. // Mouse
  62. Curses.MEVENT event;
  63. if (Curses.getmouse(&event) == Curses.ERR) {
  64. goto start;
  65. }
  66. evt.info.mouse.x = event.x;
  67. evt.info.mouse.y = event.y;
  68. const auto CLICKED = Curses.BUTTON1_CLICKED | Curses.BUTTON2_CLICKED |
  69. Curses.BUTTON3_CLICKED | Curses.BUTTON4_CLICKED |
  70. Curses.BUTTON5_CLICKED;
  71. const auto DOUBLE_CLICKED = Curses.BUTTON1_DOUBLE_CLICKED | Curses.BUTTON2_DOUBLE_CLICKED |
  72. Curses.BUTTON3_DOUBLE_CLICKED | Curses.BUTTON4_DOUBLE_CLICKED |
  73. Curses.BUTTON5_DOUBLE_CLICKED;
  74. const auto TRIPLE_CLICKED = Curses.BUTTON1_DOUBLE_CLICKED | Curses.BUTTON2_DOUBLE_CLICKED |
  75. Curses.BUTTON3_TRIPLE_CLICKED | Curses.BUTTON4_DOUBLE_CLICKED |
  76. Curses.BUTTON5_TRIPLE_CLICKED;
  77. if (event.bstate & CLICKED) {
  78. evt.info.mouse.clicks = 1;
  79. }
  80. else if (event.bstate & DOUBLE_CLICKED) {
  81. evt.info.mouse.clicks = 2;
  82. }
  83. else if (event.bstate & TRIPLE_CLICKED) {
  84. evt.info.mouse.clicks = 3;
  85. }
  86. if (event.bstate & Curses.BUTTON1_PRESSED) {
  87. evt.type = CuiEvent.Type.MouseDown;
  88. evt.info.mouse.leftDown = true;
  89. evt.aux = 0;
  90. return;
  91. }
  92. else if (event.bstate & Curses.BUTTON2_PRESSED) {
  93. evt.type = CuiEvent.Type.MouseDown;
  94. evt.info.mouse.rightDown = true;
  95. evt.aux = 1;
  96. return;
  97. }
  98. else if (event.bstate & Curses.BUTTON3_PRESSED) {
  99. evt.type = CuiEvent.Type.MouseDown;
  100. evt.info.mouse.middleDown = true;
  101. evt.aux = 2;
  102. return;
  103. }
  104. else if (event.bstate & Curses.BUTTON4_PRESSED) {
  105. evt.type = CuiEvent.Type.MouseDown;
  106. evt.aux = 3;
  107. return;
  108. }
  109. else if (event.bstate & Curses.BUTTON5_PRESSED) {
  110. evt.type = CuiEvent.Type.MouseDown;
  111. evt.aux = 4;
  112. return;
  113. }
  114. else if (event.bstate & Curses.BUTTON1_RELEASED) {
  115. evt.type = CuiEvent.Type.MouseUp;
  116. evt.aux = 0;
  117. return;
  118. }
  119. else if (event.bstate & Curses.BUTTON2_RELEASED) {
  120. evt.type = CuiEvent.Type.MouseUp;
  121. evt.aux = 1;
  122. return;
  123. }
  124. else if (event.bstate & Curses.BUTTON3_RELEASED) {
  125. evt.type = CuiEvent.Type.MouseUp;
  126. evt.aux = 2;
  127. return;
  128. }
  129. else if (event.bstate & Curses.BUTTON4_RELEASED) {
  130. evt.type = CuiEvent.Type.MouseUp;
  131. evt.aux = 3;
  132. return;
  133. }
  134. else if (event.bstate & Curses.BUTTON5_RELEASED) {
  135. evt.type = CuiEvent.Type.MouseUp;
  136. evt.aux = 4;
  137. return;
  138. }
  139. if ((event.x != mouse_x) || (event.y != mouse_y)) {
  140. mouse_x = event.x;
  141. mouse_y = event.y;
  142. evt.type = CuiEvent.Type.MouseMove;
  143. return;
  144. }
  145. goto start;
  146. }
  147. evt.type = CuiEvent.Type.KeyDown;
  148. evt.info.key = key;
  149. return;
  150. }