curses 1.3.0 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +19 -0
  3. data/.github/workflows/ubuntu.yml +26 -0
  4. data/.github/workflows/windows.yml +25 -0
  5. data/History.md +34 -0
  6. data/README.md +14 -46
  7. data/Rakefile +0 -86
  8. data/curses.gemspec +2 -3
  9. data/ext/curses/curses.c +70 -58
  10. data/ext/curses/extconf.rb +134 -21
  11. data/lib/curses.rb +5 -12
  12. data/sample/addch.rb +16 -0
  13. data/sample/attr_demo.rb +32 -0
  14. data/sample/colors.rb +26 -0
  15. data/sample/menu.rb +3 -3
  16. data/sample/mouse_move.rb +75 -0
  17. data/vendor/PDCurses/.gitignore +47 -0
  18. data/vendor/PDCurses/.travis.yml +49 -0
  19. data/vendor/PDCurses/CMakeLists.txt +68 -0
  20. data/vendor/PDCurses/HISTORY.md +2036 -0
  21. data/vendor/PDCurses/IMPLEMNT.md +327 -0
  22. data/vendor/PDCurses/README.md +77 -0
  23. data/vendor/PDCurses/acs_defs.h +265 -0
  24. data/vendor/PDCurses/appveyor.yml +218 -0
  25. data/vendor/PDCurses/cmake/README.md +71 -0
  26. data/vendor/PDCurses/cmake/build_dependencies.cmake +178 -0
  27. data/vendor/PDCurses/cmake/build_options.cmake +25 -0
  28. data/vendor/PDCurses/cmake/dll_version.cmake +26 -0
  29. data/vendor/PDCurses/cmake/gen_config_header.cmake +43 -0
  30. data/vendor/PDCurses/cmake/get_version.cmake +17 -0
  31. data/vendor/PDCurses/cmake/make_uninstall.cmake +19 -0
  32. data/vendor/PDCurses/cmake/project_common.cmake +121 -0
  33. data/vendor/PDCurses/cmake/resource.in.cmake +52 -0
  34. data/vendor/PDCurses/cmake/sdl2_ttf/CMakeLists.txt +83 -0
  35. data/vendor/PDCurses/cmake/target_arch.cmake +36 -0
  36. data/vendor/PDCurses/cmake/version.in.cmake +73 -0
  37. data/vendor/PDCurses/cmake/watcom_open_dos16_toolchain.cmake +96 -0
  38. data/vendor/PDCurses/cmake/watcom_open_dos32_toolchain.cmake +106 -0
  39. data/vendor/PDCurses/cmake/watcom_open_os2v2_toolchain.cmake +105 -0
  40. data/vendor/PDCurses/curses.h +1846 -0
  41. data/vendor/PDCurses/curspriv.h +134 -0
  42. data/vendor/PDCurses/demos/README.md +25 -0
  43. data/vendor/PDCurses/demos/firework.c +144 -0
  44. data/vendor/PDCurses/demos/newtest.c +581 -0
  45. data/vendor/PDCurses/demos/ozdemo.c +447 -0
  46. data/vendor/PDCurses/demos/ptest.c +283 -0
  47. data/vendor/PDCurses/demos/rain.c +157 -0
  48. data/vendor/PDCurses/demos/testcurs.c +1607 -0
  49. data/vendor/PDCurses/demos/tui.c +1048 -0
  50. data/vendor/PDCurses/demos/tui.h +65 -0
  51. data/vendor/PDCurses/demos/tuidemo.c +233 -0
  52. data/vendor/PDCurses/demos/version.c +61 -0
  53. data/vendor/PDCurses/demos/worm.c +432 -0
  54. data/vendor/PDCurses/demos/xmas.c +955 -0
  55. data/vendor/PDCurses/dos/CMakeLists.txt +47 -0
  56. data/vendor/PDCurses/dos/Makefile.bcc +83 -0
  57. data/vendor/PDCurses/dos/Makefile.dmc +257 -0
  58. data/vendor/PDCurses/dos/Makefile.msc +113 -0
  59. data/vendor/PDCurses/dos/Makefile.wcc +107 -0
  60. data/vendor/PDCurses/dos/README.md +51 -0
  61. data/vendor/PDCurses/dos/bccdos.lrf +9 -0
  62. data/vendor/PDCurses/dos/mscdos.lrf +50 -0
  63. data/vendor/PDCurses/dos/pdcclip.c +132 -0
  64. data/vendor/PDCurses/dos/pdcdisp.c +135 -0
  65. data/vendor/PDCurses/dos/pdcdos.h +194 -0
  66. data/vendor/PDCurses/dos/pdcgetsc.c +98 -0
  67. data/vendor/PDCurses/dos/pdckbd.c +513 -0
  68. data/vendor/PDCurses/dos/pdcscrn.c +785 -0
  69. data/vendor/PDCurses/dos/pdcsetsc.c +101 -0
  70. data/vendor/PDCurses/dos/pdcutil.c +212 -0
  71. data/vendor/PDCurses/libobjs.mif +26 -0
  72. data/vendor/PDCurses/makedist.mif +20 -0
  73. data/vendor/PDCurses/man/README.md +21 -0
  74. data/vendor/PDCurses/man/intro.md +361 -0
  75. data/vendor/PDCurses/man/manext.c +119 -0
  76. data/vendor/PDCurses/man/sdl.md +152 -0
  77. data/vendor/PDCurses/man/sdl2.md +58 -0
  78. data/vendor/PDCurses/man/x11.md +407 -0
  79. data/vendor/PDCurses/ncurses/CMakeLists.txt +66 -0
  80. data/vendor/PDCurses/ncurses/README.md +26 -0
  81. data/vendor/PDCurses/ncurses/makefile +29 -0
  82. data/vendor/PDCurses/os2/CMakeLists.txt +41 -0
  83. data/vendor/PDCurses/os2/Makefile.bcc +90 -0
  84. data/vendor/PDCurses/os2/Makefile.wcc +43 -0
  85. data/vendor/PDCurses/os2/README.md +43 -0
  86. data/vendor/PDCurses/os2/iccos2.lrf +50 -0
  87. data/vendor/PDCurses/os2/iccos2.mak +256 -0
  88. data/vendor/PDCurses/os2/pdcclip.c +188 -0
  89. data/vendor/PDCurses/os2/pdcdisp.c +93 -0
  90. data/vendor/PDCurses/os2/pdcgetsc.c +89 -0
  91. data/vendor/PDCurses/os2/pdckbd.c +521 -0
  92. data/vendor/PDCurses/os2/pdcos2.h +55 -0
  93. data/vendor/PDCurses/os2/pdcscrn.c +449 -0
  94. data/vendor/PDCurses/os2/pdcsetsc.c +112 -0
  95. data/vendor/PDCurses/os2/pdcutil.c +52 -0
  96. data/vendor/PDCurses/panel.h +56 -0
  97. data/vendor/PDCurses/pdcurses/README.md +25 -0
  98. data/vendor/PDCurses/pdcurses/addch.c +693 -0
  99. data/vendor/PDCurses/pdcurses/addchstr.c +245 -0
  100. data/vendor/PDCurses/pdcurses/addstr.c +240 -0
  101. data/vendor/PDCurses/pdcurses/attr.c +359 -0
  102. data/vendor/PDCurses/pdcurses/beep.c +68 -0
  103. data/vendor/PDCurses/pdcurses/bkgd.c +223 -0
  104. data/vendor/PDCurses/pdcurses/border.c +411 -0
  105. data/vendor/PDCurses/pdcurses/clear.c +159 -0
  106. data/vendor/PDCurses/pdcurses/color.c +298 -0
  107. data/vendor/PDCurses/pdcurses/debug.c +109 -0
  108. data/vendor/PDCurses/pdcurses/delch.c +96 -0
  109. data/vendor/PDCurses/pdcurses/deleteln.c +211 -0
  110. data/vendor/PDCurses/pdcurses/deprec.c +27 -0
  111. data/vendor/PDCurses/pdcurses/getch.c +417 -0
  112. data/vendor/PDCurses/pdcurses/getstr.c +474 -0
  113. data/vendor/PDCurses/pdcurses/getyx.c +139 -0
  114. data/vendor/PDCurses/pdcurses/inch.c +127 -0
  115. data/vendor/PDCurses/pdcurses/inchstr.c +214 -0
  116. data/vendor/PDCurses/pdcurses/initscr.c +367 -0
  117. data/vendor/PDCurses/pdcurses/inopts.c +324 -0
  118. data/vendor/PDCurses/pdcurses/insch.c +271 -0
  119. data/vendor/PDCurses/pdcurses/insstr.c +264 -0
  120. data/vendor/PDCurses/pdcurses/instr.c +246 -0
  121. data/vendor/PDCurses/pdcurses/kernel.c +259 -0
  122. data/vendor/PDCurses/pdcurses/keyname.c +157 -0
  123. data/vendor/PDCurses/pdcurses/mouse.c +438 -0
  124. data/vendor/PDCurses/pdcurses/move.c +57 -0
  125. data/vendor/PDCurses/pdcurses/outopts.c +159 -0
  126. data/vendor/PDCurses/pdcurses/overlay.c +214 -0
  127. data/vendor/PDCurses/pdcurses/pad.c +260 -0
  128. data/vendor/PDCurses/pdcurses/panel.c +633 -0
  129. data/vendor/PDCurses/pdcurses/printw.c +126 -0
  130. data/vendor/PDCurses/pdcurses/refresh.c +279 -0
  131. data/vendor/PDCurses/pdcurses/scanw.c +578 -0
  132. data/vendor/PDCurses/pdcurses/scr_dump.c +213 -0
  133. data/vendor/PDCurses/pdcurses/scroll.c +101 -0
  134. data/vendor/PDCurses/pdcurses/slk.c +591 -0
  135. data/vendor/PDCurses/pdcurses/termattr.c +182 -0
  136. data/vendor/PDCurses/pdcurses/terminfo.c +217 -0
  137. data/vendor/PDCurses/pdcurses/touch.c +163 -0
  138. data/vendor/PDCurses/pdcurses/util.c +312 -0
  139. data/vendor/PDCurses/pdcurses/window.c +569 -0
  140. data/vendor/PDCurses/sdl1/Makefile.mng +110 -0
  141. data/vendor/PDCurses/sdl1/README.md +31 -0
  142. data/vendor/PDCurses/sdl1/deffont.h +385 -0
  143. data/vendor/PDCurses/sdl1/deficon.h +23 -0
  144. data/vendor/PDCurses/sdl1/pdcclip.c +131 -0
  145. data/vendor/PDCurses/sdl1/pdcdisp.c +373 -0
  146. data/vendor/PDCurses/sdl1/pdcgetsc.c +30 -0
  147. data/vendor/PDCurses/sdl1/pdckbd.c +405 -0
  148. data/vendor/PDCurses/sdl1/pdcscrn.c +414 -0
  149. data/vendor/PDCurses/sdl1/pdcsdl.h +31 -0
  150. data/vendor/PDCurses/sdl1/pdcsetsc.c +64 -0
  151. data/vendor/PDCurses/sdl1/pdcutil.c +40 -0
  152. data/vendor/PDCurses/sdl1/sdltest.c +79 -0
  153. data/vendor/PDCurses/sdl2/CMakeLists.txt +76 -0
  154. data/vendor/PDCurses/sdl2/Makefile.vc +164 -0
  155. data/vendor/PDCurses/sdl2/README.md +34 -0
  156. data/vendor/PDCurses/sdl2/deffont.h +385 -0
  157. data/vendor/PDCurses/sdl2/deficon.h +23 -0
  158. data/vendor/PDCurses/sdl2/pdcclip.c +93 -0
  159. data/vendor/PDCurses/sdl2/pdcdisp.c +534 -0
  160. data/vendor/PDCurses/sdl2/pdcgetsc.c +30 -0
  161. data/vendor/PDCurses/sdl2/pdckbd.c +480 -0
  162. data/vendor/PDCurses/sdl2/pdcscrn.c +443 -0
  163. data/vendor/PDCurses/sdl2/pdcsdl.h +33 -0
  164. data/vendor/PDCurses/sdl2/pdcsetsc.c +67 -0
  165. data/vendor/PDCurses/sdl2/pdcutil.c +39 -0
  166. data/vendor/PDCurses/sdl2/sdltest.c +81 -0
  167. data/vendor/PDCurses/term.h +48 -0
  168. data/vendor/PDCurses/version.mif +7 -0
  169. data/vendor/PDCurses/vt/CMakeLists.txt +28 -0
  170. data/vendor/PDCurses/vt/Makefile.bcc +111 -0
  171. data/vendor/PDCurses/vt/Makefile.dmc +258 -0
  172. data/vendor/PDCurses/vt/Makefile.vc +144 -0
  173. data/vendor/PDCurses/vt/Makefile.wcc +107 -0
  174. data/vendor/PDCurses/vt/README.md +64 -0
  175. data/vendor/PDCurses/vt/pdcclip.c +20 -0
  176. data/vendor/PDCurses/vt/pdcdisp.c +284 -0
  177. data/vendor/PDCurses/vt/pdcgetsc.c +27 -0
  178. data/vendor/PDCurses/vt/pdckbd.c +394 -0
  179. data/vendor/PDCurses/vt/pdcscrn.c +434 -0
  180. data/vendor/PDCurses/vt/pdcsetsc.c +45 -0
  181. data/vendor/PDCurses/vt/pdcutil.c +43 -0
  182. data/vendor/PDCurses/vt/pdcvt.h +16 -0
  183. data/vendor/PDCurses/watcom.mif +68 -0
  184. data/vendor/PDCurses/wincon/CMakeLists.txt +27 -0
  185. data/vendor/PDCurses/wincon/Makefile.bcc +88 -0
  186. data/vendor/PDCurses/wincon/Makefile.dmc +256 -0
  187. data/vendor/PDCurses/wincon/Makefile.lcc +273 -0
  188. data/vendor/PDCurses/wincon/Makefile.mng +176 -0
  189. data/vendor/PDCurses/wincon/Makefile.vc +144 -0
  190. data/vendor/PDCurses/wincon/Makefile.wcc +51 -0
  191. data/vendor/PDCurses/wincon/README.md +85 -0
  192. data/vendor/PDCurses/wincon/pdcclip.c +174 -0
  193. data/vendor/PDCurses/wincon/pdcdisp.c +143 -0
  194. data/vendor/PDCurses/wincon/pdcgetsc.c +55 -0
  195. data/vendor/PDCurses/wincon/pdckbd.c +786 -0
  196. data/vendor/PDCurses/wincon/pdcscrn.c +717 -0
  197. data/vendor/PDCurses/wincon/pdcsetsc.c +91 -0
  198. data/vendor/PDCurses/wincon/pdcurses.ico +0 -0
  199. data/vendor/PDCurses/wincon/pdcurses.rc +28 -0
  200. data/vendor/PDCurses/wincon/pdcutil.c +41 -0
  201. data/vendor/PDCurses/wincon/pdcwin.h +31 -0
  202. data/vendor/PDCurses/wingui/CMakeLists.txt +27 -0
  203. data/vendor/PDCurses/wingui/Makefile.bcc +85 -0
  204. data/vendor/PDCurses/wingui/Makefile.dmc +259 -0
  205. data/vendor/PDCurses/wingui/Makefile.lcc +273 -0
  206. data/vendor/PDCurses/wingui/Makefile.mng +171 -0
  207. data/vendor/PDCurses/wingui/Makefile.vc +144 -0
  208. data/vendor/PDCurses/wingui/Makefile.wcc +51 -0
  209. data/vendor/PDCurses/wingui/README.md +93 -0
  210. data/vendor/PDCurses/wingui/pdcclip.c +174 -0
  211. data/vendor/PDCurses/wingui/pdcdisp.c +718 -0
  212. data/vendor/PDCurses/wingui/pdcgetsc.c +30 -0
  213. data/vendor/PDCurses/wingui/pdckbd.c +143 -0
  214. data/vendor/PDCurses/wingui/pdcscrn.c +2797 -0
  215. data/vendor/PDCurses/wingui/pdcsetsc.c +89 -0
  216. data/vendor/PDCurses/wingui/pdcurses.ico +0 -0
  217. data/vendor/PDCurses/wingui/pdcurses.rc +28 -0
  218. data/vendor/PDCurses/wingui/pdcutil.c +61 -0
  219. data/vendor/PDCurses/wingui/pdcwin.h +122 -0
  220. data/vendor/PDCurses/x11/Makefile.in +754 -0
  221. data/vendor/PDCurses/x11/PDCurses.spec +82 -0
  222. data/vendor/PDCurses/x11/README.md +62 -0
  223. data/vendor/PDCurses/x11/ScrollBox.c +319 -0
  224. data/vendor/PDCurses/x11/ScrollBox.h +51 -0
  225. data/vendor/PDCurses/x11/ScrollBoxP.h +70 -0
  226. data/vendor/PDCurses/x11/aclocal.m4 +994 -0
  227. data/vendor/PDCurses/x11/big_icon.xbm +46 -0
  228. data/vendor/PDCurses/x11/compose.h +201 -0
  229. data/vendor/PDCurses/x11/config.guess +1500 -0
  230. data/vendor/PDCurses/x11/config.h.in +100 -0
  231. data/vendor/PDCurses/x11/config.sub +1616 -0
  232. data/vendor/PDCurses/x11/configure +6700 -0
  233. data/vendor/PDCurses/x11/configure.ac +295 -0
  234. data/vendor/PDCurses/x11/debian/changelog +6 -0
  235. data/vendor/PDCurses/x11/debian/compat +1 -0
  236. data/vendor/PDCurses/x11/debian/control +11 -0
  237. data/vendor/PDCurses/x11/debian/copyright +27 -0
  238. data/vendor/PDCurses/x11/debian/rules +98 -0
  239. data/vendor/PDCurses/x11/install-sh +253 -0
  240. data/vendor/PDCurses/x11/little_icon.xbm +14 -0
  241. data/vendor/PDCurses/x11/ncurses_cfg.h +45 -0
  242. data/vendor/PDCurses/x11/pdcclip.c +173 -0
  243. data/vendor/PDCurses/x11/pdcdisp.c +85 -0
  244. data/vendor/PDCurses/x11/pdcgetsc.c +28 -0
  245. data/vendor/PDCurses/x11/pdckbd.c +104 -0
  246. data/vendor/PDCurses/x11/pdcscrn.c +258 -0
  247. data/vendor/PDCurses/x11/pdcsetsc.c +95 -0
  248. data/vendor/PDCurses/x11/pdcutil.c +52 -0
  249. data/vendor/PDCurses/x11/pdcx11.c +316 -0
  250. data/vendor/PDCurses/x11/pdcx11.h +191 -0
  251. data/vendor/PDCurses/x11/sb.c +155 -0
  252. data/vendor/PDCurses/x11/x11.c +3686 -0
  253. data/vendor/PDCurses/x11/xcurses-config.in +81 -0
  254. metadata +258 -24
  255. data/.travis.yml +0 -16
  256. data/appveyor.yml +0 -16
