/platform/osx/scaffold/cui.d

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