@@ -0,0 +1,27 @@
1
+ /* Public Domain Curses */
2
+
3
+ #include <curspriv.h>
4
+
5
+ int PDC_get_cursor_mode(void)
6
+ {
7
+ PDC_LOG(("PDC_get_cursor_mode() - called\n"));
8
+
9
+ return SP->visibility;
10
+ }
11
+
12
+
13
+ int PDC_get_columns(void)
14
+ {
15
+ extern int PDC_cols;
16
+
17
+ PDC_LOG(("PDC_get_columns() - called\n"));
18
+ return( PDC_cols);
19
+ }
20
+
21
+ int PDC_get_rows(void)
22
+ {
23
+ extern int PDC_rows;
24
+
25
+ PDC_LOG(("PDC_get_rows() - called\n"));
26
+ return( PDC_rows);
27
+ }
@@ -0,0 +1,394 @@
1
+ #include <stdio.h>
2
+ #include <string.h>
3
+ #include <assert.h>
4
+ #if defined( _WIN32) || defined( DOS)
5
+ #include <conio.h>
6
+ #define USE_CONIO
7
+ #else
8
+ #include <sys/select.h>
9
+ #include <unistd.h>
10
+ #endif
11
+ #include "curspriv.h"
12
+
13
+ #if defined( __BORLANDC__) || defined( DOS)
14
+ #define WINDOWS_VERSION_OF_KBHIT kbhit
15
+ #else
16
+ #define WINDOWS_VERSION_OF_KBHIT _kbhit
17
+ #endif
18
+
19
+ /* Modified from the accepted answer at
20
+
21
+ https://stackoverflow.com/questions/33025599/move-the-cursor-in-a-c-program
22
+
23
+ _kbhit( ) returns -1 if no key has been hit, and the keycode if one
24
+ has been hit. You can just loop on it until the return value is >= 0.
25
+ Hitting a function or arrow or similar key will cause 27 (escape) to
26
+ be returned, followed by cryptic codes that depend on what terminal
27
+ emulation is in place.
28
+
29
+ Further info on VT100/ANSI control sequences is at
30
+
31
+ https://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html
32
+ */
33
+
34
+ extern bool PDC_resize_occurred;
35
+
36
+ static bool check_key( int *c)
37
+ {
38
+ bool rval;
39
+ #ifndef USE_CONIO
40
+ const int STDIN = 0;
41
+ struct timeval timeout;
42
+ fd_set rdset;
43
+
44
+ if( PDC_resize_occurred)
45
+ return( TRUE);
46
+ FD_ZERO( &rdset);
47
+ FD_SET( STDIN, &rdset);
48
+ timeout.tv_sec = 0;
49
+ timeout.tv_usec = 0;
50
+ if( select( STDIN + 1, &rdset, NULL, NULL, &timeout) > 0)
51
+ {
52
+ rval = TRUE;
53
+ if( c)
54
+ *c = getchar( );
55
+ }
56
+ else
57
+ rval = FALSE;
58
+ #else
59
+ if( WINDOWS_VERSION_OF_KBHIT( ))
60
+ {
61
+ rval = TRUE;
62
+ if( c)
63
+ *c = _getch( );
64
+ }
65
+ else
66
+ rval = FALSE;
67
+ #endif
68
+ return( rval);
69
+ }
70
+
71
+ bool PDC_check_key( void)
72
+ {
73
+ return( check_key( NULL));
74
+ }
75
+
76
+ void PDC_flushinp( void)
77
+ {
78
+ int thrown_away_char;
79
+
80
+ while( check_key( &thrown_away_char))
81
+ ;
82
+ }
83
+
84
+ #ifdef USE_CONIO
85
+ static int xlate_vt_codes_for_dos( const int key1, const int key2)
86
+ {
87
+ static const int tbl[] = {
88
+ KEY_UP, 72,
89
+ KEY_DOWN, 80,
90
+ KEY_LEFT, 75,
91
+ KEY_RIGHT, 77,
92
+ KEY_F(11), 133,
93
+ KEY_F(12), 134,
94
+ KEY_IC, 82,
95
+ KEY_DC, 83,
96
+ KEY_PPAGE, 73,
97
+ KEY_NPAGE, 81,
98
+ KEY_HOME, 2, '[', 'H',
99
+ KEY_END, 2, 'O', 'F',
100
+
101
+ KEY_F(1), 59,
102
+ KEY_F(2), 60,
103
+ KEY_F(3), 61,
104
+ KEY_F(4), 62,
105
+ KEY_F(5), 63,
106
+ KEY_F(6), 64,
107
+ KEY_F(7), 65,
108
+ KEY_F(8), 66,
109
+ KEY_F(9), 67,
110
+ KEY_F(10), 68,
111
+ 0, 0 };
112
+ int i, rval = 0;
113
+
114
+ for( i = 0; tbl[i] && !rval; i += 2)
115
+ if( key2 == tbl[i + 1])
116
+ rval = tbl[i];
117
+ return( rval);
118
+ }
119
+
120
+ #endif
121
+ /* Mouse events include six bytes. First three are
122
+
123
+ ESC [ M
124
+
125
+ Next byte is 96 for mouse wheel up, 97 for down, or (for more
126
+ "traditional" mouse events) 32 plus :
127
+
128
+ 0 for button 1
129
+ 1 for button 2
130
+ 2 for button 3
131
+ 3 for release
132
+ 4 if Shift is pressed
133
+ 8 if Alt (Meta) is pressed
134
+ 16 if Ctrl is pressed
135
+
136
+ Note that 'release' doesn't tell you _which_ is released. If only
137
+ one has been pressed (the usual case), it's presumably the one you
138
+ released. If two or more buttons are pressed simultaneously, the
139
+ "releases" are reported in the numerical order of the buttons, not
140
+ the order in which they're actually released (which we don't know).
141
+
142
+ My tilt mouse reports 'tilt left' as a left button (1) and 'tilt right'
143
+ as a middle button press. Wheel events get shift, alt, ctrl added in
144
+ (but that doesn't seem to be getting through in PDCurses... to be fixed).
145
+ Button events only get Ctrl (though I think you might get the other events
146
+ on some terminals).
147
+
148
+ "Correct" mouse handling will require that we detect a button-down,
149
+ then hold off for SP->mouse_wait to see if we get a release event. */
150
+
151
+ static int xlate_vt_codes( const int *c, const int count)
152
+ {
153
+ static const int tbl[] = {
154
+ KEY_UP, 2, '[', 'A',
155
+ KEY_DOWN, 2, '[', 'B',
156
+ KEY_LEFT, 2, '[', 'D',
157
+ KEY_RIGHT,2, '[', 'C',
158
+ KEY_HOME, 2, 'O', 'H',
159
+ KEY_HOME, 2, '[', 'H',
160
+ KEY_END, 2, 'O', 'F',
161
+ KEY_END, 2, '[', 'F',
162
+ KEY_B2, 2, '[', 'E',
163
+ KEY_IC, 3, '[', '2', '~',
164
+ KEY_DC, 3, '[', '3', '~',
165
+ KEY_PPAGE, 3, '[', '5', '~',
166
+ KEY_NPAGE, 3, '[', '6', '~',
167
+
168
+ CTL_LEFT, 5, '[', '1', ';', '5', 'D',
169
+ CTL_RIGHT, 5, '[', '1', ';', '5', 'C',
170
+ CTL_UP, 5, '[', '1', ';', '5', 'A',
171
+ CTL_DOWN, 5, '[', '1', ';', '5', 'B',
172
+
173
+ ALT_PGUP, 5, '[', '5', ';', '3', '~',
174
+ ALT_PGDN, 5, '[', '6', ';', '3', '~',
175
+
176
+ KEY_F(1), 3, '[', '[', 'A', /* Linux console */
177
+ KEY_F(2), 3, '[', '[', 'B',
178
+ KEY_F(3), 3, '[', '[', 'C',
179
+ KEY_F(4), 3, '[', '[', 'D',
180
+ KEY_F(5), 3, '[', '[', 'E',
181
+ KEY_END, 3, '[', '4', '~',
182
+ KEY_HOME, 3, '[', '1', '~',
183
+
184
+ KEY_F(1), 2, 'O', 'P',
185
+ KEY_F(1), 4, '[', '1', '1', '~',
186
+ KEY_F(2), 2, 'O', 'Q',
187
+ KEY_F(2), 4, '[', '1', '2', '~',
188
+ KEY_F(3), 2, 'O', 'R',
189
+ KEY_F(3), 4, '[', '1', '3', '~',
190
+ KEY_F(4), 2, 'O', 'S',
191
+ KEY_F(4), 4, '[', '1', '4', '~',
192
+ KEY_F(5), 4, '[', '1', '5', '~',
193
+ KEY_F(6), 4, '[', '1', '7', '~',
194
+ KEY_F(7), 4, '[', '1', '8', '~',
195
+ KEY_F(8), 4, '[', '1', '9', '~',
196
+ KEY_F(9), 4, '[', '2', '0', '~',
197
+ KEY_F(10), 4, '[', '2', '1', '~',
198
+ KEY_F(11), 4, '[', '2', '3', '~',
199
+ KEY_F(12), 4, '[', '2', '4', '~',
200
+ KEY_F(13), 5, '[', '1', ';', '2', 'P', /* shift-f1 */
201
+ KEY_F(14), 5, '[', '1', ';', '2', 'Q',
202
+ KEY_F(15), 5, '[', '1', ';', '2', 'R',
203
+ KEY_F(16), 5, '[', '1', ';', '2', 'S',
204
+ KEY_F(17), 6, '[', '1', '5', ';', '2', '~', /* shift-f5 */
205
+ KEY_F(18), 6, '[', '1', '7', ';', '2', '~',
206
+ KEY_F(19), 6, '[', '1', '8', ';', '2', '~',
207
+ KEY_F(20), 6, '[', '1', '9', ';', '2', '~',
208
+ KEY_F(21), 6, '[', '2', '0', ';', '2', '~',
209
+ KEY_F(22), 6, '[', '2', '1', ';', '2', '~',
210
+ KEY_F(23), 6, '[', '2', '3', ';', '2', '~', /* shift-f11 */
211
+ KEY_F(24), 6, '[', '2', '4', ';', '2', '~',
212
+ 27, 0,
213
+ 0 };
214
+ int i, rval = -1;
215
+ const int *tptr;
216
+
217
+ if( count == 1)
218
+ {
219
+ if( c[0] >= 'a' && c[0] <= 'z')
220
+ rval = ALT_A + c[0] - 'a';
221
+ if( c[0] >= '0' && c[0] <= '9')
222
+ rval = ALT_0 + c[0] - '0';
223
+ }
224
+ else if( count == 5 && c[0] == '[' && c[1] == 'M')
225
+ rval = KEY_MOUSE;
226
+ for( tptr = tbl; rval == -1 && *tptr; tptr += 2 + tptr[1])
227
+ if( count == tptr[1])
228
+ {
229
+ i = 0;
230
+ while( tptr[i + 2] == c[i] && i < count)
231
+ i++;
232
+ if( i == count)
233
+ rval = tptr[0];
234
+ }
235
+ return( rval);
236
+ }
237
+
238
+ int PDC_get_key( void)
239
+ {
240
+ int rval = -1;
241
+
242
+ if( PDC_resize_occurred)
243
+ {
244
+ PDC_resize_occurred = FALSE;
245
+ return( KEY_RESIZE);
246
+ }
247
+ if( check_key( &rval))
248
+ {
249
+ int c[13];
250
+
251
+ #ifdef USE_CONIO
252
+ SP->key_code = (rval == 0 || rval == 224);
253
+ if( SP->key_code)
254
+ {
255
+ int key2;
256
+
257
+ while( !check_key( &key2))
258
+ ;
259
+ rval = xlate_vt_codes_for_dos( rval, key2);
260
+ return( rval);
261
+ }
262
+
263
+ #endif
264
+ SP->key_code = (rval == 27);
265
+ if( rval == 27)
266
+ {
267
+ int count = 0;
268
+
269
+ while( count < 6 && check_key( &c[count])
270
+ && (rval = xlate_vt_codes( c, count + 1)) == -1)
271
+ count++;
272
+ if( rval == KEY_MOUSE)
273
+ {
274
+ int idx = (c[2] & 3), flags = 0, i;
275
+ const bool release = (idx == 3);
276
+ static int held = 0;
277
+
278
+ if( c[2] & 4)
279
+ flags |= PDC_BUTTON_SHIFT;
280
+ if( c[2] & 8)
281
+ flags |= PDC_BUTTON_ALT;
282
+ if( c[2] & 16)
283
+ flags |= PDC_BUTTON_CONTROL;
284
+ if( (c[2] & 0x60) == 0x40) /* mouse move */
285
+ {
286
+ int report_event = 0;
287
+
288
+ if( idx == 0 && (SP->_trap_mbe & BUTTON1_MOVED))
289
+ report_event |= 1;
290
+ if( idx == 1 && (SP->_trap_mbe & BUTTON2_MOVED))
291
+ report_event |= 2;
292
+ if( idx == 2 && (SP->_trap_mbe & BUTTON3_MOVED))
293
+ report_event |= 4;
294
+ if( report_event)
295
+ report_event |= PDC_MOUSE_MOVED;
296
+ else if( SP->_trap_mbe & REPORT_MOUSE_POSITION)
297
+ report_event = PDC_MOUSE_POSITION;
298
+ pdc_mouse_status.changes = report_event;
299
+ for( i = 0; i < 3; i++)
300
+ pdc_mouse_status.button[i] = (i == idx ? BUTTON_MOVED : 0);
301
+ idx = 3;
302
+ }
303
+ else if( idx == 3) /* it's a release */
304
+ {
305
+ idx = 0;
306
+ while( idx < 3 && !((held >> idx) & 1))
307
+ idx++;
308
+ held ^= (1 << idx);
309
+ }
310
+ if( idx < 3)
311
+ {
312
+ memset(&pdc_mouse_status, 0, sizeof(MOUSE_STATUS));
313
+ pdc_mouse_status.button[idx] =
314
+ (release ? BUTTON_RELEASED : BUTTON_PRESSED);
315
+ if( (c[2] & 0x60) == 0x60) /* actually mouse wheel event */
316
+ pdc_mouse_status.changes =
317
+ (idx ? PDC_MOUSE_WHEEL_DOWN : PDC_MOUSE_WHEEL_UP);
318
+ else /* "normal" mouse button */
319
+ pdc_mouse_status.changes = (1 << idx);
320
+ if( !release && !(c[2] & 64)) /* wait for a possible release */
321
+ {
322
+ int n_events = 0;
323
+
324
+ while( n_events < 5)
325
+ {
326
+ PDC_napms( SP->mouse_wait);
327
+ if( check_key( c))
328
+ {
329
+ count = 0;
330
+ while( count < 5 && check_key( &c[count]))
331
+ count++;
332
+ n_events++;
333
+ }
334
+ else
335
+ break;
336
+ }
337
+ if( !n_events) /* just a click, no release(s) */
338
+ held ^= (1 << idx);
339
+ else if( n_events == 1)
340
+ pdc_mouse_status.button[idx] = BUTTON_CLICKED;
341
+ else if( n_events <= 3)
342
+ pdc_mouse_status.button[idx] = BUTTON_DOUBLE_CLICKED;
343
+ else if( n_events <= 5)
344
+ pdc_mouse_status.button[idx] = BUTTON_TRIPLE_CLICKED;
345
+ }
346
+ }
347
+ for( i = 0; i < 3; i++)
348
+ pdc_mouse_status.button[i] |= flags;
349
+ pdc_mouse_status.x = (unsigned char)( c[3] - ' ' - 1);
350
+ pdc_mouse_status.y = (unsigned char)( c[4] - ' ' - 1);
351
+ }
352
+ }
353
+ else if( (rval & 0xc0) == 0xc0) /* start of UTF-8 */
354
+ {
355
+ check_key( &c[0]);
356
+ assert( (c[0] & 0xc0) == 0x80);
357
+ c[0] &= 0x3f;
358
+ if( !(rval & 0x20)) /* two-byte : U+0080 to U+07ff */
359
+ rval = c[0] | ((rval & 0x1f) << 6);
360
+ else if( !(rval & 0x10)) /* three-byte : U+0800 - U+ffff */
361
+ {
362
+ check_key( &c[1]);
363
+ assert( (c[1] & 0xc0) == 0x80);
364
+ c[1] &= 0x3f;
365
+ rval = (c[1] | (c[0] << 6) | ((rval & 0xf) << 12));
366
+ }
367
+ /* Else... four-byte SMP char */
368
+ }
369
+ else if( rval == 127)
370
+ rval = 8;
371
+ }
372
+ return( rval);
373
+ }
374
+
375
+ int PDC_modifiers_set( void)
376
+ {
377
+ return( OK);
378
+ }
379
+
380
+ int PDC_mouse_set( void)
381
+ {
382
+ return( OK);
383
+ }
384
+
385
+ void PDC_set_keyboard_binary( bool on)
386
+ {
387
+ return;
388
+ }
389
+
390
+ unsigned long PDC_get_input_fd( void)
391
+ {
392
+ return( 0);
393
+ }
394
+
@@ -0,0 +1,434 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <signal.h>
4
+ #include <string.h>
5
+ #if !defined( _WIN32) && !defined( DOS)
6
+ #define USE_TERMIOS
7
+ #include <unistd.h>
8
+ #include <termios.h>
9
+ #include <sys/ioctl.h>
10
+
11
+ static struct termios orig_term;
12
+ #endif
13
+ #include <assert.h>
14
+ #include "curspriv.h"
15
+ #include "pdcvt.h"
16
+
17
+ #ifdef DOS
18
+ bool PDC_is_ansi = TRUE;
19
+ #else
20
+ bool PDC_is_ansi = FALSE;
21
+ #endif
22
+
23
+ #ifdef _WIN32
24
+ #include <windows.h>
25
+
26
+ #ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
27
+ #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
28
+ #endif
29
+ #ifndef ENABLE_VIRTUAL_TERMINAL_INPUT
30
+ #define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200
31
+ #endif
32
+ #ifndef DISABLE_NEWLINE_AUTO_RETURN
33
+ #define DISABLE_NEWLINE_AUTO_RETURN 0x0008
34
+ #endif
35
+
36
+ /* In DOS/Windows, we have two possible modes of operation. If we can
37
+ successfully use SetConsoleMode to ENABLE_VIRTUAL_TERMINAL_INPUT,
38
+ we have access to most of what we'd use on xterm. If not, we can only
39
+ use what ANSI.SYS or ANSI.COM (or their NANSI or NNANSI variants) support.
40
+ We'll get sixteen colors, no mouse events, no resizable windows, etc.
41
+
42
+ So we check the return value from SetConsoleMode and set PDC_is_ansi
43
+ accordingly. (In DOS, PDC_is_ansi is always true -- there's no xterm-like
44
+ support there. On non-MS platforms, PDC_is_ansi is always false...
45
+ though that should be revisited for the Linux console, and probably
46
+ elsewhere.) */
47
+
48
+ static int set_win10_for_vt_codes( const bool setting_mode)
49
+ {
50
+ const HANDLE hIn = GetStdHandle( STD_INPUT_HANDLE);
51
+ HANDLE hOut;
52
+ DWORD dwMode = 0;
53
+ static DWORD old_input_mode;
54
+ const DWORD out_mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING
55
+ | DISABLE_NEWLINE_AUTO_RETURN;
56
+
57
+ if( hIn == INVALID_HANDLE_VALUE)
58
+ return GetLastError( );
59
+ PDC_is_ansi = TRUE;
60
+ if( setting_mode)
61
+ {
62
+ GetConsoleMode( hIn, &old_input_mode);
63
+ dwMode = ENABLE_VIRTUAL_TERMINAL_INPUT;
64
+ }
65
+ else /* restoring initial mode */
66
+ dwMode = old_input_mode;
67
+ if( !SetConsoleMode( hIn, dwMode))
68
+ return GetLastError( );
69
+ /* Set output mode to handle virtual terminal sequences */
70
+ hOut = GetStdHandle( STD_OUTPUT_HANDLE);
71
+ if( hOut == INVALID_HANDLE_VALUE)
72
+ return GetLastError( );
73
+
74
+ if( !GetConsoleMode( hOut, &dwMode))
75
+ return GetLastError( );
76
+ if( setting_mode)
77
+ dwMode |= out_mask;
78
+ else /* clearing VT mode, not setting it */
79
+ dwMode &= ~out_mask;
80
+ if( !SetConsoleMode( hOut, dwMode))
81
+ return GetLastError( );
82
+ /* If we've gotten this far, the terminal has been */
83
+ /* set up to process xterm-like sequences : */
84
+ PDC_is_ansi = FALSE;
85
+ return( 0);
86
+ }
87
+ #endif
88
+
89
+ int PDC_rows = -1, PDC_cols = -1;
90
+ bool PDC_resize_occurred = FALSE;
91
+ const int STDIN = 0;
92
+ chtype PDC_capabilities = 0;
93
+
94
+ /* COLOR_PAIR to attribute encoding table. */
95
+
96
+ static short *color_pair_indices = (short *)NULL;
97
+ PACKED_RGB *pdc_rgbs = (PACKED_RGB *)NULL;
98
+
99
+ unsigned long pdc_key_modifiers = 0L;
100
+
101
+ void PDC_reset_prog_mode( void)
102
+ {
103
+ }
104
+
105
+ void PDC_reset_shell_mode( void)
106
+ {
107
+ }
108
+
109
+ static int initial_PDC_rows, initial_PDC_cols;
110
+
111
+ int PDC_resize_screen(int nlines, int ncols)
112
+ {
113
+ if( PDC_rows == -1) /* initscr( ) hasn't been called; we're just */
114
+ { /* setting desired size at startup */
115
+ initial_PDC_rows = nlines;
116
+ initial_PDC_cols = ncols;
117
+ }
118
+ else if( nlines > 1 && ncols > 1 && !PDC_is_ansi)
119
+ {
120
+ printf( "\033[8;%d;%dt", nlines, ncols);
121
+ PDC_rows = nlines;
122
+ PDC_cols = ncols;
123
+ }
124
+ return( 0);
125
+ }
126
+
127
+ void PDC_restore_screen_mode(int i)
128
+ {
129
+ }
130
+
131
+ void PDC_save_screen_mode(int i)
132
+ {
133
+ }
134
+
135
+ void PDC_scr_close( void)
136
+ {
137
+ printf( "\0338"); /* restore cursor & attribs (VT100) */
138
+ printf( "\033[m"); /* set default screen attributes */
139
+ printf( "\033[?47l"); /* restore screen */
140
+ PDC_gotoyx( PDC_cols - 1, 0);
141
+ printf( "\033[?1000l"); /* turn off mouse events */
142
+ #ifdef _WIN32
143
+ set_win10_for_vt_codes( FALSE);
144
+ #else
145
+ #if !defined( DOS)
146
+ tcsetattr( STDIN, TCSANOW, &orig_term);
147
+ #endif
148
+ #endif
149
+ return;
150
+ }
151
+
152
+ void PDC_scr_free( void)
153
+ {
154
+ if (SP)
155
+ free(SP);
156
+ SP = (SCREEN *)NULL;
157
+
158
+ if (color_pair_indices)
159
+ free(color_pair_indices);
160
+ color_pair_indices = (short *)NULL;
161
+
162
+ if (pdc_rgbs)
163
+ free(pdc_rgbs);
164
+ pdc_rgbs = (PACKED_RGB *)NULL;
165
+ }
166
+
167
+ #ifdef USE_TERMIOS
168
+ static void sigwinchHandler( int sig)
169
+ {
170
+ struct winsize ws;
171
+
172
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) != -1)
173
+ if( PDC_rows != ws.ws_row || PDC_cols != ws.ws_col)
174
+ {
175
+ PDC_rows = ws.ws_row;
176
+ PDC_cols = ws.ws_col;
177
+ PDC_resize_occurred = TRUE;
178
+ }
179
+ }
180
+ #endif
181
+
182
+ #define MAX_LINES 1000
183
+ #define MAX_COLUMNS 1000
184
+
185
+ int PDC_scr_open(int argc, char **argv)
186
+ {
187
+ int i, r, g, b, n_colors;
188
+ char *capabilities = getenv( "PDC_VT");
189
+ const char *colorterm = getenv( "COLORTERM");
190
+ #ifdef USE_TERMIOS
191
+ struct sigaction sa;
192
+ struct termios term;
193
+ #endif
194
+ #ifdef _WIN32
195
+ set_win10_for_vt_codes( TRUE);
196
+ #endif
197
+
198
+ PDC_LOG(("PDC_scr_open called\n"));
199
+ if( colorterm && !strcmp( colorterm, "truecolor"))
200
+ PDC_capabilities |= A_RGB_COLOR;
201
+ if( capabilities) /* these should really come from terminfo! */
202
+ {
203
+ if( strstr( capabilities, "RGB"))
204
+ PDC_capabilities |= A_RGB_COLOR;
205
+ if( strstr( capabilities, "UND"))
206
+ PDC_capabilities |= A_UNDERLINE;
207
+ if( strstr( capabilities, "BLI"))
208
+ PDC_capabilities |= A_BLINK;
209
+ if( strstr( capabilities, "DIM"))
210
+ PDC_capabilities |= A_DIM;
211
+ if( strstr( capabilities, "STA"))
212
+ PDC_capabilities |= A_STANDOUT;
213
+ }
214
+ SP = calloc(1, sizeof(SCREEN));
215
+ color_pair_indices = (short *)calloc( PDC_COLOR_PAIRS * 2, sizeof( short));
216
+ n_colors = (PDC_is_ansi ? 16 : 256);
217
+ pdc_rgbs = (PACKED_RGB *)calloc( n_colors, sizeof( PACKED_RGB));
218
+ assert( SP && color_pair_indices && pdc_rgbs);
219
+ if (!SP || !color_pair_indices || !pdc_rgbs)
220
+ return ERR;
221
+
222
+ COLORS = n_colors; /* should give this a try and see if it works! */
223
+ for( i = 0; i < 16 && i < n_colors; i++)
224
+ {
225
+ const int intensity = ((i & 8) ? 0xff : 0xc0);
226
+
227
+ pdc_rgbs[i] = PACK_RGB( ((i & COLOR_RED) ? intensity : 0),
228
+ ((i & COLOR_GREEN) ? intensity : 0),
229
+ ((i & COLOR_BLUE) ? intensity : 0));
230
+ }
231
+ /* 256-color xterm extended palette: 216 colors in a
232
+ 6x6x6 color cube, plus 24 (not 50) shades of gray */
233
+ for( r = 0; r < 6; r++)
234
+ for( g = 0; g < 6; g++)
235
+ for( b = 0; b < 6; b++)
236
+ if( i < n_colors)
237
+ pdc_rgbs[i++] = PACK_RGB( r ? r * 40 + 55 : 0,
238
+ g ? g * 40 + 55 : 0,
239
+ b ? b * 40 + 55 : 0);
240
+ for( i = 0; i < 24; i++)
241
+ if( i + 232 < n_colors)
242
+ pdc_rgbs[i + 232] = PACK_RGB( i * 10 + 8, i * 10 + 8, i * 10 + 8);
243
+ setbuf( stdin, NULL);
244
+ setbuf( stdout, NULL);
245
+ #ifdef USE_TERMIOS
246
+ sigemptyset(&sa.sa_mask);
247
+ sa.sa_flags = 0;
248
+ sa.sa_handler = sigwinchHandler;
249
+ if (sigaction(SIGWINCH, &sa, NULL) == -1)
250
+ {
251
+ fprintf( stderr, "Sigaction failed\n");
252
+ return( -1);
253
+ }
254
+ sigwinchHandler( 0);
255
+ #else
256
+ {
257
+ const char *env = getenv("PDC_LINES");
258
+
259
+ PDC_rows = (env ? atoi( env) : 25);
260
+ env = getenv( "PDC_COLS");
261
+ PDC_cols = (env ? atoi( env) : 80);
262
+ }
263
+ #endif
264
+ SP->mouse_wait = PDC_CLICK_PERIOD;
265
+ SP->visibility = 0; /* no cursor, by default */
266
+ SP->curscol = SP->cursrow = 0;
267
+ SP->audible = TRUE;
268
+ SP->mono = FALSE;
269
+
270
+ while( PDC_get_rows( ) < 1 && PDC_get_columns( ) < 1)
271
+ ; /* wait for screen to be drawn and size determined */
272
+ if( initial_PDC_rows > 1 && initial_PDC_cols > 1)
273
+ {
274
+ PDC_resize_screen( initial_PDC_rows, initial_PDC_cols);
275
+ while( PDC_get_rows( ) != initial_PDC_rows
276
+ && PDC_get_columns( ) != initial_PDC_rows)
277
+ ;
278
+ }
279
+
280
+ SP->lines = PDC_get_rows();
281
+ SP->cols = PDC_get_columns();
282
+
283
+ if (SP->lines < 2 || SP->lines > MAX_LINES
284
+ || SP->cols < 2 || SP->cols > MAX_COLUMNS)
285
+ {
286
+ fprintf(stderr, "LINES value must be >= 2 and <= %d: got %d\n",
287
+ MAX_LINES, SP->lines);
288
+ fprintf(stderr, "COLS value must be >= 2 and <= %d: got %d\n",
289
+ MAX_COLUMNS, SP->cols);
290
+
291
+ return ERR;
292
+ }
293
+
294
+ #ifdef USE_TERMIOS
295
+ tcgetattr( STDIN, &orig_term);
296
+ memcpy( &term, &orig_term, sizeof( term));
297
+ term.c_lflag &= ~(ICANON | ECHO);
298
+ tcsetattr( STDIN, TCSANOW, &term);
299
+ #endif
300
+ printf( "\033[?47h"); /* Save screen */
301
+ if( !PDC_is_ansi)
302
+ printf( "\033[?1000h"); /* enable mouse events, at least on xterm */
303
+ /* NOTE: could send 1003h to get mouse motion events as well */
304
+ printf( "\0337"); /* save cursor & attribs (VT100) */
305
+ PDC_resize_occurred = FALSE;
306
+ PDC_LOG(("PDC_scr_open exit\n"));
307
+ /* PDC_reset_prog_mode(); doesn't do anything anyway */
308
+ return( 0);
309
+ }
310
+
311
+ int PDC_set_function_key( const unsigned function, const int new_key)
312
+ {
313
+ return( 0);
314
+ }
315
+
316
+ void PDC_set_resize_limits( const int new_min_lines,
317
+ const int new_max_lines,
318
+ const int new_min_cols,
319
+ const int new_max_cols)
320
+ {
321
+ return;
322
+ }
323
+
324
+ /* PDC_init_color(), PDC_init_pair(), and PDC_set_blink() all share a common
325
+ issue : after adjusting the display characteristic in question, all relevant
326
+ text should be redrawn. Call PDC_init_pair( 3, ...), and all text using
327
+ color pair 3 should be redrawn; call PDC_init_color( 5, ...) and all text
328
+ using color index 5 for either foreground or background should be redrawn;
329
+ turn "real blinking" on/off, and all blinking text should be redrawn.
330
+ (On platforms where blinking text is controlled by a timer and redrawn every
331
+ half second or so, such as X11, SDLx, and Win32a, this function can be
332
+ used for that purpose as well.)
333
+
334
+ PDC_show_changes( ) will look for relevant chains of text and redraw them.
335
+ For speed/simplicity, the code looks for the first and last character in
336
+ each line that would be affected, then draws those in between. Often --
337
+ perhaps usually -- this will be zero characters, i.e., no text on that
338
+ particular line happens to have an attribute requiring redrawing. */
339
+
340
+ static short get_pair( const chtype ch)
341
+
342
+ {
343
+ return( (short)( (ch & A_COLOR) >> PDC_COLOR_SHIFT) & (COLOR_PAIRS - 1));
344
+ }
345
+
346
+ static int color_used_for_this_char( const chtype c, const int idx)
347
+ {
348
+ const int color = get_pair( c);
349
+ const int rval = (color_pair_indices[color] == idx ||
350
+ color_pair_indices[color + PDC_COLOR_PAIRS] == idx);
351
+
352
+ return( rval);
353
+ }
354
+
355
+ void PDC_show_changes( const short pair, const short idx, const chtype attr)
356
+ {
357
+ if( curscr && curscr->_y)
358
+ {
359
+ int i;
360
+
361
+ for( i = 0; i < SP->lines - 1; i++)
362
+ if( curscr->_y[i])
363
+ {
364
+ int j = 0, n_chars;
365
+ chtype *line = curscr->_y[i];
366
+
367
+ /* skip over starting text that isn't changed : */
368
+ while( j < SP->cols && get_pair( *line) != pair
369
+ && !color_used_for_this_char( *line, idx)
370
+ && !(attr & *line))
371
+ {
372
+ j++;
373
+ line++;
374
+ }
375
+ n_chars = SP->cols - j;
376
+ /* then skip over text at the end that's not the right color: */
377
+ while( n_chars && get_pair( line[n_chars - 1]) != pair
378
+ && !color_used_for_this_char( line[n_chars - 1], idx)
379
+ && !(attr & line[n_chars - 1]))
380
+ n_chars--;
381
+ assert( n_chars >= 0);
382
+ if( n_chars)
383
+ PDC_transform_line( i, j, n_chars, line);
384
+ }
385
+ }
386
+ }
387
+
388
+ void PDC_init_pair( short pair, short fg, short bg)
389
+ {
390
+ if( color_pair_indices[pair] != fg ||
391
+ color_pair_indices[pair + PDC_COLOR_PAIRS] != bg)
392
+ {
393
+ color_pair_indices[pair] = fg;
394
+ color_pair_indices[pair + PDC_COLOR_PAIRS] = bg;
395
+ PDC_show_changes( pair, -1, 0);
396
+ }
397
+ }
398
+
399
+ int PDC_pair_content( short pair, short *fg, short *bg)
400
+ {
401
+ *fg = color_pair_indices[pair];
402
+ *bg = color_pair_indices[pair + PDC_COLOR_PAIRS];
403
+ return OK;
404
+ }
405
+
406
+ bool PDC_can_change_color(void)
407
+ {
408
+ return TRUE;
409
+ }
410
+
411
+ int PDC_color_content( short color, short *red, short *green, short *blue)
412
+ {
413
+ PACKED_RGB col = pdc_rgbs[color];
414
+
415
+ *red = DIVROUND( Get_RValue(col) * 1000, 255);
416
+ *green = DIVROUND( Get_GValue(col) * 1000, 255);
417
+ *blue = DIVROUND( Get_BValue(col) * 1000, 255);
418
+
419
+ return OK;
420
+ }
421
+
422
+ int PDC_init_color( short color, short red, short green, short blue)
423
+ {
424
+ const PACKED_RGB new_rgb = PACK_RGB(DIVROUND(red * 255, 1000),
425
+ DIVROUND(green * 255, 1000),
426
+ DIVROUND(blue * 255, 1000));
427
+
428
+ if( pdc_rgbs[color] != new_rgb)
429
+ {
430
+ pdc_rgbs[color] = new_rgb;
431
+ PDC_show_changes( -1, color, 0);
432
+ }
433
+ return OK;
434
+ }