File HISTORY added (mode: 100644) (index 00000000..7cf5b71a) | |||
1 | PDCurses 3.4 - 2008/09/08 | ||
2 | ========================= | ||
3 | |||
4 | Nothing much new this time, but I've been sitting on some bug fixes for | ||
5 | almost a year, so it's overdue. Apart from bugs, the main changes are in | ||
6 | the documentation. | ||
7 | |||
8 | New features: | ||
9 | |||
10 | - setsyx() is now a function rather than a macro. | ||
11 | |||
12 | Bug fixes and such: | ||
13 | |||
14 | - In x11, the xc_atrtab table size was under-calculated by half, | ||
15 | resulting in crashes at (oddly) certain line counts. (It should've | ||
16 | crashed a lot more.) Reported by Mark Hessling. | ||
17 | |||
18 | - Test for moved cursor was omitting the window origin offset. Reported | ||
19 | by Carey Evans. | ||
20 | |||
21 | - Is DOS and OS/2, the value for max items in key_table was still wrong. | ||
22 | Reported by C.E. | ||
23 | |||
24 | - Changed isendwin() so it won't crash after delscreen(). | ||
25 | |||
26 | - Ensure zero-termination in PDC_mbstowcs() and PDC_wcstombs(). | ||
27 | |||
28 | - Disable QuickEdit Mode when enabling mouse input for the Win32 | ||
29 | console; reported by "Zalapkrakna". | ||
30 | |||
31 | - Fix for building under Innotek C (I hope). Report by Elbert Pol, fix | ||
32 | courtesy of Paul Smedley. | ||
33 | |||
34 | - Unified exports list with no duplicates -- pdcurses.def is now built | ||
35 | from components at compile time. | ||
36 | |||
37 | - Don't install curspriv.h, and don't include it with binary | ||
38 | distributions. | ||
39 | |||
40 | - Building DLLs with LCC is no longer supported, due to the primitive | ||
41 | nature of its make.exe. | ||
42 | |||
43 | - Export the terminfo stub functions from the DLLs, too. | ||
44 | |||
45 | - Added support for Apple's ".dylib" in configure. Suggested by Marc | ||
46 | Vaillant (who says it's needed with OS 10.5.) | ||
47 | |||
48 | - In sdl1/Makefile.mng, ensure that CC is set. | ||
49 | |||
50 | - In the gcc makefiles, "$?" didn't really have the desired effect -- | ||
51 | _all_ the dependencies showed up on the command line, including | ||
52 | curses.h, and pdcurses.a twice. And apparently, this can mess up some | ||
53 | old version (?) of MinGW. So, revert to spelling out "tuidemo.o | ||
54 | tui.o". Reported by "Howard L." | ||
55 | |||
56 | - Extensive documentation revision and reorganizing. More to do here. | ||
57 | For example, I moved the build instructions from INSTALL (which never | ||
58 | really described installation) to the platform-specific READMEs. | ||
59 | |||
60 | - New indentation standard: four spaces, no tabs. | ||
61 | |||
62 | ------------------------------------------------------------------------ | ||
63 | |||
64 | PDCurses 3.3 - 2007/07/11 | ||
65 | ========================= | ||
66 | |||
67 | This release adds an SDL backend, refines the demos, and is faster in | ||
68 | some cases. | ||
69 | |||
70 | New features: | ||
71 | |||
72 | - SDL port. See INSTALL, doc/sdl.txt and sdl1/* for details. | ||
73 | |||
74 | - Double-buffering -- minimize screen writes by checking, in doupdate() | ||
75 | and wnoutrefresh(), whether the changes to curscr are really changes. | ||
76 | In most cases, this makes no difference (writes were already limited | ||
77 | to areas marked as changed), but it can greatly reduce the overhead | ||
78 | from touchwin(). It also helps if you have small, separated updates on | ||
79 | the same line. | ||
80 | |||
81 | - The PDC_RGB colors can now be used, or not, with any platform (as long | ||
82 | as the same options are used when compiling both the library and | ||
83 | apps). This may help if you have apps that are hardwired to assume | ||
84 | certain definitions. | ||
85 | |||
86 | - Restored the use_default_colors() stuff from the ncurses versions of | ||
87 | the rain and worm demos, to make them "transparent" (this is useful | ||
88 | now, with the SDL port); added transparency to newdemo. | ||
89 | |||
90 | - Added setlocale() to tuidemo, to make it easier to browse files with | ||
91 | non-ASCII characters. | ||
92 | |||
93 | - Sped up firework demo by replacing unneeded clear() and init_pair() | ||
94 | calls. | ||
95 | |||
96 | - Allow exit from ptest demo by typing 'q'. | ||
97 | |||
98 | - New functions for implementors: PDC_pair_content() and PDC_init_pair() | ||
99 | (the old pdc_atrtab stuff was arguably the last remnant of code in the | ||
100 | pdcurses directory that was based on platform details). | ||
101 | |||
102 | Bug fixes and such: | ||
103 | |||
104 | - Implicit wrefresh() needs to be called from wgetch() when the window's | ||
105 | cursor position is changed, even if there are no other changes. | ||
106 | |||
107 | - Set SP->audible on a per-platform basis, as was documented in | ||
108 | IMPLEMNT, but not actually being done. | ||
109 | |||
110 | - Minor tweaks for efficiency and readability, notably with wscrl(). | ||
111 | |||
112 | - tuidemo didn't work correctly on monochrome screens when A_COLOR was | ||
113 | defined -- the color pair numbers appeared as the corresponding | ||
114 | character; also, the input box was (I now realize) broken with ncurses | ||
115 | since our 2.7, and broke more subtly with PDCurses' new implicit | ||
116 | refresh handling; also, the path to the default file for the Browse | ||
117 | function was a bit off. | ||
118 | |||
119 | - Assume in the demos that curs_set() is always available -- there's no | ||
120 | good test for this, and the existing tests were bogus. | ||
121 | |||
122 | - Made the command-line parameter for ptest work. (If given an argument, | ||
123 | it delays that number of milliseconds between changes, instead of | ||
124 | waiting for a key, and automatically loops five times.) | ||
125 | |||
126 | - Building the Win32 DLL with MinGW or Cygwin wouldn't work from outside | ||
127 | the platform directory. | ||
128 | |||
129 | - Building the X11 port with Cygwin required manually editing the | ||
130 | Makefile after configuring; no longer. Reported by Warren W. Gay. | ||
131 | |||
132 | - Minor tightening of configure and makefiles. | ||
133 | |||
134 | - Bogus references to "ACS_BLCORNER" in the border man page. Reported by | ||
135 | "Walrii". | ||
136 | |||
137 | - slk_wlabel() was not documented. | ||
138 | |||
139 | - Spelling cleanup. | ||
140 | |||
141 | - Changed RCSIDs to not end with a semicolon -- avoids warnings when | ||
142 | compiling with the -pedantic option. | ||
143 | |||
144 | - Merged latin-1.txt into x11.txt. | ||
145 | |||
146 | - Updated config.guess and config.sub to more recent versions. | ||
147 | |||
148 | ------------------------------------------------------------------------ | ||
149 | |||
150 | PDCurses 3.2 - 2007/06/06 | ||
151 | ========================= | ||
152 | |||
153 | This release mainly covers changes to the build process, along with a | ||
154 | few structural changes. | ||
155 | |||
156 | New features: | ||
157 | |||
158 | - The panel library has been folded into the main library. What this | ||
159 | means is that you no longer need to specify "-lpanel" or equivalent | ||
160 | when linking programs that use panel functionality with PDCurses; | ||
161 | however, panel.lib/.a is still provided (as a copy of pdcurses.lib/.a) | ||
162 | so that you can, optionally, build your projects with no changes. It | ||
163 | also means that panel functionality is available with the DLL or | ||
164 | shared library. Note that panel.h remains separate from curses.h. | ||
165 | |||
166 | - Setting the PDCURSES_SRCDIR environment variable is no longer required | ||
167 | before building, unless you want to build in a location other than the | ||
168 | platform directory. (See INSTALL.) | ||
169 | |||
170 | - MinGW and Cygwin makefiles support building DLLs, via the "DLL=Y" | ||
171 | option. Partly due to Timofei Shatrov. | ||
172 | |||
173 | - Support for the Digital Mars compiler. | ||
174 | |||
175 | - Watcom makefiles now use the "loaddll" feature. | ||
176 | |||
177 | Bug fixes and such: | ||
178 | |||
179 | - Eliminated the platform defines (DOS, WIN32, OS2, XCURSES) from | ||
180 | curses.h, except for X11-specific SCREEN elements and functions. | ||
181 | Dynamically-linked X11 apps built against an old version will have | ||
182 | their red and blue swapped until rebuilt. (You can define PDC_RGB to | ||
183 | build the library with the old color scheme, but it would also have to | ||
184 | be defined when building any new app.) Any app that depends on | ||
185 | PDCurses to determine the platform it's building on will have to make | ||
186 | other arrangements. | ||
187 | |||
188 | - Documentation cleanup -- added more details; removed some content that | ||
189 | didn't apply to PDCurses; moved the doc-building tool to the doc | ||
190 | directory; changed *.man to *.txt. | ||
191 | |||
192 | - The EMX makefile now accepts "DLL=Y", builds pdcurses.dll instead of | ||
193 | curses.dll, builds either the static library or the DLL (not both at | ||
194 | once), and links all the demos with the DLL when building it. | ||
195 | |||
196 | - In Win32, read the registry only when needed: when init_color() or | ||
197 | color_content() is called, instead of at startup. | ||
198 | |||
199 | - A few additional consts in declarations. | ||
200 | |||
201 | - The Win32 compilers that build DLLs now use common .def files. | ||
202 | |||
203 | - panel.h functions sorted by name, as with other .h files; curses.h is | ||
204 | no longer included by repeated inclusions of panel.h or term.h. | ||
205 | |||
206 | - Simplified Borland makefiles. | ||
207 | |||
208 | - Makefile.aix.in depended on a file, xcurses.exp, that was never there. | ||
209 | This problem was fixed as part of the change to common .def files; | ||
210 | however, I still haven't been able to test building on AIX. | ||
211 | |||
212 | ------------------------------------------------------------------------ | ||
213 | |||
214 | PDCurses 3.1 - 2007/05/03 | ||
215 | ========================= | ||
216 | |||
217 | Primarily clipboard-related fixes, and special UTF-8 support. | ||
218 | |||
219 | New features: | ||
220 | |||
221 | - "Force UTF-8" mode, a compile-time option to force the use of UTF-8 | ||
222 | for multibyte strings, instead of the system locale. (Mainly for | ||
223 | Windows, where UTF-8 doesn't work well in the console.) See INSTALL. | ||
224 | |||
225 | - Multibyte string support in PDC_*clipboard() functions, and in Win32's | ||
226 | PDC_set_title(). | ||
227 | |||
228 | - Added the global string "ttytype", per other curses implementations, | ||
229 | for compatibility with old BSD curses. | ||
230 | |||
231 | - Real functions for the "quasi-standard aliases" -- crmode(), | ||
232 | nocrmode(), draino(), resetterm(), fixterm() and saveterm(). | ||
233 | (Corresponding macros removed.) | ||
234 | |||
235 | Bug fixes and such: | ||
236 | |||
237 | - In Win32, under NT-family OSes, the scrollback buffer would be | ||
238 | restored by endwin(), but would not be turned off again when resuming | ||
239 | curses after an endwin(). The result was an odd, partly-scrolled-up | ||
240 | display. Now, the buffer is toggled by PDC_reset_prog_mode() and | ||
241 | PDC_reset_shell_mode(), so it's properly turned off when returning | ||
242 | from an endwin(). | ||
243 | |||
244 | - In 3.0, selection in X11 didn't work. (Well, the selecting worked, but | ||
245 | the pasting elsewhere didn't.) This was due to the attempted fix | ||
246 | "don't return selection start as a press event," so that's been | ||
247 | reverted for now. | ||
248 | |||
249 | - PDC_setclipboard() was locking up in X11. Reported by Mark Hessling. | ||
250 | |||
251 | - Missing underscore in the declaration of XC_say() prevented | ||
252 | compilation with PDCDEBUG defined. Reported by M.H. | ||
253 | |||
254 | - Off-by-one error in copywin() -- the maximum coordinates for the | ||
255 | destination window should be inclusive. Reported by Tiago Dionizio. | ||
256 | |||
257 | - Start in echo mode, per X/Open. Reported by T.D. | ||
258 | |||
259 | - Strip leading and trailing spaces from slk labels, per a literal | ||
260 | reading of X/Open. Suggested by Alexey Miheev (about ncurses, but it | ||
261 | also applies here). | ||
262 | |||
263 | - The #endif for __PDCURSES__ needs to come _after_ the closing of the | ||
264 | extern "C". This has been broken since June 2005. Fortunately (?), it | ||
265 | only shows up if the file is included multiple times, and then only in | ||
266 | C++. Reported on the DOSBox forums. | ||
267 | |||
268 | - Use CF_OEMTEXT instead of CF_TEXT in the narrow versions of the | ||
269 | clipboard functions in Win32, to match the console. | ||
270 | |||
271 | - Changed the format of the string returned from longname(). | ||
272 | |||
273 | - In the clipboard test in the testcurs demo, use a single mvprintw() to | ||
274 | display the return from PDC_getclipboard(), instead of a loop of | ||
275 | addch(), which was incompatible with multibyte strings. | ||
276 | |||
277 | - Moved has_key() into the keyname module, and documented it. | ||
278 | |||
279 | - Moved RIPPEDOFFLINE to curspriv.h. | ||
280 | |||
281 | - Typos in IMPLEMNT. | ||
282 | |||
283 | ------------------------------------------------------------------------ | ||
284 | |||
285 | PDCurses 3.0 - 2007/04/01 | ||
286 | ========================= | ||
287 | |||
288 | The focuses for this release are X/Open conformance, i18n, better color | ||
289 | support, cleaner code, and more consistency across platforms. | ||
290 | |||
291 | This is only a brief summary of the changes. For more details, consult | ||
292 | the CVS log. | ||
293 | |||
294 | New features: | ||
295 | |||
296 | - An almost complete implementation of X/Open curses, including the | ||
297 | wide-character and attr_t functions (but excluding terminfo). The | ||
298 | wide-character functions work only in Win32 and X11, for now, and | ||
299 | require building the library with the appropriate options (see | ||
300 | INSTALL). Note that this is a simplistic implementation, with exactly | ||
301 | one wchar_t per cchar_t; the only characters it handles properly are | ||
302 | those that are one column wide. | ||
303 | |||
304 | - Support for X Input Methods in the X11 port (see INSTALL). When built | ||
305 | this way, the internal compose key support is disabled in favor of | ||
306 | XIM's, which is a lot more complete, although you lose the box cursor. | ||
307 | |||
308 | - Multibyte character support in the non-wide string handling functions, | ||
309 | per X/Open. This only works when the library is built with wide- | ||
310 | character support enabled. | ||
311 | |||
312 | - Mouse support for DOS and OS/2. The DOS version includes untested | ||
313 | support for scroll wheels, via the "CuteMouse" driver. | ||
314 | |||
315 | - An ncurses-compatible mouse interface, which can work in parallel with | ||
316 | the traditional PDCurses mouse interface. See the man page (or | ||
317 | mouse.c) for details. | ||
318 | |||
319 | - DOS and OS/2 can now return modifiers as keys, as in Win32 and X11. | ||
320 | |||
321 | - COLORS, which had been fixed at 8, is now either 8 or 16, depending on | ||
322 | the terminal -- usually 16. When it's 8, blinking mode is enabled | ||
323 | (controlled as before by the A_BLINK attribute); when it's 16, bright | ||
324 | background colors are used instead. On platforms where it can be | ||
325 | changed, the mode is toggled by the new function PDC_set_blink(). | ||
326 | PDCurses tries to set PDC_set_blink(FALSE) at startup. (In Win32, it's | ||
327 | always set to FALSE; in DOS, with other than an EGA or VGA card, it | ||
328 | can't be.) Also, COLORS is now set to 0 until start_color() is called. | ||
329 | |||
330 | - Corresponding to the change in COLORS, COLOR_PAIRS is now 256. | ||
331 | |||
332 | - Working init_color() and color_content(). The OS/2 version of | ||
333 | init_color() works only in a full-screen session; the Win32 version | ||
334 | works only in windowed mode, and only in NT-family OSes; the DOS | ||
335 | version works only with VGA adapters (real or simulated). The Win32 | ||
336 | version is based mostly on James Brown's setconsoleinfo.c | ||
337 | (www.catch22.net). | ||
338 | |||
339 | - use_default_colors(), assume_default_colors(), and curses_version(), | ||
340 | after ncurses. | ||
341 | |||
342 | - Added global int TABSIZE, after ncurses and Solaris curses; removed | ||
343 | window-specific _tabsize. | ||
344 | |||
345 | - Logical extension to the wide-character slk_ funcs: slk_wlabel(), for | ||
346 | retrieving the label as a wide-character string. | ||
347 | |||
348 | - A non-macro implementation of ncurses' wresize(). | ||
349 | |||
350 | - Working putwin(), getwin(), scr_dump() and scr_restore(). | ||
351 | |||
352 | - A working acs_map[]. Characters from the ACS are now stored in window | ||
353 | structures as a regular character plus the A_ALTCHARSET attribute, and | ||
354 | rendered to the ACS only when displayed. (This allows, for example, | ||
355 | the correct display on one platform of windows saved from another.) | ||
356 | |||
357 | - In X11, allow selection and paste of UTF8_STRING. | ||
358 | |||
359 | - The testcurs demo now includes a color chart and init_color() test, a | ||
360 | wide character input test, a display of wide ACS characters with | ||
361 | sample Unicode text, a specific test of flash(), more info in the | ||
362 | resize test, and attempts to change the width as well as the height. | ||
363 | |||
364 | - Command-line option for MSVC to build DLLs (see INSTALL). Also, the | ||
365 | naming distinction for DLLs ("curses" vs. "pdcurses") is abandoned, | ||
366 | and either the static lib or DLL is built, not both at once (except | ||
367 | for X11). | ||
368 | |||
369 | - For backwards compatibility, a special module just for deprecated | ||
370 | functions -- currently PDC_check_bios_key(), PDC_get_bios_key(), | ||
371 | PDC_get_ctrl_break() and PDC_set_ctrl_break(). These shouldn't be used | ||
372 | in applications, but currently are... in fact, all the "private" | ||
373 | functions (in curspriv.h) are subject to change and should be avoided. | ||
374 | |||
375 | - A new document, IMPLEMNT, describing PDCurses' internal functions for | ||
376 | those wishing to port it to new platforms. | ||
377 | |||
378 | - Mark Hessling has released the X11 port to the public domain. | ||
379 | (However, x11/ScrollBox* retain their separate copyright and MIT-like | ||
380 | license.) | ||
381 | |||
382 | Bug fixes and such: | ||
383 | |||
384 | - Most of the macros have been removed (along with the NOMACROS ifdef). | ||
385 | The only remaining ones are those which have to be macros to work, and | ||
386 | those that are required by X/Open to be macros. There were numerous | ||
387 | problems with the macros, and no apparent reason to keep them, except | ||
388 | tradition -- although it was PCcurses 1.x that first omitted them. | ||
389 | |||
390 | - Clean separation of platform-specific code from the rest. Outside of | ||
391 | the platform directories, there remain only a few ifdefs in curses.h | ||
392 | and curspriv.h. | ||
393 | |||
394 | - General reorganization and simplification. | ||
395 | |||
396 | - Documentation revisions. | ||
397 | |||
398 | - When expanding control characters in addch() or insch(), retain the | ||
399 | attributes from the chtype. | ||
400 | |||
401 | - Preserve the A_ALTCHARSET attribute in addch() and insch(). | ||
402 | |||
403 | - Per X/Open, beep() should always return OK. | ||
404 | |||
405 | - On platforms with a controlling terminal (i.e., not X11), curs_set(1) | ||
406 | now sets the cursor to the shape it had at the time of initscr(), | ||
407 | rather than always making it small. (Exception for DOS: If the video | ||
408 | mode has been changed by PDC_resize_screen(), curs_set(1) reverts to | ||
409 | line 6/7.) The shape is taken from SP->orig_cursor (the meaning of | ||
410 | which is platform-specific). | ||
411 | |||
412 | - Stop updating the cursor position when the cursor is invisible (this | ||
413 | gives a huge performance boost in Win 9x); update the cursor position | ||
414 | from curs_set() if changing from invisible to visible. | ||
415 | |||
416 | - Some tweaking of the behavior of def_prog_mode(), def_shell_mode(), | ||
417 | savetty(), reset_prog_mode(), reset_shell_mode() and resetty()... | ||
418 | still not quite right. | ||
419 | |||
420 | - flash() was not implemented for Win32 or X. A portable implementation | ||
421 | is now used for all platforms. Note that it's much slower than the | ||
422 | old (DOS and OS/2) version, but this is only apparent on an extremely | ||
423 | slow machine, such as an XT. | ||
424 | |||
425 | - In getstr(), backspacing on high-bit characters caused a double | ||
426 | backspace. | ||
427 | |||
428 | - hline() and vline() used an incorrect (off by one) interpretation of | ||
429 | _maxx and _maxy. If values of n greater than the max were specified, | ||
430 | these functions could access unallocated memory. | ||
431 | |||
432 | - innstr() is supposed to return the number of characters read, not just | ||
433 | OK or ERR. Reported by Mike Aubury. | ||
434 | |||
435 | - A proper implementation of insch() -- the PDC_chadd()-based version | ||
436 | wasn't handling the control characters correctly. | ||
437 | |||
438 | - Return ASCII and control key names from keyname() (problem revealed by | ||
439 | ncurses' movewindow test); also, per X/Open, return "UNKNOWN KEY" when | ||
440 | appropriate, rather than "NO KEY NAME". | ||
441 | |||
442 | - Turn off the cursor from leaveok(TRUE), even in X11; leaveok(FALSE) | ||
443 | now calls curs_set(1), regardless of the previous state of the cursor. | ||
444 | |||
445 | - In the slk area, BUTTON_CLICKED events now translate to function keys, | ||
446 | along with the previously recognized BUTTON_PRESSED events. Of course, | ||
447 | it should really be checking the events specified by map_button(), | ||
448 | which still doesn't work. | ||
449 | |||
450 | - napms(0) now returns immediately. | ||
451 | |||
452 | - A unified napms() implementation for DOS -- no longer throttles the | ||
453 | CPU when built with any compiler. | ||
454 | |||
455 | - Allow backspace editing of the nocbreak() buffer. | ||
456 | |||
457 | - pair_content(0, ...) is valid. | ||
458 | |||
459 | - There was no check to ensure that the pnoutrefresh() window fit within | ||
460 | the screen. It now returns an ERR if it doesn't. | ||
461 | |||
462 | - In X11, resize_term() must be called with parameters (0, 0), and only | ||
463 | when SP->resized is set, else it returns ERR. | ||
464 | |||
465 | - Copy _bkgd in resize_window(). Patch found on Frederic L. W. Meunier's | ||
466 | web site. | ||
467 | |||
468 | - slk_clear() now removes the buttons completely, as in ncurses. | ||
469 | |||
470 | - Use the current foreground color for the line attributes (underline, | ||
471 | left, right), unless PDC_set_line_color() is explicitly called. After | ||
472 | setting the line color, you can reset it to this mode via | ||
473 | "PDC_set_line_color(-1)". | ||
474 | |||
475 | - Removed non-macro implementations of COLOR_PAIR() and PAIR_NUMBER(). | ||
476 | |||
477 | - Dispensed with PDC_chadd() and PDC_chins() -- waddch() and winsch() | ||
478 | are now (again) the core functions. | ||
479 | |||
480 | - Dropped or made static many obsolete, unused, and/or broken functions, | ||
481 | including PDC_chg_attrs(), PDC_cursor_on() and _off(), | ||
482 | PDC_fix_cursor(), PDC_get_attribute(), PDC_get_cur_col() and _row(), | ||
483 | PDC_set_80x25(), PDC_set_cursor_mode(), PDC_set_rows(), | ||
484 | PDC_wunderline(), PDC_wleftline(), PDC_wrightline(), | ||
485 | XCursesModifierPress() and XCurses_refresh_scrollbar(). | ||
486 | |||
487 | - Obsolete/unused defines: _BCHAR, _GOCHAR, _STOPCHAR, _PRINTCHAR | ||
488 | _ENDLINE, _FULLWIN and _SCROLLWIN. | ||
489 | |||
490 | - Obsolete/unused elements of the WINDOW struct: _pmax*, _lastp*, | ||
491 | _lasts*. | ||
492 | |||
493 | - Obsolete/unused elements of the SCREEN struct: orgcbr, visible_cursor, | ||
494 | sizeable, shell, blank, cursor, orig_emulation, font, orig_font, | ||
495 | tahead, adapter, scrnmode, kbdinfo, direct_video, video_page, | ||
496 | video_seg, video_ofs, bogus_adapter. (Some of these persist outside | ||
497 | the SCREEN struct, in the platform directories.) Added mouse_wait and | ||
498 | key_code. | ||
499 | |||
500 | - Removed all the EMALLOC stuff. Straight malloc calls were used | ||
501 | elsewhere; it was undocumented outside of comments in curspriv.h; and | ||
502 | there are better ways to use a substitute malloc(). | ||
503 | |||
504 | - Single mouse clicks are now reportable on all platforms (not just | ||
505 | double-clicks). And in general, mouse event reporting is more | ||
506 | consistent across platforms. | ||
507 | |||
508 | - The mouse cursor no longer appears in full-screen mode in Win32 unless | ||
509 | a nonzero mouse event mask is used. | ||
510 | |||
511 | - ALT-keypad input now works in Win32. | ||
512 | |||
513 | - In Win32, SetConsoleMode(ENABLE_WINDOW_INPUT) is not useful, and | ||
514 | appears to be the source of a four-year-old bug report (hanging in | ||
515 | THE) by Phil Smith. | ||
516 | |||
517 | - Removed the PDC_THREAD_BUILD stuff, which has never worked. For the | ||
518 | record: PDCurses is not thread-safe. Neither is ncurses; and the | ||
519 | X/Open curses spec explicitly makes it a non-requirement. | ||
520 | |||
521 | - With the internal compose key system in the X11 port, modifier keys | ||
522 | were breaking out of the compose state, making it impossible to type | ||
523 | accented capitals, etc. Also, Multi_key is now the default compose | ||
524 | key, instead of leaving it undefined by default; and a few more combos | ||
525 | are supported. | ||
526 | |||
527 | - In X11, the first reported mouse event after startup always read as a | ||
528 | double-click at position 0, 0. (This bug was introduced in 2.8.) | ||
529 | |||
530 | - In X11, don't return selection start as a press event. (Shift-click on | ||
531 | button 1 is still returned.) | ||
532 | |||
533 | - In X11, properly handle pasting of high-bit chars. (It was doing an | ||
534 | unwanted sign extension.) | ||
535 | |||
536 | - In X11, BUTTON_MOVED was never returned, although PDC_MOUSE_MOVED was | ||
537 | set. | ||
538 | |||
539 | - The fix in 2.8 for the scroll wheel in X11 wasn't very good -- it did | ||
540 | report the events as scroll wheel events, but it doubled them. Here's | ||
541 | a proper fix. | ||
542 | |||
543 | - Changed mouse handling in X11: Simpler translation table, with | ||
544 | XCursesPasteSelection() called from XCursesButton() instead of the | ||
545 | translation table; require shift with button 1 or 2 for select or | ||
546 | paste when mouse events are being reported (as with ncurses), allowing | ||
547 | passthrough of simple button 2 events. This fixes the previously | ||
548 | unreliable button 2 behavior. | ||
549 | |||
550 | - Modifier keys are now returned on key up in X11, as in Win32. And in | ||
551 | general, modifier key reporting is more consistent across platforms. | ||
552 | |||
553 | - Modifiers are not returned as keys when a mouse click has occurred | ||
554 | since the key press. | ||
555 | |||
556 | - In BIOS mode (in DOS), count successive identical output bytes, and | ||
557 | make only one BIOS call for all of them. This dramatically improves | ||
558 | performance. | ||
559 | |||
560 | - The cursor position was not always updated correctly in BIOS mode. | ||
561 | |||
562 | - In testcurs, the way the ACS test was written, it would really only | ||
563 | work with a) PDCurses (with any compiler), or b) gcc (with any | ||
564 | curses). Here's a more portable implementation. | ||
565 | |||
566 | - Better reporting of mouse events in testcurs. | ||
567 | |||
568 | - Blank out buffer and num before the scanw() test in testcurs, in case | ||
569 | the user just hits enter or etc.; clear the screen after resizing. | ||
570 | |||
571 | - Allow tuidemo to use the last line. | ||
572 | |||
573 | - Separate left/right modifier keys are now reported properly in Win32. | ||
574 | (Everything was being reported as _R.) | ||
575 | |||
576 | - Attempts to redirect input in Win32 now cause program exit and an | ||
577 | error message, instead of hanging. | ||
578 | |||
579 | - Dropped support for the Microway NDP compiler. | ||
580 | |||
581 | - Some modules renamed, rearranged. | ||
582 | |||
583 | - Fixes for errors and warnings when building with Visual C++ 2005. | ||
584 | |||
585 | - In MSVC, the panel library didn't work with the DLL. | ||
586 | |||
587 | - Complete export lists for DLLs. | ||
588 | |||
589 | - Simplified makefiles; moved common elements to .mif files; better | ||
590 | optimization; strip demos when possible. | ||
591 | |||
592 | - Changed makefile targets of "pdcurses.a/lib" and "panel.a/lib" to | ||
593 | $(LIBCURSES) and $(LIBPANEL). Suggestion of Doug Kaufman. | ||
594 | |||
595 | - Changed "install" target in the makefile to a double-colon rule, to | ||
596 | get around a conflict with INSTALL on non-case-sensitive filesystems, | ||
597 | such as Mac OS X's HFS+. Reported by Douglas Godfrey et al. | ||
598 | |||
599 | - Make PDCurses.man dependent on manext. Suggestion of Tiziano Mueller. | ||
600 | |||
601 | - Set up configure.ac so autoheader works; removed some obsolescent | ||
602 | macros. Partly the suggestion of T.M. | ||
603 | |||
604 | - The X11 port now builds in the x11 directory (including the demos), as | ||
605 | with other ports. | ||
606 | |||
607 | - The X11 port should now build on more 64-bit systems. Partly due to | ||
608 | M.H. | ||
609 | |||
610 | - The default window title and icons for the X11 port are now "PDCurses" | ||
611 | instead of "XCurses". | ||
612 | |||
613 | - Internal functions and variables made static where possible. | ||
614 | |||
615 | - Adopted a somewhat more consistent naming style: Internal functions | ||
616 | with external linkage, and only those, have the prefix "PDC_"; | ||
617 | external variables that aren't part of the API use "pdc_"; static | ||
618 | functions use "_"; and "XC_" and "xc_" prefixes are used for functions | ||
619 | and variables, respectively, that are shared between both processes in | ||
620 | the X11 port. Also eliminated camel casing, where possible. | ||
621 | |||
622 | - Changed the encoding for non-ASCII characters in comments and | ||
623 | documentation from Latin-1 to UTF-8. | ||
624 | |||
625 | ------------------------------------------------------------------------ | ||
626 | |||
627 | PDCurses 2.8 - 2006/04/01 | ||
628 | ========================= | ||
629 | |||
630 | As with the previous version, you should assume that apps linked against | ||
631 | older dynamic versions of the library won't work with this one until | ||
632 | recompiled. | ||
633 | |||
634 | New features: | ||
635 | |||
636 | - Simpler, faster. | ||
637 | |||
638 | - Declarations for all supported, standard functions, per the X/Open | ||
639 | Curses 4.2 spec, with the notable exception of getch() and ungetch(). | ||
640 | You can disable the use of the macro versions by defining NOMACROS | ||
641 | before including curses.h (see xmas.c for an example). NOMACROS yields | ||
642 | smaller but theoretically slower executables. | ||
643 | |||
644 | - New functions: vwprintw(), vwscanw(), vw_printw() and vw_scanw(). This | ||
645 | completes the list of X/Open 4.2 functions, except for those concerned | ||
646 | with attr_t and wide characters. Some (especially the terminfo/termcap | ||
647 | functions) aren't yet fully fleshed out, though. | ||
648 | |||
649 | - Non-macro implementations for COLOR_PAIR(), PAIR_NUMBER(), getbkgd(), | ||
650 | mvgetnstr(), mvwgetnstr(), mvhline(), mvvline(), mvwhline(), and | ||
651 | mvwvline(). (The macros are still available, too.) | ||
652 | |||
653 | - newterm() works now, in a limited way -- the parameters are ignored, | ||
654 | and only the first invocation will work (i.e., only one SCREEN can be | ||
655 | used). | ||
656 | |||
657 | - start_color() works now -- which is to say, if you _don't_ call it, | ||
658 | you'll only get monochrome output. Also, without calling it, the | ||
659 | terminal's default colors will be used, where supported (currently | ||
660 | only in Win32). This is equivalent to the PDC_ORIGINAL_COLORS behavior | ||
661 | introduced in 2.7, except that _only_ the default colors will be used. | ||
662 | (PDC_ORIGINAL_COLORS is still available, if you want to combine the | ||
663 | use of specific colors and the default colors.) | ||
664 | |||
665 | - New logic for termname() and longname(): termname() always returns | ||
666 | "pdcurses"; longname() returns "PDCurses for [platform] [adapter] | ||
667 | [COLOR/MONO]-YxX" (adapter is only defined for DOS and OS/2). This is | ||
668 | the first time these functions return _anything_ in Win32. | ||
669 | |||
670 | - New installation method for XCurses: the header files are placed in a | ||
671 | subdirectory "xcurses" within the include directory, rather than being | ||
672 | renamed. (But the renamed xcurses.h and xpanel.h are also installed, | ||
673 | for backwards compatibility.) curspriv.h and term.h are now available, | ||
674 | and existing curses-based code need no longer be edited to use | ||
675 | XCurses' curses.h. And with no more need for explicit XCursesExit() | ||
676 | calls (see below), your code need not be changed at all to move from | ||
677 | another curses implementation to XCurses. It can be as simple as "gcc | ||
678 | -I/usr/local/include/xcurses -lXCurses -oprogname progname.c". | ||
679 | |||
680 | - Combined readme.* into this HISTORY file, and incorporated the old 1.x | ||
681 | (PCcurses) history. | ||
682 | |||
683 | - New functionality for the testcurs demo: ACS character display; menu | ||
684 | support for PgUp, PgDn, Home and End; centered menu; and it can now | ||
685 | be resized in X. | ||
686 | |||
687 | - Added modified versions of the rain and worm demos from ncurses. | ||
688 | |||
689 | Bug fixes and such: | ||
690 | |||
691 | - Big cleanup of dead and redundant code, including unneeded defines, | ||
692 | ifdefs, and structure elements. | ||
693 | |||
694 | - flushinp() was not implemented for Win32. | ||
695 | |||
696 | - resetty() was not restoring LINES and COLS. | ||
697 | |||
698 | - nonl() made '\n' print a line feed without carriage return. This was | ||
699 | incorrect. | ||
700 | |||
701 | - Removed bogus implementation of intrflush(). | ||
702 | |||
703 | - The line-breakout optimization system, disabled by default in 2.7, is | ||
704 | removed in 2.8. It simply didn't work, and never has. (The typeahead() | ||
705 | function remains, for compatibility, but does nothing.) | ||
706 | |||
707 | - The declarations for the printw() and scanw() function families were | ||
708 | erroneously ifdef'd. | ||
709 | |||
710 | - Safer printw() calls on platforms that support vsnprintf(). | ||
711 | |||
712 | - Use the native vsscanf() in DJGPP, MinGW and Cygwin. | ||
713 | |||
714 | - ACS_BLOCK now works in X. | ||
715 | |||
716 | - Explicit calls to XCursesExit() are no longer needed. | ||
717 | |||
718 | - XCURSES is now defined automatically if not DOS, OS2 or WIN32. | ||
719 | |||
720 | - The default icon for XCurses wasn't working (had to remove the focus | ||
721 | hint code to fix this). Also, the default title is now "XCurses" | ||
722 | instead of "main". | ||
723 | |||
724 | - Incorrect dimensions (undercounting by two in each direction) were | ||
725 | shown while resizing in X. | ||
726 | |||
727 | - Scroll wheel events were not always correctly reported in X. | ||
728 | |||
729 | - 32 bits are enough for the "long" chtype, but 64 bits were used on a | ||
730 | 64-bit system, wasting memory. Now conditioned on _LP64. This could be | ||
731 | faster, too. | ||
732 | |||
733 | - The short, 16-bit chtype now works with XCurses. | ||
734 | |||
735 | - Corrected return value for is_linetouched(), is_wintouched(), | ||
736 | can_change_color() and isendwin() (bool instead of int). | ||
737 | |||
738 | - timeout(), wtimeout(), idcok() and immedok() return void. | ||
739 | |||
740 | - pair_content() takes a short. | ||
741 | |||
742 | - Replaced incorrect usages of attr_t with chtype. attr_t is still | ||
743 | typedef'd, for backwards compatibility. (It's supposed to be used for | ||
744 | the WA_*-style functions, which PDCurses doesn't yet support.) | ||
745 | |||
746 | - Added const where required by the spec, and in other appropriate | ||
747 | places. | ||
748 | |||
749 | - Removed PDC_usleep(). napms() is now the core delay routine. | ||
750 | |||
751 | - Fixed poll() support in napms(). | ||
752 | |||
753 | - Various changes to the internal PDC_* functions -- don't depend on | ||
754 | these, and don't use them unless you absolutely have to. | ||
755 | |||
756 | - Some routines accessed window structures in their variable | ||
757 | declarations, _before_ checking for a NULL window pointer. | ||
758 | |||
759 | - Dropped support for the undocumented PDC_FULL_DISPLAY, wtitle(), and | ||
760 | PDC_print(). | ||
761 | |||
762 | - Cleaned up remaining warnings. | ||
763 | |||
764 | - Reduced unnecessary #include directives -- speeds up compilation. | ||
765 | |||
766 | - Fix for demos build in Borland/DOS -- the makefile in 2.7 didn't | ||
767 | specify the memory model. Reported by Erwin Waterlander. | ||
768 | |||
769 | - Simplified the makefiles; e.g., some now build each demo in a single | ||
770 | step, and Watcom no longer uses demos.lnk. Also, the demo exes are now | ||
771 | stripped when possible; maximum compression used for archives built | ||
772 | by the makefiles; xcurses-config removed as part of "make distclean"; | ||
773 | and I tweaked optimization for some platforms. | ||
774 | |||
775 | - Reverted to /usr/local/ as default installation directory for XCurses. | ||
776 | |||
777 | - Upgraded to autoconf 2.59... instantly doubling the size of the | ||
778 | configure script. Ah well. Otherwise, simplified the build system. | ||
779 | |||
780 | - Dropped support for pre-ANSI compilers. (It hasn't worked since at | ||
781 | least version 2.4, anyway.) | ||
782 | |||
783 | - Revised and, I hope, clarified the boilerplate and other comments. | ||
784 | |||
785 | - Simplified logging and RCS ids; added RCS ids where missing. | ||
786 | |||
787 | - Consistent formatting for all code, approximately equivalent to | ||
788 | "indent -kr -i8 -bl -bli0", with adjustments for 80 columns. | ||
789 | |||
790 | ------------------------------------------------------------------------ | ||
791 | |||
792 | PDCurses 2.7 - 2005/12/30 | ||
793 | ========================= | ||
794 | |||
795 | INTRODUCTION: | ||
796 | |||
797 | Hello all. As of a few weeks ago, I'm the new maintainer for PDCurses. | ||
798 | Here's a brief summary of changes in this release. (More details are | ||
799 | available in the CVS log and trackers on SourceForge.) | ||
800 | |||
801 | NEW FEATURES: | ||
802 | |||
803 | - Functions: delscreen(), getattrs(), has_key(), slk_color(), | ||
804 | wcolor_set(), wtimeout(). | ||
805 | |||
806 | - Macros: color_set(), mvhline(), mvvline(), mvwgetnstr(), mvwhline(), | ||
807 | mvwvline(), timeout(), wresize(). | ||
808 | |||
809 | - Stub implementations of terminfo functions (including a term.h). | ||
810 | |||
811 | - More stubs for compatibility: filter(), getwin(), putwin(), | ||
812 | noqiflush(), qiflush(), scr_dump(), scr_init(), scr_restore(), | ||
813 | scr_set(), use_env(), vidattr(), vidputs(). | ||
814 | |||
815 | - The terminal's default colors are used as curses' default colors when | ||
816 | the environment variable "PDC_ORIGINAL_COLORS" is set to any value | ||
817 | (Win32 only at the moment). | ||
818 | |||
819 | - Simplified build system. | ||
820 | |||
821 | - Replaced PDC_STATIC_BUILD with its opposite, PDC_DLL_BUILD (see .mak | ||
822 | files for more info). | ||
823 | |||
824 | - Minimal implementation of color_content() -- no longer a stub. | ||
825 | |||
826 | - Added the remaining ACS defines (ACS_S3, ACS_BBSS, etc.) for | ||
827 | DOS/OS2/Win; "enhanced" versions of existing ACS characters used. | ||
828 | |||
829 | - Support for scroll wheels. | ||
830 | |||
831 | - Support for Pacific C. | ||
832 | |||
833 | BUGS FIXED: | ||
834 | |||
835 | - Builds correctly (including demos) on all tested platforms (see | ||
836 | below); nearly all compiler warnings have been cleaned up; the ptest | ||
837 | demo is built on all platforms; "clean" targets are improved. | ||
838 | |||
839 | - The ability to build ncurses_tests has been restored (see demos dir). | ||
840 | |||
841 | - Line-breakout optimization now defaults to off (equivalent to | ||
842 | "typeahead(-1)"), so output is not interrupted by keystrokes (it's | ||
843 | supposed to resume on the next refresh(), which wasn't working). | ||
844 | |||
845 | - Implicit wrefresh() in wgetch() was not being invoked in nodelay mode. | ||
846 | |||
847 | - subpad() was erroneously offsetting from the origin coordinates of the | ||
848 | parent pad (which are always -1,-1). | ||
849 | |||
850 | - In wborder(), whline(), and wvline(), the current (wattrset) attribute | ||
851 | was being used, but not the current background (wbkgd). | ||
852 | |||
853 | - Allow Russian 'r' character ASCII 0xe0 to be returned. | ||
854 | |||
855 | - termattrs() now also returns A_UNDERLINE, A_REVERSE. | ||
856 | |||
857 | - In Win32, with large scrollback buffers set, there was an unwanted | ||
858 | "scrollup" effect on startup. | ||
859 | |||
860 | - Revamped keyboard handling for Win32. | ||
861 | |||
862 | - New screen resize method for Win32. | ||
863 | |||
864 | - napms(), delay_output(), etc. now work with Cygwin. | ||
865 | |||
866 | - curs_set(0) wasn't working in Win32 in full-screen (ALT-ENTER) mode -- | ||
867 | the cursor stayed on. | ||
868 | |||
869 | - The A_REVERSE attribute was broken in XCurses. | ||
870 | |||
871 | - On 64-bit systems, XCurses was ignoring every other keystroke. | ||
872 | |||
873 | - Added focus hints for XCurses. | ||
874 | |||
875 | - Demos (except for tuidemo) once again have their proper titles in | ||
876 | XCurses (using Xinitscr() instead of the obsolete XCursesProgramName). | ||
877 | |||
878 | - The 16-bit chtype is a working option again (by removing #define | ||
879 | CHTYPE_LONG from curses.h), except in XCurses. It's not recommended; | ||
880 | but if your needs are limited, it still works. | ||
881 | |||
882 | - Reset screen size in resetty() under DOS, as in Win32 and OS/2. | ||
883 | |||
884 | - Changes for cursor size under DOS. | ||
885 | |||
886 | - Automatic setting of BIOS mode for CGA under DOS now works. | ||
887 | |||
888 | - The cursor is now always updated in PDC_gotoxy(); this fixes the | ||
889 | problem of missing characters in BIOS mode. | ||
890 | |||
891 | - Macros nocbreak(), cbreak(), nocrmode(), crmode(), nodelay(), | ||
892 | nl() and nonl() now return OK. | ||
893 | |||
894 | - ERR and OK are now defined as -1 and 0, respectively, for | ||
895 | compatibility with other curses implementations -- note that this | ||
896 | change is not binary compatible; you'll have to rebuild programs that | ||
897 | use shared/dynamic libraries. | ||
898 | |||
899 | - Added "const" to prototypes where appropriate. | ||
900 | |||
901 | - Miscellaneous code cleanup. | ||
902 | |||
903 | ACKNOWLEDGEMENTS: | ||
904 | |||
905 | Walter Briscoe | ||
906 | Jean-Pierre Demailly | ||
907 | Ruslan Fedyarov | ||
908 | Warren Gay | ||
909 | Florian Grosse-Coosmann | ||
910 | Vladimir Kokovic | ||
911 | Matt Maloy | ||
912 | K.H. Man | ||
913 | Michael Ryazanov | ||
914 | Ron Thibodeau | ||
915 | Alexandr Zamaraev | ||
916 | |||
917 | and of course, MARK HESSLING, for his over 13 years of service as the | ||
918 | maintainer of PDCurses. Plus, thanks to all who've reported bugs or | ||
919 | requested features. Apologies to anyone I've forgotten. | ||
920 | |||
921 | I've tested this version on Turbo C++ 3.0 and Borland C++ 3.1 for DOS; | ||
922 | DJGPP 2.X; Open Watcom 1.3 for DOS (16 and 32-bit), Windows and OS/2; | ||
923 | EMX 0.9d and the "newgcc" version of EMX; Borland C++ 5.5 for Windows; | ||
924 | recent versions of MinGW, Cygwin, LCC-Win32 and Microsoft Visual C++; | ||
925 | and gcc under several flavors of Linux, Mac OS X, *BSD and Solaris. | ||
926 | |||
927 | -- William McBrine | ||
928 | |||
929 | ------------------------------------------------------------------------ | ||
930 | |||
931 | PDCurses 2.6 - 2003/01/08 | ||
932 | ========================= | ||
933 | |||
934 | INTRODUCTION: | ||
935 | |||
936 | This release of PDCurses includes the following changes: | ||
937 | |||
938 | BUGS FIXED: | ||
939 | |||
940 | - Allow accented characters on Win32 platform when run on non-English | ||
941 | keyboards. | ||
942 | |||
943 | - Allow "special" characters like Ctrl-S, Ctrl-Q under OS/2 to be returned. | ||
944 | |||
945 | - Some bugs with halfdelay() fixed by William McBrine. | ||
946 | |||
947 | - pechochar() should now work correctly. | ||
948 | |||
949 | - redrawwin() macro in curses.h was incorrect - fixed by Alberto Ornaghi | ||
950 | |||
951 | - Don't include "special" characters like KEY_SHIFT_L to be returned in | ||
952 | getnstr() family. Bug 542913 | ||
953 | |||
954 | - Entering TAB in wgetnstr() no longer exceeds requested buffer size. | ||
955 | Bug 489233 | ||
956 | |||
957 | - Fixed bug 550066, scrollok() and pads. | ||
958 | Also beep() called when buffer exceeded. Bug 562041. | ||
959 | |||
960 | - Reverse video of X11 selection reinstated. Pablo Garcia Abio?? | ||
961 | |||
962 | - Right Alt modifier now works like left Alt modifier under Win32 | ||
963 | |||
964 | - Add support for all libXaw replacement libraries with Scrollbar bug. | ||
965 | Note that for this to work, you still have to change the libXaw | ||
966 | replacement libraries to fix the bug :-( | ||
967 | |||
968 | - Don't trap signals in XCurses if calling application has ignored them. | ||
969 | Change by Frank Heckenbach. | ||
970 | |||
971 | - Bug reports from Warren W. Gay: | ||
972 | - Fix termattrs() to return A_REVERSE and A_BLINK on all platforms. | ||
973 | - Fix definition of getsyx() and setsyx() to be consistent with | ||
974 | ncurses. Bug 624424. | ||
975 | - Fix definition of echo() and noecho(). Bug 625001. | ||
976 | - Fix definition of keypad() and leaveok(). Bug 632653. | ||
977 | - Missing panel_hidden() prototype. Bug 649320. | ||
978 | |||
979 | - Fixed bug with calling def_prog_mode(), resize_term(), | ||
980 | reset_prog_mode(); the resize details were being lost. | ||
981 | |||
982 | NEW FEATURES: | ||
983 | |||
984 | - Clipboard support now available on DOS platform, but handled | ||
985 | internally to the currently running process. | ||
986 | |||
987 | - New X11 resource: textCursor, allows the text cursor to be specified | ||
988 | as a vertical bar, or the standard horizontal bar. Thanks to Frank | ||
989 | Heckenbach for the suggestion. | ||
990 | |||
991 | NEW COMPILER SUPPORT: | ||
992 | |||
993 | - lcc-win32 now works correctly | ||
994 | |||
995 | ------------------------------------------------------------------------ | ||
996 | |||
997 | PDCurses 2.5 - 2001/11/26 | ||
998 | ========================= | ||
999 | |||
1000 | INTRODUCTION: | ||
1001 | |||
1002 | This release of PDCurses includes the following changes: | ||
1003 | |||
1004 | - Set BASE address for Win32 DLL | ||
1005 | |||
1006 | - Add KEY_SUP and KEY_SDOWN. | ||
1007 | |||
1008 | - Add PDC_set_line_color() | ||
1009 | |||
1010 | - Add blink support as bold background | ||
1011 | |||
1012 | - Add bold colors | ||
1013 | |||
1014 | - Add getbkgd() macro | ||
1015 | |||
1016 | - Add new PDC functions for adding underline, overline, leftline and | ||
1017 | rightline | ||
1018 | |||
1019 | - Add support for shifted keypad keys. | ||
1020 | |||
1021 | - Allow more keypad keys to work under Win32 | ||
1022 | |||
1023 | - Change Win32 and OS/2 DLL name to curses.dll | ||
1024 | |||
1025 | - Change example resources to allow overriding from the command line | ||
1026 | |||
1027 | - Changes for building cleanly on OS/2 | ||
1028 | |||
1029 | - Changes to handle building XCurses under AIX | ||
1030 | |||
1031 | - Check if prefresh() and pnoutrefresh() parameters are valid. | ||
1032 | |||
1033 | - Ensure build/install works from any directory | ||
1034 | |||
1035 | - Handle platforms where X11 headers do not typedef XPointer. | ||
1036 | |||
1037 | - Mention that Flexos is likely out-of-date. | ||
1038 | |||
1039 | - Pass delaytenths to XCurses_rawgetch() | ||
1040 | |||
1041 | - Remove boldFont | ||
1042 | |||
1043 | - Updates for cursor blinking and italic. | ||
1044 | |||
1045 | BUGS FIXED: | ||
1046 | |||
1047 | - Fix bug with getting Win32 clipboard contents. Added new | ||
1048 | PDC_freeclipboard() function. | ||
1049 | |||
1050 | - Fix bug with halfdelay() | ||
1051 | |||
1052 | - Fix bug with mouse interrupting programs that are not trapping mouse | ||
1053 | events under Win32. | ||
1054 | |||
1055 | - Fix return value from curs_set() | ||
1056 | |||
1057 | - Reverse the left and right pointing bars in ALT_CHARSET | ||
1058 | |||
1059 | NEW COMPILER SUPPORT: | ||
1060 | |||
1061 | - Add QNX-RTP port | ||
1062 | |||
1063 | ------------------------------------------------------------------------ | ||
1064 | |||
1065 | PDCurses 2.4 - 2000/01/17 | ||
1066 | ========================= | ||
1067 | |||
1068 | INTRODUCTION: | ||
1069 | |||
1070 | This release of PDCurses includes the following changes: | ||
1071 | |||
1072 | - full support of X11 selection handling | ||
1073 | |||
1074 | - removed the need for the cursos2.h file | ||
1075 | |||
1076 | - enabled the "shifted" key on the numeric keypad | ||
1077 | |||
1078 | - added native clipboard support for X11, Win32 and OS/2 | ||
1079 | |||
1080 | - added extra functions for obtaining internal PDCurses status | ||
1081 | |||
1082 | - added clipboard and key modifier tests in testcurs.c | ||
1083 | |||
1084 | - fixes for panel library | ||
1085 | |||
1086 | - key modifiers pressed by themselves are now returned as keys: | ||
1087 | KEY_SHIFT_L KEY_SHIFT_R KEY_CONTROL_L KEY_CONTROL_R KEY_ALT_L KEY_ALT_R | ||
1088 | This works on Win32 and X11 ports only | ||
1089 | |||
1090 | - Added X11 shared library support | ||
1091 | |||
1092 | - Added extra slk formats supported by ncurses | ||
1093 | |||
1094 | - Fixed bug with resizing the terminal when slk were on. | ||
1095 | |||
1096 | - Changed behavior of slk_attrset(), slk_attron() slk_attroff() | ||
1097 | functions to work more like ncurses. | ||
1098 | |||
1099 | BUGS FIXED: | ||
1100 | |||
1101 | - some minor bug and portability fixes were included in this release | ||
1102 | |||
1103 | NEW FUNCTIONS: | ||
1104 | |||
1105 | - PDC_getclipboard() and PDC_setclipboard() for accessing the native | ||
1106 | clipboard (X11, Win32 and OS/2) | ||
1107 | |||
1108 | - PDC_set_title() for setting the title of the window (X11 and Win32 | ||
1109 | only) | ||
1110 | |||
1111 | - PDC_get_input_fd() for getting the file handle of the PDCurses input | ||
1112 | |||
1113 | - PDC_get_key_modifiers() for getting the keyboard modifier settings at | ||
1114 | the time of the last (w)getch() | ||
1115 | |||
1116 | - Xinitscr() (only for X11 port) which allows standard X11 switches to | ||
1117 | be passed to the application | ||
1118 | |||
1119 | NEW COMPILER SUPPORT: | ||
1120 | |||
1121 | - MingW32 GNU compiler under Win95/NT | ||
1122 | |||
1123 | - Cygnus Win32 GNU compiler under Win95/NT | ||
1124 | |||
1125 | - Borland C++ for OS/2 1.0+ | ||
1126 | |||
1127 | - lcc-win32 compiler under Win95/NT | ||
1128 | |||
1129 | ACKNOWLEDGEMENTS: (for this release) | ||
1130 | |||
1131 | Georg Fuchs for various changes. | ||
1132 | Juan David Palomar for pointing out getnstr() was not implemented. | ||
1133 | William McBrine for fix to allow black/black as valid color pair. | ||
1134 | Peter Preus for pointing out the missing bccos2.mak file. | ||
1135 | Laura Michaels for a couple of bug fixes and changes required to | ||
1136 | support Mingw32 compiler. | ||
1137 | Frank Heckenbach for PDC_get_input_fd() and some portability fixes and | ||
1138 | the fixes for panel library. | ||
1139 | Matthias Burian for the lcc-win32 compiler support. | ||
1140 | |||
1141 | ------------------------------------------------------------------------ | ||
1142 | |||
1143 | PDCurses 2.3 - 1998/07/09 | ||
1144 | ========================= | ||
1145 | |||
1146 | INTRODUCTION: | ||
1147 | |||
1148 | This release of PDCurses includes the following changes: | ||
1149 | |||
1150 | - added more System V R4 functions | ||
1151 | |||
1152 | - added Win32 port | ||
1153 | |||
1154 | - the X11 port is now fully functional | ||
1155 | |||
1156 | - the MS Visual C++ Win32 port now includes a DLL | ||
1157 | |||
1158 | - both the X11 and Win32 ports support the mouse | ||
1159 | |||
1160 | - the slk..() functions are now functional | ||
1161 | |||
1162 | - support for scrollbars under X11 are experimental at this stage | ||
1163 | |||
1164 | - long chtype extended to non-Unix ports | ||
1165 | |||
1166 | The name of the statically built library is pdcurses.lib (or | ||
1167 | pdcurses.a). The name of the DLL import library (where applicable) is | ||
1168 | curses.lib. | ||
1169 | |||
1170 | BUGS FIXED: | ||
1171 | |||
1172 | - some minor bugs were corrected in this release | ||
1173 | |||
1174 | NEW FUNCTIONS: | ||
1175 | |||
1176 | - slk..() functions | ||
1177 | |||
1178 | NEW COMPILER SUPPORT: | ||
1179 | |||
1180 | - MS Visual C++ under Win95/NT | ||
1181 | |||
1182 | - Watcom C++ under OS/2, Win32 and DOS | ||
1183 | |||
1184 | - two EMX ports have been provided: | ||
1185 | - OS/2 only using OS/2 APIs | ||
1186 | - OS/2 and DOS using EMX video support routines | ||
1187 | |||
1188 | EXTRA OPTIONS: | ||
1189 | |||
1190 | PDCurses recognizes two environment variables which determines the | ||
1191 | initialization and finalization behavior. These environment variables | ||
1192 | do not apply to the X11 port. | ||
1193 | |||
1194 | PDC_PRESERVE_SCREEN | ||
1195 | If this environment variable is set, PDCurses will not clear the screen | ||
1196 | to the default white on black on startup. This allows you to overlay | ||
1197 | a window over the top of the existing screen background. | ||
1198 | |||
1199 | PDC_RESTORE_SCREEN | ||
1200 | If this environment variable is set, PDCurses will take a copy of the | ||
1201 | contents of the screen at the time that PDCurses is started; initscr(), | ||
1202 | and when endwin() is called, the screen will be restored. | ||
1203 | |||
1204 | |||
1205 | ACKNOWLEDGEMENTS: (for this release) | ||
1206 | |||
1207 | Chris Szurgot for original Win32 port. | ||
1208 | Gurusamy Sarathy for some updates to the Win32 port. | ||
1209 | Kim Huron for the slk..() functions. | ||
1210 | Florian Grosse Coosmann for some bug fixes. | ||
1211 | Esa Peuha for reducing compiler warnings. | ||
1212 | Augustin Martin Domingo for patches to X11 port to enable accented | ||
1213 | characters. | ||
1214 | |||
1215 | ------------------------------------------------------------------------ | ||
1216 | |||
1217 | PDCurses 2.2 - 1995/02/12 | ||
1218 | ========================= | ||
1219 | |||
1220 | INTRODUCTION: | ||
1221 | |||
1222 | This release of PDCurses has includes a number of major changes: | ||
1223 | |||
1224 | - The portable library functions are now grouped together into single | ||
1225 | files with the same arrangement as System V R4 curses. | ||
1226 | |||
1227 | - A panels library has been included. This panels library was written by | ||
1228 | Warren Tucker. | ||
1229 | |||
1230 | - Quite a few more functions have been supplied by Wade Schauer and | ||
1231 | incorporated into release 2.2. Wade also supplied the support for the | ||
1232 | Microway NDP C/C++ 32 bit DOS compiler. | ||
1233 | |||
1234 | - The curses datatype has been changed from an unsigned int to a long. | ||
1235 | This allows more attributes to be stored as well as increasing the | ||
1236 | number of color-pairs from 32 to 64. | ||
1237 | |||
1238 | - Xwindows port (experimental at the moment). | ||
1239 | |||
1240 | BUGS FIXED: | ||
1241 | |||
1242 | - mvwin() checked the wrong coordinates | ||
1243 | |||
1244 | - removed DESQview shadow memory buffer checking bug in curses.h in | ||
1245 | #define for wstandout() | ||
1246 | |||
1247 | - lots of others I can't remember | ||
1248 | |||
1249 | NEW FUNCTIONS: | ||
1250 | |||
1251 | - Too many to mention. See intro.man for a complete list of the | ||
1252 | functions PDCurses now supports. | ||
1253 | |||
1254 | COMPILER SUPPORT: | ||
1255 | |||
1256 | - DJGPP 1.12 is now supported. The run-time error that caused programs | ||
1257 | to crash has been removed. | ||
1258 | |||
1259 | - emx 0.9a is supported. A program compiled for OS/2 should also work | ||
1260 | under DOS if you use the VID=EMX switch when compiling. See the | ||
1261 | makefile for details. | ||
1262 | |||
1263 | - The Microway NDP C/C++ DOS compiler is now supported. Thanks to Wade | ||
1264 | Schauer for this port. | ||
1265 | |||
1266 | - The Watcom C++ 10.0 DOS compiler is now supported. Thanks to Pieter | ||
1267 | Kunst for this port. | ||
1268 | |||
1269 | - The library now has many functions grouped together to reduce the size | ||
1270 | of the library and to improve the speed of compilation. | ||
1271 | |||
1272 | - The "names" of a couple of the compilers in the makefile has changed; | ||
1273 | CSET2 is now ICC and GO32 is now GCC. | ||
1274 | |||
1275 | EXTRA OPTIONS: | ||
1276 | |||
1277 | One difference between the behavior of PDCurses and Unix curses is the | ||
1278 | attributes that are displayed when a character is cleared. Under Unix | ||
1279 | curses, no attributes are displayed, so the result is always black. | ||
1280 | Under PDCurses, these functions clear with the current attributes in | ||
1281 | effect at the time. With the introduction of the bkgd functions, by | ||
1282 | default, PDCurses clears using the value set by (w)bkgd(). To have | ||
1283 | PDCurses behave the same way as it did before release 2.2, compile with | ||
1284 | -DPDCURSES_WCLR | ||
1285 | |||
1286 | ACKNOWLEDGEMENTS: (for this release) | ||
1287 | |||
1288 | Pieter Kunst, David Nugent, Warren Tucker, Darin Haugen, Stefan Strack, | ||
1289 | Wade Schauer and others who either alerted me to bugs or supplied | ||
1290 | fixes. | ||
1291 | |||
1292 | ------------------------------------------------------------------------ | ||
1293 | |||
1294 | PDCurses 2.1 - 1993/06/20 | ||
1295 | ========================= | ||
1296 | |||
1297 | INTRODUCTION: | ||
1298 | |||
1299 | The current code contains bug fixes for the DOS and OS/2 releases and | ||
1300 | also includes an alpha release for Unix. The Unix release uses another | ||
1301 | public domain package (mytinfo) to handle the low-level screen writes. | ||
1302 | mytinfo was posted to comp.sources.unix (or misc) in December 1992 or | ||
1303 | January 1993. Unless you are a glutton for punishment I would recommend | ||
1304 | you avoid the Unix port at this stage. | ||
1305 | |||
1306 | The other major addition to PDCurses is the support for DJGPP (the DOS | ||
1307 | port of GNU C++). Thanks to David Nugent <davidn@csource.oz.au>. | ||
1308 | |||
1309 | Other additions are copywin() function, function debugging support and | ||
1310 | getting the small and medium memory models to work. The testcurs.c demo | ||
1311 | program has also been changed significantly and a new demo program, | ||
1312 | tuidemo, has been added. | ||
1313 | |||
1314 | Some people have suggested including information on where to get dmake | ||
1315 | from. oak.oakland.edu in /pub/msdos/c | ||
1316 | |||
1317 | OTHER NOTES: | ||
1318 | |||
1319 | Under DOS, by default, screen writes to a CGA monitor are done via the | ||
1320 | video BIOS rather than by direct video memory writes. This is due to | ||
1321 | the CGA "snow" problem. If you have a CGA monitor and do not suffer | ||
1322 | from snow, you can compile private\_queryad.c with CGA_DIRECT defined. | ||
1323 | This will then use cause PDCurses to write directly to the CGA video | ||
1324 | memory. | ||
1325 | |||
1326 | Function debugging: Firstly to get function debugging, you have to | ||
1327 | compile the library with OPT=N in the makefile. This also turns on | ||
1328 | compiler debugging. You can control when you want PDCurses to write to | ||
1329 | the debug file (called trace in the current directory) by using the | ||
1330 | functions traceon() and traceoff() in your program. | ||
1331 | |||
1332 | Microsoft C 6.00 Users note: | ||
1333 | ---------------------------- | ||
1334 | |||
1335 | With the addition of several new functions, using dmake to compile | ||
1336 | PDCurses now causes the compiler to run "out of heap space in pass 2". | ||
1337 | Using the 6.00AX version (DOS-Extended) to compile PDCurses fixes this | ||
1338 | problem; hence the -EM switch. | ||
1339 | |||
1340 | Functional changes | ||
1341 | ------------------ | ||
1342 | |||
1343 | Added OS/2 DLL support. | ||
1344 | |||
1345 | A few curses functions have been fixed to exhibit their correct | ||
1346 | behavior and make them more functionally portable with System V | ||
1347 | curses. The functions that have changed are overlay(), overwrite() and | ||
1348 | typeahead. | ||
1349 | |||
1350 | overlay() and overwrite() | ||
1351 | |||
1352 | Both of theses functions in PDCurses 2.0 allowed for one window to be | ||
1353 | effectively placed on top of another, and the characters in the first | ||
1354 | window were overlaid or overwritten starting at 0,0 in both windows. | ||
1355 | This behavior of these functions was not correct. These functions only | ||
1356 | operate on windows that physically overlap with respect to the | ||
1357 | displayed screen. To achieve the same functionality as before, use the | ||
1358 | new function copywin(). See the manual page for further details. | ||
1359 | |||
1360 | typeahead() | ||
1361 | |||
1362 | This function in PDCurses 2.0 effectively checked to see if there were | ||
1363 | any characters remaining in the keyboard buffer. This is not the | ||
1364 | behavior exhibited by System V curses. This function is intended | ||
1365 | purely to set a flag so that curses can check while updating the | ||
1366 | physical screen if any keyboard input is pending. To achieve the same | ||
1367 | effect with typeahead() under PDCurses 2.1 the following code should be | ||
1368 | used. | ||
1369 | |||
1370 | In place of... | ||
1371 | |||
1372 | while(!typeahead(stdin)) | ||
1373 | { | ||
1374 | /* do something until any key is pressed... */ | ||
1375 | } | ||
1376 | |||
1377 | use... | ||
1378 | |||
1379 | /* getch() to return ERR if no key pending */ | ||
1380 | nodelay(stdscr,TRUE); | ||
1381 | while(getch() == (ERR)) | ||
1382 | { | ||
1383 | /* do something until any key is pressed... */ | ||
1384 | } | ||
1385 | |||
1386 | |||
1387 | ACKNOWLEDGEMENTS: (in no particular order) | ||
1388 | |||
1389 | Jason Shumate, Pieter Kunst, David Nugent, Andreas Otte, Pasi | ||
1390 | Hamalainen, James McLennan, Duane Paulson, Ib Hojme | ||
1391 | |||
1392 | Apologies to anyone I may have left out. | ||
1393 | |||
1394 | ------------------------------------------------------------------------ | ||
1395 | |||
1396 | PDCurses 2.0 - 1992/11/23 | ||
1397 | ========================= | ||
1398 | |||
1399 | INTRODUCTION: | ||
1400 | |||
1401 | Well, here it finally is; PDCurses v2.0. | ||
1402 | |||
1403 | PDCurses v2.0 is an almost total rewrite of PCcurses 1.4 done by John | ||
1404 | 'Frotz' Fa'atuai, the previous maintainer. It adds support for OS/2 as | ||
1405 | well as DOS. | ||
1406 | |||
1407 | This version has been tested with Microsoft C v6.0, QuickC v2.0 and | ||
1408 | Borland C++ 2.0 under DOS and Microsoft C v6.0 and TopSpeed c v3.02 | ||
1409 | under OS/2 2.0. Also the library has been compiled successfully with | ||
1410 | emx 0.8e, C Set/2 and Watcom 9. Most testing was done with the large | ||
1411 | memory model, where applicable. The large memory model is probably the | ||
1412 | best model to use. | ||
1413 | |||
1414 | The amount of testing has not been as extensive as I would have liked, | ||
1415 | but demands on releasing a product have outweighed the product's | ||
1416 | quality. Nothing new with that !! Hopefully with wider circulation, | ||
1417 | more bugs will be fixed more quickly. | ||
1418 | |||
1419 | I have included just 1 makefile which is suitable for dmake 3.8 for | ||
1420 | both DOS and OS/2. The makefile does not rely on customization of the | ||
1421 | dmake.ini file. | ||
1422 | |||
1423 | If you discover bugs, and especially if you have fixes, please let me | ||
1424 | know ASAP. | ||
1425 | |||
1426 | The source to the library is distributed as a zip file made with zip | ||
1427 | 1.9. You will need Info-ZIP unzip 5.0 to unzip. Follow the directions | ||
1428 | below to compile the library. | ||
1429 | |||
1430 | DIRECTIONS: | ||
1431 | |||
1432 | 1. Create a new directory in which to unzip pdcurs20.zip. This will | ||
1433 | create a curses directory and a number of subdirectories containing | ||
1434 | source code for the library and utilities and the documentation. | ||
1435 | |||
1436 | 2. Make changes to the makefile where necessary: | ||
1437 | Change the MODEL or model macro to the appropriate value (if it | ||
1438 | applies to your compiler). Use model for Borland compilers. | ||
1439 | |||
1440 | Change any paths in the defined macros to be suitable for your | ||
1441 | compiler. | ||
1442 | |||
1443 | 3. Invoke DMAKE [-e environment_options] [target] | ||
1444 | |||
1445 | where environment_options are: | ||
1446 | |||
1447 | OS (host operating system) | ||
1448 | COMP (compiler) | ||
1449 | OPT (optimized version or debug version) - optional. default Y | ||
1450 | TOS (target operating system) - optional. default OS | ||
1451 | |||
1452 | see the makefile for valid combinations | ||
1453 | |||
1454 | targets: all, demos, lcursesd.lib, manual... | ||
1455 | |||
1456 | NB. dmake is case sensitive with targets, so those environments that | ||
1457 | use an upper case model value (eg MSC) MUST specify the library | ||
1458 | target as for eg. Lcursesd.lib | ||
1459 | |||
1460 | The makefile is by default set up for Borland C++. The use of -e | ||
1461 | environment_options override these defaults. If you prefer, you can | ||
1462 | just change the defaults in the makefile and invoke it without the | ||
1463 | -e switch. | ||
1464 | |||
1465 | OTHER NOTES: | ||
1466 | |||
1467 | The documentation for the library is built into each source file, a | ||
1468 | couple of specific doc files and the header files. A program is | ||
1469 | supplied (manext) to build the manual. This program gets compiled when | ||
1470 | you build the documentation. | ||
1471 | |||
1472 | To generate the library response file correctly, I had to write a quick | ||
1473 | and dirty program (buildlrf) to achieve this. Originally the makefiles | ||
1474 | just had statements like: "echo -+$(OBJ)\$* & >> $(LRF)" which appended | ||
1475 | a suitable line to the response file. Unfortunately under some | ||
1476 | combinations of makefiles and command processors (eg. nmake and 4DOS) | ||
1477 | the & would get treated as stderr and the echo command would fail. | ||
1478 | |||
1479 | The original source for PDCurses that I received from the previous | ||
1480 | maintainer contained support for the FLEXOS operating system. Not | ||
1481 | having access to it, I could not test the changes I made so its support | ||
1482 | has fallen by the wayside. If you really need to have PDCurses running | ||
1483 | under FLEXOS, contact me and I will see what can be arranged. | ||
1484 | |||
1485 | Under DOS, by default, screen writes to a CGA monitor are done via the | ||
1486 | video BIOS rather than by direct video memory writes. This is due to | ||
1487 | the CGA "snow" problem. If you have a CGA monitor and do not suffer | ||
1488 | from snow, you can compile private\_queryad.c with CGA_DIRECT defined. | ||
1489 | This will then use cause PDCurses to write directly to the CGA video | ||
1490 | memory. | ||
1491 | |||
1492 | Added System V color support. | ||
1493 | |||
1494 | COMPILER-SPECIFIC NOTES: | ||
1495 | |||
1496 | Microsoft C | ||
1497 | ----------- | ||
1498 | |||
1499 | It is possible with MSC 6.0 to build the OS/2 libraries and demo | ||
1500 | programs from within DOS. This is the only case where it is possible to | ||
1501 | specify the value of TOS on the command line to be OS2 and the value of | ||
1502 | OS be DOS. | ||
1503 | |||
1504 | C Set/2 | ||
1505 | ------- | ||
1506 | |||
1507 | I have only tested the library using the migration libraries. I doubt | ||
1508 | that the demo programs will work without them. | ||
1509 | |||
1510 | emx | ||
1511 | --- | ||
1512 | |||
1513 | Testing has been done with 0.8e of emx together with the 16_to_32 | ||
1514 | libraries. The emx\lib directory should include the vio32.lib and | ||
1515 | kbd32.lib libraries from the 16_to_32 package. | ||
1516 | |||
1517 | BUGS and UNFINISHED BUSINESS: | ||
1518 | |||
1519 | - PDC_set_ctrl_break() function does not work under OS/2. | ||
1520 | |||
1521 | - win_print() and PDC_print() do not work under OS/2. | ||
1522 | |||
1523 | - The file todo.man in the doc directory also lists those functions of | ||
1524 | System V 3.2 curses not yet implemented. Any volunteers? | ||
1525 | |||
1526 | ACKNOWLEDGEMENTS: | ||
1527 | |||
1528 | John 'Frotz' Fa'atuai, the previous maintainer for providing an | ||
1529 | excellent base for further development. | ||
1530 | John Burnell <johnb@kea.am.dsir.govt.nz>, for the OS/2 port. | ||
1531 | John Steele, Jason (finally NOT a John) Shumate.... | ||
1532 | for various fixes and suggestions. | ||
1533 | Eberhardt Mattes (author of emx) for allowing code based on his | ||
1534 | C library to be included with PDCurses. | ||
1535 | Several others for their support, moral and actual. | ||
1536 | |||
1537 | -- Mark Hessling | ||
1538 | |||
1539 | ------------------------------------------------------------------------ | ||
1540 | |||
1541 | PDCurses 2.0Beta - 1991/12/21 | ||
1542 | ============================= | ||
1543 | |||
1544 | Changed back from short to int. (int is the correct size for the default | ||
1545 | platform. Short might be too short on some platforms. This is more | ||
1546 | portable. I, also, made this mistake.) | ||
1547 | |||
1548 | Many functions are now macros. If you want the real thing, #undef the | ||
1549 | macro. (X/Open requirement.) | ||
1550 | |||
1551 | Merged many sources into current release. | ||
1552 | |||
1553 | Added many X/Open routines (not quite all yet). | ||
1554 | |||
1555 | Added internal documentation to all routines. | ||
1556 | |||
1557 | Added a HISTORY file to the environment. | ||
1558 | |||
1559 | Added a CONTRIB file to the environment. | ||
1560 | |||
1561 | ------------------------------------------------------------------------ | ||
1562 | |||
1563 | PDCurses 1.5Beta - 1990/07/14 | ||
1564 | ============================= | ||
1565 | |||
1566 | Added many levels of compiler support. Added mixed prototypes for all | ||
1567 | "internal" routines. Removed all assembly language. Added EGA/VGA | ||
1568 | support. Converted all #ifdef to #if in all modules except CURSES.H and | ||
1569 | CURSPRIV.H. Always include ASSERT.H. Added support for an external | ||
1570 | malloc(), calloc() and free(). Added support for FAST_VIDEO | ||
1571 | (direct-memory writes). Added various memory model support (for | ||
1572 | FAST_VIDEO). Added much of the December 1988 X/Open Curses | ||
1573 | specification. | ||
1574 | |||
1575 | -- John 'Frotz' Fa'atuai | ||
1576 | |||
1577 | ------------------------------------------------------------------------ | ||
1578 | |||
1579 | PCcurses 1.4 - 1990/01/14 | ||
1580 | ========================= | ||
1581 | |||
1582 | In PCcurses v.1.4, both portability improvements and bugfixes have | ||
1583 | been made. The files have been changed to allow lint-free compilation | ||
1584 | with Microsoft C v.5.1, and with Turbo C v.2.0. The source should still | ||
1585 | compile without problems on older compilers, although this has not been | ||
1586 | verified. | ||
1587 | |||
1588 | The makefiles have been changed to suit both the public release and | ||
1589 | the author, who maintains a special kind of libraries for himself. In | ||
1590 | the case of Microsoft C, changes were done in the makefile to lower the | ||
1591 | warning level to 2 (was 3). This was to avoid ANSI warnings which are | ||
1592 | abundant because PCcurses does not attempt to follow strict ANSI C | ||
1593 | standard. | ||
1594 | |||
1595 | BUG FIXES FROM V.1.3 TO V.1.4: | ||
1596 | |||
1597 | !!!IMPORTANT CHANGE!!! | ||
1598 | |||
1599 | The definitions for OK and ERR in curses.h were exchanged. This was | ||
1600 | done to be more consistent with UNIX versions. Also, it permits | ||
1601 | functions like newwin() and subwin() to return 0 (=NULL) when they fail | ||
1602 | due to memory shortage. This incompatibility with UNIX curses was | ||
1603 | pointed out by Fred C. Smith. If you have tested success/failure by | ||
1604 | comparisons to anything other than ERR and OK, your applications will | ||
1605 | need to be be changed on that point. Sorry... but presumably most of you | ||
1606 | used the symbolic constants? | ||
1607 | |||
1608 | (END OF IMPORTANT CHANGE) | ||
1609 | |||
1610 | Fred also pointed out a bug in the file update.c. The bug caused the | ||
1611 | first character printed after 'unauthorized' screen changes (like during | ||
1612 | a shell escape, for example) to be placed at the wrong screen position. | ||
1613 | This happened even if the normal precautions (clear / touch / refresh) | ||
1614 | were taken. The problem has now been fixed. | ||
1615 | |||
1616 | PCcurses is currently also being used on a 68000 system with | ||
1617 | hard-coded ESCape sequences for ANSI terminals. However, ints used by | ||
1618 | the 68000 C compiler are 32 bits. Therefore ints have been turned into | ||
1619 | shorts wherever possible in the code (otherwise all window structures | ||
1620 | occupy twice as much space as required on the 68000). This does not | ||
1621 | affect PC versions since normally both ints and shorts are 16 bits for | ||
1622 | PC C compilers. | ||
1623 | |||
1624 | At some places in the source code there are references made to the | ||
1625 | 68000 version. There are also a makefile, a curses68.c file, and a | ||
1626 | curses68.cmd file. These are for making, low-level I/O, and linking | ||
1627 | commands when building the 68000 version. These files are probably | ||
1628 | useful to no-one but the author, since it is very specific for its | ||
1629 | special hardware environment. Still in an effort to keep all | ||
1630 | curses-related sources in one place they are included. Note however that | ||
1631 | PCcurses will not officially support a non-PC environment. | ||
1632 | |||
1633 | The file cursesio.c, which was included in the package at revision | ||
1634 | level 1.2, and which was to be an alternative to the cursesio.asm file, | ||
1635 | has been verified to behave incorrectly in the function _curseskeytst(). | ||
1636 | The problem was that the value of 'cflag' does not contain the proper | ||
1637 | data for the test that is attempted. Furthermore, neither Turbo C or | ||
1638 | Microsoft C allows any way to return the data that is needed, and | ||
1639 | consequently you should not use cursesio.c. The best solution is to | ||
1640 | simply use the ASM version. In v.1.2 and v.1.3, the user could edit the | ||
1641 | makefile to select which version he wanted to use. The makefiles in | ||
1642 | v.1.4 have removed this possibility forcing the use of the ASM file, and | ||
1643 | cursesio.c has been dropped from the distribution. | ||
1644 | |||
1645 | A bug in the wgetstr() function caused PCcurses to echo characters | ||
1646 | when reading a keyboard string, even if the echo had been turned off. | ||
1647 | Thanks to Per Foreby at Lund University, Sweden, for this. Per also | ||
1648 | reported bugs concerning the handling of characters with bit 8 set. | ||
1649 | Their ASCII code were considered as lower than 32, so they were erased | ||
1650 | etc. like control characters, i.e. erasing two character positions. The | ||
1651 | control character test was changed to cope with this. | ||
1652 | |||
1653 | The overlay() and overwrite() functions were changed so that the | ||
1654 | overlaying window is positioned at its 'own' coordinates inside the | ||
1655 | underlying window (it used to be at the underlying window's [0,0] | ||
1656 | position). There is some controversy about this - the documentation for | ||
1657 | different curses versions say different things. I think the choice made | ||
1658 | is the most reasonable. | ||
1659 | |||
1660 | The border() and wborder() functions were changed to actually draw a | ||
1661 | border, since this seems to be the correct behavior of these functions. | ||
1662 | They used to just set the border characters to be used by box(). These | ||
1663 | functions are not present in standard BSD UNIX curses. | ||
1664 | |||
1665 | The subwin() function previously did not allow the subwindow to be as | ||
1666 | big as the original window in which it was created. This has now been | ||
1667 | fixed. There was also the problem that the default size (set by | ||
1668 | specifying numlines or numcols (or both) as 0 made the resulting actual | ||
1669 | size 1 line/column too small. | ||
1670 | |||
1671 | There were a few spelling errors in function names, both in the | ||
1672 | function declarations and in curses.h. This was reported by Carlos | ||
1673 | Amaral at INESC in Portugal. Thanks! There was also an unnecessary (but | ||
1674 | harmless) parameter in a function call at one place. | ||
1675 | |||
1676 | ------------------------------------------------------------------------ | ||
1677 | |||
1678 | PCcurses 1.3 - 1988/10/05 | ||
1679 | ========================= | ||
1680 | |||
1681 | The file 'border.c' is now included. It allows you to explicitly | ||
1682 | specify what characters should be used as box borders when the box() | ||
1683 | functions are called. If the new border characters are non-0, they | ||
1684 | override the border characters specified in the box() call. In my | ||
1685 | understanding, this functionality is required for AT&T UNIX sV.3 | ||
1686 | compatibility. Thanks for this goes to Tony L. Hansen | ||
1687 | (hansen@pegasus.UUCP) for posting an article about it on Usenet | ||
1688 | (newsgroup comp.unix.questions; his posting was not related at all to | ||
1689 | PCcurses). | ||
1690 | |||
1691 | The only other difference between v.1.2 and v.1.3 is that the latter | ||
1692 | has been changed to avoid warning diagnostics if the source files are | ||
1693 | compiled with warning switches on (for Microsoft this means '-W3', for | ||
1694 | Turbo C it means '-w -w-pro'). Of these, the Turbo C warning check is | ||
1695 | clearly to be used rather than Microsoft, even if neither of them comes | ||
1696 | even close to a real UNIX 'lint'. Some of the warnings in fact indicated | ||
1697 | real bugs, mostly functions that did not return correct return values or | ||
1698 | types. | ||
1699 | |||
1700 | The makefiles for both MSC and TRC have been modified to produce | ||
1701 | warning messages as part of normal compilation. | ||
1702 | |||
1703 | ------------------------------------------------------------------------ | ||
1704 | |||
1705 | PCcurses 1.2 - 1988/10/02 | ||
1706 | ========================= | ||
1707 | |||
1708 | The changes from v.1.1 to v.1.2 are minor. The biggest change is that | ||
1709 | there was a bug related to limiting the cursor movement if the | ||
1710 | application tried to move it outside the screen (something that should | ||
1711 | not be done anyway). Such erroneous application behavior is now handled | ||
1712 | appropriately. | ||
1713 | |||
1714 | All modules have been changed to have a revision string in them, which | ||
1715 | makes it easier to determine what version is linked into a program (or | ||
1716 | what library version you have). | ||
1717 | |||
1718 | There is now a 'cursesio.c' file. That file does the same as | ||
1719 | 'cursesio.asm' (i.e. it provides the interface to the lower-level system | ||
1720 | I/O routines). It is written in C and thus it is (possibly) more | ||
1721 | portable than the assembler version (but still not so portable since it | ||
1722 | uses 8086 INT XX calls directly). When one creates new curses libraries, | ||
1723 | one chooses whether to use the assembler or the C version of cursesio. | ||
1724 | The choice is made by commenting out the appropriate dependencies for | ||
1725 | cursesio.obj, near the end of the makefiles. | ||
1726 | |||
1727 | There is now a 'setmode.c' file. That file contains functions that | ||
1728 | save and restore terminal modes. They do it into other variables than do | ||
1729 | savetty() and resetty(), so one should probably use either | ||
1730 | savetty()/resetty() or the new functions only - and not mix the both | ||
1731 | ways unless one really knows what one does. | ||
1732 | |||
1733 | Diff lists vs v.1.0 are no longer included in the distribution. The | ||
1734 | make utility still is. PCcurses v.1.2 still compiles with Microsoft C | ||
1735 | v.4.0, and with Borland Turbo C v.1.0. There is as far as I know no | ||
1736 | reason to believe that it does not compile under Microsoft C v.3.0 and | ||
1737 | 5.x, or Turbo C v.1.5, but this has not been tested. | ||
1738 | |||
1739 | There are two makefiles included, one for Microsoft C, one for Turbo | ||
1740 | C. They are both copies of my personal makefiles, and as such they | ||
1741 | reflect the directory structure on my own computer. This will have to be | ||
1742 | changed before you run make. Check $(INCDIR) and $(LIBDIR) in | ||
1743 | particular, and make the choice of ASM or C cursesio version as | ||
1744 | mentioned above (the distribution version uses the C version of | ||
1745 | cursesio). | ||
1746 | |||
1747 | The manual file (curses.man) has been changed at appropriate places. | ||
1748 | |||
1749 | I would like to thank the following persons for their help: | ||
1750 | |||
1751 | Brandon S. Allbery (alberry@ncoast.UUCP) | ||
1752 | for running comp.binaries.ibm.pc (at that time) | ||
1753 | and comp.source.misc. | ||
1754 | |||
1755 | Steve Balogh (Steve@cit5.cit.oz.AU) | ||
1756 | for writing a set of manual pages and posting | ||
1757 | them to the net. | ||
1758 | |||
1759 | Torbjorn Lindh | ||
1760 | for finding bugs and suggesting raw | ||
1761 | character output routines. | ||
1762 | |||
1763 | Nathan Glasser (nathan@eddie.mit.edu) | ||
1764 | for finding and reporting bugs. | ||
1765 | |||
1766 | Ingvar Olafsson (...enea!hafro!ingvar) | ||
1767 | for finding and reporting bugs. | ||
1768 | |||
1769 | Eric Rosco (...enea!ipmoea!ericr) | ||
1770 | for finding and reporting bugs. | ||
1771 | |||
1772 | Steve Creps (creps@silver.bacs.indiana.edu) | ||
1773 | for doing a lot of work - among others | ||
1774 | posting bug fixes to the net, and writing | ||
1775 | the new cursesio.c module. | ||
1776 | |||
1777 | N. Dean Pentcheff (dean@violet.berkeley.edu) | ||
1778 | for finding bugs and rewriting cursesio.asm | ||
1779 | for Turbo 'C' 1.5. | ||
1780 | |||
1781 | Finally, Jeff Dean (parcvax,hplabs}!cdp!jeff) | ||
1782 | (jeff@ads.arpa) | ||
1783 | has had a shareware version of curses deliverable since | ||
1784 | about half a year before I released PCcurses 1.0 on Use- | ||
1785 | Net. He is very concerned about confusion between the two | ||
1786 | packages, and therefore any references on the network | ||
1787 | should make clear whether they reference Dean's PCcurses | ||
1788 | or Larsson's PCcurses. | ||
1789 | |||
1790 | ------------------------------------------------------------------------ | ||
1791 | |||
1792 | PCcurses 1.1 - 1988/03/06 | ||
1793 | ========================= | ||
1794 | |||
1795 | The changes from v.1.0 to v.1.1 are minor. There are a few bug fixes, | ||
1796 | and new (non-portable) functions for verbatim IBM character font display | ||
1797 | have been added (in charadd.c and charins.c). The manual file | ||
1798 | (curses.man) has been changed at appropriate places. | ||
1799 | |||
1800 | In the file v10tov11.dif there are listings of the differences between | ||
1801 | version 1.0 and 1.1. The diff listings are in UNIX diff(1) format. | ||
1802 | |||
1803 | Version 1.1 compiles with Turbo C v.1.0, as well as Microsoft C v.3.0 | ||
1804 | and v.4.0. On the release disk there is a make.exe utility which is very | ||
1805 | similar to UNIX make (If the package was mailed to you, the make utility | ||
1806 | will be in uuencoded format - in make.uu - and must be uudecoded first). | ||
1807 | It is much more powerful than Microsoft's different MAKEs; the latter | ||
1808 | ones will NOT generate libraries properly if used with the PCcurses | ||
1809 | makefiles. | ||
1810 | |||
1811 | There are three makefiles: | ||
1812 | |||
1813 | makefile generic MSC 3.0 makefile | ||
1814 | makefile.ms MSC 4.0 makefile | ||
1815 | makefile.tc Turbo C 1.0 makefile | ||
1816 | |||
1817 | To make a library with for example Turbo C, make directories to hold | ||
1818 | .H and .LIB files (these directories are the 'standard places'), edit | ||
1819 | makefile.tc for this, and type | ||
1820 | |||
1821 | make -f makefile.tc all | ||
1822 | |||
1823 | and libraries for all memory models will be created in the .LIB | ||
1824 | directory, while the include files will end up in the .H directory. Also | ||
1825 | read what is said about installation below! | ||
1826 | |||
1827 | ------------------------------------------------------------------------ | ||
1828 | |||
1829 | PCcurses 1.0 - 1987/08/24 | ||
1830 | ========================= | ||
1831 | |||
1832 | This is the release notes for the PCcurses v.1.0 cursor/window control | ||
1833 | package. PCcurses offers the functionality of UNIX curses, plus some | ||
1834 | extras. Normally it should be possible to port curses-based programs | ||
1835 | from UNIX curses to PCcurses on the IBM PC without changes. PCcurses is | ||
1836 | a port/ rewrite of Pavel Curtis' public domain 'ncurses' package. All | ||
1837 | the code has been re-written - it is not just an edit of ncurses (or | ||
1838 | UNIX curses). I mention this to clarify any copyright violation claims. | ||
1839 | The data structures and ideas are very similar to ncurses. As for UNIX | ||
1840 | curses, I have not even seen any sources for it. | ||
1841 | |||
1842 | For an introduction to the use of 'curses' and its derivatives, you | ||
1843 | should read 'Screen Updating and Cursor Movement Optimization: A Library | ||
1844 | Package' by Kenneth C. R. C. Arnold, which describes the original | ||
1845 | Berkeley UNIX version of curses. It is available as part of the UNIX | ||
1846 | manuals. The other source of information is 'The Ncurses Reference | ||
1847 | Manual' by Pavel Curtis. The latter is part of Curtis' ncurses package. | ||
1848 | |||
1849 | The only other documentation provided is a 'man' page which describes | ||
1850 | all the included functions in a very terse way. In the sources, each | ||
1851 | function is preceded by a rather thorough description of what the | ||
1852 | function does. I didn't have time to write a nice manual/tutorial - | ||
1853 | sorry. | ||
1854 | |||
1855 | PCcurses is released as a number of source files, a man page, and a | ||
1856 | make file. A uuencoded copy of a 'make' utility, and a manpage for the | ||
1857 | 'make' is also provided to make it easier to put together PCcurses | ||
1858 | libraries. Even if you are not interested in PCcurses, it may be | ||
1859 | worthwhile to grab the make. | ||
1860 | |||
1861 | The makefile assumes the presence of the Microsoft C compiler (3.0 or | ||
1862 | 4.0), Microsoft MASM and LIB, plus some MS-DOS utilities. The reason for | ||
1863 | supplying MAKE.EXE is that the Microsoft 'MAKE:s' are much inferior to a | ||
1864 | real UNIX make. The supplied make is a port of a public domain make, | ||
1865 | published on Usenet. It is almost completely compatible with UNIX make. | ||
1866 | When generating the curses libraries, the makefile will direct make to | ||
1867 | do some directory creating and file copying, and then re-invoke itself | ||
1868 | with new targets. The workings of the makefile are not absolutely | ||
1869 | crystal clear at first sight... just start it and see what it does. | ||
1870 | |||
1871 | For portability, the curses libraries depend on one assembler file for | ||
1872 | access to the BIOS routines. There is no support for the EGA, but both | ||
1873 | CGA, MGA, and the HGA can be used. The libraries are originally for | ||
1874 | Microsoft C, but all C modules should be portable right away. In the | ||
1875 | assembler file, segment names probably need to be changed, and possibly | ||
1876 | the parameter passing scheme. I think Turbo C will work right away - as | ||
1877 | far as I understand, all its conventions are compatible with Microsoft | ||
1878 | C. | ||
1879 | |||
1880 | There are some parts left out between ncurses and PCcurses. One is the | ||
1881 | support for multiple terminals - not very interesting on a PC anyway. | ||
1882 | Because we KNOW what terminal we have, there is no need for a termcap or | ||
1883 | terminfo library. PCcurses also has some things that neither curses nor | ||
1884 | ncurses have. Compared to the original UNIX curses, PCcurses has lots of | ||
1885 | extras. | ||
1886 | |||
1887 | The BIOS routines are used directly, which gives fast screen updates. | ||
1888 | PCcurses does not do direct writes to screen RAM - in my opinion it is | ||
1889 | a bit ugly to rely that much on hardware compatibility. Anyone could fix | ||
1890 | that, of course... | ||
1891 | |||
1892 | One of the more serious problems with PCcurses is the way in which | ||
1893 | normal, cbreak, and raw input modes are done. All those details are in | ||
1894 | the 'charget' module - I do raw I/O via the BIOS, and perform any | ||
1895 | buffering myself. If an application program uses PCcurses, it should do | ||
1896 | ALL its I/O via PCcurses calls, otherwise the mix of normal and | ||
1897 | PCcurses I/O may mess up the display. I think my code is reasonable... | ||
1898 | comments are welcome, provided you express them nicely... | ||
1899 | |||
1900 | To install, copy all files to a work directory, edit 'makefile' to | ||
1901 | define the standard include and library file directory names of your | ||
1902 | choice (these directories must exist already, and their path names must | ||
1903 | be relative to the root directory, not to the current one). You must | ||
1904 | also run uudecode on make.uu, to generate MAKE.EXE. You can do that on | ||
1905 | your PC, if you have uudecode there, otherwise you can do it under UNIX | ||
1906 | and do a binary transfer to the PC. When you have MAKE.EXE in your work | ||
1907 | directory (or in your /bin directory), type make. | ||
1908 | |||
1909 | Make will now create 4 sub-directories (one for each memory model), | ||
1910 | copy some assembler include files into them, copy two include files to | ||
1911 | your include directory, CHDIR to each sub-directory and re-invoke itself | ||
1912 | with other make targets to compile and assemble all the source files | ||
1913 | into the appropriate directories. Then the library manager is run to | ||
1914 | create the library files in your desired library directory. Presto! | ||
1915 | |||
1916 | If you only want to generate a library for one memory model, type | ||
1917 | 'make small', 'make large', etc. The name of the memory model must be in | ||
1918 | lower case, like in the makefile. | ||
1919 | |||
1920 | I think the package is fairly well debugged - but then again, that's | ||
1921 | what I always think. It was completed in May-87, and no problems found | ||
1922 | yet. Now it's your turn... Comments, suggestions and bug reports and | ||
1923 | fixes (no flames please) to | ||
1924 | |||
1925 | -- Bjorn Larsson |
File IMPLEMNT added (mode: 100644) (index 00000000..0445f8bb) | |||
1 | PDCurses Implementor's Guide | ||
2 | ============================ | ||
3 | |||
4 | Version 1.3 - 200?/??/?? - notes about official ports | ||
5 | Version 1.2 - 2007/07/11 - added PDC_init_pair(), PDC_pair_content(), | ||
6 | version history; removed pdc_atrtab | ||
7 | Version 1.1 - 2007/06/06 - minor cosmetic change | ||
8 | Version 1.0 - 2007/04/01 - initial revision | ||
9 | |||
10 | This document is for those wishing to port PDCurses to a new platform, | ||
11 | or just wanting to better understand how it works. Nothing here should | ||
12 | be needed for application programming; for that, refer to PDCurses.txt, | ||
13 | as built in doc/, or distributed as a file separate from this source | ||
14 | package. This document assumes that you've read the user-level | ||
15 | documentation and are very familiar with application-level curses | ||
16 | programming. | ||
17 | |||
18 | If you want to submit your port for possible inclusion into the main | ||
19 | PDCurses distribution, please follow these guidelines: | ||
20 | |||
21 | - Don't modify anything in the pdcurses directory or in other port | ||
22 | directories. Don't modify curses.h or curspriv.h unless absolutely | ||
23 | necessary. (And prefer modifying curspriv.h over curses.h.) | ||
24 | |||
25 | - Use the same indentation style, naming and scope conventions as the | ||
26 | existing code. | ||
27 | |||
28 | - Release all your code to the public domain -- no copyright. Code | ||
29 | under GPL, BSD, etc. will not be accepted. | ||
30 | |||
31 | |||
32 | DATA STRUCTURES | ||
33 | --------------- | ||
34 | |||
35 | A port of PDCurses must provide acs_map[], a 128-element array of | ||
36 | chtypes, with values laid out based on the Alternate Character Set of | ||
37 | the VT100 (see curses.h). PDC_transform_line() must use this table; when | ||
38 | it encounters a chtype with the A_ALTCHARSET flag set, and an A_CHARTEXT | ||
39 | value in the range 0-127, it must render it using the A_CHARTEXT portion | ||
40 | of the corresponding value from this table, instead of the original | ||
41 | value. Also, values may be read from this table by apps, and passed | ||
42 | through functions such as waddch(), which does no special processing on | ||
43 | control characters (0-31 and 127) when the A_ALTCHARSET flag is set. | ||
44 | Thus, any control characters used in acs_map[] should also have the | ||
45 | A_ALTCHARSET flag set. Implementations should provide suitable values | ||
46 | for all the ACS_ macros defined in curses.h; other values in the table | ||
47 | should be filled with their own indices (e.g., acs_map['E'] == 'E'). The | ||
48 | table can be either hardwired, or filled by PDC_scr_open(). Existing | ||
49 | ports define it in pdcdisp.c, but this is not required. | ||
50 | |||
51 | |||
52 | FUNCTIONS | ||
53 | --------- | ||
54 | |||
55 | A port of PDCurses must implement the following functions, with extern | ||
56 | scope. These functions are traditionally divided into several modules, | ||
57 | as indicated below; this division is not required (only the functions | ||
58 | are), but may make it easier to follow for someone familiar with the | ||
59 | existing ports. | ||
60 | |||
61 | Any other functions you create as part of your implementation should | ||
62 | have static scope, if possible. If they can't be static, they should be | ||
63 | named with the "PDC_" prefix. This minimizes the risk of collision with | ||
64 | an application's choices. | ||
65 | |||
66 | Current PDCurses style also uses a single leading underscore with the | ||
67 | name of any static function; and modified BSD/Allman-style indentation, | ||
68 | approximately equivalent to "indent -kr -i8 -bl -bli0", with adjustments | ||
69 | to keep every line under 80 columns. This isn't essential, but a | ||
70 | consistent style helps readability. | ||
71 | |||
72 | |||
73 | pdcdisp.c: | ||
74 | ---------- | ||
75 | |||
76 | void PDC_gotoyx(int y, int x); | ||
77 | |||
78 | Move the physical cursor (as opposed to the logical cursor affected by | ||
79 | wmove()) to the given location. This is called mainly from doupdate(). | ||
80 | In general, this function need not compare the old location with the new | ||
81 | one, and should just move the cursor unconditionally. | ||
82 | |||
83 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp); | ||
84 | |||
85 | The core output routine. It takes len chtype entities from srcp (a | ||
86 | pointer into curscr) and renders them to the physical screen at line | ||
87 | lineno, column x. It must also translate characters 0-127 via acs_map[], | ||
88 | if they're flagged with A_ALTCHARSET in the attribute portion of the | ||
89 | chtype. | ||
90 | |||
91 | |||
92 | pdcgetsc.c: | ||
93 | ----------- | ||
94 | |||
95 | int PDC_get_columns(void); | ||
96 | |||
97 | Returns the size of the screen in columns. It's used in resize_term() to | ||
98 | set the new value of COLS. (Some existing implementations also call it | ||
99 | internally from PDC_scr_open(), but this is not required.) | ||
100 | |||
101 | int PDC_get_cursor_mode(void); | ||
102 | |||
103 | Returns the size/shape of the cursor. The format of the result is | ||
104 | unspecified, except that it must be returned as an int. This function is | ||
105 | called from initscr(), and the result is stored in SP->orig_cursor, | ||
106 | which is used by PDC_curs_set() to determine the size/shape of the | ||
107 | cursor in normal visibility mode (curs_set(1)). | ||
108 | |||
109 | int PDC_get_rows(void); | ||
110 | |||
111 | Returns the size of the screen in rows. It's used in resize_term() to | ||
112 | set the new value of LINES. (Some existing implementations also call it | ||
113 | internally from PDC_scr_open(), but this is not required.) | ||
114 | |||
115 | |||
116 | pdckbd.c: | ||
117 | --------- | ||
118 | |||
119 | bool PDC_check_key(void); | ||
120 | |||
121 | Keyboard/mouse event check, called from wgetch(). Returns TRUE if | ||
122 | there's an event ready to process. This function must be non-blocking. | ||
123 | |||
124 | void PDC_flushinp(void); | ||
125 | |||
126 | This is the core of flushinp(). It discards any pending key or mouse | ||
127 | events, removing them from any internal queue and from the OS queue, if | ||
128 | applicable. | ||
129 | |||
130 | int PDC_get_key(void); | ||
131 | |||
132 | Get the next available key, or mouse event (indicated by a return of | ||
133 | KEY_MOUSE), and remove it from the OS' input queue, if applicable. This | ||
134 | function is called from wgetch(). This function may be blocking, and | ||
135 | traditionally is; but it need not be. If a valid key or mouse event | ||
136 | cannot be returned, for any reason, this function returns -1. Valid keys | ||
137 | are those that fall within the appropriate character set, or are in the | ||
138 | list of special keys found in curses.h (KEY_MIN through KEY_MAX). When | ||
139 | returning a special key code, this routine must also set SP->key_code to | ||
140 | TRUE; otherwise it must set it to FALSE. If SP->return_key_modifiers is | ||
141 | TRUE, this function may return modifier keys (shift, control, alt), | ||
142 | pressed alone, as special key codes; if SP->return_key_modifiers is | ||
143 | FALSE, it must not. If modifier keys are returned, it should only happen | ||
144 | if no other keys were pressed in the meantime; i.e., the return should | ||
145 | happen on key up. But if this is not possible, it may return the | ||
146 | modifier keys on key down (if and only if SP->return_key_modifiers is | ||
147 | TRUE). | ||
148 | |||
149 | int PDC_modifiers_set(void); | ||
150 | |||
151 | Called from PDC_return_key_modifiers(). If your platform needs to do | ||
152 | anything in response to a change in SP->return_key_modifiers, do it | ||
153 | here. Returns OK or ERR, which is passed on by the caller. | ||
154 | |||
155 | int PDC_mouse_set(void); | ||
156 | |||
157 | Called by mouse_set(), mouse_on(), and mouse_off() -- all the functions | ||
158 | that modify SP->_trap_mbe. If your platform needs to do anything in | ||
159 | response to a change in SP->_trap_mbe (for example, turning the mouse | ||
160 | cursor on or off), do it here. Returns OK or ERR, which is passed on by | ||
161 | the caller. | ||
162 | |||
163 | void PDC_set_keyboard_binary(bool on); | ||
164 | |||
165 | Set keyboard input to "binary" mode. If you need to do something to keep | ||
166 | the OS from processing ^C, etc. on your platform, do it here. TRUE turns | ||
167 | the mode on; FALSE reverts it. This function is called from raw() and | ||
168 | noraw(). | ||
169 | |||
170 | |||
171 | pdcscrn.c: | ||
172 | ---------- | ||
173 | |||
174 | bool PDC_can_change_color(void); | ||
175 | |||
176 | Returns TRUE if init_color() and color_content() give meaningful | ||
177 | results, FALSE otherwise. Called from can_change_color(). | ||
178 | |||
179 | int PDC_color_content(short color, short *red, short *green, short *blue); | ||
180 | |||
181 | The core of color_content(). This does all the work of that function, | ||
182 | except checking for values out of range and null pointers. | ||
183 | |||
184 | int PDC_init_color(short color, short red, short green, short blue); | ||
185 | |||
186 | The core of init_color(). This does all the work of that function, | ||
187 | except checking for values out of range. | ||
188 | |||
189 | void PDC_init_pair(short pair, short fg, short bg); | ||
190 | |||
191 | The core of init_pair(). This does all the work of that function, except | ||
192 | checking for values out of range. The values passed to this function | ||
193 | should be returned by a call to PDC_pair_content() with the same pair | ||
194 | number. PDC_transform_line() should use the specified colors when | ||
195 | rendering a chtype with the given pair number. | ||
196 | |||
197 | int PDC_pair_content(short pair, short *fg, short *bg); | ||
198 | |||
199 | The core of pair_content(). This does all the work of that function, | ||
200 | except checking for values out of range and null pointers. | ||
201 | |||
202 | void PDC_reset_prog_mode(void); | ||
203 | |||
204 | The non-portable functionality of reset_prog_mode() is handled here -- | ||
205 | whatever's not done in _restore_mode(). In current ports: In OS/2, this | ||
206 | sets the keyboard to binary mode; in Win32, it enables or disables the | ||
207 | mouse pointer to match the saved mode; in others it does nothing. | ||
208 | |||
209 | void PDC_reset_shell_mode(void); | ||
210 | |||
211 | The same thing, for reset_shell_mode(). In OS/2 and Win32, it restores | ||
212 | the default console mode; in others it does nothing. | ||
213 | |||
214 | int PDC_resize_screen(int nlines, int ncols); | ||
215 | |||
216 | This does the main work of resize_term(). It may respond to non-zero | ||
217 | parameters, by setting the screen to the specified size; to zero | ||
218 | parameters, by setting the screen to a size chosen by the user at | ||
219 | runtime, in an unspecified way (e.g., by dragging the edges of the | ||
220 | window); or both. It may also do nothing, if there's no appropriate | ||
221 | action for the platform. | ||
222 | |||
223 | void PDC_restore_screen_mode(int i); | ||
224 | |||
225 | Called from _restore_mode() in kernel.c, this function does the actual | ||
226 | mode changing, if applicable. Currently used only in DOS and OS/2. | ||
227 | |||
228 | void PDC_save_screen_mode(int i); | ||
229 | |||
230 | Called from _save_mode() in kernel.c, this function saves the actual | ||
231 | screen mode, if applicable. Currently used only in DOS and OS/2. | ||
232 | |||
233 | void PDC_scr_close(void); | ||
234 | |||
235 | The platform-specific part of endwin(). It may restore the image of the | ||
236 | original screen saved by PDC_scr_open(), if the PDC_RESTORE_SCREEN | ||
237 | environment variable is set; either way, if using an existing terminal, | ||
238 | this function should restore it to the mode it had at startup, and move | ||
239 | the cursor to the lower left corner. (The X11 port does nothing.) | ||
240 | |||
241 | void PDC_scr_free(void); | ||
242 | |||
243 | Frees the memory for SP allocated by PDC_scr_open(). Called by | ||
244 | delscreen(). | ||
245 | |||
246 | int PDC_scr_open(int argc, char **argv); | ||
247 | |||
248 | The platform-specific part of initscr(). It's actually called from | ||
249 | Xinitscr(); the arguments, if present, correspond to those used with | ||
250 | main(), and may be used to set the title of the terminal window, or for | ||
251 | other, platform-specific purposes. (The arguments are currently used | ||
252 | only in X11.) PDC_scr_open() must allocate memory for SP, and must | ||
253 | initialize acs_map[] (unless it's preset) and several members of SP, | ||
254 | including lines, cols, mouse_wait, orig_attr (and if orig_attr is TRUE, | ||
255 | orig_fore and orig_back), mono, _restore and _preserve. (Although SP is | ||
256 | used the same way in all ports, it's allocated here in order to allow | ||
257 | the X11 port to map it to a block of shared memory.) If using an | ||
258 | existing terminal, and the environment variable PDC_RESTORE_SCREEN is | ||
259 | set, this function may also store the existing screen image for later | ||
260 | restoration by PDC_scr_close(). | ||
261 | |||
262 | |||
263 | pdcsetsc.c: | ||
264 | ----------- | ||
265 | |||
266 | int PDC_curs_set(int visibility); | ||
267 | |||
268 | Called from curs_set(). Changes the appearance of the cursor -- 0 turns | ||
269 | it off, 1 is normal (the terminal's default, if applicable, as | ||
270 | determined by SP->orig_cursor), and 2 is high visibility. The exact | ||
271 | appearance of these modes is not specified. | ||
272 | |||
273 | |||
274 | pdcutil.c: | ||
275 | ---------- | ||
276 | |||
277 | void PDC_beep(void); | ||
278 | |||
279 | Emits a short audible beep. If this is not possible on your platform, | ||
280 | you must set SP->audible to FALSE during initialization (i.e., from | ||
281 | PDC_scr_open() -- not here); otherwise, set it to TRUE. This function is | ||
282 | called from beep(). | ||
283 | |||
284 | void PDC_napms(int ms); | ||
285 | |||
286 | This is the core delay routine, called by napms(). It pauses for about | ||
287 | (the X/Open spec says "at least") ms milliseconds, then returns. High | ||
288 | degrees of accuracy and precision are not expected (though desirable, if | ||
289 | you can achieve them). More important is that this function gives back | ||
290 | the process' time slice to the OS, so that PDCurses idles at low CPU | ||
291 | usage. | ||
292 | |||
293 | const char *PDC_sysname(void); | ||
294 | |||
295 | Returns a short string describing the platform, such as "DOS" or "X11". | ||
296 | This is used by longname(). It must be no more than 100 characters; it | ||
297 | should be much, much shorter (existing platforms use no more than 5). | ||
298 | |||
299 | -------------------------------------------------------------------------- | ||
300 | |||
301 | The following functions are implemented in the platform directories, but | ||
302 | are accessed directly by apps. Refer to the user documentation for their | ||
303 | descriptions: | ||
304 | |||
305 | |||
306 | pdcclip.c: | ||
307 | ---------- | ||
308 | |||
309 | int PDC_clearclipboard(void); | ||
310 | int PDC_freeclipboard(char *contents); | ||
311 | int PDC_getclipboard(char **contents, long *length); | ||
312 | int PDC_setclipboard(const char *contents, long length); | ||
313 | |||
314 | |||
315 | pdckbd.c: | ||
316 | --------- | ||
317 | |||
318 | unsigned long PDC_get_input_fd(void); | ||
319 | |||
320 | |||
321 | pdcsetsc.c: | ||
322 | ----------- | ||
323 | |||
324 | int PDC_set_blink(bool blinkon); | ||
325 | void PDC_set_title(const char *title); |
File Makefile.in added (mode: 100644) (index 00000000..dc40abfb) | |||
1 | # Makefile for PDCurses library for X11 | ||
2 | |||
3 | SHELL = @SHELL@ | ||
4 | |||
5 | @SET_MAKE@ | ||
6 | |||
7 | srcdir =@srcdir@ | ||
8 | prefix =@prefix@ | ||
9 | exec_prefix =$(DESTDIR)@exec_prefix@ | ||
10 | libdir =$(exec_prefix)/lib | ||
11 | bindir =$(exec_prefix)/bin | ||
12 | includedir =$(exec_prefix)/include | ||
13 | pdcursesdir =./x11 | ||
14 | |||
15 | INSTALL =$(srcdir)/install-sh | ||
16 | RANLIB =@RANLIB@ | ||
17 | SHLPRE = @SHLPRE@ | ||
18 | SHLPST = @SHLPST@ | ||
19 | SHLFILE = XCurses | ||
20 | |||
21 | include $(srcdir)/version.mif | ||
22 | |||
23 | PDC_DIR=PDCurses-$(VERDOT) | ||
24 | |||
25 | ZIPFILE = pdcurs$(VER).zip | ||
26 | TARBALL = $(PDC_DIR).tar.gz | ||
27 | |||
28 | all \ | ||
29 | clean \ | ||
30 | distclean \ | ||
31 | mostlyclean \ | ||
32 | realclean :: | ||
33 | cd x11; $(MAKE) $(MFLAGS) $@ | ||
34 | cd doc; $(MAKE) $(MFLAGS) $@ | ||
35 | |||
36 | install :: | ||
37 | $(INSTALL) -d -m 755 $(libdir) | ||
38 | $(INSTALL) -d -m 755 $(bindir) | ||
39 | $(INSTALL) -d -m 755 $(includedir) | ||
40 | $(INSTALL) -d -m 755 $(includedir)/xcurses | ||
41 | $(INSTALL) -c -m 644 $(srcdir)/curses.h $(includedir)/xcurses.h | ||
42 | $(INSTALL) -c -m 644 $(srcdir)/curses.h $(includedir)/xcurses/curses.h | ||
43 | sed -e 's/#include <curses.h>/#include <xcurses.h>/' \ | ||
44 | < $(srcdir)/panel.h > ./xpanel.h | ||
45 | $(INSTALL) -m 644 ./xpanel.h $(includedir)/xpanel.h | ||
46 | $(INSTALL) -c -m 644 $(srcdir)/panel.h $(includedir)/xcurses/panel.h | ||
47 | $(INSTALL) -c -m 644 $(srcdir)/term.h $(includedir)/xcurses/term.h | ||
48 | $(INSTALL) -c -m 644 $(pdcursesdir)/libXCurses.a $(libdir)/libXCurses.a | ||
49 | -$(RANLIB) $(libdir)/libXCurses.a | ||
50 | -$(INSTALL) -c -m 755 $(pdcursesdir)/$(SHLPRE)$(SHLFILE)$(SHLPST) \ | ||
51 | $(libdir)/$(SHLPRE)$(SHLFILE)$(SHLPST) | ||
52 | ln -f -s $(libdir)/$(SHLPRE)$(SHLFILE)$(SHLPST) \ | ||
53 | $(libdir)/$(SHLPRE)Xpanel$(SHLPST) | ||
54 | ln -f -s $(libdir)/libXCurses.a $(libdir)/libXpanel.a | ||
55 | -$(RANLIB) $(libdir)/libXpanel.a | ||
56 | $(INSTALL) -c -m 755 x11/xcurses-config $(bindir)/xcurses-config | ||
57 | |||
58 | clean :: | ||
59 | rm -f config.log config.cache config.status | ||
60 | |||
61 | distclean :: | ||
62 | rm -f config.log config.cache config.status | ||
63 | rm -f config.h Makefile x11/xcurses-config | ||
64 | |||
65 | manual: | ||
66 | cd doc; $(MAKE) $(MFLAGS) $@ | ||
67 | |||
68 | $(ZIPFILE): | ||
69 | zip -9y $(ZIPFILE) README HISTORY IMPLEMNT *.spec *.mif *.def \ | ||
70 | Makefile.in config.h.in configure configure.ac config.guess \ | ||
71 | config.sub x11/xcurses-config.in install-sh aclocal.m4 curses.h \ | ||
72 | curspriv.h panel.h term.h pdcurses/README \ | ||
73 | pdcurses/*.c demos/README demos/*.c demos/*.h dos/README dos/*.c \ | ||
74 | dos/*.h dos/*.mak dos/*.lrf os2/README os2/*.c os2/*.h os2/*.mak \ | ||
75 | os2/*.lrf sdl1/README sdl1/*.c sdl1/*.h sdl1/Make* \ | ||
76 | win32/README win32/*.c win32/*.h win32/*.mak \ | ||
77 | win32/*.ico win32/*.rc x11/README x11/*.c x11/*.h x11/Makefile.* \ | ||
78 | x11/*.xbm doc/*.txt doc/manext.c doc/Makefile | ||
79 | |||
80 | zip: $(ZIPFILE) | ||
81 | |||
82 | ../$(TARBALL): | ||
83 | (cd ..; tar cvf - $(PDC_DIR)/README $(PDC_DIR)/HISTORY \ | ||
84 | $(PDC_DIR)/IMPLEMNT $(PDC_DIR)/*.spec $(PDC_DIR)/*.mif \ | ||
85 | $(PDC_DIR)/*.def $(PDC_DIR)/Makefile.in $(PDC_DIR)/aclocal.m4 \ | ||
86 | $(PDC_DIR)/config.h.in $(PDC_DIR)/configure \ | ||
87 | $(PDC_DIR)/config.guess $(PDC_DIR)/x11/xcurses-config.in \ | ||
88 | $(PDC_DIR)/config.sub $(PDC_DIR)/configure.ac \ | ||
89 | $(PDC_DIR)/install-sh $(PDC_DIR)/curses.h $(PDC_DIR)/curspriv.h \ | ||
90 | $(PDC_DIR)/panel.h $(PDC_DIR)/term.h \ | ||
91 | $(PDC_DIR)/pdcurses/README $(PDC_DIR)/pdcurses/*.c \ | ||
92 | $(PDC_DIR)/demos/README $(PDC_DIR)/demos/*.c $(PDC_DIR)/demos/*.h \ | ||
93 | $(PDC_DIR)/doc/*.txt $(PDC_DIR)/dos/README $(PDC_DIR)/dos/*.c \ | ||
94 | $(PDC_DIR)/dos/*.h $(PDC_DIR)/dos/*.mak $(PDC_DIR)/dos/*.lrf \ | ||
95 | $(PDC_DIR)/os2/README $(PDC_DIR)/os2/*.c $(PDC_DIR)/os2/*.h \ | ||
96 | $(PDC_DIR)/os2/*.mak $(PDC_DIR)/os2/*.lrf \ | ||
97 | $(PDC_DIR)/sdl1/README $(PDC_DIR)/sdl1/*.c $(PDC_DIR)/sdl1/*.h \ | ||
98 | $(PDC_DIR)/sdl1/Make* $(PDC_DIR)/win32/README $(PDC_DIR)/win32/*.c \ | ||
99 | $(PDC_DIR)/win32/*.h $(PDC_DIR)/win32/*.mak \ | ||
100 | $(PDC_DIR)/win32/*.ico $(PDC_DIR)/win32/*.rc $(PDC_DIR)/x11/README \ | ||
101 | $(PDC_DIR)/x11/*.c $(PDC_DIR)/x11/*.xbm $(PDC_DIR)/x11/*.h \ | ||
102 | $(PDC_DIR)/x11/Makefile.* $(PDC_DIR)/doc/manext.c \ | ||
103 | $(PDC_DIR)/doc/Makefile | gzip -9 > $(TARBALL)) | ||
104 | |||
105 | dist: ../$(TARBALL) | ||
106 | |||
107 | rpm: ../$(TARBALL) | ||
108 | rpmbuild -ba $(srcdir)/PDCurses.spec |
File PDCurses.spec added (mode: 100644) (index 00000000..814e313f) | |||
1 | # $Id: PDCurses.spec,v 1.18 2008/07/21 12:25:20 wmcbrine Exp $ | ||
2 | |||
3 | %define ver 34 | ||
4 | %define verdot 3.4 | ||
5 | %define base /usr | ||
6 | |||
7 | Summary: Public Domain Curses for X11 | ||
8 | Name: PDCurses | ||
9 | Version: %verdot | ||
10 | Release: 1 | ||
11 | Copyright: Public Domain | ||
12 | Group: Development/Libraries | ||
13 | Source: %{name}-%{version}.tar.gz | ||
14 | URL: http://pdcurses.sourceforge.net | ||
15 | BuildRoot: %{_tmppath}/%{name}-%{version}-root | ||
16 | Prefix: %base | ||
17 | |||
18 | %description | ||
19 | PDCurses for X11 is an implementation of the curses library that lets | ||
20 | you build text-mode curses programs as native X11 applications. For more | ||
21 | information, visit http://pdcurses.sourceforge.net/ | ||
22 | |||
23 | %prep | ||
24 | %setup -q | ||
25 | |||
26 | %build | ||
27 | ./configure --prefix=%{base} | ||
28 | make | ||
29 | |||
30 | %install | ||
31 | make DESTDIR=$RPM_BUILD_ROOT install | ||
32 | |||
33 | %clean | ||
34 | rm -rf $RPM_BUILD_ROOT | ||
35 | rm -rf $RPM_BUILD_DIR/%{name}-%{version} | ||
36 | |||
37 | %post -p /sbin/ldconfig | ||
38 | |||
39 | %postun -p /sbin/ldconfig | ||
40 | |||
41 | %files | ||
42 | %defattr(-,root,root) | ||
43 | %doc README HISTORY | ||
44 | %{base}/bin/xcurses-config | ||
45 | %{base}/lib/libXCurses.a | ||
46 | %{base}/lib/libXpanel.a | ||
47 | %{base}/lib/libXCurses.so | ||
48 | %{base}/include/xcurses.h | ||
49 | %{base}/include/xpanel.h | ||
50 | %{base}/include/xcurses/curses.h | ||
51 | %{base}/include/xcurses/panel.h | ||
52 | %{base}/include/xcurses/term.h |
File README added (mode: 100644) (index 00000000..dc476a9f) | |||
1 | Welcome to PDCurses! | ||
2 | ==================== | ||
3 | |||
4 | Public Domain Curses, aka PDCurses, is an implementation of X/Open | ||
5 | curses for multiple platforms. The latest version can be found at: | ||
6 | |||
7 | http://pdcurses.sourceforge.net/ | ||
8 | |||
9 | For changes, see the HISTORY file. | ||
10 | |||
11 | |||
12 | Legal Stuff | ||
13 | ----------- | ||
14 | |||
15 | The core package is in the public domain, but small portions of PDCurses | ||
16 | are subject to copyright under various licenses. Each directory | ||
17 | contains a README file, with a section titled "Distribution Status" | ||
18 | which describes the status of the files in that directory. | ||
19 | |||
20 | If you use PDCurses in an application, an acknowledgement would be | ||
21 | appreciated, but is not mandatory. If you make corrections or | ||
22 | enhancements to PDCurses, please forward them to the current maintainer | ||
23 | for the benefit of other users. | ||
24 | |||
25 | This software is provided AS IS with NO WARRANTY whatsoever. | ||
26 | |||
27 | |||
28 | Ports | ||
29 | ----- | ||
30 | |||
31 | PDCurses has been ported to DOS, OS/2, Win32, X11 and SDL. A directory | ||
32 | containing the port-specific source files exists for each of these | ||
33 | platforms. Build instructions are in the README file for each platform. | ||
34 | |||
35 | |||
36 | Distribution Status | ||
37 | ------------------- | ||
38 | |||
39 | All files in this directory except configure, config.guess and | ||
40 | config.sub are released to the Public Domain. config.guess and | ||
41 | config.sub are under the GPL; configure is under a free license | ||
42 | described within it. | ||
43 | |||
44 | |||
45 | Maintainer | ||
46 | ---------- | ||
47 | |||
48 | William McBrine <wmcbrine@users.sf.net> |
File aclocal.m4 added (mode: 100644) (index 00000000..ad7c3f3a) | |||
1 | dnl --------------------------------------------------------------------------- | ||
2 | dnl This file offers the following macros... | ||
3 | dnl --------------------------------------------------------------------------- | ||
4 | dnl MH_IPC | ||
5 | dnl MH_CHECK_X_INC | ||
6 | dnl MH_CHECK_X_LIB | ||
7 | dnl MH_CHECK_X_HEADERS | ||
8 | dnl MH_CHECK_X_KEYDEFS | ||
9 | dnl MH_CHECK_X_TYPEDEF | ||
10 | dnl MH_CHECK_LIB | ||
11 | dnl MH_SHARED_LIBRARY | ||
12 | dnl MH_HOWTO_DYN_LINK | ||
13 | dnl MH_CHECK_CC_O | ||
14 | dnl MH_SHLPST | ||
15 | dnl MH_CHECK_MAX_SIGNALS | ||
16 | |||
17 | dnl --------------------------------------------------------------------------- | ||
18 | dnl Determine if the system has System V IPC. ie sys/ipc.h and sys/shm.h | ||
19 | dnl headers. | ||
20 | dnl --------------------------------------------------------------------------- | ||
21 | AC_DEFUN([MH_IPC], | ||
22 | [ | ||
23 | AC_CHECK_HEADER(sys/ipc.h) | ||
24 | if test $ac_cv_header_sys_ipc_h = no; then | ||
25 | AC_MSG_ERROR(Cannot find required header file sys/ipc.h; PDCurses cannot be configured) | ||
26 | fi | ||
27 | ])dnl | ||
28 | |||
29 | dnl --------------------------------------------------------------------------- | ||
30 | dnl Set up the correct X header file location | ||
31 | dnl --------------------------------------------------------------------------- | ||
32 | AC_DEFUN([MH_CHECK_X_INC], | ||
33 | [ | ||
34 | mh_x11_dir="" | ||
35 | mh_x11_xaw_dir="" | ||
36 | |||
37 | mh_inc_dirs="$ac_x_header_dirs" | ||
38 | |||
39 | dnl Provide for user supplying directory | ||
40 | |||
41 | if test "x$x_includes" != xNONE ; then | ||
42 | mh_inc_dirs="$x_includes $mh_inc_dirs" | ||
43 | fi | ||
44 | |||
45 | dnl Try to determine the directory containing X headers | ||
46 | dnl We will append X11 to all the paths above as an extra check | ||
47 | |||
48 | for ac_dir in $mh_inc_dirs ; do | ||
49 | if test -r $ac_dir/Intrinsic.h; then | ||
50 | mh_x11_dir=$ac_dir | ||
51 | break | ||
52 | fi | ||
53 | if test -r $ac_dir/X11/Intrinsic.h; then | ||
54 | mh_x11_dir="$ac_dir/X11" | ||
55 | break | ||
56 | fi | ||
57 | done | ||
58 | |||
59 | dnl Try to determine the directory containing Xaw headers | ||
60 | dnl We will append X11 to all the paths above as an extra check | ||
61 | |||
62 | if test "$with_xaw3d" = yes; then | ||
63 | mh_xaw_dir="Xaw3d" | ||
64 | else | ||
65 | if test "$with_nextaw" = yes; then | ||
66 | mh_xaw_dir="neXtaw" | ||
67 | else | ||
68 | mh_xaw_dir="Xaw" | ||
69 | fi | ||
70 | fi | ||
71 | for ac_dir in $mh_inc_dirs ; do | ||
72 | if test -r $ac_dir/$mh_xaw_dir/Box.h; then | ||
73 | mh_x11_xaw_dir=$ac_dir | ||
74 | break | ||
75 | fi | ||
76 | if test -r $ac_dir/X11/$mh_xaw_dir/Box.h; then | ||
77 | mh_x11_xaw_dir="$ac_dir/X11" | ||
78 | break | ||
79 | fi | ||
80 | done | ||
81 | |||
82 | if test "x$mh_x11_dir" != "x" ; then | ||
83 | mh_x11_dir_no_x11=`echo $mh_x11_dir | sed 's/\/X11$//'` | ||
84 | |||
85 | if test "$mh_x11_dir_no_x11" != "$mh_x11_dir" ; then | ||
86 | MH_XINC_DIR="-I$mh_x11_dir -I$mh_x11_dir_no_x11" | ||
87 | else | ||
88 | MH_XINC_DIR="-I$mh_x11_dir" | ||
89 | fi | ||
90 | else | ||
91 | AC_MSG_ERROR(Cannot find required header file Intrinsic.h; PDCurses cannot be configured) | ||
92 | fi | ||
93 | |||
94 | if test "x$mh_x11_xaw_dir" != "x"; then | ||
95 | if test "$mh_x11_xaw_dir" != "$mh_x11_dir" ; then | ||
96 | MH_XINC_DIR="-I$mh_x11_xaw_dir $MH_XINC_DIR" | ||
97 | fi | ||
98 | else | ||
99 | AC_MSG_ERROR(Cannot find required Xaw header file Box.h; PDCurses cannot be configured) | ||
100 | fi | ||
101 | |||
102 | AC_SUBST(MH_XINC_DIR) | ||
103 | |||
104 | ])dnl | ||
105 | |||
106 | dnl --------------------------------------------------------------------------- | ||
107 | dnl Set up the correct X library file location | ||
108 | dnl --------------------------------------------------------------------------- | ||
109 | AC_DEFUN([MH_CHECK_X_LIB], | ||
110 | [ | ||
111 | dnl Some systems require extra libraries... | ||
112 | |||
113 | mh_solaris_flag=no | ||
114 | mh_hpux9_flag=no | ||
115 | AC_REQUIRE([AC_CANONICAL_SYSTEM]) | ||
116 | case "$target" in | ||
117 | *solaris*) | ||
118 | mh_solaris_flag=yes | ||
119 | ;; | ||
120 | *pc-sco*) | ||
121 | extra_x_libs="Xext" | ||
122 | ;; | ||
123 | sparc*sunos*) | ||
124 | extra_x_libs="Xext" | ||
125 | if test "$ac_cv_prog_CC" = "gcc" ; then | ||
126 | extra_ld_flags="-Wl,-Bstatic" | ||
127 | extra_ld_flags2="-Wl,-Bdynamic" | ||
128 | else | ||
129 | extra_ld_flags="-Bstatic" | ||
130 | extra_ld_flags2="-Bdynamic" | ||
131 | fi | ||
132 | ;; | ||
133 | *hpux9*) | ||
134 | mh_hpux9_flag=yes | ||
135 | ;; | ||
136 | esac | ||
137 | |||
138 | if test "$with_xaw3d" = yes; then | ||
139 | MH_X11_LIBS="Xaw3d Xmu Xt X11" | ||
140 | else | ||
141 | if test "$with_nextaw" = yes; then | ||
142 | MH_X11_LIBS="neXtaw Xmu Xt X11" | ||
143 | else | ||
144 | MH_X11_LIBS="Xaw Xmu Xt X11" | ||
145 | fi | ||
146 | fi | ||
147 | MH_X11R6_LIBS="SM ICE Xext" | ||
148 | mh_x11r6=no | ||
149 | |||
150 | mh_lib_dirs="$x_libraries `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`" | ||
151 | |||
152 | dnl try to find libSM.[a,sl,so,dylib]. If we find it we are using X11R6 | ||
153 | for ac_dir in $mh_lib_dirs ; do | ||
154 | for mh_xsm in libSM.a libSM.so libSM.sl libSM.dylib; do | ||
155 | if test -r $ac_dir/$mh_xsm; then | ||
156 | mh_x11r6=yes | ||
157 | break 2 | ||
158 | fi | ||
159 | done | ||
160 | done | ||
161 | |||
162 | if test "$mh_x11r6" = yes ; then | ||
163 | mh_libs="$MH_X11_LIBS $MH_X11R6_LIBS" | ||
164 | else | ||
165 | mh_libs="$MH_X11_LIBS $extra_x_libs" | ||
166 | fi | ||
167 | |||
168 | |||
169 | dnl Ensure that all required X libraries are found | ||
170 | |||
171 | mh_prev_dir="" | ||
172 | mh_where_found="" | ||
173 | mh_where_found_dirs="" | ||
174 | mh_solaris_path="" | ||
175 | for mh_lib in $mh_libs; do | ||
176 | mh_lib_found=no | ||
177 | for ac_dir in $mh_lib_dirs ; do | ||
178 | for mh_ext in a so sl dll.a dylib; do | ||
179 | if test -r $ac_dir/lib$mh_lib.$mh_ext; then | ||
180 | if test "x$mh_prev_dir" != "x$ac_dir" ; then | ||
181 | if test "x$mh_prev_dir" = "x" ; then | ||
182 | mh_where_found="$mh_where_found found in $ac_dir" | ||
183 | else | ||
184 | mh_where_found="$mh_where_found and in $ac_dir" | ||
185 | fi | ||
186 | mh_prev_dir=$ac_dir | ||
187 | mh_where_found_dirs="$mh_where_found_dirs $ac_dir" | ||
188 | MH_XLIBS="$MH_XLIBS -L$ac_dir" | ||
189 | mh_solaris_path="${mh_solaris_path}:$ac_dir" | ||
190 | fi | ||
191 | MH_XLIBS="$MH_XLIBS -l$mh_lib" | ||
192 | mh_lib_found=yes | ||
193 | break 2 | ||
194 | fi | ||
195 | done | ||
196 | done | ||
197 | if test "$mh_lib_found" = no; then | ||
198 | AC_MSG_ERROR(Cannot find required X library; lib$mh_lib. PDCurses cannot be configured) | ||
199 | fi | ||
200 | done | ||
201 | |||
202 | mh_solaris_path=`echo $mh_solaris_path | sed 's/^://'` | ||
203 | if test "$mh_solaris_flag" = yes ; then | ||
204 | MH_XLIBS="-R$mh_solaris_path $extra_ld_flags $MH_XLIBS $extra_libs $extra_ld_flags2" | ||
205 | else | ||
206 | MH_XLIBS="$extra_ld_flags $MH_XLIBS $extra_libs $extra_ld_flags2" | ||
207 | fi | ||
208 | if test "$mh_hpux9_flag" = yes ; then | ||
209 | grep -q XtSetLanguageProc $mh_x11_dir/Intrinsic.h | ||
210 | if test $? -eq 0 ; then | ||
211 | mh_found_xtshellstrings=no | ||
212 | for mh_acdir in $mh_where_found_dirs ; do | ||
213 | for mh_xaw in `ls $mh_acdir/libXaw.*` ; do | ||
214 | nm $mh_xaw | grep XtShellStrings | grep -qv extern | ||
215 | if test $? -eq 0 ; then | ||
216 | mh_found_xtshellstrings=yes | ||
217 | fi | ||
218 | done | ||
219 | done | ||
220 | if test "$mh_found_xtshellstrings" = no ; then | ||
221 | AC_MSG_WARN(The X11 development environment has not been installed correctly.) | ||
222 | AC_MSG_WARN(The header file; Intrinsic.h, is for X11R5 while the Athena Widget) | ||
223 | AC_MSG_WARN(Set library; libXaw is for X11R4. This is a common problem with) | ||
224 | AC_MSG_WARN(HP-UX 9.x.) | ||
225 | AC_MSG_ERROR(X11 installation incomplete; cannot continue) | ||
226 | fi | ||
227 | fi | ||
228 | fi | ||
229 | |||
230 | AC_SUBST(MH_XLIBS) | ||
231 | |||
232 | ])dnl | ||
233 | |||
234 | dnl --------------------------------------------------------------------------- | ||
235 | dnl Determine if the supplied X headers exist. | ||
236 | dnl --------------------------------------------------------------------------- | ||
237 | AC_DEFUN([MH_CHECK_X_HEADERS], | ||
238 | [ | ||
239 | save_CPPFLAGS="$CPPFLAGS" | ||
240 | CPPFLAGS="$CPPFLAGS $MH_XINC_DIR" | ||
241 | for mh_header in $1; do | ||
242 | AC_CHECK_HEADERS($mh_header) | ||
243 | done | ||
244 | CPPFLAGS="$save_CPPFLAGS" | ||
245 | ])dnl | ||
246 | |||
247 | dnl --------------------------------------------------------------------------- | ||
248 | dnl Determine if various key definitions exist in keysym.h | ||
249 | dnl --------------------------------------------------------------------------- | ||
250 | AC_DEFUN([MH_CHECK_X_KEYDEFS], | ||
251 | [ | ||
252 | save_CPPFLAGS="$CPPFLAGS" | ||
253 | CPPFLAGS="$CPPFLAGS $MH_XINC_DIR" | ||
254 | for mh_keydef in $1; do | ||
255 | AC_MSG_CHECKING(for $mh_keydef in keysym.h) | ||
256 | mh_upper_name="HAVE_`echo $mh_keydef | tr '[a-z]' '[A-Z]'`" | ||
257 | AC_TRY_COMPILE([#include <keysym.h>], | ||
258 | [int i = $mh_keydef;], | ||
259 | mh_have_key=yes; AC_DEFINE_UNQUOTED($mh_upper_name,1), mh_have_key=no ) | ||
260 | AC_MSG_RESULT($mh_have_key) | ||
261 | done | ||
262 | CPPFLAGS="$save_CPPFLAGS" | ||
263 | ])dnl | ||
264 | |||
265 | dnl --------------------------------------------------------------------------- | ||
266 | dnl Determine if supplied types have been typedefed | ||
267 | dnl --------------------------------------------------------------------------- | ||
268 | AC_DEFUN([MH_CHECK_X_TYPEDEF], | ||
269 | [ | ||
270 | save_CPPFLAGS="$CPPFLAGS" | ||
271 | CPPFLAGS="$CPPFLAGS $SYS_DEFS $MH_XINC_DIR" | ||
272 | for td in $1 ; do | ||
273 | AC_MSG_CHECKING(if $td is typedefed:) | ||
274 | AC_TRY_COMPILE( | ||
275 | [#include "X11/Xlib.h"], | ||
276 | [$td fred], | ||
277 | [mh_td=yes], | ||
278 | [mh_td=no] | ||
279 | ) | ||
280 | if test "$mh_td" = yes ; then | ||
281 | TD_upper=`echo $td | tr a-z A-Z` | ||
282 | AC_DEFINE_UNQUOTED(${TD_upper}_TYPEDEFED, 1) | ||
283 | fi | ||
284 | AC_MSG_RESULT($mh_td) | ||
285 | done | ||
286 | CPPFLAGS="$save_CPPFLAGS" | ||
287 | ])dnl | ||
288 | |||
289 | dnl --------------------------------------------------------------------------- | ||
290 | dnl Check for presence of various libraries | ||
291 | dnl --------------------------------------------------------------------------- | ||
292 | AC_DEFUN([MH_CHECK_LIB], | ||
293 | [ | ||
294 | MH_EXTRA_LIBS='' | ||
295 | for mh_lib in $1; do | ||
296 | if test "$on_qnx" = yes; then | ||
297 | AC_MSG_CHECKING(for library -l${mh_lib}) | ||
298 | if test -r /usr/lib/${mh_lib}3r.lib; then | ||
299 | AC_MSG_RESULT(found) | ||
300 | MH_EXTRA_LIBS="${MH_EXTRA_LIBS} -l${mh_lib}" | ||
301 | else | ||
302 | AC_MSG_RESULT(not found) | ||
303 | fi | ||
304 | else | ||
305 | AC_CHECK_LIB($mh_lib,main,mh_lib_found=yes,mh_lib_found=no) | ||
306 | if test "$mh_lib_found" = yes; then | ||
307 | MH_EXTRA_LIBS="${MH_EXTRA_LIBS} -l${mh_lib}" | ||
308 | fi | ||
309 | fi | ||
310 | done | ||
311 | ])dnl | ||
312 | |||
313 | dnl --------------------------------------------------------------------------- | ||
314 | dnl Work out how to create a dynamically loaded module | ||
315 | dnl --------------------------------------------------------------------------- | ||
316 | AC_DEFUN([MH_HOWTO_DYN_LINK], | ||
317 | [ | ||
318 | mh_compile='${CC-cc} -c $DYN_COMP conftest.$ac_ext 1>&AC_FD_CC' | ||
319 | cat > conftest.$ac_ext <<EOF | ||
320 | dnl [#]line __oline__ "[$]0" | ||
321 | [#]line __oline__ "configure" | ||
322 | int foo() | ||
323 | { | ||
324 | return(0); | ||
325 | } | ||
326 | EOF | ||
327 | if AC_TRY_EVAL(mh_compile) && test -s conftest.o; then | ||
328 | mh_dyn_link='ld -shared -o conftest.rxlib conftest.o -lc 1>&AC_FD_CC' | ||
329 | # mh_dyn_link='${CC} -Wl,-shared -o conftest.rxlib conftest.o -lc 1>&AC_FD_CC' | ||
330 | if AC_TRY_EVAL(mh_dyn_link) && test -s conftest.rxlib; then | ||
331 | LD_RXLIB1="ld -shared" | ||
332 | # LD_RXLIB1="${CC} -Wl,-shared" | ||
333 | SHLPRE="lib" | ||
334 | SHLPST=".so" | ||
335 | else | ||
336 | mh_dyn_link='ld -G -o conftest.rxlib conftest.o 1>&AC_FD_CC' | ||
337 | # mh_dyn_link='${CC} -Wl,-G -o conftest.rxlib conftest.o 1>&AC_FD_CC' | ||
338 | if AC_TRY_EVAL(mh_dyn_link) && test -s conftest.rxlib; then | ||
339 | LD_RXLIB1="ld -G" | ||
340 | # LD_RXLIB1="${CC} -Wl,-G" | ||
341 | SHLPRE="lib" | ||
342 | SHLPST=".so" | ||
343 | else | ||
344 | LD_RXLIB1="" | ||
345 | SHLPRE="" | ||
346 | SHLPST="" | ||
347 | fi | ||
348 | fi | ||
349 | fi | ||
350 | rm -f conftest* | ||
351 | ])dnl | ||
352 | |||
353 | dnl --------------------------------------------------------------------------- | ||
354 | dnl Determine how to build shared libraries etc.. | ||
355 | dnl --------------------------------------------------------------------------- | ||
356 | AC_DEFUN([MH_SHARED_LIBRARY], | ||
357 | [ | ||
358 | AC_REQUIRE([MH_SHLPST]) | ||
359 | dnl | ||
360 | dnl If compiler is gcc, then flags should be the same for all platforms | ||
361 | dnl (just guessing on this) | ||
362 | dnl | ||
363 | AIX_DYN="no" | ||
364 | BEOS_DYN="no" | ||
365 | SHLFILE="$1" | ||
366 | SHLFILES="$*" | ||
367 | RXPACKEXPORTS="" | ||
368 | SHLPRE="lib" | ||
369 | LD_RXLIB1="" | ||
370 | |||
371 | AC_REQUIRE([AC_CANONICAL_SYSTEM]) | ||
372 | case "$target" in | ||
373 | *hp-hpux*) | ||
374 | SYS_DEFS="-D_HPUX_SOURCE" | ||
375 | LD_RXLIB1="ld -b -q -n" | ||
376 | ;; | ||
377 | *ibm-aix*) | ||
378 | SYS_DEFS="-D_ALL_SOURCE -DAIX" | ||
379 | AIX_DYN="yes" | ||
380 | DYN_COMP="-DDYNAMIC" | ||
381 | LD_RXLIB1="ld -bnoentry -bM:SRE" | ||
382 | RXPACKEXPORTS="-bE:$SHLFILE.exp" | ||
383 | RXPACKEXP="$SHLFILE.exp" | ||
384 | ;; | ||
385 | *dec-osf*) | ||
386 | if test "$ac_cv_prog_CC" = "gcc"; then | ||
387 | SYS_DEFS="-D_POSIX_SOURCE -D_XOPEN_SOURCE" | ||
388 | else | ||
389 | SYS_DEFS="-D_POSIX_SOURCE -D_XOPEN_SOURCE -Olimit 800" | ||
390 | fi | ||
391 | LD_RXLIB1="ld -shared" | ||
392 | ;; | ||
393 | *sequent-dynix*|*esix*|*dgux*) | ||
394 | LD_RXLIB1="ld -G" | ||
395 | ;; | ||
396 | *solaris*) | ||
397 | if test "$ac_cv_prog_CC" = "gcc"; then | ||
398 | LD_RXLIB1="gcc -shared" | ||
399 | else | ||
400 | LD_RXLIB1="ld -G" | ||
401 | fi | ||
402 | ;; | ||
403 | sparc*sunos*) | ||
404 | SYS_DEFS="-DSUNOS -DSUNOS_STRTOD_BUG" | ||
405 | LD_RXLIB1="ld" | ||
406 | ;; | ||
407 | *linux*|*atheos*|*nto-qnx*) | ||
408 | LD_RXLIB1="${CC} -shared" | ||
409 | ;; | ||
410 | *freebsd*) | ||
411 | LD_RXLIB1="ld -Bdynamic -Bshareable" | ||
412 | ;; | ||
413 | *pc-sco*) | ||
414 | LD_RXLIB1="ld -dy -G" | ||
415 | ;; | ||
416 | *beos*) | ||
417 | LD_RXLIB1="${CC} -Wl,-shared -nostart -Xlinker -soname=\$(@)" | ||
418 | BEOS_DYN="yes" | ||
419 | ;; | ||
420 | *qnx*) | ||
421 | SHLPRE="" | ||
422 | DYN_COMP="-Q" # force no check for dynamic loading | ||
423 | SHLFILE="" | ||
424 | ;; | ||
425 | *cygwin) | ||
426 | SHLPRE="" | ||
427 | DYN_COMP="-DDYNAMIC" | ||
428 | LD_RXLIB1="dllwrap --def \$(srcdir)/../win32/pdcurses.def --target i386-cygwin32 --dllname \$(@)" | ||
429 | # cygwininstall target MUST install the shared library itself because | ||
430 | # it puts it into $(bindir) not $(libdir) as all other platforms | ||
431 | ;; | ||
432 | *darwin*) | ||
433 | DYN_COMP="-fno-common" | ||
434 | LD_RXLIB1="${CC} -flat_namespace -undefined suppress -dynamiclib -install_name=\$(@)" | ||
435 | ;; | ||
436 | *) | ||
437 | ;; | ||
438 | esac | ||
439 | |||
440 | dnl determine what switches our compiler uses for building objects | ||
441 | dnl suitable for inclusion in shared libraries | ||
442 | dnl Only call this if DYN_COMP is not set. If we have set DYN_COMP | ||
443 | dnl above, then we know how to compile AND link for dynamic libraries | ||
444 | |||
445 | if test "$DYN_COMP" = ""; then | ||
446 | AC_MSG_CHECKING(compiler flags for a dynamic object) | ||
447 | |||
448 | cat > conftest.$ac_ext <<EOF | ||
449 | dnl [#]line __oline__ "[$]0" | ||
450 | [#]line __oline__ "configure" | ||
451 | int a=0 | ||
452 | EOF | ||
453 | |||
454 | DYN_COMP="" | ||
455 | mh_cv_stop=no | ||
456 | save_cflags="$CFLAGS" | ||
457 | mh_cv_flags="-fPIC -KPIC +Z" | ||
458 | for a in $mh_cv_flags; do | ||
459 | CFLAGS="-c $a" | ||
460 | |||
461 | mh_compile='${CC-cc} -c $CFLAGS conftest.$ac_ext > conftest.tmp 2>&1' | ||
462 | if AC_TRY_EVAL(mh_compile); then | ||
463 | DYN_COMP="" | ||
464 | else | ||
465 | slash="\\" | ||
466 | mh_dyncomp="`egrep -c $slash$a conftest.tmp`" | ||
467 | if test "$mh_dyncomp" = "0"; then | ||
468 | DYN_COMP="$a -DDYNAMIC" | ||
469 | AC_MSG_RESULT($a) | ||
470 | break | ||
471 | else | ||
472 | DYN_COMP="" | ||
473 | fi | ||
474 | fi | ||
475 | done | ||
476 | if test "$DYN_COMP" = ""; then | ||
477 | AC_MSG_RESULT(none of $mh_cv_flags supported) | ||
478 | fi | ||
479 | if test "$LD_RXLIB1" = ""; then | ||
480 | MH_HOWTO_DYN_LINK() | ||
481 | fi | ||
482 | CFLAGS=$save_cflags | ||
483 | rm -f conftest.* | ||
484 | fi | ||
485 | |||
486 | |||
487 | SHL_TARGETS="" | ||
488 | |||
489 | if test "$AIX_DYN" = "yes"; then | ||
490 | aix_exports="config.exports.aix" | ||
491 | echo "" > $aix_exports | ||
492 | fi | ||
493 | |||
494 | if test "$ac_cv_header_dl_h" = "yes" -o "$ac_cv_header_dlfcn_h" = "yes" -o "$AIX_DYN" = "yes" -o "$BEOS_DYN" = "yes" -o "$DLFCNINCDIR" != "" -o "$DLFCNLIBDIR" != ""; then | ||
495 | EXPS="1,2,3,4,5,6,7,8,9" | ||
496 | for a in $SHLFILES | ||
497 | do | ||
498 | SHL_TARGETS="${SHL_TARGETS} ${SHLPRE}${a}${SHLPST}" | ||
499 | this=`echo $EXPS | cut -d, -f1` | ||
500 | EXPS=`echo $EXPS | cut -d, -f2-` | ||
501 | if test "$AIX_DYN" = "yes"; then | ||
502 | echo "RXPACKEXP$this=$a.exp" >> $aix_exports | ||
503 | echo "RXPACKEXPORTS$this=-bE:$a.exp" >> $aix_exports | ||
504 | fi | ||
505 | done | ||
506 | fi | ||
507 | |||
508 | AC_SUBST(DYN_COMP) | ||
509 | AC_SUBST(LIBS) | ||
510 | AC_SUBST(LD_RXLIB1) | ||
511 | AC_SUBST(SHLPRE) | ||
512 | AC_SUBST(SHLPST) | ||
513 | AC_SUBST(SHL_TARGETS) | ||
514 | AC_SUBST(O2SAVE) | ||
515 | AC_SUBST(CC2O) | ||
516 | AC_SUBST(SAVE2O) | ||
517 | AC_SUBST(RXPACKEXPORTS) | ||
518 | ])dnl | ||
519 | |||
520 | dnl --------------------------------------------------------------------------- | ||
521 | dnl Check if C compiler supports -c -o file.ooo | ||
522 | dnl --------------------------------------------------------------------------- | ||
523 | AC_DEFUN([MH_CHECK_CC_O], | ||
524 | [ | ||
525 | AC_MSG_CHECKING(whether $CC understand -c and -o together) | ||
526 | set dummy $CC; ac_cc="`echo [$]2 | | ||
527 | changequote(, )dnl | ||
528 | sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`" | ||
529 | changequote([, ])dnl | ||
530 | AC_CACHE_VAL(ac_cv_prog_cc_${ac_cc}_c_o, | ||
531 | [echo 'foo(){}' > conftest.c | ||
532 | # We do the test twice because some compilers refuse to overwrite an | ||
533 | # existing .o file with -o, though they will create one. | ||
534 | eval ac_cv_prog_cc_${ac_cc}_c_o=no | ||
535 | ac_try='${CC-cc} -c conftest.c -o conftest.ooo 1>&AC_FD_CC' | ||
536 | if AC_TRY_EVAL(ac_try) && test -f conftest.ooo && AC_TRY_EVAL(ac_try); | ||
537 | then | ||
538 | ac_try='${CC-cc} -c conftest.c -o conftest.ooo 1>&AC_FD_CC' | ||
539 | if AC_TRY_EVAL(ac_try) && test -f conftest.ooo && AC_TRY_EVAL(ac_try); | ||
540 | then | ||
541 | eval ac_cv_prog_cc_${ac_cc}_c_o=yes | ||
542 | fi | ||
543 | fi | ||
544 | rm -f conftest* | ||
545 | ])dnl | ||
546 | if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then | ||
547 | O2SAVE="" | ||
548 | SAVE2O="" | ||
549 | CC2O="-o $"'@' | ||
550 | AC_MSG_RESULT(yes) | ||
551 | else | ||
552 | O2SAVE="-mv \`basename "$'@'" .sho\`.o \`basename "$'@'" .sho\`.o.save;" | ||
553 | SAVE2O="-mv \`basename "$'@'" .sho\`.o "$'@'"; mv \`basename "$'@'" .sho\`.o.save \`basename "$'@'" .sho\`.o" | ||
554 | CC2O="" | ||
555 | AC_MSG_RESULT(no) | ||
556 | fi | ||
557 | ]) | ||
558 | |||
559 | dnl --------------------------------------------------------------------------- | ||
560 | dnl Determines the file extension for shared libraries | ||
561 | dnl --------------------------------------------------------------------------- | ||
562 | AC_DEFUN([MH_SHLPST], | ||
563 | [ | ||
564 | AC_MSG_CHECKING(shared library extension) | ||
565 | SHLPST=".so" | ||
566 | AC_REQUIRE([AC_CANONICAL_SYSTEM]) | ||
567 | case "$target" in | ||
568 | *hp-hpux*) | ||
569 | SHLPST=".sl" | ||
570 | ;; | ||
571 | *ibm-aix*) | ||
572 | SHLPST=".a" | ||
573 | ;; | ||
574 | *qnx*) | ||
575 | SHLPST="" | ||
576 | ;; | ||
577 | *cygwin*) | ||
578 | SHLPST=".dll" | ||
579 | ;; | ||
580 | *darwin*) | ||
581 | SHLPST=".dylib" | ||
582 | ;; | ||
583 | esac | ||
584 | AC_SUBST(SHLPST) | ||
585 | AC_MSG_RESULT($SHLPST) | ||
586 | ]) | ||
587 | |||
588 | dnl --------------------------------------------------------------------------- | ||
589 | dnl Determine the system limit for number of signals | ||
590 | dnl --------------------------------------------------------------------------- | ||
591 | AC_DEFUN([MH_CHECK_MAX_SIGNALS], | ||
592 | [ | ||
593 | save_CPPFLAGS="$CPPFLAGS" | ||
594 | CPPFLAGS="$CPPFLAGS $SYS_DEFS" | ||
595 | AC_MSG_CHECKING(for maximum signal specifier:) | ||
596 | AC_CACHE_VAL(mh_cv_max_signals, | ||
597 | mh_found="no" | ||
598 | for mh_sigs in $1; do | ||
599 | AC_TRY_COMPILE([#include <signal.h>], | ||
600 | [return $mh_sigs;], | ||
601 | mh_found="yes"; mh_cv_max_signals="$mh_sigs" ) | ||
602 | if test "$mh_found" = "yes"; then | ||
603 | break; | ||
604 | fi | ||
605 | done) | ||
606 | CPPFLAGS="$save_CPPFLAGS" | ||
607 | if test "$mh_found" = "no"; then | ||
608 | AC_MSG_ERROR(Cannot find a system limit for number of signals. PDCurses cannot be configured on this machine.) | ||
609 | else | ||
610 | AC_DEFINE_UNQUOTED(PDC_MAX_SIGNALS,$mh_cv_max_signals) | ||
611 | AC_MSG_RESULT($mh_cv_max_signals) | ||
612 | fi | ||
613 | ])dnl |
File config.guess added (mode: 100755) (index 00000000..396482d6) | |||
1 | #! /bin/sh | ||
2 | # Attempt to guess a canonical system name. | ||
3 | # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | ||
4 | # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, | ||
5 | # Inc. | ||
6 | |||
7 | timestamp='2006-07-02' | ||
8 | |||
9 | # This file is free software; you can redistribute it and/or modify it | ||
10 | # under the terms of the GNU General Public License as published by | ||
11 | # the Free Software Foundation; either version 2 of the License, or | ||
12 | # (at your option) any later version. | ||
13 | # | ||
14 | # This program is distributed in the hope that it will be useful, but | ||
15 | # WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | # General Public License for more details. | ||
18 | # | ||
19 | # You should have received a copy of the GNU General Public License | ||
20 | # along with this program; if not, write to the Free Software | ||
21 | # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | ||
22 | # 02110-1301, USA. | ||
23 | # | ||
24 | # As a special exception to the GNU General Public License, if you | ||
25 | # distribute this file as part of a program that contains a | ||
26 | # configuration script generated by Autoconf, you may include it under | ||
27 | # the same distribution terms that you use for the rest of that program. | ||
28 | |||
29 | |||
30 | # Originally written by Per Bothner <per@bothner.com>. | ||
31 | # Please send patches to <config-patches@gnu.org>. Submit a context | ||
32 | # diff and a properly formatted ChangeLog entry. | ||
33 | # | ||
34 | # This script attempts to guess a canonical system name similar to | ||
35 | # config.sub. If it succeeds, it prints the system name on stdout, and | ||
36 | # exits with 0. Otherwise, it exits with 1. | ||
37 | # | ||
38 | # The plan is that this can be called by configure scripts if you | ||
39 | # don't specify an explicit build system type. | ||
40 | |||
41 | me=`echo "$0" | sed -e 's,.*/,,'` | ||
42 | |||
43 | usage="\ | ||
44 | Usage: $0 [OPTION] | ||
45 | |||
46 | Output the configuration name of the system \`$me' is run on. | ||
47 | |||
48 | Operation modes: | ||
49 | -h, --help print this help, then exit | ||
50 | -t, --time-stamp print date of last modification, then exit | ||
51 | -v, --version print version number, then exit | ||
52 | |||
53 | Report bugs and patches to <config-patches@gnu.org>." | ||
54 | |||
55 | version="\ | ||
56 | GNU config.guess ($timestamp) | ||
57 | |||
58 | Originally written by Per Bothner. | ||
59 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
60 | Free Software Foundation, Inc. | ||
61 | |||
62 | This is free software; see the source for copying conditions. There is NO | ||
63 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." | ||
64 | |||
65 | help=" | ||
66 | Try \`$me --help' for more information." | ||
67 | |||
68 | # Parse command line | ||
69 | while test $# -gt 0 ; do | ||
70 | case $1 in | ||
71 | --time-stamp | --time* | -t ) | ||
72 | echo "$timestamp" ; exit ;; | ||
73 | --version | -v ) | ||
74 | echo "$version" ; exit ;; | ||
75 | --help | --h* | -h ) | ||
76 | echo "$usage"; exit ;; | ||
77 | -- ) # Stop option processing | ||
78 | shift; break ;; | ||
79 | - ) # Use stdin as input. | ||
80 | break ;; | ||
81 | -* ) | ||
82 | echo "$me: invalid option $1$help" >&2 | ||
83 | exit 1 ;; | ||
84 | * ) | ||
85 | break ;; | ||
86 | esac | ||
87 | done | ||
88 | |||
89 | if test $# != 0; then | ||
90 | echo "$me: too many arguments$help" >&2 | ||
91 | exit 1 | ||
92 | fi | ||
93 | |||
94 | trap 'exit 1' 1 2 15 | ||
95 | |||
96 | # CC_FOR_BUILD -- compiler used by this script. Note that the use of a | ||
97 | # compiler to aid in system detection is discouraged as it requires | ||
98 | # temporary files to be created and, as you can see below, it is a | ||
99 | # headache to deal with in a portable fashion. | ||
100 | |||
101 | # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still | ||
102 | # use `HOST_CC' if defined, but it is deprecated. | ||
103 | |||
104 | # Portable tmp directory creation inspired by the Autoconf team. | ||
105 | |||
106 | set_cc_for_build=' | ||
107 | trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; | ||
108 | trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; | ||
109 | : ${TMPDIR=/tmp} ; | ||
110 | { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || | ||
111 | { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || | ||
112 | { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || | ||
113 | { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; | ||
114 | dummy=$tmp/dummy ; | ||
115 | tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; | ||
116 | case $CC_FOR_BUILD,$HOST_CC,$CC in | ||
117 | ,,) echo "int x;" > $dummy.c ; | ||
118 | for c in cc gcc c89 c99 ; do | ||
119 | if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then | ||
120 | CC_FOR_BUILD="$c"; break ; | ||
121 | fi ; | ||
122 | done ; | ||
123 | if test x"$CC_FOR_BUILD" = x ; then | ||
124 | CC_FOR_BUILD=no_compiler_found ; | ||
125 | fi | ||
126 | ;; | ||
127 | ,,*) CC_FOR_BUILD=$CC ;; | ||
128 | ,*,*) CC_FOR_BUILD=$HOST_CC ;; | ||
129 | esac ; set_cc_for_build= ;' | ||
130 | |||
131 | # This is needed to find uname on a Pyramid OSx when run in the BSD universe. | ||
132 | # (ghazi@noc.rutgers.edu 1994-08-24) | ||
133 | if (test -f /.attbin/uname) >/dev/null 2>&1 ; then | ||
134 | PATH=$PATH:/.attbin ; export PATH | ||
135 | fi | ||
136 | |||
137 | UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown | ||
138 | UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown | ||
139 | UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown | ||
140 | UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown | ||
141 | |||
142 | # Note: order is significant - the case branches are not exclusive. | ||
143 | |||
144 | case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in | ||
145 | *:NetBSD:*:*) | ||
146 | # NetBSD (nbsd) targets should (where applicable) match one or | ||
147 | # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, | ||
148 | # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently | ||
149 | # switched to ELF, *-*-netbsd* would select the old | ||
150 | # object file format. This provides both forward | ||
151 | # compatibility and a consistent mechanism for selecting the | ||
152 | # object file format. | ||
153 | # | ||
154 | # Note: NetBSD doesn't particularly care about the vendor | ||
155 | # portion of the name. We always set it to "unknown". | ||
156 | sysctl="sysctl -n hw.machine_arch" | ||
157 | UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ | ||
158 | /usr/sbin/$sysctl 2>/dev/null || echo unknown)` | ||
159 | case "${UNAME_MACHINE_ARCH}" in | ||
160 | armeb) machine=armeb-unknown ;; | ||
161 | arm*) machine=arm-unknown ;; | ||
162 | sh3el) machine=shl-unknown ;; | ||
163 | sh3eb) machine=sh-unknown ;; | ||
164 | *) machine=${UNAME_MACHINE_ARCH}-unknown ;; | ||
165 | esac | ||
166 | # The Operating System including object format, if it has switched | ||
167 | # to ELF recently, or will in the future. | ||
168 | case "${UNAME_MACHINE_ARCH}" in | ||
169 | arm*|i386|m68k|ns32k|sh3*|sparc|vax) | ||
170 | eval $set_cc_for_build | ||
171 | if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | ||
172 | | grep __ELF__ >/dev/null | ||
173 | then | ||
174 | # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). | ||
175 | # Return netbsd for either. FIX? | ||
176 | os=netbsd | ||
177 | else | ||
178 | os=netbsdelf | ||
179 | fi | ||
180 | ;; | ||
181 | *) | ||
182 | os=netbsd | ||
183 | ;; | ||
184 | esac | ||
185 | # The OS release | ||
186 | # Debian GNU/NetBSD machines have a different userland, and | ||
187 | # thus, need a distinct triplet. However, they do not need | ||
188 | # kernel version information, so it can be replaced with a | ||
189 | # suitable tag, in the style of linux-gnu. | ||
190 | case "${UNAME_VERSION}" in | ||
191 | Debian*) | ||
192 | release='-gnu' | ||
193 | ;; | ||
194 | *) | ||
195 | release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` | ||
196 | ;; | ||
197 | esac | ||
198 | # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: | ||
199 | # contains redundant information, the shorter form: | ||
200 | # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. | ||
201 | echo "${machine}-${os}${release}" | ||
202 | exit ;; | ||
203 | *:OpenBSD:*:*) | ||
204 | UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` | ||
205 | echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} | ||
206 | exit ;; | ||
207 | *:ekkoBSD:*:*) | ||
208 | echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} | ||
209 | exit ;; | ||
210 | *:SolidBSD:*:*) | ||
211 | echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} | ||
212 | exit ;; | ||
213 | macppc:MirBSD:*:*) | ||
214 | echo powerpc-unknown-mirbsd${UNAME_RELEASE} | ||
215 | exit ;; | ||
216 | *:MirBSD:*:*) | ||
217 | echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} | ||
218 | exit ;; | ||
219 | alpha:OSF1:*:*) | ||
220 | case $UNAME_RELEASE in | ||
221 | *4.0) | ||
222 | UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` | ||
223 | ;; | ||
224 | *5.*) | ||
225 | UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` | ||
226 | ;; | ||
227 | esac | ||
228 | # According to Compaq, /usr/sbin/psrinfo has been available on | ||
229 | # OSF/1 and Tru64 systems produced since 1995. I hope that | ||
230 | # covers most systems running today. This code pipes the CPU | ||
231 | # types through head -n 1, so we only detect the type of CPU 0. | ||
232 | ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` | ||
233 | case "$ALPHA_CPU_TYPE" in | ||
234 | "EV4 (21064)") | ||
235 | UNAME_MACHINE="alpha" ;; | ||
236 | "EV4.5 (21064)") | ||
237 | UNAME_MACHINE="alpha" ;; | ||
238 | "LCA4 (21066/21068)") | ||
239 | UNAME_MACHINE="alpha" ;; | ||
240 | "EV5 (21164)") | ||
241 | UNAME_MACHINE="alphaev5" ;; | ||
242 | "EV5.6 (21164A)") | ||
243 | UNAME_MACHINE="alphaev56" ;; | ||
244 | "EV5.6 (21164PC)") | ||
245 | UNAME_MACHINE="alphapca56" ;; | ||
246 | "EV5.7 (21164PC)") | ||
247 | UNAME_MACHINE="alphapca57" ;; | ||
248 | "EV6 (21264)") | ||
249 | UNAME_MACHINE="alphaev6" ;; | ||
250 | "EV6.7 (21264A)") | ||
251 | UNAME_MACHINE="alphaev67" ;; | ||
252 | "EV6.8CB (21264C)") | ||
253 | UNAME_MACHINE="alphaev68" ;; | ||
254 | "EV6.8AL (21264B)") | ||
255 | UNAME_MACHINE="alphaev68" ;; | ||
256 | "EV6.8CX (21264D)") | ||
257 | UNAME_MACHINE="alphaev68" ;; | ||
258 | "EV6.9A (21264/EV69A)") | ||
259 | UNAME_MACHINE="alphaev69" ;; | ||
260 | "EV7 (21364)") | ||
261 | UNAME_MACHINE="alphaev7" ;; | ||
262 | "EV7.9 (21364A)") | ||
263 | UNAME_MACHINE="alphaev79" ;; | ||
264 | esac | ||
265 | # A Pn.n version is a patched version. | ||
266 | # A Vn.n version is a released version. | ||
267 | # A Tn.n version is a released field test version. | ||
268 | # A Xn.n version is an unreleased experimental baselevel. | ||
269 | # 1.2 uses "1.2" for uname -r. | ||
270 | echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` | ||
271 | exit ;; | ||
272 | Alpha\ *:Windows_NT*:*) | ||
273 | # How do we know it's Interix rather than the generic POSIX subsystem? | ||
274 | # Should we change UNAME_MACHINE based on the output of uname instead | ||
275 | # of the specific Alpha model? | ||
276 | echo alpha-pc-interix | ||
277 | exit ;; | ||
278 | 21064:Windows_NT:50:3) | ||
279 | echo alpha-dec-winnt3.5 | ||
280 | exit ;; | ||
281 | Amiga*:UNIX_System_V:4.0:*) | ||
282 | echo m68k-unknown-sysv4 | ||
283 | exit ;; | ||
284 | *:[Aa]miga[Oo][Ss]:*:*) | ||
285 | echo ${UNAME_MACHINE}-unknown-amigaos | ||
286 | exit ;; | ||
287 | *:[Mm]orph[Oo][Ss]:*:*) | ||
288 | echo ${UNAME_MACHINE}-unknown-morphos | ||
289 | exit ;; | ||
290 | *:OS/390:*:*) | ||
291 | echo i370-ibm-openedition | ||
292 | exit ;; | ||
293 | *:z/VM:*:*) | ||
294 | echo s390-ibm-zvmoe | ||
295 | exit ;; | ||
296 | *:OS400:*:*) | ||
297 | echo powerpc-ibm-os400 | ||
298 | exit ;; | ||
299 | arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) | ||
300 | echo arm-acorn-riscix${UNAME_RELEASE} | ||
301 | exit ;; | ||
302 | arm:riscos:*:*|arm:RISCOS:*:*) | ||
303 | echo arm-unknown-riscos | ||
304 | exit ;; | ||
305 | SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) | ||
306 | echo hppa1.1-hitachi-hiuxmpp | ||
307 | exit ;; | ||
308 | Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) | ||
309 | # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. | ||
310 | if test "`(/bin/universe) 2>/dev/null`" = att ; then | ||
311 | echo pyramid-pyramid-sysv3 | ||
312 | else | ||
313 | echo pyramid-pyramid-bsd | ||
314 | fi | ||
315 | exit ;; | ||
316 | NILE*:*:*:dcosx) | ||
317 | echo pyramid-pyramid-svr4 | ||
318 | exit ;; | ||
319 | DRS?6000:unix:4.0:6*) | ||
320 | echo sparc-icl-nx6 | ||
321 | exit ;; | ||
322 | DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) | ||
323 | case `/usr/bin/uname -p` in | ||
324 | sparc) echo sparc-icl-nx7; exit ;; | ||
325 | esac ;; | ||
326 | sun4H:SunOS:5.*:*) | ||
327 | echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` | ||
328 | exit ;; | ||
329 | sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) | ||
330 | echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` | ||
331 | exit ;; | ||
332 | i86pc:SunOS:5.*:*) | ||
333 | echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` | ||
334 | exit ;; | ||
335 | sun4*:SunOS:6*:*) | ||
336 | # According to config.sub, this is the proper way to canonicalize | ||
337 | # SunOS6. Hard to guess exactly what SunOS6 will be like, but | ||
338 | # it's likely to be more like Solaris than SunOS4. | ||
339 | echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` | ||
340 | exit ;; | ||
341 | sun4*:SunOS:*:*) | ||
342 | case "`/usr/bin/arch -k`" in | ||
343 | Series*|S4*) | ||
344 | UNAME_RELEASE=`uname -v` | ||
345 | ;; | ||
346 | esac | ||
347 | # Japanese Language versions have a version number like `4.1.3-JL'. | ||
348 | echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` | ||
349 | exit ;; | ||
350 | sun3*:SunOS:*:*) | ||
351 | echo m68k-sun-sunos${UNAME_RELEASE} | ||
352 | exit ;; | ||
353 | sun*:*:4.2BSD:*) | ||
354 | UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` | ||
355 | test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 | ||
356 | case "`/bin/arch`" in | ||
357 | sun3) | ||
358 | echo m68k-sun-sunos${UNAME_RELEASE} | ||
359 | ;; | ||
360 | sun4) | ||
361 | echo sparc-sun-sunos${UNAME_RELEASE} | ||
362 | ;; | ||
363 | esac | ||
364 | exit ;; | ||
365 | aushp:SunOS:*:*) | ||
366 | echo sparc-auspex-sunos${UNAME_RELEASE} | ||
367 | exit ;; | ||
368 | # The situation for MiNT is a little confusing. The machine name | ||
369 | # can be virtually everything (everything which is not | ||
370 | # "atarist" or "atariste" at least should have a processor | ||
371 | # > m68000). The system name ranges from "MiNT" over "FreeMiNT" | ||
372 | # to the lowercase version "mint" (or "freemint"). Finally | ||
373 | # the system name "TOS" denotes a system which is actually not | ||
374 | # MiNT. But MiNT is downward compatible to TOS, so this should | ||
375 | # be no problem. | ||
376 | atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) | ||
377 | echo m68k-atari-mint${UNAME_RELEASE} | ||
378 | exit ;; | ||
379 | atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) | ||
380 | echo m68k-atari-mint${UNAME_RELEASE} | ||
381 | exit ;; | ||
382 | *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) | ||
383 | echo m68k-atari-mint${UNAME_RELEASE} | ||
384 | exit ;; | ||
385 | milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) | ||
386 | echo m68k-milan-mint${UNAME_RELEASE} | ||
387 | exit ;; | ||
388 | hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) | ||
389 | echo m68k-hades-mint${UNAME_RELEASE} | ||
390 | exit ;; | ||
391 | *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) | ||
392 | echo m68k-unknown-mint${UNAME_RELEASE} | ||
393 | exit ;; | ||
394 | m68k:machten:*:*) | ||
395 | echo m68k-apple-machten${UNAME_RELEASE} | ||
396 | exit ;; | ||
397 | powerpc:machten:*:*) | ||
398 | echo powerpc-apple-machten${UNAME_RELEASE} | ||
399 | exit ;; | ||
400 | RISC*:Mach:*:*) | ||
401 | echo mips-dec-mach_bsd4.3 | ||
402 | exit ;; | ||
403 | RISC*:ULTRIX:*:*) | ||
404 | echo mips-dec-ultrix${UNAME_RELEASE} | ||
405 | exit ;; | ||
406 | VAX*:ULTRIX*:*:*) | ||
407 | echo vax-dec-ultrix${UNAME_RELEASE} | ||
408 | exit ;; | ||
409 | 2020:CLIX:*:* | 2430:CLIX:*:*) | ||
410 | echo clipper-intergraph-clix${UNAME_RELEASE} | ||
411 | exit ;; | ||
412 | mips:*:*:UMIPS | mips:*:*:RISCos) | ||
413 | eval $set_cc_for_build | ||
414 | sed 's/^ //' << EOF >$dummy.c | ||
415 | #ifdef __cplusplus | ||
416 | #include <stdio.h> /* for printf() prototype */ | ||
417 | int main (int argc, char *argv[]) { | ||
418 | #else | ||
419 | int main (argc, argv) int argc; char *argv[]; { | ||
420 | #endif | ||
421 | #if defined (host_mips) && defined (MIPSEB) | ||
422 | #if defined (SYSTYPE_SYSV) | ||
423 | printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); | ||
424 | #endif | ||
425 | #if defined (SYSTYPE_SVR4) | ||
426 | printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); | ||
427 | #endif | ||
428 | #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) | ||
429 | printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); | ||
430 | #endif | ||
431 | #endif | ||
432 | exit (-1); | ||
433 | } | ||
434 | EOF | ||
435 | $CC_FOR_BUILD -o $dummy $dummy.c && | ||
436 | dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && | ||
437 | SYSTEM_NAME=`$dummy $dummyarg` && | ||
438 | { echo "$SYSTEM_NAME"; exit; } | ||
439 | echo mips-mips-riscos${UNAME_RELEASE} | ||
440 | exit ;; | ||
441 | Motorola:PowerMAX_OS:*:*) | ||
442 | echo powerpc-motorola-powermax | ||
443 | exit ;; | ||
444 | Motorola:*:4.3:PL8-*) | ||
445 | echo powerpc-harris-powermax | ||
446 | exit ;; | ||
447 | Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) | ||
448 | echo powerpc-harris-powermax | ||
449 | exit ;; | ||
450 | Night_Hawk:Power_UNIX:*:*) | ||
451 | echo powerpc-harris-powerunix | ||
452 | exit ;; | ||
453 | m88k:CX/UX:7*:*) | ||
454 | echo m88k-harris-cxux7 | ||
455 | exit ;; | ||
456 | m88k:*:4*:R4*) | ||
457 | echo m88k-motorola-sysv4 | ||
458 | exit ;; | ||
459 | m88k:*:3*:R3*) | ||
460 | echo m88k-motorola-sysv3 | ||
461 | exit ;; | ||
462 | AViiON:dgux:*:*) | ||
463 | # DG/UX returns AViiON for all architectures | ||
464 | UNAME_PROCESSOR=`/usr/bin/uname -p` | ||
465 | if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] | ||
466 | then | ||
467 | if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ | ||
468 | [ ${TARGET_BINARY_INTERFACE}x = x ] | ||
469 | then | ||
470 | echo m88k-dg-dgux${UNAME_RELEASE} | ||
471 | else | ||
472 | echo m88k-dg-dguxbcs${UNAME_RELEASE} | ||
473 | fi | ||
474 | else | ||
475 | echo i586-dg-dgux${UNAME_RELEASE} | ||
476 | fi | ||
477 | exit ;; | ||
478 | M88*:DolphinOS:*:*) # DolphinOS (SVR3) | ||
479 | echo m88k-dolphin-sysv3 | ||
480 | exit ;; | ||
481 | M88*:*:R3*:*) | ||
482 | # Delta 88k system running SVR3 | ||
483 | echo m88k-motorola-sysv3 | ||
484 | exit ;; | ||
485 | XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) | ||
486 | echo m88k-tektronix-sysv3 | ||
487 | exit ;; | ||
488 | Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) | ||
489 | echo m68k-tektronix-bsd | ||
490 | exit ;; | ||
491 | *:IRIX*:*:*) | ||
492 | echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` | ||
493 | exit ;; | ||
494 | ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. | ||
495 | echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id | ||
496 | exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' | ||
497 | i*86:AIX:*:*) | ||
498 | echo i386-ibm-aix | ||
499 | exit ;; | ||
500 | ia64:AIX:*:*) | ||
501 | if [ -x /usr/bin/oslevel ] ; then | ||
502 | IBM_REV=`/usr/bin/oslevel` | ||
503 | else | ||
504 | IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} | ||
505 | fi | ||
506 | echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} | ||
507 | exit ;; | ||
508 | *:AIX:2:3) | ||
509 | if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then | ||
510 | eval $set_cc_for_build | ||
511 | sed 's/^ //' << EOF >$dummy.c | ||
512 | #include <sys/systemcfg.h> | ||
513 | |||
514 | main() | ||
515 | { | ||
516 | if (!__power_pc()) | ||
517 | exit(1); | ||
518 | puts("powerpc-ibm-aix3.2.5"); | ||
519 | exit(0); | ||
520 | } | ||
521 | EOF | ||
522 | if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` | ||
523 | then | ||
524 | echo "$SYSTEM_NAME" | ||
525 | else | ||
526 | echo rs6000-ibm-aix3.2.5 | ||
527 | fi | ||
528 | elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then | ||
529 | echo rs6000-ibm-aix3.2.4 | ||
530 | else | ||
531 | echo rs6000-ibm-aix3.2 | ||
532 | fi | ||
533 | exit ;; | ||
534 | *:AIX:*:[45]) | ||
535 | IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` | ||
536 | if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then | ||
537 | IBM_ARCH=rs6000 | ||
538 | else | ||
539 | IBM_ARCH=powerpc | ||
540 | fi | ||
541 | if [ -x /usr/bin/oslevel ] ; then | ||
542 | IBM_REV=`/usr/bin/oslevel` | ||
543 | else | ||
544 | IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} | ||
545 | fi | ||
546 | echo ${IBM_ARCH}-ibm-aix${IBM_REV} | ||
547 | exit ;; | ||
548 | *:AIX:*:*) | ||
549 | echo rs6000-ibm-aix | ||
550 | exit ;; | ||
551 | ibmrt:4.4BSD:*|romp-ibm:BSD:*) | ||
552 | echo romp-ibm-bsd4.4 | ||
553 | exit ;; | ||
554 | ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and | ||
555 | echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to | ||
556 | exit ;; # report: romp-ibm BSD 4.3 | ||
557 | *:BOSX:*:*) | ||
558 | echo rs6000-bull-bosx | ||
559 | exit ;; | ||
560 | DPX/2?00:B.O.S.:*:*) | ||
561 | echo m68k-bull-sysv3 | ||
562 | exit ;; | ||
563 | 9000/[34]??:4.3bsd:1.*:*) | ||
564 | echo m68k-hp-bsd | ||
565 | exit ;; | ||
566 | hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) | ||
567 | echo m68k-hp-bsd4.4 | ||
568 | exit ;; | ||
569 | 9000/[34678]??:HP-UX:*:*) | ||
570 | HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` | ||
571 | case "${UNAME_MACHINE}" in | ||
572 | 9000/31? ) HP_ARCH=m68000 ;; | ||
573 | 9000/[34]?? ) HP_ARCH=m68k ;; | ||
574 | 9000/[678][0-9][0-9]) | ||
575 | if [ -x /usr/bin/getconf ]; then | ||
576 | sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` | ||
577 | sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` | ||
578 | case "${sc_cpu_version}" in | ||
579 | 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 | ||
580 | 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 | ||
581 | 532) # CPU_PA_RISC2_0 | ||
582 | case "${sc_kernel_bits}" in | ||
583 | 32) HP_ARCH="hppa2.0n" ;; | ||
584 | 64) HP_ARCH="hppa2.0w" ;; | ||
585 | '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 | ||
586 | esac ;; | ||
587 | esac | ||
588 | fi | ||
589 | if [ "${HP_ARCH}" = "" ]; then | ||
590 | eval $set_cc_for_build | ||
591 | sed 's/^ //' << EOF >$dummy.c | ||
592 | |||
593 | #define _HPUX_SOURCE | ||
594 | #include <stdlib.h> | ||
595 | #include <unistd.h> | ||
596 | |||
597 | int main () | ||
598 | { | ||
599 | #if defined(_SC_KERNEL_BITS) | ||
600 | long bits = sysconf(_SC_KERNEL_BITS); | ||
601 | #endif | ||
602 | long cpu = sysconf (_SC_CPU_VERSION); | ||
603 | |||
604 | switch (cpu) | ||
605 | { | ||
606 | case CPU_PA_RISC1_0: puts ("hppa1.0"); break; | ||
607 | case CPU_PA_RISC1_1: puts ("hppa1.1"); break; | ||
608 | case CPU_PA_RISC2_0: | ||
609 | #if defined(_SC_KERNEL_BITS) | ||
610 | switch (bits) | ||
611 | { | ||
612 | case 64: puts ("hppa2.0w"); break; | ||
613 | case 32: puts ("hppa2.0n"); break; | ||
614 | default: puts ("hppa2.0"); break; | ||
615 | } break; | ||
616 | #else /* !defined(_SC_KERNEL_BITS) */ | ||
617 | puts ("hppa2.0"); break; | ||
618 | #endif | ||
619 | default: puts ("hppa1.0"); break; | ||
620 | } | ||
621 | exit (0); | ||
622 | } | ||
623 | EOF | ||
624 | (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` | ||
625 | test -z "$HP_ARCH" && HP_ARCH=hppa | ||
626 | fi ;; | ||
627 | esac | ||
628 | if [ ${HP_ARCH} = "hppa2.0w" ] | ||
629 | then | ||
630 | eval $set_cc_for_build | ||
631 | |||
632 | # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating | ||
633 | # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler | ||
634 | # generating 64-bit code. GNU and HP use different nomenclature: | ||
635 | # | ||
636 | # $ CC_FOR_BUILD=cc ./config.guess | ||
637 | # => hppa2.0w-hp-hpux11.23 | ||
638 | # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess | ||
639 | # => hppa64-hp-hpux11.23 | ||
640 | |||
641 | if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | | ||
642 | grep __LP64__ >/dev/null | ||
643 | then | ||
644 | HP_ARCH="hppa2.0w" | ||
645 | else | ||
646 | HP_ARCH="hppa64" | ||
647 | fi | ||
648 | fi | ||
649 | echo ${HP_ARCH}-hp-hpux${HPUX_REV} | ||
650 | exit ;; | ||
651 | ia64:HP-UX:*:*) | ||
652 | HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` | ||
653 | echo ia64-hp-hpux${HPUX_REV} | ||
654 | exit ;; | ||
655 | 3050*:HI-UX:*:*) | ||
656 | eval $set_cc_for_build | ||
657 | sed 's/^ //' << EOF >$dummy.c | ||
658 | #include <unistd.h> | ||
659 | int | ||
660 | main () | ||
661 | { | ||
662 | long cpu = sysconf (_SC_CPU_VERSION); | ||
663 | /* The order matters, because CPU_IS_HP_MC68K erroneously returns | ||
664 | true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct | ||
665 | results, however. */ | ||
666 | if (CPU_IS_PA_RISC (cpu)) | ||
667 | { | ||
668 | switch (cpu) | ||
669 | { | ||
670 | case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; | ||
671 | case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; | ||
672 | case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; | ||
673 | default: puts ("hppa-hitachi-hiuxwe2"); break; | ||
674 | } | ||
675 | } | ||
676 | else if (CPU_IS_HP_MC68K (cpu)) | ||
677 | puts ("m68k-hitachi-hiuxwe2"); | ||
678 | else puts ("unknown-hitachi-hiuxwe2"); | ||
679 | exit (0); | ||
680 | } | ||
681 | EOF | ||
682 | $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && | ||
683 | { echo "$SYSTEM_NAME"; exit; } | ||
684 | echo unknown-hitachi-hiuxwe2 | ||
685 | exit ;; | ||
686 | 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) | ||
687 | echo hppa1.1-hp-bsd | ||
688 | exit ;; | ||
689 | 9000/8??:4.3bsd:*:*) | ||
690 | echo hppa1.0-hp-bsd | ||
691 | exit ;; | ||
692 | *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) | ||
693 | echo hppa1.0-hp-mpeix | ||
694 | exit ;; | ||
695 | hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) | ||
696 | echo hppa1.1-hp-osf | ||
697 | exit ;; | ||
698 | hp8??:OSF1:*:*) | ||
699 | echo hppa1.0-hp-osf | ||
700 | exit ;; | ||
701 | i*86:OSF1:*:*) | ||
702 | if [ -x /usr/sbin/sysversion ] ; then | ||
703 | echo ${UNAME_MACHINE}-unknown-osf1mk | ||
704 | else | ||
705 | echo ${UNAME_MACHINE}-unknown-osf1 | ||
706 | fi | ||
707 | exit ;; | ||
708 | parisc*:Lites*:*:*) | ||
709 | echo hppa1.1-hp-lites | ||
710 | exit ;; | ||
711 | C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) | ||
712 | echo c1-convex-bsd | ||
713 | exit ;; | ||
714 | C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) | ||
715 | if getsysinfo -f scalar_acc | ||
716 | then echo c32-convex-bsd | ||
717 | else echo c2-convex-bsd | ||
718 | fi | ||
719 | exit ;; | ||
720 | C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) | ||
721 | echo c34-convex-bsd | ||
722 | exit ;; | ||
723 | C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) | ||
724 | echo c38-convex-bsd | ||
725 | exit ;; | ||
726 | C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) | ||
727 | echo c4-convex-bsd | ||
728 | exit ;; | ||
729 | CRAY*Y-MP:*:*:*) | ||
730 | echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||
731 | exit ;; | ||
732 | CRAY*[A-Z]90:*:*:*) | ||
733 | echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | ||
734 | | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ | ||
735 | -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ | ||
736 | -e 's/\.[^.]*$/.X/' | ||
737 | exit ;; | ||
738 | CRAY*TS:*:*:*) | ||
739 | echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||
740 | exit ;; | ||
741 | CRAY*T3E:*:*:*) | ||
742 | echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||
743 | exit ;; | ||
744 | CRAY*SV1:*:*:*) | ||
745 | echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||
746 | exit ;; | ||
747 | *:UNICOS/mp:*:*) | ||
748 | echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||
749 | exit ;; | ||
750 | F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) | ||
751 | FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` | ||
752 | FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` | ||
753 | FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` | ||
754 | echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" | ||
755 | exit ;; | ||
756 | 5000:UNIX_System_V:4.*:*) | ||
757 | FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` | ||
758 | FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` | ||
759 | echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" | ||
760 | exit ;; | ||
761 | i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) | ||
762 | echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} | ||
763 | exit ;; | ||
764 | sparc*:BSD/OS:*:*) | ||
765 | echo sparc-unknown-bsdi${UNAME_RELEASE} | ||
766 | exit ;; | ||
767 | *:BSD/OS:*:*) | ||
768 | echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} | ||
769 | exit ;; | ||
770 | *:FreeBSD:*:*) | ||
771 | case ${UNAME_MACHINE} in | ||
772 | pc98) | ||
773 | echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; | ||
774 | amd64) | ||
775 | echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; | ||
776 | *) | ||
777 | echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; | ||
778 | esac | ||
779 | exit ;; | ||
780 | i*:CYGWIN*:*) | ||
781 | echo ${UNAME_MACHINE}-pc-cygwin | ||
782 | exit ;; | ||
783 | i*:MINGW*:*) | ||
784 | echo ${UNAME_MACHINE}-pc-mingw32 | ||
785 | exit ;; | ||
786 | i*:windows32*:*) | ||
787 | # uname -m includes "-pc" on this system. | ||
788 | echo ${UNAME_MACHINE}-mingw32 | ||
789 | exit ;; | ||
790 | i*:PW*:*) | ||
791 | echo ${UNAME_MACHINE}-pc-pw32 | ||
792 | exit ;; | ||
793 | x86:Interix*:[3456]*) | ||
794 | echo i586-pc-interix${UNAME_RELEASE} | ||
795 | exit ;; | ||
796 | EM64T:Interix*:[3456]*) | ||
797 | echo x86_64-unknown-interix${UNAME_RELEASE} | ||
798 | exit ;; | ||
799 | [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) | ||
800 | echo i${UNAME_MACHINE}-pc-mks | ||
801 | exit ;; | ||
802 | i*:Windows_NT*:* | Pentium*:Windows_NT*:*) | ||
803 | # How do we know it's Interix rather than the generic POSIX subsystem? | ||
804 | # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we | ||
805 | # UNAME_MACHINE based on the output of uname instead of i386? | ||
806 | echo i586-pc-interix | ||
807 | exit ;; | ||
808 | i*:UWIN*:*) | ||
809 | echo ${UNAME_MACHINE}-pc-uwin | ||
810 | exit ;; | ||
811 | amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) | ||
812 | echo x86_64-unknown-cygwin | ||
813 | exit ;; | ||
814 | p*:CYGWIN*:*) | ||
815 | echo powerpcle-unknown-cygwin | ||
816 | exit ;; | ||
817 | prep*:SunOS:5.*:*) | ||
818 | echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` | ||
819 | exit ;; | ||
820 | *:GNU:*:*) | ||
821 | # the GNU system | ||
822 | echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` | ||
823 | exit ;; | ||
824 | *:GNU/*:*:*) | ||
825 | # other systems with GNU libc and userland | ||
826 | echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu | ||
827 | exit ;; | ||
828 | i*86:Minix:*:*) | ||
829 | echo ${UNAME_MACHINE}-pc-minix | ||
830 | exit ;; | ||
831 | arm*:Linux:*:*) | ||
832 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
833 | exit ;; | ||
834 | avr32*:Linux:*:*) | ||
835 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
836 | exit ;; | ||
837 | cris:Linux:*:*) | ||
838 | echo cris-axis-linux-gnu | ||
839 | exit ;; | ||
840 | crisv32:Linux:*:*) | ||
841 | echo crisv32-axis-linux-gnu | ||
842 | exit ;; | ||
843 | frv:Linux:*:*) | ||
844 | echo frv-unknown-linux-gnu | ||
845 | exit ;; | ||
846 | ia64:Linux:*:*) | ||
847 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
848 | exit ;; | ||
849 | m32r*:Linux:*:*) | ||
850 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
851 | exit ;; | ||
852 | m68*:Linux:*:*) | ||
853 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
854 | exit ;; | ||
855 | mips:Linux:*:*) | ||
856 | eval $set_cc_for_build | ||
857 | sed 's/^ //' << EOF >$dummy.c | ||
858 | #undef CPU | ||
859 | #undef mips | ||
860 | #undef mipsel | ||
861 | #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) | ||
862 | CPU=mipsel | ||
863 | #else | ||
864 | #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) | ||
865 | CPU=mips | ||
866 | #else | ||
867 | CPU= | ||
868 | #endif | ||
869 | #endif | ||
870 | EOF | ||
871 | eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' | ||
872 | /^CPU/{ | ||
873 | s: ::g | ||
874 | p | ||
875 | }'`" | ||
876 | test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } | ||
877 | ;; | ||
878 | mips64:Linux:*:*) | ||
879 | eval $set_cc_for_build | ||
880 | sed 's/^ //' << EOF >$dummy.c | ||
881 | #undef CPU | ||
882 | #undef mips64 | ||
883 | #undef mips64el | ||
884 | #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) | ||
885 | CPU=mips64el | ||
886 | #else | ||
887 | #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) | ||
888 | CPU=mips64 | ||
889 | #else | ||
890 | CPU= | ||
891 | #endif | ||
892 | #endif | ||
893 | EOF | ||
894 | eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' | ||
895 | /^CPU/{ | ||
896 | s: ::g | ||
897 | p | ||
898 | }'`" | ||
899 | test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } | ||
900 | ;; | ||
901 | or32:Linux:*:*) | ||
902 | echo or32-unknown-linux-gnu | ||
903 | exit ;; | ||
904 | ppc:Linux:*:*) | ||
905 | echo powerpc-unknown-linux-gnu | ||
906 | exit ;; | ||
907 | ppc64:Linux:*:*) | ||
908 | echo powerpc64-unknown-linux-gnu | ||
909 | exit ;; | ||
910 | alpha:Linux:*:*) | ||
911 | case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in | ||
912 | EV5) UNAME_MACHINE=alphaev5 ;; | ||
913 | EV56) UNAME_MACHINE=alphaev56 ;; | ||
914 | PCA56) UNAME_MACHINE=alphapca56 ;; | ||
915 | PCA57) UNAME_MACHINE=alphapca56 ;; | ||
916 | EV6) UNAME_MACHINE=alphaev6 ;; | ||
917 | EV67) UNAME_MACHINE=alphaev67 ;; | ||
918 | EV68*) UNAME_MACHINE=alphaev68 ;; | ||
919 | esac | ||
920 | objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null | ||
921 | if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi | ||
922 | echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} | ||
923 | exit ;; | ||
924 | parisc:Linux:*:* | hppa:Linux:*:*) | ||
925 | # Look for CPU level | ||
926 | case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in | ||
927 | PA7*) echo hppa1.1-unknown-linux-gnu ;; | ||
928 | PA8*) echo hppa2.0-unknown-linux-gnu ;; | ||
929 | *) echo hppa-unknown-linux-gnu ;; | ||
930 | esac | ||
931 | exit ;; | ||
932 | parisc64:Linux:*:* | hppa64:Linux:*:*) | ||
933 | echo hppa64-unknown-linux-gnu | ||
934 | exit ;; | ||
935 | s390:Linux:*:* | s390x:Linux:*:*) | ||
936 | echo ${UNAME_MACHINE}-ibm-linux | ||
937 | exit ;; | ||
938 | sh64*:Linux:*:*) | ||
939 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
940 | exit ;; | ||
941 | sh*:Linux:*:*) | ||
942 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
943 | exit ;; | ||
944 | sparc:Linux:*:* | sparc64:Linux:*:*) | ||
945 | echo ${UNAME_MACHINE}-unknown-linux-gnu | ||
946 | exit ;; | ||
947 | vax:Linux:*:*) | ||
948 | echo ${UNAME_MACHINE}-dec-linux-gnu | ||
949 | exit ;; | ||
950 | x86_64:Linux:*:*) | ||
951 | echo x86_64-unknown-linux-gnu | ||
952 | exit ;; | ||
953 | i*86:Linux:*:*) | ||
954 | # The BFD linker knows what the default object file format is, so | ||
955 | # first see if it will tell us. cd to the root directory to prevent | ||
956 | # problems with other programs or directories called `ld' in the path. | ||
957 | # Set LC_ALL=C to ensure ld outputs messages in English. | ||
958 | ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | ||
959 | | sed -ne '/supported targets:/!d | ||
960 | s/[ ][ ]*/ /g | ||
961 | s/.*supported targets: *// | ||
962 | s/ .*// | ||
963 | p'` | ||
964 | case "$ld_supported_targets" in | ||
965 | elf32-i386) | ||
966 | TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" | ||
967 | ;; | ||
968 | a.out-i386-linux) | ||
969 | echo "${UNAME_MACHINE}-pc-linux-gnuaout" | ||
970 | exit ;; | ||
971 | coff-i386) | ||
972 | echo "${UNAME_MACHINE}-pc-linux-gnucoff" | ||
973 | exit ;; | ||
974 | "") | ||
975 | # Either a pre-BFD a.out linker (linux-gnuoldld) or | ||
976 | # one that does not give us useful --help. | ||
977 | echo "${UNAME_MACHINE}-pc-linux-gnuoldld" | ||
978 | exit ;; | ||
979 | esac | ||
980 | # Determine whether the default compiler is a.out or elf | ||
981 | eval $set_cc_for_build | ||
982 | sed 's/^ //' << EOF >$dummy.c | ||
983 | #include <features.h> | ||
984 | #ifdef __ELF__ | ||
985 | # ifdef __GLIBC__ | ||
986 | # if __GLIBC__ >= 2 | ||
987 | LIBC=gnu | ||
988 | # else | ||
989 | LIBC=gnulibc1 | ||
990 | # endif | ||
991 | # else | ||
992 | LIBC=gnulibc1 | ||
993 | # endif | ||
994 | #else | ||
995 | #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) | ||
996 | LIBC=gnu | ||
997 | #else | ||
998 | LIBC=gnuaout | ||
999 | #endif | ||
1000 | #endif | ||
1001 | #ifdef __dietlibc__ | ||
1002 | LIBC=dietlibc | ||
1003 | #endif | ||
1004 | EOF | ||
1005 | eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' | ||
1006 | /^LIBC/{ | ||
1007 | s: ::g | ||
1008 | p | ||
1009 | }'`" | ||
1010 | test x"${LIBC}" != x && { | ||
1011 | echo "${UNAME_MACHINE}-pc-linux-${LIBC}" | ||
1012 | exit | ||
1013 | } | ||
1014 | test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } | ||
1015 | ;; | ||
1016 | i*86:DYNIX/ptx:4*:*) | ||
1017 | # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. | ||
1018 | # earlier versions are messed up and put the nodename in both | ||
1019 | # sysname and nodename. | ||
1020 | echo i386-sequent-sysv4 | ||
1021 | exit ;; | ||
1022 | i*86:UNIX_SV:4.2MP:2.*) | ||
1023 | # Unixware is an offshoot of SVR4, but it has its own version | ||
1024 | # number series starting with 2... | ||
1025 | # I am not positive that other SVR4 systems won't match this, | ||
1026 | # I just have to hope. -- rms. | ||
1027 | # Use sysv4.2uw... so that sysv4* matches it. | ||
1028 | echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} | ||
1029 | exit ;; | ||
1030 | i*86:OS/2:*:*) | ||
1031 | # If we were able to find `uname', then EMX Unix compatibility | ||
1032 | # is probably installed. | ||
1033 | echo ${UNAME_MACHINE}-pc-os2-emx | ||
1034 | exit ;; | ||
1035 | i*86:XTS-300:*:STOP) | ||
1036 | echo ${UNAME_MACHINE}-unknown-stop | ||
1037 | exit ;; | ||
1038 | i*86:atheos:*:*) | ||
1039 | echo ${UNAME_MACHINE}-unknown-atheos | ||
1040 | exit ;; | ||
1041 | i*86:syllable:*:*) | ||
1042 | echo ${UNAME_MACHINE}-pc-syllable | ||
1043 | exit ;; | ||
1044 | i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) | ||
1045 | echo i386-unknown-lynxos${UNAME_RELEASE} | ||
1046 | exit ;; | ||
1047 | i*86:*DOS:*:*) | ||
1048 | echo ${UNAME_MACHINE}-pc-msdosdjgpp | ||
1049 | exit ;; | ||
1050 | i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) | ||
1051 | UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` | ||
1052 | if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then | ||
1053 | echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} | ||
1054 | else | ||
1055 | echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} | ||
1056 | fi | ||
1057 | exit ;; | ||
1058 | i*86:*:5:[678]*) | ||
1059 | # UnixWare 7.x, OpenUNIX and OpenServer 6. | ||
1060 | case `/bin/uname -X | grep "^Machine"` in | ||
1061 | *486*) UNAME_MACHINE=i486 ;; | ||
1062 | *Pentium) UNAME_MACHINE=i586 ;; | ||
1063 | *Pent*|*Celeron) UNAME_MACHINE=i686 ;; | ||
1064 | esac | ||
1065 | echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} | ||
1066 | exit ;; | ||
1067 | i*86:*:3.2:*) | ||
1068 | if test -f /usr/options/cb.name; then | ||
1069 | UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` | ||
1070 | echo ${UNAME_MACHINE}-pc-isc$UNAME_REL | ||
1071 | elif /bin/uname -X 2>/dev/null >/dev/null ; then | ||
1072 | UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` | ||
1073 | (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 | ||
1074 | (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ | ||
1075 | && UNAME_MACHINE=i586 | ||
1076 | (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ | ||
1077 | && UNAME_MACHINE=i686 | ||
1078 | (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ | ||
1079 | && UNAME_MACHINE=i686 | ||
1080 | echo ${UNAME_MACHINE}-pc-sco$UNAME_REL | ||
1081 | else | ||
1082 | echo ${UNAME_MACHINE}-pc-sysv32 | ||
1083 | fi | ||
1084 | exit ;; | ||
1085 | pc:*:*:*) | ||
1086 | # Left here for compatibility: | ||
1087 | # uname -m prints for DJGPP always 'pc', but it prints nothing about | ||
1088 | # the processor, so we play safe by assuming i386. | ||
1089 | echo i386-pc-msdosdjgpp | ||
1090 | exit ;; | ||
1091 | Intel:Mach:3*:*) | ||
1092 | echo i386-pc-mach3 | ||
1093 | exit ;; | ||
1094 | paragon:*:*:*) | ||
1095 | echo i860-intel-osf1 | ||
1096 | exit ;; | ||
1097 | i860:*:4.*:*) # i860-SVR4 | ||
1098 | if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then | ||
1099 | echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 | ||
1100 | else # Add other i860-SVR4 vendors below as they are discovered. | ||
1101 | echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 | ||
1102 | fi | ||
1103 | exit ;; | ||
1104 | mini*:CTIX:SYS*5:*) | ||
1105 | # "miniframe" | ||
1106 | echo m68010-convergent-sysv | ||
1107 | exit ;; | ||
1108 | mc68k:UNIX:SYSTEM5:3.51m) | ||
1109 | echo m68k-convergent-sysv | ||
1110 | exit ;; | ||
1111 | M680?0:D-NIX:5.3:*) | ||
1112 | echo m68k-diab-dnix | ||
1113 | exit ;; | ||
1114 | M68*:*:R3V[5678]*:*) | ||
1115 | test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; | ||
1116 | 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) | ||
1117 | OS_REL='' | ||
1118 | test -r /etc/.relid \ | ||
1119 | && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` | ||
1120 | /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ | ||
1121 | && { echo i486-ncr-sysv4.3${OS_REL}; exit; } | ||
1122 | /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ | ||
1123 | && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; | ||
1124 | 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) | ||
1125 | /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ | ||
1126 | && { echo i486-ncr-sysv4; exit; } ;; | ||
1127 | m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) | ||
1128 | echo m68k-unknown-lynxos${UNAME_RELEASE} | ||
1129 | exit ;; | ||
1130 | mc68030:UNIX_System_V:4.*:*) | ||
1131 | echo m68k-atari-sysv4 | ||
1132 | exit ;; | ||
1133 | TSUNAMI:LynxOS:2.*:*) | ||
1134 | echo sparc-unknown-lynxos${UNAME_RELEASE} | ||
1135 | exit ;; | ||
1136 | rs6000:LynxOS:2.*:*) | ||
1137 | echo rs6000-unknown-lynxos${UNAME_RELEASE} | ||
1138 | exit ;; | ||
1139 | PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) | ||
1140 | echo powerpc-unknown-lynxos${UNAME_RELEASE} | ||
1141 | exit ;; | ||
1142 | SM[BE]S:UNIX_SV:*:*) | ||
1143 | echo mips-dde-sysv${UNAME_RELEASE} | ||
1144 | exit ;; | ||
1145 | RM*:ReliantUNIX-*:*:*) | ||
1146 | echo mips-sni-sysv4 | ||
1147 | exit ;; | ||
1148 | RM*:SINIX-*:*:*) | ||
1149 | echo mips-sni-sysv4 | ||
1150 | exit ;; | ||
1151 | *:SINIX-*:*:*) | ||
1152 | if uname -p 2>/dev/null >/dev/null ; then | ||
1153 | UNAME_MACHINE=`(uname -p) 2>/dev/null` | ||
1154 | echo ${UNAME_MACHINE}-sni-sysv4 | ||
1155 | else | ||
1156 | echo ns32k-sni-sysv | ||
1157 | fi | ||
1158 | exit ;; | ||
1159 | PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort | ||
1160 | # says <Richard.M.Bartel@ccMail.Census.GOV> | ||
1161 | echo i586-unisys-sysv4 | ||
1162 | exit ;; | ||
1163 | *:UNIX_System_V:4*:FTX*) | ||
1164 | # From Gerald Hewes <hewes@openmarket.com>. | ||
1165 | # How about differentiating between stratus architectures? -djm | ||
1166 | echo hppa1.1-stratus-sysv4 | ||
1167 | exit ;; | ||
1168 | *:*:*:FTX*) | ||
1169 | # From seanf@swdc.stratus.com. | ||
1170 | echo i860-stratus-sysv4 | ||
1171 | exit ;; | ||
1172 | i*86:VOS:*:*) | ||
1173 | # From Paul.Green@stratus.com. | ||
1174 | echo ${UNAME_MACHINE}-stratus-vos | ||
1175 | exit ;; | ||
1176 | *:VOS:*:*) | ||
1177 | # From Paul.Green@stratus.com. | ||
1178 | echo hppa1.1-stratus-vos | ||
1179 | exit ;; | ||
1180 | mc68*:A/UX:*:*) | ||
1181 | echo m68k-apple-aux${UNAME_RELEASE} | ||
1182 | exit ;; | ||
1183 | news*:NEWS-OS:6*:*) | ||
1184 | echo mips-sony-newsos6 | ||
1185 | exit ;; | ||
1186 | R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) | ||
1187 | if [ -d /usr/nec ]; then | ||
1188 | echo mips-nec-sysv${UNAME_RELEASE} | ||
1189 | else | ||
1190 | echo mips-unknown-sysv${UNAME_RELEASE} | ||
1191 | fi | ||
1192 | exit ;; | ||
1193 | BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. | ||
1194 | echo powerpc-be-beos | ||
1195 | exit ;; | ||
1196 | BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. | ||
1197 | echo powerpc-apple-beos | ||
1198 | exit ;; | ||
1199 | BePC:BeOS:*:*) # BeOS running on Intel PC compatible. | ||
1200 | echo i586-pc-beos | ||
1201 | exit ;; | ||
1202 | SX-4:SUPER-UX:*:*) | ||
1203 | echo sx4-nec-superux${UNAME_RELEASE} | ||
1204 | exit ;; | ||
1205 | SX-5:SUPER-UX:*:*) | ||
1206 | echo sx5-nec-superux${UNAME_RELEASE} | ||
1207 | exit ;; | ||
1208 | SX-6:SUPER-UX:*:*) | ||
1209 | echo sx6-nec-superux${UNAME_RELEASE} | ||
1210 | exit ;; | ||
1211 | Power*:Rhapsody:*:*) | ||
1212 | echo powerpc-apple-rhapsody${UNAME_RELEASE} | ||
1213 | exit ;; | ||
1214 | *:Rhapsody:*:*) | ||
1215 | echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} | ||
1216 | exit ;; | ||
1217 | *:Darwin:*:*) | ||
1218 | UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown | ||
1219 | case $UNAME_PROCESSOR in | ||
1220 | unknown) UNAME_PROCESSOR=powerpc ;; | ||
1221 | esac | ||
1222 | echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} | ||
1223 | exit ;; | ||
1224 | *:procnto*:*:* | *:QNX:[0123456789]*:*) | ||
1225 | UNAME_PROCESSOR=`uname -p` | ||
1226 | if test "$UNAME_PROCESSOR" = "x86"; then | ||
1227 | UNAME_PROCESSOR=i386 | ||
1228 | UNAME_MACHINE=pc | ||
1229 | fi | ||
1230 | echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} | ||
1231 | exit ;; | ||
1232 | *:QNX:*:4*) | ||
1233 | echo i386-pc-qnx | ||
1234 | exit ;; | ||
1235 | NSE-?:NONSTOP_KERNEL:*:*) | ||
1236 | echo nse-tandem-nsk${UNAME_RELEASE} | ||
1237 | exit ;; | ||
1238 | NSR-?:NONSTOP_KERNEL:*:*) | ||
1239 | echo nsr-tandem-nsk${UNAME_RELEASE} | ||
1240 | exit ;; | ||
1241 | *:NonStop-UX:*:*) | ||
1242 | echo mips-compaq-nonstopux | ||
1243 | exit ;; | ||
1244 | BS2000:POSIX*:*:*) | ||
1245 | echo bs2000-siemens-sysv | ||
1246 | exit ;; | ||
1247 | DS/*:UNIX_System_V:*:*) | ||
1248 | echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} | ||
1249 | exit ;; | ||
1250 | *:Plan9:*:*) | ||
1251 | # "uname -m" is not consistent, so use $cputype instead. 386 | ||
1252 | # is converted to i386 for consistency with other x86 | ||
1253 | # operating systems. | ||
1254 | if test "$cputype" = "386"; then | ||
1255 | UNAME_MACHINE=i386 | ||
1256 | else | ||
1257 | UNAME_MACHINE="$cputype" | ||
1258 | fi | ||
1259 | echo ${UNAME_MACHINE}-unknown-plan9 | ||
1260 | exit ;; | ||
1261 | *:TOPS-10:*:*) | ||
1262 | echo pdp10-unknown-tops10 | ||
1263 | exit ;; | ||
1264 | *:TENEX:*:*) | ||
1265 | echo pdp10-unknown-tenex | ||
1266 | exit ;; | ||
1267 | KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) | ||
1268 | echo pdp10-dec-tops20 | ||
1269 | exit ;; | ||
1270 | XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) | ||
1271 | echo pdp10-xkl-tops20 | ||
1272 | exit ;; | ||
1273 | *:TOPS-20:*:*) | ||
1274 | echo pdp10-unknown-tops20 | ||
1275 | exit ;; | ||
1276 | *:ITS:*:*) | ||
1277 | echo pdp10-unknown-its | ||
1278 | exit ;; | ||
1279 | SEI:*:*:SEIUX) | ||
1280 | echo mips-sei-seiux${UNAME_RELEASE} | ||
1281 | exit ;; | ||
1282 | *:DragonFly:*:*) | ||
1283 | echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` | ||
1284 | exit ;; | ||
1285 | *:*VMS:*:*) | ||
1286 | UNAME_MACHINE=`(uname -p) 2>/dev/null` | ||
1287 | case "${UNAME_MACHINE}" in | ||
1288 | A*) echo alpha-dec-vms ; exit ;; | ||
1289 | I*) echo ia64-dec-vms ; exit ;; | ||
1290 | V*) echo vax-dec-vms ; exit ;; | ||
1291 | esac ;; | ||
1292 | *:XENIX:*:SysV) | ||
1293 | echo i386-pc-xenix | ||
1294 | exit ;; | ||
1295 | i*86:skyos:*:*) | ||
1296 | echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' | ||
1297 | exit ;; | ||
1298 | i*86:rdos:*:*) | ||
1299 | echo ${UNAME_MACHINE}-pc-rdos | ||
1300 | exit ;; | ||
1301 | esac | ||
1302 | |||
1303 | #echo '(No uname command or uname output not recognized.)' 1>&2 | ||
1304 | #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 | ||
1305 | |||
1306 | eval $set_cc_for_build | ||
1307 | cat >$dummy.c <<EOF | ||
1308 | #ifdef _SEQUENT_ | ||
1309 | # include <sys/types.h> | ||
1310 | # include <sys/utsname.h> | ||
1311 | #endif | ||
1312 | main () | ||
1313 | { | ||
1314 | #if defined (sony) | ||
1315 | #if defined (MIPSEB) | ||
1316 | /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, | ||
1317 | I don't know.... */ | ||
1318 | printf ("mips-sony-bsd\n"); exit (0); | ||
1319 | #else | ||
1320 | #include <sys/param.h> | ||
1321 | printf ("m68k-sony-newsos%s\n", | ||
1322 | #ifdef NEWSOS4 | ||
1323 | "4" | ||
1324 | #else | ||
1325 | "" | ||
1326 | #endif | ||
1327 | ); exit (0); | ||
1328 | #endif | ||
1329 | #endif | ||
1330 | |||
1331 | #if defined (__arm) && defined (__acorn) && defined (__unix) | ||
1332 | printf ("arm-acorn-riscix\n"); exit (0); | ||
1333 | #endif | ||
1334 | |||
1335 | #if defined (hp300) && !defined (hpux) | ||
1336 | printf ("m68k-hp-bsd\n"); exit (0); | ||
1337 | #endif | ||
1338 | |||
1339 | #if defined (NeXT) | ||
1340 | #if !defined (__ARCHITECTURE__) | ||
1341 | #define __ARCHITECTURE__ "m68k" | ||
1342 | #endif | ||
1343 | int version; | ||
1344 | version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; | ||
1345 | if (version < 4) | ||
1346 | printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); | ||
1347 | else | ||
1348 | printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); | ||
1349 | exit (0); | ||
1350 | #endif | ||
1351 | |||
1352 | #if defined (MULTIMAX) || defined (n16) | ||
1353 | #if defined (UMAXV) | ||
1354 | printf ("ns32k-encore-sysv\n"); exit (0); | ||
1355 | #else | ||
1356 | #if defined (CMU) | ||
1357 | printf ("ns32k-encore-mach\n"); exit (0); | ||
1358 | #else | ||
1359 | printf ("ns32k-encore-bsd\n"); exit (0); | ||
1360 | #endif | ||
1361 | #endif | ||
1362 | #endif | ||
1363 | |||
1364 | #if defined (__386BSD__) | ||
1365 | printf ("i386-pc-bsd\n"); exit (0); | ||
1366 | #endif | ||
1367 | |||
1368 | #if defined (sequent) | ||
1369 | #if defined (i386) | ||
1370 | printf ("i386-sequent-dynix\n"); exit (0); | ||
1371 | #endif | ||
1372 | #if defined (ns32000) | ||
1373 | printf ("ns32k-sequent-dynix\n"); exit (0); | ||
1374 | #endif | ||
1375 | #endif | ||
1376 | |||
1377 | #if defined (_SEQUENT_) | ||
1378 | struct utsname un; | ||
1379 | |||
1380 | uname(&un); | ||
1381 | |||
1382 | if (strncmp(un.version, "V2", 2) == 0) { | ||
1383 | printf ("i386-sequent-ptx2\n"); exit (0); | ||
1384 | } | ||
1385 | if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ | ||
1386 | printf ("i386-sequent-ptx1\n"); exit (0); | ||
1387 | } | ||
1388 | printf ("i386-sequent-ptx\n"); exit (0); | ||
1389 | |||
1390 | #endif | ||
1391 | |||
1392 | #if defined (vax) | ||
1393 | # if !defined (ultrix) | ||
1394 | # include <sys/param.h> | ||
1395 | # if defined (BSD) | ||
1396 | # if BSD == 43 | ||
1397 | printf ("vax-dec-bsd4.3\n"); exit (0); | ||
1398 | # else | ||
1399 | # if BSD == 199006 | ||
1400 | printf ("vax-dec-bsd4.3reno\n"); exit (0); | ||
1401 | # else | ||
1402 | printf ("vax-dec-bsd\n"); exit (0); | ||
1403 | # endif | ||
1404 | # endif | ||
1405 | # else | ||
1406 | printf ("vax-dec-bsd\n"); exit (0); | ||
1407 | # endif | ||
1408 | # else | ||
1409 | printf ("vax-dec-ultrix\n"); exit (0); | ||
1410 | # endif | ||
1411 | #endif | ||
1412 | |||
1413 | #if defined (alliant) && defined (i860) | ||
1414 | printf ("i860-alliant-bsd\n"); exit (0); | ||
1415 | #endif | ||
1416 | |||
1417 | exit (1); | ||
1418 | } | ||
1419 | EOF | ||
1420 | |||
1421 | $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && | ||
1422 | { echo "$SYSTEM_NAME"; exit; } | ||
1423 | |||
1424 | # Apollos put the system type in the environment. | ||
1425 | |||
1426 | test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } | ||
1427 | |||
1428 | # Convex versions that predate uname can use getsysinfo(1) | ||
1429 | |||
1430 | if [ -x /usr/convex/getsysinfo ] | ||
1431 | then | ||
1432 | case `getsysinfo -f cpu_type` in | ||
1433 | c1*) | ||
1434 | echo c1-convex-bsd | ||
1435 | exit ;; | ||
1436 | c2*) | ||
1437 | if getsysinfo -f scalar_acc | ||
1438 | then echo c32-convex-bsd | ||
1439 | else echo c2-convex-bsd | ||
1440 | fi | ||
1441 | exit ;; | ||
1442 | c34*) | ||
1443 | echo c34-convex-bsd | ||
1444 | exit ;; | ||
1445 | c38*) | ||
1446 | echo c38-convex-bsd | ||
1447 | exit ;; | ||
1448 | c4*) | ||
1449 | echo c4-convex-bsd | ||
1450 | exit ;; | ||
1451 | esac | ||
1452 | fi | ||
1453 | |||
1454 | cat >&2 <<EOF | ||
1455 | $0: unable to guess system type | ||
1456 | |||
1457 | This script, last modified $timestamp, has failed to recognize | ||
1458 | the operating system you are using. It is advised that you | ||
1459 | download the most up to date version of the config scripts from | ||
1460 | |||
1461 | http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess | ||
1462 | and | ||
1463 | http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub | ||
1464 | |||
1465 | If the version you run ($0) is already up to date, please | ||
1466 | send the following data and any information you think might be | ||
1467 | pertinent to <config-patches@gnu.org> in order to provide the needed | ||
1468 | information to handle your system. | ||
1469 | |||
1470 | config.guess timestamp = $timestamp | ||
1471 | |||
1472 | uname -m = `(uname -m) 2>/dev/null || echo unknown` | ||
1473 | uname -r = `(uname -r) 2>/dev/null || echo unknown` | ||
1474 | uname -s = `(uname -s) 2>/dev/null || echo unknown` | ||
1475 | uname -v = `(uname -v) 2>/dev/null || echo unknown` | ||
1476 | |||
1477 | /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` | ||
1478 | /bin/uname -X = `(/bin/uname -X) 2>/dev/null` | ||
1479 | |||
1480 | hostinfo = `(hostinfo) 2>/dev/null` | ||
1481 | /bin/universe = `(/bin/universe) 2>/dev/null` | ||
1482 | /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` | ||
1483 | /bin/arch = `(/bin/arch) 2>/dev/null` | ||
1484 | /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` | ||
1485 | /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` | ||
1486 | |||
1487 | UNAME_MACHINE = ${UNAME_MACHINE} | ||
1488 | UNAME_RELEASE = ${UNAME_RELEASE} | ||
1489 | UNAME_SYSTEM = ${UNAME_SYSTEM} | ||
1490 | UNAME_VERSION = ${UNAME_VERSION} | ||
1491 | EOF | ||
1492 | |||
1493 | exit 1 | ||
1494 | |||
1495 | # Local variables: | ||
1496 | # eval: (add-hook 'write-file-hooks 'time-stamp) | ||
1497 | # time-stamp-start: "timestamp='" | ||
1498 | # time-stamp-format: "%:y-%02m-%02d" | ||
1499 | # time-stamp-end: "'" | ||
1500 | # End: |
File config.h.in added (mode: 100644) (index 00000000..28e9e48e) | |||
1 | /* config.h.in. Generated from configure.ac by autoheader. */ | ||
2 | |||
3 | /* Define if you have the <DECkeySym.h> header file */ | ||
4 | #undef HAVE_DECKEYSYM_H | ||
5 | |||
6 | /* Define to 1 if you have the <dlfcn.h> header file. */ | ||
7 | #undef HAVE_DLFCN_H | ||
8 | |||
9 | /* Define to 1 if you have the <dl.h> header file. */ | ||
10 | #undef HAVE_DL_H | ||
11 | |||
12 | /* Define to 1 if you have the <fcntl.h> header file. */ | ||
13 | #undef HAVE_FCNTL_H | ||
14 | |||
15 | /* Define to 1 if you have the <inttypes.h> header file. */ | ||
16 | #undef HAVE_INTTYPES_H | ||
17 | |||
18 | /* Define to 1 if you have the <memory.h> header file. */ | ||
19 | #undef HAVE_MEMORY_H | ||
20 | |||
21 | /* Define to 1 if you have the `poll' function. */ | ||
22 | #undef HAVE_POLL | ||
23 | |||
24 | /* Define to 1 if you have the <stdint.h> header file. */ | ||
25 | #undef HAVE_STDINT_H | ||
26 | |||
27 | /* Define to 1 if you have the <stdlib.h> header file. */ | ||
28 | #undef HAVE_STDLIB_H | ||
29 | |||
30 | /* Define to 1 if you have the <strings.h> header file. */ | ||
31 | #undef HAVE_STRINGS_H | ||
32 | |||
33 | /* Define to 1 if you have the <string.h> header file. */ | ||
34 | #undef HAVE_STRING_H | ||
35 | |||
36 | /* Define if you have the <Sunkeysym.h> header file */ | ||
37 | #undef HAVE_SUNKEYSYM_H | ||
38 | |||
39 | /* Define to 1 if you have the <sys/select.h> header file. */ | ||
40 | #undef HAVE_SYS_SELECT_H | ||
41 | |||
42 | /* Define to 1 if you have the <sys/stat.h> header file. */ | ||
43 | #undef HAVE_SYS_STAT_H | ||
44 | |||
45 | /* Define to 1 if you have the <sys/time.h> header file. */ | ||
46 | #undef HAVE_SYS_TIME_H | ||
47 | |||
48 | /* Define to 1 if you have the <sys/types.h> header file. */ | ||
49 | #undef HAVE_SYS_TYPES_H | ||
50 | |||
51 | /* Define to 1 if you have the <unistd.h> header file. */ | ||
52 | #undef HAVE_UNISTD_H | ||
53 | |||
54 | /* Define to 1 if you have the `usleep' function. */ | ||
55 | #undef HAVE_USLEEP | ||
56 | |||
57 | /* Define to 1 if you have the `vsnprintf' function. */ | ||
58 | #undef HAVE_VSNPRINTF | ||
59 | |||
60 | /* Define to 1 if you have the `vsscanf' function. */ | ||
61 | #undef HAVE_VSSCANF | ||
62 | |||
63 | /* Define if you have this defined in <keysym.h> */ | ||
64 | #undef HAVE_XK_KP_BEGIN | ||
65 | |||
66 | /* Define if you have this defined in <keysym.h> */ | ||
67 | #undef HAVE_XK_KP_DELETE | ||
68 | |||
69 | /* Define if you have this defined in <keysym.h> */ | ||
70 | #undef HAVE_XK_KP_DOWN | ||
71 | |||
72 | /* Define if you have this defined in <keysym.h> */ | ||
73 | #undef HAVE_XK_KP_END | ||
74 | |||
75 | /* Define if you have this defined in <keysym.h> */ | ||
76 | #undef HAVE_XK_KP_HOME | ||
77 | |||
78 | /* Define if you have this defined in <keysym.h> */ | ||
79 | #undef HAVE_XK_KP_INSERT | ||
80 | |||
81 | /* Define if you have this defined in <keysym.h> */ | ||
82 | #undef HAVE_XK_KP_LEFT | ||
83 | |||
84 | /* Define if you have this defined in <keysym.h> */ | ||
85 | #undef HAVE_XK_KP_NEXT | ||
86 | |||
87 | /* Define if you have this defined in <keysym.h> */ | ||
88 | #undef HAVE_XK_KP_PRIOR | ||
89 | |||
90 | /* Define if you have this defined in <keysym.h> */ | ||
91 | #undef HAVE_XK_KP_RIGHT | ||
92 | |||
93 | /* Define if you have this defined in <keysym.h> */ | ||
94 | #undef HAVE_XK_KP_UP | ||
95 | |||
96 | /* Define if you have the <xpm.h> header file */ | ||
97 | #undef HAVE_XPM_H | ||
98 | |||
99 | /* Define to the address where bug reports for this package should be sent. */ | ||
100 | #undef PACKAGE_BUGREPORT | ||
101 | |||
102 | /* Define to the full name of this package. */ | ||
103 | #undef PACKAGE_NAME | ||
104 | |||
105 | /* Define to the full name and version of this package. */ | ||
106 | #undef PACKAGE_STRING | ||
107 | |||
108 | /* Define to the one symbol short name of this package. */ | ||
109 | #undef PACKAGE_TARNAME | ||
110 | |||
111 | /* Define to the version of this package. */ | ||
112 | #undef PACKAGE_VERSION | ||
113 | |||
114 | /* Define as the system defined limit for number of signals */ | ||
115 | #undef PDC_MAX_SIGNALS | ||
116 | |||
117 | /* Define as the return type of signal handlers (`int' or `void'). */ | ||
118 | #undef RETSIGTYPE | ||
119 | |||
120 | /* Define to 1 if you have the ANSI C header files. */ | ||
121 | #undef STDC_HEADERS | ||
122 | |||
123 | /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ | ||
124 | #undef TIME_WITH_SYS_TIME | ||
125 | |||
126 | /* Define if you want to use neXtaw library */ | ||
127 | #undef USE_NEXTAW | ||
128 | |||
129 | /* Define if you want to use Xaw3d library */ | ||
130 | #undef USE_XAW3D | ||
131 | |||
132 | /* Define XPointer is typedefed in X11/Xlib.h */ | ||
133 | #undef XPOINTER_TYPEDEFED |
File config.sub added (mode: 100755) (index 00000000..fab0aa35) | |||
1 | #! /bin/sh | ||
2 | # Configuration validation subroutine script. | ||
3 | # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | ||
4 | # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, | ||
5 | # Inc. | ||
6 | |||
7 | timestamp='2006-09-20' | ||
8 | |||
9 | # This file is (in principle) common to ALL GNU software. | ||
10 | # The presence of a machine in this file suggests that SOME GNU software | ||
11 | # can handle that machine. It does not imply ALL GNU software can. | ||
12 | # | ||
13 | # This file is free software; you can redistribute it and/or modify | ||
14 | # it under the terms of the GNU General Public License as published by | ||
15 | # the Free Software Foundation; either version 2 of the License, or | ||
16 | # (at your option) any later version. | ||
17 | # | ||
18 | # This program is distributed in the hope that it will be useful, | ||
19 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | # GNU General Public License for more details. | ||
22 | # | ||
23 | # You should have received a copy of the GNU General Public License | ||
24 | # along with this program; if not, write to the Free Software | ||
25 | # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | ||
26 | # 02110-1301, USA. | ||
27 | # | ||
28 | # As a special exception to the GNU General Public License, if you | ||
29 | # distribute this file as part of a program that contains a | ||
30 | # configuration script generated by Autoconf, you may include it under | ||
31 | # the same distribution terms that you use for the rest of that program. | ||
32 | |||
33 | |||
34 | # Please send patches to <config-patches@gnu.org>. Submit a context | ||
35 | # diff and a properly formatted ChangeLog entry. | ||
36 | # | ||
37 | # Configuration subroutine to validate and canonicalize a configuration type. | ||
38 | # Supply the specified configuration type as an argument. | ||
39 | # If it is invalid, we print an error message on stderr and exit with code 1. | ||
40 | # Otherwise, we print the canonical config type on stdout and succeed. | ||
41 | |||
42 | # This file is supposed to be the same for all GNU packages | ||
43 | # and recognize all the CPU types, system types and aliases | ||
44 | # that are meaningful with *any* GNU software. | ||
45 | # Each package is responsible for reporting which valid configurations | ||
46 | # it does not support. The user should be able to distinguish | ||
47 | # a failure to support a valid configuration from a meaningless | ||
48 | # configuration. | ||
49 | |||
50 | # The goal of this file is to map all the various variations of a given | ||
51 | # machine specification into a single specification in the form: | ||
52 | # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM | ||
53 | # or in some cases, the newer four-part form: | ||
54 | # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM | ||
55 | # It is wrong to echo any other type of specification. | ||
56 | |||
57 | me=`echo "$0" | sed -e 's,.*/,,'` | ||
58 | |||
59 | usage="\ | ||
60 | Usage: $0 [OPTION] CPU-MFR-OPSYS | ||
61 | $0 [OPTION] ALIAS | ||
62 | |||
63 | Canonicalize a configuration name. | ||
64 | |||
65 | Operation modes: | ||
66 | -h, --help print this help, then exit | ||
67 | -t, --time-stamp print date of last modification, then exit | ||
68 | -v, --version print version number, then exit | ||
69 | |||
70 | Report bugs and patches to <config-patches@gnu.org>." | ||
71 | |||
72 | version="\ | ||
73 | GNU config.sub ($timestamp) | ||
74 | |||
75 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
76 | Free Software Foundation, Inc. | ||
77 | |||
78 | This is free software; see the source for copying conditions. There is NO | ||
79 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." | ||
80 | |||
81 | help=" | ||
82 | Try \`$me --help' for more information." | ||
83 | |||
84 | # Parse command line | ||
85 | while test $# -gt 0 ; do | ||
86 | case $1 in | ||
87 | --time-stamp | --time* | -t ) | ||
88 | echo "$timestamp" ; exit ;; | ||
89 | --version | -v ) | ||
90 | echo "$version" ; exit ;; | ||
91 | --help | --h* | -h ) | ||
92 | echo "$usage"; exit ;; | ||
93 | -- ) # Stop option processing | ||
94 | shift; break ;; | ||
95 | - ) # Use stdin as input. | ||
96 | break ;; | ||
97 | -* ) | ||
98 | echo "$me: invalid option $1$help" | ||
99 | exit 1 ;; | ||
100 | |||
101 | *local*) | ||
102 | # First pass through any local machine types. | ||
103 | echo $1 | ||
104 | exit ;; | ||
105 | |||
106 | * ) | ||
107 | break ;; | ||
108 | esac | ||
109 | done | ||
110 | |||
111 | case $# in | ||
112 | 0) echo "$me: missing argument$help" >&2 | ||
113 | exit 1;; | ||
114 | 1) ;; | ||
115 | *) echo "$me: too many arguments$help" >&2 | ||
116 | exit 1;; | ||
117 | esac | ||
118 | |||
119 | # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). | ||
120 | # Here we must recognize all the valid KERNEL-OS combinations. | ||
121 | maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` | ||
122 | case $maybe_os in | ||
123 | nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ | ||
124 | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ | ||
125 | storm-chaos* | os2-emx* | rtmk-nova*) | ||
126 | os=-$maybe_os | ||
127 | basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` | ||
128 | ;; | ||
129 | *) | ||
130 | basic_machine=`echo $1 | sed 's/-[^-]*$//'` | ||
131 | if [ $basic_machine != $1 ] | ||
132 | then os=`echo $1 | sed 's/.*-/-/'` | ||
133 | else os=; fi | ||
134 | ;; | ||
135 | esac | ||
136 | |||
137 | ### Let's recognize common machines as not being operating systems so | ||
138 | ### that things like config.sub decstation-3100 work. We also | ||
139 | ### recognize some manufacturers as not being operating systems, so we | ||
140 | ### can provide default operating systems below. | ||
141 | case $os in | ||
142 | -sun*os*) | ||
143 | # Prevent following clause from handling this invalid input. | ||
144 | ;; | ||
145 | -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ | ||
146 | -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ | ||
147 | -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ | ||
148 | -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ | ||
149 | -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ | ||
150 | -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ | ||
151 | -apple | -axis | -knuth | -cray) | ||
152 | os= | ||
153 | basic_machine=$1 | ||
154 | ;; | ||
155 | -sim | -cisco | -oki | -wec | -winbond) | ||
156 | os= | ||
157 | basic_machine=$1 | ||
158 | ;; | ||
159 | -scout) | ||
160 | ;; | ||
161 | -wrs) | ||
162 | os=-vxworks | ||
163 | basic_machine=$1 | ||
164 | ;; | ||
165 | -chorusos*) | ||
166 | os=-chorusos | ||
167 | basic_machine=$1 | ||
168 | ;; | ||
169 | -chorusrdb) | ||
170 | os=-chorusrdb | ||
171 | basic_machine=$1 | ||
172 | ;; | ||
173 | -hiux*) | ||
174 | os=-hiuxwe2 | ||
175 | ;; | ||
176 | -sco6) | ||
177 | os=-sco5v6 | ||
178 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
179 | ;; | ||
180 | -sco5) | ||
181 | os=-sco3.2v5 | ||
182 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
183 | ;; | ||
184 | -sco4) | ||
185 | os=-sco3.2v4 | ||
186 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
187 | ;; | ||
188 | -sco3.2.[4-9]*) | ||
189 | os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` | ||
190 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
191 | ;; | ||
192 | -sco3.2v[4-9]*) | ||
193 | # Don't forget version if it is 3.2v4 or newer. | ||
194 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
195 | ;; | ||
196 | -sco5v6*) | ||
197 | # Don't forget version if it is 3.2v4 or newer. | ||
198 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
199 | ;; | ||
200 | -sco*) | ||
201 | os=-sco3.2v2 | ||
202 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
203 | ;; | ||
204 | -udk*) | ||
205 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
206 | ;; | ||
207 | -isc) | ||
208 | os=-isc2.2 | ||
209 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
210 | ;; | ||
211 | -clix*) | ||
212 | basic_machine=clipper-intergraph | ||
213 | ;; | ||
214 | -isc*) | ||
215 | basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` | ||
216 | ;; | ||
217 | -lynx*) | ||
218 | os=-lynxos | ||
219 | ;; | ||
220 | -ptx*) | ||
221 | basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` | ||
222 | ;; | ||
223 | -windowsnt*) | ||
224 | os=`echo $os | sed -e 's/windowsnt/winnt/'` | ||
225 | ;; | ||
226 | -psos*) | ||
227 | os=-psos | ||
228 | ;; | ||
229 | -mint | -mint[0-9]*) | ||
230 | basic_machine=m68k-atari | ||
231 | os=-mint | ||
232 | ;; | ||
233 | esac | ||
234 | |||
235 | # Decode aliases for certain CPU-COMPANY combinations. | ||
236 | case $basic_machine in | ||
237 | # Recognize the basic CPU types without company name. | ||
238 | # Some are omitted here because they have special meanings below. | ||
239 | 1750a | 580 \ | ||
240 | | a29k \ | ||
241 | | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | ||
242 | | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | ||
243 | | am33_2.0 \ | ||
244 | | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | ||
245 | | bfin \ | ||
246 | | c4x | clipper \ | ||
247 | | d10v | d30v | dlx | dsp16xx \ | ||
248 | | fr30 | frv \ | ||
249 | | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | ||
250 | | i370 | i860 | i960 | ia64 \ | ||
251 | | ip2k | iq2000 \ | ||
252 | | m32c | m32r | m32rle | m68000 | m68k | m88k \ | ||
253 | | maxq | mb | microblaze | mcore \ | ||
254 | | mips | mipsbe | mipseb | mipsel | mipsle \ | ||
255 | | mips16 \ | ||
256 | | mips64 | mips64el \ | ||
257 | | mips64vr | mips64vrel \ | ||
258 | | mips64orion | mips64orionel \ | ||
259 | | mips64vr4100 | mips64vr4100el \ | ||
260 | | mips64vr4300 | mips64vr4300el \ | ||
261 | | mips64vr5000 | mips64vr5000el \ | ||
262 | | mips64vr5900 | mips64vr5900el \ | ||
263 | | mipsisa32 | mipsisa32el \ | ||
264 | | mipsisa32r2 | mipsisa32r2el \ | ||
265 | | mipsisa64 | mipsisa64el \ | ||
266 | | mipsisa64r2 | mipsisa64r2el \ | ||
267 | | mipsisa64sb1 | mipsisa64sb1el \ | ||
268 | | mipsisa64sr71k | mipsisa64sr71kel \ | ||
269 | | mipstx39 | mipstx39el \ | ||
270 | | mn10200 | mn10300 \ | ||
271 | | mt \ | ||
272 | | msp430 \ | ||
273 | | nios | nios2 \ | ||
274 | | ns16k | ns32k \ | ||
275 | | or32 \ | ||
276 | | pdp10 | pdp11 | pj | pjl \ | ||
277 | | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | ||
278 | | pyramid \ | ||
279 | | score \ | ||
280 | | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | ||
281 | | sh64 | sh64le \ | ||
282 | | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | ||
283 | | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | ||
284 | | spu | strongarm \ | ||
285 | | tahoe | thumb | tic4x | tic80 | tron \ | ||
286 | | v850 | v850e \ | ||
287 | | we32k \ | ||
288 | | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | ||
289 | | z8k) | ||
290 | basic_machine=$basic_machine-unknown | ||
291 | ;; | ||
292 | m6811 | m68hc11 | m6812 | m68hc12) | ||
293 | # Motorola 68HC11/12. | ||
294 | basic_machine=$basic_machine-unknown | ||
295 | os=-none | ||
296 | ;; | ||
297 | m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) | ||
298 | ;; | ||
299 | ms1) | ||
300 | basic_machine=mt-unknown | ||
301 | ;; | ||
302 | |||
303 | # We use `pc' rather than `unknown' | ||
304 | # because (1) that's what they normally are, and | ||
305 | # (2) the word "unknown" tends to confuse beginning users. | ||
306 | i*86 | x86_64) | ||
307 | basic_machine=$basic_machine-pc | ||
308 | ;; | ||
309 | # Object if more than one company name word. | ||
310 | *-*-*) | ||
311 | echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 | ||
312 | exit 1 | ||
313 | ;; | ||
314 | # Recognize the basic CPU types with company name. | ||
315 | 580-* \ | ||
316 | | a29k-* \ | ||
317 | | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | ||
318 | | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | ||
319 | | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | ||
320 | | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | ||
321 | | avr-* | avr32-* \ | ||
322 | | bfin-* | bs2000-* \ | ||
323 | | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | ||
324 | | clipper-* | craynv-* | cydra-* \ | ||
325 | | d10v-* | d30v-* | dlx-* \ | ||
326 | | elxsi-* \ | ||
327 | | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | ||
328 | | h8300-* | h8500-* \ | ||
329 | | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | ||
330 | | i*86-* | i860-* | i960-* | ia64-* \ | ||
331 | | ip2k-* | iq2000-* \ | ||
332 | | m32c-* | m32r-* | m32rle-* \ | ||
333 | | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | ||
334 | | m88110-* | m88k-* | maxq-* | mcore-* \ | ||
335 | | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | ||
336 | | mips16-* \ | ||
337 | | mips64-* | mips64el-* \ | ||
338 | | mips64vr-* | mips64vrel-* \ | ||
339 | | mips64orion-* | mips64orionel-* \ | ||
340 | | mips64vr4100-* | mips64vr4100el-* \ | ||
341 | | mips64vr4300-* | mips64vr4300el-* \ | ||
342 | | mips64vr5000-* | mips64vr5000el-* \ | ||
343 | | mips64vr5900-* | mips64vr5900el-* \ | ||
344 | | mipsisa32-* | mipsisa32el-* \ | ||
345 | | mipsisa32r2-* | mipsisa32r2el-* \ | ||
346 | | mipsisa64-* | mipsisa64el-* \ | ||
347 | | mipsisa64r2-* | mipsisa64r2el-* \ | ||
348 | | mipsisa64sb1-* | mipsisa64sb1el-* \ | ||
349 | | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | ||
350 | | mipstx39-* | mipstx39el-* \ | ||
351 | | mmix-* \ | ||
352 | | mt-* \ | ||
353 | | msp430-* \ | ||
354 | | nios-* | nios2-* \ | ||
355 | | none-* | np1-* | ns16k-* | ns32k-* \ | ||
356 | | orion-* \ | ||
357 | | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | ||
358 | | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | ||
359 | | pyramid-* \ | ||
360 | | romp-* | rs6000-* \ | ||
361 | | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | ||
362 | | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | ||
363 | | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | ||
364 | | sparclite-* \ | ||
365 | | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | ||
366 | | tahoe-* | thumb-* \ | ||
367 | | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | ||
368 | | tron-* \ | ||
369 | | v850-* | v850e-* | vax-* \ | ||
370 | | we32k-* \ | ||
371 | | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | ||
372 | | xstormy16-* | xtensa-* \ | ||
373 | | ymp-* \ | ||
374 | | z8k-*) | ||
375 | ;; | ||
376 | # Recognize the various machine names and aliases which stand | ||
377 | # for a CPU type and a company and sometimes even an OS. | ||
378 | 386bsd) | ||
379 | basic_machine=i386-unknown | ||
380 | os=-bsd | ||
381 | ;; | ||
382 | 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) | ||
383 | basic_machine=m68000-att | ||
384 | ;; | ||
385 | 3b*) | ||
386 | basic_machine=we32k-att | ||
387 | ;; | ||
388 | a29khif) | ||
389 | basic_machine=a29k-amd | ||
390 | os=-udi | ||
391 | ;; | ||
392 | abacus) | ||
393 | basic_machine=abacus-unknown | ||
394 | ;; | ||
395 | adobe68k) | ||
396 | basic_machine=m68010-adobe | ||
397 | os=-scout | ||
398 | ;; | ||
399 | alliant | fx80) | ||
400 | basic_machine=fx80-alliant | ||
401 | ;; | ||
402 | altos | altos3068) | ||
403 | basic_machine=m68k-altos | ||
404 | ;; | ||
405 | am29k) | ||
406 | basic_machine=a29k-none | ||
407 | os=-bsd | ||
408 | ;; | ||
409 | amd64) | ||
410 | basic_machine=x86_64-pc | ||
411 | ;; | ||
412 | amd64-*) | ||
413 | basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
414 | ;; | ||
415 | amdahl) | ||
416 | basic_machine=580-amdahl | ||
417 | os=-sysv | ||
418 | ;; | ||
419 | amiga | amiga-*) | ||
420 | basic_machine=m68k-unknown | ||
421 | ;; | ||
422 | amigaos | amigados) | ||
423 | basic_machine=m68k-unknown | ||
424 | os=-amigaos | ||
425 | ;; | ||
426 | amigaunix | amix) | ||
427 | basic_machine=m68k-unknown | ||
428 | os=-sysv4 | ||
429 | ;; | ||
430 | apollo68) | ||
431 | basic_machine=m68k-apollo | ||
432 | os=-sysv | ||
433 | ;; | ||
434 | apollo68bsd) | ||
435 | basic_machine=m68k-apollo | ||
436 | os=-bsd | ||
437 | ;; | ||
438 | aux) | ||
439 | basic_machine=m68k-apple | ||
440 | os=-aux | ||
441 | ;; | ||
442 | balance) | ||
443 | basic_machine=ns32k-sequent | ||
444 | os=-dynix | ||
445 | ;; | ||
446 | c90) | ||
447 | basic_machine=c90-cray | ||
448 | os=-unicos | ||
449 | ;; | ||
450 | convex-c1) | ||
451 | basic_machine=c1-convex | ||
452 | os=-bsd | ||
453 | ;; | ||
454 | convex-c2) | ||
455 | basic_machine=c2-convex | ||
456 | os=-bsd | ||
457 | ;; | ||
458 | convex-c32) | ||
459 | basic_machine=c32-convex | ||
460 | os=-bsd | ||
461 | ;; | ||
462 | convex-c34) | ||
463 | basic_machine=c34-convex | ||
464 | os=-bsd | ||
465 | ;; | ||
466 | convex-c38) | ||
467 | basic_machine=c38-convex | ||
468 | os=-bsd | ||
469 | ;; | ||
470 | cray | j90) | ||
471 | basic_machine=j90-cray | ||
472 | os=-unicos | ||
473 | ;; | ||
474 | craynv) | ||
475 | basic_machine=craynv-cray | ||
476 | os=-unicosmp | ||
477 | ;; | ||
478 | cr16c) | ||
479 | basic_machine=cr16c-unknown | ||
480 | os=-elf | ||
481 | ;; | ||
482 | crds | unos) | ||
483 | basic_machine=m68k-crds | ||
484 | ;; | ||
485 | crisv32 | crisv32-* | etraxfs*) | ||
486 | basic_machine=crisv32-axis | ||
487 | ;; | ||
488 | cris | cris-* | etrax*) | ||
489 | basic_machine=cris-axis | ||
490 | ;; | ||
491 | crx) | ||
492 | basic_machine=crx-unknown | ||
493 | os=-elf | ||
494 | ;; | ||
495 | da30 | da30-*) | ||
496 | basic_machine=m68k-da30 | ||
497 | ;; | ||
498 | decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) | ||
499 | basic_machine=mips-dec | ||
500 | ;; | ||
501 | decsystem10* | dec10*) | ||
502 | basic_machine=pdp10-dec | ||
503 | os=-tops10 | ||
504 | ;; | ||
505 | decsystem20* | dec20*) | ||
506 | basic_machine=pdp10-dec | ||
507 | os=-tops20 | ||
508 | ;; | ||
509 | delta | 3300 | motorola-3300 | motorola-delta \ | ||
510 | | 3300-motorola | delta-motorola) | ||
511 | basic_machine=m68k-motorola | ||
512 | ;; | ||
513 | delta88) | ||
514 | basic_machine=m88k-motorola | ||
515 | os=-sysv3 | ||
516 | ;; | ||
517 | djgpp) | ||
518 | basic_machine=i586-pc | ||
519 | os=-msdosdjgpp | ||
520 | ;; | ||
521 | dpx20 | dpx20-*) | ||
522 | basic_machine=rs6000-bull | ||
523 | os=-bosx | ||
524 | ;; | ||
525 | dpx2* | dpx2*-bull) | ||
526 | basic_machine=m68k-bull | ||
527 | os=-sysv3 | ||
528 | ;; | ||
529 | ebmon29k) | ||
530 | basic_machine=a29k-amd | ||
531 | os=-ebmon | ||
532 | ;; | ||
533 | elxsi) | ||
534 | basic_machine=elxsi-elxsi | ||
535 | os=-bsd | ||
536 | ;; | ||
537 | encore | umax | mmax) | ||
538 | basic_machine=ns32k-encore | ||
539 | ;; | ||
540 | es1800 | OSE68k | ose68k | ose | OSE) | ||
541 | basic_machine=m68k-ericsson | ||
542 | os=-ose | ||
543 | ;; | ||
544 | fx2800) | ||
545 | basic_machine=i860-alliant | ||
546 | ;; | ||
547 | genix) | ||
548 | basic_machine=ns32k-ns | ||
549 | ;; | ||
550 | gmicro) | ||
551 | basic_machine=tron-gmicro | ||
552 | os=-sysv | ||
553 | ;; | ||
554 | go32) | ||
555 | basic_machine=i386-pc | ||
556 | os=-go32 | ||
557 | ;; | ||
558 | h3050r* | hiux*) | ||
559 | basic_machine=hppa1.1-hitachi | ||
560 | os=-hiuxwe2 | ||
561 | ;; | ||
562 | h8300hms) | ||
563 | basic_machine=h8300-hitachi | ||
564 | os=-hms | ||
565 | ;; | ||
566 | h8300xray) | ||
567 | basic_machine=h8300-hitachi | ||
568 | os=-xray | ||
569 | ;; | ||
570 | h8500hms) | ||
571 | basic_machine=h8500-hitachi | ||
572 | os=-hms | ||
573 | ;; | ||
574 | harris) | ||
575 | basic_machine=m88k-harris | ||
576 | os=-sysv3 | ||
577 | ;; | ||
578 | hp300-*) | ||
579 | basic_machine=m68k-hp | ||
580 | ;; | ||
581 | hp300bsd) | ||
582 | basic_machine=m68k-hp | ||
583 | os=-bsd | ||
584 | ;; | ||
585 | hp300hpux) | ||
586 | basic_machine=m68k-hp | ||
587 | os=-hpux | ||
588 | ;; | ||
589 | hp3k9[0-9][0-9] | hp9[0-9][0-9]) | ||
590 | basic_machine=hppa1.0-hp | ||
591 | ;; | ||
592 | hp9k2[0-9][0-9] | hp9k31[0-9]) | ||
593 | basic_machine=m68000-hp | ||
594 | ;; | ||
595 | hp9k3[2-9][0-9]) | ||
596 | basic_machine=m68k-hp | ||
597 | ;; | ||
598 | hp9k6[0-9][0-9] | hp6[0-9][0-9]) | ||
599 | basic_machine=hppa1.0-hp | ||
600 | ;; | ||
601 | hp9k7[0-79][0-9] | hp7[0-79][0-9]) | ||
602 | basic_machine=hppa1.1-hp | ||
603 | ;; | ||
604 | hp9k78[0-9] | hp78[0-9]) | ||
605 | # FIXME: really hppa2.0-hp | ||
606 | basic_machine=hppa1.1-hp | ||
607 | ;; | ||
608 | hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) | ||
609 | # FIXME: really hppa2.0-hp | ||
610 | basic_machine=hppa1.1-hp | ||
611 | ;; | ||
612 | hp9k8[0-9][13679] | hp8[0-9][13679]) | ||
613 | basic_machine=hppa1.1-hp | ||
614 | ;; | ||
615 | hp9k8[0-9][0-9] | hp8[0-9][0-9]) | ||
616 | basic_machine=hppa1.0-hp | ||
617 | ;; | ||
618 | hppa-next) | ||
619 | os=-nextstep3 | ||
620 | ;; | ||
621 | hppaosf) | ||
622 | basic_machine=hppa1.1-hp | ||
623 | os=-osf | ||
624 | ;; | ||
625 | hppro) | ||
626 | basic_machine=hppa1.1-hp | ||
627 | os=-proelf | ||
628 | ;; | ||
629 | i370-ibm* | ibm*) | ||
630 | basic_machine=i370-ibm | ||
631 | ;; | ||
632 | # I'm not sure what "Sysv32" means. Should this be sysv3.2? | ||
633 | i*86v32) | ||
634 | basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` | ||
635 | os=-sysv32 | ||
636 | ;; | ||
637 | i*86v4*) | ||
638 | basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` | ||
639 | os=-sysv4 | ||
640 | ;; | ||
641 | i*86v) | ||
642 | basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` | ||
643 | os=-sysv | ||
644 | ;; | ||
645 | i*86sol2) | ||
646 | basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` | ||
647 | os=-solaris2 | ||
648 | ;; | ||
649 | i386mach) | ||
650 | basic_machine=i386-mach | ||
651 | os=-mach | ||
652 | ;; | ||
653 | i386-vsta | vsta) | ||
654 | basic_machine=i386-unknown | ||
655 | os=-vsta | ||
656 | ;; | ||
657 | iris | iris4d) | ||
658 | basic_machine=mips-sgi | ||
659 | case $os in | ||
660 | -irix*) | ||
661 | ;; | ||
662 | *) | ||
663 | os=-irix4 | ||
664 | ;; | ||
665 | esac | ||
666 | ;; | ||
667 | isi68 | isi) | ||
668 | basic_machine=m68k-isi | ||
669 | os=-sysv | ||
670 | ;; | ||
671 | m88k-omron*) | ||
672 | basic_machine=m88k-omron | ||
673 | ;; | ||
674 | magnum | m3230) | ||
675 | basic_machine=mips-mips | ||
676 | os=-sysv | ||
677 | ;; | ||
678 | merlin) | ||
679 | basic_machine=ns32k-utek | ||
680 | os=-sysv | ||
681 | ;; | ||
682 | mingw32) | ||
683 | basic_machine=i386-pc | ||
684 | os=-mingw32 | ||
685 | ;; | ||
686 | miniframe) | ||
687 | basic_machine=m68000-convergent | ||
688 | ;; | ||
689 | *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) | ||
690 | basic_machine=m68k-atari | ||
691 | os=-mint | ||
692 | ;; | ||
693 | mips3*-*) | ||
694 | basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` | ||
695 | ;; | ||
696 | mips3*) | ||
697 | basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown | ||
698 | ;; | ||
699 | monitor) | ||
700 | basic_machine=m68k-rom68k | ||
701 | os=-coff | ||
702 | ;; | ||
703 | morphos) | ||
704 | basic_machine=powerpc-unknown | ||
705 | os=-morphos | ||
706 | ;; | ||
707 | msdos) | ||
708 | basic_machine=i386-pc | ||
709 | os=-msdos | ||
710 | ;; | ||
711 | ms1-*) | ||
712 | basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` | ||
713 | ;; | ||
714 | mvs) | ||
715 | basic_machine=i370-ibm | ||
716 | os=-mvs | ||
717 | ;; | ||
718 | ncr3000) | ||
719 | basic_machine=i486-ncr | ||
720 | os=-sysv4 | ||
721 | ;; | ||
722 | netbsd386) | ||
723 | basic_machine=i386-unknown | ||
724 | os=-netbsd | ||
725 | ;; | ||
726 | netwinder) | ||
727 | basic_machine=armv4l-rebel | ||
728 | os=-linux | ||
729 | ;; | ||
730 | news | news700 | news800 | news900) | ||
731 | basic_machine=m68k-sony | ||
732 | os=-newsos | ||
733 | ;; | ||
734 | news1000) | ||
735 | basic_machine=m68030-sony | ||
736 | os=-newsos | ||
737 | ;; | ||
738 | news-3600 | risc-news) | ||
739 | basic_machine=mips-sony | ||
740 | os=-newsos | ||
741 | ;; | ||
742 | necv70) | ||
743 | basic_machine=v70-nec | ||
744 | os=-sysv | ||
745 | ;; | ||
746 | next | m*-next ) | ||
747 | basic_machine=m68k-next | ||
748 | case $os in | ||
749 | -nextstep* ) | ||
750 | ;; | ||
751 | -ns2*) | ||
752 | os=-nextstep2 | ||
753 | ;; | ||
754 | *) | ||
755 | os=-nextstep3 | ||
756 | ;; | ||
757 | esac | ||
758 | ;; | ||
759 | nh3000) | ||
760 | basic_machine=m68k-harris | ||
761 | os=-cxux | ||
762 | ;; | ||
763 | nh[45]000) | ||
764 | basic_machine=m88k-harris | ||
765 | os=-cxux | ||
766 | ;; | ||
767 | nindy960) | ||
768 | basic_machine=i960-intel | ||
769 | os=-nindy | ||
770 | ;; | ||
771 | mon960) | ||
772 | basic_machine=i960-intel | ||
773 | os=-mon960 | ||
774 | ;; | ||
775 | nonstopux) | ||
776 | basic_machine=mips-compaq | ||
777 | os=-nonstopux | ||
778 | ;; | ||
779 | np1) | ||
780 | basic_machine=np1-gould | ||
781 | ;; | ||
782 | nsr-tandem) | ||
783 | basic_machine=nsr-tandem | ||
784 | ;; | ||
785 | op50n-* | op60c-*) | ||
786 | basic_machine=hppa1.1-oki | ||
787 | os=-proelf | ||
788 | ;; | ||
789 | openrisc | openrisc-*) | ||
790 | basic_machine=or32-unknown | ||
791 | ;; | ||
792 | os400) | ||
793 | basic_machine=powerpc-ibm | ||
794 | os=-os400 | ||
795 | ;; | ||
796 | OSE68000 | ose68000) | ||
797 | basic_machine=m68000-ericsson | ||
798 | os=-ose | ||
799 | ;; | ||
800 | os68k) | ||
801 | basic_machine=m68k-none | ||
802 | os=-os68k | ||
803 | ;; | ||
804 | pa-hitachi) | ||
805 | basic_machine=hppa1.1-hitachi | ||
806 | os=-hiuxwe2 | ||
807 | ;; | ||
808 | paragon) | ||
809 | basic_machine=i860-intel | ||
810 | os=-osf | ||
811 | ;; | ||
812 | pbd) | ||
813 | basic_machine=sparc-tti | ||
814 | ;; | ||
815 | pbb) | ||
816 | basic_machine=m68k-tti | ||
817 | ;; | ||
818 | pc532 | pc532-*) | ||
819 | basic_machine=ns32k-pc532 | ||
820 | ;; | ||
821 | pc98) | ||
822 | basic_machine=i386-pc | ||
823 | ;; | ||
824 | pc98-*) | ||
825 | basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
826 | ;; | ||
827 | pentium | p5 | k5 | k6 | nexgen | viac3) | ||
828 | basic_machine=i586-pc | ||
829 | ;; | ||
830 | pentiumpro | p6 | 6x86 | athlon | athlon_*) | ||
831 | basic_machine=i686-pc | ||
832 | ;; | ||
833 | pentiumii | pentium2 | pentiumiii | pentium3) | ||
834 | basic_machine=i686-pc | ||
835 | ;; | ||
836 | pentium4) | ||
837 | basic_machine=i786-pc | ||
838 | ;; | ||
839 | pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) | ||
840 | basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
841 | ;; | ||
842 | pentiumpro-* | p6-* | 6x86-* | athlon-*) | ||
843 | basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
844 | ;; | ||
845 | pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) | ||
846 | basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
847 | ;; | ||
848 | pentium4-*) | ||
849 | basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
850 | ;; | ||
851 | pn) | ||
852 | basic_machine=pn-gould | ||
853 | ;; | ||
854 | power) basic_machine=power-ibm | ||
855 | ;; | ||
856 | ppc) basic_machine=powerpc-unknown | ||
857 | ;; | ||
858 | ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
859 | ;; | ||
860 | ppcle | powerpclittle | ppc-le | powerpc-little) | ||
861 | basic_machine=powerpcle-unknown | ||
862 | ;; | ||
863 | ppcle-* | powerpclittle-*) | ||
864 | basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
865 | ;; | ||
866 | ppc64) basic_machine=powerpc64-unknown | ||
867 | ;; | ||
868 | ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
869 | ;; | ||
870 | ppc64le | powerpc64little | ppc64-le | powerpc64-little) | ||
871 | basic_machine=powerpc64le-unknown | ||
872 | ;; | ||
873 | ppc64le-* | powerpc64little-*) | ||
874 | basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` | ||
875 | ;; | ||
876 | ps2) | ||
877 | basic_machine=i386-ibm | ||
878 | ;; | ||
879 | pw32) | ||
880 | basic_machine=i586-unknown | ||
881 | os=-pw32 | ||
882 | ;; | ||
883 | rdos) | ||
884 | basic_machine=i386-pc | ||
885 | os=-rdos | ||
886 | ;; | ||
887 | rom68k) | ||
888 | basic_machine=m68k-rom68k | ||
889 | os=-coff | ||
890 | ;; | ||
891 | rm[46]00) | ||
892 | basic_machine=mips-siemens | ||
893 | ;; | ||
894 | rtpc | rtpc-*) | ||
895 | basic_machine=romp-ibm | ||
896 | ;; | ||
897 | s390 | s390-*) | ||
898 | basic_machine=s390-ibm | ||
899 | ;; | ||
900 | s390x | s390x-*) | ||
901 | basic_machine=s390x-ibm | ||
902 | ;; | ||
903 | sa29200) | ||
904 | basic_machine=a29k-amd | ||
905 | os=-udi | ||
906 | ;; | ||
907 | sb1) | ||
908 | basic_machine=mipsisa64sb1-unknown | ||
909 | ;; | ||
910 | sb1el) | ||
911 | basic_machine=mipsisa64sb1el-unknown | ||
912 | ;; | ||
913 | sde) | ||
914 | basic_machine=mipsisa32-sde | ||
915 | os=-elf | ||
916 | ;; | ||
917 | sei) | ||
918 | basic_machine=mips-sei | ||
919 | os=-seiux | ||
920 | ;; | ||
921 | sequent) | ||
922 | basic_machine=i386-sequent | ||
923 | ;; | ||
924 | sh) | ||
925 | basic_machine=sh-hitachi | ||
926 | os=-hms | ||
927 | ;; | ||
928 | sh64) | ||
929 | basic_machine=sh64-unknown | ||
930 | ;; | ||
931 | sparclite-wrs | simso-wrs) | ||
932 | basic_machine=sparclite-wrs | ||
933 | os=-vxworks | ||
934 | ;; | ||
935 | sps7) | ||
936 | basic_machine=m68k-bull | ||
937 | os=-sysv2 | ||
938 | ;; | ||
939 | spur) | ||
940 | basic_machine=spur-unknown | ||
941 | ;; | ||
942 | st2000) | ||
943 | basic_machine=m68k-tandem | ||
944 | ;; | ||
945 | stratus) | ||
946 | basic_machine=i860-stratus | ||
947 | os=-sysv4 | ||
948 | ;; | ||
949 | sun2) | ||
950 | basic_machine=m68000-sun | ||
951 | ;; | ||
952 | sun2os3) | ||
953 | basic_machine=m68000-sun | ||
954 | os=-sunos3 | ||
955 | ;; | ||
956 | sun2os4) | ||
957 | basic_machine=m68000-sun | ||
958 | os=-sunos4 | ||
959 | ;; | ||
960 | sun3os3) | ||
961 | basic_machine=m68k-sun | ||
962 | os=-sunos3 | ||
963 | ;; | ||
964 | sun3os4) | ||
965 | basic_machine=m68k-sun | ||
966 | os=-sunos4 | ||
967 | ;; | ||
968 | sun4os3) | ||
969 | basic_machine=sparc-sun | ||
970 | os=-sunos3 | ||
971 | ;; | ||
972 | sun4os4) | ||
973 | basic_machine=sparc-sun | ||
974 | os=-sunos4 | ||
975 | ;; | ||
976 | sun4sol2) | ||
977 | basic_machine=sparc-sun | ||
978 | os=-solaris2 | ||
979 | ;; | ||
980 | sun3 | sun3-*) | ||
981 | basic_machine=m68k-sun | ||
982 | ;; | ||
983 | sun4) | ||
984 | basic_machine=sparc-sun | ||
985 | ;; | ||
986 | sun386 | sun386i | roadrunner) | ||
987 | basic_machine=i386-sun | ||
988 | ;; | ||
989 | sv1) | ||
990 | basic_machine=sv1-cray | ||
991 | os=-unicos | ||
992 | ;; | ||
993 | symmetry) | ||
994 | basic_machine=i386-sequent | ||
995 | os=-dynix | ||
996 | ;; | ||
997 | t3e) | ||
998 | basic_machine=alphaev5-cray | ||
999 | os=-unicos | ||
1000 | ;; | ||
1001 | t90) | ||
1002 | basic_machine=t90-cray | ||
1003 | os=-unicos | ||
1004 | ;; | ||
1005 | tic54x | c54x*) | ||
1006 | basic_machine=tic54x-unknown | ||
1007 | os=-coff | ||
1008 | ;; | ||
1009 | tic55x | c55x*) | ||
1010 | basic_machine=tic55x-unknown | ||
1011 | os=-coff | ||
1012 | ;; | ||
1013 | tic6x | c6x*) | ||
1014 | basic_machine=tic6x-unknown | ||
1015 | os=-coff | ||
1016 | ;; | ||
1017 | tx39) | ||
1018 | basic_machine=mipstx39-unknown | ||
1019 | ;; | ||
1020 | tx39el) | ||
1021 | basic_machine=mipstx39el-unknown | ||
1022 | ;; | ||
1023 | toad1) | ||
1024 | basic_machine=pdp10-xkl | ||
1025 | os=-tops20 | ||
1026 | ;; | ||
1027 | tower | tower-32) | ||
1028 | basic_machine=m68k-ncr | ||
1029 | ;; | ||
1030 | tpf) | ||
1031 | basic_machine=s390x-ibm | ||
1032 | os=-tpf | ||
1033 | ;; | ||
1034 | udi29k) | ||
1035 | basic_machine=a29k-amd | ||
1036 | os=-udi | ||
1037 | ;; | ||
1038 | ultra3) | ||
1039 | basic_machine=a29k-nyu | ||
1040 | os=-sym1 | ||
1041 | ;; | ||
1042 | v810 | necv810) | ||
1043 | basic_machine=v810-nec | ||
1044 | os=-none | ||
1045 | ;; | ||
1046 | vaxv) | ||
1047 | basic_machine=vax-dec | ||
1048 | os=-sysv | ||
1049 | ;; | ||
1050 | vms) | ||
1051 | basic_machine=vax-dec | ||
1052 | os=-vms | ||
1053 | ;; | ||
1054 | vpp*|vx|vx-*) | ||
1055 | basic_machine=f301-fujitsu | ||
1056 | ;; | ||
1057 | vxworks960) | ||
1058 | basic_machine=i960-wrs | ||
1059 | os=-vxworks | ||
1060 | ;; | ||
1061 | vxworks68) | ||
1062 | basic_machine=m68k-wrs | ||
1063 | os=-vxworks | ||
1064 | ;; | ||
1065 | vxworks29k) | ||
1066 | basic_machine=a29k-wrs | ||
1067 | os=-vxworks | ||
1068 | ;; | ||
1069 | w65*) | ||
1070 | basic_machine=w65-wdc | ||
1071 | os=-none | ||
1072 | ;; | ||
1073 | w89k-*) | ||
1074 | basic_machine=hppa1.1-winbond | ||
1075 | os=-proelf | ||
1076 | ;; | ||
1077 | xbox) | ||
1078 | basic_machine=i686-pc | ||
1079 | os=-mingw32 | ||
1080 | ;; | ||
1081 | xps | xps100) | ||
1082 | basic_machine=xps100-honeywell | ||
1083 | ;; | ||
1084 | ymp) | ||
1085 | basic_machine=ymp-cray | ||
1086 | os=-unicos | ||
1087 | ;; | ||
1088 | z8k-*-coff) | ||
1089 | basic_machine=z8k-unknown | ||
1090 | os=-sim | ||
1091 | ;; | ||
1092 | none) | ||
1093 | basic_machine=none-none | ||
1094 | os=-none | ||
1095 | ;; | ||
1096 | |||
1097 | # Here we handle the default manufacturer of certain CPU types. It is in | ||
1098 | # some cases the only manufacturer, in others, it is the most popular. | ||
1099 | w89k) | ||
1100 | basic_machine=hppa1.1-winbond | ||
1101 | ;; | ||
1102 | op50n) | ||
1103 | basic_machine=hppa1.1-oki | ||
1104 | ;; | ||
1105 | op60c) | ||
1106 | basic_machine=hppa1.1-oki | ||
1107 | ;; | ||
1108 | romp) | ||
1109 | basic_machine=romp-ibm | ||
1110 | ;; | ||
1111 | mmix) | ||
1112 | basic_machine=mmix-knuth | ||
1113 | ;; | ||
1114 | rs6000) | ||
1115 | basic_machine=rs6000-ibm | ||
1116 | ;; | ||
1117 | vax) | ||
1118 | basic_machine=vax-dec | ||
1119 | ;; | ||
1120 | pdp10) | ||
1121 | # there are many clones, so DEC is not a safe bet | ||
1122 | basic_machine=pdp10-unknown | ||
1123 | ;; | ||
1124 | pdp11) | ||
1125 | basic_machine=pdp11-dec | ||
1126 | ;; | ||
1127 | we32k) | ||
1128 | basic_machine=we32k-att | ||
1129 | ;; | ||
1130 | sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) | ||
1131 | basic_machine=sh-unknown | ||
1132 | ;; | ||
1133 | sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) | ||
1134 | basic_machine=sparc-sun | ||
1135 | ;; | ||
1136 | cydra) | ||
1137 | basic_machine=cydra-cydrome | ||
1138 | ;; | ||
1139 | orion) | ||
1140 | basic_machine=orion-highlevel | ||
1141 | ;; | ||
1142 | orion105) | ||
1143 | basic_machine=clipper-highlevel | ||
1144 | ;; | ||
1145 | mac | mpw | mac-mpw) | ||
1146 | basic_machine=m68k-apple | ||
1147 | ;; | ||
1148 | pmac | pmac-mpw) | ||
1149 | basic_machine=powerpc-apple | ||
1150 | ;; | ||
1151 | *-unknown) | ||
1152 | # Make sure to match an already-canonicalized machine name. | ||
1153 | ;; | ||
1154 | *) | ||
1155 | echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 | ||
1156 | exit 1 | ||
1157 | ;; | ||
1158 | esac | ||
1159 | |||
1160 | # Here we canonicalize certain aliases for manufacturers. | ||
1161 | case $basic_machine in | ||
1162 | *-digital*) | ||
1163 | basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` | ||
1164 | ;; | ||
1165 | *-commodore*) | ||
1166 | basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` | ||
1167 | ;; | ||
1168 | *) | ||
1169 | ;; | ||
1170 | esac | ||
1171 | |||
1172 | # Decode manufacturer-specific aliases for certain operating systems. | ||
1173 | |||
1174 | if [ x"$os" != x"" ] | ||
1175 | then | ||
1176 | case $os in | ||
1177 | # First match some system type aliases | ||
1178 | # that might get confused with valid system types. | ||
1179 | # -solaris* is a basic system type, with this one exception. | ||
1180 | -solaris1 | -solaris1.*) | ||
1181 | os=`echo $os | sed -e 's|solaris1|sunos4|'` | ||
1182 | ;; | ||
1183 | -solaris) | ||
1184 | os=-solaris2 | ||
1185 | ;; | ||
1186 | -svr4*) | ||
1187 | os=-sysv4 | ||
1188 | ;; | ||
1189 | -unixware*) | ||
1190 | os=-sysv4.2uw | ||
1191 | ;; | ||
1192 | -gnu/linux*) | ||
1193 | os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` | ||
1194 | ;; | ||
1195 | # First accept the basic system types. | ||
1196 | # The portable systems comes first. | ||
1197 | # Each alternative MUST END IN A *, to match a version number. | ||
1198 | # -sysv* is not here because it comes later, after sysvr4. | ||
1199 | -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | ||
1200 | | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | ||
1201 | | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | ||
1202 | | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | ||
1203 | | -aos* \ | ||
1204 | | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | ||
1205 | | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | ||
1206 | | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | ||
1207 | | -openbsd* | -solidbsd* \ | ||
1208 | | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | ||
1209 | | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | ||
1210 | | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | ||
1211 | | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | ||
1212 | | -chorusos* | -chorusrdb* \ | ||
1213 | | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | ||
1214 | | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | ||
1215 | | -uxpv* | -beos* | -mpeix* | -udk* \ | ||
1216 | | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | ||
1217 | | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | ||
1218 | | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | ||
1219 | | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | ||
1220 | | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | ||
1221 | | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | ||
1222 | | -skyos* | -haiku* | -rdos* | -toppers*) | ||
1223 | # Remember, each alternative MUST END IN *, to match a version number. | ||
1224 | ;; | ||
1225 | -qnx*) | ||
1226 | case $basic_machine in | ||
1227 | x86-* | i*86-*) | ||
1228 | ;; | ||
1229 | *) | ||
1230 | os=-nto$os | ||
1231 | ;; | ||
1232 | esac | ||
1233 | ;; | ||
1234 | -nto-qnx*) | ||
1235 | ;; | ||
1236 | -nto*) | ||
1237 | os=`echo $os | sed -e 's|nto|nto-qnx|'` | ||
1238 | ;; | ||
1239 | -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | ||
1240 | | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | ||
1241 | | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) | ||
1242 | ;; | ||
1243 | -mac*) | ||
1244 | os=`echo $os | sed -e 's|mac|macos|'` | ||
1245 | ;; | ||
1246 | -linux-dietlibc) | ||
1247 | os=-linux-dietlibc | ||
1248 | ;; | ||
1249 | -linux*) | ||
1250 | os=`echo $os | sed -e 's|linux|linux-gnu|'` | ||
1251 | ;; | ||
1252 | -sunos5*) | ||
1253 | os=`echo $os | sed -e 's|sunos5|solaris2|'` | ||
1254 | ;; | ||
1255 | -sunos6*) | ||
1256 | os=`echo $os | sed -e 's|sunos6|solaris3|'` | ||
1257 | ;; | ||
1258 | -opened*) | ||
1259 | os=-openedition | ||
1260 | ;; | ||
1261 | -os400*) | ||
1262 | os=-os400 | ||
1263 | ;; | ||
1264 | -wince*) | ||
1265 | os=-wince | ||
1266 | ;; | ||
1267 | -osfrose*) | ||
1268 | os=-osfrose | ||
1269 | ;; | ||
1270 | -osf*) | ||
1271 | os=-osf | ||
1272 | ;; | ||
1273 | -utek*) | ||
1274 | os=-bsd | ||
1275 | ;; | ||
1276 | -dynix*) | ||
1277 | os=-bsd | ||
1278 | ;; | ||
1279 | -acis*) | ||
1280 | os=-aos | ||
1281 | ;; | ||
1282 | -atheos*) | ||
1283 | os=-atheos | ||
1284 | ;; | ||
1285 | -syllable*) | ||
1286 | os=-syllable | ||
1287 | ;; | ||
1288 | -386bsd) | ||
1289 | os=-bsd | ||
1290 | ;; | ||
1291 | -ctix* | -uts*) | ||
1292 | os=-sysv | ||
1293 | ;; | ||
1294 | -nova*) | ||
1295 | os=-rtmk-nova | ||
1296 | ;; | ||
1297 | -ns2 ) | ||
1298 | os=-nextstep2 | ||
1299 | ;; | ||
1300 | -nsk*) | ||
1301 | os=-nsk | ||
1302 | ;; | ||
1303 | # Preserve the version number of sinix5. | ||
1304 | -sinix5.*) | ||
1305 | os=`echo $os | sed -e 's|sinix|sysv|'` | ||
1306 | ;; | ||
1307 | -sinix*) | ||
1308 | os=-sysv4 | ||
1309 | ;; | ||
1310 | -tpf*) | ||
1311 | os=-tpf | ||
1312 | ;; | ||
1313 | -triton*) | ||
1314 | os=-sysv3 | ||
1315 | ;; | ||
1316 | -oss*) | ||
1317 | os=-sysv3 | ||
1318 | ;; | ||
1319 | -svr4) | ||
1320 | os=-sysv4 | ||
1321 | ;; | ||
1322 | -svr3) | ||
1323 | os=-sysv3 | ||
1324 | ;; | ||
1325 | -sysvr4) | ||
1326 | os=-sysv4 | ||
1327 | ;; | ||
1328 | # This must come after -sysvr4. | ||
1329 | -sysv*) | ||
1330 | ;; | ||
1331 | -ose*) | ||
1332 | os=-ose | ||
1333 | ;; | ||
1334 | -es1800*) | ||
1335 | os=-ose | ||
1336 | ;; | ||
1337 | -xenix) | ||
1338 | os=-xenix | ||
1339 | ;; | ||
1340 | -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | ||
1341 | os=-mint | ||
1342 | ;; | ||
1343 | -aros*) | ||
1344 | os=-aros | ||
1345 | ;; | ||
1346 | -kaos*) | ||
1347 | os=-kaos | ||
1348 | ;; | ||
1349 | -zvmoe) | ||
1350 | os=-zvmoe | ||
1351 | ;; | ||
1352 | -none) | ||
1353 | ;; | ||
1354 | *) | ||
1355 | # Get rid of the `-' at the beginning of $os. | ||
1356 | os=`echo $os | sed 's/[^-]*-//'` | ||
1357 | echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 | ||
1358 | exit 1 | ||
1359 | ;; | ||
1360 | esac | ||
1361 | else | ||
1362 | |||
1363 | # Here we handle the default operating systems that come with various machines. | ||
1364 | # The value should be what the vendor currently ships out the door with their | ||
1365 | # machine or put another way, the most popular os provided with the machine. | ||
1366 | |||
1367 | # Note that if you're going to try to match "-MANUFACTURER" here (say, | ||
1368 | # "-sun"), then you have to tell the case statement up towards the top | ||
1369 | # that MANUFACTURER isn't an operating system. Otherwise, code above | ||
1370 | # will signal an error saying that MANUFACTURER isn't an operating | ||
1371 | # system, and we'll never get to this point. | ||
1372 | |||
1373 | case $basic_machine in | ||
1374 | score-*) | ||
1375 | os=-elf | ||
1376 | ;; | ||
1377 | spu-*) | ||
1378 | os=-elf | ||
1379 | ;; | ||
1380 | *-acorn) | ||
1381 | os=-riscix1.2 | ||
1382 | ;; | ||
1383 | arm*-rebel) | ||
1384 | os=-linux | ||
1385 | ;; | ||
1386 | arm*-semi) | ||
1387 | os=-aout | ||
1388 | ;; | ||
1389 | c4x-* | tic4x-*) | ||
1390 | os=-coff | ||
1391 | ;; | ||
1392 | # This must come before the *-dec entry. | ||
1393 | pdp10-*) | ||
1394 | os=-tops20 | ||
1395 | ;; | ||
1396 | pdp11-*) | ||
1397 | os=-none | ||
1398 | ;; | ||
1399 | *-dec | vax-*) | ||
1400 | os=-ultrix4.2 | ||
1401 | ;; | ||
1402 | m68*-apollo) | ||
1403 | os=-domain | ||
1404 | ;; | ||
1405 | i386-sun) | ||
1406 | os=-sunos4.0.2 | ||
1407 | ;; | ||
1408 | m68000-sun) | ||
1409 | os=-sunos3 | ||
1410 | # This also exists in the configure program, but was not the | ||
1411 | # default. | ||
1412 | # os=-sunos4 | ||
1413 | ;; | ||
1414 | m68*-cisco) | ||
1415 | os=-aout | ||
1416 | ;; | ||
1417 | mips*-cisco) | ||
1418 | os=-elf | ||
1419 | ;; | ||
1420 | mips*-*) | ||
1421 | os=-elf | ||
1422 | ;; | ||
1423 | or32-*) | ||
1424 | os=-coff | ||
1425 | ;; | ||
1426 | *-tti) # must be before sparc entry or we get the wrong os. | ||
1427 | os=-sysv3 | ||
1428 | ;; | ||
1429 | sparc-* | *-sun) | ||
1430 | os=-sunos4.1.1 | ||
1431 | ;; | ||
1432 | *-be) | ||
1433 | os=-beos | ||
1434 | ;; | ||
1435 | *-haiku) | ||
1436 | os=-haiku | ||
1437 | ;; | ||
1438 | *-ibm) | ||
1439 | os=-aix | ||
1440 | ;; | ||
1441 | *-knuth) | ||
1442 | os=-mmixware | ||
1443 | ;; | ||
1444 | *-wec) | ||
1445 | os=-proelf | ||
1446 | ;; | ||
1447 | *-winbond) | ||
1448 | os=-proelf | ||
1449 | ;; | ||
1450 | *-oki) | ||
1451 | os=-proelf | ||
1452 | ;; | ||
1453 | *-hp) | ||
1454 | os=-hpux | ||
1455 | ;; | ||
1456 | *-hitachi) | ||
1457 | os=-hiux | ||
1458 | ;; | ||
1459 | i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) | ||
1460 | os=-sysv | ||
1461 | ;; | ||
1462 | *-cbm) | ||
1463 | os=-amigaos | ||
1464 | ;; | ||
1465 | *-dg) | ||
1466 | os=-dgux | ||
1467 | ;; | ||
1468 | *-dolphin) | ||
1469 | os=-sysv3 | ||
1470 | ;; | ||
1471 | m68k-ccur) | ||
1472 | os=-rtu | ||
1473 | ;; | ||
1474 | m88k-omron*) | ||
1475 | os=-luna | ||
1476 | ;; | ||
1477 | *-next ) | ||
1478 | os=-nextstep | ||
1479 | ;; | ||
1480 | *-sequent) | ||
1481 | os=-ptx | ||
1482 | ;; | ||
1483 | *-crds) | ||
1484 | os=-unos | ||
1485 | ;; | ||
1486 | *-ns) | ||
1487 | os=-genix | ||
1488 | ;; | ||
1489 | i370-*) | ||
1490 | os=-mvs | ||
1491 | ;; | ||
1492 | *-next) | ||
1493 | os=-nextstep3 | ||
1494 | ;; | ||
1495 | *-gould) | ||
1496 | os=-sysv | ||
1497 | ;; | ||
1498 | *-highlevel) | ||
1499 | os=-bsd | ||
1500 | ;; | ||
1501 | *-encore) | ||
1502 | os=-bsd | ||
1503 | ;; | ||
1504 | *-sgi) | ||
1505 | os=-irix | ||
1506 | ;; | ||
1507 | *-siemens) | ||
1508 | os=-sysv4 | ||
1509 | ;; | ||
1510 | *-masscomp) | ||
1511 | os=-rtu | ||
1512 | ;; | ||
1513 | f30[01]-fujitsu | f700-fujitsu) | ||
1514 | os=-uxpv | ||
1515 | ;; | ||
1516 | *-rom68k) | ||
1517 | os=-coff | ||
1518 | ;; | ||
1519 | *-*bug) | ||
1520 | os=-coff | ||
1521 | ;; | ||
1522 | *-apple) | ||
1523 | os=-macos | ||
1524 | ;; | ||
1525 | *-atari*) | ||
1526 | os=-mint | ||
1527 | ;; | ||
1528 | *) | ||
1529 | os=-none | ||
1530 | ;; | ||
1531 | esac | ||
1532 | fi | ||
1533 | |||
1534 | # Here we handle the case where we know the os, and the CPU type, but not the | ||
1535 | # manufacturer. We pick the logical manufacturer. | ||
1536 | vendor=unknown | ||
1537 | case $basic_machine in | ||
1538 | *-unknown) | ||
1539 | case $os in | ||
1540 | -riscix*) | ||
1541 | vendor=acorn | ||
1542 | ;; | ||
1543 | -sunos*) | ||
1544 | vendor=sun | ||
1545 | ;; | ||
1546 | -aix*) | ||
1547 | vendor=ibm | ||
1548 | ;; | ||
1549 | -beos*) | ||
1550 | vendor=be | ||
1551 | ;; | ||
1552 | -hpux*) | ||
1553 | vendor=hp | ||
1554 | ;; | ||
1555 | -mpeix*) | ||
1556 | vendor=hp | ||
1557 | ;; | ||
1558 | -hiux*) | ||
1559 | vendor=hitachi | ||
1560 | ;; | ||
1561 | -unos*) | ||
1562 | vendor=crds | ||
1563 | ;; | ||
1564 | -dgux*) | ||
1565 | vendor=dg | ||
1566 | ;; | ||
1567 | -luna*) | ||
1568 | vendor=omron | ||
1569 | ;; | ||
1570 | -genix*) | ||
1571 | vendor=ns | ||
1572 | ;; | ||
1573 | -mvs* | -opened*) | ||
1574 | vendor=ibm | ||
1575 | ;; | ||
1576 | -os400*) | ||
1577 | vendor=ibm | ||
1578 | ;; | ||
1579 | -ptx*) | ||
1580 | vendor=sequent | ||
1581 | ;; | ||
1582 | -tpf*) | ||
1583 | vendor=ibm | ||
1584 | ;; | ||
1585 | -vxsim* | -vxworks* | -windiss*) | ||
1586 | vendor=wrs | ||
1587 | ;; | ||
1588 | -aux*) | ||
1589 | vendor=apple | ||
1590 | ;; | ||
1591 | -hms*) | ||
1592 | vendor=hitachi | ||
1593 | ;; | ||
1594 | -mpw* | -macos*) | ||
1595 | vendor=apple | ||
1596 | ;; | ||
1597 | -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | ||
1598 | vendor=atari | ||
1599 | ;; | ||
1600 | -vos*) | ||
1601 | vendor=stratus | ||
1602 | ;; | ||
1603 | esac | ||
1604 | basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` | ||
1605 | ;; | ||
1606 | esac | ||
1607 | |||
1608 | echo $basic_machine$os | ||
1609 | exit | ||
1610 | |||
1611 | # Local variables: | ||
1612 | # eval: (add-hook 'write-file-hooks 'time-stamp) | ||
1613 | # time-stamp-start: "timestamp='" | ||
1614 | # time-stamp-format: "%:y-%02m-%02d" | ||
1615 | # time-stamp-end: "'" | ||
1616 | # End: |
The diff for file configure is too big (6738 changes) and cannot be shown. |
File configure.ac added (mode: 100644) (index 00000000..cf87496d) | |||
1 | dnl $Id: configure.ac,v 1.35 2008/07/21 12:19:21 wmcbrine Exp $ | ||
2 | dnl Process this file with autoconf to produce a configure script. | ||
3 | |||
4 | AC_INIT([PDCurses], [3.4], [wmcbrine@users.sf.net], [PDCurses]) | ||
5 | AC_CONFIG_SRCDIR([curspriv.h]) | ||
6 | |||
7 | AC_SUBST(prefix) | ||
8 | |||
9 | AC_PROG_CC | ||
10 | |||
11 | AC_CONFIG_HEADER(config.h) | ||
12 | dnl Checks for system first | ||
13 | AC_CANONICAL_SYSTEM([]) | ||
14 | |||
15 | mymakefile="Makefile" | ||
16 | on_qnx=no | ||
17 | case "$target" in | ||
18 | *hp-hpux*) | ||
19 | SYS_DEFS="-D_HPUX_SOURCE" | ||
20 | ;; | ||
21 | *ibm-aix*) | ||
22 | SYS_DEFS="-D_ALL_SOURCE" | ||
23 | mymakefile="Makefile.aix" | ||
24 | ;; | ||
25 | *dec-osf*) | ||
26 | SYS_DEFS="-D_XOPEN_SOURCE_EXTENDED" | ||
27 | ;; | ||
28 | *pc-sco*) | ||
29 | SYS_DEFS="-UM_XENIX -b elf" | ||
30 | ;; | ||
31 | *qnx*) | ||
32 | on_qnx=yes | ||
33 | SYS_DEFS="-Q" | ||
34 | ;; | ||
35 | *) | ||
36 | ;; | ||
37 | esac | ||
38 | AC_SUBST(SYS_DEFS) | ||
39 | |||
40 | MH_CHECK_MAX_SIGNALS(NSIG __sys_nsig) | ||
41 | |||
42 | dnl Check for other programs. | ||
43 | AC_PROG_RANLIB | ||
44 | AC_PROG_INSTALL | ||
45 | AC_PROG_MAKE_SET | ||
46 | |||
47 | dnl ensure that the system has System V IPC support | ||
48 | MH_IPC | ||
49 | |||
50 | if test $ac_cv_header_stdc != yes; then | ||
51 | AC_MSG_ERROR([Need ANSI C headers]) | ||
52 | fi | ||
53 | |||
54 | dnl Checks for libraries. | ||
55 | |||
56 | AC_CHECK_HEADERS(fcntl.h \ | ||
57 | sys/time.h \ | ||
58 | sys/select.h \ | ||
59 | dlfcn.h \ | ||
60 | dl.h | ||
61 | ) | ||
62 | |||
63 | dnl Checks for typedefs, structures, and compiler characteristics. | ||
64 | AC_HEADER_TIME | ||
65 | MH_CHECK_LIB(socket nls) | ||
66 | AC_SUBST(MH_EXTRA_LIBS) | ||
67 | MH_CHECK_CC_O | ||
68 | |||
69 | dnl Checks for library functions. | ||
70 | AC_TYPE_SIGNAL | ||
71 | AC_CHECK_FUNCS(vsscanf usleep poll vsnprintf) | ||
72 | |||
73 | dnl Check for X includes and X libraries | ||
74 | AC_PATH_X | ||
75 | MH_CHECK_X_INC | ||
76 | MH_CHECK_X_LIB | ||
77 | MH_CHECK_X_HEADERS(DECkeysym.h Sunkeysym.h xpm.h) | ||
78 | MH_CHECK_X_KEYDEFS(XK_KP_Delete XK_KP_Insert XK_KP_End XK_KP_Down XK_KP_Next \ | ||
79 | XK_KP_Left XK_KP_Right XK_KP_Home XK_KP_Up XK_KP_Prior XK_KP_Begin) | ||
80 | MH_CHECK_X_TYPEDEF(XPointer) | ||
81 | dnl | ||
82 | dnl extra for xpm library | ||
83 | if test $ac_cv_header_xpm_h = yes; then | ||
84 | MH_XLIBS="$MH_XLIBS -lXpm" | ||
85 | fi | ||
86 | dnl ---------- allow --enable-debug to compile in debug mode --------- | ||
87 | AC_ARG_ENABLE(debug, | ||
88 | [ --enable-debug turn on debugging], | ||
89 | [with_debug=$enableval], | ||
90 | [with_debug=no], | ||
91 | ) | ||
92 | cflags_g="`echo $CFLAGS | grep -c '\-g'`" | ||
93 | cflags_O="`echo $CFLAGS | grep -c '\-O'`" | ||
94 | |||
95 | if test "$with_debug" = yes; then | ||
96 | if test "$cflags_g" = "0"; then | ||
97 | CFLAGS="${CFLAGS} -g" | ||
98 | fi | ||
99 | if test "$cflags_O" != "0"; then | ||
100 | CFLAGS="`echo ${CFLAGS} | sed -e s/-O.//`" | ||
101 | fi | ||
102 | CFLAGS="${CFLAGS} -DPDCDEBUG" | ||
103 | else | ||
104 | if test "$cflags_O" = "0"; then | ||
105 | CFLAGS="${CFLAGS} -O" | ||
106 | fi | ||
107 | if test "$cflags_g" != "0"; then | ||
108 | CFLAGS="`echo ${CFLAGS} | sed -e s/-g//`" | ||
109 | fi | ||
110 | fi | ||
111 | if test "$ac_cv_prog_CC" = "gcc"; then | ||
112 | if test "$with_debug" = yes; then | ||
113 | CFLAGS="${CFLAGS} -Wall" | ||
114 | else | ||
115 | CFLAGS="-O2 -Wall -fomit-frame-pointer" | ||
116 | fi | ||
117 | fi | ||
118 | if test "$on_qnx" = yes; then | ||
119 | if test "$with_debug" = yes; then | ||
120 | CFLAGS="-g" | ||
121 | else | ||
122 | CFLAGS="-Otax" | ||
123 | fi | ||
124 | fi | ||
125 | |||
126 | dnl --------------- check for wide character support ----------------- | ||
127 | dnl allow --enable-widec to include wide character support | ||
128 | AC_ARG_ENABLE(widec, | ||
129 | [ --enable-widec include support for wide characters], | ||
130 | [with_widec=$enableval], | ||
131 | [with_widec=no], | ||
132 | ) | ||
133 | if test "$with_widec" = yes; then | ||
134 | SYS_DEFS="$SYS_DEFS -DPDC_WIDE" | ||
135 | fi | ||
136 | |||
137 | dnl -------------------- check for XIM support ----------------------- | ||
138 | dnl allow --enable-xim to include XIM support | ||
139 | AC_ARG_ENABLE(xim, | ||
140 | [ --enable-xim include support for XIM], | ||
141 | [with_xim=$enableval], | ||
142 | [with_xim=no], | ||
143 | ) | ||
144 | if test "$with_xim" = yes; then | ||
145 | SYS_DEFS="$SYS_DEFS -DPDC_XIM" | ||
146 | fi | ||
147 | |||
148 | dnl ------------------------ force UTF-8? ---------------------------- | ||
149 | dnl allow --enable-force-utf8 to override locale settings | ||
150 | AC_ARG_ENABLE(force-utf8, | ||
151 | [ --enable-force-utf8 override locale settings; use UTF-8], | ||
152 | [force_utf8=$enableval], | ||
153 | [force_utf8=no], | ||
154 | ) | ||
155 | if test "$force_utf8" = yes; then | ||
156 | SYS_DEFS="$SYS_DEFS -DPDC_FORCE_UTF8" | ||
157 | fi | ||
158 | |||
159 | dnl ----------------- check for Purify support ----------------------- | ||
160 | dnl allow --enable-purify to enable linking with Purify | ||
161 | AC_ARG_ENABLE(purify, | ||
162 | [ --enable-purify link with Purify (TM)], | ||
163 | [with_purify=$enableval], | ||
164 | [with_purify=no], | ||
165 | ) | ||
166 | if test "$with_purify" = yes; then | ||
167 | PURIFY="purify" | ||
168 | else | ||
169 | PURIFY="" | ||
170 | fi | ||
171 | AC_SUBST(PURIFY) | ||
172 | |||
173 | dnl --------------------- check for Xaw3d library -------------------- | ||
174 | dnl allow --with-xaw3d to link with PDCurses | ||
175 | AC_ARG_WITH(xaw3d, | ||
176 | [ --with-xaw3d link with Xaw3d], | ||
177 | [with_xaw3d=$withval], | ||
178 | [with_xaw3d=no], | ||
179 | ) | ||
180 | if test "$with_xaw3d" = yes; then | ||
181 | AC_DEFINE([USE_XAW3D], [1], | ||
182 | [Define if you want to use Xaw3d library] | ||
183 | ) | ||
184 | fi | ||
185 | |||
186 | dnl --------------------- check for neXtaw library ------------------- | ||
187 | dnl allow --with-nextaw to link with PDCurses | ||
188 | AC_ARG_WITH(nextaw, | ||
189 | [ --with-nextaw link with neXtaw], | ||
190 | [with_nextaw=$withval], | ||
191 | [with_nextaw=no], | ||
192 | ) | ||
193 | if test "$with_nextaw" = yes; then | ||
194 | AC_DEFINE([USE_NEXTAW], [1], | ||
195 | [Define if you want to use neXtaw library] | ||
196 | ) | ||
197 | fi | ||
198 | |||
199 | dnl -------------- check how to make shared libraries ---------------- | ||
200 | dnl Force the ability of shared library usage | ||
201 | MH_SHARED_LIBRARY(XCurses) | ||
202 | |||
203 | AC_CONFIG_FILES([Makefile x11/$mymakefile x11/xcurses-config]) | ||
204 | AC_OUTPUT | ||
205 | |||
206 | case "$target" in | ||
207 | *ibm-aix*) | ||
208 | mv x11/Makefile.aix x11/Makefile | ||
209 | AC_MSG_RESULT(renaming x11/Makefile.aix to x11/Makefile) | ||
210 | ;; | ||
211 | *) | ||
212 | ;; | ||
213 | esac | ||
214 | |||
215 | AC_DEFINE([PDC_MAX_SIGNALS], [], | ||
216 | [Define as the system defined limit for number of signals] | ||
217 | ) | ||
218 | |||
219 | AC_DEFINE([HAVE_DECKEYSYM_H], [], | ||
220 | [Define if you have the <DECkeySym.h> header file] | ||
221 | ) | ||
222 | |||
223 | AC_DEFINE([HAVE_SUNKEYSYM_H], [], | ||
224 | [Define if you have the <Sunkeysym.h> header file] | ||
225 | ) | ||
226 | |||
227 | AC_DEFINE([HAVE_XPM_H], [], | ||
228 | [Define if you have the <xpm.h> header file] | ||
229 | ) | ||
230 | |||
231 | AC_DEFINE([HAVE_XK_KP_DELETE], [], | ||
232 | [Define if you have this defined in <keysym.h>] | ||
233 | ) | ||
234 | |||
235 | AC_DEFINE([HAVE_XK_KP_INSERT], [], | ||
236 | [Define if you have this defined in <keysym.h>] | ||
237 | ) | ||
238 | |||
239 | AC_DEFINE([HAVE_XK_KP_END], [], | ||
240 | [Define if you have this defined in <keysym.h>] | ||
241 | ) | ||
242 | |||
243 | AC_DEFINE([HAVE_XK_KP_DOWN], [], | ||
244 | [Define if you have this defined in <keysym.h>] | ||
245 | ) | ||
246 | |||
247 | AC_DEFINE([HAVE_XK_KP_NEXT], [], | ||
248 | [Define if you have this defined in <keysym.h>] | ||
249 | ) | ||
250 | |||
251 | AC_DEFINE([HAVE_XK_KP_LEFT], [], | ||
252 | [Define if you have this defined in <keysym.h>] | ||
253 | ) | ||
254 | |||
255 | AC_DEFINE([HAVE_XK_KP_RIGHT], [], | ||
256 | [Define if you have this defined in <keysym.h>] | ||
257 | ) | ||
258 | |||
259 | AC_DEFINE([HAVE_XK_KP_HOME], [], | ||
260 | [Define if you have this defined in <keysym.h>] | ||
261 | ) | ||
262 | |||
263 | AC_DEFINE([HAVE_XK_KP_UP], [], | ||
264 | [Define if you have this defined in <keysym.h>] | ||
265 | ) | ||
266 | |||
267 | AC_DEFINE([HAVE_XK_KP_PRIOR], [], | ||
268 | [Define if you have this defined in <keysym.h>] | ||
269 | ) | ||
270 | |||
271 | AC_DEFINE([HAVE_XK_KP_BEGIN], [], | ||
272 | [Define if you have this defined in <keysym.h>] | ||
273 | ) | ||
274 | |||
275 | AC_DEFINE([USE_XAW3D], [], | ||
276 | [Define if you want to use Xaw3d library] | ||
277 | ) | ||
278 | |||
279 | AC_DEFINE([USE_NEXTAW], [], | ||
280 | [Define if you want to use neXtaw library] | ||
281 | ) | ||
282 | |||
283 | AC_DEFINE([XPOINTER_TYPEDEFED], [], | ||
284 | [Define XPointer is typedefed in X11/Xlib.h] | ||
285 | ) |
File curses.h added (mode: 100644) (index 00000000..6f3ce19d) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: curses.h,v 1.295 2008/07/15 17:13:25 wmcbrine Exp $ */ | ||
4 | |||
5 | /*----------------------------------------------------------------------* | ||
6 | * PDCurses * | ||
7 | *----------------------------------------------------------------------*/ | ||
8 | |||
9 | #ifndef __PDCURSES__ | ||
10 | #define __PDCURSES__ 1 | ||
11 | |||
12 | /*man-start************************************************************** | ||
13 | |||
14 | PDCurses definitions list: (Only define those needed) | ||
15 | |||
16 | XCURSES True if compiling for X11. | ||
17 | PDC_RGB True if you want to use RGB color definitions | ||
18 | (Red = 1, Green = 2, Blue = 4) instead of BGR. | ||
19 | PDC_WIDE True if building wide-character support. | ||
20 | PDC_DLL_BUILD True if building a Win32 DLL. | ||
21 | NCURSES_MOUSE_VERSION Use the ncurses mouse API instead | ||
22 | of PDCurses' traditional mouse API. | ||
23 | |||
24 | PDCurses portable platform definitions list: | ||
25 | |||
26 | PDC_BUILD Defines API build version. | ||
27 | PDCURSES Enables access to PDCurses-only routines. | ||
28 | XOPEN Always true. | ||
29 | SYSVcurses True if you are compiling for SYSV portability. | ||
30 | BSDcurses True if you are compiling for BSD portability. | ||
31 | |||
32 | **man-end****************************************************************/ | ||
33 | |||
34 | #define PDC_BUILD 3401 | ||
35 | #define PDCURSES 1 /* PDCurses-only routines */ | ||
36 | #define XOPEN 1 /* X/Open Curses routines */ | ||
37 | #define SYSVcurses 1 /* System V Curses routines */ | ||
38 | #define BSDcurses 1 /* BSD Curses routines */ | ||
39 | #define CHTYPE_LONG 1 /* size of chtype; long */ | ||
40 | |||
41 | /*----------------------------------------------------------------------*/ | ||
42 | |||
43 | #include <stdarg.h> | ||
44 | #include <stddef.h> | ||
45 | #include <stdio.h> /* Required by X/Open usage below */ | ||
46 | |||
47 | #ifdef PDC_WIDE | ||
48 | # include <wchar.h> | ||
49 | #endif | ||
50 | |||
51 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
52 | extern "C" | ||
53 | { | ||
54 | # define bool _bool | ||
55 | #endif | ||
56 | |||
57 | /*---------------------------------------------------------------------- | ||
58 | * | ||
59 | * PDCurses Manifest Constants | ||
60 | * | ||
61 | */ | ||
62 | |||
63 | #ifndef FALSE | ||
64 | # define FALSE 0 | ||
65 | #endif | ||
66 | #ifndef TRUE | ||
67 | # define TRUE 1 | ||
68 | #endif | ||
69 | #ifndef NULL | ||
70 | # define NULL (void *)0 | ||
71 | #endif | ||
72 | #ifndef ERR | ||
73 | # define ERR (-1) | ||
74 | #endif | ||
75 | #ifndef OK | ||
76 | # define OK 0 | ||
77 | #endif | ||
78 | |||
79 | /*---------------------------------------------------------------------- | ||
80 | * | ||
81 | * PDCurses Type Declarations | ||
82 | * | ||
83 | */ | ||
84 | |||
85 | typedef unsigned char bool; /* PDCurses Boolean type */ | ||
86 | |||
87 | #ifdef CHTYPE_LONG | ||
88 | # if _LP64 | ||
89 | typedef unsigned int chtype; | ||
90 | # else | ||
91 | typedef unsigned long chtype; /* 16-bit attr + 16-bit char */ | ||
92 | # endif | ||
93 | #else | ||
94 | typedef unsigned short chtype; /* 8-bit attr + 8-bit char */ | ||
95 | #endif | ||
96 | |||
97 | #ifdef PDC_WIDE | ||
98 | typedef chtype cchar_t; | ||
99 | #endif | ||
100 | |||
101 | typedef chtype attr_t; | ||
102 | |||
103 | /*---------------------------------------------------------------------- | ||
104 | * | ||
105 | * PDCurses Mouse Interface -- SYSVR4, with extensions | ||
106 | * | ||
107 | */ | ||
108 | |||
109 | typedef struct | ||
110 | { | ||
111 | int x; /* absolute column, 0 based, measured in characters */ | ||
112 | int y; /* absolute row, 0 based, measured in characters */ | ||
113 | short button[3]; /* state of each button */ | ||
114 | int changes; /* flags indicating what has changed with the mouse */ | ||
115 | } MOUSE_STATUS; | ||
116 | |||
117 | #define BUTTON_RELEASED 0x0000 | ||
118 | #define BUTTON_PRESSED 0x0001 | ||
119 | #define BUTTON_CLICKED 0x0002 | ||
120 | #define BUTTON_DOUBLE_CLICKED 0x0003 | ||
121 | #define BUTTON_TRIPLE_CLICKED 0x0004 | ||
122 | #define BUTTON_MOVED 0x0005 /* PDCurses */ | ||
123 | #define WHEEL_SCROLLED 0x0006 /* PDCurses */ | ||
124 | #define BUTTON_ACTION_MASK 0x0007 /* PDCurses */ | ||
125 | |||
126 | #define PDC_BUTTON_SHIFT 0x0008 /* PDCurses */ | ||
127 | #define PDC_BUTTON_CONTROL 0x0010 /* PDCurses */ | ||
128 | #define PDC_BUTTON_ALT 0x0020 /* PDCurses */ | ||
129 | #define BUTTON_MODIFIER_MASK 0x0038 /* PDCurses */ | ||
130 | |||
131 | #define MOUSE_X_POS (Mouse_status.x) | ||
132 | #define MOUSE_Y_POS (Mouse_status.y) | ||
133 | |||
134 | /* | ||
135 | * Bits associated with the .changes field: | ||
136 | * 3 2 1 0 | ||
137 | * 210987654321098765432109876543210 | ||
138 | * 1 <- button 1 has changed | ||
139 | * 10 <- button 2 has changed | ||
140 | * 100 <- button 3 has changed | ||
141 | * 1000 <- mouse has moved | ||
142 | * 10000 <- mouse position report | ||
143 | * 100000 <- mouse wheel up | ||
144 | * 1000000 <- mouse wheel down | ||
145 | */ | ||
146 | |||
147 | #define PDC_MOUSE_MOVED 0x0008 | ||
148 | #define PDC_MOUSE_POSITION 0x0010 | ||
149 | #define PDC_MOUSE_WHEEL_UP 0x0020 | ||
150 | #define PDC_MOUSE_WHEEL_DOWN 0x0040 | ||
151 | |||
152 | #define A_BUTTON_CHANGED (Mouse_status.changes & 7) | ||
153 | #define MOUSE_MOVED (Mouse_status.changes & PDC_MOUSE_MOVED) | ||
154 | #define MOUSE_POS_REPORT (Mouse_status.changes & PDC_MOUSE_POSITION) | ||
155 | #define BUTTON_CHANGED(x) (Mouse_status.changes & (1 << ((x) - 1))) | ||
156 | #define BUTTON_STATUS(x) (Mouse_status.button[(x) - 1]) | ||
157 | #define MOUSE_WHEEL_UP (Mouse_status.changes & PDC_MOUSE_WHEEL_UP) | ||
158 | #define MOUSE_WHEEL_DOWN (Mouse_status.changes & PDC_MOUSE_WHEEL_DOWN) | ||
159 | |||
160 | /* mouse bit-masks */ | ||
161 | |||
162 | #define BUTTON1_RELEASED 0x00000001L | ||
163 | #define BUTTON1_PRESSED 0x00000002L | ||
164 | #define BUTTON1_CLICKED 0x00000004L | ||
165 | #define BUTTON1_DOUBLE_CLICKED 0x00000008L | ||
166 | #define BUTTON1_TRIPLE_CLICKED 0x00000010L | ||
167 | #define BUTTON1_MOVED 0x00000010L /* PDCurses */ | ||
168 | |||
169 | #define BUTTON2_RELEASED 0x00000020L | ||
170 | #define BUTTON2_PRESSED 0x00000040L | ||
171 | #define BUTTON2_CLICKED 0x00000080L | ||
172 | #define BUTTON2_DOUBLE_CLICKED 0x00000100L | ||
173 | #define BUTTON2_TRIPLE_CLICKED 0x00000200L | ||
174 | #define BUTTON2_MOVED 0x00000200L /* PDCurses */ | ||
175 | |||
176 | #define BUTTON3_RELEASED 0x00000400L | ||
177 | #define BUTTON3_PRESSED 0x00000800L | ||
178 | #define BUTTON3_CLICKED 0x00001000L | ||
179 | #define BUTTON3_DOUBLE_CLICKED 0x00002000L | ||
180 | #define BUTTON3_TRIPLE_CLICKED 0x00004000L | ||
181 | #define BUTTON3_MOVED 0x00004000L /* PDCurses */ | ||
182 | |||
183 | /* For the ncurses-compatible functions only, BUTTON4_PRESSED and | ||
184 | BUTTON5_PRESSED are returned for mouse scroll wheel up and down; | ||
185 | otherwise PDCurses doesn't support buttons 4 and 5 */ | ||
186 | |||
187 | #define BUTTON4_RELEASED 0x00008000L | ||
188 | #define BUTTON4_PRESSED 0x00010000L | ||
189 | #define BUTTON4_CLICKED 0x00020000L | ||
190 | #define BUTTON4_DOUBLE_CLICKED 0x00040000L | ||
191 | #define BUTTON4_TRIPLE_CLICKED 0x00080000L | ||
192 | |||
193 | #define BUTTON5_RELEASED 0x00100000L | ||
194 | #define BUTTON5_PRESSED 0x00200000L | ||
195 | #define BUTTON5_CLICKED 0x00400000L | ||
196 | #define BUTTON5_DOUBLE_CLICKED 0x00800000L | ||
197 | #define BUTTON5_TRIPLE_CLICKED 0x01000000L | ||
198 | |||
199 | #define MOUSE_WHEEL_SCROLL 0x02000000L /* PDCurses */ | ||
200 | #define BUTTON_MODIFIER_SHIFT 0x04000000L /* PDCurses */ | ||
201 | #define BUTTON_MODIFIER_CONTROL 0x08000000L /* PDCurses */ | ||
202 | #define BUTTON_MODIFIER_ALT 0x10000000L /* PDCurses */ | ||
203 | |||
204 | #define ALL_MOUSE_EVENTS 0x1fffffffL | ||
205 | #define REPORT_MOUSE_POSITION 0x20000000L | ||
206 | |||
207 | /* ncurses mouse interface */ | ||
208 | |||
209 | typedef unsigned long mmask_t; | ||
210 | |||
211 | typedef struct | ||
212 | { | ||
213 | short id; /* unused, always 0 */ | ||
214 | int x, y, z; /* x, y same as MOUSE_STATUS; z unused */ | ||
215 | mmask_t bstate; /* equivalent to changes + button[], but | ||
216 | in the same format as used for mousemask() */ | ||
217 | } MEVENT; | ||
218 | |||
219 | #ifdef NCURSES_MOUSE_VERSION | ||
220 | # define BUTTON_SHIFT BUTTON_MODIFIER_SHIFT | ||
221 | # define BUTTON_CONTROL BUTTON_MODIFIER_CONTROL | ||
222 | # define BUTTON_CTRL BUTTON_MODIFIER_CONTROL | ||
223 | # define BUTTON_ALT BUTTON_MODIFIER_ALT | ||
224 | #else | ||
225 | # define BUTTON_SHIFT PDC_BUTTON_SHIFT | ||
226 | # define BUTTON_CONTROL PDC_BUTTON_CONTROL | ||
227 | # define BUTTON_ALT PDC_BUTTON_ALT | ||
228 | #endif | ||
229 | |||
230 | /*---------------------------------------------------------------------- | ||
231 | * | ||
232 | * PDCurses Structure Definitions | ||
233 | * | ||
234 | */ | ||
235 | |||
236 | typedef struct _win /* definition of a window */ | ||
237 | { | ||
238 | int _cury; /* current pseudo-cursor */ | ||
239 | int _curx; | ||
240 | int _maxy; /* max window coordinates */ | ||
241 | int _maxx; | ||
242 | int _begy; /* origin on screen */ | ||
243 | int _begx; | ||
244 | int _flags; /* window properties */ | ||
245 | chtype _attrs; /* standard attributes and colors */ | ||
246 | chtype _bkgd; /* background, normally blank */ | ||
247 | bool _clear; /* causes clear at next refresh */ | ||
248 | bool _leaveit; /* leaves cursor where it is */ | ||
249 | bool _scroll; /* allows window scrolling */ | ||
250 | bool _nodelay; /* input character wait flag */ | ||
251 | bool _immed; /* immediate update flag */ | ||
252 | bool _sync; /* synchronise window ancestors */ | ||
253 | bool _use_keypad; /* flags keypad key mode active */ | ||
254 | chtype **_y; /* pointer to line pointer array */ | ||
255 | int *_firstch; /* first changed character in line */ | ||
256 | int *_lastch; /* last changed character in line */ | ||
257 | int _tmarg; /* top of scrolling region */ | ||
258 | int _bmarg; /* bottom of scrolling region */ | ||
259 | int _delayms; /* milliseconds of delay for getch() */ | ||
260 | int _parx, _pary; /* coords relative to parent (0,0) */ | ||
261 | struct _win *_parent; /* subwin's pointer to parent win */ | ||
262 | } WINDOW; | ||
263 | |||
264 | /* Avoid using the SCREEN struct directly -- use the corresponding | ||
265 | functions if possible. This struct may eventually be made private. */ | ||
266 | |||
267 | typedef struct | ||
268 | { | ||
269 | bool alive; /* if initscr() called, and not endwin() */ | ||
270 | bool autocr; /* if cr -> lf */ | ||
271 | bool cbreak; /* if terminal unbuffered */ | ||
272 | bool echo; /* if terminal echo */ | ||
273 | bool raw_inp; /* raw input mode (v. cooked input) */ | ||
274 | bool raw_out; /* raw output mode (7 v. 8 bits) */ | ||
275 | bool audible; /* FALSE if the bell is visual */ | ||
276 | bool mono; /* TRUE if current screen is mono */ | ||
277 | bool resized; /* TRUE if TERM has been resized */ | ||
278 | bool orig_attr; /* TRUE if we have the original colors */ | ||
279 | short orig_fore; /* original screen foreground color */ | ||
280 | short orig_back; /* original screen foreground color */ | ||
281 | int cursrow; /* position of physical cursor */ | ||
282 | int curscol; /* position of physical cursor */ | ||
283 | int visibility; /* visibility of cursor */ | ||
284 | int orig_cursor; /* original cursor size */ | ||
285 | int lines; /* new value for LINES */ | ||
286 | int cols; /* new value for COLS */ | ||
287 | unsigned long _trap_mbe; /* trap these mouse button events */ | ||
288 | unsigned long _map_mbe_to_key; /* map mouse buttons to slk */ | ||
289 | int mouse_wait; /* time to wait (in ms) for a | ||
290 | button release after a press, in | ||
291 | order to count it as a click */ | ||
292 | int slklines; /* lines in use by slk_init() */ | ||
293 | WINDOW *slk_winptr; /* window for slk */ | ||
294 | int linesrippedoff; /* lines ripped off via ripoffline() */ | ||
295 | int linesrippedoffontop; /* lines ripped off on | ||
296 | top via ripoffline() */ | ||
297 | int delaytenths; /* 1/10ths second to wait block | ||
298 | getch() for */ | ||
299 | bool _preserve; /* TRUE if screen background | ||
300 | to be preserved */ | ||
301 | int _restore; /* specifies if screen background | ||
302 | to be restored, and how */ | ||
303 | bool save_key_modifiers; /* TRUE if each key modifiers saved | ||
304 | with each key press */ | ||
305 | bool return_key_modifiers; /* TRUE if modifier keys are | ||
306 | returned as "real" keys */ | ||
307 | bool key_code; /* TRUE if last key is a special key; | ||
308 | used internally by get_wch() */ | ||
309 | #ifdef XCURSES | ||
310 | int XcurscrSize; /* size of Xcurscr shared memory block */ | ||
311 | bool sb_on; | ||
312 | int sb_viewport_y; | ||
313 | int sb_viewport_x; | ||
314 | int sb_total_y; | ||
315 | int sb_total_x; | ||
316 | int sb_cur_y; | ||
317 | int sb_cur_x; | ||
318 | #endif | ||
319 | short line_color; /* color of line attributes - default -1 */ | ||
320 | } SCREEN; | ||
321 | |||
322 | /*---------------------------------------------------------------------- | ||
323 | * | ||
324 | * PDCurses External Variables | ||
325 | * | ||
326 | */ | ||
327 | |||
328 | #ifdef PDC_DLL_BUILD | ||
329 | # ifdef CURSES_LIBRARY | ||
330 | # define PDCEX __declspec(dllexport) extern | ||
331 | # else | ||
332 | # define PDCEX __declspec(dllimport) | ||
333 | # endif | ||
334 | #else | ||
335 | # define PDCEX extern | ||
336 | #endif | ||
337 | |||
338 | PDCEX int LINES; /* terminal height */ | ||
339 | PDCEX int COLS; /* terminal width */ | ||
340 | PDCEX WINDOW *stdscr; /* the default screen window */ | ||
341 | PDCEX WINDOW *curscr; /* the current screen image */ | ||
342 | PDCEX SCREEN *SP; /* curses variables */ | ||
343 | PDCEX MOUSE_STATUS Mouse_status; | ||
344 | PDCEX int COLORS; | ||
345 | PDCEX int COLOR_PAIRS; | ||
346 | PDCEX int TABSIZE; | ||
347 | PDCEX chtype acs_map[]; /* alternate character set map */ | ||
348 | PDCEX char ttytype[]; /* terminal name/description */ | ||
349 | |||
350 | /*man-start************************************************************** | ||
351 | |||
352 | PDCurses Text Attributes | ||
353 | ======================== | ||
354 | |||
355 | Originally, PDCurses used a short (16 bits) for its chtype. To include | ||
356 | color, a number of things had to be sacrificed from the strict Unix and | ||
357 | System V support. The main problem was fitting all character attributes | ||
358 | and color into an unsigned char (all 8 bits!). | ||
359 | |||
360 | Today, PDCurses by default uses a long (32 bits) for its chtype, as in | ||
361 | System V. The short chtype is still available, by undefining CHTYPE_LONG | ||
362 | and rebuilding the library. | ||
363 | |||
364 | The following is the structure of a win->_attrs chtype: | ||
365 | |||
366 | short form: | ||
367 | |||
368 | ------------------------------------------------- | ||
369 | |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| | ||
370 | ------------------------------------------------- | ||
371 | color number | attrs | character eg 'a' | ||
372 | |||
373 | The available non-color attributes are bold, reverse and blink. Others | ||
374 | have no effect. The high order char is an index into an array of | ||
375 | physical colors (defined in color.c) -- 32 foreground/background color | ||
376 | pairs (5 bits) plus 3 bits for other attributes. | ||
377 | |||
378 | long form: | ||
379 | |||
380 | ---------------------------------------------------------------------------- | ||
381 | |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|..| 3| 2| 1| 0| | ||
382 | ---------------------------------------------------------------------------- | ||
383 | color number | modifiers | character eg 'a' | ||
384 | |||
385 | The available non-color attributes are bold, underline, invisible, | ||
386 | right-line, left-line, protect, reverse and blink. 256 color pairs (8 | ||
387 | bits), 8 bits for other attributes, and 16 bits for character data. | ||
388 | |||
389 | **man-end****************************************************************/ | ||
390 | |||
391 | /*** Video attribute macros ***/ | ||
392 | |||
393 | #define A_NORMAL (chtype)0 | ||
394 | |||
395 | #ifdef CHTYPE_LONG | ||
396 | # define A_ALTCHARSET (chtype)0x00010000 | ||
397 | # define A_RIGHTLINE (chtype)0x00020000 | ||
398 | # define A_LEFTLINE (chtype)0x00040000 | ||
399 | # define A_INVIS (chtype)0x00080000 | ||
400 | # define A_UNDERLINE (chtype)0x00100000 | ||
401 | # define A_REVERSE (chtype)0x00200000 | ||
402 | # define A_BLINK (chtype)0x00400000 | ||
403 | # define A_BOLD (chtype)0x00800000 | ||
404 | |||
405 | # define A_ATTRIBUTES (chtype)0xffff0000 | ||
406 | # define A_CHARTEXT (chtype)0x0000ffff | ||
407 | # define A_COLOR (chtype)0xff000000 | ||
408 | |||
409 | # define A_ITALIC A_INVIS | ||
410 | # define A_PROTECT (A_UNDERLINE | A_LEFTLINE | A_RIGHTLINE) | ||
411 | |||
412 | # define PDC_ATTR_SHIFT 19 | ||
413 | # define PDC_COLOR_SHIFT 24 | ||
414 | #else | ||
415 | # define A_BOLD (chtype)0x0100 /* X/Open */ | ||
416 | # define A_REVERSE (chtype)0x0200 /* X/Open */ | ||
417 | # define A_BLINK (chtype)0x0400 /* X/Open */ | ||
418 | |||
419 | # define A_ATTRIBUTES (chtype)0xff00 /* X/Open */ | ||
420 | # define A_CHARTEXT (chtype)0x00ff /* X/Open */ | ||
421 | # define A_COLOR (chtype)0xf800 /* System V */ | ||
422 | |||
423 | # define A_ALTCHARSET A_NORMAL /* X/Open */ | ||
424 | # define A_PROTECT A_NORMAL /* X/Open */ | ||
425 | # define A_UNDERLINE A_NORMAL /* X/Open */ | ||
426 | |||
427 | # define A_LEFTLINE A_NORMAL | ||
428 | # define A_RIGHTLINE A_NORMAL | ||
429 | # define A_ITALIC A_NORMAL | ||
430 | # define A_INVIS A_NORMAL | ||
431 | |||
432 | # define PDC_ATTR_SHIFT 8 | ||
433 | # define PDC_COLOR_SHIFT 11 | ||
434 | #endif | ||
435 | |||
436 | #define A_STANDOUT (A_REVERSE | A_BOLD) /* X/Open */ | ||
437 | #define A_DIM A_NORMAL | ||
438 | |||
439 | #define CHR_MSK A_CHARTEXT /* Obsolete */ | ||
440 | #define ATR_MSK A_ATTRIBUTES /* Obsolete */ | ||
441 | #define ATR_NRM A_NORMAL /* Obsolete */ | ||
442 | |||
443 | /* For use with attr_t -- X/Open says, "these shall be distinct", so | ||
444 | this is a non-conforming implementation. */ | ||
445 | |||
446 | #define WA_ALTCHARSET A_ALTCHARSET | ||
447 | #define WA_BLINK A_BLINK | ||
448 | #define WA_BOLD A_BOLD | ||
449 | #define WA_DIM A_DIM | ||
450 | #define WA_INVIS A_INVIS | ||
451 | #define WA_LEFT A_LEFTLINE | ||
452 | #define WA_PROTECT A_PROTECT | ||
453 | #define WA_REVERSE A_REVERSE | ||
454 | #define WA_RIGHT A_RIGHTLINE | ||
455 | #define WA_STANDOUT A_STANDOUT | ||
456 | #define WA_UNDERLINE A_UNDERLINE | ||
457 | |||
458 | #define WA_HORIZONTAL A_NORMAL | ||
459 | #define WA_LOW A_NORMAL | ||
460 | #define WA_TOP A_NORMAL | ||
461 | #define WA_VERTICAL A_NORMAL | ||
462 | |||
463 | /*** Alternate character set macros ***/ | ||
464 | |||
465 | /* 'w' = 32-bit chtype; acs_map[] index | A_ALTCHARSET | ||
466 | 'n' = 16-bit chtype; it gets the fallback set because no bit is | ||
467 | available for A_ALTCHARSET */ | ||
468 | |||
469 | #ifdef CHTYPE_LONG | ||
470 | # define ACS_PICK(w, n) ((chtype)w | A_ALTCHARSET) | ||
471 | #else | ||
472 | # define ACS_PICK(w, n) ((chtype)n) | ||
473 | #endif | ||
474 | |||
475 | /* VT100-compatible symbols -- box chars */ | ||
476 | |||
477 | #define ACS_ULCORNER ACS_PICK('l', '+') | ||
478 | #define ACS_LLCORNER ACS_PICK('m', '+') | ||
479 | #define ACS_URCORNER ACS_PICK('k', '+') | ||
480 | #define ACS_LRCORNER ACS_PICK('j', '+') | ||
481 | #define ACS_RTEE ACS_PICK('u', '+') | ||
482 | #define ACS_LTEE ACS_PICK('t', '+') | ||
483 | #define ACS_BTEE ACS_PICK('v', '+') | ||
484 | #define ACS_TTEE ACS_PICK('w', '+') | ||
485 | #define ACS_HLINE ACS_PICK('q', '-') | ||
486 | #define ACS_VLINE ACS_PICK('x', '|') | ||
487 | #define ACS_PLUS ACS_PICK('n', '+') | ||
488 | |||
489 | /* VT100-compatible symbols -- other */ | ||
490 | |||
491 | #define ACS_S1 ACS_PICK('o', '-') | ||
492 | #define ACS_S9 ACS_PICK('s', '_') | ||
493 | #define ACS_DIAMOND ACS_PICK('`', '+') | ||
494 | #define ACS_CKBOARD ACS_PICK('a', ':') | ||
495 | #define ACS_DEGREE ACS_PICK('f', '\'') | ||
496 | #define ACS_PLMINUS ACS_PICK('g', '#') | ||
497 | #define ACS_BULLET ACS_PICK('~', 'o') | ||
498 | |||
499 | /* Teletype 5410v1 symbols -- these are defined in SysV curses, but | ||
500 | are not well-supported by most terminals. Stick to VT100 characters | ||
501 | for optimum portability. */ | ||
502 | |||
503 | #define ACS_LARROW ACS_PICK(',', '<') | ||
504 | #define ACS_RARROW ACS_PICK('+', '>') | ||
505 | #define ACS_DARROW ACS_PICK('.', 'v') | ||
506 | #define ACS_UARROW ACS_PICK('-', '^') | ||
507 | #define ACS_BOARD ACS_PICK('h', '#') | ||
508 | #define ACS_LANTERN ACS_PICK('i', '*') | ||
509 | #define ACS_BLOCK ACS_PICK('0', '#') | ||
510 | |||
511 | /* That goes double for these -- undocumented SysV symbols. Don't use | ||
512 | them. */ | ||
513 | |||
514 | #define ACS_S3 ACS_PICK('p', '-') | ||
515 | #define ACS_S7 ACS_PICK('r', '-') | ||
516 | #define ACS_LEQUAL ACS_PICK('y', '<') | ||
517 | #define ACS_GEQUAL ACS_PICK('z', '>') | ||
518 | #define ACS_PI ACS_PICK('{', 'n') | ||
519 | #define ACS_NEQUAL ACS_PICK('|', '+') | ||
520 | #define ACS_STERLING ACS_PICK('}', 'L') | ||
521 | |||
522 | /* Box char aliases */ | ||
523 | |||
524 | #define ACS_BSSB ACS_ULCORNER | ||
525 | #define ACS_SSBB ACS_LLCORNER | ||
526 | #define ACS_BBSS ACS_URCORNER | ||
527 | #define ACS_SBBS ACS_LRCORNER | ||
528 | #define ACS_SBSS ACS_RTEE | ||
529 | #define ACS_SSSB ACS_LTEE | ||
530 | #define ACS_SSBS ACS_BTEE | ||
531 | #define ACS_BSSS ACS_TTEE | ||
532 | #define ACS_BSBS ACS_HLINE | ||
533 | #define ACS_SBSB ACS_VLINE | ||
534 | #define ACS_SSSS ACS_PLUS | ||
535 | |||
536 | /* cchar_t aliases */ | ||
537 | |||
538 | #ifdef PDC_WIDE | ||
539 | # define WACS_ULCORNER (&(acs_map['l'])) | ||
540 | # define WACS_LLCORNER (&(acs_map['m'])) | ||
541 | # define WACS_URCORNER (&(acs_map['k'])) | ||
542 | # define WACS_LRCORNER (&(acs_map['j'])) | ||
543 | # define WACS_RTEE (&(acs_map['u'])) | ||
544 | # define WACS_LTEE (&(acs_map['t'])) | ||
545 | # define WACS_BTEE (&(acs_map['v'])) | ||
546 | # define WACS_TTEE (&(acs_map['w'])) | ||
547 | # define WACS_HLINE (&(acs_map['q'])) | ||
548 | # define WACS_VLINE (&(acs_map['x'])) | ||
549 | # define WACS_PLUS (&(acs_map['n'])) | ||
550 | |||
551 | # define WACS_S1 (&(acs_map['o'])) | ||
552 | # define WACS_S9 (&(acs_map['s'])) | ||
553 | # define WACS_DIAMOND (&(acs_map['`'])) | ||
554 | # define WACS_CKBOARD (&(acs_map['a'])) | ||
555 | # define WACS_DEGREE (&(acs_map['f'])) | ||
556 | # define WACS_PLMINUS (&(acs_map['g'])) | ||
557 | # define WACS_BULLET (&(acs_map['~'])) | ||
558 | |||
559 | # define WACS_LARROW (&(acs_map[','])) | ||
560 | # define WACS_RARROW (&(acs_map['+'])) | ||
561 | # define WACS_DARROW (&(acs_map['.'])) | ||
562 | # define WACS_UARROW (&(acs_map['-'])) | ||
563 | # define WACS_BOARD (&(acs_map['h'])) | ||
564 | # define WACS_LANTERN (&(acs_map['i'])) | ||
565 | # define WACS_BLOCK (&(acs_map['0'])) | ||
566 | |||
567 | # define WACS_S3 (&(acs_map['p'])) | ||
568 | # define WACS_S7 (&(acs_map['r'])) | ||
569 | # define WACS_LEQUAL (&(acs_map['y'])) | ||
570 | # define WACS_GEQUAL (&(acs_map['z'])) | ||
571 | # define WACS_PI (&(acs_map['{'])) | ||
572 | # define WACS_NEQUAL (&(acs_map['|'])) | ||
573 | # define WACS_STERLING (&(acs_map['}'])) | ||
574 | |||
575 | # define WACS_BSSB WACS_ULCORNER | ||
576 | # define WACS_SSBB WACS_LLCORNER | ||
577 | # define WACS_BBSS WACS_URCORNER | ||
578 | # define WACS_SBBS WACS_LRCORNER | ||
579 | # define WACS_SBSS WACS_RTEE | ||
580 | # define WACS_SSSB WACS_LTEE | ||
581 | # define WACS_SSBS WACS_BTEE | ||
582 | # define WACS_BSSS WACS_TTEE | ||
583 | # define WACS_BSBS WACS_HLINE | ||
584 | # define WACS_SBSB WACS_VLINE | ||
585 | # define WACS_SSSS WACS_PLUS | ||
586 | #endif | ||
587 | |||
588 | /*** Color macros ***/ | ||
589 | |||
590 | #define COLOR_BLACK 0 | ||
591 | |||
592 | #ifdef PDC_RGB /* RGB */ | ||
593 | # define COLOR_RED 1 | ||
594 | # define COLOR_GREEN 2 | ||
595 | # define COLOR_BLUE 4 | ||
596 | #else /* BGR */ | ||
597 | # define COLOR_BLUE 1 | ||
598 | # define COLOR_GREEN 2 | ||
599 | # define COLOR_RED 4 | ||
600 | #endif | ||
601 | |||
602 | #define COLOR_CYAN (COLOR_BLUE | COLOR_GREEN) | ||
603 | #define COLOR_MAGENTA (COLOR_RED | COLOR_BLUE) | ||
604 | #define COLOR_YELLOW (COLOR_RED | COLOR_GREEN) | ||
605 | |||
606 | #define COLOR_WHITE 7 | ||
607 | |||
608 | /*---------------------------------------------------------------------- | ||
609 | * | ||
610 | * Function and Keypad Key Definitions. | ||
611 | * Many are just for compatibility. | ||
612 | * | ||
613 | */ | ||
614 | |||
615 | #define KEY_CODE_YES 0x100 /* If get_wch() gives a key code */ | ||
616 | |||
617 | #define KEY_BREAK 0x101 /* Not on PC KBD */ | ||
618 | #define KEY_DOWN 0x102 /* Down arrow key */ | ||
619 | #define KEY_UP 0x103 /* Up arrow key */ | ||
620 | #define KEY_LEFT 0x104 /* Left arrow key */ | ||
621 | #define KEY_RIGHT 0x105 /* Right arrow key */ | ||
622 | #define KEY_HOME 0x106 /* home key */ | ||
623 | #define KEY_BACKSPACE 0x107 /* not on pc */ | ||
624 | #define KEY_F0 0x108 /* function keys; 64 reserved */ | ||
625 | |||
626 | #define KEY_DL 0x148 /* delete line */ | ||
627 | #define KEY_IL 0x149 /* insert line */ | ||
628 | #define KEY_DC 0x14a /* delete character */ | ||
629 | #define KEY_IC 0x14b /* insert char or enter ins mode */ | ||
630 | #define KEY_EIC 0x14c /* exit insert char mode */ | ||
631 | #define KEY_CLEAR 0x14d /* clear screen */ | ||
632 | #define KEY_EOS 0x14e /* clear to end of screen */ | ||
633 | #define KEY_EOL 0x14f /* clear to end of line */ | ||
634 | #define KEY_SF 0x150 /* scroll 1 line forward */ | ||
635 | #define KEY_SR 0x151 /* scroll 1 line back (reverse) */ | ||
636 | #define KEY_NPAGE 0x152 /* next page */ | ||
637 | #define KEY_PPAGE 0x153 /* previous page */ | ||
638 | #define KEY_STAB 0x154 /* set tab */ | ||
639 | #define KEY_CTAB 0x155 /* clear tab */ | ||
640 | #define KEY_CATAB 0x156 /* clear all tabs */ | ||
641 | #define KEY_ENTER 0x157 /* enter or send (unreliable) */ | ||
642 | #define KEY_SRESET 0x158 /* soft/reset (partial/unreliable) */ | ||
643 | #define KEY_RESET 0x159 /* reset/hard reset (unreliable) */ | ||
644 | #define KEY_PRINT 0x15a /* print/copy */ | ||
645 | #define KEY_LL 0x15b /* home down/bottom (lower left) */ | ||
646 | #define KEY_ABORT 0x15c /* abort/terminate key (any) */ | ||
647 | #define KEY_SHELP 0x15d /* short help */ | ||
648 | #define KEY_LHELP 0x15e /* long help */ | ||
649 | #define KEY_BTAB 0x15f /* Back tab key */ | ||
650 | #define KEY_BEG 0x160 /* beg(inning) key */ | ||
651 | #define KEY_CANCEL 0x161 /* cancel key */ | ||
652 | #define KEY_CLOSE 0x162 /* close key */ | ||
653 | #define KEY_COMMAND 0x163 /* cmd (command) key */ | ||
654 | #define KEY_COPY 0x164 /* copy key */ | ||
655 | #define KEY_CREATE 0x165 /* create key */ | ||
656 | #define KEY_END 0x166 /* end key */ | ||
657 | #define KEY_EXIT 0x167 /* exit key */ | ||
658 | #define KEY_FIND 0x168 /* find key */ | ||
659 | #define KEY_HELP 0x169 /* help key */ | ||
660 | #define KEY_MARK 0x16a /* mark key */ | ||
661 | #define KEY_MESSAGE 0x16b /* message key */ | ||
662 | #define KEY_MOVE 0x16c /* move key */ | ||
663 | #define KEY_NEXT 0x16d /* next object key */ | ||
664 | #define KEY_OPEN 0x16e /* open key */ | ||
665 | #define KEY_OPTIONS 0x16f /* options key */ | ||
666 | #define KEY_PREVIOUS 0x170 /* previous object key */ | ||
667 | #define KEY_REDO 0x171 /* redo key */ | ||
668 | #define KEY_REFERENCE 0x172 /* ref(erence) key */ | ||
669 | #define KEY_REFRESH 0x173 /* refresh key */ | ||
670 | #define KEY_REPLACE 0x174 /* replace key */ | ||
671 | #define KEY_RESTART 0x175 /* restart key */ | ||
672 | #define KEY_RESUME 0x176 /* resume key */ | ||
673 | #define KEY_SAVE 0x177 /* save key */ | ||
674 | #define KEY_SBEG 0x178 /* shifted beginning key */ | ||
675 | #define KEY_SCANCEL 0x179 /* shifted cancel key */ | ||
676 | #define KEY_SCOMMAND 0x17a /* shifted command key */ | ||
677 | #define KEY_SCOPY 0x17b /* shifted copy key */ | ||
678 | #define KEY_SCREATE 0x17c /* shifted create key */ | ||
679 | #define KEY_SDC 0x17d /* shifted delete char key */ | ||
680 | #define KEY_SDL 0x17e /* shifted delete line key */ | ||
681 | #define KEY_SELECT 0x17f /* select key */ | ||
682 | #define KEY_SEND 0x180 /* shifted end key */ | ||
683 | #define KEY_SEOL 0x181 /* shifted clear line key */ | ||
684 | #define KEY_SEXIT 0x182 /* shifted exit key */ | ||
685 | #define KEY_SFIND 0x183 /* shifted find key */ | ||
686 | #define KEY_SHOME 0x184 /* shifted home key */ | ||
687 | #define KEY_SIC 0x185 /* shifted input key */ | ||
688 | |||
689 | #define KEY_SLEFT 0x187 /* shifted left arrow key */ | ||
690 | #define KEY_SMESSAGE 0x188 /* shifted message key */ | ||
691 | #define KEY_SMOVE 0x189 /* shifted move key */ | ||
692 | #define KEY_SNEXT 0x18a /* shifted next key */ | ||
693 | #define KEY_SOPTIONS 0x18b /* shifted options key */ | ||
694 | #define KEY_SPREVIOUS 0x18c /* shifted prev key */ | ||
695 | #define KEY_SPRINT 0x18d /* shifted print key */ | ||
696 | #define KEY_SREDO 0x18e /* shifted redo key */ | ||
697 | #define KEY_SREPLACE 0x18f /* shifted replace key */ | ||
698 | #define KEY_SRIGHT 0x190 /* shifted right arrow */ | ||
699 | #define KEY_SRSUME 0x191 /* shifted resume key */ | ||
700 | #define KEY_SSAVE 0x192 /* shifted save key */ | ||
701 | #define KEY_SSUSPEND 0x193 /* shifted suspend key */ | ||
702 | #define KEY_SUNDO 0x194 /* shifted undo key */ | ||
703 | #define KEY_SUSPEND 0x195 /* suspend key */ | ||
704 | #define KEY_UNDO 0x196 /* undo key */ | ||
705 | |||
706 | /* PDCurses-specific key definitions -- PC only */ | ||
707 | |||
708 | #define ALT_0 0x197 | ||
709 | #define ALT_1 0x198 | ||
710 | #define ALT_2 0x199 | ||
711 | #define ALT_3 0x19a | ||
712 | #define ALT_4 0x19b | ||
713 | #define ALT_5 0x19c | ||
714 | #define ALT_6 0x19d | ||
715 | #define ALT_7 0x19e | ||
716 | #define ALT_8 0x19f | ||
717 | #define ALT_9 0x1a0 | ||
718 | #define ALT_A 0x1a1 | ||
719 | #define ALT_B 0x1a2 | ||
720 | #define ALT_C 0x1a3 | ||
721 | #define ALT_D 0x1a4 | ||
722 | #define ALT_E 0x1a5 | ||
723 | #define ALT_F 0x1a6 | ||
724 | #define ALT_G 0x1a7 | ||
725 | #define ALT_H 0x1a8 | ||
726 | #define ALT_I 0x1a9 | ||
727 | #define ALT_J 0x1aa | ||
728 | #define ALT_K 0x1ab | ||
729 | #define ALT_L 0x1ac | ||
730 | #define ALT_M 0x1ad | ||
731 | #define ALT_N 0x1ae | ||
732 | #define ALT_O 0x1af | ||
733 | #define ALT_P 0x1b0 | ||
734 | #define ALT_Q 0x1b1 | ||
735 | #define ALT_R 0x1b2 | ||
736 | #define ALT_S 0x1b3 | ||
737 | #define ALT_T 0x1b4 | ||
738 | #define ALT_U 0x1b5 | ||
739 | #define ALT_V 0x1b6 | ||
740 | #define ALT_W 0x1b7 | ||
741 | #define ALT_X 0x1b8 | ||
742 | #define ALT_Y 0x1b9 | ||
743 | #define ALT_Z 0x1ba | ||
744 | |||
745 | #define CTL_LEFT 0x1bb /* Control-Left-Arrow */ | ||
746 | #define CTL_RIGHT 0x1bc | ||
747 | #define CTL_PGUP 0x1bd | ||
748 | #define CTL_PGDN 0x1be | ||
749 | #define CTL_HOME 0x1bf | ||
750 | #define CTL_END 0x1c0 | ||
751 | |||
752 | #define KEY_A1 0x1c1 /* upper left on Virtual keypad */ | ||
753 | #define KEY_A2 0x1c2 /* upper middle on Virt. keypad */ | ||
754 | #define KEY_A3 0x1c3 /* upper right on Vir. keypad */ | ||
755 | #define KEY_B1 0x1c4 /* middle left on Virt. keypad */ | ||
756 | #define KEY_B2 0x1c5 /* center on Virt. keypad */ | ||
757 | #define KEY_B3 0x1c6 /* middle right on Vir. keypad */ | ||
758 | #define KEY_C1 0x1c7 /* lower left on Virt. keypad */ | ||
759 | #define KEY_C2 0x1c8 /* lower middle on Virt. keypad */ | ||
760 | #define KEY_C3 0x1c9 /* lower right on Vir. keypad */ | ||
761 | |||
762 | #define PADSLASH 0x1ca /* slash on keypad */ | ||
763 | #define PADENTER 0x1cb /* enter on keypad */ | ||
764 | #define CTL_PADENTER 0x1cc /* ctl-enter on keypad */ | ||
765 | #define ALT_PADENTER 0x1cd /* alt-enter on keypad */ | ||
766 | #define PADSTOP 0x1ce /* stop on keypad */ | ||
767 | #define PADSTAR 0x1cf /* star on keypad */ | ||
768 | #define PADMINUS 0x1d0 /* minus on keypad */ | ||
769 | #define PADPLUS 0x1d1 /* plus on keypad */ | ||
770 | #define CTL_PADSTOP 0x1d2 /* ctl-stop on keypad */ | ||
771 | #define CTL_PADCENTER 0x1d3 /* ctl-enter on keypad */ | ||
772 | #define CTL_PADPLUS 0x1d4 /* ctl-plus on keypad */ | ||
773 | #define CTL_PADMINUS 0x1d5 /* ctl-minus on keypad */ | ||
774 | #define CTL_PADSLASH 0x1d6 /* ctl-slash on keypad */ | ||
775 | #define CTL_PADSTAR 0x1d7 /* ctl-star on keypad */ | ||
776 | #define ALT_PADPLUS 0x1d8 /* alt-plus on keypad */ | ||
777 | #define ALT_PADMINUS 0x1d9 /* alt-minus on keypad */ | ||
778 | #define ALT_PADSLASH 0x1da /* alt-slash on keypad */ | ||
779 | #define ALT_PADSTAR 0x1db /* alt-star on keypad */ | ||
780 | #define ALT_PADSTOP 0x1dc /* alt-stop on keypad */ | ||
781 | #define CTL_INS 0x1dd /* ctl-insert */ | ||
782 | #define ALT_DEL 0x1de /* alt-delete */ | ||
783 | #define ALT_INS 0x1df /* alt-insert */ | ||
784 | #define CTL_UP 0x1e0 /* ctl-up arrow */ | ||
785 | #define CTL_DOWN 0x1e1 /* ctl-down arrow */ | ||
786 | #define CTL_TAB 0x1e2 /* ctl-tab */ | ||
787 | #define ALT_TAB 0x1e3 | ||
788 | #define ALT_MINUS 0x1e4 | ||
789 | #define ALT_EQUAL 0x1e5 | ||
790 | #define ALT_HOME 0x1e6 | ||
791 | #define ALT_PGUP 0x1e7 | ||
792 | #define ALT_PGDN 0x1e8 | ||
793 | #define ALT_END 0x1e9 | ||
794 | #define ALT_UP 0x1ea /* alt-up arrow */ | ||
795 | #define ALT_DOWN 0x1eb /* alt-down arrow */ | ||
796 | #define ALT_RIGHT 0x1ec /* alt-right arrow */ | ||
797 | #define ALT_LEFT 0x1ed /* alt-left arrow */ | ||
798 | #define ALT_ENTER 0x1ee /* alt-enter */ | ||
799 | #define ALT_ESC 0x1ef /* alt-escape */ | ||
800 | #define ALT_BQUOTE 0x1f0 /* alt-back quote */ | ||
801 | #define ALT_LBRACKET 0x1f1 /* alt-left bracket */ | ||
802 | #define ALT_RBRACKET 0x1f2 /* alt-right bracket */ | ||
803 | #define ALT_SEMICOLON 0x1f3 /* alt-semi-colon */ | ||
804 | #define ALT_FQUOTE 0x1f4 /* alt-forward quote */ | ||
805 | #define ALT_COMMA 0x1f5 /* alt-comma */ | ||
806 | #define ALT_STOP 0x1f6 /* alt-stop */ | ||
807 | #define ALT_FSLASH 0x1f7 /* alt-forward slash */ | ||
808 | #define ALT_BKSP 0x1f8 /* alt-backspace */ | ||
809 | #define CTL_BKSP 0x1f9 /* ctl-backspace */ | ||
810 | #define PAD0 0x1fa /* keypad 0 */ | ||
811 | |||
812 | #define CTL_PAD0 0x1fb /* ctl-keypad 0 */ | ||
813 | #define CTL_PAD1 0x1fc | ||
814 | #define CTL_PAD2 0x1fd | ||
815 | #define CTL_PAD3 0x1fe | ||
816 | #define CTL_PAD4 0x1ff | ||
817 | #define CTL_PAD5 0x200 | ||
818 | #define CTL_PAD6 0x201 | ||
819 | #define CTL_PAD7 0x202 | ||
820 | #define CTL_PAD8 0x203 | ||
821 | #define CTL_PAD9 0x204 | ||
822 | |||
823 | #define ALT_PAD0 0x205 /* alt-keypad 0 */ | ||
824 | #define ALT_PAD1 0x206 | ||
825 | #define ALT_PAD2 0x207 | ||
826 | #define ALT_PAD3 0x208 | ||
827 | #define ALT_PAD4 0x209 | ||
828 | #define ALT_PAD5 0x20a | ||
829 | #define ALT_PAD6 0x20b | ||
830 | #define ALT_PAD7 0x20c | ||
831 | #define ALT_PAD8 0x20d | ||
832 | #define ALT_PAD9 0x20e | ||
833 | |||
834 | #define CTL_DEL 0x20f /* clt-delete */ | ||
835 | #define ALT_BSLASH 0x210 /* alt-back slash */ | ||
836 | #define CTL_ENTER 0x211 /* ctl-enter */ | ||
837 | |||
838 | #define SHF_PADENTER 0x212 /* shift-enter on keypad */ | ||
839 | #define SHF_PADSLASH 0x213 /* shift-slash on keypad */ | ||
840 | #define SHF_PADSTAR 0x214 /* shift-star on keypad */ | ||
841 | #define SHF_PADPLUS 0x215 /* shift-plus on keypad */ | ||
842 | #define SHF_PADMINUS 0x216 /* shift-minus on keypad */ | ||
843 | #define SHF_UP 0x217 /* shift-up on keypad */ | ||
844 | #define SHF_DOWN 0x218 /* shift-down on keypad */ | ||
845 | #define SHF_IC 0x219 /* shift-insert on keypad */ | ||
846 | #define SHF_DC 0x21a /* shift-delete on keypad */ | ||
847 | |||
848 | #define KEY_MOUSE 0x21b /* "mouse" key */ | ||
849 | #define KEY_SHIFT_L 0x21c /* Left-shift */ | ||
850 | #define KEY_SHIFT_R 0x21d /* Right-shift */ | ||
851 | #define KEY_CONTROL_L 0x21e /* Left-control */ | ||
852 | #define KEY_CONTROL_R 0x21f /* Right-control */ | ||
853 | #define KEY_ALT_L 0x220 /* Left-alt */ | ||
854 | #define KEY_ALT_R 0x221 /* Right-alt */ | ||
855 | #define KEY_RESIZE 0x222 /* Window resize */ | ||
856 | #define KEY_SUP 0x223 /* Shifted up arrow */ | ||
857 | #define KEY_SDOWN 0x224 /* Shifted down arrow */ | ||
858 | |||
859 | #define KEY_MIN KEY_BREAK /* Minimum curses key value */ | ||
860 | #define KEY_MAX KEY_SDOWN /* Maximum curses key */ | ||
861 | |||
862 | #define KEY_F(n) (KEY_F0 + (n)) | ||
863 | |||
864 | /*---------------------------------------------------------------------- | ||
865 | * | ||
866 | * PDCurses Function Declarations | ||
867 | * | ||
868 | */ | ||
869 | |||
870 | /* Standard */ | ||
871 | |||
872 | int addch(const chtype); | ||
873 | int addchnstr(const chtype *, int); | ||
874 | int addchstr(const chtype *); | ||
875 | int addnstr(const char *, int); | ||
876 | int addstr(const char *); | ||
877 | int attroff(chtype); | ||
878 | int attron(chtype); | ||
879 | int attrset(chtype); | ||
880 | int attr_get(attr_t *, short *, void *); | ||
881 | int attr_off(attr_t, void *); | ||
882 | int attr_on(attr_t, void *); | ||
883 | int attr_set(attr_t, short, void *); | ||
884 | int baudrate(void); | ||
885 | int beep(void); | ||
886 | int bkgd(chtype); | ||
887 | void bkgdset(chtype); | ||
888 | int border(chtype, chtype, chtype, chtype, chtype, chtype, chtype, chtype); | ||
889 | int box(WINDOW *, chtype, chtype); | ||
890 | bool can_change_color(void); | ||
891 | int cbreak(void); | ||
892 | int chgat(int, attr_t, short, const void *); | ||
893 | int clearok(WINDOW *, bool); | ||
894 | int clear(void); | ||
895 | int clrtobot(void); | ||
896 | int clrtoeol(void); | ||
897 | int color_content(short, short *, short *, short *); | ||
898 | int color_set(short, void *); | ||
899 | int copywin(const WINDOW *, WINDOW *, int, int, int, int, int, int, int); | ||
900 | int curs_set(int); | ||
901 | int def_prog_mode(void); | ||
902 | int def_shell_mode(void); | ||
903 | int delay_output(int); | ||
904 | int delch(void); | ||
905 | int deleteln(void); | ||
906 | void delscreen(SCREEN *); | ||
907 | int delwin(WINDOW *); | ||
908 | WINDOW *derwin(WINDOW *, int, int, int, int); | ||
909 | int doupdate(void); | ||
910 | WINDOW *dupwin(WINDOW *); | ||
911 | int echochar(const chtype); | ||
912 | int echo(void); | ||
913 | int endwin(void); | ||
914 | char erasechar(void); | ||
915 | int erase(void); | ||
916 | void filter(void); | ||
917 | int flash(void); | ||
918 | int flushinp(void); | ||
919 | chtype getbkgd(WINDOW *); | ||
920 | int getnstr(char *, int); | ||
921 | int getstr(char *); | ||
922 | WINDOW *getwin(FILE *); | ||
923 | int halfdelay(int); | ||
924 | bool has_colors(void); | ||
925 | bool has_ic(void); | ||
926 | bool has_il(void); | ||
927 | int hline(chtype, int); | ||
928 | void idcok(WINDOW *, bool); | ||
929 | int idlok(WINDOW *, bool); | ||
930 | void immedok(WINDOW *, bool); | ||
931 | int inchnstr(chtype *, int); | ||
932 | int inchstr(chtype *); | ||
933 | chtype inch(void); | ||
934 | int init_color(short, short, short, short); | ||
935 | int init_pair(short, short, short); | ||
936 | WINDOW *initscr(void); | ||
937 | int innstr(char *, int); | ||
938 | int insch(chtype); | ||
939 | int insdelln(int); | ||
940 | int insertln(void); | ||
941 | int insnstr(const char *, int); | ||
942 | int insstr(const char *); | ||
943 | int instr(char *); | ||
944 | int intrflush(WINDOW *, bool); | ||
945 | bool isendwin(void); | ||
946 | bool is_linetouched(WINDOW *, int); | ||
947 | bool is_wintouched(WINDOW *); | ||
948 | char *keyname(int); | ||
949 | int keypad(WINDOW *, bool); | ||
950 | char killchar(void); | ||
951 | int leaveok(WINDOW *, bool); | ||
952 | char *longname(void); | ||
953 | int meta(WINDOW *, bool); | ||
954 | int move(int, int); | ||
955 | int mvaddch(int, int, const chtype); | ||
956 | int mvaddchnstr(int, int, const chtype *, int); | ||
957 | int mvaddchstr(int, int, const chtype *); | ||
958 | int mvaddnstr(int, int, const char *, int); | ||
959 | int mvaddstr(int, int, const char *); | ||
960 | int mvchgat(int, int, int, attr_t, short, const void *); | ||
961 | int mvcur(int, int, int, int); | ||
962 | int mvdelch(int, int); | ||
963 | int mvderwin(WINDOW *, int, int); | ||
964 | int mvgetch(int, int); | ||
965 | int mvgetnstr(int, int, char *, int); | ||
966 | int mvgetstr(int, int, char *); | ||
967 | int mvhline(int, int, chtype, int); | ||
968 | chtype mvinch(int, int); | ||
969 | int mvinchnstr(int, int, chtype *, int); | ||
970 | int mvinchstr(int, int, chtype *); | ||
971 | int mvinnstr(int, int, char *, int); | ||
972 | int mvinsch(int, int, chtype); | ||
973 | int mvinsnstr(int, int, const char *, int); | ||
974 | int mvinsstr(int, int, const char *); | ||
975 | int mvinstr(int, int, char *); | ||
976 | int mvprintw(int, int, const char *, ...); | ||
977 | int mvscanw(int, int, const char *, ...); | ||
978 | int mvvline(int, int, chtype, int); | ||
979 | int mvwaddchnstr(WINDOW *, int, int, const chtype *, int); | ||
980 | int mvwaddchstr(WINDOW *, int, int, const chtype *); | ||
981 | int mvwaddch(WINDOW *, int, int, const chtype); | ||
982 | int mvwaddnstr(WINDOW *, int, int, const char *, int); | ||
983 | int mvwaddstr(WINDOW *, int, int, const char *); | ||
984 | int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *); | ||
985 | int mvwdelch(WINDOW *, int, int); | ||
986 | int mvwgetch(WINDOW *, int, int); | ||
987 | int mvwgetnstr(WINDOW *, int, int, char *, int); | ||
988 | int mvwgetstr(WINDOW *, int, int, char *); | ||
989 | int mvwhline(WINDOW *, int, int, chtype, int); | ||
990 | int mvwinchnstr(WINDOW *, int, int, chtype *, int); | ||
991 | int mvwinchstr(WINDOW *, int, int, chtype *); | ||
992 | chtype mvwinch(WINDOW *, int, int); | ||
993 | int mvwinnstr(WINDOW *, int, int, char *, int); | ||
994 | int mvwinsch(WINDOW *, int, int, chtype); | ||
995 | int mvwinsnstr(WINDOW *, int, int, const char *, int); | ||
996 | int mvwinsstr(WINDOW *, int, int, const char *); | ||
997 | int mvwinstr(WINDOW *, int, int, char *); | ||
998 | int mvwin(WINDOW *, int, int); | ||
999 | int mvwprintw(WINDOW *, int, int, const char *, ...); | ||
1000 | int mvwscanw(WINDOW *, int, int, const char *, ...); | ||
1001 | int mvwvline(WINDOW *, int, int, chtype, int); | ||
1002 | int napms(int); | ||
1003 | WINDOW *newpad(int, int); | ||
1004 | SCREEN *newterm(const char *, FILE *, FILE *); | ||
1005 | WINDOW *newwin(int, int, int, int); | ||
1006 | int nl(void); | ||
1007 | int nocbreak(void); | ||
1008 | int nodelay(WINDOW *, bool); | ||
1009 | int noecho(void); | ||
1010 | int nonl(void); | ||
1011 | void noqiflush(void); | ||
1012 | int noraw(void); | ||
1013 | int notimeout(WINDOW *, bool); | ||
1014 | int overlay(const WINDOW *, WINDOW *); | ||
1015 | int overwrite(const WINDOW *, WINDOW *); | ||
1016 | int pair_content(short, short *, short *); | ||
1017 | int pechochar(WINDOW *, chtype); | ||
1018 | int pnoutrefresh(WINDOW *, int, int, int, int, int, int); | ||
1019 | int prefresh(WINDOW *, int, int, int, int, int, int); | ||
1020 | int printw(const char *, ...); | ||
1021 | int putwin(WINDOW *, FILE *); | ||
1022 | void qiflush(void); | ||
1023 | int raw(void); | ||
1024 | int redrawwin(WINDOW *); | ||
1025 | int refresh(void); | ||
1026 | int reset_prog_mode(void); | ||
1027 | int reset_shell_mode(void); | ||
1028 | int resetty(void); | ||
1029 | int ripoffline(int, int (*)(WINDOW *, int)); | ||
1030 | int savetty(void); | ||
1031 | int scanw(const char *, ...); | ||
1032 | int scr_dump(const char *); | ||
1033 | int scr_init(const char *); | ||
1034 | int scr_restore(const char *); | ||
1035 | int scr_set(const char *); | ||
1036 | int scrl(int); | ||
1037 | int scroll(WINDOW *); | ||
1038 | int scrollok(WINDOW *, bool); | ||
1039 | SCREEN *set_term(SCREEN *); | ||
1040 | int setscrreg(int, int); | ||
1041 | int slk_attroff(const chtype); | ||
1042 | int slk_attr_off(const attr_t, void *); | ||
1043 | int slk_attron(const chtype); | ||
1044 | int slk_attr_on(const attr_t, void *); | ||
1045 | int slk_attrset(const chtype); | ||
1046 | int slk_attr_set(const attr_t, short, void *); | ||
1047 | int slk_clear(void); | ||
1048 | int slk_color(short); | ||
1049 | int slk_init(int); | ||
1050 | char *slk_label(int); | ||
1051 | int slk_noutrefresh(void); | ||
1052 | int slk_refresh(void); | ||
1053 | int slk_restore(void); | ||
1054 | int slk_set(int, const char *, int); | ||
1055 | int slk_touch(void); | ||
1056 | int standend(void); | ||
1057 | int standout(void); | ||
1058 | int start_color(void); | ||
1059 | WINDOW *subpad(WINDOW *, int, int, int, int); | ||
1060 | WINDOW *subwin(WINDOW *, int, int, int, int); | ||
1061 | int syncok(WINDOW *, bool); | ||
1062 | chtype termattrs(void); | ||
1063 | attr_t term_attrs(void); | ||
1064 | char *termname(void); | ||
1065 | void timeout(int); | ||
1066 | int touchline(WINDOW *, int, int); | ||
1067 | int touchwin(WINDOW *); | ||
1068 | int typeahead(int); | ||
1069 | int untouchwin(WINDOW *); | ||
1070 | void use_env(bool); | ||
1071 | int vidattr(chtype); | ||
1072 | int vid_attr(attr_t, short, void *); | ||
1073 | int vidputs(chtype, int (*)(int)); | ||
1074 | int vid_puts(attr_t, short, void *, int (*)(int)); | ||
1075 | int vline(chtype, int); | ||
1076 | int vw_printw(WINDOW *, const char *, va_list); | ||
1077 | int vwprintw(WINDOW *, const char *, va_list); | ||
1078 | int vw_scanw(WINDOW *, const char *, va_list); | ||
1079 | int vwscanw(WINDOW *, const char *, va_list); | ||
1080 | int waddchnstr(WINDOW *, const chtype *, int); | ||
1081 | int waddchstr(WINDOW *, const chtype *); | ||
1082 | int waddch(WINDOW *, const chtype); | ||
1083 | int waddnstr(WINDOW *, const char *, int); | ||
1084 | int waddstr(WINDOW *, const char *); | ||
1085 | int wattroff(WINDOW *, chtype); | ||
1086 | int wattron(WINDOW *, chtype); | ||
1087 | int wattrset(WINDOW *, chtype); | ||
1088 | int wattr_get(WINDOW *, attr_t *, short *, void *); | ||
1089 | int wattr_off(WINDOW *, attr_t, void *); | ||
1090 | int wattr_on(WINDOW *, attr_t, void *); | ||
1091 | int wattr_set(WINDOW *, attr_t, short, void *); | ||
1092 | void wbkgdset(WINDOW *, chtype); | ||
1093 | int wbkgd(WINDOW *, chtype); | ||
1094 | int wborder(WINDOW *, chtype, chtype, chtype, chtype, | ||
1095 | chtype, chtype, chtype, chtype); | ||
1096 | int wchgat(WINDOW *, int, attr_t, short, const void *); | ||
1097 | int wclear(WINDOW *); | ||
1098 | int wclrtobot(WINDOW *); | ||
1099 | int wclrtoeol(WINDOW *); | ||
1100 | int wcolor_set(WINDOW *, short, void *); | ||
1101 | void wcursyncup(WINDOW *); | ||
1102 | int wdelch(WINDOW *); | ||
1103 | int wdeleteln(WINDOW *); | ||
1104 | int wechochar(WINDOW *, const chtype); | ||
1105 | int werase(WINDOW *); | ||
1106 | int wgetch(WINDOW *); | ||
1107 | int wgetnstr(WINDOW *, char *, int); | ||
1108 | int wgetstr(WINDOW *, char *); | ||
1109 | int whline(WINDOW *, chtype, int); | ||
1110 | int winchnstr(WINDOW *, chtype *, int); | ||
1111 | int winchstr(WINDOW *, chtype *); | ||
1112 | chtype winch(WINDOW *); | ||
1113 | int winnstr(WINDOW *, char *, int); | ||
1114 | int winsch(WINDOW *, chtype); | ||
1115 | int winsdelln(WINDOW *, int); | ||
1116 | int winsertln(WINDOW *); | ||
1117 | int winsnstr(WINDOW *, const char *, int); | ||
1118 | int winsstr(WINDOW *, const char *); | ||
1119 | int winstr(WINDOW *, char *); | ||
1120 | int wmove(WINDOW *, int, int); | ||
1121 | int wnoutrefresh(WINDOW *); | ||
1122 | int wprintw(WINDOW *, const char *, ...); | ||
1123 | int wredrawln(WINDOW *, int, int); | ||
1124 | int wrefresh(WINDOW *); | ||
1125 | int wscanw(WINDOW *, const char *, ...); | ||
1126 | int wscrl(WINDOW *, int); | ||
1127 | int wsetscrreg(WINDOW *, int, int); | ||
1128 | int wstandend(WINDOW *); | ||
1129 | int wstandout(WINDOW *); | ||
1130 | void wsyncdown(WINDOW *); | ||
1131 | void wsyncup(WINDOW *); | ||
1132 | void wtimeout(WINDOW *, int); | ||
1133 | int wtouchln(WINDOW *, int, int, int); | ||
1134 | int wvline(WINDOW *, chtype, int); | ||
1135 | |||
1136 | /* Wide-character functions */ | ||
1137 | |||
1138 | #ifdef PDC_WIDE | ||
1139 | int addnwstr(const wchar_t *, int); | ||
1140 | int addwstr(const wchar_t *); | ||
1141 | int add_wch(const cchar_t *); | ||
1142 | int add_wchnstr(const cchar_t *, int); | ||
1143 | int add_wchstr(const cchar_t *); | ||
1144 | int border_set(const cchar_t *, const cchar_t *, const cchar_t *, | ||
1145 | const cchar_t *, const cchar_t *, const cchar_t *, | ||
1146 | const cchar_t *, const cchar_t *); | ||
1147 | int box_set(WINDOW *, const cchar_t *, const cchar_t *); | ||
1148 | int echo_wchar(const cchar_t *); | ||
1149 | int erasewchar(wchar_t *); | ||
1150 | int getbkgrnd(cchar_t *); | ||
1151 | int getcchar(const cchar_t *, wchar_t *, attr_t *, short *, void *); | ||
1152 | int getn_wstr(wint_t *, int); | ||
1153 | int get_wch(wint_t *); | ||
1154 | int get_wstr(wint_t *); | ||
1155 | int hline_set(const cchar_t *, int); | ||
1156 | int innwstr(wchar_t *, int); | ||
1157 | int ins_nwstr(const wchar_t *, int); | ||
1158 | int ins_wch(const cchar_t *); | ||
1159 | int ins_wstr(const wchar_t *); | ||
1160 | int inwstr(wchar_t *); | ||
1161 | int in_wch(cchar_t *); | ||
1162 | int in_wchnstr(cchar_t *, int); | ||
1163 | int in_wchstr(cchar_t *); | ||
1164 | char *key_name(wchar_t); | ||
1165 | int killwchar(wchar_t *); | ||
1166 | int mvaddnwstr(int, int, const wchar_t *, int); | ||
1167 | int mvaddwstr(int, int, const wchar_t *); | ||
1168 | int mvadd_wch(int, int, const cchar_t *); | ||
1169 | int mvadd_wchnstr(int, int, const cchar_t *, int); | ||
1170 | int mvadd_wchstr(int, int, const cchar_t *); | ||
1171 | int mvgetn_wstr(int, int, wint_t *, int); | ||
1172 | int mvget_wch(int, int, wint_t *); | ||
1173 | int mvget_wstr(int, int, wint_t *); | ||
1174 | int mvhline_set(int, int, const cchar_t *, int); | ||
1175 | int mvinnwstr(int, int, wchar_t *, int); | ||
1176 | int mvins_nwstr(int, int, const wchar_t *, int); | ||
1177 | int mvins_wch(int, int, const cchar_t *); | ||
1178 | int mvins_wstr(int, int, const wchar_t *); | ||
1179 | int mvinwstr(int, int, wchar_t *); | ||
1180 | int mvin_wch(int, int, cchar_t *); | ||
1181 | int mvin_wchnstr(int, int, cchar_t *, int); | ||
1182 | int mvin_wchstr(int, int, cchar_t *); | ||
1183 | int mvvline_set(int, int, const cchar_t *, int); | ||
1184 | int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int); | ||
1185 | int mvwaddwstr(WINDOW *, int, int, const wchar_t *); | ||
1186 | int mvwadd_wch(WINDOW *, int, int, const cchar_t *); | ||
1187 | int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); | ||
1188 | int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); | ||
1189 | int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int); | ||
1190 | int mvwget_wch(WINDOW *, int, int, wint_t *); | ||
1191 | int mvwget_wstr(WINDOW *, int, int, wint_t *); | ||
1192 | int mvwhline_set(WINDOW *, int, int, const cchar_t *, int); | ||
1193 | int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); | ||
1194 | int mvwins_nwstr(WINDOW *, int, int, const wchar_t *, int); | ||
1195 | int mvwins_wch(WINDOW *, int, int, const cchar_t *); | ||
1196 | int mvwins_wstr(WINDOW *, int, int, const wchar_t *); | ||
1197 | int mvwin_wch(WINDOW *, int, int, cchar_t *); | ||
1198 | int mvwin_wchnstr(WINDOW *, int, int, cchar_t *, int); | ||
1199 | int mvwin_wchstr(WINDOW *, int, int, cchar_t *); | ||
1200 | int mvwinwstr(WINDOW *, int, int, wchar_t *); | ||
1201 | int mvwvline_set(WINDOW *, int, int, const cchar_t *, int); | ||
1202 | int pecho_wchar(WINDOW *, const cchar_t*); | ||
1203 | int setcchar(cchar_t*, const wchar_t*, const attr_t, short, const void*); | ||
1204 | int slk_wset(int, const wchar_t *, int); | ||
1205 | int unget_wch(const wchar_t); | ||
1206 | int vline_set(const cchar_t *, int); | ||
1207 | int waddnwstr(WINDOW *, const wchar_t *, int); | ||
1208 | int waddwstr(WINDOW *, const wchar_t *); | ||
1209 | int wadd_wch(WINDOW *, const cchar_t *); | ||
1210 | int wadd_wchnstr(WINDOW *, const cchar_t *, int); | ||
1211 | int wadd_wchstr(WINDOW *, const cchar_t *); | ||
1212 | int wbkgrnd(WINDOW *, const cchar_t *); | ||
1213 | void wbkgrndset(WINDOW *, const cchar_t *); | ||
1214 | int wborder_set(WINDOW *, const cchar_t *, const cchar_t *, | ||
1215 | const cchar_t *, const cchar_t *, const cchar_t *, | ||
1216 | const cchar_t *, const cchar_t *, const cchar_t *); | ||
1217 | int wecho_wchar(WINDOW *, const cchar_t *); | ||
1218 | int wgetbkgrnd(WINDOW *, cchar_t *); | ||
1219 | int wgetn_wstr(WINDOW *, wint_t *, int); | ||
1220 | int wget_wch(WINDOW *, wint_t *); | ||
1221 | int wget_wstr(WINDOW *, wint_t *); | ||
1222 | int whline_set(WINDOW *, const cchar_t *, int); | ||
1223 | int winnwstr(WINDOW *, wchar_t *, int); | ||
1224 | int wins_nwstr(WINDOW *, const wchar_t *, int); | ||
1225 | int wins_wch(WINDOW *, const cchar_t *); | ||
1226 | int wins_wstr(WINDOW *, const wchar_t *); | ||
1227 | int winwstr(WINDOW *, wchar_t *); | ||
1228 | int win_wch(WINDOW *, cchar_t *); | ||
1229 | int win_wchnstr(WINDOW *, cchar_t *, int); | ||
1230 | int win_wchstr(WINDOW *, cchar_t *); | ||
1231 | wchar_t *wunctrl(cchar_t *); | ||
1232 | int wvline_set(WINDOW *, const cchar_t *, int); | ||
1233 | #endif | ||
1234 | |||
1235 | /* Quasi-standard */ | ||
1236 | |||
1237 | chtype getattrs(WINDOW *); | ||
1238 | int getbegx(WINDOW *); | ||
1239 | int getbegy(WINDOW *); | ||
1240 | int getmaxx(WINDOW *); | ||
1241 | int getmaxy(WINDOW *); | ||
1242 | int getparx(WINDOW *); | ||
1243 | int getpary(WINDOW *); | ||
1244 | int getcurx(WINDOW *); | ||
1245 | int getcury(WINDOW *); | ||
1246 | void traceoff(void); | ||
1247 | void traceon(void); | ||
1248 | char *unctrl(chtype); | ||
1249 | |||
1250 | int crmode(void); | ||
1251 | int nocrmode(void); | ||
1252 | int draino(int); | ||
1253 | int resetterm(void); | ||
1254 | int fixterm(void); | ||
1255 | int saveterm(void); | ||
1256 | int setsyx(int, int); | ||
1257 | |||
1258 | int mouse_set(unsigned long); | ||
1259 | int mouse_on(unsigned long); | ||
1260 | int mouse_off(unsigned long); | ||
1261 | int request_mouse_pos(void); | ||
1262 | int map_button(unsigned long); | ||
1263 | void wmouse_position(WINDOW *, int *, int *); | ||
1264 | unsigned long getmouse(void); | ||
1265 | unsigned long getbmap(void); | ||
1266 | |||
1267 | /* ncurses */ | ||
1268 | |||
1269 | int assume_default_colors(int, int); | ||
1270 | const char *curses_version(void); | ||
1271 | bool has_key(int); | ||
1272 | int use_default_colors(void); | ||
1273 | int wresize(WINDOW *, int, int); | ||
1274 | |||
1275 | int mouseinterval(int); | ||
1276 | mmask_t mousemask(mmask_t, mmask_t *); | ||
1277 | bool mouse_trafo(int *, int *, bool); | ||
1278 | int nc_getmouse(MEVENT *); | ||
1279 | int ungetmouse(MEVENT *); | ||
1280 | bool wenclose(const WINDOW *, int, int); | ||
1281 | bool wmouse_trafo(const WINDOW *, int *, int *, bool); | ||
1282 | |||
1283 | /* PDCurses */ | ||
1284 | |||
1285 | int addrawch(chtype); | ||
1286 | int insrawch(chtype); | ||
1287 | bool is_termresized(void); | ||
1288 | int mvaddrawch(int, int, chtype); | ||
1289 | int mvdeleteln(int, int); | ||
1290 | int mvinsertln(int, int); | ||
1291 | int mvinsrawch(int, int, chtype); | ||
1292 | int mvwaddrawch(WINDOW *, int, int, chtype); | ||
1293 | int mvwdeleteln(WINDOW *, int, int); | ||
1294 | int mvwinsertln(WINDOW *, int, int); | ||
1295 | int mvwinsrawch(WINDOW *, int, int, chtype); | ||
1296 | int raw_output(bool); | ||
1297 | int resize_term(int, int); | ||
1298 | WINDOW *resize_window(WINDOW *, int, int); | ||
1299 | int waddrawch(WINDOW *, chtype); | ||
1300 | int winsrawch(WINDOW *, chtype); | ||
1301 | char wordchar(void); | ||
1302 | |||
1303 | #ifdef PDC_WIDE | ||
1304 | wchar_t *slk_wlabel(int); | ||
1305 | #endif | ||
1306 | |||
1307 | void PDC_debug(const char *, ...); | ||
1308 | int PDC_ungetch(int); | ||
1309 | int PDC_set_blink(bool); | ||
1310 | int PDC_set_line_color(short); | ||
1311 | void PDC_set_title(const char *); | ||
1312 | |||
1313 | int PDC_clearclipboard(void); | ||
1314 | int PDC_freeclipboard(char *); | ||
1315 | int PDC_getclipboard(char **, long *); | ||
1316 | int PDC_setclipboard(const char *, long); | ||
1317 | |||
1318 | unsigned long PDC_get_input_fd(void); | ||
1319 | unsigned long PDC_get_key_modifiers(void); | ||
1320 | int PDC_return_key_modifiers(bool); | ||
1321 | int PDC_save_key_modifiers(bool); | ||
1322 | |||
1323 | #ifdef XCURSES | ||
1324 | WINDOW *Xinitscr(int, char **); | ||
1325 | void XCursesExit(void); | ||
1326 | int sb_init(void); | ||
1327 | int sb_set_horz(int, int, int); | ||
1328 | int sb_set_vert(int, int, int); | ||
1329 | int sb_get_horz(int *, int *, int *); | ||
1330 | int sb_get_vert(int *, int *, int *); | ||
1331 | int sb_refresh(void); | ||
1332 | #endif | ||
1333 | |||
1334 | /*** Functions defined as macros ***/ | ||
1335 | |||
1336 | /* getch() and ungetch() conflict with some DOS libraries */ | ||
1337 | |||
1338 | #define getch() wgetch(stdscr) | ||
1339 | #define ungetch(ch) PDC_ungetch(ch) | ||
1340 | |||
1341 | #define COLOR_PAIR(n) (((chtype)(n) << PDC_COLOR_SHIFT) & A_COLOR) | ||
1342 | #define PAIR_NUMBER(n) (((n) & A_COLOR) >> PDC_COLOR_SHIFT) | ||
1343 | |||
1344 | /* These will _only_ work as macros */ | ||
1345 | |||
1346 | #define getbegyx(w, y, x) (y = getbegy(w), x = getbegx(w)) | ||
1347 | #define getmaxyx(w, y, x) (y = getmaxy(w), x = getmaxx(w)) | ||
1348 | #define getparyx(w, y, x) (y = getpary(w), x = getparx(w)) | ||
1349 | #define getyx(w, y, x) (y = getcury(w), x = getcurx(w)) | ||
1350 | |||
1351 | #define getsyx(y, x) { if (curscr->_leaveit) (y)=(x)=-1; \ | ||
1352 | else getyx(curscr,(y),(x)); } | ||
1353 | |||
1354 | #ifdef NCURSES_MOUSE_VERSION | ||
1355 | # define getmouse(x) nc_getmouse(x) | ||
1356 | #endif | ||
1357 | |||
1358 | /* return codes from PDC_getclipboard() and PDC_setclipboard() calls */ | ||
1359 | |||
1360 | #define PDC_CLIP_SUCCESS 0 | ||
1361 | #define PDC_CLIP_ACCESS_ERROR 1 | ||
1362 | #define PDC_CLIP_EMPTY 2 | ||
1363 | #define PDC_CLIP_MEMORY_ERROR 3 | ||
1364 | |||
1365 | /* PDCurses key modifier masks */ | ||
1366 | |||
1367 | #define PDC_KEY_MODIFIER_SHIFT 1 | ||
1368 | #define PDC_KEY_MODIFIER_CONTROL 2 | ||
1369 | #define PDC_KEY_MODIFIER_ALT 4 | ||
1370 | #define PDC_KEY_MODIFIER_NUMLOCK 8 | ||
1371 | |||
1372 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
1373 | # undef bool | ||
1374 | } | ||
1375 | #endif | ||
1376 | |||
1377 | #endif /* __PDCURSES__ */ |
File curspriv.h added (mode: 100644) (index 00000000..8b34f010) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: curspriv.h,v 1.158 2008/07/13 16:08:16 wmcbrine Exp $ */ | ||
4 | |||
5 | /* Private definitions and declarations for use within PDCurses. | ||
6 | These should generally not be referenced by applications. */ | ||
7 | |||
8 | #ifndef __CURSES_INTERNALS__ | ||
9 | #define __CURSES_INTERNALS__ 1 | ||
10 | |||
11 | #ifdef HAVE_CONFIG_H | ||
12 | # include <config.h> | ||
13 | #endif | ||
14 | |||
15 | #define CURSES_LIBRARY | ||
16 | #include <curses.h> | ||
17 | |||
18 | #if defined(__TURBOC__) || defined(__EMX__) || defined(__DJGPP__) || \ | ||
19 | defined(__CYGWIN32__) || defined(__MINGW32__) || \ | ||
20 | defined(__WATCOMC__) || defined(__PACIFIC__) | ||
21 | # ifndef HAVE_VSSCANF | ||
22 | # define HAVE_VSSCANF /* have vsscanf() */ | ||
23 | # endif | ||
24 | #endif | ||
25 | |||
26 | #if defined(__CYGWIN32__) || defined(__MINGW32__) || \ | ||
27 | defined(__LCC__) || defined(__WATCOMC__) | ||
28 | # ifndef HAVE_VSNPRINTF | ||
29 | # define HAVE_VSNPRINTF /* have vsnprintf() */ | ||
30 | # endif | ||
31 | #endif | ||
32 | |||
33 | #if defined(_MSC_VER) && defined(_WIN32) && !defined(_CRT_SECURE_NO_DEPRECATE) | ||
34 | # define _CRT_SECURE_NO_DEPRECATE 1 /* kill nonsense warnings */ | ||
35 | #endif | ||
36 | |||
37 | /*----------------------------------------------------------------------*/ | ||
38 | |||
39 | typedef struct /* structure for ripped off lines */ | ||
40 | { | ||
41 | int line; | ||
42 | int (*init)(WINDOW *, int); | ||
43 | } RIPPEDOFFLINE; | ||
44 | |||
45 | /* Window properties */ | ||
46 | |||
47 | #define _SUBWIN 0x01 /* window is a subwindow */ | ||
48 | #define _PAD 0x10 /* X/Open Pad. */ | ||
49 | #define _SUBPAD 0x20 /* X/Open subpad. */ | ||
50 | |||
51 | /* Miscellaneous */ | ||
52 | |||
53 | #define _NO_CHANGE -1 /* flags line edge unchanged */ | ||
54 | |||
55 | #define _ECHAR 0x08 /* Erase char (^H) */ | ||
56 | #define _DWCHAR 0x17 /* Delete Word char (^W) */ | ||
57 | #define _DLCHAR 0x15 /* Delete Line char (^U) */ | ||
58 | |||
59 | extern WINDOW *pdc_lastscr; | ||
60 | extern bool pdc_trace_on; /* tracing flag */ | ||
61 | extern bool pdc_color_started; | ||
62 | extern unsigned long pdc_key_modifiers; | ||
63 | extern MOUSE_STATUS pdc_mouse_status; | ||
64 | |||
65 | /*----------------------------------------------------------------------*/ | ||
66 | |||
67 | /* Platform implementation functions */ | ||
68 | |||
69 | void PDC_beep(void); | ||
70 | bool PDC_can_change_color(void); | ||
71 | int PDC_color_content(short, short *, short *, short *); | ||
72 | bool PDC_check_key(void); | ||
73 | int PDC_curs_set(int); | ||
74 | void PDC_flushinp(void); | ||
75 | int PDC_get_columns(void); | ||
76 | int PDC_get_cursor_mode(void); | ||
77 | int PDC_get_key(void); | ||
78 | int PDC_get_rows(void); | ||
79 | void PDC_gotoyx(int, int); | ||
80 | int PDC_init_color(short, short, short, short); | ||
81 | void PDC_init_pair(short, short, short); | ||
82 | int PDC_modifiers_set(void); | ||
83 | int PDC_mouse_set(void); | ||
84 | void PDC_napms(int); | ||
85 | int PDC_pair_content(short, short *, short *); | ||
86 | void PDC_reset_prog_mode(void); | ||
87 | void PDC_reset_shell_mode(void); | ||
88 | int PDC_resize_screen(int, int); | ||
89 | void PDC_restore_screen_mode(int); | ||
90 | void PDC_save_screen_mode(int); | ||
91 | void PDC_scr_close(void); | ||
92 | void PDC_scr_free(void); | ||
93 | int PDC_scr_open(int, char **); | ||
94 | void PDC_set_keyboard_binary(bool); | ||
95 | void PDC_transform_line(int, int, int, const chtype *); | ||
96 | const char *PDC_sysname(void); | ||
97 | |||
98 | /* Internal cross-module functions */ | ||
99 | |||
100 | void PDC_init_atrtab(void); | ||
101 | WINDOW *PDC_makelines(WINDOW *); | ||
102 | WINDOW *PDC_makenew(int, int, int, int); | ||
103 | int PDC_mouse_in_slk(int, int); | ||
104 | void PDC_slk_free(void); | ||
105 | void PDC_slk_initialize(void); | ||
106 | void PDC_sync(WINDOW *); | ||
107 | |||
108 | #ifdef PDC_WIDE | ||
109 | int PDC_mbtowc(wchar_t *, const char *, size_t); | ||
110 | size_t PDC_mbstowcs(wchar_t *, const char *, size_t); | ||
111 | size_t PDC_wcstombs(char *, const wchar_t *, size_t); | ||
112 | #endif | ||
113 | |||
114 | #ifdef PDCDEBUG | ||
115 | # define PDC_LOG(x) if (pdc_trace_on) PDC_debug x | ||
116 | # define RCSID(x) static const char *rcsid = x; | ||
117 | #else | ||
118 | # define PDC_LOG(x) | ||
119 | # define RCSID(x) | ||
120 | #endif | ||
121 | |||
122 | /* Internal macros for attributes */ | ||
123 | |||
124 | #ifdef CHTYPE_LONG | ||
125 | # define PDC_COLOR_PAIRS 256 | ||
126 | #else | ||
127 | # define PDC_COLOR_PAIRS 32 | ||
128 | #endif | ||
129 | |||
130 | #ifndef max | ||
131 | # define max(a,b) (((a) > (b)) ? (a) : (b)) | ||
132 | #endif | ||
133 | #ifndef min | ||
134 | # define min(a,b) (((a) < (b)) ? (a) : (b)) | ||
135 | #endif | ||
136 | |||
137 | #define DIVROUND(num, divisor) ((num) + ((divisor) >> 1)) / (divisor) | ||
138 | |||
139 | #define PDC_CLICK_PERIOD 150 /* time to wait for a click, if | ||
140 | not set by mouseinterval() */ | ||
141 | |||
142 | #endif /* __CURSES_INTERNALS__*/ |
File demos/README added (mode: 100644) (index 00000000..8f4b5c6c) | |||
1 | PDCurses Demos | ||
2 | ============== | ||
3 | |||
4 | This directory contains demonstration programs to show and test the | ||
5 | capabilities of curses libraries. Some of them predate PDCurses, | ||
6 | PCcurses or even pcurses/ncurses. Although some PDCurses-specific code | ||
7 | has been added, all programs remain portable to other implementations | ||
8 | (at a minimum, to ncurses). | ||
9 | |||
10 | |||
11 | Building | ||
12 | -------- | ||
13 | |||
14 | The demos are built by the platform-specific makefiles, in the platform | ||
15 | directories. Alternatively, you can build them manually, individually, | ||
16 | and link with any curses library; e.g., "cc -lcurses -orain rain.c". | ||
17 | There are no dependencies besides curses and the standard C library, and | ||
18 | no configuration is needed. | ||
19 | |||
20 | |||
21 | Distribution Status | ||
22 | ------------------- | ||
23 | |||
24 | Public Domain, except for rain.c and worm.c, which are under the ncurses | ||
25 | license (MIT-like). |
File demos/firework.c added (mode: 100644) (index 00000000..8d7921f3) | |||
1 | /* $Id: firework.c,v 1.25 2008/07/13 16:08:17 wmcbrine Exp $ */ | ||
2 | |||
3 | #include <stdio.h> | ||
4 | #include <signal.h> | ||
5 | #include <curses.h> | ||
6 | #include <ctype.h> | ||
7 | #include <stdlib.h> | ||
8 | #include <sys/types.h> | ||
9 | #include <time.h> | ||
10 | |||
11 | #define DELAYSIZE 200 | ||
12 | |||
13 | void myrefresh(void); | ||
14 | void get_color(void); | ||
15 | void explode(int, int); | ||
16 | |||
17 | short color_table[] = | ||
18 | { | ||
19 | COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN, | ||
20 | COLOR_RED, COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE | ||
21 | }; | ||
22 | |||
23 | int main(int argc, char **argv) | ||
24 | { | ||
25 | int i, start, end, row, diff, flag, direction, seed; | ||
26 | |||
27 | #ifdef XCURSES | ||
28 | Xinitscr(argc, argv); | ||
29 | #else | ||
30 | initscr(); | ||
31 | #endif | ||
32 | nodelay(stdscr, TRUE); | ||
33 | noecho(); | ||
34 | |||
35 | if (has_colors()) | ||
36 | start_color(); | ||
37 | |||
38 | for (i = 0; i < 8; i++) | ||
39 | init_pair(i, color_table[i], COLOR_BLACK); | ||
40 | |||
41 | seed = time((time_t *)0); | ||
42 | srand(seed); | ||
43 | flag = 0; | ||
44 | |||
45 | while (getch() == ERR) /* loop until a key is hit */ | ||
46 | { | ||
47 | do { | ||
48 | start = rand() % (COLS - 3); | ||
49 | end = rand() % (COLS - 3); | ||
50 | start = (start < 2) ? 2 : start; | ||
51 | end = (end < 2) ? 2 : end; | ||
52 | direction = (start > end) ? -1 : 1; | ||
53 | diff = abs(start - end); | ||
54 | |||
55 | } while (diff < 2 || diff >= LINES - 2); | ||
56 | |||
57 | attrset(A_NORMAL); | ||
58 | |||
59 | for (row = 0; row < diff; row++) | ||
60 | { | ||
61 | mvaddstr(LINES - row, row * direction + start, | ||
62 | (direction < 0) ? "\\" : "/"); | ||
63 | |||
64 | if (flag++) | ||
65 | { | ||
66 | myrefresh(); | ||
67 | erase(); | ||
68 | flag = 0; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | if (flag++) | ||
73 | { | ||
74 | myrefresh(); | ||
75 | flag = 0; | ||
76 | } | ||
77 | |||
78 | explode(LINES - row, diff * direction + start); | ||
79 | erase(); | ||
80 | myrefresh(); | ||
81 | } | ||
82 | |||
83 | endwin(); | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | void explode(int row, int col) | ||
89 | { | ||
90 | erase(); | ||
91 | mvaddstr(row, col, "-"); | ||
92 | myrefresh(); | ||
93 | |||
94 | --col; | ||
95 | |||
96 | get_color(); | ||
97 | mvaddstr(row - 1, col, " - "); | ||
98 | mvaddstr(row, col, "-+-"); | ||
99 | mvaddstr(row + 1, col, " - "); | ||
100 | myrefresh(); | ||
101 | |||
102 | --col; | ||
103 | |||
104 | get_color(); | ||
105 | mvaddstr(row - 2, col, " --- "); | ||
106 | mvaddstr(row - 1, col, "-+++-"); | ||
107 | mvaddstr(row, col, "-+#+-"); | ||
108 | mvaddstr(row + 1, col, "-+++-"); | ||
109 | mvaddstr(row + 2, col, " --- "); | ||
110 | myrefresh(); | ||
111 | |||
112 | get_color(); | ||
113 | mvaddstr(row - 2, col, " +++ "); | ||
114 | mvaddstr(row - 1, col, "++#++"); | ||
115 | mvaddstr(row, col, "+# #+"); | ||
116 | mvaddstr(row + 1, col, "++#++"); | ||
117 | mvaddstr(row + 2, col, " +++ "); | ||
118 | myrefresh(); | ||
119 | |||
120 | get_color(); | ||
121 | mvaddstr(row - 2, col, " # "); | ||
122 | mvaddstr(row - 1, col, "## ##"); | ||
123 | mvaddstr(row, col, "# #"); | ||
124 | mvaddstr(row + 1, col, "## ##"); | ||
125 | mvaddstr(row + 2, col, " # "); | ||
126 | myrefresh(); | ||
127 | |||
128 | get_color(); | ||
129 | mvaddstr(row - 2, col, " # # "); | ||
130 | mvaddstr(row - 1, col, "# #"); | ||
131 | mvaddstr(row, col, " "); | ||
132 | mvaddstr(row + 1, col, "# #"); | ||
133 | mvaddstr(row + 2, col, " # # "); | ||
134 | myrefresh(); | ||
135 | } | ||
136 | |||
137 | void myrefresh(void) | ||
138 | { | ||
139 | napms(DELAYSIZE); | ||
140 | move(LINES - 1, COLS - 1); | ||
141 | refresh(); | ||
142 | } | ||
143 | |||
144 | void get_color(void) | ||
145 | { | ||
146 | chtype bold = (rand() % 2) ? A_BOLD : A_NORMAL; | ||
147 | attrset(COLOR_PAIR(rand() % 8) | bold); | ||
148 | } |
File demos/newdemo.c added (mode: 100644) (index 00000000..3eae98d4) | |||
1 | /* | ||
2 | * newdemo.c - A demo program using PDCurses. The program | ||
3 | * illustrates the use of colors for text output. | ||
4 | * | ||
5 | * Hacks by jbuhler@cs.washington.edu on 12/29/96 | ||
6 | * | ||
7 | * $Id: newdemo.c,v 1.39 2008/07/13 16:08:17 wmcbrine Exp $ | ||
8 | */ | ||
9 | |||
10 | #include <stdio.h> | ||
11 | #include <signal.h> | ||
12 | #include <string.h> | ||
13 | #include <curses.h> | ||
14 | #include <stdlib.h> | ||
15 | #include <time.h> | ||
16 | |||
17 | int WaitForUser(void); | ||
18 | int SubWinTest(WINDOW *); | ||
19 | int BouncingBalls(WINDOW *); | ||
20 | void trap(int); | ||
21 | |||
22 | /* An ASCII map of Australia */ | ||
23 | |||
24 | char *AusMap[17] = | ||
25 | { | ||
26 | " A ", | ||
27 | " AA AA ", | ||
28 | " N.T. AAAAA AAAA ", | ||
29 | " AAAAAAAAAAA AAAAAAAA ", | ||
30 | " AAAAAAAAAAAAAAAAAAAAAAAAA Qld.", | ||
31 | " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ", | ||
32 | " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", | ||
33 | " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ", | ||
34 | " AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.", | ||
35 | "W.A. AAAAAAAAA AAAAAA Vic.", | ||
36 | " AAA S.A. AA", | ||
37 | " A Tas.", | ||
38 | "" | ||
39 | }; | ||
40 | |||
41 | /* Funny messages for the scroller */ | ||
42 | |||
43 | char *messages[] = | ||
44 | { | ||
45 | "Hello from the Land Down Under", | ||
46 | "The Land of crocs, and a big Red Rock", | ||
47 | "Where the sunflower runs along the highways", | ||
48 | "The dusty red roads lead one to loneliness", | ||
49 | "Blue sky in the morning and", | ||
50 | "Freezing nights and twinkling stars", | ||
51 | NULL | ||
52 | }; | ||
53 | |||
54 | int WaitForUser(void) | ||
55 | { | ||
56 | chtype ch; | ||
57 | |||
58 | nodelay(stdscr, TRUE); | ||
59 | halfdelay(50); | ||
60 | |||
61 | ch = getch(); | ||
62 | |||
63 | nodelay(stdscr, FALSE); | ||
64 | nocbreak(); /* Reset the halfdelay() value */ | ||
65 | cbreak(); | ||
66 | |||
67 | return (ch == '\033') ? ch : 0; | ||
68 | } | ||
69 | |||
70 | int SubWinTest(WINDOW *win) | ||
71 | { | ||
72 | WINDOW *swin1, *swin2, *swin3; | ||
73 | int w, h, sw, sh, bx, by; | ||
74 | |||
75 | wattrset(win, 0); | ||
76 | getmaxyx(win, h, w); | ||
77 | getbegyx(win, by, bx); | ||
78 | |||
79 | sw = w / 3; | ||
80 | sh = h / 3; | ||
81 | |||
82 | if ((swin1 = derwin(win, sh, sw, 3, 5)) == NULL) | ||
83 | return 1; | ||
84 | if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL) | ||
85 | return 1; | ||
86 | if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL) | ||
87 | return 1; | ||
88 | |||
89 | init_pair(8, COLOR_RED, COLOR_BLUE); | ||
90 | wbkgd(swin1, COLOR_PAIR(8)); | ||
91 | werase(swin1); | ||
92 | mvwaddstr(swin1, 0, 3, "Sub-window 1"); | ||
93 | wrefresh(swin1); | ||
94 | |||
95 | init_pair(9, COLOR_CYAN, COLOR_MAGENTA); | ||
96 | wbkgd(swin2, COLOR_PAIR(9)); | ||
97 | werase(swin2); | ||
98 | mvwaddstr(swin2, 0, 3, "Sub-window 2"); | ||
99 | wrefresh(swin2); | ||
100 | |||
101 | init_pair(10, COLOR_YELLOW, COLOR_GREEN); | ||
102 | wbkgd(swin3, COLOR_PAIR(10)); | ||
103 | werase(swin3); | ||
104 | mvwaddstr(swin3, 0, 3, "Sub-window 3"); | ||
105 | wrefresh(swin3); | ||
106 | |||
107 | delwin(swin1); | ||
108 | delwin(swin2); | ||
109 | delwin(swin3); | ||
110 | WaitForUser(); | ||
111 | |||
112 | return 0; | ||
113 | } | ||
114 | |||
115 | int BouncingBalls(WINDOW *win) | ||
116 | { | ||
117 | chtype c1, c2, c3, ball1, ball2, ball3; | ||
118 | int w, h, x1, y1, xd1, yd1, x2, y2, xd2, yd2, x3, y3, xd3, yd3, c; | ||
119 | |||
120 | curs_set(0); | ||
121 | |||
122 | wbkgd(win, COLOR_PAIR(1)); | ||
123 | wrefresh(win); | ||
124 | wattrset(win, 0); | ||
125 | |||
126 | init_pair(11, COLOR_RED, COLOR_GREEN); | ||
127 | init_pair(12, COLOR_BLUE, COLOR_RED); | ||
128 | init_pair(13, COLOR_YELLOW, COLOR_WHITE); | ||
129 | |||
130 | ball1 = 'O' | COLOR_PAIR(11); | ||
131 | ball2 = '*' | COLOR_PAIR(12); | ||
132 | ball3 = '@' | COLOR_PAIR(13); | ||
133 | |||
134 | getmaxyx(win, h, w); | ||
135 | |||
136 | x1 = 2 + rand() % (w - 4); | ||
137 | y1 = 2 + rand() % (h - 4); | ||
138 | x2 = 2 + rand() % (w - 4); | ||
139 | y2 = 2 + rand() % (h - 4); | ||
140 | x3 = 2 + rand() % (w - 4); | ||
141 | y3 = 2 + rand() % (h - 4); | ||
142 | |||
143 | xd1 = 1; | ||
144 | yd1 = 1; | ||
145 | xd2 = 1; | ||
146 | yd2 = -1; | ||
147 | xd3 = -1; | ||
148 | yd3 = 1; | ||
149 | |||
150 | nodelay(stdscr, TRUE); | ||
151 | |||
152 | while ((c = getch()) == ERR) | ||
153 | { | ||
154 | x1 += xd1; | ||
155 | if (x1 <= 1 || x1 >= w - 2) | ||
156 | xd1 *= -1; | ||
157 | |||
158 | y1 += yd1; | ||
159 | if (y1 <= 1 || y1 >= h - 2) | ||
160 | yd1 *= -1; | ||
161 | |||
162 | x2 += xd2; | ||
163 | if (x2 <= 1 || x2 >= w - 2) | ||
164 | xd2 *= -1; | ||
165 | |||
166 | y2 += yd2; | ||
167 | if (y2 <= 1 || y2 >= h - 2) | ||
168 | yd2 *= -1; | ||
169 | |||
170 | x3 += xd3; | ||
171 | if (x3 <= 1 || x3 >= w - 2) | ||
172 | xd3 *= -1; | ||
173 | |||
174 | y3 += yd3; | ||
175 | if (y3 <= 1 || y3 >= h - 2) | ||
176 | yd3 *= -1; | ||
177 | |||
178 | c1 = mvwinch(win, y1, x1); | ||
179 | c2 = mvwinch(win, y2, x2); | ||
180 | c3 = mvwinch(win, y3, x3); | ||
181 | |||
182 | mvwaddch(win, y1, x1, ball1); | ||
183 | mvwaddch(win, y2, x2, ball2); | ||
184 | mvwaddch(win, y3, x3, ball3); | ||
185 | |||
186 | wmove(win, 0, 0); | ||
187 | wrefresh(win); | ||
188 | |||
189 | mvwaddch(win, y1, x1, c1); | ||
190 | mvwaddch(win, y2, x2, c2); | ||
191 | mvwaddch(win, y3, x3, c3); | ||
192 | |||
193 | napms(150); | ||
194 | } | ||
195 | |||
196 | nodelay(stdscr, FALSE); | ||
197 | ungetch(c); | ||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | /* Trap interrupt */ | ||
202 | |||
203 | void trap(int sig) | ||
204 | { | ||
205 | if (sig == SIGINT) | ||
206 | { | ||
207 | endwin(); | ||
208 | |||
209 | exit(0); | ||
210 | } | ||
211 | } | ||
212 | |||
213 | int main(int argc, char **argv) | ||
214 | { | ||
215 | WINDOW *win; | ||
216 | chtype save[80], ch; | ||
217 | int width, height, w, x, y, i, j, seed; | ||
218 | |||
219 | #ifdef XCURSES | ||
220 | Xinitscr(argc, argv); | ||
221 | #else | ||
222 | initscr(); | ||
223 | #endif | ||
224 | seed = time((time_t *)0); | ||
225 | srand(seed); | ||
226 | |||
227 | start_color(); | ||
228 | # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) | ||
229 | use_default_colors(); | ||
230 | # endif | ||
231 | cbreak(); | ||
232 | noecho(); | ||
233 | |||
234 | curs_set(0); | ||
235 | |||
236 | #if !defined(__TURBOC__) && !defined(OS2) | ||
237 | signal(SIGINT, trap); | ||
238 | #endif | ||
239 | noecho(); | ||
240 | |||
241 | /* refresh stdscr so that reading from it will not cause it to | ||
242 | overwrite the other windows that are being created */ | ||
243 | |||
244 | refresh(); | ||
245 | |||
246 | /* Create a drawing window */ | ||
247 | |||
248 | width = 48; | ||
249 | height = 15; | ||
250 | |||
251 | win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2); | ||
252 | |||
253 | if (win == NULL) | ||
254 | { | ||
255 | endwin(); | ||
256 | |||
257 | return 1; | ||
258 | } | ||
259 | |||
260 | for (;;) | ||
261 | { | ||
262 | init_pair(1, COLOR_WHITE, COLOR_BLUE); | ||
263 | wbkgd(win, COLOR_PAIR(1)); | ||
264 | werase(win); | ||
265 | |||
266 | init_pair(2, COLOR_RED, COLOR_RED); | ||
267 | wattrset(win, COLOR_PAIR(2)); | ||
268 | box(win, ' ', ' '); | ||
269 | wrefresh(win); | ||
270 | |||
271 | wattrset(win, 0); | ||
272 | |||
273 | /* Do random output of a character */ | ||
274 | |||
275 | ch = 'a'; | ||
276 | |||
277 | nodelay(stdscr, TRUE); | ||
278 | |||
279 | for (i = 0; i < 5000; ++i) | ||
280 | { | ||
281 | x = rand() % (width - 2) + 1; | ||
282 | y = rand() % (height - 2) + 1; | ||
283 | |||
284 | mvwaddch(win, y, x, ch); | ||
285 | wrefresh(win); | ||
286 | |||
287 | if (getch() != ERR) | ||
288 | break; | ||
289 | |||
290 | if (i == 2000) | ||
291 | { | ||
292 | ch = 'b'; | ||
293 | init_pair(3, COLOR_CYAN, COLOR_YELLOW); | ||
294 | wattrset(win, COLOR_PAIR(3)); | ||
295 | } | ||
296 | } | ||
297 | |||
298 | nodelay(stdscr, FALSE); | ||
299 | |||
300 | SubWinTest(win); | ||
301 | |||
302 | /* Erase and draw green window */ | ||
303 | |||
304 | init_pair(4, COLOR_YELLOW, COLOR_GREEN); | ||
305 | wbkgd(win, COLOR_PAIR(4)); | ||
306 | wattrset(win, A_BOLD); | ||
307 | werase(win); | ||
308 | wrefresh(win); | ||
309 | |||
310 | /* Draw RED bounding box */ | ||
311 | |||
312 | wattrset(win, COLOR_PAIR(2)); | ||
313 | box(win, ' ', ' '); | ||
314 | wrefresh(win); | ||
315 | |||
316 | /* Display Australia map */ | ||
317 | |||
318 | wattrset(win, A_BOLD); | ||
319 | i = 0; | ||
320 | |||
321 | while (*AusMap[i]) | ||
322 | { | ||
323 | mvwaddstr(win, i + 1, 8, AusMap[i]); | ||
324 | wrefresh(win); | ||
325 | napms(100); | ||
326 | ++i; | ||
327 | } | ||
328 | |||
329 | init_pair(5, COLOR_BLUE, COLOR_WHITE); | ||
330 | wattrset(win, COLOR_PAIR(5) | A_BLINK); | ||
331 | mvwaddstr(win, height - 2, 3, | ||
332 | " PDCurses 3.4 - DOS, OS/2, Win32, X11, SDL"); | ||
333 | wrefresh(win); | ||
334 | |||
335 | /* Draw running messages */ | ||
336 | |||
337 | init_pair(6, COLOR_BLACK, COLOR_WHITE); | ||
338 | wattrset(win, COLOR_PAIR(6)); | ||
339 | w = width - 2; | ||
340 | nodelay(win, TRUE); | ||
341 | |||
342 | /* jbuhler's re-hacked scrolling messages */ | ||
343 | |||
344 | for (j = 0; messages[j] != NULL; j++) | ||
345 | { | ||
346 | char *message = messages[j]; | ||
347 | int msg_len = strlen(message); | ||
348 | int scroll_len = w + 2 * msg_len; | ||
349 | char *scrollbuf = malloc(scroll_len); | ||
350 | char *visbuf = scrollbuf + msg_len; | ||
351 | int stop = 0; | ||
352 | int i; | ||
353 | |||
354 | for (i = w + msg_len; i > 0; i--) | ||
355 | { | ||
356 | memset(visbuf, ' ', w); | ||
357 | strncpy(scrollbuf + i, message, msg_len); | ||
358 | mvwaddnstr(win, height / 2, 1, visbuf, w); | ||
359 | wrefresh(win); | ||
360 | |||
361 | if (wgetch(win) != ERR) | ||
362 | { | ||
363 | flushinp(); | ||
364 | stop = 1; | ||
365 | break; | ||
366 | } | ||
367 | |||
368 | napms(100); | ||
369 | } | ||
370 | |||
371 | free(scrollbuf); | ||
372 | |||
373 | if (stop) | ||
374 | break; | ||
375 | } | ||
376 | |||
377 | j = 0; | ||
378 | |||
379 | /* Draw running 'A's across in RED */ | ||
380 | |||
381 | init_pair(7, COLOR_RED, COLOR_GREEN); | ||
382 | wattron(win, COLOR_PAIR(7)); | ||
383 | |||
384 | for (i = 2; i < width - 4; ++i) | ||
385 | { | ||
386 | ch = mvwinch(win, 5, i); | ||
387 | save[j++] = ch; | ||
388 | ch = ch & 0x7f; | ||
389 | mvwaddch(win, 5, i, ch); | ||
390 | } | ||
391 | |||
392 | wrefresh(win); | ||
393 | |||
394 | /* Put a message up; wait for a key */ | ||
395 | |||
396 | i = height - 2; | ||
397 | wattrset(win, COLOR_PAIR(5)); | ||
398 | mvwaddstr(win, i, 3, | ||
399 | " Type a key to continue or ESC to quit "); | ||
400 | wrefresh(win); | ||
401 | |||
402 | if (WaitForUser() == '\033') | ||
403 | break; | ||
404 | |||
405 | /* Restore the old line */ | ||
406 | |||
407 | wattrset(win, 0); | ||
408 | |||
409 | for (i = 2, j = 0; i < width - 4; ++i) | ||
410 | mvwaddch(win, 5, i, save[j++]); | ||
411 | |||
412 | wrefresh(win); | ||
413 | |||
414 | BouncingBalls(win); | ||
415 | |||
416 | /* BouncingBalls() leaves a keystroke in the queue */ | ||
417 | |||
418 | if (WaitForUser() == '\033') | ||
419 | break; | ||
420 | } | ||
421 | |||
422 | endwin(); | ||
423 | |||
424 | return 0; | ||
425 | } |
File demos/ptest.c added (mode: 100644) (index 00000000..1134f6ff) | |||
1 | /* $Id: ptest.c,v 1.24 2008/07/13 16:08:17 wmcbrine Exp $ */ | ||
2 | |||
3 | #include <curses.h> | ||
4 | #include <panel.h> | ||
5 | #include <stdlib.h> | ||
6 | |||
7 | PANEL *p1, *p2, *p3, *p4, *p5; | ||
8 | WINDOW *w4, *w5; | ||
9 | |||
10 | long nap_msec = 1; | ||
11 | |||
12 | char *mod[] = | ||
13 | { | ||
14 | "test ", "TEST ", "(**) ", "*()* ", "<--> ", "LAST " | ||
15 | }; | ||
16 | |||
17 | void pflush(void) | ||
18 | { | ||
19 | update_panels(); | ||
20 | doupdate(); | ||
21 | } | ||
22 | |||
23 | void backfill(void) | ||
24 | { | ||
25 | int y, x; | ||
26 | |||
27 | erase(); | ||
28 | |||
29 | for (y = 0; y < LINES - 1; y++) | ||
30 | for (x = 0; x < COLS; x++) | ||
31 | printw("%d", (y + x) % 10); | ||
32 | } | ||
33 | |||
34 | void wait_a_while(long msec) | ||
35 | { | ||
36 | int c; | ||
37 | |||
38 | if (msec != 1) | ||
39 | timeout(msec); | ||
40 | |||
41 | c = getch(); | ||
42 | |||
43 | if (c == 'q') | ||
44 | { | ||
45 | endwin(); | ||
46 | exit(1); | ||
47 | } | ||
48 | } | ||
49 | |||
50 | void saywhat(const char *text) | ||
51 | { | ||
52 | mvprintw(LINES - 1, 0, "%-20.20s", text); | ||
53 | } | ||
54 | |||
55 | /* mkpanel - alloc a win and panel and associate them */ | ||
56 | |||
57 | PANEL *mkpanel(int rows, int cols, int tly, int tlx) | ||
58 | { | ||
59 | WINDOW *win = newwin(rows, cols, tly, tlx); | ||
60 | PANEL *pan = (PANEL *)0; | ||
61 | |||
62 | if (win) | ||
63 | { | ||
64 | pan = new_panel(win); | ||
65 | |||
66 | if (!pan) | ||
67 | delwin(win); | ||
68 | } | ||
69 | |||
70 | return pan; | ||
71 | } | ||
72 | |||
73 | void rmpanel(PANEL *pan) | ||
74 | { | ||
75 | WINDOW *win = pan->win; | ||
76 | |||
77 | del_panel(pan); | ||
78 | delwin(win); | ||
79 | } | ||
80 | |||
81 | void fill_panel(PANEL *pan) | ||
82 | { | ||
83 | WINDOW *win = pan->win; | ||
84 | char num = *((char *)pan->user + 1); | ||
85 | int y, x, maxy, maxx; | ||
86 | |||
87 | box(win, 0, 0); | ||
88 | mvwprintw(win, 1, 1, "-pan%c-", num); | ||
89 | getmaxyx(win, maxy, maxx); | ||
90 | |||
91 | for (y = 2; y < maxy - 1; y++) | ||
92 | for (x = 1; x < maxx - 1; x++) | ||
93 | mvwaddch(win, y, x, num); | ||
94 | } | ||
95 | |||
96 | int main(int argc, char **argv) | ||
97 | { | ||
98 | int itmp, y; | ||
99 | |||
100 | if (argc > 1 && atol(argv[1])) | ||
101 | nap_msec = atol(argv[1]); | ||
102 | |||
103 | #ifdef XCURSES | ||
104 | Xinitscr(argc, argv); | ||
105 | #else | ||
106 | initscr(); | ||
107 | #endif | ||
108 | backfill(); | ||
109 | |||
110 | for (y = 0; y < 5; y++) | ||
111 | { | ||
112 | p1 = mkpanel(10, 10, 0, 0); | ||
113 | set_panel_userptr(p1, "p1"); | ||
114 | |||
115 | p2 = mkpanel(14, 14, 5, 5); | ||
116 | set_panel_userptr(p2, "p2"); | ||
117 | |||
118 | p3 = mkpanel(6, 8, 12, 12); | ||
119 | set_panel_userptr(p3, "p3"); | ||
120 | |||
121 | p4 = mkpanel(10, 10, 10, 30); | ||
122 | w4 = panel_window(p4); | ||
123 | set_panel_userptr(p4, "p4"); | ||
124 | |||
125 | p5 = mkpanel(10, 10, 13, 37); | ||
126 | w5 = panel_window(p5); | ||
127 | set_panel_userptr(p5, "p5"); | ||
128 | |||
129 | fill_panel(p1); | ||
130 | fill_panel(p2); | ||
131 | fill_panel(p3); | ||
132 | fill_panel(p4); | ||
133 | fill_panel(p5); | ||
134 | hide_panel(p4); | ||
135 | hide_panel(p5); | ||
136 | pflush(); | ||
137 | wait_a_while(nap_msec); | ||
138 | |||
139 | saywhat("h3 s1 s2 s4 s5;"); | ||
140 | move_panel(p1, 0, 0); | ||
141 | hide_panel(p3); | ||
142 | show_panel(p1); | ||
143 | show_panel(p2); | ||
144 | show_panel(p4); | ||
145 | show_panel(p5); | ||
146 | pflush(); | ||
147 | wait_a_while(nap_msec); | ||
148 | |||
149 | saywhat("s1;"); | ||
150 | show_panel(p1); | ||
151 | pflush(); | ||
152 | wait_a_while(nap_msec); | ||
153 | |||
154 | saywhat("s2;"); | ||
155 | show_panel(p2); | ||
156 | pflush(); | ||
157 | wait_a_while(nap_msec); | ||
158 | |||
159 | saywhat("m2;"); | ||
160 | move_panel(p2, 10, 10); | ||
161 | pflush(); | ||
162 | wait_a_while(nap_msec); | ||
163 | |||
164 | saywhat("s3;"); | ||
165 | show_panel(p3); | ||
166 | pflush(); | ||
167 | wait_a_while(nap_msec); | ||
168 | |||
169 | saywhat("m3;"); | ||
170 | move_panel(p3, 5, 5); | ||
171 | pflush(); | ||
172 | wait_a_while(nap_msec); | ||
173 | |||
174 | saywhat("b3;"); | ||
175 | bottom_panel(p3); | ||
176 | pflush(); | ||
177 | wait_a_while(nap_msec); | ||
178 | |||
179 | saywhat("s4;"); | ||
180 | show_panel(p4); | ||
181 | pflush(); | ||
182 | wait_a_while(nap_msec); | ||
183 | |||
184 | saywhat("s5;"); | ||
185 | show_panel(p5); | ||
186 | pflush(); | ||
187 | wait_a_while(nap_msec); | ||
188 | |||
189 | saywhat("t3;"); | ||
190 | top_panel(p3); | ||
191 | pflush(); | ||
192 | wait_a_while(nap_msec); | ||
193 | |||
194 | saywhat("t1;"); | ||
195 | top_panel(p1); | ||
196 | pflush(); | ||
197 | wait_a_while(nap_msec); | ||
198 | |||
199 | saywhat("t2;"); | ||
200 | top_panel(p2); | ||
201 | pflush(); | ||
202 | wait_a_while(nap_msec); | ||
203 | |||
204 | saywhat("t3;"); | ||
205 | top_panel(p3); | ||
206 | pflush(); | ||
207 | wait_a_while(nap_msec); | ||
208 | |||
209 | saywhat("t4;"); | ||
210 | top_panel(p4); | ||
211 | pflush(); | ||
212 | wait_a_while(nap_msec); | ||
213 | |||
214 | for (itmp = 0; itmp < 6; itmp++) | ||
215 | { | ||
216 | saywhat("m4;"); | ||
217 | mvwaddstr(w4, 3, 1, mod[itmp]); | ||
218 | move_panel(p4, 4, itmp * 10); | ||
219 | mvwaddstr(w5, 4, 1, mod[itmp]); | ||
220 | pflush(); | ||
221 | wait_a_while(nap_msec); | ||
222 | |||
223 | saywhat("m5;"); | ||
224 | mvwaddstr(w4, 4, 1, mod[itmp]); | ||
225 | move_panel(p5, 7, itmp * 10 + 6); | ||
226 | mvwaddstr(w5, 3, 1, mod[itmp]); | ||
227 | pflush(); | ||
228 | wait_a_while(nap_msec); | ||
229 | } | ||
230 | |||
231 | saywhat("m4;"); | ||
232 | move_panel(p4, 4, itmp * 10); | ||
233 | pflush(); | ||
234 | wait_a_while(nap_msec); | ||
235 | |||
236 | saywhat("t5;"); | ||
237 | top_panel(p5); | ||
238 | pflush(); | ||
239 | wait_a_while(nap_msec); | ||
240 | |||
241 | saywhat("t2;"); | ||
242 | top_panel(p2); | ||
243 | pflush(); | ||
244 | wait_a_while(nap_msec); | ||
245 | |||
246 | saywhat("t1;"); | ||
247 | top_panel(p1); | ||
248 | pflush(); | ||
249 | wait_a_while(nap_msec); | ||
250 | |||
251 | saywhat("d2;"); | ||
252 | rmpanel(p2); | ||
253 | pflush(); | ||
254 | wait_a_while(nap_msec); | ||
255 | |||
256 | saywhat("h3;"); | ||
257 | hide_panel(p3); | ||
258 | pflush(); | ||
259 | wait_a_while(nap_msec); | ||
260 | |||
261 | saywhat("d1;"); | ||
262 | rmpanel(p1); | ||
263 | pflush(); | ||
264 | wait_a_while(nap_msec); | ||
265 | |||
266 | saywhat("d4; "); | ||
267 | rmpanel(p4); | ||
268 | pflush(); | ||
269 | wait_a_while(nap_msec); | ||
270 | |||
271 | saywhat("d5; "); | ||
272 | rmpanel(p5); | ||
273 | pflush(); | ||
274 | wait_a_while(nap_msec); | ||
275 | |||
276 | if (nap_msec == 1) | ||
277 | break; | ||
278 | |||
279 | nap_msec = 100L; | ||
280 | } | ||
281 | |||
282 | endwin(); | ||
283 | |||
284 | return 0; | ||
285 | } /* end of main */ |
File demos/rain.c added (mode: 100644) (index 00000000..51d05a90) | |||
1 | /**************************************************************************** | ||
2 | * Copyright (c) 2002 Free Software Foundation, Inc. * | ||
3 | * * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a * | ||
5 | * copy of this software and associated documentation files (the * | ||
6 | * "Software"), to deal in the Software without restriction, including * | ||
7 | * without limitation the rights to use, copy, modify, merge, publish, * | ||
8 | * distribute, distribute with modifications, sublicense, and/or sell * | ||
9 | * copies of the Software, and to permit persons to whom the Software is * | ||
10 | * furnished to do so, subject to the following conditions: * | ||
11 | * * | ||
12 | * The above copyright notice and this permission notice shall be included * | ||
13 | * in all copies or substantial portions of the Software. * | ||
14 | * * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * | ||
16 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * | ||
17 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * | ||
18 | * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * | ||
19 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * | ||
20 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * | ||
21 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * | ||
22 | * * | ||
23 | * Except as contained in this notice, the name(s) of the above copyright * | ||
24 | * holders shall not be used in advertising or otherwise to promote the * | ||
25 | * sale, use or other dealings in this Software without prior written * | ||
26 | * authorization. * | ||
27 | ****************************************************************************/ | ||
28 | |||
29 | /* $Id: rain.c,v 1.11 2008/07/13 16:08:17 wmcbrine Exp $ */ | ||
30 | |||
31 | #include <curses.h> | ||
32 | #include <stdlib.h> | ||
33 | #include <time.h> | ||
34 | |||
35 | /* rain 11/3/1980 EPS/CITHEP */ | ||
36 | |||
37 | static int next_j(int j) | ||
38 | { | ||
39 | if (j == 0) | ||
40 | j = 4; | ||
41 | else | ||
42 | --j; | ||
43 | |||
44 | if (has_colors()) | ||
45 | { | ||
46 | int z = rand() % 3; | ||
47 | chtype color = COLOR_PAIR(z); | ||
48 | |||
49 | if (z) | ||
50 | color |= A_BOLD; | ||
51 | |||
52 | attrset(color); | ||
53 | } | ||
54 | |||
55 | return j; | ||
56 | } | ||
57 | |||
58 | int main(int argc, char *argv[]) | ||
59 | { | ||
60 | int x, y, j, r, c, seed; | ||
61 | static int xpos[5], ypos[5]; | ||
62 | |||
63 | #ifdef XCURSES | ||
64 | Xinitscr(argc, argv); | ||
65 | #else | ||
66 | initscr(); | ||
67 | #endif | ||
68 | seed = time((time_t *)0); | ||
69 | srand(seed); | ||
70 | |||
71 | if (has_colors()) | ||
72 | { | ||
73 | int bg = COLOR_BLACK; | ||
74 | |||
75 | start_color(); | ||
76 | |||
77 | #if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) | ||
78 | if (use_default_colors() == OK) | ||
79 | bg = -1; | ||
80 | #endif | ||
81 | init_pair(1, COLOR_BLUE, bg); | ||
82 | init_pair(2, COLOR_CYAN, bg); | ||
83 | } | ||
84 | |||
85 | nl(); | ||
86 | noecho(); | ||
87 | curs_set(0); | ||
88 | timeout(0); | ||
89 | keypad(stdscr, TRUE); | ||
90 | |||
91 | r = LINES - 4; | ||
92 | c = COLS - 4; | ||
93 | |||
94 | for (j = 5; --j >= 0;) | ||
95 | { | ||
96 | xpos[j] = rand() % c + 2; | ||
97 | ypos[j] = rand() % r + 2; | ||
98 | } | ||
99 | |||
100 | for (j = 0;;) | ||
101 | { | ||
102 | x = rand() % c + 2; | ||
103 | y = rand() % r + 2; | ||
104 | |||
105 | mvaddch(y, x, '.'); | ||
106 | |||
107 | mvaddch(ypos[j], xpos[j], 'o'); | ||
108 | |||
109 | j = next_j(j); | ||
110 | mvaddch(ypos[j], xpos[j], 'O'); | ||
111 | |||
112 | j = next_j(j); | ||
113 | mvaddch(ypos[j] - 1, xpos[j], '-'); | ||
114 | mvaddstr(ypos[j], xpos[j] - 1, "|.|"); | ||
115 | mvaddch(ypos[j] + 1, xpos[j], '-'); | ||
116 | |||
117 | j = next_j(j); | ||
118 | mvaddch(ypos[j] - 2, xpos[j], '-'); | ||
119 | mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\"); | ||
120 | mvaddstr(ypos[j], xpos[j] - 2, "| O |"); | ||
121 | mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /"); | ||
122 | mvaddch(ypos[j] + 2, xpos[j], '-'); | ||
123 | |||
124 | j = next_j(j); | ||
125 | mvaddch(ypos[j] - 2, xpos[j], ' '); | ||
126 | mvaddstr(ypos[j] - 1, xpos[j] - 1, " "); | ||
127 | mvaddstr(ypos[j], xpos[j] - 2, " "); | ||
128 | mvaddstr(ypos[j] + 1, xpos[j] - 1, " "); | ||
129 | mvaddch(ypos[j] + 2, xpos[j], ' '); | ||
130 | |||
131 | xpos[j] = x; | ||
132 | ypos[j] = y; | ||
133 | |||
134 | switch (getch()) | ||
135 | { | ||
136 | case 'q': | ||
137 | case 'Q': | ||
138 | curs_set(1); | ||
139 | endwin(); | ||
140 | return EXIT_SUCCESS; | ||
141 | case 's': | ||
142 | nodelay(stdscr, FALSE); | ||
143 | break; | ||
144 | case ' ': | ||
145 | nodelay(stdscr, TRUE); | ||
146 | #ifdef KEY_RESIZE | ||
147 | break; | ||
148 | case KEY_RESIZE: | ||
149 | # ifdef PDCURSES | ||
150 | resize_term(0, 0); | ||
151 | erase(); | ||
152 | # endif | ||
153 | r = LINES - 4; | ||
154 | c = COLS - 4; | ||
155 | #endif | ||
156 | } | ||
157 | napms(50); | ||
158 | } | ||
159 | } |
File demos/testcurs.c added (mode: 100644) (index 00000000..5b330f55) | |||
1 | /* | ||
2 | * This is a test program for PDCurses. Originally by | ||
3 | * John Burnell <johnb@kea.am.dsir.govt.nz> | ||
4 | * | ||
5 | * wrs(5/28/93) -- modified to be consistent (perform identically) | ||
6 | * with either PDCurses or under Unix System V, R4 | ||
7 | * | ||
8 | * $Id: testcurs.c,v 1.85 2008/07/14 12:35:23 wmcbrine Exp $ | ||
9 | */ | ||
10 | |||
11 | #ifndef _XOPEN_SOURCE_EXTENDED | ||
12 | # define _XOPEN_SOURCE_EXTENDED 1 | ||
13 | #endif | ||
14 | |||
15 | #include <stdio.h> | ||
16 | #include <ctype.h> | ||
17 | #include <string.h> | ||
18 | #include <curses.h> | ||
19 | |||
20 | #ifdef WACS_S1 | ||
21 | # define HAVE_WIDE 1 | ||
22 | #else | ||
23 | # define HAVE_WIDE 0 | ||
24 | #endif | ||
25 | |||
26 | #include <locale.h> | ||
27 | |||
28 | #if HAVE_WIDE | ||
29 | # include <wchar.h> | ||
30 | #endif | ||
31 | |||
32 | #if defined(PDCURSES) && !defined(XCURSES) | ||
33 | # define HAVE_RESIZE 1 | ||
34 | #else | ||
35 | # define HAVE_RESIZE 0 | ||
36 | #endif | ||
37 | |||
38 | #ifdef A_COLOR | ||
39 | # define HAVE_COLOR 1 | ||
40 | #else | ||
41 | # define HAVE_COLOR 0 | ||
42 | #endif | ||
43 | |||
44 | /* Set to non-zero if you want to test the PDCurses clipboard */ | ||
45 | |||
46 | #define HAVE_CLIPBOARD 0 | ||
47 | |||
48 | void inputTest(WINDOW *); | ||
49 | void scrollTest(WINDOW *); | ||
50 | void introTest(WINDOW *); | ||
51 | int initTest(WINDOW **, int, char **); | ||
52 | void outputTest(WINDOW *); | ||
53 | void padTest(WINDOW *); | ||
54 | void acsTest(WINDOW *); | ||
55 | |||
56 | #if HAVE_COLOR | ||
57 | void colorTest(WINDOW *); | ||
58 | #endif | ||
59 | |||
60 | #if HAVE_RESIZE | ||
61 | void resizeTest(WINDOW *); | ||
62 | #endif | ||
63 | |||
64 | #if HAVE_CLIPBOARD | ||
65 | void clipboardTest(WINDOW *); | ||
66 | #endif | ||
67 | |||
68 | #if HAVE_WIDE | ||
69 | void wideTest(WINDOW *); | ||
70 | #endif | ||
71 | |||
72 | void display_menu(int, int); | ||
73 | |||
74 | struct commands | ||
75 | { | ||
76 | const char *text; | ||
77 | void (*function)(WINDOW *); | ||
78 | }; | ||
79 | |||
80 | typedef struct commands COMMAND; | ||
81 | |||
82 | #define MAX_OPTIONS (6 + HAVE_COLOR + HAVE_RESIZE + HAVE_CLIPBOARD + HAVE_WIDE) | ||
83 | |||
84 | COMMAND command[MAX_OPTIONS] = | ||
85 | { | ||
86 | {"Intro Test", introTest}, | ||
87 | {"Pad Test", padTest}, | ||
88 | #if HAVE_RESIZE | ||
89 | {"Resize Test", resizeTest}, | ||
90 | #endif | ||
91 | {"Scroll Test", scrollTest}, | ||
92 | {"Input Test", inputTest}, | ||
93 | {"Output Test", outputTest}, | ||
94 | {"ACS Test", acsTest}, | ||
95 | #if HAVE_COLOR | ||
96 | {"Color Test", colorTest}, | ||
97 | #endif | ||
98 | #if HAVE_CLIPBOARD | ||
99 | {"Clipboard Test", clipboardTest}, | ||
100 | #endif | ||
101 | #if HAVE_WIDE | ||
102 | {"Wide Input", wideTest} | ||
103 | #endif | ||
104 | }; | ||
105 | |||
106 | int width, height; | ||
107 | |||
108 | int main(int argc, char *argv[]) | ||
109 | { | ||
110 | WINDOW *win; | ||
111 | int key, old_option = -1, new_option = 0; | ||
112 | bool quit = FALSE; | ||
113 | |||
114 | setlocale(LC_ALL, ""); | ||
115 | |||
116 | if (initTest(&win, argc, argv)) | ||
117 | return 1; | ||
118 | |||
119 | #ifdef A_COLOR | ||
120 | if (has_colors()) | ||
121 | { | ||
122 | init_pair(1, COLOR_WHITE, COLOR_BLUE); | ||
123 | wbkgd(win, COLOR_PAIR(1)); | ||
124 | } | ||
125 | else | ||
126 | #endif | ||
127 | wbkgd(win, A_REVERSE); | ||
128 | |||
129 | erase(); | ||
130 | display_menu(old_option, new_option); | ||
131 | |||
132 | while (1) | ||
133 | { | ||
134 | noecho(); | ||
135 | keypad(stdscr, TRUE); | ||
136 | raw(); | ||
137 | |||
138 | key = getch(); | ||
139 | |||
140 | switch(key) | ||
141 | { | ||
142 | case 10: | ||
143 | case 13: | ||
144 | case KEY_ENTER: | ||
145 | old_option = -1; | ||
146 | erase(); | ||
147 | refresh(); | ||
148 | (*command[new_option].function)(win); | ||
149 | erase(); | ||
150 | display_menu(old_option, new_option); | ||
151 | break; | ||
152 | |||
153 | case KEY_PPAGE: | ||
154 | case KEY_HOME: | ||
155 | old_option = new_option; | ||
156 | new_option = 0; | ||
157 | display_menu(old_option, new_option); | ||
158 | break; | ||
159 | |||
160 | case KEY_NPAGE: | ||
161 | case KEY_END: | ||
162 | old_option = new_option; | ||
163 | new_option = MAX_OPTIONS - 1; | ||
164 | display_menu(old_option, new_option); | ||
165 | break; | ||
166 | |||
167 | case KEY_UP: | ||
168 | old_option = new_option; | ||
169 | new_option = (new_option == 0) ? | ||
170 | new_option : new_option - 1; | ||
171 | display_menu(old_option, new_option); | ||
172 | break; | ||
173 | |||
174 | case KEY_DOWN: | ||
175 | old_option = new_option; | ||
176 | new_option = (new_option == MAX_OPTIONS - 1) ? | ||
177 | new_option : new_option + 1; | ||
178 | display_menu(old_option, new_option); | ||
179 | break; | ||
180 | #ifdef KEY_RESIZE | ||
181 | case KEY_RESIZE: | ||
182 | # ifdef PDCURSES | ||
183 | resize_term(0, 0); | ||
184 | # endif | ||
185 | old_option = -1; | ||
186 | erase(); | ||
187 | display_menu(old_option, new_option); | ||
188 | break; | ||
189 | #endif | ||
190 | case 'Q': | ||
191 | case 'q': | ||
192 | quit = TRUE; | ||
193 | } | ||
194 | |||
195 | if (quit == TRUE) | ||
196 | break; | ||
197 | } | ||
198 | |||
199 | delwin(win); | ||
200 | endwin(); | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | void Continue(WINDOW *win) | ||
206 | { | ||
207 | mvwaddstr(win, 10, 1, " Press any key to continue"); | ||
208 | wrefresh(win); | ||
209 | raw(); | ||
210 | wgetch(win); | ||
211 | } | ||
212 | |||
213 | void Continue2(void) | ||
214 | { | ||
215 | move(LINES - 1, 1); | ||
216 | clrtoeol(); | ||
217 | mvaddstr(LINES - 2, 1, " Press any key to continue"); | ||
218 | refresh(); | ||
219 | raw(); | ||
220 | getch(); | ||
221 | } | ||
222 | |||
223 | int initTest(WINDOW **win, int argc, char *argv[]) | ||
224 | { | ||
225 | #ifdef XCURSES | ||
226 | Xinitscr(argc, argv); | ||
227 | #else | ||
228 | initscr(); | ||
229 | #endif | ||
230 | #ifdef A_COLOR | ||
231 | if (has_colors()) | ||
232 | start_color(); | ||
233 | #endif | ||
234 | /* Create a drawing window */ | ||
235 | |||
236 | width = 60; | ||
237 | height = 13; | ||
238 | |||
239 | *win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2); | ||
240 | |||
241 | if (*win == NULL) | ||
242 | { | ||
243 | endwin(); | ||
244 | return 1; | ||
245 | } | ||
246 | |||
247 | return 0; | ||
248 | } | ||
249 | |||
250 | void introTest(WINDOW *win) | ||
251 | { | ||
252 | werase(win); | ||
253 | wmove(win, height / 2 - 5, width / 2); | ||
254 | wvline(win, ACS_VLINE, 10); | ||
255 | wmove(win, height / 2, width / 2 - 10); | ||
256 | whline(win, ACS_HLINE, 20); | ||
257 | Continue(win); | ||
258 | |||
259 | beep(); | ||
260 | werase(win); | ||
261 | |||
262 | box(win, ACS_VLINE, ACS_HLINE); | ||
263 | wrefresh(win); | ||
264 | |||
265 | cbreak(); | ||
266 | mvwaddstr(win, 1, 1, | ||
267 | "You should have a rectangle in the middle of the screen"); | ||
268 | mvwaddstr(win, 2, 1, "You should have heard a beep"); | ||
269 | Continue(win); | ||
270 | |||
271 | flash(); | ||
272 | mvwaddstr(win, 3, 1, "You should have seen a flash"); | ||
273 | Continue(win); | ||
274 | } | ||
275 | |||
276 | void scrollTest(WINDOW *win) | ||
277 | { | ||
278 | int i, OldY; | ||
279 | #ifndef PDCURSES | ||
280 | int OldX; | ||
281 | #endif | ||
282 | werase(win); | ||
283 | mvwaddstr(win, height - 2, 1, "The window will now scroll slowly"); | ||
284 | box(win, ACS_VLINE, ACS_HLINE); | ||
285 | wrefresh(win); | ||
286 | scrollok(win, TRUE); | ||
287 | napms(500); | ||
288 | |||
289 | for (i = 1; i <= height; i++) | ||
290 | { | ||
291 | napms(150); | ||
292 | scroll(win); | ||
293 | wrefresh(win); | ||
294 | }; | ||
295 | |||
296 | #ifdef PDCURSES | ||
297 | OldY = getmaxy(win); | ||
298 | #else | ||
299 | getmaxyx(win, OldY, OldX); | ||
300 | #endif | ||
301 | mvwaddstr(win, 6, 1, "The top of the window will scroll"); | ||
302 | wmove(win, 1, 1); | ||
303 | wsetscrreg(win, 0, 4); | ||
304 | box(win, ACS_VLINE, ACS_HLINE); | ||
305 | wrefresh(win); | ||
306 | |||
307 | for (i = 1; i <= 5; i++) | ||
308 | { | ||
309 | napms(500); | ||
310 | scroll(win); | ||
311 | wrefresh(win); | ||
312 | } | ||
313 | |||
314 | mvwaddstr(win, 3, 1, "The bottom of the window will scroll"); | ||
315 | wmove(win, 8, 1); | ||
316 | wsetscrreg(win, 5, --OldY); | ||
317 | box(win, ACS_VLINE, ACS_HLINE); | ||
318 | wrefresh(win); | ||
319 | |||
320 | for (i = 5; i <= OldY; i++) | ||
321 | { | ||
322 | napms(300); | ||
323 | wscrl(win, -1); | ||
324 | wrefresh(win); | ||
325 | } | ||
326 | |||
327 | wsetscrreg(win, 0, OldY); | ||
328 | } | ||
329 | |||
330 | void inputTest(WINDOW *win) | ||
331 | { | ||
332 | int w, h, bx, by, sw, sh, i, c, num = 0; | ||
333 | char buffer[80]; | ||
334 | WINDOW *subWin; | ||
335 | static const char spinner[4] = "/-\\|"; | ||
336 | int spinner_count = 0; | ||
337 | |||
338 | wclear(win); | ||
339 | |||
340 | getmaxyx(win, h, w); | ||
341 | getbegyx(win, by, bx); | ||
342 | |||
343 | sw = w / 3; | ||
344 | sh = h / 3; | ||
345 | |||
346 | if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) | ||
347 | == NULL) | ||
348 | return; | ||
349 | |||
350 | #ifdef A_COLOR | ||
351 | if (has_colors()) | ||
352 | { | ||
353 | init_pair(2, COLOR_WHITE, COLOR_RED); | ||
354 | wbkgd(subWin, COLOR_PAIR(2) | A_BOLD); | ||
355 | } | ||
356 | else | ||
357 | #endif | ||
358 | wbkgd(subWin, A_BOLD); | ||
359 | |||
360 | box(subWin, ACS_VLINE, ACS_HLINE); | ||
361 | wrefresh(win); | ||
362 | |||
363 | nocbreak(); | ||
364 | |||
365 | wclear (win); | ||
366 | mvwaddstr(win, 1, 1, | ||
367 | "Press keys (or mouse buttons) to show their names"); | ||
368 | mvwaddstr(win, 2, 1, "Press spacebar to finish"); | ||
369 | wrefresh(win); | ||
370 | |||
371 | keypad(win, TRUE); | ||
372 | raw(); | ||
373 | noecho(); | ||
374 | |||
375 | wtimeout(win, 200); | ||
376 | |||
377 | #ifdef PDCURSES | ||
378 | mouse_set(ALL_MOUSE_EVENTS); | ||
379 | PDC_save_key_modifiers(TRUE); | ||
380 | PDC_return_key_modifiers(TRUE); | ||
381 | #endif | ||
382 | curs_set(0); /* turn cursor off */ | ||
383 | |||
384 | while (1) | ||
385 | { | ||
386 | while (1) | ||
387 | { | ||
388 | c = wgetch(win); | ||
389 | |||
390 | if (c == ERR) | ||
391 | { | ||
392 | spinner_count++; | ||
393 | if (spinner_count == 4) | ||
394 | spinner_count = 0; | ||
395 | mvwaddch(win, 3, 3, spinner[spinner_count]); | ||
396 | wrefresh(win); | ||
397 | } | ||
398 | else | ||
399 | break; | ||
400 | } | ||
401 | #ifdef PDCURSES | ||
402 | wmove(win, 4, 18); | ||
403 | wclrtoeol(win); | ||
404 | #endif | ||
405 | mvwaddstr(win, 3, 5, "Key Pressed: "); | ||
406 | wclrtoeol(win); | ||
407 | |||
408 | if (c >= KEY_MIN) | ||
409 | wprintw(win, "%s", keyname(c)); | ||
410 | else if (isprint(c)) | ||
411 | wprintw(win, "%c", c); | ||
412 | else | ||
413 | wprintw(win, "%s", unctrl(c)); | ||
414 | #ifdef PDCURSES | ||
415 | if (c == KEY_MOUSE) | ||
416 | { | ||
417 | int button = 0; | ||
418 | request_mouse_pos(); | ||
419 | |||
420 | if (BUTTON_CHANGED(1)) | ||
421 | button = 1; | ||
422 | else if (BUTTON_CHANGED(2)) | ||
423 | button = 2; | ||
424 | else if (BUTTON_CHANGED(3)) | ||
425 | button = 3; | ||
426 | |||
427 | if (button && (BUTTON_STATUS(button) & | ||
428 | BUTTON_MODIFIER_MASK)) | ||
429 | { | ||
430 | waddstr(win, " Modifier(s):"); | ||
431 | |||
432 | if (BUTTON_STATUS(button) & BUTTON_SHIFT) | ||
433 | waddstr(win, " SHIFT"); | ||
434 | |||
435 | if (BUTTON_STATUS(button) & BUTTON_CONTROL) | ||
436 | waddstr(win, " CONTROL"); | ||
437 | |||
438 | if (BUTTON_STATUS(button) & BUTTON_ALT) | ||
439 | waddstr(win, " ALT"); | ||
440 | } | ||
441 | |||
442 | wmove(win, 4, 18); | ||
443 | wclrtoeol(win); | ||
444 | wprintw(win, "Button %d: ", button); | ||
445 | |||
446 | if (MOUSE_MOVED) | ||
447 | waddstr(win, "moved: "); | ||
448 | else if (MOUSE_WHEEL_UP) | ||
449 | waddstr(win, "wheel up: "); | ||
450 | else if (MOUSE_WHEEL_DOWN) | ||
451 | waddstr(win, "wheel dn: "); | ||
452 | else if ((BUTTON_STATUS(button) & | ||
453 | BUTTON_ACTION_MASK) == BUTTON_PRESSED) | ||
454 | waddstr(win, "pressed: "); | ||
455 | else if ((BUTTON_STATUS(button) & | ||
456 | BUTTON_ACTION_MASK) == BUTTON_CLICKED) | ||
457 | waddstr(win, "clicked: "); | ||
458 | else if ((BUTTON_STATUS(button) & | ||
459 | BUTTON_ACTION_MASK) == BUTTON_DOUBLE_CLICKED) | ||
460 | waddstr(win, "double: "); | ||
461 | else | ||
462 | waddstr(win, "released: "); | ||
463 | |||
464 | wprintw(win, "Position: Y: %d X: %d", MOUSE_Y_POS, MOUSE_X_POS); | ||
465 | } | ||
466 | else if (PDC_get_key_modifiers()) | ||
467 | { | ||
468 | waddstr(win, " Modifier(s):"); | ||
469 | if (PDC_get_key_modifiers() & PDC_KEY_MODIFIER_SHIFT) | ||
470 | waddstr(win, " SHIFT"); | ||
471 | |||
472 | if (PDC_get_key_modifiers() & PDC_KEY_MODIFIER_CONTROL) | ||
473 | waddstr(win, " CONTROL"); | ||
474 | |||
475 | if (PDC_get_key_modifiers() & PDC_KEY_MODIFIER_ALT) | ||
476 | waddstr(win, " ALT"); | ||
477 | |||
478 | if (PDC_get_key_modifiers() & PDC_KEY_MODIFIER_NUMLOCK) | ||
479 | waddstr(win, " NUMLOCK"); | ||
480 | } | ||
481 | #endif | ||
482 | wrefresh(win); | ||
483 | |||
484 | if (c == ' ') | ||
485 | break; | ||
486 | } | ||
487 | |||
488 | wtimeout(win, -1); /* turn off timeout() */ | ||
489 | curs_set(1); /* turn cursor back on */ | ||
490 | |||
491 | #ifdef PDCURSES | ||
492 | mouse_set(0L); | ||
493 | PDC_save_key_modifiers(FALSE); | ||
494 | PDC_return_key_modifiers(FALSE); | ||
495 | #endif | ||
496 | wclear(win); | ||
497 | mvwaddstr(win, 2, 1, "Press some keys for 5 seconds"); | ||
498 | mvwaddstr(win, 1, 1, "Pressing ^C should do nothing"); | ||
499 | wrefresh(win); | ||
500 | |||
501 | werase(subWin); | ||
502 | box(subWin, ACS_VLINE, ACS_HLINE); | ||
503 | |||
504 | for (i = 0; i < 5; i++) | ||
505 | { | ||
506 | mvwprintw(subWin, 1, 1, "Time = %d", i); | ||
507 | wrefresh(subWin); | ||
508 | napms(1000); | ||
509 | flushinp(); | ||
510 | } | ||
511 | |||
512 | delwin(subWin); | ||
513 | werase(win); | ||
514 | flash(); | ||
515 | wrefresh(win); | ||
516 | napms(500); | ||
517 | flushinp(); | ||
518 | |||
519 | mvwaddstr(win, 2, 1, "Press a key, followed by ENTER"); | ||
520 | wmove(win, 9, 10); | ||
521 | wrefresh(win); | ||
522 | echo(); | ||
523 | |||
524 | keypad(win, TRUE); | ||
525 | raw(); | ||
526 | wgetnstr(win, buffer, 3); | ||
527 | flushinp(); | ||
528 | |||
529 | wmove(win, 9, 10); | ||
530 | wdelch(win); | ||
531 | mvwaddstr(win, 4, 1, "The character should now have been deleted"); | ||
532 | Continue(win); | ||
533 | |||
534 | refresh(); | ||
535 | wclear(win); | ||
536 | echo(); | ||
537 | buffer[0] = '\0'; | ||
538 | mvwaddstr(win, 3, 2, "The window should have moved"); | ||
539 | mvwaddstr(win, 4, 2, | ||
540 | "This text should have appeared without you pressing a key"); | ||
541 | mvwaddstr(win, 6, 2, "Enter a number then a string seperated by space"); | ||
542 | mvwin(win, 2, 1); | ||
543 | wrefresh(win); | ||
544 | mvwscanw(win, 7, 6, "%d %s", &num, buffer); | ||
545 | mvwprintw(win, 8, 6, "String: %s Number: %d", buffer, num); | ||
546 | Continue(win); | ||
547 | |||
548 | refresh(); | ||
549 | wclear(win); | ||
550 | echo(); | ||
551 | mvwaddstr(win, 3, 2, "Enter a 5 character string: "); | ||
552 | wgetnstr(win, buffer, 5); | ||
553 | mvwprintw(win, 4, 2, "String: %s", buffer); | ||
554 | Continue(win); | ||
555 | } | ||
556 | |||
557 | void outputTest(WINDOW *win) | ||
558 | { | ||
559 | WINDOW *win1; | ||
560 | char Buffer[80]; | ||
561 | chtype ch; | ||
562 | int by, bx; | ||
563 | |||
564 | nl(); | ||
565 | wclear(win); | ||
566 | mvwaddstr(win, 1, 1, "You should now have a screen in the upper " | ||
567 | "left corner, and this text should have wrapped"); | ||
568 | waddstr(win,"\nThis text should be down\n"); | ||
569 | waddstr(win, "and broken into two here ^"); | ||
570 | Continue(win); | ||
571 | |||
572 | wclear(win); | ||
573 | wattron(win, A_BOLD); | ||
574 | mvwaddstr(win, 1, 1, "A new window will appear with this text in it"); | ||
575 | mvwaddstr(win, 8, 1, "Press any key to continue"); | ||
576 | wrefresh(win); | ||
577 | wgetch(win); | ||
578 | |||
579 | getbegyx(win, by, bx); | ||
580 | |||
581 | if (LINES < 24 || COLS < 75) | ||
582 | { | ||
583 | mvwaddstr(win, 5, 1, "Some tests have been skipped as they require a"); | ||
584 | mvwaddstr(win, 6, 1, "display of at least 24 LINES by 75 COLUMNS"); | ||
585 | Continue(win); | ||
586 | } | ||
587 | else | ||
588 | { | ||
589 | win1 = newwin(10, 50, 14, 25); | ||
590 | |||
591 | if (win1 == NULL) | ||
592 | { | ||
593 | endwin(); | ||
594 | return; | ||
595 | } | ||
596 | |||
597 | #ifdef A_COLOR | ||
598 | if (has_colors()) | ||
599 | { | ||
600 | init_pair(3, COLOR_BLUE, COLOR_WHITE); | ||
601 | wbkgd(win1, COLOR_PAIR(3)); | ||
602 | } | ||
603 | else | ||
604 | #endif | ||
605 | wbkgd(win1, A_NORMAL); | ||
606 | |||
607 | wclear(win1); | ||
608 | mvwaddstr(win1, 5, 1, "This text should appear; using overlay option"); | ||
609 | copywin(win, win1, 0, 0, 0, 0, 9, 49, TRUE); | ||
610 | box(win1, ACS_VLINE, ACS_HLINE); | ||
611 | wmove(win1, 8, 26); | ||
612 | wrefresh(win1); | ||
613 | wgetch(win1); | ||
614 | |||
615 | wclear(win1); | ||
616 | |||
617 | wattron(win1, A_BLINK); | ||
618 | mvwaddstr(win1, 4, 1, | ||
619 | "This blinking text should appear in only the second window"); | ||
620 | wattroff(win1, A_BLINK); | ||
621 | |||
622 | mvwin(win1, by, bx); | ||
623 | overlay(win, win1); | ||
624 | mvwin(win1, 14, 25); | ||
625 | wmove(win1, 8, 26); | ||
626 | wrefresh(win1); | ||
627 | wgetch(win1); | ||
628 | |||
629 | delwin(win1); | ||
630 | } | ||
631 | |||
632 | clear(); | ||
633 | wclear(win); | ||
634 | wrefresh(win); | ||
635 | mvwaddstr(win, 6, 2, "This line shouldn't appear"); | ||
636 | mvwaddstr(win, 4, 2, "Only half of the next line is visible"); | ||
637 | mvwaddstr(win, 5, 2, "Only half of the next line is visible"); | ||
638 | wmove(win, 6, 1); | ||
639 | wclrtobot(win); | ||
640 | wmove(win, 5, 20); | ||
641 | wclrtoeol(win); | ||
642 | mvwaddstr(win, 8, 2, "This line also shouldn't appear"); | ||
643 | wmove(win, 8, 1); | ||
644 | winsdelln(win, -1); | ||
645 | Continue(win); | ||
646 | |||
647 | wmove(win, 5, 9); | ||
648 | ch = winch(win); | ||
649 | |||
650 | wclear(win); | ||
651 | wmove(win, 6, 2); | ||
652 | waddstr(win, "The next char should be l: "); | ||
653 | winsch(win, ch); | ||
654 | Continue(win); | ||
655 | |||
656 | mvwinsstr(win, 6, 2, "A1B2C3D4E5"); | ||
657 | Continue(win); | ||
658 | |||
659 | wmove(win, 5, 1); | ||
660 | winsdelln(win, 1); | ||
661 | mvwaddstr(win, 5, 2, "The lines below should have moved down"); | ||
662 | Continue(win); | ||
663 | |||
664 | wclear(win); | ||
665 | wmove(win, 2, 2); | ||
666 | wprintw(win, "This is a formatted string in a window: %d %s\n", | ||
667 | 42, "is it"); | ||
668 | mvwaddstr(win, 10, 1, "Enter a string: "); | ||
669 | wrefresh(win); | ||
670 | echo(); | ||
671 | wscanw(win, "%s", Buffer); | ||
672 | |||
673 | printw("This is a formatted string in stdscr: %d %s\n", 42, "is it"); | ||
674 | mvaddstr(10, 1, "Enter a string: "); | ||
675 | scanw("%s", Buffer); | ||
676 | |||
677 | wclear(win); | ||
678 | curs_set(2); | ||
679 | mvwaddstr(win, 1, 1, "The cursor should be in high-visibility mode"); | ||
680 | Continue(win); | ||
681 | |||
682 | wclear(win); | ||
683 | curs_set(0); | ||
684 | mvwaddstr(win, 1, 1, "The cursor should have disappeared"); | ||
685 | Continue(win); | ||
686 | |||
687 | wclear(win); | ||
688 | curs_set(1); | ||
689 | mvwaddstr(win, 1, 1, "The cursor should be normal"); | ||
690 | Continue(win); | ||
691 | |||
692 | #ifdef A_COLOR | ||
693 | if (has_colors()) | ||
694 | { | ||
695 | wclear(win); | ||
696 | mvwaddstr(win, 1, 1, "Colors should change after you press a key"); | ||
697 | Continue(win); | ||
698 | |||
699 | init_pair(1, COLOR_RED, COLOR_WHITE); | ||
700 | wrefresh(win); | ||
701 | } | ||
702 | #endif | ||
703 | werase(win); | ||
704 | mvwaddstr(win, 1, 1, "Information About Your Terminal"); | ||
705 | mvwaddstr(win, 3, 1, termname()); | ||
706 | mvwaddstr(win, 4, 1, longname()); | ||
707 | |||
708 | if (termattrs() & A_BLINK) | ||
709 | mvwaddstr(win, 5, 1, "This terminal claims to support blinking."); | ||
710 | else | ||
711 | mvwaddstr(win, 5, 1, "This terminal does NOT support blinking."); | ||
712 | |||
713 | mvwaddnstr(win, 7, 5, "Have a nice day!ok", 16); | ||
714 | wrefresh(win); | ||
715 | |||
716 | mvwinnstr(win, 7, 5, Buffer, 18); | ||
717 | mvaddstr(LINES - 2, 10, Buffer); | ||
718 | refresh(); | ||
719 | Continue(win); | ||
720 | } | ||
721 | |||
722 | #if HAVE_RESIZE | ||
723 | void resizeTest(WINDOW *dummy) | ||
724 | { | ||
725 | WINDOW *win1; | ||
726 | int nwidth = 135, nheight = 52; | ||
727 | int owidth = COLS, oheight = LINES; | ||
728 | |||
729 | savetty(); | ||
730 | |||
731 | resize_term(nheight, nwidth); | ||
732 | |||
733 | clear(); | ||
734 | refresh(); | ||
735 | |||
736 | win1 = newwin(10, 50, 14, 25); | ||
737 | |||
738 | if (win1 == NULL) | ||
739 | { | ||
740 | endwin(); | ||
741 | return; | ||
742 | } | ||
743 | |||
744 | #ifdef A_COLOR | ||
745 | if (has_colors()) | ||
746 | { | ||
747 | init_pair(3, COLOR_BLUE, COLOR_WHITE); | ||
748 | wattrset(win1, COLOR_PAIR(3)); | ||
749 | } | ||
750 | |||
751 | wclear(win1); | ||
752 | #endif | ||
753 | mvwaddstr(win1, 0, 0, "The screen may now be resized"); | ||
754 | mvwprintw(win1, 1, 4, "Given size: %d by %d", nwidth, nheight); | ||
755 | mvwprintw(win1, 2, 4, "Actual size: %d by %d", COLS, LINES); | ||
756 | Continue(win1); | ||
757 | |||
758 | wclear(win1); | ||
759 | resetty(); | ||
760 | |||
761 | mvwaddstr(win1, 0, 0, "The screen should now be reset"); | ||
762 | mvwprintw(win1, 1, 6, "Old size: %d by %d", owidth, oheight); | ||
763 | mvwprintw(win1, 2, 6, "Size now: %d by %d", COLS, LINES); | ||
764 | Continue(win1); | ||
765 | |||
766 | delwin(win1); | ||
767 | |||
768 | clear(); | ||
769 | refresh(); | ||
770 | } | ||
771 | #endif /* HAVE_RESIZE */ | ||
772 | |||
773 | void padTest(WINDOW *dummy) | ||
774 | { | ||
775 | WINDOW *pad, *spad; | ||
776 | |||
777 | pad = newpad(50, 100); | ||
778 | wattron(pad, A_REVERSE); | ||
779 | mvwaddstr(pad, 5, 2, "This is a new pad"); | ||
780 | wattrset(pad, 0); | ||
781 | mvwaddstr(pad, 8, 0, | ||
782 | "The end of this line should be truncated here:except now"); | ||
783 | mvwaddstr(pad, 11, 1, "This line should not appear.It will now"); | ||
784 | wmove(pad, 10, 1); | ||
785 | wclrtoeol(pad); | ||
786 | mvwaddstr(pad, 10, 1, " Press any key to continue"); | ||
787 | prefresh(pad, 0, 0, 0, 0, 10, 45); | ||
788 | keypad(pad, TRUE); | ||
789 | raw(); | ||
790 | wgetch(pad); | ||
791 | |||
792 | spad = subpad(pad, 12, 25, 7, 52); | ||
793 | mvwaddstr(spad, 2, 2, "This is a new subpad"); | ||
794 | box(spad, 0, 0); | ||
795 | prefresh(pad, 0, 0, 0, 0, 15, 75); | ||
796 | keypad(pad, TRUE); | ||
797 | raw(); | ||
798 | wgetch(pad); | ||
799 | |||
800 | mvwaddstr(pad, 35, 2, "This is displayed at line 35 in the pad"); | ||
801 | mvwaddstr(pad, 40, 1, " Press any key to continue"); | ||
802 | prefresh(pad, 30, 0, 0, 0, 10, 45); | ||
803 | keypad(pad, TRUE); | ||
804 | raw(); | ||
805 | wgetch(pad); | ||
806 | |||
807 | delwin(pad); | ||
808 | } | ||
809 | |||
810 | #if HAVE_CLIPBOARD | ||
811 | void clipboardTest(WINDOW *win) | ||
812 | { | ||
813 | static const char *text = | ||
814 | "This string placed in clipboard by PDCurses test program, testcurs."; | ||
815 | char *ptr = NULL; | ||
816 | long i, length = 0; | ||
817 | |||
818 | mvaddstr(1, 1, | ||
819 | "This test will display the contents of the system clipboard"); | ||
820 | |||
821 | Continue2(); | ||
822 | |||
823 | scrollok(stdscr, TRUE); | ||
824 | i = PDC_getclipboard(&ptr, &length); | ||
825 | |||
826 | switch(i) | ||
827 | { | ||
828 | case PDC_CLIP_ACCESS_ERROR: | ||
829 | mvaddstr(3, 1, "There was an error accessing the clipboard"); | ||
830 | refresh(); | ||
831 | break; | ||
832 | |||
833 | case PDC_CLIP_MEMORY_ERROR: | ||
834 | mvaddstr(3, 1, | ||
835 | "Unable to allocate memory for clipboard contents"); | ||
836 | break; | ||
837 | |||
838 | case PDC_CLIP_EMPTY: | ||
839 | mvaddstr(3, 1, "There was no text in the clipboard"); | ||
840 | break; | ||
841 | |||
842 | default: | ||
843 | wsetscrreg(stdscr, 0, LINES - 1); | ||
844 | clear(); | ||
845 | mvaddstr(1, 1, "Clipboard contents..."); | ||
846 | mvprintw(2, 1, "%s\n", ptr); | ||
847 | } | ||
848 | |||
849 | Continue2(); | ||
850 | |||
851 | clear(); | ||
852 | mvaddstr(1, 1, | ||
853 | "This test will place the following string in the system clipboard:"); | ||
854 | mvaddstr(2, 1, text); | ||
855 | |||
856 | i = PDC_setclipboard(text, strlen(text)); | ||
857 | |||
858 | switch(i) | ||
859 | { | ||
860 | case PDC_CLIP_ACCESS_ERROR: | ||
861 | mvaddstr(3, 1, "There was an error accessing the clipboard"); | ||
862 | break; | ||
863 | |||
864 | case PDC_CLIP_MEMORY_ERROR: | ||
865 | mvaddstr(3, 1, "Unable to allocate memory for clipboard contents"); | ||
866 | break; | ||
867 | |||
868 | default: | ||
869 | mvaddstr(3, 1, "The string was placed in the clipboard successfully"); | ||
870 | } | ||
871 | |||
872 | Continue2(); | ||
873 | } | ||
874 | #endif /* HAVE_CLIPBOARD */ | ||
875 | |||
876 | void acsTest(WINDOW *win) | ||
877 | { | ||
878 | #ifdef ACS_S3 | ||
879 | # define ACSNUM 32 | ||
880 | #else | ||
881 | # define ACSNUM 25 | ||
882 | #endif | ||
883 | static const char *acs_names[] = | ||
884 | { | ||
885 | "ACS_ULCORNER", "ACS_URCORNER", "ACS_LLCORNER", "ACS_LRCORNER", | ||
886 | "ACS_LTEE", "ACS_RTEE", "ACS_TTEE", "ACS_BTEE", "ACS_HLINE", | ||
887 | "ACS_VLINE", "ACS_PLUS", | ||
888 | |||
889 | "ACS_S1", "ACS_S9", "ACS_DIAMOND", "ACS_CKBOARD", "ACS_DEGREE", | ||
890 | "ACS_PLMINUS", "ACS_BULLET", | ||
891 | |||
892 | "ACS_LARROW", "ACS_RARROW", "ACS_UARROW", "ACS_DARROW", | ||
893 | "ACS_BOARD", "ACS_LANTERN", "ACS_BLOCK" | ||
894 | #ifdef ACS_S3 | ||
895 | , "ACS_S3", "ACS_S7", "ACS_LEQUAL", "ACS_GEQUAL", | ||
896 | "ACS_PI", "ACS_NEQUAL", "ACS_STERLING" | ||
897 | #endif | ||
898 | }; | ||
899 | |||
900 | chtype acs_values[ACSNUM]; | ||
901 | |||
902 | #if HAVE_WIDE | ||
903 | cchar_t *wacs_values[] = | ||
904 | { | ||
905 | WACS_ULCORNER, WACS_URCORNER, WACS_LLCORNER, WACS_LRCORNER, | ||
906 | WACS_LTEE, WACS_RTEE, WACS_TTEE, WACS_BTEE, WACS_HLINE, | ||
907 | WACS_VLINE, WACS_PLUS, | ||
908 | |||
909 | WACS_S1, WACS_S9, WACS_DIAMOND, WACS_CKBOARD, WACS_DEGREE, | ||
910 | WACS_PLMINUS, WACS_BULLET, | ||
911 | |||
912 | WACS_LARROW, WACS_RARROW, WACS_UARROW, WACS_DARROW, WACS_BOARD, | ||
913 | WACS_LANTERN, WACS_BLOCK | ||
914 | # ifdef WACS_S3 | ||
915 | , WACS_S3, WACS_S7, WACS_LEQUAL, WACS_GEQUAL, WACS_PI, | ||
916 | WACS_NEQUAL, WACS_STERLING | ||
917 | # endif | ||
918 | }; | ||
919 | |||
920 | static const wchar_t russian[] = {0x0420, 0x0443, 0x0441, 0x0441, | ||
921 | 0x043a, 0x0438, 0x0439, L' ', 0x044f, 0x0437, 0x044b, 0x043a, 0}; | ||
922 | |||
923 | static const wchar_t greek[] = {0x0395, 0x03bb, 0x03bb, 0x03b7, | ||
924 | 0x03bd, 0x03b9, 0x03ba, 0x03ac, 0}; | ||
925 | |||
926 | static const wchar_t georgian[] = {0x10e5, 0x10d0, 0x10e0, 0x10d7, | ||
927 | 0x10e3, 0x10da, 0x10d8, L' ', 0x10d4, 0x10dc, 0x10d0, 0}; | ||
928 | #endif | ||
929 | |||
930 | int i, tmarg = (LINES - 22) / 2; | ||
931 | |||
932 | attrset(A_BOLD); | ||
933 | mvaddstr(tmarg, (COLS - 23) / 2, "Alternate Character Set"); | ||
934 | attrset(A_NORMAL); | ||
935 | |||
936 | tmarg += 3; | ||
937 | |||
938 | #define A(b,c) acs_values[b] = ACS_##c | ||
939 | |||
940 | A(0,ULCORNER); A(1,URCORNER); A(2,LLCORNER); A(3,LRCORNER); | ||
941 | A(4,LTEE); A(5,RTEE); A(6,TTEE); A(7,BTEE); | ||
942 | A(8,HLINE); A(9,VLINE); A(10,PLUS); A(11,S1); | ||
943 | A(12,S9); A(13,DIAMOND); A(14,CKBOARD); A(15,DEGREE); | ||
944 | |||
945 | A(16,PLMINUS); A(17,BULLET); A(18,LARROW); A(19,RARROW); | ||
946 | A(20,UARROW); A(21,DARROW); A(22,BOARD); A(23,LANTERN); | ||
947 | A(24,BLOCK); | ||
948 | #ifdef ACS_S3 | ||
949 | A(25,S3); A(26,S7); A(27,LEQUAL); A(28,GEQUAL); | ||
950 | A(29,PI); A(30,NEQUAL); A(31,STERLING); | ||
951 | #endif | ||
952 | |||
953 | #undef A | ||
954 | |||
955 | for (i = 0; i < ACSNUM; i++) | ||
956 | { | ||
957 | move((i % 8) * 2 + tmarg, (i / 8) * (COLS / 4) + (COLS / 8 - 7)); | ||
958 | addch(acs_values[i]); | ||
959 | printw(" %s", acs_names[i]); | ||
960 | } | ||
961 | |||
962 | mvaddstr(tmarg + 18, 3, "Press any key to continue"); | ||
963 | getch(); | ||
964 | |||
965 | #if HAVE_WIDE | ||
966 | clear(); | ||
967 | |||
968 | attrset(A_BOLD); | ||
969 | mvaddstr(tmarg - 3, (COLS - 28) / 2, "Wide Alternate Character Set"); | ||
970 | attrset(A_NORMAL); | ||
971 | |||
972 | for (i = 0; i < ACSNUM; i++) | ||
973 | { | ||
974 | move((i % 8) * 2 + tmarg, (i / 8) * (COLS / 4) + (COLS / 8 - 7)); | ||
975 | add_wch(wacs_values[i]); | ||
976 | printw(" W%s", acs_names[i]); | ||
977 | } | ||
978 | |||
979 | /* Spanish, Russian, Greek, Georgian */ | ||
980 | |||
981 | mvaddwstr(tmarg + 16, COLS / 8 - 5, L"Espa\xf1ol"); | ||
982 | mvaddwstr(tmarg + 16, 3 * (COLS / 8) - 5, russian); | ||
983 | mvaddwstr(tmarg + 16, 5 * (COLS / 8) - 5, greek); | ||
984 | mvaddwstr(tmarg + 16, 7 * (COLS / 8) - 5, georgian); | ||
985 | |||
986 | mvaddstr(tmarg + 18, 3, "Press any key to continue"); | ||
987 | getch(); | ||
988 | #endif | ||
989 | } | ||
990 | |||
991 | #if HAVE_COLOR | ||
992 | void colorTest(WINDOW *win) | ||
993 | { | ||
994 | static const short colors[] = | ||
995 | { | ||
996 | COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, | ||
997 | COLOR_CYAN, COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE | ||
998 | }; | ||
999 | |||
1000 | static const char *colornames[] = | ||
1001 | { | ||
1002 | "COLOR_BLACK", "COLOR_RED", "COLOR_GREEN", "COLOR_BLUE", | ||
1003 | "COLOR_CYAN", "COLOR_MAGENTA", "COLOR_YELLOW", "COLOR_WHITE" | ||
1004 | }; | ||
1005 | |||
1006 | chtype fill = ACS_BLOCK; | ||
1007 | |||
1008 | int i, j, tmarg, col1, col2, col3; | ||
1009 | |||
1010 | if (!has_colors()) | ||
1011 | return; | ||
1012 | |||
1013 | tmarg = (LINES - 19) / 2; | ||
1014 | col1 = (COLS - 60) / 2; | ||
1015 | col2 = col1 + 20; | ||
1016 | col3 = col2 + 20; | ||
1017 | |||
1018 | attrset(A_BOLD); | ||
1019 | mvaddstr(tmarg, (COLS - 22) / 2, "Color Attribute Macros"); | ||
1020 | attrset(A_NORMAL); | ||
1021 | |||
1022 | mvaddstr(tmarg + 3, col2 + 4, "A_NORMAL"); | ||
1023 | mvaddstr(tmarg + 3, col3 + 5, "A_BOLD"); | ||
1024 | |||
1025 | for (i = 0; i < 8; i++) | ||
1026 | { | ||
1027 | init_pair(i + 4, colors[i], COLOR_BLACK); | ||
1028 | |||
1029 | mvaddstr(tmarg + i + 5, col1, colornames[i]); | ||
1030 | |||
1031 | for (j = 0; j < 16; j++) | ||
1032 | { | ||
1033 | mvaddch(tmarg + i + 5, col2 + j, fill | COLOR_PAIR(i + 4)); | ||
1034 | mvaddch(tmarg + i + 5, col3 + j, fill | COLOR_PAIR(i + 4) | A_BOLD); | ||
1035 | } | ||
1036 | } | ||
1037 | |||
1038 | mvprintw(tmarg + 15, col1, "COLORS = %d", COLORS); | ||
1039 | mvprintw(tmarg + 16, col1, "COLOR_PAIRS = %d", COLOR_PAIRS); | ||
1040 | |||
1041 | mvaddstr(tmarg + 19, 3, "Press any key to continue"); | ||
1042 | getch(); | ||
1043 | |||
1044 | if (can_change_color()) | ||
1045 | { | ||
1046 | struct | ||
1047 | { | ||
1048 | short red, green, blue; | ||
1049 | } orgcolors[16]; | ||
1050 | |||
1051 | int MAXCOL = (COLORS >= 16) ? 16 : 8; | ||
1052 | |||
1053 | if (MAXCOL < 8) | ||
1054 | return; | ||
1055 | |||
1056 | for (i = 0; i < MAXCOL; i++) | ||
1057 | color_content(i, &(orgcolors[i].red), | ||
1058 | &(orgcolors[i].green), | ||
1059 | &(orgcolors[i].blue)); | ||
1060 | |||
1061 | attrset(A_BOLD); | ||
1062 | mvaddstr(tmarg, (COLS - 22) / 2, " init_color() Example "); | ||
1063 | attrset(A_NORMAL); | ||
1064 | |||
1065 | refresh(); | ||
1066 | |||
1067 | for (i = 0; i < 8; i++) | ||
1068 | { | ||
1069 | init_color(colors[i], i * 125, 0, i * 125); | ||
1070 | |||
1071 | if (MAXCOL == 16) | ||
1072 | init_color(colors[i] + 8, 0, i * 125, 0); | ||
1073 | } | ||
1074 | |||
1075 | mvaddstr(tmarg + 19, 3, "Press any key to continue"); | ||
1076 | getch(); | ||
1077 | |||
1078 | for (i = 0; i < MAXCOL; i++) | ||
1079 | init_color(i, orgcolors[i].red, | ||
1080 | orgcolors[i].green, | ||
1081 | orgcolors[i].blue); | ||
1082 | } | ||
1083 | } | ||
1084 | #endif | ||
1085 | |||
1086 | #if HAVE_WIDE | ||
1087 | void wideTest(WINDOW *win) | ||
1088 | { | ||
1089 | wchar_t tmp[513]; | ||
1090 | size_t i; | ||
1091 | |||
1092 | attrset(A_BOLD); | ||
1093 | mvaddstr(1, (COLS - 25) / 2, "Wide Character Input Test"); | ||
1094 | attrset(A_NORMAL); | ||
1095 | |||
1096 | mvaddstr(4, 1, "Enter a string: "); | ||
1097 | |||
1098 | echo(); | ||
1099 | |||
1100 | get_wstr((wint_t *)tmp); | ||
1101 | addstr("\n\n String:\n\n "); | ||
1102 | addwstr(tmp); | ||
1103 | addstr("\n\n\n Hex:\n\n "); | ||
1104 | |||
1105 | for (i = 0; i < wcslen(tmp); i++) | ||
1106 | { | ||
1107 | printw("%04x ", tmp[i]); | ||
1108 | addnwstr(tmp + i, 1); | ||
1109 | addstr(" "); | ||
1110 | } | ||
1111 | |||
1112 | noecho(); | ||
1113 | |||
1114 | Continue2(); | ||
1115 | } | ||
1116 | #endif | ||
1117 | |||
1118 | void display_menu(int old_option, int new_option) | ||
1119 | { | ||
1120 | int lmarg = (COLS - 14) / 2, | ||
1121 | tmarg = (LINES - (MAX_OPTIONS + 2)) / 2; | ||
1122 | |||
1123 | if (old_option == -1) | ||
1124 | { | ||
1125 | int i; | ||
1126 | |||
1127 | attrset(A_BOLD); | ||
1128 | mvaddstr(tmarg - 3, lmarg - 5, "PDCurses Test Program"); | ||
1129 | attrset(A_NORMAL); | ||
1130 | |||
1131 | for (i = 0; i < MAX_OPTIONS; i++) | ||
1132 | mvaddstr(tmarg + i, lmarg, command[i].text); | ||
1133 | } | ||
1134 | else | ||
1135 | mvaddstr(tmarg + old_option, lmarg, command[old_option].text); | ||
1136 | |||
1137 | attrset(A_REVERSE); | ||
1138 | mvaddstr(tmarg + new_option, lmarg, command[new_option].text); | ||
1139 | attrset(A_NORMAL); | ||
1140 | |||
1141 | mvaddstr(tmarg + MAX_OPTIONS + 2, lmarg - 23, | ||
1142 | "Use Up and Down Arrows to select - Enter to run - Q to quit"); | ||
1143 | refresh(); | ||
1144 | } |
File demos/tui.c added (mode: 100644) (index 00000000..e57a1b09) | |||
1 | /********************************* tui.c ************************************/ | ||
2 | /* | ||
3 | * 'textual user interface' | ||
4 | * | ||
5 | * $Id: tui.c,v 1.34 2008/07/14 12:35:23 wmcbrine Exp $ | ||
6 | * | ||
7 | * Author : P.J. Kunst <kunst@prl.philips.nl> | ||
8 | * Date : 25-02-93 | ||
9 | */ | ||
10 | |||
11 | #include <ctype.h> | ||
12 | #include <curses.h> | ||
13 | #include <stdio.h> | ||
14 | #include <stdlib.h> | ||
15 | #include <string.h> | ||
16 | #include <time.h> | ||
17 | #include "tui.h" | ||
18 | |||
19 | void statusmsg(char *); | ||
20 | int waitforkey(void); | ||
21 | void rmerror(void); | ||
22 | |||
23 | #if defined(__unix) && !defined(__DJGPP__) | ||
24 | #include <unistd.h> | ||
25 | #endif | ||
26 | |||
27 | #ifdef A_COLOR | ||
28 | # define TITLECOLOR 1 /* color pair indices */ | ||
29 | # define MAINMENUCOLOR (2 | A_BOLD) | ||
30 | # define MAINMENUREVCOLOR (3 | A_BOLD | A_REVERSE) | ||
31 | # define SUBMENUCOLOR (4 | A_BOLD) | ||
32 | # define SUBMENUREVCOLOR (5 | A_BOLD | A_REVERSE) | ||
33 | # define BODYCOLOR 6 | ||
34 | # define STATUSCOLOR (7 | A_BOLD) | ||
35 | # define INPUTBOXCOLOR 8 | ||
36 | # define EDITBOXCOLOR (9 | A_BOLD | A_REVERSE) | ||
37 | #else | ||
38 | # define TITLECOLOR 0 /* color pair indices */ | ||
39 | # define MAINMENUCOLOR (A_BOLD) | ||
40 | # define MAINMENUREVCOLOR (A_BOLD | A_REVERSE) | ||
41 | # define SUBMENUCOLOR (A_BOLD) | ||
42 | # define SUBMENUREVCOLOR (A_BOLD | A_REVERSE) | ||
43 | # define BODYCOLOR 0 | ||
44 | # define STATUSCOLOR (A_BOLD) | ||
45 | # define INPUTBOXCOLOR 0 | ||
46 | # define EDITBOXCOLOR (A_BOLD | A_REVERSE) | ||
47 | #endif | ||
48 | |||
49 | |||
50 | #define th 1 /* title window height */ | ||
51 | #define mh 1 /* main menu height */ | ||
52 | #define sh 2 /* status window height */ | ||
53 | #define bh (LINES - th - mh - sh) /* body window height */ | ||
54 | #define bw COLS /* body window width */ | ||
55 | |||
56 | |||
57 | /******************************* STATIC ************************************/ | ||
58 | |||
59 | static WINDOW *wtitl, *wmain, *wbody, *wstat; /* title, menu, body, status win*/ | ||
60 | static int nexty, nextx; | ||
61 | static int key = ERR, ch = ERR; | ||
62 | static bool quit = FALSE; | ||
63 | static bool incurses = FALSE; | ||
64 | |||
65 | #ifndef PDCURSES | ||
66 | static char wordchar(void) | ||
67 | { | ||
68 | return 0x17; /* ^W */ | ||
69 | } | ||
70 | #endif | ||
71 | |||
72 | static char *padstr(char *s, int length) | ||
73 | { | ||
74 | static char buf[MAXSTRLEN]; | ||
75 | char fmt[10]; | ||
76 | |||
77 | sprintf(fmt, (int)strlen(s) > length ? "%%.%ds" : "%%-%ds", length); | ||
78 | sprintf(buf, fmt, s); | ||
79 | |||
80 | return buf; | ||
81 | } | ||
82 | |||
83 | static char *prepad(char *s, int length) | ||
84 | { | ||
85 | int i; | ||
86 | char *p = s; | ||
87 | |||
88 | if (length > 0) | ||
89 | { | ||
90 | memmove((void *)(s + length), (const void *)s, strlen(s) + 1); | ||
91 | |||
92 | for (i = 0; i < length; i++) | ||
93 | *p++ = ' '; | ||
94 | } | ||
95 | |||
96 | return s; | ||
97 | } | ||
98 | |||
99 | static void rmline(WINDOW *win, int nr) /* keeps box lines intact */ | ||
100 | { | ||
101 | mvwaddstr(win, nr, 1, padstr(" ", bw - 2)); | ||
102 | wrefresh(win); | ||
103 | } | ||
104 | |||
105 | static void initcolor(void) | ||
106 | { | ||
107 | #ifdef A_COLOR | ||
108 | if (has_colors()) | ||
109 | start_color(); | ||
110 | |||
111 | /* foreground, background */ | ||
112 | |||
113 | init_pair(TITLECOLOR & ~A_ATTR, COLOR_BLACK, COLOR_CYAN); | ||
114 | init_pair(MAINMENUCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_CYAN); | ||
115 | init_pair(MAINMENUREVCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_BLACK); | ||
116 | init_pair(SUBMENUCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_CYAN); | ||
117 | init_pair(SUBMENUREVCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_BLACK); | ||
118 | init_pair(BODYCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_BLUE); | ||
119 | init_pair(STATUSCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_CYAN); | ||
120 | init_pair(INPUTBOXCOLOR & ~A_ATTR, COLOR_BLACK, COLOR_CYAN); | ||
121 | init_pair(EDITBOXCOLOR & ~A_ATTR, COLOR_WHITE, COLOR_BLACK); | ||
122 | #endif | ||
123 | } | ||
124 | |||
125 | static void setcolor(WINDOW *win, chtype color) | ||
126 | { | ||
127 | chtype attr = color & A_ATTR; /* extract Bold, Reverse, Blink bits */ | ||
128 | |||
129 | #ifdef A_COLOR | ||
130 | attr &= ~A_REVERSE; /* ignore reverse, use colors instead! */ | ||
131 | wattrset(win, COLOR_PAIR(color & A_CHARTEXT) | attr); | ||
132 | #else | ||
133 | attr &= ~A_BOLD; /* ignore bold, gives messy display on HP-UX */ | ||
134 | wattrset(win, attr); | ||
135 | #endif | ||
136 | } | ||
137 | |||
138 | static void colorbox(WINDOW *win, chtype color, int hasbox) | ||
139 | { | ||
140 | int maxy; | ||
141 | #ifndef PDCURSES | ||
142 | int maxx; | ||
143 | #endif | ||
144 | chtype attr = color & A_ATTR; /* extract Bold, Reverse, Blink bits */ | ||
145 | |||
146 | setcolor(win, color); | ||
147 | |||
148 | #ifdef A_COLOR | ||
149 | if (has_colors()) | ||
150 | wbkgd(win, COLOR_PAIR(color & A_CHARTEXT) | (attr & ~A_REVERSE)); | ||
151 | else | ||
152 | #endif | ||
153 | wbkgd(win, attr); | ||
154 | |||
155 | werase(win); | ||
156 | |||
157 | #ifdef PDCURSES | ||
158 | maxy = getmaxy(win); | ||
159 | #else | ||
160 | getmaxyx(win, maxy, maxx); | ||
161 | #endif | ||
162 | if (hasbox && (maxy > 2)) | ||
163 | box(win, 0, 0); | ||
164 | |||
165 | touchwin(win); | ||
166 | wrefresh(win); | ||
167 | } | ||
168 | |||
169 | static void idle(void) | ||
170 | { | ||
171 | char buf[MAXSTRLEN]; | ||
172 | time_t t; | ||
173 | struct tm *tp; | ||
174 | |||
175 | if (time (&t) == -1) | ||
176 | return; /* time not available */ | ||
177 | |||
178 | tp = localtime(&t); | ||
179 | sprintf(buf, " %.2d-%.2d-%.4d %.2d:%.2d:%.2d", | ||
180 | tp->tm_mday, tp->tm_mon + 1, tp->tm_year + 1900, | ||
181 | tp->tm_hour, tp->tm_min, tp->tm_sec); | ||
182 | |||
183 | mvwaddstr(wtitl, 0, bw - strlen(buf) - 2, buf); | ||
184 | wrefresh(wtitl); | ||
185 | } | ||
186 | |||
187 | static void menudim(menu *mp, int *lines, int *columns) | ||
188 | { | ||
189 | int n, l, mmax = 0; | ||
190 | |||
191 | for (n=0; mp->func; n++, mp++) | ||
192 | if ((l = strlen(mp->name)) > mmax) mmax = l; | ||
193 | |||
194 | *lines = n; | ||
195 | *columns = mmax + 2; | ||
196 | } | ||
197 | |||
198 | static void setmenupos(int y, int x) | ||
199 | { | ||
200 | nexty = y; | ||
201 | nextx = x; | ||
202 | } | ||
203 | |||
204 | static void getmenupos(int *y, int *x) | ||
205 | { | ||
206 | *y = nexty; | ||
207 | *x = nextx; | ||
208 | } | ||
209 | |||
210 | static int hotkey(const char *s) | ||
211 | { | ||
212 | int c0 = *s; /* if no upper case found, return first char */ | ||
213 | |||
214 | for (; *s; s++) | ||
215 | if (isupper((unsigned char)*s)) | ||
216 | break; | ||
217 | |||
218 | return *s ? *s : c0; | ||
219 | } | ||
220 | |||
221 | static void repaintmenu(WINDOW *wmenu, menu *mp) | ||
222 | { | ||
223 | int i; | ||
224 | menu *p = mp; | ||
225 | |||
226 | for (i = 0; p->func; i++, p++) | ||
227 | mvwaddstr(wmenu, i + 1, 2, p->name); | ||
228 | |||
229 | touchwin(wmenu); | ||
230 | wrefresh(wmenu); | ||
231 | } | ||
232 | |||
233 | static void repaintmainmenu(int width, menu *mp) | ||
234 | { | ||
235 | int i; | ||
236 | menu *p = mp; | ||
237 | |||
238 | for (i = 0; p->func; i++, p++) | ||
239 | mvwaddstr(wmain, 0, i * width, prepad(padstr(p->name, width - 1), 1)); | ||
240 | |||
241 | touchwin(wmain); | ||
242 | wrefresh(wmain); | ||
243 | } | ||
244 | |||
245 | static void mainhelp(void) | ||
246 | { | ||
247 | #ifdef ALT_X | ||
248 | statusmsg("Use arrow keys and Enter to select (Alt-X to quit)"); | ||
249 | #else | ||
250 | statusmsg("Use arrow keys and Enter to select"); | ||
251 | #endif | ||
252 | } | ||
253 | |||
254 | static void mainmenu(menu *mp) | ||
255 | { | ||
256 | int nitems, barlen, old = -1, cur = 0, c, cur0; | ||
257 | |||
258 | menudim(mp, &nitems, &barlen); | ||
259 | repaintmainmenu(barlen, mp); | ||
260 | |||
261 | while (!quit) | ||
262 | { | ||
263 | if (cur != old) | ||
264 | { | ||
265 | if (old != -1) | ||
266 | { | ||
267 | mvwaddstr(wmain, 0, old * barlen, | ||
268 | prepad(padstr(mp[old].name, barlen - 1), 1)); | ||
269 | |||
270 | statusmsg(mp[cur].desc); | ||
271 | } | ||
272 | else | ||
273 | mainhelp(); | ||
274 | |||
275 | setcolor(wmain, MAINMENUREVCOLOR); | ||
276 | |||
277 | mvwaddstr(wmain, 0, cur * barlen, | ||
278 | prepad(padstr(mp[cur].name, barlen - 1), 1)); | ||
279 | |||
280 | setcolor(wmain, MAINMENUCOLOR); | ||
281 | old = cur; | ||
282 | wrefresh(wmain); | ||
283 | } | ||
284 | |||
285 | switch (c = (key != ERR ? key : waitforkey())) | ||
286 | { | ||
287 | case KEY_DOWN: | ||
288 | case '\n': /* menu item selected */ | ||
289 | touchwin(wbody); | ||
290 | wrefresh(wbody); | ||
291 | rmerror(); | ||
292 | setmenupos(th + mh, cur * barlen); | ||
293 | curs_set(1); | ||
294 | (mp[cur].func)(); /* perform function */ | ||
295 | curs_set(0); | ||
296 | |||
297 | switch (key) | ||
298 | { | ||
299 | case KEY_LEFT: | ||
300 | cur = (cur + nitems - 1) % nitems; | ||
301 | key = '\n'; | ||
302 | break; | ||
303 | |||
304 | case KEY_RIGHT: | ||
305 | cur = (cur + 1) % nitems; | ||
306 | key = '\n'; | ||
307 | break; | ||
308 | |||
309 | default: | ||
310 | key = ERR; | ||
311 | } | ||
312 | |||
313 | repaintmainmenu(barlen, mp); | ||
314 | old = -1; | ||
315 | break; | ||
316 | |||
317 | case KEY_LEFT: | ||
318 | cur = (cur + nitems - 1) % nitems; | ||
319 | break; | ||
320 | |||
321 | case KEY_RIGHT: | ||
322 | cur = (cur + 1) % nitems; | ||
323 | break; | ||
324 | |||
325 | case KEY_ESC: | ||
326 | mainhelp(); | ||
327 | break; | ||
328 | |||
329 | default: | ||
330 | cur0 = cur; | ||
331 | |||
332 | do | ||
333 | { | ||
334 | cur = (cur + 1) % nitems; | ||
335 | |||
336 | } while ((cur != cur0) && (hotkey(mp[cur].name) != toupper(c))); | ||
337 | |||
338 | if (hotkey(mp[cur].name) == toupper(c)) | ||
339 | key = '\n'; | ||
340 | } | ||
341 | |||
342 | } | ||
343 | |||
344 | rmerror(); | ||
345 | touchwin(wbody); | ||
346 | wrefresh(wbody); | ||
347 | } | ||
348 | |||
349 | static void cleanup(void) /* cleanup curses settings */ | ||
350 | { | ||
351 | if (incurses) | ||
352 | { | ||
353 | delwin(wtitl); | ||
354 | delwin(wmain); | ||
355 | delwin(wbody); | ||
356 | delwin(wstat); | ||
357 | curs_set(1); | ||
358 | endwin(); | ||
359 | incurses = FALSE; | ||
360 | } | ||
361 | } | ||
362 | |||
363 | |||
364 | /******************************* EXTERNAL **********************************/ | ||
365 | |||
366 | void clsbody(void) | ||
367 | { | ||
368 | werase(wbody); | ||
369 | wmove(wbody, 0, 0); | ||
370 | } | ||
371 | |||
372 | int bodylen(void) | ||
373 | { | ||
374 | #ifdef PDCURSES | ||
375 | return getmaxy(wbody); | ||
376 | #else | ||
377 | int maxy, maxx; | ||
378 | |||
379 | getmaxyx(wbody, maxy, maxx); | ||
380 | return maxy; | ||
381 | #endif | ||
382 | } | ||
383 | |||
384 | WINDOW *bodywin(void) | ||
385 | { | ||
386 | return wbody; | ||
387 | } | ||
388 | |||
389 | void rmerror(void) | ||
390 | { | ||
391 | rmline(wstat, 0); | ||
392 | } | ||
393 | |||
394 | void rmstatus(void) | ||
395 | { | ||
396 | rmline(wstat, 1); | ||
397 | } | ||
398 | |||
399 | void titlemsg(char *msg) | ||
400 | { | ||
401 | mvwaddstr(wtitl, 0, 2, padstr(msg, bw - 3)); | ||
402 | wrefresh(wtitl); | ||
403 | } | ||
404 | |||
405 | void bodymsg(char *msg) | ||
406 | { | ||
407 | waddstr(wbody, msg); | ||
408 | wrefresh(wbody); | ||
409 | } | ||
410 | |||
411 | void errormsg(char *msg) | ||
412 | { | ||
413 | beep(); | ||
414 | mvwaddstr(wstat, 0, 2, padstr(msg, bw - 3)); | ||
415 | wrefresh(wstat); | ||
416 | } | ||
417 | |||
418 | void statusmsg(char *msg) | ||
419 | { | ||
420 | mvwaddstr(wstat, 1, 2, padstr(msg, bw - 3)); | ||
421 | wrefresh(wstat); | ||
422 | } | ||
423 | |||
424 | bool keypressed(void) | ||
425 | { | ||
426 | ch = wgetch(wbody); | ||
427 | |||
428 | return ch != ERR; | ||
429 | } | ||
430 | |||
431 | int getkey(void) | ||
432 | { | ||
433 | int c = ch; | ||
434 | |||
435 | ch = ERR; | ||
436 | #ifdef ALT_X | ||
437 | quit = (c == ALT_X); /* PC only ! */ | ||
438 | #endif | ||
439 | return c; | ||
440 | } | ||
441 | |||
442 | int waitforkey(void) | ||
443 | { | ||
444 | do idle(); while (!keypressed()); | ||
445 | return getkey(); | ||
446 | } | ||
447 | |||
448 | void DoExit(void) /* terminate program */ | ||
449 | { | ||
450 | quit = TRUE; | ||
451 | } | ||
452 | |||
453 | void domenu(menu *mp) | ||
454 | { | ||
455 | int y, x, nitems, barlen, mheight, mw, old = -1, cur = 0, cur0; | ||
456 | bool stop = FALSE; | ||
457 | WINDOW *wmenu; | ||
458 | |||
459 | curs_set(0); | ||
460 | getmenupos(&y, &x); | ||
461 | menudim(mp, &nitems, &barlen); | ||
462 | mheight = nitems + 2; | ||
463 | mw = barlen + 2; | ||
464 | wmenu = newwin(mheight, mw, y, x); | ||
465 | colorbox(wmenu, SUBMENUCOLOR, 1); | ||
466 | repaintmenu(wmenu, mp); | ||
467 | |||
468 | key = ERR; | ||
469 | |||
470 | while (!stop && !quit) | ||
471 | { | ||
472 | if (cur != old) | ||
473 | { | ||
474 | if (old != -1) | ||
475 | mvwaddstr(wmenu, old + 1, 1, | ||
476 | prepad(padstr(mp[old].name, barlen - 1), 1)); | ||
477 | |||
478 | setcolor(wmenu, SUBMENUREVCOLOR); | ||
479 | mvwaddstr(wmenu, cur + 1, 1, | ||
480 | prepad(padstr(mp[cur].name, barlen - 1), 1)); | ||
481 | |||
482 | setcolor(wmenu, SUBMENUCOLOR); | ||
483 | statusmsg(mp[cur].desc); | ||
484 | |||
485 | old = cur; | ||
486 | wrefresh(wmenu); | ||
487 | } | ||
488 | |||
489 | switch (key = ((key != ERR) ? key : waitforkey())) | ||
490 | { | ||
491 | case '\n': /* menu item selected */ | ||
492 | touchwin(wbody); | ||
493 | wrefresh(wbody); | ||
494 | setmenupos(y + 1, x + 1); | ||
495 | rmerror(); | ||
496 | |||
497 | key = ERR; | ||
498 | curs_set(1); | ||
499 | (mp[cur].func)(); /* perform function */ | ||
500 | curs_set(0); | ||
501 | |||
502 | repaintmenu(wmenu, mp); | ||
503 | |||
504 | old = -1; | ||
505 | break; | ||
506 | |||
507 | case KEY_UP: | ||
508 | cur = (cur + nitems - 1) % nitems; | ||
509 | key = ERR; | ||
510 | break; | ||
511 | |||
512 | case KEY_DOWN: | ||
513 | cur = (cur + 1) % nitems; | ||
514 | key = ERR; | ||
515 | break; | ||
516 | |||
517 | case KEY_ESC: | ||
518 | case KEY_LEFT: | ||
519 | case KEY_RIGHT: | ||
520 | if (key == KEY_ESC) | ||
521 | key = ERR; /* return to prev submenu */ | ||
522 | |||
523 | stop = TRUE; | ||
524 | break; | ||
525 | |||
526 | default: | ||
527 | cur0 = cur; | ||
528 | |||
529 | do | ||
530 | { | ||
531 | cur = (cur + 1) % nitems; | ||
532 | |||
533 | } while ((cur != cur0) && | ||
534 | (hotkey(mp[cur].name) != toupper((int)key))); | ||
535 | |||
536 | key = (hotkey(mp[cur].name) == toupper((int)key)) ? '\n' : ERR; | ||
537 | } | ||
538 | |||
539 | } | ||
540 | |||
541 | rmerror(); | ||
542 | delwin(wmenu); | ||
543 | touchwin(wbody); | ||
544 | wrefresh(wbody); | ||
545 | } | ||
546 | |||
547 | void startmenu(menu *mp, char *mtitle) | ||
548 | { | ||
549 | initscr(); | ||
550 | incurses = TRUE; | ||
551 | initcolor(); | ||
552 | |||
553 | wtitl = subwin(stdscr, th, bw, 0, 0); | ||
554 | wmain = subwin(stdscr, mh, bw, th, 0); | ||
555 | wbody = subwin(stdscr, bh, bw, th + mh, 0); | ||
556 | wstat = subwin(stdscr, sh, bw, th + mh + bh, 0); | ||
557 | |||
558 | colorbox(wtitl, TITLECOLOR, 0); | ||
559 | colorbox(wmain, MAINMENUCOLOR, 0); | ||
560 | colorbox(wbody, BODYCOLOR, 0); | ||
561 | colorbox(wstat, STATUSCOLOR, 0); | ||
562 | |||
563 | if (mtitle) | ||
564 | titlemsg(mtitle); | ||
565 | |||
566 | cbreak(); /* direct input (no newline required)... */ | ||
567 | noecho(); /* ... without echoing */ | ||
568 | curs_set(0); /* hide cursor (if possible) */ | ||
569 | nodelay(wbody, TRUE); /* don't wait for input... */ | ||
570 | halfdelay(10); /* ...well, no more than a second, anyway */ | ||
571 | keypad(wbody, TRUE); /* enable cursor keys */ | ||
572 | scrollok(wbody, TRUE); /* enable scrolling in main window */ | ||
573 | |||
574 | leaveok(stdscr, TRUE); | ||
575 | leaveok(wtitl, TRUE); | ||
576 | leaveok(wmain, TRUE); | ||
577 | leaveok(wstat, TRUE); | ||
578 | |||
579 | mainmenu(mp); | ||
580 | |||
581 | cleanup(); | ||
582 | } | ||
583 | |||
584 | static void repainteditbox(WINDOW *win, int x, char *buf) | ||
585 | { | ||
586 | #ifndef PDCURSES | ||
587 | int maxy; | ||
588 | #endif | ||
589 | int maxx; | ||
590 | |||
591 | #ifdef PDCURSES | ||
592 | maxx = getmaxx(win); | ||
593 | #else | ||
594 | getmaxyx(win, maxy, maxx); | ||
595 | #endif | ||
596 | werase(win); | ||
597 | mvwprintw(win, 0, 0, "%s", padstr(buf, maxx)); | ||
598 | wmove(win, 0, x); | ||
599 | wrefresh(win); | ||
600 | } | ||
601 | |||
602 | /* | ||
603 | |||
604 | weditstr() - edit string | ||
605 | |||
606 | Description: | ||
607 | The initial value of 'str' with a maximum length of 'field' - 1, | ||
608 | which is supplied by the calling routine, is editted. The user's | ||
609 | erase (^H), kill (^U) and delete word (^W) chars are interpreted. | ||
610 | The PC insert or Tab keys toggle between insert and edit mode. | ||
611 | Escape aborts the edit session, leaving 'str' unchanged. | ||
612 | Enter, Up or Down Arrow are used to accept the changes to 'str'. | ||
613 | NOTE: editstr(), mveditstr(), and mvweditstr() are macros. | ||
614 | |||
615 | Return Value: | ||
616 | Returns the input terminating character on success (Escape, | ||
617 | Enter, Up or Down Arrow) and ERR on error. | ||
618 | |||
619 | Errors: | ||
620 | It is an error to call this function with a NULL window pointer. | ||
621 | The length of the initial 'str' must not exceed 'field' - 1. | ||
622 | |||
623 | */ | ||
624 | |||
625 | int weditstr(WINDOW *win, char *buf, int field) | ||
626 | { | ||
627 | char org[MAXSTRLEN], *tp, *bp = buf; | ||
628 | bool defdisp = TRUE, stop = FALSE, insert = FALSE; | ||
629 | int cury, curx, begy, begx, oldattr; | ||
630 | WINDOW *wedit; | ||
631 | int c = 0; | ||
632 | |||
633 | if ((field >= MAXSTRLEN) || (buf == NULL) || | ||
634 | ((int)strlen(buf) > field - 1)) | ||
635 | return ERR; | ||
636 | |||
637 | strcpy(org, buf); /* save original */ | ||
638 | |||
639 | wrefresh(win); | ||
640 | getyx(win, cury, curx); | ||
641 | getbegyx(win, begy, begx); | ||
642 | |||
643 | wedit = subwin(win, 1, field, begy + cury, begx + curx); | ||
644 | oldattr = wedit->_attrs; | ||
645 | colorbox(wedit, EDITBOXCOLOR, 0); | ||
646 | |||
647 | keypad(wedit, TRUE); | ||
648 | curs_set(1); | ||
649 | |||
650 | while (!stop) | ||
651 | { | ||
652 | idle(); | ||
653 | repainteditbox(wedit, bp - buf, buf); | ||
654 | |||
655 | switch (c = wgetch(wedit)) | ||
656 | { | ||
657 | case ERR: | ||
658 | break; | ||
659 | |||
660 | case KEY_ESC: | ||
661 | strcpy(buf, org); /* restore original */ | ||
662 | stop = TRUE; | ||
663 | break; | ||
664 | |||
665 | case '\n': | ||
666 | case KEY_UP: | ||
667 | case KEY_DOWN: | ||
668 | stop = TRUE; | ||
669 | break; | ||
670 | |||
671 | case KEY_LEFT: | ||
672 | if (bp > buf) | ||
673 | bp--; | ||
674 | break; | ||
675 | |||
676 | case KEY_RIGHT: | ||
677 | defdisp = FALSE; | ||
678 | if (bp - buf < (int)strlen(buf)) | ||
679 | bp++; | ||
680 | break; | ||
681 | |||
682 | case '\t': /* TAB -- because insert | ||
683 | is broken on HPUX */ | ||
684 | case KEY_IC: /* enter insert mode */ | ||
685 | case KEY_EIC: /* exit insert mode */ | ||
686 | defdisp = FALSE; | ||
687 | insert = !insert; | ||
688 | |||
689 | curs_set(insert ? 2 : 1); | ||
690 | break; | ||
691 | |||
692 | default: | ||
693 | if (c == erasechar()) /* backspace, ^H */ | ||
694 | { | ||
695 | if (bp > buf) | ||
696 | { | ||
697 | memmove((void *)(bp - 1), (const void *)bp, strlen(bp) + 1); | ||
698 | bp--; | ||
699 | } | ||
700 | } | ||
701 | else if (c == killchar()) /* ^U */ | ||
702 | { | ||
703 | bp = buf; | ||
704 | *bp = '\0'; | ||
705 | } | ||
706 | else if (c == wordchar()) /* ^W */ | ||
707 | { | ||
708 | tp = bp; | ||
709 | |||
710 | while ((bp > buf) && (*(bp - 1) == ' ')) | ||
711 | bp--; | ||
712 | while ((bp > buf) && (*(bp - 1) != ' ')) | ||
713 | bp--; | ||
714 | |||
715 | memmove((void *)bp, (const void *)tp, strlen(tp) + 1); | ||
716 | } | ||
717 | else if (isprint(c)) | ||
718 | { | ||
719 | if (defdisp) | ||
720 | { | ||
721 | bp = buf; | ||
722 | *bp = '\0'; | ||
723 | defdisp = FALSE; | ||
724 | } | ||
725 | |||
726 | if (insert) | ||
727 | { | ||
728 | if ((int)strlen(buf) < field - 1) | ||
729 | { | ||
730 | memmove((void *)(bp + 1), (const void *)bp, | ||
731 | strlen(bp) + 1); | ||
732 | |||
733 | *bp++ = c; | ||
734 | } | ||
735 | } | ||
736 | else if (bp - buf < field - 1) | ||
737 | { | ||
738 | /* append new string terminator */ | ||
739 | |||
740 | if (!*bp) | ||
741 | bp[1] = '\0'; | ||
742 | |||
743 | *bp++ = c; | ||
744 | } | ||
745 | } | ||
746 | } | ||
747 | } | ||
748 | |||
749 | curs_set(0); | ||
750 | |||
751 | wattrset(wedit, oldattr); | ||
752 | repainteditbox(wedit, bp - buf, buf); | ||
753 | delwin(wedit); | ||
754 | |||
755 | return c; | ||
756 | } | ||
757 | |||
758 | WINDOW *winputbox(WINDOW *win, int nlines, int ncols) | ||
759 | { | ||
760 | WINDOW *winp; | ||
761 | int cury, curx, begy, begx; | ||
762 | |||
763 | getyx(win, cury, curx); | ||
764 | getbegyx(win, begy, begx); | ||
765 | |||
766 | winp = newwin(nlines, ncols, begy + cury, begx + curx); | ||
767 | colorbox(winp, INPUTBOXCOLOR, 1); | ||
768 | |||
769 | return winp; | ||
770 | } | ||
771 | |||
772 | int getstrings(char *desc[], char *buf[], int field) | ||
773 | { | ||
774 | WINDOW *winput; | ||
775 | int oldy, oldx, maxy, maxx, nlines, ncols, i, n, l, mmax = 0; | ||
776 | int c = 0; | ||
777 | bool stop = FALSE; | ||
778 | |||
779 | for (n = 0; desc[n]; n++) | ||
780 | if ((l = strlen(desc[n])) > mmax) | ||
781 | mmax = l; | ||
782 | |||
783 | nlines = n + 2; ncols = mmax + field + 4; | ||
784 | getyx(wbody, oldy, oldx); | ||
785 | getmaxyx(wbody, maxy, maxx); | ||
786 | |||
787 | winput = mvwinputbox(wbody, (maxy - nlines) / 2, (maxx - ncols) / 2, | ||
788 | nlines, ncols); | ||
789 | |||
790 | for (i = 0; i < n; i++) | ||
791 | mvwprintw(winput, i + 1, 2, "%s", desc[i]); | ||
792 | |||
793 | i = 0; | ||
794 | |||
795 | while (!stop) | ||
796 | { | ||
797 | switch (c = mvweditstr(winput, i+1, mmax+3, buf[i], field)) | ||
798 | { | ||
799 | case KEY_ESC: | ||
800 | stop = TRUE; | ||
801 | break; | ||
802 | |||
803 | case KEY_UP: | ||
804 | i = (i + n - 1) % n; | ||
805 | break; | ||
806 | |||
807 | case '\n': | ||
808 | case '\t': | ||
809 | case KEY_DOWN: | ||
810 | if (++i == n) | ||
811 | stop = TRUE; /* all passed? */ | ||
812 | } | ||
813 | } | ||
814 | |||
815 | delwin(winput); | ||
816 | touchwin(wbody); | ||
817 | wmove(wbody, oldy, oldx); | ||
818 | wrefresh(wbody); | ||
819 | |||
820 | return c; | ||
821 | } |
File demos/tui.h added (mode: 100644) (index 00000000..b99ca6b2) | |||
1 | /* | ||
2 | * 'textual user interface' | ||
3 | * | ||
4 | * $Id: tui.h,v 1.11 2008/07/14 12:35:23 wmcbrine Exp $ | ||
5 | * | ||
6 | * Author : P.J. Kunst <kunst@prl.philips.nl> | ||
7 | * Date : 25-02-93 | ||
8 | */ | ||
9 | |||
10 | #ifndef _TUI_H_ | ||
11 | #define _TUI_H_ | ||
12 | |||
13 | #include <curses.h> | ||
14 | |||
15 | #ifdef A_COLOR | ||
16 | #define A_ATTR (A_ATTRIBUTES ^ A_COLOR) /* A_BLINK, A_REVERSE, A_BOLD */ | ||
17 | #else | ||
18 | #define A_ATTR (A_ATTRIBUTES) /* standard UNIX attributes */ | ||
19 | #endif | ||
20 | |||
21 | #define MAXSTRLEN 256 | ||
22 | #define KEY_ESC 0x1b /* Escape */ | ||
23 | |||
24 | typedef void (*FUNC)(void); | ||
25 | |||
26 | typedef struct | ||
27 | { | ||
28 | char *name; /* item label */ | ||
29 | FUNC func; /* (pointer to) function */ | ||
30 | char *desc; /* function description */ | ||
31 | } menu; | ||
32 | |||
33 | /* ANSI C function prototypes: */ | ||
34 | |||
35 | void clsbody(void); | ||
36 | int bodylen(void); | ||
37 | WINDOW *bodywin(void); | ||
38 | |||
39 | void rmerror(void); | ||
40 | void rmstatus(void); | ||
41 | |||
42 | void titlemsg(char *msg); | ||
43 | void bodymsg(char *msg); | ||
44 | void errormsg(char *msg); | ||
45 | void statusmsg(char *msg); | ||
46 | |||
47 | bool keypressed(void); | ||
48 | int getkey(void); | ||
49 | int waitforkey(void); | ||
50 | |||
51 | void DoExit(void); | ||
52 | void startmenu(menu *mp, char *title); | ||
53 | void domenu(menu *mp); | ||
54 | |||
55 | int weditstr(WINDOW *win, char *buf, int field); | ||
56 | WINDOW *winputbox(WINDOW *win, int nlines, int ncols); | ||
57 | int getstrings(char *desc[], char *buf[], int field); | ||
58 | |||
59 | #define editstr(s,f) (weditstr(stdscr,s,f)) | ||
60 | #define mveditstr(y,x,s,f) (move(y,x)==ERR?ERR:editstr(s,f)) | ||
61 | #define mvweditstr(w,y,x,s,f) (wmove(w,y,x)==ERR?ERR:weditstr(w,s,f)) | ||
62 | |||
63 | #define inputbox(l,c) (winputbox(stdscr,l,c)) | ||
64 | #define mvinputbox(y,x,l,c) (move(y,x)==ERR?w:inputbox(l,c)) | ||
65 | #define mvwinputbox(w,y,x,l,c) (wmove(w,y,x)==ERR?w:winputbox(w,l,c)) | ||
66 | |||
67 | #endif |
File demos/tuidemo.c added (mode: 100644) (index 00000000..a22d2a41) | |||
1 | /* | ||
2 | * $Id: tuidemo.c,v 1.22 2008/07/14 12:35:23 wmcbrine Exp $ | ||
3 | * | ||
4 | * Author : P.J. Kunst <kunst@prl.philips.nl> | ||
5 | * Date : 25-02-93 | ||
6 | * | ||
7 | * Purpose: This program demonstrates the use of the 'curses' library | ||
8 | * for the creation of (simple) menu-operated programs. | ||
9 | * In the PDCurses version, use is made of colors for the | ||
10 | * highlighting of subwindows (title bar, status bar etc). | ||
11 | * | ||
12 | * Acknowledgement: some ideas were borrowed from Mark Hessling's | ||
13 | * version of the 'testcurs' program. | ||
14 | */ | ||
15 | |||
16 | #include <stdio.h> | ||
17 | #include <stdlib.h> | ||
18 | #include <string.h> | ||
19 | #include <locale.h> | ||
20 | #include "tui.h" | ||
21 | |||
22 | /* change this if source at other location */ | ||
23 | |||
24 | #ifdef XCURSES | ||
25 | # define FNAME "../demos/tui.c" | ||
26 | #else | ||
27 | # define FNAME "..\\demos\\tui.c" | ||
28 | #endif | ||
29 | |||
30 | /**************************** strings entry box ***************************/ | ||
31 | |||
32 | void address(void) | ||
33 | { | ||
34 | char *fieldname[6] = | ||
35 | { | ||
36 | "Name", "Street", "City", "State", "Country", (char *)0 | ||
37 | }; | ||
38 | |||
39 | char *fieldbuf[5]; | ||
40 | WINDOW *wbody = bodywin(); | ||
41 | int i, field = 50; | ||
42 | |||
43 | for (i = 0; i < 5; i++) | ||
44 | fieldbuf[i] = calloc(1, field + 1); | ||
45 | |||
46 | if (getstrings(fieldname, fieldbuf, field) != KEY_ESC) | ||
47 | { | ||
48 | for (i = 0; fieldname[i]; i++) | ||
49 | wprintw(wbody, "%10s : %s\n", | ||
50 | fieldname[i], fieldbuf[i]); | ||
51 | |||
52 | wrefresh(wbody); | ||
53 | } | ||
54 | |||
55 | for (i = 0; i < 5; i++) | ||
56 | free(fieldbuf[i]); | ||
57 | } | ||
58 | |||
59 | /**************************** string entry box ****************************/ | ||
60 | |||
61 | char *getfname(char *desc, char *fname, int field) | ||
62 | { | ||
63 | char *fieldname[2]; | ||
64 | char *fieldbuf[1]; | ||
65 | |||
66 | fieldname[0] = desc; | ||
67 | fieldname[1] = 0; | ||
68 | fieldbuf[0] = fname; | ||
69 | |||
70 | return (getstrings(fieldname, fieldbuf, field) == KEY_ESC) ? NULL : fname; | ||
71 | } | ||
72 | |||
73 | /**************************** a very simple file browser ******************/ | ||
74 | |||
75 | void showfile(char *fname) | ||
76 | { | ||
77 | int i, bh = bodylen(); | ||
78 | FILE *fp; | ||
79 | char buf[MAXSTRLEN]; | ||
80 | bool ateof = FALSE; | ||
81 | |||
82 | statusmsg("FileBrowser: Hit key to continue, Q to quit"); | ||
83 | |||
84 | if ((fp = fopen(fname, "r")) != NULL) /* file available? */ | ||
85 | { | ||
86 | while (!ateof) | ||
87 | { | ||
88 | clsbody(); | ||
89 | |||
90 | for (i = 0; i < bh - 1 && !ateof; i++) | ||
91 | { | ||
92 | buf[0] = '\0'; | ||
93 | fgets(buf, MAXSTRLEN, fp); | ||
94 | |||
95 | if (strlen(buf)) | ||
96 | bodymsg(buf); | ||
97 | else | ||
98 | ateof = TRUE; | ||
99 | } | ||
100 | |||
101 | switch (waitforkey()) | ||
102 | { | ||
103 | case 'Q': | ||
104 | case 'q': | ||
105 | case 0x1b: | ||
106 | ateof = TRUE; | ||
107 | } | ||
108 | } | ||
109 | |||
110 | fclose(fp); | ||
111 | } | ||
112 | else | ||
113 | { | ||
114 | sprintf(buf, "ERROR: file '%s' not found", fname); | ||
115 | errormsg(buf); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | /***************************** forward declarations ***********************/ | ||
120 | |||
121 | void sub0(void), sub1(void), sub2(void), sub3(void); | ||
122 | void func1(void), func2(void); | ||
123 | void subfunc1(void), subfunc2(void); | ||
124 | void subsub(void); | ||
125 | |||
126 | /***************************** menus initialization ***********************/ | ||
127 | |||
128 | menu MainMenu[] = | ||
129 | { | ||
130 | { "Asub", sub0, "Go inside first submenu" }, | ||
131 | { "Bsub", sub1, "Go inside second submenu" }, | ||
132 | { "Csub", sub2, "Go inside third submenu" }, | ||
133 | { "Dsub", sub3, "Go inside fourth submenu" }, | ||
134 | { "", (FUNC)0, "" } /* always add this as the last item! */ | ||
135 | }; | ||
136 | |||
137 | menu SubMenu0[] = | ||
138 | { | ||
139 | { "Exit", DoExit, "Terminate program" }, | ||
140 | { "", (FUNC)0, "" } | ||
141 | }; | ||
142 | |||
143 | menu SubMenu1[] = | ||
144 | { | ||
145 | { "OneBeep", func1, "Sound one beep" }, | ||
146 | { "TwoBeeps", func2, "Sound two beeps" }, | ||
147 | { "", (FUNC)0, "" } | ||
148 | }; | ||
149 | |||
150 | menu SubMenu2[] = | ||
151 | { | ||
152 | { "Browse", subfunc1, "Source file lister" }, | ||
153 | { "Input", subfunc2, "Interactive file lister" }, | ||
154 | { "Address", address, "Get address data" }, | ||
155 | { "", (FUNC)0, "" } | ||
156 | }; | ||
157 | |||
158 | menu SubMenu3[] = | ||
159 | { | ||
160 | { "SubSub", subsub, "Go inside sub-submenu" }, | ||
161 | { "", (FUNC)0, "" } | ||
162 | }; | ||
163 | |||
164 | /***************************** main menu functions ************************/ | ||
165 | |||
166 | void sub0(void) | ||
167 | { | ||
168 | domenu(SubMenu0); | ||
169 | } | ||
170 | |||
171 | void sub1(void) | ||
172 | { | ||
173 | domenu(SubMenu1); | ||
174 | } | ||
175 | |||
176 | void sub2(void) | ||
177 | { | ||
178 | domenu(SubMenu2); | ||
179 | } | ||
180 | |||
181 | void sub3(void) | ||
182 | { | ||
183 | domenu(SubMenu3); | ||
184 | } | ||
185 | |||
186 | /***************************** submenu1 functions *************************/ | ||
187 | |||
188 | void func1(void) | ||
189 | { | ||
190 | beep(); | ||
191 | bodymsg("One beep! "); | ||
192 | } | ||
193 | |||
194 | void func2(void) | ||
195 | { | ||
196 | beep(); | ||
197 | bodymsg("Two beeps! "); | ||
198 | beep(); | ||
199 | } | ||
200 | |||
201 | /***************************** submenu2 functions *************************/ | ||
202 | |||
203 | void subfunc1(void) | ||
204 | { | ||
205 | showfile(FNAME); | ||
206 | } | ||
207 | |||
208 | void subfunc2(void) | ||
209 | { | ||
210 | char fname[MAXSTRLEN]; | ||
211 | |||
212 | strcpy(fname, FNAME); | ||
213 | if (getfname ("File to browse:", fname, 50)) | ||
214 | showfile(fname); | ||
215 | } | ||
216 | |||
217 | /***************************** submenu3 functions *************************/ | ||
218 | |||
219 | void subsub(void) | ||
220 | { | ||
221 | domenu(SubMenu2); | ||
222 | } | ||
223 | |||
224 | /***************************** start main menu ***************************/ | ||
225 | |||
226 | int main(int argc, char **argv) | ||
227 | { | ||
228 | setlocale(LC_ALL, ""); | ||
229 | |||
230 | startmenu(MainMenu, "TUI - 'textual user interface' demonstration program"); | ||
231 | |||
232 | return 0; | ||
233 | } |
File demos/worm.c added (mode: 100644) (index 00000000..5a823f90) | |||
1 | /**************************************************************************** | ||
2 | * Copyright (c) 2005 Free Software Foundation, Inc. * | ||
3 | * * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a * | ||
5 | * copy of this software and associated documentation files (the * | ||
6 | * "Software"), to deal in the Software without restriction, including * | ||
7 | * without limitation the rights to use, copy, modify, merge, publish, * | ||
8 | * distribute, distribute with modifications, sublicense, and/or sell * | ||
9 | * copies of the Software, and to permit persons to whom the Software is * | ||
10 | * furnished to do so, subject to the following conditions: * | ||
11 | * * | ||
12 | * The above copyright notice and this permission notice shall be included * | ||
13 | * in all copies or substantial portions of the Software. * | ||
14 | * * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * | ||
16 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * | ||
17 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * | ||
18 | * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * | ||
19 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * | ||
20 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * | ||
21 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * | ||
22 | * * | ||
23 | * Except as contained in this notice, the name(s) of the above copyright * | ||
24 | * holders shall not be used in advertising or otherwise to promote the * | ||
25 | * sale, use or other dealings in this Software without prior written * | ||
26 | * authorization. * | ||
27 | ****************************************************************************/ | ||
28 | |||
29 | /* | ||
30 | |||
31 | @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@ | ||
32 | @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@ | ||
33 | @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@ | ||
34 | @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ | ||
35 | @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ | ||
36 | @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ | ||
37 | @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ | ||
38 | @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@ | ||
39 | @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@ | ||
40 | |||
41 | Eric P. Scott | ||
42 | Caltech High Energy Physics | ||
43 | October, 1980 | ||
44 | |||
45 | Color by Eric S. Raymond | ||
46 | July, 1995 | ||
47 | |||
48 | Options: | ||
49 | -f fill screen with copies of 'WORM' at start. | ||
50 | -l <n> set worm length | ||
51 | -n <n> set number of worms | ||
52 | -t make worms leave droppings | ||
53 | |||
54 | $Id: worm.c,v 1.16 2008/07/13 16:08:17 wmcbrine Exp $ | ||
55 | */ | ||
56 | |||
57 | #include <curses.h> | ||
58 | #include <stdlib.h> | ||
59 | #include <time.h> | ||
60 | |||
61 | #define FLAVORS 7 | ||
62 | |||
63 | static chtype flavor[FLAVORS] = | ||
64 | { | ||
65 | 'O', '*', '#', '$', '%', '0', '@' | ||
66 | }; | ||
67 | |||
68 | static const short xinc[] = | ||
69 | { | ||
70 | 1, 1, 1, 0, -1, -1, -1, 0 | ||
71 | }, | ||
72 | yinc[] = | ||
73 | { | ||
74 | -1, 0, 1, 1, 1, 0, -1, -1 | ||
75 | }; | ||
76 | |||
77 | static struct worm | ||
78 | { | ||
79 | int orientation, head; | ||
80 | short *xpos, *ypos; | ||
81 | } worm[40]; | ||
82 | |||
83 | static const char *field; | ||
84 | static int length = 16, number = 3; | ||
85 | static chtype trail = ' '; | ||
86 | |||
87 | static const struct options | ||
88 | { | ||
89 | int nopts; | ||
90 | int opts[3]; | ||
91 | } normal[8] = | ||
92 | { | ||
93 | { 3, { 7, 0, 1 } }, { 3, { 0, 1, 2 } }, { 3, { 1, 2, 3 } }, | ||
94 | { 3, { 2, 3, 4 } }, { 3, { 3, 4, 5 } }, { 3, { 4, 5, 6 } }, | ||
95 | { 3, { 5, 6, 7 } }, { 3, { 6, 7, 0 } } | ||
96 | }, | ||
97 | upper[8] = | ||
98 | { | ||
99 | { 1, { 1, 0, 0 } }, { 2, { 1, 2, 0 } }, { 0, { 0, 0, 0 } }, | ||
100 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, { 2, { 4, 5, 0 } }, | ||
101 | { 1, { 5, 0, 0 } }, { 2, { 1, 5, 0 } } | ||
102 | }, | ||
103 | left[8] = | ||
104 | { | ||
105 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
106 | { 2, { 2, 3, 0 } }, { 1, { 3, 0, 0 } }, { 2, { 3, 7, 0 } }, | ||
107 | { 1, { 7, 0, 0 } }, { 2, { 7, 0, 0 } } | ||
108 | }, | ||
109 | right[8] = | ||
110 | { | ||
111 | { 1, { 7, 0, 0 } }, { 2, { 3, 7, 0 } }, { 1, { 3, 0, 0 } }, | ||
112 | { 2, { 3, 4, 0 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
113 | { 0, { 0, 0, 0 } }, { 2, { 6, 7, 0 } } | ||
114 | }, | ||
115 | lower[8] = | ||
116 | { | ||
117 | { 0, { 0, 0, 0 } }, { 2, { 0, 1, 0 } }, { 1, { 1, 0, 0 } }, | ||
118 | { 2, { 1, 5, 0 } }, { 1, { 5, 0, 0 } }, { 2, { 5, 6, 0 } }, | ||
119 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } } | ||
120 | }, | ||
121 | upleft[8] = | ||
122 | { | ||
123 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
124 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, { 1, { 3, 0, 0 } }, | ||
125 | { 2, { 1, 3, 0 } }, { 1, { 1, 0, 0 } } | ||
126 | }, | ||
127 | upright[8] = | ||
128 | { | ||
129 | { 2, { 3, 5, 0 } }, { 1, { 3, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
130 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
131 | { 0, { 0, 0, 0 } }, { 1, { 5, 0, 0 } } | ||
132 | }, | ||
133 | lowleft[8] = | ||
134 | { | ||
135 | { 3, { 7, 0, 1 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
136 | { 1, { 1, 0, 0 } }, { 2, { 1, 7, 0 } }, { 1, { 7, 0, 0 } }, | ||
137 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } } | ||
138 | }, | ||
139 | lowright[8] = | ||
140 | { | ||
141 | { 0, { 0, 0, 0 } }, { 1, { 7, 0, 0 } }, { 2, { 5, 7, 0 } }, | ||
142 | { 1, { 5, 0, 0 } }, { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } }, | ||
143 | { 0, { 0, 0, 0 } }, { 0, { 0, 0, 0 } } | ||
144 | }; | ||
145 | |||
146 | static void cleanup(void) | ||
147 | { | ||
148 | standend(); | ||
149 | refresh(); | ||
150 | curs_set(1); | ||
151 | endwin(); | ||
152 | } | ||
153 | |||
154 | int main(int argc, char *argv[]) | ||
155 | { | ||
156 | const struct options *op; | ||
157 | struct worm *w; | ||
158 | short **ref, *ip; | ||
159 | int x, y, n, h, last, bottom, seed; | ||
160 | |||
161 | for (x = 1; x < argc; x++) | ||
162 | { | ||
163 | char *p = argv[x]; | ||
164 | |||
165 | if (*p == '-') | ||
166 | p++; | ||
167 | |||
168 | switch (*p) | ||
169 | { | ||
170 | case 'f': | ||
171 | field = "WORM"; | ||
172 | break; | ||
173 | case 'l': | ||
174 | if (++x == argc) | ||
175 | goto usage; | ||
176 | |||
177 | if ((length = atoi(argv[x])) < 2 || length > 1024) | ||
178 | { | ||
179 | fprintf(stderr, "%s: Invalid length\n", *argv); | ||
180 | return EXIT_FAILURE; | ||
181 | } | ||
182 | |||
183 | break; | ||
184 | case 'n': | ||
185 | if (++x == argc) | ||
186 | goto usage; | ||
187 | |||
188 | if ((number = atoi(argv[x])) < 1 || number > 40) | ||
189 | { | ||
190 | fprintf(stderr, "%s: Invalid number of worms\n", *argv); | ||
191 | return EXIT_FAILURE; | ||
192 | } | ||
193 | |||
194 | break; | ||
195 | case 't': | ||
196 | trail = '.'; | ||
197 | break; | ||
198 | default: | ||
199 | usage: | ||
200 | fprintf(stderr, "usage: %s [-field] [-length #] " | ||
201 | "[-number #] [-trail]\n", *argv); | ||
202 | return EXIT_FAILURE; | ||
203 | } | ||
204 | } | ||
205 | |||
206 | #ifdef XCURSES | ||
207 | Xinitscr(argc, argv); | ||
208 | #else | ||
209 | initscr(); | ||
210 | #endif | ||
211 | seed = time((time_t *)0); | ||
212 | srand(seed); | ||
213 | |||
214 | noecho(); | ||
215 | cbreak(); | ||
216 | nonl(); | ||
217 | keypad(stdscr, TRUE); | ||
218 | |||
219 | curs_set(0); | ||
220 | |||
221 | bottom = LINES - 1; | ||
222 | last = COLS - 1; | ||
223 | |||
224 | #ifdef A_COLOR | ||
225 | if (has_colors()) | ||
226 | { | ||
227 | int bg = COLOR_BLACK; | ||
228 | start_color(); | ||
229 | |||
230 | # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000) | ||
231 | if (use_default_colors() == OK) | ||
232 | bg = -1; | ||
233 | # endif | ||
234 | |||
235 | # define SET_COLOR(num, fg) \ | ||
236 | init_pair(num + 1, fg, bg); \ | ||
237 | flavor[num] |= COLOR_PAIR(num + 1) | A_BOLD | ||
238 | |||
239 | SET_COLOR(0, COLOR_GREEN); | ||
240 | SET_COLOR(1, COLOR_RED); | ||
241 | SET_COLOR(2, COLOR_CYAN); | ||
242 | SET_COLOR(3, COLOR_WHITE); | ||
243 | SET_COLOR(4, COLOR_MAGENTA); | ||
244 | SET_COLOR(5, COLOR_BLUE); | ||
245 | SET_COLOR(6, COLOR_YELLOW); | ||
246 | } | ||
247 | #endif | ||
248 | |||
249 | ref = malloc(sizeof(short *) * LINES); | ||
250 | |||
251 | for (y = 0; y < LINES; y++) | ||
252 | { | ||
253 | ref[y] = malloc(sizeof(short) * COLS); | ||
254 | |||
255 | for (x = 0; x < COLS; x++) | ||
256 | ref[y][x] = 0; | ||
257 | } | ||
258 | |||
259 | #ifdef BADCORNER | ||
260 | /* if addressing the lower right corner doesn't work in your curses */ | ||
261 | |||
262 | ref[bottom][last] = 1; | ||
263 | #endif | ||
264 | |||
265 | for (n = number, w = &worm[0]; --n >= 0; w++) | ||
266 | { | ||
267 | w->orientation = w->head = 0; | ||
268 | |||
269 | if ((ip = malloc(sizeof(short) * (length + 1))) == NULL) | ||
270 | { | ||
271 | fprintf(stderr, "%s: out of memory\n", *argv); | ||
272 | return EXIT_FAILURE; | ||
273 | } | ||
274 | |||
275 | w->xpos = ip; | ||
276 | |||
277 | for (x = length; --x >= 0;) | ||
278 | *ip++ = -1; | ||
279 | |||
280 | if ((ip = malloc(sizeof(short) * (length + 1))) == NULL) | ||
281 | { | ||
282 | fprintf(stderr, "%s: out of memory\n", *argv); | ||
283 | return EXIT_FAILURE; | ||
284 | } | ||
285 | |||
286 | w->ypos = ip; | ||
287 | |||
288 | for (y = length; --y >= 0;) | ||
289 | *ip++ = -1; | ||
290 | } | ||
291 | |||
292 | if (field) | ||
293 | { | ||
294 | const char *p = field; | ||
295 | |||
296 | for (y = bottom; --y >= 0;) | ||
297 | for (x = COLS; --x >= 0;) | ||
298 | { | ||
299 | addch((chtype) (*p++)); | ||
300 | |||
301 | if (!*p) | ||
302 | p = field; | ||
303 | } | ||
304 | } | ||
305 | |||
306 | napms(12); | ||
307 | refresh(); | ||
308 | nodelay(stdscr, TRUE); | ||
309 | |||
310 | for (;;) | ||
311 | { | ||
312 | int ch; | ||
313 | |||
314 | if ((ch = getch()) > 0) | ||
315 | { | ||
316 | #ifdef KEY_RESIZE | ||
317 | if (ch == KEY_RESIZE) | ||
318 | { | ||
319 | # ifdef PDCURSES | ||
320 | resize_term(0, 0); | ||
321 | erase(); | ||
322 | # endif | ||
323 | if (last != COLS - 1) | ||
324 | { | ||
325 | for (y = 0; y <= bottom; y++) | ||
326 | { | ||
327 | ref[y] = realloc(ref[y], sizeof(short) * COLS); | ||
328 | |||
329 | for (x = last + 1; x < COLS; x++) | ||
330 | ref[y][x] = 0; | ||
331 | } | ||
332 | |||
333 | last = COLS - 1; | ||
334 | } | ||
335 | |||
336 | if (bottom != LINES - 1) | ||
337 | { | ||
338 | for (y = LINES; y <= bottom; y++) | ||
339 | free(ref[y]); | ||
340 | |||
341 | ref = realloc(ref, sizeof(short *) * LINES); | ||
342 | |||
343 | for (y = bottom + 1; y < LINES; y++) | ||
344 | { | ||
345 | ref[y] = malloc(sizeof(short) * COLS); | ||
346 | |||
347 | for (x = 0; x < COLS; x++) | ||
348 | ref[y][x] = 0; | ||
349 | } | ||
350 | |||
351 | bottom = LINES - 1; | ||
352 | } | ||
353 | } | ||
354 | |||
355 | #endif /* KEY_RESIZE */ | ||
356 | |||
357 | /* Make it simple to put this into single-step mode, | ||
358 | or resume normal operation - T. Dickey */ | ||
359 | |||
360 | if (ch == 'q') | ||
361 | { | ||
362 | cleanup(); | ||
363 | return EXIT_SUCCESS; | ||
364 | } | ||
365 | else if (ch == 's') | ||
366 | nodelay(stdscr, FALSE); | ||
367 | else if (ch == ' ') | ||
368 | nodelay(stdscr, TRUE); | ||
369 | } | ||
370 | |||
371 | for (n = 0, w = &worm[0]; n < number; n++, w++) | ||
372 | { | ||
373 | if ((x = w->xpos[h = w->head]) < 0) | ||
374 | { | ||
375 | move(y = w->ypos[h] = bottom, x = w->xpos[h] = 0); | ||
376 | addch(flavor[n % FLAVORS]); | ||
377 | ref[y][x]++; | ||
378 | } | ||
379 | else | ||
380 | y = w->ypos[h]; | ||
381 | |||
382 | if (x > last) | ||
383 | x = last; | ||
384 | |||
385 | if (y > bottom) | ||
386 | y = bottom; | ||
387 | |||
388 | if (++h == length) | ||
389 | h = 0; | ||
390 | |||
391 | if (w->xpos[w->head = h] >= 0) | ||
392 | { | ||
393 | int x1 = w->xpos[h]; | ||
394 | int y1 = w->ypos[h]; | ||
395 | |||
396 | if (y1 < LINES && x1 < COLS && --ref[y1][x1] == 0) | ||
397 | { | ||
398 | move(y1, x1); | ||
399 | addch(trail); | ||
400 | } | ||
401 | } | ||
402 | |||
403 | op = &(x == 0 ? (y == 0 ? upleft : | ||
404 | (y == bottom ? lowleft : left)) : | ||
405 | (x == last ? (y == 0 ? upright : | ||
406 | (y == bottom ? lowright : right)) : | ||
407 | (y == 0 ? upper : | ||
408 | (y == bottom ? lower : normal)))) | ||
409 | [w->orientation]; | ||
410 | |||
411 | switch (op->nopts) | ||
412 | { | ||
413 | case 0: | ||
414 | cleanup(); | ||
415 | return EXIT_SUCCESS; | ||
416 | case 1: | ||
417 | w->orientation = op->opts[0]; | ||
418 | break; | ||
419 | default: | ||
420 | w->orientation = op->opts[rand() % op->nopts]; | ||
421 | } | ||
422 | |||
423 | move(y += yinc[w->orientation], x += xinc[w->orientation]); | ||
424 | |||
425 | if (y < 0) | ||
426 | y = 0; | ||
427 | |||
428 | addch(flavor[n % FLAVORS]); | ||
429 | ref[w->ypos[h] = y][w->xpos[h] = x]++; | ||
430 | } | ||
431 | napms(12); | ||
432 | refresh(); | ||
433 | } | ||
434 | } |
File demos/xmas.c added (mode: 100644) (index 00000000..706858a5) | |||
1 | /******************************************************************************/ | ||
2 | /* asciixmas */ | ||
3 | /* December 1989 Larry Bartz Indianapolis, IN */ | ||
4 | /* */ | ||
5 | /* */ | ||
6 | /* I'm dreaming of an ascii character-based monochrome Christmas, */ | ||
7 | /* Just like the one's I used to know! */ | ||
8 | /* Via a full duplex communications channel, */ | ||
9 | /* At 9600 bits per second, */ | ||
10 | /* Even though it's kinda slow. */ | ||
11 | /* */ | ||
12 | /* I'm dreaming of an ascii character-based monochrome Christmas, */ | ||
13 | /* With ev'ry C program I write! */ | ||
14 | /* May your screen be merry and bright! */ | ||
15 | /* And may all your Christmases be amber or green, */ | ||
16 | /* (for reduced eyestrain and improved visibility)! */ | ||
17 | /* */ | ||
18 | /* */ | ||
19 | /* */ | ||
20 | /* IMPLEMENTATION */ | ||
21 | /* */ | ||
22 | /* Feel free to modify the defined string FROMWHO to reflect you, your */ | ||
23 | /* organization, your site, whatever. */ | ||
24 | /* */ | ||
25 | /* This looks a lot better if you can turn off your cursor before execution. */ | ||
26 | /* The cursor is distracting but it doesn't really ruin the show. */ | ||
27 | /* */ | ||
28 | /* At our site, we invoke this for our users just after login and the */ | ||
29 | /* determination of terminal type. */ | ||
30 | /* */ | ||
31 | /* */ | ||
32 | /* PORTABILITY */ | ||
33 | /* */ | ||
34 | /* I wrote this using only the very simplest curses functions so that it */ | ||
35 | /* might be the most portable. I was personally able to test on five */ | ||
36 | /* different cpu/UNIX combinations. */ | ||
37 | /* */ | ||
38 | /* */ | ||
39 | /* COMPILE */ | ||
40 | /* */ | ||
41 | /* usually this: */ | ||
42 | /* */ | ||
43 | /* cc -O xmas.c -lcurses -o xmas -s */ | ||
44 | /* */ | ||
45 | /******************************************************************************/ | ||
46 | |||
47 | /* $Id: xmas.c,v 1.29 2008/07/13 16:08:17 wmcbrine Exp $ */ | ||
48 | |||
49 | #include <curses.h> | ||
50 | #include <signal.h> | ||
51 | |||
52 | void lil(WINDOW *); | ||
53 | void midtop(WINDOW *); | ||
54 | void bigtop(WINDOW *); | ||
55 | void bigface(WINDOW *, chtype); | ||
56 | void legs1(WINDOW *); | ||
57 | void legs2(WINDOW *); | ||
58 | void legs3(WINDOW *); | ||
59 | void legs4(WINDOW *); | ||
60 | void initdeer(void); | ||
61 | void boxit(void); | ||
62 | void seas(void); | ||
63 | void greet(void); | ||
64 | void fromwho(void); | ||
65 | void del_msg(void); | ||
66 | void tree(void); | ||
67 | void balls(void); | ||
68 | void star(void); | ||
69 | void strng1(void); | ||
70 | void strng2(void); | ||
71 | void strng3(void); | ||
72 | void strng4(void); | ||
73 | void strng5(void); | ||
74 | void blinkit(void); | ||
75 | void reindeer(void); | ||
76 | |||
77 | #define FROMWHO "From Larry Bartz, Mark Hessling and William McBrine" | ||
78 | |||
79 | int y_pos, x_pos; | ||
80 | |||
81 | WINDOW *treescrn, *treescrn2, *treescrn3, *treescrn4, *treescrn5, | ||
82 | *treescrn6, *treescrn7, *treescrn8, *dotdeer0, *stardeer0, | ||
83 | *lildeer0, *lildeer1, *lildeer2, *lildeer3, *middeer0, | ||
84 | *middeer1, *middeer2, *middeer3, *bigdeer0, *bigdeer1, | ||
85 | *bigdeer2, *bigdeer3, *bigdeer4, *lookdeer0, *lookdeer1, | ||
86 | *lookdeer2, *lookdeer3, *lookdeer4, *w_holiday, *w_del_msg; | ||
87 | |||
88 | int main(int argc, char **argv) | ||
89 | { | ||
90 | int loopy; | ||
91 | |||
92 | #ifdef XCURSES | ||
93 | Xinitscr(argc, argv); | ||
94 | #else | ||
95 | initscr(); | ||
96 | #endif | ||
97 | nodelay(stdscr, TRUE); | ||
98 | noecho(); | ||
99 | nonl(); | ||
100 | refresh(); | ||
101 | |||
102 | #ifdef A_COLOR | ||
103 | if (has_colors()) | ||
104 | start_color(); | ||
105 | #endif | ||
106 | curs_set(0); | ||
107 | |||
108 | treescrn = newwin(16, 27, 3, 53); | ||
109 | treescrn2 = newwin(16, 27, 3, 53); | ||
110 | treescrn3 = newwin(16, 27, 3, 53); | ||
111 | treescrn4 = newwin(16, 27, 3, 53); | ||
112 | treescrn5 = newwin(16, 27, 3, 53); | ||
113 | treescrn6 = newwin(16, 27, 3, 53); | ||
114 | treescrn7 = newwin(16, 27, 3, 53); | ||
115 | treescrn8 = newwin(16, 27, 3, 53); | ||
116 | |||
117 | w_holiday = newwin(1, 26, 3, 27); | ||
118 | |||
119 | w_del_msg = newwin(1, 12, 23, 60); | ||
120 | |||
121 | mvwaddstr(w_holiday, 0, 0, "H A P P Y H O L I D A Y S"); | ||
122 | |||
123 | initdeer(); | ||
124 | |||
125 | clear(); | ||
126 | werase(treescrn); | ||
127 | touchwin(treescrn); | ||
128 | werase(treescrn2); | ||
129 | touchwin(treescrn2); | ||
130 | werase(treescrn8); | ||
131 | touchwin(treescrn8); | ||
132 | refresh(); | ||
133 | napms(1000); | ||
134 | |||
135 | boxit(); | ||
136 | del_msg(); | ||
137 | napms(1000); | ||
138 | |||
139 | seas(); | ||
140 | del_msg(); | ||
141 | napms(1000); | ||
142 | |||
143 | greet(); | ||
144 | del_msg(); | ||
145 | napms(1000); | ||
146 | |||
147 | fromwho(); | ||
148 | del_msg(); | ||
149 | napms(1000); | ||
150 | |||
151 | tree(); | ||
152 | napms(1000); | ||
153 | |||
154 | balls(); | ||
155 | napms(1000); | ||
156 | |||
157 | star(); | ||
158 | napms(1000); | ||
159 | |||
160 | strng1(); | ||
161 | strng2(); | ||
162 | strng3(); | ||
163 | strng4(); | ||
164 | strng5(); | ||
165 | |||
166 | /* set up the windows for our blinking trees */ | ||
167 | /* **************************************** */ | ||
168 | /* treescrn3 */ | ||
169 | |||
170 | overlay(treescrn, treescrn3); | ||
171 | |||
172 | /* balls */ | ||
173 | mvwaddch(treescrn3, 4, 18, ' '); | ||
174 | mvwaddch(treescrn3, 7, 6, ' '); | ||
175 | mvwaddch(treescrn3, 8, 19, ' '); | ||
176 | mvwaddch(treescrn3, 11, 22, ' '); | ||
177 | |||
178 | /* star */ | ||
179 | mvwaddch(treescrn3, 0, 12, '*'); | ||
180 | |||
181 | /* strng1 */ | ||
182 | mvwaddch(treescrn3, 3, 11, ' '); | ||
183 | |||
184 | /* strng2 */ | ||
185 | mvwaddch(treescrn3, 5, 13, ' '); | ||
186 | mvwaddch(treescrn3, 6, 10, ' '); | ||
187 | |||
188 | /* strng3 */ | ||
189 | mvwaddch(treescrn3, 7, 16, ' '); | ||
190 | mvwaddch(treescrn3, 7, 14, ' '); | ||
191 | |||
192 | /* strng4 */ | ||
193 | mvwaddch(treescrn3, 10, 13, ' '); | ||
194 | mvwaddch(treescrn3, 10, 10, ' '); | ||
195 | mvwaddch(treescrn3, 11, 8, ' '); | ||
196 | |||
197 | /* strng5 */ | ||
198 | mvwaddch(treescrn3, 11, 18, ' '); | ||
199 | mvwaddch(treescrn3, 12, 13, ' '); | ||
200 | |||
201 | /* treescrn4 */ | ||
202 | |||
203 | overlay(treescrn, treescrn4); | ||
204 | |||
205 | /* balls */ | ||
206 | mvwaddch(treescrn4, 3, 9, ' '); | ||
207 | mvwaddch(treescrn4, 4, 16, ' '); | ||
208 | mvwaddch(treescrn4, 7, 6, ' '); | ||
209 | mvwaddch(treescrn4, 8, 19, ' '); | ||
210 | mvwaddch(treescrn4, 11, 2, ' '); | ||
211 | mvwaddch(treescrn4, 12, 23, ' '); | ||
212 | |||
213 | /* star */ | ||
214 | mvwaddch(treescrn4, 0, 12, '*' | A_STANDOUT); | ||
215 | |||
216 | /* strng1 */ | ||
217 | mvwaddch(treescrn4, 3, 13, ' '); | ||
218 | |||
219 | /* strng2 */ | ||
220 | |||
221 | /* strng3 */ | ||
222 | mvwaddch(treescrn4, 7, 15, ' '); | ||
223 | mvwaddch(treescrn4, 8, 11, ' '); | ||
224 | |||
225 | /* strng4 */ | ||
226 | mvwaddch(treescrn4, 9, 16, ' '); | ||
227 | mvwaddch(treescrn4, 10, 12, ' '); | ||
228 | mvwaddch(treescrn4, 11, 8, ' '); | ||
229 | |||
230 | /* strng5 */ | ||
231 | mvwaddch(treescrn4, 11, 18, ' '); | ||
232 | mvwaddch(treescrn4, 12, 14, ' '); | ||
233 | |||
234 | /* treescrn5 */ | ||
235 | |||
236 | overlay(treescrn, treescrn5); | ||
237 | |||
238 | /* balls */ | ||
239 | mvwaddch(treescrn5, 3, 15, ' '); | ||
240 | mvwaddch(treescrn5, 10, 20, ' '); | ||
241 | mvwaddch(treescrn5, 12, 1, ' '); | ||
242 | |||
243 | /* star */ | ||
244 | mvwaddch(treescrn5, 0, 12, '*'); | ||
245 | |||
246 | /* strng1 */ | ||
247 | mvwaddch(treescrn5, 3, 11, ' '); | ||
248 | |||
249 | /* strng2 */ | ||
250 | mvwaddch(treescrn5, 5, 12, ' '); | ||
251 | |||
252 | /* strng3 */ | ||
253 | mvwaddch(treescrn5, 7, 14, ' '); | ||
254 | mvwaddch(treescrn5, 8, 10, ' '); | ||
255 | |||
256 | /* strng4 */ | ||
257 | mvwaddch(treescrn5, 9, 15, ' '); | ||
258 | mvwaddch(treescrn5, 10, 11, ' '); | ||
259 | mvwaddch(treescrn5, 11, 7, ' '); | ||
260 | |||
261 | /* strng5 */ | ||
262 | mvwaddch(treescrn5, 11, 17, ' '); | ||
263 | mvwaddch(treescrn5, 12, 13, ' '); | ||
264 | |||
265 | /* treescrn6 */ | ||
266 | |||
267 | overlay(treescrn, treescrn6); | ||
268 | |||
269 | /* balls */ | ||
270 | mvwaddch(treescrn6, 6, 7, ' '); | ||
271 | mvwaddch(treescrn6, 7, 18, ' '); | ||
272 | mvwaddch(treescrn6, 10, 4, ' '); | ||
273 | mvwaddch(treescrn6, 11, 23, ' '); | ||
274 | |||
275 | /* star */ | ||
276 | mvwaddch(treescrn6, 0, 12, '*' | A_STANDOUT); | ||
277 | |||
278 | /* strng1 */ | ||
279 | |||
280 | /* strng2 */ | ||
281 | mvwaddch(treescrn6, 5, 11, ' '); | ||
282 | |||
283 | /* strng3 */ | ||
284 | mvwaddch(treescrn6, 7, 13, ' '); | ||
285 | mvwaddch(treescrn6, 8, 9, ' '); | ||
286 | |||
287 | /* strng4 */ | ||
288 | mvwaddch(treescrn6, 9, 14, ' '); | ||
289 | mvwaddch(treescrn6, 10, 10, ' '); | ||
290 | mvwaddch(treescrn6, 11, 6, ' '); | ||
291 | |||
292 | /* strng5 */ | ||
293 | mvwaddch(treescrn6, 11, 16, ' '); | ||
294 | mvwaddch(treescrn6, 12, 12, ' '); | ||
295 | |||
296 | /* treescrn7 */ | ||
297 | |||
298 | overlay(treescrn, treescrn7); | ||
299 | |||
300 | /* balls */ | ||
301 | mvwaddch(treescrn7, 3, 15, ' '); | ||
302 | mvwaddch(treescrn7, 6, 7, ' '); | ||
303 | mvwaddch(treescrn7, 7, 18, ' '); | ||
304 | mvwaddch(treescrn7, 10, 4, ' '); | ||
305 | mvwaddch(treescrn7, 11, 22, ' '); | ||
306 | |||
307 | /* star */ | ||
308 | mvwaddch(treescrn7, 0, 12, '*'); | ||
309 | |||
310 | /* strng1 */ | ||
311 | mvwaddch(treescrn7, 3, 12, ' '); | ||
312 | |||
313 | /* strng2 */ | ||
314 | mvwaddch(treescrn7, 5, 13, ' '); | ||
315 | mvwaddch(treescrn7, 6, 9, ' '); | ||
316 | |||
317 | /* strng3 */ | ||
318 | mvwaddch(treescrn7, 7, 15, ' '); | ||
319 | mvwaddch(treescrn7, 8, 11, ' '); | ||
320 | |||
321 | /* strng4 */ | ||
322 | mvwaddch(treescrn7, 9, 16, ' '); | ||
323 | mvwaddch(treescrn7, 10, 12, ' '); | ||
324 | mvwaddch(treescrn7, 11, 8, ' '); | ||
325 | |||
326 | /* strng5 */ | ||
327 | mvwaddch(treescrn7, 11, 18, ' '); | ||
328 | mvwaddch(treescrn7, 12, 14, ' '); | ||
329 | |||
330 | napms(1000); | ||
331 | reindeer(); | ||
332 | |||
333 | touchwin(w_holiday); | ||
334 | wrefresh(w_holiday); | ||
335 | wrefresh(w_del_msg); | ||
336 | |||
337 | napms(1000); | ||
338 | |||
339 | for (loopy = 0; loopy < 50; loopy++) | ||
340 | blinkit(); | ||
341 | |||
342 | clear(); | ||
343 | refresh(); | ||
344 | endwin(); | ||
345 | |||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | void lil(WINDOW *win) | ||
350 | { | ||
351 | mvwaddch(win, 0, 0, (chtype) 'V'); | ||
352 | mvwaddch(win, 1, 0, (chtype) '@'); | ||
353 | mvwaddch(win, 1, 3, (chtype) '~'); | ||
354 | } | ||
355 | |||
356 | void midtop(WINDOW *win) | ||
357 | { | ||
358 | mvwaddstr(win, 0, 2, "yy"); | ||
359 | mvwaddstr(win, 1, 2, "0(=)~"); | ||
360 | } | ||
361 | |||
362 | void bigtop(WINDOW *win) | ||
363 | { | ||
364 | mvwaddstr(win, 0, 17, "\\/"); | ||
365 | mvwaddstr(win, 0, 20, "\\/"); | ||
366 | mvwaddch(win, 1, 18, (chtype) '\\'); | ||
367 | mvwaddch(win, 1, 20, (chtype) '/'); | ||
368 | mvwaddstr(win, 2, 19, "|_"); | ||
369 | mvwaddstr(win, 3, 18, "/^0\\"); | ||
370 | mvwaddstr(win, 4, 17, "//\\"); | ||
371 | mvwaddch(win, 4, 22, (chtype) '\\'); | ||
372 | mvwaddstr(win, 5, 7, "^~~~~~~~~// ~~U"); | ||
373 | } | ||
374 | |||
375 | void bigface(WINDOW *win, chtype noseattr) | ||
376 | { | ||
377 | mvwaddstr(win, 0, 16, "\\/ \\/"); | ||
378 | mvwaddstr(win, 1, 17, "\\Y/ \\Y/"); | ||
379 | mvwaddstr(win, 2, 19, "\\=/"); | ||
380 | mvwaddstr(win, 3, 17, "^\\o o/^"); | ||
381 | mvwaddstr(win, 4, 17, "//( )"); | ||
382 | mvwaddstr(win, 5, 7, "^~~~~~~~~// \\"); | ||
383 | waddch(win, 'O' | noseattr); | ||
384 | waddstr(win, "/"); | ||
385 | } | ||
386 | |||
387 | void legs1(WINDOW *win) | ||
388 | { | ||
389 | mvwaddstr(win, 6, 7, "( \\_____( /"); | ||
390 | mvwaddstr(win, 7, 8, "( ) /"); | ||
391 | mvwaddstr(win, 8, 9, "\\\\ /"); | ||
392 | mvwaddstr(win, 9, 11, "\\>/>"); | ||
393 | } | ||
394 | |||
395 | void legs2(WINDOW *win) | ||
396 | { | ||
397 | mvwaddstr(win, 6, 7, "(( )____( /"); | ||
398 | mvwaddstr(win, 7, 7, "( / |"); | ||
399 | mvwaddstr(win, 8, 8, "\\/ |"); | ||
400 | mvwaddstr(win, 9, 9, "|> |>"); | ||
401 | } | ||
402 | |||
403 | void legs3(WINDOW *win) | ||
404 | { | ||
405 | mvwaddstr(win, 6, 6, "( ()_____( /"); | ||
406 | mvwaddstr(win, 7, 6, "/ / /"); | ||
407 | mvwaddstr(win, 8, 5, "|/ \\"); | ||
408 | mvwaddstr(win, 9, 5, "/> \\>"); | ||
409 | } | ||
410 | |||
411 | void legs4(WINDOW *win) | ||
412 | { | ||
413 | mvwaddstr(win, 6, 6, "( )______( /"); | ||
414 | mvwaddstr(win, 7, 5, "(/ \\"); | ||
415 | mvwaddstr(win, 8, 0, "v___= ----^"); | ||
416 | } | ||
417 | |||
418 | void initdeer(void) | ||
419 | { | ||
420 | chtype noseattr; | ||
421 | |||
422 | #ifdef A_COLOR | ||
423 | if (has_colors()) | ||
424 | { | ||
425 | init_pair(31, COLOR_RED, COLOR_BLACK); | ||
426 | noseattr = COLOR_PAIR(31); | ||
427 | } | ||
428 | else | ||
429 | #endif | ||
430 | noseattr = A_NORMAL; | ||
431 | |||
432 | /* set up the windows for our various reindeer */ | ||
433 | |||
434 | dotdeer0 = newwin(3, 71, 0, 8); | ||
435 | stardeer0 = newwin(4, 56, 0, 8); | ||
436 | lildeer0 = newwin(7, 54, 0, 8); | ||
437 | middeer0 = newwin(15, 42, 0, 8); | ||
438 | bigdeer0 = newwin(10, 23, 0, 0); | ||
439 | lookdeer0 = newwin(10, 25, 0, 0); | ||
440 | |||
441 | /* lildeer1 */ | ||
442 | lildeer1 = newwin(2, 4, 0, 0); | ||
443 | lil(lildeer1); | ||
444 | mvwaddstr(lildeer1, 1, 1, "<>"); | ||
445 | |||
446 | /* lildeer2 */ | ||
447 | lildeer2 = newwin(2, 4, 0, 0); | ||
448 | lil(lildeer2); | ||
449 | mvwaddstr(lildeer2, 1, 1, "||"); | ||
450 | |||
451 | /* lildeer3 */ | ||
452 | lildeer3 = newwin(2, 4, 0, 0); | ||
453 | lil(lildeer3); | ||
454 | mvwaddstr(lildeer3, 1, 1, "><"); | ||
455 | |||
456 | /* middeer1 */ | ||
457 | middeer1 = newwin(3, 7, 0, 0); | ||
458 | midtop(middeer1); | ||
459 | mvwaddstr(middeer1, 2, 3, "\\/"); | ||
460 | |||
461 | /* middeer2 */ | ||
462 | middeer2 = newwin(3, 7, 0, 0); | ||
463 | midtop(middeer2); | ||
464 | mvwaddch(middeer2, 2, 3, (chtype) '|'); | ||
465 | mvwaddch(middeer2, 2, 5, (chtype) '|'); | ||
466 | |||
467 | /* middeer3 */ | ||
468 | middeer3 = newwin(3, 7, 0, 0); | ||
469 | midtop(middeer3); | ||
470 | mvwaddch(middeer3, 2, 2, (chtype) '/'); | ||
471 | mvwaddch(middeer3, 2, 6, (chtype) '\\'); | ||
472 | |||
473 | /* bigdeer1 */ | ||
474 | bigdeer1 = newwin(10, 23, 0, 0); | ||
475 | bigtop(bigdeer1); | ||
476 | legs1(bigdeer1); | ||
477 | |||
478 | /* bigdeer2 */ | ||
479 | bigdeer2 = newwin(10, 23, 0, 0); | ||
480 | bigtop(bigdeer2); | ||
481 | legs2(bigdeer2); | ||
482 | |||
483 | /* bigdeer3 */ | ||
484 | bigdeer3 = newwin(10, 23, 0, 0); | ||
485 | bigtop(bigdeer3); | ||
486 | legs3(bigdeer3); | ||
487 | |||
488 | /* bigdeer4 */ | ||
489 | bigdeer4 = newwin(10, 23, 0, 0); | ||
490 | bigtop(bigdeer4); | ||
491 | legs4(bigdeer4); | ||
492 | |||
493 | /* lookdeer1 */ | ||
494 | lookdeer1 = newwin(10, 25, 0, 0); | ||
495 | bigface(lookdeer1, noseattr); | ||
496 | legs1(lookdeer1); | ||
497 | |||
498 | /* lookdeer2 */ | ||
499 | lookdeer2 = newwin(10, 25, 0, 0); | ||
500 | bigface(lookdeer2, noseattr); | ||
501 | legs2(lookdeer2); | ||
502 | |||
503 | /* lookdeer3 */ | ||
504 | lookdeer3 = newwin(10, 25, 0, 0); | ||
505 | bigface(lookdeer3, noseattr); | ||
506 | legs3(lookdeer3); | ||
507 | |||
508 | /* lookdeer4 */ | ||
509 | lookdeer4 = newwin(10, 25, 0, 0); | ||
510 | bigface(lookdeer4, noseattr); | ||
511 | legs4(lookdeer4); | ||
512 | } | ||
513 | |||
514 | void boxit(void) | ||
515 | { | ||
516 | int x; | ||
517 | |||
518 | for (x = 0; x < 20; ++x) | ||
519 | mvaddch(x, 7, '|'); | ||
520 | |||
521 | for (x = 0; x < 80; ++x) | ||
522 | { | ||
523 | if (x > 7) | ||
524 | mvaddch(19, x, '_'); | ||
525 | |||
526 | mvaddch(22, x, '_'); | ||
527 | } | ||
528 | } | ||
529 | |||
530 | void seas(void) | ||
531 | { | ||
532 | mvaddch(4, 1, 'S'); | ||
533 | mvaddch(6, 1, 'E'); | ||
534 | mvaddch(8, 1, 'A'); | ||
535 | mvaddch(10, 1, 'S'); | ||
536 | mvaddch(12, 1, 'O'); | ||
537 | mvaddch(14, 1, 'N'); | ||
538 | mvaddch(16, 1, '`'); | ||
539 | mvaddch(18, 1, 'S'); | ||
540 | } | ||
541 | |||
542 | void greet(void) | ||
543 | { | ||
544 | mvaddch(3, 5, 'G'); | ||
545 | mvaddch(5, 5, 'R'); | ||
546 | mvaddch(7, 5, 'E'); | ||
547 | mvaddch(9, 5, 'E'); | ||
548 | mvaddch(11, 5, 'T'); | ||
549 | mvaddch(13, 5, 'I'); | ||
550 | mvaddch(15, 5, 'N'); | ||
551 | mvaddch(17, 5, 'G'); | ||
552 | mvaddch(19, 5, 'S'); | ||
553 | } | ||
554 | |||
555 | void fromwho(void) | ||
556 | { | ||
557 | mvaddstr(21, 13, FROMWHO); | ||
558 | } | ||
559 | |||
560 | void del_msg(void) | ||
561 | { | ||
562 | refresh(); | ||
563 | } | ||
564 | |||
565 | void tree(void) | ||
566 | { | ||
567 | #ifdef A_COLOR | ||
568 | if (has_colors()) | ||
569 | { | ||
570 | init_pair(30, COLOR_GREEN, COLOR_BLACK); | ||
571 | wattrset(treescrn, COLOR_PAIR(30)); | ||
572 | } | ||
573 | #endif | ||
574 | mvwaddch(treescrn, 1, 11, (chtype) '/'); | ||
575 | mvwaddch(treescrn, 2, 11, (chtype) '/'); | ||
576 | mvwaddch(treescrn, 3, 10, (chtype) '/'); | ||
577 | mvwaddch(treescrn, 4, 9, (chtype) '/'); | ||
578 | mvwaddch(treescrn, 5, 9, (chtype) '/'); | ||
579 | mvwaddch(treescrn, 6, 8, (chtype) '/'); | ||
580 | mvwaddch(treescrn, 7, 7, (chtype) '/'); | ||
581 | mvwaddch(treescrn, 8, 6, (chtype) '/'); | ||
582 | mvwaddch(treescrn, 9, 6, (chtype) '/'); | ||
583 | mvwaddch(treescrn, 10, 5, (chtype) '/'); | ||
584 | mvwaddch(treescrn, 11, 3, (chtype) '/'); | ||
585 | mvwaddch(treescrn, 12, 2, (chtype) '/'); | ||
586 | |||
587 | mvwaddch(treescrn, 1, 13, (chtype) '\\'); | ||
588 | mvwaddch(treescrn, 2, 13, (chtype) '\\'); | ||
589 | mvwaddch(treescrn, 3, 14, (chtype) '\\'); | ||
590 | mvwaddch(treescrn, 4, 15, (chtype) '\\'); | ||
591 | mvwaddch(treescrn, 5, 15, (chtype) '\\'); | ||
592 | mvwaddch(treescrn, 6, 16, (chtype) '\\'); | ||
593 | mvwaddch(treescrn, 7, 17, (chtype) '\\'); | ||
594 | mvwaddch(treescrn, 8, 18, (chtype) '\\'); | ||
595 | mvwaddch(treescrn, 9, 18, (chtype) '\\'); | ||
596 | mvwaddch(treescrn, 10, 19, (chtype) '\\'); | ||
597 | mvwaddch(treescrn, 11, 21, (chtype) '\\'); | ||
598 | mvwaddch(treescrn, 12, 22, (chtype) '\\'); | ||
599 | |||
600 | mvwaddch(treescrn, 4, 10, (chtype) '_'); | ||
601 | mvwaddch(treescrn, 4, 14, (chtype) '_'); | ||
602 | mvwaddch(treescrn, 8, 7, (chtype) '_'); | ||
603 | mvwaddch(treescrn, 8, 17, (chtype) '_'); | ||
604 | |||
605 | mvwaddstr(treescrn, 13, 0, | ||
606 | "//////////// \\\\\\\\\\\\\\\\\\\\\\\\"); | ||
607 | |||
608 | #ifdef A_COLOR | ||
609 | if (has_colors()) | ||
610 | { | ||
611 | init_pair(20, COLOR_YELLOW, COLOR_BLACK); | ||
612 | wattrset(treescrn, COLOR_PAIR(20)); | ||
613 | } | ||
614 | #endif | ||
615 | mvwaddstr(treescrn, 14, 11, "| |"); | ||
616 | mvwaddstr(treescrn, 15, 11, "|_|"); | ||
617 | |||
618 | wrefresh(treescrn); | ||
619 | wrefresh(w_del_msg); | ||
620 | } | ||
621 | |||
622 | void balls(void) | ||
623 | { | ||
624 | chtype ball1, ball2, ball3, ball4, ball5, ball6; | ||
625 | |||
626 | overlay(treescrn, treescrn2); | ||
627 | |||
628 | #ifdef A_COLOR | ||
629 | if (has_colors()) | ||
630 | { | ||
631 | init_pair(1, COLOR_BLUE, COLOR_BLACK); | ||
632 | init_pair(2, COLOR_RED, COLOR_BLACK); | ||
633 | init_pair(3, COLOR_MAGENTA, COLOR_BLACK); | ||
634 | init_pair(4, COLOR_CYAN, COLOR_BLACK); | ||
635 | init_pair(5, COLOR_YELLOW, COLOR_BLACK); | ||
636 | init_pair(6, COLOR_WHITE, COLOR_BLACK); | ||
637 | ball1 = COLOR_PAIR(1) | '@'; | ||
638 | ball2 = COLOR_PAIR(2) | '@'; | ||
639 | ball3 = COLOR_PAIR(3) | '@'; | ||
640 | ball4 = COLOR_PAIR(4) | '@'; | ||
641 | ball5 = COLOR_PAIR(5) | '@'; | ||
642 | ball6 = COLOR_PAIR(6) | '@'; | ||
643 | } | ||
644 | else | ||
645 | #endif | ||
646 | ball1 = ball2 = ball3 = ball4 = ball5 = ball6 = '@'; | ||
647 | |||
648 | mvwaddch(treescrn2, 3, 9, ball1); | ||
649 | mvwaddch(treescrn2, 3, 15, ball2); | ||
650 | mvwaddch(treescrn2, 4, 8, ball3); | ||
651 | mvwaddch(treescrn2, 4, 16, ball4); | ||
652 | mvwaddch(treescrn2, 5, 7, ball5); | ||
653 | mvwaddch(treescrn2, 5, 17, ball6); | ||
654 | mvwaddch(treescrn2, 7, 6, ball1 | A_BOLD); | ||
655 | mvwaddch(treescrn2, 7, 18, ball2 | A_BOLD); | ||
656 | mvwaddch(treescrn2, 8, 5, ball3 | A_BOLD); | ||
657 | mvwaddch(treescrn2, 8, 19, ball4 | A_BOLD); | ||
658 | mvwaddch(treescrn2, 10, 4, ball5 | A_BOLD); | ||
659 | mvwaddch(treescrn2, 10, 20, ball6 | A_BOLD); | ||
660 | mvwaddch(treescrn2, 11, 2, ball1); | ||
661 | mvwaddch(treescrn2, 11, 22, ball2); | ||
662 | mvwaddch(treescrn2, 12, 1, ball3); | ||
663 | mvwaddch(treescrn2, 12, 23, ball4); | ||
664 | |||
665 | wrefresh(treescrn2); | ||
666 | wrefresh(w_del_msg); | ||
667 | } | ||
668 | |||
669 | void star(void) | ||
670 | { | ||
671 | mvwaddch(treescrn2, 0, 12, (chtype) '*' | A_STANDOUT); | ||
672 | |||
673 | wrefresh(treescrn2); | ||
674 | wrefresh(w_del_msg); | ||
675 | } | ||
676 | |||
677 | void strng1(void) | ||
678 | { | ||
679 | #ifdef A_COLOR | ||
680 | if (has_colors()) | ||
681 | { | ||
682 | init_pair(10, COLOR_YELLOW, COLOR_BLACK); | ||
683 | wattrset(treescrn2, COLOR_PAIR(10) | A_BOLD); | ||
684 | } | ||
685 | #endif | ||
686 | mvwaddstr(treescrn2, 3, 11, ".:'"); | ||
687 | |||
688 | wrefresh(treescrn2); | ||
689 | wrefresh(w_del_msg); | ||
690 | } | ||
691 | |||
692 | void strng2(void) | ||
693 | { | ||
694 | #ifdef A_COLOR | ||
695 | if (has_colors()) | ||
696 | { | ||
697 | init_pair(11, COLOR_RED, COLOR_BLACK); | ||
698 | wattrset(treescrn2, COLOR_PAIR(11) | A_BOLD); | ||
699 | } | ||
700 | #endif | ||
701 | mvwaddstr(treescrn2, 5, 11, ",.:'"); | ||
702 | mvwaddstr(treescrn2, 6, 9, ":'"); | ||
703 | |||
704 | wrefresh(treescrn2); | ||
705 | wrefresh(w_del_msg); | ||
706 | } | ||
707 | |||
708 | void strng3(void) | ||
709 | { | ||
710 | #ifdef A_COLOR | ||
711 | if (has_colors()) | ||
712 | { | ||
713 | init_pair(12, COLOR_GREEN, COLOR_BLACK); | ||
714 | wattrset(treescrn2, COLOR_PAIR(12) | A_BOLD); | ||
715 | } | ||
716 | #endif | ||
717 | mvwaddstr(treescrn2, 7, 13, ",.:'"); | ||
718 | mvwaddstr(treescrn2, 8, 9, ",.:'"); | ||
719 | |||
720 | wrefresh(treescrn2); | ||
721 | wrefresh(w_del_msg); | ||
722 | } | ||
723 | |||
724 | void strng4(void) | ||
725 | { | ||
726 | #ifdef A_COLOR | ||
727 | if (has_colors()) | ||
728 | { | ||
729 | init_pair(13, COLOR_WHITE, COLOR_BLACK); | ||
730 | wattrset(treescrn2, COLOR_PAIR(13) | A_BOLD); | ||
731 | } | ||
732 | #endif | ||
733 | mvwaddstr(treescrn2, 9, 14, ",.:'"); | ||
734 | mvwaddstr(treescrn2, 10, 10, ",.:'"); | ||
735 | mvwaddstr(treescrn2, 11, 6, ",.:'"); | ||
736 | mvwaddch(treescrn2, 12, 5, (chtype) '\''); | ||
737 | |||
738 | wrefresh(treescrn2); | ||
739 | wrefresh(w_del_msg); | ||
740 | } | ||
741 | |||
742 | void strng5(void) | ||
743 | { | ||
744 | #ifdef A_COLOR | ||
745 | if (has_colors()) | ||
746 | { | ||
747 | init_pair(14, COLOR_CYAN, COLOR_BLACK); | ||
748 | wattrset(treescrn2, COLOR_PAIR(14) | A_BOLD); | ||
749 | } | ||
750 | #endif | ||
751 | mvwaddstr(treescrn2, 11, 16, ",.:'"); | ||
752 | mvwaddstr(treescrn2, 12, 12, ",.:'"); | ||
753 | |||
754 | /* save a fully lit tree */ | ||
755 | overlay(treescrn2, treescrn); | ||
756 | |||
757 | wrefresh(treescrn2); | ||
758 | wrefresh(w_del_msg); | ||
759 | } | ||
760 | |||
761 | void blinkit(void) | ||
762 | { | ||
763 | static int cycle; | ||
764 | |||
765 | if (cycle > 4) | ||
766 | cycle = 0; | ||
767 | |||
768 | touchwin(treescrn8); | ||
769 | |||
770 | switch (cycle) | ||
771 | { | ||
772 | case 0: | ||
773 | overlay(treescrn3, treescrn8); | ||
774 | break; | ||
775 | |||
776 | case 1: | ||
777 | overlay(treescrn4, treescrn8); | ||
778 | break; | ||
779 | |||
780 | case 2: | ||
781 | overlay(treescrn5, treescrn8); | ||
782 | break; | ||
783 | |||
784 | case 3: | ||
785 | overlay(treescrn6, treescrn8); | ||
786 | break; | ||
787 | |||
788 | case 4: | ||
789 | overlay(treescrn7, treescrn8); | ||
790 | } | ||
791 | |||
792 | wrefresh(treescrn8); | ||
793 | wrefresh(w_del_msg); | ||
794 | |||
795 | napms(50); | ||
796 | touchwin(treescrn8); | ||
797 | |||
798 | /*ALL ON************************************************** */ | ||
799 | |||
800 | overlay(treescrn, treescrn8); | ||
801 | wrefresh(treescrn8); | ||
802 | wrefresh(w_del_msg); | ||
803 | |||
804 | ++cycle; | ||
805 | } | ||
806 | |||
807 | #define TSHOW(win, pause) touchwin(win); wrefresh(win); \ | ||
808 | wrefresh(w_del_msg); napms(pause) | ||
809 | |||
810 | #define SHOW(win, pause) mvwin(win, y_pos, x_pos); wrefresh(win); \ | ||
811 | wrefresh(w_del_msg); napms(pause) | ||
812 | |||
813 | void reindeer(void) | ||
814 | { | ||
815 | int looper; | ||
816 | |||
817 | y_pos = 0; | ||
818 | |||
819 | for (x_pos = 70; x_pos > 62; x_pos--) | ||
820 | { | ||
821 | if (x_pos < 62) | ||
822 | y_pos = 1; | ||
823 | |||
824 | for (looper = 0; looper < 4; looper++) | ||
825 | { | ||
826 | mvwaddch(dotdeer0, y_pos, x_pos, (chtype) '.'); | ||
827 | wrefresh(dotdeer0); | ||
828 | wrefresh(w_del_msg); | ||
829 | werase(dotdeer0); | ||
830 | wrefresh(dotdeer0); | ||
831 | wrefresh(w_del_msg); | ||
832 | } | ||
833 | } | ||
834 | |||
835 | y_pos = 2; | ||
836 | |||
837 | for (; x_pos > 50; x_pos--) | ||
838 | { | ||
839 | for (looper = 0; looper < 4; looper++) | ||
840 | { | ||
841 | if (x_pos < 56) | ||
842 | { | ||
843 | y_pos = 3; | ||
844 | |||
845 | mvwaddch(stardeer0, y_pos, x_pos, (chtype) '*'); | ||
846 | wrefresh(stardeer0); | ||
847 | wrefresh(w_del_msg); | ||
848 | werase(stardeer0); | ||
849 | wrefresh(stardeer0); | ||
850 | } | ||
851 | else | ||
852 | { | ||
853 | mvwaddch(dotdeer0, y_pos, x_pos, (chtype) '*'); | ||
854 | wrefresh(dotdeer0); | ||
855 | wrefresh(w_del_msg); | ||
856 | werase(dotdeer0); | ||
857 | wrefresh(dotdeer0); | ||
858 | } | ||
859 | wrefresh(w_del_msg); | ||
860 | } | ||
861 | } | ||
862 | |||
863 | x_pos = 58; | ||
864 | |||
865 | for (y_pos = 2; y_pos < 5; y_pos++) | ||
866 | { | ||
867 | TSHOW(lildeer0, 50); | ||
868 | |||
869 | for (looper = 0; looper < 4; looper++) | ||
870 | { | ||
871 | SHOW(lildeer3, 50); | ||
872 | SHOW(lildeer2, 50); | ||
873 | SHOW(lildeer1, 50); | ||
874 | SHOW(lildeer2, 50); | ||
875 | SHOW(lildeer3, 50); | ||
876 | |||
877 | TSHOW(lildeer0, 50); | ||
878 | |||
879 | x_pos -= 2; | ||
880 | } | ||
881 | } | ||
882 | |||
883 | x_pos = 35; | ||
884 | |||
885 | for (y_pos = 5; y_pos < 10; y_pos++) | ||
886 | { | ||
887 | touchwin(middeer0); | ||
888 | wrefresh(middeer0); | ||
889 | wrefresh(w_del_msg); | ||
890 | |||
891 | for (looper = 0; looper < 2; looper++) | ||
892 | { | ||
893 | SHOW(middeer3, 50); | ||
894 | SHOW(middeer2, 50); | ||
895 | SHOW(middeer1, 50); | ||
896 | SHOW(middeer2, 50); | ||
897 | SHOW(middeer3, 50); | ||
898 | |||
899 | TSHOW(middeer0, 50); | ||
900 | |||
901 | x_pos -= 3; | ||
902 | } | ||
903 | } | ||
904 | |||
905 | napms(2000); | ||
906 | |||
907 | y_pos = 1; | ||
908 | |||
909 | for (x_pos = 8; x_pos < 16; x_pos++) | ||
910 | { | ||
911 | SHOW(bigdeer4, 30); | ||
912 | SHOW(bigdeer3, 30); | ||
913 | SHOW(bigdeer2, 30); | ||
914 | SHOW(bigdeer1, 30); | ||
915 | SHOW(bigdeer2, 30); | ||
916 | SHOW(bigdeer3, 30); | ||
917 | SHOW(bigdeer4, 30); | ||
918 | SHOW(bigdeer0, 30); | ||
919 | } | ||
920 | |||
921 | --x_pos; | ||
922 | |||
923 | for (looper = 0; looper < 6; looper++) | ||
924 | { | ||
925 | SHOW(lookdeer4, 40); | ||
926 | SHOW(lookdeer3, 40); | ||
927 | SHOW(lookdeer2, 40); | ||
928 | SHOW(lookdeer1, 40); | ||
929 | SHOW(lookdeer2, 40); | ||
930 | SHOW(lookdeer3, 40); | ||
931 | SHOW(lookdeer4, 40); | ||
932 | } | ||
933 | |||
934 | SHOW(lookdeer0, 40); | ||
935 | |||
936 | for (; y_pos < 10; y_pos++) | ||
937 | { | ||
938 | for (looper = 0; looper < 2; looper++) | ||
939 | { | ||
940 | SHOW(bigdeer4, 30); | ||
941 | SHOW(bigdeer3, 30); | ||
942 | SHOW(bigdeer2, 30); | ||
943 | SHOW(bigdeer1, 30); | ||
944 | SHOW(bigdeer2, 30); | ||
945 | SHOW(bigdeer3, 30); | ||
946 | SHOW(bigdeer4, 30); | ||
947 | } | ||
948 | |||
949 | SHOW(bigdeer0, 30); | ||
950 | } | ||
951 | |||
952 | --y_pos; | ||
953 | |||
954 | mvwin(lookdeer3, y_pos, x_pos); | ||
955 | wrefresh(lookdeer3); | ||
956 | wrefresh(w_del_msg); | ||
957 | } |
File doc/Makefile added (mode: 100644) (index 00000000..8b5f3377) | |||
1 | # Makefile for PDCurses manext program. | ||
2 | |||
3 | all: manual | ||
4 | |||
5 | manual: PDCurses.txt | ||
6 | |||
7 | PDCurses.txt: manext | ||
8 | cat intro.txt > PDCurses.txt | ||
9 | echo PDCurses Definitions and Variables >> PDCurses.txt | ||
10 | echo ================================== >> PDCurses.txt | ||
11 | ./manext ../curses.h >> PDCurses.txt | ||
12 | echo PDCurses Functions >> PDCurses.txt | ||
13 | echo ================== >> PDCurses.txt | ||
14 | ./manext ../pdcurses/*.c >> PDCurses.txt | ||
15 | ./manext ../x11/*.c >> PDCurses.txt | ||
16 | cat x11.txt >> PDCurses.txt | ||
17 | echo >> PDCurses.txt | ||
18 | echo >> PDCurses.txt | ||
19 | echo \ | ||
20 | -------------------------------------------------------------------------- \ | ||
21 | >> PDCurses.txt | ||
22 | echo >> PDCurses.txt | ||
23 | cat sdl.txt >> PDCurses.txt | ||
24 | |||
25 | manext: manext.c | ||
26 | |||
27 | install: | ||
28 | echo Does nothing at the moment | ||
29 | |||
30 | clean: | ||
31 | -rm -rf *.o manext PDCurses.txt | ||
32 | |||
33 | distclean: clean | ||
34 | |||
35 | mostlyclean: clean | ||
36 | |||
37 | realclean: distclean |
File doc/intro.txt added (mode: 100644) (index 00000000..a13cb7af) | |||
1 | PDCurses User's Guide | ||
2 | ===================== | ||
3 | |||
4 | Curses Overview | ||
5 | --------------- | ||
6 | |||
7 | The X/Open Curses Interface Definition describes a set of C-Language | ||
8 | functions that provide screen-handling and updating, which are | ||
9 | collectively known as the curses library. | ||
10 | |||
11 | The curses library permits manipulation of data structures called | ||
12 | windows which may be thought of as two-dimensional arrays of | ||
13 | characters representing all or part of a terminal's screen. The | ||
14 | windows are manipulated using a procedural interface described | ||
15 | elsewhere. The curses package maintains a record of what characters | ||
16 | are on the screen. At the most basic level, manipulation is done with | ||
17 | the routines move() and addch() which are used to "move" the curses | ||
18 | around and add characters to the default window, stdscr, which | ||
19 | represents the whole screen. | ||
20 | |||
21 | An application may use these routines to add data to the window in any | ||
22 | convenient order. Once all data have been added, the routine | ||
23 | refresh() is called. The package then determines what changes have | ||
24 | been made which affect the screen. The screen contents are then | ||
25 | changed to reflect those characters now in the window, using a | ||
26 | sequence of operations optimized for the type of terminal in use. | ||
27 | |||
28 | At a higher level routines combining the actions of move() and addch() | ||
29 | are defined, as are routines to add whole strings and to perform | ||
30 | format conversions in the manner of printf(). | ||
31 | |||
32 | Interfaces are also defined to erase the entire window and to specify | ||
33 | the attributes of individual characters in the window. Attributes | ||
34 | such as inverse video, underline and blink can be used on a | ||
35 | per-character basis. | ||
36 | |||
37 | New windows can be created by allowing the application to build | ||
38 | several images of the screen and display the appropriate one very | ||
39 | quickly. New windows are created using the routine newwin(). For | ||
40 | each routine that manipulates the default window, stdscr, there is a | ||
41 | corresponding routine prefixed with w to manipulate the contents of a | ||
42 | specified window; for example, move() and wmove(). In fact, move(...) | ||
43 | is functionally equivalent to wmove( stdscr, ...). This is similar to | ||
44 | the interface offered by printf(...) and fprintf(stdout, ...). | ||
45 | |||
46 | Windows do not have to correspond to the entire screen. It is | ||
47 | possible to create smaller windows, and also to indicate that the | ||
48 | window is only partially visible on the screen. Furthermore, large | ||
49 | windows or pads, which are bigger than the actual screen size, may be | ||
50 | created. | ||
51 | |||
52 | Interfaces are also defined to allow input character manipulation and | ||
53 | to disable and enable many input attributes: character echo, single | ||
54 | character input with or without signal processing (cbreak or raw | ||
55 | modes), carriage returns mapping to newlines, screen scrolling, etc. | ||
56 | |||
57 | |||
58 | Data Types and the <curses.h> Header | ||
59 | ------------------------------------ | ||
60 | |||
61 | The data types supported by curses are described in this section. | ||
62 | |||
63 | As the library supports a procedural interface to the data types, actual | ||
64 | structure contents are not described. All curses data are manipulated | ||
65 | using the routines provided. | ||
66 | |||
67 | |||
68 | THE <curses.h> HEADER | ||
69 | |||
70 | The <curses.h> header defines various constants and declares the data | ||
71 | types that are available to the application. | ||
72 | |||
73 | |||
74 | DATA TYPES | ||
75 | |||
76 | The following data types are declared: | ||
77 | |||
78 | WINDOW * pointer to screen representation | ||
79 | SCREEN * pointer to terminal descriptor | ||
80 | bool boolean data type | ||
81 | chtype representation of a character in a window | ||
82 | cchar_t the wide-character equivalent of chtype | ||
83 | attr_t for WA_-style attributes | ||
84 | |||
85 | The actual WINDOW and SCREEN objects used to store information are | ||
86 | created by the corresponding routines and a pointer to them is provided. | ||
87 | All manipulation is through that pointer. | ||
88 | |||
89 | |||
90 | VARIABLES | ||
91 | |||
92 | The following variables are defined: | ||
93 | |||
94 | LINES number of lines on terminal screen | ||
95 | COLS number of columns on terminal screen | ||
96 | stdscr pointer to the default screen window | ||
97 | curscr pointer to the current screen image | ||
98 | SP pointer to the current SCREEN struct | ||
99 | Mouse_status status of the mouse | ||
100 | COLORS number of colors available | ||
101 | COLOR_PAIRS number of color pairs available | ||
102 | TABSIZE size of one TAB block | ||
103 | acs_map[] alternate character set map | ||
104 | ttytype[] terminal name/description | ||
105 | |||
106 | |||
107 | CONSTANTS | ||
108 | |||
109 | The following constants are defined: | ||
110 | |||
111 | GENERAL | ||
112 | |||
113 | FALSE boolean false value | ||
114 | TRUE boolean true value | ||
115 | NULL zero pointer value | ||
116 | ERR value returned on error condition | ||
117 | OK value returned on successful completion | ||
118 | |||
119 | VIDEO ATTRIBUTES | ||
120 | |||
121 | Normally, attributes are a property of the character. | ||
122 | |||
123 | For chtype: | ||
124 | |||
125 | A_ALTCHARSET use the alternate character set | ||
126 | A_BLINK bright background or blinking | ||
127 | A_BOLD bright foreground or bold | ||
128 | A_DIM half bright -- no effect in PDCurses | ||
129 | A_INVIS invisible | ||
130 | A_ITALIC italic | ||
131 | A_LEFTLINE line along the left edge | ||
132 | A_PROTECT protected (?) -- PDCurses renders this as a | ||
133 | combination of the *LINE attributes | ||
134 | A_REVERSE reverse video | ||
135 | A_RIGHTLINE line along the right edge | ||
136 | A_STANDOUT terminal's best highlighting mode | ||
137 | A_UNDERLINE underline | ||
138 | |||
139 | A_ATTRIBUTES bit-mask to extract attributes | ||
140 | A_CHARTEXT bit-mask to extract a character | ||
141 | A_COLOR bit-mask to extract a color-pair | ||
142 | |||
143 | Not all attributes will work on all terminals. A_RIGHTLINE, A_LEFTLINE | ||
144 | and A_ITALIC are specific to PDCurses. A_INVIS and A_ITALIC are given | ||
145 | the same value in PDCurses. | ||
146 | |||
147 | For attr_t: | ||
148 | |||
149 | WA_ALTCHARSET same as A_ALTCHARSET | ||
150 | WA_BLINK same as A_BLINK | ||
151 | WA_BOLD same as A_BOLD | ||
152 | WA_DIM same as A_DIM | ||
153 | WA_INVIS same as A_INVIS | ||
154 | WA_LEFT same as A_LEFTLINE | ||
155 | WA_PROTECT same as A_PROTECT | ||
156 | WA_REVERSE same as A_REVERSE | ||
157 | WA_RIGHT same as A_RIGHTLINE | ||
158 | WA_STANDOUT same as A_STANDOUT | ||
159 | WA_UNDERLINE same as A_UNDERLINE | ||
160 | |||
161 | Note that while A_LEFTLINE and A_RIGHTLINE are PDCurses-specific, | ||
162 | WA_LEFT and WA_RIGHT are standard. The following are also defined, for | ||
163 | compatibility, but currently have no effect in PDCurses: WA_HORIZONTAL, | ||
164 | WA_LOW, WA_TOP, WA_VERTICAL. | ||
165 | |||
166 | THE ALTERNATE CHARACTER SET | ||
167 | |||
168 | For use in chtypes and with related functions. These are a portable way | ||
169 | to represent graphics characters on different terminals. | ||
170 | |||
171 | VT100-compatible symbols -- box characters: | ||
172 | |||
173 | ACS_ULCORNER upper left box corner | ||
174 | ACS_LLCORNER lower left box corner | ||
175 | ACS_URCORNER upper right box corner | ||
176 | ACS_LRCORNER lower right box corner | ||
177 | ACS_RTEE right "T" | ||
178 | ACS_LTEE left "T" | ||
179 | ACS_BTEE bottom "T" | ||
180 | ACS_TTEE top "T" | ||
181 | ACS_HLINE horizontal line | ||
182 | ACS_VLINE vertical line | ||
183 | ACS_PLUS plus sign, cross, or four-corner piece | ||
184 | |||
185 | VT100-compatible symbols -- other: | ||
186 | |||
187 | ACS_S1 scan line 1 | ||
188 | ACS_S9 scan line 9 | ||
189 | ACS_DIAMOND diamond | ||
190 | ACS_CKBOARD checkerboard -- 50% grey | ||
191 | ACS_DEGREE degree symbol | ||
192 | ACS_PLMINUS plus/minus sign | ||
193 | ACS_BULLET bullet | ||
194 | |||
195 | Teletype 5410v1 symbols -- these are defined in SysV curses, but | ||
196 | are not well-supported by most terminals. Stick to VT100 characters | ||
197 | for optimum portability: | ||
198 | |||
199 | ACS_LARROW left arrow | ||
200 | ACS_RARROW right arrow | ||
201 | ACS_DARROW down arrow | ||
202 | ACS_UARROW up arrow | ||
203 | ACS_BOARD checkerboard -- lighter (less dense) than | ||
204 | ACS_CKBOARD | ||
205 | ACS_LANTERN lantern symbol | ||
206 | ACS_BLOCK solid block | ||
207 | |||
208 | That goes double for these -- undocumented SysV symbols. Don't use | ||
209 | them: | ||
210 | |||
211 | ACS_S3 scan line 3 | ||
212 | ACS_S7 scan line 7 | ||
213 | ACS_LEQUAL less than or equal | ||
214 | ACS_GEQUAL greater than or equal | ||
215 | ACS_PI pi | ||
216 | ACS_NEQUAL not equal | ||
217 | ACS_STERLING pounds sterling symbol | ||
218 | |||
219 | Box character aliases: | ||
220 | |||
221 | ACS_BSSB same as ACS_ULCORNER | ||
222 | ACS_SSBB same as ACS_LLCORNER | ||
223 | ACS_BBSS same as ACS_URCORNER | ||
224 | ACS_SBBS same as ACS_LRCORNER | ||
225 | ACS_SBSS same as ACS_RTEE | ||
226 | ACS_SSSB same as ACS_LTEE | ||
227 | ACS_SSBS same as ACS_BTEE | ||
228 | ACS_BSSS same as ACS_TTEE | ||
229 | ACS_BSBS same as ACS_HLINE | ||
230 | ACS_SBSB same as ACS_VLINE | ||
231 | ACS_SSSS same as ACS_PLUS | ||
232 | |||
233 | For cchar_t and wide-character functions, WACS_ equivalents are also | ||
234 | defined. | ||
235 | |||
236 | COLORS | ||
237 | |||
238 | For use with init_pair(), color_set(), etc.: | ||
239 | |||
240 | COLOR_BLACK | ||
241 | COLOR_BLUE | ||
242 | COLOR_GREEN | ||
243 | COLOR_CYAN | ||
244 | COLOR_RED | ||
245 | COLOR_MAGENTA | ||
246 | COLOR_YELLOW | ||
247 | COLOR_WHITE | ||
248 | |||
249 | Use these instead of numeric values. The definition of the colors | ||
250 | depends on the implementation of curses. | ||
251 | |||
252 | |||
253 | INPUT VALUES | ||
254 | |||
255 | The following constants might be returned by getch() if keypad() has | ||
256 | been enabled. Note that not all of these may be supported on a | ||
257 | particular terminal: | ||
258 | |||
259 | KEY_BREAK break key | ||
260 | KEY_DOWN the four arrow keys | ||
261 | KEY_UP | ||
262 | KEY_LEFT | ||
263 | KEY_RIGHT | ||
264 | KEY_HOME home key (upward+left arrow) | ||
265 | KEY_BACKSPACE backspace | ||
266 | KEY_F0 function keys; space for 64 keys is reserved | ||
267 | KEY_F(n) (KEY_F0+(n)) | ||
268 | KEY_DL delete line | ||
269 | KEY_IL insert line | ||
270 | KEY_DC delete character | ||
271 | KEY_IC insert character | ||
272 | KEY_EIC exit insert character mode | ||
273 | KEY_CLEAR clear screen | ||
274 | KEY_EOS clear to end of screen | ||
275 | KEY_EOL clear to end of line | ||
276 | KEY_SF scroll 1 line forwards | ||
277 | KEY_SR scroll 1 line backwards (reverse) | ||
278 | KEY_NPAGE next page | ||
279 | KEY_PPAGE previous page | ||
280 | KEY_STAB set tab | ||
281 | KEY_CTAB clear tab | ||
282 | KEY_CATAB clear all tabs | ||
283 | KEY_ENTER enter or send | ||
284 | KEY_SRESET soft (partial) reset | ||
285 | KEY_RESET reset or hard reset | ||
286 | KEY_PRINT print or copy | ||
287 | KEY_LL home down or bottom (lower left) | ||
288 | KEY_A1 upper left of virtual keypad | ||
289 | KEY_A3 upper right of virtual keypad | ||
290 | KEY_B2 center of virtual keypad | ||
291 | KEY_C1 lower left of virtual keypad | ||
292 | KEY_C3 lower right of virtual keypad | ||
293 | |||
294 | KEY_BTAB Back tab key | ||
295 | KEY_BEG Beginning key | ||
296 | KEY_CANCEL Cancel key | ||
297 | KEY_CLOSE Close key | ||
298 | KEY_COMMAND Cmd (command) key | ||
299 | KEY_COPY Copy key | ||
300 | KEY_CREATE Create key | ||
301 | KEY_END End key | ||
302 | KEY_EXIT Exit key | ||
303 | KEY_FIND Find key | ||
304 | KEY_HELP Help key | ||
305 | KEY_MARK Mark key | ||
306 | KEY_MESSAGE Message key | ||
307 | KEY_MOVE Move key | ||
308 | KEY_NEXT Next object key | ||
309 | KEY_OPEN Open key | ||
310 | KEY_OPTIONS Options key | ||
311 | KEY_PREVIOUS Previous object key | ||
312 | KEY_REDO Redo key | ||
313 | KEY_REFERENCE Reference key | ||
314 | KEY_REFRESH Refresh key | ||
315 | KEY_REPLACE Replace key | ||
316 | KEY_RESTART Restart key | ||
317 | KEY_RESUME Resume key | ||
318 | KEY_SAVE Save key | ||
319 | KEY_SBEG Shifted beginning key | ||
320 | KEY_SCANCEL Shifted cancel key | ||
321 | KEY_SCOMMAND Shifted command key | ||
322 | KEY_SCOPY Shifted copy key | ||
323 | KEY_SCREATE Shifted create key | ||
324 | KEY_SDC Shifted delete char key | ||
325 | KEY_SDL Shifted delete line key | ||
326 | KEY_SELECT Select key | ||
327 | KEY_SEND Shifted end key | ||
328 | KEY_SEOL Shifted clear line key | ||
329 | KEY_SEXIT Shifted exit key | ||
330 | KEY_SFIND Shifted find key | ||
331 | KEY_SHELP Shifted help key | ||
332 | KEY_SHOME Shifted home key | ||
333 | KEY_SIC Shifted input key | ||
334 | KEY_SLEFT Shifted left arrow key | ||
335 | KEY_SMESSAGE Shifted message key | ||
336 | KEY_SMOVE Shifted move key | ||
337 | KEY_SNEXT Shifted next key | ||
338 | KEY_SOPTIONS Shifted options key | ||
339 | KEY_SPREVIOUS Shifted prev key | ||
340 | KEY_SPRINT Shifted print key | ||
341 | KEY_SREDO Shifted redo key | ||
342 | KEY_SREPLACE Shifted replace key | ||
343 | KEY_SRIGHT Shifted right arrow | ||
344 | KEY_SRSUME Shifted resume key | ||
345 | KEY_SSAVE Shifted save key | ||
346 | KEY_SSUSPEND Shifted suspend key | ||
347 | KEY_SUNDO Shifted undo key | ||
348 | KEY_SUSPEND Suspend key | ||
349 | KEY_UNDO Undo key | ||
350 | |||
351 | The virtual keypad is arranged like this: | ||
352 | |||
353 | A1 up A3 | ||
354 | left B2 right | ||
355 | C1 down C3 | ||
356 | |||
357 | This list is incomplete -- see curses.h for the full list, and use the | ||
358 | testcurs demo to see what values are actually returned. The above are | ||
359 | just the keys required by X/Open. In particular, PDCurses defines many | ||
360 | CTL_ and ALT_ combinations; these are not portable. | ||
361 | |||
362 | |||
363 | FUNCTIONS | ||
364 | |||
365 | The following table lists each curses routine and the name of the manual | ||
366 | page on which it is described. | ||
367 | |||
368 | Functions from the X/Open curses standard -- complete, except for | ||
369 | getch() and ungetch(), which are implemented as macros for DOS | ||
370 | compatibility: | ||
371 | |||
372 | Curses Function Manual Page Name | ||
373 | |||
374 | addch addch | ||
375 | addchnstr addchstr | ||
376 | addchstr addchstr | ||
377 | addnstr addstr | ||
378 | addstr addstr | ||
379 | attroff attr | ||
380 | attron attr | ||
381 | attrset attr | ||
382 | attr_get attr | ||
383 | attr_off attr | ||
384 | attr_on attr | ||
385 | attr_set attr | ||
386 | baudrate termattr | ||
387 | beep beep | ||
388 | bkgd bkgd | ||
389 | bkgdset bkgd | ||
390 | border border | ||
391 | box border | ||
392 | can_change_color color | ||
393 | cbreak inopts | ||
394 | chgat attr | ||
395 | clearok outopts | ||
396 | clear clear | ||
397 | clrtobot clear | ||
398 | clrtoeol clear | ||
399 | color_content color | ||
400 | color_set attr | ||
401 | copywin overlay | ||
402 | curs_set kernel | ||
403 | def_prog_mode kernel | ||
404 | def_shell_mode kernel | ||
405 | del_curterm terminfo | ||
406 | delay_output util | ||
407 | delch delch | ||
408 | deleteln deleteln | ||
409 | delscreen initscr | ||
410 | delwin window | ||
411 | derwin window | ||
412 | doupdate refresh | ||
413 | dupwin window | ||
414 | echochar addch | ||
415 | echo inopts | ||
416 | endwin initscr | ||
417 | erasechar termattr | ||
418 | erase clear | ||
419 | filter util | ||
420 | flash beep | ||
421 | flushinp getch | ||
422 | getbkgd bkgd | ||
423 | getnstr getstr | ||
424 | getstr getstr | ||
425 | getwin scr_dump | ||
426 | halfdelay inopts | ||
427 | has_colors color | ||
428 | has_ic termattr | ||
429 | has_il termattr | ||
430 | hline border | ||
431 | idcok outopts | ||
432 | idlok outopts | ||
433 | immedok outopts | ||
434 | inchnstr inchstr | ||
435 | inchstr inchstr | ||
436 | inch inch | ||
437 | init_color color | ||
438 | init_pair color | ||
439 | initscr initscr | ||
440 | innstr instr | ||
441 | insch insch | ||
442 | insdelln deleteln | ||
443 | insertln deleteln | ||
444 | insnstr innstr | ||
445 | insstr innstr | ||
446 | instr instr | ||
447 | intrflush inopts | ||
448 | isendwin initscr | ||
449 | is_linetouched touch | ||
450 | is_wintouched touch | ||
451 | keyname keyname | ||
452 | keypad inopts | ||
453 | killchar termattr | ||
454 | leaveok outopts | ||
455 | longname termattr | ||
456 | meta inopts | ||
457 | move move | ||
458 | mvaddch addch | ||
459 | mvaddchnstr addchstr | ||
460 | mvaddchstr addchstr | ||
461 | mvaddnstr addstr | ||
462 | mvaddstr addstr | ||
463 | mvchgat attr | ||
464 | mvcur terminfo | ||
465 | mvdelch delch | ||
466 | mvderwin window | ||
467 | mvgetch getch | ||
468 | mvgetnstr getstr | ||
469 | mvgetstr getstr | ||
470 | mvhline border | ||
471 | mvinch inch | ||
472 | mvinchnstr inchstr | ||
473 | mvinchstr inchstr | ||
474 | mvinnstr instr | ||
475 | mvinsch insch | ||
476 | mvinsnstr insstr | ||
477 | mvinsstr insstr | ||
478 | mvinstr instr | ||
479 | mvprintw printw | ||
480 | mvscanw scanw | ||
481 | mvvline border | ||
482 | mvwaddchnstr addchstr | ||
483 | mvwaddchstr addchstr | ||
484 | mvwaddch addch | ||
485 | mvwaddnstr addstr | ||
486 | mvwaddstr addstr | ||
487 | mvwchgat attr | ||
488 | mvwdelch delch | ||
489 | mvwgetch getch | ||
490 | mvwgetnstr getstr | ||
491 | mvwgetstr getstr | ||
492 | mvwhline border | ||
493 | mvwinchnstr inchstr | ||
494 | mvwinchstr inchstr | ||
495 | mvwinch inch | ||
496 | mvwinnstr instr | ||
497 | mvwinsch insch | ||
498 | mvwinsnstr insstr | ||
499 | mvwinsstr insstr | ||
500 | mvwinstr instr | ||
501 | mvwin window | ||
502 | mvwprintw printw | ||
503 | mvwscanw scanw | ||
504 | mvwvline border | ||
505 | napms kernel | ||
506 | newpad pad | ||
507 | newterm initscr | ||
508 | newwin window | ||
509 | nl inopts | ||
510 | nocbreak inopts | ||
511 | nodelay inopts | ||
512 | noecho inopts | ||
513 | nonl inopts | ||
514 | noqiflush inopts | ||
515 | noraw inopts | ||
516 | notimeout inopts | ||
517 | overlay overlay | ||
518 | overwrite overlay | ||
519 | pair_content color | ||
520 | pechochar pad | ||
521 | pnoutrefresh pad | ||
522 | prefresh pad | ||
523 | printw printw | ||
524 | putp terminfo | ||
525 | putwin scr_dump | ||
526 | qiflush inopts | ||
527 | raw inopts | ||
528 | redrawwin refresh | ||
529 | refresh refresh | ||
530 | reset_prog_mode kernel | ||
531 | reset_shell_mode kernel | ||
532 | resetty kernel | ||
533 | restartterm terminfo | ||
534 | ripoffline kernel | ||
535 | savetty kernel | ||
536 | scanw scanw | ||
537 | scr_dump scr_dump | ||
538 | scr_init scr_dump | ||
539 | scr_restore scr_dump | ||
540 | scr_set scr_dump | ||
541 | scrl scroll | ||
542 | scroll scroll | ||
543 | scrollok outopts | ||
544 | set_term initscr | ||
545 | setscrreg outopts | ||
546 | setterm terminfo | ||
547 | setupterm terminfo | ||
548 | slk_attroff slk | ||
549 | slk_attr_off slk | ||
550 | slk_attron slk | ||
551 | slk_attr_on slk | ||
552 | slk_attrset slk | ||
553 | slk_attr_set slk | ||
554 | slk_clear slk | ||
555 | slk_color slk | ||
556 | slk_init slk | ||
557 | slk_label slk | ||
558 | slk_noutrefresh slk | ||
559 | slk_refresh slk | ||
560 | slk_restore slk | ||
561 | slk_set slk | ||
562 | slk_touch slk | ||
563 | standend attr | ||
564 | standout attr | ||
565 | start_color color | ||
566 | subpad pad | ||
567 | subwin window | ||
568 | syncok window | ||
569 | termattrs termattrs | ||
570 | term_attrs termattrs | ||
571 | termname termattrs | ||
572 | tgetent termcap | ||
573 | tgetflag termcap | ||
574 | tgetnum termcap | ||
575 | tgetstr termcap | ||
576 | tgoto termcap | ||
577 | tigetflag terminfo | ||
578 | tigetnum terminfo | ||
579 | tigetstr terminfo | ||
580 | timeout inopts | ||
581 | touchline touch | ||
582 | touchwin touch | ||
583 | tparm terminfo | ||
584 | tputs terminfo | ||
585 | typeahead inopts | ||
586 | untouchwin touch | ||
587 | use_env util | ||
588 | vidattr terminfo | ||
589 | vid_attr terminfo | ||
590 | vidputs terminfo | ||
591 | vid_puts terminfo | ||
592 | vline border | ||
593 | vw_printw printw | ||
594 | vwprintw printw | ||
595 | vw_scanw scanw | ||
596 | vwscanw scanw | ||
597 | waddchnstr addchstr | ||
598 | waddchstr addchstr | ||
599 | waddch addch | ||
600 | waddnstr addstr | ||
601 | waddstr addstr | ||
602 | wattroff attr | ||
603 | wattron attr | ||
604 | wattrset attr | ||
605 | wattr_get attr | ||
606 | wattr_off attr | ||
607 | wattr_on attr | ||
608 | wattr_set attr | ||
609 | wbkgdset bkgd | ||
610 | wbkgd bkgd | ||
611 | wborder border | ||
612 | wchgat attr | ||
613 | wclear clear | ||
614 | wclrtobot clear | ||
615 | wclrtoeol clear | ||
616 | wcolor_set attr | ||
617 | wcursyncup window | ||
618 | wdelch delch | ||
619 | wdeleteln deleteln | ||
620 | wechochar addch | ||
621 | werase clear | ||
622 | wgetch getch | ||
623 | wgetnstr getstr | ||
624 | wgetstr getstr | ||
625 | whline border | ||
626 | winchnstr inchstr | ||
627 | winchstr inchstr | ||
628 | winch inch | ||
629 | winnstr instr | ||
630 | winsch insch | ||
631 | winsdelln deleteln | ||
632 | winsertln deleteln | ||
633 | winsnstr insstr | ||
634 | winsstr insstr | ||
635 | winstr instr | ||
636 | wmove move | ||
637 | wnoutrefresh refresh | ||
638 | wprintw printw | ||
639 | wredrawln refresh | ||
640 | wrefresh refresh | ||
641 | wscanw scanw | ||
642 | wscrl scroll | ||
643 | wsetscrreg outopts | ||
644 | wstandend attr | ||
645 | wstandout attr | ||
646 | wsyncdown window | ||
647 | wsyncup window | ||
648 | wtimeout inopts | ||
649 | wtouchln touch | ||
650 | wvline border | ||
651 | |||
652 | Wide-character functions from the X/Open standard -- these are only | ||
653 | available when PDCurses is built with PDC_WIDE defined, and the | ||
654 | prototypes are only available from curses.h when PDC_WIDE is defined | ||
655 | before its inclusion in your app: | ||
656 | |||
657 | addnwstr addstr | ||
658 | addwstr addstr | ||
659 | add_wch addch | ||
660 | add_wchnstr addchstr | ||
661 | add_wchstr addchstr | ||
662 | border_set border | ||
663 | box_set border | ||
664 | echo_wchar addch | ||
665 | erasewchar termattr | ||
666 | getbkgrnd bkgd | ||
667 | getcchar util | ||
668 | getn_wstr getstr | ||
669 | get_wch getch | ||
670 | get_wstr getstr | ||
671 | hline_set border | ||
672 | innwstr instr | ||
673 | ins_nwstr insstr | ||
674 | ins_wch insch | ||
675 | ins_wstr insstr | ||
676 | inwstr instr | ||
677 | in_wch inch | ||
678 | in_wchnstr inchstr | ||
679 | in_wchstr inchstr | ||
680 | key_name keyname | ||
681 | killwchar termattr | ||
682 | mvaddnwstr addstr | ||
683 | mvaddwstr addstr | ||
684 | mvadd_wch addch | ||
685 | mvadd_wchnstr addchstr | ||
686 | mvadd_wchstr addchstr | ||
687 | mvgetn_wstr getstr | ||
688 | mvget_wch getch | ||
689 | mvget_wstr getstr | ||
690 | mvhline_set border | ||
691 | mvinnwstr instr | ||
692 | mvins_nwstr insstr | ||
693 | mvins_wch insch | ||
694 | mvins_wstr insstr | ||
695 | mvinwstr instr | ||
696 | mvwaddnwstr addstr | ||
697 | mvwaddwstr addstr | ||
698 | mvwadd_wch addch | ||
699 | mvwadd_wchnstr addchstr | ||
700 | mvwadd_wchstr addchstr | ||
701 | mvwgetn_wstr getstr | ||
702 | mvwget_wch getch | ||
703 | mvwget_wstr getstr | ||
704 | mvwhline_set border | ||
705 | mvwinnwstr instr | ||
706 | mvwins_nwstr insstr | ||
707 | mvwins_wch insch | ||
708 | mvwins_wstr insstr | ||
709 | mvwin_wch inch | ||
710 | mvwin_wchnstr inchstr | ||
711 | mvwin_wchstr inchstr | ||
712 | mvwinwstr instr | ||
713 | mvwvline_set border | ||
714 | pecho_wchar pad | ||
715 | setcchar util | ||
716 | slk_wset slk | ||
717 | unget_wch getch | ||
718 | vline_set border | ||
719 | waddnwstr addstr | ||
720 | waddwstr addstr | ||
721 | wadd_wch addch | ||
722 | wadd_wchnstr addchstr | ||
723 | wadd_wchstr addchstr | ||
724 | wbkgrnd bkgd | ||
725 | wbkgrndset bkgd | ||
726 | wborder_set border | ||
727 | wecho_wchar addch | ||
728 | wgetbkgrnd bkgd | ||
729 | wgetn_wstr getstr | ||
730 | wget_wch getch | ||
731 | wget_wstr getstr | ||
732 | whline_set border | ||
733 | winnwstr instr | ||
734 | wins_nwstr insstr | ||
735 | wins_wch insch | ||
736 | wins_wstr insstr | ||
737 | winwstr instr | ||
738 | win_wch inch | ||
739 | win_wchnstr inchstr | ||
740 | win_wchstr inchstr | ||
741 | wunctrl util | ||
742 | wvline_set border | ||
743 | |||
744 | Quasi-standard functions, from Sys V or BSD curses: | ||
745 | |||
746 | getattrs attr | ||
747 | getbegx getyx | ||
748 | getbegy getyx | ||
749 | getmaxx getyx | ||
750 | getmaxy getyx | ||
751 | getparx getyx | ||
752 | getparx getyx | ||
753 | traceoff debug | ||
754 | traceon debug | ||
755 | unctrl util | ||
756 | |||
757 | Classic PDCurses mouse functions, based on Sys V: | ||
758 | |||
759 | mouse_set mouse | ||
760 | mouse_on mouse | ||
761 | mouse_off mouse | ||
762 | request_mouse_pos mouse | ||
763 | map_button mouse | ||
764 | wmouse_position mouse | ||
765 | getmouse mouse | ||
766 | getbmap mouse | ||
767 | |||
768 | Functions from ncurses: | ||
769 | |||
770 | assume_default_colors color | ||
771 | curses_version initscr | ||
772 | has_key keyname | ||
773 | use_default_colors color | ||
774 | wresize window | ||
775 | |||
776 | mouseinterval mouse | ||
777 | mousemask mouse | ||
778 | mouse_trafo mouse | ||
779 | nc_getmouse mouse | ||
780 | ungetmouse mouse | ||
781 | wenclose mouse | ||
782 | wmouse_trafo mouse | ||
783 | |||
784 | PDCurses-specific functions -- avoid these in code that's intended to be | ||
785 | portable: | ||
786 | |||
787 | addrawch addch | ||
788 | insrawch insch | ||
789 | is_termresized initscr | ||
790 | mvaddrawch addch | ||
791 | mvdeleteln deleteln | ||
792 | mvinsertln deleteln | ||
793 | mvinsrawch insch | ||
794 | mvwaddrawch addch | ||
795 | mvwdeleteln deleteln | ||
796 | mvwinsertln deleteln | ||
797 | mvwinsrawch insch | ||
798 | raw_output outopts | ||
799 | resize_term initscr | ||
800 | resize_window window | ||
801 | slk_wlabel slk | ||
802 | waddrawch addch | ||
803 | winsrawch insch | ||
804 | wordchar termattr | ||
805 | |||
806 | PDC_debug debug | ||
807 | PDC_ungetch getch | ||
808 | PDC_set_blink pdcsetsc | ||
809 | PDC_set_line_color color | ||
810 | PDC_set_title pdcsetsc | ||
811 | |||
812 | PDC_clearclipboard pdcclip | ||
813 | PDC_freeclipboard pdcclip | ||
814 | PDC_getclipboard pdcclip | ||
815 | PDC_setclipboard pdcclip | ||
816 | |||
817 | PDC_get_input_fd pdckbd | ||
818 | PDC_get_key_modifiers getch | ||
819 | PDC_return_key_modifiers getch | ||
820 | PDC_save_key_modifiers getch | ||
821 | |||
822 | Functions specific to the X11 port of PDCurses: | ||
823 | |||
824 | Xinitscr initscr | ||
825 | XCursesExit - | ||
826 | sb_init sb | ||
827 | sb_set_horz sb | ||
828 | sb_set_vert sb | ||
829 | sb_get_horz sb | ||
830 | sb_get_vert sb | ||
831 | sb_refresh sb | ||
832 | |||
833 | -------------------------------------------------------------------------- | ||
834 |
File doc/manext.c added (mode: 100644) (index 00000000..4ce7cbf5) | |||
1 | /***********************************************************************/ | ||
2 | /* MANEXT - Extract manual pages from C source code. */ | ||
3 | /***********************************************************************/ | ||
4 | /* | ||
5 | * MANEXT - A program to extract manual pages from C source code. | ||
6 | * Copyright (C) 1991-1996 Mark Hessling | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License as | ||
10 | * published by the Free Software Foundation; either version 2 of | ||
11 | * the License, or any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * General Public License for more details. | ||
17 | * | ||
18 | * If you make modifications to this software that you feel increases | ||
19 | * it usefulness for the rest of the community, please email the | ||
20 | * changes, enhancements, bug fixes as well as any and all ideas to me. | ||
21 | * This software is going to be maintained and enhanced as deemed | ||
22 | * necessary by the community. | ||
23 | * | ||
24 | * Mark Hessling <mark@rexx.org> | ||
25 | */ | ||
26 | |||
27 | #include <stdio.h> | ||
28 | #include <stdlib.h> | ||
29 | #include <string.h> | ||
30 | |||
31 | #define MAX_LINE 255 | ||
32 | |||
33 | void display_info() | ||
34 | { | ||
35 | fprintf(stderr, "\nMANEXT 1.03 Copyright (C) 1991-1996 Mark Hessling\n" | ||
36 | "All rights reserved.\n" | ||
37 | "MANEXT is distributed under the terms of the GNU\n" | ||
38 | "General Public License and comes with NO WARRANTY.\n" | ||
39 | "See the file COPYING for details.\n" | ||
40 | "\nUsage: manext sourcefile [...]\n\n"); | ||
41 | } | ||
42 | |||
43 | int main(int argc, char **argv) | ||
44 | { | ||
45 | char s[MAX_LINE + 1]; /* input line */ | ||
46 | int i; | ||
47 | FILE *fp; | ||
48 | |||
49 | #ifdef __EMX__ | ||
50 | _wildcard(&argc, &argv); | ||
51 | #endif | ||
52 | if (strcmp(argv[1], "-h") == 0) | ||
53 | { | ||
54 | display_info(); | ||
55 | exit(1); | ||
56 | } | ||
57 | |||
58 | for (i = 1; i < argc; i++) | ||
59 | { | ||
60 | if ((fp = fopen(argv[i], "r")) == NULL) | ||
61 | { | ||
62 | fprintf(stderr, "\nCould not open %s\n", argv[i]); | ||
63 | continue; | ||
64 | } | ||
65 | |||
66 | while (!feof(fp)) | ||
67 | { | ||
68 | if (fgets(s, (int)sizeof(s), fp) == NULL) | ||
69 | { | ||
70 | if (ferror(fp) != 0) | ||
71 | { | ||
72 | fprintf(stderr, "*** Error reading %s. Exiting.\n", | ||
73 | argv[i]); | ||
74 | exit(1); | ||
75 | } | ||
76 | |||
77 | break; | ||
78 | } | ||
79 | |||
80 | /* check for manual entry marker at beginning of line */ | ||
81 | |||
82 | if (strncmp(s, "/*man-start*", 12) != 0) | ||
83 | continue; | ||
84 | |||
85 | /* inner loop */ | ||
86 | |||
87 | for (;;) | ||
88 | { | ||
89 | /* read next line of manual entry */ | ||
90 | |||
91 | if (fgets(s, (int)sizeof(s), fp) == NULL) | ||
92 | { | ||
93 | if (ferror(fp) != 0) | ||
94 | { | ||
95 | fprintf(stderr, "*** Error reading %s. Exiting.\n", | ||
96 | argv[i]); | ||
97 | exit(1); | ||
98 | } | ||
99 | |||
100 | break; | ||
101 | } | ||
102 | |||
103 | /* check for end of entry marker */ | ||
104 | |||
105 | if (strncmp(s, "**man-end", 9) == 0) | ||
106 | break; | ||
107 | |||
108 | printf("%s", s); | ||
109 | } | ||
110 | |||
111 | printf("\n\n-----------------------------------" | ||
112 | "---------------------------------------\n\n"); | ||
113 | } | ||
114 | |||
115 | fclose(fp); | ||
116 | } | ||
117 | |||
118 | return 0; | ||
119 | } |
File doc/sdl.txt added (mode: 100644) (index 00000000..6a54b9b4) | |||
1 | SDL Considerations | ||
2 | ================== | ||
3 | |||
4 | There are no special requirements to use PDCurses for SDL -- all | ||
5 | PDCurses-compatible code should work fine. (In fact, you can even build | ||
6 | against the Win32 console pdcurses.dll, and then swap in the SDL | ||
7 | pdcurses.dll.) Nothing extra is needed beyond the base SDL library. | ||
8 | However, there are some optional special features, described here. | ||
9 | |||
10 | The principal limitation of this port is that input is currently | ||
11 | restricted to ASCII (i.e., 0-127), plus the special keys like KEY_LEFT. | ||
12 | (You could have Unicode input, but then the input wouldn't match the | ||
13 | output, which is in Code Page 437.) Also, see the note about the | ||
14 | potential for incomplete output under "PDC_update_rects()", below. | ||
15 | |||
16 | |||
17 | Fonts | ||
18 | ----- | ||
19 | |||
20 | The font is a simple BMP, 32 characters wide by 8 characters tall, | ||
21 | preferably with a palette. (BMPs without palettes still work, but in | ||
22 | that case, no attributes will be available, nor will the cursor work.) | ||
23 | The first entry in the palette (usually black) is treated as the | ||
24 | background color; the last entry (usually white) is treated as the | ||
25 | foreground. These are changed or made transparent as appropriate; any | ||
26 | other colors in the palette are passed through unchanged. So -- although | ||
27 | a one-bit depth is sufficient for a normal font -- you could redraw some | ||
28 | characters as multi-colored tiles. | ||
29 | |||
30 | The font must be monospaced. The size of each character is derived by | ||
31 | dividing the width of the BMP by 32 and the height by 8. There is no | ||
32 | constraint on the dimensions. | ||
33 | |||
34 | As provided in the default font and expected by acs_map[], the font is | ||
35 | in Code Page 437 form. But you can of course use any layout if you're | ||
36 | not relying on correct values for the ACS_* macros. | ||
37 | |||
38 | The font can be set via the environment variable PDC_FONT. If it's not | ||
39 | set, PDCurses looks for a file named "pdcfont.bmp" in the current | ||
40 | directory at the time of initscr(). If neither is found, it uses the | ||
41 | built-in default font encoded in deffont.h. | ||
42 | |||
43 | |||
44 | Backgrounds | ||
45 | ----------- | ||
46 | |||
47 | PDCurses for SDL supports an optional background image BMP. This is used | ||
48 | whenever start_color() has not been called (see the ptest demo for an | ||
49 | example), or when use_default_colors() has been called after | ||
50 | start_color(), and the background color of a pair has been set to -1 | ||
51 | (see newdemo, worm, and rain for examples). The usage parallels that of | ||
52 | ncurses in an appropriate terminal (e.g., Gnome Terminal). The image is | ||
53 | tiled to cover the PDCurses window, and can be any size or depth. | ||
54 | |||
55 | As with the font, you can point to a location for the background via the | ||
56 | environment variable PDC_BACKGROUND; "pdcback.bmp" is the fallback. | ||
57 | (There is no default background.) | ||
58 | |||
59 | |||
60 | Icons | ||
61 | ----- | ||
62 | |||
63 | The icon (used with SDL_WM_SetIcon() -- not used for the executable | ||
64 | file) can be set via the environment variable PDC_ICON, and falls back | ||
65 | to "pdcicon.bmp", and then to the built-in icon from deficon.h. The | ||
66 | built-in icon is the PDCurses logo, as seen in ../x11/little_icon.xbm. | ||
67 | The SDL docs say that the icon must be 32x32, at least for use with MS | ||
68 | Windows. | ||
69 | |||
70 | If pdc_screen is preinitialized (see below), PDCurses does not attempt | ||
71 | to set the icon. | ||
72 | |||
73 | |||
74 | Screen size | ||
75 | ----------- | ||
76 | |||
77 | The default screen size is 80x25 characters (whatever size they may be), | ||
78 | but you can override this via the environment variables PDC_COLS and/or | ||
79 | PDC_LINES. (Some other ports use COLS and LINES; this is not done here | ||
80 | because those values are, or should be, those of the controlling | ||
81 | terminal, and PDCurses for SDL is independent of the terminal.) If | ||
82 | pdc_screen is preinitialized (see below), these are ignored. | ||
83 | |||
84 | |||
85 | Integration with SDL | ||
86 | -------------------- | ||
87 | |||
88 | If you want to go further, you can mix PDCurses and SDL functions. (Of | ||
89 | course this is extremely non-portable!) To aid you, there are several | ||
90 | external variables and functions specific to the SDL port; you could | ||
91 | include pdcsdl.h, or just add the declarations you need in your code: | ||
92 | |||
93 | PDCEX SDL_Surface *pdc_screen, *pdc_font, *pdc_icon, *pdc_back; | ||
94 | PDCEX int pdc_sheight, pdc_swidth, pdc_yoffset, pdc_xoffset; | ||
95 | |||
96 | void PDC_update_rects(void); | ||
97 | void PDC_retile(void); | ||
98 | |||
99 | pdc_screen is the main surface, created by SDL_SetVideoMode(), unless | ||
100 | it's preset before initscr(). You can perform normal SDL operations on | ||
101 | this surface, but PDCurses won't respect them when it updates. (For | ||
102 | that, see PDC_retile().) As an alternative, you can preinitialize this | ||
103 | surface before calling initscr(). In that case, you can use pdc_sheight, | ||
104 | pdc_swidth, pdc_yoffset and/or pdc_xoffset (q.v.) to confine PDCurses to | ||
105 | only a specific area of the surface, reserving the rest for other SDL | ||
106 | operations. If you preinitialize pdc_screen, you'll have to close it | ||
107 | yourself; PDCurses will ignore resize events, and won't try to set the | ||
108 | icon. Also note that if you preinitialize pdc_screen, it need not be the | ||
109 | display surface. | ||
110 | |||
111 | pdc_font, pdc_icon, and pdc_back are the SDL_surfaces for the font, | ||
112 | icon, and background, respectively. You can set any or all of them | ||
113 | before initscr(), and thus override any of the other ways to set them. | ||
114 | But note that pdc_icon will be ignored if pdc_screen is preset. | ||
115 | |||
116 | pdc_sheight and pdc_swidth are the dimensions of the area of pdc_screen | ||
117 | to be used by PDCurses. You can preset them before initscr(); if either | ||
118 | is not set, it defaults to the full screen size minus the x or y offset, | ||
119 | as appropriate. | ||
120 | |||
121 | pdc_xoffset and pdc_yoffset are the x and y offset for the area of | ||
122 | pdc_screen to be used by PDCurses. See the sdltest demo for an example. | ||
123 | |||
124 | PDC_retile() makes a copy of pdc_screen, then tiles it with the | ||
125 | background image, if any. The resulting surface is used as the | ||
126 | background for transparent character cells. PDC_retile() is called from | ||
127 | initscr() and resize_term(). However, you can also use it at other | ||
128 | times, to take advantage of the way it copies pdc_screen: Draw some SDL | ||
129 | stuff; call PDC_retile(); do some curses stuff -- it will use whatever | ||
130 | was on pdc_screen as the background. Then you can erase the curses | ||
131 | screen, do some more SDL stuff, and call PDC_retile() again to make a | ||
132 | new background. (If you don't erase the curses screen, it will be | ||
133 | incorporated into the background when you call PDC_retile().) But this | ||
134 | only works if no background image is set. | ||
135 | |||
136 | PDC_update_rects() is how the screen actually gets updated. For | ||
137 | performance reasons, when drawing, PDCurses for SDL maintains a table of | ||
138 | rectangles that need updating, and only updates (by calling this | ||
139 | function) during getch(), napms(), or when the table gets full. | ||
140 | Normally, this is sufficient; but if you're pausing in some way other | ||
141 | than by using napms(), and you're not doing keyboard checks, you may get | ||
142 | an incomplete update. If that happens, you can call PDC_update_rects() | ||
143 | manually. | ||
144 | |||
145 | |||
146 | Interaction with stdio | ||
147 | ---------------------- | ||
148 | |||
149 | As with X11, it's a bad idea to mix curses and stdio calls. (In fact, | ||
150 | that's true for PDCurses on any platform; but especially these two, | ||
151 | which don't run under terminals.) Depending on how SDL is built, stdout | ||
152 | and stderr may be redirected to files. |
File doc/x11.txt added (mode: 100644) (index 00000000..db05683d) | |||
1 | X11 Considerations | ||
2 | ================== | ||
3 | |||
4 | PDCurses for X11 uses the System V IPC shared memory facility, along | ||
5 | with sockets, to share data between the curses program and the child | ||
6 | process created to manage the X stuff. | ||
7 | |||
8 | When compiling your application, you need to include the <curses.h> or | ||
9 | <xcurses.h> that comes with PDCurses. You also need to link your code | ||
10 | with libXCurses. You may need to link with the following libraries under | ||
11 | X11R5: | ||
12 | Xaw Xmu Xt X11 | ||
13 | |||
14 | or, under X11R6: | ||
15 | Xaw Xmu Xt X11 SM ICE Xext | ||
16 | |||
17 | You can run "xcurses-config --libs" to show the link parameters for your | ||
18 | system. If using dynamic linking, on some systems, "-lXCurses" suffices. | ||
19 | |||
20 | By calling Xinitscr() rather than initscr(), you can pass your program | ||
21 | name and resource overrides to PDCurses. The program name is used as the | ||
22 | title of the X window, and for defining X resources specific to your | ||
23 | program. | ||
24 | |||
25 | |||
26 | Interaction with stdio | ||
27 | ---------------------- | ||
28 | |||
29 | Be aware that curses programs that expect to have a normal tty | ||
30 | underneath them will be very disappointed! Output directed to stdout | ||
31 | will go to the xterm that invoked the PDCurses application, or to the | ||
32 | console if not invoked directly from an xterm. Similarly, stdin will | ||
33 | expect its input from the same place as stdout. | ||
34 | |||
35 | |||
36 | X Resources | ||
37 | ----------- | ||
38 | |||
39 | PDCurses for X11 recognizes the following resources: | ||
40 | |||
41 | lines | ||
42 | cols | ||
43 | normalFont | ||
44 | italicFont | ||
45 | pointer | ||
46 | pointerForeColor | ||
47 | pointerBackColor | ||
48 | cursorColor | ||
49 | textCursor | ||
50 | colorBlack | ||
51 | colorRed | ||
52 | colorGreen | ||
53 | colorYellow | ||
54 | colorBlue | ||
55 | colorMagenta | ||
56 | colorCyan | ||
57 | colorWhite | ||
58 | colorBoldBlack | ||
59 | colorBoldRed | ||
60 | colorBoldGreen | ||
61 | colorBoldYellow | ||
62 | colorBoldBlue | ||
63 | colorBoldMagenta | ||
64 | colorBoldCyan | ||
65 | colorBoldWhite | ||
66 | bitmap | ||
67 | pixmap | ||
68 | translations | ||
69 | shmmin | ||
70 | borderWidth | ||
71 | borderColor | ||
72 | clickPeriod | ||
73 | doubleClickPeriod | ||
74 | composeKey | ||
75 | |||
76 | lines: Specifies the number of lines the "screen" will have. | ||
77 | Directly equates to LINES. | ||
78 | There is no theoretical maximum. | ||
79 | The minimum value must be 2. | ||
80 | Default: 24 | ||
81 | |||
82 | cols: Specifies the number of columns the "screen" will have. | ||
83 | Directly equates to COLS. | ||
84 | There is no theoretical maximum. | ||
85 | The minimum value must be 2. | ||
86 | Default: 80 | ||
87 | |||
88 | normalFont: The name of a fixed width font. | ||
89 | Default: 7x13 | ||
90 | |||
91 | italicFont: The name of a fixed width font to be used for | ||
92 | characters with A_ITALIC attributes. Must have the | ||
93 | same cell size as normalFont. | ||
94 | Default: 7x13 (obviously not an italic font) | ||
95 | |||
96 | pointer: The name of a valid pointer cursor. | ||
97 | Default: xterm | ||
98 | |||
99 | pointerForeColor: The foreground color of the pointer. | ||
100 | Default: black | ||
101 | |||
102 | pointerBackColor: The background color of the pointer. | ||
103 | Default: white | ||
104 | |||
105 | textCursor: The alignment of the text cursor; horizontal or vertical. | ||
106 | Default: horizontal | ||
107 | |||
108 | colorBlack: The color of the COLOR_BLACK attribute. | ||
109 | Default: Black | ||
110 | |||
111 | colorRed: The color of the COLOR_RED attribute. | ||
112 | Default: red3 | ||
113 | |||
114 | colorGreen: The color of the COLOR_GREEN attribute. | ||
115 | Default: green3 | ||
116 | |||
117 | colorYellow: The color of the COLOR_YELLOW attribute. | ||
118 | Default: yellow3 | ||
119 | |||
120 | colorBlue: The color of the COLOR_BLUE attribute. | ||
121 | Default: blue3 | ||
122 | |||
123 | colorMagenta: The color of the COLOR_MAGENTA attribute. | ||
124 | Default: magenta3 | ||
125 | |||
126 | colorCyan: The color of the COLOR_CYAN attribute. | ||
127 | Default: cyan3 | ||
128 | |||
129 | colorWhite: The color of the COLOR_WHITE attribute. | ||
130 | Default: Grey | ||
131 | |||
132 | colorBoldBlack: COLOR_BLACK combined with A_BOLD. | ||
133 | Default: grey40 | ||
134 | |||
135 | colorBoldRed: COLOR_RED combined with A_BOLD. | ||
136 | Default: red1 | ||
137 | |||
138 | colorBoldGreen: COLOR_GREEN combined with A_BOLD. | ||
139 | Default: green1 | ||
140 | |||
141 | colorBoldYellow: COLOR_YELLOW combined with A_BOLD. | ||
142 | Default: yellow1 | ||
143 | |||
144 | colorBoldBlue: COLOR_BLUE combined with A_BOLD. | ||
145 | Default: blue1 | ||
146 | |||
147 | colorBoldMagenta: COLOR_MAGENTA combined with A_BOLD. | ||
148 | Default: magenta1 | ||
149 | |||
150 | colorBoldCyan: COLOR_CYAN combined with A_BOLD. | ||
151 | Default: cyan1 | ||
152 | |||
153 | colorBoldWhite: COLOR_WHITE combined with A_BOLD. | ||
154 | Default: White | ||
155 | |||
156 | bitmap: The name of a valid bitmap file of depth 1 (black and white) | ||
157 | used for the application's icon. The file is an X bitmap. | ||
158 | Default: a 32x32 or 64x64 pixmap depending on the | ||
159 | window manager | ||
160 | |||
161 | pixmap: The name of a valid pixmap file of any depth | ||
162 | supported by the window manager (color) for the | ||
163 | application's icon, The file is an X11 pixmap. This | ||
164 | resource is only available if the libXpm package has | ||
165 | been installed (most systems have this by default). | ||
166 | This resource overrides the "bitmap" resource. | ||
167 | Default: none, uses default bitmap above | ||
168 | |||
169 | translations: Translations enable the user to customize the action | ||
170 | that occurs when a key, combination of keys, or a | ||
171 | button is pressed. The translations are similar to | ||
172 | those used by xterm. | ||
173 | Defaults: | ||
174 | <Key>: XCursesKeyPress() | ||
175 | <KeyUp>: XCursesKeyPress() | ||
176 | <BtnDown>: XCursesButton() | ||
177 | <BtnUp>: XCursesButton() | ||
178 | <BtnMotion>: XCursesButton() | ||
179 | |||
180 | The most useful action for KeyPress translations is | ||
181 | string(). The argument to the string() action can be | ||
182 | either a string or a hex representation of a | ||
183 | character; e.g., string(0x1b) will send the ASCII | ||
184 | escape character to the application; string("[11~") | ||
185 | will send [ 1 1 ~ , as separate keystrokes. | ||
186 | |||
187 | shmmin: On most systems, there are two Unix kernel parameters | ||
188 | that determine the allowable size of a shared memory | ||
189 | segment. These parameters are usually something like | ||
190 | SHMMIN and SHMMAX. To use shared memory, a program | ||
191 | must allocate a segment of shared memory that is | ||
192 | between these two values. Usually these values are | ||
193 | like 1 for SHMMIN and some large number for SHMMAX. | ||
194 | Sometimes the Unix kernel is configured to have a | ||
195 | value of SHMMIN that is bigger than the size of one | ||
196 | of the shared memory segments that libXCurses uses. | ||
197 | On these systems an error message like: | ||
198 | |||
199 | Cannot allocate shared memory for SCREEN: Invalid argument | ||
200 | |||
201 | will result. To overcome this problem, this resource | ||
202 | should be set to the kernel value for SHMMIN. This | ||
203 | ensures that a shared memory segment will always be | ||
204 | bigger than the kernel value for SHMMIN (and | ||
205 | hopefully less than SHMMAX!) | ||
206 | |||
207 | Default: 0 | ||
208 | |||
209 | borderColor: The color of the border around the screen. | ||
210 | Default: black | ||
211 | |||
212 | borderWidth: The width in pixels of the border around the screen. | ||
213 | Default: 0 | ||
214 | |||
215 | clickPeriod: The period (in milliseconds) between a button | ||
216 | press and a button release that determines if a click | ||
217 | of a button has occurred. | ||
218 | Default: 100 | ||
219 | |||
220 | doubleClickPeriod: The period (in milliseconds) between two button | ||
221 | press events that determines if a double click | ||
222 | of a button has occurred. | ||
223 | Default: 200 | ||
224 | |||
225 | composeKey: The name of the X key that defines the "compose key", | ||
226 | which is used to enter characters in the Latin-1 | ||
227 | character set above 0xA0. (See "Compose Keys for | ||
228 | Latin-1" below.) This is used only when PDCurses is | ||
229 | built without XIM support. While in compose mode, the | ||
230 | text cursor will appear as a hollow rectangle. | ||
231 | Default: Multi_key | ||
232 | |||
233 | |||
234 | Using Resources | ||
235 | --------------- | ||
236 | |||
237 | All applications have a top-level class name of "XCurses". If Xinitscr() | ||
238 | is used, it sets an application's top-level widget name. (Otherwise the | ||
239 | name defaults to "PDCurses".) | ||
240 | |||
241 | Examples for app-defaults or .Xdefaults: | ||
242 | |||
243 | ! | ||
244 | ! resources for XCurses class of programs | ||
245 | ! | ||
246 | XCurses*lines: 30 | ||
247 | XCurses*cols: 80 | ||
248 | XCurses*normalFont: 9x13 | ||
249 | XCurses*bitmap: /tmp/xcurses.xbm | ||
250 | XCurses*pointer: top_left_arrow | ||
251 | ! | ||
252 | ! resources for testcurs - XCurses | ||
253 | ! | ||
254 | testcurs.colorRed: orange | ||
255 | testcurs.colorBlack: midnightblue | ||
256 | testcurs.lines: 25 | ||
257 | *testcurs.Translations: #override \n \ | ||
258 | <Key>F12: string(0x1b) string("[11~") \n | ||
259 | ! | ||
260 | ! resources for THE - XCurses | ||
261 | ! | ||
262 | ! resources with the * wildcard can be overridden by a parameter passed | ||
263 | ! to initscr() | ||
264 | ! | ||
265 | the*normalFont: 9x15 | ||
266 | the*lines: 40 | ||
267 | the*cols: 86 | ||
268 | the*pointer: xterm | ||
269 | the*pointerForeColor: white | ||
270 | the*pointerBackColor: black | ||
271 | ! | ||
272 | ! resources with the . format can not be overridden by a parameter passed | ||
273 | ! to Xinitscr() | ||
274 | ! | ||
275 | the.bitmap: /home/mark/the/the64.xbm | ||
276 | the.pixmap: /home/mark/the/the64.xpm | ||
277 | |||
278 | Resources may also be passed as parameters to the Xinitscr() function. | ||
279 | Parameters are strings in the form of switches; e.g., to set the color | ||
280 | "red" to "indianred", and the number of lines to 30, the string passed | ||
281 | to Xinitscr would be: "-colorRed indianred -lines 30" | ||
282 | |||
283 | |||
284 | Compose Keys for Latin-1 | ||
285 | ------------------------ | ||
286 | |||
287 | When built without XIM support, PDCurses for X11 provides its own, | ||
288 | limited compose key system for Latin-1 characters. The available | ||
289 | combinations are listed here. For a given character, any of the | ||
290 | combinations shown in the last column may be used. To generate a | ||
291 | character, press the "compose" key followed by one of the pairs of | ||
292 | keystrokes. Where no key is evident, the spacebar is used. Thus, to | ||
293 | generate the NO-BREAK SPACE, press the "compose" key followed by two | ||
294 | hits of the spacebar. | ||
295 | |||
296 | With a typical modern X server, you can get many more compose key | ||
297 | combinations by using XIM instead. Configure PDCurses with --enable-xim | ||
298 | to use XIM support. | ||
299 | |||
300 | This document is encoded in UTF-8. | ||
301 | |||
302 | +----+-----+---+---------------------------------+---------------------------+ | ||
303 | |Hex | Dec |Chr| Description ISO 10646-1:1993(E) | Compose key combinations | | ||
304 | +----+-----+---+---------------------------------+---------------------------+ | ||
305 | | A0 | 160 | | NO-BREAK SPACE | | | ||
306 | | A1 | 161 | ¡ | INVERTED EXCLAMATION MARK | ! !! | | ||
307 | | A2 | 162 | ¢ | CENT SIGN | c| |c c/ c$ C$ C| | | ||
308 | | A3 | 163 | £ | POUND SIGN | L- L$ L= l- l$ l= |-| | ||
309 | | A4 | 164 | ¤ | CURRENCY SIGN | xo ox XO g$ | | ||
310 | | A5 | 165 | ¥ | YEN SIGN | =y y= =Y Y= Y- y$ y-| | ||
311 | | A6 | 166 | ¦ | BROKEN BAR | | || vb VB |^ | | ||
312 | | A7 | 167 | § | SECTION SIGN | SO SS s! S! so | | ||
313 | | A8 | 168 | ¨ | DIAERESIS | " "" | | ||
314 | | A9 | 169 | © | COPYRIGHT SIGN | CO co OC | | ||
315 | | AA | 170 | ª | FEMININE ORDINAL INDICATOR | sa SA a_ A_ | | ||
316 | | AB | 171 | « | LEFT DOUBLE ANGLE QUOTES | << | | ||
317 | | AC | 172 | ¬ | NOT SIGN | -, no NO | | ||
318 | | AD | 173 | | SOFT HYPHEN | - -- | | ||
319 | | AE | 174 | ® | REGISTERED SIGN | RO ro OR | | ||
320 | | AF | 175 | ¯ | MACRON | -^ _^ __ | | ||
321 | | B0 | 176 | ° | DEGREE SIGN | o 0^ 0* de DE ^0 | | ||
322 | | B1 | 177 | ± | PLUS-MINUS SIGN | -+ +- | | ||
323 | | B2 | 178 | ² | SUPERSCRIPT TWO | 2 2^ s2 ^2 | | ||
324 | | B3 | 179 | ³ | SUPERSCRIPT THREE | 3 3^ s3 ^3 | | ||
325 | | B4 | 180 | ´ | ACUTE ACCENT | ' '' | | ||
326 | | B5 | 181 | µ | MICRO SIGN | u /u /U *m *M | | ||
327 | | B6 | 182 | ¶ | PILCROW SIGN | p! P! pg PG | | ||
328 | | B7 | 183 | · | MIDDLE DOT | . .^ .. | | ||
329 | | B8 | 184 | ¸ | CEDILLA | , ,, | | ||
330 | | B9 | 185 | ¹ | SUPERSCRIPT ONE | 1 1^ s1 ^1 | | ||
331 | | BA | 186 | º | MASCULINE ORDINAL INDICATOR | o_ s0 S0 | | ||
332 | | BB | 187 | » | RIGHT DOUBLE ANGLE QUOTES | >> | | ||
333 | | BC | 188 | ¼ | VULGAR FRACTION ONE QUARTER | 14 | | ||
334 | | BD | 189 | ½ | VULGAR FRACTION ONE HALF | 12 | | ||
335 | | BE | 190 | ¾ | VULGAR FRACTION THREE QUARTERS | 34 | | ||
336 | | BF | 191 | ¿ | INVERTED QUESTION MARK | ? ?? | | ||
337 | | C0 | 192 | À | CAPITAL A WITH GRAVE ACCENT | `A A` | | ||
338 | | C1 | 193 | Á | CAPITAL A WITH ACUTE ACCENT | 'A A' | | ||
339 | | C2 | 194 | Â | CAPITAL A WITH CIRCUMFLEX ACCENT| ^A A^ A> | | ||
340 | | C3 | 195 | Ã | CAPITAL A WITH TILDE | ~A A~ A- | | ||
341 | | C4 | 196 | Ä | CAPITAL A WITH DIAERESIS | "A A" | | ||
342 | | C5 | 197 | Å | CAPITAL A WITH RING ABOVE | oA Ao A* OA *A | | ||
343 | | C6 | 198 | Æ | CAPITAL LIGATURE AE | AE | | ||
344 | | C7 | 199 | Ç | CAPITAL C WITH CEDILLA | ,C C, | | ||
345 | | C8 | 200 | È | CAPITAL E WITH GRAVE ACCENT | `E E` | | ||
346 | | C9 | 201 | É | CAPITAL E WITH ACUTE ACCENT | 'E E' | | ||
347 | | CA | 202 | Ê | CAPITAL E WITH CIRCUMFLEX ACCENT| ^E E^ E> | | ||
348 | | CB | 203 | Ë | CAPITAL E WITH DIAERESIS | "E E" | | ||
349 | | CC | 204 | Ì | CAPITAL I WITH GRAVE ACCENT | `I I` | | ||
350 | | CD | 205 | Í | CAPITAL I WITH ACUTE ACCENT | 'I I' | | ||
351 | | CE | 206 | Î | CAPITAL I WITH CIRCUMFLEX ACCENT| ^I I^ I> | | ||
352 | | CF | 207 | Ï | CAPITAL I WITH DIAERESIS | "I I" | | ||
353 | | D0 | 208 | Ð | CAPITAL ETH | D- | | ||
354 | | D1 | 209 | Ñ | CAPITAL N WITH TILDE | ~N N~ N- | | ||
355 | | D2 | 210 | Ò | CAPITAL O WITH GRAVE ACCENT | `O O` | | ||
356 | | D3 | 211 | Ó | CAPITAL O WITH ACUTE ACCENT | 'O O' | | ||
357 | | D4 | 212 | Ô | CAPITAL O WITH CIRCUMFLEX ACCENT| ^O O^ O> | | ||
358 | | D5 | 213 | Õ | CAPITAL O WITH TILDE | ~O O~ O- | | ||
359 | | D6 | 214 | Ö | CAPITAL O WITH DIAERESIS | "O O" | | ||
360 | | D7 | 215 | × | MULTIPLICATION SIGN | x xx XX mu MU | | ||
361 | | D8 | 216 | Ø | CAPITAL O WITH STROKE | /O O/ | | ||
362 | | D9 | 217 | Ù | CAPITAL U WITH GRAVE ACCENT | `U U` | | ||
363 | | DA | 218 | Ú | CAPITAL U WITH ACUTE ACCENT | 'U U' | | ||
364 | | DB | 219 | Û | CAPITAL U WITH CIRCUMFLEX ACCENT| ^U U^ U> | | ||
365 | | DC | 220 | Ü | CAPITAL U WITH DIAERESIS | "U U" | | ||
366 | | DD | 221 | Ý | CAPITAL Y WITH ACUTE ACCENT | 'Y Y' | | ||
367 | | DE | 222 | Þ | CAPITAL THORN | P TH |P | | ||
368 | | DF | 223 | ß | SMALL SHARP S | ss | | ||
369 | | E0 | 224 | à | SMALL A WITH GRAVE ACCENT | `a a` | | ||
370 | | E1 | 225 | á | SMALL A WITH ACUTE ACCENT | 'a a' | | ||
371 | | E2 | 226 | â | SMALL A WITH CIRCUMFLEX ACCENT | ^a a^ a> | | ||
372 | | E3 | 227 | ã | SMALL A WITH TILDE | ~a a~ a- | | ||
373 | | E4 | 228 | ä | SMALL A WITH DIAERESIS | "a a" | | ||
374 | | E5 | 229 | å | SMALL A WITH RING ABOVE | oa ao Oa a* *a | | ||
375 | | E6 | 230 | æ | SMALL LIGATURE AE | ae | | ||
376 | | E7 | 231 | ç | SMALL C WITH CEDILLA | ,c c, | | ||
377 | | E8 | 232 | è | SMALL E WITH GRAVE ACCENT | `e e` | | ||
378 | | E9 | 233 | é | SMALL E WITH ACUTE ACCENT | 'e e' | | ||
379 | | EA | 234 | ê | SMALL E WITH CIRCUMFLEX ACCENT | ^e e^ e> | | ||
380 | | EB | 235 | ë | SMALL E WITH DIAERESIS | "e e" | | ||
381 | | EC | 236 | ì | SMALL I WITH GRAVE ACCENT | `i i` | | ||
382 | | ED | 237 | í | SMALL I WITH ACUTE ACCENT | 'i i' | | ||
383 | | EE | 238 | î | SMALL I WITH CIRCUMFLEX ACCENT | ^i i^ i> | | ||
384 | | EF | 239 | ï | SMALL I WITH DIAERESIS | "i i" | | ||
385 | | F0 | 240 | ð | SMALL ETH | d- | | ||
386 | | F1 | 241 | ñ | SMALL N WITH TILDE | ~n n~ n- | | ||
387 | | F2 | 242 | ò | SMALL O WITH GRAVE ACCENT | `o o` | | ||
388 | | F3 | 243 | ó | SMALL O WITH ACUTE ACCENT | 'o o' | | ||
389 | | F4 | 244 | ô | SMALL O WITH CIRCUMFLEX ACCENT | ^o o^ o> | | ||
390 | | F5 | 245 | õ | SMALL O WITH TILDE | ~o o~ o- | | ||
391 | | F6 | 246 | ö | SMALL O WITH DIAERESIS | "o o" | | ||
392 | | F7 | 247 | ÷ | DIVISION SIGN | -: :- | | ||
393 | | F8 | 248 | ø | SMALL O WITH OBLIQUE BAR | /o o/ | | ||
394 | | F9 | 249 | ù | SMALL U WITH GRAVE ACCENT | `u u` | | ||
395 | | FA | 250 | ú | SMALL U WITH ACUTE ACCENT | 'u u' | | ||
396 | | FB | 251 | û | SMALL U WITH CIRCUMFLEX ACCENT | ^u u^ u> | | ||
397 | | FC | 252 | ü | SMALL U WITH DIAERESIS | "u u" | | ||
398 | | FD | 253 | ý | SMALL Y WITH ACUTE ACCENT | 'y y' | | ||
399 | | FE | 254 | þ | SMALL THORN | p th |p | | ||
400 | | FF | 255 | ÿ | SMALL Y WITH DIAERESIS | "y y" | | ||
401 | +----+-----+---+---------------------------------+---------------------------+ | ||
402 | |||
403 | |||
404 | Deprecated | ||
405 | ---------- | ||
406 | |||
407 | XCursesProgramName is no longer used. To set the program name, you must | ||
408 | use Xinitscr(), or PDC_set_title() to set just the window title. | ||
409 | |||
410 | The XCursesExit() function is now called automatically via atexit(). | ||
411 | (Multiple calls to it are OK, so you don't need to remove it if you've | ||
412 | already added it for previous versions of PDCurses.) | ||
413 | |||
414 | XCURSES is no longer defined automatically, but need not be defined, | ||
415 | unless you want the X11-specific prototypes. (Normal curses programs | ||
416 | won't need it.) |
File dos/README added (mode: 100644) (index 00000000..569034bb) | |||
1 | PDCurses for DOS | ||
2 | ================ | ||
3 | |||
4 | This directory contains PDCurses source code files specific to DOS. | ||
5 | |||
6 | |||
7 | Building | ||
8 | -------- | ||
9 | |||
10 | . Choose the appropriate makefile for your compiler: | ||
11 | |||
12 | bccdos.mak - Borland C++ 3.0+ | ||
13 | gccdos.mak - DJGPP V2 | ||
14 | mscdos.mak - Microsoft C | ||
15 | wccdos16.mak - Watcom 10.6+ (16-bit) | ||
16 | wccdos4g.mak - Watcom 10.6+ (32-bit) | ||
17 | |||
18 | . For 16-bit compilers, you can change the memory MODEL in the makefile. | ||
19 | (Large model is the default, and recommended.) | ||
20 | |||
21 | . Optionally, you can build in a different directory than the platform | ||
22 | directory by setting PDCURSES_SRCDIR to point to the directory where | ||
23 | you unpacked PDCurses, and changing to your target directory: | ||
24 | |||
25 | set PDCURSES_SRCDIR=c:\pdcurses | ||
26 | |||
27 | . Build it: | ||
28 | |||
29 | make -f makefile | ||
30 | |||
31 | (For Watcom, use "wmake" instead of "make"; for MSVC, "nmake".) You'll | ||
32 | get the libraries (pdcurses.lib or .a, depending on your compiler; and | ||
33 | panel.lib or .a), the demos (*.exe), and a lot of object files. Note | ||
34 | that the panel library is just a copy of the main library, provided | ||
35 | for convenience; both panel and curses functions are in the main | ||
36 | library. | ||
37 | |||
38 | |||
39 | Distribution Status | ||
40 | ------------------- | ||
41 | |||
42 | The files in this directory are released to the Public Domain. | ||
43 | |||
44 | |||
45 | Acknowledgements | ||
46 | ---------------- | ||
47 | |||
48 | Watcom C port was provided by Pieter Kunst <kunst@prl.philips.nl> | ||
49 | DJGPP 1.x port was provided by David Nugent <davidn@csource.oz.au> |
File dos/bccdos.lrf added (mode: 100644) (index 00000000..9bd18c6b) | |||
1 | +addch.obj +addchstr.obj +addstr.obj +attr.obj +beep.obj +bkgd.obj & | ||
2 | +border.obj +clear.obj +color.obj +delch.obj +deleteln.obj +deprec.obj & | ||
3 | +getch.obj +getstr.obj +getyx.obj +inch.obj +inchstr.obj +initscr.obj & | ||
4 | +inopts.obj +insch.obj +insstr.obj +instr.obj +kernel.obj +keyname.obj & | ||
5 | +mouse.obj +move.obj +outopts.obj +overlay.obj +pad.obj +panel.obj & | ||
6 | +printw.obj +refresh.obj +scanw.obj +scr_dump.obj +scroll.obj +slk.obj & | ||
7 | +termattr.obj +terminfo.obj +touch.obj +util.obj +window.obj +debug.obj & | ||
8 | +pdcclip.obj +pdcdisp.obj +pdcgetsc.obj +pdckbd.obj +pdcscrn.obj & | ||
9 | +pdcsetsc.obj +pdcutil.obj ,lib.map |
File dos/bccdos.mak added (mode: 100644) (index 00000000..6361a4d8) | |||
1 | # Borland MAKE Makefile for PDCurses library - DOS BC++ 3.0+ | ||
2 | # | ||
3 | # Usage: make -f [path\]bccdos.mak [DEBUG=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | # Change the memory MODEL here, if desired | ||
9 | MODEL = l | ||
10 | |||
11 | O = obj | ||
12 | |||
13 | !ifndef PDCURSES_SRCDIR | ||
14 | PDCURSES_SRCDIR = .. | ||
15 | !endif | ||
16 | |||
17 | !include $(PDCURSES_SRCDIR)\version.mif | ||
18 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
19 | |||
20 | osdir = $(PDCURSES_SRCDIR)\dos | ||
21 | |||
22 | !ifdef DEBUG | ||
23 | CFLAGS = -N -v -y -DPDCDEBUG | ||
24 | !else | ||
25 | CFLAGS = -O | ||
26 | !endif | ||
27 | |||
28 | CPPFLAGS = -I$(PDCURSES_SRCDIR) | ||
29 | |||
30 | BUILD = $(CC) -1- -K -G -rd -d -w-eff -w-par -c \ | ||
31 | -m$(MODEL) $(CFLAGS) $(CPPFLAGS) | ||
32 | |||
33 | LIBEXE = tlib /C /E | ||
34 | |||
35 | LIBCURSES = pdcurses.lib | ||
36 | |||
37 | all: $(LIBCURSES) $(DEMOS) | ||
38 | |||
39 | clean: | ||
40 | -del *.obj | ||
41 | -del *.lib | ||
42 | -del *.map | ||
43 | -del *.exe | ||
44 | |||
45 | demos: $(DEMOS) | ||
46 | |||
47 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
48 | -del $@ | ||
49 | $(LIBEXE) $@ @$(osdir)\bccdos.lrf | ||
50 | -copy $(LIBCURSES) panel.lib | ||
51 | |||
52 | .autodepend | ||
53 | |||
54 | {$(srcdir)\}.c.obj: | ||
55 | $(BUILD) $< | ||
56 | |||
57 | {$(osdir)\}.c.obj: | ||
58 | $(BUILD) $< | ||
59 | |||
60 | {$(demodir)\}.c.obj: | ||
61 | $(BUILD) $< | ||
62 | |||
63 | .c.obj: | ||
64 | $(BUILD) $< | ||
65 | |||
66 | .obj.exe: | ||
67 | $(CC) -m$(MODEL) -e$@ $** $(LIBCURSES) | ||
68 | |||
69 | tuidemo.exe: tuidemo.obj tui.obj $(LIBCURSES) | ||
70 | $(CC) -m$(MODEL) -e$@ $** | ||
71 | |||
72 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h $(PDCURSES_CURSES_H) | ||
73 | $(BUILD) -I$(demodir) $(demodir)\tui.c | ||
74 | |||
75 | tuidemo.obj: $(demodir)\tuidemo.c $(PDCURSES_CURSES_H) | ||
76 | $(BUILD) -I$(demodir) $(demodir)\tuidemo.c | ||
77 | |||
78 | PLATFORM1 = Borland C++ 3.1 | ||
79 | PLATFORM2 = Borland C/C++ 3.1 for DOS | ||
80 | ARCNAME = pdc$(VER)bcc | ||
81 | |||
82 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File dos/gccdos.mak added (mode: 100644) (index 00000000..26a4ed3d) | |||
1 | # GNU MAKE (3.79.1) Makefile for PDCurses library - DOS DJGPP V2.0+ | ||
2 | # | ||
3 | # Usage: make -f [path\]gccdos.mak [DEBUG=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|libs|demos|dist|pdcurses.a|testcurs.exe...] | ||
7 | |||
8 | O = o | ||
9 | |||
10 | ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | endif | ||
13 | |||
14 | include $(PDCURSES_SRCDIR)/version.mif | ||
15 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)/dos | ||
18 | |||
19 | PDCURSES_DOS_H = $(osdir)/pdcdos.h | ||
20 | |||
21 | CC = gcc | ||
22 | |||
23 | ifeq ($(DEBUG),Y) | ||
24 | CFLAGS = -g -Wall -DPDCDEBUG | ||
25 | LDFLAGS = -g | ||
26 | else | ||
27 | CFLAGS = -O2 -Wall | ||
28 | LDFLAGS = | ||
29 | endif | ||
30 | |||
31 | CFLAGS += -I$(PDCURSES_SRCDIR) | ||
32 | |||
33 | LINK = gcc | ||
34 | |||
35 | LIBEXE = ar | ||
36 | LIBFLAGS = rcv | ||
37 | |||
38 | LIBCURSES = pdcurses.a | ||
39 | |||
40 | .PHONY: all libs clean demos dist | ||
41 | |||
42 | all: libs demos | ||
43 | |||
44 | libs: $(LIBCURSES) | ||
45 | |||
46 | clean: | ||
47 | -del *.o | ||
48 | -del *.a | ||
49 | -del *.exe | ||
50 | |||
51 | demos: $(DEMOS) | ||
52 | strip *.exe | ||
53 | |||
54 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
55 | $(LIBEXE) $(LIBFLAGS) $@ $? | ||
56 | -copy $(LIBCURSES) panel.a | ||
57 | |||
58 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
59 | $(PDCOBJS) : $(PDCURSES_DOS_H) | ||
60 | $(DEMOS) : $(PDCURSES_CURSES_H) $(LIBCURSES) | ||
61 | panel.o : $(PANEL_HEADER) | ||
62 | terminfo.o: $(TERM_HEADER) | ||
63 | |||
64 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
65 | $(CC) -c $(CFLAGS) $< | ||
66 | |||
67 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
68 | $(CC) -c $(CFLAGS) $< | ||
69 | |||
70 | firework.exe newdemo.exe rain.exe testcurs.exe worm.exe xmas.exe \ | ||
71 | ptest.exe: %.exe: $(demodir)/%.c | ||
72 | $(CC) $(CFLAGS) -o$@ $< $(LIBCURSES) | ||
73 | |||
74 | tuidemo.exe: tuidemo.o tui.o | ||
75 | $(LINK) $(LDFLAGS) -o$@ tuidemo.o tui.o $(LIBCURSES) | ||
76 | |||
77 | tui.o: $(demodir)/tui.c $(demodir)/tui.h $(PDCURSES_CURSES_H) | ||
78 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
79 | |||
80 | tuidemo.o: $(demodir)/tuidemo.c $(PDCURSES_CURSES_H) | ||
81 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
82 | |||
83 | PLATFORM1 = DJGPP 2.03 | ||
84 | PLATFORM2 = DJGPP 2.03 for DOS | ||
85 | ARCNAME = pdc$(VER)djg | ||
86 | |||
87 | include $(PDCURSES_SRCDIR)/makedist.mif |
File dos/mscdos.lrf added (mode: 100644) (index 00000000..b1fdf37e) | |||
1 | -+addch.obj & | ||
2 | -+addchstr.obj & | ||
3 | -+addstr.obj & | ||
4 | -+attr.obj & | ||
5 | -+beep.obj & | ||
6 | -+bkgd.obj & | ||
7 | -+border.obj & | ||
8 | -+clear.obj & | ||
9 | -+color.obj & | ||
10 | -+delch.obj & | ||
11 | -+deleteln.obj & | ||
12 | -+deprec.obj & | ||
13 | -+getch.obj & | ||
14 | -+getstr.obj & | ||
15 | -+getyx.obj & | ||
16 | -+inch.obj & | ||
17 | -+inchstr.obj & | ||
18 | -+initscr.obj & | ||
19 | -+inopts.obj & | ||
20 | -+insch.obj & | ||
21 | -+insstr.obj & | ||
22 | -+instr.obj & | ||
23 | -+kernel.obj & | ||
24 | -+keyname.obj & | ||
25 | -+mouse.obj & | ||
26 | -+move.obj & | ||
27 | -+outopts.obj & | ||
28 | -+overlay.obj & | ||
29 | -+pad.obj & | ||
30 | -+panel.obj & | ||
31 | -+printw.obj & | ||
32 | -+refresh.obj & | ||
33 | -+scanw.obj & | ||
34 | -+scr_dump.obj & | ||
35 | -+scroll.obj & | ||
36 | -+slk.obj & | ||
37 | -+termattr.obj & | ||
38 | -+terminfo.obj & | ||
39 | -+touch.obj & | ||
40 | -+util.obj & | ||
41 | -+window.obj & | ||
42 | -+debug.obj & | ||
43 | -+pdcclip.obj & | ||
44 | -+pdcdisp.obj & | ||
45 | -+pdcgetsc.obj & | ||
46 | -+pdckbd.obj & | ||
47 | -+pdcscrn.obj & | ||
48 | -+pdcsetsc.obj & | ||
49 | -+pdcutil.obj & | ||
50 | ,lib.map; |
File dos/mscdos.mak added (mode: 100644) (index 00000000..7aa6c5f7) | |||
1 | # NMAKE Makefile for PDCurses library - Microsoft C for DOS | ||
2 | # | ||
3 | # Usage: nmake -f [path\]dosmsc.mak [DEBUG=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | # Change the memory MODEL here, if desired | ||
9 | MODEL = L # one of L, S, M, T, H, C | ||
10 | SIZE = LARGE # one of LARGE, SMALL, MEDIUM, TINY, HUGE, COMPACT | ||
11 | |||
12 | O = obj | ||
13 | |||
14 | !ifndef PDCURSES_SRCDIR | ||
15 | PDCURSES_SRCDIR = .. | ||
16 | !endif | ||
17 | |||
18 | !include $(PDCURSES_SRCDIR)\version.mif | ||
19 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
20 | |||
21 | osdir = $(PDCURSES_SRCDIR)\dos | ||
22 | |||
23 | PDCURSES_DOS_H = $(osdir)\pdcdos.h | ||
24 | |||
25 | CC = cl | ||
26 | |||
27 | !ifdef DEBUG | ||
28 | CFLAGS = /Od /Zi /DPDCDEBUG | ||
29 | LDFLAGS = /CO /NOE /SE:160 | ||
30 | !else | ||
31 | CFLAGS = /Ox | ||
32 | LDFLAGS = /NOE /SE:160 | ||
33 | !endif | ||
34 | |||
35 | CPPFLAGS = -I$(PDCURSES_SRCDIR) | ||
36 | |||
37 | BUILD = $(CC) /J /nologo /c /D$(SIZE) /A$(MODEL) $(CFLAGS) $(CPPFLAGS) | ||
38 | |||
39 | LINK = link | ||
40 | |||
41 | CCLIBS = | ||
42 | |||
43 | LIBEXE = lib | ||
44 | |||
45 | LIBCURSES = pdcurses.lib | ||
46 | |||
47 | all: $(LIBCURSES) $(DEMOS) | ||
48 | |||
49 | clean: | ||
50 | -del *.obj | ||
51 | -del *.lib | ||
52 | -del *.exe | ||
53 | |||
54 | demos: $(DEMOS) | ||
55 | |||
56 | DEMOOBJS = $(DEMOS:.exe=.obj) tui.obj | ||
57 | |||
58 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
59 | $(DEMOOBJS) : $(PDCURSES_CURSES_H) | ||
60 | $(DEMOS) : $(LIBCURSES) | ||
61 | panel.obj : $(PANEL_HEADER) | ||
62 | terminfo.obj: $(TERM_HEADER) | ||
63 | |||
64 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
65 | $(LIBEXE) $@ @$(osdir)\mscdos.lrf | ||
66 | -copy $(LIBCURSES) panel.lib | ||
67 | |||
68 | {$(srcdir)\}.c{}.obj: | ||
69 | $(BUILD) $< | ||
70 | |||
71 | {$(osdir)\}.c{}.obj: | ||
72 | $(BUILD) $< | ||
73 | |||
74 | {$(demodir)\}.c{}.obj: | ||
75 | $(BUILD) $< | ||
76 | |||
77 | firework.exe: firework.obj | ||
78 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
79 | |||
80 | newdemo.exe: newdemo.obj | ||
81 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
82 | |||
83 | ptest.exe: ptest.obj | ||
84 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
85 | |||
86 | rain.exe: rain.obj | ||
87 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
88 | |||
89 | testcurs.exe: testcurs.obj | ||
90 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
91 | |||
92 | tuidemo.exe: tuidemo.obj tui.obj | ||
93 | $(LINK) $(LDFLAGS) $*.obj+tui.obj,$*,,$(LIBCURSES); | ||
94 | |||
95 | worm.exe: worm.obj | ||
96 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
97 | |||
98 | xmas.exe: xmas.obj | ||
99 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
100 | |||
101 | ptest.obj: $(demodir)\ptest.c $(PANEL_HEADER) | ||
102 | $(BUILD) $(demodir)\ptest.c | ||
103 | |||
104 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h | ||
105 | $(BUILD) -I$(demodir) $(demodir)\tui.c | ||
106 | |||
107 | tuidemo.obj: $(demodir)\tuidemo.c | ||
108 | $(BUILD) -I$(demodir) $(demodir)\tuidemo.c | ||
109 | |||
110 | PLATFORM1 = Microsoft C | ||
111 | PLATFORM2 = Microsoft C for DOS | ||
112 | ARCNAME = pdc$(VER)msc | ||
113 | |||
114 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File dos/pdcclip.c added (mode: 100644) (index 00000000..74607aa0) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcclip.c,v 1.33 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | |||
9 | /*man-start************************************************************** | ||
10 | |||
11 | Name: clipboard | ||
12 | |||
13 | Synopsis: | ||
14 | int PDC_getclipboard(char **contents, long *length); | ||
15 | int PDC_setclipboard(const char *contents, long length); | ||
16 | int PDC_freeclipboard(char *contents); | ||
17 | int PDC_clearclipboard(void); | ||
18 | |||
19 | Description: | ||
20 | PDC_getclipboard() gets the textual contents of the system's | ||
21 | clipboard. This function returns the contents of the clipboard | ||
22 | in the contents argument. It is the responsibilitiy of the | ||
23 | caller to free the memory returned, via PDC_freeclipboard(). | ||
24 | The length of the clipboard contents is returned in the length | ||
25 | argument. | ||
26 | |||
27 | PDC_setclipboard copies the supplied text into the system's | ||
28 | clipboard, emptying the clipboard prior to the copy. | ||
29 | |||
30 | PDC_clearclipboard() clears the internal clipboard. | ||
31 | |||
32 | Return Values: | ||
33 | indicator of success/failure of call. | ||
34 | PDC_CLIP_SUCCESS the call was successful | ||
35 | PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for | ||
36 | the clipboard contents | ||
37 | PDC_CLIP_EMPTY the clipboard contains no text | ||
38 | PDC_CLIP_ACCESS_ERROR no clipboard support | ||
39 | |||
40 | Portability X/Open BSD SYS V | ||
41 | PDC_getclipboard - - - | ||
42 | PDC_setclipboard - - - | ||
43 | PDC_freeclipboard - - - | ||
44 | PDC_clearclipboard - - - | ||
45 | |||
46 | **man-end****************************************************************/ | ||
47 | |||
48 | /* global clipboard contents, should be NULL if none set */ | ||
49 | |||
50 | static char *pdc_DOS_clipboard = NULL; | ||
51 | |||
52 | int PDC_getclipboard(char **contents, long *length) | ||
53 | { | ||
54 | int len; | ||
55 | |||
56 | PDC_LOG(("PDC_getclipboard() - called\n")); | ||
57 | |||
58 | if (!pdc_DOS_clipboard) | ||
59 | return PDC_CLIP_EMPTY; | ||
60 | |||
61 | len = strlen(pdc_DOS_clipboard); | ||
62 | if ((*contents = malloc(len + 1)) == NULL) | ||
63 | return PDC_CLIP_MEMORY_ERROR; | ||
64 | |||
65 | strcpy(*contents, pdc_DOS_clipboard); | ||
66 | *length = len; | ||
67 | |||
68 | return PDC_CLIP_SUCCESS; | ||
69 | } | ||
70 | |||
71 | int PDC_setclipboard(const char *contents, long length) | ||
72 | { | ||
73 | PDC_LOG(("PDC_setclipboard() - called\n")); | ||
74 | |||
75 | if (pdc_DOS_clipboard) | ||
76 | { | ||
77 | free(pdc_DOS_clipboard); | ||
78 | pdc_DOS_clipboard = NULL; | ||
79 | } | ||
80 | |||
81 | if (contents) | ||
82 | { | ||
83 | if ((pdc_DOS_clipboard = malloc(length + 1)) == NULL) | ||
84 | return PDC_CLIP_MEMORY_ERROR; | ||
85 | |||
86 | strcpy(pdc_DOS_clipboard, contents); | ||
87 | } | ||
88 | |||
89 | return PDC_CLIP_SUCCESS; | ||
90 | } | ||
91 | |||
92 | int PDC_freeclipboard(char *contents) | ||
93 | { | ||
94 | PDC_LOG(("PDC_freeclipboard() - called\n")); | ||
95 | |||
96 | /* should we also free empty the system clipboard? probably not */ | ||
97 | |||
98 | if (contents) | ||
99 | { | ||
100 | |||
101 | /* NOTE: We free the memory, but we can not set caller's pointer | ||
102 | to NULL, so if caller calls again then will try to access | ||
103 | free'd memory. We 1st overwrite memory with a string so if | ||
104 | caller tries to use free memory they won't get what they | ||
105 | expect & hopefully notice. */ | ||
106 | |||
107 | /* memset(contents, 0xFD, strlen(contents)); */ | ||
108 | |||
109 | if (strlen(contents) >= strlen("PDCURSES")) | ||
110 | strcpy(contents, "PDCURSES"); | ||
111 | |||
112 | free(contents); | ||
113 | } | ||
114 | |||
115 | return PDC_CLIP_SUCCESS; | ||
116 | } | ||
117 | |||
118 | int PDC_clearclipboard(void) | ||
119 | { | ||
120 | PDC_LOG(("PDC_clearclipboard() - called\n")); | ||
121 | |||
122 | if (pdc_DOS_clipboard) | ||
123 | { | ||
124 | free(pdc_DOS_clipboard); | ||
125 | pdc_DOS_clipboard = NULL; | ||
126 | } | ||
127 | |||
128 | return PDC_CLIP_SUCCESS; | ||
129 | } |
File dos/pdcdisp.c added (mode: 100644) (index 00000000..aae9bfb5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcdisp.c,v 1.65 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /* ACS definitions originally by jshumate@wrdis01.robins.af.mil -- these | ||
8 | match code page 437 and compatible pages (CP850, CP852, etc.) */ | ||
9 | |||
10 | #ifdef CHTYPE_LONG | ||
11 | |||
12 | # define A(x) ((chtype)x | A_ALTCHARSET) | ||
13 | |||
14 | chtype acs_map[128] = | ||
15 | { | ||
16 | A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10), | ||
17 | A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19), | ||
18 | A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), A(28), | ||
19 | A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', '\'', '(', | ||
20 | ')', '*', | ||
21 | |||
22 | A(0x1a), A(0x1b), A(0x18), A(0x19), | ||
23 | |||
24 | '/', | ||
25 | |||
26 | 0xdb, | ||
27 | |||
28 | '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', | ||
29 | '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | ||
30 | 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | ||
31 | 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', | ||
32 | |||
33 | A(0x04), 0xb1, | ||
34 | |||
35 | 'b', 'c', 'd', 'e', | ||
36 | |||
37 | 0xf8, 0xf1, 0xb0, A(0x0f), 0xd9, 0xbf, 0xda, 0xc0, 0xc5, 0x2d, 0x2d, | ||
38 | 0xc4, 0x2d, 0x5f, 0xc3, 0xb4, 0xc1, 0xc2, 0xb3, 0xf3, 0xf2, 0xe3, | ||
39 | 0xd8, 0x9c, 0xf9, | ||
40 | |||
41 | A(127) | ||
42 | }; | ||
43 | |||
44 | # undef A | ||
45 | |||
46 | #endif | ||
47 | |||
48 | #ifdef __PACIFIC__ | ||
49 | void movedata(unsigned sseg, unsigned soff, unsigned dseg, | ||
50 | unsigned doff, unsigned n) | ||
51 | { | ||
52 | far char *src = MK_FP(sseg, soff); | ||
53 | far char *dst = MK_FP(dseg, doff); | ||
54 | |||
55 | while (n--) | ||
56 | *dst++ = *src++; | ||
57 | } | ||
58 | #endif | ||
59 | |||
60 | /* position hardware cursor at (y, x) */ | ||
61 | |||
62 | void PDC_gotoyx(int row, int col) | ||
63 | { | ||
64 | PDCREGS regs; | ||
65 | |||
66 | PDC_LOG(("PDC_gotoyx() - called: row %d col %d\n", row, col)); | ||
67 | |||
68 | regs.h.ah = 0x02; | ||
69 | regs.h.bh = 0; | ||
70 | regs.h.dh = (unsigned char) row; | ||
71 | regs.h.dl = (unsigned char) col; | ||
72 | PDCINT(0x10, regs); | ||
73 | } | ||
74 | |||
75 | /* update the given physical line to look like the corresponding line in | ||
76 | curscr */ | ||
77 | |||
78 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp) | ||
79 | { | ||
80 | int j; | ||
81 | |||
82 | PDC_LOG(("PDC_transform_line() - called: line %d\n", lineno)); | ||
83 | |||
84 | if (pdc_direct_video) | ||
85 | { | ||
86 | #if SMALL || MEDIUM | ||
87 | # ifndef __PACIFIC__ | ||
88 | struct SREGS segregs; | ||
89 | # endif | ||
90 | int ds; | ||
91 | #endif | ||
92 | /* this should be enough for the maximum width of a screen */ | ||
93 | |||
94 | struct {unsigned char text, attr;} temp_line[256]; | ||
95 | |||
96 | /* replace the attribute part of the chtype with the actual | ||
97 | color value for each chtype in the line */ | ||
98 | |||
99 | for (j = 0; j < len; j++) | ||
100 | { | ||
101 | chtype ch = srcp[j]; | ||
102 | |||
103 | temp_line[j].attr = pdc_atrtab[ch >> PDC_ATTR_SHIFT]; | ||
104 | #ifdef CHTYPE_LONG | ||
105 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
106 | ch = acs_map[ch & 0x7f]; | ||
107 | #endif | ||
108 | temp_line[j].text = ch & 0xff; | ||
109 | } | ||
110 | |||
111 | #ifdef __DJGPP__ | ||
112 | dosmemput(temp_line, len * 2, | ||
113 | (unsigned long)_FAR_POINTER(pdc_video_seg, | ||
114 | pdc_video_ofs + (lineno * curscr->_maxx + x) * 2)); | ||
115 | #else | ||
116 | # if SMALL || MEDIUM | ||
117 | # ifdef __PACIFIC__ | ||
118 | ds = FP_SEG((void far *) temp_line); | ||
119 | # else | ||
120 | segread(&segregs); | ||
121 | ds = segregs.ds; | ||
122 | # endif | ||
123 | movedata(ds, (int)temp_line, pdc_video_seg, | ||
124 | pdc_video_ofs + (lineno * curscr->_maxx + x) * 2, len * 2); | ||
125 | # else | ||
126 | memcpy((void *)_FAR_POINTER(pdc_video_seg, | ||
127 | pdc_video_ofs + (lineno * curscr->_maxx + x) * 2), | ||
128 | temp_line, len * 2); | ||
129 | # endif | ||
130 | #endif | ||
131 | |||
132 | } | ||
133 | else | ||
134 | for (j = 0; j < len;) | ||
135 | { | ||
136 | PDCREGS regs; | ||
137 | unsigned short count = 1; | ||
138 | chtype ch = srcp[j]; | ||
139 | |||
140 | while ((j + count < len) && (ch == srcp[j + count])) | ||
141 | count++; | ||
142 | |||
143 | PDC_gotoyx(lineno, j + x); | ||
144 | |||
145 | regs.h.ah = 0x09; | ||
146 | regs.W.bx = pdc_atrtab[ch >> PDC_ATTR_SHIFT]; | ||
147 | regs.W.cx = count; | ||
148 | #ifdef CHTYPE_LONG | ||
149 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
150 | ch = acs_map[ch & 0x7f]; | ||
151 | #endif | ||
152 | regs.h.al = (unsigned char) (ch & 0xff); | ||
153 | |||
154 | PDCINT(0x10, regs); | ||
155 | |||
156 | j += count; | ||
157 | } | ||
158 | } |
File dos/pdcdos.h added (mode: 100644) (index 00000000..436699de) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: pdcdos.h,v 1.30 2008/07/13 16:08:17 wmcbrine Exp $ */ | ||
4 | |||
5 | #include <curspriv.h> | ||
6 | #include <string.h> | ||
7 | |||
8 | #if defined(_MSC_VER) || defined(_QC) | ||
9 | # define MSC 1 | ||
10 | #endif | ||
11 | |||
12 | #if defined(__PACIFIC__) && !defined(__SMALL__) | ||
13 | # define __SMALL__ | ||
14 | #endif | ||
15 | |||
16 | #if defined(__HIGHC__) || MSC | ||
17 | # include <bios.h> | ||
18 | #endif | ||
19 | |||
20 | /*---------------------------------------------------------------------- | ||
21 | * MEMORY MODEL SUPPORT: | ||
22 | * | ||
23 | * MODELS | ||
24 | * TINY cs,ds,ss all in 1 segment (not enough memory!) | ||
25 | * SMALL cs:1 segment, ds:1 segment | ||
26 | * MEDIUM cs:many segments, ds:1 segment | ||
27 | * COMPACT cs:1 segment, ds:many segments | ||
28 | * LARGE cs:many segments, ds:many segments | ||
29 | * HUGE cs:many segments, ds:segments > 64K | ||
30 | */ | ||
31 | |||
32 | #ifdef __TINY__ | ||
33 | # define SMALL 1 | ||
34 | #endif | ||
35 | #ifdef __SMALL__ | ||
36 | # define SMALL 1 | ||
37 | #endif | ||
38 | #ifdef __MEDIUM__ | ||
39 | # define MEDIUM 1 | ||
40 | #endif | ||
41 | #ifdef __COMPACT__ | ||
42 | # define COMPACT 1 | ||
43 | #endif | ||
44 | #ifdef __LARGE__ | ||
45 | # define LARGE 1 | ||
46 | #endif | ||
47 | #ifdef __HUGE__ | ||
48 | # define HUGE 1 | ||
49 | #endif | ||
50 | |||
51 | #include <dos.h> | ||
52 | |||
53 | extern unsigned char *pdc_atrtab; | ||
54 | extern int pdc_adapter; | ||
55 | extern int pdc_scrnmode; | ||
56 | extern int pdc_font; | ||
57 | extern bool pdc_direct_video; | ||
58 | extern bool pdc_bogus_adapter; | ||
59 | extern unsigned pdc_video_seg; | ||
60 | extern unsigned pdc_video_ofs; | ||
61 | |||
62 | #ifdef __DJGPP__ /* Note: works only in plain DOS... */ | ||
63 | # if DJGPP == 2 | ||
64 | # define _FAR_POINTER(s,o) ((((int)(s)) << 4) + ((int)(o))) | ||
65 | # else | ||
66 | # define _FAR_POINTER(s,o) (0xe0000000 + (((int)(s)) << 4) + ((int)(o))) | ||
67 | # endif | ||
68 | # define _FP_SEGMENT(p) (unsigned short)((((long)p) >> 4) & 0xffff) | ||
69 | #else | ||
70 | # ifdef __TURBOC__ | ||
71 | # define _FAR_POINTER(s,o) MK_FP(s,o) | ||
72 | # else | ||
73 | # if defined(__WATCOMC__) && defined(__FLAT__) | ||
74 | # define _FAR_POINTER(s,o) ((((int)(s)) << 4) + ((int)(o))) | ||
75 | # else | ||
76 | # define _FAR_POINTER(s,o) (((long)s << 16) | (long)o) | ||
77 | # endif | ||
78 | # endif | ||
79 | # define _FP_SEGMENT(p) (unsigned short)(((long)p) >> 4) | ||
80 | #endif | ||
81 | #define _FP_OFFSET(p) ((unsigned short)p & 0x000f) | ||
82 | |||
83 | #ifdef __DJGPP__ | ||
84 | # include <sys/movedata.h> | ||
85 | unsigned char getdosmembyte(int offs); | ||
86 | unsigned short getdosmemword(int offs); | ||
87 | unsigned long getdosmemdword(int offs); | ||
88 | void setdosmembyte(int offs, unsigned char b); | ||
89 | void setdosmemword(int offs, unsigned short w); | ||
90 | #else | ||
91 | # if SMALL || MEDIUM || MSC | ||
92 | # define PDC_FAR far | ||
93 | # else | ||
94 | # define PDC_FAR | ||
95 | # endif | ||
96 | # define getdosmembyte(offs) \ | ||
97 | (*((unsigned char PDC_FAR *) _FAR_POINTER(0,offs))) | ||
98 | # define getdosmemword(offs) \ | ||
99 | (*((unsigned short PDC_FAR *) _FAR_POINTER(0,offs))) | ||
100 | # define getdosmemdword(offs) \ | ||
101 | (*((unsigned long PDC_FAR *) _FAR_POINTER(0,offs))) | ||
102 | # define setdosmembyte(offs,x) \ | ||
103 | (*((unsigned char PDC_FAR *) _FAR_POINTER(0,offs)) = (x)) | ||
104 | # define setdosmemword(offs,x) \ | ||
105 | (*((unsigned short PDC_FAR *) _FAR_POINTER(0,offs)) = (x)) | ||
106 | #endif | ||
107 | |||
108 | #if defined(__WATCOMC__) && defined(__386__) | ||
109 | |||
110 | typedef union | ||
111 | { | ||
112 | struct | ||
113 | { | ||
114 | unsigned long edi, esi, ebp, res, ebx, edx, ecx, eax; | ||
115 | } d; | ||
116 | |||
117 | struct | ||
118 | { | ||
119 | unsigned short di, di_hi, si, si_hi, bp, bp_hi, res, res_hi, | ||
120 | bx, bx_hi, dx, dx_hi, cx, cx_hi, ax, ax_hi, | ||
121 | flags, es, ds, fs, gs, ip, cs, sp, ss; | ||
122 | } w; | ||
123 | |||
124 | struct | ||
125 | { | ||
126 | unsigned char edi[4], esi[4], ebp[4], res[4], | ||
127 | bl, bh, ebx_b2, ebx_b3, dl, dh, edx_b2, edx_b3, | ||
128 | cl, ch, ecx_b2, ecx_b3, al, ah, eax_b2, eax_b3; | ||
129 | } h; | ||
130 | } pdc_dpmi_regs; | ||
131 | |||
132 | void PDC_dpmi_int(int, pdc_dpmi_regs *); | ||
133 | |||
134 | #endif | ||
135 | |||
136 | #ifdef __DJGPP__ | ||
137 | # include <dpmi.h> | ||
138 | # define PDCREGS __dpmi_regs | ||
139 | # define PDCINT(vector, regs) __dpmi_int(vector, ®s) | ||
140 | #else | ||
141 | # ifdef __WATCOMC__ | ||
142 | # ifdef __386__ | ||
143 | # define PDCREGS pdc_dpmi_regs | ||
144 | # define PDCINT(vector, regs) PDC_dpmi_int(vector, ®s) | ||
145 | # else | ||
146 | # define PDCREGS union REGPACK | ||
147 | # define PDCINT(vector, regs) intr(vector, ®s) | ||
148 | # endif | ||
149 | # else | ||
150 | # define PDCREGS union REGS | ||
151 | # define PDCINT(vector, regs) int86(vector, ®s, ®s) | ||
152 | # endif | ||
153 | #endif | ||
154 | |||
155 | /* Wide registers in REGS: w or x? */ | ||
156 | |||
157 | #ifdef __WATCOMC__ | ||
158 | # define W w | ||
159 | #else | ||
160 | # define W x | ||
161 | #endif | ||
162 | |||
163 | /* Monitor (terminal) type information */ | ||
164 | |||
165 | enum | ||
166 | { | ||
167 | _NONE, _MDA, _CGA, | ||
168 | _EGACOLOR = 0x04, _EGAMONO, | ||
169 | _VGACOLOR = 0x07, _VGAMONO, | ||
170 | _MCGACOLOR = 0x0a, _MCGAMONO, | ||
171 | _MDS_GENIUS = 0x30 | ||
172 | }; | ||
173 | |||
174 | /* Text-mode font size information */ | ||
175 | |||
176 | enum | ||
177 | { | ||
178 | _FONT8 = 8, | ||
179 | _FONT14 = 14, | ||
180 | _FONT15, /* GENIUS */ | ||
181 | _FONT16 | ||
182 | }; | ||
183 | |||
184 | #ifdef __PACIFIC__ | ||
185 | void movedata(unsigned, unsigned, unsigned, unsigned, unsigned); | ||
186 | #endif |
File dos/pdcgetsc.c added (mode: 100644) (index 00000000..290db5a3) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcgetsc.c,v 1.42 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | |||
9 | /* return width of screen/viewport */ | ||
10 | |||
11 | int PDC_get_columns(void) | ||
12 | { | ||
13 | PDCREGS regs; | ||
14 | int cols; | ||
15 | const char *env_cols; | ||
16 | |||
17 | PDC_LOG(("PDC_get_columns() - called\n")); | ||
18 | |||
19 | /* use the value from COLS environment variable, if set. MH 10-Jun-92 */ | ||
20 | /* and use the minimum of COLS and return from int10h MH 18-Jun-92 */ | ||
21 | |||
22 | regs.h.ah = 0x0f; | ||
23 | PDCINT(0x10, regs); | ||
24 | cols = (int)regs.h.ah; | ||
25 | |||
26 | env_cols = getenv("COLS"); | ||
27 | |||
28 | if (env_cols) | ||
29 | cols = min(atoi(env_cols), cols); | ||
30 | |||
31 | PDC_LOG(("PDC_get_columns() - returned: cols %d\n", cols)); | ||
32 | |||
33 | return cols; | ||
34 | } | ||
35 | |||
36 | /* get the cursor size/shape */ | ||
37 | |||
38 | int PDC_get_cursor_mode(void) | ||
39 | { | ||
40 | PDC_LOG(("PDC_get_cursor_mode() - called\n")); | ||
41 | |||
42 | return getdosmemword(0x460); | ||
43 | } | ||
44 | |||
45 | /* return number of screen rows */ | ||
46 | |||
47 | int PDC_get_rows(void) | ||
48 | { | ||
49 | const char *env_rows; | ||
50 | int rows; | ||
51 | |||
52 | PDC_LOG(("PDC_get_rows() - called\n")); | ||
53 | |||
54 | /* use the value from LINES environment variable, if set. MH 10-Jun-92 */ | ||
55 | /* and use the minimum of LINES and *ROWS. MH 18-Jun-92 */ | ||
56 | |||
57 | rows = getdosmembyte(0x484) + 1; | ||
58 | env_rows = getenv("LINES"); | ||
59 | |||
60 | if (env_rows) | ||
61 | rows = min(atoi(env_rows), rows); | ||
62 | |||
63 | if (rows == 1 && pdc_adapter == _MDS_GENIUS) | ||
64 | rows = 66; | ||
65 | if (rows == 1 && pdc_adapter == _MDA) | ||
66 | rows = 25; | ||
67 | |||
68 | if (rows == 1) | ||
69 | { | ||
70 | rows = 25; | ||
71 | pdc_direct_video = FALSE; | ||
72 | } | ||
73 | |||
74 | switch (pdc_adapter) | ||
75 | { | ||
76 | case _EGACOLOR: | ||
77 | case _EGAMONO: | ||
78 | switch (rows) | ||
79 | { | ||
80 | case 25: | ||
81 | case 43: | ||
82 | break; | ||
83 | default: | ||
84 | rows = 25; | ||
85 | } | ||
86 | break; | ||
87 | |||
88 | case _VGACOLOR: | ||
89 | case _VGAMONO: | ||
90 | break; | ||
91 | |||
92 | default: | ||
93 | rows = 25; | ||
94 | break; | ||
95 | } | ||
96 | |||
97 | PDC_LOG(("PDC_get_rows() - returned: rows %d\n", rows)); | ||
98 | |||
99 | return rows; | ||
100 | } |
File dos/pdckbd.c added (mode: 100644) (index 00000000..652cb0cb) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* MS C doesn't return flags from int86() */ | ||
4 | #ifdef MSC | ||
5 | # define USE_KBHIT | ||
6 | #endif | ||
7 | |||
8 | #ifdef USE_KBHIT | ||
9 | # include <conio.h> | ||
10 | #endif | ||
11 | |||
12 | #include "pdcdos.h" | ||
13 | |||
14 | RCSID("$Id: pdckbd.c,v 1.87 2008/07/13 16:08:17 wmcbrine Exp $") | ||
15 | |||
16 | /*man-start************************************************************** | ||
17 | |||
18 | Name: pdckbd | ||
19 | |||
20 | Synopsis: | ||
21 | unsigned long PDC_get_input_fd(void); | ||
22 | |||
23 | Description: | ||
24 | PDC_get_input_fd() returns the file descriptor that PDCurses | ||
25 | reads its input from. It can be used for select(). | ||
26 | |||
27 | Portability X/Open BSD SYS V | ||
28 | PDC_get_input_fd - - - | ||
29 | |||
30 | **man-end****************************************************************/ | ||
31 | |||
32 | #ifdef __DJGPP__ | ||
33 | # include <fcntl.h> | ||
34 | # include <io.h> | ||
35 | # include <signal.h> | ||
36 | #endif | ||
37 | |||
38 | /************************************************************************ | ||
39 | * Table for key code translation of function keys in keypad mode * | ||
40 | * These values are for strict IBM keyboard compatibles only * | ||
41 | ************************************************************************/ | ||
42 | |||
43 | static short key_table[] = | ||
44 | { | ||
45 | -1, ALT_ESC, -1, 0, | ||
46 | -1, -1, -1, -1, | ||
47 | -1, -1, -1, -1, | ||
48 | -1, -1, ALT_BKSP, KEY_BTAB, | ||
49 | ALT_Q, ALT_W, ALT_E, ALT_R, | ||
50 | ALT_T, ALT_Y, ALT_U, ALT_I, | ||
51 | ALT_O, ALT_P, ALT_LBRACKET, ALT_RBRACKET, | ||
52 | ALT_ENTER, -1, ALT_A, ALT_S, | ||
53 | ALT_D, ALT_F, ALT_G, ALT_H, | ||
54 | ALT_J, ALT_K, ALT_L, ALT_SEMICOLON, | ||
55 | ALT_FQUOTE, ALT_BQUOTE, -1, ALT_BSLASH, | ||
56 | ALT_Z, ALT_X, ALT_C, ALT_V, | ||
57 | ALT_B, ALT_N, ALT_M, ALT_COMMA, | ||
58 | ALT_STOP, ALT_FSLASH, -1, ALT_PADSTAR, | ||
59 | -1, -1, -1, KEY_F(1), | ||
60 | KEY_F(2), KEY_F(3), KEY_F(4), KEY_F(5), | ||
61 | KEY_F(6), KEY_F(7), KEY_F(8), KEY_F(9), | ||
62 | KEY_F(10), -1, -1, KEY_HOME, | ||
63 | KEY_UP, KEY_PPAGE, ALT_PADMINUS, KEY_LEFT, | ||
64 | KEY_B2, KEY_RIGHT, ALT_PADPLUS, KEY_END, | ||
65 | KEY_DOWN, KEY_NPAGE, KEY_IC, KEY_DC, | ||
66 | KEY_F(13), KEY_F(14), KEY_F(15), KEY_F(16), | ||
67 | KEY_F(17), KEY_F(18), KEY_F(19), KEY_F(20), | ||
68 | KEY_F(21), KEY_F(22), KEY_F(25), KEY_F(26), | ||
69 | KEY_F(27), KEY_F(28), KEY_F(29), KEY_F(30), | ||
70 | KEY_F(31), KEY_F(32), KEY_F(33), KEY_F(34), | ||
71 | KEY_F(37), KEY_F(38), KEY_F(39), KEY_F(40), | ||
72 | KEY_F(41), KEY_F(42), KEY_F(43), KEY_F(44), | ||
73 | KEY_F(45), KEY_F(46), -1, CTL_LEFT, | ||
74 | CTL_RIGHT, CTL_END, CTL_PGDN, CTL_HOME, | ||
75 | ALT_1, ALT_2, ALT_3, ALT_4, | ||
76 | ALT_5, ALT_6, ALT_7, ALT_8, | ||
77 | ALT_9, ALT_0, ALT_MINUS, ALT_EQUAL, | ||
78 | CTL_PGUP, KEY_F(11), KEY_F(12), KEY_F(23), | ||
79 | KEY_F(24), KEY_F(35), KEY_F(36), KEY_F(47), | ||
80 | KEY_F(48), CTL_UP, CTL_PADMINUS, CTL_PADCENTER, | ||
81 | CTL_PADPLUS, CTL_DOWN, CTL_INS, CTL_DEL, | ||
82 | CTL_TAB, CTL_PADSLASH, CTL_PADSTAR, ALT_HOME, | ||
83 | ALT_UP, ALT_PGUP, -1, ALT_LEFT, | ||
84 | -1, ALT_RIGHT, -1, ALT_END, | ||
85 | ALT_DOWN, ALT_PGDN, ALT_INS, ALT_DEL, | ||
86 | ALT_PADSLASH, ALT_TAB, ALT_PADENTER, -1 | ||
87 | }; | ||
88 | |||
89 | unsigned long pdc_key_modifiers = 0L; | ||
90 | |||
91 | static struct {unsigned short pressed, released;} button[3]; | ||
92 | |||
93 | static bool mouse_avail = FALSE, mouse_vis = FALSE, mouse_moved = FALSE, | ||
94 | mouse_button = FALSE, key_pressed = FALSE; | ||
95 | |||
96 | static unsigned char mouse_scroll = 0; | ||
97 | static PDCREGS ms_regs, old_ms; | ||
98 | static unsigned short shift_status, old_shift = 0; | ||
99 | static unsigned char keyboard_function = 0xff, shift_function = 0xff, | ||
100 | check_function = 0xff; | ||
101 | |||
102 | static const unsigned short button_map[3] = {0, 2, 1}; | ||
103 | |||
104 | unsigned long PDC_get_input_fd(void) | ||
105 | { | ||
106 | PDC_LOG(("PDC_get_input_fd() - called\n")); | ||
107 | |||
108 | return (unsigned long)fileno(stdin); | ||
109 | } | ||
110 | |||
111 | void PDC_set_keyboard_binary(bool on) | ||
112 | { | ||
113 | PDC_LOG(("PDC_set_keyboard_binary() - called\n")); | ||
114 | |||
115 | #ifdef __DJGPP__ | ||
116 | setmode(fileno(stdin), on ? O_BINARY : O_TEXT); | ||
117 | signal(SIGINT, on ? SIG_IGN : SIG_DFL); | ||
118 | #endif | ||
119 | } | ||
120 | |||
121 | /* check if a key or mouse event is waiting */ | ||
122 | |||
123 | bool PDC_check_key(void) | ||
124 | { | ||
125 | PDCREGS regs; | ||
126 | |||
127 | if (shift_function == 0xff) | ||
128 | { | ||
129 | int scan; | ||
130 | |||
131 | /* get shift status for all keyboards */ | ||
132 | |||
133 | regs.h.ah = 0x02; | ||
134 | PDCINT(0x16, regs); | ||
135 | scan = regs.h.al; | ||
136 | |||
137 | /* get shift status for enhanced keyboards */ | ||
138 | |||
139 | regs.h.ah = 0x12; | ||
140 | PDCINT(0x16, regs); | ||
141 | |||
142 | if (scan == regs.h.al && getdosmembyte(0x496) == 0x10) | ||
143 | { | ||
144 | keyboard_function = 0x10; | ||
145 | check_function = 0x11; | ||
146 | shift_function = 0x12; | ||
147 | } | ||
148 | else | ||
149 | { | ||
150 | keyboard_function = 0; | ||
151 | check_function = 1; | ||
152 | shift_function = 2; | ||
153 | } | ||
154 | } | ||
155 | |||
156 | regs.h.ah = shift_function; | ||
157 | PDCINT(0x16, regs); | ||
158 | |||
159 | shift_status = regs.W.ax; | ||
160 | |||
161 | if (mouse_vis) | ||
162 | { | ||
163 | unsigned short i; | ||
164 | |||
165 | ms_regs.W.ax = 3; | ||
166 | PDCINT(0x33, ms_regs); | ||
167 | |||
168 | mouse_button = FALSE; | ||
169 | |||
170 | for (i = 0; i < 3; i++) | ||
171 | { | ||
172 | regs.W.ax = 6; | ||
173 | regs.W.bx = button_map[i]; | ||
174 | PDCINT(0x33, regs); | ||
175 | button[i].released = regs.W.bx; | ||
176 | if (regs.W.bx) | ||
177 | { | ||
178 | ms_regs.W.cx = regs.W.cx; | ||
179 | ms_regs.W.dx = regs.W.dx; | ||
180 | mouse_button = TRUE; | ||
181 | } | ||
182 | |||
183 | regs.W.ax = 5; | ||
184 | regs.W.bx = button_map[i]; | ||
185 | PDCINT(0x33, regs); | ||
186 | button[i].pressed = regs.W.bx; | ||
187 | if (regs.W.bx) | ||
188 | { | ||
189 | ms_regs.W.cx = regs.W.cx; | ||
190 | ms_regs.W.dx = regs.W.dx; | ||
191 | mouse_button = TRUE; | ||
192 | } | ||
193 | } | ||
194 | |||
195 | mouse_scroll = ms_regs.h.bh; | ||
196 | |||
197 | mouse_moved = !mouse_button && ms_regs.h.bl && | ||
198 | ms_regs.h.bl == old_ms.h.bl && | ||
199 | (((ms_regs.W.cx ^ old_ms.W.cx) >> 3) || | ||
200 | ((ms_regs.W.dx ^ old_ms.W.dx) >> 3)); | ||
201 | |||
202 | if (mouse_scroll || mouse_button || mouse_moved) | ||
203 | return TRUE; | ||
204 | } | ||
205 | |||
206 | if (old_shift && !shift_status) /* modifier released */ | ||
207 | { | ||
208 | if (!key_pressed && SP->return_key_modifiers) | ||
209 | return TRUE; | ||
210 | } | ||
211 | else if (!old_shift && shift_status) /* modifier pressed */ | ||
212 | key_pressed = FALSE; | ||
213 | |||
214 | old_shift = shift_status; | ||
215 | |||
216 | #ifndef USE_KBHIT | ||
217 | regs.h.ah = check_function; | ||
218 | PDCINT(0x16, regs); | ||
219 | |||
220 | return !(regs.W.flags & 64); | ||
221 | #else | ||
222 | return kbhit(); | ||
223 | #endif | ||
224 | } | ||
225 | |||
226 | static int _process_mouse_events(void) | ||
227 | { | ||
228 | int i; | ||
229 | short shift_flags = 0; | ||
230 | |||
231 | memset(&pdc_mouse_status, 0, sizeof(pdc_mouse_status)); | ||
232 | |||
233 | key_pressed = TRUE; | ||
234 | old_shift = shift_status; | ||
235 | SP->key_code = TRUE; | ||
236 | |||
237 | /* Set shift modifiers */ | ||
238 | |||
239 | if (shift_status & 3) | ||
240 | shift_flags |= BUTTON_SHIFT; | ||
241 | |||
242 | if (shift_status & 4) | ||
243 | shift_flags |= BUTTON_CONTROL; | ||
244 | |||
245 | if (shift_status & 8) | ||
246 | shift_flags |= BUTTON_ALT; | ||
247 | |||
248 | /* Scroll wheel support for CuteMouse */ | ||
249 | |||
250 | if (mouse_scroll) | ||
251 | { | ||
252 | pdc_mouse_status.changes = mouse_scroll & 0x80 ? | ||
253 | PDC_MOUSE_WHEEL_UP : PDC_MOUSE_WHEEL_DOWN; | ||
254 | |||
255 | pdc_mouse_status.x = -1; | ||
256 | pdc_mouse_status.y = -1; | ||
257 | |||
258 | return KEY_MOUSE; | ||
259 | } | ||
260 | |||
261 | if (mouse_moved) | ||
262 | { | ||
263 | pdc_mouse_status.changes = PDC_MOUSE_MOVED; | ||
264 | |||
265 | for (i = 0; i < 3; i++) | ||
266 | { | ||
267 | if (ms_regs.h.bl & (1 << button_map[i])) | ||
268 | { | ||
269 | pdc_mouse_status.button[i] = BUTTON_MOVED | shift_flags; | ||
270 | pdc_mouse_status.changes |= (1 << i); | ||
271 | } | ||
272 | } | ||
273 | } | ||
274 | else /* button event */ | ||
275 | { | ||
276 | for (i = 0; i < 3; i++) | ||
277 | { | ||
278 | if (button[i].pressed) | ||
279 | { | ||
280 | /* Check for a click -- a PRESS followed | ||
281 | immediately by a release */ | ||
282 | |||
283 | if (!button[i].released) | ||
284 | { | ||
285 | if (SP->mouse_wait) | ||
286 | { | ||
287 | PDCREGS regs; | ||
288 | |||
289 | napms(SP->mouse_wait); | ||
290 | |||
291 | regs.W.ax = 6; | ||
292 | regs.W.bx = button_map[i]; | ||
293 | PDCINT(0x33, regs); | ||
294 | |||
295 | pdc_mouse_status.button[i] = regs.W.bx ? | ||
296 | BUTTON_CLICKED : BUTTON_PRESSED; | ||
297 | } | ||
298 | else | ||
299 | pdc_mouse_status.button[i] = BUTTON_PRESSED; | ||
300 | } | ||
301 | else | ||
302 | pdc_mouse_status.button[i] = BUTTON_CLICKED; | ||
303 | } | ||
304 | |||
305 | if (button[i].pressed || button[i].released) | ||
306 | { | ||
307 | pdc_mouse_status.button[i] |= shift_flags; | ||
308 | pdc_mouse_status.changes |= (1 << i); | ||
309 | } | ||
310 | } | ||
311 | } | ||
312 | |||
313 | pdc_mouse_status.x = ms_regs.W.cx >> 3; | ||
314 | pdc_mouse_status.y = ms_regs.W.dx >> 3; | ||
315 | |||
316 | old_ms = ms_regs; | ||
317 | |||
318 | return KEY_MOUSE; | ||
319 | } | ||
320 | |||
321 | /* return the next available key or mouse event */ | ||
322 | |||
323 | int PDC_get_key(void) | ||
324 | { | ||
325 | PDCREGS regs; | ||
326 | int key, scan; | ||
327 | |||
328 | pdc_key_modifiers = 0; | ||
329 | |||
330 | if (mouse_vis && (mouse_scroll || mouse_button || mouse_moved)) | ||
331 | return _process_mouse_events(); | ||
332 | |||
333 | /* Return modifiers as keys? */ | ||
334 | |||
335 | if (old_shift && !shift_status) | ||
336 | { | ||
337 | key = -1; | ||
338 | |||
339 | if (old_shift & 1) | ||
340 | key = KEY_SHIFT_R; | ||
341 | |||
342 | if (old_shift & 2) | ||
343 | key = KEY_SHIFT_L; | ||
344 | |||
345 | if (shift_function == 0x12) | ||
346 | { | ||
347 | if (old_shift & 0x400) | ||
348 | key = KEY_CONTROL_R; | ||
349 | |||
350 | if (old_shift & 0x100) | ||
351 | key = KEY_CONTROL_L; | ||
352 | |||
353 | if (old_shift & 0x800) | ||
354 | key = KEY_ALT_R; | ||
355 | |||
356 | if (old_shift & 0x200) | ||
357 | key = KEY_ALT_L; | ||
358 | } | ||
359 | else | ||
360 | { | ||
361 | if (old_shift & 4) | ||
362 | key = KEY_CONTROL_R; | ||
363 | |||
364 | if (old_shift & 8) | ||
365 | key = KEY_ALT_R; | ||
366 | } | ||
367 | |||
368 | key_pressed = FALSE; | ||
369 | old_shift = shift_status; | ||
370 | |||
371 | SP->key_code = TRUE; | ||
372 | return key; | ||
373 | } | ||
374 | |||
375 | regs.h.ah = keyboard_function; | ||
376 | PDCINT(0x16, regs); | ||
377 | key = regs.h.al; | ||
378 | scan = regs.h.ah; | ||
379 | |||
380 | if (SP->save_key_modifiers) | ||
381 | { | ||
382 | if (shift_status & 3) | ||
383 | pdc_key_modifiers |= PDC_KEY_MODIFIER_SHIFT; | ||
384 | |||
385 | if (shift_status & 4) | ||
386 | pdc_key_modifiers |= PDC_KEY_MODIFIER_CONTROL; | ||
387 | |||
388 | if (shift_status & 8) | ||
389 | pdc_key_modifiers |= PDC_KEY_MODIFIER_ALT; | ||
390 | |||
391 | if (shift_status & 0x20) | ||
392 | pdc_key_modifiers |= PDC_KEY_MODIFIER_NUMLOCK; | ||
393 | } | ||
394 | |||
395 | if (scan == 0x1c && key == 0x0a) /* ^Enter */ | ||
396 | key = CTL_ENTER; | ||
397 | else if (scan == 0xe0 && key == 0x0d) /* PadEnter */ | ||
398 | key = PADENTER; | ||
399 | else if (scan == 0xe0 && key == 0x0a) /* ^PadEnter */ | ||
400 | key = CTL_PADENTER; | ||
401 | else if (scan == 0x37 && key == 0x2a) /* Star */ | ||
402 | key = PADSTAR; | ||
403 | else if (scan == 0x4a && key == 0x2d) /* Minus */ | ||
404 | key = PADMINUS; | ||
405 | else if (scan == 0x4e && key == 0x2b) /* Plus */ | ||
406 | key = PADPLUS; | ||
407 | else if (scan == 0xe0 && key == 0x2f) /* Slash */ | ||
408 | key = PADSLASH; | ||
409 | else if (key == 0x00 || (key == 0xe0 && scan > 53 && scan != 86)) | ||
410 | key = (scan > 0xa7) ? -1 : key_table[scan]; | ||
411 | |||
412 | if (shift_status & 3) | ||
413 | { | ||
414 | switch (key) | ||
415 | { | ||
416 | case KEY_HOME: /* Shift Home */ | ||
417 | key = KEY_SHOME; | ||
418 | break; | ||
419 | case KEY_UP: /* Shift Up */ | ||
420 | key = KEY_SUP; | ||
421 | break; | ||
422 | case KEY_PPAGE: /* Shift PgUp */ | ||
423 | key = KEY_SPREVIOUS; | ||
424 | break; | ||
425 | case KEY_LEFT: /* Shift Left */ | ||
426 | key = KEY_SLEFT; | ||
427 | break; | ||
428 | case KEY_RIGHT: /* Shift Right */ | ||
429 | key = KEY_SRIGHT; | ||
430 | break; | ||
431 | case KEY_END: /* Shift End */ | ||
432 | key = KEY_SEND; | ||
433 | break; | ||
434 | case KEY_DOWN: /* Shift Down */ | ||
435 | key = KEY_SDOWN; | ||
436 | break; | ||
437 | case KEY_NPAGE: /* Shift PgDn */ | ||
438 | key = KEY_SNEXT; | ||
439 | break; | ||
440 | case KEY_IC: /* Shift Ins */ | ||
441 | key = KEY_SIC; | ||
442 | break; | ||
443 | case KEY_DC: /* Shift Del */ | ||
444 | key = KEY_SDC; | ||
445 | } | ||
446 | } | ||
447 | |||
448 | key_pressed = TRUE; | ||
449 | SP->key_code = ((unsigned)key >= 256); | ||
450 | |||
451 | return key; | ||
452 | } | ||
453 | |||
454 | /* discard any pending keyboard or mouse input -- this is the core | ||
455 | routine for flushinp() */ | ||
456 | |||
457 | void PDC_flushinp(void) | ||
458 | { | ||
459 | PDC_LOG(("PDC_flushinp() - called\n")); | ||
460 | |||
461 | /* Force the BIOS keyboard buffer head and tail pointers to be | ||
462 | the same... Real nasty trick... */ | ||
463 | |||
464 | setdosmemword(0x41a, getdosmemword(0x41c)); | ||
465 | } | ||
466 | |||
467 | int PDC_mouse_set(void) | ||
468 | { | ||
469 | PDCREGS regs; | ||
470 | unsigned long mbe = SP->_trap_mbe; | ||
471 | |||
472 | if (mbe && !mouse_avail) | ||
473 | { | ||
474 | regs.W.ax = 0; | ||
475 | PDCINT(0x33, regs); | ||
476 | |||
477 | mouse_avail = !!(regs.W.ax); | ||
478 | } | ||
479 | |||
480 | if (mbe) | ||
481 | { | ||
482 | if (mouse_avail && !mouse_vis) | ||
483 | { | ||
484 | memset(&old_ms, 0, sizeof(old_ms)); | ||
485 | |||
486 | regs.W.ax = 1; | ||
487 | PDCINT(0x33, regs); | ||
488 | |||
489 | mouse_vis = TRUE; | ||
490 | } | ||
491 | } | ||
492 | else | ||
493 | { | ||
494 | if (mouse_avail && mouse_vis) | ||
495 | { | ||
496 | regs.W.ax = 2; | ||
497 | PDCINT(0x33, regs); | ||
498 | |||
499 | mouse_vis = FALSE; | ||
500 | } | ||
501 | } | ||
502 | |||
503 | return (mouse_avail || !mbe) ? OK : ERR; | ||
504 | } | ||
505 | |||
506 | int PDC_modifiers_set(void) | ||
507 | { | ||
508 | key_pressed = FALSE; | ||
509 | |||
510 | return OK; | ||
511 | } |
File dos/pdcscrn.c added (mode: 100644) (index 00000000..ddfb0956) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcscrn.c,v 1.89 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | |||
9 | #ifdef CHTYPE_LONG | ||
10 | # define PDC_OFFSET 32 | ||
11 | #else | ||
12 | # define PDC_OFFSET 8 | ||
13 | #endif | ||
14 | |||
15 | /* COLOR_PAIR to attribute encoding table. */ | ||
16 | |||
17 | unsigned char *pdc_atrtab = (unsigned char *)NULL; | ||
18 | |||
19 | int pdc_adapter; /* screen type */ | ||
20 | int pdc_scrnmode; /* default screen mode */ | ||
21 | int pdc_font; /* default font size */ | ||
22 | bool pdc_direct_video; /* allow direct screen memory writes */ | ||
23 | bool pdc_bogus_adapter; /* TRUE if adapter has insane values */ | ||
24 | unsigned pdc_video_seg; /* video base segment */ | ||
25 | unsigned pdc_video_ofs; /* video base offset */ | ||
26 | |||
27 | static short curstoreal[16], realtocurs[16] = | ||
28 | { | ||
29 | COLOR_BLACK, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN, COLOR_RED, | ||
30 | COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE, COLOR_BLACK + 8, | ||
31 | COLOR_BLUE + 8, COLOR_GREEN + 8, COLOR_CYAN + 8, COLOR_RED + 8, | ||
32 | COLOR_MAGENTA + 8, COLOR_YELLOW + 8, COLOR_WHITE + 8 | ||
33 | }; | ||
34 | |||
35 | static bool sizeable = FALSE; /* TRUE if adapter is resizeable */ | ||
36 | |||
37 | static unsigned short *saved_screen = NULL; | ||
38 | static int saved_lines = 0; | ||
39 | static int saved_cols = 0; | ||
40 | |||
41 | static int saved_scrnmode[3]; | ||
42 | static int saved_font[3]; | ||
43 | |||
44 | /* Thanks to Jeff Duntemann, K16RA for providing the impetus | ||
45 | (through the Dr. Dobbs Journal, March 1989 issue) for getting | ||
46 | the routines below merged into Bjorn Larsson's PDCurses 1.3... | ||
47 | -- frotz@dri.com 900730 */ | ||
48 | |||
49 | /* _get_font() - Get the current font size */ | ||
50 | |||
51 | static int _get_font(void) | ||
52 | { | ||
53 | int retval; | ||
54 | |||
55 | retval = getdosmemword(0x485); | ||
56 | |||
57 | /* Assume the MDS Genius is in 66 line mode. */ | ||
58 | |||
59 | if ((retval == 0) && (pdc_adapter == _MDS_GENIUS)) | ||
60 | retval = _FONT15; | ||
61 | |||
62 | switch (pdc_adapter) | ||
63 | { | ||
64 | case _MDA: | ||
65 | retval = 10; /* POINTS is not certain on MDA/Hercules */ | ||
66 | break; | ||
67 | |||
68 | case _EGACOLOR: | ||
69 | case _EGAMONO: | ||
70 | switch (retval) | ||
71 | { | ||
72 | case _FONT8: | ||
73 | case _FONT14: | ||
74 | break; | ||
75 | default: | ||
76 | retval = _FONT14; | ||
77 | } | ||
78 | break; | ||
79 | |||
80 | case _CGA: | ||
81 | retval = _FONT8; | ||
82 | } | ||
83 | |||
84 | return retval; | ||
85 | } | ||
86 | |||
87 | /* _set_font() - Sets the current font size, if the adapter allows such a | ||
88 | change. It is an error to attempt to change the font size on a | ||
89 | "bogus" adapter. The reason for this is that we have a known video | ||
90 | adapter identity problem. e.g. Two adapters report the same identifying | ||
91 | characteristics. */ | ||
92 | |||
93 | static void _set_font(int size) | ||
94 | { | ||
95 | PDCREGS regs; | ||
96 | |||
97 | if (pdc_bogus_adapter) | ||
98 | return; | ||
99 | |||
100 | switch (pdc_adapter) | ||
101 | { | ||
102 | case _CGA: | ||
103 | case _MDA: | ||
104 | case _MCGACOLOR: | ||
105 | case _MCGAMONO: | ||
106 | case _MDS_GENIUS: | ||
107 | break; | ||
108 | |||
109 | case _EGACOLOR: | ||
110 | case _EGAMONO: | ||
111 | if (sizeable && (pdc_font != size)) | ||
112 | { | ||
113 | switch (size) | ||
114 | { | ||
115 | case _FONT8: | ||
116 | regs.W.ax = 0x1112; | ||
117 | regs.h.bl = 0x00; | ||
118 | PDCINT(0x10, regs); | ||
119 | break; | ||
120 | case _FONT14: | ||
121 | regs.W.ax = 0x1111; | ||
122 | regs.h.bl = 0x00; | ||
123 | PDCINT(0x10, regs); | ||
124 | } | ||
125 | } | ||
126 | break; | ||
127 | |||
128 | case _VGACOLOR: | ||
129 | case _VGAMONO: | ||
130 | if (sizeable && (pdc_font != size)) | ||
131 | { | ||
132 | switch (size) | ||
133 | { | ||
134 | case _FONT8: | ||
135 | regs.W.ax = 0x1112; | ||
136 | regs.h.bl = 0x00; | ||
137 | PDCINT(0x10, regs); | ||
138 | break; | ||
139 | case _FONT14: | ||
140 | regs.W.ax = 0x1111; | ||
141 | regs.h.bl = 0x00; | ||
142 | PDCINT(0x10, regs); | ||
143 | break; | ||
144 | case _FONT16: | ||
145 | regs.W.ax = 0x1114; | ||
146 | regs.h.bl = 0x00; | ||
147 | PDCINT(0x10, regs); | ||
148 | } | ||
149 | } | ||
150 | } | ||
151 | |||
152 | curs_set(SP->visibility); | ||
153 | |||
154 | pdc_font = _get_font(); | ||
155 | } | ||
156 | |||
157 | /* _set_80x25() - force a known screen state: 80x25 text mode. Forces the | ||
158 | appropriate 80x25 alpha mode given the display adapter. */ | ||
159 | |||
160 | static void _set_80x25(void) | ||
161 | { | ||
162 | PDCREGS regs; | ||
163 | |||
164 | switch (pdc_adapter) | ||
165 | { | ||
166 | case _CGA: | ||
167 | case _EGACOLOR: | ||
168 | case _EGAMONO: | ||
169 | case _VGACOLOR: | ||
170 | case _VGAMONO: | ||
171 | case _MCGACOLOR: | ||
172 | case _MCGAMONO: | ||
173 | regs.h.ah = 0x00; | ||
174 | regs.h.al = 0x03; | ||
175 | PDCINT(0x10, regs); | ||
176 | break; | ||
177 | case _MDA: | ||
178 | regs.h.ah = 0x00; | ||
179 | regs.h.al = 0x07; | ||
180 | PDCINT(0x10, regs); | ||
181 | } | ||
182 | } | ||
183 | |||
184 | /* _get_scrn_mode() - Return the current BIOS video mode */ | ||
185 | |||
186 | static int _get_scrn_mode(void) | ||
187 | { | ||
188 | PDCREGS regs; | ||
189 | |||
190 | regs.h.ah = 0x0f; | ||
191 | PDCINT(0x10, regs); | ||
192 | |||
193 | return (int)regs.h.al; | ||
194 | } | ||
195 | |||
196 | /* _set_scrn_mode() - Sets the BIOS Video Mode Number only if it is | ||
197 | different from the current video mode. */ | ||
198 | |||
199 | static void _set_scrn_mode(int new_mode) | ||
200 | { | ||
201 | PDCREGS regs; | ||
202 | |||
203 | if (_get_scrn_mode() != new_mode) | ||
204 | { | ||
205 | regs.h.ah = 0; | ||
206 | regs.h.al = (unsigned char) new_mode; | ||
207 | PDCINT(0x10, regs); | ||
208 | } | ||
209 | |||
210 | pdc_font = _get_font(); | ||
211 | pdc_scrnmode = new_mode; | ||
212 | LINES = PDC_get_rows(); | ||
213 | COLS = PDC_get_columns(); | ||
214 | } | ||
215 | |||
216 | /* _sanity_check() - A video adapter identification sanity check. This | ||
217 | routine will force sane values for various control flags. */ | ||
218 | |||
219 | static int _sanity_check(int adapter) | ||
220 | { | ||
221 | int fontsize = _get_font(); | ||
222 | int rows = PDC_get_rows(); | ||
223 | |||
224 | PDC_LOG(("_sanity_check() - called: Adapter %d\n", adapter)); | ||
225 | |||
226 | switch (adapter) | ||
227 | { | ||
228 | case _EGACOLOR: | ||
229 | case _EGAMONO: | ||
230 | switch (rows) | ||
231 | { | ||
232 | case 25: | ||
233 | case 43: | ||
234 | break; | ||
235 | default: | ||
236 | pdc_bogus_adapter = TRUE; | ||
237 | } | ||
238 | |||
239 | switch (fontsize) | ||
240 | { | ||
241 | case _FONT8: | ||
242 | case _FONT14: | ||
243 | break; | ||
244 | default: | ||
245 | pdc_bogus_adapter = TRUE; | ||
246 | } | ||
247 | break; | ||
248 | |||
249 | case _VGACOLOR: | ||
250 | case _VGAMONO: | ||
251 | break; | ||
252 | |||
253 | case _CGA: | ||
254 | case _MDA: | ||
255 | case _MCGACOLOR: | ||
256 | case _MCGAMONO: | ||
257 | switch (rows) | ||
258 | { | ||
259 | case 25: | ||
260 | break; | ||
261 | default: | ||
262 | pdc_bogus_adapter = TRUE; | ||
263 | } | ||
264 | break; | ||
265 | |||
266 | default: | ||
267 | pdc_bogus_adapter = TRUE; | ||
268 | } | ||
269 | |||
270 | if (pdc_bogus_adapter) | ||
271 | { | ||
272 | sizeable = FALSE; | ||
273 | pdc_direct_video = FALSE; | ||
274 | } | ||
275 | |||
276 | return adapter; | ||
277 | } | ||
278 | |||
279 | /* _query_adapter_type() - Determine PC video adapter type. */ | ||
280 | |||
281 | static int _query_adapter_type(void) | ||
282 | { | ||
283 | PDCREGS regs; | ||
284 | int retval = _NONE; | ||
285 | |||
286 | /* thanks to paganini@ax.apc.org for the GO32 fix */ | ||
287 | |||
288 | #if !defined(__DJGPP__) && !defined(__WATCOMC__) | ||
289 | struct SREGS segs; | ||
290 | #endif | ||
291 | short video_base = getdosmemword(0x463); | ||
292 | |||
293 | PDC_LOG(("_query_adapter_type() - called\n")); | ||
294 | |||
295 | /* attempt to call VGA Identify Adapter Function */ | ||
296 | |||
297 | regs.W.ax = 0x1a00; | ||
298 | PDCINT(0x10, regs); | ||
299 | |||
300 | if ((regs.h.al == 0x1a) && (retval == _NONE)) | ||
301 | { | ||
302 | /* We know that the PS/2 video BIOS is alive and well. */ | ||
303 | |||
304 | switch (regs.h.al) | ||
305 | { | ||
306 | case 0: | ||
307 | retval = _NONE; | ||
308 | break; | ||
309 | case 1: | ||
310 | retval = _MDA; | ||
311 | break; | ||
312 | case 2: | ||
313 | retval = _CGA; | ||
314 | break; | ||
315 | case 4: | ||
316 | retval = _EGACOLOR; | ||
317 | sizeable = TRUE; | ||
318 | break; | ||
319 | case 5: | ||
320 | retval = _EGAMONO; | ||
321 | break; | ||
322 | case 26: /* ...alt. VGA BIOS... */ | ||
323 | case 7: | ||
324 | retval = _VGACOLOR; | ||
325 | sizeable = TRUE; | ||
326 | break; | ||
327 | case 8: | ||
328 | retval = _VGAMONO; | ||
329 | break; | ||
330 | case 10: | ||
331 | case 13: | ||
332 | retval = _MCGACOLOR; | ||
333 | break; | ||
334 | case 12: | ||
335 | retval = _MCGAMONO; | ||
336 | break; | ||
337 | default: | ||
338 | retval = _CGA; | ||
339 | } | ||
340 | } | ||
341 | else | ||
342 | { | ||
343 | /* No VGA BIOS, check for an EGA BIOS by selecting an | ||
344 | Alternate Function Service... | ||
345 | |||
346 | bx == 0x0010 --> return EGA information */ | ||
347 | |||
348 | regs.h.ah = 0x12; | ||
349 | regs.W.bx = 0x10; | ||
350 | PDCINT(0x10, regs); | ||
351 | |||
352 | if ((regs.h.bl != 0x10) && (retval == _NONE)) | ||
353 | { | ||
354 | /* An EGA BIOS exists */ | ||
355 | |||
356 | regs.h.ah = 0x12; | ||
357 | regs.h.bl = 0x10; | ||
358 | PDCINT(0x10, regs); | ||
359 | |||
360 | if (regs.h.bh == 0) | ||
361 | retval = _EGACOLOR; | ||
362 | else | ||
363 | retval = _EGAMONO; | ||
364 | } | ||
365 | else if (retval == _NONE) | ||
366 | { | ||
367 | /* Now we know we only have CGA or MDA */ | ||
368 | |||
369 | PDCINT(0x11, regs); | ||
370 | |||
371 | switch (regs.h.al & 0x30) | ||
372 | { | ||
373 | case 0x10: | ||
374 | case 0x20: | ||
375 | retval = _CGA; | ||
376 | break; | ||
377 | case 0x30: | ||
378 | retval = _MDA; | ||
379 | break; | ||
380 | default: | ||
381 | retval = _NONE; | ||
382 | } | ||
383 | } | ||
384 | } | ||
385 | |||
386 | if (video_base == 0x3d4) | ||
387 | { | ||
388 | pdc_video_seg = 0xb800; | ||
389 | switch (retval) | ||
390 | { | ||
391 | case _EGAMONO: | ||
392 | retval = _EGACOLOR; | ||
393 | break; | ||
394 | case _VGAMONO: | ||
395 | retval = _VGACOLOR; | ||
396 | } | ||
397 | } | ||
398 | |||
399 | if (video_base == 0x3b4) | ||
400 | { | ||
401 | pdc_video_seg = 0xb000; | ||
402 | switch (retval) | ||
403 | { | ||
404 | case _EGACOLOR: | ||
405 | retval = _EGAMONO; | ||
406 | break; | ||
407 | case _VGACOLOR: | ||
408 | retval = _VGAMONO; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | if ((retval == _NONE) | ||
413 | #ifndef CGA_DIRECT | ||
414 | || (retval == _CGA) | ||
415 | #endif | ||
416 | ) | ||
417 | pdc_direct_video = FALSE; | ||
418 | |||
419 | if ((unsigned)pdc_video_seg == 0xb000) | ||
420 | SP->mono = TRUE; | ||
421 | else | ||
422 | SP->mono = FALSE; | ||
423 | |||
424 | /* Check for DESQview shadow buffer | ||
425 | thanks to paganini@ax.apc.org for the GO32 fix */ | ||
426 | |||
427 | #ifndef __WATCOMC__ | ||
428 | regs.h.ah = 0xfe; | ||
429 | regs.h.al = 0; | ||
430 | regs.x.di = pdc_video_ofs; | ||
431 | # ifdef __DJGPP__ | ||
432 | regs.x.es = pdc_video_seg; | ||
433 | __dpmi_int(0x10, ®s); | ||
434 | pdc_video_seg = regs.x.es; | ||
435 | # else | ||
436 | segs.es = pdc_video_seg; | ||
437 | int86x(0x10, ®s, ®s, &segs); | ||
438 | pdc_video_seg = segs.es; | ||
439 | # endif | ||
440 | pdc_video_ofs = regs.x.di; | ||
441 | #endif | ||
442 | if (!pdc_adapter) | ||
443 | pdc_adapter = retval; | ||
444 | |||
445 | return _sanity_check(retval); | ||
446 | } | ||
447 | |||
448 | /* close the physical screen -- may restore the screen to its state | ||
449 | before PDC_scr_open(); miscellaneous cleanup */ | ||
450 | |||
451 | void PDC_scr_close(void) | ||
452 | { | ||
453 | #if SMALL || MEDIUM | ||
454 | # ifndef __PACIFIC__ | ||
455 | struct SREGS segregs; | ||
456 | # endif | ||
457 | int ds; | ||
458 | #endif | ||
459 | PDC_LOG(("PDC_scr_close() - called\n")); | ||
460 | |||
461 | if (getenv("PDC_RESTORE_SCREEN") && saved_screen) | ||
462 | { | ||
463 | #ifdef __DJGPP__ | ||
464 | dosmemput(saved_screen, saved_lines * saved_cols * 2, | ||
465 | (unsigned long)_FAR_POINTER(pdc_video_seg, | ||
466 | pdc_video_ofs)); | ||
467 | #else | ||
468 | # if (SMALL || MEDIUM) | ||
469 | # ifdef __PACIFIC__ | ||
470 | ds = FP_SEG((void far *)saved_screen); | ||
471 | # else | ||
472 | segread(&segregs); | ||
473 | ds = segregs.ds; | ||
474 | # endif | ||
475 | movedata(ds, (int)saved_screen, pdc_video_seg, pdc_video_ofs, | ||
476 | (saved_lines * saved_cols * 2)); | ||
477 | # else | ||
478 | memcpy((void *)_FAR_POINTER(pdc_video_seg, pdc_video_ofs), | ||
479 | (void *)saved_screen, (saved_lines * saved_cols * 2)); | ||
480 | # endif | ||
481 | #endif | ||
482 | free(saved_screen); | ||
483 | saved_screen = NULL; | ||
484 | } | ||
485 | |||
486 | reset_shell_mode(); | ||
487 | |||
488 | if (SP->visibility != 1) | ||
489 | curs_set(1); | ||
490 | |||
491 | /* Position cursor to the bottom left of the screen. */ | ||
492 | |||
493 | PDC_gotoyx(PDC_get_rows() - 2, 0); | ||
494 | } | ||
495 | |||
496 | void PDC_scr_free(void) | ||
497 | { | ||
498 | if (SP) | ||
499 | free(SP); | ||
500 | if (pdc_atrtab) | ||
501 | free(pdc_atrtab); | ||
502 | |||
503 | pdc_atrtab = (unsigned char *)NULL; | ||
504 | } | ||
505 | |||
506 | /* open the physical screen -- allocate SP, miscellaneous intialization, | ||
507 | and may save the existing screen for later restoration */ | ||
508 | |||
509 | int PDC_scr_open(int argc, char **argv) | ||
510 | { | ||
511 | #if SMALL || MEDIUM | ||
512 | # ifndef __PACIFIC__ | ||
513 | struct SREGS segregs; | ||
514 | # endif | ||
515 | int ds; | ||
516 | #endif | ||
517 | int i; | ||
518 | |||
519 | PDC_LOG(("PDC_scr_open() - called\n")); | ||
520 | |||
521 | SP = calloc(1, sizeof(SCREEN)); | ||
522 | pdc_atrtab = calloc(PDC_COLOR_PAIRS * PDC_OFFSET, 1); | ||
523 | |||
524 | if (!SP || !pdc_atrtab) | ||
525 | return ERR; | ||
526 | |||
527 | for (i = 0; i < 16; i++) | ||
528 | curstoreal[realtocurs[i]] = i; | ||
529 | |||
530 | SP->orig_attr = FALSE; | ||
531 | |||
532 | pdc_direct_video = TRUE; /* Assume that we can */ | ||
533 | pdc_video_seg = 0xb000; /* Base screen segment addr */ | ||
534 | pdc_video_ofs = 0x0; /* Base screen segment ofs */ | ||
535 | |||
536 | pdc_adapter = _query_adapter_type(); | ||
537 | pdc_scrnmode = _get_scrn_mode(); | ||
538 | pdc_font = _get_font(); | ||
539 | |||
540 | SP->lines = PDC_get_rows(); | ||
541 | SP->cols = PDC_get_columns(); | ||
542 | |||
543 | SP->mouse_wait = PDC_CLICK_PERIOD; | ||
544 | SP->audible = TRUE; | ||
545 | |||
546 | /* If the environment variable PDCURSES_BIOS is set, the DOS int10() | ||
547 | BIOS calls are used in place of direct video memory access. */ | ||
548 | |||
549 | if (getenv("PDCURSES_BIOS")) | ||
550 | pdc_direct_video = FALSE; | ||
551 | |||
552 | /* This code for preserving the current screen. */ | ||
553 | |||
554 | if (getenv("PDC_RESTORE_SCREEN")) | ||
555 | { | ||
556 | saved_lines = SP->lines; | ||
557 | saved_cols = SP->cols; | ||
558 | |||
559 | saved_screen = malloc(saved_lines * saved_cols * 2); | ||
560 | |||
561 | if (!saved_screen) | ||
562 | { | ||
563 | SP->_preserve = FALSE; | ||
564 | return OK; | ||
565 | } | ||
566 | #ifdef __DJGPP__ | ||
567 | dosmemget((unsigned long)_FAR_POINTER(pdc_video_seg, pdc_video_ofs), | ||
568 | saved_lines * saved_cols * 2, saved_screen); | ||
569 | #else | ||
570 | # if SMALL || MEDIUM | ||
571 | # ifdef __PACIFIC__ | ||
572 | ds = FP_SEG((void far *) saved_screen); | ||
573 | # else | ||
574 | segread(&segregs); | ||
575 | ds = segregs.ds; | ||
576 | # endif | ||
577 | movedata(pdc_video_seg, pdc_video_ofs, ds, (int)saved_screen, | ||
578 | (saved_lines * saved_cols * 2)); | ||
579 | # else | ||
580 | memcpy((void *)saved_screen, | ||
581 | (void *)_FAR_POINTER(pdc_video_seg, pdc_video_ofs), | ||
582 | (saved_lines * saved_cols * 2)); | ||
583 | # endif | ||
584 | #endif | ||
585 | } | ||
586 | |||
587 | SP->_preserve = (getenv("PDC_PRESERVE_SCREEN") != NULL); | ||
588 | |||
589 | return OK; | ||
590 | } | ||
591 | |||
592 | /* the core of resize_term() */ | ||
593 | |||
594 | int PDC_resize_screen(int nlines, int ncols) | ||
595 | { | ||
596 | PDC_LOG(("PDC_resize_screen() - called. Lines: %d Cols: %d\n", | ||
597 | nlines, ncols)); | ||
598 | |||
599 | /* Trash the stored value of orig_cursor -- it's only good if the | ||
600 | video mode doesn't change */ | ||
601 | |||
602 | SP->orig_cursor = 0x0607; | ||
603 | |||
604 | switch (pdc_adapter) | ||
605 | { | ||
606 | case _EGACOLOR: | ||
607 | if (nlines >= 43) | ||
608 | _set_font(_FONT8); | ||
609 | else | ||
610 | _set_80x25(); | ||
611 | break; | ||
612 | |||
613 | case _VGACOLOR: | ||
614 | if (nlines > 28) | ||
615 | _set_font(_FONT8); | ||
616 | else | ||
617 | if (nlines > 25) | ||
618 | _set_font(_FONT14); | ||
619 | else | ||
620 | _set_80x25(); | ||
621 | } | ||
622 | |||
623 | PDC_set_blink(COLORS == 8); | ||
624 | |||
625 | return OK; | ||
626 | } | ||
627 | |||
628 | void PDC_reset_prog_mode(void) | ||
629 | { | ||
630 | PDC_LOG(("PDC_reset_prog_mode() - called.\n")); | ||
631 | } | ||
632 | |||
633 | void PDC_reset_shell_mode(void) | ||
634 | { | ||
635 | PDC_LOG(("PDC_reset_shell_mode() - called.\n")); | ||
636 | } | ||
637 | |||
638 | void PDC_restore_screen_mode(int i) | ||
639 | { | ||
640 | if (i >= 0 && i <= 2) | ||
641 | { | ||
642 | pdc_font = _get_font(); | ||
643 | _set_font(saved_font[i]); | ||
644 | |||
645 | if (_get_scrn_mode() != saved_scrnmode[i]) | ||
646 | _set_scrn_mode(saved_scrnmode[i]); | ||
647 | } | ||
648 | } | ||
649 | |||
650 | void PDC_save_screen_mode(int i) | ||
651 | { | ||
652 | if (i >= 0 && i <= 2) | ||
653 | { | ||
654 | saved_font[i] = pdc_font; | ||
655 | saved_scrnmode[i] = pdc_scrnmode; | ||
656 | } | ||
657 | } | ||
658 | |||
659 | void PDC_init_pair(short pair, short fg, short bg) | ||
660 | { | ||
661 | unsigned char att, temp_bg; | ||
662 | chtype i; | ||
663 | |||
664 | fg = curstoreal[fg]; | ||
665 | bg = curstoreal[bg]; | ||
666 | |||
667 | for (i = 0; i < PDC_OFFSET; i++) | ||
668 | { | ||
669 | att = fg | (bg << 4); | ||
670 | |||
671 | if (i & (A_REVERSE >> PDC_ATTR_SHIFT)) | ||
672 | att = bg | (fg << 4); | ||
673 | if (i & (A_UNDERLINE >> PDC_ATTR_SHIFT)) | ||
674 | att = 1; | ||
675 | if (i & (A_INVIS >> PDC_ATTR_SHIFT)) | ||
676 | { | ||
677 | temp_bg = att >> 4; | ||
678 | att = temp_bg << 4 | temp_bg; | ||
679 | } | ||
680 | if (i & (A_BOLD >> PDC_ATTR_SHIFT)) | ||
681 | att |= 8; | ||
682 | if (i & (A_BLINK >> PDC_ATTR_SHIFT)) | ||
683 | att |= 128; | ||
684 | |||
685 | pdc_atrtab[pair * PDC_OFFSET + i] = att; | ||
686 | } | ||
687 | } | ||
688 | |||
689 | int PDC_pair_content(short pair, short *fg, short *bg) | ||
690 | { | ||
691 | *fg = realtocurs[pdc_atrtab[pair * PDC_OFFSET] & 0x0F]; | ||
692 | *bg = realtocurs[(pdc_atrtab[pair * PDC_OFFSET] & 0xF0) >> 4]; | ||
693 | |||
694 | return OK; | ||
695 | } | ||
696 | |||
697 | /* _egapal() - Find the EGA palette value (0-63) for the color (0-15). | ||
698 | On VGA, this is an index into the DAC. */ | ||
699 | |||
700 | static short _egapal(short color) | ||
701 | { | ||
702 | PDCREGS regs; | ||
703 | |||
704 | regs.W.ax = 0x1007; | ||
705 | regs.h.bl = curstoreal[color]; | ||
706 | |||
707 | PDCINT(0x10, regs); | ||
708 | |||
709 | return regs.h.bh; | ||
710 | } | ||
711 | |||
712 | bool PDC_can_change_color(void) | ||
713 | { | ||
714 | return (pdc_adapter == _VGACOLOR); | ||
715 | } | ||
716 | |||
717 | /* These are only valid when pdc_adapter == _VGACOLOR */ | ||
718 | |||
719 | int PDC_color_content(short color, short *red, short *green, short *blue) | ||
720 | { | ||
721 | PDCREGS regs; | ||
722 | |||
723 | /* Read single DAC register */ | ||
724 | |||
725 | regs.W.ax = 0x1015; | ||
726 | regs.h.bl = _egapal(color); | ||
727 | |||
728 | PDCINT(0x10, regs); | ||
729 | |||
730 | /* Scale and store */ | ||
731 | |||
732 | *red = DIVROUND((unsigned)(regs.h.dh) * 1000, 63); | ||
733 | *green = DIVROUND((unsigned)(regs.h.ch) * 1000, 63); | ||
734 | *blue = DIVROUND((unsigned)(regs.h.cl) * 1000, 63); | ||
735 | |||
736 | return OK; | ||
737 | } | ||
738 | |||
739 | int PDC_init_color(short color, short red, short green, short blue) | ||
740 | { | ||
741 | PDCREGS regs; | ||
742 | |||
743 | /* Scale */ | ||
744 | |||
745 | regs.h.dh = DIVROUND((unsigned)red * 63, 1000); | ||
746 | regs.h.ch = DIVROUND((unsigned)green * 63, 1000); | ||
747 | regs.h.cl = DIVROUND((unsigned)blue * 63, 1000); | ||
748 | |||
749 | /* Set single DAC register */ | ||
750 | |||
751 | regs.W.ax = 0x1010; | ||
752 | regs.W.bx = _egapal(color); | ||
753 | |||
754 | PDCINT(0x10, regs); | ||
755 | |||
756 | return OK; | ||
757 | } |
File dos/pdcsetsc.c added (mode: 100644) (index 00000000..2180ef48) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcsetsc.c,v 1.39 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdcsetsc | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_set_blink(bool blinkon); | ||
13 | void PDC_set_title(const char *title); | ||
14 | |||
15 | Description: | ||
16 | PDC_set_blink() toggles whether the A_BLINK attribute sets an | ||
17 | actual blink mode (TRUE), or sets the background color to high | ||
18 | intensity (FALSE). The default is platform-dependent (FALSE in | ||
19 | most cases). It returns OK if it could set the state to match | ||
20 | the given parameter, ERR otherwise. Current platforms also | ||
21 | adjust the value of COLORS according to this function -- 16 for | ||
22 | FALSE, and 8 for TRUE. | ||
23 | |||
24 | PDC_set_title() sets the title of the window in which the curses | ||
25 | program is running. This function may not do anything on some | ||
26 | platforms. (Currently it only works in Win32 and X11.) | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | PDC_set_blink - - - | ||
30 | PDC_set_title - - - | ||
31 | |||
32 | **man-end****************************************************************/ | ||
33 | |||
34 | int PDC_curs_set(int visibility) | ||
35 | { | ||
36 | PDCREGS regs; | ||
37 | int ret_vis, start, end; | ||
38 | |||
39 | PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); | ||
40 | |||
41 | ret_vis = SP->visibility; | ||
42 | SP->visibility = visibility; | ||
43 | |||
44 | switch (visibility) | ||
45 | { | ||
46 | case 0: /* invisible */ | ||
47 | start = 32; | ||
48 | end = 0; /* was 32 */ | ||
49 | break; | ||
50 | case 2: /* highly visible */ | ||
51 | start = 0; /* full-height block */ | ||
52 | end = 7; | ||
53 | break; | ||
54 | default: /* normal visibility */ | ||
55 | start = (SP->orig_cursor >> 8) & 0xff; | ||
56 | end = SP->orig_cursor & 0xff; | ||
57 | } | ||
58 | |||
59 | /* if scrnmode is not set, some BIOSes hang */ | ||
60 | |||
61 | regs.h.ah = 0x01; | ||
62 | regs.h.al = (unsigned char)pdc_scrnmode; | ||
63 | regs.h.ch = (unsigned char)start; | ||
64 | regs.h.cl = (unsigned char)end; | ||
65 | PDCINT(0x10, regs); | ||
66 | |||
67 | return ret_vis; | ||
68 | } | ||
69 | |||
70 | void PDC_set_title(const char *title) | ||
71 | { | ||
72 | PDC_LOG(("PDC_set_title() - called: <%s>\n", title)); | ||
73 | } | ||
74 | |||
75 | int PDC_set_blink(bool blinkon) | ||
76 | { | ||
77 | PDCREGS regs; | ||
78 | |||
79 | switch (pdc_adapter) | ||
80 | { | ||
81 | case _EGACOLOR: | ||
82 | case _EGAMONO: | ||
83 | case _VGACOLOR: | ||
84 | case _VGAMONO: | ||
85 | regs.W.ax = 0x1003; | ||
86 | regs.W.bx = blinkon; | ||
87 | |||
88 | PDCINT(0x10, regs); | ||
89 | |||
90 | if (pdc_color_started) | ||
91 | COLORS = blinkon ? 8 : 16; | ||
92 | |||
93 | break; | ||
94 | default: | ||
95 | COLORS = 8; | ||
96 | } | ||
97 | |||
98 | return (COLORS - (blinkon * 8) != 8) ? OK : ERR; | ||
99 | } |
File dos/pdcutil.c added (mode: 100644) (index 00000000..b209352a) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcdos.h" | ||
4 | |||
5 | RCSID("$Id: pdcutil.c,v 1.24 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | void PDC_beep(void) | ||
8 | { | ||
9 | PDCREGS regs; | ||
10 | |||
11 | PDC_LOG(("PDC_beep() - called\n")); | ||
12 | |||
13 | regs.W.ax = 0x0e07; /* Write ^G in TTY fashion */ | ||
14 | regs.W.bx = 0; | ||
15 | PDCINT(0x10, regs); | ||
16 | } | ||
17 | |||
18 | void PDC_napms(int ms) | ||
19 | { | ||
20 | PDCREGS regs; | ||
21 | long goal, start, current; | ||
22 | |||
23 | PDC_LOG(("PDC_napms() - called: ms=%d\n", ms)); | ||
24 | |||
25 | goal = DIVROUND((long)ms, 50); | ||
26 | if (!goal) | ||
27 | goal++; | ||
28 | |||
29 | start = getdosmemdword(0x46c); | ||
30 | |||
31 | goal += start; | ||
32 | |||
33 | while (goal > (current = getdosmemdword(0x46c))) | ||
34 | { | ||
35 | if (current < start) /* in case of midnight reset */ | ||
36 | return; | ||
37 | |||
38 | regs.W.ax = 0x1680; | ||
39 | PDCINT(0x2f, regs); | ||
40 | PDCINT(0x28, regs); | ||
41 | } | ||
42 | } | ||
43 | |||
44 | const char *PDC_sysname(void) | ||
45 | { | ||
46 | return "DOS"; | ||
47 | } | ||
48 | |||
49 | #ifdef __DJGPP__ | ||
50 | |||
51 | unsigned char getdosmembyte(int offset) | ||
52 | { | ||
53 | unsigned char b; | ||
54 | |||
55 | dosmemget(offset, sizeof(unsigned char), &b); | ||
56 | return b; | ||
57 | } | ||
58 | |||
59 | unsigned short getdosmemword(int offset) | ||
60 | { | ||
61 | unsigned short w; | ||
62 | |||
63 | dosmemget(offset, sizeof(unsigned short), &w); | ||
64 | return w; | ||
65 | } | ||
66 | |||
67 | unsigned long getdosmemdword(int offset) | ||
68 | { | ||
69 | unsigned long dw; | ||
70 | |||
71 | dosmemget(offset, sizeof(unsigned long), &dw); | ||
72 | return dw; | ||
73 | } | ||
74 | |||
75 | void setdosmembyte(int offset, unsigned char b) | ||
76 | { | ||
77 | dosmemput(&b, sizeof(unsigned char), offset); | ||
78 | } | ||
79 | |||
80 | void setdosmemword(int offset, unsigned short w) | ||
81 | { | ||
82 | dosmemput(&w, sizeof(unsigned short), offset); | ||
83 | } | ||
84 | |||
85 | #endif | ||
86 | |||
87 | #if defined(__WATCOMC__) && defined(__386__) | ||
88 | |||
89 | void PDC_dpmi_int(int vector, pdc_dpmi_regs *rmregs) | ||
90 | { | ||
91 | union REGPACK regs = {0}; | ||
92 | |||
93 | rmregs->w.ss = 0; | ||
94 | rmregs->w.sp = 0; | ||
95 | rmregs->w.flags = 0; | ||
96 | |||
97 | regs.w.ax = 0x300; | ||
98 | regs.h.bl = vector; | ||
99 | regs.x.edi = FP_OFF(rmregs); | ||
100 | regs.x.es = FP_SEG(rmregs); | ||
101 | |||
102 | intr(0x31, ®s); | ||
103 | } | ||
104 | |||
105 | #endif |
File dos/wccdos16.mak added (mode: 100644) (index 00000000..a0cbb223) | |||
1 | # Watcom WMAKE Makefile for PDCurses library - DOS (16 bit) Watcom C/C++ 10.6+ | ||
2 | # | ||
3 | # Usage: wmake -f [path\]wccdos16.mak [DEBUG=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | # Change the memory MODEL here, if desired | ||
9 | MODEL = l | ||
10 | |||
11 | !ifdef %PDCURSES_SRCDIR | ||
12 | PDCURSES_SRCDIR = $(%PDCURSES_SRCDIR) | ||
13 | !else | ||
14 | PDCURSES_SRCDIR = .. | ||
15 | !endif | ||
16 | |||
17 | !include $(PDCURSES_SRCDIR)\version.mif | ||
18 | |||
19 | osdir = $(PDCURSES_SRCDIR)\dos | ||
20 | |||
21 | CC = wcc | ||
22 | TARGET = dos | ||
23 | |||
24 | CFLAGS = /bt=$(TARGET) /zq /wx /m$(MODEL) /i=$(PDCURSES_SRCDIR) | ||
25 | |||
26 | !ifeq DEBUG Y | ||
27 | CFLAGS += /d2 /DPDCDEBUG | ||
28 | LDFLAGS = D W A op q sys $(TARGET) | ||
29 | !else | ||
30 | CFLAGS += /oneatx | ||
31 | LDFLAGS = op q sys $(TARGET) | ||
32 | !endif | ||
33 | |||
34 | LIBEXE = wlib /q /n /t | ||
35 | |||
36 | !include $(PDCURSES_SRCDIR)\watcom.mif | ||
37 | |||
38 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
39 | %write wccdos.lrf $(LIBOBJS) $(PDCOBJS) | ||
40 | $(LIBEXE) $@ @wccdos.lrf | ||
41 | -del wccdos.lrf | ||
42 | -copy $(LIBCURSES) panel.lib | ||
43 | |||
44 | PLATFORM1 = Watcom C++ 16-bit DOS | ||
45 | PLATFORM2 = Open Watcom 1.6 for 16-bit DOS | ||
46 | ARCNAME = pdc$(VER)16w | ||
47 | |||
48 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File dos/wccdos4g.mak added (mode: 100644) (index 00000000..e1ba1cde) | |||
1 | # Watcom WMAKE Makefile for PDCurses library - DOS/4GW Watcom C/C++ 10.6+ | ||
2 | # | ||
3 | # Usage: wmake -f [path\]wccdos4g.mak [DEBUG=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | !ifdef %PDCURSES_SRCDIR | ||
9 | PDCURSES_SRCDIR = $(%PDCURSES_SRCDIR) | ||
10 | !else | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | |||
16 | osdir = $(PDCURSES_SRCDIR)\dos | ||
17 | |||
18 | CC = wcc386 | ||
19 | TARGET = dos4g | ||
20 | |||
21 | CFLAGS = /bt=$(TARGET) /zq /wx /mf /i=$(PDCURSES_SRCDIR) | ||
22 | |||
23 | !ifeq DEBUG Y | ||
24 | CFLAGS += /d2 /DPDCDEBUG | ||
25 | LDFLAGS = D W A op q sys $(TARGET) | ||
26 | !else | ||
27 | CFLAGS += /oneatx | ||
28 | LDFLAGS = op q sys $(TARGET) | ||
29 | !endif | ||
30 | |||
31 | LIBEXE = wlib /q /n /t | ||
32 | |||
33 | !include $(PDCURSES_SRCDIR)\watcom.mif | ||
34 | |||
35 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
36 | %write wccdos.lrf $(LIBOBJS) $(PDCOBJS) | ||
37 | $(LIBEXE) $@ @wccdos.lrf | ||
38 | -del wccdos.lrf | ||
39 | -copy $(LIBCURSES) panel.lib | ||
40 | |||
41 | PLATFORM1 = Watcom C++ 32-bit DOS | ||
42 | PLATFORM2 = Open Watcom 1.6 for 32-bit DOS | ||
43 | ARCNAME = pdc$(VER)32w | ||
44 | |||
45 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File exp-base.def added (mode: 100644) (index 00000000..222b1339) | |||
1 | LINES | ||
2 | COLS | ||
3 | stdscr | ||
4 | curscr | ||
5 | SP | ||
6 | Mouse_status | ||
7 | COLORS | ||
8 | COLOR_PAIRS | ||
9 | TABSIZE | ||
10 | acs_map | ||
11 | ttytype | ||
12 | addch | ||
13 | addchnstr | ||
14 | addchstr | ||
15 | addnstr | ||
16 | addstr | ||
17 | attroff | ||
18 | attron | ||
19 | attrset | ||
20 | attr_get | ||
21 | attr_off | ||
22 | attr_on | ||
23 | attr_set | ||
24 | baudrate | ||
25 | beep | ||
26 | bkgd | ||
27 | bkgdset | ||
28 | border | ||
29 | box | ||
30 | can_change_color | ||
31 | cbreak | ||
32 | chgat | ||
33 | clearok | ||
34 | clear | ||
35 | clrtobot | ||
36 | clrtoeol | ||
37 | color_content | ||
38 | color_set | ||
39 | copywin | ||
40 | curs_set | ||
41 | def_prog_mode | ||
42 | def_shell_mode | ||
43 | delay_output | ||
44 | delch | ||
45 | deleteln | ||
46 | delscreen | ||
47 | delwin | ||
48 | derwin | ||
49 | doupdate | ||
50 | dupwin | ||
51 | echochar | ||
52 | echo | ||
53 | endwin | ||
54 | erasechar | ||
55 | erase | ||
56 | filter | ||
57 | flash | ||
58 | flushinp | ||
59 | getbkgd | ||
60 | getnstr | ||
61 | getstr | ||
62 | getwin | ||
63 | halfdelay | ||
64 | has_colors | ||
65 | has_ic | ||
66 | has_il | ||
67 | hline | ||
68 | idcok | ||
69 | idlok | ||
70 | immedok | ||
71 | inchnstr | ||
72 | inchstr | ||
73 | inch | ||
74 | init_color | ||
75 | init_pair | ||
76 | initscr | ||
77 | innstr | ||
78 | insch | ||
79 | insdelln | ||
80 | insertln | ||
81 | insnstr | ||
82 | insstr | ||
83 | instr | ||
84 | intrflush | ||
85 | isendwin | ||
86 | is_linetouched | ||
87 | is_wintouched | ||
88 | keyname | ||
89 | keypad | ||
90 | killchar | ||
91 | leaveok | ||
92 | longname | ||
93 | meta | ||
94 | move | ||
95 | mvaddch | ||
96 | mvaddchnstr | ||
97 | mvaddchstr | ||
98 | mvaddnstr | ||
99 | mvaddstr | ||
100 | mvchgat | ||
101 | mvcur | ||
102 | mvdelch | ||
103 | mvderwin | ||
104 | mvgetch | ||
105 | mvgetnstr | ||
106 | mvgetstr | ||
107 | mvhline | ||
108 | mvinch | ||
109 | mvinchnstr | ||
110 | mvinchstr | ||
111 | mvinnstr | ||
112 | mvinsch | ||
113 | mvinsnstr | ||
114 | mvinsstr | ||
115 | mvinstr | ||
116 | mvprintw | ||
117 | mvscanw | ||
118 | mvvline | ||
119 | mvwaddchnstr | ||
120 | mvwaddchstr | ||
121 | mvwaddch | ||
122 | mvwaddnstr | ||
123 | mvwaddstr | ||
124 | mvwchgat | ||
125 | mvwdelch | ||
126 | mvwgetch | ||
127 | mvwgetnstr | ||
128 | mvwgetstr | ||
129 | mvwhline | ||
130 | mvwinchnstr | ||
131 | mvwinchstr | ||
132 | mvwinch | ||
133 | mvwinnstr | ||
134 | mvwinsch | ||
135 | mvwinsnstr | ||
136 | mvwinsstr | ||
137 | mvwinstr | ||
138 | mvwin | ||
139 | mvwprintw | ||
140 | mvwscanw | ||
141 | mvwvline | ||
142 | napms | ||
143 | newpad | ||
144 | newterm | ||
145 | newwin | ||
146 | nl | ||
147 | nocbreak | ||
148 | nodelay | ||
149 | noecho | ||
150 | nonl | ||
151 | noqiflush | ||
152 | noraw | ||
153 | notimeout | ||
154 | overlay | ||
155 | overwrite | ||
156 | pair_content | ||
157 | pechochar | ||
158 | pnoutrefresh | ||
159 | prefresh | ||
160 | printw | ||
161 | putwin | ||
162 | qiflush | ||
163 | raw | ||
164 | redrawwin | ||
165 | refresh | ||
166 | reset_prog_mode | ||
167 | reset_shell_mode | ||
168 | resetty | ||
169 | ripoffline | ||
170 | savetty | ||
171 | scanw | ||
172 | scr_dump | ||
173 | scr_init | ||
174 | scrl | ||
175 | scrollok | ||
176 | scroll | ||
177 | scr_restore | ||
178 | scr_set | ||
179 | setscrreg | ||
180 | setsyx | ||
181 | set_term | ||
182 | slk_attroff | ||
183 | slk_attr_off | ||
184 | slk_attron | ||
185 | slk_attr_on | ||
186 | slk_attrset | ||
187 | slk_attr_set | ||
188 | slk_clear | ||
189 | slk_color | ||
190 | slk_init | ||
191 | slk_label | ||
192 | slk_noutrefresh | ||
193 | slk_refresh | ||
194 | slk_restore | ||
195 | slk_set | ||
196 | slk_touch | ||
197 | standend | ||
198 | standout | ||
199 | start_color | ||
200 | subpad | ||
201 | subwin | ||
202 | syncok | ||
203 | termattrs | ||
204 | term_attrs | ||
205 | termname | ||
206 | timeout | ||
207 | touchline | ||
208 | touchwin | ||
209 | typeahead | ||
210 | untouchwin | ||
211 | use_env | ||
212 | vidattr | ||
213 | vid_attr | ||
214 | vidputs | ||
215 | vid_puts | ||
216 | vline | ||
217 | vw_printw | ||
218 | vwprintw | ||
219 | vw_scanw | ||
220 | vwscanw | ||
221 | waddchnstr | ||
222 | waddchstr | ||
223 | waddch | ||
224 | waddnstr | ||
225 | waddstr | ||
226 | wattroff | ||
227 | wattron | ||
228 | wattrset | ||
229 | wattr_get | ||
230 | wattr_off | ||
231 | wattr_on | ||
232 | wattr_set | ||
233 | wbkgdset | ||
234 | wbkgd | ||
235 | wborder | ||
236 | wchgat | ||
237 | wclear | ||
238 | wclrtobot | ||
239 | wclrtoeol | ||
240 | wcolor_set | ||
241 | wcursyncup | ||
242 | wdelch | ||
243 | wdeleteln | ||
244 | wechochar | ||
245 | werase | ||
246 | wgetch | ||
247 | wgetnstr | ||
248 | wgetstr | ||
249 | whline | ||
250 | winchnstr | ||
251 | winchstr | ||
252 | winch | ||
253 | winnstr | ||
254 | winsch | ||
255 | winsdelln | ||
256 | winsertln | ||
257 | winsnstr | ||
258 | winsstr | ||
259 | winstr | ||
260 | wmove | ||
261 | wnoutrefresh | ||
262 | wprintw | ||
263 | wredrawln | ||
264 | wrefresh | ||
265 | wscanw | ||
266 | wscrl | ||
267 | wsetscrreg | ||
268 | wstandend | ||
269 | wstandout | ||
270 | wsyncdown | ||
271 | wsyncup | ||
272 | wtimeout | ||
273 | wtouchln | ||
274 | wvline | ||
275 | getattrs | ||
276 | getbegx | ||
277 | getbegy | ||
278 | getmaxx | ||
279 | getmaxy | ||
280 | getparx | ||
281 | getpary | ||
282 | getcurx | ||
283 | getcury | ||
284 | traceoff | ||
285 | traceon | ||
286 | unctrl | ||
287 | crmode | ||
288 | nocrmode | ||
289 | draino | ||
290 | resetterm | ||
291 | fixterm | ||
292 | saveterm | ||
293 | mouse_set | ||
294 | mouse_on | ||
295 | mouse_off | ||
296 | request_mouse_pos | ||
297 | map_button | ||
298 | wmouse_position | ||
299 | getmouse | ||
300 | getbmap | ||
301 | assume_default_colors | ||
302 | curses_version | ||
303 | has_key | ||
304 | use_default_colors | ||
305 | wresize | ||
306 | mouseinterval | ||
307 | mousemask | ||
308 | mouse_trafo | ||
309 | nc_getmouse | ||
310 | ungetmouse | ||
311 | wenclose | ||
312 | wmouse_trafo | ||
313 | addrawch | ||
314 | insrawch | ||
315 | is_termresized | ||
316 | mvaddrawch | ||
317 | mvdeleteln | ||
318 | mvinsertln | ||
319 | mvinsrawch | ||
320 | mvwaddrawch | ||
321 | mvwdeleteln | ||
322 | mvwinsertln | ||
323 | mvwinsrawch | ||
324 | raw_output | ||
325 | resize_term | ||
326 | resize_window | ||
327 | waddrawch | ||
328 | winsrawch | ||
329 | wordchar | ||
330 | bottom_panel | ||
331 | del_panel | ||
332 | hide_panel | ||
333 | move_panel | ||
334 | new_panel | ||
335 | panel_above | ||
336 | panel_below | ||
337 | panel_hidden | ||
338 | panel_userptr | ||
339 | panel_window | ||
340 | replace_panel | ||
341 | set_panel_userptr | ||
342 | show_panel | ||
343 | top_panel | ||
344 | update_panels | ||
345 | PDC_debug | ||
346 | PDC_ungetch | ||
347 | PDC_set_blink | ||
348 | PDC_set_line_color | ||
349 | PDC_set_title | ||
350 | PDC_clearclipboard | ||
351 | PDC_freeclipboard | ||
352 | PDC_getclipboard | ||
353 | PDC_setclipboard | ||
354 | PDC_get_input_fd | ||
355 | PDC_get_key_modifiers | ||
356 | PDC_save_key_modifiers | ||
357 | PDC_return_key_modifiers | ||
358 | cur_term | ||
359 | del_curterm | ||
360 | putp | ||
361 | restartterm | ||
362 | set_curterm | ||
363 | setterm | ||
364 | setupterm | ||
365 | tgetent | ||
366 | tgetflag | ||
367 | tgetnum | ||
368 | tgetstr | ||
369 | tgoto | ||
370 | tigetflag | ||
371 | tigetnum | ||
372 | tigetstr | ||
373 | tparm | ||
374 | tputs |
File exp-wide.def added (mode: 100644) (index 00000000..ebf6bc20) | |||
1 | addnwstr | ||
2 | addwstr | ||
3 | add_wch | ||
4 | add_wchnstr | ||
5 | add_wchstr | ||
6 | border_set | ||
7 | box_set | ||
8 | echo_wchar | ||
9 | erasewchar | ||
10 | getbkgrnd | ||
11 | getcchar | ||
12 | getn_wstr | ||
13 | get_wch | ||
14 | get_wstr | ||
15 | hline_set | ||
16 | innwstr | ||
17 | ins_nwstr | ||
18 | ins_wch | ||
19 | ins_wstr | ||
20 | inwstr | ||
21 | in_wch | ||
22 | in_wchnstr | ||
23 | in_wchstr | ||
24 | key_name | ||
25 | killwchar | ||
26 | mvaddnwstr | ||
27 | mvaddwstr | ||
28 | mvadd_wch | ||
29 | mvadd_wchnstr | ||
30 | mvadd_wchstr | ||
31 | mvgetn_wstr | ||
32 | mvget_wch | ||
33 | mvget_wstr | ||
34 | mvhline_set | ||
35 | mvinnwstr | ||
36 | mvins_nwstr | ||
37 | mvins_wch | ||
38 | mvins_wstr | ||
39 | mvinwstr | ||
40 | mvin_wch | ||
41 | mvin_wchnstr | ||
42 | mvin_wchstr | ||
43 | mvvline_set | ||
44 | mvwaddnwstr | ||
45 | mvwaddwstr | ||
46 | mvwadd_wch | ||
47 | mvwadd_wchnstr | ||
48 | mvwadd_wchstr | ||
49 | mvwgetn_wstr | ||
50 | mvwget_wch | ||
51 | mvwget_wstr | ||
52 | mvwhline_set | ||
53 | mvwinnwstr | ||
54 | mvwins_nwstr | ||
55 | mvwins_wch | ||
56 | mvwins_wstr | ||
57 | mvwin_wch | ||
58 | mvwin_wchnstr | ||
59 | mvwin_wchstr | ||
60 | mvwinwstr | ||
61 | mvwvline_set | ||
62 | pecho_wchar | ||
63 | setcchar | ||
64 | slk_wset | ||
65 | unget_wch | ||
66 | vline_set | ||
67 | waddnwstr | ||
68 | waddwstr | ||
69 | wadd_wch | ||
70 | wadd_wchnstr | ||
71 | wadd_wchstr | ||
72 | wbkgrnd | ||
73 | wbkgrndset | ||
74 | wborder_set | ||
75 | wecho_wchar | ||
76 | wgetbkgrnd | ||
77 | wgetn_wstr | ||
78 | wget_wch | ||
79 | wget_wstr | ||
80 | whline_set | ||
81 | winnwstr | ||
82 | wins_nwstr | ||
83 | wins_wch | ||
84 | wins_wstr | ||
85 | winwstr | ||
86 | win_wch | ||
87 | win_wchnstr | ||
88 | win_wchstr | ||
89 | wunctrl | ||
90 | wvline_set |
File install-sh added (mode: 100755) (index 00000000..fb9e848a) | |||
1 | #! /bin/sh | ||
2 | # | ||
3 | # install - install a program, script, or datafile | ||
4 | # This comes from X11R5 (mit/util/scripts/install.sh). | ||
5 | # | ||
6 | # Copyright 1991 by the Massachusetts Institute of Technology | ||
7 | # | ||
8 | # Permission to use, copy, modify, distribute, and sell this software and its | ||
9 | # documentation for any purpose is hereby granted without fee, provided that | ||
10 | # the above copyright notice appear in all copies and that both that | ||
11 | # copyright notice and this permission notice appear in supporting | ||
12 | # documentation, and that the name of M.I.T. not be used in advertising or | ||
13 | # publicity pertaining to distribution of the software without specific, | ||
14 | # written prior permission. M.I.T. makes no representations about the | ||
15 | # suitability of this software for any purpose. It is provided "as is" | ||
16 | # without express or implied warranty. | ||
17 | # | ||
18 | # Calling this script install-sh is preferred over install.sh, to prevent | ||
19 | # `make' implicit rules from creating a file called install from it | ||
20 | # when there is no Makefile. | ||
21 | # | ||
22 | # This script is compatible with the BSD install script, but was written | ||
23 | # from scratch. It can only install one file at a time, a restriction | ||
24 | # shared with many OS's install programs. | ||
25 | |||
26 | |||
27 | # set DOITPROG to echo to test this script | ||
28 | |||
29 | # Don't use :- since 4.3BSD and earlier shells don't like it. | ||
30 | # | ||
31 | # Modified 1 Feb 2000 MHES to cater for mkdir -p | ||
32 | # | ||
33 | doit="${DOITPROG-}" | ||
34 | |||
35 | |||
36 | # put in absolute paths if you don't have them in your path; or use env. vars. | ||
37 | |||
38 | mvprog="${MVPROG-mv}" | ||
39 | cpprog="${CPPROG-cp}" | ||
40 | chmodprog="${CHMODPROG-chmod}" | ||
41 | chownprog="${CHOWNPROG-chown}" | ||
42 | chgrpprog="${CHGRPPROG-chgrp}" | ||
43 | stripprog="${STRIPPROG-strip}" | ||
44 | rmprog="${RMPROG-rm}" | ||
45 | mkdirprog="${MKDIRPROG-mkdir}" | ||
46 | |||
47 | transformbasename="" | ||
48 | transform_arg="" | ||
49 | instcmd="$mvprog" | ||
50 | chmodcmd="$chmodprog 0755" | ||
51 | chowncmd="" | ||
52 | chgrpcmd="" | ||
53 | stripcmd="" | ||
54 | rmcmd="$rmprog -f" | ||
55 | mvcmd="$mvprog" | ||
56 | mkdircmd="$mkdirprog -p" | ||
57 | src="" | ||
58 | dst="" | ||
59 | dir_arg="" | ||
60 | |||
61 | while [ x"$1" != x ]; do | ||
62 | case $1 in | ||
63 | -c) instcmd="$cpprog" | ||
64 | shift | ||
65 | continue;; | ||
66 | |||
67 | -d) dir_arg=true | ||
68 | shift | ||
69 | continue;; | ||
70 | |||
71 | -m) chmodcmd="$chmodprog $2" | ||
72 | shift | ||
73 | shift | ||
74 | continue;; | ||
75 | |||
76 | -o) chowncmd="$chownprog $2" | ||
77 | shift | ||
78 | shift | ||
79 | continue;; | ||
80 | |||
81 | -g) chgrpcmd="$chgrpprog $2" | ||
82 | shift | ||
83 | shift | ||
84 | continue;; | ||
85 | |||
86 | -s) stripcmd="$stripprog" | ||
87 | shift | ||
88 | continue;; | ||
89 | |||
90 | -t=*) transformarg=`echo $1 | sed 's/-t=//'` | ||
91 | shift | ||
92 | continue;; | ||
93 | |||
94 | -b=*) transformbasename=`echo $1 | sed 's/-b=//'` | ||
95 | shift | ||
96 | continue;; | ||
97 | |||
98 | *) if [ x"$src" = x ] | ||
99 | then | ||
100 | src=$1 | ||
101 | else | ||
102 | # this colon is to work around a 386BSD /bin/sh bug | ||
103 | : | ||
104 | dst=$1 | ||
105 | fi | ||
106 | shift | ||
107 | continue;; | ||
108 | esac | ||
109 | done | ||
110 | |||
111 | if [ x"$src" = x ] | ||
112 | then | ||
113 | echo "install: no input file specified" | ||
114 | exit 1 | ||
115 | else | ||
116 | true | ||
117 | fi | ||
118 | |||
119 | if [ x"$dir_arg" != x ]; then | ||
120 | dst=$src | ||
121 | src="" | ||
122 | |||
123 | if [ -d $dst ]; then | ||
124 | instcmd=: | ||
125 | else | ||
126 | instcmd=mkdir | ||
127 | fi | ||
128 | else | ||
129 | |||
130 | # Waiting for this to be detected by the "$instcmd $src $dsttmp" command | ||
131 | # might cause directories to be created, which would be especially bad | ||
132 | # if $src (and thus $dsttmp) contains '*'. | ||
133 | |||
134 | if [ -f $src -o -d $src ] | ||
135 | then | ||
136 | true | ||
137 | else | ||
138 | echo "install: $src does not exist" | ||
139 | exit 1 | ||
140 | fi | ||
141 | |||
142 | if [ x"$dst" = x ] | ||
143 | then | ||
144 | echo "install: no destination specified" | ||
145 | exit 1 | ||
146 | else | ||
147 | true | ||
148 | fi | ||
149 | |||
150 | # If destination is a directory, append the input filename; if your system | ||
151 | # does not like double slashes in filenames, you may need to add some logic | ||
152 | |||
153 | if [ -d $dst ] | ||
154 | then | ||
155 | dst="$dst"/`basename $src` | ||
156 | else | ||
157 | true | ||
158 | fi | ||
159 | fi | ||
160 | |||
161 | ## this sed command emulates the dirname command | ||
162 | dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` | ||
163 | |||
164 | # Make sure that the destination directory exists. | ||
165 | # this part is taken from Noah Friedman's mkinstalldirs script | ||
166 | |||
167 | # Skip lots of stat calls in the usual case. | ||
168 | if [ ! -d "$dstdir" ]; then | ||
169 | defaultIFS=' | ||
170 | ' | ||
171 | IFS="${IFS-${defaultIFS}}" | ||
172 | |||
173 | oIFS="${IFS}" | ||
174 | # Some sh's can't handle IFS=/ for some reason. | ||
175 | IFS='%' | ||
176 | set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` | ||
177 | IFS="${oIFS}" | ||
178 | |||
179 | pathcomp='' | ||
180 | |||
181 | while [ $# -ne 0 ] ; do | ||
182 | pathcomp="${pathcomp}${1}" | ||
183 | shift | ||
184 | |||
185 | if [ ! -d "${pathcomp}" ] ; | ||
186 | then | ||
187 | $mkdircmd "${pathcomp}" | ||
188 | else | ||
189 | true | ||
190 | fi | ||
191 | |||
192 | pathcomp="${pathcomp}/" | ||
193 | done | ||
194 | fi | ||
195 | |||
196 | if [ x"$dir_arg" != x ] | ||
197 | then | ||
198 | $doit $instcmd $dst && | ||
199 | |||
200 | if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && | ||
201 | if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && | ||
202 | if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && | ||
203 | if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi | ||
204 | else | ||
205 | |||
206 | # If we're going to rename the final executable, determine the name now. | ||
207 | |||
208 | if [ x"$transformarg" = x ] | ||
209 | then | ||
210 | dstfile=`basename $dst` | ||
211 | else | ||
212 | dstfile=`basename $dst $transformbasename | | ||
213 | sed $transformarg`$transformbasename | ||
214 | fi | ||
215 | |||
216 | # don't allow the sed command to completely eliminate the filename | ||
217 | |||
218 | if [ x"$dstfile" = x ] | ||
219 | then | ||
220 | dstfile=`basename $dst` | ||
221 | else | ||
222 | true | ||
223 | fi | ||
224 | |||
225 | # Make a temp file name in the proper directory. | ||
226 | |||
227 | dsttmp=$dstdir/#inst.$$# | ||
228 | |||
229 | # Move or copy the file name to the temp name | ||
230 | |||
231 | $doit $instcmd $src $dsttmp && | ||
232 | |||
233 | trap "rm -f ${dsttmp}" 0 && | ||
234 | |||
235 | # and set any options; do chmod last to preserve setuid bits | ||
236 | |||
237 | # If any of these fail, we abort the whole thing. If we want to | ||
238 | # ignore errors from any of these, just make sure not to ignore | ||
239 | # errors from the above "$doit $instcmd $src $dsttmp" command. | ||
240 | |||
241 | if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && | ||
242 | if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && | ||
243 | if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && | ||
244 | if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && | ||
245 | |||
246 | # Now rename the file to the real destination. | ||
247 | |||
248 | $doit $rmcmd -f $dstdir/$dstfile && | ||
249 | $doit $mvcmd $dsttmp $dstdir/$dstfile | ||
250 | |||
251 | fi && | ||
252 | |||
253 | exit 0 |
File libobjs.mif added (mode: 100644) (index 00000000..67053235) | |||
1 | # Common elements for most of the DOS, OS/2 and Win32 | ||
2 | # makefiles (not Watcom or LCC) | ||
3 | |||
4 | PDCURSES_CURSES_H = $(PDCURSES_SRCDIR)/curses.h | ||
5 | PDCURSES_CURSPRIV_H = $(PDCURSES_SRCDIR)/curspriv.h | ||
6 | PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) | ||
7 | PANEL_HEADER = $(PDCURSES_SRCDIR)/panel.h | ||
8 | TERM_HEADER = $(PDCURSES_SRCDIR)/term.h | ||
9 | |||
10 | srcdir = $(PDCURSES_SRCDIR)/pdcurses | ||
11 | demodir = $(PDCURSES_SRCDIR)/demos | ||
12 | |||
13 | LIBOBJS = addch.$(O) addchstr.$(O) addstr.$(O) attr.$(O) beep.$(O) \ | ||
14 | bkgd.$(O) border.$(O) clear.$(O) color.$(O) delch.$(O) deleteln.$(O) \ | ||
15 | deprec.$(O) getch.$(O) getstr.$(O) getyx.$(O) inch.$(O) inchstr.$(O) \ | ||
16 | initscr.$(O) inopts.$(O) insch.$(O) insstr.$(O) instr.$(O) kernel.$(O) \ | ||
17 | keyname.$(O) mouse.$(O) move.$(O) outopts.$(O) overlay.$(O) pad.$(O) \ | ||
18 | panel.$(O) printw.$(O) refresh.$(O) scanw.$(O) scr_dump.$(O) scroll.$(O) \ | ||
19 | slk.$(O) termattr.$(O) terminfo.$(O) touch.$(O) util.$(O) window.$(O) \ | ||
20 | debug.$(O) | ||
21 | |||
22 | PDCOBJS = pdcclip.$(O) pdcdisp.$(O) pdcgetsc.$(O) pdckbd.$(O) pdcscrn.$(O) \ | ||
23 | pdcsetsc.$(O) pdcutil.$(O) | ||
24 | |||
25 | DEMOS = testcurs.exe newdemo.exe xmas.exe tuidemo.exe firework.exe \ | ||
26 | ptest.exe rain.exe worm.exe |
File makedist.mif added (mode: 100644) (index 00000000..e7495a50) | |||
1 | # Makefile include: build a binary archive with Info-ZIP | ||
2 | # under DOS, OS/2 or Win32 | ||
3 | |||
4 | dist: $(PDCLIBS) | ||
5 | echo PDCurses $(VERDOT) for $(PLATFORM1) > file_id.diz | ||
6 | echo ------------------------------------------ >> file_id.diz | ||
7 | echo Public Domain Curses library for >> file_id.diz | ||
8 | echo $(PLATFORM2). >> file_id.diz | ||
9 | echo Source available in PDCURS$(VER).ZIP >> file_id.diz | ||
10 | echo Public Domain. >> file_id.diz | ||
11 | echo $(PDCURSES_SRCDIR)\README > flist | ||
12 | echo $(PDCURSES_SRCDIR)\HISTORY >> flist | ||
13 | echo $(PDCURSES_SRCDIR)\curses.h >> flist | ||
14 | echo $(PDCURSES_SRCDIR)\panel.h >> flist | ||
15 | echo $(PDCURSES_SRCDIR)\term.h >> flist | ||
16 | echo $(LIBCURSES) >> flist | ||
17 | echo file_id.diz >> flist | ||
18 | zip -9jX $(ARCNAME) -@ <flist | ||
19 | del flist | ||
20 | del file_id.diz |
File os2/README added (mode: 100644) (index 00000000..7fde884e) | |||
1 | PDCurses for OS/2 | ||
2 | ================= | ||
3 | |||
4 | This directory contains PDCurses source code files specific to OS/2. | ||
5 | |||
6 | |||
7 | Building | ||
8 | -------- | ||
9 | |||
10 | . Choose the appropriate makefile for your compiler: | ||
11 | |||
12 | bccos2.mak - Borland C++ 2.0 | ||
13 | gccos2.mak - EMX 0.9b+ | ||
14 | iccos2.mak - C Set/2 | ||
15 | wccos2.mak - Watcom 10.6+ (32-bit) | ||
16 | |||
17 | . Optionally, you can build in a different directory than the platform | ||
18 | directory by setting PDCURSES_SRCDIR to point to the directory where | ||
19 | you unpacked PDCurses, and changing to your target directory: | ||
20 | |||
21 | set PDCURSES_SRCDIR=c:\pdcurses | ||
22 | |||
23 | . Build it: | ||
24 | |||
25 | make -f makefilename | ||
26 | |||
27 | (For Watcom, use "wmake" instead of "make"; for MSVC or C Set/2, | ||
28 | "nmake".) You'll get the libraries (pdcurses.lib or .a, depending on | ||
29 | your compiler; and panel.lib or .a), the demos (*.exe), and a lot of | ||
30 | object files. Note that the panel library is just a copy of the main | ||
31 | library, provided for convenience; both panel and curses functions are | ||
32 | in the main library. | ||
33 | |||
34 | You can also use the optional parameter "DLL=Y" with EMX, to build the | ||
35 | library as a DLL: | ||
36 | |||
37 | make -f gccos2.mak DLL=Y | ||
38 | |||
39 | |||
40 | Distribution Status | ||
41 | ------------------- | ||
42 | |||
43 | The files in this directory are released to the Public Domain. |
File os2/bccos2.mak added (mode: 100644) (index 00000000..1c7d77a3) | |||
1 | # Borland MAKE Makefile for PDCurses library - OS/2 BC++ 1.0+ | ||
2 | # | ||
3 | # Usage: make -f [path\]bccos2.mak [DEBUG=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | O = obj | ||
9 | |||
10 | !ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)\os2 | ||
18 | |||
19 | CC = bcc | ||
20 | |||
21 | !ifdef DEBUG | ||
22 | CFLAGS = -N -v -y -DPDCDEBUG | ||
23 | !else | ||
24 | CFLAGS = -O | ||
25 | !endif | ||
26 | |||
27 | CPPFLAGS = -I$(PDCURSES_SRCDIR) | ||
28 | |||
29 | BUILD = $(CC) -c $(CFLAGS) $(CPPFLAGS) | ||
30 | |||
31 | LINK = tlink | ||
32 | |||
33 | LIBEXE = tlib /C /E | ||
34 | |||
35 | LIBCURSES = pdcurses.lib | ||
36 | |||
37 | all: $(LIBCURSES) $(DEMOS) | ||
38 | |||
39 | clean: | ||
40 | -del *.obj | ||
41 | -del *.lib | ||
42 | -del *.exe | ||
43 | |||
44 | demos: $(DEMOS) | ||
45 | |||
46 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
47 | -del $@ | ||
48 | $(LIBEXE) $@ \ | ||
49 | +addch.obj +addchstr.obj +addstr.obj +attr.obj +beep.obj +bkgd.obj \ | ||
50 | +border.obj +clear.obj +color.obj +delch.obj +deleteln.obj +deprec.obj \ | ||
51 | +getch.obj +getstr.obj +getyx.obj +inch.obj +inchstr.obj +initscr.obj \ | ||
52 | +inopts.obj +insch.obj +insstr.obj +instr.obj +kernel.obj +keyname.obj \ | ||
53 | +mouse.obj +move.obj +outopts.obj +overlay.obj +pad.obj +panel.obj \ | ||
54 | +printw.obj +refresh.obj +scanw.obj +scr_dump.obj +scroll.obj +slk.obj \ | ||
55 | +termattr.obj +terminfo.obj +touch.obj +util.obj +window.obj +debug.obj \ | ||
56 | +pdcclip.obj +pdcdisp.obj +pdcgetsc.obj +pdckbd.obj +pdcscrn.obj \ | ||
57 | +pdcsetsc.obj +pdcutil.obj ,lib.map | ||
58 | -copy $(LIBCURSES) panel.lib | ||
59 | |||
60 | .autodepend | ||
61 | |||
62 | {$(srcdir)\}.c.obj: | ||
63 | $(BUILD) $< | ||
64 | |||
65 | {$(osdir)\}.c.obj: | ||
66 | $(BUILD) $< | ||
67 | |||
68 | {$(demodir)\}.c.obj: | ||
69 | $(BUILD) $< | ||
70 | |||
71 | .c.obj: | ||
72 | $(BUILD) $< | ||
73 | |||
74 | .obj.exe: | ||
75 | $(CC) -e$@ $** $(LIBCURSES) | ||
76 | |||
77 | tuidemo.exe: tuidemo.obj tui.obj $(LIBCURSES) | ||
78 | $(CC) -e$@ $** | ||
79 | |||
80 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h $(PDCURSES_CURSES_H) | ||
81 | $(BUILD) -I$(demodir) $(demodir)\tui.c | ||
82 | |||
83 | tuidemo.obj: $(demodir)\tuidemo.c $(PDCURSES_CURSES_H) | ||
84 | $(BUILD) -I$(demodir) $(demodir)\tuidemo.c | ||
85 | |||
86 | PLATFORM1 = Borland C++ OS/2 1.0 | ||
87 | PLATFORM2 = Borland C/C++ OS/2 1.0 | ||
88 | ARCNAME = pdc$(VER)bcos2 | ||
89 | |||
90 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File os2/gccos2.mak added (mode: 100644) (index 00000000..07d4dca4) | |||
1 | # GNU MAKE Makefile for PDCurses library - OS/2 emx 0.9c+ | ||
2 | # | ||
3 | # Usage: make -f [path\]gccos2.mak [DEBUG=Y] [EMXVIDEO=Y] [DLL=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.a|testcurs.exe...] | ||
7 | # | ||
8 | # The EMXVIDEO option compiles with the emx video library, which | ||
9 | # enables a PDCurses program to run under OS/2 and DOS. | ||
10 | |||
11 | O = o | ||
12 | |||
13 | ifndef PDCURSES_SRCDIR | ||
14 | PDCURSES_SRCDIR = .. | ||
15 | endif | ||
16 | |||
17 | include $(PDCURSES_SRCDIR)/version.mif | ||
18 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
19 | |||
20 | osdir = $(PDCURSES_SRCDIR)/os2 | ||
21 | |||
22 | PDCURSES_OS2_H = $(osdir)/pdcos2.h | ||
23 | |||
24 | CC = gcc | ||
25 | |||
26 | CFLAGS = -I$(PDCURSES_SRCDIR) -c -Wall | ||
27 | |||
28 | ifeq ($(EMXVIDEO),Y) | ||
29 | CFLAGS += -DEMXVIDEO | ||
30 | CCLIBS = -lvideo | ||
31 | BINDFLAGS = -acm | ||
32 | else | ||
33 | CCLIBS = | ||
34 | BINDFLAGS = | ||
35 | endif | ||
36 | |||
37 | ifeq ($(DEBUG),Y) | ||
38 | CFLAGS += -g -DPDCDEBUG | ||
39 | LDFLAGS = -g | ||
40 | else | ||
41 | CFLAGS += -O2 | ||
42 | LDFLAGS = | ||
43 | endif | ||
44 | |||
45 | BASEDEF = $(PDCURSES_SRCDIR)\exp-base.def | ||
46 | |||
47 | DEFDEPS = $(BASEDEF) | ||
48 | |||
49 | DEFFILE = pdcurses.def | ||
50 | |||
51 | DLLTARGET = pdcurses.dll | ||
52 | DLLFLAGS = -Zdll -Zcrtdll -Zomf | ||
53 | |||
54 | LINK = gcc | ||
55 | EMXBIND = emxbind | ||
56 | EMXOMF = emxomf | ||
57 | |||
58 | LIBEXE = ar | ||
59 | LIBFLAGS = rcv | ||
60 | |||
61 | ifeq ($(DLL),Y) | ||
62 | CFLAGS += -Zdll -Zcrtdll -Zomf | ||
63 | LDFLAGS += -Zlinker /PM:VIO -Zomf -Zcrtdll | ||
64 | LIBCURSES = pdcurses.lib | ||
65 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) $(DEFFILE) | ||
66 | PDCLIBS = $(DLLTARGET) | ||
67 | EXEPOST = | ||
68 | TUIPOST = | ||
69 | CLEAN = *.dll *.lib $(DEFFILE) | ||
70 | else | ||
71 | LIBCURSES = pdcurses.a | ||
72 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) | ||
73 | PDCLIBS = $(LIBCURSES) | ||
74 | EXEPOST = $(EMXBIND) $* $(BINDFLAGS) | ||
75 | TUIPOST = $(EMXBIND) tuidemo $(BINDFLAGS) | ||
76 | CLEAN = *.a testcurs newdemo xmas tuidemo firework ptest rain worm | ||
77 | endif | ||
78 | |||
79 | .PHONY: all libs clean demos dist | ||
80 | |||
81 | all: libs demos | ||
82 | |||
83 | libs: $(PDCLIBS) | ||
84 | |||
85 | clean: | ||
86 | -del *.o | ||
87 | -del *.exe | ||
88 | -del $(CLEAN) | ||
89 | |||
90 | demos: $(DEMOS) | ||
91 | |||
92 | DEMOOBJS = testcurs.o newdemo.o xmas.o tui.o tuidemo.o firework.o \ | ||
93 | ptest.o rain.o worm.o | ||
94 | |||
95 | $(DEFFILE) : $(DEFDEPS) | ||
96 | echo LIBRARY PDCURSES > $@ | ||
97 | echo DESCRIPTION 'PDCurses 3.4 Dynamic Linking library' >> $@ | ||
98 | echo PROTMODE >>$@ | ||
99 | echo DATA MULTIPLE READWRITE LOADONCALL >> $@ | ||
100 | echo CODE LOADONCALL >> $@ | ||
101 | echo EXPORTS >> $@ | ||
102 | type $(BASEDEF) >> $@ | ||
103 | |||
104 | $(LIBCURSES) : $(LIBDEPS) | ||
105 | $(LIBEXE) $(LIBFLAGS) $@ $? | ||
106 | -copy $(LIBCURSES) panel.a | ||
107 | |||
108 | $(DLLTARGET) : $(LIBDEPS) | ||
109 | $(LINK) $(DLLFLAGS) -o $(DLLTARGET) $? $(DEFFILE) | ||
110 | # lxlite $(DLLTARGET) | ||
111 | emximp -o $(LIBCURSES) $(DEFFILE) | ||
112 | |||
113 | $(LIBOBJS) $(PDCOBJS) $(DEMOOBJS) : $(PDCURSES_HEADERS) | ||
114 | $(PDCOBJS) : $(PDCURSES_OS2_H) | ||
115 | $(DEMOS) : $(LIBCURSES) | ||
116 | panel.o ptest.o: $(PANEL_HEADER) | ||
117 | terminfo.o: $(TERM_HEADER) | ||
118 | |||
119 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
120 | $(CC) -c $(CFLAGS) -o$@ $< | ||
121 | |||
122 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
123 | $(CC) -c $(CFLAGS) -o$@ $< | ||
124 | |||
125 | firework.exe newdemo.exe rain.exe testcurs.exe worm.exe xmas.exe \ | ||
126 | ptest.exe: %.exe: %.o | ||
127 | $(LINK) $(LDFLAGS) -o $* $< $(LIBCURSES) $(CCLIBS) | ||
128 | $(EXEPOST) | ||
129 | |||
130 | tuidemo.exe: tuidemo.o tui.o | ||
131 | $(LINK) $(LDFLAGS) -o tuidemo tuidemo.o tui.o $(LIBCURSES) $(CCLIBS) | ||
132 | $(TUIPOST) | ||
133 | |||
134 | firework.o newdemo.o ptest.o rain.o testcurs.o worm.o xmas.o: %.o: \ | ||
135 | $(demodir)/%.c | ||
136 | $(CC) $(CFLAGS) -o$@ $< | ||
137 | |||
138 | tui.o: $(demodir)\tui.c $(demodir)\tui.h | ||
139 | $(CC) $(CFLAGS) -I$(demodir) -o $@ $< | ||
140 | |||
141 | tuidemo.o: $(demodir)\tuidemo.c | ||
142 | $(CC) $(CFLAGS) -I$(demodir) -o $@ $< | ||
143 | |||
144 | PLATFORM1 = EMX OS/2 | ||
145 | PLATFORM2 = EMX 0.9d for OS/2 | ||
146 | ARCNAME = pdc$(VER)_emx_os2 | ||
147 | |||
148 | include $(PDCURSES_SRCDIR)/makedist.mif |
File os2/iccos2.lrf added (mode: 100644) (index 00000000..b1fdf37e) | |||
1 | -+addch.obj & | ||
2 | -+addchstr.obj & | ||
3 | -+addstr.obj & | ||
4 | -+attr.obj & | ||
5 | -+beep.obj & | ||
6 | -+bkgd.obj & | ||
7 | -+border.obj & | ||
8 | -+clear.obj & | ||
9 | -+color.obj & | ||
10 | -+delch.obj & | ||
11 | -+deleteln.obj & | ||
12 | -+deprec.obj & | ||
13 | -+getch.obj & | ||
14 | -+getstr.obj & | ||
15 | -+getyx.obj & | ||
16 | -+inch.obj & | ||
17 | -+inchstr.obj & | ||
18 | -+initscr.obj & | ||
19 | -+inopts.obj & | ||
20 | -+insch.obj & | ||
21 | -+insstr.obj & | ||
22 | -+instr.obj & | ||
23 | -+kernel.obj & | ||
24 | -+keyname.obj & | ||
25 | -+mouse.obj & | ||
26 | -+move.obj & | ||
27 | -+outopts.obj & | ||
28 | -+overlay.obj & | ||
29 | -+pad.obj & | ||
30 | -+panel.obj & | ||
31 | -+printw.obj & | ||
32 | -+refresh.obj & | ||
33 | -+scanw.obj & | ||
34 | -+scr_dump.obj & | ||
35 | -+scroll.obj & | ||
36 | -+slk.obj & | ||
37 | -+termattr.obj & | ||
38 | -+terminfo.obj & | ||
39 | -+touch.obj & | ||
40 | -+util.obj & | ||
41 | -+window.obj & | ||
42 | -+debug.obj & | ||
43 | -+pdcclip.obj & | ||
44 | -+pdcdisp.obj & | ||
45 | -+pdcgetsc.obj & | ||
46 | -+pdckbd.obj & | ||
47 | -+pdcscrn.obj & | ||
48 | -+pdcsetsc.obj & | ||
49 | -+pdcutil.obj & | ||
50 | ,lib.map; |
File os2/iccos2.mak added (mode: 100644) (index 00000000..06a2c1fe) | |||
1 | # NMAKE Makefile for PDCurses library - OS/2 C Set/2 | ||
2 | # | ||
3 | # Usage: nmake -f [path\]iccos2.mak [DEBUG=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | O = obj | ||
9 | |||
10 | !ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)\os2 | ||
18 | |||
19 | PDCURSES_OS2_H = $(osdir)\pdcos2.h | ||
20 | |||
21 | CC = icc | ||
22 | |||
23 | !ifdef DEBUG | ||
24 | CFLAGS = /Sm /Ti+ /O- /Q+ /dPDCDEBUG | ||
25 | LDFLAGS = /NOLOGO /NOE /SE:160 /DEBUG /PMTYPE:VIO | ||
26 | !else | ||
27 | CFLAGS = /Sm /Ti- /O+ /Q+ | ||
28 | LDFLAGS = /NOLOGO /NOE /EXEPACK /PACKCODE /PACKDATA /PMTYPE:VIO | ||
29 | !endif | ||
30 | |||
31 | CPPFLAGS = -I$(PDCURSES_SRCDIR) | ||
32 | |||
33 | BUILD = $(CC) -c $(CFLAGS) $(CPPFLAGS) | ||
34 | |||
35 | LINK = link386 | ||
36 | |||
37 | LIBEXE = lib | ||
38 | |||
39 | LIBCURSES = pdcurses.lib | ||
40 | |||
41 | all: $(LIBCURSES) $(DEMOS) | ||
42 | |||
43 | clean: | ||
44 | -del *.obj | ||
45 | -del *.lib | ||
46 | -del *.exe | ||
47 | |||
48 | demos: $(DEMOS) | ||
49 | |||
50 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
51 | $(LIBEXE) $@ @$(osdir)\iccos2.lrf | ||
52 | -copy $(LIBCURSES) panel.lib | ||
53 | |||
54 | addch.obj: $(srcdir)\addch.c $(PDCURSES_HEADERS) | ||
55 | $(BUILD) $(srcdir)\addch.c | ||
56 | |||
57 | addchstr.obj: $(srcdir)\addchstr.c $(PDCURSES_HEADERS) | ||
58 | $(BUILD) $(srcdir)\addchstr.c | ||
59 | |||
60 | addstr.obj: $(srcdir)\addstr.c $(PDCURSES_HEADERS) | ||
61 | $(BUILD) $(srcdir)\addstr.c | ||
62 | |||
63 | attr.obj: $(srcdir)\attr.c $(PDCURSES_HEADERS) | ||
64 | $(BUILD) $(srcdir)\attr.c | ||
65 | |||
66 | beep.obj: $(srcdir)\beep.c $(PDCURSES_HEADERS) | ||
67 | $(BUILD) $(srcdir)\beep.c | ||
68 | |||
69 | bkgd.obj: $(srcdir)\bkgd.c $(PDCURSES_HEADERS) | ||
70 | $(BUILD) $(srcdir)\bkgd.c | ||
71 | |||
72 | border.obj: $(srcdir)\border.c $(PDCURSES_HEADERS) | ||
73 | $(BUILD) $(srcdir)\border.c | ||
74 | |||
75 | clear.obj: $(srcdir)\clear.c $(PDCURSES_HEADERS) | ||
76 | $(BUILD) $(srcdir)\clear.c | ||
77 | |||
78 | color.obj: $(srcdir)\color.c $(PDCURSES_HEADERS) | ||
79 | $(BUILD) $(srcdir)\color.c | ||
80 | |||
81 | delch.obj: $(srcdir)\delch.c $(PDCURSES_HEADERS) | ||
82 | $(BUILD) $(srcdir)\delch.c | ||
83 | |||
84 | deleteln.obj: $(srcdir)\deleteln.c $(PDCURSES_HEADERS) | ||
85 | $(BUILD) $(srcdir)\deleteln.c | ||
86 | |||
87 | deprec.obj: $(srcdir)\deprec.c $(PDCURSES_HEADERS) | ||
88 | $(BUILD) $(srcdir)\deprec.c | ||
89 | |||
90 | getch.obj: $(srcdir)\getch.c $(PDCURSES_HEADERS) | ||
91 | $(BUILD) $(srcdir)\getch.c | ||
92 | |||
93 | getstr.obj: $(srcdir)\getstr.c $(PDCURSES_HEADERS) | ||
94 | $(BUILD) $(srcdir)\getstr.c | ||
95 | |||
96 | getyx.obj: $(srcdir)\getyx.c $(PDCURSES_HEADERS) | ||
97 | $(BUILD) $(srcdir)\getyx.c | ||
98 | |||
99 | inch.obj: $(srcdir)\inch.c $(PDCURSES_HEADERS) | ||
100 | $(BUILD) $(srcdir)\inch.c | ||
101 | |||
102 | inchstr.obj: $(srcdir)\inchstr.c $(PDCURSES_HEADERS) | ||
103 | $(BUILD) $(srcdir)\inchstr.c | ||
104 | |||
105 | initscr.obj: $(srcdir)\initscr.c $(PDCURSES_HEADERS) | ||
106 | $(BUILD) $(srcdir)\initscr.c | ||
107 | |||
108 | inopts.obj: $(srcdir)\inopts.c $(PDCURSES_HEADERS) | ||
109 | $(BUILD) $(srcdir)\inopts.c | ||
110 | |||
111 | insch.obj: $(srcdir)\insch.c $(PDCURSES_HEADERS) | ||
112 | $(BUILD) $(srcdir)\insch.c | ||
113 | |||
114 | insstr.obj: $(srcdir)\insstr.c $(PDCURSES_HEADERS) | ||
115 | $(BUILD) $(srcdir)\insstr.c | ||
116 | |||
117 | instr.obj: $(srcdir)\instr.c $(PDCURSES_HEADERS) | ||
118 | $(BUILD) $(srcdir)\instr.c | ||
119 | |||
120 | kernel.obj: $(srcdir)\kernel.c $(PDCURSES_HEADERS) | ||
121 | $(BUILD) $(srcdir)\kernel.c | ||
122 | |||
123 | keyname.obj: $(srcdir)\keyname.c $(PDCURSES_HEADERS) | ||
124 | $(BUILD) $(srcdir)\keyname.c | ||
125 | |||
126 | mouse.obj: $(srcdir)\mouse.c $(PDCURSES_HEADERS) | ||
127 | $(BUILD) $(srcdir)\mouse.c | ||
128 | |||
129 | move.obj: $(srcdir)\move.c $(PDCURSES_HEADERS) | ||
130 | $(BUILD) $(srcdir)\move.c | ||
131 | |||
132 | outopts.obj: $(srcdir)\outopts.c $(PDCURSES_HEADERS) | ||
133 | $(BUILD) $(srcdir)\outopts.c | ||
134 | |||
135 | overlay.obj: $(srcdir)\overlay.c $(PDCURSES_HEADERS) | ||
136 | $(BUILD) $(srcdir)\overlay.c | ||
137 | |||
138 | pad.obj: $(srcdir)\pad.c $(PDCURSES_HEADERS) | ||
139 | $(BUILD) $(srcdir)\pad.c | ||
140 | |||
141 | panel.obj: $(srcdir)\panel.c $(PDCURSES_HEADERS) $(PANEL_HEADER) | ||
142 | $(BUILD) $(srcdir)\panel.c | ||
143 | |||
144 | printw.obj: $(srcdir)\printw.c $(PDCURSES_HEADERS) | ||
145 | $(BUILD) $(srcdir)\printw.c | ||
146 | |||
147 | refresh.obj: $(srcdir)\refresh.c $(PDCURSES_HEADERS) | ||
148 | $(BUILD) $(srcdir)\refresh.c | ||
149 | |||
150 | scanw.obj: $(srcdir)\scanw.c $(PDCURSES_HEADERS) | ||
151 | $(BUILD) $(srcdir)\scanw.c | ||
152 | |||
153 | scr_dump.obj: $(srcdir)\scr_dump.c $(PDCURSES_HEADERS) | ||
154 | $(BUILD) $(srcdir)\scr_dump.c | ||
155 | |||
156 | scroll.obj: $(srcdir)\scroll.c $(PDCURSES_HEADERS) | ||
157 | $(BUILD) $(srcdir)\scroll.c | ||
158 | |||
159 | slk.obj: $(srcdir)\slk.c $(PDCURSES_HEADERS) | ||
160 | $(BUILD) $(srcdir)\slk.c | ||
161 | |||
162 | termattr.obj: $(srcdir)\termattr.c $(PDCURSES_HEADERS) | ||
163 | $(BUILD) $(srcdir)\termattr.c | ||
164 | |||
165 | terminfo.obj: $(srcdir)\terminfo.c $(PDCURSES_HEADERS) $(TERM_HEADER) | ||
166 | $(BUILD) $(srcdir)\terminfo.c | ||
167 | |||
168 | touch.obj: $(srcdir)\touch.c $(PDCURSES_HEADERS) | ||
169 | $(BUILD) $(srcdir)\touch.c | ||
170 | |||
171 | util.obj: $(srcdir)\util.c $(PDCURSES_HEADERS) | ||
172 | $(BUILD) $(srcdir)\util.c | ||
173 | |||
174 | window.obj: $(srcdir)\window.c $(PDCURSES_HEADERS) | ||
175 | $(BUILD) $(srcdir)\window.c | ||
176 | |||
177 | debug.obj: $(srcdir)\debug.c $(PDCURSES_HEADERS) | ||
178 | $(BUILD) $(srcdir)\debug.c | ||
179 | |||
180 | pdcclip.obj: $(osdir)\pdcclip.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
181 | $(BUILD) $(osdir)\pdcclip.c | ||
182 | |||
183 | pdcdisp.obj: $(osdir)\pdcdisp.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
184 | $(BUILD) $(osdir)\pdcdisp.c | ||
185 | |||
186 | pdcgetsc.obj: $(osdir)\pdcgetsc.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
187 | $(BUILD) $(osdir)\pdcgetsc.c | ||
188 | |||
189 | pdckbd.obj: $(osdir)\pdckbd.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
190 | $(BUILD) $(osdir)\pdckbd.c | ||
191 | |||
192 | pdcscrn.obj: $(osdir)\pdcscrn.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
193 | $(BUILD) $(osdir)\pdcscrn.c | ||
194 | |||
195 | pdcsetsc.obj: $(osdir)\pdcsetsc.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
196 | $(BUILD) $(osdir)\pdcsetsc.c | ||
197 | |||
198 | pdcutil.obj: $(osdir)\pdcutil.c $(PDCURSES_HEADERS) $(PDCURSES_OS2_H) | ||
199 | $(BUILD) $(osdir)\pdcutil.c | ||
200 | |||
201 | firework.exe: firework.obj $(LIBCURSES) | ||
202 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
203 | |||
204 | newdemo.exe: newdemo.obj $(LIBCURSES) | ||
205 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
206 | |||
207 | ptest.exe: ptest.obj $(LIBCURSES) | ||
208 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
209 | |||
210 | rain.exe: rain.obj $(LIBCURSES) | ||
211 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
212 | |||
213 | testcurs.exe: testcurs.obj $(LIBCURSES) | ||
214 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
215 | |||
216 | tuidemo.exe: tuidemo.obj tui.obj $(LIBCURSES) | ||
217 | $(LINK) $(LDFLAGS) $*.obj+tui.obj,$*,,$(LIBCURSES); | ||
218 | |||
219 | worm.exe: worm.obj $(LIBCURSES) | ||
220 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
221 | |||
222 | xmas.exe: xmas.obj $(LIBCURSES) | ||
223 | $(LINK) $(LDFLAGS) $*.obj,$*,,$(LIBCURSES); | ||
224 | |||
225 | firework.obj: $(demodir)\firework.c $(PDCURSES_CURSES_H) | ||
226 | $(BUILD) $(demodir)\firework.c | ||
227 | |||
228 | newdemo.obj: $(demodir)\newdemo.c $(PDCURSES_CURSES_H) | ||
229 | $(BUILD) $(demodir)\newdemo.c | ||
230 | |||
231 | ptest.obj: $(demodir)\ptest.c $(PANEL_HEADER) $(PDCURSES_CURSES_H) | ||
232 | $(BUILD) $(demodir)\ptest.c | ||
233 | |||
234 | rain.obj: $(demodir)\rain.c $(PDCURSES_CURSES_H) | ||
235 | $(BUILD) $(demodir)\rain.c | ||
236 | |||
237 | testcurs.obj: $(demodir)\testcurs.c $(PDCURSES_CURSES_H) | ||
238 | $(BUILD) $(demodir)\testcurs.c | ||
239 | |||
240 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h $(PDCURSES_CURSES_H) | ||
241 | $(BUILD) $(demodir)\tui.c | ||
242 | |||
243 | tuidemo.obj: $(demodir)\tuidemo.c $(PDCURSES_CURSES_H) | ||
244 | $(BUILD) $(demodir)\tuidemo.c | ||
245 | |||
246 | worm.obj: $(demodir)\worm.c $(PDCURSES_CURSES_H) | ||
247 | $(BUILD) $(demodir)\worm.c | ||
248 | |||
249 | xmas.obj: $(demodir)\xmas.c $(PDCURSES_CURSES_H) | ||
250 | $(BUILD) $(demodir)\xmas.c | ||
251 | |||
252 | PLATFORM1 = C Set/2 OS/2 | ||
253 | PLATFORM2 = C Set/2 for OS/2 | ||
254 | ARCNAME = pdc$(VER)_icc_os2 | ||
255 | |||
256 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File os2/pdcclip.c added (mode: 100644) (index 00000000..ddc61d90) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcclip.c,v 1.33 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: clipboard | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_getclipboard(char **contents, long *length); | ||
13 | int PDC_setclipboard(const char *contents, long length); | ||
14 | int PDC_freeclipboard(char *contents); | ||
15 | int PDC_clearclipboard(void); | ||
16 | |||
17 | Description: | ||
18 | PDC_getclipboard() gets the textual contents of the system's | ||
19 | clipboard. This function returns the contents of the clipboard | ||
20 | in the contents argument. It is the responsibilitiy of the | ||
21 | caller to free the memory returned, via PDC_freeclipboard(). | ||
22 | The length of the clipboard contents is returned in the length | ||
23 | argument. | ||
24 | |||
25 | PDC_setclipboard copies the supplied text into the system's | ||
26 | clipboard, emptying the clipboard prior to the copy. | ||
27 | |||
28 | PDC_clearclipboard() clears the internal clipboard. | ||
29 | |||
30 | Return Values: | ||
31 | indicator of success/failure of call. | ||
32 | PDC_CLIP_SUCCESS the call was successful | ||
33 | PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for | ||
34 | the clipboard contents | ||
35 | PDC_CLIP_EMPTY the clipboard contains no text | ||
36 | PDC_CLIP_ACCESS_ERROR no clipboard support | ||
37 | |||
38 | Portability X/Open BSD SYS V | ||
39 | PDC_getclipboard - - - | ||
40 | PDC_setclipboard - - - | ||
41 | PDC_freeclipboard - - - | ||
42 | PDC_clearclipboard - - - | ||
43 | |||
44 | **man-end****************************************************************/ | ||
45 | |||
46 | int PDC_getclipboard(char **contents, long *length) | ||
47 | { | ||
48 | #ifndef EMXVIDEO | ||
49 | HMQ hmq; | ||
50 | HAB hab; | ||
51 | PTIB ptib; | ||
52 | PPIB ppib; | ||
53 | ULONG ulRet; | ||
54 | long len; | ||
55 | int rc; | ||
56 | #endif | ||
57 | PDC_LOG(("PDC_getclipboard() - called\n")); | ||
58 | |||
59 | #ifndef EMXVIDEO | ||
60 | DosGetInfoBlocks(&ptib, &ppib); | ||
61 | ppib->pib_ultype = 3; | ||
62 | hab = WinInitialize(0); | ||
63 | hmq = WinCreateMsgQueue(hab, 0); | ||
64 | |||
65 | if (!WinOpenClipbrd(hab)) | ||
66 | { | ||
67 | WinDestroyMsgQueue(hmq); | ||
68 | WinTerminate(hab); | ||
69 | return PDC_CLIP_ACCESS_ERROR; | ||
70 | } | ||
71 | |||
72 | rc = PDC_CLIP_EMPTY; | ||
73 | |||
74 | ulRet = WinQueryClipbrdData(hab, CF_TEXT); | ||
75 | |||
76 | if (ulRet) | ||
77 | { | ||
78 | len = strlen((char *)ulRet); | ||
79 | *contents = malloc(len + 1); | ||
80 | |||
81 | if (!*contents) | ||
82 | rc = PDC_CLIP_MEMORY_ERROR; | ||
83 | else | ||
84 | { | ||
85 | strcpy((char *)*contents, (char *)ulRet); | ||
86 | *length = len; | ||
87 | rc = PDC_CLIP_SUCCESS; | ||
88 | } | ||
89 | } | ||
90 | |||
91 | WinCloseClipbrd(hab); | ||
92 | WinDestroyMsgQueue(hmq); | ||
93 | WinTerminate(hab); | ||
94 | |||
95 | return rc; | ||
96 | #else | ||
97 | return PDC_CLIP_ACCESS_ERROR; | ||
98 | #endif | ||
99 | } | ||
100 | |||
101 | int PDC_setclipboard(const char *contents, long length) | ||
102 | { | ||
103 | #ifndef EMXVIDEO | ||
104 | HAB hab; | ||
105 | PTIB ptib; | ||
106 | PPIB ppib; | ||
107 | ULONG ulRC; | ||
108 | PSZ szTextOut = NULL; | ||
109 | int rc; | ||
110 | #endif | ||
111 | PDC_LOG(("PDC_setclipboard() - called\n")); | ||
112 | |||
113 | #ifndef EMXVIDEO | ||
114 | DosGetInfoBlocks(&ptib, &ppib); | ||
115 | ppib->pib_ultype = 3; | ||
116 | hab = WinInitialize(0); | ||
117 | |||
118 | if (!WinOpenClipbrd(hab)) | ||
119 | { | ||
120 | WinTerminate(hab); | ||
121 | return PDC_CLIP_ACCESS_ERROR; | ||
122 | } | ||
123 | |||
124 | rc = PDC_CLIP_MEMORY_ERROR; | ||
125 | |||
126 | ulRC = DosAllocSharedMem((PVOID)&szTextOut, NULL, length + 1, | ||
127 | PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE); | ||
128 | |||
129 | if (ulRC == 0) | ||
130 | { | ||
131 | strcpy(szTextOut, contents); | ||
132 | WinEmptyClipbrd(hab); | ||
133 | |||
134 | if (WinSetClipbrdData(hab, (ULONG)szTextOut, CF_TEXT, CFI_POINTER)) | ||
135 | rc = PDC_CLIP_SUCCESS; | ||
136 | else | ||
137 | { | ||
138 | DosFreeMem(szTextOut); | ||
139 | rc = PDC_CLIP_ACCESS_ERROR; | ||
140 | } | ||
141 | } | ||
142 | |||
143 | WinCloseClipbrd(hab); | ||
144 | WinTerminate(hab); | ||
145 | |||
146 | return rc; | ||
147 | #else | ||
148 | return PDC_CLIP_ACCESS_ERROR; | ||
149 | #endif | ||
150 | } | ||
151 | |||
152 | int PDC_freeclipboard(char *contents) | ||
153 | { | ||
154 | PDC_LOG(("PDC_freeclipboard() - called\n")); | ||
155 | |||
156 | if (contents) | ||
157 | free(contents); | ||
158 | |||
159 | return PDC_CLIP_SUCCESS; | ||
160 | } | ||
161 | |||
162 | int PDC_clearclipboard(void) | ||
163 | { | ||
164 | #ifndef EMXVIDEO | ||
165 | HAB hab; | ||
166 | PTIB ptib; | ||
167 | PPIB ppib; | ||
168 | #endif | ||
169 | PDC_LOG(("PDC_clearclipboard() - called\n")); | ||
170 | |||
171 | #ifndef EMXVIDEO | ||
172 | DosGetInfoBlocks(&ptib, &ppib); | ||
173 | ppib->pib_ultype = 3; | ||
174 | hab = WinInitialize(0); | ||
175 | |||
176 | WinEmptyClipbrd(hab); | ||
177 | |||
178 | WinCloseClipbrd(hab); | ||
179 | WinTerminate(hab); | ||
180 | |||
181 | return PDC_CLIP_SUCCESS; | ||
182 | #else | ||
183 | return PDC_CLIP_ACCESS_ERROR; | ||
184 | #endif | ||
185 | } |
File os2/pdcdisp.c added (mode: 100644) (index 00000000..3c1b86e7) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcdisp.c,v 1.49 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | /* ACS definitions originally by jshumate@wrdis01.robins.af.mil -- these | ||
8 | match code page 437 and compatible pages (CP850, CP852, etc.) */ | ||
9 | |||
10 | #ifdef CHTYPE_LONG | ||
11 | |||
12 | # define A(x) ((chtype)x | A_ALTCHARSET) | ||
13 | |||
14 | chtype acs_map[128] = | ||
15 | { | ||
16 | A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), | ||
17 | A(10), A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), | ||
18 | A(19), A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), | ||
19 | A(28), A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', | ||
20 | '\'', '(', ')', '*', | ||
21 | |||
22 | A(0x1a), A(0x1b), A(0x18), A(0x19), | ||
23 | |||
24 | '/', | ||
25 | |||
26 | 0xdb, | ||
27 | |||
28 | '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', | ||
29 | '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | ||
30 | 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | ||
31 | 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', | ||
32 | |||
33 | A(0x04), 0xb1, | ||
34 | |||
35 | 'b', 'c', 'd', 'e', | ||
36 | |||
37 | 0xf8, 0xf1, 0xb0, A(0x0f), 0xd9, 0xbf, 0xda, 0xc0, 0xc5, 0x2d, | ||
38 | 0x2d, 0xc4, 0x2d, 0x5f, 0xc3, 0xb4, 0xc1, 0xc2, 0xb3, 0xf3, | ||
39 | 0xf2, 0xe3, 0xd8, 0x9c, 0xf9, | ||
40 | |||
41 | A(127) | ||
42 | }; | ||
43 | |||
44 | # undef A | ||
45 | |||
46 | #endif | ||
47 | |||
48 | /* position hardware cursor at (y, x) */ | ||
49 | |||
50 | void PDC_gotoyx(int row, int col) | ||
51 | { | ||
52 | PDC_LOG(("PDC_gotoyx() - called: row %d col %d\n", row, col)); | ||
53 | |||
54 | #ifdef EMXVIDEO | ||
55 | v_gotoxy(col, row); | ||
56 | #else | ||
57 | VioSetCurPos(row, col, 0); | ||
58 | #endif | ||
59 | } | ||
60 | |||
61 | /* update the given physical line to look like the corresponding line in | ||
62 | curscr */ | ||
63 | |||
64 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp) | ||
65 | { | ||
66 | /* this should be enough for the maximum width of a screen. */ | ||
67 | |||
68 | struct {unsigned char text, attr;} temp_line[256]; | ||
69 | int j; | ||
70 | |||
71 | PDC_LOG(("PDC_transform_line() - called: line %d\n", lineno)); | ||
72 | |||
73 | /* replace the attribute part of the chtype with the | ||
74 | actual color value for each chtype in the line */ | ||
75 | |||
76 | for (j = 0; j < len; j++) | ||
77 | { | ||
78 | chtype ch = srcp[j]; | ||
79 | |||
80 | temp_line[j].attr = pdc_atrtab[ch >> PDC_ATTR_SHIFT]; | ||
81 | |||
82 | #ifdef CHTYPE_LONG | ||
83 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
84 | ch = acs_map[ch & 0x7f]; | ||
85 | #endif | ||
86 | temp_line[j].text = ch & 0xff; | ||
87 | } | ||
88 | |||
89 | #ifdef EMXVIDEO | ||
90 | v_putline((char *)temp_line, x, lineno, len); | ||
91 | #else | ||
92 | VioWrtCellStr((PCH)temp_line, (USHORT)(len * sizeof(unsigned short)), | ||
93 | (USHORT)lineno, (USHORT)x, 0); | ||
94 | #endif | ||
95 | } |
File os2/pdcgetsc.c added (mode: 100644) (index 00000000..d712dadf) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcgetsc.c,v 1.39 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | /* return width of screen/viewport */ | ||
8 | |||
9 | int PDC_get_columns(void) | ||
10 | { | ||
11 | #ifdef EMXVIDEO | ||
12 | int rows = 0; | ||
13 | #else | ||
14 | VIOMODEINFO modeInfo = {0}; | ||
15 | #endif | ||
16 | int cols = 0; | ||
17 | const char *env_cols; | ||
18 | |||
19 | PDC_LOG(("PDC_get_columns() - called\n")); | ||
20 | |||
21 | #ifdef EMXVIDEO | ||
22 | v_dimen(&cols, &rows); | ||
23 | #else | ||
24 | modeInfo.cb = sizeof(modeInfo); | ||
25 | VioGetMode(&modeInfo, 0); | ||
26 | cols = modeInfo.col; | ||
27 | #endif | ||
28 | env_cols = getenv("COLS"); | ||
29 | |||
30 | if (env_cols) | ||
31 | cols = min(atoi(env_cols), cols); | ||
32 | |||
33 | PDC_LOG(("PDC_get_columns() - returned: cols %d\n", cols)); | ||
34 | |||
35 | return cols; | ||
36 | } | ||
37 | |||
38 | /* get the cursor size/shape */ | ||
39 | |||
40 | int PDC_get_cursor_mode(void) | ||
41 | { | ||
42 | #ifdef EMXVIDEO | ||
43 | int curstart = 0, curend = 0; | ||
44 | #else | ||
45 | VIOCURSORINFO cursorInfo; | ||
46 | #endif | ||
47 | PDC_LOG(("PDC_get_cursor_mode() - called\n")); | ||
48 | |||
49 | #ifdef EMXVIDEO | ||
50 | v_getctype(&curstart, &curend); | ||
51 | return (curstart << 8) | curend; | ||
52 | #else | ||
53 | VioGetCurType (&cursorInfo, 0); | ||
54 | |||
55 | return (cursorInfo.yStart << 8) | cursorInfo.cEnd; | ||
56 | #endif | ||
57 | } | ||
58 | |||
59 | /* return number of screen rows */ | ||
60 | |||
61 | int PDC_get_rows(void) | ||
62 | { | ||
63 | #ifdef EMXVIDEO | ||
64 | int cols = 0; | ||
65 | #else | ||
66 | VIOMODEINFO modeInfo = {0}; | ||
67 | #endif | ||
68 | int rows = 0; | ||
69 | const char *env_rows; | ||
70 | |||
71 | PDC_LOG(("PDC_get_rows() - called\n")); | ||
72 | |||
73 | /* use the value from LINES environment variable, if set. MH 10-Jun-92 */ | ||
74 | /* and use the minimum of LINES and *ROWS. MH 18-Jun-92 */ | ||
75 | |||
76 | #ifdef EMXVIDEO | ||
77 | v_dimen(&cols, &rows); | ||
78 | #else | ||
79 | modeInfo.cb = sizeof(modeInfo); | ||
80 | VioGetMode(&modeInfo, 0); | ||
81 | rows = modeInfo.row; | ||
82 | #endif | ||
83 | env_rows = getenv("LINES"); | ||
84 | |||
85 | if (env_rows) | ||
86 | rows = min(atoi(env_rows), rows); | ||
87 | |||
88 | PDC_LOG(("PDC_get_rows() - returned: rows %d\n", rows)); | ||
89 | |||
90 | return rows; | ||
91 | } |
File os2/pdckbd.c added (mode: 100644) (index 00000000..42c24ccd) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #if defined(__EMX__) || defined(__WATCOMC__) || defined(__IBMC__) || \ | ||
4 | defined(__TURBOC__) | ||
5 | # define HAVE_SIGNAL | ||
6 | # include <signal.h> | ||
7 | #endif | ||
8 | |||
9 | #include "pdcos2.h" | ||
10 | |||
11 | RCSID("$Id: pdckbd.c,v 1.89 2008/07/14 04:24:51 wmcbrine Exp $") | ||
12 | |||
13 | /*man-start************************************************************** | ||
14 | |||
15 | Name: pdckbd | ||
16 | |||
17 | Synopsis: | ||
18 | unsigned long PDC_get_input_fd(void); | ||
19 | |||
20 | Description: | ||
21 | PDC_get_input_fd() returns the file descriptor that PDCurses | ||
22 | reads its input from. It can be used for select(). | ||
23 | |||
24 | Portability X/Open BSD SYS V | ||
25 | PDC_get_input_fd - - - | ||
26 | |||
27 | **man-end****************************************************************/ | ||
28 | |||
29 | #ifdef EMXVIDEO | ||
30 | # include <termios.h> | ||
31 | static int tahead = -1; | ||
32 | #else | ||
33 | static KBDINFO kbdinfo; /* default keyboard mode */ | ||
34 | static HMOU mouse_handle = 0; | ||
35 | static MOUSE_STATUS old_mouse_status; | ||
36 | static USHORT old_shift = 0; | ||
37 | static bool key_pressed = FALSE; | ||
38 | static int mouse_events = 0; | ||
39 | #endif | ||
40 | |||
41 | /************************************************************************ | ||
42 | * Table for key code translation of function keys in keypad mode * | ||
43 | * These values are for strict IBM keyboard compatibles only * | ||
44 | ************************************************************************/ | ||
45 | |||
46 | static short key_table[] = | ||
47 | { | ||
48 | -1, ALT_ESC, -1, 0, | ||
49 | -1, -1, -1, -1, | ||
50 | -1, -1, -1, -1, | ||
51 | -1, -1, ALT_BKSP, KEY_BTAB, | ||
52 | ALT_Q, ALT_W, ALT_E, ALT_R, | ||
53 | ALT_T, ALT_Y, ALT_U, ALT_I, | ||
54 | ALT_O, ALT_P, ALT_LBRACKET, ALT_RBRACKET, | ||
55 | ALT_ENTER, -1, ALT_A, ALT_S, | ||
56 | ALT_D, ALT_F, ALT_G, ALT_H, | ||
57 | ALT_J, ALT_K, ALT_L, ALT_SEMICOLON, | ||
58 | ALT_FQUOTE, ALT_BQUOTE, -1, ALT_BSLASH, | ||
59 | ALT_Z, ALT_X, ALT_C, ALT_V, | ||
60 | ALT_B, ALT_N, ALT_M, ALT_COMMA, | ||
61 | ALT_STOP, ALT_FSLASH, -1, ALT_PADSTAR, | ||
62 | -1, -1, -1, KEY_F(1), | ||
63 | KEY_F(2), KEY_F(3), KEY_F(4), KEY_F(5), | ||
64 | KEY_F(6), KEY_F(7), KEY_F(8), KEY_F(9), | ||
65 | KEY_F(10), -1, -1, KEY_HOME, | ||
66 | KEY_UP, KEY_PPAGE, ALT_PADMINUS, KEY_LEFT, | ||
67 | KEY_B2, KEY_RIGHT, ALT_PADPLUS, KEY_END, | ||
68 | KEY_DOWN, KEY_NPAGE, KEY_IC, KEY_DC, | ||
69 | KEY_F(13), KEY_F(14), KEY_F(15), KEY_F(16), | ||
70 | KEY_F(17), KEY_F(18), KEY_F(19), KEY_F(20), | ||
71 | KEY_F(21), KEY_F(22), KEY_F(25), KEY_F(26), | ||
72 | KEY_F(27), KEY_F(28), KEY_F(29), KEY_F(30), | ||
73 | KEY_F(31), KEY_F(32), KEY_F(33), KEY_F(34), | ||
74 | KEY_F(37), KEY_F(38), KEY_F(39), KEY_F(40), | ||
75 | KEY_F(41), KEY_F(42), KEY_F(43), KEY_F(44), | ||
76 | KEY_F(45), KEY_F(46), -1, CTL_LEFT, | ||
77 | CTL_RIGHT, CTL_END, CTL_PGDN, CTL_HOME, | ||
78 | ALT_1, ALT_2, ALT_3, ALT_4, | ||
79 | ALT_5, ALT_6, ALT_7, ALT_8, | ||
80 | ALT_9, ALT_0, ALT_MINUS, ALT_EQUAL, | ||
81 | CTL_PGUP, KEY_F(11), KEY_F(12), KEY_F(23), | ||
82 | KEY_F(24), KEY_F(35), KEY_F(36), KEY_F(47), | ||
83 | KEY_F(48), CTL_UP, CTL_PADMINUS, CTL_PADCENTER, | ||
84 | CTL_PADPLUS, CTL_DOWN, CTL_INS, CTL_DEL, | ||
85 | CTL_TAB, CTL_PADSLASH, CTL_PADSTAR, ALT_HOME, | ||
86 | ALT_UP, ALT_PGUP, -1, ALT_LEFT, | ||
87 | -1, ALT_RIGHT, -1, ALT_END, | ||
88 | ALT_DOWN, ALT_PGDN, ALT_INS, ALT_DEL, | ||
89 | ALT_PADSLASH, ALT_TAB, ALT_PADENTER, -1 | ||
90 | }; | ||
91 | |||
92 | unsigned long pdc_key_modifiers = 0L; | ||
93 | |||
94 | unsigned long PDC_get_input_fd(void) | ||
95 | { | ||
96 | PDC_LOG(("PDC_get_input_fd() - called\n")); | ||
97 | |||
98 | return (unsigned long)fileno(stdin); | ||
99 | } | ||
100 | |||
101 | #ifndef EMXVIDEO | ||
102 | |||
103 | void PDC_get_keyboard_info(void) | ||
104 | { | ||
105 | kbdinfo.cb = sizeof(kbdinfo); | ||
106 | KbdGetStatus(&kbdinfo, 0); | ||
107 | } | ||
108 | |||
109 | void PDC_set_keyboard_default(void) | ||
110 | { | ||
111 | KbdSetStatus(&kbdinfo, 0); | ||
112 | } | ||
113 | |||
114 | #endif /* ifndef EMXVIDEO */ | ||
115 | |||
116 | void PDC_set_keyboard_binary(bool on) | ||
117 | { | ||
118 | PDC_LOG(("PDC_set_keyboard_binary() - called\n")); | ||
119 | |||
120 | #ifndef EMXVIDEO | ||
121 | if (on) | ||
122 | { | ||
123 | kbdinfo.fsMask &= ~(KEYBOARD_ASCII_MODE); | ||
124 | kbdinfo.fsMask |= KEYBOARD_BINARY_MODE; | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | kbdinfo.fsMask &= ~(KEYBOARD_BINARY_MODE); | ||
129 | kbdinfo.fsMask |= KEYBOARD_ASCII_MODE; | ||
130 | } | ||
131 | |||
132 | KbdSetStatus(&kbdinfo, 0); | ||
133 | #endif | ||
134 | |||
135 | #ifdef HAVE_SIGNAL | ||
136 | signal(SIGBREAK, on ? SIG_IGN : SIG_DFL); | ||
137 | #endif | ||
138 | } | ||
139 | |||
140 | /* check if a key or mouse event is waiting */ | ||
141 | |||
142 | bool PDC_check_key(void) | ||
143 | { | ||
144 | #if !defined(_MSC_VER) && !defined(EMXVIDEO) | ||
145 | KBDKEYINFO keyInfo = {0}; | ||
146 | #endif | ||
147 | |||
148 | #ifdef EMXVIDEO | ||
149 | if (tahead == -1) /* Nothing typed yet */ | ||
150 | { | ||
151 | tahead = _read_kbd(0, 0, 0); | ||
152 | |||
153 | /* Read additional */ | ||
154 | |||
155 | if (tahead == 0) | ||
156 | tahead = _read_kbd(0, 1, 0) << 8; | ||
157 | } | ||
158 | |||
159 | return (tahead != -1); | ||
160 | #else | ||
161 | # ifndef _MSC_VER | ||
162 | |||
163 | KbdGetStatus(&kbdinfo, 0); | ||
164 | |||
165 | if (mouse_handle) | ||
166 | { | ||
167 | MOUQUEINFO queue; | ||
168 | |||
169 | MouGetNumQueEl(&queue, mouse_handle); | ||
170 | mouse_events = queue.cEvents; | ||
171 | |||
172 | if (mouse_events) | ||
173 | return TRUE; | ||
174 | } | ||
175 | |||
176 | if (old_shift && !kbdinfo.fsState) /* modifier released */ | ||
177 | { | ||
178 | if (!key_pressed && SP->return_key_modifiers) | ||
179 | return TRUE; | ||
180 | } | ||
181 | else if (!old_shift && kbdinfo.fsState) /* modifier pressed */ | ||
182 | key_pressed = FALSE; | ||
183 | |||
184 | old_shift = kbdinfo.fsState; | ||
185 | |||
186 | KbdPeek(&keyInfo, 0); /* peek at keyboard */ | ||
187 | return (keyInfo.fbStatus != 0); | ||
188 | # else | ||
189 | return kbhit(); | ||
190 | # endif | ||
191 | #endif | ||
192 | } | ||
193 | |||
194 | #ifndef EMXVIDEO | ||
195 | |||
196 | static int _process_mouse_events(void) | ||
197 | { | ||
198 | MOUEVENTINFO event; | ||
199 | static const USHORT button_mask[] = {6, 96, 24}, | ||
200 | move_mask[] = {2, 32, 8}, | ||
201 | press_mask[] = {4, 64, 16}; | ||
202 | USHORT count = 1; | ||
203 | short shift_flags = 0; | ||
204 | int i; | ||
205 | |||
206 | MouReadEventQue(&event, &count, mouse_handle); | ||
207 | mouse_events--; | ||
208 | |||
209 | for (i = 0; i < 3; i++) | ||
210 | { | ||
211 | pdc_mouse_status.button[i] = | ||
212 | ((event.fs & move_mask[i]) ? BUTTON_MOVED : 0) | | ||
213 | ((event.fs & press_mask[i]) ? BUTTON_PRESSED : 0); | ||
214 | |||
215 | /* PRESS events are sometimes mistakenly reported as MOVE | ||
216 | events. A MOVE should always follow a PRESS, so treat a MOVE | ||
217 | immediately after a RELEASE as a PRESS. */ | ||
218 | |||
219 | if ((pdc_mouse_status.button[i] == BUTTON_MOVED) && | ||
220 | (old_mouse_status.button[i] == BUTTON_RELEASED)) | ||
221 | { | ||
222 | pdc_mouse_status.button[i] = BUTTON_PRESSED; | ||
223 | } | ||
224 | |||
225 | if (pdc_mouse_status.button[i] == BUTTON_PRESSED && SP->mouse_wait) | ||
226 | { | ||
227 | /* Check for a click -- a PRESS followed immediately by a | ||
228 | release */ | ||
229 | |||
230 | if (!mouse_events) | ||
231 | { | ||
232 | MOUQUEINFO queue; | ||
233 | |||
234 | napms(SP->mouse_wait); | ||
235 | |||
236 | MouGetNumQueEl(&queue, mouse_handle); | ||
237 | mouse_events = queue.cEvents; | ||
238 | } | ||
239 | |||
240 | if (mouse_events) | ||
241 | { | ||
242 | MouReadEventQue(&event, &count, mouse_handle); | ||
243 | |||
244 | if (!(event.fs & button_mask[i])) | ||
245 | pdc_mouse_status.button[i] = BUTTON_CLICKED; | ||
246 | } | ||
247 | } | ||
248 | } | ||
249 | |||
250 | pdc_mouse_status.x = event.col; | ||
251 | pdc_mouse_status.y = event.row; | ||
252 | |||
253 | pdc_mouse_status.changes = 0; | ||
254 | |||
255 | for (i = 0; i < 3; i++) | ||
256 | { | ||
257 | if (old_mouse_status.button[i] != pdc_mouse_status.button[i]) | ||
258 | pdc_mouse_status.changes |= (1 << i); | ||
259 | |||
260 | if (pdc_mouse_status.button[i] == BUTTON_MOVED) | ||
261 | { | ||
262 | /* Discard non-moved "moves" */ | ||
263 | |||
264 | if (pdc_mouse_status.x == old_mouse_status.x && | ||
265 | pdc_mouse_status.y == old_mouse_status.y) | ||
266 | return -1; | ||
267 | |||
268 | /* Motion events always flag the button as changed */ | ||
269 | |||
270 | pdc_mouse_status.changes |= (1 << i); | ||
271 | pdc_mouse_status.changes |= PDC_MOUSE_MOVED; | ||
272 | break; | ||
273 | } | ||
274 | } | ||
275 | |||
276 | old_mouse_status = pdc_mouse_status; | ||
277 | |||
278 | /* Treat click events as release events for comparison purposes */ | ||
279 | |||
280 | for (i = 0; i < 3; i++) | ||
281 | { | ||
282 | if (old_mouse_status.button[i] == BUTTON_CLICKED) | ||
283 | old_mouse_status.button[i] = BUTTON_RELEASED; | ||
284 | } | ||
285 | |||
286 | /* Check for SHIFT/CONTROL/ALT */ | ||
287 | |||
288 | if (kbdinfo.fsState & KBDSTF_ALT) | ||
289 | shift_flags |= BUTTON_ALT; | ||
290 | |||
291 | if (kbdinfo.fsState & KBDSTF_CONTROL) | ||
292 | shift_flags |= BUTTON_CONTROL; | ||
293 | |||
294 | if (kbdinfo.fsState & (KBDSTF_LEFTSHIFT|KBDSTF_RIGHTSHIFT)) | ||
295 | shift_flags |= BUTTON_SHIFT; | ||
296 | |||
297 | if (shift_flags) | ||
298 | { | ||
299 | for (i = 0; i < 3; i++) | ||
300 | { | ||
301 | if (pdc_mouse_status.changes & (1 << i)) | ||
302 | pdc_mouse_status.button[i] |= shift_flags; | ||
303 | } | ||
304 | } | ||
305 | |||
306 | old_shift = kbdinfo.fsState; | ||
307 | key_pressed = TRUE; | ||
308 | |||
309 | SP->key_code = TRUE; | ||
310 | return KEY_MOUSE; | ||
311 | } | ||
312 | |||
313 | #endif | ||
314 | |||
315 | /* return the next available key or mouse event */ | ||
316 | |||
317 | int PDC_get_key(void) | ||
318 | { | ||
319 | int key, scan; | ||
320 | #ifndef EMXVIDEO | ||
321 | KBDKEYINFO keyInfo = {0}; | ||
322 | #endif | ||
323 | |||
324 | #ifdef EMXVIDEO | ||
325 | if (tahead == -1) | ||
326 | { | ||
327 | tahead = _read_kbd(0, 1, 0); | ||
328 | |||
329 | /* Read additional */ | ||
330 | |||
331 | if (tahead == 0) | ||
332 | tahead = _read_kbd(0, 1, 0) << 8; | ||
333 | } | ||
334 | |||
335 | key = tahead & 0xff; | ||
336 | scan = tahead >> 8; | ||
337 | pdc_key_modifiers = 0L; | ||
338 | |||
339 | tahead = -1; | ||
340 | #else | ||
341 | pdc_key_modifiers = 0L; | ||
342 | |||
343 | if (mouse_handle && mouse_events) | ||
344 | return _process_mouse_events(); | ||
345 | |||
346 | if (old_shift && !kbdinfo.fsState) | ||
347 | { | ||
348 | key = -1; | ||
349 | |||
350 | if (old_shift & KBDSTF_LEFTALT) | ||
351 | { | ||
352 | key = KEY_ALT_L; | ||
353 | } | ||
354 | else if (old_shift & KBDSTF_RIGHTALT) | ||
355 | { | ||
356 | key = KEY_ALT_R; | ||
357 | } | ||
358 | else if (old_shift & KBDSTF_LEFTCONTROL) | ||
359 | { | ||
360 | key = KEY_CONTROL_L; | ||
361 | } | ||
362 | else if (old_shift & KBDSTF_RIGHTCONTROL) | ||
363 | { | ||
364 | key = KEY_CONTROL_R; | ||
365 | } | ||
366 | else if (old_shift & KBDSTF_LEFTSHIFT) | ||
367 | { | ||
368 | key = KEY_SHIFT_L; | ||
369 | } | ||
370 | else if (old_shift & KBDSTF_RIGHTSHIFT) | ||
371 | { | ||
372 | key = KEY_SHIFT_R; | ||
373 | } | ||
374 | |||
375 | key_pressed = FALSE; | ||
376 | old_shift = kbdinfo.fsState; | ||
377 | |||
378 | SP->key_code = TRUE; | ||
379 | return key; | ||
380 | } | ||
381 | |||
382 | KbdCharIn(&keyInfo, IO_WAIT, 0); /* get a character */ | ||
383 | |||
384 | key = keyInfo.chChar; | ||
385 | scan = keyInfo.chScan; | ||
386 | |||
387 | if (SP->save_key_modifiers) | ||
388 | { | ||
389 | if (keyInfo.fsState & KBDSTF_ALT) | ||
390 | pdc_key_modifiers |= PDC_KEY_MODIFIER_ALT; | ||
391 | |||
392 | if (keyInfo.fsState & KBDSTF_CONTROL) | ||
393 | pdc_key_modifiers |= PDC_KEY_MODIFIER_CONTROL; | ||
394 | |||
395 | if (keyInfo.fsState & KBDSTF_NUMLOCK_ON) | ||
396 | pdc_key_modifiers |= PDC_KEY_MODIFIER_NUMLOCK; | ||
397 | |||
398 | if (keyInfo.fsState & (KBDSTF_LEFTSHIFT|KBDSTF_RIGHTSHIFT)) | ||
399 | pdc_key_modifiers |= PDC_KEY_MODIFIER_SHIFT; | ||
400 | } | ||
401 | #endif | ||
402 | if (scan == 0x1c && key == 0x0a) /* ^Enter */ | ||
403 | key = CTL_ENTER; | ||
404 | else if (scan == 0xe0 && key == 0x0d) /* PadEnter */ | ||
405 | key = PADENTER; | ||
406 | else if (scan == 0xe0 && key == 0x0a) /* ^PadEnter */ | ||
407 | key = CTL_PADENTER; | ||
408 | else if (scan == 0x37 && key == 0x2a) /* Star */ | ||
409 | key = PADSTAR; | ||
410 | else if (scan == 0x4a && key == 0x2d) /* Minus */ | ||
411 | key = PADMINUS; | ||
412 | else if (scan == 0x4e && key == 0x2b) /* Plus */ | ||
413 | key = PADPLUS; | ||
414 | else if (scan == 0xe0 && key == 0x2f) /* Slash */ | ||
415 | key = PADSLASH; | ||
416 | else if (key == 0x00 || (key == 0xe0 && scan > 53 && scan != 86)) | ||
417 | key = (scan > 0xa7) ? -1 : key_table[scan]; | ||
418 | |||
419 | if (keyInfo.fsState & (KBDSTF_LEFTSHIFT|KBDSTF_RIGHTSHIFT)) | ||
420 | { | ||
421 | switch (key) | ||
422 | { | ||
423 | case KEY_HOME: /* Shift Home */ | ||
424 | key = KEY_SHOME; | ||
425 | break; | ||
426 | case KEY_UP: /* Shift Up */ | ||
427 | key = KEY_SUP; | ||
428 | break; | ||
429 | case KEY_PPAGE: /* Shift PgUp */ | ||
430 | key = KEY_SPREVIOUS; | ||
431 | break; | ||
432 | case KEY_LEFT: /* Shift Left */ | ||
433 | key = KEY_SLEFT; | ||
434 | break; | ||
435 | case KEY_RIGHT: /* Shift Right */ | ||
436 | key = KEY_SRIGHT; | ||
437 | break; | ||
438 | case KEY_END: /* Shift End */ | ||
439 | key = KEY_SEND; | ||
440 | break; | ||
441 | case KEY_DOWN: /* Shift Down */ | ||
442 | key = KEY_SDOWN; | ||
443 | break; | ||
444 | case KEY_NPAGE: /* Shift PgDn */ | ||
445 | key = KEY_SNEXT; | ||
446 | break; | ||
447 | case KEY_IC: /* Shift Ins */ | ||
448 | key = KEY_SIC; | ||
449 | break; | ||
450 | case KEY_DC: /* Shift Del */ | ||
451 | key = KEY_SDC; | ||
452 | } | ||
453 | } | ||
454 | |||
455 | key_pressed = TRUE; | ||
456 | SP->key_code = ((unsigned)key >= 256); | ||
457 | |||
458 | return key; | ||
459 | } | ||
460 | |||
461 | /* discard any pending keyboard or mouse input -- this is the core | ||
462 | routine for flushinp() */ | ||
463 | |||
464 | void PDC_flushinp(void) | ||
465 | { | ||
466 | PDC_LOG(("PDC_flushinp() - called\n")); | ||
467 | |||
468 | #ifdef EMXVIDEO | ||
469 | tcflush(0, TCIFLUSH); | ||
470 | #else | ||
471 | if (mouse_handle) | ||
472 | MouFlushQue(mouse_handle); | ||
473 | |||
474 | KbdFlushBuffer(0); | ||
475 | #endif | ||
476 | } | ||
477 | |||
478 | int PDC_mouse_set(void) | ||
479 | { | ||
480 | #ifndef EMXVIDEO | ||
481 | |||
482 | unsigned long mbe = SP->_trap_mbe; | ||
483 | |||
484 | if (mbe && !mouse_handle) | ||
485 | { | ||
486 | memset(&old_mouse_status, 0, sizeof(MOUSE_STATUS)); | ||
487 | MouOpen(NULL, &mouse_handle); | ||
488 | if (mouse_handle) | ||
489 | MouDrawPtr(mouse_handle); | ||
490 | } | ||
491 | else if (!mbe && mouse_handle) | ||
492 | { | ||
493 | MouClose(mouse_handle); | ||
494 | mouse_handle = 0; | ||
495 | } | ||
496 | |||
497 | if (mbe && mouse_handle) | ||
498 | { | ||
499 | USHORT mask = ((mbe & (BUTTON1_PRESSED | BUTTON1_CLICKED | | ||
500 | BUTTON1_MOVED)) ? 6 : 0) | | ||
501 | |||
502 | ((mbe & (BUTTON3_PRESSED | BUTTON3_CLICKED | | ||
503 | BUTTON3_MOVED)) ? 24 : 0) | | ||
504 | |||
505 | ((mbe & (BUTTON2_PRESSED | BUTTON2_CLICKED | | ||
506 | BUTTON2_MOVED)) ? 96 : 0); | ||
507 | |||
508 | MouSetEventMask(&mask, mouse_handle); | ||
509 | } | ||
510 | #endif | ||
511 | return OK; | ||
512 | } | ||
513 | |||
514 | int PDC_modifiers_set(void) | ||
515 | { | ||
516 | key_pressed = FALSE; | ||
517 | |||
518 | return OK; | ||
519 | } |
File os2/pdcos2.h added (mode: 100644) (index 00000000..1c11d480) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: pdcos2.h,v 1.9 2008/08/14 06:38:35 wmcbrine Exp $ */ | ||
4 | |||
5 | #ifdef _MSC_VER | ||
6 | # define USE_OS2_H 1 /* Use the os2.h for the compiler */ | ||
7 | # define APIRET USHORT | ||
8 | #endif | ||
9 | |||
10 | #include <stdlib.h> | ||
11 | #include <string.h> | ||
12 | |||
13 | #ifdef EMXVIDEO | ||
14 | # include <sys/video.h> | ||
15 | #else | ||
16 | # define INCL_DOS | ||
17 | # define INCL_DOSMISC | ||
18 | # define INCL_WIN | ||
19 | # define INCL_VIO | ||
20 | # define INCL_KBD | ||
21 | # define INCL_MOU | ||
22 | # include <os2.h> | ||
23 | #endif | ||
24 | |||
25 | #include <curspriv.h> | ||
26 | |||
27 | #ifdef __WATCOMC__ | ||
28 | # define PDCTHUNK(x) ((ptr_16)(x)) | ||
29 | # ifdef __386__ | ||
30 | # define SEG16 _Seg16 | ||
31 | # else | ||
32 | # define SEG16 | ||
33 | # endif | ||
34 | |||
35 | typedef void * SEG16 ptr_16; | ||
36 | |||
37 | #else | ||
38 | # ifdef __EMX__ | ||
39 | # ifdef __INNOTEK_LIBC__ | ||
40 | # define PDCTHUNK(x) ((PCH)_libc_32to16(x)) | ||
41 | # else | ||
42 | # define PDCTHUNK(x) ((PCH)_emx_32to16(x)) | ||
43 | # endif | ||
44 | # endif | ||
45 | #endif | ||
46 | |||
47 | extern unsigned char *pdc_atrtab; | ||
48 | extern int pdc_font; | ||
49 | |||
50 | extern void PDC_get_keyboard_info(void); | ||
51 | extern void PDC_set_keyboard_default(void); |
File os2/pdcscrn.c added (mode: 100644) (index 00000000..e2d68faa) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcscrn.c,v 1.76 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | #ifdef CHTYPE_LONG | ||
8 | # define PDC_OFFSET 32 | ||
9 | #else | ||
10 | # define PDC_OFFSET 8 | ||
11 | #endif | ||
12 | |||
13 | /* COLOR_PAIR to attribute encoding table. */ | ||
14 | |||
15 | unsigned char *pdc_atrtab = (unsigned char *)NULL; | ||
16 | |||
17 | int pdc_font; /* default font size */ | ||
18 | |||
19 | static short curstoreal[16], realtocurs[16] = | ||
20 | { | ||
21 | COLOR_BLACK, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN, COLOR_RED, | ||
22 | COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE, COLOR_BLACK + 8, | ||
23 | COLOR_BLUE + 8, COLOR_GREEN + 8, COLOR_CYAN + 8, COLOR_RED + 8, | ||
24 | COLOR_MAGENTA + 8, COLOR_YELLOW + 8, COLOR_WHITE + 8 | ||
25 | }; | ||
26 | |||
27 | #ifdef EMXVIDEO | ||
28 | static unsigned char *saved_screen = NULL; | ||
29 | static int saved_lines = 0; | ||
30 | static int saved_cols = 0; | ||
31 | #else | ||
32 | # ifdef PDCTHUNK | ||
33 | # ifdef __EMX__ | ||
34 | # define THUNKEDVIO VIOCOLORREG | ||
35 | # else | ||
36 | |||
37 | typedef struct { | ||
38 | USHORT cb; | ||
39 | USHORT type; | ||
40 | USHORT firstcolorreg; | ||
41 | USHORT numcolorregs; | ||
42 | ptr_16 colorregaddr; | ||
43 | } THUNKEDVIO; | ||
44 | |||
45 | # endif | ||
46 | # endif | ||
47 | |||
48 | static PCH saved_screen = NULL; | ||
49 | static USHORT saved_lines = 0; | ||
50 | static USHORT saved_cols = 0; | ||
51 | static VIOMODEINFO scrnmode; /* default screen mode */ | ||
52 | static VIOMODEINFO saved_scrnmode[3]; | ||
53 | static int saved_font[3]; | ||
54 | static bool can_change = FALSE; | ||
55 | |||
56 | static int _get_font(void) | ||
57 | { | ||
58 | VIOMODEINFO modeInfo = {0}; | ||
59 | |||
60 | modeInfo.cb = sizeof(modeInfo); | ||
61 | |||
62 | VioGetMode(&modeInfo, 0); | ||
63 | return (modeInfo.vres / modeInfo.row); | ||
64 | } | ||
65 | |||
66 | static void _set_font(int size) | ||
67 | { | ||
68 | VIOMODEINFO modeInfo = {0}; | ||
69 | |||
70 | if (pdc_font != size) | ||
71 | { | ||
72 | modeInfo.cb = sizeof(modeInfo); | ||
73 | |||
74 | /* set most parameters of modeInfo */ | ||
75 | |||
76 | VioGetMode(&modeInfo, 0); | ||
77 | modeInfo.cb = 8; /* ignore horiz an vert resolution */ | ||
78 | modeInfo.row = modeInfo.vres / size; | ||
79 | VioSetMode(&modeInfo, 0); | ||
80 | } | ||
81 | |||
82 | curs_set(SP->visibility); | ||
83 | |||
84 | pdc_font = _get_font(); | ||
85 | } | ||
86 | |||
87 | #endif | ||
88 | |||
89 | /* close the physical screen -- may restore the screen to its state | ||
90 | before PDC_scr_open(); miscellaneous cleanup */ | ||
91 | |||
92 | void PDC_scr_close(void) | ||
93 | { | ||
94 | PDC_LOG(("PDC_scr_close() - called\n")); | ||
95 | |||
96 | if (saved_screen && getenv("PDC_RESTORE_SCREEN")) | ||
97 | { | ||
98 | #ifdef EMXVIDEO | ||
99 | v_putline(saved_screen, 0, 0, saved_lines * saved_cols); | ||
100 | #else | ||
101 | VioWrtCellStr(saved_screen, saved_lines * saved_cols * 2, | ||
102 | 0, 0, (HVIO)NULL); | ||
103 | #endif | ||
104 | free(saved_screen); | ||
105 | saved_screen = NULL; | ||
106 | } | ||
107 | |||
108 | reset_shell_mode(); | ||
109 | |||
110 | if (SP->visibility != 1) | ||
111 | curs_set(1); | ||
112 | |||
113 | /* Position cursor to the bottom left of the screen. */ | ||
114 | |||
115 | PDC_gotoyx(PDC_get_rows() - 2, 0); | ||
116 | } | ||
117 | |||
118 | void PDC_scr_free(void) | ||
119 | { | ||
120 | if (SP) | ||
121 | free(SP); | ||
122 | if (pdc_atrtab) | ||
123 | free(pdc_atrtab); | ||
124 | |||
125 | pdc_atrtab = (unsigned char *)NULL; | ||
126 | } | ||
127 | |||
128 | /* open the physical screen -- allocate SP, miscellaneous intialization, | ||
129 | and may save the existing screen for later restoration */ | ||
130 | |||
131 | int PDC_scr_open(int argc, char **argv) | ||
132 | { | ||
133 | #ifdef EMXVIDEO | ||
134 | int adapter; | ||
135 | #else | ||
136 | USHORT totchars; | ||
137 | #endif | ||
138 | int i; | ||
139 | short r, g, b; | ||
140 | |||
141 | PDC_LOG(("PDC_scr_open() - called\n")); | ||
142 | |||
143 | SP = calloc(1, sizeof(SCREEN)); | ||
144 | pdc_atrtab = calloc(PDC_COLOR_PAIRS * PDC_OFFSET, 1); | ||
145 | |||
146 | if (!SP || !pdc_atrtab) | ||
147 | return ERR; | ||
148 | |||
149 | for (i = 0; i < 16; i++) | ||
150 | curstoreal[realtocurs[i]] = i; | ||
151 | |||
152 | #ifdef EMXVIDEO | ||
153 | v_init(); | ||
154 | #endif | ||
155 | SP->orig_attr = FALSE; | ||
156 | |||
157 | #ifdef EMXVIDEO | ||
158 | adapter = v_hardware(); | ||
159 | SP->mono = (adapter == V_MONOCHROME); | ||
160 | |||
161 | pdc_font = SP->mono ? 14 : (adapter == V_COLOR_8) ? 8 : 12; | ||
162 | #else | ||
163 | VioGetMode(&scrnmode, 0); | ||
164 | PDC_get_keyboard_info(); | ||
165 | |||
166 | pdc_font = _get_font(); | ||
167 | #endif | ||
168 | SP->lines = PDC_get_rows(); | ||
169 | SP->cols = PDC_get_columns(); | ||
170 | |||
171 | SP->mouse_wait = PDC_CLICK_PERIOD; | ||
172 | SP->audible = TRUE; | ||
173 | |||
174 | /* This code for preserving the current screen */ | ||
175 | |||
176 | if (getenv("PDC_RESTORE_SCREEN")) | ||
177 | { | ||
178 | saved_lines = SP->lines; | ||
179 | saved_cols = SP->cols; | ||
180 | |||
181 | saved_screen = malloc(2 * saved_lines * saved_cols); | ||
182 | |||
183 | if (!saved_screen) | ||
184 | { | ||
185 | SP->_preserve = FALSE; | ||
186 | return OK; | ||
187 | } | ||
188 | #ifdef EMXVIDEO | ||
189 | v_getline(saved_screen, 0, 0, saved_lines * saved_cols); | ||
190 | #else | ||
191 | totchars = saved_lines * saved_cols * 2; | ||
192 | VioReadCellStr((PCH)saved_screen, &totchars, 0, 0, (HVIO)NULL); | ||
193 | #endif | ||
194 | } | ||
195 | |||
196 | SP->_preserve = (getenv("PDC_PRESERVE_SCREEN") != NULL); | ||
197 | |||
198 | can_change = (PDC_color_content(0, &r, &g, &b) == OK); | ||
199 | |||
200 | return OK; | ||
201 | } | ||
202 | |||
203 | /* the core of resize_term() */ | ||
204 | |||
205 | int PDC_resize_screen(int nlines, int ncols) | ||
206 | { | ||
207 | #ifndef EMXVIDEO | ||
208 | VIOMODEINFO modeInfo = {0}; | ||
209 | USHORT result; | ||
210 | #endif | ||
211 | |||
212 | PDC_LOG(("PDC_resize_screen() - called. Lines: %d Cols: %d\n", | ||
213 | nlines, ncols)); | ||
214 | |||
215 | #ifdef EMXVIDEO | ||
216 | return ERR; | ||
217 | #else | ||
218 | modeInfo.cb = sizeof(modeInfo); | ||
219 | |||
220 | /* set most parameters of modeInfo */ | ||
221 | |||
222 | VioGetMode(&modeInfo, 0); | ||
223 | modeInfo.fbType = 1; | ||
224 | modeInfo.row = nlines; | ||
225 | modeInfo.col = ncols; | ||
226 | result = VioSetMode(&modeInfo, 0); | ||
227 | |||
228 | LINES = PDC_get_rows(); | ||
229 | COLS = PDC_get_columns(); | ||
230 | |||
231 | return (result == 0) ? OK : ERR; | ||
232 | #endif | ||
233 | } | ||
234 | |||
235 | void PDC_reset_prog_mode(void) | ||
236 | { | ||
237 | PDC_LOG(("PDC_reset_prog_mode() - called.\n")); | ||
238 | |||
239 | #ifndef EMXVIDEO | ||
240 | PDC_set_keyboard_binary(TRUE); | ||
241 | #endif | ||
242 | } | ||
243 | |||
244 | void PDC_reset_shell_mode(void) | ||
245 | { | ||
246 | PDC_LOG(("PDC_reset_shell_mode() - called.\n")); | ||
247 | |||
248 | #ifndef EMXVIDEO | ||
249 | PDC_set_keyboard_default(); | ||
250 | #endif | ||
251 | } | ||
252 | |||
253 | #ifndef EMXVIDEO | ||
254 | |||
255 | static bool _screen_mode_equals(VIOMODEINFO *oldmode) | ||
256 | { | ||
257 | VIOMODEINFO current = {0}; | ||
258 | |||
259 | VioGetMode(¤t, 0); | ||
260 | |||
261 | return ((current.cb == oldmode->cb) && | ||
262 | (current.fbType == oldmode->fbType) && | ||
263 | (current.color == oldmode->color) && | ||
264 | (current.col == oldmode->col) && | ||
265 | (current.row == oldmode->row) && | ||
266 | (current.hres == oldmode->vres) && | ||
267 | (current.vres == oldmode->vres)); | ||
268 | } | ||
269 | |||
270 | #endif | ||
271 | |||
272 | void PDC_restore_screen_mode(int i) | ||
273 | { | ||
274 | #ifndef EMXVIDEO | ||
275 | if (i >= 0 && i <= 2) | ||
276 | { | ||
277 | pdc_font = _get_font(); | ||
278 | _set_font(saved_font[i]); | ||
279 | |||
280 | if (!_screen_mode_equals(&saved_scrnmode[i])) | ||
281 | if (VioSetMode(&saved_scrnmode[i], 0) != 0) | ||
282 | { | ||
283 | pdc_font = _get_font(); | ||
284 | scrnmode = saved_scrnmode[i]; | ||
285 | LINES = PDC_get_rows(); | ||
286 | COLS = PDC_get_columns(); | ||
287 | } | ||
288 | } | ||
289 | #endif | ||
290 | } | ||
291 | |||
292 | void PDC_save_screen_mode(int i) | ||
293 | { | ||
294 | #ifndef EMXVIDEO | ||
295 | if (i >= 0 && i <= 2) | ||
296 | { | ||
297 | saved_font[i] = pdc_font; | ||
298 | saved_scrnmode[i] = scrnmode; | ||
299 | } | ||
300 | #endif | ||
301 | } | ||
302 | |||
303 | void PDC_init_pair(short pair, short fg, short bg) | ||
304 | { | ||
305 | unsigned char att, temp_bg; | ||
306 | chtype i; | ||
307 | |||
308 | fg = curstoreal[fg]; | ||
309 | bg = curstoreal[bg]; | ||
310 | |||
311 | for (i = 0; i < PDC_OFFSET; i++) | ||
312 | { | ||
313 | att = fg | (bg << 4); | ||
314 | |||
315 | if (i & (A_REVERSE >> PDC_ATTR_SHIFT)) | ||
316 | att = bg | (fg << 4); | ||
317 | if (i & (A_UNDERLINE >> PDC_ATTR_SHIFT)) | ||
318 | att = 1; | ||
319 | if (i & (A_INVIS >> PDC_ATTR_SHIFT)) | ||
320 | { | ||
321 | temp_bg = att >> 4; | ||
322 | att = temp_bg << 4 | temp_bg; | ||
323 | } | ||
324 | if (i & (A_BOLD >> PDC_ATTR_SHIFT)) | ||
325 | att |= 8; | ||
326 | if (i & (A_BLINK >> PDC_ATTR_SHIFT)) | ||
327 | att |= 128; | ||
328 | |||
329 | pdc_atrtab[pair * PDC_OFFSET + i] = att; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | int PDC_pair_content(short pair, short *fg, short *bg) | ||
334 | { | ||
335 | *fg = realtocurs[pdc_atrtab[pair * PDC_OFFSET] & 0x0F]; | ||
336 | *bg = realtocurs[(pdc_atrtab[pair * PDC_OFFSET] & 0xF0) >> 4]; | ||
337 | |||
338 | return OK; | ||
339 | } | ||
340 | |||
341 | bool PDC_can_change_color(void) | ||
342 | { | ||
343 | return can_change; | ||
344 | } | ||
345 | |||
346 | int PDC_color_content(short color, short *red, short *green, short *blue) | ||
347 | { | ||
348 | #ifdef PDCTHUNK | ||
349 | THUNKEDVIO vcr; | ||
350 | USHORT palbuf[4]; | ||
351 | unsigned char pal[3]; | ||
352 | int rc; | ||
353 | |||
354 | /* Read single DAC register */ | ||
355 | |||
356 | palbuf[0] = 8; | ||
357 | palbuf[1] = 0; | ||
358 | palbuf[2] = curstoreal[color]; | ||
359 | |||
360 | rc = VioGetState(&palbuf, 0); | ||
361 | if (rc) | ||
362 | return ERR; | ||
363 | |||
364 | vcr.cb = sizeof(vcr); | ||
365 | vcr.type = 3; | ||
366 | vcr.firstcolorreg = palbuf[3]; | ||
367 | vcr.numcolorregs = 1; | ||
368 | vcr.colorregaddr = PDCTHUNK(pal); | ||
369 | |||
370 | rc = VioGetState(&vcr, 0); | ||
371 | if (rc) | ||
372 | return ERR; | ||
373 | |||
374 | /* Scale and store */ | ||
375 | |||
376 | *red = DIVROUND((unsigned)(pal[0]) * 1000, 63); | ||
377 | *green = DIVROUND((unsigned)(pal[1]) * 1000, 63); | ||
378 | *blue = DIVROUND((unsigned)(pal[2]) * 1000, 63); | ||
379 | |||
380 | return OK; | ||
381 | #else | ||
382 | return ERR; | ||
383 | #endif | ||
384 | } | ||
385 | |||
386 | int PDC_init_color(short color, short red, short green, short blue) | ||
387 | { | ||
388 | #ifdef PDCTHUNK | ||
389 | THUNKEDVIO vcr; | ||
390 | USHORT palbuf[4]; | ||
391 | unsigned char pal[3]; | ||
392 | int rc; | ||
393 | |||
394 | /* Scale */ | ||
395 | |||
396 | pal[0] = DIVROUND((unsigned)red * 63, 1000); | ||
397 | pal[1] = DIVROUND((unsigned)green * 63, 1000); | ||
398 | pal[2] = DIVROUND((unsigned)blue * 63, 1000); | ||
399 | |||
400 | /* Set single DAC register */ | ||
401 | |||
402 | palbuf[0] = 8; | ||
403 | palbuf[1] = 0; | ||
404 | palbuf[2] = curstoreal[color]; | ||
405 | |||
406 | rc = VioGetState(&palbuf, 0); | ||
407 | if (rc) | ||
408 | return ERR; | ||
409 | |||
410 | vcr.cb = sizeof(vcr); | ||
411 | vcr.type = 3; | ||
412 | vcr.firstcolorreg = palbuf[3]; | ||
413 | vcr.numcolorregs = 1; | ||
414 | vcr.colorregaddr = PDCTHUNK(pal); | ||
415 | |||
416 | rc = VioSetState(&vcr, 0); | ||
417 | |||
418 | return rc ? ERR : OK; | ||
419 | #else | ||
420 | return ERR; | ||
421 | #endif | ||
422 | } |
File os2/pdcsetsc.c added (mode: 100644) (index 00000000..2a770bd2) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcsetsc.c,v 1.44 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdcsetsc | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_set_blink(bool blinkon); | ||
13 | void PDC_set_title(const char *title); | ||
14 | |||
15 | Description: | ||
16 | PDC_set_blink() toggles whether the A_BLINK attribute sets an | ||
17 | actual blink mode (TRUE), or sets the background color to high | ||
18 | intensity (FALSE). The default is platform-dependent (FALSE in | ||
19 | most cases). It returns OK if it could set the state to match | ||
20 | the given parameter, ERR otherwise. Current platforms also | ||
21 | adjust the value of COLORS according to this function -- 16 for | ||
22 | FALSE, and 8 for TRUE. | ||
23 | |||
24 | PDC_set_title() sets the title of the window in which the curses | ||
25 | program is running. This function may not do anything on some | ||
26 | platforms. (Currently it only works in Win32 and X11.) | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | PDC_set_blink - - - | ||
30 | PDC_set_title - - - | ||
31 | |||
32 | **man-end****************************************************************/ | ||
33 | |||
34 | int PDC_curs_set(int visibility) | ||
35 | { | ||
36 | #ifndef EMXVIDEO | ||
37 | VIOCURSORINFO pvioCursorInfo; | ||
38 | #endif | ||
39 | int ret_vis, hidden = 0, start = 0, end = 0; | ||
40 | |||
41 | PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); | ||
42 | |||
43 | ret_vis = SP->visibility; | ||
44 | SP->visibility = visibility; | ||
45 | |||
46 | switch(visibility) | ||
47 | { | ||
48 | case 0: /* invisible */ | ||
49 | #ifdef EMXVIDEO | ||
50 | start = end = 0; | ||
51 | #else | ||
52 | start = pdc_font / 4; | ||
53 | end = pdc_font; | ||
54 | hidden = -1; | ||
55 | #endif | ||
56 | break; | ||
57 | |||
58 | case 2: /* highly visible */ | ||
59 | start = 2; /* almost full-height block */ | ||
60 | end = pdc_font - 1; | ||
61 | break; | ||
62 | |||
63 | default: /* normal visibility */ | ||
64 | start = (SP->orig_cursor >> 8) & 0xff; | ||
65 | end = SP->orig_cursor & 0xff; | ||
66 | } | ||
67 | |||
68 | #ifdef EMXVIDEO | ||
69 | if (!visibility) | ||
70 | v_hidecursor(); | ||
71 | else | ||
72 | v_ctype(start, end); | ||
73 | #else | ||
74 | pvioCursorInfo.yStart = (USHORT)start; | ||
75 | pvioCursorInfo.cEnd = (USHORT)end; | ||
76 | pvioCursorInfo.cx = (USHORT)1; | ||
77 | pvioCursorInfo.attr = hidden; | ||
78 | VioSetCurType((PVIOCURSORINFO)&pvioCursorInfo, 0); | ||
79 | #endif | ||
80 | return ret_vis; | ||
81 | } | ||
82 | |||
83 | void PDC_set_title(const char *title) | ||
84 | { | ||
85 | PDC_LOG(("PDC_set_title() - called:<%s>\n", title)); | ||
86 | } | ||
87 | |||
88 | int PDC_set_blink(bool blinkon) | ||
89 | { | ||
90 | #ifndef EMXVIDEO | ||
91 | USHORT statebuf[3], result; | ||
92 | |||
93 | statebuf[0] = 6; /* length */ | ||
94 | statebuf[1] = 2; /* blink/intensity */ | ||
95 | statebuf[2] = !blinkon; | ||
96 | |||
97 | result = VioSetState(&statebuf, 0); | ||
98 | VioGetState(&statebuf, 0); /* needed? */ | ||
99 | |||
100 | if (pdc_color_started) | ||
101 | COLORS = statebuf[2] ? 16 : 8; | ||
102 | |||
103 | return (result == 0) ? OK : ERR; | ||
104 | #else | ||
105 | if (pdc_color_started) | ||
106 | COLORS = 16; | ||
107 | |||
108 | return blinkon ? ERR : OK; | ||
109 | #endif | ||
110 | } |
File os2/pdcutil.c added (mode: 100644) (index 00000000..290be359) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcos2.h" | ||
4 | |||
5 | RCSID("$Id: pdcutil.c,v 1.14 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | #if defined(OS2) && !defined(__EMX__) | ||
8 | APIRET APIENTRY DosSleep(ULONG ulTime); | ||
9 | #endif | ||
10 | |||
11 | void PDC_beep(void) | ||
12 | { | ||
13 | PDC_LOG(("PDC_beep() - called\n")); | ||
14 | |||
15 | #ifdef EMXVIDEO | ||
16 | putchar('\007'); | ||
17 | #else | ||
18 | DosBeep(1380, 100); | ||
19 | #endif | ||
20 | } | ||
21 | |||
22 | void PDC_napms(int ms) | ||
23 | { | ||
24 | PDC_LOG(("PDC_napms() - called: ms=%d\n", ms)); | ||
25 | |||
26 | #ifdef __EMX__ | ||
27 | _sleep2(ms); | ||
28 | #else | ||
29 | DosSleep(ms); | ||
30 | #endif | ||
31 | } | ||
32 | |||
33 | const char *PDC_sysname(void) | ||
34 | { | ||
35 | return "OS/2"; | ||
36 | } |
File os2/wccos2.mak added (mode: 100644) (index 00000000..d5900d30) | |||
1 | # Watcom WMAKE Makefile for PDCurses library - OS/2 Open Watcom 1.1+ | ||
2 | # | ||
3 | # Usage: wmake -f [path\]wccos2.mak [DEBUG=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | !ifdef %PDCURSES_SRCDIR | ||
9 | PDCURSES_SRCDIR = $(%PDCURSES_SRCDIR) | ||
10 | !else | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | |||
16 | osdir = $(PDCURSES_SRCDIR)\os2 | ||
17 | |||
18 | CC = wcc386 | ||
19 | TARGET = os2v2 | ||
20 | |||
21 | CFLAGS = /bt=$(TARGET) /wx /s /zq /i=$(PDCURSES_SRCDIR) | ||
22 | |||
23 | !ifeq DEBUG Y | ||
24 | CFLAGS += /d2 /DPDCDEBUG | ||
25 | LDFLAGS = D A op q sys $(TARGET) | ||
26 | !else | ||
27 | CFLAGS += /oneatx | ||
28 | LDFLAGS = op q sys $(TARGET) | ||
29 | !endif | ||
30 | |||
31 | LIBEXE = wlib /q /n /b /c /t | ||
32 | |||
33 | !include $(PDCURSES_SRCDIR)\watcom.mif | ||
34 | |||
35 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
36 | $(LIBEXE) $@ $(LIBOBJS) $(PDCOBJS) | ||
37 | -copy $(LIBCURSES) panel.lib | ||
38 | |||
39 | PLATFORM1 = Watcom C++ OS/2 | ||
40 | PLATFORM2 = Open Watcom 1.6 for OS/2 | ||
41 | ARCNAME = pdc$(VER)_wcc_os2 | ||
42 | |||
43 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File panel.h added (mode: 100644) (index 00000000..1d7cacef) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: panel.h,v 1.19 2008/07/13 16:08:16 wmcbrine Exp $ */ | ||
4 | |||
5 | /*----------------------------------------------------------------------* | ||
6 | * Panels for PDCurses * | ||
7 | *----------------------------------------------------------------------*/ | ||
8 | |||
9 | #ifndef __PDCURSES_PANEL_H__ | ||
10 | #define __PDCURSES_PANEL_H__ 1 | ||
11 | |||
12 | #include <curses.h> | ||
13 | |||
14 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
15 | extern "C" | ||
16 | { | ||
17 | #endif | ||
18 | |||
19 | typedef struct panelobs | ||
20 | { | ||
21 | struct panelobs *above; | ||
22 | struct panel *pan; | ||
23 | } PANELOBS; | ||
24 | |||
25 | typedef struct panel | ||
26 | { | ||
27 | WINDOW *win; | ||
28 | int wstarty; | ||
29 | int wendy; | ||
30 | int wstartx; | ||
31 | int wendx; | ||
32 | struct panel *below; | ||
33 | struct panel *above; | ||
34 | const void *user; | ||
35 | struct panelobs *obscure; | ||
36 | } PANEL; | ||
37 | |||
38 | int bottom_panel(PANEL *pan); | ||
39 | int del_panel(PANEL *pan); | ||
40 | int hide_panel(PANEL *pan); | ||
41 | int move_panel(PANEL *pan, int starty, int startx); | ||
42 | PANEL *new_panel(WINDOW *win); | ||
43 | PANEL *panel_above(const PANEL *pan); | ||
44 | PANEL *panel_below(const PANEL *pan); | ||
45 | int panel_hidden(const PANEL *pan); | ||
46 | const void *panel_userptr(const PANEL *pan); | ||
47 | WINDOW *panel_window(const PANEL *pan); | ||
48 | int replace_panel(PANEL *pan, WINDOW *win); | ||
49 | int set_panel_userptr(PANEL *pan, const void *uptr); | ||
50 | int show_panel(PANEL *pan); | ||
51 | int top_panel(PANEL *pan); | ||
52 | void update_panels(void); | ||
53 | |||
54 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
55 | } | ||
56 | #endif | ||
57 | |||
58 | #endif /* __PDCURSES_PANEL_H__ */ |
File pdcurses/README added (mode: 100644) (index 00000000..bef1c4c4) | |||
1 | PDCurses Portable Core | ||
2 | ====================== | ||
3 | |||
4 | This directory contains core PDCurses source code files common to all | ||
5 | platforms. | ||
6 | |||
7 | |||
8 | Building | ||
9 | -------- | ||
10 | |||
11 | These modules are built by the platform-specific makefiles, in the | ||
12 | platform directories. | ||
13 | |||
14 | |||
15 | Distribution Status | ||
16 | ------------------- | ||
17 | |||
18 | The files in this directory are released to the Public Domain. | ||
19 | |||
20 | |||
21 | Acknowledgements | ||
22 | ---------------- | ||
23 | |||
24 | The panel library was originally provided by | ||
25 | Warren Tucker <wht@n4hgf.mt-park.ga.us> |
File pdcurses/addch.c added (mode: 100644) (index 00000000..586d1a71) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: addch.c,v 1.54 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: addch | ||
10 | |||
11 | Synopsis: | ||
12 | int addch(const chtype ch); | ||
13 | int waddch(WINDOW *win, const chtype ch); | ||
14 | int mvaddch(int y, int x, const chtype ch); | ||
15 | int mvwaddch(WINDOW *win, int y, int x, const chtype ch); | ||
16 | int echochar(const chtype ch); | ||
17 | int wechochar(WINDOW *win, const chtype ch); | ||
18 | |||
19 | int addrawch(chtype ch); | ||
20 | int waddrawch(WINDOW *win, chtype ch); | ||
21 | int mvaddrawch(int y, int x, chtype ch); | ||
22 | int mvwaddrawch(WINDOW *win, int y, int x, chtype ch); | ||
23 | |||
24 | int add_wch(const cchar_t *wch); | ||
25 | int wadd_wch(WINDOW *win, const cchar_t *wch); | ||
26 | int mvadd_wch(int y, int x, const cchar_t *wch); | ||
27 | int mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch); | ||
28 | int echo_wchar(const cchar_t *wch); | ||
29 | int wecho_wchar(WINDOW *win, const cchar_t *wch); | ||
30 | |||
31 | Description: | ||
32 | addch() adds the chtype ch to the default window (stdscr) at the | ||
33 | current cursor position, and advances the cursor. Note that | ||
34 | chtypes can convey both text (a single character) and | ||
35 | attributes, including a color pair. add_wch() is the wide- | ||
36 | character version of this function, taking a pointer to a | ||
37 | cchar_t instead of a chtype. | ||
38 | |||
39 | waddch() is like addch(), but also lets you specify the window. | ||
40 | (This is in fact the core output routine.) wadd_wch() is the | ||
41 | wide version. | ||
42 | |||
43 | mvaddch() moves the cursor to the specified (y, x) position, and | ||
44 | adds ch to stdscr. mvadd_wch() is the wide version. | ||
45 | |||
46 | mvwaddch() moves the cursor to the specified position and adds | ||
47 | ch to the specified window. mvwadd_wch() is the wide version. | ||
48 | |||
49 | echochar() adds ch to stdscr at the current cursor position and | ||
50 | calls refresh(). echo_wchar() is the wide version. | ||
51 | |||
52 | wechochar() adds ch to the specified window and calls | ||
53 | wrefresh(). wecho_wchar() is the wide version. | ||
54 | |||
55 | addrawch(), waddrawch(), mvaddrawch() and mvwaddrawch() are | ||
56 | PDCurses-specific wrappers for addch() etc. that disable the | ||
57 | translation of control characters. | ||
58 | |||
59 | The following applies to all these functions: | ||
60 | |||
61 | If the cursor moves on to the right margin, an automatic newline | ||
62 | is performed. If scrollok is enabled, and a character is added | ||
63 | to the bottom right corner of the window, the scrolling region | ||
64 | will be scrolled up one line. If scrolling is not allowed, ERR | ||
65 | will be returned. | ||
66 | |||
67 | If ch is a tab, newline, or backspace, the cursor will be moved | ||
68 | appropriately within the window. If ch is a newline, the | ||
69 | clrtoeol routine is called before the cursor is moved to the | ||
70 | beginning of the next line. If newline mapping is off, the | ||
71 | cursor will be moved to the next line, but the x coordinate will | ||
72 | be unchanged. If ch is a tab the cursor is moved to the next | ||
73 | tab position within the window. If ch is another control | ||
74 | character, it will be drawn in the ^X notation. Calling the | ||
75 | inch() routine after adding a control character returns the | ||
76 | representation of the control character, not the control | ||
77 | character. | ||
78 | |||
79 | Video attributes can be combined with a character by ORing them | ||
80 | into the parameter. Text, including attributes, can be copied | ||
81 | from one place to another by using inch() and addch(). | ||
82 | |||
83 | Note that in PDCurses, for now, a cchar_t and a chtype are the | ||
84 | same. The text field is 16 bits wide, and is treated as Unicode | ||
85 | (UCS-2) when PDCurses is built with wide-character support | ||
86 | (define PDC_WIDE). So, in functions that take a chtype, like | ||
87 | addch(), both the wide and narrow versions will handle Unicode. | ||
88 | But for portability, you should use the wide functions. | ||
89 | |||
90 | Return Value: | ||
91 | All functions return OK on success and ERR on error. | ||
92 | |||
93 | Portability X/Open BSD SYS V | ||
94 | addch Y Y Y | ||
95 | waddch Y Y Y | ||
96 | mvaddch Y Y Y | ||
97 | mvwaddch Y Y Y | ||
98 | echochar Y - 3.0 | ||
99 | wechochar Y - 3.0 | ||
100 | addrawch - - - | ||
101 | waddrawch - - - | ||
102 | mvaddrawch - - - | ||
103 | mvwaddrawch - - - | ||
104 | add_wch Y | ||
105 | wadd_wch Y | ||
106 | mvadd_wch Y | ||
107 | mvwadd_wch Y | ||
108 | echo_wchar Y | ||
109 | wecho_wchar Y | ||
110 | |||
111 | **man-end****************************************************************/ | ||
112 | |||
113 | int waddch(WINDOW *win, const chtype ch) | ||
114 | { | ||
115 | int x, y; | ||
116 | chtype text, attr; | ||
117 | bool xlat; | ||
118 | |||
119 | PDC_LOG(("waddch() - called: win=%p ch=%x (text=%c attr=0x%x)\n", | ||
120 | win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES)); | ||
121 | |||
122 | if (!win) | ||
123 | return ERR; | ||
124 | |||
125 | x = win->_curx; | ||
126 | y = win->_cury; | ||
127 | |||
128 | if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) | ||
129 | return ERR; | ||
130 | |||
131 | xlat = !SP->raw_out && !(ch & A_ALTCHARSET); | ||
132 | text = ch & A_CHARTEXT; | ||
133 | attr = ch & A_ATTRIBUTES; | ||
134 | |||
135 | if (xlat && (text < ' ' || text == 0x7f)) | ||
136 | { | ||
137 | int x2; | ||
138 | |||
139 | switch (text) | ||
140 | { | ||
141 | case '\t': | ||
142 | for (x2 = ((x / TABSIZE) + 1) * TABSIZE; x < x2; x++) | ||
143 | { | ||
144 | if (waddch(win, attr | ' ') == ERR) | ||
145 | return ERR; | ||
146 | |||
147 | /* if tab to next line, exit the loop */ | ||
148 | |||
149 | if (!win->_curx) | ||
150 | break; | ||
151 | } | ||
152 | return OK; | ||
153 | |||
154 | case '\n': | ||
155 | /* if lf -> crlf */ | ||
156 | |||
157 | if (!SP->raw_out) | ||
158 | x = 0; | ||
159 | |||
160 | wclrtoeol(win); | ||
161 | |||
162 | if (++y > win->_bmarg) | ||
163 | { | ||
164 | y--; | ||
165 | |||
166 | if (wscrl(win, 1) == ERR) | ||
167 | return ERR; | ||
168 | } | ||
169 | |||
170 | break; | ||
171 | |||
172 | case '\b': | ||
173 | /* don't back over left margin */ | ||
174 | |||
175 | if (--x < 0) | ||
176 | case '\r': | ||
177 | x = 0; | ||
178 | |||
179 | break; | ||
180 | |||
181 | case 0x7f: | ||
182 | if (waddch(win, attr | '^') == ERR) | ||
183 | return ERR; | ||
184 | |||
185 | return waddch(win, attr | '?'); | ||
186 | |||
187 | default: | ||
188 | /* handle control chars */ | ||
189 | |||
190 | if (waddch(win, attr | '^') == ERR) | ||
191 | return ERR; | ||
192 | |||
193 | return waddch(win, ch + '@'); | ||
194 | } | ||
195 | } | ||
196 | else | ||
197 | { | ||
198 | /* If the incoming character doesn't have its own attribute, | ||
199 | then use the current attributes for the window. If it has | ||
200 | attributes but not a color component, OR the attributes to | ||
201 | the current attributes for the window. If it has a color | ||
202 | component, use the attributes solely from the incoming | ||
203 | character. */ | ||
204 | |||
205 | if (!(attr & A_COLOR)) | ||
206 | attr |= win->_attrs; | ||
207 | |||
208 | /* wrs (4/10/93): Apply the same sort of logic for the window | ||
209 | background, in that it only takes precedence if other color | ||
210 | attributes are not there and that the background character | ||
211 | will only print if the printing character is blank. */ | ||
212 | |||
213 | if (!(attr & A_COLOR)) | ||
214 | attr |= win->_bkgd & A_ATTRIBUTES; | ||
215 | else | ||
216 | attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); | ||
217 | |||
218 | if (text == ' ') | ||
219 | text = win->_bkgd & A_CHARTEXT; | ||
220 | |||
221 | /* Add the attribute back into the character. */ | ||
222 | |||
223 | text |= attr; | ||
224 | |||
225 | /* Only change _firstch/_lastch if the character to be added is | ||
226 | different from the character/attribute that is already in | ||
227 | that position in the window. */ | ||
228 | |||
229 | if (win->_y[y][x] != text) | ||
230 | { | ||
231 | if (win->_firstch[y] == _NO_CHANGE) | ||
232 | win->_firstch[y] = win->_lastch[y] = x; | ||
233 | else | ||
234 | if (x < win->_firstch[y]) | ||
235 | win->_firstch[y] = x; | ||
236 | else | ||
237 | if (x > win->_lastch[y]) | ||
238 | win->_lastch[y] = x; | ||
239 | |||
240 | win->_y[y][x] = text; | ||
241 | } | ||
242 | |||
243 | if (++x >= win->_maxx) | ||
244 | { | ||
245 | /* wrap around test */ | ||
246 | |||
247 | x = 0; | ||
248 | |||
249 | if (++y > win->_bmarg) | ||
250 | { | ||
251 | y--; | ||
252 | |||
253 | if (wscrl(win, 1) == ERR) | ||
254 | { | ||
255 | PDC_sync(win); | ||
256 | return ERR; | ||
257 | } | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | |||
262 | win->_curx = x; | ||
263 | win->_cury = y; | ||
264 | |||
265 | if (win->_immed) | ||
266 | wrefresh(win); | ||
267 | if (win->_sync) | ||
268 | wsyncup(win); | ||
269 | |||
270 | return OK; | ||
271 | } | ||
272 | |||
273 | int addch(const chtype ch) | ||
274 | { | ||
275 | PDC_LOG(("addch() - called: ch=%x\n", ch)); | ||
276 | |||
277 | return waddch(stdscr, ch); | ||
278 | } | ||
279 | |||
280 | int mvaddch(int y, int x, const chtype ch) | ||
281 | { | ||
282 | PDC_LOG(("mvaddch() - called: y=%d x=%d ch=%x\n", y, x, ch)); | ||
283 | |||
284 | if (move(y,x) == ERR) | ||
285 | return ERR; | ||
286 | |||
287 | return waddch(stdscr, ch); | ||
288 | } | ||
289 | |||
290 | int mvwaddch(WINDOW *win, int y, int x, const chtype ch) | ||
291 | { | ||
292 | PDC_LOG(("mvwaddch() - called: win=%p y=%d x=%d ch=%d\n", win, y, x, ch)); | ||
293 | |||
294 | if (wmove(win, y, x) == ERR) | ||
295 | return ERR; | ||
296 | |||
297 | return waddch(win, ch); | ||
298 | } | ||
299 | |||
300 | int echochar(const chtype ch) | ||
301 | { | ||
302 | PDC_LOG(("echochar() - called: ch=%x\n", ch)); | ||
303 | |||
304 | return wechochar(stdscr, ch); | ||
305 | } | ||
306 | |||
307 | int wechochar(WINDOW *win, const chtype ch) | ||
308 | { | ||
309 | PDC_LOG(("wechochar() - called: win=%p ch=%x\n", win, ch)); | ||
310 | |||
311 | if (waddch(win, ch) == ERR) | ||
312 | return ERR; | ||
313 | |||
314 | return wrefresh(win); | ||
315 | } | ||
316 | |||
317 | int waddrawch(WINDOW *win, chtype ch) | ||
318 | { | ||
319 | PDC_LOG(("waddrawch() - called: win=%p ch=%x (text=%c attr=0x%x)\n", | ||
320 | win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES)); | ||
321 | |||
322 | if ((ch & A_CHARTEXT) < ' ' || (ch & A_CHARTEXT) == 0x7f) | ||
323 | ch |= A_ALTCHARSET; | ||
324 | |||
325 | return waddch(win, ch); | ||
326 | } | ||
327 | |||
328 | int addrawch(chtype ch) | ||
329 | { | ||
330 | PDC_LOG(("addrawch() - called: ch=%x\n", ch)); | ||
331 | |||
332 | return waddrawch(stdscr, ch); | ||
333 | } | ||
334 | |||
335 | int mvaddrawch(int y, int x, chtype ch) | ||
336 | { | ||
337 | PDC_LOG(("mvaddrawch() - called: y=%d x=%d ch=%d\n", y, x, ch)); | ||
338 | |||
339 | if (move(y, x) == ERR) | ||
340 | return ERR; | ||
341 | |||
342 | return waddrawch(stdscr, ch); | ||
343 | } | ||
344 | |||
345 | int mvwaddrawch(WINDOW *win, int y, int x, chtype ch) | ||
346 | { | ||
347 | PDC_LOG(("mvwaddrawch() - called: win=%p y=%d x=%d ch=%d\n", | ||
348 | win, y, x, ch)); | ||
349 | |||
350 | if (wmove(win, y, x) == ERR) | ||
351 | return ERR; | ||
352 | |||
353 | return waddrawch(win, ch); | ||
354 | } | ||
355 | |||
356 | #ifdef PDC_WIDE | ||
357 | int wadd_wch(WINDOW *win, const cchar_t *wch) | ||
358 | { | ||
359 | PDC_LOG(("wadd_wch() - called: win=%p wch=%x\n", win, *wch)); | ||
360 | |||
361 | return wch ? waddch(win, *wch) : ERR; | ||
362 | } | ||
363 | |||
364 | int add_wch(const cchar_t *wch) | ||
365 | { | ||
366 | PDC_LOG(("add_wch() - called: wch=%x\n", *wch)); | ||
367 | |||
368 | return wadd_wch(stdscr, wch); | ||
369 | } | ||
370 | |||
371 | int mvadd_wch(int y, int x, const cchar_t *wch) | ||
372 | { | ||
373 | PDC_LOG(("mvaddch() - called: y=%d x=%d wch=%x\n", y, x, *wch)); | ||
374 | |||
375 | if (move(y,x) == ERR) | ||
376 | return ERR; | ||
377 | |||
378 | return wadd_wch(stdscr, wch); | ||
379 | } | ||
380 | |||
381 | int mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch) | ||
382 | { | ||
383 | PDC_LOG(("mvwaddch() - called: win=%p y=%d x=%d wch=%d\n", | ||
384 | win, y, x, *wch)); | ||
385 | |||
386 | if (wmove(win, y, x) == ERR) | ||
387 | return ERR; | ||
388 | |||
389 | return wadd_wch(win, wch); | ||
390 | } | ||
391 | |||
392 | int echo_wchar(const cchar_t *wch) | ||
393 | { | ||
394 | PDC_LOG(("echo_wchar() - called: wch=%x\n", *wch)); | ||
395 | |||
396 | return wecho_wchar(stdscr, wch); | ||
397 | } | ||
398 | |||
399 | int wecho_wchar(WINDOW *win, const cchar_t *wch) | ||
400 | { | ||
401 | PDC_LOG(("wecho_wchar() - called: win=%p wch=%x\n", win, *wch)); | ||
402 | |||
403 | if (!wch || (wadd_wch(win, wch) == ERR)) | ||
404 | return ERR; | ||
405 | |||
406 | return wrefresh(win); | ||
407 | } | ||
408 | #endif |
File pdcurses/addchstr.c added (mode: 100644) (index 00000000..0eea85a7) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: addchstr.c,v 1.43 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: addchstr | ||
10 | |||
11 | Synopsis: | ||
12 | int addchstr(const chtype *ch); | ||
13 | int addchnstr(const chtype *ch, int n); | ||
14 | int waddchstr(WINDOW *win, const chtype *ch); | ||
15 | int waddchnstr(WINDOW *win, const chtype *ch, int n); | ||
16 | int mvaddchstr(int y, int x, const chtype *ch); | ||
17 | int mvaddchnstr(int y, int x, const chtype *ch, int n); | ||
18 | int mvwaddchstr(WINDOW *, int y, int x, const chtype *ch); | ||
19 | int mvwaddchnstr(WINDOW *, int y, int x, const chtype *ch, int n); | ||
20 | |||
21 | int add_wchstr(const cchar_t *wch); | ||
22 | int add_wchnstr(const cchar_t *wch, int n); | ||
23 | int wadd_wchstr(WINDOW *win, const cchar_t *wch); | ||
24 | int wadd_wchnstr(WINDOW *win, const cchar_t *wch, int n); | ||
25 | int mvadd_wchstr(int y, int x, const cchar_t *wch); | ||
26 | int mvadd_wchnstr(int y, int x, const cchar_t *wch, int n); | ||
27 | int mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wch); | ||
28 | int mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wch, | ||
29 | int n); | ||
30 | |||
31 | Description: | ||
32 | These routines write a chtype or cchar_t string directly into | ||
33 | the window structure, starting at the current or specified | ||
34 | position. The four routines with n as the last argument copy at | ||
35 | most n elements, but no more than will fit on the line. If n = | ||
36 | -1 then the whole string is copied, up to the maximum number | ||
37 | that will fit on the line. | ||
38 | |||
39 | The cursor position is not advanced. These routines do not check | ||
40 | for newline or other special characters, nor does any line | ||
41 | wrapping occur. | ||
42 | |||
43 | Return Value: | ||
44 | All functions return OK or ERR. | ||
45 | |||
46 | Portability X/Open BSD SYS V | ||
47 | addchstr Y - 4.0 | ||
48 | waddchstr Y - 4.0 | ||
49 | mvaddchstr Y - 4.0 | ||
50 | mvwaddchstr Y - 4.0 | ||
51 | addchnstr Y - 4.0 | ||
52 | waddchnstr Y - 4.0 | ||
53 | mvaddchnstr Y - 4.0 | ||
54 | mvwaddchnstr Y - 4.0 | ||
55 | add_wchstr Y | ||
56 | wadd_wchstr Y | ||
57 | mvadd_wchstr Y | ||
58 | mvwadd_wchstr Y | ||
59 | add_wchnstr Y | ||
60 | wadd_wchnstr Y | ||
61 | mvadd_wchnstr Y | ||
62 | mvwadd_wchnstr Y | ||
63 | |||
64 | **man-end****************************************************************/ | ||
65 | |||
66 | #include <string.h> | ||
67 | |||
68 | int waddchnstr(WINDOW *win, const chtype *ch, int n) | ||
69 | { | ||
70 | int y, x, maxx, minx; | ||
71 | chtype *ptr; | ||
72 | |||
73 | PDC_LOG(("waddchnstr() - called: win=%p n=%d\n", win, n)); | ||
74 | |||
75 | if (!win || !ch || !n || n < -1) | ||
76 | return ERR; | ||
77 | |||
78 | x = win->_curx; | ||
79 | y = win->_cury; | ||
80 | ptr = &(win->_y[y][x]); | ||
81 | |||
82 | if (n == -1 || n > win->_maxx - x) | ||
83 | n = win->_maxx - x; | ||
84 | |||
85 | minx = win->_firstch[y]; | ||
86 | maxx = win->_lastch[y]; | ||
87 | |||
88 | for (; n && *ch; n--, x++, ptr++, ch++) | ||
89 | { | ||
90 | if (*ptr != *ch) | ||
91 | { | ||
92 | if (x < minx || minx == _NO_CHANGE) | ||
93 | minx = x; | ||
94 | |||
95 | if (x > maxx) | ||
96 | maxx = x; | ||
97 | |||
98 | PDC_LOG(("y %d x %d minx %d maxx %d *ptr %x *ch" | ||
99 | " %x firstch: %d lastch: %d\n", | ||
100 | y, x, minx, maxx, *ptr, *ch, | ||
101 | win->_firstch[y], win->_lastch[y])); | ||
102 | |||
103 | *ptr = *ch; | ||
104 | } | ||
105 | } | ||
106 | |||
107 | win->_firstch[y] = minx; | ||
108 | win->_lastch[y] = maxx; | ||
109 | |||
110 | return OK; | ||
111 | } | ||
112 | |||
113 | int addchstr(const chtype *ch) | ||
114 | { | ||
115 | PDC_LOG(("addchstr() - called\n")); | ||
116 | |||
117 | return waddchnstr(stdscr, ch, -1); | ||
118 | } | ||
119 | |||
120 | int addchnstr(const chtype *ch, int n) | ||
121 | { | ||
122 | PDC_LOG(("addchnstr() - called\n")); | ||
123 | |||
124 | return waddchnstr(stdscr, ch, n); | ||
125 | } | ||
126 | |||
127 | int waddchstr(WINDOW *win, const chtype *ch) | ||
128 | { | ||
129 | PDC_LOG(("waddchstr() - called: win=%p\n", win)); | ||
130 | |||
131 | return waddchnstr(win, ch, -1); | ||
132 | } | ||
133 | |||
134 | int mvaddchstr(int y, int x, const chtype *ch) | ||
135 | { | ||
136 | PDC_LOG(("mvaddchstr() - called: y %d x %d\n", y, x)); | ||
137 | |||
138 | if (move(y, x) == ERR) | ||
139 | return ERR; | ||
140 | |||
141 | return waddchnstr(stdscr, ch, -1); | ||
142 | } | ||
143 | |||
144 | int mvaddchnstr(int y, int x, const chtype *ch, int n) | ||
145 | { | ||
146 | PDC_LOG(("mvaddchnstr() - called: y %d x %d n %d\n", y, x, n)); | ||
147 | |||
148 | if (move(y, x) == ERR) | ||
149 | return ERR; | ||
150 | |||
151 | return waddchnstr(stdscr, ch, n); | ||
152 | } | ||
153 | |||
154 | int mvwaddchstr(WINDOW *win, int y, int x, const chtype *ch) | ||
155 | { | ||
156 | PDC_LOG(("mvwaddchstr() - called:\n")); | ||
157 | |||
158 | if (wmove(win, y, x) == ERR) | ||
159 | return ERR; | ||
160 | |||
161 | return waddchnstr(win, ch, -1); | ||
162 | } | ||
163 | |||
164 | int mvwaddchnstr(WINDOW *win, int y, int x, const chtype *ch, int n) | ||
165 | { | ||
166 | PDC_LOG(("mvwaddchnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
167 | |||
168 | if (wmove(win, y, x) == ERR) | ||
169 | return ERR; | ||
170 | |||
171 | return waddchnstr(win, ch, n); | ||
172 | } | ||
173 | |||
174 | #ifdef PDC_WIDE | ||
175 | int wadd_wchnstr(WINDOW *win, const cchar_t *wch, int n) | ||
176 | { | ||
177 | PDC_LOG(("wadd_wchnstr() - called: win=%p n=%d\n", win, n)); | ||
178 | |||
179 | return waddchnstr(win, wch, n); | ||
180 | } | ||
181 | |||
182 | int add_wchstr(const cchar_t *wch) | ||
183 | { | ||
184 | PDC_LOG(("add_wchstr() - called\n")); | ||
185 | |||
186 | return wadd_wchnstr(stdscr, wch, -1); | ||
187 | } | ||
188 | |||
189 | int add_wchnstr(const cchar_t *wch, int n) | ||
190 | { | ||
191 | PDC_LOG(("add_wchnstr() - called\n")); | ||
192 | |||
193 | return wadd_wchnstr(stdscr, wch, n); | ||
194 | } | ||
195 | |||
196 | int wadd_wchstr(WINDOW *win, const cchar_t *wch) | ||
197 | { | ||
198 | PDC_LOG(("wadd_wchstr() - called: win=%p\n", win)); | ||
199 | |||
200 | return wadd_wchnstr(win, wch, -1); | ||
201 | } | ||
202 | |||
203 | int mvadd_wchstr(int y, int x, const cchar_t *wch) | ||
204 | { | ||
205 | PDC_LOG(("mvadd_wchstr() - called: y %d x %d\n", y, x)); | ||
206 | |||
207 | if (move(y, x) == ERR) | ||
208 | return ERR; | ||
209 | |||
210 | return wadd_wchnstr(stdscr, wch, -1); | ||
211 | } | ||
212 | |||
213 | int mvadd_wchnstr(int y, int x, const cchar_t *wch, int n) | ||
214 | { | ||
215 | PDC_LOG(("mvadd_wchnstr() - called: y %d x %d n %d\n", y, x, n)); | ||
216 | |||
217 | if (move(y, x) == ERR) | ||
218 | return ERR; | ||
219 | |||
220 | return wadd_wchnstr(stdscr, wch, n); | ||
221 | } | ||
222 | |||
223 | int mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wch) | ||
224 | { | ||
225 | PDC_LOG(("mvwadd_wchstr() - called:\n")); | ||
226 | |||
227 | if (wmove(win, y, x) == ERR) | ||
228 | return ERR; | ||
229 | |||
230 | return wadd_wchnstr(win, wch, -1); | ||
231 | } | ||
232 | |||
233 | int mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wch, int n) | ||
234 | { | ||
235 | PDC_LOG(("mvwadd_wchnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
236 | |||
237 | if (wmove(win, y, x) == ERR) | ||
238 | return ERR; | ||
239 | |||
240 | return wadd_wchnstr(win, wch, n); | ||
241 | } | ||
242 | #endif |
File pdcurses/addstr.c added (mode: 100644) (index 00000000..ca19fd02) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: addstr.c,v 1.44 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: addstr | ||
10 | |||
11 | Synopsis: | ||
12 | int addstr(const char *str); | ||
13 | int addnstr(const char *str, int n); | ||
14 | int waddstr(WINDOW *win, const char *str); | ||
15 | int waddnstr(WINDOW *win, const char *str, int n); | ||
16 | int mvaddstr(int y, int x, const char *str); | ||
17 | int mvaddnstr(int y, int x, const char *str, int n); | ||
18 | int mvwaddstr(WINDOW *win, int y, int x, const char *str); | ||
19 | int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n); | ||
20 | |||
21 | int addwstr(const wchar_t *wstr); | ||
22 | int addnwstr(const wchar_t *wstr, int n); | ||
23 | int waddwstr(WINDOW *win, const wchar_t *wstr); | ||
24 | int waddnwstr(WINDOW *win, const wchar_t *wstr, int n); | ||
25 | int mvaddwstr(int y, int x, const wchar_t *wstr); | ||
26 | int mvaddnwstr(int y, int x, const wchar_t *wstr, int n); | ||
27 | int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr); | ||
28 | int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n); | ||
29 | |||
30 | Description: | ||
31 | These routines write all the characters of the null-terminated | ||
32 | string str or wide-character string wstr to the given window. | ||
33 | The functionality is similar to calling waddch() once for each | ||
34 | character in the string; except that, when PDCurses is built | ||
35 | with wide-character support enabled, the narrow-character | ||
36 | functions treat the string as a multibyte string in the current | ||
37 | locale, and convert it. The routines with n as the last | ||
38 | argument write at most n characters; if n is negative, then the | ||
39 | entire string will be added. | ||
40 | |||
41 | Return Value: | ||
42 | All functions return OK or ERR. | ||
43 | |||
44 | Portability X/Open BSD SYS V | ||
45 | addstr Y Y Y | ||
46 | waddstr Y Y Y | ||
47 | mvaddstr Y Y Y | ||
48 | mvwaddstr Y Y Y | ||
49 | addnstr Y - 4.0 | ||
50 | waddnstr Y - 4.0 | ||
51 | mvaddnstr Y - 4.0 | ||
52 | mvwaddnstr Y - 4.0 | ||
53 | addwstr Y | ||
54 | waddwstr Y | ||
55 | mvaddwstr Y | ||
56 | mvwaddwstr Y | ||
57 | addnwstr Y | ||
58 | waddnwstr Y | ||
59 | mvaddnwstr Y | ||
60 | mvwaddnwstr Y | ||
61 | |||
62 | **man-end****************************************************************/ | ||
63 | |||
64 | int waddnstr(WINDOW *win, const char *str, int n) | ||
65 | { | ||
66 | int i = 0; | ||
67 | |||
68 | PDC_LOG(("waddnstr() - called: string=\"%s\" n %d \n", str, n)); | ||
69 | |||
70 | if (!win || !str) | ||
71 | return ERR; | ||
72 | |||
73 | while (str[i] && (i < n || n < 0)) | ||
74 | { | ||
75 | #ifdef PDC_WIDE | ||
76 | wchar_t wch; | ||
77 | int retval = PDC_mbtowc(&wch, str + i, n >= 0 ? n - i : 6); | ||
78 | |||
79 | if (retval <= 0) | ||
80 | return OK; | ||
81 | |||
82 | i += retval; | ||
83 | #else | ||
84 | chtype wch = (unsigned char)(str[i++]); | ||
85 | #endif | ||
86 | if (waddch(win, wch) == ERR) | ||
87 | return ERR; | ||
88 | } | ||
89 | |||
90 | return OK; | ||
91 | } | ||
92 | |||
93 | int addstr(const char *str) | ||
94 | { | ||
95 | PDC_LOG(("addstr() - called: string=\"%s\"\n", str)); | ||
96 | |||
97 | return waddnstr(stdscr, str, -1); | ||
98 | } | ||
99 | |||
100 | int addnstr(const char *str, int n) | ||
101 | { | ||
102 | PDC_LOG(("addnstr() - called: string=\"%s\" n %d \n", str, n)); | ||
103 | |||
104 | return waddnstr(stdscr, str, n); | ||
105 | } | ||
106 | |||
107 | int waddstr(WINDOW *win, const char *str) | ||
108 | { | ||
109 | PDC_LOG(("waddstr() - called: string=\"%s\"\n", str)); | ||
110 | |||
111 | return waddnstr(win, str, -1); | ||
112 | } | ||
113 | |||
114 | int mvaddstr(int y, int x, const char *str) | ||
115 | { | ||
116 | PDC_LOG(("mvaddstr() - called: y %d x %d string=\"%s\"\n", y, x, str)); | ||
117 | |||
118 | if (move(y, x) == ERR) | ||
119 | return ERR; | ||
120 | |||
121 | return waddnstr(stdscr, str, -1); | ||
122 | } | ||
123 | |||
124 | int mvaddnstr(int y, int x, const char *str, int n) | ||
125 | { | ||
126 | PDC_LOG(("mvaddnstr() - called: y %d x %d string=\"%s\" n %d \n", | ||
127 | y, x, str, n)); | ||
128 | |||
129 | if (move(y, x) == ERR) | ||
130 | return ERR; | ||
131 | |||
132 | return waddnstr(stdscr, str, n); | ||
133 | } | ||
134 | |||
135 | int mvwaddstr(WINDOW *win, int y, int x, const char *str) | ||
136 | { | ||
137 | PDC_LOG(("mvwaddstr() - called: string=\"%s\"\n", str)); | ||
138 | |||
139 | if (wmove(win, y, x) == ERR) | ||
140 | return ERR; | ||
141 | |||
142 | return waddnstr(win, str, -1); | ||
143 | } | ||
144 | |||
145 | int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n) | ||
146 | { | ||
147 | PDC_LOG(("mvwaddnstr() - called: y %d x %d string=\"%s\" n %d \n", | ||
148 | y, x, str, n)); | ||
149 | |||
150 | if (wmove(win, y, x) == ERR) | ||
151 | return ERR; | ||
152 | |||
153 | return waddnstr(win, str, n); | ||
154 | } | ||
155 | |||
156 | #ifdef PDC_WIDE | ||
157 | int waddnwstr(WINDOW *win, const wchar_t *wstr, int n) | ||
158 | { | ||
159 | int i = 0; | ||
160 | |||
161 | PDC_LOG(("waddnwstr() - called\n")); | ||
162 | |||
163 | if (!win || !wstr) | ||
164 | return ERR; | ||
165 | |||
166 | while (wstr[i] && (i < n || n < 0)) | ||
167 | { | ||
168 | chtype wch = wstr[i++]; | ||
169 | |||
170 | if (waddch(win, wch) == ERR) | ||
171 | return ERR; | ||
172 | } | ||
173 | |||
174 | return OK; | ||
175 | } | ||
176 | |||
177 | int addwstr(const wchar_t *wstr) | ||
178 | { | ||
179 | PDC_LOG(("addwstr() - called\n")); | ||
180 | |||
181 | return waddnwstr(stdscr, wstr, -1); | ||
182 | } | ||
183 | |||
184 | int addnwstr(const wchar_t *wstr, int n) | ||
185 | { | ||
186 | PDC_LOG(("addnwstr() - called\n")); | ||
187 | |||
188 | return waddnwstr(stdscr, wstr, n); | ||
189 | } | ||
190 | |||
191 | int waddwstr(WINDOW *win, const wchar_t *wstr) | ||
192 | { | ||
193 | PDC_LOG(("waddwstr() - called\n")); | ||
194 | |||
195 | return waddnwstr(win, wstr, -1); | ||
196 | } | ||
197 | |||
198 | int mvaddwstr(int y, int x, const wchar_t *wstr) | ||
199 | { | ||
200 | PDC_LOG(("mvaddstr() - called\n")); | ||
201 | |||
202 | if (move(y, x) == ERR) | ||
203 | return ERR; | ||
204 | |||
205 | return waddnwstr(stdscr, wstr, -1); | ||
206 | } | ||
207 | |||
208 | int mvaddnwstr(int y, int x, const wchar_t *wstr, int n) | ||
209 | { | ||
210 | PDC_LOG(("mvaddnstr() - called\n")); | ||
211 | |||
212 | if (move(y, x) == ERR) | ||
213 | return ERR; | ||
214 | |||
215 | return waddnwstr(stdscr, wstr, n); | ||
216 | } | ||
217 | |||
218 | int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr) | ||
219 | { | ||
220 | PDC_LOG(("mvwaddstr() - called\n")); | ||
221 | |||
222 | if (wmove(win, y, x) == ERR) | ||
223 | return ERR; | ||
224 | |||
225 | return waddnwstr(win, wstr, -1); | ||
226 | } | ||
227 | |||
228 | int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n) | ||
229 | { | ||
230 | PDC_LOG(("mvwaddnstr() - called\n")); | ||
231 | |||
232 | if (wmove(win, y, x) == ERR) | ||
233 | return ERR; | ||
234 | |||
235 | return waddnwstr(win, wstr, n); | ||
236 | } | ||
237 | #endif |
File pdcurses/attr.c added (mode: 100644) (index 00000000..532384b3) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: attr.c,v 1.41 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: attr | ||
10 | |||
11 | Synopsis: | ||
12 | int attroff(chtype attrs); | ||
13 | int wattroff(WINDOW *win, chtype attrs); | ||
14 | int attron(chtype attrs); | ||
15 | int wattron(WINDOW *win, chtype attrs); | ||
16 | int attrset(chtype attrs); | ||
17 | int wattrset(WINDOW *win, chtype attrs); | ||
18 | int standend(void); | ||
19 | int wstandend(WINDOW *win); | ||
20 | int standout(void); | ||
21 | int wstandout(WINDOW *win); | ||
22 | |||
23 | int color_set(short color_pair, void *opts); | ||
24 | int wcolor_set(WINDOW *win, short color_pair, void *opts); | ||
25 | |||
26 | int attr_get(attr_t *attrs, short *color_pair, void *opts); | ||
27 | int attr_off(attr_t attrs, void *opts); | ||
28 | int attr_on(attr_t attrs, void *opts); | ||
29 | int attr_set(attr_t attrs, short color_pair, void *opts); | ||
30 | int wattr_get(WINDOW *win, attr_t *attrs, short *color_pair, | ||
31 | void *opts); | ||
32 | int wattr_off(WINDOW *win, attr_t attrs, void *opts); | ||
33 | int wattr_on(WINDOW *win, attr_t attrs, void *opts); | ||
34 | int wattr_set(WINDOW *win, attr_t attrs, short color_pair, | ||
35 | void *opts); | ||
36 | |||
37 | int chgat(int n, attr_t attr, short color, const void *opts); | ||
38 | int mvchgat(int y, int x, int n, attr_t attr, short color, | ||
39 | const void *opts); | ||
40 | int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr, | ||
41 | short color, const void *opts); | ||
42 | int wchgat(WINDOW *win, int n, attr_t attr, short color, | ||
43 | const void *opts); | ||
44 | |||
45 | chtype getattrs(WINDOW *win); | ||
46 | |||
47 | Description: | ||
48 | These functions manipulate the current attributes and/or colors | ||
49 | of the named window. These attributes can be any combination | ||
50 | of A_STANDOUT, A_REVERSE, A_BOLD, A_DIM, A_BLINK, A_UNDERLINE. | ||
51 | |||
52 | These constants are defined in <curses.h> and can be combined | ||
53 | with the bitwise-OR operator (|). | ||
54 | |||
55 | The current attributes of a window are applied to all chtypes | ||
56 | that are written into the window with waddch(). Attributes are | ||
57 | a property of the chtype, and move with the character through | ||
58 | any scrolling or insert/delete operations. | ||
59 | |||
60 | attrset() sets the current attributes of the given window to | ||
61 | attrs. attroff() turns off the named attributes without | ||
62 | affecting any other attributes; attron() turns them on. | ||
63 | color_set() sets the window color to the value of color_pair. | ||
64 | |||
65 | standout() is the same as attron(A_STANDOUT). standend() is the | ||
66 | same as attrset(A_NORMAL); that is, it turns off all attributes. | ||
67 | |||
68 | Return Value: | ||
69 | All functions return OK on success and ERR on error. | ||
70 | |||
71 | Portability X/Open BSD SYS V | ||
72 | attroff Y Y Y | ||
73 | wattroff Y Y Y | ||
74 | attron Y Y Y | ||
75 | wattron Y Y Y | ||
76 | attrset Y Y Y | ||
77 | wattrset Y Y Y | ||
78 | standend Y Y Y | ||
79 | wstandend Y Y Y | ||
80 | standout Y Y Y | ||
81 | wstandout Y Y Y | ||
82 | color_set Y | ||
83 | wcolor_set Y | ||
84 | attr_get Y | ||
85 | wattr_get Y | ||
86 | attr_on Y | ||
87 | wattr_on Y | ||
88 | attr_off Y | ||
89 | wattr_off Y | ||
90 | attr_set Y | ||
91 | wattr_set Y | ||
92 | chgat Y | ||
93 | wchgat Y | ||
94 | mvchgat Y | ||
95 | mvwchgat Y | ||
96 | getattrs - | ||
97 | |||
98 | **man-end****************************************************************/ | ||
99 | |||
100 | int wattroff(WINDOW *win, chtype attrs) | ||
101 | { | ||
102 | PDC_LOG(("wattroff() - called\n")); | ||
103 | |||
104 | if (!win) | ||
105 | return ERR; | ||
106 | |||
107 | win->_attrs &= (~attrs & A_ATTRIBUTES); | ||
108 | |||
109 | return OK; | ||
110 | } | ||
111 | |||
112 | int attroff(chtype attrs) | ||
113 | { | ||
114 | PDC_LOG(("attroff() - called\n")); | ||
115 | |||
116 | return wattroff(stdscr, attrs); | ||
117 | } | ||
118 | |||
119 | int wattron(WINDOW *win, chtype attrs) | ||
120 | { | ||
121 | chtype newcolr, oldcolr, newattr, oldattr; | ||
122 | |||
123 | PDC_LOG(("wattron() - called\n")); | ||
124 | |||
125 | if (!win) | ||
126 | return ERR; | ||
127 | |||
128 | if ((win->_attrs & A_COLOR) && (attrs & A_COLOR)) | ||
129 | { | ||
130 | oldcolr = win->_attrs & A_COLOR; | ||
131 | oldattr = win->_attrs ^ oldcolr; | ||
132 | newcolr = attrs & A_COLOR; | ||
133 | newattr = (attrs & A_ATTRIBUTES) ^ newcolr; | ||
134 | newattr |= oldattr; | ||
135 | win->_attrs = newattr | newcolr; | ||
136 | } | ||
137 | else | ||
138 | win->_attrs |= (attrs & A_ATTRIBUTES); | ||
139 | |||
140 | return OK; | ||
141 | } | ||
142 | |||
143 | int attron(chtype attrs) | ||
144 | { | ||
145 | PDC_LOG(("attron() - called\n")); | ||
146 | |||
147 | return wattron(stdscr, attrs); | ||
148 | } | ||
149 | |||
150 | int wattrset(WINDOW *win, chtype attrs) | ||
151 | { | ||
152 | PDC_LOG(("wattrset() - called\n")); | ||
153 | |||
154 | if (!win) | ||
155 | return ERR; | ||
156 | |||
157 | win->_attrs = attrs & A_ATTRIBUTES; | ||
158 | |||
159 | return OK; | ||
160 | } | ||
161 | |||
162 | int attrset(chtype attrs) | ||
163 | { | ||
164 | PDC_LOG(("attrset() - called\n")); | ||
165 | |||
166 | return wattrset(stdscr, attrs); | ||
167 | } | ||
168 | |||
169 | int standend(void) | ||
170 | { | ||
171 | PDC_LOG(("standend() - called\n")); | ||
172 | |||
173 | return wattrset(stdscr, A_NORMAL); | ||
174 | } | ||
175 | |||
176 | int standout(void) | ||
177 | { | ||
178 | PDC_LOG(("standout() - called\n")); | ||
179 | |||
180 | return wattrset(stdscr, A_STANDOUT); | ||
181 | } | ||
182 | |||
183 | int wstandend(WINDOW *win) | ||
184 | { | ||
185 | PDC_LOG(("wstandend() - called\n")); | ||
186 | |||
187 | return wattrset(win, A_NORMAL); | ||
188 | } | ||
189 | |||
190 | int wstandout(WINDOW *win) | ||
191 | { | ||
192 | PDC_LOG(("wstandout() - called\n")); | ||
193 | |||
194 | return wattrset(win, A_STANDOUT); | ||
195 | } | ||
196 | |||
197 | chtype getattrs(WINDOW *win) | ||
198 | { | ||
199 | return win ? win->_attrs : 0; | ||
200 | } | ||
201 | |||
202 | int wcolor_set(WINDOW *win, short color_pair, void *opts) | ||
203 | { | ||
204 | PDC_LOG(("wcolor_set() - called\n")); | ||
205 | |||
206 | if (!win) | ||
207 | return ERR; | ||
208 | |||
209 | win->_attrs = (win->_attrs & ~A_COLOR) | COLOR_PAIR(color_pair); | ||
210 | |||
211 | return OK; | ||
212 | } | ||
213 | |||
214 | int color_set(short color_pair, void *opts) | ||
215 | { | ||
216 | PDC_LOG(("color_set() - called\n")); | ||
217 | |||
218 | return wcolor_set(stdscr, color_pair, opts); | ||
219 | } | ||
220 | |||
221 | int wattr_get(WINDOW *win, attr_t *attrs, short *color_pair, void *opts) | ||
222 | { | ||
223 | PDC_LOG(("wattr_get() - called\n")); | ||
224 | |||
225 | if (!win) | ||
226 | return ERR; | ||
227 | |||
228 | if (attrs) | ||
229 | *attrs = win->_attrs & (A_ATTRIBUTES & ~A_COLOR); | ||
230 | |||
231 | if (color_pair) | ||
232 | *color_pair = PAIR_NUMBER(win->_attrs); | ||
233 | |||
234 | return OK; | ||
235 | } | ||
236 | |||
237 | int attr_get(attr_t *attrs, short *color_pair, void *opts) | ||
238 | { | ||
239 | PDC_LOG(("attr_get() - called\n")); | ||
240 | |||
241 | return wattr_get(stdscr, attrs, color_pair, opts); | ||
242 | } | ||
243 | |||
244 | int wattr_off(WINDOW *win, attr_t attrs, void *opts) | ||
245 | { | ||
246 | PDC_LOG(("wattr_off() - called\n")); | ||
247 | |||
248 | return wattroff(win, attrs); | ||
249 | } | ||
250 | |||
251 | int attr_off(attr_t attrs, void *opts) | ||
252 | { | ||
253 | PDC_LOG(("attr_off() - called\n")); | ||
254 | |||
255 | return wattroff(stdscr, attrs); | ||
256 | } | ||
257 | |||
258 | int wattr_on(WINDOW *win, attr_t attrs, void *opts) | ||
259 | { | ||
260 | PDC_LOG(("wattr_off() - called\n")); | ||
261 | |||
262 | return wattron(win, attrs); | ||
263 | } | ||
264 | |||
265 | int attr_on(attr_t attrs, void *opts) | ||
266 | { | ||
267 | PDC_LOG(("attr_on() - called\n")); | ||
268 | |||
269 | return wattron(stdscr, attrs); | ||
270 | } | ||
271 | |||
272 | int wattr_set(WINDOW *win, attr_t attrs, short color_pair, void *opts) | ||
273 | { | ||
274 | PDC_LOG(("wattr_set() - called\n")); | ||
275 | |||
276 | if (!win) | ||
277 | return ERR; | ||
278 | |||
279 | win->_attrs = (attrs & (A_ATTRIBUTES & ~A_COLOR)) | COLOR_PAIR(color_pair); | ||
280 | |||
281 | return OK; | ||
282 | } | ||
283 | |||
284 | int attr_set(attr_t attrs, short color_pair, void *opts) | ||
285 | { | ||
286 | PDC_LOG(("attr_get() - called\n")); | ||
287 | |||
288 | return wattr_set(stdscr, attrs, color_pair, opts); | ||
289 | } | ||
290 | |||
291 | int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts) | ||
292 | { | ||
293 | chtype *dest, newattr; | ||
294 | int startpos, endpos; | ||
295 | |||
296 | PDC_LOG(("wchgat() - called\n")); | ||
297 | |||
298 | if (!win) | ||
299 | return ERR; | ||
300 | |||
301 | newattr = (attr & A_ATTRIBUTES) | COLOR_PAIR(color); | ||
302 | |||
303 | startpos = win->_curx; | ||
304 | endpos = ((n < 0) ? win->_maxx : min(startpos + n, win->_maxx)) - 1; | ||
305 | dest = win->_y[win->_cury]; | ||
306 | |||
307 | for (n = startpos; n <= endpos; n++) | ||
308 | dest[n] = (dest[n] & A_CHARTEXT) | newattr; | ||
309 | |||
310 | n = win->_cury; | ||
311 | |||
312 | if (startpos < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) | ||
313 | win->_firstch[n] = startpos; | ||
314 | |||
315 | if (endpos > win->_lastch[n]) | ||
316 | win->_lastch[n] = endpos; | ||
317 | |||
318 | PDC_sync(win); | ||
319 | |||
320 | return OK; | ||
321 | } | ||
322 | |||
323 | int chgat(int n, attr_t attr, short color, const void *opts) | ||
324 | { | ||
325 | PDC_LOG(("chgat() - called\n")); | ||
326 | |||
327 | return wchgat(stdscr, n, attr, color, opts); | ||
328 | } | ||
329 | |||
330 | int mvchgat(int y, int x, int n, attr_t attr, short color, const void *opts) | ||
331 | { | ||
332 | PDC_LOG(("mvchgat() - called\n")); | ||
333 | |||
334 | if (move(y, x) == ERR) | ||
335 | return ERR; | ||
336 | |||
337 | return wchgat(stdscr, n, attr, color, opts); | ||
338 | } | ||
339 | |||
340 | int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr, short color, | ||
341 | const void *opts) | ||
342 | { | ||
343 | PDC_LOG(("mvwchgat() - called\n")); | ||
344 | |||
345 | if (wmove(win, y, x) == ERR) | ||
346 | return ERR; | ||
347 | |||
348 | return wchgat(win, n, attr, color, opts); | ||
349 | } |
File pdcurses/beep.c added (mode: 100644) (index 00000000..9e92f457) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: beep.c,v 1.34 2008/07/13 16:08:17 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: beep | ||
10 | |||
11 | Synopsis: | ||
12 | int beep(void); | ||
13 | int flash(void); | ||
14 | |||
15 | Description: | ||
16 | beep() sounds the audible bell on the terminal, if possible; | ||
17 | if not, it calls flash(). | ||
18 | |||
19 | flash() "flashes" the screen, by inverting the foreground and | ||
20 | background of every cell, pausing, and then restoring the | ||
21 | original attributes. | ||
22 | |||
23 | Return Value: | ||
24 | These functions return OK. | ||
25 | |||
26 | Portability X/Open BSD SYS V | ||
27 | beep Y Y Y | ||
28 | flash Y Y Y | ||
29 | |||
30 | **man-end****************************************************************/ | ||
31 | |||
32 | int beep(void) | ||
33 | { | ||
34 | PDC_LOG(("beep() - called\n")); | ||
35 | |||
36 | if (SP->audible) | ||
37 | PDC_beep(); | ||
38 | else | ||
39 | flash(); | ||
40 | |||
41 | return OK; | ||
42 | } | ||
43 | |||
44 | int flash(void) | ||
45 | { | ||
46 | int z, y, x; | ||
47 | |||
48 | PDC_LOG(("flash() - called\n")); | ||
49 | |||
50 | /* Reverse each cell; wait; restore the screen */ | ||
51 | |||
52 | for (z = 0; z < 2; z++) | ||
53 | { | ||
54 | for (y = 0; y < LINES; y++) | ||
55 | for (x = 0; x < COLS; x++) | ||
56 | curscr->_y[y][x] ^= A_REVERSE; | ||
57 | |||
58 | wrefresh(curscr); | ||
59 | |||
60 | if (!z) | ||
61 | napms(50); | ||
62 | } | ||
63 | |||
64 | return OK; | ||
65 | } |
File pdcurses/bkgd.c added (mode: 100644) (index 00000000..083239e1) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: bkgd.c,v 1.39 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: bkgd | ||
10 | |||
11 | Synopsis: | ||
12 | int bkgd(chtype ch); | ||
13 | void bkgdset(chtype ch); | ||
14 | chtype getbkgd(WINDOW *win); | ||
15 | int wbkgd(WINDOW *win, chtype ch); | ||
16 | void wbkgdset(WINDOW *win, chtype ch); | ||
17 | |||
18 | int bkgrnd(const cchar_t *wch); | ||
19 | void bkgrndset(const cchar_t *wch); | ||
20 | int getbkgrnd(cchar_t *wch); | ||
21 | int wbkgrnd(WINDOW *win, const cchar_t *wch); | ||
22 | void wbkgrndset(WINDOW *win, const cchar_t *wch); | ||
23 | int wgetbkgrnd(WINDOW *win, cchar_t *wch); | ||
24 | |||
25 | Description: | ||
26 | bkgdset() and wbkgdset() manipulate the background of a window. | ||
27 | The background is a chtype consisting of any combination of | ||
28 | attributes and a character; it is combined with each chtype | ||
29 | added or inserted to the window by waddch() or winsch(). Only | ||
30 | the attribute part is used to set the background of non-blank | ||
31 | characters, while both character and attributes are used for | ||
32 | blank positions. | ||
33 | |||
34 | bkgd() and wbkgd() not only change the background, but apply it | ||
35 | immediately to every cell in the window. | ||
36 | |||
37 | The attributes that are defined with the attrset()/attron() set | ||
38 | of functions take precedence over the background attributes if | ||
39 | there is a conflict (e.g., different color pairs). | ||
40 | |||
41 | Return Value: | ||
42 | bkgd() and wbkgd() return OK, unless the window is NULL, in | ||
43 | which case they return ERR. | ||
44 | |||
45 | Portability X/Open BSD SYS V | ||
46 | bkgd Y - 4.0 | ||
47 | bkgdset Y - 4.0 | ||
48 | getbkgd Y | ||
49 | wbkgd Y - 4.0 | ||
50 | wbkgdset Y - 4.0 | ||
51 | bkgrnd Y | ||
52 | bkgrndset Y | ||
53 | getbkgrnd Y | ||
54 | wbkgrnd Y | ||
55 | wbkgrndset Y | ||
56 | wgetbkgrnd Y | ||
57 | |||
58 | **man-end****************************************************************/ | ||
59 | |||
60 | int wbkgd(WINDOW *win, chtype ch) | ||
61 | { | ||
62 | int x, y; | ||
63 | chtype oldcolr, oldch, newcolr, newch, colr, attr; | ||
64 | chtype oldattr = 0, newattr = 0; | ||
65 | chtype *winptr; | ||
66 | |||
67 | PDC_LOG(("wbkgd() - called\n")); | ||
68 | |||
69 | if (!win) | ||
70 | return ERR; | ||
71 | |||
72 | if (win->_bkgd == ch) | ||
73 | return OK; | ||
74 | |||
75 | oldcolr = win->_bkgd & A_COLOR; | ||
76 | if (oldcolr) | ||
77 | oldattr = (win->_bkgd & A_ATTRIBUTES) ^ oldcolr; | ||
78 | |||
79 | oldch = win->_bkgd & A_CHARTEXT; | ||
80 | |||
81 | wbkgdset(win, ch); | ||
82 | |||
83 | newcolr = win->_bkgd & A_COLOR; | ||
84 | if (newcolr) | ||
85 | newattr = (win->_bkgd & A_ATTRIBUTES) ^ newcolr; | ||
86 | |||
87 | newch = win->_bkgd & A_CHARTEXT; | ||
88 | |||
89 | /* what follows is what seems to occur in the System V | ||
90 | implementation of this routine */ | ||
91 | |||
92 | for (y = 0; y < win->_maxy; y++) | ||
93 | { | ||
94 | for (x = 0; x < win->_maxx; x++) | ||
95 | { | ||
96 | winptr = win->_y[y] + x; | ||
97 | |||
98 | ch = *winptr; | ||
99 | |||
100 | /* determine the colors and attributes of the character read | ||
101 | from the window */ | ||
102 | |||
103 | colr = ch & A_COLOR; | ||
104 | attr = ch & (A_ATTRIBUTES ^ A_COLOR); | ||
105 | |||
106 | /* if the color is the same as the old background color, | ||
107 | then make it the new background color, otherwise leave it */ | ||
108 | |||
109 | if (colr == oldcolr) | ||
110 | colr = newcolr; | ||
111 | |||
112 | /* remove any attributes (non color) from the character that | ||
113 | were part of the old background, then combine the | ||
114 | remaining ones with the new background */ | ||
115 | |||
116 | attr ^= oldattr; | ||
117 | attr |= newattr; | ||
118 | |||
119 | /* change character if it is there because it was the old | ||
120 | background character */ | ||
121 | |||
122 | ch &= A_CHARTEXT; | ||
123 | if (ch == oldch) | ||
124 | ch = newch; | ||
125 | |||
126 | ch |= (attr | colr); | ||
127 | |||
128 | *winptr = ch; | ||
129 | |||
130 | } | ||
131 | } | ||
132 | |||
133 | touchwin(win); | ||
134 | PDC_sync(win); | ||
135 | return OK; | ||
136 | } | ||
137 | |||
138 | int bkgd(chtype ch) | ||
139 | { | ||
140 | PDC_LOG(("bkgd() - called\n")); | ||
141 | |||
142 | return wbkgd(stdscr, ch); | ||
143 | } | ||
144 | |||
145 | void wbkgdset(WINDOW *win, chtype ch) | ||
146 | { | ||
147 | PDC_LOG(("wbkgdset() - called\n")); | ||
148 | |||
149 | if (win) | ||
150 | { | ||
151 | if (!(ch & A_CHARTEXT)) | ||
152 | ch |= ' '; | ||
153 | |||
154 | win->_bkgd = ch; | ||
155 | } | ||
156 | } | ||
157 | |||
158 | void bkgdset(chtype ch) | ||
159 | { | ||
160 | PDC_LOG(("bkgdset() - called\n")); | ||
161 | |||
162 | wbkgdset(stdscr, ch); | ||
163 | } | ||
164 | |||
165 | chtype getbkgd(WINDOW *win) | ||
166 | { | ||
167 | PDC_LOG(("getbkgd() - called\n")); | ||
168 | |||
169 | return win ? win->_bkgd : (chtype)ERR; | ||
170 | } | ||
171 | |||
172 | #ifdef PDC_WIDE | ||
173 | int wbkgrnd(WINDOW *win, const cchar_t *wch) | ||
174 | { | ||
175 | PDC_LOG(("wbkgrnd() - called\n")); | ||
176 | |||
177 | return wch ? wbkgd(win, *wch) : ERR; | ||
178 | } | ||
179 | |||
180 | int bkgrnd(const cchar_t *wch) | ||
181 | { | ||
182 | PDC_LOG(("bkgrnd() - called\n")); | ||
183 | |||
184 | return wbkgrnd(stdscr, wch); | ||
185 | } | ||
186 | |||
187 | void wbkgrndset(WINDOW *win, const cchar_t *wch) | ||
188 | { | ||
189 | PDC_LOG(("wbkgdset() - called\n")); | ||
190 | |||
191 | if (wch) | ||
192 | wbkgdset(win, *wch); | ||
193 | } | ||
194 | |||
195 | void bkgrndset(const cchar_t *wch) | ||
196 | { | ||
197 | PDC_LOG(("bkgrndset() - called\n")); | ||
198 | |||
199 | wbkgrndset(stdscr, wch); | ||
200 | } | ||
201 | |||
202 | int wgetbkgrnd(WINDOW *win, cchar_t *wch) | ||
203 | { | ||
204 | PDC_LOG(("wgetbkgrnd() - called\n")); | ||
205 | |||
206 | if (!win || !wch) | ||
207 | return ERR; | ||
208 | |||
209 | *wch = win->_bkgd; | ||
210 | |||
211 | return OK; | ||
212 | } | ||
213 | |||
214 | int getbkgrnd(cchar_t *wch) | ||
215 | { | ||
216 | PDC_LOG(("getbkgrnd() - called\n")); | ||
217 | |||
218 | return wgetbkgrnd(stdscr, wch); | ||
219 | } | ||
220 | #endif |
File pdcurses/border.c added (mode: 100644) (index 00000000..ec86aafd) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: border.c,v 1.53 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: border | ||
10 | |||
11 | Synopsis: | ||
12 | int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, | ||
13 | chtype tr, chtype bl, chtype br); | ||
14 | int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, | ||
15 | chtype bs, chtype tl, chtype tr, chtype bl, chtype br); | ||
16 | int box(WINDOW *win, chtype verch, chtype horch); | ||
17 | int hline(chtype ch, int n); | ||
18 | int vline(chtype ch, int n); | ||
19 | int whline(WINDOW *win, chtype ch, int n); | ||
20 | int wvline(WINDOW *win, chtype ch, int n); | ||
21 | int mvhline(int y, int x, chtype ch, int n); | ||
22 | int mvvline(int y, int x, chtype ch, int n); | ||
23 | int mvwhline(WINDOW *win, int y, int x, chtype ch, int n); | ||
24 | int mvwvline(WINDOW *win, int y, int x, chtype ch, int n); | ||
25 | |||
26 | int border_set(const cchar_t *ls, const cchar_t *rs, | ||
27 | const cchar_t *ts, const cchar_t *bs, | ||
28 | const cchar_t *tl, const cchar_t *tr, | ||
29 | const cchar_t *bl, const cchar_t *br); | ||
30 | int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, | ||
31 | const cchar_t *ts, const cchar_t *bs, | ||
32 | const cchar_t *tl, const cchar_t *tr, | ||
33 | const cchar_t *bl, const cchar_t *br); | ||
34 | int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch); | ||
35 | int hline_set(const cchar_t *wch, int n); | ||
36 | int vline_set(const cchar_t *wch, int n); | ||
37 | int whline_set(WINDOW *win, const cchar_t *wch, int n); | ||
38 | int wvline_set(WINDOW *win, const cchar_t *wch, int n); | ||
39 | int mvhline_set(int y, int x, const cchar_t *wch, int n); | ||
40 | int mvvline_set(int y, int x, const cchar_t *wch, int n); | ||
41 | int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); | ||
42 | int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); | ||
43 | |||
44 | Description: | ||
45 | border(), wborder(), and box() draw a border around the edge of | ||
46 | the window. If any argument is zero, an appropriate default is | ||
47 | used: | ||
48 | |||
49 | ls left side of border ACS_VLINE | ||
50 | rs right side of border ACS_VLINE | ||
51 | ts top side of border ACS_HLINE | ||
52 | bs bottom side of border ACS_HLINE | ||
53 | tl top left corner of border ACS_ULCORNER | ||
54 | tr top right corner of border ACS_URCORNER | ||
55 | bl bottom left corner of border ACS_LLCORNER | ||
56 | br bottom right corner of border ACS_LRCORNER | ||
57 | |||
58 | hline() and whline() draw a horizontal line, using ch, starting | ||
59 | from the current cursor position. The cursor position does not | ||
60 | change. The line is at most n characters long, or as many as | ||
61 | will fit in the window. | ||
62 | |||
63 | vline() and wvline() draw a vertical line, using ch, starting | ||
64 | from the current cursor position. The cursor position does not | ||
65 | change. The line is at most n characters long, or as many as | ||
66 | will fit in the window. | ||
67 | |||
68 | Return Value: | ||
69 | These functions return OK on success and ERR on error. | ||
70 | |||
71 | Portability X/Open BSD SYS V | ||
72 | border Y - 4.0 | ||
73 | wborder Y - 4.0 | ||
74 | box Y Y Y | ||
75 | hline Y - 4.0 | ||
76 | vline Y - 4.0 | ||
77 | whline Y - 4.0 | ||
78 | wvline Y - 4.0 | ||
79 | mvhline Y | ||
80 | mvvline Y | ||
81 | mvwhline Y | ||
82 | mvwvline Y | ||
83 | border_set Y | ||
84 | wborder_set Y | ||
85 | box_set Y | ||
86 | hline_set Y | ||
87 | vline_set Y | ||
88 | whline_set Y | ||
89 | wvline_set Y | ||
90 | mvhline_set Y | ||
91 | mvvline_set Y | ||
92 | mvwhline_set Y | ||
93 | mvwvline_set Y | ||
94 | |||
95 | **man-end****************************************************************/ | ||
96 | |||
97 | /* _attr_passthru() -- Takes a single chtype 'ch' and checks if the | ||
98 | current attribute of window 'win', as set by wattrset(), and/or the | ||
99 | current background of win, as set by wbkgd(), should by combined with | ||
100 | it. Attributes set explicitly in ch take precedence. */ | ||
101 | |||
102 | static chtype _attr_passthru(WINDOW *win, chtype ch) | ||
103 | { | ||
104 | chtype attr; | ||
105 | |||
106 | /* If the incoming character doesn't have its own attribute, then | ||
107 | use the current attributes for the window. If the incoming | ||
108 | character has attributes, but not a color component, OR the | ||
109 | attributes to the current attributes for the window. If the | ||
110 | incoming character has a color component, use only the attributes | ||
111 | from the incoming character. */ | ||
112 | |||
113 | attr = ch & A_ATTRIBUTES; | ||
114 | if (!(attr & A_COLOR)) | ||
115 | attr |= win->_attrs; | ||
116 | |||
117 | /* wrs (4/10/93) -- Apply the same sort of logic for the window | ||
118 | background, in that it only takes precedence if other color | ||
119 | attributes are not there. */ | ||
120 | |||
121 | if (!(attr & A_COLOR)) | ||
122 | attr |= win->_bkgd & A_ATTRIBUTES; | ||
123 | else | ||
124 | attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); | ||
125 | |||
126 | ch = (ch & A_CHARTEXT) | attr; | ||
127 | |||
128 | return ch; | ||
129 | } | ||
130 | |||
131 | int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, | ||
132 | chtype tl, chtype tr, chtype bl, chtype br) | ||
133 | { | ||
134 | int i, ymax, xmax; | ||
135 | |||
136 | PDC_LOG(("wborder() - called\n")); | ||
137 | |||
138 | if (!win) | ||
139 | return ERR; | ||
140 | |||
141 | ymax = win->_maxy - 1; | ||
142 | xmax = win->_maxx - 1; | ||
143 | |||
144 | ls = _attr_passthru(win, ls ? ls : ACS_VLINE); | ||
145 | rs = _attr_passthru(win, rs ? rs : ACS_VLINE); | ||
146 | ts = _attr_passthru(win, ts ? ts : ACS_HLINE); | ||
147 | bs = _attr_passthru(win, bs ? bs : ACS_HLINE); | ||
148 | tl = _attr_passthru(win, tl ? tl : ACS_ULCORNER); | ||
149 | tr = _attr_passthru(win, tr ? tr : ACS_URCORNER); | ||
150 | bl = _attr_passthru(win, bl ? bl : ACS_LLCORNER); | ||
151 | br = _attr_passthru(win, br ? br : ACS_LRCORNER); | ||
152 | |||
153 | for (i = 1; i < xmax; i++) | ||
154 | { | ||
155 | win->_y[0][i] = ts; | ||
156 | win->_y[ymax][i] = bs; | ||
157 | } | ||
158 | |||
159 | for (i = 1; i < ymax; i++) | ||
160 | { | ||
161 | win->_y[i][0] = ls; | ||
162 | win->_y[i][xmax] = rs; | ||
163 | } | ||
164 | |||
165 | win->_y[0][0] = tl; | ||
166 | win->_y[0][xmax] = tr; | ||
167 | win->_y[ymax][0] = bl; | ||
168 | win->_y[ymax][xmax] = br; | ||
169 | |||
170 | for (i = 0; i <= ymax; i++) | ||
171 | { | ||
172 | win->_firstch[i] = 0; | ||
173 | win->_lastch[i] = xmax; | ||
174 | } | ||
175 | |||
176 | PDC_sync(win); | ||
177 | |||
178 | return OK; | ||
179 | } | ||
180 | |||
181 | int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, | ||
182 | chtype tr, chtype bl, chtype br) | ||
183 | { | ||
184 | PDC_LOG(("border() - called\n")); | ||
185 | |||
186 | return wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br); | ||
187 | } | ||
188 | |||
189 | int box(WINDOW *win, chtype verch, chtype horch) | ||
190 | { | ||
191 | PDC_LOG(("box() - called\n")); | ||
192 | |||
193 | return wborder(win, verch, verch, horch, horch, 0, 0, 0, 0); | ||
194 | } | ||
195 | |||
196 | int whline(WINDOW *win, chtype ch, int n) | ||
197 | { | ||
198 | chtype *dest; | ||
199 | int startpos, endpos; | ||
200 | |||
201 | PDC_LOG(("whline() - called\n")); | ||
202 | |||
203 | if (!win || n < 1) | ||
204 | return ERR; | ||
205 | |||
206 | startpos = win->_curx; | ||
207 | endpos = min(startpos + n, win->_maxx) - 1; | ||
208 | dest = win->_y[win->_cury]; | ||
209 | ch = _attr_passthru(win, ch ? ch : ACS_HLINE); | ||
210 | |||
211 | for (n = startpos; n <= endpos; n++) | ||
212 | dest[n] = ch; | ||
213 | |||
214 | n = win->_cury; | ||
215 | |||
216 | if (startpos < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) | ||
217 | win->_firstch[n] = startpos; | ||
218 | |||
219 | if (endpos > win->_lastch[n]) | ||
220 | win->_lastch[n] = endpos; | ||
221 | |||
222 | PDC_sync(win); | ||
223 | |||
224 | return OK; | ||
225 | } | ||
226 | |||
227 | int hline(chtype ch, int n) | ||
228 | { | ||
229 | PDC_LOG(("hline() - called\n")); | ||
230 | |||
231 | return whline(stdscr, ch, n); | ||
232 | } | ||
233 | |||
234 | int mvhline(int y, int x, chtype ch, int n) | ||
235 | { | ||
236 | PDC_LOG(("mvhline() - called\n")); | ||
237 | |||
238 | if (move(y, x) == ERR) | ||
239 | return ERR; | ||
240 | |||
241 | return whline(stdscr, ch, n); | ||
242 | } | ||
243 | |||
244 | int mvwhline(WINDOW *win, int y, int x, chtype ch, int n) | ||
245 | { | ||
246 | PDC_LOG(("mvwhline() - called\n")); | ||
247 | |||
248 | if (wmove(win, y, x) == ERR) | ||
249 | return ERR; | ||
250 | |||
251 | return whline(win, ch, n); | ||
252 | } | ||
253 | |||
254 | int wvline(WINDOW *win, chtype ch, int n) | ||
255 | { | ||
256 | int endpos, x; | ||
257 | |||
258 | PDC_LOG(("wvline() - called\n")); | ||
259 | |||
260 | if (!win || n < 1) | ||
261 | return ERR; | ||
262 | |||
263 | endpos = min(win->_cury + n, win->_maxy); | ||
264 | x = win->_curx; | ||
265 | |||
266 | ch = _attr_passthru(win, ch ? ch : ACS_VLINE); | ||
267 | |||
268 | for (n = win->_cury; n < endpos; n++) | ||
269 | { | ||
270 | win->_y[n][x] = ch; | ||
271 | |||
272 | if (x < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) | ||
273 | win->_firstch[n] = x; | ||
274 | |||
275 | if (x > win->_lastch[n]) | ||
276 | win->_lastch[n] = x; | ||
277 | } | ||
278 | |||
279 | PDC_sync(win); | ||
280 | |||
281 | return OK; | ||
282 | } | ||
283 | |||
284 | int vline(chtype ch, int n) | ||
285 | { | ||
286 | PDC_LOG(("vline() - called\n")); | ||
287 | |||
288 | return wvline(stdscr, ch, n); | ||
289 | } | ||
290 | |||
291 | int mvvline(int y, int x, chtype ch, int n) | ||
292 | { | ||
293 | PDC_LOG(("mvvline() - called\n")); | ||
294 | |||
295 | if (move(y, x) == ERR) | ||
296 | return ERR; | ||
297 | |||
298 | return wvline(stdscr, ch, n); | ||
299 | } | ||
300 | |||
301 | int mvwvline(WINDOW *win, int y, int x, chtype ch, int n) | ||
302 | { | ||
303 | PDC_LOG(("mvwvline() - called\n")); | ||
304 | |||
305 | if (wmove(win, y, x) == ERR) | ||
306 | return ERR; | ||
307 | |||
308 | return wvline(win, ch, n); | ||
309 | } | ||
310 | |||
311 | #ifdef PDC_WIDE | ||
312 | int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, | ||
313 | const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, | ||
314 | const cchar_t *tr, const cchar_t *bl, const cchar_t *br) | ||
315 | { | ||
316 | PDC_LOG(("wborder_set() - called\n")); | ||
317 | |||
318 | return wborder(win, ls ? *ls : 0, rs ? *rs : 0, ts ? *ts : 0, | ||
319 | bs ? *bs : 0, tl ? *tl : 0, tr ? *tr : 0, | ||
320 | bl ? *bl : 0, br ? *br : 0); | ||
321 | } | ||
322 | |||
323 | int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, | ||
324 | const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, | ||
325 | const cchar_t *bl, const cchar_t *br) | ||
326 | { | ||
327 | PDC_LOG(("border_set() - called\n")); | ||
328 | |||
329 | return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br); | ||
330 | } | ||
331 | |||
332 | int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch) | ||
333 | { | ||
334 | PDC_LOG(("box_set() - called\n")); | ||
335 | |||
336 | return wborder_set(win, verch, verch, horch, horch, | ||
337 | (const cchar_t *)NULL, (const cchar_t *)NULL, | ||
338 | (const cchar_t *)NULL, (const cchar_t *)NULL); | ||
339 | } | ||
340 | |||
341 | int whline_set(WINDOW *win, const cchar_t *wch, int n) | ||
342 | { | ||
343 | PDC_LOG(("whline_set() - called\n")); | ||
344 | |||
345 | return wch ? whline(win, *wch, n) : ERR; | ||
346 | } | ||
347 | |||
348 | int hline_set(const cchar_t *wch, int n) | ||
349 | { | ||
350 | PDC_LOG(("hline_set() - called\n")); | ||
351 | |||
352 | return whline_set(stdscr, wch, n); | ||
353 | } | ||
354 | |||
355 | int mvhline_set(int y, int x, const cchar_t *wch, int n) | ||
356 | { | ||
357 | PDC_LOG(("mvhline_set() - called\n")); | ||
358 | |||
359 | if (move(y, x) == ERR) | ||
360 | return ERR; | ||
361 | |||
362 | return whline_set(stdscr, wch, n); | ||
363 | } | ||
364 | |||
365 | int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) | ||
366 | { | ||
367 | PDC_LOG(("mvwhline_set() - called\n")); | ||
368 | |||
369 | if (wmove(win, y, x) == ERR) | ||
370 | return ERR; | ||
371 | |||
372 | return whline_set(win, wch, n); | ||
373 | } | ||
374 | |||
375 | int wvline_set(WINDOW *win, const cchar_t *wch, int n) | ||
376 | { | ||
377 | PDC_LOG(("wvline_set() - called\n")); | ||
378 | |||
379 | return wch ? wvline(win, *wch, n) : ERR; | ||
380 | } | ||
381 | |||
382 | int vline_set(const cchar_t *wch, int n) | ||
383 | { | ||
384 | PDC_LOG(("vline_set() - called\n")); | ||
385 | |||
386 | return wvline_set(stdscr, wch, n); | ||
387 | } | ||
388 | |||
389 | int mvvline_set(int y, int x, const cchar_t *wch, int n) | ||
390 | { | ||
391 | PDC_LOG(("mvvline_set() - called\n")); | ||
392 | |||
393 | if (move(y, x) == ERR) | ||
394 | return ERR; | ||
395 | |||
396 | return wvline_set(stdscr, wch, n); | ||
397 | } | ||
398 | |||
399 | int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) | ||
400 | { | ||
401 | PDC_LOG(("mvwvline_set() - called\n")); | ||
402 | |||
403 | if (wmove(win, y, x) == ERR) | ||
404 | return ERR; | ||
405 | |||
406 | return wvline_set(win, wch, n); | ||
407 | } | ||
408 | #endif |
File pdcurses/clear.c added (mode: 100644) (index 00000000..eda33855) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: clear.c,v 1.35 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: clear | ||
10 | |||
11 | Synopsis: | ||
12 | int clear(void); | ||
13 | int wclear(WINDOW *win); | ||
14 | int erase(void); | ||
15 | int werase(WINDOW *win); | ||
16 | int clrtobot(void); | ||
17 | int wclrtobot(WINDOW *win); | ||
18 | int clrtoeol(void); | ||
19 | int wclrtoeol(WINDOW *win); | ||
20 | |||
21 | Description: | ||
22 | erase() and werase() copy blanks (i.e. the background chtype) to | ||
23 | every cell of the window. | ||
24 | |||
25 | clear() and wclear() are similar to erase() and werase(), but | ||
26 | they also call clearok() to ensure that the the window is | ||
27 | cleared on the next wrefresh(). | ||
28 | |||
29 | clrtobot() and wclrtobot() clear the window from the current | ||
30 | cursor position to the end of the window. | ||
31 | |||
32 | clrtoeol() and wclrtoeol() clear the window from the current | ||
33 | cursor position to the end of the current line. | ||
34 | |||
35 | Return Value: | ||
36 | All functions return OK on success and ERR on error. | ||
37 | |||
38 | Portability X/Open BSD SYS V | ||
39 | clear Y Y Y | ||
40 | wclear Y Y Y | ||
41 | erase Y Y Y | ||
42 | werase Y Y Y | ||
43 | clrtobot Y Y Y | ||
44 | wclrtobot Y Y Y | ||
45 | clrtoeol Y Y Y | ||
46 | wclrtoeol Y Y Y | ||
47 | |||
48 | **man-end****************************************************************/ | ||
49 | |||
50 | int wclrtoeol(WINDOW *win) | ||
51 | { | ||
52 | int x, y, minx; | ||
53 | chtype blank, *ptr; | ||
54 | |||
55 | PDC_LOG(("wclrtoeol() - called: Row: %d Col: %d\n", | ||
56 | win->_cury, win->_curx)); | ||
57 | |||
58 | if (!win) | ||
59 | return ERR; | ||
60 | |||
61 | y = win->_cury; | ||
62 | x = win->_curx; | ||
63 | |||
64 | /* wrs (4/10/93) account for window background */ | ||
65 | |||
66 | blank = win->_bkgd; | ||
67 | |||
68 | for (minx = x, ptr = &win->_y[y][x]; minx < win->_maxx; minx++, ptr++) | ||
69 | *ptr = blank; | ||
70 | |||
71 | if (x < win->_firstch[y] || win->_firstch[y] == _NO_CHANGE) | ||
72 | win->_firstch[y] = x; | ||
73 | |||
74 | win->_lastch[y] = win->_maxx - 1; | ||
75 | |||
76 | PDC_sync(win); | ||
77 | return OK; | ||
78 | } | ||
79 | |||
80 | int clrtoeol(void) | ||
81 | { | ||
82 | PDC_LOG(("clrtoeol() - called\n")); | ||
83 | |||
84 | return wclrtoeol(stdscr); | ||
85 | } | ||
86 | |||
87 | int wclrtobot(WINDOW *win) | ||
88 | { | ||
89 | int savey = win->_cury; | ||
90 | int savex = win->_curx; | ||
91 | |||
92 | PDC_LOG(("wclrtobot() - called\n")); | ||
93 | |||
94 | if (!win) | ||
95 | return ERR; | ||
96 | |||
97 | /* should this involve scrolling region somehow ? */ | ||
98 | |||
99 | if (win->_cury + 1 < win->_maxy) | ||
100 | { | ||
101 | win->_curx = 0; | ||
102 | win->_cury++; | ||
103 | for (; win->_maxy > win->_cury; win->_cury++) | ||
104 | wclrtoeol(win); | ||
105 | win->_cury = savey; | ||
106 | win->_curx = savex; | ||
107 | } | ||
108 | wclrtoeol(win); | ||
109 | |||
110 | PDC_sync(win); | ||
111 | return OK; | ||
112 | } | ||
113 | |||
114 | int clrtobot(void) | ||
115 | { | ||
116 | PDC_LOG(("clrtobot() - called\n")); | ||
117 | |||
118 | return wclrtobot(stdscr); | ||
119 | } | ||
120 | |||
121 | int werase(WINDOW *win) | ||
122 | { | ||
123 | PDC_LOG(("werase() - called\n")); | ||
124 | |||
125 | if (wmove(win, 0, 0) == ERR) | ||
126 | return ERR; | ||
127 | |||
128 | return wclrtobot(win); | ||
129 | } | ||
130 | |||
131 | int erase(void) | ||
132 | { | ||
133 | PDC_LOG(("erase() - called\n")); | ||
134 | |||
135 | return werase(stdscr); | ||
136 | } | ||
137 | |||
138 | int wclear(WINDOW *win) | ||
139 | { | ||
140 | PDC_LOG(("wclear() - called\n")); | ||
141 | |||
142 | if (!win) | ||
143 | return ERR; | ||
144 | |||
145 | win->_clear = TRUE; | ||
146 | return werase(win); | ||
147 | } | ||
148 | |||
149 | int clear(void) | ||
150 | { | ||
151 | PDC_LOG(("clear() - called\n")); | ||
152 | |||
153 | return wclear(stdscr); | ||
154 | } |
File pdcurses/color.c added (mode: 100644) (index 00000000..038f7604) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: color.c,v 1.83 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: color | ||
10 | |||
11 | Synopsis: | ||
12 | int start_color(void); | ||
13 | int init_pair(short pair, short fg, short bg); | ||
14 | int init_color(short color, short red, short green, short blue); | ||
15 | bool has_colors(void); | ||
16 | bool can_change_color(void); | ||
17 | int color_content(short color, short *red, short *green, short *blue); | ||
18 | int pair_content(short pair, short *fg, short *bg); | ||
19 | |||
20 | int assume_default_colors(int f, int b); | ||
21 | int use_default_colors(void); | ||
22 | |||
23 | int PDC_set_line_color(short color); | ||
24 | |||
25 | Description: | ||
26 | To use these routines, start_color() must be called, usually | ||
27 | immediately after initscr(). Colors are always used in pairs, | ||
28 | referred to as color-pairs. A color-pair consists of a | ||
29 | foreground color and a background color. A color-pair is | ||
30 | initialized via init_pair(). After initialization, COLOR_PAIR(n) | ||
31 | can be used like any other video attribute. | ||
32 | |||
33 | start_color() initializes eight basic colors (black, red, green, | ||
34 | yellow, blue, magenta, cyan, and white), and two global | ||
35 | variables; COLORS and COLOR_PAIRS (respectively defining the | ||
36 | maximum number of colors and color-pairs the terminal is capable | ||
37 | of displaying). | ||
38 | |||
39 | init_pair() changes the definition of a color-pair. It takes | ||
40 | three arguments: the number of the color-pair to be redefined, | ||
41 | and the new values of the foreground and background colors. The | ||
42 | pair number must be between 0 and COLOR_PAIRS - 1, inclusive. | ||
43 | The foreground and background must be between 0 and COLORS - 1, | ||
44 | inclusive. If the color pair was previously initialized, the | ||
45 | screen is refreshed, and all occurrences of that color-pair are | ||
46 | changed to the new definition. | ||
47 | |||
48 | has_colors() indicates if the terminal supports, and can | ||
49 | maniplulate color. It returns TRUE or FALSE. | ||
50 | |||
51 | can_change_color() indicates if the terminal has the capability | ||
52 | to change the definition of its colors. | ||
53 | |||
54 | pair_content() is used to determine what the colors of a given | ||
55 | color-pair consist of. | ||
56 | |||
57 | assume_default_colors() and use_default_colors() emulate the | ||
58 | ncurses extensions of the same names. assume_default_colors(f, | ||
59 | b) is essentially the same as init_pair(0, f, b) (which isn't | ||
60 | allowed); it redefines the default colors. use_default_colors() | ||
61 | allows the use of -1 as a foreground or background color with | ||
62 | init_pair(), and calls assume_default_colors(-1, -1); -1 | ||
63 | represents the foreground or background color that the terminal | ||
64 | had at startup. If the environment variable PDC_ORIGINAL_COLORS | ||
65 | is set at the time start_color() is called, that's equivalent to | ||
66 | calling use_default_colors(). | ||
67 | |||
68 | PDC_set_line_color() is used to set the color, globally, for | ||
69 | the color of the lines drawn for the attributes: A_UNDERLINE, | ||
70 | A_OVERLINE, A_LEFTLINE and A_RIGHTLINE. A value of -1 (the | ||
71 | default) indicates that the current foreground color should be | ||
72 | used. | ||
73 | |||
74 | NOTE: COLOR_PAIR() and PAIR_NUMBER() are implemented as macros. | ||
75 | |||
76 | Return Value: | ||
77 | All functions return OK on success and ERR on error, except for | ||
78 | has_colors() and can_change_colors(), which return TRUE or FALSE. | ||
79 | |||
80 | Portability X/Open BSD SYS V | ||
81 | start_color Y - 3.2 | ||
82 | init_pair Y - 3.2 | ||
83 | init_color Y - 3.2 | ||
84 | has_colors Y - 3.2 | ||
85 | can_change_color Y - 3.2 | ||
86 | color_content Y - 3.2 | ||
87 | pair_content Y - 3.2 | ||
88 | assume_default_colors - - - | ||
89 | use_default_colors - - - | ||
90 | PDC_set_line_color - - - | ||
91 | |||
92 | **man-end****************************************************************/ | ||
93 | |||
94 | #include <stdlib.h> | ||
95 | #include <string.h> | ||
96 | |||
97 | int COLORS = 0; | ||
98 | int COLOR_PAIRS = PDC_COLOR_PAIRS; | ||
99 | |||
100 | bool pdc_color_started = FALSE; | ||
101 | |||
102 | /* pair_set[] tracks whether a pair has been set via init_pair() */ | ||
103 | |||
104 | static bool pair_set[PDC_COLOR_PAIRS]; | ||
105 | static bool default_colors = FALSE; | ||
106 | static short first_col = 0; | ||
107 | |||
108 | int start_color(void) | ||
109 | { | ||
110 | PDC_LOG(("start_color() - called\n")); | ||
111 | |||
112 | if (SP->mono) | ||
113 | return ERR; | ||
114 | |||
115 | pdc_color_started = TRUE; | ||
116 | |||
117 | PDC_set_blink(FALSE); /* Also sets COLORS, to 8 or 16 */ | ||
118 | |||
119 | if (!default_colors && SP->orig_attr && getenv("PDC_ORIGINAL_COLORS")) | ||
120 | default_colors = TRUE; | ||
121 | |||
122 | PDC_init_atrtab(); | ||
123 | |||
124 | memset(pair_set, 0, PDC_COLOR_PAIRS); | ||
125 | |||
126 | return OK; | ||
127 | } | ||
128 | |||
129 | static void _normalize(short *fg, short *bg) | ||
130 | { | ||
131 | if (*fg == -1) | ||
132 | *fg = SP->orig_attr ? SP->orig_fore : COLOR_WHITE; | ||
133 | |||
134 | if (*bg == -1) | ||
135 | *bg = SP->orig_attr ? SP->orig_back : COLOR_BLACK; | ||
136 | } | ||
137 | |||
138 | int init_pair(short pair, short fg, short bg) | ||
139 | { | ||
140 | PDC_LOG(("init_pair() - called: pair %d fg %d bg %d\n", pair, fg, bg)); | ||
141 | |||
142 | if (!pdc_color_started || pair < 1 || pair >= COLOR_PAIRS || | ||
143 | fg < first_col || fg >= COLORS || bg < first_col || bg >= COLORS) | ||
144 | return ERR; | ||
145 | |||
146 | _normalize(&fg, &bg); | ||
147 | |||
148 | /* To allow the PDC_PRESERVE_SCREEN option to work, we only reset | ||
149 | curscr if this call to init_pair() alters a color pair created by | ||
150 | the user. */ | ||
151 | |||
152 | if (pair_set[pair]) | ||
153 | { | ||
154 | short oldfg, oldbg; | ||
155 | |||
156 | PDC_pair_content(pair, &oldfg, &oldbg); | ||
157 | |||
158 | if (oldfg != fg || oldbg != bg) | ||
159 | curscr->_clear = TRUE; | ||
160 | } | ||
161 | |||
162 | PDC_init_pair(pair, fg, bg); | ||
163 | |||
164 | pair_set[pair] = TRUE; | ||
165 | |||
166 | return OK; | ||
167 | } | ||
168 | |||
169 | bool has_colors(void) | ||
170 | { | ||
171 | PDC_LOG(("has_colors() - called\n")); | ||
172 | |||
173 | return !(SP->mono); | ||
174 | } | ||
175 | |||
176 | int init_color(short color, short red, short green, short blue) | ||
177 | { | ||
178 | PDC_LOG(("init_color() - called\n")); | ||
179 | |||
180 | if (color < 0 || color >= COLORS || !PDC_can_change_color() || | ||
181 | red < 0 || red > 1000 || green < 0 || green > 1000 || | ||
182 | blue < 0 || blue > 1000) | ||
183 | return ERR; | ||
184 | |||
185 | return PDC_init_color(color, red, green, blue); | ||
186 | } | ||
187 | |||
188 | int color_content(short color, short *red, short *green, short *blue) | ||
189 | { | ||
190 | PDC_LOG(("color_content() - called\n")); | ||
191 | |||
192 | if (color < 0 || color >= COLORS || !red || !green || !blue) | ||
193 | return ERR; | ||
194 | |||
195 | if (PDC_can_change_color()) | ||
196 | return PDC_color_content(color, red, green, blue); | ||
197 | else | ||
198 | { | ||
199 | /* Simulated values for platforms that don't support palette | ||
200 | changing */ | ||
201 | |||
202 | short maxval = (color & 8) ? 1000 : 680; | ||
203 | |||
204 | *red = (color & COLOR_RED) ? maxval : 0; | ||
205 | *green = (color & COLOR_GREEN) ? maxval : 0; | ||
206 | *blue = (color & COLOR_BLUE) ? maxval : 0; | ||
207 | |||
208 | return OK; | ||
209 | } | ||
210 | } | ||
211 | |||
212 | bool can_change_color(void) | ||
213 | { | ||
214 | PDC_LOG(("can_change_color() - called\n")); | ||
215 | |||
216 | return PDC_can_change_color(); | ||
217 | } | ||
218 | |||
219 | int pair_content(short pair, short *fg, short *bg) | ||
220 | { | ||
221 | PDC_LOG(("pair_content() - called\n")); | ||
222 | |||
223 | if (pair < 0 || pair >= COLOR_PAIRS || !fg || !bg) | ||
224 | return ERR; | ||
225 | |||
226 | return PDC_pair_content(pair, fg, bg); | ||
227 | } | ||
228 | |||
229 | int assume_default_colors(int f, int b) | ||
230 | { | ||
231 | PDC_LOG(("assume_default_colors() - called: f %d b %d\n", f, b)); | ||
232 | |||
233 | if (f < -1 || f >= COLORS || b < -1 || b >= COLORS) | ||
234 | return ERR; | ||
235 | |||
236 | if (pdc_color_started) | ||
237 | { | ||
238 | short fg, bg, oldfg, oldbg; | ||
239 | |||
240 | fg = f; | ||
241 | bg = b; | ||
242 | |||
243 | _normalize(&fg, &bg); | ||
244 | |||
245 | PDC_pair_content(0, &oldfg, &oldbg); | ||
246 | |||
247 | if (oldfg != fg || oldbg != bg) | ||
248 | curscr->_clear = TRUE; | ||
249 | |||
250 | PDC_init_pair(0, fg, bg); | ||
251 | } | ||
252 | |||
253 | return OK; | ||
254 | } | ||
255 | |||
256 | int use_default_colors(void) | ||
257 | { | ||
258 | PDC_LOG(("use_default_colors() - called\n")); | ||
259 | |||
260 | default_colors = TRUE; | ||
261 | first_col = -1; | ||
262 | |||
263 | return assume_default_colors(-1, -1); | ||
264 | } | ||
265 | |||
266 | int PDC_set_line_color(short color) | ||
267 | { | ||
268 | PDC_LOG(("PDC_set_line_color() - called: %d\n", color)); | ||
269 | |||
270 | if (color < -1 || color >= COLORS) | ||
271 | return ERR; | ||
272 | |||
273 | SP->line_color = color; | ||
274 | |||
275 | return OK; | ||
276 | } | ||
277 | |||
278 | void PDC_init_atrtab(void) | ||
279 | { | ||
280 | int i; | ||
281 | short fg, bg; | ||
282 | |||
283 | if (pdc_color_started && !default_colors) | ||
284 | { | ||
285 | fg = COLOR_WHITE; | ||
286 | bg = COLOR_BLACK; | ||
287 | } | ||
288 | else | ||
289 | fg = bg = -1; | ||
290 | |||
291 | _normalize(&fg, &bg); | ||
292 | |||
293 | for (i = 0; i < PDC_COLOR_PAIRS; i++) | ||
294 | PDC_init_pair(i, fg, bg); | ||
295 | } |
File pdcurses/debug.c added (mode: 100644) (index 00000000..95dc7d44) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: debug.c,v 1.7 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: debug | ||
10 | |||
11 | Synopsis: | ||
12 | void traceon(void); | ||
13 | void traceoff(void); | ||
14 | void PDC_debug(const char *, ...); | ||
15 | |||
16 | Description: | ||
17 | traceon() and traceoff() toggle the recording of debugging | ||
18 | information to the file "trace". Although not standard, similar | ||
19 | functions are in some other curses implementations. | ||
20 | |||
21 | PDC_debug() is the function that writes to the file, based on | ||
22 | whether traceon() has been called. It's used from the PDC_LOG() | ||
23 | macro. | ||
24 | |||
25 | Portability X/Open BSD SYS V | ||
26 | traceon - - - | ||
27 | traceoff - - - | ||
28 | PDC_debug - - - | ||
29 | |||
30 | **man-end****************************************************************/ | ||
31 | |||
32 | #include <string.h> | ||
33 | #include <sys/types.h> | ||
34 | #include <time.h> | ||
35 | |||
36 | bool pdc_trace_on = FALSE; | ||
37 | |||
38 | void PDC_debug(const char *fmt, ...) | ||
39 | { | ||
40 | va_list args; | ||
41 | FILE *dbfp; | ||
42 | char hms[9]; | ||
43 | time_t now; | ||
44 | |||
45 | if (!pdc_trace_on) | ||
46 | return; | ||
47 | |||
48 | /* open debug log file append */ | ||
49 | |||
50 | dbfp = fopen("trace", "a"); | ||
51 | if (!dbfp) | ||
52 | { | ||
53 | fprintf(stderr, | ||
54 | "PDC_debug(): Unable to open debug log file\n"); | ||
55 | return; | ||
56 | } | ||
57 | |||
58 | time(&now); | ||
59 | strftime(hms, 9, "%H:%M:%S", localtime(&now)); | ||
60 | fprintf(dbfp, "At: %8.8ld - %s ", (long) clock(), hms); | ||
61 | |||
62 | va_start(args, fmt); | ||
63 | vfprintf(dbfp, fmt, args); | ||
64 | va_end(args); | ||
65 | |||
66 | fclose(dbfp); | ||
67 | } | ||
68 | |||
69 | void traceon(void) | ||
70 | { | ||
71 | PDC_LOG(("traceon() - called\n")); | ||
72 | |||
73 | pdc_trace_on = TRUE; | ||
74 | } | ||
75 | |||
76 | void traceoff(void) | ||
77 | { | ||
78 | PDC_LOG(("traceoff() - called\n")); | ||
79 | |||
80 | pdc_trace_on = FALSE; | ||
81 | } |
File pdcurses/delch.c added (mode: 100644) (index 00000000..9c2416ee) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: delch.c,v 1.33 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: delch | ||
10 | |||
11 | Synopsis: | ||
12 | int delch(void); | ||
13 | int wdelch(WINDOW *win); | ||
14 | int mvdelch(int y, int x); | ||
15 | int mvwdelch(WINDOW *win, int y, int x); | ||
16 | |||
17 | Description: | ||
18 | The character under the cursor in the window is deleted. All | ||
19 | characters to the right on the same line are moved to the left | ||
20 | one position and the last character on the line is filled with | ||
21 | a blank. The cursor position does not change (after moving to | ||
22 | y, x if coordinates are specified). | ||
23 | |||
24 | Return Value: | ||
25 | All functions return OK on success and ERR on error. | ||
26 | |||
27 | Portability X/Open BSD SYS V | ||
28 | delch Y Y Y | ||
29 | wdelch Y Y Y | ||
30 | mvdelch Y Y Y | ||
31 | mvwdelch Y Y Y | ||
32 | |||
33 | **man-end****************************************************************/ | ||
34 | |||
35 | #include <string.h> | ||
36 | |||
37 | int wdelch(WINDOW *win) | ||
38 | { | ||
39 | int y, x, maxx; | ||
40 | chtype *temp1; | ||
41 | |||
42 | PDC_LOG(("wdelch() - called\n")); | ||
43 | |||
44 | if (!win) | ||
45 | return ERR; | ||
46 | |||
47 | y = win->_cury; | ||
48 | x = win->_curx; | ||
49 | maxx = win->_maxx - 1; | ||
50 | temp1 = &win->_y[y][x]; | ||
51 | |||
52 | memmove(temp1, temp1 + 1, (maxx - x) * sizeof(chtype)); | ||
53 | |||
54 | /* wrs (4/10/93) account for window background */ | ||
55 | |||
56 | win->_y[y][maxx] = win->_bkgd; | ||
57 | |||
58 | win->_lastch[y] = maxx; | ||
59 | |||
60 | if ((win->_firstch[y] == _NO_CHANGE) || (win->_firstch[y] > x)) | ||
61 | win->_firstch[y] = x; | ||
62 | |||
63 | PDC_sync(win); | ||
64 | |||
65 | return OK; | ||
66 | } | ||
67 | |||
68 | int delch(void) | ||
69 | { | ||
70 | PDC_LOG(("delch() - called\n")); | ||
71 | |||
72 | return wdelch(stdscr); | ||
73 | } | ||
74 | |||
75 | int mvdelch(int y, int x) | ||
76 | { | ||
77 | PDC_LOG(("mvdelch() - called\n")); | ||
78 | |||
79 | if (move(y, x) == ERR) | ||
80 | return ERR; | ||
81 | |||
82 | return wdelch(stdscr); | ||
83 | } | ||
84 | |||
85 | int mvwdelch(WINDOW *win, int y, int x) | ||
86 | { | ||
87 | PDC_LOG(("mvwdelch() - called\n")); | ||
88 | |||
89 | if (wmove(win, y, x) == ERR) | ||
90 | return ERR; | ||
91 | |||
92 | return wdelch(win); | ||
93 | } |
File pdcurses/deleteln.c added (mode: 100644) (index 00000000..c856e90a) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: deleteln.c,v 1.35 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: deleteln | ||
10 | |||
11 | Synopsis: | ||
12 | int deleteln(void); | ||
13 | int wdeleteln(WINDOW *win); | ||
14 | int insdelln(int n); | ||
15 | int winsdelln(WINDOW *win, int n); | ||
16 | int insertln(void); | ||
17 | int winsertln(WINDOW *win); | ||
18 | |||
19 | int mvdeleteln(int y, int x); | ||
20 | int mvwdeleteln(WINDOW *win, int y, int x); | ||
21 | int mvinsertln(int y, int x); | ||
22 | int mvwinsertln(WINDOW *win, int y, int x); | ||
23 | |||
24 | Description: | ||
25 | With the deleteln() and wdeleteln() functions, the line under | ||
26 | the cursor in the window is deleted. All lines below the | ||
27 | current line are moved up one line. The bottom line of the | ||
28 | window is cleared. The cursor position does not change. | ||
29 | |||
30 | With the insertln() and winsertn() functions, a blank line is | ||
31 | inserted above the current line and the bottom line is lost. | ||
32 | |||
33 | mvdeleteln(), mvwdeleteln(), mvinsertln() and mvwinsertln() | ||
34 | allow moving the cursor and inserting/deleting in one call. | ||
35 | |||
36 | Return Value: | ||
37 | All functions return OK on success and ERR on error. | ||
38 | |||
39 | Portability X/Open BSD SYS V | ||
40 | deleteln Y Y Y | ||
41 | wdeleteln Y Y Y | ||
42 | mvdeleteln - - - | ||
43 | mvwdeleteln - - - | ||
44 | insdelln Y - 4.0 | ||
45 | winsdelln Y - 4.0 | ||
46 | insertln Y Y Y | ||
47 | winsertln Y Y Y | ||
48 | mvinsertln - - - | ||
49 | mvwinsertln - - - | ||
50 | |||
51 | **man-end****************************************************************/ | ||
52 | |||
53 | int wdeleteln(WINDOW *win) | ||
54 | { | ||
55 | chtype blank, *temp, *ptr; | ||
56 | int y; | ||
57 | |||
58 | PDC_LOG(("wdeleteln() - called\n")); | ||
59 | |||
60 | if (!win) | ||
61 | return ERR; | ||
62 | |||
63 | /* wrs (4/10/93) account for window background */ | ||
64 | |||
65 | blank = win->_bkgd; | ||
66 | |||
67 | temp = win->_y[win->_cury]; | ||
68 | |||
69 | for (y = win->_cury; y < win->_bmarg; y++) | ||
70 | { | ||
71 | win->_y[y] = win->_y[y + 1]; | ||
72 | win->_firstch[y] = 0; | ||
73 | win->_lastch[y] = win->_maxx - 1; | ||
74 | } | ||
75 | |||
76 | for (ptr = temp; (ptr - temp < win->_maxx); ptr++) | ||
77 | *ptr = blank; /* make a blank line */ | ||
78 | |||
79 | if (win->_cury <= win->_bmarg) | ||
80 | { | ||
81 | win->_firstch[win->_bmarg] = 0; | ||
82 | win->_lastch[win->_bmarg] = win->_maxx - 1; | ||
83 | win->_y[win->_bmarg] = temp; | ||
84 | } | ||
85 | |||
86 | return OK; | ||
87 | } | ||
88 | |||
89 | int deleteln(void) | ||
90 | { | ||
91 | PDC_LOG(("deleteln() - called\n")); | ||
92 | |||
93 | return wdeleteln(stdscr); | ||
94 | } | ||
95 | |||
96 | int mvdeleteln(int y, int x) | ||
97 | { | ||
98 | PDC_LOG(("mvdeleteln() - called\n")); | ||
99 | |||
100 | if (move(y, x) == ERR) | ||
101 | return ERR; | ||
102 | |||
103 | return wdeleteln(stdscr); | ||
104 | } | ||
105 | |||
106 | int mvwdeleteln(WINDOW *win, int y, int x) | ||
107 | { | ||
108 | PDC_LOG(("mvwdeleteln() - called\n")); | ||
109 | |||
110 | if (wmove(win, y, x) == ERR) | ||
111 | return ERR; | ||
112 | |||
113 | return wdeleteln(win); | ||
114 | } | ||
115 | |||
116 | int winsdelln(WINDOW *win, int n) | ||
117 | { | ||
118 | int i; | ||
119 | |||
120 | PDC_LOG(("winsdelln() - called\n")); | ||
121 | |||
122 | if (!win) | ||
123 | return ERR; | ||
124 | |||
125 | if (n > 0) | ||
126 | { | ||
127 | for (i = 0; i < n; i++) | ||
128 | if (winsertln(win) == ERR) | ||
129 | return ERR; | ||
130 | } | ||
131 | else if (n < 0) | ||
132 | { | ||
133 | n = -n; | ||
134 | for (i = 0; i < n; i++) | ||
135 | if (wdeleteln(win) == ERR) | ||
136 | return ERR; | ||
137 | } | ||
138 | |||
139 | return OK; | ||
140 | } | ||
141 | |||
142 | int insdelln(int n) | ||
143 | { | ||
144 | PDC_LOG(("insdelln() - called\n")); | ||
145 | |||
146 | return winsdelln(stdscr, n); | ||
147 | } | ||
148 | |||
149 | int winsertln(WINDOW *win) | ||
150 | { | ||
151 | chtype blank, *temp, *end; | ||
152 | int y; | ||
153 | |||
154 | PDC_LOG(("winsertln() - called\n")); | ||
155 | |||
156 | if (!win) | ||
157 | return ERR; | ||
158 | |||
159 | /* wrs (4/10/93) account for window background */ | ||
160 | |||
161 | blank = win->_bkgd; | ||
162 | |||
163 | temp = win->_y[win->_maxy - 1]; | ||
164 | |||
165 | for (y = win->_maxy - 1; y > win->_cury; y--) | ||
166 | { | ||
167 | win->_y[y] = win->_y[y - 1]; | ||
168 | win->_firstch[y] = 0; | ||
169 | win->_lastch[y] = win->_maxx - 1; | ||
170 | } | ||
171 | |||
172 | win->_y[win->_cury] = temp; | ||
173 | |||
174 | for (end = &temp[win->_maxx - 1]; temp <= end; temp++) | ||
175 | *temp = blank; | ||
176 | |||
177 | win->_firstch[win->_cury] = 0; | ||
178 | win->_lastch[win->_cury] = win->_maxx - 1; | ||
179 | |||
180 | return OK; | ||
181 | } | ||
182 | |||
183 | int insertln(void) | ||
184 | { | ||
185 | PDC_LOG(("insertln() - called\n")); | ||
186 | |||
187 | return winsertln(stdscr); | ||
188 | } | ||
189 | |||
190 | int mvinsertln(int y, int x) | ||
191 | { | ||
192 | PDC_LOG(("mvinsertln() - called\n")); | ||
193 | |||
194 | if (move(y, x) == ERR) | ||
195 | return ERR; | ||
196 | |||
197 | return winsertln(stdscr); | ||
198 | } | ||
199 | |||
200 | int mvwinsertln(WINDOW *win, int y, int x) | ||
201 | { | ||
202 | PDC_LOG(("mvwinsertln() - called\n")); | ||
203 | |||
204 | if (wmove(win, y, x) == ERR) | ||
205 | return ERR; | ||
206 | |||
207 | return winsertln(win); | ||
208 | } |
File pdcurses/deprec.c added (mode: 100644) (index 00000000..83e61311) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: deprec.c,v 1.6 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /* Deprecated functions. These should not be used, and will eventually | ||
8 | be removed. They're here solely for the benefit of applications that | ||
9 | linked to them in older versions of PDCurses. */ | ||
10 | |||
11 | bool PDC_check_bios_key(void) | ||
12 | { | ||
13 | return PDC_check_key(); | ||
14 | } | ||
15 | |||
16 | int PDC_get_bios_key(void) | ||
17 | { | ||
18 | return PDC_get_key(); | ||
19 | } | ||
20 | |||
21 | bool PDC_get_ctrl_break(void) | ||
22 | { | ||
23 | return !SP->raw_inp; | ||
24 | } | ||
25 | |||
26 | int PDC_set_ctrl_break(bool setting) | ||
27 | { | ||
28 | return setting ? noraw() : raw(); | ||
29 | } |
File pdcurses/getch.c added (mode: 100644) (index 00000000..87677bae) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: getch.c,v 1.72 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: getch | ||
10 | |||
11 | Synopsis: | ||
12 | int getch(void); | ||
13 | int wgetch(WINDOW *win); | ||
14 | int mvgetch(int y, int x); | ||
15 | int mvwgetch(WINDOW *win, int y, int x); | ||
16 | int ungetch(int ch); | ||
17 | int flushinp(void); | ||
18 | |||
19 | int get_wch(wint_t *wch); | ||
20 | int wget_wch(WINDOW *win, wint_t *wch); | ||
21 | int mvget_wch(int y, int x, wint_t *wch); | ||
22 | int mvwget_wch(WINDOW *win, int y, int x, wint_t *wch); | ||
23 | int unget_wch(const wchar_t wch); | ||
24 | |||
25 | unsigned long PDC_get_key_modifiers(void); | ||
26 | int PDC_save_key_modifiers(bool flag); | ||
27 | int PDC_return_key_modifiers(bool flag); | ||
28 | |||
29 | Description: | ||
30 | With the getch(), wgetch(), mvgetch(), and mvwgetch() functions, | ||
31 | a character is read from the terminal associated with the window. | ||
32 | In nodelay mode, if there is no input waiting, the value ERR is | ||
33 | returned. In delay mode, the program will hang until the system | ||
34 | passes text through to the program. Depending on the setting of | ||
35 | cbreak(), this will be after one character or after the first | ||
36 | newline. Unless noecho() has been set, the character will also | ||
37 | be echoed into the designated window. | ||
38 | |||
39 | If keypad() is TRUE, and a function key is pressed, the token for | ||
40 | that function key will be returned instead of the raw characters. | ||
41 | Possible function keys are defined in <curses.h> with integers | ||
42 | beginning with 0401, whose names begin with KEY_. | ||
43 | |||
44 | If nodelay(win, TRUE) has been called on the window and no input | ||
45 | is waiting, the value ERR is returned. | ||
46 | |||
47 | ungetch() places ch back onto the input queue to be returned by | ||
48 | the next call to wgetch(). | ||
49 | |||
50 | flushinp() throws away any type-ahead that has been typed by the | ||
51 | user and has not yet been read by the program. | ||
52 | |||
53 | PDC_get_key_modifiers() returns the keyboard modifiers (shift, | ||
54 | control, alt, numlock) effective at the time of the last getch() | ||
55 | call, if PDC_save_key_modifiers(TRUE) has been called before the | ||
56 | getch(). Use the macros PDC_KEY_MODIFIER_* to determine which | ||
57 | modifier(s) were set. PDC_return_key_modifiers() tells getch() | ||
58 | to return modifier keys pressed alone as keystrokes (KEY_ALT_L, | ||
59 | etc.). These may not work on all platforms. | ||
60 | |||
61 | NOTE: getch() and ungetch() are implemented as macros, to avoid | ||
62 | conflict with many DOS compiler's runtime libraries. | ||
63 | |||
64 | Return Value: | ||
65 | These functions return ERR or the value of the character, meta | ||
66 | character or function key token. | ||
67 | |||
68 | Portability X/Open BSD SYS V | ||
69 | getch Y Y Y | ||
70 | wgetch Y Y Y | ||
71 | mvgetch Y Y Y | ||
72 | mvwgetch Y Y Y | ||
73 | ungetch Y Y Y | ||
74 | flushinp Y Y Y | ||
75 | get_wch Y | ||
76 | wget_wch Y | ||
77 | mvget_wch Y | ||
78 | mvwget_wch Y | ||
79 | unget_wch Y | ||
80 | PDC_get_key_modifiers - - - | ||
81 | |||
82 | **man-end****************************************************************/ | ||
83 | |||
84 | #define _INBUFSIZ 512 /* size of terminal input buffer */ | ||
85 | #define NUNGETCH 256 /* max # chars to ungetch() */ | ||
86 | |||
87 | static int c_pindex = 0; /* putter index */ | ||
88 | static int c_gindex = 1; /* getter index */ | ||
89 | static int c_ungind = 0; /* ungetch() push index */ | ||
90 | static int c_ungch[NUNGETCH]; /* array of ungotten chars */ | ||
91 | |||
92 | static int _mouse_key(WINDOW *win) | ||
93 | { | ||
94 | int i, key = KEY_MOUSE; | ||
95 | unsigned long mbe = SP->_trap_mbe; | ||
96 | |||
97 | /* Filter unwanted mouse events */ | ||
98 | |||
99 | for (i = 0; i < 3; i++) | ||
100 | { | ||
101 | if (pdc_mouse_status.changes & (1 << i)) | ||
102 | { | ||
103 | int shf = i * 5; | ||
104 | short button = pdc_mouse_status.button[i] & BUTTON_ACTION_MASK; | ||
105 | |||
106 | if ( (!(mbe & (BUTTON1_PRESSED << shf)) && | ||
107 | (button == BUTTON_PRESSED)) | ||
108 | |||
109 | || (!(mbe & (BUTTON1_CLICKED << shf)) && | ||
110 | (button == BUTTON_CLICKED)) | ||
111 | |||
112 | || (!(mbe & (BUTTON1_DOUBLE_CLICKED << shf)) && | ||
113 | (button == BUTTON_DOUBLE_CLICKED)) | ||
114 | |||
115 | || (!(mbe & (BUTTON1_MOVED << shf)) && | ||
116 | (button == BUTTON_MOVED)) | ||
117 | |||
118 | || (!(mbe & (BUTTON1_RELEASED << shf)) && | ||
119 | (button == BUTTON_RELEASED)) | ||
120 | ) | ||
121 | pdc_mouse_status.changes ^= (1 << i); | ||
122 | } | ||
123 | } | ||
124 | |||
125 | if (pdc_mouse_status.changes & PDC_MOUSE_MOVED) | ||
126 | { | ||
127 | if (!(mbe & (BUTTON1_MOVED|BUTTON2_MOVED|BUTTON3_MOVED))) | ||
128 | pdc_mouse_status.changes ^= PDC_MOUSE_MOVED; | ||
129 | } | ||
130 | |||
131 | if (pdc_mouse_status.changes & | ||
132 | (PDC_MOUSE_WHEEL_UP|PDC_MOUSE_WHEEL_DOWN)) | ||
133 | { | ||
134 | if (!(mbe & MOUSE_WHEEL_SCROLL)) | ||
135 | pdc_mouse_status.changes &= | ||
136 | ~(PDC_MOUSE_WHEEL_UP|PDC_MOUSE_WHEEL_DOWN); | ||
137 | } | ||
138 | |||
139 | if (!pdc_mouse_status.changes) | ||
140 | return -1; | ||
141 | |||
142 | /* Check for click in slk area */ | ||
143 | |||
144 | i = PDC_mouse_in_slk(pdc_mouse_status.y, pdc_mouse_status.x); | ||
145 | |||
146 | if (i) | ||
147 | { | ||
148 | if (pdc_mouse_status.button[0] & (BUTTON_PRESSED|BUTTON_CLICKED)) | ||
149 | key = KEY_F(i); | ||
150 | else | ||
151 | key = -1; | ||
152 | } | ||
153 | |||
154 | return key; | ||
155 | } | ||
156 | |||
157 | int wgetch(WINDOW *win) | ||
158 | { | ||
159 | static int buffer[_INBUFSIZ]; /* character buffer */ | ||
160 | int key, waitcount; | ||
161 | |||
162 | PDC_LOG(("wgetch() - called\n")); | ||
163 | |||
164 | if (!win) | ||
165 | return ERR; | ||
166 | |||
167 | waitcount = 0; | ||
168 | |||
169 | /* set the number of 1/20th second napms() calls */ | ||
170 | |||
171 | if (SP->delaytenths) | ||
172 | waitcount = 2 * SP->delaytenths; | ||
173 | else | ||
174 | if (win->_delayms) | ||
175 | { | ||
176 | /* Can't really do millisecond intervals, so delay in | ||
177 | 1/20ths of a second (50ms) */ | ||
178 | |||
179 | waitcount = win->_delayms / 50; | ||
180 | if (!waitcount) | ||
181 | waitcount = 1; | ||
182 | } | ||
183 | |||
184 | /* refresh window when wgetch is called if there have been changes | ||
185 | to it and it is not a pad */ | ||
186 | |||
187 | if (!(win->_flags & _PAD) && ((!win->_leaveit && | ||
188 | (win->_begx + win->_curx != SP->curscol || | ||
189 | win->_begy + win->_cury != SP->cursrow)) || is_wintouched(win))) | ||
190 | wrefresh(win); | ||
191 | |||
192 | /* if ungotten char exists, remove and return it */ | ||
193 | |||
194 | if (c_ungind) | ||
195 | return c_ungch[--c_ungind]; | ||
196 | |||
197 | /* if normal and data in buffer */ | ||
198 | |||
199 | if ((!SP->raw_inp && !SP->cbreak) && (c_gindex < c_pindex)) | ||
200 | return buffer[c_gindex++]; | ||
201 | |||
202 | /* prepare to buffer data */ | ||
203 | |||
204 | c_pindex = 0; | ||
205 | c_gindex = 0; | ||
206 | |||
207 | /* to get here, no keys are buffered. go and get one. */ | ||
208 | |||
209 | for (;;) /* loop for any buffering */ | ||
210 | { | ||
211 | /* is there a keystroke ready? */ | ||
212 | |||
213 | if (!PDC_check_key()) | ||
214 | { | ||
215 | /* if not, handle timeout() and halfdelay() */ | ||
216 | |||
217 | if (SP->delaytenths || win->_delayms) | ||
218 | { | ||
219 | if (!waitcount) | ||
220 | return ERR; | ||
221 | |||
222 | waitcount--; | ||
223 | } | ||
224 | else | ||
225 | if (win->_nodelay) | ||
226 | return ERR; | ||
227 | |||
228 | napms(50); /* sleep for 1/20th second */ | ||
229 | continue; /* then check again */ | ||
230 | } | ||
231 | |||
232 | /* if there is, fetch it */ | ||
233 | |||
234 | key = PDC_get_key(); | ||
235 | |||
236 | if (SP->key_code) | ||
237 | { | ||
238 | /* filter special keys if not in keypad mode */ | ||
239 | |||
240 | if (!win->_use_keypad) | ||
241 | key = -1; | ||
242 | |||
243 | /* filter mouse events; translate mouse clicks in the slk | ||
244 | area to function keys */ | ||
245 | |||
246 | else if (key == KEY_MOUSE) | ||
247 | key = _mouse_key(win); | ||
248 | } | ||
249 | |||
250 | /* unwanted key? loop back */ | ||
251 | |||
252 | if (key == -1) | ||
253 | continue; | ||
254 | |||
255 | /* translate CR */ | ||
256 | |||
257 | if (key == '\r' && SP->autocr && !SP->raw_inp) | ||
258 | key = '\n'; | ||
259 | |||
260 | /* if echo is enabled */ | ||
261 | |||
262 | if (SP->echo && !SP->key_code) | ||
263 | { | ||
264 | waddch(win, key); | ||
265 | wrefresh(win); | ||
266 | } | ||
267 | |||
268 | /* if no buffering */ | ||
269 | |||
270 | if (SP->raw_inp || SP->cbreak) | ||
271 | return key; | ||
272 | |||
273 | /* if no overflow, put data in buffer */ | ||
274 | |||
275 | if (key == '\b') | ||
276 | { | ||
277 | if (c_pindex > c_gindex) | ||
278 | c_pindex--; | ||
279 | } | ||
280 | else | ||
281 | if (c_pindex < _INBUFSIZ - 2) | ||
282 | buffer[c_pindex++] = key; | ||
283 | |||
284 | /* if we got a line */ | ||
285 | |||
286 | if (key == '\n' || key == '\r') | ||
287 | return buffer[c_gindex++]; | ||
288 | } | ||
289 | } | ||
290 | |||
291 | int mvgetch(int y, int x) | ||
292 | { | ||
293 | PDC_LOG(("mvgetch() - called\n")); | ||
294 | |||
295 | if (move(y, x) == ERR) | ||
296 | return ERR; | ||
297 | |||
298 | return wgetch(stdscr); | ||
299 | } | ||
300 | |||
301 | int mvwgetch(WINDOW *win, int y, int x) | ||
302 | { | ||
303 | PDC_LOG(("mvwgetch() - called\n")); | ||
304 | |||
305 | if (wmove(win, y, x) == ERR) | ||
306 | return ERR; | ||
307 | |||
308 | return wgetch(win); | ||
309 | } | ||
310 | |||
311 | int PDC_ungetch(int ch) | ||
312 | { | ||
313 | PDC_LOG(("ungetch() - called\n")); | ||
314 | |||
315 | if (c_ungind >= NUNGETCH) /* pushback stack full */ | ||
316 | return ERR; | ||
317 | |||
318 | c_ungch[c_ungind++] = ch; | ||
319 | |||
320 | return OK; | ||
321 | } | ||
322 | |||
323 | int flushinp(void) | ||
324 | { | ||
325 | PDC_LOG(("flushinp() - called\n")); | ||
326 | |||
327 | PDC_flushinp(); | ||
328 | |||
329 | c_gindex = 1; /* set indices to kill buffer */ | ||
330 | c_pindex = 0; | ||
331 | c_ungind = 0; /* clear c_ungch array */ | ||
332 | |||
333 | return OK; | ||
334 | } | ||
335 | |||
336 | unsigned long PDC_get_key_modifiers(void) | ||
337 | { | ||
338 | PDC_LOG(("PDC_get_key_modifiers() - called\n")); | ||
339 | |||
340 | return pdc_key_modifiers; | ||
341 | } | ||
342 | |||
343 | int PDC_save_key_modifiers(bool flag) | ||
344 | { | ||
345 | PDC_LOG(("PDC_save_key_modifiers() - called\n")); | ||
346 | |||
347 | SP->save_key_modifiers = flag; | ||
348 | return OK; | ||
349 | } | ||
350 | |||
351 | int PDC_return_key_modifiers(bool flag) | ||
352 | { | ||
353 | PDC_LOG(("PDC_return_key_modifiers() - called\n")); | ||
354 | |||
355 | SP->return_key_modifiers = flag; | ||
356 | return PDC_modifiers_set(); | ||
357 | } | ||
358 | |||
359 | #ifdef PDC_WIDE | ||
360 | int wget_wch(WINDOW *win, wint_t *wch) | ||
361 | { | ||
362 | int key; | ||
363 | |||
364 | PDC_LOG(("wget_wch() - called\n")); | ||
365 | |||
366 | if (!wch) | ||
367 | return ERR; | ||
368 | |||
369 | key = wgetch(win); | ||
370 | |||
371 | if (key == ERR) | ||
372 | return ERR; | ||
373 | |||
374 | *wch = key; | ||
375 | |||
376 | return SP->key_code ? KEY_CODE_YES : OK; | ||
377 | } | ||
378 | |||
379 | int get_wch(wint_t *wch) | ||
380 | { | ||
381 | PDC_LOG(("get_wch() - called\n")); | ||
382 | |||
383 | return wget_wch(stdscr, wch); | ||
384 | } | ||
385 | |||
386 | int mvget_wch(int y, int x, wint_t *wch) | ||
387 | { | ||
388 | PDC_LOG(("mvget_wch() - called\n")); | ||
389 | |||
390 | if (move(y, x) == ERR) | ||
391 | return ERR; | ||
392 | |||
393 | return wget_wch(stdscr, wch); | ||
394 | } | ||
395 | |||
396 | int mvwget_wch(WINDOW *win, int y, int x, wint_t *wch) | ||
397 | { | ||
398 | PDC_LOG(("mvwget_wch() - called\n")); | ||
399 | |||
400 | if (wmove(win, y, x) == ERR) | ||
401 | return ERR; | ||
402 | |||
403 | return wget_wch(win, wch); | ||
404 | } | ||
405 | |||
406 | int unget_wch(const wchar_t wch) | ||
407 | { | ||
408 | return PDC_ungetch(wch); | ||
409 | } | ||
410 | #endif |
File pdcurses/getstr.c added (mode: 100644) (index 00000000..c6386d31) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: getstr.c,v 1.51 2008/07/14 04:24:51 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: getstr | ||
10 | |||
11 | Synopsis: | ||
12 | int getstr(char *str); | ||
13 | int wgetstr(WINDOW *win, char *str); | ||
14 | int mvgetstr(int y, int x, char *str); | ||
15 | int mvwgetstr(WINDOW *win, int y, int x, char *str); | ||
16 | int getnstr(char *str, int n); | ||
17 | int wgetnstr(WINDOW *win, char *str, int n); | ||
18 | int mvgetnstr(int y, int x, char *str, int n); | ||
19 | int mvwgetnstr(WINDOW *win, int y, int x, char *str, int n); | ||
20 | |||
21 | int get_wstr(wint_t *wstr); | ||
22 | int wget_wstr(WINDOW *win, wint_t *wstr); | ||
23 | int mvget_wstr(int y, int x, wint_t *wstr); | ||
24 | int mvwget_wstr(WINDOW *win, int, int, wint_t *wstr); | ||
25 | int getn_wstr(wint_t *wstr, int n); | ||
26 | int wgetn_wstr(WINDOW *win, wint_t *wstr, int n); | ||
27 | int mvgetn_wstr(int y, int x, wint_t *wstr, int n); | ||
28 | int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n); | ||
29 | |||
30 | Description: | ||
31 | These routines call wgetch() repeatedly to build a string, | ||
32 | interpreting erase and kill characters along the way, until a | ||
33 | newline or carriage return is received. When PDCurses is built | ||
34 | with wide-character support enabled, the narrow-character | ||
35 | functions convert the wgetch()'d values into a multibyte string | ||
36 | in the current locale before returning it. The resulting string | ||
37 | is placed in the area pointed to by *str. The routines with n as | ||
38 | the last argument read at most n characters. | ||
39 | |||
40 | Note that there's no way to know how long the buffer passed to | ||
41 | wgetstr() is, so use wgetnstr() to avoid buffer overflows. | ||
42 | |||
43 | Return Value: | ||
44 | This functions return ERR on failure or any other value on | ||
45 | success. | ||
46 | |||
47 | Portability X/Open BSD SYS V | ||
48 | getstr Y Y Y | ||
49 | wgetstr Y Y Y | ||
50 | mvgetstr Y Y Y | ||
51 | mvwgetstr Y Y Y | ||
52 | getnstr Y - 4.0 | ||
53 | wgetnstr Y - 4.0 | ||
54 | mvgetnstr Y - - | ||
55 | mvwgetnstr Y - - | ||
56 | get_wstr Y | ||
57 | wget_wstr Y | ||
58 | mvget_wstr Y | ||
59 | mvwget_wstr Y | ||
60 | getn_wstr Y | ||
61 | wgetn_wstr Y | ||
62 | mvgetn_wstr Y | ||
63 | mvwgetn_wstr Y | ||
64 | |||
65 | **man-end****************************************************************/ | ||
66 | |||
67 | #define MAXLINE 255 | ||
68 | |||
69 | int wgetnstr(WINDOW *win, char *str, int n) | ||
70 | { | ||
71 | #ifdef PDC_WIDE | ||
72 | wchar_t wstr[MAXLINE + 1]; | ||
73 | |||
74 | if (n < 0 || n > MAXLINE) | ||
75 | n = MAXLINE; | ||
76 | |||
77 | if (wgetn_wstr(win, (wint_t *)wstr, n) == ERR) | ||
78 | return ERR; | ||
79 | |||
80 | return PDC_wcstombs(str, wstr, n); | ||
81 | #else | ||
82 | int ch, i, num, x, chars; | ||
83 | char *p; | ||
84 | bool stop, oldecho, oldcbreak, oldnodelay; | ||
85 | |||
86 | PDC_LOG(("wgetnstr() - called\n")); | ||
87 | |||
88 | if (!win || !str) | ||
89 | return ERR; | ||
90 | |||
91 | chars = 0; | ||
92 | p = str; | ||
93 | stop = FALSE; | ||
94 | |||
95 | x = win->_curx; | ||
96 | |||
97 | oldcbreak = SP->cbreak; /* remember states */ | ||
98 | oldecho = SP->echo; | ||
99 | oldnodelay = win->_nodelay; | ||
100 | |||
101 | SP->echo = FALSE; /* we do echo ourselves */ | ||
102 | cbreak(); /* ensure each key is returned immediately */ | ||
103 | win->_nodelay = FALSE; /* don't return -1 */ | ||
104 | |||
105 | wrefresh(win); | ||
106 | |||
107 | while (!stop) | ||
108 | { | ||
109 | ch = wgetch(win); | ||
110 | |||
111 | switch (ch) | ||
112 | { | ||
113 | |||
114 | case '\t': | ||
115 | ch = ' '; | ||
116 | num = TABSIZE - (win->_curx - x) % TABSIZE; | ||
117 | for (i = 0; i < num; i++) | ||
118 | { | ||
119 | if (chars < n) | ||
120 | { | ||
121 | if (oldecho) | ||
122 | waddch(win, ch); | ||
123 | *p++ = ch; | ||
124 | ++chars; | ||
125 | } | ||
126 | else | ||
127 | beep(); | ||
128 | } | ||
129 | break; | ||
130 | |||
131 | case _ECHAR: /* CTRL-H -- Delete character */ | ||
132 | if (p > str) | ||
133 | { | ||
134 | if (oldecho) | ||
135 | waddstr(win, "\b \b"); | ||
136 | ch = (unsigned char)(*--p); | ||
137 | if ((ch < ' ') && (oldecho)) | ||
138 | waddstr(win, "\b \b"); | ||
139 | chars--; | ||
140 | } | ||
141 | break; | ||
142 | |||
143 | case _DLCHAR: /* CTRL-U -- Delete line */ | ||
144 | while (p > str) | ||
145 | { | ||
146 | if (oldecho) | ||
147 | waddstr(win, "\b \b"); | ||
148 | ch = (unsigned char)(*--p); | ||
149 | if ((ch < ' ') && (oldecho)) | ||
150 | waddstr(win, "\b \b"); | ||
151 | } | ||
152 | chars = 0; | ||
153 | break; | ||
154 | |||
155 | case _DWCHAR: /* CTRL-W -- Delete word */ | ||
156 | |||
157 | while ((p > str) && (*(p - 1) == ' ')) | ||
158 | { | ||
159 | if (oldecho) | ||
160 | waddstr(win, "\b \b"); | ||
161 | |||
162 | --p; /* remove space */ | ||
163 | chars--; | ||
164 | } | ||
165 | while ((p > str) && (*(p - 1) != ' ')) | ||
166 | { | ||
167 | if (oldecho) | ||
168 | waddstr(win, "\b \b"); | ||
169 | |||
170 | ch = (unsigned char)(*--p); | ||
171 | if ((ch < ' ') && (oldecho)) | ||
172 | waddstr(win, "\b \b"); | ||
173 | chars--; | ||
174 | } | ||
175 | break; | ||
176 | |||
177 | case '\n': | ||
178 | case '\r': | ||
179 | stop = TRUE; | ||
180 | if (oldecho) | ||
181 | waddch(win, '\n'); | ||
182 | break; | ||
183 | |||
184 | default: | ||
185 | if (chars < n) | ||
186 | { | ||
187 | if (!SP->key_code && ch < 0x100) | ||
188 | { | ||
189 | *p++ = ch; | ||
190 | if (oldecho) | ||
191 | waddch(win, ch); | ||
192 | chars++; | ||
193 | } | ||
194 | } | ||
195 | else | ||
196 | beep(); | ||
197 | |||
198 | break; | ||
199 | |||
200 | } | ||
201 | |||
202 | wrefresh(win); | ||
203 | } | ||
204 | |||
205 | *p = '\0'; | ||
206 | |||
207 | SP->echo = oldecho; /* restore old settings */ | ||
208 | SP->cbreak = oldcbreak; | ||
209 | win->_nodelay = oldnodelay; | ||
210 | |||
211 | return OK; | ||
212 | #endif | ||
213 | } | ||
214 | |||
215 | int getstr(char *str) | ||
216 | { | ||
217 | PDC_LOG(("getstr() - called\n")); | ||
218 | |||
219 | return wgetnstr(stdscr, str, MAXLINE); | ||
220 | } | ||
221 | |||
222 | int wgetstr(WINDOW *win, char *str) | ||
223 | { | ||
224 | PDC_LOG(("wgetstr() - called\n")); | ||
225 | |||
226 | return wgetnstr(win, str, MAXLINE); | ||
227 | } | ||
228 | |||
229 | int mvgetstr(int y, int x, char *str) | ||
230 | { | ||
231 | PDC_LOG(("mvgetstr() - called\n")); | ||
232 | |||
233 | if (move(y, x) == ERR) | ||
234 | return ERR; | ||
235 | |||
236 | return wgetnstr(stdscr, str, MAXLINE); | ||
237 | } | ||
238 | |||
239 | int mvwgetstr(WINDOW *win, int y, int x, char *str) | ||
240 | { | ||
241 | PDC_LOG(("mvwgetstr() - called\n")); | ||
242 | |||
243 | if (wmove(win, y, x) == ERR) | ||
244 | return ERR; | ||
245 | |||
246 | return wgetnstr(win, str, MAXLINE); | ||
247 | } | ||
248 | |||
249 | int getnstr(char *str, int n) | ||
250 | { | ||
251 | PDC_LOG(("getnstr() - called\n")); | ||
252 | |||
253 | return wgetnstr(stdscr, str, n); | ||
254 | } | ||
255 | |||
256 | int mvgetnstr(int y, int x, char *str, int n) | ||
257 | { | ||
258 | PDC_LOG(("mvgetnstr() - called\n")); | ||
259 | |||
260 | if (move(y, x) == ERR) | ||
261 | return ERR; | ||
262 | |||
263 | return wgetnstr(stdscr, str, n); | ||
264 | } | ||
265 | |||
266 | int mvwgetnstr(WINDOW *win, int y, int x, char *str, int n) | ||
267 | { | ||
268 | PDC_LOG(("mvwgetnstr() - called\n")); | ||
269 | |||
270 | if (wmove(win, y, x) == ERR) | ||
271 | return ERR; | ||
272 | |||
273 | return wgetnstr(win, str, n); | ||
274 | } | ||
275 | |||
276 | #ifdef PDC_WIDE | ||
277 | int wgetn_wstr(WINDOW *win, wint_t *wstr, int n) | ||
278 | { | ||
279 | int ch, i, num, x, chars; | ||
280 | wint_t *p; | ||
281 | bool stop, oldecho, oldcbreak, oldnodelay; | ||
282 | |||
283 | PDC_LOG(("wgetn_wstr() - called\n")); | ||
284 | |||
285 | if (!win || !wstr) | ||
286 | return ERR; | ||
287 | |||
288 | chars = 0; | ||
289 | p = wstr; | ||
290 | stop = FALSE; | ||
291 | |||
292 | x = win->_curx; | ||
293 | |||
294 | oldcbreak = SP->cbreak; /* remember states */ | ||
295 | oldecho = SP->echo; | ||
296 | oldnodelay = win->_nodelay; | ||
297 | |||
298 | SP->echo = FALSE; /* we do echo ourselves */ | ||
299 | cbreak(); /* ensure each key is returned immediately */ | ||
300 | win->_nodelay = FALSE; /* don't return -1 */ | ||
301 | |||
302 | wrefresh(win); | ||
303 | |||
304 | while (!stop) | ||
305 | { | ||
306 | ch = wgetch(win); | ||
307 | |||
308 | switch (ch) | ||
309 | { | ||
310 | |||
311 | case '\t': | ||
312 | ch = ' '; | ||
313 | num = TABSIZE - (win->_curx - x) % TABSIZE; | ||
314 | for (i = 0; i < num; i++) | ||
315 | { | ||
316 | if (chars < n) | ||
317 | { | ||
318 | if (oldecho) | ||
319 | waddch(win, ch); | ||
320 | *p++ = ch; | ||
321 | ++chars; | ||
322 | } | ||
323 | else | ||
324 | beep(); | ||
325 | } | ||
326 | break; | ||
327 | |||
328 | case _ECHAR: /* CTRL-H -- Delete character */ | ||
329 | if (p > wstr) | ||
330 | { | ||
331 | if (oldecho) | ||
332 | waddstr(win, "\b \b"); | ||
333 | ch = *--p; | ||
334 | if ((ch < ' ') && (oldecho)) | ||
335 | waddstr(win, "\b \b"); | ||
336 | chars--; | ||
337 | } | ||
338 | break; | ||
339 | |||
340 | case _DLCHAR: /* CTRL-U -- Delete line */ | ||
341 | while (p > wstr) | ||
342 | { | ||
343 | if (oldecho) | ||
344 | waddstr(win, "\b \b"); | ||
345 | ch = *--p; | ||
346 | if ((ch < ' ') && (oldecho)) | ||
347 | waddstr(win, "\b \b"); | ||
348 | } | ||
349 | chars = 0; | ||
350 | break; | ||
351 | |||
352 | case _DWCHAR: /* CTRL-W -- Delete word */ | ||
353 | |||
354 | while ((p > wstr) && (*(p - 1) == ' ')) | ||
355 | { | ||
356 | if (oldecho) | ||
357 | waddstr(win, "\b \b"); | ||
358 | |||
359 | --p; /* remove space */ | ||
360 | chars--; | ||
361 | } | ||
362 | while ((p > wstr) && (*(p - 1) != ' ')) | ||
363 | { | ||
364 | if (oldecho) | ||
365 | waddstr(win, "\b \b"); | ||
366 | |||
367 | ch = *--p; | ||
368 | if ((ch < ' ') && (oldecho)) | ||
369 | waddstr(win, "\b \b"); | ||
370 | chars--; | ||
371 | } | ||
372 | break; | ||
373 | |||
374 | case '\n': | ||
375 | case '\r': | ||
376 | stop = TRUE; | ||
377 | if (oldecho) | ||
378 | waddch(win, '\n'); | ||
379 | break; | ||
380 | |||
381 | default: | ||
382 | if (chars < n) | ||
383 | { | ||
384 | if (!SP->key_code) | ||
385 | { | ||
386 | *p++ = ch; | ||
387 | if (oldecho) | ||
388 | waddch(win, ch); | ||
389 | chars++; | ||
390 | } | ||
391 | } | ||
392 | else | ||
393 | beep(); | ||
394 | |||
395 | break; | ||
396 | |||
397 | } | ||
398 | |||
399 | wrefresh(win); | ||
400 | } | ||
401 | |||
402 | *p = '\0'; | ||
403 | |||
404 | SP->echo = oldecho; /* restore old settings */ | ||
405 | SP->cbreak = oldcbreak; | ||
406 | win->_nodelay = oldnodelay; | ||
407 | |||
408 | return OK; | ||
409 | } | ||
410 | |||
411 | int get_wstr(wint_t *wstr) | ||
412 | { | ||
413 | PDC_LOG(("get_wstr() - called\n")); | ||
414 | |||
415 | return wgetn_wstr(stdscr, wstr, MAXLINE); | ||
416 | } | ||
417 | |||
418 | int wget_wstr(WINDOW *win, wint_t *wstr) | ||
419 | { | ||
420 | PDC_LOG(("wget_wstr() - called\n")); | ||
421 | |||
422 | return wgetn_wstr(win, wstr, MAXLINE); | ||
423 | } | ||
424 | |||
425 | int mvget_wstr(int y, int x, wint_t *wstr) | ||
426 | { | ||
427 | PDC_LOG(("mvget_wstr() - called\n")); | ||
428 | |||
429 | if (move(y, x) == ERR) | ||
430 | return ERR; | ||
431 | |||
432 | return wgetn_wstr(stdscr, wstr, MAXLINE); | ||
433 | } | ||
434 | |||
435 | int mvwget_wstr(WINDOW *win, int y, int x, wint_t *wstr) | ||
436 | { | ||
437 | PDC_LOG(("mvwget_wstr() - called\n")); | ||
438 | |||
439 | if (wmove(win, y, x) == ERR) | ||
440 | return ERR; | ||
441 | |||
442 | return wgetn_wstr(win, wstr, MAXLINE); | ||
443 | } | ||
444 | |||
445 | int getn_wstr(wint_t *wstr, int n) | ||
446 | { | ||
447 | PDC_LOG(("getn_wstr() - called\n")); | ||
448 | |||
449 | return wgetn_wstr(stdscr, wstr, n); | ||
450 | } | ||
451 | |||
452 | int mvgetn_wstr(int y, int x, wint_t *wstr, int n) | ||
453 | { | ||
454 | PDC_LOG(("mvgetn_wstr() - called\n")); | ||
455 | |||
456 | if (move(y, x) == ERR) | ||
457 | return ERR; | ||
458 | |||
459 | return wgetn_wstr(stdscr, wstr, n); | ||
460 | } | ||
461 | |||
462 | int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n) | ||
463 | { | ||
464 | PDC_LOG(("mvwgetn_wstr() - called\n")); | ||
465 | |||
466 | if (wmove(win, y, x) == ERR) | ||
467 | return ERR; | ||
468 | |||
469 | return wgetn_wstr(win, wstr, n); | ||
470 | } | ||
471 | #endif |
File pdcurses/getyx.c added (mode: 100644) (index 00000000..fd0564d9) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: getyx.c,v 1.29 2008/07/15 17:13:26 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: getyx | ||
10 | |||
11 | Synopsis: | ||
12 | void getyx(WINDOW *win, int y, int x); | ||
13 | void getparyx(WINDOW *win, int y, int x); | ||
14 | void getbegyx(WINDOW *win, int y, int x); | ||
15 | void getmaxyx(WINDOW *win, int y, int x); | ||
16 | |||
17 | void getsyx(int y, int x); | ||
18 | int setsyx(int y, int x); | ||
19 | |||
20 | int getbegy(WINDOW *win); | ||
21 | int getbegx(WINDOW *win); | ||
22 | int getcury(WINDOW *win); | ||
23 | int getcurx(WINDOW *win); | ||
24 | int getpary(WINDOW *win); | ||
25 | int getparx(WINDOW *win); | ||
26 | int getmaxy(WINDOW *win); | ||
27 | int getmaxx(WINDOW *win); | ||
28 | |||
29 | Description: | ||
30 | The getyx() macro (defined in curses.h -- the prototypes here | ||
31 | are merely illustrative) puts the current cursor position of the | ||
32 | specified window into y and x. getbegyx() and getmaxyx() return | ||
33 | the starting coordinates and size of the specified window, | ||
34 | respectively. getparyx() returns the starting coordinates of the | ||
35 | parent's window, if the specified window is a subwindow; | ||
36 | otherwise it sets y and x to -1. These are all macros. | ||
37 | |||
38 | getsyx() gets the coordinates of the virtual screen cursor, and | ||
39 | stores them in y and x. If leaveok() is TRUE, it returns -1, -1. | ||
40 | If lines have been removed with ripoffline(), then getsyx() | ||
41 | includes these lines in its count; so, the returned y and x | ||
42 | values should only be used with setsyx(). | ||
43 | |||
44 | setsyx() sets the virtual screen cursor to the y, x coordinates. | ||
45 | If y, x are -1, -1, leaveok() is set TRUE. | ||
46 | |||
47 | getsyx() and setsyx() are meant to be used by a library routine | ||
48 | that manipulates curses windows without altering the position of | ||
49 | the cursor. Note that getsyx() is defined only as a macro. | ||
50 | |||
51 | getbegy(), getbegx(), getcurx(), getcury(), getmaxy(), | ||
52 | getmaxx(), getpary(), and getparx() return the appropriate | ||
53 | coordinate or size values, or ERR in the case of a NULL window. | ||
54 | |||
55 | Portability X/Open BSD SYS V | ||
56 | getyx Y Y Y | ||
57 | getparyx - - 4.0 | ||
58 | getbegyx - - 3.0 | ||
59 | getmaxyx - - 3.0 | ||
60 | getsyx - - 3.0 | ||
61 | setsyx - - 3.0 | ||
62 | getbegy - - - | ||
63 | getbegx - - - | ||
64 | getcury - - - | ||
65 | getcurx - - - | ||
66 | getpary - - - | ||
67 | getparx - - - | ||
68 | getmaxy - - - | ||
69 | getmaxx - - - | ||
70 | |||
71 | **man-end****************************************************************/ | ||
72 | |||
73 | int getbegy(WINDOW *win) | ||
74 | { | ||
75 | PDC_LOG(("getbegy() - called\n")); | ||
76 | |||
77 | return win ? win->_begy : ERR; | ||
78 | } | ||
79 | |||
80 | int getbegx(WINDOW *win) | ||
81 | { | ||
82 | PDC_LOG(("getbegx() - called\n")); | ||
83 | |||
84 | return win ? win->_begx : ERR; | ||
85 | } | ||
86 | |||
87 | int getcury(WINDOW *win) | ||
88 | { | ||
89 | PDC_LOG(("getcury() - called\n")); | ||
90 | |||
91 | return win ? win->_cury : ERR; | ||
92 | } | ||
93 | |||
94 | int getcurx(WINDOW *win) | ||
95 | { | ||
96 | PDC_LOG(("getcurx() - called\n")); | ||
97 | |||
98 | return win ? win->_curx : ERR; | ||
99 | } | ||
100 | |||
101 | int getpary(WINDOW *win) | ||
102 | { | ||
103 | PDC_LOG(("getpary() - called\n")); | ||
104 | |||
105 | return win ? win->_pary : ERR; | ||
106 | } | ||
107 | |||
108 | int getparx(WINDOW *win) | ||
109 | { | ||
110 | PDC_LOG(("getparx() - called\n")); | ||
111 | |||
112 | return win ? win->_parx : ERR; | ||
113 | } | ||
114 | |||
115 | int getmaxy(WINDOW *win) | ||
116 | { | ||
117 | PDC_LOG(("getmaxy() - called\n")); | ||
118 | |||
119 | return win ? win->_maxy : ERR; | ||
120 | } | ||
121 | |||
122 | int getmaxx(WINDOW *win) | ||
123 | { | ||
124 | PDC_LOG(("getmaxx() - called\n")); | ||
125 | |||
126 | return win ? win->_maxx : ERR; | ||
127 | } | ||
128 | |||
129 | int setsyx(int y, int x) | ||
130 | { | ||
131 | PDC_LOG(("setsyx() - called\n")); | ||
132 | |||
133 | if(y == -1 && x == -1) | ||
134 | { | ||
135 | curscr->_leaveit = TRUE; | ||
136 | return OK; | ||
137 | } | ||
138 | else | ||
139 | { | ||
140 | curscr->_leaveit = FALSE; | ||
141 | return wmove(curscr, y, x); | ||
142 | } | ||
143 | } |
File pdcurses/inch.c added (mode: 100644) (index 00000000..7347e740) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: inch.c,v 1.33 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: inch | ||
10 | |||
11 | Synopsis: | ||
12 | chtype inch(void); | ||
13 | chtype winch(WINDOW *win); | ||
14 | chtype mvinch(int y, int x); | ||
15 | chtype mvwinch(WINDOW *win, int y, int x); | ||
16 | |||
17 | int in_wch(cchar_t *wcval); | ||
18 | int win_wch(WINDOW *win, cchar_t *wcval); | ||
19 | int mvin_wch(int y, int x, cchar_t *wcval); | ||
20 | int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval); | ||
21 | |||
22 | Description: | ||
23 | The inch() functions retrieve the character and attribute from | ||
24 | the current or specified window position, in the form of a | ||
25 | chtype. If a NULL window is specified, (chtype)ERR is returned. | ||
26 | |||
27 | The in_wch() functions are the wide-character versions; instead | ||
28 | of returning a chtype, they store a cchar_t at the address | ||
29 | specified by wcval, and return OK or ERR. (No value is stored | ||
30 | when ERR is returned.) Note that in PDCurses, chtype and cchar_t | ||
31 | are the same. | ||
32 | |||
33 | Portability X/Open BSD SYS V | ||
34 | inch Y Y Y | ||
35 | winch Y Y Y | ||
36 | mvinch Y Y Y | ||
37 | mvwinch Y Y Y | ||
38 | in_wch Y | ||
39 | win_wch Y | ||
40 | mvin_wch Y | ||
41 | mvwin_wch Y | ||
42 | |||
43 | **man-end****************************************************************/ | ||
44 | |||
45 | chtype winch(WINDOW *win) | ||
46 | { | ||
47 | PDC_LOG(("winch() - called\n")); | ||
48 | |||
49 | if (!win) | ||
50 | return (chtype)ERR; | ||
51 | |||
52 | return win->_y[win->_cury][win->_curx]; | ||
53 | } | ||
54 | |||
55 | chtype inch(void) | ||
56 | { | ||
57 | PDC_LOG(("inch() - called\n")); | ||
58 | |||
59 | return winch(stdscr); | ||
60 | } | ||
61 | |||
62 | chtype mvinch(int y, int x) | ||
63 | { | ||
64 | PDC_LOG(("mvinch() - called\n")); | ||
65 | |||
66 | if (move(y, x) == ERR) | ||
67 | return (chtype)ERR; | ||
68 | |||
69 | return stdscr->_y[stdscr->_cury][stdscr->_curx]; | ||
70 | } | ||
71 | |||
72 | chtype mvwinch(WINDOW *win, int y, int x) | ||
73 | { | ||
74 | PDC_LOG(("mvwinch() - called\n")); | ||
75 | |||
76 | if (wmove(win, y, x) == ERR) | ||
77 | return (chtype)ERR; | ||
78 | |||
79 | return win->_y[win->_cury][win->_curx]; | ||
80 | } | ||
81 | |||
82 | #ifdef PDC_WIDE | ||
83 | int win_wch(WINDOW *win, cchar_t *wcval) | ||
84 | { | ||
85 | PDC_LOG(("win_wch() - called\n")); | ||
86 | |||
87 | if (!win || !wcval) | ||
88 | return ERR; | ||
89 | |||
90 | *wcval = win->_y[win->_cury][win->_curx]; | ||
91 | |||
92 | return OK; | ||
93 | } | ||
94 | |||
95 | int in_wch(cchar_t *wcval) | ||
96 | { | ||
97 | PDC_LOG(("in_wch() - called\n")); | ||
98 | |||
99 | return win_wch(stdscr, wcval); | ||
100 | } | ||
101 | |||
102 | int mvin_wch(int y, int x, cchar_t *wcval) | ||
103 | { | ||
104 | PDC_LOG(("mvin_wch() - called\n")); | ||
105 | |||
106 | if (!wcval || (move(y, x) == ERR)) | ||
107 | return ERR; | ||
108 | |||
109 | *wcval = stdscr->_y[stdscr->_cury][stdscr->_curx]; | ||
110 | |||
111 | return OK; | ||
112 | } | ||
113 | |||
114 | int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval) | ||
115 | { | ||
116 | PDC_LOG(("mvwin_wch() - called\n")); | ||
117 | |||
118 | if (!wcval || (wmove(win, y, x) == ERR)) | ||
119 | return ERR; | ||
120 | |||
121 | *wcval = win->_y[win->_cury][win->_curx]; | ||
122 | |||
123 | return OK; | ||
124 | } | ||
125 | #endif |
File pdcurses/inchstr.c added (mode: 100644) (index 00000000..50b8cf5b) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: inchstr.c,v 1.34 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: inchstr | ||
10 | |||
11 | Synopsis: | ||
12 | int inchstr(chtype *ch); | ||
13 | int inchnstr(chtype *ch, int n); | ||
14 | int winchstr(WINDOW *win, chtype *ch); | ||
15 | int winchnstr(WINDOW *win, chtype *ch, int n); | ||
16 | int mvinchstr(int y, int x, chtype *ch); | ||
17 | int mvinchnstr(int y, int x, chtype *ch, int n); | ||
18 | int mvwinchstr(WINDOW *, int y, int x, chtype *ch); | ||
19 | int mvwinchnstr(WINDOW *, int y, int x, chtype *ch, int n); | ||
20 | |||
21 | int in_wchstr(cchar_t *wch); | ||
22 | int in_wchnstr(cchar_t *wch, int n); | ||
23 | int win_wchstr(WINDOW *win, cchar_t *wch); | ||
24 | int win_wchnstr(WINDOW *win, cchar_t *wch, int n); | ||
25 | int mvin_wchstr(int y, int x, cchar_t *wch); | ||
26 | int mvin_wchnstr(int y, int x, cchar_t *wch, int n); | ||
27 | int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wch); | ||
28 | int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wch, int n); | ||
29 | |||
30 | Description: | ||
31 | These routines read a chtype or cchar_t string from the window, | ||
32 | starting at the current or specified position, and ending at the | ||
33 | right margin, or after n elements, whichever is less. | ||
34 | |||
35 | Return Value: | ||
36 | All functions return the number of elements read, or ERR on | ||
37 | error. | ||
38 | |||
39 | Portability X/Open BSD SYS V | ||
40 | inchstr Y - 4.0 | ||
41 | winchstr Y - 4.0 | ||
42 | mvinchstr Y - 4.0 | ||
43 | mvwinchstr Y - 4.0 | ||
44 | inchnstr Y - 4.0 | ||
45 | winchnstr Y - 4.0 | ||
46 | mvinchnstr Y - 4.0 | ||
47 | mvwinchnstr Y - 4.0 | ||
48 | in_wchstr Y | ||
49 | win_wchstr Y | ||
50 | mvin_wchstr Y | ||
51 | mvwin_wchstr Y | ||
52 | in_wchnstr Y | ||
53 | win_wchnstr Y | ||
54 | mvin_wchnstr Y | ||
55 | mvwin_wchnstr Y | ||
56 | |||
57 | **man-end****************************************************************/ | ||
58 | |||
59 | int winchnstr(WINDOW *win, chtype *ch, int n) | ||
60 | { | ||
61 | chtype *src; | ||
62 | int i; | ||
63 | |||
64 | PDC_LOG(("winchnstr() - called\n")); | ||
65 | |||
66 | if (!win || !ch || n < 0) | ||
67 | return ERR; | ||
68 | |||
69 | if ((win->_curx + n) > win->_maxx) | ||
70 | n = win->_maxx - win->_curx; | ||
71 | |||
72 | src = win->_y[win->_cury] + win->_curx; | ||
73 | |||
74 | for (i = 0; i < n; i++) | ||
75 | *ch++ = *src++; | ||
76 | |||
77 | *ch = (chtype)0; | ||
78 | |||
79 | return OK; | ||
80 | } | ||
81 | |||
82 | int inchstr(chtype *ch) | ||
83 | { | ||
84 | PDC_LOG(("inchstr() - called\n")); | ||
85 | |||
86 | return winchnstr(stdscr, ch, stdscr->_maxx - stdscr->_curx); | ||
87 | } | ||
88 | |||
89 | int winchstr(WINDOW *win, chtype *ch) | ||
90 | { | ||
91 | PDC_LOG(("winchstr() - called\n")); | ||
92 | |||
93 | return winchnstr(win, ch, win->_maxx - win->_curx); | ||
94 | } | ||
95 | |||
96 | int mvinchstr(int y, int x, chtype *ch) | ||
97 | { | ||
98 | PDC_LOG(("mvinchstr() - called: y %d x %d\n", y, x)); | ||
99 | |||
100 | if (move(y, x) == ERR) | ||
101 | return ERR; | ||
102 | |||
103 | return winchnstr(stdscr, ch, stdscr->_maxx - stdscr->_curx); | ||
104 | } | ||
105 | |||
106 | int mvwinchstr(WINDOW *win, int y, int x, chtype *ch) | ||
107 | { | ||
108 | PDC_LOG(("mvwinchstr() - called:\n")); | ||
109 | |||
110 | if (wmove(win, y, x) == ERR) | ||
111 | return ERR; | ||
112 | |||
113 | return winchnstr(win, ch, win->_maxx - win->_curx); | ||
114 | } | ||
115 | |||
116 | int inchnstr(chtype *ch, int n) | ||
117 | { | ||
118 | PDC_LOG(("inchnstr() - called\n")); | ||
119 | |||
120 | return winchnstr(stdscr, ch, n); | ||
121 | } | ||
122 | |||
123 | int mvinchnstr(int y, int x, chtype *ch, int n) | ||
124 | { | ||
125 | PDC_LOG(("mvinchnstr() - called: y %d x %d n %d\n", y, x, n)); | ||
126 | |||
127 | if (move(y, x) == ERR) | ||
128 | return ERR; | ||
129 | |||
130 | return winchnstr(stdscr, ch, n); | ||
131 | } | ||
132 | |||
133 | int mvwinchnstr(WINDOW *win, int y, int x, chtype *ch, int n) | ||
134 | { | ||
135 | PDC_LOG(("mvwinchnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
136 | |||
137 | if (wmove(win, y, x) == ERR) | ||
138 | return ERR; | ||
139 | |||
140 | return winchnstr(win, ch, n); | ||
141 | } | ||
142 | |||
143 | #ifdef PDC_WIDE | ||
144 | int win_wchnstr(WINDOW *win, cchar_t *wch, int n) | ||
145 | { | ||
146 | PDC_LOG(("win_wchnstr() - called\n")); | ||
147 | |||
148 | return winchnstr(win, wch, n); | ||
149 | } | ||
150 | |||
151 | int in_wchstr(cchar_t *wch) | ||
152 | { | ||
153 | PDC_LOG(("in_wchstr() - called\n")); | ||
154 | |||
155 | return win_wchnstr(stdscr, wch, stdscr->_maxx - stdscr->_curx); | ||
156 | } | ||
157 | |||
158 | int win_wchstr(WINDOW *win, cchar_t *wch) | ||
159 | { | ||
160 | PDC_LOG(("win_wchstr() - called\n")); | ||
161 | |||
162 | return win_wchnstr(win, wch, win->_maxx - win->_curx); | ||
163 | } | ||
164 | |||
165 | int mvin_wchstr(int y, int x, cchar_t *wch) | ||
166 | { | ||
167 | PDC_LOG(("mvin_wchstr() - called: y %d x %d\n", y, x)); | ||
168 | |||
169 | if (move(y, x) == ERR) | ||
170 | return ERR; | ||
171 | |||
172 | return win_wchnstr(stdscr, wch, stdscr->_maxx - stdscr->_curx); | ||
173 | } | ||
174 | |||
175 | int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wch) | ||
176 | { | ||
177 | PDC_LOG(("mvwin_wchstr() - called:\n")); | ||
178 | |||
179 | if (wmove(win, y, x) == ERR) | ||
180 | return ERR; | ||
181 | |||
182 | return win_wchnstr(win, wch, win->_maxx - win->_curx); | ||
183 | } | ||
184 | |||
185 | int in_wchnstr(cchar_t *wch, int n) | ||
186 | { | ||
187 | PDC_LOG(("in_wchnstr() - called\n")); | ||
188 | |||
189 | return win_wchnstr(stdscr, wch, n); | ||
190 | } | ||
191 | |||
192 | int mvin_wchnstr(int y, int x, cchar_t *wch, int n) | ||
193 | { | ||
194 | PDC_LOG(("mvin_wchnstr() - called: y %d x %d n %d\n", y, x, n)); | ||
195 | |||
196 | if (move(y, x) == ERR) | ||
197 | return ERR; | ||
198 | |||
199 | return win_wchnstr(stdscr, wch, n); | ||
200 | } | ||
201 | |||
202 | int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wch, int n) | ||
203 | { | ||
204 | PDC_LOG(("mvwinchnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
205 | |||
206 | if (wmove(win, y, x) == ERR) | ||
207 | return ERR; | ||
208 | |||
209 | return win_wchnstr(win, wch, n); | ||
210 | } | ||
211 | #endif |
File pdcurses/initscr.c added (mode: 100644) (index 00000000..d80fa0cf) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: initscr.c,v 1.114 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: initscr | ||
10 | |||
11 | Synopsis: | ||
12 | WINDOW *initscr(void); | ||
13 | WINDOW *Xinitscr(int argc, char *argv[]); | ||
14 | int endwin(void); | ||
15 | bool isendwin(void); | ||
16 | SCREEN *newterm(const char *type, FILE *outfd, FILE *infd); | ||
17 | SCREEN *set_term(SCREEN *new); | ||
18 | void delscreen(SCREEN *sp); | ||
19 | |||
20 | int resize_term(int nlines, int ncols); | ||
21 | bool is_termresized(void); | ||
22 | const char *curses_version(void); | ||
23 | |||
24 | Description: | ||
25 | initscr() should be the first curses routine called. It will | ||
26 | initialize all curses data structures, and arrange that the | ||
27 | first call to refresh() will clear the screen. In case of | ||
28 | error, initscr() will write a message to standard error and end | ||
29 | the program. | ||
30 | |||
31 | endwin() should be called before exiting or escaping from curses | ||
32 | mode temporarily. It will restore tty modes, move the cursor to | ||
33 | the lower left corner of the screen and reset the terminal into | ||
34 | the proper non-visual mode. To resume curses after a temporary | ||
35 | escape, call refresh() or doupdate(). | ||
36 | |||
37 | isendwin() returns TRUE if endwin() has been called without a | ||
38 | subsequent refresh, unless SP is NULL. | ||
39 | |||
40 | In some implementations of curses, newterm() allows the use of | ||
41 | multiple terminals. Here, it's just an alternative interface for | ||
42 | initscr(). It always returns SP, or NULL. | ||
43 | |||
44 | delscreen() frees the memory allocated by newterm() or | ||
45 | initscr(), since it's not freed by endwin(). This function is | ||
46 | usually not needed. In PDCurses, the parameter must be the | ||
47 | value of SP, and delscreen() sets SP to NULL. | ||
48 | |||
49 | set_term() does nothing meaningful in PDCurses, but is included | ||
50 | for compatibility with other curses implementations. | ||
51 | |||
52 | resize_term() is effectively two functions: When called with | ||
53 | nonzero values for nlines and ncols, it attempts to resize the | ||
54 | screen to the given size. When called with (0, 0), it merely | ||
55 | adjusts the internal structures to match the current size after | ||
56 | the screen is resized by the user. On the currently supported | ||
57 | platforms, this functionality is mutually exclusive: X11 allows | ||
58 | user resizing, while DOS, OS/2 and Win32 allow programmatic | ||
59 | resizing. If you want to support user resizing, you should check | ||
60 | for getch() returning KEY_RESIZE, and/or call is_termresized() | ||
61 | at appropriate times; if either condition occurs, call | ||
62 | resize_term(0, 0). Then, with either user or programmatic | ||
63 | resizing, you'll have to resize any windows you've created, as | ||
64 | appropriate; resize_term() only handles stdscr and curscr. | ||
65 | |||
66 | is_termresized() returns TRUE if the curses screen has been | ||
67 | resized by the user, and a call to resize_term() is needed. | ||
68 | Checking for KEY_RESIZE is generally preferable, unless you're | ||
69 | not handling the keyboard. | ||
70 | |||
71 | curses_version() returns a string describing the version of | ||
72 | PDCurses. | ||
73 | |||
74 | Return Value: | ||
75 | All functions return NULL on error, except endwin(), which | ||
76 | returns ERR on error. | ||
77 | |||
78 | Portability X/Open BSD SYS V | ||
79 | initscr Y Y Y | ||
80 | endwin Y Y Y | ||
81 | isendwin Y - 3.0 | ||
82 | newterm Y - Y | ||
83 | set_term Y - Y | ||
84 | delscreen Y - 4.0 | ||
85 | resize_term - - - | ||
86 | is_termresized - - - | ||
87 | curses_version - - - | ||
88 | |||
89 | **man-end****************************************************************/ | ||
90 | |||
91 | #include <stdlib.h> | ||
92 | |||
93 | char ttytype[128]; | ||
94 | |||
95 | const char *_curses_notice = "PDCurses 3.4 - Public Domain 2008"; | ||
96 | |||
97 | SCREEN *SP = (SCREEN*)NULL; /* curses variables */ | ||
98 | WINDOW *curscr = (WINDOW *)NULL; /* the current screen image */ | ||
99 | WINDOW *stdscr = (WINDOW *)NULL; /* the default screen window */ | ||
100 | WINDOW *pdc_lastscr = (WINDOW *)NULL; /* the last screen image */ | ||
101 | |||
102 | int LINES = 0; /* current terminal height */ | ||
103 | int COLS = 0; /* current terminal width */ | ||
104 | int TABSIZE = 8; | ||
105 | |||
106 | MOUSE_STATUS Mouse_status, pdc_mouse_status; | ||
107 | |||
108 | extern RIPPEDOFFLINE linesripped[5]; | ||
109 | extern char linesrippedoff; | ||
110 | |||
111 | WINDOW *Xinitscr(int argc, char *argv[]) | ||
112 | { | ||
113 | int i; | ||
114 | |||
115 | PDC_LOG(("Xinitscr() - called\n")); | ||
116 | |||
117 | if (SP && SP->alive) | ||
118 | return NULL; | ||
119 | |||
120 | if (PDC_scr_open(argc, argv) == ERR) | ||
121 | { | ||
122 | fprintf(stderr, "initscr(): Unable to create SP\n"); | ||
123 | exit(8); | ||
124 | } | ||
125 | |||
126 | SP->autocr = TRUE; /* cr -> lf by default */ | ||
127 | SP->raw_out = FALSE; /* tty I/O modes */ | ||
128 | SP->raw_inp = FALSE; /* tty I/O modes */ | ||
129 | SP->cbreak = TRUE; | ||
130 | SP->save_key_modifiers = FALSE; | ||
131 | SP->return_key_modifiers = FALSE; | ||
132 | SP->echo = TRUE; | ||
133 | SP->visibility = 1; | ||
134 | SP->resized = FALSE; | ||
135 | SP->_trap_mbe = 0L; | ||
136 | SP->_map_mbe_to_key = 0L; | ||
137 | SP->linesrippedoff = 0; | ||
138 | SP->linesrippedoffontop = 0; | ||
139 | SP->delaytenths = 0; | ||
140 | SP->line_color = -1; | ||
141 | |||
142 | SP->orig_cursor = PDC_get_cursor_mode(); | ||
143 | |||
144 | LINES = SP->lines; | ||
145 | COLS = SP->cols; | ||
146 | |||
147 | if (LINES < 2 || COLS < 2) | ||
148 | { | ||
149 | fprintf(stderr, "initscr(): LINES=%d COLS=%d: too small.\n", | ||
150 | LINES, COLS); | ||
151 | exit(4); | ||
152 | } | ||
153 | |||
154 | if ((curscr = newwin(LINES, COLS, 0, 0)) == (WINDOW *)NULL) | ||
155 | { | ||
156 | fprintf(stderr, "initscr(): Unable to create curscr.\n"); | ||
157 | exit(2); | ||
158 | } | ||
159 | |||
160 | if ((pdc_lastscr = newwin(LINES, COLS, 0, 0)) == (WINDOW *)NULL) | ||
161 | { | ||
162 | fprintf(stderr, "initscr(): Unable to create pdc_lastscr.\n"); | ||
163 | exit(2); | ||
164 | } | ||
165 | |||
166 | wattrset(pdc_lastscr, (chtype)(-1)); | ||
167 | werase(pdc_lastscr); | ||
168 | |||
169 | PDC_slk_initialize(); | ||
170 | LINES -= SP->slklines; | ||
171 | |||
172 | /* We have to sort out ripped off lines here, and reduce the height | ||
173 | of stdscr by the number of lines ripped off */ | ||
174 | |||
175 | for (i = 0; i < linesrippedoff; i++) | ||
176 | { | ||
177 | if (linesripped[i].line < 0) | ||
178 | (*linesripped[i].init)(newwin(1, COLS, LINES - 1, 0), COLS); | ||
179 | else | ||
180 | (*linesripped[i].init)(newwin(1, COLS, | ||
181 | SP->linesrippedoffontop++, 0), COLS); | ||
182 | |||
183 | SP->linesrippedoff++; | ||
184 | LINES--; | ||
185 | } | ||
186 | |||
187 | linesrippedoff = 0; | ||
188 | |||
189 | if (!(stdscr = newwin(LINES, COLS, SP->linesrippedoffontop, 0))) | ||
190 | { | ||
191 | fprintf(stderr, "initscr(): Unable to create stdscr.\n"); | ||
192 | exit(1); | ||
193 | } | ||
194 | |||
195 | wclrtobot(stdscr); | ||
196 | |||
197 | /* If preserving the existing screen, don't allow a screen clear */ | ||
198 | |||
199 | if (SP->_preserve) | ||
200 | { | ||
201 | untouchwin(curscr); | ||
202 | untouchwin(stdscr); | ||
203 | stdscr->_clear = FALSE; | ||
204 | curscr->_clear = FALSE; | ||
205 | } | ||
206 | else | ||
207 | curscr->_clear = TRUE; | ||
208 | |||
209 | PDC_init_atrtab(); /* set up default colors */ | ||
210 | |||
211 | MOUSE_X_POS = MOUSE_Y_POS = -1; | ||
212 | BUTTON_STATUS(1) = BUTTON_RELEASED; | ||
213 | BUTTON_STATUS(2) = BUTTON_RELEASED; | ||
214 | BUTTON_STATUS(3) = BUTTON_RELEASED; | ||
215 | Mouse_status.changes = 0; | ||
216 | |||
217 | SP->alive = TRUE; | ||
218 | |||
219 | def_shell_mode(); | ||
220 | |||
221 | sprintf(ttytype, "pdcurses|PDCurses for %s", PDC_sysname()); | ||
222 | |||
223 | return stdscr; | ||
224 | } | ||
225 | |||
226 | WINDOW *initscr(void) | ||
227 | { | ||
228 | PDC_LOG(("initscr() - called\n")); | ||
229 | |||
230 | return Xinitscr(0, NULL); | ||
231 | } | ||
232 | |||
233 | int endwin(void) | ||
234 | { | ||
235 | PDC_LOG(("endwin() - called\n")); | ||
236 | |||
237 | /* Allow temporary exit from curses using endwin() */ | ||
238 | |||
239 | def_prog_mode(); | ||
240 | PDC_scr_close(); | ||
241 | |||
242 | SP->alive = FALSE; | ||
243 | |||
244 | return OK; | ||
245 | } | ||
246 | |||
247 | bool isendwin(void) | ||
248 | { | ||
249 | PDC_LOG(("isendwin() - called\n")); | ||
250 | |||
251 | return SP ? !(SP->alive) : FALSE; | ||
252 | } | ||
253 | |||
254 | SCREEN *newterm(const char *type, FILE *outfd, FILE *infd) | ||
255 | { | ||
256 | PDC_LOG(("newterm() - called\n")); | ||
257 | |||
258 | return Xinitscr(0, NULL) ? SP : NULL; | ||
259 | } | ||
260 | |||
261 | SCREEN *set_term(SCREEN *new) | ||
262 | { | ||
263 | PDC_LOG(("set_term() - called\n")); | ||
264 | |||
265 | /* We only support one screen */ | ||
266 | |||
267 | return (new == SP) ? SP : NULL; | ||
268 | } | ||
269 | |||
270 | void delscreen(SCREEN *sp) | ||
271 | { | ||
272 | PDC_LOG(("delscreen() - called\n")); | ||
273 | |||
274 | if (sp != SP) | ||
275 | return; | ||
276 | |||
277 | PDC_slk_free(); /* free the soft label keys, if needed */ | ||
278 | |||
279 | delwin(stdscr); | ||
280 | delwin(curscr); | ||
281 | delwin(pdc_lastscr); | ||
282 | stdscr = (WINDOW *)NULL; | ||
283 | curscr = (WINDOW *)NULL; | ||
284 | pdc_lastscr = (WINDOW *)NULL; | ||
285 | |||
286 | SP->alive = FALSE; | ||
287 | |||
288 | PDC_scr_free(); /* free SP and pdc_atrtab */ | ||
289 | |||
290 | SP = (SCREEN *)NULL; | ||
291 | } | ||
292 | |||
293 | int resize_term(int nlines, int ncols) | ||
294 | { | ||
295 | PDC_LOG(("resize_term() - called: nlines %d\n", nlines)); | ||
296 | |||
297 | if (!stdscr || PDC_resize_screen(nlines, ncols) == ERR) | ||
298 | return ERR; | ||
299 | |||
300 | SP->lines = PDC_get_rows(); | ||
301 | LINES = SP->lines - SP->linesrippedoff - SP->slklines; | ||
302 | SP->cols = COLS = PDC_get_columns(); | ||
303 | |||
304 | if (wresize(curscr, SP->lines, SP->cols) == ERR || | ||
305 | wresize(stdscr, LINES, COLS) == ERR || | ||
306 | wresize(pdc_lastscr, SP->lines, SP->cols) == ERR) | ||
307 | return ERR; | ||
308 | |||
309 | werase(pdc_lastscr); | ||
310 | curscr->_clear = TRUE; | ||
311 | |||
312 | if (SP->slk_winptr) | ||
313 | { | ||
314 | if (wresize(SP->slk_winptr, SP->slklines, COLS) == ERR) | ||
315 | return ERR; | ||
316 | |||
317 | wmove(SP->slk_winptr, 0, 0); | ||
318 | wclrtobot(SP->slk_winptr); | ||
319 | PDC_slk_initialize(); | ||
320 | slk_noutrefresh(); | ||
321 | } | ||
322 | |||
323 | touchwin(stdscr); | ||
324 | wnoutrefresh(stdscr); | ||
325 | |||
326 | return OK; | ||
327 | } | ||
328 | |||
329 | bool is_termresized(void) | ||
330 | { | ||
331 | PDC_LOG(("is_termresized() - called\n")); | ||
332 | |||
333 | return SP->resized; | ||
334 | } | ||
335 | |||
336 | const char *curses_version(void) | ||
337 | { | ||
338 | return _curses_notice; | ||
339 | } |
File pdcurses/inopts.c added (mode: 100644) (index 00000000..6d33fc2a) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: inopts.c,v 1.43 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: inopts | ||
10 | |||
11 | Synopsis: | ||
12 | int cbreak(void); | ||
13 | int nocbreak(void); | ||
14 | int echo(void); | ||
15 | int noecho(void); | ||
16 | int halfdelay(int tenths); | ||
17 | int intrflush(WINDOW *win, bool bf); | ||
18 | int keypad(WINDOW *win, bool bf); | ||
19 | int meta(WINDOW *win, bool bf); | ||
20 | int nl(void); | ||
21 | int nonl(void); | ||
22 | int nodelay(WINDOW *win, bool bf); | ||
23 | int notimeout(WINDOW *win, bool bf); | ||
24 | int raw(void); | ||
25 | int noraw(void); | ||
26 | void noqiflush(void); | ||
27 | void qiflush(void); | ||
28 | void timeout(int delay); | ||
29 | void wtimeout(WINDOW *win, int delay); | ||
30 | int typeahead(int fildes); | ||
31 | |||
32 | int crmode(void); | ||
33 | int nocrmode(void); | ||
34 | |||
35 | Description: | ||
36 | cbreak() and nocbreak() toggle cbreak mode. In cbreak mode, | ||
37 | characters typed by the user are made available immediately, and | ||
38 | erase/kill character processing is not performed. In nocbreak | ||
39 | mode, typed characters are buffered until a newline or carriage | ||
40 | return. Interrupt and flow control characters are unaffected by | ||
41 | this mode. PDCurses always starts in cbreak mode. | ||
42 | |||
43 | echo() and noecho() control whether typed characters are echoed | ||
44 | by the input routine. Initially, input characters are echoed. | ||
45 | Subsequent calls to echo() and noecho() do not flush type-ahead. | ||
46 | |||
47 | halfdelay() is similar to cbreak(), but allows for a time limit | ||
48 | to be specified, in tenths of a second. This causes getch() to | ||
49 | block for that period before returning ERR if no key has been | ||
50 | received. tenths must be between 1 and 255. | ||
51 | |||
52 | keypad() controls whether getch() returns function/special keys | ||
53 | as single key codes (e.g., the left arrow key as KEY_LEFT). Per | ||
54 | X/Open, the default for keypad mode is OFF. You'll probably want | ||
55 | it on. With keypad mode off, if a special key is pressed, | ||
56 | getch() does nothing or returns ERR. | ||
57 | |||
58 | nodelay() controls whether wgetch() is a non-blocking call. If | ||
59 | the option is enabled, and no input is ready, wgetch() will | ||
60 | return ERR. If disabled, wgetch() will hang until input is | ||
61 | ready. | ||
62 | |||
63 | nl() enables the translation of a carriage return into a newline | ||
64 | on input. nonl() disables this. Initially, the translation does | ||
65 | occur. | ||
66 | |||
67 | raw() and noraw() toggle raw mode. Raw mode is similar to cbreak | ||
68 | mode, in that characters typed are immediately passed through to | ||
69 | the user program. The difference is that in raw mode, the INTR, | ||
70 | QUIT, SUSP, and STOP characters are passed through without being | ||
71 | interpreted, and without generating a signal. | ||
72 | |||
73 | In PDCurses, the meta() function sets raw mode on or off. | ||
74 | |||
75 | timeout() and wtimeout() set blocking or non-blocking reads for | ||
76 | the specified window. The delay is measured in milliseconds. If | ||
77 | it's negative, a blocking read is used; if zero, then non- | ||
78 | blocking reads are done -- if no input is waiting, ERR is | ||
79 | returned immediately. If the delay is positive, the read blocks | ||
80 | for the delay period; if the period expires, ERR is returned. | ||
81 | |||
82 | intrflush(), notimeout(), noqiflush(), qiflush() and typeahead() | ||
83 | do nothing in PDCurses, but are included for compatibility with | ||
84 | other curses implementations. | ||
85 | |||
86 | crmode() and nocrmode() are archaic equivalents to cbreak() and | ||
87 | nocbreak(), respectively. | ||
88 | |||
89 | Return Value: | ||
90 | All functions return OK on success and ERR on error. | ||
91 | |||
92 | Portability X/Open BSD SYS V | ||
93 | cbreak Y Y Y | ||
94 | nocbreak Y Y Y | ||
95 | echo Y Y Y | ||
96 | noecho Y Y Y | ||
97 | halfdelay Y - Y | ||
98 | intrflush Y - Y | ||
99 | keypad Y - Y | ||
100 | meta Y - Y | ||
101 | nl Y Y Y | ||
102 | nonl Y Y Y | ||
103 | nodelay Y - Y | ||
104 | notimeout Y - Y | ||
105 | raw Y Y Y | ||
106 | noraw Y Y Y | ||
107 | noqiflush Y - Y | ||
108 | qiflush Y - Y | ||
109 | timeout Y - Y | ||
110 | wtimeout Y - Y | ||
111 | typeahead Y - Y | ||
112 | crmode - | ||
113 | nocrmode - | ||
114 | |||
115 | **man-end****************************************************************/ | ||
116 | |||
117 | int cbreak(void) | ||
118 | { | ||
119 | PDC_LOG(("cbreak() - called\n")); | ||
120 | |||
121 | SP->cbreak = TRUE; | ||
122 | |||
123 | return OK; | ||
124 | } | ||
125 | |||
126 | int nocbreak(void) | ||
127 | { | ||
128 | PDC_LOG(("nocbreak() - called\n")); | ||
129 | |||
130 | SP->cbreak = FALSE; | ||
131 | SP->delaytenths = 0; | ||
132 | |||
133 | return OK; | ||
134 | } | ||
135 | |||
136 | int echo(void) | ||
137 | { | ||
138 | PDC_LOG(("echo() - called\n")); | ||
139 | |||
140 | SP->echo = TRUE; | ||
141 | |||
142 | return OK; | ||
143 | } | ||
144 | |||
145 | int noecho(void) | ||
146 | { | ||
147 | PDC_LOG(("noecho() - called\n")); | ||
148 | |||
149 | SP->echo = FALSE; | ||
150 | |||
151 | return OK; | ||
152 | } | ||
153 | |||
154 | int halfdelay(int tenths) | ||
155 | { | ||
156 | PDC_LOG(("halfdelay() - called\n")); | ||
157 | |||
158 | if (tenths < 1 || tenths > 255) | ||
159 | return ERR; | ||
160 | |||
161 | SP->delaytenths = tenths; | ||
162 | |||
163 | return OK; | ||
164 | } | ||
165 | |||
166 | int intrflush(WINDOW *win, bool bf) | ||
167 | { | ||
168 | PDC_LOG(("intrflush() - called\n")); | ||
169 | |||
170 | return OK; | ||
171 | } | ||
172 | |||
173 | int keypad(WINDOW *win, bool bf) | ||
174 | { | ||
175 | PDC_LOG(("keypad() - called\n")); | ||
176 | |||
177 | if (!win) | ||
178 | return ERR; | ||
179 | |||
180 | win->_use_keypad = bf; | ||
181 | |||
182 | return OK; | ||
183 | } | ||
184 | |||
185 | int meta(WINDOW *win, bool bf) | ||
186 | { | ||
187 | PDC_LOG(("meta() - called\n")); | ||
188 | |||
189 | SP->raw_inp = bf; | ||
190 | |||
191 | return OK; | ||
192 | } | ||
193 | |||
194 | int nl(void) | ||
195 | { | ||
196 | PDC_LOG(("nl() - called\n")); | ||
197 | |||
198 | SP->autocr = TRUE; | ||
199 | |||
200 | return OK; | ||
201 | } | ||
202 | |||
203 | int nonl(void) | ||
204 | { | ||
205 | PDC_LOG(("nonl() - called\n")); | ||
206 | |||
207 | SP->autocr = FALSE; | ||
208 | |||
209 | return OK; | ||
210 | } | ||
211 | |||
212 | int nodelay(WINDOW *win, bool flag) | ||
213 | { | ||
214 | PDC_LOG(("nodelay() - called\n")); | ||
215 | |||
216 | if (!win) | ||
217 | return ERR; | ||
218 | |||
219 | win->_nodelay = flag; | ||
220 | |||
221 | return OK; | ||
222 | } | ||
223 | |||
224 | int notimeout(WINDOW *win, bool flag) | ||
225 | { | ||
226 | PDC_LOG(("notimeout() - called\n")); | ||
227 | |||
228 | return OK; | ||
229 | } | ||
230 | |||
231 | int raw(void) | ||
232 | { | ||
233 | PDC_LOG(("raw() - called\n")); | ||
234 | |||
235 | PDC_set_keyboard_binary(TRUE); | ||
236 | SP->raw_inp = TRUE; | ||
237 | |||
238 | return OK; | ||
239 | } | ||
240 | |||
241 | int noraw(void) | ||
242 | { | ||
243 | PDC_LOG(("noraw() - called\n")); | ||
244 | |||
245 | PDC_set_keyboard_binary(FALSE); | ||
246 | SP->raw_inp = FALSE; | ||
247 | |||
248 | return OK; | ||
249 | } | ||
250 | |||
251 | void noqiflush(void) | ||
252 | { | ||
253 | PDC_LOG(("noqiflush() - called\n")); | ||
254 | } | ||
255 | |||
256 | void qiflush(void) | ||
257 | { | ||
258 | PDC_LOG(("qiflush() - called\n")); | ||
259 | } | ||
260 | |||
261 | int typeahead(int fildes) | ||
262 | { | ||
263 | PDC_LOG(("typeahead() - called\n")); | ||
264 | |||
265 | return OK; | ||
266 | } | ||
267 | |||
268 | void wtimeout(WINDOW *win, int delay) | ||
269 | { | ||
270 | PDC_LOG(("wtimeout() - called\n")); | ||
271 | |||
272 | if (!win) | ||
273 | return; | ||
274 | |||
275 | if (delay < 0) | ||
276 | { | ||
277 | /* This causes a blocking read on the window, so turn on delay | ||
278 | mode */ | ||
279 | |||
280 | win->_nodelay = FALSE; | ||
281 | win->_delayms = 0; | ||
282 | } | ||
283 | else if (!delay) | ||
284 | { | ||
285 | /* This causes a non-blocking read on the window, so turn off | ||
286 | delay mode */ | ||
287 | |||
288 | win->_nodelay = TRUE; | ||
289 | win->_delayms = 0; | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | /* This causes the read on the window to delay for the number of | ||
294 | milliseconds. Also forces the window into non-blocking read | ||
295 | mode */ | ||
296 | |||
297 | /*win->_nodelay = TRUE;*/ | ||
298 | win->_delayms = delay; | ||
299 | } | ||
300 | } | ||
301 | |||
302 | void timeout(int delay) | ||
303 | { | ||
304 | PDC_LOG(("timeout() - called\n")); | ||
305 | |||
306 | wtimeout(stdscr, delay); | ||
307 | } | ||
308 | |||
309 | int crmode(void) | ||
310 | { | ||
311 | PDC_LOG(("crmode() - called\n")); | ||
312 | |||
313 | return cbreak(); | ||
314 | } | ||
315 | |||
316 | int nocrmode(void) | ||
317 | { | ||
318 | PDC_LOG(("nocrmode() - called\n")); | ||
319 | |||
320 | return nocbreak(); | ||
321 | } |
File pdcurses/insch.c added (mode: 100644) (index 00000000..50527f2f) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: insch.c,v 1.44 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: insch | ||
10 | |||
11 | Synopsis: | ||
12 | int insch(chtype ch); | ||
13 | int winsch(WINDOW *win, chtype ch); | ||
14 | int mvinsch(int y, int x, chtype ch); | ||
15 | int mvwinsch(WINDOW *win, int y, int x, chtype ch); | ||
16 | |||
17 | int insrawch(chtype ch); | ||
18 | int winsrawch(WINDOW *win, chtype ch); | ||
19 | int mvinsrawch(int y, int x, chtype ch); | ||
20 | int mvwinsrawch(WINDOW *win, int y, int x, chtype ch); | ||
21 | |||
22 | int ins_wch(const cchar_t *wch); | ||
23 | int wins_wch(WINDOW *win, const cchar_t *wch); | ||
24 | int mvins_wch(int y, int x, const cchar_t *wch); | ||
25 | int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch); | ||
26 | |||
27 | Description: | ||
28 | The insch() functions insert a chtype into the window at the | ||
29 | current or specified cursor position. The cursor is NOT | ||
30 | advanced. A newline is equivalent to clrtoeol(); tabs are | ||
31 | expanded; other control characters are converted as with | ||
32 | unctrl(). | ||
33 | |||
34 | The ins_wch() functions are the wide-character | ||
35 | equivalents, taking cchar_t pointers rather than chtypes. | ||
36 | |||
37 | Video attributes can be combined with a character by ORing | ||
38 | them into the parameter. Text, including attributes, can be | ||
39 | copied from one place to another using inch() and insch(). | ||
40 | |||
41 | insrawch() etc. are PDCurses-specific wrappers for insch() etc. | ||
42 | that disable the translation of control characters. | ||
43 | |||
44 | Return Value: | ||
45 | All functions return OK on success and ERR on error. | ||
46 | |||
47 | Portability X/Open BSD SYS V | ||
48 | insch Y Y Y | ||
49 | winsch Y Y Y | ||
50 | mvinsch Y Y Y | ||
51 | mvwinsch Y Y Y | ||
52 | insrawch - - - | ||
53 | winsrawch - - - | ||
54 | ins_wch Y | ||
55 | wins_wch Y | ||
56 | mvins_wch Y | ||
57 | mvwins_wch Y | ||
58 | |||
59 | **man-end****************************************************************/ | ||
60 | |||
61 | #include <string.h> | ||
62 | |||
63 | int winsch(WINDOW *win, chtype ch) | ||
64 | { | ||
65 | int x, y; | ||
66 | chtype attr; | ||
67 | bool xlat; | ||
68 | |||
69 | PDC_LOG(("winsch() - called: win=%p ch=%x (text=%c attr=0x%x)\n", | ||
70 | win, ch, ch & A_CHARTEXT, ch & A_ATTRIBUTES)); | ||
71 | |||
72 | if (!win) | ||
73 | return ERR; | ||
74 | |||
75 | x = win->_curx; | ||
76 | y = win->_cury; | ||
77 | |||
78 | if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) | ||
79 | return ERR; | ||
80 | |||
81 | xlat = !SP->raw_out && !(ch & A_ALTCHARSET); | ||
82 | attr = ch & A_ATTRIBUTES; | ||
83 | ch &= A_CHARTEXT; | ||
84 | |||
85 | if (xlat && (ch < ' ' || ch == 0x7f)) | ||
86 | { | ||
87 | int x2; | ||
88 | |||
89 | switch (ch) | ||
90 | { | ||
91 | case '\t': | ||
92 | for (x2 = ((x / TABSIZE) + 1) * TABSIZE; x < x2; x++) | ||
93 | { | ||
94 | if (winsch(win, attr | ' ') == ERR) | ||
95 | return ERR; | ||
96 | } | ||
97 | return OK; | ||
98 | |||
99 | case '\n': | ||
100 | wclrtoeol(win); | ||
101 | break; | ||
102 | |||
103 | case 0x7f: | ||
104 | if (winsch(win, attr | '?') == ERR) | ||
105 | return ERR; | ||
106 | |||
107 | return winsch(win, attr | '^'); | ||
108 | |||
109 | default: | ||
110 | /* handle control chars */ | ||
111 | |||
112 | if (winsch(win, attr | (ch + '@')) == ERR) | ||
113 | return ERR; | ||
114 | |||
115 | return winsch(win, attr | '^'); | ||
116 | } | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | int maxx; | ||
121 | chtype *temp; | ||
122 | |||
123 | /* If the incoming character doesn't have its own attribute, | ||
124 | then use the current attributes for the window. If it has | ||
125 | attributes but not a color component, OR the attributes to | ||
126 | the current attributes for the window. If it has a color | ||
127 | component, use the attributes solely from the incoming | ||
128 | character. */ | ||
129 | |||
130 | if (!(attr & A_COLOR)) | ||
131 | attr |= win->_attrs; | ||
132 | |||
133 | /* wrs (4/10/93): Apply the same sort of logic for the window | ||
134 | background, in that it only takes precedence if other color | ||
135 | attributes are not there and that the background character | ||
136 | will only print if the printing character is blank. */ | ||
137 | |||
138 | if (!(attr & A_COLOR)) | ||
139 | attr |= win->_bkgd & A_ATTRIBUTES; | ||
140 | else | ||
141 | attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); | ||
142 | |||
143 | if (ch == ' ') | ||
144 | ch = win->_bkgd & A_CHARTEXT; | ||
145 | |||
146 | /* Add the attribute back into the character. */ | ||
147 | |||
148 | ch |= attr; | ||
149 | |||
150 | maxx = win->_maxx; | ||
151 | temp = &win->_y[y][x]; | ||
152 | |||
153 | memmove(temp + 1, temp, (maxx - x - 1) * sizeof(chtype)); | ||
154 | |||
155 | win->_lastch[y] = maxx - 1; | ||
156 | |||
157 | if ((win->_firstch[y] == _NO_CHANGE) || (win->_firstch[y] > x)) | ||
158 | win->_firstch[y] = x; | ||
159 | |||
160 | *temp = ch; | ||
161 | } | ||
162 | |||
163 | PDC_sync(win); | ||
164 | |||
165 | return OK; | ||
166 | } | ||
167 | |||
168 | int insch(chtype ch) | ||
169 | { | ||
170 | PDC_LOG(("insch() - called\n")); | ||
171 | |||
172 | return winsch(stdscr, ch); | ||
173 | } | ||
174 | |||
175 | int mvinsch(int y, int x, chtype ch) | ||
176 | { | ||
177 | PDC_LOG(("mvinsch() - called\n")); | ||
178 | |||
179 | if (move(y, x) == ERR) | ||
180 | return ERR; | ||
181 | |||
182 | return winsch(stdscr, ch); | ||
183 | } | ||
184 | |||
185 | int mvwinsch(WINDOW *win, int y, int x, chtype ch) | ||
186 | { | ||
187 | PDC_LOG(("mvwinsch() - called\n")); | ||
188 | |||
189 | if (wmove(win, y, x) == ERR) | ||
190 | return ERR; | ||
191 | |||
192 | return winsch(win, ch); | ||
193 | } | ||
194 | |||
195 | int winsrawch(WINDOW *win, chtype ch) | ||
196 | { | ||
197 | PDC_LOG(("winsrawch() - called: win=%p ch=%x " | ||
198 | "(char=%c attr=0x%x)\n", win, ch, | ||
199 | ch & A_CHARTEXT, ch & A_ATTRIBUTES)); | ||
200 | |||
201 | if ((ch & A_CHARTEXT) < ' ' || (ch & A_CHARTEXT) == 0x7f) | ||
202 | ch |= A_ALTCHARSET; | ||
203 | |||
204 | return winsch(win, ch); | ||
205 | } | ||
206 | |||
207 | int insrawch(chtype ch) | ||
208 | { | ||
209 | PDC_LOG(("insrawch() - called\n")); | ||
210 | |||
211 | return winsrawch(stdscr, ch); | ||
212 | } | ||
213 | |||
214 | int mvinsrawch(int y, int x, chtype ch) | ||
215 | { | ||
216 | PDC_LOG(("mvinsrawch() - called\n")); | ||
217 | |||
218 | if (move(y, x) == ERR) | ||
219 | return ERR; | ||
220 | |||
221 | return winsrawch(stdscr, ch); | ||
222 | } | ||
223 | |||
224 | int mvwinsrawch(WINDOW *win, int y, int x, chtype ch) | ||
225 | { | ||
226 | PDC_LOG(("mvwinsrawch() - called\n")); | ||
227 | |||
228 | if (wmove(win, y, x) == ERR) | ||
229 | return ERR; | ||
230 | |||
231 | return winsrawch(win, ch); | ||
232 | } | ||
233 | |||
234 | #ifdef PDC_WIDE | ||
235 | int wins_wch(WINDOW *win, const cchar_t *wch) | ||
236 | { | ||
237 | PDC_LOG(("wins_wch() - called\n")); | ||
238 | |||
239 | return wch ? winsch(win, *wch) : ERR; | ||
240 | } | ||
241 | |||
242 | int ins_wch(const cchar_t *wch) | ||
243 | { | ||
244 | PDC_LOG(("ins_wch() - called\n")); | ||
245 | |||
246 | return wins_wch(stdscr, wch); | ||
247 | } | ||
248 | |||
249 | int mvins_wch(int y, int x, const cchar_t *wch) | ||
250 | { | ||
251 | PDC_LOG(("mvins_wch() - called\n")); | ||
252 | |||
253 | if (move(y, x) == ERR) | ||
254 | return ERR; | ||
255 | |||
256 | return wins_wch(stdscr, wch); | ||
257 | } | ||
258 | |||
259 | int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch) | ||
260 | { | ||
261 | PDC_LOG(("mvwins_wch() - called\n")); | ||
262 | |||
263 | if (wmove(win, y, x) == ERR) | ||
264 | return ERR; | ||
265 | |||
266 | return wins_wch(win, wch); | ||
267 | } | ||
268 | #endif |
File pdcurses/insstr.c added (mode: 100644) (index 00000000..38fa3891) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: insstr.c,v 1.46 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: insstr | ||
10 | |||
11 | Synopsis: | ||
12 | int insstr(const char *str); | ||
13 | int insnstr(const char *str, int n); | ||
14 | int winsstr(WINDOW *win, const char *str); | ||
15 | int winsnstr(WINDOW *win, const char *str, int n); | ||
16 | int mvinsstr(int y, int x, const char *str); | ||
17 | int mvinsnstr(int y, int x, const char *str, int n); | ||
18 | int mvwinsstr(WINDOW *win, int y, int x, const char *str); | ||
19 | int mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n); | ||
20 | |||
21 | int ins_wstr(const wchar_t *wstr); | ||
22 | int ins_nwstr(const wchar_t *wstr, int n); | ||
23 | int wins_wstr(WINDOW *win, const wchar_t *wstr); | ||
24 | int wins_nwstr(WINDOW *win, const wchar_t *wstr, int n); | ||
25 | int mvins_wstr(int y, int x, const wchar_t *wstr); | ||
26 | int mvins_nwstr(int y, int x, const wchar_t *wstr, int n); | ||
27 | int mvwins_wstr(WINDOW *win, int y, int x, const wchar_t *wstr); | ||
28 | int mvwins_nwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n); | ||
29 | |||
30 | Description: | ||
31 | The insstr() functions insert a character string into a window | ||
32 | at the current cursor position, by repeatedly calling winsch(). | ||
33 | When PDCurses is built with wide-character support enabled, the | ||
34 | narrow-character functions treat the string as a multibyte | ||
35 | string in the current locale, and convert it first. All | ||
36 | characters to the right of the cursor are moved to the right, | ||
37 | with the possibility of the rightmost characters on the line | ||
38 | being lost. The cursor position does not change (after moving | ||
39 | to y, x, if specified). The routines with n as the last | ||
40 | argument insert at most n characters; if n is negative, then the | ||
41 | entire string is inserted. | ||
42 | |||
43 | Return Value: | ||
44 | All functions return OK on success and ERR on error. | ||
45 | |||
46 | Portability X/Open BSD SYS V | ||
47 | insstr Y - 4.0 | ||
48 | winsstr Y - 4.0 | ||
49 | mvinsstr Y - 4.0 | ||
50 | mvwinsstr Y - 4.0 | ||
51 | insnstr Y - 4.0 | ||
52 | winsnstr Y - 4.0 | ||
53 | mvinsnstr Y - 4.0 | ||
54 | mvwinsnstr Y - 4.0 | ||
55 | ins_wstr Y | ||
56 | wins_wstr Y | ||
57 | mvins_wstr Y | ||
58 | mvwins_wstr Y | ||
59 | ins_nwstr Y | ||
60 | wins_nwstr Y | ||
61 | mvins_nwstr Y | ||
62 | mvwins_nwstr Y | ||
63 | |||
64 | **man-end****************************************************************/ | ||
65 | |||
66 | #include <string.h> | ||
67 | |||
68 | int winsnstr(WINDOW *win, const char *str, int n) | ||
69 | { | ||
70 | #ifdef PDC_WIDE | ||
71 | wchar_t wstr[513], *p; | ||
72 | int i; | ||
73 | #endif | ||
74 | int len; | ||
75 | |||
76 | PDC_LOG(("winsnstr() - called: string=\"%s\" n %d \n", str, n)); | ||
77 | |||
78 | if (!win || !str) | ||
79 | return ERR; | ||
80 | |||
81 | len = strlen(str); | ||
82 | |||
83 | if (n < 0 || n < len) | ||
84 | n = len; | ||
85 | |||
86 | #ifdef PDC_WIDE | ||
87 | if (n > 512) | ||
88 | n = 512; | ||
89 | |||
90 | p = wstr; | ||
91 | i = 0; | ||
92 | |||
93 | while (str[i] && i < n) | ||
94 | { | ||
95 | int retval = PDC_mbtowc(p, str + i, n - i); | ||
96 | |||
97 | if (retval <= 0) | ||
98 | break; | ||
99 | p++; | ||
100 | i += retval; | ||
101 | } | ||
102 | |||
103 | while (p > wstr) | ||
104 | if (winsch(win, *--p) == ERR) | ||
105 | #else | ||
106 | while (n) | ||
107 | if (winsch(win, (unsigned char)(str[--n])) == ERR) | ||
108 | #endif | ||
109 | return ERR; | ||
110 | |||
111 | return OK; | ||
112 | } | ||
113 | |||
114 | int insstr(const char *str) | ||
115 | { | ||
116 | PDC_LOG(("insstr() - called: string=\"%s\"\n", str)); | ||
117 | |||
118 | return winsnstr(stdscr, str, -1); | ||
119 | } | ||
120 | |||
121 | int winsstr(WINDOW *win, const char *str) | ||
122 | { | ||
123 | PDC_LOG(("winsstr() - called: string=\"%s\"\n", str)); | ||
124 | |||
125 | return winsnstr(win, str, -1); | ||
126 | } | ||
127 | |||
128 | int mvinsstr(int y, int x, const char *str) | ||
129 | { | ||
130 | PDC_LOG(("mvinsstr() - called: y %d x %d string=\"%s\"\n", y, x, str)); | ||
131 | |||
132 | if (move(y, x) == ERR) | ||
133 | return ERR; | ||
134 | |||
135 | return winsnstr(stdscr, str, -1); | ||
136 | } | ||
137 | |||
138 | int mvwinsstr(WINDOW *win, int y, int x, const char *str) | ||
139 | { | ||
140 | PDC_LOG(("mvwinsstr() - called: string=\"%s\"\n", str)); | ||
141 | |||
142 | if (wmove(win, y, x) == ERR) | ||
143 | return ERR; | ||
144 | |||
145 | return winsnstr(win, str, -1); | ||
146 | } | ||
147 | |||
148 | int insnstr(const char *str, int n) | ||
149 | { | ||
150 | PDC_LOG(("insnstr() - called: string=\"%s\" n %d \n", str, n)); | ||
151 | |||
152 | return winsnstr(stdscr, str, n); | ||
153 | } | ||
154 | |||
155 | int mvinsnstr(int y, int x, const char *str, int n) | ||
156 | { | ||
157 | PDC_LOG(("mvinsnstr() - called: y %d x %d string=\"%s\" n %d \n", | ||
158 | y, x, str, n)); | ||
159 | |||
160 | if (move(y, x) == ERR) | ||
161 | return ERR; | ||
162 | |||
163 | return winsnstr(stdscr, str, n); | ||
164 | } | ||
165 | |||
166 | int mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n) | ||
167 | { | ||
168 | PDC_LOG(("mvwinsnstr() - called: y %d x %d string=\"%s\" n %d \n", | ||
169 | y, x, str, n)); | ||
170 | |||
171 | if (wmove(win, y, x) == ERR) | ||
172 | return ERR; | ||
173 | |||
174 | return winsnstr(win, str, n); | ||
175 | } | ||
176 | |||
177 | #ifdef PDC_WIDE | ||
178 | int wins_nwstr(WINDOW *win, const wchar_t *wstr, int n) | ||
179 | { | ||
180 | const wchar_t *p; | ||
181 | int len; | ||
182 | |||
183 | PDC_LOG(("wins_nwstr() - called\n")); | ||
184 | |||
185 | if (!win || !wstr) | ||
186 | return ERR; | ||
187 | |||
188 | for (len = 0, p = wstr; *p; p++) | ||
189 | len++; | ||
190 | |||
191 | if (n < 0 || n < len) | ||
192 | n = len; | ||
193 | |||
194 | while (n) | ||
195 | if (winsch(win, wstr[--n]) == ERR) | ||
196 | return ERR; | ||
197 | |||
198 | return OK; | ||
199 | } | ||
200 | |||
201 | int ins_wstr(const wchar_t *wstr) | ||
202 | { | ||
203 | PDC_LOG(("ins_wstr() - called\n")); | ||
204 | |||
205 | return wins_nwstr(stdscr, wstr, -1); | ||
206 | } | ||
207 | |||
208 | int wins_wstr(WINDOW *win, const wchar_t *wstr) | ||
209 | { | ||
210 | PDC_LOG(("wins_wstr() - called\n")); | ||
211 | |||
212 | return wins_nwstr(win, wstr, -1); | ||
213 | } | ||
214 | |||
215 | int mvins_wstr(int y, int x, const wchar_t *wstr) | ||
216 | { | ||
217 | PDC_LOG(("mvins_wstr() - called\n")); | ||
218 | |||
219 | if (move(y, x) == ERR) | ||
220 | return ERR; | ||
221 | |||
222 | return wins_nwstr(stdscr, wstr, -1); | ||
223 | } | ||
224 | |||
225 | int mvwins_wstr(WINDOW *win, int y, int x, const wchar_t *wstr) | ||
226 | { | ||
227 | PDC_LOG(("mvwinsstr() - called\n")); | ||
228 | |||
229 | if (wmove(win, y, x) == ERR) | ||
230 | return ERR; | ||
231 | |||
232 | return wins_nwstr(win, wstr, -1); | ||
233 | } | ||
234 | |||
235 | int ins_nwstr(const wchar_t *wstr, int n) | ||
236 | { | ||
237 | PDC_LOG(("ins_nwstr() - called\n")); | ||
238 | |||
239 | return wins_nwstr(stdscr, wstr, n); | ||
240 | } | ||
241 | |||
242 | int mvins_nwstr(int y, int x, const wchar_t *wstr, int n) | ||
243 | { | ||
244 | PDC_LOG(("mvinsnstr() - called\n")); | ||
245 | |||
246 | if (move(y, x) == ERR) | ||
247 | return ERR; | ||
248 | |||
249 | return wins_nwstr(stdscr, wstr, n); | ||
250 | } | ||
251 | |||
252 | int mvwins_nwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n) | ||
253 | { | ||
254 | PDC_LOG(("mvwinsnstr() - called\n")); | ||
255 | |||
256 | if (wmove(win, y, x) == ERR) | ||
257 | return ERR; | ||
258 | |||
259 | return wins_nwstr(win, wstr, n); | ||
260 | } | ||
261 | #endif |
File pdcurses/instr.c added (mode: 100644) (index 00000000..bbf369cc) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: instr.c,v 1.44 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: instr | ||
10 | |||
11 | Synopsis: | ||
12 | int instr(char *str); | ||
13 | int innstr(char *str, int n); | ||
14 | int winstr(WINDOW *win, char *str); | ||
15 | int winnstr(WINDOW *win, char *str, int n); | ||
16 | int mvinstr(int y, int x, char *str); | ||
17 | int mvinnstr(int y, int x, char *str, int n); | ||
18 | int mvwinstr(WINDOW *win, int y, int x, char *str); | ||
19 | int mvwinnstr(WINDOW *win, int y, int x, char *str, int n); | ||
20 | |||
21 | int inwstr(wchar_t *wstr); | ||
22 | int innwstr(wchar_t *wstr, int n); | ||
23 | int winwstr(WINDOW *win, wchar_t *wstr); | ||
24 | int winnwstr(WINDOW *win, wchar_t *wstr, int n); | ||
25 | int mvinwstr(int y, int x, wchar_t *wstr); | ||
26 | int mvinnwstr(int y, int x, wchar_t *wstr, int n); | ||
27 | int mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr); | ||
28 | int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n); | ||
29 | |||
30 | Description: | ||
31 | These functions take characters (or wide characters) from the | ||
32 | current or specified position in the window, and return them as | ||
33 | a string in str (or wstr). Attributes are ignored. The functions | ||
34 | with n as the last argument return a string at most n characters | ||
35 | long. | ||
36 | |||
37 | Return Value: | ||
38 | Upon successful completion, innstr(), mvinnstr(), mvwinnstr() | ||
39 | and winnstr() return the number of characters actually read into | ||
40 | the string; instr(), mvinstr(), mvwinstr() and winstr() return | ||
41 | OK. Otherwise, all these functions return ERR. | ||
42 | |||
43 | Portability X/Open BSD SYS V | ||
44 | instr Y - 4.0 | ||
45 | winstr Y - 4.0 | ||
46 | mvinstr Y - 4.0 | ||
47 | mvwinstr Y - 4.0 | ||
48 | innstr Y - 4.0 | ||
49 | winnstr Y - 4.0 | ||
50 | mvinnstr Y - 4.0 | ||
51 | mvwinnstr Y - 4.0 | ||
52 | inwstr Y | ||
53 | winwstr Y | ||
54 | mvinwstr Y | ||
55 | mvwinwstr Y | ||
56 | innwstr Y | ||
57 | winnwstr Y | ||
58 | mvinnwstr Y | ||
59 | mvwinnwstr Y | ||
60 | |||
61 | **man-end****************************************************************/ | ||
62 | |||
63 | int winnstr(WINDOW *win, char *str, int n) | ||
64 | { | ||
65 | #ifdef PDC_WIDE | ||
66 | wchar_t wstr[513]; | ||
67 | |||
68 | if (n < 0 || n > 512) | ||
69 | n = 512; | ||
70 | |||
71 | if (winnwstr(win, wstr, n) == ERR) | ||
72 | return ERR; | ||
73 | |||
74 | return PDC_wcstombs(str, wstr, n); | ||
75 | #else | ||
76 | chtype *src; | ||
77 | int i; | ||
78 | |||
79 | PDC_LOG(("winnstr() - called: n %d \n", n)); | ||
80 | |||
81 | if (!win || !str) | ||
82 | return ERR; | ||
83 | |||
84 | if (n < 0 || (win->_curx + n) > win->_maxx) | ||
85 | n = win->_maxx - win->_curx; | ||
86 | |||
87 | src = win->_y[win->_cury] + win->_curx; | ||
88 | |||
89 | for (i = 0; i < n; i++) | ||
90 | str[i] = src[i] & A_CHARTEXT; | ||
91 | |||
92 | str[i] = '\0'; | ||
93 | |||
94 | return i; | ||
95 | #endif | ||
96 | } | ||
97 | |||
98 | int instr(char *str) | ||
99 | { | ||
100 | PDC_LOG(("instr() - called: string=\"%s\"\n", str)); | ||
101 | |||
102 | return (ERR == winnstr(stdscr, str, stdscr->_maxx)) ? ERR : OK; | ||
103 | } | ||
104 | |||
105 | int winstr(WINDOW *win, char *str) | ||
106 | { | ||
107 | PDC_LOG(("winstr() - called: \n")); | ||
108 | |||
109 | return (ERR == winnstr(win, str, win->_maxx)) ? ERR : OK; | ||
110 | } | ||
111 | |||
112 | int mvinstr(int y, int x, char *str) | ||
113 | { | ||
114 | PDC_LOG(("mvinstr() - called: y %d x %d \n", y, x)); | ||
115 | |||
116 | if (move(y, x) == ERR) | ||
117 | return ERR; | ||
118 | |||
119 | return (ERR == winnstr(stdscr, str, stdscr->_maxx)) ? ERR : OK; | ||
120 | } | ||
121 | |||
122 | int mvwinstr(WINDOW *win, int y, int x, char *str) | ||
123 | { | ||
124 | PDC_LOG(("mvwinstr() - called: y %d x %d \n", y, x)); | ||
125 | |||
126 | if (wmove(win, y, x) == ERR) | ||
127 | return ERR; | ||
128 | |||
129 | return (ERR == winnstr(win, str, win->_maxx)) ? ERR : OK; | ||
130 | } | ||
131 | |||
132 | int innstr(char *str, int n) | ||
133 | { | ||
134 | PDC_LOG(("innstr() - called: n %d \n", n)); | ||
135 | |||
136 | return winnstr(stdscr, str, n); | ||
137 | } | ||
138 | |||
139 | int mvinnstr(int y, int x, char *str, int n) | ||
140 | { | ||
141 | PDC_LOG(("mvinnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
142 | |||
143 | if (move(y, x) == ERR) | ||
144 | return ERR; | ||
145 | |||
146 | return winnstr(stdscr, str, n); | ||
147 | } | ||
148 | |||
149 | int mvwinnstr(WINDOW *win, int y, int x, char *str, int n) | ||
150 | { | ||
151 | PDC_LOG(("mvwinnstr() - called: y %d x %d n %d \n", y, x, n)); | ||
152 | |||
153 | if (wmove(win, y, x) == ERR) | ||
154 | return ERR; | ||
155 | |||
156 | return winnstr(win, str, n); | ||
157 | } | ||
158 | |||
159 | #ifdef PDC_WIDE | ||
160 | int winnwstr(WINDOW *win, wchar_t *wstr, int n) | ||
161 | { | ||
162 | chtype *src; | ||
163 | int i; | ||
164 | |||
165 | PDC_LOG(("winnstr() - called: n %d \n", n)); | ||
166 | |||
167 | if (!win || !wstr) | ||
168 | return ERR; | ||
169 | |||
170 | if (n < 0 || (win->_curx + n) > win->_maxx) | ||
171 | n = win->_maxx - win->_curx; | ||
172 | |||
173 | src = win->_y[win->_cury] + win->_curx; | ||
174 | |||
175 | for (i = 0; i < n; i++) | ||
176 | wstr[i] = src[i] & A_CHARTEXT; | ||
177 | |||
178 | wstr[i] = L'\0'; | ||
179 | |||
180 | return i; | ||
181 | } | ||
182 | |||
183 | int inwstr(wchar_t *wstr) | ||
184 | { | ||
185 | PDC_LOG(("inwstr() - called\n")); | ||
186 | |||
187 | return (ERR == winnwstr(stdscr, wstr, stdscr->_maxx)) ? ERR : OK; | ||
188 | } | ||
189 | |||
190 | int winwstr(WINDOW *win, wchar_t *wstr) | ||
191 | { | ||
192 | PDC_LOG(("winwstr() - called\n")); | ||
193 | |||
194 | return (ERR == winnwstr(win, wstr, win->_maxx)) ? ERR : OK; | ||
195 | } | ||
196 | |||
197 | int mvinwstr(int y, int x, wchar_t *wstr) | ||
198 | { | ||
199 | PDC_LOG(("mvinwstr() - called\n")); | ||
200 | |||
201 | if (move(y, x) == ERR) | ||
202 | return ERR; | ||
203 | |||
204 | return (ERR == winnwstr(stdscr, wstr, stdscr->_maxx)) ? ERR : OK; | ||
205 | } | ||
206 | |||
207 | int mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr) | ||
208 | { | ||
209 | PDC_LOG(("mvwinstr() - called\n")); | ||
210 | |||
211 | if (wmove(win, y, x) == ERR) | ||
212 | return ERR; | ||
213 | |||
214 | return (ERR == winnwstr(win, wstr, win->_maxx)) ? ERR : OK; | ||
215 | } | ||
216 | |||
217 | int innwstr(wchar_t *wstr, int n) | ||
218 | { | ||
219 | PDC_LOG(("innwstr() - called\n")); | ||
220 | |||
221 | return winnwstr(stdscr, wstr, n); | ||
222 | } | ||
223 | |||
224 | int mvinnwstr(int y, int x, wchar_t *wstr, int n) | ||
225 | { | ||
226 | PDC_LOG(("mvinnstr() - called\n")); | ||
227 | |||
228 | if (move(y, x) == ERR) | ||
229 | return ERR; | ||
230 | |||
231 | return winnwstr(stdscr, wstr, n); | ||
232 | } | ||
233 | |||
234 | int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n) | ||
235 | { | ||
236 | PDC_LOG(("mvwinnwstr() - called\n")); | ||
237 | |||
238 | if (wmove(win, y, x) == ERR) | ||
239 | return ERR; | ||
240 | |||
241 | return winnwstr(win, wstr, n); | ||
242 | } | ||
243 | #endif |
File pdcurses/kernel.c added (mode: 100644) (index 00000000..7e41ccfd) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: kernel.c,v 1.78 2008/07/15 17:13:26 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: kernel | ||
10 | |||
11 | Synopsis: | ||
12 | int def_prog_mode(void); | ||
13 | int def_shell_mode(void); | ||
14 | int reset_prog_mode(void); | ||
15 | int reset_shell_mode(void); | ||
16 | int resetty(void); | ||
17 | int savetty(void); | ||
18 | int ripoffline(int line, int (*init)(WINDOW *, int)); | ||
19 | int curs_set(int visibility); | ||
20 | int napms(int ms); | ||
21 | |||
22 | int draino(int ms); | ||
23 | int resetterm(void); | ||
24 | int fixterm(void); | ||
25 | int saveterm(void); | ||
26 | |||
27 | Description: | ||
28 | def_prog_mode() and def_shell_mode() save the current terminal | ||
29 | modes as the "program" (in curses) or "shell" (not in curses) | ||
30 | state for use by the reset_prog_mode() and reset_shell_mode() | ||
31 | functions. This is done automatically by initscr(). | ||
32 | |||
33 | reset_prog_mode() and reset_shell_mode() restore the terminal to | ||
34 | "program" (in curses) or "shell" (not in curses) state. These | ||
35 | are done automatically by endwin() and doupdate() after an | ||
36 | endwin(), so they would normally not be called before these | ||
37 | functions. | ||
38 | |||
39 | savetty() and resetty() save and restore the state of the | ||
40 | terminal modes. savetty() saves the current state in a buffer, | ||
41 | and resetty() restores the state to what it was at the last call | ||
42 | to savetty(). | ||
43 | |||
44 | curs_set() alters the appearance of the cursor. A visibility of | ||
45 | 0 makes it disappear; 1 makes it appear "normal" (usually an | ||
46 | underline) and 2 makes it "highly visible" (usually a block). | ||
47 | |||
48 | ripoffline() reduces the size of stdscr by one line. If the | ||
49 | "line" parameter is positive, the line is removed from the top | ||
50 | of the screen; if negative, from the bottom. Up to 5 lines can | ||
51 | be ripped off stdscr by calling ripoffline() repeatedly. The | ||
52 | function argument, init, is called from within initscr() or | ||
53 | newterm(), so ripoffline() must be called before either of these | ||
54 | functions. The init function receives a pointer to a one-line | ||
55 | WINDOW, and the width of the window. Calling ripoffline() with a | ||
56 | NULL init function pointer is an error. | ||
57 | |||
58 | napms() suspends the program for the specified number of | ||
59 | milliseconds. draino() is an archaic equivalent. | ||
60 | |||
61 | resetterm(), fixterm() and saveterm() are archaic equivalents | ||
62 | for reset_shell_mode(), reset_prog_mode() and def_prog_mode(), | ||
63 | respectively. | ||
64 | |||
65 | Return Value: | ||
66 | All functions return OK on success and ERR on error, except | ||
67 | curs_set(), which returns the previous visibility. | ||
68 | |||
69 | Portability X/Open BSD SYS V | ||
70 | def_prog_mode Y Y Y | ||
71 | def_shell_mode Y Y Y | ||
72 | reset_prog_mode Y Y Y | ||
73 | reset_shell_mode Y Y Y | ||
74 | resetty Y Y Y | ||
75 | savetty Y Y Y | ||
76 | ripoffline Y - 3.0 | ||
77 | curs_set Y - 3.0 | ||
78 | napms Y Y Y | ||
79 | draino - | ||
80 | resetterm - | ||
81 | fixterm - | ||
82 | saveterm - | ||
83 | |||
84 | **man-end****************************************************************/ | ||
85 | |||
86 | #include <string.h> | ||
87 | |||
88 | RIPPEDOFFLINE linesripped[5]; | ||
89 | char linesrippedoff = 0; | ||
90 | |||
91 | static struct cttyset | ||
92 | { | ||
93 | bool been_set; | ||
94 | SCREEN saved; | ||
95 | } ctty[3]; | ||
96 | |||
97 | enum { PDC_SH_TTY, PDC_PR_TTY, PDC_SAVE_TTY }; | ||
98 | |||
99 | static void _save_mode(int i) | ||
100 | { | ||
101 | ctty[i].been_set = TRUE; | ||
102 | |||
103 | memcpy(&(ctty[i].saved), SP, sizeof(SCREEN)); | ||
104 | |||
105 | PDC_save_screen_mode(i); | ||
106 | } | ||
107 | |||
108 | static int _restore_mode(int i) | ||
109 | { | ||
110 | if (ctty[i].been_set == TRUE) | ||
111 | { | ||
112 | memcpy(SP, &(ctty[i].saved), sizeof(SCREEN)); | ||
113 | |||
114 | if (ctty[i].saved.raw_out) | ||
115 | raw(); | ||
116 | |||
117 | PDC_restore_screen_mode(i); | ||
118 | |||
119 | if ((LINES != ctty[i].saved.lines) || | ||
120 | (COLS != ctty[i].saved.cols)) | ||
121 | resize_term(ctty[i].saved.lines, ctty[i].saved.cols); | ||
122 | |||
123 | PDC_curs_set(ctty[i].saved.visibility); | ||
124 | |||
125 | PDC_gotoyx(ctty[i].saved.cursrow, ctty[i].saved.curscol); | ||
126 | } | ||
127 | |||
128 | return ctty[i].been_set ? OK : ERR; | ||
129 | } | ||
130 | |||
131 | int def_prog_mode(void) | ||
132 | { | ||
133 | PDC_LOG(("def_prog_mode() - called\n")); | ||
134 | |||
135 | _save_mode(PDC_PR_TTY); | ||
136 | |||
137 | return OK; | ||
138 | } | ||
139 | |||
140 | int def_shell_mode(void) | ||
141 | { | ||
142 | PDC_LOG(("def_shell_mode() - called\n")); | ||
143 | |||
144 | _save_mode(PDC_SH_TTY); | ||
145 | |||
146 | return OK; | ||
147 | } | ||
148 | |||
149 | int reset_prog_mode(void) | ||
150 | { | ||
151 | PDC_LOG(("reset_prog_mode() - called\n")); | ||
152 | |||
153 | _restore_mode(PDC_PR_TTY); | ||
154 | PDC_reset_prog_mode(); | ||
155 | |||
156 | return OK; | ||
157 | } | ||
158 | |||
159 | int reset_shell_mode(void) | ||
160 | { | ||
161 | PDC_LOG(("reset_shell_mode() - called\n")); | ||
162 | |||
163 | _restore_mode(PDC_SH_TTY); | ||
164 | PDC_reset_shell_mode(); | ||
165 | |||
166 | return OK; | ||
167 | } | ||
168 | |||
169 | int resetty(void) | ||
170 | { | ||
171 | PDC_LOG(("resetty() - called\n")); | ||
172 | |||
173 | return _restore_mode(PDC_SAVE_TTY); | ||
174 | } | ||
175 | |||
176 | int savetty(void) | ||
177 | { | ||
178 | PDC_LOG(("savetty() - called\n")); | ||
179 | |||
180 | _save_mode(PDC_SAVE_TTY); | ||
181 | |||
182 | return OK; | ||
183 | } | ||
184 | |||
185 | int curs_set(int visibility) | ||
186 | { | ||
187 | int ret_vis; | ||
188 | |||
189 | PDC_LOG(("curs_set() - called: visibility=%d\n", visibility)); | ||
190 | |||
191 | if ((visibility < 0) || (visibility > 2)) | ||
192 | return ERR; | ||
193 | |||
194 | ret_vis = PDC_curs_set(visibility); | ||
195 | |||
196 | /* If the cursor is changing from invisible to visible, update | ||
197 | its position */ | ||
198 | |||
199 | if (visibility && !ret_vis) | ||
200 | PDC_gotoyx(SP->cursrow, SP->curscol); | ||
201 | |||
202 | return ret_vis; | ||
203 | } | ||
204 | |||
205 | int napms(int ms) | ||
206 | { | ||
207 | PDC_LOG(("napms() - called: ms=%d\n", ms)); | ||
208 | |||
209 | if (ms) | ||
210 | PDC_napms(ms); | ||
211 | |||
212 | return OK; | ||
213 | } | ||
214 | |||
215 | int ripoffline(int line, int (*init)(WINDOW *, int)) | ||
216 | { | ||
217 | PDC_LOG(("ripoffline() - called: line=%d\n", line)); | ||
218 | |||
219 | if (linesrippedoff < 5 && line && init) | ||
220 | { | ||
221 | linesripped[(int)linesrippedoff].line = line; | ||
222 | linesripped[(int)linesrippedoff++].init = init; | ||
223 | |||
224 | return OK; | ||
225 | } | ||
226 | |||
227 | return ERR; | ||
228 | } | ||
229 | |||
230 | int draino(int ms) | ||
231 | { | ||
232 | PDC_LOG(("draino() - called\n")); | ||
233 | |||
234 | return napms(ms); | ||
235 | } | ||
236 | |||
237 | int resetterm(void) | ||
238 | { | ||
239 | PDC_LOG(("resetterm() - called\n")); | ||
240 | |||
241 | return reset_shell_mode(); | ||
242 | } | ||
243 | |||
244 | int fixterm(void) | ||
245 | { | ||
246 | PDC_LOG(("fixterm() - called\n")); | ||
247 | |||
248 | return reset_prog_mode(); | ||
249 | } | ||
250 | |||
251 | int saveterm(void) | ||
252 | { | ||
253 | PDC_LOG(("saveterm() - called\n")); | ||
254 | |||
255 | return def_prog_mode(); | ||
256 | } |
File pdcurses/keyname.c added (mode: 100644) (index 00000000..6d02cef8) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: keyname.c,v 1.8 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: keyname | ||
10 | |||
11 | Synopsis: | ||
12 | char *keyname(int key); | ||
13 | |||
14 | char *key_name(wchar_t c); | ||
15 | |||
16 | bool has_key(int key); | ||
17 | |||
18 | Description: | ||
19 | keyname() returns a string corresponding to the argument key. | ||
20 | key may be any key returned by wgetch(). | ||
21 | |||
22 | key_name() is the wide-character version. It takes a wchar_t | ||
23 | parameter, but still returns a char *. | ||
24 | |||
25 | has_key() returns TRUE for recognized keys, FALSE otherwise. | ||
26 | This function is an ncurses extension. | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | keyname Y - 3.0 | ||
30 | key_name Y | ||
31 | has_key - - - | ||
32 | |||
33 | **man-end****************************************************************/ | ||
34 | |||
35 | char *keyname(int key) | ||
36 | { | ||
37 | /* Key names must be in exactly the same order as in curses.h */ | ||
38 | |||
39 | static char *key_name[] = | ||
40 | { | ||
41 | "KEY_BREAK", "KEY_DOWN", "KEY_UP", "KEY_LEFT", "KEY_RIGHT", | ||
42 | "KEY_HOME", "KEY_BACKSPACE", "KEY_F0", "KEY_F(1)", "KEY_F(2)", | ||
43 | "KEY_F(3)", "KEY_F(4)", "KEY_F(5)", "KEY_F(6)", "KEY_F(7)", | ||
44 | "KEY_F(8)", "KEY_F(9)", "KEY_F(10)", "KEY_F(11)", "KEY_F(12)", | ||
45 | "KEY_F(13)", "KEY_F(14)", "KEY_F(15)", "KEY_F(16)", "KEY_F(17)", | ||
46 | "KEY_F(18)", "KEY_F(19)", "KEY_F(20)", "KEY_F(21)", "KEY_F(22)", | ||
47 | "KEY_F(23)", "KEY_F(24)", "KEY_F(25)", "KEY_F(26)", "KEY_F(27)", | ||
48 | "KEY_F(28)", "KEY_F(29)", "KEY_F(30)", "KEY_F(31)", "KEY_F(32)", | ||
49 | "KEY_F(33)", "KEY_F(34)", "KEY_F(35)", "KEY_F(36)", "KEY_F(37)", | ||
50 | "KEY_F(38)", "KEY_F(39)", "KEY_F(40)", "KEY_F(41)", "KEY_F(42)", | ||
51 | "KEY_F(43)", "KEY_F(44)", "KEY_F(45)", "KEY_F(46)", "KEY_F(47)", | ||
52 | "KEY_F(48)", "KEY_F(49)", "KEY_F(50)", "KEY_F(51)", "KEY_F(52)", | ||
53 | "KEY_F(53)", "KEY_F(54)", "KEY_F(55)", "KEY_F(56)", "KEY_F(57)", | ||
54 | "KEY_F(58)", "KEY_F(59)", "KEY_F(60)", "KEY_F(61)", "KEY_F(62)", | ||
55 | "KEY_F(63)", "KEY_DL", "KEY_IL", "KEY_DC", "KEY_IC", "KEY_EIC", | ||
56 | "KEY_CLEAR", "KEY_EOS", "KEY_EOL", "KEY_SF", "KEY_SR", | ||
57 | "KEY_NPAGE", "KEY_PPAGE", "KEY_STAB", "KEY_CTAB", "KEY_CATAB", | ||
58 | "KEY_ENTER", "KEY_SRESET", "KEY_RESET", "KEY_PRINT", "KEY_LL", | ||
59 | "KEY_ABORT", "KEY_SHELP", "KEY_LHELP", "KEY_BTAB", "KEY_BEG", | ||
60 | "KEY_CANCEL", "KEY_CLOSE", "KEY_COMMAND", "KEY_COPY", | ||
61 | "KEY_CREATE", "KEY_END", "KEY_EXIT", "KEY_FIND", "KEY_HELP", | ||
62 | "KEY_MARK", "KEY_MESSAGE", "KEY_MOVE", "KEY_NEXT", "KEY_OPEN", | ||
63 | "KEY_OPTIONS", "KEY_PREVIOUS", "KEY_REDO", "KEY_REFERENCE", | ||
64 | "KEY_REFRESH", "KEY_REPLACE", "KEY_RESTART", "KEY_RESUME", | ||
65 | "KEY_SAVE", "KEY_SBEG", "KEY_SCANCEL", "KEY_SCOMMAND", | ||
66 | "KEY_SCOPY", "KEY_SCREATE", "KEY_SDC", "KEY_SDL", "KEY_SELECT", | ||
67 | "KEY_SEND", "KEY_SEOL", "KEY_SEXIT", "KEY_SFIND", "KEY_SHOME", | ||
68 | "KEY_SIC", "UNKNOWN KEY", "KEY_SLEFT", "KEY_SMESSAGE", | ||
69 | "KEY_SMOVE", "KEY_SNEXT", "KEY_SOPTIONS", "KEY_SPREVIOUS", | ||
70 | "KEY_SPRINT", "KEY_SREDO", "KEY_SREPLACE", "KEY_SRIGHT", | ||
71 | "KEY_SRSUME", "KEY_SSAVE", "KEY_SSUSPEND", "KEY_SUNDO", | ||
72 | "KEY_SUSPEND", "KEY_UNDO", "ALT_0", "ALT_1", "ALT_2", "ALT_3", | ||
73 | "ALT_4", "ALT_5", "ALT_6", "ALT_7", "ALT_8", "ALT_9", "ALT_A", | ||
74 | "ALT_B", "ALT_C", "ALT_D", "ALT_E", "ALT_F", "ALT_G", "ALT_H", | ||
75 | "ALT_I", "ALT_J", "ALT_K", "ALT_L", "ALT_M", "ALT_N", "ALT_O", | ||
76 | "ALT_P", "ALT_Q", "ALT_R", "ALT_S", "ALT_T", "ALT_U", "ALT_V", | ||
77 | "ALT_W", "ALT_X", "ALT_Y", "ALT_Z", "CTL_LEFT", "CTL_RIGHT", | ||
78 | "CTL_PGUP", "CTL_PGDN", "CTL_HOME", "CTL_END", "KEY_A1", | ||
79 | "KEY_A2", "KEY_A3", "KEY_B1", "KEY_B2", "KEY_B3", "KEY_C1", | ||
80 | "KEY_C2", "KEY_C3", "PADSLASH", "PADENTER", "CTL_PADENTER", | ||
81 | "ALT_PADENTER", "PADSTOP", "PADSTAR", "PADMINUS", "PADPLUS", | ||
82 | "CTL_PADSTOP", "CTL_PADCENTER", "CTL_PADPLUS", "CTL_PADMINUS", | ||
83 | "CTL_PADSLASH", "CTL_PADSTAR", "ALT_PADPLUS", "ALT_PADMINUS", | ||
84 | "ALT_PADSLASH", "ALT_PADSTAR", "ALT_PADSTOP", "CTL_INS", | ||
85 | "ALT_DEL", "ALT_INS", "CTL_UP", "CTL_DOWN", "CTL_TAB", | ||
86 | "ALT_TAB", "ALT_MINUS", "ALT_EQUAL", "ALT_HOME", "ALT_PGUP", | ||
87 | "ALT_PGDN", "ALT_END", "ALT_UP", "ALT_DOWN", "ALT_RIGHT", | ||
88 | "ALT_LEFT", "ALT_ENTER", "ALT_ESC", "ALT_BQUOTE", | ||
89 | "ALT_LBRACKET", "ALT_RBRACKET", "ALT_SEMICOLON", "ALT_FQUOTE", | ||
90 | "ALT_COMMA", "ALT_STOP", "ALT_FSLASH", "ALT_BKSP", "CTL_BKSP", | ||
91 | "PAD0", "CTL_PAD0", "CTL_PAD1", "CTL_PAD2", "CTL_PAD3", | ||
92 | "CTL_PAD4", "CTL_PAD5", "CTL_PAD6", "CTL_PAD7","CTL_PAD8", | ||
93 | "CTL_PAD9", "ALT_PAD0", "ALT_PAD1", "ALT_PAD2", "ALT_PAD3", | ||
94 | "ALT_PAD4", "ALT_PAD5", "ALT_PAD6", "ALT_PAD7", "ALT_PAD8", | ||
95 | "ALT_PAD9", "CTL_DEL", "ALT_BSLASH", "CTL_ENTER", | ||
96 | "SHF_PADENTER", "SHF_PADSLASH", "SHF_PADSTAR", "SHF_PADPLUS", | ||
97 | "SHF_PADMINUS", "SHF_UP", "SHF_DOWN", "SHF_IC", "SHF_DC", | ||
98 | "KEY_MOUSE", "KEY_SHIFT_L", "KEY_SHIFT_R", "KEY_CONTROL_L", | ||
99 | "KEY_CONTROL_R", "KEY_ALT_L", "KEY_ALT_R", "KEY_RESIZE", | ||
100 | "KEY_SUP", "KEY_SDOWN" | ||
101 | }; | ||
102 | |||
103 | PDC_LOG(("keyname() - called: key %d\n", key)); | ||
104 | |||
105 | if ((key >= 0) && (key < 0x80)) | ||
106 | return unctrl((chtype)key); | ||
107 | |||
108 | return has_key(key) ? key_name[key - KEY_MIN] : "UNKNOWN KEY"; | ||
109 | } | ||
110 | |||
111 | bool has_key(int key) | ||
112 | { | ||
113 | PDC_LOG(("has_key() - called: key %d\n", key)); | ||
114 | |||
115 | return (key >= KEY_MIN && key <= KEY_MAX); | ||
116 | } | ||
117 | |||
118 | #ifdef PDC_WIDE | ||
119 | char *key_name(wchar_t c) | ||
120 | { | ||
121 | PDC_LOG(("key_name() - called\n")); | ||
122 | |||
123 | return keyname((int)c); | ||
124 | } | ||
125 | #endif |
File pdcurses/mouse.c added (mode: 100644) (index 00000000..1f476dd4) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: mouse.c,v 1.45 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: mouse | ||
10 | |||
11 | Synopsis: | ||
12 | int mouse_set(unsigned long mbe); | ||
13 | int mouse_on(unsigned long mbe); | ||
14 | int mouse_off(unsigned long mbe); | ||
15 | int request_mouse_pos(void); | ||
16 | int map_button(unsigned long button); | ||
17 | void wmouse_position(WINDOW *win, int *y, int *x); | ||
18 | unsigned long getmouse(void); | ||
19 | unsigned long getbmap(void); | ||
20 | |||
21 | int mouseinterval(int wait); | ||
22 | bool wenclose(const WINDOW *win, int y, int x); | ||
23 | bool wmouse_trafo(const WINDOW *win, int *y, int *x, bool to_screen); | ||
24 | bool mouse_trafo(int *y, int *x, bool to_screen); | ||
25 | mmask_t mousemask(mmask_t mask, mmask_t *oldmask); | ||
26 | int nc_getmouse(MEVENT *event); | ||
27 | int ungetmouse(MEVENT *event); | ||
28 | |||
29 | Description: | ||
30 | As of PDCurses 3.0, there are two separate mouse interfaces: the | ||
31 | classic interface, which is based on the undocumented Sys V | ||
32 | mouse functions; and an ncurses-compatible interface. Both are | ||
33 | active at all times, and you can mix and match functions from | ||
34 | each, though it's not recommended. The ncurses interface is | ||
35 | essentially an emulation layer built on top of the classic | ||
36 | interface; it's here to allow easier porting of ncurses apps. | ||
37 | |||
38 | The classic interface: mouse_set(), mouse_on(), mouse_off(), | ||
39 | request_mouse_pos(), map_button(), wmouse_position(), | ||
40 | getmouse(), and getbmap(). An application using this interface | ||
41 | would start by calling mouse_set() or mouse_on() with a non-zero | ||
42 | value, often ALL_MOUSE_EVENTS. Then it would check for a | ||
43 | KEY_MOUSE return from getch(). If found, it would call | ||
44 | request_mouse_pos() to get the current mouse status. | ||
45 | |||
46 | mouse_set(), mouse_on() and mouse_off() are analagous to | ||
47 | attrset(), attron() and attroff(). These functions set the | ||
48 | mouse button events to trap. The button masks used in these | ||
49 | functions are defined in curses.h and can be or'ed together. | ||
50 | They are the group of masks starting with BUTTON1_RELEASED. | ||
51 | |||
52 | request_mouse_pos() requests curses to fill in the Mouse_status | ||
53 | structure with the current state of the mouse. | ||
54 | |||
55 | map_button() enables the specified mouse action to activate the | ||
56 | Soft Label Keys if the action occurs over the area of the screen | ||
57 | where the Soft Label Keys are displayed. The mouse actions are | ||
58 | defined in curses.h in the group that starts with BUTTON_RELEASED. | ||
59 | |||
60 | wmouse_position() determines if the current mouse position is | ||
61 | within the window passed as an argument. If the mouse is | ||
62 | outside the current window, -1 is returned in the y and x | ||
63 | arguments; otherwise the y and x coordinates of the mouse | ||
64 | (relative to the top left corner of the window) are returned in | ||
65 | y and x. | ||
66 | |||
67 | getmouse() returns the current status of the trapped mouse | ||
68 | buttons as set by mouse_set() or mouse_on(). | ||
69 | |||
70 | getbmap() returns the current status of the button action used | ||
71 | to map a mouse action to the Soft Label Keys as set by the | ||
72 | map_button() function. | ||
73 | |||
74 | The ncurses interface: mouseinterval(), wenclose(), | ||
75 | wmouse_trafo(), mouse_trafo(), mousemask(), nc_getmouse(), and | ||
76 | ungetmouse(). A typical application using this interface would | ||
77 | start by calling mousemask() with a non-zero value, often | ||
78 | ALL_MOUSE_EVENTS. Then it would check for a KEY_MOUSE return | ||
79 | from getch(). If found, it would call nc_getmouse() to get the | ||
80 | current mouse status. | ||
81 | |||
82 | mouseinterval() sets the timeout for a mouse click. On all | ||
83 | current platforms, PDCurses receives mouse button press and | ||
84 | release events, but must synthesize click events. It does this | ||
85 | by checking whether a release event is queued up after a press | ||
86 | event. If it gets a press event, and there are no more events | ||
87 | waiting, it will wait for the timeout interval, then check again | ||
88 | for a release. A press followed by a release is reported as | ||
89 | BUTTON_CLICKED; otherwise it's passed through as BUTTON_PRESSED. | ||
90 | The default timeout is 150ms; valid values are 0 (no clicks | ||
91 | reported) through 1000ms. In x11, the timeout can also be set | ||
92 | via the clickPeriod resource. The return value from | ||
93 | mouseinterval() is the old timeout. To check the old value | ||
94 | without setting a new one, call it with a parameter of -1. Note | ||
95 | that although there's no classic equivalent for this function | ||
96 | (apart from the clickPeriod resource), the value set applies in | ||
97 | both interfaces. | ||
98 | |||
99 | wenclose() reports whether the given screen-relative y, x | ||
100 | coordinates fall within the given window. | ||
101 | |||
102 | wmouse_trafo() converts between screen-relative and window- | ||
103 | relative coordinates. A to_screen parameter of TRUE means to | ||
104 | convert from window to screen; otherwise the reverse. The | ||
105 | function returns FALSE if the coordinates aren't within the | ||
106 | window, or if any of the parameters are NULL. The coordinates | ||
107 | have been converted when the function returns TRUE. | ||
108 | |||
109 | mouse_trafo() is the stdscr version of wmouse_trafo(). | ||
110 | |||
111 | mousemask() is nearly equivalent to mouse_set(), but instead of | ||
112 | OK/ERR, it returns the value of the mask after setting it. (This | ||
113 | isn't necessarily the same value passed in, since the mask could | ||
114 | be altered on some platforms.) And if the second parameter is a | ||
115 | non-null pointer, mousemask() stores the previous mask value | ||
116 | there. Also, since the ncurses interface doesn't work with | ||
117 | PDCurses' BUTTON_MOVED events, mousemask() filters them out. | ||
118 | |||
119 | nc_getmouse() returns the current mouse status in an MEVENT | ||
120 | struct. This is equivalent to ncurses' getmouse(), renamed to | ||
121 | avoid conflict with PDCurses' getmouse(). But if you define | ||
122 | NCURSES_MOUSE_VERSION (preferably as 2) before including | ||
123 | curses.h, it defines getmouse() to nc_getmouse(), along with a | ||
124 | few other redefintions needed for compatibility with ncurses | ||
125 | code. nc_getmouse() calls request_mouse_pos(), which (not | ||
126 | getmouse()) is the classic equivalent. | ||
127 | |||
128 | ungetmouse() is the mouse equivalent of ungetch(). However, | ||
129 | PDCurses doesn't maintain a queue of mouse events; only one can | ||
130 | be pushed back, and it can overwrite or be overwritten by real | ||
131 | mouse events. | ||
132 | |||
133 | Portability X/Open BSD SYS V | ||
134 | mouse_set - - 4.0 | ||
135 | mouse_on - - 4.0 | ||
136 | mouse_off - - 4.0 | ||
137 | request_mouse_pos - - 4.0 | ||
138 | map_button - - 4.0 | ||
139 | wmouse_position - - 4.0 | ||
140 | getmouse - - 4.0 | ||
141 | getbmap - - 4.0 | ||
142 | mouseinterval - - - | ||
143 | wenclose - - - | ||
144 | wmouse_trafo - - - | ||
145 | mouse_trafo - - - | ||
146 | mousemask - - - | ||
147 | nc_getmouse - - - | ||
148 | ungetmouse - - - | ||
149 | |||
150 | **man-end****************************************************************/ | ||
151 | |||
152 | #include <string.h> | ||
153 | |||
154 | static bool ungot = FALSE; | ||
155 | |||
156 | int mouse_set(unsigned long mbe) | ||
157 | { | ||
158 | PDC_LOG(("mouse_set() - called: event %x\n", mbe)); | ||
159 | |||
160 | SP->_trap_mbe = mbe; | ||
161 | return PDC_mouse_set(); | ||
162 | } | ||
163 | |||
164 | int mouse_on(unsigned long mbe) | ||
165 | { | ||
166 | PDC_LOG(("mouse_on() - called: event %x\n", mbe)); | ||
167 | |||
168 | SP->_trap_mbe |= mbe; | ||
169 | return PDC_mouse_set(); | ||
170 | } | ||
171 | |||
172 | int mouse_off(unsigned long mbe) | ||
173 | { | ||
174 | PDC_LOG(("mouse_off() - called: event %x\n", mbe)); | ||
175 | |||
176 | SP->_trap_mbe &= ~mbe; | ||
177 | return PDC_mouse_set(); | ||
178 | } | ||
179 | |||
180 | int map_button(unsigned long button) | ||
181 | { | ||
182 | PDC_LOG(("map_button() - called: button %x\n", button)); | ||
183 | |||
184 | /****************** this does nothing at the moment ***************/ | ||
185 | SP->_map_mbe_to_key = button; | ||
186 | |||
187 | return OK; | ||
188 | } | ||
189 | |||
190 | int request_mouse_pos(void) | ||
191 | { | ||
192 | PDC_LOG(("request_mouse_pos() - called\n")); | ||
193 | |||
194 | Mouse_status = pdc_mouse_status; | ||
195 | |||
196 | return OK; | ||
197 | } | ||
198 | |||
199 | void wmouse_position(WINDOW *win, int *y, int *x) | ||
200 | { | ||
201 | PDC_LOG(("wmouse_position() - called\n")); | ||
202 | |||
203 | if (win && wenclose(win, MOUSE_Y_POS, MOUSE_X_POS)) | ||
204 | { | ||
205 | if (y) | ||
206 | *y = MOUSE_Y_POS - win->_begy; | ||
207 | if (x) | ||
208 | *x = MOUSE_X_POS - win->_begx; | ||
209 | } | ||
210 | else | ||
211 | { | ||
212 | if (y) | ||
213 | *y = -1; | ||
214 | if (x) | ||
215 | *x = -1; | ||
216 | } | ||
217 | } | ||
218 | |||
219 | unsigned long getmouse(void) | ||
220 | { | ||
221 | PDC_LOG(("getmouse() - called\n")); | ||
222 | |||
223 | return SP->_trap_mbe; | ||
224 | } | ||
225 | |||
226 | unsigned long getbmap(void) | ||
227 | { | ||
228 | PDC_LOG(("getbmap() - called\n")); | ||
229 | |||
230 | return SP->_map_mbe_to_key; | ||
231 | } | ||
232 | |||
233 | /* ncurses mouse interface */ | ||
234 | |||
235 | int mouseinterval(int wait) | ||
236 | { | ||
237 | int old_wait; | ||
238 | |||
239 | PDC_LOG(("mouseinterval() - called: %d\n", wait)); | ||
240 | |||
241 | old_wait = SP->mouse_wait; | ||
242 | |||
243 | if (wait >= 0 && wait <= 1000) | ||
244 | SP->mouse_wait = wait; | ||
245 | |||
246 | return old_wait; | ||
247 | } | ||
248 | |||
249 | bool wenclose(const WINDOW *win, int y, int x) | ||
250 | { | ||
251 | PDC_LOG(("wenclose() - called: %p %d %d\n", win, y, x)); | ||
252 | |||
253 | return (win && y >= win->_begy && y < win->_begy + win->_maxy | ||
254 | && x >= win->_begx && x < win->_begx + win->_maxx); | ||
255 | } | ||
256 | |||
257 | bool wmouse_trafo(const WINDOW *win, int *y, int *x, bool to_screen) | ||
258 | { | ||
259 | int newy, newx; | ||
260 | |||
261 | PDC_LOG(("wmouse_trafo() - called\n")); | ||
262 | |||
263 | if (!win || !y || !x) | ||
264 | return FALSE; | ||
265 | |||
266 | newy = *y; | ||
267 | newx = *x; | ||
268 | |||
269 | if (to_screen) | ||
270 | { | ||
271 | newy += win->_begy; | ||
272 | newx += win->_begx; | ||
273 | |||
274 | if (!wenclose(win, newy, newx)) | ||
275 | return FALSE; | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | if (wenclose(win, newy, newx)) | ||
280 | { | ||
281 | newy -= win->_begy; | ||
282 | newx -= win->_begx; | ||
283 | } | ||
284 | else | ||
285 | return FALSE; | ||
286 | } | ||
287 | |||
288 | *y = newy; | ||
289 | *x = newx; | ||
290 | |||
291 | return TRUE; | ||
292 | } | ||
293 | |||
294 | bool mouse_trafo(int *y, int *x, bool to_screen) | ||
295 | { | ||
296 | PDC_LOG(("mouse_trafo() - called\n")); | ||
297 | |||
298 | return wmouse_trafo(stdscr, y, x, to_screen); | ||
299 | } | ||
300 | |||
301 | mmask_t mousemask(mmask_t mask, mmask_t *oldmask) | ||
302 | { | ||
303 | PDC_LOG(("mousemask() - called\n")); | ||
304 | |||
305 | if (oldmask) | ||
306 | *oldmask = SP->_trap_mbe; | ||
307 | |||
308 | /* The ncurses interface doesn't work with our move events, so | ||
309 | filter them here */ | ||
310 | |||
311 | mask &= ~(BUTTON1_MOVED | BUTTON2_MOVED | BUTTON3_MOVED); | ||
312 | |||
313 | mouse_set(mask); | ||
314 | |||
315 | return SP->_trap_mbe; | ||
316 | } | ||
317 | |||
318 | int nc_getmouse(MEVENT *event) | ||
319 | { | ||
320 | int i; | ||
321 | mmask_t bstate = 0; | ||
322 | |||
323 | PDC_LOG(("nc_getmouse() - called\n")); | ||
324 | |||
325 | if (!event) | ||
326 | return ERR; | ||
327 | |||
328 | ungot = FALSE; | ||
329 | |||
330 | request_mouse_pos(); | ||
331 | |||
332 | event->id = 0; | ||
333 | |||
334 | event->x = Mouse_status.x; | ||
335 | event->y = Mouse_status.y; | ||
336 | event->z = 0; | ||
337 | |||
338 | for (i = 0; i < 3; i++) | ||
339 | { | ||
340 | if (Mouse_status.changes & (1 << i)) | ||
341 | { | ||
342 | int shf = i * 5; | ||
343 | short button = Mouse_status.button[i] & BUTTON_ACTION_MASK; | ||
344 | |||
345 | if (button == BUTTON_RELEASED) | ||
346 | bstate |= (BUTTON1_RELEASED << shf); | ||
347 | else if (button == BUTTON_PRESSED) | ||
348 | bstate |= (BUTTON1_PRESSED << shf); | ||
349 | else if (button == BUTTON_CLICKED) | ||
350 | bstate |= (BUTTON1_CLICKED << shf); | ||
351 | else if (button == BUTTON_DOUBLE_CLICKED) | ||
352 | bstate |= (BUTTON1_DOUBLE_CLICKED << shf); | ||
353 | |||
354 | button = Mouse_status.button[i] & BUTTON_MODIFIER_MASK; | ||
355 | |||
356 | if (button & PDC_BUTTON_SHIFT) | ||
357 | bstate |= BUTTON_MODIFIER_SHIFT; | ||
358 | if (button & PDC_BUTTON_CONTROL) | ||
359 | bstate |= BUTTON_MODIFIER_CONTROL; | ||
360 | if (button & PDC_BUTTON_ALT) | ||
361 | bstate |= BUTTON_MODIFIER_ALT; | ||
362 | } | ||
363 | } | ||
364 | |||
365 | if (MOUSE_WHEEL_UP) | ||
366 | bstate |= BUTTON4_PRESSED; | ||
367 | else if (MOUSE_WHEEL_DOWN) | ||
368 | bstate |= BUTTON5_PRESSED; | ||
369 | |||
370 | /* extra filter pass -- mainly for button modifiers */ | ||
371 | |||
372 | event->bstate = bstate & SP->_trap_mbe; | ||
373 | |||
374 | return OK; | ||
375 | } | ||
376 | |||
377 | int ungetmouse(MEVENT *event) | ||
378 | { | ||
379 | int i; | ||
380 | unsigned long bstate; | ||
381 | |||
382 | PDC_LOG(("ungetmouse() - called\n")); | ||
383 | |||
384 | if (!event || ungot) | ||
385 | return ERR; | ||
386 | |||
387 | ungot = TRUE; | ||
388 | |||
389 | pdc_mouse_status.x = event->x; | ||
390 | pdc_mouse_status.y = event->y; | ||
391 | |||
392 | pdc_mouse_status.changes = 0; | ||
393 | bstate = event->bstate; | ||
394 | |||
395 | for (i = 0; i < 3; i++) | ||
396 | { | ||
397 | int shf = i * 5; | ||
398 | short button = 0; | ||
399 | |||
400 | if (bstate & ((BUTTON1_RELEASED | BUTTON1_PRESSED | | ||
401 | BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED) << shf)) | ||
402 | { | ||
403 | pdc_mouse_status.changes |= 1 << i; | ||
404 | |||
405 | if (bstate & (BUTTON1_PRESSED << shf)) | ||
406 | button = BUTTON_PRESSED; | ||
407 | if (bstate & (BUTTON1_CLICKED << shf)) | ||
408 | button = BUTTON_CLICKED; | ||
409 | if (bstate & (BUTTON1_DOUBLE_CLICKED << shf)) | ||
410 | button = BUTTON_DOUBLE_CLICKED; | ||
411 | |||
412 | if (bstate & BUTTON_MODIFIER_SHIFT) | ||
413 | button |= PDC_BUTTON_SHIFT; | ||
414 | if (bstate & BUTTON_MODIFIER_CONTROL) | ||
415 | button |= PDC_BUTTON_CONTROL; | ||
416 | if (bstate & BUTTON_MODIFIER_ALT) | ||
417 | button |= PDC_BUTTON_ALT; | ||
418 | } | ||
419 | |||
420 | pdc_mouse_status.button[i] = button; | ||
421 | } | ||
422 | |||
423 | if (bstate & BUTTON4_PRESSED) | ||
424 | pdc_mouse_status.changes |= PDC_MOUSE_WHEEL_UP; | ||
425 | else if (bstate & BUTTON5_PRESSED) | ||
426 | pdc_mouse_status.changes |= PDC_MOUSE_WHEEL_DOWN; | ||
427 | |||
428 | return ungetch(KEY_MOUSE); | ||
429 | } |
File pdcurses/move.c added (mode: 100644) (index 00000000..30e59084) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: move.c,v 1.28 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: move | ||
10 | |||
11 | Synopsis: | ||
12 | int move(int y, int x); | ||
13 | int wmove(WINDOW *win, int y, int x); | ||
14 | |||
15 | Description: | ||
16 | The cursor associated with the window is moved to the given | ||
17 | location. This does not move the physical cursor of the | ||
18 | terminal until refresh() is called. The position specified is | ||
19 | relative to the upper left corner of the window, which is (0,0). | ||
20 | |||
21 | Return Value: | ||
22 | All functions return OK on success and ERR on error. | ||
23 | |||
24 | Portability X/Open BSD SYS V | ||
25 | move Y Y Y | ||
26 | wmove Y Y Y | ||
27 | |||
28 | **man-end****************************************************************/ | ||
29 | |||
30 | int move(int y, int x) | ||
31 | { | ||
32 | PDC_LOG(("move() - called: y=%d x=%d\n", y, x)); | ||
33 | |||
34 | if (!stdscr || x < 0 || y < 0 || x >= stdscr->_maxx || y >= stdscr->_maxy) | ||
35 | return ERR; | ||
36 | |||
37 | stdscr->_curx = x; | ||
38 | stdscr->_cury = y; | ||
39 | |||
40 | return OK; | ||
41 | } | ||
42 | |||
43 | int wmove(WINDOW *win, int y, int x) | ||
44 | { | ||
45 | PDC_LOG(("wmove() - called: y=%d x=%d\n", y, x)); | ||
46 | |||
47 | if (!win || x < 0 || y < 0 || x >= win->_maxx || y >= win->_maxy) | ||
48 | return ERR; | ||
49 | |||
50 | win->_curx = x; | ||
51 | win->_cury = y; | ||
52 | |||
53 | return OK; | ||
54 | } |
File pdcurses/outopts.c added (mode: 100644) (index 00000000..0a8fd2d5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: outopts.c,v 1.39 2008/07/14 12:22:13 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: outopts | ||
10 | |||
11 | Synopsis: | ||
12 | int clearok(WINDOW *win, bool bf); | ||
13 | int idlok(WINDOW *win, bool bf); | ||
14 | void idcok(WINDOW *win, bool bf); | ||
15 | void immedok(WINDOW *win, bool bf); | ||
16 | int leaveok(WINDOW *win, bool bf); | ||
17 | int setscrreg(int top, int bot); | ||
18 | int wsetscrreg(WINDOW *win, int top, int bot); | ||
19 | int scrollok(WINDOW *win, bool bf); | ||
20 | |||
21 | int raw_output(bool bf); | ||
22 | |||
23 | Description: | ||
24 | With clearok(), if bf is TRUE, the next call to wrefresh() with | ||
25 | this window will clear the screen completely and redraw the | ||
26 | entire screen. | ||
27 | |||
28 | immedok(), called with a second argument of TRUE, causes an | ||
29 | automatic wrefresh() every time a change is made to the | ||
30 | specified window. | ||
31 | |||
32 | Normally, the hardware cursor is left at the location of the | ||
33 | window being refreshed. leaveok() allows the cursor to be | ||
34 | left wherever the update happens to leave it. It's useful | ||
35 | for applications where the cursor is not used, since it reduces | ||
36 | the need for cursor motions. If possible, the cursor is made | ||
37 | invisible when this option is enabled. | ||
38 | |||
39 | wsetscrreg() sets a scrolling region in a window; "top" and | ||
40 | "bot" are the line numbers for the top and bottom margins. If | ||
41 | this option and scrollok() are enabled, any attempt to move off | ||
42 | the bottom margin will cause all lines in the scrolling region | ||
43 | to scroll up one line. setscrreg() is the stdscr version. | ||
44 | |||
45 | idlok() and idcok() do nothing in PDCurses, but are provided for | ||
46 | compatibility with other curses implementations. | ||
47 | |||
48 | raw_output() enables the output of raw characters using the | ||
49 | standard *add* and *ins* curses functions (that is, it disables | ||
50 | translation of control characters). | ||
51 | |||
52 | Return Value: | ||
53 | All functions return OK on success and ERR on error. | ||
54 | |||
55 | Portability X/Open BSD SYS V | ||
56 | clearok Y Y Y | ||
57 | idlok Y Y Y | ||
58 | idcok Y - 4.0 | ||
59 | immedok Y - 4.0 | ||
60 | leaveok Y Y Y | ||
61 | setscrreg Y Y Y | ||
62 | wsetscrreg Y Y Y | ||
63 | scrollok Y Y Y | ||
64 | raw_output - - - | ||
65 | |||
66 | **man-end****************************************************************/ | ||
67 | |||
68 | int clearok(WINDOW *win, bool bf) | ||
69 | { | ||
70 | PDC_LOG(("clearok() - called\n")); | ||
71 | |||
72 | if (!win) | ||
73 | return ERR; | ||
74 | |||
75 | win->_clear = bf; | ||
76 | |||
77 | return OK; | ||
78 | } | ||
79 | |||
80 | int idlok(WINDOW *win, bool bf) | ||
81 | { | ||
82 | PDC_LOG(("idlok() - called\n")); | ||
83 | |||
84 | return OK; | ||
85 | } | ||
86 | |||
87 | void idcok(WINDOW *win, bool bf) | ||
88 | { | ||
89 | PDC_LOG(("idcok() - called\n")); | ||
90 | } | ||
91 | |||
92 | void immedok(WINDOW *win, bool bf) | ||
93 | { | ||
94 | PDC_LOG(("immedok() - called\n")); | ||
95 | |||
96 | if (win) | ||
97 | win->_immed = bf; | ||
98 | } | ||
99 | |||
100 | int leaveok(WINDOW *win, bool bf) | ||
101 | { | ||
102 | PDC_LOG(("leaveok() - called\n")); | ||
103 | |||
104 | if (!win) | ||
105 | return ERR; | ||
106 | |||
107 | win->_leaveit = bf; | ||
108 | |||
109 | curs_set(!bf); | ||
110 | |||
111 | return OK; | ||
112 | } | ||
113 | |||
114 | int setscrreg(int top, int bottom) | ||
115 | { | ||
116 | PDC_LOG(("setscrreg() - called: top %d bottom %d\n", top, bottom)); | ||
117 | |||
118 | return wsetscrreg(stdscr, top, bottom); | ||
119 | } | ||
120 | |||
121 | int wsetscrreg(WINDOW *win, int top, int bottom) | ||
122 | { | ||
123 | PDC_LOG(("wsetscrreg() - called: top %d bottom %d\n", top, bottom)); | ||
124 | |||
125 | if (win && 0 <= top && top <= win->_cury && | ||
126 | win->_cury <= bottom && bottom < win->_maxy) | ||
127 | { | ||
128 | win->_tmarg = top; | ||
129 | win->_bmarg = bottom; | ||
130 | |||
131 | return OK; | ||
132 | } | ||
133 | else | ||
134 | return ERR; | ||
135 | } | ||
136 | |||
137 | int scrollok(WINDOW *win, bool bf) | ||
138 | { | ||
139 | PDC_LOG(("scrollok() - called\n")); | ||
140 | |||
141 | if (!win) | ||
142 | return ERR; | ||
143 | |||
144 | win->_scroll = bf; | ||
145 | |||
146 | return OK; | ||
147 | } | ||
148 | |||
149 | int raw_output(bool bf) | ||
150 | { | ||
151 | PDC_LOG(("raw_output() - called\n")); | ||
152 | |||
153 | SP->raw_out = bf; | ||
154 | |||
155 | return OK; | ||
156 | } |
File pdcurses/overlay.c added (mode: 100644) (index 00000000..f9bba50f) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: overlay.c,v 1.36 2008/07/14 12:35:23 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: overlay | ||
10 | |||
11 | Synopsis: | ||
12 | int overlay(const WINDOW *src_w, WINDOW *dst_w) | ||
13 | int overwrite(const WINDOW *src_w, WINDOW *dst_w) | ||
14 | int copywin(const WINDOW *src_w, WINDOW *dst_w, int src_tr, | ||
15 | int src_tc, int dst_tr, int dst_tc, int dst_br, | ||
16 | int dst_bc, bool overlay) | ||
17 | |||
18 | Description: | ||
19 | overlay() and overwrite() copy all the text from src_w into | ||
20 | dst_w. The windows need not be the same size. Those characters | ||
21 | in the source window that intersect with the destination window | ||
22 | are copied, so that the characters appear in the same physical | ||
23 | position on the screen. The difference between the two functions | ||
24 | is that overlay() is non-destructive (blanks are not copied) | ||
25 | while overwrite() is destructive (blanks are copied). | ||
26 | |||
27 | copywin() is similar, but doesn't require that the two windows | ||
28 | overlap. The arguments src_tc and src_tr specify the top left | ||
29 | corner of the region to be copied. dst_tc, dst_tr, dst_br, and | ||
30 | dst_bc specify the region within the destination window to copy | ||
31 | to. The argument "overlay", if TRUE, indicates that the copy is | ||
32 | done non-destructively (as in overlay()); blanks in the source | ||
33 | window are not copied to the destination window. When overlay is | ||
34 | FALSE, blanks are copied. | ||
35 | |||
36 | Return Value: | ||
37 | All functions return OK on success and ERR on error. | ||
38 | |||
39 | Portability X/Open BSD SYS V | ||
40 | overlay Y Y Y | ||
41 | overwrite Y Y Y | ||
42 | copywin Y - 3.0 | ||
43 | |||
44 | **man-end****************************************************************/ | ||
45 | |||
46 | /* Thanks to Andreas Otte <venn@@uni-paderborn.de> for the | ||
47 | corrected overlay()/overwrite() behavior. */ | ||
48 | |||
49 | static int _copy_win(const WINDOW *src_w, WINDOW *dst_w, int src_tr, | ||
50 | int src_tc, int src_br, int src_bc, int dst_tr, | ||
51 | int dst_tc, bool overlay) | ||
52 | { | ||
53 | int col, line, y1, fc, *minchng, *maxchng; | ||
54 | chtype *w1ptr, *w2ptr; | ||
55 | |||
56 | int lc = 0; | ||
57 | int xdiff = src_bc - src_tc; | ||
58 | int ydiff = src_br - src_tr; | ||
59 | |||
60 | if (!src_w || !dst_w) | ||
61 | return ERR; | ||
62 | |||
63 | minchng = dst_w->_firstch; | ||
64 | maxchng = dst_w->_lastch; | ||
65 | |||
66 | for (y1 = 0; y1 < dst_tr; y1++) | ||
67 | { | ||
68 | minchng++; | ||
69 | maxchng++; | ||
70 | } | ||
71 | |||
72 | for (line = 0; line < ydiff; line++) | ||
73 | { | ||
74 | w1ptr = src_w->_y[line + src_tr] + src_tc; | ||
75 | w2ptr = dst_w->_y[line + dst_tr] + dst_tc; | ||
76 | |||
77 | fc = _NO_CHANGE; | ||
78 | |||
79 | for (col = 0; col < xdiff; col++) | ||
80 | { | ||
81 | if ((*w1ptr) != (*w2ptr) && | ||
82 | !((*w1ptr & A_CHARTEXT) == ' ' && overlay)) | ||
83 | { | ||
84 | *w2ptr = *w1ptr; | ||
85 | |||
86 | if (fc == _NO_CHANGE) | ||
87 | fc = col + dst_tc; | ||
88 | |||
89 | lc = col + dst_tc; | ||
90 | } | ||
91 | |||
92 | w1ptr++; | ||
93 | w2ptr++; | ||
94 | } | ||
95 | |||
96 | if (*minchng == _NO_CHANGE) | ||
97 | { | ||
98 | *minchng = fc; | ||
99 | *maxchng = lc; | ||
100 | } | ||
101 | else if (fc != _NO_CHANGE) | ||
102 | { | ||
103 | if (fc < *minchng) | ||
104 | *minchng = fc; | ||
105 | if (lc > *maxchng) | ||
106 | *maxchng = lc; | ||
107 | } | ||
108 | |||
109 | minchng++; | ||
110 | maxchng++; | ||
111 | } | ||
112 | |||
113 | return OK; | ||
114 | } | ||
115 | |||
116 | int overlay(const WINDOW *src_w, WINDOW *dst_w) | ||
117 | { | ||
118 | int first_line, first_col, last_line, last_col; | ||
119 | int src_start_x, src_start_y, dst_start_x, dst_start_y; | ||
120 | int xdiff, ydiff; | ||
121 | |||
122 | PDC_LOG(("overlay() - called\n")); | ||
123 | |||
124 | if (!src_w || !dst_w) | ||
125 | return ERR; | ||
126 | |||
127 | first_col = max(dst_w->_begx, src_w->_begx); | ||
128 | first_line = max(dst_w->_begy, src_w->_begy); | ||
129 | |||
130 | last_col = min(src_w->_begx + src_w->_maxx, dst_w->_begx + dst_w->_maxx); | ||
131 | last_line = min(src_w->_begy + src_w->_maxy, dst_w->_begy + dst_w->_maxy); | ||
132 | |||
133 | /* determine the overlapping region of the two windows in real | ||
134 | coordinates */ | ||
135 | |||
136 | /* if no overlapping region, do nothing */ | ||
137 | |||
138 | if ((last_col < first_col) || (last_line < first_line)) | ||
139 | return OK; | ||
140 | |||
141 | /* size of overlapping region */ | ||
142 | |||
143 | xdiff = last_col - first_col; | ||
144 | ydiff = last_line - first_line; | ||
145 | |||
146 | if (src_w->_begx <= dst_w->_begx) | ||
147 | { | ||
148 | src_start_x = dst_w->_begx - src_w->_begx; | ||
149 | dst_start_x = 0; | ||
150 | } | ||
151 | else | ||
152 | { | ||
153 | dst_start_x = src_w->_begx - dst_w->_begx; | ||
154 | src_start_x = 0; | ||
155 | } | ||
156 | |||
157 | if (src_w->_begy <= dst_w->_begy) | ||
158 | { | ||
159 | src_start_y = dst_w->_begy - src_w->_begy; | ||
160 | dst_start_y = 0; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | dst_start_y = src_w->_begy - dst_w->_begy; | ||
165 | src_start_y = 0; | ||
166 | } | ||
167 | |||
168 | return _copy_win(src_w, dst_w, src_start_y, src_start_x, | ||
169 | src_start_y + ydiff, src_start_x + xdiff, | ||
170 | dst_start_y, dst_start_x, TRUE); | ||
171 | } | ||
172 | |||
173 | int overwrite(const WINDOW *src_w, WINDOW *dst_w) | ||
174 | { | ||
175 | int first_line, first_col, last_line, last_col; | ||
176 | int src_start_x, src_start_y, dst_start_x, dst_start_y; | ||
177 | int xdiff, ydiff; | ||
178 | |||
179 | PDC_LOG(("overwrite() - called\n")); | ||
180 | |||
181 | if (!src_w || !dst_w) | ||
182 | return ERR; | ||
183 | |||
184 | first_col = max(dst_w->_begx, src_w->_begx); | ||
185 | first_line = max(dst_w->_begy, src_w->_begy); | ||
186 | |||
187 | last_col = min(src_w->_begx + src_w->_maxx, dst_w->_begx + dst_w->_maxx); | ||
188 | last_line = min(src_w->_begy + src_w->_maxy, dst_w->_begy + dst_w->_maxy); | ||
189 | |||
190 | /* determine the overlapping region of the two windows in real | ||
191 | coordinates */ | ||
192 | |||
193 | /* if no overlapping region, do nothing */ | ||
194 | |||
195 | if ((last_col < first_col) || (last_line < first_line)) | ||
196 | return OK; | ||
197 | |||
198 | /* size of overlapping region */ | ||
199 | |||
200 | xdiff = last_col - first_col; | ||
201 | ydiff = last_line - first_line; | ||
202 | |||
203 | if (src_w->_begx <= dst_w->_begx) | ||
204 | { | ||
205 | src_start_x = dst_w->_begx - src_w->_begx; | ||
206 | dst_start_x = 0; | ||
207 | } | ||
208 | else | ||
209 | { | ||
210 | dst_start_x = src_w->_begx - dst_w->_begx; | ||
211 | src_start_x = 0; | ||
212 | } | ||
213 | |||
214 | if (src_w->_begy <= dst_w->_begy) | ||
215 | { | ||
216 | src_start_y = dst_w->_begy - src_w->_begy; | ||
217 | dst_start_y = 0; | ||
218 | } | ||
219 | else | ||
220 | { | ||
221 | dst_start_y = src_w->_begy - dst_w->_begy; | ||
222 | src_start_y = 0; | ||
223 | } | ||
224 | |||
225 | return _copy_win(src_w, dst_w, src_start_y, src_start_x, | ||
226 | src_start_y + ydiff, src_start_x + xdiff, | ||
227 | dst_start_y, dst_start_x, FALSE); | ||
228 | } | ||
229 | |||
230 | int copywin(const WINDOW *src_w, WINDOW *dst_w, int src_tr, int src_tc, | ||
231 | int dst_tr, int dst_tc, int dst_br, int dst_bc, int overlay) | ||
232 | { | ||
233 | int src_end_x, src_end_y; | ||
234 | int src_rows, src_cols, dst_rows, dst_cols; | ||
235 | int min_rows, min_cols; | ||
236 | |||
237 | PDC_LOG(("copywin() - called\n")); | ||
238 | |||
239 | if (!src_w || !dst_w || dst_w == curscr || dst_br > dst_w->_maxy | ||
240 | || dst_bc > dst_w->_maxx || dst_tr < 0 || dst_tc < 0) | ||
241 | return ERR; | ||
242 | |||
243 | src_rows = src_w->_maxy - src_tr; | ||
244 | src_cols = src_w->_maxx - src_tc; | ||
245 | dst_rows = dst_br - dst_tr + 1; | ||
246 | dst_cols = dst_bc - dst_tc + 1; | ||
247 | |||
248 | min_rows = min(src_rows, dst_rows); | ||
249 | min_cols = min(src_cols, dst_cols); | ||
250 | |||
251 | src_end_y = src_tr + min_rows; | ||
252 | src_end_x = src_tc + min_cols; | ||
253 | |||
254 | return _copy_win(src_w, dst_w, src_tr, src_tc, src_end_y, src_end_x, | ||
255 | dst_tr, dst_tc, overlay); | ||
256 | } |
File pdcurses/pad.c added (mode: 100644) (index 00000000..ccc5db20) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: pad.c,v 1.50 2008/07/14 12:22:13 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pad | ||
10 | |||
11 | Synopsis: | ||
12 | WINDOW *newpad(int nlines, int ncols); | ||
13 | WINDOW *subpad(WINDOW *orig, int nlines, int ncols, | ||
14 | int begy, int begx); | ||
15 | int prefresh(WINDOW *win, int py, int px, int sy1, int sx1, | ||
16 | int sy2, int sx2); | ||
17 | int pnoutrefresh(WINDOW *w, int py, int px, int sy1, int sx1, | ||
18 | int sy2, int sx2); | ||
19 | int pechochar(WINDOW *pad, chtype ch); | ||
20 | int pecho_wchar(WINDOW *pad, const cchar_t *wch); | ||
21 | |||
22 | Description: | ||
23 | A pad is a special kind of window, which is not restricted by | ||
24 | the screen size, and is not necessarily associated with a | ||
25 | particular part of the screen. You can use a pad when you need | ||
26 | a large window, and only a part of the window will be on the | ||
27 | screen at one time. Pads are not refreshed automatically (e.g., | ||
28 | from scrolling or echoing of input). You can't call wrefresh() | ||
29 | with a pad as an argument; use prefresh() or pnoutrefresh() | ||
30 | instead. Note that these routines require additional parameters | ||
31 | to specify the part of the pad to be displayed, and the location | ||
32 | to use on the screen. | ||
33 | |||
34 | newpad() creates a new pad data structure. | ||
35 | |||
36 | subpad() creates a new sub-pad within a pad, at position (begy, | ||
37 | begx), with dimensions of nlines lines and ncols columns. This | ||
38 | position is relative to the pad, and not to the screen as with | ||
39 | subwin. Changes to either the parent pad or sub-pad will affect | ||
40 | both. When using sub-pads, you may need to call touchwin() | ||
41 | before calling prefresh(). | ||
42 | |||
43 | pnoutrefresh() copies the specified pad to the virtual screen. | ||
44 | |||
45 | prefresh() calls pnoutrefresh(), followed by doupdate(). | ||
46 | |||
47 | These routines are analogous to wnoutrefresh() and wrefresh(). | ||
48 | (py, px) specifies the upper left corner of the part of the pad | ||
49 | to be displayed; (sy1, sx1) and (sy2, sx2) describe the screen | ||
50 | rectangle that will contain the selected part of the pad. | ||
51 | |||
52 | pechochar() is functionally equivalent to addch() followed by | ||
53 | a call to prefresh(), with the last-used coordinates and | ||
54 | dimensions. pecho_wchar() is the wide-character version. | ||
55 | |||
56 | Return Value: | ||
57 | All functions return OK on success and ERR on error. | ||
58 | |||
59 | Portability X/Open BSD SYS V | ||
60 | newpad Y - Y | ||
61 | subpad Y - Y | ||
62 | prefresh Y - Y | ||
63 | pnoutrefresh Y - Y | ||
64 | pechochar Y - 3.0 | ||
65 | pecho_wchar Y | ||
66 | |||
67 | **man-end****************************************************************/ | ||
68 | |||
69 | #include <string.h> | ||
70 | |||
71 | /* save values for pechochar() */ | ||
72 | |||
73 | static int save_pminrow, save_pmincol; | ||
74 | static int save_sminrow, save_smincol, save_smaxrow, save_smaxcol; | ||
75 | |||
76 | WINDOW *newpad(int nlines, int ncols) | ||
77 | { | ||
78 | WINDOW *win; | ||
79 | |||
80 | PDC_LOG(("newpad() - called: lines=%d cols=%d\n", nlines, ncols)); | ||
81 | |||
82 | if ( !(win = PDC_makenew(nlines, ncols, -1, -1)) | ||
83 | || !(win = PDC_makelines(win)) ) | ||
84 | return (WINDOW *)NULL; | ||
85 | |||
86 | werase(win); | ||
87 | |||
88 | win->_flags = _PAD; | ||
89 | |||
90 | /* save default values in case pechochar() is the first call to | ||
91 | prefresh(). */ | ||
92 | |||
93 | save_pminrow = 0; | ||
94 | save_pmincol = 0; | ||
95 | save_sminrow = 0; | ||
96 | save_smincol = 0; | ||
97 | save_smaxrow = min(LINES, nlines) - 1; | ||
98 | save_smaxcol = min(COLS, ncols) - 1; | ||
99 | |||
100 | return win; | ||
101 | } | ||
102 | |||
103 | WINDOW *subpad(WINDOW *orig, int nlines, int ncols, int begy, int begx) | ||
104 | { | ||
105 | WINDOW *win; | ||
106 | int i; | ||
107 | int j = begy; | ||
108 | int k = begx; | ||
109 | |||
110 | PDC_LOG(("subpad() - called: lines=%d cols=%d begy=%d begx=%d\n", | ||
111 | nlines, ncols, begy, begx)); | ||
112 | |||
113 | if (!orig || !(orig->_flags & _PAD)) | ||
114 | return (WINDOW *)NULL; | ||
115 | |||
116 | /* make sure window fits inside the original one */ | ||
117 | |||
118 | if ((begy < orig->_begy) || (begx < orig->_begx) || | ||
119 | (begy + nlines) > (orig->_begy + orig->_maxy) || | ||
120 | (begx + ncols) > (orig->_begx + orig->_maxx)) | ||
121 | return (WINDOW *)NULL; | ||
122 | |||
123 | if (!nlines) | ||
124 | nlines = orig->_maxy - 1 - j; | ||
125 | |||
126 | if (!ncols) | ||
127 | ncols = orig->_maxx - 1 - k; | ||
128 | |||
129 | if ( !(win = PDC_makenew(nlines, ncols, begy, begx)) ) | ||
130 | return (WINDOW *)NULL; | ||
131 | |||
132 | /* initialize window variables */ | ||
133 | |||
134 | win->_attrs = orig->_attrs; | ||
135 | win->_leaveit = orig->_leaveit; | ||
136 | win->_scroll = orig->_scroll; | ||
137 | win->_nodelay = orig->_nodelay; | ||
138 | win->_use_keypad = orig->_use_keypad; | ||
139 | win->_parent = orig; | ||
140 | |||
141 | for (i = 0; i < nlines; i++) | ||
142 | win->_y[i] = (orig->_y[j++]) + k; | ||
143 | |||
144 | win->_flags = _SUBPAD; | ||
145 | |||
146 | /* save default values in case pechochar() is the first call | ||
147 | to prefresh(). */ | ||
148 | |||
149 | save_pminrow = 0; | ||
150 | save_pmincol = 0; | ||
151 | save_sminrow = 0; | ||
152 | save_smincol = 0; | ||
153 | save_smaxrow = min(LINES, nlines) - 1; | ||
154 | save_smaxcol = min(COLS, ncols) - 1; | ||
155 | |||
156 | return win; | ||
157 | } | ||
158 | |||
159 | int prefresh(WINDOW *win, int py, int px, int sy1, int sx1, int sy2, int sx2) | ||
160 | { | ||
161 | PDC_LOG(("prefresh() - called\n")); | ||
162 | |||
163 | if (pnoutrefresh(win, py, px, sy1, sx1, sy2, sx2) == ERR) | ||
164 | return ERR; | ||
165 | |||
166 | doupdate(); | ||
167 | return OK; | ||
168 | } | ||
169 | |||
170 | int pnoutrefresh(WINDOW *w, int py, int px, int sy1, int sx1, int sy2, int sx2) | ||
171 | { | ||
172 | int num_cols; | ||
173 | int sline = sy1; | ||
174 | int pline = py; | ||
175 | |||
176 | PDC_LOG(("pnoutrefresh() - called\n")); | ||
177 | |||
178 | if (!w || !(w->_flags & (_PAD|_SUBPAD)) || (sy2 >= LINES) || (sy2 >= COLS)) | ||
179 | return ERR; | ||
180 | |||
181 | if (py < 0) | ||
182 | py = 0; | ||
183 | if (px < 0) | ||
184 | px = 0; | ||
185 | if (sy1 < 0) | ||
186 | sy1 = 0; | ||
187 | if (sx1 < 0) | ||
188 | sx1 = 0; | ||
189 | |||
190 | if (sy2 < sy1 || sx2 < sx1) | ||
191 | return ERR; | ||
192 | |||
193 | num_cols = min((sx2 - sx1 + 1), (w->_maxx - px)); | ||
194 | |||
195 | while (sline <= sy2) | ||
196 | { | ||
197 | if (pline < w->_maxy) | ||
198 | { | ||
199 | memcpy(curscr->_y[sline] + sx1, w->_y[pline] + px, | ||
200 | num_cols * sizeof(chtype)); | ||
201 | |||
202 | if ((curscr->_firstch[sline] == _NO_CHANGE) | ||
203 | || (curscr->_firstch[sline] > sx1)) | ||
204 | curscr->_firstch[sline] = sx1; | ||
205 | |||
206 | if (sx2 > curscr->_lastch[sline]) | ||
207 | curscr->_lastch[sline] = sx2; | ||
208 | |||
209 | w->_firstch[pline] = _NO_CHANGE; /* updated now */ | ||
210 | w->_lastch[pline] = _NO_CHANGE; /* updated now */ | ||
211 | } | ||
212 | |||
213 | sline++; | ||
214 | pline++; | ||
215 | } | ||
216 | |||
217 | if (w->_clear) | ||
218 | { | ||
219 | w->_clear = FALSE; | ||
220 | curscr->_clear = TRUE; | ||
221 | } | ||
222 | |||
223 | /* position the cursor to the pad's current position if possible -- | ||
224 | is the pad current position going to end up displayed? if not, | ||
225 | then don't move the cursor; if so, move it to the correct place */ | ||
226 | |||
227 | if (!w->_leaveit && w->_cury >= py && w->_curx >= px && | ||
228 | w->_cury <= py + (sy2 - sy1) && w->_curx <= px + (sx2 - sx1)) | ||
229 | { | ||
230 | curscr->_cury = (w->_cury - py) + sy1; | ||
231 | curscr->_curx = (w->_curx - px) + sx1; | ||
232 | } | ||
233 | |||
234 | return OK; | ||
235 | } | ||
236 | |||
237 | int pechochar(WINDOW *pad, chtype ch) | ||
238 | { | ||
239 | PDC_LOG(("pechochar() - called\n")); | ||
240 | |||
241 | if (waddch(pad, ch) == ERR) | ||
242 | return ERR; | ||
243 | |||
244 | return prefresh(pad, save_pminrow, save_pmincol, save_sminrow, | ||
245 | save_smincol, save_smaxrow, save_smaxcol); | ||
246 | } | ||
247 | |||
248 | #ifdef PDC_WIDE | ||
249 | int pecho_wchar(WINDOW *pad, const cchar_t *wch) | ||
250 | { | ||
251 | PDC_LOG(("pecho_wchar() - called\n")); | ||
252 | |||
253 | if (!wch || (waddch(pad, *wch) == ERR)) | ||
254 | return ERR; | ||
255 | |||
256 | return prefresh(pad, save_pminrow, save_pmincol, save_sminrow, | ||
257 | save_smincol, save_smaxrow, save_smaxcol); | ||
258 | } | ||
259 | #endif |
File pdcurses/panel.c added (mode: 100644) (index 00000000..77028c6f) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: panel.c,v 1.8 2008/07/14 12:35:23 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: panel | ||
10 | |||
11 | Synopsis: | ||
12 | int bottom_panel(PANEL *pan); | ||
13 | int del_panel(PANEL *pan); | ||
14 | int hide_panel(PANEL *pan); | ||
15 | int move_panel(PANEL *pan, int starty, int startx); | ||
16 | PANEL *new_panel(WINDOW *win); | ||
17 | PANEL *panel_above(const PANEL *pan); | ||
18 | PANEL *panel_below(const PANEL *pan); | ||
19 | int panel_hidden(const PANEL *pan); | ||
20 | const void *panel_userptr(const PANEL *pan); | ||
21 | WINDOW *panel_window(const PANEL *pan); | ||
22 | int replace_panel(PANEL *pan, WINDOW *win); | ||
23 | int set_panel_userptr(PANEL *pan, const void *uptr); | ||
24 | int show_panel(PANEL *pan); | ||
25 | int top_panel(PANEL *pan); | ||
26 | void update_panels(void); | ||
27 | |||
28 | Description: | ||
29 | The panel library is built using the curses library, and any | ||
30 | program using panels routines must call one of the curses | ||
31 | initialization routines such as initscr(). A program using these | ||
32 | routines must be linked with the panels and curses libraries. | ||
33 | The header <panel.h> includes the header <curses.h>. | ||
34 | |||
35 | The panels package gives the applications programmer a way to | ||
36 | have depth relationships between curses windows; a curses window | ||
37 | is associated with every panel. The panels routines allow curses | ||
38 | windows to overlap without making visible the overlapped | ||
39 | portions of underlying windows. The initial curses window, | ||
40 | stdscr, lies beneath all panels. The set of currently visible | ||
41 | panels is the 'deck' of panels. | ||
42 | |||
43 | The panels package allows the applications programmer to create | ||
44 | panels, fetch and set their associated windows, shuffle panels | ||
45 | in the deck, and manipulate panels in other ways. | ||
46 | |||
47 | bottom_panel() places pan at the bottom of the deck. The size, | ||
48 | location and contents of the panel are unchanged. | ||
49 | |||
50 | del_panel() deletes pan, but not its associated winwow. | ||
51 | |||
52 | hide_panel() removes a panel from the deck and thus hides it | ||
53 | from view. | ||
54 | |||
55 | move_panel() moves the curses window associated with pan, so | ||
56 | that its upper lefthand corner is at the supplied coordinates. | ||
57 | (Do not use mvwin() on the window.) | ||
58 | |||
59 | new_panel() creates a new panel associated with win and returns | ||
60 | the panel pointer. The new panel is placed at the top of the | ||
61 | deck. | ||
62 | |||
63 | panel_above() returns a pointer to the panel in the deck above | ||
64 | pan, or NULL if pan is the top panel. If the value of pan passed | ||
65 | is NULL, this function returns a pointer to the bottom panel in | ||
66 | the deck. | ||
67 | |||
68 | panel_below() returns a pointer to the panel in the deck below | ||
69 | pan, or NULL if pan is the bottom panel. If the value of pan | ||
70 | passed is NULL, this function returns a pointer to the top panel | ||
71 | in the deck. | ||
72 | |||
73 | panel_hidden() returns OK if pan is hidden and ERR if it is not. | ||
74 | |||
75 | panel_userptr() - Each panel has a user pointer available for | ||
76 | maintaining relevant information. This function returns a | ||
77 | pointer to that information previously set up by | ||
78 | set_panel_userptr(). | ||
79 | |||
80 | panel_window() returns a pointer to the curses window associated | ||
81 | with the panel. | ||
82 | |||
83 | replace_panel() replaces the current window of pan with win. | ||
84 | |||
85 | set_panel_userptr() - Each panel has a user pointer available | ||
86 | for maintaining relevant information. This function sets the | ||
87 | value of that information. | ||
88 | |||
89 | show_panel() makes a previously hidden panel visible and places | ||
90 | it back in the deck on top. | ||
91 | |||
92 | top_panel() places pan on the top of the deck. The size, | ||
93 | location and contents of the panel are unchanged. | ||
94 | |||
95 | update_panels() refreshes the virtual screen to reflect the | ||
96 | depth relationships between the panels in the deck. The user | ||
97 | must use doupdate() to refresh the physical screen. | ||
98 | |||
99 | Return Value: | ||
100 | Each routine that returns a pointer to an object returns NULL if | ||
101 | an error occurs. Each panel routine that returns an integer, | ||
102 | returns OK if it executes successfully and ERR if it does not. | ||
103 | |||
104 | Portability X/Open BSD SYS V | ||
105 | bottom_panel - - Y | ||
106 | del_panel - - Y | ||
107 | hide_panel - - Y | ||
108 | move_panel - - Y | ||
109 | new_panel - - Y | ||
110 | panel_above - - Y | ||
111 | panel_below - - Y | ||
112 | panel_hidden - - Y | ||
113 | panel_userptr - - Y | ||
114 | panel_window - - Y | ||
115 | replace_panel - - Y | ||
116 | set_panel_userptr - - Y | ||
117 | show_panel - - Y | ||
118 | top_panel - - Y | ||
119 | update_panels - - Y | ||
120 | |||
121 | Credits: | ||
122 | Original Author - Warren Tucker <wht@n4hgf.mt-park.ga.us> | ||
123 | |||
124 | **man-end****************************************************************/ | ||
125 | |||
126 | #include <panel.h> | ||
127 | #include <stdlib.h> | ||
128 | |||
129 | PANEL *_bottom_panel = (PANEL *)0; | ||
130 | PANEL *_top_panel = (PANEL *)0; | ||
131 | PANEL _stdscr_pseudo_panel = { (WINDOW *)0 }; | ||
132 | |||
133 | #ifdef PANEL_DEBUG | ||
134 | |||
135 | static void dPanel(char *text, PANEL *pan) | ||
136 | { | ||
137 | PDC_LOG(("%s id=%s b=%s a=%s y=%d x=%d", text, pan->user, | ||
138 | pan->below ? pan->below->user : "--", | ||
139 | pan->above ? pan->above->user : "--", | ||
140 | pan->wstarty, pan->wstartx)); | ||
141 | } | ||
142 | |||
143 | static void dStack(char *fmt, int num, PANEL *pan) | ||
144 | { | ||
145 | char s80[80]; | ||
146 | |||
147 | sprintf(s80, fmt, num, pan); | ||
148 | PDC_LOG(("%s b=%s t=%s", s80, _bottom_panel ? _bottom_panel->user : "--", | ||
149 | _top_panel ? _top_panel->user : "--")); | ||
150 | |||
151 | if (pan) | ||
152 | PDC_LOG(("pan id=%s", pan->user)); | ||
153 | |||
154 | pan = _bottom_panel; | ||
155 | |||
156 | while (pan) | ||
157 | { | ||
158 | dPanel("stk", pan); | ||
159 | pan = pan->above; | ||
160 | } | ||
161 | } | ||
162 | |||
163 | /* debugging hook for wnoutrefresh */ | ||
164 | |||
165 | static void Wnoutrefresh(PANEL *pan) | ||
166 | { | ||
167 | dPanel("wnoutrefresh", pan); | ||
168 | wnoutrefresh(pan->win); | ||
169 | } | ||
170 | |||
171 | static void Touchpan(PANEL *pan) | ||
172 | { | ||
173 | dPanel("Touchpan", pan); | ||
174 | touchwin(pan->win); | ||
175 | } | ||
176 | |||
177 | static void Touchline(PANEL *pan, int start, int count) | ||
178 | { | ||
179 | char s80[80]; | ||
180 | |||
181 | sprintf(s80, "Touchline s=%d c=%d", start, count); | ||
182 | dPanel(s80, pan); | ||
183 | touchline(pan->win, start, count); | ||
184 | } | ||
185 | |||
186 | #else /* PANEL_DEBUG */ | ||
187 | |||
188 | #define dPanel(text, pan) | ||
189 | #define dStack(fmt, num, pan) | ||
190 | #define Wnoutrefresh(pan) wnoutrefresh((pan)->win) | ||
191 | #define Touchpan(pan) touchwin((pan)->win) | ||
192 | #define Touchline(pan, start, count) touchline((pan)->win, start, count) | ||
193 | |||
194 | #endif /* PANEL_DEBUG */ | ||
195 | |||
196 | static bool _panels_overlapped(PANEL *pan1, PANEL *pan2) | ||
197 | { | ||
198 | if (!pan1 || !pan2) | ||
199 | return FALSE; | ||
200 | |||
201 | return ((pan1->wstarty >= pan2->wstarty && pan1->wstarty < pan2->wendy) | ||
202 | || (pan2->wstarty >= pan1->wstarty && pan2->wstarty < pan1->wendy)) | ||
203 | && ((pan1->wstartx >= pan2->wstartx && pan1->wstartx < pan2->wendx) | ||
204 | || (pan2->wstartx >= pan1->wstartx && pan2->wstartx < pan1->wendx)); | ||
205 | } | ||
206 | |||
207 | static void _free_obscure(PANEL *pan) | ||
208 | { | ||
209 | PANELOBS *tobs = pan->obscure; /* "this" one */ | ||
210 | PANELOBS *nobs; /* "next" one */ | ||
211 | |||
212 | while (tobs) | ||
213 | { | ||
214 | nobs = tobs->above; | ||
215 | free((char *)tobs); | ||
216 | tobs = nobs; | ||
217 | } | ||
218 | pan->obscure = (PANELOBS *)0; | ||
219 | } | ||
220 | |||
221 | static void _override(PANEL *pan, int show) | ||
222 | { | ||
223 | int y; | ||
224 | PANEL *pan2; | ||
225 | PANELOBS *tobs = pan->obscure; /* "this" one */ | ||
226 | |||
227 | if (show == 1) | ||
228 | Touchpan(pan); | ||
229 | else if (!show) | ||
230 | { | ||
231 | Touchpan(pan); | ||
232 | Touchpan(&_stdscr_pseudo_panel); | ||
233 | } | ||
234 | else if (show == -1) | ||
235 | while (tobs && (tobs->pan != pan)) | ||
236 | tobs = tobs->above; | ||
237 | |||
238 | while (tobs) | ||
239 | { | ||
240 | if ((pan2 = tobs->pan) != pan) | ||
241 | for (y = pan->wstarty; y < pan->wendy; y++) | ||
242 | if ((y >= pan2->wstarty) && (y < pan2->wendy) && | ||
243 | ((is_linetouched(pan->win, y - pan->wstarty)) || | ||
244 | (is_linetouched(stdscr, y)))) | ||
245 | Touchline(pan2, y - pan2->wstarty, 1); | ||
246 | |||
247 | tobs = tobs->above; | ||
248 | } | ||
249 | } | ||
250 | |||
251 | static void _calculate_obscure(void) | ||
252 | { | ||
253 | PANEL *pan, *pan2; | ||
254 | PANELOBS *tobs; /* "this" one */ | ||
255 | PANELOBS *lobs; /* last one */ | ||
256 | |||
257 | pan = _bottom_panel; | ||
258 | |||
259 | while (pan) | ||
260 | { | ||
261 | if (pan->obscure) | ||
262 | _free_obscure(pan); | ||
263 | |||
264 | lobs = (PANELOBS *)0; | ||
265 | pan2 = _bottom_panel; | ||
266 | |||
267 | while (pan2) | ||
268 | { | ||
269 | if (_panels_overlapped(pan, pan2)) | ||
270 | { | ||
271 | if ((tobs = malloc(sizeof(PANELOBS))) == NULL) | ||
272 | return; | ||
273 | |||
274 | tobs->pan = pan2; | ||
275 | dPanel("obscured", pan2); | ||
276 | tobs->above = (PANELOBS *)0; | ||
277 | |||
278 | if (lobs) | ||
279 | lobs->above = tobs; | ||
280 | else | ||
281 | pan->obscure = tobs; | ||
282 | |||
283 | lobs = tobs; | ||
284 | } | ||
285 | |||
286 | pan2 = pan2->above; | ||
287 | } | ||
288 | |||
289 | _override(pan, 1); | ||
290 | pan = pan->above; | ||
291 | } | ||
292 | } | ||
293 | |||
294 | /* check to see if panel is in the stack */ | ||
295 | |||
296 | static bool _panel_is_linked(const PANEL *pan) | ||
297 | { | ||
298 | PANEL *pan2 = _bottom_panel; | ||
299 | |||
300 | while (pan2) | ||
301 | { | ||
302 | if (pan2 == pan) | ||
303 | return TRUE; | ||
304 | |||
305 | pan2 = pan2->above; | ||
306 | } | ||
307 | |||
308 | return FALSE; | ||
309 | } | ||
310 | |||
311 | /* link panel into stack at top */ | ||
312 | |||
313 | static void _panel_link_top(PANEL *pan) | ||
314 | { | ||
315 | #ifdef PANEL_DEBUG | ||
316 | dStack("<lt%d>", 1, pan); | ||
317 | if (_panel_is_linked(pan)) | ||
318 | return; | ||
319 | #endif | ||
320 | pan->above = (PANEL *)0; | ||
321 | pan->below = (PANEL *)0; | ||
322 | |||
323 | if (_top_panel) | ||
324 | { | ||
325 | _top_panel->above = pan; | ||
326 | pan->below = _top_panel; | ||
327 | } | ||
328 | |||
329 | _top_panel = pan; | ||
330 | |||
331 | if (!_bottom_panel) | ||
332 | _bottom_panel = pan; | ||
333 | |||
334 | _calculate_obscure(); | ||
335 | dStack("<lt%d>", 9, pan); | ||
336 | } | ||
337 | |||
338 | /* link panel into stack at bottom */ | ||
339 | |||
340 | static void _panel_link_bottom(PANEL *pan) | ||
341 | { | ||
342 | #ifdef PANEL_DEBUG | ||
343 | dStack("<lb%d>", 1, pan); | ||
344 | if (_panel_is_linked(pan)) | ||
345 | return; | ||
346 | #endif | ||
347 | pan->above = (PANEL *)0; | ||
348 | pan->below = (PANEL *)0; | ||
349 | |||
350 | if (_bottom_panel) | ||
351 | { | ||
352 | _bottom_panel->below = pan; | ||
353 | pan->above = _bottom_panel; | ||
354 | } | ||
355 | |||
356 | _bottom_panel = pan; | ||
357 | |||
358 | if (!_top_panel) | ||
359 | _top_panel = pan; | ||
360 | |||
361 | _calculate_obscure(); | ||
362 | dStack("<lb%d>", 9, pan); | ||
363 | } | ||
364 | |||
365 | static void _panel_unlink(PANEL *pan) | ||
366 | { | ||
367 | PANEL *prev; | ||
368 | PANEL *next; | ||
369 | |||
370 | #ifdef PANEL_DEBUG | ||
371 | dStack("<u%d>", 1, pan); | ||
372 | if (!_panel_is_linked(pan)) | ||
373 | return; | ||
374 | #endif | ||
375 | _override(pan, 0); | ||
376 | _free_obscure(pan); | ||
377 | |||
378 | prev = pan->below; | ||
379 | next = pan->above; | ||
380 | |||
381 | /* if non-zero, we will not update the list head */ | ||
382 | |||
383 | if (prev) | ||
384 | { | ||
385 | prev->above = next; | ||
386 | if(next) | ||
387 | next->below = prev; | ||
388 | } | ||
389 | else if (next) | ||
390 | next->below = prev; | ||
391 | |||
392 | if (pan == _bottom_panel) | ||
393 | _bottom_panel = next; | ||
394 | |||
395 | if (pan == _top_panel) | ||
396 | _top_panel = prev; | ||
397 | |||
398 | _calculate_obscure(); | ||
399 | |||
400 | pan->above = (PANEL *)0; | ||
401 | pan->below = (PANEL *)0; | ||
402 | dStack("<u%d>", 9, pan); | ||
403 | |||
404 | } | ||
405 | |||
406 | /************************************************************************ | ||
407 | * The following are the public functions for the panels library. * | ||
408 | ************************************************************************/ | ||
409 | |||
410 | int bottom_panel(PANEL *pan) | ||
411 | { | ||
412 | if (!pan) | ||
413 | return ERR; | ||
414 | |||
415 | if (pan == _bottom_panel) | ||
416 | return OK; | ||
417 | |||
418 | if (_panel_is_linked(pan)) | ||
419 | hide_panel(pan); | ||
420 | |||
421 | _panel_link_bottom(pan); | ||
422 | |||
423 | return OK; | ||
424 | } | ||
425 | |||
426 | int del_panel(PANEL *pan) | ||
427 | { | ||
428 | if (pan) | ||
429 | { | ||
430 | if (_panel_is_linked(pan)) | ||
431 | hide_panel(pan); | ||
432 | |||
433 | free((char *)pan); | ||
434 | return OK; | ||
435 | } | ||
436 | |||
437 | return ERR; | ||
438 | } | ||
439 | |||
440 | int hide_panel(PANEL *pan) | ||
441 | { | ||
442 | if (!pan) | ||
443 | return ERR; | ||
444 | |||
445 | if (!_panel_is_linked(pan)) | ||
446 | { | ||
447 | pan->above = (PANEL *)0; | ||
448 | pan->below = (PANEL *)0; | ||
449 | return ERR; | ||
450 | } | ||
451 | |||
452 | _panel_unlink(pan); | ||
453 | |||
454 | return OK; | ||
455 | } | ||
456 | |||
457 | int move_panel(PANEL *pan, int starty, int startx) | ||
458 | { | ||
459 | WINDOW *win; | ||
460 | int maxy, maxx; | ||
461 | |||
462 | if (!pan) | ||
463 | return ERR; | ||
464 | |||
465 | if (_panel_is_linked(pan)) | ||
466 | _override(pan, 0); | ||
467 | |||
468 | win = pan->win; | ||
469 | |||
470 | if (mvwin(win, starty, startx) == ERR) | ||
471 | return ERR; | ||
472 | |||
473 | getbegyx(win, pan->wstarty, pan->wstartx); | ||
474 | getmaxyx(win, maxy, maxx); | ||
475 | pan->wendy = pan->wstarty + maxy; | ||
476 | pan->wendx = pan->wstartx + maxx; | ||
477 | |||
478 | if (_panel_is_linked(pan)) | ||
479 | _calculate_obscure(); | ||
480 | |||
481 | return OK; | ||
482 | } | ||
483 | |||
484 | PANEL *new_panel(WINDOW *win) | ||
485 | { | ||
486 | PANEL *pan = malloc(sizeof(PANEL)); | ||
487 | |||
488 | if (!_stdscr_pseudo_panel.win) | ||
489 | { | ||
490 | _stdscr_pseudo_panel.win = stdscr; | ||
491 | _stdscr_pseudo_panel.wstarty = 0; | ||
492 | _stdscr_pseudo_panel.wstartx = 0; | ||
493 | _stdscr_pseudo_panel.wendy = LINES; | ||
494 | _stdscr_pseudo_panel.wendx = COLS; | ||
495 | _stdscr_pseudo_panel.user = "stdscr"; | ||
496 | _stdscr_pseudo_panel.obscure = (PANELOBS *)0; | ||
497 | } | ||
498 | |||
499 | if (pan) | ||
500 | { | ||
501 | int maxy, maxx; | ||
502 | |||
503 | pan->win = win; | ||
504 | pan->above = (PANEL *)0; | ||
505 | pan->below = (PANEL *)0; | ||
506 | getbegyx(win, pan->wstarty, pan->wstartx); | ||
507 | getmaxyx(win, maxy, maxx); | ||
508 | pan->wendy = pan->wstarty + maxy; | ||
509 | pan->wendx = pan->wstartx + maxx; | ||
510 | #ifdef PANEL_DEBUG | ||
511 | pan->user = "new"; | ||
512 | #else | ||
513 | pan->user = (char *)0; | ||
514 | #endif | ||
515 | pan->obscure = (PANELOBS *)0; | ||
516 | show_panel(pan); | ||
517 | } | ||
518 | |||
519 | return pan; | ||
520 | } | ||
521 | |||
522 | PANEL *panel_above(const PANEL *pan) | ||
523 | { | ||
524 | return pan ? pan->above : _bottom_panel; | ||
525 | } | ||
526 | |||
527 | PANEL *panel_below(const PANEL *pan) | ||
528 | { | ||
529 | return pan ? pan->below : _top_panel; | ||
530 | } | ||
531 | |||
532 | int panel_hidden(const PANEL *pan) | ||
533 | { | ||
534 | if (!pan) | ||
535 | return ERR; | ||
536 | |||
537 | return _panel_is_linked(pan) ? ERR : OK; | ||
538 | } | ||
539 | |||
540 | const void *panel_userptr(const PANEL *pan) | ||
541 | { | ||
542 | return pan ? pan->user : NULL; | ||
543 | } | ||
544 | |||
545 | WINDOW *panel_window(const PANEL *pan) | ||
546 | { | ||
547 | PDC_LOG(("panel_window() - called\n")); | ||
548 | |||
549 | return pan->win; | ||
550 | } | ||
551 | |||
552 | int replace_panel(PANEL *pan, WINDOW *win) | ||
553 | { | ||
554 | int maxy, maxx; | ||
555 | |||
556 | if (!pan) | ||
557 | return ERR; | ||
558 | |||
559 | if (_panel_is_linked(pan)) | ||
560 | _override(pan, 0); | ||
561 | |||
562 | pan->win = win; | ||
563 | getbegyx(win, pan->wstarty, pan->wstartx); | ||
564 | getmaxyx(win, maxy, maxx); | ||
565 | pan->wendy = pan->wstarty + maxy; | ||
566 | pan->wendx = pan->wstartx + maxx; | ||
567 | |||
568 | if (_panel_is_linked(pan)) | ||
569 | _calculate_obscure(); | ||
570 | |||
571 | return OK; | ||
572 | } | ||
573 | |||
574 | int set_panel_userptr(PANEL *pan, const void *uptr) | ||
575 | { | ||
576 | if (!pan) | ||
577 | return ERR; | ||
578 | |||
579 | pan->user = uptr; | ||
580 | return OK; | ||
581 | } | ||
582 | |||
583 | int show_panel(PANEL *pan) | ||
584 | { | ||
585 | if (!pan) | ||
586 | return ERR; | ||
587 | |||
588 | if (pan == _top_panel) | ||
589 | return OK; | ||
590 | |||
591 | if (_panel_is_linked(pan)) | ||
592 | hide_panel(pan); | ||
593 | |||
594 | _panel_link_top(pan); | ||
595 | |||
596 | return OK; | ||
597 | } | ||
598 | |||
599 | int top_panel(PANEL *pan) | ||
600 | { | ||
601 | return show_panel(pan); | ||
602 | } | ||
603 | |||
604 | void update_panels(void) | ||
605 | { | ||
606 | PANEL *pan; | ||
607 | |||
608 | PDC_LOG(("update_panels() - called\n")); | ||
609 | |||
610 | pan = _bottom_panel; | ||
611 | |||
612 | while (pan) | ||
613 | { | ||
614 | _override(pan, -1); | ||
615 | pan = pan->above; | ||
616 | } | ||
617 | |||
618 | if (is_wintouched(stdscr)) | ||
619 | Wnoutrefresh(&_stdscr_pseudo_panel); | ||
620 | |||
621 | pan = _bottom_panel; | ||
622 | |||
623 | while (pan) | ||
624 | { | ||
625 | if (is_wintouched(pan->win) || !pan->above) | ||
626 | Wnoutrefresh(pan); | ||
627 | |||
628 | pan = pan->above; | ||
629 | } | ||
630 | } |
File pdcurses/printw.c added (mode: 100644) (index 00000000..9be0c5fc) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: printw.c,v 1.40 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: printw | ||
10 | |||
11 | Synopsis: | ||
12 | int printw(const char *fmt, ...); | ||
13 | int wprintw(WINDOW *win, const char *fmt, ...); | ||
14 | int mvprintw(int y, int x, const char *fmt, ...); | ||
15 | int mvwprintw(WINDOW *win, int y, int x, const char *fmt,...); | ||
16 | int vwprintw(WINDOW *win, const char *fmt, va_list varglist); | ||
17 | int vw_printw(WINDOW *win, const char *fmt, va_list varglist); | ||
18 | |||
19 | Description: | ||
20 | The printw() functions add a formatted string to the window at | ||
21 | the current or specified cursor position. The format strings are | ||
22 | the same as used in the standard C library's printf(). (printw() | ||
23 | can be used as a drop-in replacement for printf().) | ||
24 | |||
25 | Return Value: | ||
26 | All functions return the number of characters printed, or | ||
27 | ERR on error. | ||
28 | |||
29 | Portability X/Open BSD SYS V | ||
30 | printw Y Y Y | ||
31 | wprintw Y Y Y | ||
32 | mvprintw Y Y Y | ||
33 | mvwprintw Y Y Y | ||
34 | vwprintw Y - 4.0 | ||
35 | vw_printw Y | ||
36 | |||
37 | **man-end****************************************************************/ | ||
38 | |||
39 | #include <string.h> | ||
40 | |||
41 | int vwprintw(WINDOW *win, const char *fmt, va_list varglist) | ||
42 | { | ||
43 | char printbuf[513]; | ||
44 | int len; | ||
45 | |||
46 | PDC_LOG(("vwprintw() - called\n")); | ||
47 | |||
48 | #ifdef HAVE_VSNPRINTF | ||
49 | len = vsnprintf(printbuf, 512, fmt, varglist); | ||
50 | #else | ||
51 | len = vsprintf(printbuf, fmt, varglist); | ||
52 | #endif | ||
53 | return (waddstr(win, printbuf) == ERR) ? ERR : len; | ||
54 | } | ||
55 | |||
56 | int printw(const char *fmt, ...) | ||
57 | { | ||
58 | va_list args; | ||
59 | int retval; | ||
60 | |||
61 | PDC_LOG(("printw() - called\n")); | ||
62 | |||
63 | va_start(args, fmt); | ||
64 | retval = vwprintw(stdscr, fmt, args); | ||
65 | va_end(args); | ||
66 | |||
67 | return retval; | ||
68 | } | ||
69 | |||
70 | int wprintw(WINDOW *win, const char *fmt, ...) | ||
71 | { | ||
72 | va_list args; | ||
73 | int retval; | ||
74 | |||
75 | PDC_LOG(("wprintw() - called\n")); | ||
76 | |||
77 | va_start(args, fmt); | ||
78 | retval = vwprintw(win, fmt, args); | ||
79 | va_end(args); | ||
80 | |||
81 | return retval; | ||
82 | } | ||
83 | |||
84 | int mvprintw(int y, int x, const char *fmt, ...) | ||
85 | { | ||
86 | va_list args; | ||
87 | int retval; | ||
88 | |||
89 | PDC_LOG(("mvprintw() - called\n")); | ||
90 | |||
91 | if (move(y, x) == ERR) | ||
92 | return ERR; | ||
93 | |||
94 | va_start(args, fmt); | ||
95 | retval = vwprintw(stdscr, fmt, args); | ||
96 | va_end(args); | ||
97 | |||
98 | return retval; | ||
99 | } | ||
100 | |||
101 | int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) | ||
102 | { | ||
103 | va_list args; | ||
104 | int retval; | ||
105 | |||
106 | PDC_LOG(("mvwprintw() - called\n")); | ||
107 | |||
108 | if (wmove(win, y, x) == ERR) | ||
109 | return ERR; | ||
110 | |||
111 | va_start(args, fmt); | ||
112 | retval = vwprintw(win, fmt, args); | ||
113 | va_end(args); | ||
114 | |||
115 | return retval; | ||
116 | } | ||
117 | |||
118 | int vw_printw(WINDOW *win, const char *fmt, va_list varglist) | ||
119 | { | ||
120 | PDC_LOG(("vw_printw() - called\n")); | ||
121 | |||
122 | return vwprintw(win, fmt, varglist); | ||
123 | } |
File pdcurses/refresh.c added (mode: 100644) (index 00000000..0b8e1ca5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: refresh.c,v 1.56 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: refresh | ||
10 | |||
11 | Synopsis: | ||
12 | int refresh(void); | ||
13 | int wrefresh(WINDOW *win); | ||
14 | int wnoutrefresh(WINDOW *win); | ||
15 | int doupdate(void); | ||
16 | int redrawwin(WINDOW *win); | ||
17 | int wredrawln(WINDOW *win, int beg_line, int num_lines); | ||
18 | |||
19 | Description: | ||
20 | wrefresh() copies the named window to the physical terminal | ||
21 | screen, taking into account what is already there in order to | ||
22 | optimize cursor movement. refresh() does the same, using stdscr. | ||
23 | These routines must be called to get any output on the terminal, | ||
24 | as other routines only manipulate data structures. Unless | ||
25 | leaveok() has been enabled, the physical cursor of the terminal | ||
26 | is left at the location of the window's cursor. | ||
27 | |||
28 | wnoutrefresh() and doupdate() allow multiple updates with more | ||
29 | efficiency than wrefresh() alone. wrefresh() works by first | ||
30 | calling wnoutrefresh(), which copies the named window to the | ||
31 | virtual screen. It then calls doupdate(), which compares the | ||
32 | virtual screen to the physical screen and does the actual | ||
33 | update. A series of calls to wrefresh() will result in | ||
34 | alternating calls to wnoutrefresh() and doupdate(), causing | ||
35 | several bursts of output to the screen. By first calling | ||
36 | wnoutrefresh() for each window, it is then possible to call | ||
37 | doupdate() only once. | ||
38 | |||
39 | In PDCurses, redrawwin() is equivalent to touchwin(), and | ||
40 | wredrawln() is the same as touchline(). In some other curses | ||
41 | implementations, there's a subtle distinction, but it has no | ||
42 | meaning in PDCurses. | ||
43 | |||
44 | Return Value: | ||
45 | All functions return OK on success and ERR on error. | ||
46 | |||
47 | Portability X/Open BSD SYS V | ||
48 | refresh Y Y Y | ||
49 | wrefresh Y Y Y | ||
50 | wnoutrefresh Y Y Y | ||
51 | doupdate Y Y Y | ||
52 | redrawwin Y - 4.0 | ||
53 | wredrawln Y - 4.0 | ||
54 | |||
55 | **man-end****************************************************************/ | ||
56 | |||
57 | #include <string.h> | ||
58 | |||
59 | int wnoutrefresh(WINDOW *win) | ||
60 | { | ||
61 | int begy, begx; /* window's place on screen */ | ||
62 | int i, j; | ||
63 | |||
64 | PDC_LOG(("wnoutrefresh() - called: win=%p\n", win)); | ||
65 | |||
66 | if ( !win || (win->_flags & (_PAD|_SUBPAD)) ) | ||
67 | return ERR; | ||
68 | |||
69 | begy = win->_begy; | ||
70 | begx = win->_begx; | ||
71 | |||
72 | for (i = 0, j = begy; i < win->_maxy; i++, j++) | ||
73 | { | ||
74 | if (win->_firstch[i] != _NO_CHANGE) | ||
75 | { | ||
76 | chtype *src = win->_y[i]; | ||
77 | chtype *dest = curscr->_y[j] + begx; | ||
78 | |||
79 | int first = win->_firstch[i]; /* first changed */ | ||
80 | int last = win->_lastch[i]; /* last changed */ | ||
81 | |||
82 | /* ignore areas on the outside that are marked as changed, | ||
83 | but really aren't */ | ||
84 | |||
85 | while (first <= last && src[first] == dest[first]) | ||
86 | first++; | ||
87 | |||
88 | while (last >= first && src[last] == dest[last]) | ||
89 | last--; | ||
90 | |||
91 | /* if any have really changed... */ | ||
92 | |||
93 | if (first <= last) | ||
94 | { | ||
95 | memcpy(dest + first, src + first, | ||
96 | (last - first + 1) * sizeof(chtype)); | ||
97 | |||
98 | first += begx; | ||
99 | last += begx; | ||
100 | |||
101 | if (first < curscr->_firstch[j] || | ||
102 | curscr->_firstch[j] == _NO_CHANGE) | ||
103 | curscr->_firstch[j] = first; | ||
104 | |||
105 | if (last > curscr->_lastch[j]) | ||
106 | curscr->_lastch[j] = last; | ||
107 | } | ||
108 | |||
109 | win->_firstch[i] = _NO_CHANGE; /* updated now */ | ||
110 | } | ||
111 | |||
112 | win->_lastch[i] = _NO_CHANGE; /* updated now */ | ||
113 | } | ||
114 | |||
115 | if (win->_clear) | ||
116 | win->_clear = FALSE; | ||
117 | |||
118 | if (!win->_leaveit) | ||
119 | { | ||
120 | curscr->_cury = win->_cury + begy; | ||
121 | curscr->_curx = win->_curx + begx; | ||
122 | } | ||
123 | |||
124 | return OK; | ||
125 | } | ||
126 | |||
127 | int doupdate(void) | ||
128 | { | ||
129 | int y; | ||
130 | bool clearall; | ||
131 | |||
132 | PDC_LOG(("doupdate() - called\n")); | ||
133 | |||
134 | if (!curscr) | ||
135 | return ERR; | ||
136 | |||
137 | if (isendwin()) /* coming back after endwin() called */ | ||
138 | { | ||
139 | reset_prog_mode(); | ||
140 | clearall = TRUE; | ||
141 | SP->alive = TRUE; /* so isendwin() result is correct */ | ||
142 | } | ||
143 | else | ||
144 | clearall = curscr->_clear; | ||
145 | |||
146 | for (y = 0; y < SP->lines; y++) | ||
147 | { | ||
148 | PDC_LOG(("doupdate() - Transforming line %d of %d: %s\n", | ||
149 | y, SP->lines, (curscr->_firstch[y] != _NO_CHANGE) ? | ||
150 | "Yes" : "No")); | ||
151 | |||
152 | if (clearall || curscr->_firstch[y] != _NO_CHANGE) | ||
153 | { | ||
154 | int first, last; | ||
155 | |||
156 | chtype *src = curscr->_y[y]; | ||
157 | chtype *dest = pdc_lastscr->_y[y]; | ||
158 | |||
159 | if (clearall) | ||
160 | { | ||
161 | first = 0; | ||
162 | last = COLS - 1; | ||
163 | } | ||
164 | else | ||
165 | { | ||
166 | first = curscr->_firstch[y]; | ||
167 | last = curscr->_lastch[y]; | ||
168 | } | ||
169 | |||
170 | while (first <= last) | ||
171 | { | ||
172 | int len = 0; | ||
173 | |||
174 | /* build up a run of changed cells; if two runs are | ||
175 | separated by a single unchanged cell, ignore the | ||
176 | break */ | ||
177 | |||
178 | if (clearall) | ||
179 | len = last - first + 1; | ||
180 | else | ||
181 | while (first + len <= last && | ||
182 | (src[first + len] != dest[first + len] || | ||
183 | (len && first + len < last && | ||
184 | src[first + len + 1] != dest[first + len + 1]) | ||
185 | ) | ||
186 | ) | ||
187 | len++; | ||
188 | |||
189 | /* update the screen, and pdc_lastscr */ | ||
190 | |||
191 | if (len) | ||
192 | { | ||
193 | PDC_transform_line(y, first, len, src + first); | ||
194 | memcpy(dest + first, src + first, len * sizeof(chtype)); | ||
195 | first += len; | ||
196 | } | ||
197 | |||
198 | /* skip over runs of unchanged cells */ | ||
199 | |||
200 | while (first <= last && src[first] == dest[first]) | ||
201 | first++; | ||
202 | } | ||
203 | |||
204 | curscr->_firstch[y] = _NO_CHANGE; | ||
205 | curscr->_lastch[y] = _NO_CHANGE; | ||
206 | } | ||
207 | } | ||
208 | |||
209 | curscr->_clear = FALSE; | ||
210 | |||
211 | if (SP->visibility) | ||
212 | PDC_gotoyx(curscr->_cury, curscr->_curx); | ||
213 | |||
214 | SP->cursrow = curscr->_cury; | ||
215 | SP->curscol = curscr->_curx; | ||
216 | |||
217 | return OK; | ||
218 | } | ||
219 | |||
220 | int wrefresh(WINDOW *win) | ||
221 | { | ||
222 | bool save_clear; | ||
223 | |||
224 | PDC_LOG(("wrefresh() - called\n")); | ||
225 | |||
226 | if ( !win || (win->_flags & (_PAD|_SUBPAD)) ) | ||
227 | return ERR; | ||
228 | |||
229 | save_clear = win->_clear; | ||
230 | |||
231 | if (win == curscr) | ||
232 | curscr->_clear = TRUE; | ||
233 | else | ||
234 | wnoutrefresh(win); | ||
235 | |||
236 | if (save_clear && win->_maxy == SP->lines && win->_maxx == SP->cols) | ||
237 | curscr->_clear = TRUE; | ||
238 | |||
239 | return doupdate(); | ||
240 | } | ||
241 | |||
242 | int refresh(void) | ||
243 | { | ||
244 | PDC_LOG(("refresh() - called\n")); | ||
245 | |||
246 | return wrefresh(stdscr); | ||
247 | } | ||
248 | |||
249 | int wredrawln(WINDOW *win, int start, int num) | ||
250 | { | ||
251 | int i; | ||
252 | |||
253 | PDC_LOG(("wredrawln() - called: win=%p start=%d num=%d\n", | ||
254 | win, start, num)); | ||
255 | |||
256 | if (!win || start > win->_maxy || start + num > win->_maxy) | ||
257 | return ERR; | ||
258 | |||
259 | for (i = start; i < start + num; i++) | ||
260 | { | ||
261 | win->_firstch[i] = 0; | ||
262 | win->_lastch[i] = win->_maxx - 1; | ||
263 | } | ||
264 | |||
265 | return OK; | ||
266 | } | ||
267 | |||
268 | int redrawwin(WINDOW *win) | ||
269 | { | ||
270 | PDC_LOG(("redrawwin() - called: win=%p\n", win)); | ||
271 | |||
272 | if (!win) | ||
273 | return ERR; | ||
274 | |||
275 | return wredrawln(win, 0, win->_maxy); | ||
276 | } |
File pdcurses/scanw.c added (mode: 100644) (index 00000000..af2bcb9e) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: scanw.c,v 1.42 2008/07/14 12:22:13 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: scanw | ||
10 | |||
11 | Synopsis: | ||
12 | int scanw(const char *fmt, ...); | ||
13 | int wscanw(WINDOW *win, const char *fmt, ...); | ||
14 | int mvscanw(int y, int x, const char *fmt, ...); | ||
15 | int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...); | ||
16 | int vwscanw(WINDOW *win, const char *fmt, va_list varglist); | ||
17 | int vw_scanw(WINDOW *win, const char *fmt, va_list varglist); | ||
18 | |||
19 | Description: | ||
20 | These routines correspond to the standard C library's scanf() | ||
21 | family. Each gets a string from the window via wgetnstr(), and | ||
22 | uses the resulting line as input for the scan. | ||
23 | |||
24 | Return Value: | ||
25 | On successful completion, these functions return the number of | ||
26 | items successfully matched. Otherwise they return ERR. | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | scanw Y Y Y | ||
30 | wscanw Y Y Y | ||
31 | mvscanw Y Y Y | ||
32 | mvwscanw Y Y Y | ||
33 | vwscanw Y - 4.0 | ||
34 | vw_scanw Y | ||
35 | |||
36 | **man-end****************************************************************/ | ||
37 | |||
38 | #include <string.h> | ||
39 | |||
40 | #ifndef HAVE_VSSCANF | ||
41 | # include <stdlib.h> | ||
42 | # include <ctype.h> | ||
43 | # include <limits.h> | ||
44 | |||
45 | static int _pdc_vsscanf(const char *, const char *, va_list); | ||
46 | |||
47 | # define vsscanf _pdc_vsscanf | ||
48 | #endif | ||
49 | |||
50 | int vwscanw(WINDOW *win, const char *fmt, va_list varglist) | ||
51 | { | ||
52 | char scanbuf[256]; | ||
53 | |||
54 | PDC_LOG(("vwscanw() - called\n")); | ||
55 | |||
56 | if (wgetnstr(win, scanbuf, 255) == ERR) | ||
57 | return ERR; | ||
58 | |||
59 | return vsscanf(scanbuf, fmt, varglist); | ||
60 | } | ||
61 | |||
62 | int scanw(const char *fmt, ...) | ||
63 | { | ||
64 | va_list args; | ||
65 | int retval; | ||
66 | |||
67 | PDC_LOG(("scanw() - called\n")); | ||
68 | |||
69 | va_start(args, fmt); | ||
70 | retval = vwscanw(stdscr, fmt, args); | ||
71 | va_end(args); | ||
72 | |||
73 | return retval; | ||
74 | } | ||
75 | |||
76 | int wscanw(WINDOW *win, const char *fmt, ...) | ||
77 | { | ||
78 | va_list args; | ||
79 | int retval; | ||
80 | |||
81 | PDC_LOG(("wscanw() - called\n")); | ||
82 | |||
83 | va_start(args, fmt); | ||
84 | retval = vwscanw(win, fmt, args); | ||
85 | va_end(args); | ||
86 | |||
87 | return retval; | ||
88 | } | ||
89 | |||
90 | int mvscanw(int y, int x, const char *fmt, ...) | ||
91 | { | ||
92 | va_list args; | ||
93 | int retval; | ||
94 | |||
95 | PDC_LOG(("mvscanw() - called\n")); | ||
96 | |||
97 | if (move(y, x) == ERR) | ||
98 | return ERR; | ||
99 | |||
100 | va_start(args, fmt); | ||
101 | retval = vwscanw(stdscr, fmt, args); | ||
102 | va_end(args); | ||
103 | |||
104 | return retval; | ||
105 | } | ||
106 | |||
107 | int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...) | ||
108 | { | ||
109 | va_list args; | ||
110 | int retval; | ||
111 | |||
112 | PDC_LOG(("mvscanw() - called\n")); | ||
113 | |||
114 | if (wmove(win, y, x) == ERR) | ||
115 | return ERR; | ||
116 | |||
117 | va_start(args, fmt); | ||
118 | retval = vwscanw(win, fmt, args); | ||
119 | va_end(args); | ||
120 | |||
121 | return retval; | ||
122 | } | ||
123 | |||
124 | int vw_scanw(WINDOW *win, const char *fmt, va_list varglist) | ||
125 | { | ||
126 | PDC_LOG(("vw_scanw() - called\n")); | ||
127 | |||
128 | return vwscanw(win, fmt, varglist); | ||
129 | } | ||
130 | |||
131 | #ifndef HAVE_VSSCANF | ||
132 | |||
133 | /* _pdc_vsscanf() - Internal routine to parse and format an input | ||
134 | buffer. It scans a series of input fields; each field is formatted | ||
135 | according to a supplied format string and the formatted input is | ||
136 | stored in the variable number of addresses passed. Returns the number | ||
137 | of input fields or EOF on error. | ||
138 | |||
139 | Don't compile this unless required. Some compilers (at least Borland | ||
140 | C++ 3.0) have to link with math libraries due to the use of floats. | ||
141 | |||
142 | Based on vsscanf.c and input.c from emx 0.8f library source, | ||
143 | Copyright (c) 1990-1992 by Eberhard Mattes, who has kindly agreed to | ||
144 | its inclusion in PDCurses. */ | ||
145 | |||
146 | #define WHITE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n') | ||
147 | |||
148 | #define NEXT(x) \ | ||
149 | do { \ | ||
150 | x = *buf++; \ | ||
151 | if (!x) \ | ||
152 | return (count ? count : EOF); \ | ||
153 | ++chars; \ | ||
154 | } while (0) | ||
155 | |||
156 | #define UNGETC() \ | ||
157 | do { \ | ||
158 | --buf; --chars; \ | ||
159 | } while (0) | ||
160 | |||
161 | static int _pdc_vsscanf(const char *buf, const char *fmt, va_list arg_ptr) | ||
162 | { | ||
163 | int count, chars, c, width, radix, d, i; | ||
164 | int *int_ptr; | ||
165 | long *long_ptr; | ||
166 | short *short_ptr; | ||
167 | char *char_ptr; | ||
168 | unsigned char f; | ||
169 | char neg, assign, ok, size; | ||
170 | long n; | ||
171 | char map[256], end; | ||
172 | double dx, dd, *dbl_ptr; | ||
173 | float *flt_ptr; | ||
174 | int exp; | ||
175 | char eneg; | ||
176 | |||
177 | count = 0; | ||
178 | chars = 0; | ||
179 | c = 0; | ||
180 | while ((f = *fmt) != 0) | ||
181 | { | ||
182 | if (WHITE(f)) | ||
183 | { | ||
184 | do | ||
185 | { | ||
186 | ++fmt; | ||
187 | f = *fmt; | ||
188 | } | ||
189 | while (WHITE(f)); | ||
190 | do | ||
191 | { | ||
192 | c = *buf++; | ||
193 | if (!c) | ||
194 | { | ||
195 | if (!f || count) | ||
196 | return count; | ||
197 | else | ||
198 | return EOF; | ||
199 | } else | ||
200 | ++chars; | ||
201 | } | ||
202 | while (WHITE(c)); | ||
203 | UNGETC(); | ||
204 | } else if (f != '%') | ||
205 | { | ||
206 | NEXT(c); | ||
207 | if (c != f) | ||
208 | return count; | ||
209 | ++fmt; | ||
210 | } else | ||
211 | { | ||
212 | assign = TRUE; | ||
213 | width = INT_MAX; | ||
214 | char_ptr = NULL; | ||
215 | ++fmt; | ||
216 | if (*fmt == '*') | ||
217 | { | ||
218 | assign = FALSE; | ||
219 | ++fmt; | ||
220 | } | ||
221 | if (isdigit(*fmt)) | ||
222 | { | ||
223 | width = 0; | ||
224 | while (isdigit(*fmt)) | ||
225 | width = width * 10 + (*fmt++ - '0'); | ||
226 | if (!width) | ||
227 | width = INT_MAX; | ||
228 | } | ||
229 | size = 0; | ||
230 | if (*fmt == 'h' || *fmt == 'l') | ||
231 | size = *fmt++; | ||
232 | f = *fmt; | ||
233 | switch (f) | ||
234 | { | ||
235 | case 'c': | ||
236 | if (width == INT_MAX) | ||
237 | width = 1; | ||
238 | if (assign) | ||
239 | char_ptr = va_arg(arg_ptr, char *); | ||
240 | while (width > 0) | ||
241 | { | ||
242 | --width; | ||
243 | NEXT(c); | ||
244 | if (assign) | ||
245 | { | ||
246 | *char_ptr++ = (char) c; | ||
247 | ++count; | ||
248 | } | ||
249 | } | ||
250 | break; | ||
251 | case '[': | ||
252 | memset(map, 0, 256); | ||
253 | end = 0; | ||
254 | ++fmt; | ||
255 | if (*fmt == '^') | ||
256 | { | ||
257 | ++fmt; | ||
258 | end = 1; | ||
259 | } | ||
260 | i = 0; | ||
261 | for (;;) | ||
262 | { | ||
263 | f = (unsigned char) *fmt; | ||
264 | switch (f) | ||
265 | { | ||
266 | case 0: | ||
267 | /* avoid skipping past 0 */ | ||
268 | --fmt; | ||
269 | NEXT(c); | ||
270 | goto string; | ||
271 | case ']': | ||
272 | if (i > 0) | ||
273 | { | ||
274 | NEXT(c); | ||
275 | goto string; | ||
276 | } | ||
277 | /* no break */ | ||
278 | default: | ||
279 | if (fmt[1] == '-' && fmt[2] | ||
280 | && f < (unsigned char)fmt[2]) | ||
281 | { | ||
282 | memset(map + f, 1, (unsigned char)fmt[2] - f); | ||
283 | fmt += 2; | ||
284 | } | ||
285 | else | ||
286 | map[f] = 1; | ||
287 | break; | ||
288 | } | ||
289 | ++fmt; | ||
290 | ++i; | ||
291 | } | ||
292 | case 's': | ||
293 | memset(map, 0, 256); | ||
294 | map[' '] = 1; | ||
295 | map['\n'] = 1; | ||
296 | map['\r'] = 1; | ||
297 | map['\t'] = 1; | ||
298 | end = 1; | ||
299 | do | ||
300 | { | ||
301 | NEXT(c); | ||
302 | } | ||
303 | while (WHITE(c)); | ||
304 | string: | ||
305 | if (assign) | ||
306 | char_ptr = va_arg(arg_ptr, char *); | ||
307 | while (width > 0 && map[(unsigned char) c] != end) | ||
308 | { | ||
309 | --width; | ||
310 | if (assign) | ||
311 | *char_ptr++ = (char) c; | ||
312 | c = *buf++; | ||
313 | if (!c) | ||
314 | break; | ||
315 | else | ||
316 | ++chars; | ||
317 | } | ||
318 | if (assign) | ||
319 | { | ||
320 | *char_ptr = 0; | ||
321 | ++count; | ||
322 | } | ||
323 | if (!c) | ||
324 | return count; | ||
325 | else | ||
326 | UNGETC(); | ||
327 | break; | ||
328 | case 'f': | ||
329 | case 'e': | ||
330 | case 'E': | ||
331 | case 'g': | ||
332 | case 'G': | ||
333 | neg = ok = FALSE; | ||
334 | dx = 0.0; | ||
335 | do | ||
336 | { | ||
337 | NEXT(c); | ||
338 | } | ||
339 | while (WHITE(c)); | ||
340 | if (c == '+') | ||
341 | { | ||
342 | NEXT(c); | ||
343 | --width; | ||
344 | } else if (c == '-') | ||
345 | { | ||
346 | neg = TRUE; | ||
347 | NEXT(c); | ||
348 | --width; | ||
349 | } | ||
350 | while (width > 0 && isdigit(c)) | ||
351 | { | ||
352 | --width; | ||
353 | dx = dx * 10.0 + (double) (c - '0'); | ||
354 | ok = TRUE; | ||
355 | c = *buf++; | ||
356 | if (!c) | ||
357 | break; | ||
358 | else | ||
359 | ++chars; | ||
360 | } | ||
361 | if (width > 0 && c == '.') | ||
362 | { | ||
363 | --width; | ||
364 | dd = 10.0; | ||
365 | NEXT(c); | ||
366 | while (width > 0 && isdigit(c)) | ||
367 | { | ||
368 | --width; | ||
369 | dx += (double) (c - '0') / dd; | ||
370 | dd *= 10.0; | ||
371 | ok = TRUE; | ||
372 | c = *buf++; | ||
373 | if (!c) | ||
374 | break; | ||
375 | else | ||
376 | ++chars; | ||
377 | } | ||
378 | } | ||
379 | if (!ok) | ||
380 | return count; | ||
381 | if (width > 0 && (c == 'e' || c == 'E')) | ||
382 | { | ||
383 | eneg = FALSE; | ||
384 | exp = 0; | ||
385 | NEXT(c); | ||
386 | --width; | ||
387 | if (width > 0 && c == '+') | ||
388 | { | ||
389 | NEXT(c); | ||
390 | --width; | ||
391 | } else if (width > 0 && c == '-') | ||
392 | { | ||
393 | eneg = TRUE; | ||
394 | NEXT(c); | ||
395 | --width; | ||
396 | } | ||
397 | if (!(width > 0 && isdigit(c))) | ||
398 | { | ||
399 | UNGETC(); | ||
400 | return count; | ||
401 | } | ||
402 | while (width > 0 && isdigit(c)) | ||
403 | { | ||
404 | --width; | ||
405 | exp = exp * 10 + (c - '0'); | ||
406 | c = *buf++; | ||
407 | if (!c) | ||
408 | break; | ||
409 | else | ||
410 | ++chars; | ||
411 | } | ||
412 | if (eneg) | ||
413 | exp = -exp; | ||
414 | while (exp > 0) | ||
415 | { | ||
416 | dx *= 10.0; | ||
417 | --exp; | ||
418 | } | ||
419 | while (exp < 0) | ||
420 | { | ||
421 | dx /= 10.0; | ||
422 | ++exp; | ||
423 | } | ||
424 | } | ||
425 | if (assign) | ||
426 | { | ||
427 | if (neg) | ||
428 | dx = -dx; | ||
429 | if (size == 'l') | ||
430 | { | ||
431 | dbl_ptr = va_arg(arg_ptr, double *); | ||
432 | *dbl_ptr = dx; | ||
433 | } | ||
434 | else | ||
435 | { | ||
436 | flt_ptr = va_arg(arg_ptr, float *); | ||
437 | *flt_ptr = (float)dx; | ||
438 | } | ||
439 | ++count; | ||
440 | } | ||
441 | if (!c) | ||
442 | return count; | ||
443 | else | ||
444 | UNGETC(); | ||
445 | break; | ||
446 | case 'i': | ||
447 | neg = FALSE; | ||
448 | radix = 10; | ||
449 | do | ||
450 | { | ||
451 | NEXT(c); | ||
452 | } | ||
453 | while (WHITE(c)); | ||
454 | if (!(width > 0 && c == '0')) | ||
455 | goto scan_complete_number; | ||
456 | NEXT(c); | ||
457 | --width; | ||
458 | if (width > 0 && (c == 'x' || c == 'X')) | ||
459 | { | ||
460 | NEXT(c); | ||
461 | radix = 16; | ||
462 | --width; | ||
463 | } | ||
464 | else if (width > 0 && (c >= '0' && c <= '7')) | ||
465 | radix = 8; | ||
466 | goto scan_unsigned_number; | ||
467 | case 'd': | ||
468 | case 'u': | ||
469 | case 'o': | ||
470 | case 'x': | ||
471 | case 'X': | ||
472 | do | ||
473 | { | ||
474 | NEXT(c); | ||
475 | } | ||
476 | while (WHITE(c)); | ||
477 | switch (f) | ||
478 | { | ||
479 | case 'o': | ||
480 | radix = 8; | ||
481 | break; | ||
482 | case 'x': | ||
483 | case 'X': | ||
484 | radix = 16; | ||
485 | break; | ||
486 | default: | ||
487 | radix = 10; | ||
488 | break; | ||
489 | } | ||
490 | scan_complete_number: | ||
491 | neg = FALSE; | ||
492 | if (width > 0 && c == '+') | ||
493 | { | ||
494 | NEXT(c); | ||
495 | --width; | ||
496 | } | ||
497 | else if (width > 0 && c == '-' && radix == 10) | ||
498 | { | ||
499 | neg = TRUE; | ||
500 | NEXT(c); | ||
501 | --width; | ||
502 | } | ||
503 | scan_unsigned_number: | ||
504 | n = 0; | ||
505 | ok = FALSE; | ||
506 | while (width > 0) | ||
507 | { | ||
508 | --width; | ||
509 | if (isdigit(c)) | ||
510 | d = c - '0'; | ||
511 | else if (isupper(c)) | ||
512 | d = c - 'A' + 10; | ||
513 | else if (islower(c)) | ||
514 | d = c - 'a' + 10; | ||
515 | else | ||
516 | break; | ||
517 | if (d < 0 || d >= radix) | ||
518 | break; | ||
519 | ok = TRUE; | ||
520 | n = n * radix + d; | ||
521 | c = *buf++; | ||
522 | if (!c) | ||
523 | break; | ||
524 | else | ||
525 | ++chars; | ||
526 | } | ||
527 | if (!ok) | ||
528 | return count; | ||
529 | if (assign) | ||
530 | { | ||
531 | if (neg) | ||
532 | n = -n; | ||
533 | switch (size) | ||
534 | { | ||
535 | case 'h': | ||
536 | short_ptr = va_arg(arg_ptr, short *); | ||
537 | *short_ptr = (short) n; | ||
538 | break; | ||
539 | case 'l': | ||
540 | long_ptr = va_arg(arg_ptr, long *); | ||
541 | *long_ptr = (long) n; | ||
542 | break; | ||
543 | default: | ||
544 | int_ptr = va_arg(arg_ptr, int *); | ||
545 | *int_ptr = (int) n; | ||
546 | } | ||
547 | ++count; | ||
548 | } | ||
549 | if (!c) | ||
550 | return count; | ||
551 | else | ||
552 | UNGETC(); | ||
553 | break; | ||
554 | case 'n': | ||
555 | if (assign) | ||
556 | { | ||
557 | int_ptr = va_arg(arg_ptr, int *); | ||
558 | *int_ptr = chars; | ||
559 | ++count; | ||
560 | } | ||
561 | break; | ||
562 | default: | ||
563 | if (!f) /* % at end of string */ | ||
564 | return count; | ||
565 | NEXT(c); | ||
566 | if (c != f) | ||
567 | return count; | ||
568 | break; | ||
569 | } | ||
570 | ++fmt; | ||
571 | } | ||
572 | } | ||
573 | return count; | ||
574 | } | ||
575 | #endif /* HAVE_VSSCANF */ |
File pdcurses/scr_dump.c added (mode: 100644) (index 00000000..e02046e5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: scr_dump.c,v 1.30 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: scr_dump | ||
10 | |||
11 | Synopsis: | ||
12 | int putwin(WINDOW *win, FILE *filep); | ||
13 | WINDOW *getwin(FILE *filep); | ||
14 | int scr_dump(const char *filename); | ||
15 | int scr_init(const char *filename); | ||
16 | int scr_restore(const char *filename); | ||
17 | int scr_set(const char *filename); | ||
18 | |||
19 | Description: | ||
20 | getwin() reads window-related data previously stored in a file | ||
21 | by putwin(). It then creates and initialises a new window using | ||
22 | that data. | ||
23 | |||
24 | putwin() writes all data associated with a window into a file, | ||
25 | using an unspecified format. This information can be retrieved | ||
26 | later using getwin(). | ||
27 | |||
28 | scr_dump() writes the current contents of the virtual screen to | ||
29 | the file named by filename in an unspecified format. | ||
30 | |||
31 | scr_restore() function sets the virtual screen to the contents | ||
32 | of the file named by filename, which must have been written | ||
33 | using scr_dump(). The next refresh operation restores the screen | ||
34 | to the way it looked in the dump file. | ||
35 | |||
36 | In PDCurses, scr_init() does nothing, and scr_set() is a synonym | ||
37 | for scr_restore(). Also, scr_dump() and scr_restore() save and | ||
38 | load from curscr. This differs from some other implementations, | ||
39 | where scr_init() works with curscr, and scr_restore() works with | ||
40 | newscr; but the effect should be the same. (PDCurses has no | ||
41 | newscr.) | ||
42 | |||
43 | Return Value: | ||
44 | On successful completion, getwin() returns a pointer to the | ||
45 | window it created. Otherwise, it returns a null pointer. Other | ||
46 | functions return OK or ERR. | ||
47 | |||
48 | Portability X/Open BSD SYS V | ||
49 | putwin Y | ||
50 | getwin Y | ||
51 | scr_dump Y | ||
52 | scr_init Y | ||
53 | scr_restore Y | ||
54 | scr_set Y | ||
55 | |||
56 | **man-end****************************************************************/ | ||
57 | |||
58 | #include <stdlib.h> | ||
59 | #include <string.h> | ||
60 | |||
61 | #define DUMPVER 1 /* Should be updated whenever the WINDOW struct is | ||
62 | changed */ | ||
63 | |||
64 | int putwin(WINDOW *win, FILE *filep) | ||
65 | { | ||
66 | static const char *marker = "PDC"; | ||
67 | static const unsigned char version = DUMPVER; | ||
68 | |||
69 | PDC_LOG(("putwin() - called\n")); | ||
70 | |||
71 | /* write the marker and the WINDOW struct */ | ||
72 | |||
73 | if (filep && fwrite(marker, strlen(marker), 1, filep) | ||
74 | && fwrite(&version, 1, 1, filep) | ||
75 | && fwrite(win, sizeof(WINDOW), 1, filep)) | ||
76 | { | ||
77 | int i; | ||
78 | |||
79 | /* write each line */ | ||
80 | |||
81 | for (i = 0; i < win->_maxy && win->_y[i]; i++) | ||
82 | if (!fwrite(win->_y[i], win->_maxx * sizeof(chtype), 1, filep)) | ||
83 | return ERR; | ||
84 | |||
85 | return OK; | ||
86 | } | ||
87 | |||
88 | return ERR; | ||
89 | } | ||
90 | |||
91 | WINDOW *getwin(FILE *filep) | ||
92 | { | ||
93 | WINDOW *win; | ||
94 | char marker[4]; | ||
95 | int i, nlines, ncols; | ||
96 | |||
97 | PDC_LOG(("getwin() - called\n")); | ||
98 | |||
99 | if ( !(win = malloc(sizeof(WINDOW))) ) | ||
100 | return (WINDOW *)NULL; | ||
101 | |||
102 | /* check for the marker, and load the WINDOW struct */ | ||
103 | |||
104 | if (!filep || !fread(marker, 4, 1, filep) || strncmp(marker, "PDC", 3) | ||
105 | || marker[3] != DUMPVER || !fread(win, sizeof(WINDOW), 1, filep)) | ||
106 | { | ||
107 | free(win); | ||
108 | return (WINDOW *)NULL; | ||
109 | } | ||
110 | |||
111 | nlines = win->_maxy; | ||
112 | ncols = win->_maxx; | ||
113 | |||
114 | /* allocate the line pointer array */ | ||
115 | |||
116 | if ( !(win->_y = malloc(nlines * sizeof(chtype *))) ) | ||
117 | { | ||
118 | free(win); | ||
119 | return (WINDOW *)NULL; | ||
120 | } | ||
121 | |||
122 | /* allocate the minchng and maxchng arrays */ | ||
123 | |||
124 | if ( !(win->_firstch = malloc(nlines * sizeof(int))) ) | ||
125 | { | ||
126 | free(win->_y); | ||
127 | free(win); | ||
128 | return (WINDOW *)NULL; | ||
129 | } | ||
130 | |||
131 | if ( !(win->_lastch = malloc(nlines * sizeof(int))) ) | ||
132 | { | ||
133 | free(win->_firstch); | ||
134 | free(win->_y); | ||
135 | free(win); | ||
136 | return (WINDOW *)NULL; | ||
137 | } | ||
138 | |||
139 | /* allocate the lines */ | ||
140 | |||
141 | if ( !(win = PDC_makelines(win)) ) | ||
142 | return (WINDOW *)NULL; | ||
143 | |||
144 | /* read them */ | ||
145 | |||
146 | for (i = 0; i < nlines; i++) | ||
147 | { | ||
148 | if (!fread(win->_y[i], ncols * sizeof(chtype), 1, filep)) | ||
149 | { | ||
150 | delwin(win); | ||
151 | return (WINDOW *)NULL; | ||
152 | } | ||
153 | } | ||
154 | |||
155 | touchwin(win); | ||
156 | |||
157 | return win; | ||
158 | } | ||
159 | |||
160 | int scr_dump(const char *filename) | ||
161 | { | ||
162 | FILE *filep; | ||
163 | |||
164 | PDC_LOG(("scr_dump() - called: filename %s\n", filename)); | ||
165 | |||
166 | if (filename && (filep = fopen(filename, "wb")) != NULL) | ||
167 | { | ||
168 | int result = putwin(curscr, filep); | ||
169 | fclose(filep); | ||
170 | return result; | ||
171 | } | ||
172 | |||
173 | return ERR; | ||
174 | } | ||
175 | |||
176 | int scr_init(const char *filename) | ||
177 | { | ||
178 | PDC_LOG(("scr_init() - called: filename %s\n", filename)); | ||
179 | |||
180 | return OK; | ||
181 | } | ||
182 | |||
183 | int scr_restore(const char *filename) | ||
184 | { | ||
185 | FILE *filep; | ||
186 | |||
187 | PDC_LOG(("scr_restore() - called: filename %s\n", filename)); | ||
188 | |||
189 | if (filename && (filep = fopen(filename, "rb")) != NULL) | ||
190 | { | ||
191 | WINDOW *replacement = getwin(filep); | ||
192 | fclose(filep); | ||
193 | |||
194 | if (replacement) | ||
195 | { | ||
196 | int result = overwrite(replacement, curscr); | ||
197 | delwin(replacement); | ||
198 | return result; | ||
199 | } | ||
200 | } | ||
201 | |||
202 | return ERR; | ||
203 | } | ||
204 | |||
205 | int scr_set(const char *filename) | ||
206 | { | ||
207 | PDC_LOG(("scr_set() - called: filename %s\n", filename)); | ||
208 | |||
209 | return scr_restore(filename); | ||
210 | } |
File pdcurses/scroll.c added (mode: 100644) (index 00000000..c53e2954) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: scroll.c,v 1.36 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: scroll | ||
10 | |||
11 | Synopsis: | ||
12 | int scroll(WINDOW *win); | ||
13 | int scrl(int n); | ||
14 | int wscrl(WINDOW *win, int n); | ||
15 | |||
16 | Description: | ||
17 | scroll() causes the window to scroll up one line. This involves | ||
18 | moving the lines in the window data strcture. | ||
19 | |||
20 | With a positive n, scrl() and wscrl() scroll the window up n | ||
21 | lines (line i + n becomes i); otherwise they scroll the window | ||
22 | down n lines. | ||
23 | |||
24 | For these functions to work, scrolling must be enabled via | ||
25 | scrollok(). Note also that scrolling is not allowed if the | ||
26 | supplied window is a pad. | ||
27 | |||
28 | Return Value: | ||
29 | All functions return OK on success and ERR on error. | ||
30 | |||
31 | Portability X/Open BSD SYS V | ||
32 | scroll Y Y Y | ||
33 | scrl Y - 4.0 | ||
34 | wscrl Y - 4.0 | ||
35 | |||
36 | **man-end****************************************************************/ | ||
37 | |||
38 | int wscrl(WINDOW *win, int n) | ||
39 | { | ||
40 | int i, l, dir, start, end; | ||
41 | chtype blank, *temp; | ||
42 | |||
43 | /* Check if window scrolls. Valid for window AND pad */ | ||
44 | |||
45 | if (!win || !win->_scroll || !n) | ||
46 | return ERR; | ||
47 | |||
48 | blank = win->_bkgd; | ||
49 | |||
50 | if (n > 0) | ||
51 | { | ||
52 | start = win->_tmarg; | ||
53 | end = win->_bmarg; | ||
54 | dir = 1; | ||
55 | } | ||
56 | else | ||
57 | { | ||
58 | start = win->_bmarg; | ||
59 | end = win->_tmarg; | ||
60 | dir = -1; | ||
61 | } | ||
62 | |||
63 | for (l = 0; l < (n * dir); l++) | ||
64 | { | ||
65 | temp = win->_y[start]; | ||
66 | |||
67 | /* re-arrange line pointers */ | ||
68 | |||
69 | for (i = start; i != end; i += dir) | ||
70 | win->_y[i] = win->_y[i + dir]; | ||
71 | |||
72 | win->_y[end] = temp; | ||
73 | |||
74 | /* make a blank line */ | ||
75 | |||
76 | for (i = 0; i < win->_maxx; i++) | ||
77 | *temp++ = blank; | ||
78 | } | ||
79 | |||
80 | touchline(win, win->_tmarg, win->_bmarg - win->_tmarg + 1); | ||
81 | |||
82 | PDC_sync(win); | ||
83 | return OK; | ||
84 | } | ||
85 | |||
86 | int scrl(int n) | ||
87 | { | ||
88 | PDC_LOG(("scrl() - called\n")); | ||
89 | |||
90 | return wscrl(stdscr, n); | ||
91 | } | ||
92 | |||
93 | int scroll(WINDOW *win) | ||
94 | { | ||
95 | PDC_LOG(("scroll() - called\n")); | ||
96 | |||
97 | return wscrl(win, 1); | ||
98 | } |
File pdcurses/slk.c added (mode: 100644) (index 00000000..f97f406e) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: slk.c,v 1.61 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: slk | ||
10 | |||
11 | Synopsis: | ||
12 | int slk_init(int fmt); | ||
13 | int slk_set(int labnum, const char *label, int justify); | ||
14 | int slk_refresh(void); | ||
15 | int slk_noutrefresh(void); | ||
16 | char *slk_label(int labnum); | ||
17 | int slk_clear(void); | ||
18 | int slk_restore(void); | ||
19 | int slk_touch(void); | ||
20 | int slk_attron(const chtype attrs); | ||
21 | int slk_attr_on(const attr_t attrs, void *opts); | ||
22 | int slk_attrset(const chtype attrs); | ||
23 | int slk_attr_set(const attr_t attrs, short color_pair, void *opts); | ||
24 | int slk_attroff(const chtype attrs); | ||
25 | int slk_attr_off(const attr_t attrs, void *opts); | ||
26 | int slk_color(short color_pair); | ||
27 | |||
28 | int slk_wset(int labnum, const wchar_t *label, int justify); | ||
29 | |||
30 | int PDC_mouse_in_slk(int y, int x); | ||
31 | void PDC_slk_free(void); | ||
32 | void PDC_slk_initialize(void); | ||
33 | |||
34 | wchar_t *slk_wlabel(int labnum) | ||
35 | |||
36 | Description: | ||
37 | These functions manipulate a window that contain Soft Label Keys | ||
38 | (SLK). To use the SLK functions, a call to slk_init() must be | ||
39 | made BEFORE initscr() or newterm(). slk_init() removes 1 or 2 | ||
40 | lines from the useable screen, depending on the format selected. | ||
41 | |||
42 | The line(s) removed from the screen are used as a separate | ||
43 | window, in which SLKs are displayed. | ||
44 | |||
45 | slk_init() requires a single parameter which describes the | ||
46 | format of the SLKs as follows: | ||
47 | |||
48 | 0 3-2-3 format | ||
49 | 1 4-4 format | ||
50 | 2 4-4-4 format (ncurses extension) | ||
51 | 3 4-4-4 format with index line (ncurses extension) | ||
52 | 2 lines used | ||
53 | 55 5-5 format (pdcurses format) | ||
54 | |||
55 | slk_refresh(), slk_noutrefresh() and slk_touch() are analogous | ||
56 | to refresh(), noutrefresh() and touch(). | ||
57 | |||
58 | Return Value: | ||
59 | All functions return OK on success and ERR on error. | ||
60 | |||
61 | Portability X/Open BSD SYS V | ||
62 | slk_init Y - Y | ||
63 | slk_set Y - Y | ||
64 | slk_refresh Y - Y | ||
65 | slk_noutrefresh Y - Y | ||
66 | slk_label Y - Y | ||
67 | slk_clear Y - Y | ||
68 | slk_restore Y - Y | ||
69 | slk_touch Y - Y | ||
70 | slk_attron Y - Y | ||
71 | slk_attrset Y - Y | ||
72 | slk_attroff Y - Y | ||
73 | slk_attr_on Y | ||
74 | slk_attr_set Y | ||
75 | slk_attr_off Y | ||
76 | slk_wset Y | ||
77 | PDC_mouse_in_slk - - - | ||
78 | PDC_slk_free - - - | ||
79 | PDC_slk_initialize - - - | ||
80 | slk_wlabel - - - | ||
81 | |||
82 | **man-end****************************************************************/ | ||
83 | |||
84 | #include <stdlib.h> | ||
85 | |||
86 | enum { LABEL_NORMAL = 8, LABEL_EXTENDED = 10, LABEL_NCURSES_EXTENDED = 12 }; | ||
87 | |||
88 | static int label_length = 0; | ||
89 | static int labels = 0; | ||
90 | static int label_fmt = 0; | ||
91 | static int label_line = 0; | ||
92 | static bool hidden = FALSE; | ||
93 | |||
94 | static struct SLK { | ||
95 | chtype label[32]; | ||
96 | int len; | ||
97 | int format; | ||
98 | int start_col; | ||
99 | } *slk = (struct SLK *)NULL; | ||
100 | |||
101 | /* slk_init() is the slk initialization routine. | ||
102 | This must be called before initscr(). | ||
103 | |||
104 | label_fmt = 0, 1 or 55. | ||
105 | 0 = 3-2-3 format | ||
106 | 1 = 4 - 4 format | ||
107 | 2 = 4-4-4 format (ncurses extension for PC 12 function keys) | ||
108 | 3 = 4-4-4 format (ncurses extension for PC 12 function keys - | ||
109 | with index line) | ||
110 | 55 = 5 - 5 format (extended for PC, 10 function keys) */ | ||
111 | |||
112 | int slk_init(int fmt) | ||
113 | { | ||
114 | PDC_LOG(("slk_init() - called\n")); | ||
115 | |||
116 | if (SP) | ||
117 | return ERR; | ||
118 | |||
119 | switch (fmt) | ||
120 | { | ||
121 | case 0: /* 3 - 2 - 3 */ | ||
122 | labels = LABEL_NORMAL; | ||
123 | break; | ||
124 | |||
125 | case 1: /* 4 - 4 */ | ||
126 | labels = LABEL_NORMAL; | ||
127 | break; | ||
128 | |||
129 | case 2: /* 4 4 4 */ | ||
130 | labels = LABEL_NCURSES_EXTENDED; | ||
131 | break; | ||
132 | |||
133 | case 3: /* 4 4 4 with index */ | ||
134 | labels = LABEL_NCURSES_EXTENDED; | ||
135 | break; | ||
136 | |||
137 | case 55: /* 5 - 5 */ | ||
138 | labels = LABEL_EXTENDED; | ||
139 | break; | ||
140 | |||
141 | default: | ||
142 | return ERR; | ||
143 | } | ||
144 | |||
145 | label_fmt = fmt; | ||
146 | |||
147 | slk = calloc(labels, sizeof(struct SLK)); | ||
148 | |||
149 | if (!slk) | ||
150 | labels = 0; | ||
151 | |||
152 | return slk ? OK : ERR; | ||
153 | } | ||
154 | |||
155 | /* draw a single button */ | ||
156 | |||
157 | static void _drawone(int num) | ||
158 | { | ||
159 | int i, col, slen; | ||
160 | |||
161 | if (hidden) | ||
162 | return; | ||
163 | |||
164 | slen = slk[num].len; | ||
165 | |||
166 | switch (slk[num].format) | ||
167 | { | ||
168 | case 0: /* LEFT */ | ||
169 | col = 0; | ||
170 | break; | ||
171 | |||
172 | case 1: /* CENTER */ | ||
173 | col = (label_length - slen) / 2; | ||
174 | |||
175 | if (col + slen > label_length) | ||
176 | --col; | ||
177 | break; | ||
178 | |||
179 | default: /* RIGHT */ | ||
180 | col = label_length - slen; | ||
181 | } | ||
182 | |||
183 | wmove(SP->slk_winptr, label_line, slk[num].start_col); | ||
184 | |||
185 | for (i = 0; i < label_length; ++i) | ||
186 | waddch(SP->slk_winptr, (i >= col && i < (col + slen)) ? | ||
187 | slk[num].label[i - col] : ' '); | ||
188 | } | ||
189 | |||
190 | /* redraw each button */ | ||
191 | |||
192 | static void _redraw(void) | ||
193 | { | ||
194 | int i; | ||
195 | |||
196 | for (i = 0; i < labels; ++i) | ||
197 | _drawone(i); | ||
198 | } | ||
199 | |||
200 | /* slk_set() Used to set a slk label to a string. | ||
201 | |||
202 | labnum = 1 - 8 (or 10) (number of the label) | ||
203 | label = string (8 or 7 bytes total), or NULL | ||
204 | justify = 0 : left, 1 : center, 2 : right */ | ||
205 | |||
206 | int slk_set(int labnum, const char *label, int justify) | ||
207 | { | ||
208 | #ifdef PDC_WIDE | ||
209 | wchar_t wlabel[32]; | ||
210 | |||
211 | PDC_mbstowcs(wlabel, label, 31); | ||
212 | return slk_wset(labnum, wlabel, justify); | ||
213 | #else | ||
214 | PDC_LOG(("slk_set() - called\n")); | ||
215 | |||
216 | if (labnum < 1 || labnum > labels || justify < 0 || justify > 2) | ||
217 | return ERR; | ||
218 | |||
219 | labnum--; | ||
220 | |||
221 | if (!label || !(*label)) | ||
222 | { | ||
223 | /* Clear the label */ | ||
224 | |||
225 | *slk[labnum].label = 0; | ||
226 | slk[labnum].format = 0; | ||
227 | slk[labnum].len = 0; | ||
228 | } | ||
229 | else | ||
230 | { | ||
231 | int i, j = 0; | ||
232 | |||
233 | /* Skip leading spaces */ | ||
234 | |||
235 | while (label[j] == ' ') | ||
236 | j++; | ||
237 | |||
238 | /* Copy it */ | ||
239 | |||
240 | for (i = 0; i < label_length; i++) | ||
241 | { | ||
242 | chtype ch = label[i + j]; | ||
243 | |||
244 | slk[labnum].label[i] = ch; | ||
245 | |||
246 | if (!ch) | ||
247 | break; | ||
248 | } | ||
249 | |||
250 | /* Drop trailing spaces */ | ||
251 | |||
252 | while ((i + j) && (label[i + j - 1] == ' ')) | ||
253 | i--; | ||
254 | |||
255 | slk[labnum].label[i] = 0; | ||
256 | slk[labnum].format = justify; | ||
257 | slk[labnum].len = i; | ||
258 | } | ||
259 | |||
260 | _drawone(labnum); | ||
261 | |||
262 | return OK; | ||
263 | #endif | ||
264 | } | ||
265 | |||
266 | int slk_refresh(void) | ||
267 | { | ||
268 | PDC_LOG(("slk_refresh() - called\n")); | ||
269 | |||
270 | return (slk_noutrefresh() == ERR) ? ERR : doupdate(); | ||
271 | } | ||
272 | |||
273 | int slk_noutrefresh(void) | ||
274 | { | ||
275 | PDC_LOG(("slk_noutrefresh() - called\n")); | ||
276 | |||
277 | return wnoutrefresh(SP->slk_winptr); | ||
278 | } | ||
279 | |||
280 | char *slk_label(int labnum) | ||
281 | { | ||
282 | static char temp[33]; | ||
283 | #ifdef PDC_WIDE | ||
284 | wchar_t *wtemp = slk_wlabel(labnum); | ||
285 | |||
286 | PDC_wcstombs(temp, wtemp, 32); | ||
287 | #else | ||
288 | chtype *p; | ||
289 | int i; | ||
290 | |||
291 | PDC_LOG(("slk_label() - called\n")); | ||
292 | |||
293 | if (labnum < 1 || labnum > labels) | ||
294 | return (char *)0; | ||
295 | |||
296 | for (i = 0, p = slk[labnum - 1].label; *p; i++) | ||
297 | temp[i] = *p++; | ||
298 | |||
299 | temp[i] = '\0'; | ||
300 | #endif | ||
301 | return temp; | ||
302 | } | ||
303 | |||
304 | int slk_clear(void) | ||
305 | { | ||
306 | PDC_LOG(("slk_clear() - called\n")); | ||
307 | |||
308 | hidden = TRUE; | ||
309 | werase(SP->slk_winptr); | ||
310 | return wrefresh(SP->slk_winptr); | ||
311 | } | ||
312 | |||
313 | int slk_restore(void) | ||
314 | { | ||
315 | PDC_LOG(("slk_restore() - called\n")); | ||
316 | |||
317 | hidden = FALSE; | ||
318 | _redraw(); | ||
319 | return wrefresh(SP->slk_winptr); | ||
320 | } | ||
321 | |||
322 | int slk_touch(void) | ||
323 | { | ||
324 | PDC_LOG(("slk_touch() - called\n")); | ||
325 | |||
326 | return touchwin(SP->slk_winptr); | ||
327 | } | ||
328 | |||
329 | int slk_attron(const chtype attrs) | ||
330 | { | ||
331 | int rc; | ||
332 | |||
333 | PDC_LOG(("slk_attron() - called\n")); | ||
334 | |||
335 | rc = wattron(SP->slk_winptr, attrs); | ||
336 | _redraw(); | ||
337 | |||
338 | return rc; | ||
339 | } | ||
340 | |||
341 | int slk_attr_on(const attr_t attrs, void *opts) | ||
342 | { | ||
343 | PDC_LOG(("slk_attr_on() - called\n")); | ||
344 | |||
345 | return slk_attron(attrs); | ||
346 | } | ||
347 | |||
348 | int slk_attroff(const chtype attrs) | ||
349 | { | ||
350 | int rc; | ||
351 | |||
352 | PDC_LOG(("slk_attroff() - called\n")); | ||
353 | |||
354 | rc = wattroff(SP->slk_winptr, attrs); | ||
355 | _redraw(); | ||
356 | |||
357 | return rc; | ||
358 | } | ||
359 | |||
360 | int slk_attr_off(const attr_t attrs, void *opts) | ||
361 | { | ||
362 | PDC_LOG(("slk_attr_off() - called\n")); | ||
363 | |||
364 | return slk_attroff(attrs); | ||
365 | } | ||
366 | |||
367 | int slk_attrset(const chtype attrs) | ||
368 | { | ||
369 | int rc; | ||
370 | |||
371 | PDC_LOG(("slk_attrset() - called\n")); | ||
372 | |||
373 | rc = wattrset(SP->slk_winptr, attrs); | ||
374 | _redraw(); | ||
375 | |||
376 | return rc; | ||
377 | } | ||
378 | |||
379 | int slk_color(short color_pair) | ||
380 | { | ||
381 | int rc; | ||
382 | |||
383 | PDC_LOG(("slk_color() - called\n")); | ||
384 | |||
385 | rc = wcolor_set(SP->slk_winptr, color_pair, NULL); | ||
386 | _redraw(); | ||
387 | |||
388 | return rc; | ||
389 | } | ||
390 | |||
391 | int slk_attr_set(const attr_t attrs, short color_pair, void *opts) | ||
392 | { | ||
393 | PDC_LOG(("slk_attr_set() - called\n")); | ||
394 | |||
395 | return slk_attrset(attrs | COLOR_PAIR(color_pair)); | ||
396 | } | ||
397 | |||
398 | static void _slk_calc(void) | ||
399 | { | ||
400 | int i, center, col = 0; | ||
401 | label_length = COLS / labels; | ||
402 | |||
403 | if (label_length > 31) | ||
404 | label_length = 31; | ||
405 | |||
406 | switch (label_fmt) | ||
407 | { | ||
408 | case 0: /* 3 - 2 - 3 F-Key layout */ | ||
409 | |||
410 | --label_length; | ||
411 | |||
412 | slk[0].start_col = col; | ||
413 | slk[1].start_col = (col += label_length); | ||
414 | slk[2].start_col = (col += label_length); | ||
415 | |||
416 | center = COLS / 2; | ||
417 | |||
418 | slk[3].start_col = center - label_length + 1; | ||
419 | slk[4].start_col = center + 1; | ||
420 | |||
421 | col = COLS - (label_length * 3) + 1; | ||
422 | |||
423 | slk[5].start_col = col; | ||
424 | slk[6].start_col = (col += label_length); | ||
425 | slk[7].start_col = (col += label_length); | ||
426 | break; | ||
427 | |||
428 | case 1: /* 4 - 4 F-Key layout */ | ||
429 | |||
430 | for (i = 0; i < 8; i++) | ||
431 | { | ||
432 | slk[i].start_col = col; | ||
433 | col += label_length; | ||
434 | |||
435 | if (i == 3) | ||
436 | col = COLS - (label_length * 4) + 1; | ||
437 | } | ||
438 | |||
439 | break; | ||
440 | |||
441 | case 2: /* 4 4 4 F-Key layout */ | ||
442 | case 3: /* 4 4 4 F-Key layout with index */ | ||
443 | |||
444 | for (i = 0; i < 4; i++) | ||
445 | { | ||
446 | slk[i].start_col = col; | ||
447 | col += label_length; | ||
448 | } | ||
449 | |||
450 | center = COLS/2; | ||
451 | |||
452 | slk[4].start_col = center - (label_length * 2) + 1; | ||
453 | slk[5].start_col = center - label_length - 1; | ||
454 | slk[6].start_col = center + 1; | ||
455 | slk[7].start_col = center + label_length + 1; | ||
456 | |||
457 | col = COLS - (label_length * 4) + 1; | ||
458 | |||
459 | for (i = 8; i < 12; i++) | ||
460 | { | ||
461 | slk[i].start_col = col; | ||
462 | col += label_length; | ||
463 | } | ||
464 | |||
465 | break; | ||
466 | |||
467 | default: /* 5 - 5 F-Key layout */ | ||
468 | |||
469 | for (i = 0; i < 10; i++) | ||
470 | { | ||
471 | slk[i].start_col = col; | ||
472 | col += label_length; | ||
473 | |||
474 | if (i == 4) | ||
475 | col = COLS - (label_length * 5) + 1; | ||
476 | } | ||
477 | } | ||
478 | |||
479 | --label_length; | ||
480 | |||
481 | /* make sure labels are all in window */ | ||
482 | |||
483 | _redraw(); | ||
484 | } | ||
485 | |||
486 | void PDC_slk_initialize(void) | ||
487 | { | ||
488 | if (slk) | ||
489 | { | ||
490 | if (label_fmt == 3) | ||
491 | { | ||
492 | SP->slklines = 2; | ||
493 | label_line = 1; | ||
494 | } | ||
495 | else | ||
496 | SP->slklines = 1; | ||
497 | |||
498 | if (!SP->slk_winptr) | ||
499 | { | ||
500 | if ( !(SP->slk_winptr = newwin(SP->slklines, COLS, | ||
501 | LINES - SP->slklines, 0)) ) | ||
502 | return; | ||
503 | |||
504 | wattrset(SP->slk_winptr, A_REVERSE); | ||
505 | } | ||
506 | |||
507 | _slk_calc(); | ||
508 | |||
509 | /* if we have an index line, display it now */ | ||
510 | |||
511 | if (label_fmt == 3) | ||
512 | { | ||
513 | chtype save_attr; | ||
514 | int i; | ||
515 | |||
516 | save_attr = SP->slk_winptr->_attrs; | ||
517 | wattrset(SP->slk_winptr, A_NORMAL); | ||
518 | wmove(SP->slk_winptr, 0, 0); | ||
519 | whline(SP->slk_winptr, 0, COLS); | ||
520 | |||
521 | for (i = 0; i < labels; i++) | ||
522 | mvwprintw(SP->slk_winptr, 0, slk[i].start_col, "F%d", i + 1); | ||
523 | |||
524 | SP->slk_winptr->_attrs = save_attr; | ||
525 | } | ||
526 | |||
527 | touchwin(SP->slk_winptr); | ||
528 | } | ||
529 | } | ||
530 | |||
531 | void PDC_slk_free(void) | ||
532 | { | ||
533 | if (slk) | ||
534 | { | ||
535 | if (SP->slk_winptr) | ||
536 | { | ||
537 | delwin(SP->slk_winptr); | ||
538 | SP->slk_winptr = (WINDOW *)NULL; | ||
539 | } | ||
540 | |||
541 | free(slk); | ||
542 | slk = (struct SLK *)NULL; | ||
543 | |||
544 | label_length = 0; | ||
545 | labels = 0; | ||
546 | label_fmt = 0; | ||
547 | label_line = 0; | ||
548 | hidden = FALSE; | ||
549 | } | ||
550 | } | ||
551 | |||
552 | int PDC_mouse_in_slk(int y, int x) | ||
553 | { | ||
554 | int i; | ||
555 | |||
556 | PDC_LOG(("PDC_mouse_in_slk() - called: y->%d x->%d\n", y, x)); | ||
557 | |||
558 | /* If the line on which the mouse was clicked is NOT the last line | ||
559 | of the screen, we are not interested in it. */ | ||
560 | |||
561 | if (!slk || !SP->slk_winptr || (y != SP->slk_winptr->_begy + label_line)) | ||
562 | return 0; | ||
563 | |||
564 | for (i = 0; i < labels; i++) | ||
565 | if (x >= slk[i].start_col && x < (slk[i].start_col + label_length)) | ||
566 | return i + 1; | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
571 | #ifdef PDC_WIDE | ||
572 | int slk_wset(int labnum, const wchar_t *label, int justify) | ||
573 | { | ||
574 | PDC_LOG(("slk_wset() - called\n")); | ||
575 | |||
576 | if (labnum < 1 || labnum > labels || justify < 0 || justify > 2) | ||
577 | return ERR; | ||
578 | |||
579 | labnum--; | ||
580 | |||
581 | if (!label || !(*label)) | ||
582 | { | ||
583 | /* Clear the label */ | ||
584 | |||
585 | *slk[labnum].label = 0; | ||
586 | slk[labnum].format = 0; | ||
587 | slk[labnum].len = 0; | ||
588 | } | ||
589 | else | ||
590 | { | ||
591 | int i, j = 0; | ||
592 | |||
593 | /* Skip leading spaces */ | ||
594 | |||
595 | while (label[j] == L' ') | ||
596 | j++; | ||
597 | |||
598 | /* Copy it */ | ||
599 | |||
600 | for (i = 0; i < label_length; i++) | ||
601 | { | ||
602 | chtype ch = label[i + j]; | ||
603 | |||
604 | slk[labnum].label[i] = ch; | ||
605 | |||
606 | if (!ch) | ||
607 | break; | ||
608 | } | ||
609 | |||
610 | /* Drop trailing spaces */ | ||
611 | |||
612 | while ((i + j) && (label[i + j - 1] == L' ')) | ||
613 | i--; | ||
614 | |||
615 | slk[labnum].label[i] = 0; | ||
616 | slk[labnum].format = justify; | ||
617 | slk[labnum].len = i; | ||
618 | } | ||
619 | |||
620 | _drawone(labnum); | ||
621 | |||
622 | return OK; | ||
623 | } | ||
624 | |||
625 | wchar_t *slk_wlabel(int labnum) | ||
626 | { | ||
627 | static wchar_t temp[33]; | ||
628 | chtype *p; | ||
629 | int i; | ||
630 | |||
631 | PDC_LOG(("slk_wlabel() - called\n")); | ||
632 | |||
633 | if (labnum < 1 || labnum > labels) | ||
634 | return (wchar_t *)0; | ||
635 | |||
636 | for (i = 0, p = slk[labnum - 1].label; *p; i++) | ||
637 | temp[i] = *p++; | ||
638 | |||
639 | temp[i] = '\0'; | ||
640 | |||
641 | return temp; | ||
642 | } | ||
643 | #endif |
File pdcurses/termattr.c added (mode: 100644) (index 00000000..06e9ee85) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: termattr.c,v 1.54 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: termattr | ||
10 | |||
11 | Synopsis: | ||
12 | int baudrate(void); | ||
13 | char erasechar(void); | ||
14 | bool has_ic(void); | ||
15 | bool has_il(void); | ||
16 | char killchar(void); | ||
17 | char *longname(void); | ||
18 | chtype termattrs(void); | ||
19 | attr_t term_attrs(void); | ||
20 | char *termname(void); | ||
21 | |||
22 | int erasewchar(wchar_t *ch); | ||
23 | int killwchar(wchar_t *ch); | ||
24 | |||
25 | char wordchar(void); | ||
26 | |||
27 | Description: | ||
28 | baudrate() is supposed to return the output speed of the | ||
29 | terminal. In PDCurses, it simply returns INT_MAX. | ||
30 | |||
31 | has_ic and has_il() return TRUE. These functions have meaning in | ||
32 | some other implementations of curses. | ||
33 | |||
34 | erasechar() and killchar() return ^H and ^U, respectively -- the | ||
35 | ERASE and KILL characters. In other curses implementations, | ||
36 | these may vary by terminal type. erasewchar() and killwchar() | ||
37 | are the wide-character versions; they take a pointer to a | ||
38 | location in which to store the character, and return OK or ERR. | ||
39 | |||
40 | longname() returns a pointer to a static area containing a | ||
41 | verbose description of the current terminal. The maximum length | ||
42 | of the string is 128 characters. It is defined only after the | ||
43 | call to initscr() or newterm(). | ||
44 | |||
45 | termname() returns a pointer to a static area containing a | ||
46 | short description of the current terminal (14 characters). | ||
47 | |||
48 | termattrs() returns a logical OR of all video attributes | ||
49 | supported by the terminal. | ||
50 | |||
51 | wordchar() is a PDCurses extension of the concept behind the | ||
52 | functions erasechar() and killchar(), returning the "delete | ||
53 | word" character, ^W. | ||
54 | |||
55 | Portability X/Open BSD SYS V | ||
56 | baudrate Y Y Y | ||
57 | erasechar Y Y Y | ||
58 | has_ic Y Y Y | ||
59 | has_il Y Y Y | ||
60 | killchar Y Y Y | ||
61 | longname Y Y Y | ||
62 | termattrs Y Y Y | ||
63 | termname Y Y Y | ||
64 | erasewchar Y | ||
65 | killwchar Y | ||
66 | term_attrs Y | ||
67 | wordchar - - - | ||
68 | |||
69 | **man-end****************************************************************/ | ||
70 | |||
71 | #include <string.h> | ||
72 | #include <limits.h> | ||
73 | |||
74 | int baudrate(void) | ||
75 | { | ||
76 | PDC_LOG(("baudrate() - called\n")); | ||
77 | |||
78 | return INT_MAX; | ||
79 | } | ||
80 | |||
81 | char erasechar(void) | ||
82 | { | ||
83 | PDC_LOG(("erasechar() - called\n")); | ||
84 | |||
85 | return _ECHAR; /* character delete char (^H) */ | ||
86 | } | ||
87 | |||
88 | bool has_ic(void) | ||
89 | { | ||
90 | PDC_LOG(("has_ic() - called\n")); | ||
91 | |||
92 | return TRUE; | ||
93 | } | ||
94 | |||
95 | bool has_il(void) | ||
96 | { | ||
97 | PDC_LOG(("has_il() - called\n")); | ||
98 | |||
99 | return TRUE; | ||
100 | } | ||
101 | |||
102 | char killchar(void) | ||
103 | { | ||
104 | PDC_LOG(("killchar() - called\n")); | ||
105 | |||
106 | return _DLCHAR; /* line delete char (^U) */ | ||
107 | } | ||
108 | |||
109 | char *longname(void) | ||
110 | { | ||
111 | PDC_LOG(("longname() - called\n")); | ||
112 | |||
113 | return ttytype + 9; /* skip "pdcurses|" */ | ||
114 | } | ||
115 | |||
116 | chtype termattrs(void) | ||
117 | { | ||
118 | chtype temp = A_BLINK | A_BOLD | A_INVIS | A_REVERSE | A_UNDERLINE; | ||
119 | |||
120 | /* note: blink is bold background on some platforms */ | ||
121 | |||
122 | PDC_LOG(("termattrs() - called\n")); | ||
123 | |||
124 | if (!SP->mono) | ||
125 | temp |= A_COLOR; | ||
126 | |||
127 | return temp; | ||
128 | } | ||
129 | |||
130 | attr_t term_attrs(void) | ||
131 | { | ||
132 | PDC_LOG(("term_attrs() - called\n")); | ||
133 | |||
134 | return WA_BLINK | WA_BOLD | WA_INVIS | WA_LEFT | WA_REVERSE | | ||
135 | WA_RIGHT | WA_UNDERLINE; | ||
136 | } | ||
137 | |||
138 | char *termname(void) | ||
139 | { | ||
140 | PDC_LOG(("termname() - called\n")); | ||
141 | |||
142 | return "pdcurses"; | ||
143 | } | ||
144 | |||
145 | char wordchar(void) | ||
146 | { | ||
147 | PDC_LOG(("wordchar() - called\n")); | ||
148 | |||
149 | return _DWCHAR; /* word delete char */ | ||
150 | } | ||
151 | |||
152 | #ifdef PDC_WIDE | ||
153 | int erasewchar(wchar_t *ch) | ||
154 | { | ||
155 | PDC_LOG(("erasewchar() - called\n")); | ||
156 | |||
157 | if (!ch) | ||
158 | return ERR; | ||
159 | |||
160 | *ch = (wchar_t)_ECHAR; | ||
161 | |||
162 | return OK; | ||
163 | } | ||
164 | |||
165 | int killwchar(wchar_t *ch) | ||
166 | { | ||
167 | PDC_LOG(("killwchar() - called\n")); | ||
168 | |||
169 | if (!ch) | ||
170 | return ERR; | ||
171 | |||
172 | *ch = (wchar_t)_DLCHAR; | ||
173 | |||
174 | return OK; | ||
175 | } | ||
176 | #endif |
File pdcurses/terminfo.c added (mode: 100644) (index 00000000..c099ada7) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: terminfo.c,v 1.37 2008/07/21 12:29:20 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: terminfo | ||
10 | |||
11 | Synopsis: | ||
12 | int mvcur(int oldrow, int oldcol, int newrow, int newcol); | ||
13 | int vidattr(chtype attr); | ||
14 | int vid_attr(attr_t attr, short color_pair, void *opt); | ||
15 | int vidputs(chtype attr, int (*putfunc)(int)); | ||
16 | int vid_puts(attr_t attr, short color_pair, void *opt, | ||
17 | int (*putfunc)(int)); | ||
18 | |||
19 | int del_curterm(TERMINAL *); | ||
20 | int putp(const char *); | ||
21 | int restartterm(const char *, int, int *); | ||
22 | TERMINAL *set_curterm(TERMINAL *); | ||
23 | int setterm(const char *term); | ||
24 | int setupterm(const char *, int, int *); | ||
25 | int tgetent(char *, const char *); | ||
26 | int tgetflag(const char *); | ||
27 | int tgetnum(const char *); | ||
28 | char *tgetstr(const char *, char **); | ||
29 | char *tgoto(const char *, int, int); | ||
30 | int tigetflag(const char *); | ||
31 | int tigetnum(const char *); | ||
32 | char *tigetstr(const char *); | ||
33 | char *tparm(const char *,long, long, long, long, long, long, | ||
34 | long, long, long); | ||
35 | int tputs(const char *, int, int (*)(int)); | ||
36 | |||
37 | Description: | ||
38 | mvcur() lets you move the physical cursor without updating any | ||
39 | window cursor positions. It returns OK or ERR. | ||
40 | |||
41 | The rest of these functions are currently implemented as stubs, | ||
42 | returning the appropriate errors and doing nothing else. | ||
43 | |||
44 | Portability X/Open BSD SYS V | ||
45 | mvcur Y Y Y | ||
46 | |||
47 | **man-end****************************************************************/ | ||
48 | |||
49 | #include <term.h> | ||
50 | |||
51 | TERMINAL *cur_term = NULL; | ||
52 | |||
53 | int mvcur(int oldrow, int oldcol, int newrow, int newcol) | ||
54 | { | ||
55 | PDC_LOG(("mvcur() - called: oldrow %d oldcol %d newrow %d newcol %d\n", | ||
56 | oldrow, oldcol, newrow, newcol)); | ||
57 | |||
58 | if ((newrow >= LINES) || (newcol >= COLS) || (newrow < 0) || (newcol < 0)) | ||
59 | return ERR; | ||
60 | |||
61 | PDC_gotoyx(newrow, newcol); | ||
62 | SP->cursrow = newrow; | ||
63 | SP->curscol = newcol; | ||
64 | |||
65 | return OK; | ||
66 | } | ||
67 | |||
68 | int vidattr(chtype attr) | ||
69 | { | ||
70 | PDC_LOG(("vidattr() - called: attr %d\n", attr)); | ||
71 | |||
72 | return ERR; | ||
73 | } | ||
74 | |||
75 | int vid_attr(attr_t attr, short color_pair, void *opt) | ||
76 | { | ||
77 | PDC_LOG(("vid_attr() - called\n")); | ||
78 | |||
79 | return ERR; | ||
80 | } | ||
81 | |||
82 | int vidputs(chtype attr, int (*putfunc)(int)) | ||
83 | { | ||
84 | PDC_LOG(("vidputs() - called: attr %d\n", attr)); | ||
85 | |||
86 | return ERR; | ||
87 | } | ||
88 | |||
89 | int vid_puts(attr_t attr, short color_pair, void *opt, int (*putfunc)(int)) | ||
90 | { | ||
91 | PDC_LOG(("vid_puts() - called\n")); | ||
92 | |||
93 | return ERR; | ||
94 | } | ||
95 | |||
96 | int del_curterm(TERMINAL *oterm) | ||
97 | { | ||
98 | PDC_LOG(("del_curterm() - called\n")); | ||
99 | |||
100 | return ERR; | ||
101 | } | ||
102 | |||
103 | int putp(const char *str) | ||
104 | { | ||
105 | PDC_LOG(("putp() - called: str %s\n", str)); | ||
106 | |||
107 | return ERR; | ||
108 | } | ||
109 | |||
110 | int restartterm(const char *term, int filedes, int *errret) | ||
111 | { | ||
112 | PDC_LOG(("restartterm() - called\n")); | ||
113 | |||
114 | if (errret) | ||
115 | *errret = -1; | ||
116 | |||
117 | return ERR; | ||
118 | } | ||
119 | |||
120 | TERMINAL *set_curterm(TERMINAL *nterm) | ||
121 | { | ||
122 | PDC_LOG(("set_curterm() - called\n")); | ||
123 | |||
124 | return (TERMINAL *)NULL; | ||
125 | } | ||
126 | |||
127 | int setterm(const char *term) | ||
128 | { | ||
129 | PDC_LOG(("setterm() - called\n")); | ||
130 | |||
131 | return ERR; | ||
132 | } | ||
133 | |||
134 | int setupterm(const char *term, int filedes, int *errret) | ||
135 | { | ||
136 | PDC_LOG(("setupterm() - called\n")); | ||
137 | |||
138 | if (errret) | ||
139 | *errret = -1; | ||
140 | else | ||
141 | fprintf(stderr, "There is no terminfo database\n"); | ||
142 | |||
143 | return ERR; | ||
144 | } | ||
145 | |||
146 | int tgetent(char *bp, const char *name) | ||
147 | { | ||
148 | PDC_LOG(("tgetent() - called: name %s\n", name)); | ||
149 | |||
150 | return ERR; | ||
151 | } | ||
152 | |||
153 | int tgetflag(const char *id) | ||
154 | { | ||
155 | PDC_LOG(("tgetflag() - called: id %s\n", id)); | ||
156 | |||
157 | return ERR; | ||
158 | } | ||
159 | |||
160 | int tgetnum(const char *id) | ||
161 | { | ||
162 | PDC_LOG(("tgetnum() - called: id %s\n", id)); | ||
163 | |||
164 | return ERR; | ||
165 | } | ||
166 | |||
167 | char *tgetstr(const char *id, char **area) | ||
168 | { | ||
169 | PDC_LOG(("tgetstr() - called: id %s\n", id)); | ||
170 | |||
171 | return (char *)NULL; | ||
172 | } | ||
173 | |||
174 | char *tgoto(const char *cap, int col, int row) | ||
175 | { | ||
176 | PDC_LOG(("tgoto() - called\n")); | ||
177 | |||
178 | return (char *)NULL; | ||
179 | } | ||
180 | |||
181 | int tigetflag(const char *capname) | ||
182 | { | ||
183 | PDC_LOG(("tigetflag() - called: capname %s\n", capname)); | ||
184 | |||
185 | return -1; | ||
186 | } | ||
187 | |||
188 | int tigetnum(const char *capname) | ||
189 | { | ||
190 | PDC_LOG(("tigetnum() - called: capname %s\n", capname)); | ||
191 | |||
192 | return -2; | ||
193 | } | ||
194 | |||
195 | char *tigetstr(const char *capname) | ||
196 | { | ||
197 | PDC_LOG(("tigetstr() - called: capname %s\n", capname)); | ||
198 | |||
199 | return (char *)(-1); | ||
200 | } | ||
201 | |||
202 | char *tparm(const char *cap, long p1, long p2, long p3, long p4, | ||
203 | long p5, long p6, long p7, long p8, long p9) | ||
204 | { | ||
205 | PDC_LOG(("tparm() - called: cap %s\n", cap)); | ||
206 | |||
207 | return (char *)NULL; | ||
208 | } | ||
209 | |||
210 | int tputs(const char *str, int affcnt, int (*putfunc)(int)) | ||
211 | { | ||
212 | PDC_LOG(("tputs() - called\n")); | ||
213 | |||
214 | return ERR; | ||
215 | } |
File pdcurses/touch.c added (mode: 100644) (index 00000000..9355aa1f) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: touch.c,v 1.29 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: touch | ||
10 | |||
11 | Synopsis: | ||
12 | int touchwin(WINDOW *win); | ||
13 | int touchline(WINDOW *win, int start, int count); | ||
14 | int untouchwin(WINDOW *win); | ||
15 | int wtouchln(WINDOW *win, int y, int n, int changed); | ||
16 | bool is_linetouched(WINDOW *win, int line); | ||
17 | bool is_wintouched(WINDOW *win); | ||
18 | |||
19 | Description: | ||
20 | touchwin() and touchline() throw away all information about | ||
21 | which parts of the window have been touched, pretending that the | ||
22 | entire window has been drawn on. This is sometimes necessary | ||
23 | when using overlapping windows, since a change to one window | ||
24 | will affect the other window, but the records of which lines | ||
25 | have been changed in the other window will not reflect the | ||
26 | change. | ||
27 | |||
28 | untouchwin() marks all lines in the window as unchanged since | ||
29 | the last call to wrefresh(). | ||
30 | |||
31 | wtouchln() makes n lines in the window, starting at line y, look | ||
32 | as if they have (changed == 1) or have not (changed == 0) been | ||
33 | changed since the last call to wrefresh(). | ||
34 | |||
35 | is_linetouched() returns TRUE if the specified line in the | ||
36 | specified window has been changed since the last call to | ||
37 | wrefresh(). | ||
38 | |||
39 | is_wintouched() returns TRUE if the specified window | ||
40 | has been changed since the last call to wrefresh(). | ||
41 | |||
42 | Return Value: | ||
43 | All functions return OK on success and ERR on error except | ||
44 | is_wintouched() and is_linetouched(). | ||
45 | |||
46 | Portability X/Open BSD SYS V | ||
47 | touchwin Y Y Y | ||
48 | touchline Y - 3.0 | ||
49 | untouchwin Y - 4.0 | ||
50 | wtouchln Y Y Y | ||
51 | is_linetouched Y - 4.0 | ||
52 | is_wintouched Y - 4.0 | ||
53 | |||
54 | **man-end****************************************************************/ | ||
55 | |||
56 | int touchwin(WINDOW *win) | ||
57 | { | ||
58 | int i; | ||
59 | |||
60 | PDC_LOG(("touchwin() - called: Win=%x\n", win)); | ||
61 | |||
62 | if (!win) | ||
63 | return ERR; | ||
64 | |||
65 | for (i = 0; i < win->_maxy; i++) | ||
66 | { | ||
67 | win->_firstch[i] = 0; | ||
68 | win->_lastch[i] = win->_maxx - 1; | ||
69 | } | ||
70 | |||
71 | return OK; | ||
72 | } | ||
73 | |||
74 | int touchline(WINDOW *win, int start, int count) | ||
75 | { | ||
76 | int i; | ||
77 | |||
78 | PDC_LOG(("touchline() - called: win=%p start %d count %d\n", | ||
79 | win, start, count)); | ||
80 | |||
81 | if (!win || start > win->_maxy || start + count > win->_maxy) | ||
82 | return ERR; | ||
83 | |||
84 | for (i = start; i < start + count; i++) | ||
85 | { | ||
86 | win->_firstch[i] = 0; | ||
87 | win->_lastch[i] = win->_maxx - 1; | ||
88 | } | ||
89 | |||
90 | return OK; | ||
91 | } | ||
92 | |||
93 | int untouchwin(WINDOW *win) | ||
94 | { | ||
95 | int i; | ||
96 | |||
97 | PDC_LOG(("untouchwin() - called: win=%p", win)); | ||
98 | |||
99 | if (!win) | ||
100 | return ERR; | ||
101 | |||
102 | for (i = 0; i < win->_maxy; i++) | ||
103 | { | ||
104 | win->_firstch[i] = _NO_CHANGE; | ||
105 | win->_lastch[i] = _NO_CHANGE; | ||
106 | } | ||
107 | |||
108 | return OK; | ||
109 | } | ||
110 | |||
111 | int wtouchln(WINDOW *win, int y, int n, int changed) | ||
112 | { | ||
113 | int i; | ||
114 | |||
115 | PDC_LOG(("wtouchln() - called: win=%p y=%d n=%d changed=%d\n", | ||
116 | win, y, n, changed)); | ||
117 | |||
118 | if (!win || y > win->_maxy || y + n > win->_maxy) | ||
119 | return ERR; | ||
120 | |||
121 | for (i = y; i < y + n; i++) | ||
122 | { | ||
123 | if (changed) | ||
124 | { | ||
125 | win->_firstch[i] = 0; | ||
126 | win->_lastch[i] = win->_maxx - 1; | ||
127 | } | ||
128 | else | ||
129 | { | ||
130 | win->_firstch[i] = _NO_CHANGE; | ||
131 | win->_lastch[i] = _NO_CHANGE; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | return OK; | ||
136 | } | ||
137 | |||
138 | bool is_linetouched(WINDOW *win, int line) | ||
139 | { | ||
140 | PDC_LOG(("is_linetouched() - called: win=%p line=%d\n", win, line)); | ||
141 | |||
142 | if (!win || line > win->_maxy || line < 0) | ||
143 | return FALSE; | ||
144 | |||
145 | return (win->_firstch[line] != _NO_CHANGE) ? TRUE : FALSE; | ||
146 | } | ||
147 | |||
148 | bool is_wintouched(WINDOW *win) | ||
149 | { | ||
150 | int i; | ||
151 | |||
152 | PDC_LOG(("is_wintouched() - called: win=%p\n", win)); | ||
153 | |||
154 | if (win) | ||
155 | for (i = 0; i < win->_maxy; i++) | ||
156 | if (win->_firstch[i] != _NO_CHANGE) | ||
157 | return TRUE; | ||
158 | |||
159 | return FALSE; | ||
160 | } |
File pdcurses/util.c added (mode: 100644) (index 00000000..f0673fca) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: util.c,v 1.71 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: util | ||
10 | |||
11 | Synopsis: | ||
12 | char *unctrl(chtype c); | ||
13 | void filter(void); | ||
14 | void use_env(bool x); | ||
15 | int delay_output(int ms); | ||
16 | |||
17 | int getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, | ||
18 | short *color_pair, void *opts); | ||
19 | int setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, | ||
20 | short color_pair, const void *opts); | ||
21 | wchar_t *wunctrl(cchar_t *wc); | ||
22 | |||
23 | int PDC_mbtowc(wchar_t *pwc, const char *s, size_t n); | ||
24 | size_t PDC_mbstowcs(wchar_t *dest, const char *src, size_t n); | ||
25 | size_t PDC_wcstombs(char *dest, const wchar_t *src, size_t n); | ||
26 | |||
27 | Description: | ||
28 | unctrl() expands the text portion of the chtype c into a | ||
29 | printable string. Control characters are changed to the "^X" | ||
30 | notation; others are passed through. wunctrl() is the wide- | ||
31 | character version of the function. | ||
32 | |||
33 | filter() and use_env() are no-ops in PDCurses. | ||
34 | |||
35 | delay_output() inserts an ms millisecond pause in output. | ||
36 | |||
37 | getcchar() works in two modes: When wch is not NULL, it reads | ||
38 | the cchar_t pointed to by wcval and stores the attributes in | ||
39 | attrs, the color pair in color_pair, and the text in the | ||
40 | wide-character string wch. When wch is NULL, getcchar() merely | ||
41 | returns the number of wide characters in wcval. In either mode, | ||
42 | the opts argument is unused. | ||
43 | |||
44 | setcchar constructs a cchar_t at wcval from the wide-character | ||
45 | text at wch, the attributes in attr and the color pair in | ||
46 | color_pair. The opts argument is unused. | ||
47 | |||
48 | Currently, the length returned by getcchar() is always 1 or 0. | ||
49 | Similarly, setcchar() will only take the first wide character | ||
50 | from wch, and ignore any others that it "should" take (i.e., | ||
51 | combining characters). Nor will it correctly handle any | ||
52 | character outside the basic multilingual plane (UCS-2). | ||
53 | |||
54 | Return Value: | ||
55 | unctrl() and wunctrl() return NULL on failure. delay_output() | ||
56 | always returns OK. | ||
57 | |||
58 | getcchar() returns the number of wide characters wcval points to | ||
59 | when wch is NULL; when it's not, getcchar() returns OK or ERR. | ||
60 | |||
61 | setcchar() returns OK or ERR. | ||
62 | |||
63 | Portability X/Open BSD SYS V | ||
64 | unctrl Y Y Y | ||
65 | filter Y - 3.0 | ||
66 | use_env Y - 4.0 | ||
67 | delay_output Y Y Y | ||
68 | getcchar Y | ||
69 | setcchar Y | ||
70 | wunctrl Y | ||
71 | PDC_mbtowc - - - | ||
72 | PDC_mbstowcs - - - | ||
73 | PDC_wcstombs - - - | ||
74 | |||
75 | **man-end****************************************************************/ | ||
76 | |||
77 | #ifdef PDC_WIDE | ||
78 | # ifdef PDC_FORCE_UTF8 | ||
79 | # include <string.h> | ||
80 | # else | ||
81 | # include <stdlib.h> | ||
82 | # endif | ||
83 | #endif | ||
84 | |||
85 | char *unctrl(chtype c) | ||
86 | { | ||
87 | static char strbuf[3] = {0, 0, 0}; | ||
88 | |||
89 | chtype ic; | ||
90 | |||
91 | PDC_LOG(("unctrl() - called\n")); | ||
92 | |||
93 | ic = c & A_CHARTEXT; | ||
94 | |||
95 | if (ic >= 0x20 && ic != 0x7f) /* normal characters */ | ||
96 | { | ||
97 | strbuf[0] = (char)ic; | ||
98 | strbuf[1] = '\0'; | ||
99 | return strbuf; | ||
100 | } | ||
101 | |||
102 | strbuf[0] = '^'; /* '^' prefix */ | ||
103 | |||
104 | if (ic == 0x7f) /* 0x7f == DEL */ | ||
105 | strbuf[1] = '?'; | ||
106 | else /* other control */ | ||
107 | strbuf[1] = (char)(ic + '@'); | ||
108 | |||
109 | return strbuf; | ||
110 | } | ||
111 | |||
112 | void filter(void) | ||
113 | { | ||
114 | PDC_LOG(("filter() - called\n")); | ||
115 | } | ||
116 | |||
117 | void use_env(bool x) | ||
118 | { | ||
119 | PDC_LOG(("use_env() - called: x %d\n", x)); | ||
120 | } | ||
121 | |||
122 | int delay_output(int ms) | ||
123 | { | ||
124 | PDC_LOG(("delay_output() - called: ms %d\n", ms)); | ||
125 | |||
126 | return napms(ms); | ||
127 | } | ||
128 | |||
129 | #ifdef PDC_WIDE | ||
130 | int getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, | ||
131 | short *color_pair, void *opts) | ||
132 | { | ||
133 | if (!wcval) | ||
134 | return ERR; | ||
135 | |||
136 | if (wch) | ||
137 | { | ||
138 | if (!attrs || !color_pair) | ||
139 | return ERR; | ||
140 | |||
141 | *wch = (*wcval & A_CHARTEXT); | ||
142 | *attrs = (*wcval & (A_ATTRIBUTES & ~A_COLOR)); | ||
143 | *color_pair = PAIR_NUMBER(*wcval & A_COLOR); | ||
144 | |||
145 | if (*wch) | ||
146 | *++wch = L'\0'; | ||
147 | |||
148 | return OK; | ||
149 | } | ||
150 | else | ||
151 | return ((*wcval & A_CHARTEXT) != L'\0'); | ||
152 | } | ||
153 | |||
154 | int setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, | ||
155 | short color_pair, const void *opts) | ||
156 | { | ||
157 | if (!wcval || !wch) | ||
158 | return ERR; | ||
159 | |||
160 | *wcval = *wch | attrs | COLOR_PAIR(color_pair); | ||
161 | |||
162 | return OK; | ||
163 | } | ||
164 | |||
165 | wchar_t *wunctrl(cchar_t *wc) | ||
166 | { | ||
167 | static wchar_t strbuf[3] = {0, 0, 0}; | ||
168 | |||
169 | cchar_t ic; | ||
170 | |||
171 | PDC_LOG(("wunctrl() - called\n")); | ||
172 | |||
173 | ic = *wc & A_CHARTEXT; | ||
174 | |||
175 | if (ic >= 0x20 && ic != 0x7f) /* normal characters */ | ||
176 | { | ||
177 | strbuf[0] = (wchar_t)ic; | ||
178 | strbuf[1] = L'\0'; | ||
179 | return strbuf; | ||
180 | } | ||
181 | |||
182 | strbuf[0] = '^'; /* '^' prefix */ | ||
183 | |||
184 | if (ic == 0x7f) /* 0x7f == DEL */ | ||
185 | strbuf[1] = '?'; | ||
186 | else /* other control */ | ||
187 | strbuf[1] = (wchar_t)(ic + '@'); | ||
188 | |||
189 | return strbuf; | ||
190 | } | ||
191 | |||
192 | int PDC_mbtowc(wchar_t *pwc, const char *s, size_t n) | ||
193 | { | ||
194 | # ifdef PDC_FORCE_UTF8 | ||
195 | wchar_t key; | ||
196 | int i = -1; | ||
197 | const unsigned char *string; | ||
198 | |||
199 | if (!s || (n < 1)) | ||
200 | return -1; | ||
201 | |||
202 | if (!*s) | ||
203 | return 0; | ||
204 | |||
205 | string = (const unsigned char *)s; | ||
206 | |||
207 | key = string[0]; | ||
208 | |||
209 | /* Simplistic UTF-8 decoder -- only does the BMP, minimal validation */ | ||
210 | |||
211 | if (key & 0x80) | ||
212 | { | ||
213 | if ((key & 0xe0) == 0xc0) | ||
214 | { | ||
215 | if (1 < n) | ||
216 | { | ||
217 | key = ((key & 0x1f) << 6) | (string[1] & 0x3f); | ||
218 | i = 2; | ||
219 | } | ||
220 | } | ||
221 | else if ((key & 0xe0) == 0xe0) | ||
222 | { | ||
223 | if (2 < n) | ||
224 | { | ||
225 | key = ((key & 0x0f) << 12) | ((string[1] & 0x3f) << 6) | | ||
226 | (string[2] & 0x3f); | ||
227 | i = 3; | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | else | ||
232 | i = 1; | ||
233 | |||
234 | if (i) | ||
235 | *pwc = key; | ||
236 | |||
237 | return i; | ||
238 | # else | ||
239 | return mbtowc(pwc, s, n); | ||
240 | # endif | ||
241 | } | ||
242 | |||
243 | size_t PDC_mbstowcs(wchar_t *dest, const char *src, size_t n) | ||
244 | { | ||
245 | # ifdef PDC_FORCE_UTF8 | ||
246 | size_t i = 0, len; | ||
247 | |||
248 | if (!src || !dest) | ||
249 | return 0; | ||
250 | |||
251 | len = strlen(src); | ||
252 | |||
253 | while (*src && i < n) | ||
254 | { | ||
255 | int retval = PDC_mbtowc(dest + i, src, len); | ||
256 | |||
257 | if (retval < 1) | ||
258 | return -1; | ||
259 | |||
260 | src += retval; | ||
261 | len -= retval; | ||
262 | i++; | ||
263 | } | ||
264 | # else | ||
265 | size_t i = mbstowcs(dest, src, n); | ||
266 | # endif | ||
267 | dest[i] = 0; | ||
268 | return i; | ||
269 | } | ||
270 | |||
271 | size_t PDC_wcstombs(char *dest, const wchar_t *src, size_t n) | ||
272 | { | ||
273 | # ifdef PDC_FORCE_UTF8 | ||
274 | size_t i = 0; | ||
275 | |||
276 | if (!src || !dest) | ||
277 | return 0; | ||
278 | |||
279 | while (*src && i < n) | ||
280 | { | ||
281 | chtype code = *src++; | ||
282 | |||
283 | if (code < 0x80) | ||
284 | { | ||
285 | dest[i] = code; | ||
286 | i++; | ||
287 | } | ||
288 | else | ||
289 | if (code < 0x800) | ||
290 | { | ||
291 | dest[i] = ((code & 0x07c0) >> 6) | 0xc0; | ||
292 | dest[i + 1] = (code & 0x003f) | 0x80; | ||
293 | i += 2; | ||
294 | } | ||
295 | else | ||
296 | { | ||
297 | dest[i] = ((code & 0xf000) >> 12) | 0xe0; | ||
298 | dest[i + 1] = ((code & 0x0fc0) >> 6) | 0x80; | ||
299 | dest[i + 2] = (code & 0x003f) | 0x80; | ||
300 | i += 3; | ||
301 | } | ||
302 | } | ||
303 | # else | ||
304 | size_t i = wcstombs(dest, src, n); | ||
305 | # endif | ||
306 | dest[i] = '\0'; | ||
307 | return i; | ||
308 | } | ||
309 | #endif |
File pdcurses/window.c added (mode: 100644) (index 00000000..dbfd5849) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include <curspriv.h> | ||
4 | |||
5 | RCSID("$Id: window.c,v 1.62 2008/07/13 16:08:18 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: window | ||
10 | |||
11 | Synopsis: | ||
12 | WINDOW *newwin(int nlines, int ncols, int begy, int begx); | ||
13 | WINDOW *derwin(WINDOW* orig, int nlines, int ncols, | ||
14 | int begy, int begx); | ||
15 | WINDOW *subwin(WINDOW* orig, int nlines, int ncols, | ||
16 | int begy, int begx); | ||
17 | WINDOW *dupwin(WINDOW *win); | ||
18 | int delwin(WINDOW *win); | ||
19 | int mvwin(WINDOW *win, int y, int x); | ||
20 | int mvderwin(WINDOW *win, int pary, int parx); | ||
21 | int syncok(WINDOW *win, bool bf); | ||
22 | void wsyncup(WINDOW *win); | ||
23 | void wcursyncup(WINDOW *win); | ||
24 | void wsyncdown(WINDOW *win); | ||
25 | |||
26 | WINDOW *resize_window(WINDOW *win, int nlines, int ncols); | ||
27 | int wresize(WINDOW *win, int nlines, int ncols); | ||
28 | WINDOW *PDC_makelines(WINDOW *win); | ||
29 | WINDOW *PDC_makenew(int nlines, int ncols, int begy, int begx); | ||
30 | void PDC_sync(WINDOW *win); | ||
31 | |||
32 | Description: | ||
33 | newwin() creates a new window with the given number of lines, | ||
34 | nlines and columns, ncols. The upper left corner of the window | ||
35 | is at line begy, column begx. If nlines is zero, it defaults to | ||
36 | LINES - begy; ncols to COLS - begx. Create a new full-screen | ||
37 | window by calling newwin(0, 0, 0, 0). | ||
38 | |||
39 | delwin() deletes the named window, freeing all associated | ||
40 | memory. In the case of overlapping windows, subwindows should be | ||
41 | deleted before the main window. | ||
42 | |||
43 | mvwin() moves the window so that the upper left-hand corner is | ||
44 | at position (y,x). If the move would cause the window to be off | ||
45 | the screen, it is an error and the window is not moved. Moving | ||
46 | subwindows is allowed. | ||
47 | |||
48 | subwin() creates a new subwindow within a window. The | ||
49 | dimensions of the subwindow are nlines lines and ncols columns. | ||
50 | The subwindow is at position (begy, begx) on the screen. This | ||
51 | position is relative to the screen, and not to the window orig. | ||
52 | Changes made to either window will affect both. When using this | ||
53 | routine, you will often need to call touchwin() before calling | ||
54 | wrefresh(). | ||
55 | |||
56 | derwin() is the same as subwin(), except that begy and begx are | ||
57 | relative to the origin of the window orig rather than the | ||
58 | screen. There is no difference between subwindows and derived | ||
59 | windows. | ||
60 | |||
61 | mvderwin() moves a derived window (or subwindow) inside its | ||
62 | parent window. The screen-relative parameters of the window are | ||
63 | not changed. This routine is used to display different parts of | ||
64 | the parent window at the same physical position on the screen. | ||
65 | |||
66 | dupwin() creates an exact duplicate of the window win. | ||
67 | |||
68 | wsyncup() causes a touchwin() of all of the window's parents. | ||
69 | |||
70 | If wsyncok() is called with a second argument of TRUE, this | ||
71 | causes a wsyncup() to be called every time the window is | ||
72 | changed. | ||
73 | |||
74 | wcursyncup() causes the current cursor position of all of a | ||
75 | window's ancestors to reflect the current cursor position of the | ||
76 | current window. | ||
77 | |||
78 | wsyncdown() causes a touchwin() of the current window if any of | ||
79 | its parent's windows have been touched. | ||
80 | |||
81 | resize_window() allows the user to resize an existing window. It | ||
82 | returns the pointer to the new window, or NULL on failure. | ||
83 | |||
84 | wresize() is an ncurses-compatible wrapper for resize_window(). | ||
85 | Note that, unlike ncurses, it will NOT process any subwindows of | ||
86 | the window. (However, you still can call it _on_ subwindows.) It | ||
87 | returns OK or ERR. | ||
88 | |||
89 | PDC_makenew() allocates all data for a new WINDOW * except the | ||
90 | actual lines themselves. If it's unable to allocate memory for | ||
91 | the window structure, it will free all allocated memory and | ||
92 | return a NULL pointer. | ||
93 | |||
94 | PDC_makelines() allocates the memory for the lines. | ||
95 | |||
96 | PDC_sync() handles wrefresh() and wsyncup() calls when a window | ||
97 | is changed. | ||
98 | |||
99 | Return Value: | ||
100 | newwin(), subwin(), derwin() and dupwin() return a pointer | ||
101 | to the new window, or NULL on failure. delwin(), mvwin(), | ||
102 | mvderwin() and syncok() return OK or ERR. wsyncup(), | ||
103 | wcursyncup() and wsyncdown() return nothing. | ||
104 | |||
105 | Errors: | ||
106 | It is an error to call resize_window() before calling initscr(). | ||
107 | Also, an error will be generated if we fail to create a newly | ||
108 | sized replacement window for curscr, or stdscr. This could | ||
109 | happen when increasing the window size. NOTE: If this happens, | ||
110 | the previously successfully allocated windows are left alone; | ||
111 | i.e., the resize is NOT cancelled for those windows. | ||
112 | |||
113 | Portability X/Open BSD SYS V | ||
114 | newwin Y Y Y | ||
115 | delwin Y Y Y | ||
116 | mvwin Y Y Y | ||
117 | subwin Y Y Y | ||
118 | derwin Y - Y | ||
119 | mvderwin Y - Y | ||
120 | dupwin Y - 4.0 | ||
121 | wsyncup Y - 4.0 | ||
122 | syncok Y - 4.0 | ||
123 | wcursyncup Y - 4.0 | ||
124 | wsyncdown Y - 4.0 | ||
125 | resize_window - - - | ||
126 | wresize - - - | ||
127 | PDC_makelines - - - | ||
128 | PDC_makenew - - - | ||
129 | PDC_sync - - - | ||
130 | |||
131 | **man-end****************************************************************/ | ||
132 | |||
133 | #include <stdlib.h> | ||
134 | |||
135 | WINDOW *PDC_makenew(int nlines, int ncols, int begy, int begx) | ||
136 | { | ||
137 | WINDOW *win; | ||
138 | |||
139 | PDC_LOG(("PDC_makenew() - called: lines %d cols %d begy %d begx %d\n", | ||
140 | nlines, ncols, begy, begx)); | ||
141 | |||
142 | /* allocate the window structure itself */ | ||
143 | |||
144 | if ((win = calloc(1, sizeof(WINDOW))) == (WINDOW *)NULL) | ||
145 | return win; | ||
146 | |||
147 | /* allocate the line pointer array */ | ||
148 | |||
149 | if ((win->_y = malloc(nlines * sizeof(chtype *))) == NULL) | ||
150 | { | ||
151 | free(win); | ||
152 | return (WINDOW *)NULL; | ||
153 | } | ||
154 | |||
155 | /* allocate the minchng and maxchng arrays */ | ||
156 | |||
157 | if ((win->_firstch = malloc(nlines * sizeof(int))) == NULL) | ||
158 | { | ||
159 | free(win->_y); | ||
160 | free(win); | ||
161 | return (WINDOW *)NULL; | ||
162 | } | ||
163 | |||
164 | if ((win->_lastch = malloc(nlines * sizeof(int))) == NULL) | ||
165 | { | ||
166 | free(win->_firstch); | ||
167 | free(win->_y); | ||
168 | free(win); | ||
169 | return (WINDOW *)NULL; | ||
170 | } | ||
171 | |||
172 | /* initialize window variables */ | ||
173 | |||
174 | win->_maxy = nlines; /* real max screen size */ | ||
175 | win->_maxx = ncols; /* real max screen size */ | ||
176 | win->_begy = begy; | ||
177 | win->_begx = begx; | ||
178 | win->_bkgd = ' '; /* wrs 4/10/93 -- initialize background to blank */ | ||
179 | win->_clear = (bool) ((nlines == LINES) && (ncols == COLS)); | ||
180 | win->_bmarg = nlines - 1; | ||
181 | win->_parx = win->_pary = -1; | ||
182 | |||
183 | /* init to say window all changed */ | ||
184 | |||
185 | touchwin(win); | ||
186 | |||
187 | return win; | ||
188 | } | ||
189 | |||
190 | WINDOW *PDC_makelines(WINDOW *win) | ||
191 | { | ||
192 | int i, j, nlines, ncols; | ||
193 | |||
194 | PDC_LOG(("PDC_makelines() - called: lines %d cols %d\n", nlines, ncols)); | ||
195 | |||
196 | if (!win) | ||
197 | return (WINDOW *)NULL; | ||
198 | |||
199 | nlines = win->_maxy; | ||
200 | ncols = win->_maxx; | ||
201 | |||
202 | for (i = 0; i < nlines; i++) | ||
203 | { | ||
204 | if ((win->_y[i] = malloc(ncols * sizeof(chtype))) == NULL) | ||
205 | { | ||
206 | /* if error, free all the data */ | ||
207 | |||
208 | for (j = 0; j < i; j++) | ||
209 | free(win->_y[j]); | ||
210 | |||
211 | free(win->_firstch); | ||
212 | free(win->_lastch); | ||
213 | free(win->_y); | ||
214 | free(win); | ||
215 | |||
216 | return (WINDOW *)NULL; | ||
217 | } | ||
218 | } | ||
219 | |||
220 | return win; | ||
221 | } | ||
222 | |||
223 | void PDC_sync(WINDOW *win) | ||
224 | { | ||
225 | PDC_LOG(("PDC_sync() - called:\n")); | ||
226 | |||
227 | if (win->_immed) | ||
228 | wrefresh(win); | ||
229 | if (win->_sync) | ||
230 | wsyncup(win); | ||
231 | } | ||
232 | |||
233 | WINDOW *newwin(int nlines, int ncols, int begy, int begx) | ||
234 | { | ||
235 | WINDOW *win; | ||
236 | |||
237 | PDC_LOG(("newwin() - called:lines=%d cols=%d begy=%d begx=%d\n", | ||
238 | nlines, ncols, begy, begx)); | ||
239 | |||
240 | if (!nlines) | ||
241 | nlines = LINES - begy; | ||
242 | if (!ncols) | ||
243 | ncols = COLS - begx; | ||
244 | |||
245 | if ( (begy + nlines > SP->lines || begx + ncols > SP->cols) | ||
246 | || !(win = PDC_makenew(nlines, ncols, begy, begx)) | ||
247 | || !(win = PDC_makelines(win)) ) | ||
248 | return (WINDOW *)NULL; | ||
249 | |||
250 | werase(win); | ||
251 | |||
252 | return win; | ||
253 | } | ||
254 | |||
255 | int delwin(WINDOW *win) | ||
256 | { | ||
257 | int i; | ||
258 | |||
259 | PDC_LOG(("delwin() - called\n")); | ||
260 | |||
261 | if (!win) | ||
262 | return ERR; | ||
263 | |||
264 | /* subwindows use parents' lines */ | ||
265 | |||
266 | if (!(win->_flags & (_SUBWIN|_SUBPAD))) | ||
267 | for (i = 0; i < win->_maxy && win->_y[i]; i++) | ||
268 | if (win->_y[i]) | ||
269 | free(win->_y[i]); | ||
270 | |||
271 | free(win->_firstch); | ||
272 | free(win->_lastch); | ||
273 | free(win->_y); | ||
274 | free(win); | ||
275 | |||
276 | return OK; | ||
277 | } | ||
278 | |||
279 | int mvwin(WINDOW *win, int y, int x) | ||
280 | { | ||
281 | PDC_LOG(("mvwin() - called\n")); | ||
282 | |||
283 | if (!win || (y + win->_maxy > LINES || y < 0) | ||
284 | || (x + win->_maxx > COLS || x < 0)) | ||
285 | return ERR; | ||
286 | |||
287 | win->_begy = y; | ||
288 | win->_begx = x; | ||
289 | touchwin(win); | ||
290 | |||
291 | return OK; | ||
292 | } | ||
293 | |||
294 | WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begy, int begx) | ||
295 | { | ||
296 | WINDOW *win; | ||
297 | int i; | ||
298 | int j = begy - orig->_begy; | ||
299 | int k = begx - orig->_begx; | ||
300 | |||
301 | PDC_LOG(("subwin() - called: lines %d cols %d begy %d begx %d\n", | ||
302 | nlines, ncols, begy, begx)); | ||
303 | |||
304 | /* make sure window fits inside the original one */ | ||
305 | |||
306 | if (!orig || (begy < orig->_begy) || (begx < orig->_begx) || | ||
307 | (begy + nlines) > (orig->_begy + orig->_maxy) || | ||
308 | (begx + ncols) > (orig->_begx + orig->_maxx)) | ||
309 | return (WINDOW *)NULL; | ||
310 | |||
311 | if (!nlines) | ||
312 | nlines = orig->_maxy - 1 - j; | ||
313 | if (!ncols) | ||
314 | ncols = orig->_maxx - 1 - k; | ||
315 | |||
316 | if ( !(win = PDC_makenew(nlines, ncols, begy, begx)) ) | ||
317 | return (WINDOW *)NULL; | ||
318 | |||
319 | /* initialize window variables */ | ||
320 | |||
321 | win->_attrs = orig->_attrs; | ||
322 | win->_bkgd = orig->_bkgd; | ||
323 | win->_leaveit = orig->_leaveit; | ||
324 | win->_scroll = orig->_scroll; | ||
325 | win->_nodelay = orig->_nodelay; | ||
326 | win->_use_keypad = orig->_use_keypad; | ||
327 | win->_immed = orig->_immed; | ||
328 | win->_sync = orig->_sync; | ||
329 | win->_pary = j; | ||
330 | win->_parx = k; | ||
331 | win->_parent = orig; | ||
332 | |||
333 | for (i = 0; i < nlines; i++, j++) | ||
334 | win->_y[i] = orig->_y[j] + k; | ||
335 | |||
336 | win->_flags |= _SUBWIN; | ||
337 | |||
338 | return win; | ||
339 | } | ||
340 | |||
341 | WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begy, int begx) | ||
342 | { | ||
343 | return subwin(orig, nlines, ncols, begy + orig->_begy, begx + orig->_begx); | ||
344 | } | ||
345 | |||
346 | int mvderwin(WINDOW *win, int pary, int parx) | ||
347 | { | ||
348 | int i, j; | ||
349 | WINDOW *mypar; | ||
350 | |||
351 | if (!win || !(win->_parent)) | ||
352 | return ERR; | ||
353 | |||
354 | mypar = win->_parent; | ||
355 | |||
356 | if (pary < 0 || parx < 0 || (pary + win->_maxy) > mypar->_maxy || | ||
357 | (parx + win->_maxx) > mypar->_maxx) | ||
358 | return ERR; | ||
359 | |||
360 | j = pary; | ||
361 | |||
362 | for (i = 0; i < win->_maxy; i++) | ||
363 | win->_y[i] = (mypar->_y[j++]) + parx; | ||
364 | |||
365 | win->_pary = pary; | ||
366 | win->_parx = parx; | ||
367 | |||
368 | return OK; | ||
369 | } | ||
370 | |||
371 | WINDOW *dupwin(WINDOW *win) | ||
372 | { | ||
373 | WINDOW *new; | ||
374 | chtype *ptr, *ptr1; | ||
375 | int nlines, ncols, begy, begx, i; | ||
376 | |||
377 | if (!win) | ||
378 | return (WINDOW *)NULL; | ||
379 | |||
380 | nlines = win->_maxy; | ||
381 | ncols = win->_maxx; | ||
382 | begy = win->_begy; | ||
383 | begx = win->_begx; | ||
384 | |||
385 | if ( !(new = PDC_makenew(nlines, ncols, begy, begx)) | ||
386 | || !(new = PDC_makelines(new)) ) | ||
387 | return (WINDOW *)NULL; | ||
388 | |||
389 | /* copy the contents of win into new */ | ||
390 | |||
391 | for (i = 0; i < nlines; i++) | ||
392 | { | ||
393 | for (ptr = new->_y[i], ptr1 = win->_y[i]; | ||
394 | ptr < new->_y[i] + ncols; ptr++, ptr1++) | ||
395 | *ptr = *ptr1; | ||
396 | |||
397 | new->_firstch[i] = 0; | ||
398 | new->_lastch[i] = ncols - 1; | ||
399 | } | ||
400 | |||
401 | new->_curx = win->_curx; | ||
402 | new->_cury = win->_cury; | ||
403 | new->_maxy = win->_maxy; | ||
404 | new->_maxx = win->_maxx; | ||
405 | new->_begy = win->_begy; | ||
406 | new->_begx = win->_begx; | ||
407 | new->_flags = win->_flags; | ||
408 | new->_attrs = win->_attrs; | ||
409 | new->_clear = win->_clear; | ||
410 | new->_leaveit = win->_leaveit; | ||
411 | new->_scroll = win->_scroll; | ||
412 | new->_nodelay = win->_nodelay; | ||
413 | new->_use_keypad = win->_use_keypad; | ||
414 | new->_tmarg = win->_tmarg; | ||
415 | new->_bmarg = win->_bmarg; | ||
416 | new->_parx = win->_parx; | ||
417 | new->_pary = win->_pary; | ||
418 | new->_parent = win->_parent; | ||
419 | new->_bkgd = win->_bkgd; | ||
420 | new->_flags = win->_flags; | ||
421 | |||
422 | return new; | ||
423 | } | ||
424 | |||
425 | WINDOW *resize_window(WINDOW *win, int nlines, int ncols) | ||
426 | { | ||
427 | WINDOW *new; | ||
428 | int i, save_cury, save_curx, new_begy, new_begx; | ||
429 | |||
430 | PDC_LOG(("resize_window() - called: nlines %d ncols %d\n", | ||
431 | nlines, ncols)); | ||
432 | |||
433 | if (!win) | ||
434 | return (WINDOW *)NULL; | ||
435 | |||
436 | if (win->_flags & _SUBPAD) | ||
437 | { | ||
438 | if ( !(new = subpad(win->_parent, nlines, ncols, | ||
439 | win->_begy, win->_begx)) ) | ||
440 | return (WINDOW *)NULL; | ||
441 | } | ||
442 | else if (win->_flags & _SUBWIN) | ||
443 | { | ||
444 | if ( !(new = subwin(win->_parent, nlines, ncols, | ||
445 | win->_begy, win->_begx)) ) | ||
446 | return (WINDOW *)NULL; | ||
447 | } | ||
448 | else | ||
449 | { | ||
450 | if (win == SP->slk_winptr) | ||
451 | { | ||
452 | new_begy = SP->lines - SP->slklines; | ||
453 | new_begx = 0; | ||
454 | } | ||
455 | else | ||
456 | { | ||
457 | new_begy = win->_begy; | ||
458 | new_begx = win->_begx; | ||
459 | } | ||
460 | |||
461 | if ( !(new = PDC_makenew(nlines, ncols, new_begy, new_begx)) ) | ||
462 | return (WINDOW *)NULL; | ||
463 | } | ||
464 | |||
465 | save_curx = min(win->_curx, new->_maxx); | ||
466 | save_cury = min(win->_cury, new->_maxy); | ||
467 | |||
468 | if (!(win->_flags & (_SUBPAD|_SUBWIN))) | ||
469 | { | ||
470 | if ( !(new = PDC_makelines(new)) ) | ||
471 | return (WINDOW *)NULL; | ||
472 | |||
473 | werase(new); | ||
474 | |||
475 | copywin(win, new, 0, 0, 0, 0, min(win->_maxy, new->_maxy) - 1, | ||
476 | min(win->_maxx, new->_maxx) - 1, FALSE); | ||
477 | |||
478 | for (i = 0; i < win->_maxy && win->_y[i]; i++) | ||
479 | if (win->_y[i]) | ||
480 | free(win->_y[i]); | ||
481 | } | ||
482 | |||
483 | new->_flags = win->_flags; | ||
484 | new->_attrs = win->_attrs; | ||
485 | new->_clear = win->_clear; | ||
486 | new->_leaveit = win->_leaveit; | ||
487 | new->_scroll = win->_scroll; | ||
488 | new->_nodelay = win->_nodelay; | ||
489 | new->_use_keypad = win->_use_keypad; | ||
490 | new->_tmarg = (win->_tmarg > new->_maxy - 1) ? 0 : win->_tmarg; | ||
491 | new->_bmarg = (win->_bmarg == win->_maxy - 1) ? | ||
492 | new->_maxy - 1 : min(win->_bmarg, (new->_maxy - 1)); | ||
493 | new->_parent = win->_parent; | ||
494 | new->_immed = win->_immed; | ||
495 | new->_sync = win->_sync; | ||
496 | new->_bkgd = win->_bkgd; | ||
497 | |||
498 | new->_curx = save_curx; | ||
499 | new->_cury = save_cury; | ||
500 | |||
501 | free(win->_firstch); | ||
502 | free(win->_lastch); | ||
503 | free(win->_y); | ||
504 | |||
505 | *win = *new; | ||
506 | free(new); | ||
507 | |||
508 | return win; | ||
509 | } | ||
510 | |||
511 | int wresize(WINDOW *win, int nlines, int ncols) | ||
512 | { | ||
513 | return (resize_window(win, nlines, ncols) ? OK : ERR); | ||
514 | } | ||
515 | |||
516 | void wsyncup(WINDOW *win) | ||
517 | { | ||
518 | WINDOW *tmp; | ||
519 | |||
520 | PDC_LOG(("wsyncup() - called\n")); | ||
521 | |||
522 | for (tmp = win; tmp; tmp = tmp->_parent) | ||
523 | touchwin(tmp); | ||
524 | } | ||
525 | |||
526 | int syncok(WINDOW *win, bool bf) | ||
527 | { | ||
528 | PDC_LOG(("syncok() - called\n")); | ||
529 | |||
530 | if (!win) | ||
531 | return ERR; | ||
532 | |||
533 | win->_sync = bf; | ||
534 | |||
535 | return OK; | ||
536 | } | ||
537 | |||
538 | void wcursyncup(WINDOW *win) | ||
539 | { | ||
540 | WINDOW *tmp; | ||
541 | |||
542 | PDC_LOG(("wcursyncup() - called\n")); | ||
543 | |||
544 | for (tmp = win; tmp && tmp->_parent; tmp = tmp->_parent) | ||
545 | wmove(tmp->_parent, tmp->_pary + tmp->_cury, tmp->_parx + tmp->_curx); | ||
546 | } | ||
547 | |||
548 | void wsyncdown(WINDOW *win) | ||
549 | { | ||
550 | WINDOW *tmp; | ||
551 | |||
552 | PDC_LOG(("wsyncdown() - called\n")); | ||
553 | |||
554 | for (tmp = win; tmp; tmp = tmp->_parent) | ||
555 | { | ||
556 | if (is_wintouched(tmp)) | ||
557 | { | ||
558 | touchwin(win); | ||
559 | break; | ||
560 | } | ||
561 | } | ||
562 | } |
File sdl1/Makefile added (mode: 100644) (index 00000000..a8393f0b) | |||
1 | # Makefile for PDCurses library for SDL | ||
2 | |||
3 | O = o | ||
4 | |||
5 | ifndef PDCURSES_SRCDIR | ||
6 | PDCURSES_SRCDIR = .. | ||
7 | endif | ||
8 | |||
9 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
10 | |||
11 | osdir = $(PDCURSES_SRCDIR)/sdl1 | ||
12 | |||
13 | PDCURSES_SDL_H = $(osdir)/pdcsdl.h | ||
14 | |||
15 | SFLAGS = $(shell sdl-config --cflags) | ||
16 | SLIBS = $(shell sdl-config --libs) | ||
17 | |||
18 | # If your system doesn't have these, remove the defines here | ||
19 | SFLAGS += -DHAVE_VSNPRINTF -DHAVE_VSSCANF | ||
20 | |||
21 | ifeq ($(DEBUG),Y) | ||
22 | CFLAGS = -g -Wall -DPDCDEBUG | ||
23 | else | ||
24 | CFLAGS = -O2 -Wall | ||
25 | endif | ||
26 | |||
27 | BUILD = $(CC) $(CFLAGS) -I$(PDCURSES_SRCDIR) | ||
28 | |||
29 | ifeq ($(shell uname),Darwin) | ||
30 | DEMOFLAGS = -Dmain=SDL_main | ||
31 | endif | ||
32 | |||
33 | LINK = $(CC) | ||
34 | LDFLAGS = $(LIBCURSES) $(SLIBS) | ||
35 | RANLIB = ranlib | ||
36 | LIBCURSES = libpdcurses.a | ||
37 | |||
38 | DEMOS = firework newdemo ptest rain testcurs tuidemo worm xmas \ | ||
39 | sdltest | ||
40 | |||
41 | .PHONY: all libs clean demos | ||
42 | |||
43 | all: libs demos | ||
44 | |||
45 | libs: $(LIBCURSES) | ||
46 | |||
47 | clean: | ||
48 | -rm -rf *.o trace $(LIBCURSES) $(DEMOS) | ||
49 | |||
50 | demos: $(DEMOS) | ||
51 | strip $(DEMOS) | ||
52 | |||
53 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
54 | ar rv $@ $? | ||
55 | -$(RANLIB) $@ | ||
56 | |||
57 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
58 | $(PDCOBJS) : $(PDCURSES_SDL_H) | ||
59 | $(DEMOS) : $(PDCURSES_CURSES_H) $(LIBCURSES) | ||
60 | tui.o tuidemo.o : $(PDCURSES_CURSES_H) | ||
61 | terminfo.o: $(TERM_HEADER) | ||
62 | panel.o ptest: $(PANEL_HEADER) | ||
63 | |||
64 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
65 | $(BUILD) $(SFLAGS) -c $< | ||
66 | |||
67 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
68 | $(BUILD) $(SFLAGS) -c $< | ||
69 | |||
70 | firework: $(demodir)/firework.c | ||
71 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
72 | |||
73 | newdemo: $(demodir)/newdemo.c | ||
74 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
75 | |||
76 | ptest: $(demodir)/ptest.c | ||
77 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
78 | |||
79 | rain: $(demodir)/rain.c | ||
80 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
81 | |||
82 | testcurs: $(demodir)/testcurs.c | ||
83 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
84 | |||
85 | tuidemo: tuidemo.o tui.o | ||
86 | $(LINK) tui.o tuidemo.o -o $@ $(LDFLAGS) | ||
87 | |||
88 | worm: $(demodir)/worm.c | ||
89 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
90 | |||
91 | xmas: $(demodir)/xmas.c | ||
92 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
93 | |||
94 | sdltest: $(osdir)/sdltest.c | ||
95 | $(BUILD) $(DEMOFLAGS) -o $@ $< $(LDFLAGS) | ||
96 | |||
97 | tui.o: $(demodir)/tui.c $(demodir)/tui.h | ||
98 | $(BUILD) -c $(DEMOFLAGS) $(demodir)/tui.c | ||
99 | |||
100 | tuidemo.o: $(demodir)/tuidemo.c | ||
101 | $(BUILD) -c $(DEMOFLAGS) $(demodir)/tuidemo.c |
File sdl1/Makefile.mng added (mode: 100644) (index 00000000..427edc67) | |||
1 | # Makefile for PDCurses library for SDL | ||
2 | |||
3 | O = o | ||
4 | |||
5 | ifndef PDCURSES_SRCDIR | ||
6 | PDCURSES_SRCDIR = .. | ||
7 | endif | ||
8 | |||
9 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
10 | |||
11 | osdir = $(PDCURSES_SRCDIR)/sdl1 | ||
12 | |||
13 | PDCURSES_SDL_H = $(osdir)/pdcsdl.h | ||
14 | |||
15 | ifeq ($(DEBUG),Y) | ||
16 | CFLAGS = -g -Wall -DPDCDEBUG | ||
17 | else | ||
18 | CFLAGS = -O2 -Wall | ||
19 | endif | ||
20 | |||
21 | CC = gcc | ||
22 | BUILD = $(CC) $(CFLAGS) -I$(PDCURSES_SRCDIR) | ||
23 | LDFLAGS = -mwindows $(LIBCURSES) | ||
24 | |||
25 | BASEDEF = $(PDCURSES_SRCDIR)\exp-base.def | ||
26 | |||
27 | DEFDEPS = $(BASEDEF) | ||
28 | |||
29 | DEFFILE = pdcurses.def | ||
30 | |||
31 | ifeq ($(DLL),Y) | ||
32 | BUILD += -DPDC_DLL_BUILD | ||
33 | LIBEXE = gcc $(DEFFILE) | ||
34 | LIBFLAGS = -Wl,--out-implib,libpdcurses.a -shared -o | ||
35 | LIBCURSES = pdcurses.dll | ||
36 | CLEAN = $(LIBCURSES) *.a $(DEFFILE) | ||
37 | POST = -lSDL | ||
38 | else | ||
39 | LIBEXE = ar | ||
40 | LIBFLAGS = rcv | ||
41 | LIBCURSES = libpdcurses.a | ||
42 | CLEAN = *.a | ||
43 | LDFLAGS += -lSDL | ||
44 | endif | ||
45 | |||
46 | DEMOS += sdltest.exe | ||
47 | |||
48 | .PHONY: all libs clean demos | ||
49 | |||
50 | all: libs demos | ||
51 | |||
52 | libs: $(LIBCURSES) | ||
53 | |||
54 | clean: | ||
55 | -del *.o $(CLEAN) *.exe | ||
56 | |||
57 | demos: $(DEMOS) | ||
58 | strip *.exe | ||
59 | |||
60 | pdcurses.dll: $(DEFFILE) | ||
61 | |||
62 | $(DEFFILE): $(DEFDEPS) | ||
63 | echo LIBRARY pdcurses > $@ | ||
64 | echo EXPORTS >> $@ | ||
65 | type $(BASEDEF) >> $@ | ||
66 | echo pdc_screen >> $@ | ||
67 | echo pdc_font >> $@ | ||
68 | echo pdc_icon >> $@ | ||
69 | echo pdc_back >> $@ | ||
70 | echo pdc_sheight >> $@ | ||
71 | echo pdc_swidth >> $@ | ||
72 | echo pdc_yoffset >> $@ | ||
73 | echo pdc_xoffset >> $@ | ||
74 | |||
75 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
76 | $(LIBEXE) $(LIBFLAGS) $@ $? $(POST) | ||
77 | |||
78 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
79 | $(PDCOBJS) : $(PDCURSES_SDL_H) | ||
80 | $(DEMOS) : $(PDCURSES_CURSES_H) $(LIBCURSES) | ||
81 | tui.o tuidemo.o : $(PDCURSES_CURSES_H) | ||
82 | terminfo.o: $(TERM_HEADER) | ||
83 | panel.o ptest.exe: $(PANEL_HEADER) | ||
84 | |||
85 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
86 | $(BUILD) -c $< | ||
87 | |||
88 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
89 | $(BUILD) -c $< | ||
90 | |||
91 | firework.exe newdemo.exe rain.exe testcurs.exe worm.exe xmas.exe \ | ||
92 | ptest.exe: %.exe: $(demodir)/%.c | ||
93 | $(BUILD) -o $@ $< $(LDFLAGS) | ||
94 | |||
95 | tuidemo.exe: tuidemo.o tui.o | ||
96 | $(CC) -o $@ tuidemo.o tui.o $(LDFLAGS) | ||
97 | |||
98 | tui.o: $(demodir)/tui.c $(demodir)/tui.h | ||
99 | $(BUILD) -c $< | ||
100 | |||
101 | tuidemo.o: $(demodir)/tuidemo.c $(demodir)/tui.h | ||
102 | $(BUILD) -c $< | ||
103 | |||
104 | sdltest.exe: $(osdir)/sdltest.c | ||
105 | $(BUILD) -o $@ $< -mwindows $(LIBCURSES) -lmingw32 -lSDLmain -lSDL |
File sdl1/README added (mode: 100644) (index 00000000..35234d39) | |||
1 | PDCurses for SDL | ||
2 | ================ | ||
3 | |||
4 | This is a port of PDCurses for SDL. | ||
5 | |||
6 | |||
7 | Building | ||
8 | -------- | ||
9 | |||
10 | . On *nix (including Linux and Mac OS X), run "make" in the sdl1 | ||
11 | directory. There is no configure script (yet?) for this port. This | ||
12 | assumes a working sdl-config, and GNU make. It builds the library | ||
13 | libpdcurses.a (dynamic lib not implemented). | ||
14 | |||
15 | With MinGW, run "make -f Makefile.mng". This assumes SDL is installed | ||
16 | in the standard directories. The MinGW makefile accepts the optional | ||
17 | parameters "DLL=Y" and "DEBUG=Y", as with the console version. (Wide- | ||
18 | character support is not yet implemented for SDL.) Both makefiles | ||
19 | recognize the optional PDCURSES_SRCDIR environment variable, as with | ||
20 | the console ports. Makefile.mng builds libpdcurses.a, along with | ||
21 | pdcurses.dll, if specified. | ||
22 | |||
23 | |||
24 | Distribution Status | ||
25 | ------------------- | ||
26 | |||
27 | The files in this directory are released to the Public Domain. | ||
28 | |||
29 | |||
30 | Acknowledgements | ||
31 | ---------------- | ||
32 | |||
33 | SDL port was provided by William McBrine <wmcbrine@users.sf.net> |
File sdl1/deffont.h added (mode: 100644) (index 00000000..cf9cab19) | |||
1 | /* Default font -- this is simply a 256x128x1 BMP, in #include'able form. | ||
2 | The font is 8x16, code page 437, and is based on the pc8x16s.bdf font | ||
3 | from the vgafonts.tar.gz package, by "Myrlin". */ | ||
4 | |||
5 | unsigned char deffont[] = | ||
6 | { | ||
7 | 0x42, 0x4d, 0x3e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, | ||
8 | 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, | ||
9 | 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
10 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, | ||
11 | 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, | ||
12 | 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
16 | 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
17 | 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, | ||
19 | 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
20 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, | ||
22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
23 | 0x00, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
24 | 0x00, 0x00, 0x00, 0x76, 0xf8, 0xc0, 0x6c, 0xfe, 0x70, 0x7c, 0x18, | ||
25 | 0x7e, 0x38, 0xee, 0x3c, 0x00, 0xc0, 0x1c, 0xc6, 0x00, 0x7e, 0x7e, | ||
26 | 0x7e, 0x18, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, | ||
27 | 0x00, 0x00, 0xdc, 0xcc, 0xc0, 0x6c, 0xc6, 0xd8, 0x66, 0x18, 0x18, | ||
28 | 0x6c, 0x6c, 0x66, 0x00, 0x60, 0x30, 0xc6, 0xfe, 0x00, 0x00, 0x00, | ||
29 | 0x18, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, | ||
30 | 0x00, 0xd8, 0xcc, 0xc0, 0x6c, 0x60, 0xd8, 0x66, 0x18, 0x3c, 0xc6, | ||
31 | 0x6c, 0x66, 0x7e, 0x7e, 0x60, 0xc6, 0x00, 0x00, 0x30, 0x0c, 0x18, | ||
32 | 0xd8, 0x18, 0xdc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x7e, 0x00, | ||
33 | 0xd8, 0xcc, 0xc0, 0x6c, 0x30, 0xd8, 0x66, 0x18, 0x66, 0xc6, 0x6c, | ||
34 | 0x66, 0xdb, 0xf3, 0x60, 0xc6, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, | ||
35 | 0x00, 0x76, 0x00, 0x18, 0x00, 0x6c, 0x00, 0x00, 0x7e, 0x00, 0xd8, | ||
36 | 0xc8, 0xc0, 0x6c, 0x18, 0xd8, 0x66, 0x18, 0x66, 0xc6, 0x6c, 0x66, | ||
37 | 0xdb, 0xdb, 0x60, 0xc6, 0xfe, 0x18, 0x0c, 0x30, 0x18, 0x18, 0x7e, | ||
38 | 0x00, 0x00, 0x18, 0x18, 0xec, 0x00, 0x00, 0x7e, 0x00, 0xdc, 0xdc, | ||
39 | 0xc0, 0x6c, 0x18, 0xd8, 0x66, 0x18, 0x66, 0xfe, 0xc6, 0x3e, 0xdb, | ||
40 | 0xdb, 0x7c, 0xc6, 0x00, 0x7e, 0x06, 0x60, 0x18, 0x18, 0x00, 0xdc, | ||
41 | 0x00, 0x00, 0x00, 0x0c, 0x36, 0x7e, 0x7e, 0x00, 0x76, 0xce, 0xc0, | ||
42 | 0xfe, 0x30, 0x7e, 0x66, 0xdc, 0x66, 0xc6, 0xc6, 0x0c, 0x7e, 0x7e, | ||
43 | 0x60, 0xc6, 0x00, 0x18, 0x0c, 0x30, 0x18, 0x18, 0x18, 0x76, 0x00, | ||
44 | 0x00, 0x00, 0x0c, 0x36, 0x32, 0x7e, 0x00, 0x00, 0xc6, 0xc6, 0x00, | ||
45 | 0x60, 0x00, 0x00, 0x76, 0x3c, 0xc6, 0xc6, 0x18, 0x00, 0x06, 0x60, | ||
46 | 0xc6, 0xfe, 0x18, 0x18, 0x18, 0x1b, 0x18, 0x00, 0x00, 0x38, 0x00, | ||
47 | 0x00, 0x0c, 0x36, 0x18, 0x7e, 0x00, 0x00, 0xce, 0xc6, 0x00, 0xc6, | ||
48 | 0x00, 0x00, 0x00, 0x18, 0x6c, 0x6c, 0x30, 0x00, 0x03, 0x30, 0x7c, | ||
49 | 0x00, 0x00, 0x30, 0x0c, 0x1b, 0x18, 0x00, 0x00, 0x6c, 0x00, 0x00, | ||
50 | 0x0c, 0x36, 0x0c, 0x00, 0x00, 0x00, 0x7c, 0xfe, 0x00, 0xfe, 0x00, | ||
51 | 0x00, 0x00, 0x7e, 0x38, 0x38, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x00, | ||
52 | 0x00, 0x00, 0x00, 0x0e, 0x18, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x0c, | ||
53 | 0x36, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
55 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0f, 0x6c, | ||
56 | 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
58 | 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
59 | 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, | ||
60 | 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, | ||
61 | 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, | ||
62 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, | ||
63 | 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, | ||
64 | 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, | ||
65 | 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, | ||
66 | 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, | ||
67 | 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, | ||
68 | 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, | ||
69 | 0x36, 0x00, 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, | ||
70 | 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, | ||
71 | 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, | ||
72 | 0x00, 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, | ||
73 | 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x18, | ||
74 | 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, | ||
75 | 0x36, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, | ||
76 | 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x18, 0x18, | ||
77 | 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, | ||
78 | 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, | ||
79 | 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, | ||
80 | 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, | ||
81 | 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, | ||
82 | 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x1f, 0xff, 0xff, 0x1f, 0xff, 0xff, | ||
83 | 0x1f, 0x37, 0x3f, 0x37, 0xff, 0xf7, 0x37, 0xff, 0xf7, 0xff, 0xff, | ||
84 | 0xff, 0xff, 0x3f, 0x1f, 0x1f, 0x3f, 0xff, 0xff, 0xf8, 0x1f, 0xff, | ||
85 | 0xff, 0xf0, 0x0f, 0x00, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, | ||
86 | 0x36, 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, | ||
87 | 0x00, 0x36, 0x18, 0x18, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, | ||
88 | 0xf0, 0x0f, 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x1f, 0x36, | ||
89 | 0x37, 0x3f, 0xf7, 0xff, 0x37, 0xff, 0xf7, 0xff, 0x36, 0xff, 0x00, | ||
90 | 0x36, 0x1f, 0x1f, 0x00, 0x36, 0xff, 0x18, 0x00, 0xff, 0x00, 0xf0, | ||
91 | 0x0f, 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, | ||
92 | 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x36, 0x00, 0x00, 0x36, | ||
93 | 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, | ||
94 | 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, | ||
95 | 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x36, 0x00, 0x00, 0x36, 0x18, | ||
96 | 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, | ||
97 | 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, | ||
98 | 0x00, 0x36, 0x00, 0x36, 0x18, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, | ||
99 | 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x18, | ||
100 | 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, | ||
101 | 0x36, 0x00, 0x36, 0x18, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, | ||
102 | 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x18, 0x18, | ||
103 | 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, | ||
104 | 0x00, 0x36, 0x18, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, | ||
105 | 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0x00, | ||
106 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
107 | 0x00, 0x00, 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, | ||
108 | 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, | ||
109 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
110 | 0x00, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, | ||
111 | 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
112 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x00, | ||
113 | 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, | ||
114 | 0x36, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x11, | ||
116 | 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, | ||
117 | 0x00, 0x00, 0x00, 0x18, 0x76, 0x18, 0x7c, 0x78, 0x66, 0xc6, 0x00, | ||
118 | 0x00, 0x7c, 0x00, 0x00, 0x0c, 0x3f, 0x18, 0x00, 0x00, 0x44, 0xaa, | ||
119 | 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, | ||
120 | 0x00, 0x00, 0x18, 0xcc, 0x18, 0xc6, 0xcc, 0x66, 0xc6, 0x00, 0x00, | ||
121 | 0xc6, 0xc0, 0x06, 0x86, 0x9a, 0x3c, 0x00, 0x00, 0x11, 0x55, 0xdd, | ||
122 | 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, | ||
123 | 0x00, 0x18, 0xcc, 0x18, 0xc6, 0xcc, 0x66, 0xc6, 0x00, 0x00, 0xc6, | ||
124 | 0xc0, 0x06, 0xdc, 0xce, 0x3c, 0x36, 0xd8, 0x44, 0xaa, 0x77, 0x18, | ||
125 | 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, | ||
126 | 0x18, 0xcc, 0x18, 0xc6, 0xcc, 0x66, 0xce, 0x00, 0x00, 0xc0, 0xc0, | ||
127 | 0x06, 0x60, 0x66, 0x3c, 0x6c, 0x6c, 0x11, 0x55, 0xdd, 0x18, 0x18, | ||
128 | 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, | ||
129 | 0x7c, 0x18, 0xc6, 0xcc, 0x66, 0xde, 0x7e, 0x7c, 0x60, 0xc0, 0x06, | ||
130 | 0x30, 0x30, 0x18, 0xd8, 0x36, 0x44, 0xaa, 0x77, 0x18, 0xf8, 0xf8, | ||
131 | 0xf6, 0xfe, 0xf8, 0xf6, 0x36, 0xf6, 0xfe, 0xfe, 0xf8, 0xf8, 0x0c, | ||
132 | 0x18, 0xc6, 0xcc, 0x66, 0xfe, 0x00, 0x00, 0x30, 0xfe, 0xfe, 0x18, | ||
133 | 0x18, 0x18, 0x6c, 0x6c, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, | ||
134 | 0x00, 0x18, 0x06, 0x36, 0x06, 0x06, 0x36, 0x18, 0x00, 0x78, 0x38, | ||
135 | 0x7c, 0xcc, 0x5c, 0xf6, 0x3e, 0x38, 0x30, 0x00, 0x00, 0x6c, 0x6c, | ||
136 | 0x18, 0x36, 0xd8, 0x44, 0xaa, 0x77, 0x18, 0x18, 0xf8, 0x36, 0x00, | ||
137 | 0xf8, 0xf6, 0x36, 0xfe, 0xf6, 0x36, 0xf8, 0x00, 0x00, 0x00, 0x00, | ||
138 | 0x00, 0x00, 0xe6, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, | ||
139 | 0x00, 0x00, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, | ||
140 | 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, 0x60, 0x30, 0x60, 0x60, | ||
141 | 0xdc, 0xc6, 0x6c, 0x6c, 0x30, 0x00, 0x00, 0x62, 0x62, 0x18, 0x00, | ||
142 | 0x00, 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, | ||
143 | 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, 0x30, 0x18, 0x30, 0x30, 0x76, | ||
144 | 0x00, 0x3c, 0x38, 0x30, 0x00, 0x00, 0xe0, 0xe0, 0x18, 0x00, 0x00, | ||
145 | 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, | ||
146 | 0x00, 0x36, 0x36, 0x18, 0x00, 0x18, 0x0c, 0x18, 0x18, 0x00, 0xdc, | ||
147 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x44, | ||
148 | 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, | ||
149 | 0x36, 0x36, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, | ||
150 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x55, | ||
151 | 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, | ||
152 | 0x36, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
156 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
157 | 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
158 | 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, | ||
159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
160 | 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
161 | 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, | ||
162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
163 | 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, | ||
164 | 0x78, 0x7c, 0x76, 0x76, 0x76, 0x76, 0x7c, 0x7c, 0x7c, 0x7c, 0x18, | ||
165 | 0x18, 0x18, 0xc6, 0xc6, 0xfc, 0x6e, 0xce, 0x7c, 0x7c, 0x7c, 0x78, | ||
166 | 0x78, 0x76, 0x7c, 0x7c, 0x18, 0xfe, 0x18, 0xc6, 0x70, 0x3c, 0xcc, | ||
167 | 0xc2, 0xcc, 0xcc, 0xcc, 0xcc, 0xc6, 0xc2, 0xc2, 0xc2, 0x18, 0x18, | ||
168 | 0x18, 0xc6, 0xc6, 0xc0, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, | ||
169 | 0xce, 0xc6, 0xc6, 0x18, 0x60, 0x7e, 0xcc, 0xd8, 0x66, 0xcc, 0xc0, | ||
170 | 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x18, 0x18, 0x18, | ||
171 | 0xc6, 0xc6, 0xc0, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, | ||
172 | 0xc6, 0xc6, 0x7c, 0x60, 0x18, 0xcc, 0x18, 0xc6, 0xcc, 0xc0, 0xcc, | ||
173 | 0xcc, 0xcc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x18, 0x18, 0x18, 0xfe, | ||
174 | 0xc6, 0xc0, 0x7e, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, | ||
175 | 0xc6, 0xc6, 0x60, 0x7e, 0xcc, 0x18, 0xc0, 0xcc, 0xfe, 0x7c, 0x7c, | ||
176 | 0x7c, 0x7c, 0xc0, 0xfe, 0xfe, 0xfe, 0x18, 0x18, 0x18, 0xc6, 0xfe, | ||
177 | 0xf0, 0x36, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, | ||
178 | 0xc0, 0x60, 0x18, 0xde, 0x18, 0xc0, 0xcc, 0xc6, 0x0c, 0x0c, 0x0c, | ||
179 | 0x0c, 0xc6, 0xc6, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0xc6, 0xc6, 0xc0, | ||
180 | 0x36, 0xfe, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0xc0, | ||
181 | 0xf8, 0x3c, 0xcc, 0x7e, 0xc0, 0xcc, 0x7c, 0x78, 0x78, 0x78, 0x78, | ||
182 | 0x7c, 0x7c, 0x7c, 0x7c, 0x38, 0x38, 0x38, 0x6c, 0x6c, 0xc0, 0xec, | ||
183 | 0xcc, 0x7c, 0x7c, 0x7c, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0xc0, 0x60, | ||
184 | 0x66, 0xc4, 0x18, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0xc0, 0x00, 0xcc, | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x60, 0x66, | ||
187 | 0xf8, 0x18, 0x3c, 0xcc, 0x30, 0x6c, 0x00, 0x18, 0x38, 0x00, 0x6c, | ||
188 | 0x00, 0x18, 0x00, 0x66, 0x18, 0x10, 0x10, 0xfc, 0x00, 0x6c, 0x6c, | ||
189 | 0x00, 0x18, 0xcc, 0x18, 0x00, 0x7c, 0xc6, 0x7c, 0x62, 0x66, 0xcc, | ||
190 | 0x18, 0x00, 0xcc, 0x18, 0x38, 0xcc, 0x30, 0x6c, 0x00, 0x38, 0xc6, | ||
191 | 0x30, 0x66, 0x3c, 0x30, 0x00, 0x38, 0x00, 0x00, 0x3e, 0x38, 0xc6, | ||
192 | 0x30, 0x78, 0x30, 0xc6, 0x00, 0x00, 0x18, 0x3c, 0x66, 0xcc, 0x1b, | ||
193 | 0x00, 0x00, 0x0c, 0x10, 0x00, 0x60, 0x38, 0x00, 0x10, 0x00, 0x60, | ||
194 | 0x00, 0x18, 0x60, 0xc6, 0x6c, 0x30, 0x00, 0x00, 0x10, 0x00, 0x60, | ||
195 | 0x30, 0x60, 0x00, 0xc6, 0xc6, 0x18, 0x00, 0x00, 0xf8, 0x0e, 0x00, | ||
196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
197 | 0x00, 0x00, 0x00, 0x38, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
202 | 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, | ||
203 | 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
204 | 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
205 | 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, | ||
206 | 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
208 | 0x00, 0x00, 0x0c, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
209 | 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xf8, 0x78, 0x7c, 0x7c, | ||
211 | 0x30, 0x7c, 0xcc, 0x18, 0x0c, 0xcc, 0x18, 0xc6, 0xcc, 0x78, 0xf8, | ||
212 | 0x7c, 0xc0, 0x7c, 0x30, 0x78, 0x10, 0x6c, 0xc6, 0x76, 0xfe, 0x0e, | ||
213 | 0x18, 0x70, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xc4, 0xcc, 0xc2, 0x30, | ||
214 | 0xcc, 0xcc, 0x18, 0x0c, 0xcc, 0x18, 0xd6, 0xcc, 0xcc, 0xcc, 0xcc, | ||
215 | 0xc0, 0x86, 0x30, 0xcc, 0x6c, 0xfe, 0x6c, 0xce, 0xc0, 0x18, 0x18, | ||
216 | 0x18, 0x00, 0xfe, 0x00, 0xcc, 0xcc, 0xc0, 0xcc, 0xc0, 0x30, 0xcc, | ||
217 | 0xcc, 0x18, 0x0c, 0xd8, 0x18, 0xd6, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, | ||
218 | 0x06, 0x30, 0xcc, 0xc6, 0xd6, 0x38, 0xc6, 0x60, 0x18, 0x18, 0x18, | ||
219 | 0x00, 0xc6, 0x00, 0xcc, 0xcc, 0xc0, 0xcc, 0xc0, 0x30, 0xcc, 0xcc, | ||
220 | 0x18, 0x0c, 0xf0, 0x18, 0xd6, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, 0x1c, | ||
221 | 0x30, 0xcc, 0xc6, 0xd6, 0x38, 0xc6, 0x30, 0x18, 0x18, 0x18, 0x00, | ||
222 | 0xc6, 0x00, 0x7c, 0xcc, 0xc0, 0xcc, 0xfe, 0x30, 0xcc, 0xcc, 0x18, | ||
223 | 0x0c, 0xf0, 0x18, 0xd6, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x70, 0x30, | ||
224 | 0xcc, 0xc6, 0xd6, 0x38, 0xc6, 0x18, 0x18, 0x18, 0x18, 0x00, 0xc6, | ||
225 | 0x00, 0x0c, 0xcc, 0xc4, 0xcc, 0xc6, 0x78, 0xcc, 0xec, 0x18, 0x0c, | ||
226 | 0xd8, 0x18, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xec, 0xc2, 0x30, 0xcc, | ||
227 | 0xc6, 0xc6, 0x6c, 0xc6, 0x0c, 0x70, 0x18, 0x0e, 0x00, 0x6c, 0x00, | ||
228 | 0x78, 0xf8, 0x78, 0x7c, 0x7c, 0x30, 0x7c, 0xd8, 0x38, 0x0c, 0xcc, | ||
229 | 0x18, 0xec, 0xb8, 0x78, 0xf8, 0x7c, 0xb8, 0x7c, 0xfc, 0xcc, 0xc6, | ||
230 | 0xc6, 0xc6, 0xc6, 0xfe, 0x18, 0x18, 0x18, 0x00, 0x38, 0x00, 0x00, | ||
231 | 0xc0, 0x00, 0x0c, 0x00, 0x32, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x18, | ||
232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, | ||
233 | 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x10, 0x0c, 0x00, 0xc0, | ||
234 | 0x00, 0x0c, 0x00, 0x36, 0x00, 0xc0, 0x18, 0x0c, 0xc0, 0x18, 0x00, | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, | ||
236 | 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, 0xc0, 0x00, | ||
237 | 0x0c, 0x00, 0x1c, 0x00, 0xc0, 0x18, 0x0c, 0xc0, 0x38, 0x00, 0x00, | ||
238 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
239 | 0x00, 0x0e, 0x18, 0x70, 0xdc, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, | ||
240 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
242 | 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
243 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
244 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
245 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
246 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
247 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
251 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, | ||
253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
254 | 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
255 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, | ||
256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
257 | 0x7c, 0xc6, 0xfc, 0x3c, 0xf8, 0xfc, 0xc0, 0x3e, 0xc6, 0x18, 0x78, | ||
258 | 0xc2, 0xfc, 0xc6, 0xc6, 0x7c, 0xc0, 0x7c, 0xc6, 0x7c, 0x18, 0x7c, | ||
259 | 0x10, 0x6c, 0xc6, 0x18, 0xfe, 0x3c, 0x02, 0x3c, 0x00, 0x00, 0xc0, | ||
260 | 0xc6, 0xc6, 0x66, 0xdc, 0xc0, 0xc0, 0x66, 0xc6, 0x18, 0xcc, 0xc6, | ||
261 | 0xc0, 0xc6, 0xc6, 0xc6, 0xc0, 0xde, 0xc6, 0x86, 0x18, 0xc6, 0x38, | ||
262 | 0xee, 0xc6, 0x18, 0xc0, 0x30, 0x06, 0x0c, 0x00, 0x00, 0xdc, 0xc6, | ||
263 | 0xc6, 0xc2, 0xce, 0xc0, 0xc0, 0xc6, 0xc6, 0x18, 0xcc, 0xcc, 0xc0, | ||
264 | 0xc6, 0xc6, 0xc6, 0xc0, 0xd6, 0xcc, 0x06, 0x18, 0xc6, 0x6c, 0xfe, | ||
265 | 0x6c, 0x18, 0xc0, 0x30, 0x0e, 0x0c, 0x00, 0x00, 0xde, 0xc6, 0xc6, | ||
266 | 0xc0, 0xc6, 0xc0, 0xc0, 0xc6, 0xc6, 0x18, 0xcc, 0xd8, 0xc0, 0xc6, | ||
267 | 0xc6, 0xc6, 0xc0, 0xc6, 0xcc, 0x06, 0x18, 0xc6, 0xc6, 0xd6, 0x7c, | ||
268 | 0x18, 0x60, 0x30, 0x1c, 0x0c, 0x00, 0x00, 0xde, 0xfe, 0xc6, 0xc0, | ||
269 | 0xc6, 0xc0, 0xc0, 0xde, 0xc6, 0x18, 0x0c, 0xf0, 0xc0, 0xc6, 0xce, | ||
270 | 0xc6, 0xc0, 0xc6, 0xd8, 0x0c, 0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x18, | ||
271 | 0x30, 0x30, 0x38, 0x0c, 0x00, 0x00, 0xde, 0xc6, 0xfc, 0xc0, 0xc6, | ||
272 | 0xf8, 0xf8, 0xc0, 0xfe, 0x18, 0x0c, 0xf0, 0xc0, 0xd6, 0xde, 0xc6, | ||
273 | 0xfc, 0xc6, 0xfc, 0x38, 0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x3c, 0x18, | ||
274 | 0x30, 0x70, 0x0c, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc0, 0xc6, 0xc0, | ||
275 | 0xc0, 0xc0, 0xc6, 0x18, 0x0c, 0xd8, 0xc0, 0xfe, 0xfe, 0xc6, 0xc6, | ||
276 | 0xc6, 0xc6, 0x60, 0x18, 0xc6, 0xc6, 0xc6, 0x7c, 0x66, 0x0c, 0x30, | ||
277 | 0xe0, 0x0c, 0x00, 0x00, 0xc6, 0x6c, 0xc6, 0xc2, 0xce, 0xc0, 0xc0, | ||
278 | 0xc0, 0xc6, 0x18, 0x0c, 0xcc, 0xc0, 0xfe, 0xf6, 0xc6, 0xc6, 0xc6, | ||
279 | 0xc6, 0xc0, 0x18, 0xc6, 0xc6, 0xc6, 0x6c, 0x66, 0x06, 0x30, 0xc0, | ||
280 | 0x0c, 0x00, 0x00, 0x7c, 0x38, 0xc6, 0x66, 0xdc, 0xc0, 0xc0, 0x62, | ||
281 | 0xc6, 0x18, 0x0c, 0xc6, 0xc0, 0xee, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, | ||
282 | 0xc2, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0x66, 0x06, 0x30, 0x80, 0x0c, | ||
283 | 0xc6, 0x00, 0x00, 0x10, 0xfc, 0x3c, 0xf8, 0xfc, 0xfc, 0x3c, 0xc6, | ||
284 | 0x18, 0x1e, 0xc2, 0xc0, 0xc6, 0xc6, 0x7c, 0xfc, 0x7c, 0xfc, 0x7c, | ||
285 | 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0x66, 0xfe, 0x3c, 0x00, 0x3c, 0x6c, | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
294 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
295 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
296 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
297 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
298 | 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
299 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
301 | 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, | ||
302 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
303 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x6c, 0x7c, | ||
304 | 0x86, 0x76, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x18, 0x00, 0x18, 0x80, | ||
305 | 0x38, 0x18, 0xfe, 0x7c, 0x0c, 0x7c, 0x7c, 0x30, 0x7c, 0x78, 0x00, | ||
306 | 0x30, 0x06, 0x00, 0x60, 0x18, 0x00, 0x18, 0x00, 0x6c, 0xc6, 0xc6, | ||
307 | 0xcc, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, 0x18, 0xc0, 0x6c, | ||
308 | 0x18, 0xc0, 0x86, 0x0c, 0x86, 0xc6, 0x30, 0xc6, 0x8c, 0x18, 0x18, | ||
309 | 0x0c, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0xfe, 0x86, 0x60, 0xcc, | ||
310 | 0x00, 0x30, 0x0c, 0x66, 0x18, 0x18, 0x00, 0x00, 0x60, 0xc6, 0x18, | ||
311 | 0xc0, 0x06, 0x0c, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x18, 0x18, 0x18, | ||
312 | 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x6c, 0x06, 0x30, 0xcc, 0x00, | ||
313 | 0x30, 0x0c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x30, 0xe6, 0x18, 0x60, | ||
314 | 0x06, 0x0c, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x00, 0x00, 0x30, 0x7e, | ||
315 | 0x0c, 0x18, 0x00, 0x18, 0x00, 0x6c, 0x06, 0x18, 0xdc, 0x00, 0x30, | ||
316 | 0x0c, 0xff, 0x7e, 0x00, 0xfe, 0x00, 0x18, 0xf6, 0x18, 0x30, 0x06, | ||
317 | 0xfe, 0x06, 0xe6, 0x18, 0xc6, 0x06, 0x00, 0x00, 0x60, 0x00, 0x06, | ||
318 | 0x18, 0x00, 0x18, 0x00, 0x6c, 0x7c, 0x0c, 0x76, 0x00, 0x30, 0x0c, | ||
319 | 0x3c, 0x18, 0x00, 0x00, 0x00, 0x0c, 0xde, 0x18, 0x18, 0x3c, 0xcc, | ||
320 | 0xfc, 0xdc, 0x0c, 0x7c, 0x7e, 0x00, 0x00, 0x30, 0x00, 0x0c, 0x18, | ||
321 | 0x00, 0x3c, 0x00, 0xfe, 0xc0, 0xc6, 0x38, 0x00, 0x30, 0x0c, 0x66, | ||
322 | 0x18, 0x00, 0x00, 0x00, 0x06, 0xce, 0x18, 0x0c, 0x06, 0x6c, 0xc0, | ||
323 | 0xc0, 0x06, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x0c, 0x00, | ||
324 | 0x3c, 0x24, 0x6c, 0xc2, 0xc2, 0x6c, 0x60, 0x30, 0x0c, 0x00, 0x00, | ||
325 | 0x00, 0x00, 0x00, 0x02, 0xc6, 0x78, 0x06, 0x06, 0x3c, 0xc0, 0xc0, | ||
326 | 0x06, 0xc6, 0xc6, 0x18, 0x18, 0x0c, 0x00, 0x30, 0xc6, 0x00, 0x3c, | ||
327 | 0x66, 0x6c, 0xc6, 0x00, 0x6c, 0x30, 0x18, 0x18, 0x00, 0x00, 0x00, | ||
328 | 0x00, 0x00, 0x00, 0x6c, 0x38, 0xc6, 0x86, 0x1c, 0xc0, 0x60, 0x06, | ||
329 | 0xc6, 0xc6, 0x00, 0x00, 0x06, 0x00, 0x60, 0xc6, 0x00, 0x18, 0x66, | ||
330 | 0x00, 0x7c, 0x00, 0x38, 0x30, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, | ||
331 | 0x00, 0x00, 0x38, 0x18, 0x7c, 0x7c, 0x0c, 0xfe, 0x3c, 0xfe, 0x7c, | ||
332 | 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x66, 0x00, | ||
333 | 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
335 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, | ||
336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
338 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
339 | 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
342 | 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
343 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
344 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
345 | 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, | ||
348 | 0x00, 0xff, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
349 | 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
350 | 0x00, 0x00, 0x7e, 0x7e, 0x10, 0x00, 0x3c, 0x3c, 0x00, 0xff, 0x00, | ||
351 | 0xff, 0x78, 0x18, 0xe0, 0xe6, 0x18, 0x80, 0x02, 0x00, 0x66, 0x1b, | ||
352 | 0xc6, 0xfe, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
353 | 0x00, 0x81, 0xff, 0x38, 0x10, 0x18, 0x18, 0x00, 0xff, 0x3c, 0xc3, | ||
354 | 0xcc, 0x18, 0xf0, 0xe7, 0x18, 0xc0, 0x06, 0x18, 0x66, 0x1b, 0x0c, | ||
355 | 0xfe, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x10, 0x00, | ||
356 | 0x81, 0xff, 0x7c, 0x38, 0x18, 0x18, 0x18, 0xe7, 0x66, 0x99, 0xcc, | ||
357 | 0x7e, 0x70, 0x67, 0xdb, 0xe0, 0x0e, 0x3c, 0x00, 0x1b, 0x38, 0xfe, | ||
358 | 0x3c, 0x18, 0x7e, 0x18, 0x30, 0xfe, 0x28, 0xfe, 0x38, 0x00, 0x99, | ||
359 | 0xe7, 0xfe, 0x7c, 0xe7, 0x7e, 0x3c, 0xc3, 0x42, 0xbd, 0xcc, 0x18, | ||
360 | 0x30, 0x63, 0x3c, 0xf0, 0x1e, 0x7e, 0x66, 0x1b, 0x6c, 0xfe, 0x7e, | ||
361 | 0x18, 0x18, 0x0c, 0x60, 0xc0, 0x6c, 0x7c, 0x38, 0x00, 0xbd, 0xc3, | ||
362 | 0xfe, 0xfe, 0xe7, 0xff, 0x3c, 0xc3, 0x42, 0xbd, 0xcc, 0x3c, 0x30, | ||
363 | 0x63, 0xe7, 0xf8, 0x3e, 0x18, 0x66, 0x1b, 0xc6, 0x00, 0x18, 0x18, | ||
364 | 0x18, 0xfe, 0xfe, 0xc0, 0xfe, 0x7c, 0x7c, 0x00, 0x81, 0xff, 0xfe, | ||
365 | 0x7c, 0xe7, 0xff, 0x18, 0xe7, 0x66, 0x99, 0x78, 0x66, 0x30, 0x63, | ||
366 | 0x3c, 0xfe, 0xfe, 0x18, 0x66, 0x7b, 0xc6, 0x00, 0x18, 0x18, 0x18, | ||
367 | 0x0c, 0x60, 0xc0, 0x6c, 0x38, 0x7c, 0x00, 0x81, 0xff, 0xfe, 0x38, | ||
368 | 0x3c, 0x7e, 0x00, 0xff, 0x3c, 0xc3, 0x32, 0x66, 0x30, 0x63, 0xdb, | ||
369 | 0xf8, 0x3e, 0x18, 0x66, 0xdb, 0x6c, 0x00, 0x18, 0x18, 0x18, 0x18, | ||
370 | 0x30, 0x00, 0x28, 0x38, 0xfe, 0x00, 0xa5, 0xdb, 0x6c, 0x10, 0x3c, | ||
371 | 0x3c, 0x00, 0xff, 0x00, 0xff, 0x1a, 0x66, 0x3f, 0x7f, 0x18, 0xf0, | ||
372 | 0x1e, 0x7e, 0x66, 0xdb, 0x38, 0x00, 0x7e, 0x7e, 0x18, 0x00, 0x00, | ||
373 | 0x00, 0x00, 0x10, 0xfe, 0x00, 0x81, 0xff, 0x00, 0x00, 0x18, 0x18, | ||
374 | 0x00, 0xff, 0x00, 0xff, 0x0e, 0x66, 0x33, 0x63, 0x18, 0xe0, 0x0e, | ||
375 | 0x3c, 0x66, 0xdb, 0x60, 0x00, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
377 | 0xff, 0x00, 0xff, 0x1e, 0x3c, 0x3f, 0x7f, 0x00, 0xc0, 0x06, 0x18, | ||
378 | 0x66, 0x7f, 0xc6, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, | ||
379 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, | ||
380 | 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, | ||
381 | 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, | ||
383 | 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
385 | }; |
File sdl1/deficon.h added (mode: 100644) (index 00000000..7248ab50) | |||
1 | /* The PDCurses logo as #include'able BMP (from ../x11/little_icon.xbm) */ | ||
2 | |||
3 | unsigned char deficon[] = | ||
4 | { | ||
5 | 0x42, 0x4d, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, | ||
6 | 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, | ||
7 | 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | ||
8 | 0x00, 0x80, 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b, | ||
9 | 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, | ||
10 | 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, | ||
11 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x6f, 0x9c, | ||
12 | 0xe7, 0xb5, 0xaf, 0x6b, 0x5b, 0xbd, 0xaf, 0xeb, 0xfb, 0xbd, 0xaf, | ||
13 | 0x98, 0xe7, 0xbd, 0xaf, 0x7b, 0x5f, 0xb5, 0xa5, 0x6b, 0x5b, 0xcd, | ||
14 | 0xab, 0x9c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||
15 | 0xff, 0xcf, 0x03, 0xff, 0xff, 0xce, 0x03, 0xff, 0xff, 0xcc, 0x73, | ||
16 | 0xff, 0xff, 0xcc, 0xf3, 0xff, 0xff, 0xcc, 0xf3, 0xff, 0xff, 0xcc, | ||
17 | 0x73, 0xff, 0xff, 0xc6, 0x33, 0xff, 0xff, 0xc3, 0x13, 0xff, 0xff, | ||
18 | 0xc1, 0x83, 0xff, 0xff, 0xc8, 0xc3, 0xff, 0xff, 0xcc, 0x63, 0xff, | ||
19 | 0xff, 0xce, 0x33, 0xff, 0xff, 0xcf, 0x33, 0xff, 0xff, 0xcf, 0x33, | ||
20 | 0xff, 0xff, 0xce, 0x33, 0xff, 0xff, 0xc0, 0x73, 0xff, 0xff, 0xc0, | ||
21 | 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | ||
22 | 0xff, 0xff, 0xff | ||
23 | }; |
File sdl1/pdcclip.c added (mode: 100644) (index 00000000..203c975d) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcclip.c,v 1.6 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | |||
9 | /*man-start************************************************************** | ||
10 | |||
11 | Name: clipboard | ||
12 | |||
13 | Synopsis: | ||
14 | int PDC_getclipboard(char **contents, long *length); | ||
15 | int PDC_setclipboard(const char *contents, long length); | ||
16 | int PDC_freeclipboard(char *contents); | ||
17 | int PDC_clearclipboard(void); | ||
18 | |||
19 | Description: | ||
20 | PDC_getclipboard() gets the textual contents of the system's | ||
21 | clipboard. This function returns the contents of the clipboard | ||
22 | in the contents argument. It is the responsibilitiy of the | ||
23 | caller to free the memory returned, via PDC_freeclipboard(). | ||
24 | The length of the clipboard contents is returned in the length | ||
25 | argument. | ||
26 | |||
27 | PDC_setclipboard copies the supplied text into the system's | ||
28 | clipboard, emptying the clipboard prior to the copy. | ||
29 | |||
30 | PDC_clearclipboard() clears the internal clipboard. | ||
31 | |||
32 | Return Values: | ||
33 | indicator of success/failure of call. | ||
34 | PDC_CLIP_SUCCESS the call was successful | ||
35 | PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for | ||
36 | the clipboard contents | ||
37 | PDC_CLIP_EMPTY the clipboard contains no text | ||
38 | PDC_CLIP_ACCESS_ERROR no clipboard support | ||
39 | |||
40 | Portability X/Open BSD SYS V | ||
41 | PDC_getclipboard - - - | ||
42 | PDC_setclipboard - - - | ||
43 | PDC_freeclipboard - - - | ||
44 | PDC_clearclipboard - - - | ||
45 | |||
46 | **man-end****************************************************************/ | ||
47 | |||
48 | /* global clipboard contents, should be NULL if none set */ | ||
49 | |||
50 | static char *pdc_SDL_clipboard = NULL; | ||
51 | |||
52 | int PDC_getclipboard(char **contents, long *length) | ||
53 | { | ||
54 | int len; | ||
55 | |||
56 | PDC_LOG(("PDC_getclipboard() - called\n")); | ||
57 | |||
58 | if (!pdc_SDL_clipboard) | ||
59 | return PDC_CLIP_EMPTY; | ||
60 | |||
61 | len = strlen(pdc_SDL_clipboard); | ||
62 | if ((*contents = malloc(len + 1)) == NULL) | ||
63 | return PDC_CLIP_MEMORY_ERROR; | ||
64 | |||
65 | strcpy(*contents, pdc_SDL_clipboard); | ||
66 | *length = len; | ||
67 | |||
68 | return PDC_CLIP_SUCCESS; | ||
69 | } | ||
70 | |||
71 | int PDC_setclipboard(const char *contents, long length) | ||
72 | { | ||
73 | PDC_LOG(("PDC_setclipboard() - called\n")); | ||
74 | |||
75 | if (pdc_SDL_clipboard) | ||
76 | { | ||
77 | free(pdc_SDL_clipboard); | ||
78 | pdc_SDL_clipboard = NULL; | ||
79 | } | ||
80 | |||
81 | if (contents) | ||
82 | { | ||
83 | if ((pdc_SDL_clipboard = malloc(length + 1)) == NULL) | ||
84 | return PDC_CLIP_MEMORY_ERROR; | ||
85 | |||
86 | strcpy(pdc_SDL_clipboard, contents); | ||
87 | } | ||
88 | |||
89 | return PDC_CLIP_SUCCESS; | ||
90 | } | ||
91 | |||
92 | int PDC_freeclipboard(char *contents) | ||
93 | { | ||
94 | PDC_LOG(("PDC_freeclipboard() - called\n")); | ||
95 | |||
96 | /* should we also free empty the system clipboard? probably not */ | ||
97 | |||
98 | if (contents) | ||
99 | { | ||
100 | /* NOTE: We free the memory, but we can not set caller's pointer | ||
101 | to NULL, so if caller calls again then will try to access | ||
102 | free'd memory. We 1st overwrite memory with a string so if | ||
103 | caller tries to use free memory they won't get what they | ||
104 | expect & hopefully notice. */ | ||
105 | |||
106 | /* memset(contents, 0xFD, strlen(contents)); */ | ||
107 | |||
108 | if (strlen(contents) >= strlen("PDCURSES")) | ||
109 | strcpy(contents, "PDCURSES"); | ||
110 | |||
111 | free(contents); | ||
112 | } | ||
113 | |||
114 | return PDC_CLIP_SUCCESS; | ||
115 | } | ||
116 | |||
117 | int PDC_clearclipboard(void) | ||
118 | { | ||
119 | PDC_LOG(("PDC_clearclipboard() - called\n")); | ||
120 | |||
121 | if (pdc_SDL_clipboard) | ||
122 | { | ||
123 | free(pdc_SDL_clipboard); | ||
124 | pdc_SDL_clipboard = NULL; | ||
125 | } | ||
126 | |||
127 | return PDC_CLIP_SUCCESS; | ||
128 | } |
File sdl1/pdcdisp.c added (mode: 100644) (index 00000000..3712e662) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcdisp.c,v 1.35 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | |||
10 | #ifdef CHTYPE_LONG | ||
11 | |||
12 | # define A(x) ((chtype)x | A_ALTCHARSET) | ||
13 | |||
14 | chtype acs_map[128] = | ||
15 | { | ||
16 | A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), | ||
17 | A(10), A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), | ||
18 | A(19), A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), | ||
19 | A(28), A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', | ||
20 | '\'', '(', ')', '*', | ||
21 | |||
22 | A(0x1a), A(0x1b), A(0x18), A(0x19), | ||
23 | |||
24 | '/', | ||
25 | |||
26 | 0xdb, | ||
27 | |||
28 | '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', | ||
29 | '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | ||
30 | 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | ||
31 | 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', | ||
32 | |||
33 | A(0x04), 0xb1, | ||
34 | |||
35 | 'b', 'c', 'd', 'e', | ||
36 | |||
37 | 0xf8, 0xf1, 0xb0, A(0x0f), 0xd9, 0xbf, 0xda, 0xc0, 0xc5, 0x2d, | ||
38 | 0x2d, 0xc4, 0x2d, 0x5f, 0xc3, 0xb4, 0xc1, 0xc2, 0xb3, 0xf3, | ||
39 | 0xf2, 0xe3, 0xd8, 0x9c, 0xf9, | ||
40 | |||
41 | A(127) | ||
42 | }; | ||
43 | |||
44 | # undef A | ||
45 | |||
46 | #endif | ||
47 | |||
48 | Uint32 pdc_lastupdate = 0; | ||
49 | |||
50 | #define MAXRECT 200 /* maximum number of rects to queue up before | ||
51 | an update is forced; the number was chosen | ||
52 | arbitrarily */ | ||
53 | |||
54 | static SDL_Rect uprect[MAXRECT]; /* table of rects to update */ | ||
55 | static chtype oldch = (chtype)(-1); /* current attribute */ | ||
56 | static int rectcount = 0; /* index into uprect */ | ||
57 | static short foregr = -2, backgr = -2; /* current foreground, background */ | ||
58 | |||
59 | /* do the real updates on a delay */ | ||
60 | |||
61 | void PDC_update_rects(void) | ||
62 | { | ||
63 | if (rectcount) | ||
64 | { | ||
65 | /* if the maximum number of rects has been reached, we're | ||
66 | probably better off doing a full screen update */ | ||
67 | |||
68 | if (rectcount == MAXRECT) | ||
69 | SDL_Flip(pdc_screen); | ||
70 | else | ||
71 | SDL_UpdateRects(pdc_screen, rectcount, uprect); | ||
72 | |||
73 | pdc_lastupdate = SDL_GetTicks(); | ||
74 | rectcount = 0; | ||
75 | } | ||
76 | } | ||
77 | |||
78 | /* set the font colors to match the chtype's attribute */ | ||
79 | |||
80 | static void _set_attr(chtype ch) | ||
81 | { | ||
82 | ch &= (A_COLOR|A_BOLD|A_BLINK|A_REVERSE); | ||
83 | |||
84 | if (oldch != ch) | ||
85 | { | ||
86 | short newfg, newbg; | ||
87 | |||
88 | if (SP->mono) | ||
89 | return; | ||
90 | |||
91 | PDC_pair_content(PAIR_NUMBER(ch), &newfg, &newbg); | ||
92 | |||
93 | newfg |= (ch & A_BOLD) ? 8 : 0; | ||
94 | newbg |= (ch & A_BLINK) ? 8 : 0; | ||
95 | |||
96 | if (ch & A_REVERSE) | ||
97 | { | ||
98 | short tmp = newfg; | ||
99 | newfg = newbg; | ||
100 | newbg = tmp; | ||
101 | } | ||
102 | |||
103 | if (newfg != foregr) | ||
104 | { | ||
105 | SDL_SetPalette(pdc_font, SDL_LOGPAL, | ||
106 | pdc_color + newfg, pdc_flastc, 1); | ||
107 | foregr = newfg; | ||
108 | } | ||
109 | |||
110 | if (newbg != backgr) | ||
111 | { | ||
112 | if (newbg == -1) | ||
113 | SDL_SetColorKey(pdc_font, SDL_SRCCOLORKEY, 0); | ||
114 | else | ||
115 | { | ||
116 | if (backgr == -1) | ||
117 | SDL_SetColorKey(pdc_font, 0, 0); | ||
118 | |||
119 | SDL_SetPalette(pdc_font, SDL_LOGPAL, | ||
120 | pdc_color + newbg, 0, 1); | ||
121 | } | ||
122 | |||
123 | backgr = newbg; | ||
124 | } | ||
125 | |||
126 | oldch = ch; | ||
127 | } | ||
128 | } | ||
129 | |||
130 | /* draw a cursor at (y, x) */ | ||
131 | |||
132 | void PDC_gotoyx(int row, int col) | ||
133 | { | ||
134 | SDL_Rect src, dest; | ||
135 | chtype ch; | ||
136 | int oldrow, oldcol; | ||
137 | |||
138 | PDC_LOG(("PDC_gotoyx() - called: row %d col %d from row %d col %d\n", | ||
139 | row, col, SP->cursrow, SP->curscol)); | ||
140 | |||
141 | if (SP->mono) | ||
142 | return; | ||
143 | |||
144 | oldrow = SP->cursrow; | ||
145 | oldcol = SP->curscol; | ||
146 | |||
147 | /* clear the old cursor */ | ||
148 | |||
149 | PDC_transform_line(oldrow, oldcol, 1, curscr->_y[oldrow] + oldcol); | ||
150 | |||
151 | if (!SP->visibility) | ||
152 | return; | ||
153 | |||
154 | /* draw a new cursor by overprinting the existing character in | ||
155 | reverse, either the full cell (when visibility == 2) or the | ||
156 | lowest quarter of it (when visibility == 1) */ | ||
157 | |||
158 | ch = curscr->_y[row][col] ^ A_REVERSE; | ||
159 | |||
160 | _set_attr(ch); | ||
161 | |||
162 | #ifdef CHTYPE_LONG | ||
163 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
164 | ch = acs_map[ch & 0x7f]; | ||
165 | #endif | ||
166 | src.h = (SP->visibility == 1) ? pdc_fheight >> 2 : pdc_fheight; | ||
167 | src.w = pdc_fwidth; | ||
168 | |||
169 | dest.y = (row + 1) * pdc_fheight - src.h + pdc_yoffset; | ||
170 | dest.x = col * pdc_fwidth + pdc_xoffset; | ||
171 | |||
172 | src.x = (ch & 0xff) % 32 * pdc_fwidth; | ||
173 | src.y = (ch & 0xff) / 32 * pdc_fheight + (pdc_fheight - src.h); | ||
174 | |||
175 | SDL_BlitSurface(pdc_font, &src, pdc_screen, &dest); | ||
176 | |||
177 | if (oldrow != row || oldcol != col) | ||
178 | { | ||
179 | if (rectcount == MAXRECT) | ||
180 | PDC_update_rects(); | ||
181 | |||
182 | uprect[rectcount++] = dest; | ||
183 | } | ||
184 | } | ||
185 | |||
186 | /* handle the A_*LINE attributes */ | ||
187 | |||
188 | static void _highlight(SDL_Rect *src, SDL_Rect *dest, chtype ch) | ||
189 | { | ||
190 | short col = SP->line_color; | ||
191 | |||
192 | if (SP->mono) | ||
193 | return; | ||
194 | |||
195 | if (ch & A_UNDERLINE) | ||
196 | { | ||
197 | if (col != -1) | ||
198 | SDL_SetPalette(pdc_font, SDL_LOGPAL, | ||
199 | pdc_color + col, pdc_flastc, 1); | ||
200 | |||
201 | src->x = '_' % 32 * pdc_fwidth; | ||
202 | src->y = '_' / 32 * pdc_fheight; | ||
203 | |||
204 | if (backgr != -1) | ||
205 | SDL_SetColorKey(pdc_font, SDL_SRCCOLORKEY, 0); | ||
206 | |||
207 | SDL_BlitSurface(pdc_font, src, pdc_screen, dest); | ||
208 | |||
209 | if (backgr != -1) | ||
210 | SDL_SetColorKey(pdc_font, 0, 0); | ||
211 | |||
212 | if (col != -1) | ||
213 | SDL_SetPalette(pdc_font, SDL_LOGPAL, | ||
214 | pdc_color + foregr, pdc_flastc, 1); | ||
215 | } | ||
216 | |||
217 | if (ch & (A_LEFTLINE|A_RIGHTLINE)) | ||
218 | { | ||
219 | if (col == -1) | ||
220 | col = foregr; | ||
221 | |||
222 | dest->w = 1; | ||
223 | |||
224 | if (ch & A_LEFTLINE) | ||
225 | SDL_FillRect(pdc_screen, dest, pdc_mapped[col]); | ||
226 | |||
227 | if (ch & A_RIGHTLINE) | ||
228 | { | ||
229 | dest->x += pdc_fwidth - 1; | ||
230 | SDL_FillRect(pdc_screen, dest, pdc_mapped[col]); | ||
231 | dest->x -= pdc_fwidth - 1; | ||
232 | } | ||
233 | |||
234 | dest->w = pdc_fwidth; | ||
235 | } | ||
236 | } | ||
237 | |||
238 | /* update the given physical line to look like the corresponding line in | ||
239 | curscr */ | ||
240 | |||
241 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp) | ||
242 | { | ||
243 | SDL_Rect src, dest, lastrect; | ||
244 | int j; | ||
245 | |||
246 | PDC_LOG(("PDC_transform_line() - called: lineno=%d\n", lineno)); | ||
247 | |||
248 | if (rectcount == MAXRECT) | ||
249 | PDC_update_rects(); | ||
250 | |||
251 | src.h = pdc_fheight; | ||
252 | src.w = pdc_fwidth; | ||
253 | |||
254 | dest.y = pdc_fheight * lineno + pdc_yoffset; | ||
255 | dest.x = pdc_fwidth * x + pdc_xoffset; | ||
256 | dest.h = pdc_fheight; | ||
257 | dest.w = pdc_fwidth * len; | ||
258 | |||
259 | /* if the previous rect was just above this one, with the same width | ||
260 | and horizontal position, then merge the new one with it instead | ||
261 | of adding a new entry */ | ||
262 | |||
263 | if (rectcount) | ||
264 | lastrect = uprect[rectcount - 1]; | ||
265 | |||
266 | if (rectcount && lastrect.x == dest.x && lastrect.w == dest.w) | ||
267 | { | ||
268 | if (lastrect.y + lastrect.h == dest.y) | ||
269 | uprect[rectcount - 1].h = lastrect.h + pdc_fheight; | ||
270 | else | ||
271 | if (lastrect.y != dest.y) | ||
272 | uprect[rectcount++] = dest; | ||
273 | } | ||
274 | else | ||
275 | uprect[rectcount++] = dest; | ||
276 | |||
277 | dest.w = pdc_fwidth; | ||
278 | |||
279 | for (j = 0; j < len; j++) | ||
280 | { | ||
281 | chtype ch = srcp[j]; | ||
282 | |||
283 | _set_attr(ch); | ||
284 | #ifdef CHTYPE_LONG | ||
285 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
286 | ch = (ch & (A_ATTRIBUTES ^ A_ALTCHARSET)) | acs_map[ch & 0x7f]; | ||
287 | #endif | ||
288 | if (backgr == -1) | ||
289 | SDL_LowerBlit(pdc_tileback, &dest, pdc_screen, &dest); | ||
290 | |||
291 | src.x = (ch & 0xff) % 32 * pdc_fwidth; | ||
292 | src.y = (ch & 0xff) / 32 * pdc_fheight; | ||
293 | |||
294 | SDL_LowerBlit(pdc_font, &src, pdc_screen, &dest); | ||
295 | |||
296 | if (ch & (A_UNDERLINE|A_LEFTLINE|A_RIGHTLINE)) | ||
297 | _highlight(&src, &dest, ch); | ||
298 | |||
299 | dest.x += pdc_fwidth; | ||
300 | } | ||
301 | } |
File sdl1/pdcgetsc.c added (mode: 100644) (index 00000000..43192350) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcgetsc.c,v 1.8 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /* get the cursor size/shape */ | ||
8 | |||
9 | int PDC_get_cursor_mode(void) | ||
10 | { | ||
11 | PDC_LOG(("PDC_get_cursor_mode() - called\n")); | ||
12 | |||
13 | return 0; | ||
14 | } | ||
15 | |||
16 | /* return number of screen rows */ | ||
17 | |||
18 | int PDC_get_rows(void) | ||
19 | { | ||
20 | PDC_LOG(("PDC_get_rows() - called\n")); | ||
21 | |||
22 | return pdc_sheight / pdc_fheight; | ||
23 | } | ||
24 | |||
25 | /* return width of screen/viewport */ | ||
26 | |||
27 | int PDC_get_columns(void) | ||
28 | { | ||
29 | PDC_LOG(("PDC_get_columns() - called\n")); | ||
30 | |||
31 | return pdc_swidth / pdc_fwidth; | ||
32 | } |
File sdl1/pdckbd.c added (mode: 100644) (index 00000000..56bf1e47) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdckbd.c,v 1.20 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdckbd | ||
10 | |||
11 | Synopsis: | ||
12 | unsigned long PDC_get_input_fd(void); | ||
13 | |||
14 | Description: | ||
15 | PDC_get_input_fd() returns the file descriptor that PDCurses | ||
16 | reads its input from. It can be used for select(). | ||
17 | |||
18 | Portability X/Open BSD SYS V | ||
19 | PDC_get_input_fd - - - | ||
20 | |||
21 | **man-end****************************************************************/ | ||
22 | |||
23 | #include <string.h> | ||
24 | |||
25 | unsigned long pdc_key_modifiers = 0L; | ||
26 | |||
27 | static SDL_Event event; | ||
28 | static SDLKey oldkey; | ||
29 | static MOUSE_STATUS old_mouse_status; | ||
30 | |||
31 | static struct | ||
32 | { | ||
33 | SDLKey keycode; | ||
34 | bool numkeypad; | ||
35 | unsigned short normal; | ||
36 | unsigned short shifted; | ||
37 | unsigned short control; | ||
38 | unsigned short alt; | ||
39 | } key_table[] = | ||
40 | { | ||
41 | /* keycode keypad normal shifted control alt*/ | ||
42 | {SDLK_LEFT, FALSE, KEY_LEFT, KEY_SLEFT, CTL_LEFT, ALT_LEFT}, | ||
43 | {SDLK_RIGHT, FALSE, KEY_RIGHT, KEY_SRIGHT, CTL_RIGHT, ALT_RIGHT}, | ||
44 | {SDLK_UP, FALSE, KEY_UP, KEY_SUP, CTL_UP, ALT_UP}, | ||
45 | {SDLK_DOWN, FALSE, KEY_DOWN, KEY_SDOWN, CTL_DOWN, ALT_DOWN}, | ||
46 | {SDLK_HOME, FALSE, KEY_HOME, KEY_SHOME, CTL_HOME, ALT_HOME}, | ||
47 | {SDLK_END, FALSE, KEY_END, KEY_SEND, CTL_END, ALT_END}, | ||
48 | {SDLK_PAGEUP, FALSE, KEY_PPAGE, KEY_SPREVIOUS,CTL_PGUP, ALT_PGUP}, | ||
49 | {SDLK_PAGEDOWN,FALSE, KEY_NPAGE, KEY_SNEXT, CTL_PGDN, ALT_PGDN}, | ||
50 | {SDLK_INSERT, FALSE, KEY_IC, KEY_SIC, CTL_INS, ALT_INS}, | ||
51 | {SDLK_DELETE, FALSE, KEY_DC, KEY_SDC, CTL_DEL, ALT_DEL}, | ||
52 | {SDLK_F1, FALSE, KEY_F(1), KEY_F(13), KEY_F(25), KEY_F(37)}, | ||
53 | {SDLK_F2, FALSE, KEY_F(2), KEY_F(14), KEY_F(26), KEY_F(38)}, | ||
54 | {SDLK_F3, FALSE, KEY_F(3), KEY_F(15), KEY_F(27), KEY_F(39)}, | ||
55 | {SDLK_F4, FALSE, KEY_F(4), KEY_F(16), KEY_F(28), KEY_F(40)}, | ||
56 | {SDLK_F5, FALSE, KEY_F(5), KEY_F(17), KEY_F(29), KEY_F(41)}, | ||
57 | {SDLK_F6, FALSE, KEY_F(6), KEY_F(18), KEY_F(30), KEY_F(42)}, | ||
58 | {SDLK_F7, FALSE, KEY_F(7), KEY_F(19), KEY_F(31), KEY_F(43)}, | ||
59 | {SDLK_F8, FALSE, KEY_F(8), KEY_F(20), KEY_F(32), KEY_F(44)}, | ||
60 | {SDLK_F9, FALSE, KEY_F(9), KEY_F(21), KEY_F(33), KEY_F(45)}, | ||
61 | {SDLK_F10, FALSE, KEY_F(10), KEY_F(22), KEY_F(34), KEY_F(46)}, | ||
62 | {SDLK_F11, FALSE, KEY_F(11), KEY_F(23), KEY_F(35), KEY_F(47)}, | ||
63 | {SDLK_F12, FALSE, KEY_F(12), KEY_F(24), KEY_F(36), KEY_F(48)}, | ||
64 | {SDLK_F13, FALSE, KEY_F(13), KEY_F(25), KEY_F(37), KEY_F(49)}, | ||
65 | {SDLK_F14, FALSE, KEY_F(14), KEY_F(26), KEY_F(38), KEY_F(50)}, | ||
66 | {SDLK_F15, FALSE, KEY_F(15), KEY_F(27), KEY_F(39), KEY_F(51)}, | ||
67 | {SDLK_BACKSPACE,FALSE, 0x08, 0x08, CTL_BKSP, ALT_BKSP}, | ||
68 | {SDLK_TAB, FALSE, 0x09, KEY_BTAB, CTL_TAB, ALT_TAB}, | ||
69 | {SDLK_PRINT, FALSE, KEY_PRINT, KEY_SPRINT, KEY_PRINT, KEY_PRINT}, | ||
70 | {SDLK_PAUSE, FALSE, KEY_SUSPEND, KEY_SSUSPEND, KEY_SUSPEND, KEY_SUSPEND}, | ||
71 | {SDLK_CLEAR, FALSE, KEY_CLEAR, KEY_CLEAR, KEY_CLEAR, KEY_CLEAR}, | ||
72 | {SDLK_BREAK, FALSE, KEY_BREAK, KEY_BREAK, KEY_BREAK, KEY_BREAK}, | ||
73 | {SDLK_HELP, FALSE, KEY_HELP, KEY_SHELP, KEY_LHELP, KEY_HELP}, | ||
74 | {SDLK_MENU, FALSE, KEY_OPTIONS, KEY_SOPTIONS, KEY_OPTIONS, KEY_OPTIONS}, | ||
75 | {SDLK_ESCAPE, FALSE, 0x1B, 0x1B, 0x1B, ALT_ESC}, | ||
76 | {SDLK_KP_ENTER,TRUE, PADENTER, PADENTER, CTL_PADENTER,ALT_PADENTER}, | ||
77 | {SDLK_KP_PLUS, TRUE, PADPLUS, '+', CTL_PADPLUS, ALT_PADPLUS}, | ||
78 | {SDLK_KP_MINUS,TRUE, PADMINUS, '-', CTL_PADMINUS,ALT_PADMINUS}, | ||
79 | {SDLK_KP_MULTIPLY,TRUE,PADSTAR, '*', CTL_PADSTAR, ALT_PADSTAR}, | ||
80 | {SDLK_KP_DIVIDE,TRUE, PADSLASH, '/', CTL_PADSLASH,ALT_PADSLASH}, | ||
81 | {SDLK_KP_PERIOD,TRUE, PADSTOP, '.', CTL_PADSTOP, ALT_PADSTOP}, | ||
82 | {SDLK_KP0, TRUE, PAD0, '0', CTL_PAD0, ALT_PAD0}, | ||
83 | {SDLK_KP1, TRUE, KEY_C1, '1', CTL_PAD1, ALT_PAD1}, | ||
84 | {SDLK_KP2, TRUE, KEY_C2, '2', CTL_PAD2, ALT_PAD2}, | ||
85 | {SDLK_KP3, TRUE, KEY_C3, '3', CTL_PAD3, ALT_PAD3}, | ||
86 | {SDLK_KP4, TRUE, KEY_B1, '4', CTL_PAD4, ALT_PAD4}, | ||
87 | {SDLK_KP5, TRUE, KEY_B2, '5', CTL_PAD5, ALT_PAD5}, | ||
88 | {SDLK_KP6, TRUE, KEY_B3, '6', CTL_PAD6, ALT_PAD6}, | ||
89 | {SDLK_KP7, TRUE, KEY_A1, '7', CTL_PAD7, ALT_PAD7}, | ||
90 | {SDLK_KP8, TRUE, KEY_A2, '8', CTL_PAD8, ALT_PAD8}, | ||
91 | {SDLK_KP9, TRUE, KEY_A3, '9', CTL_PAD9, ALT_PAD9}, | ||
92 | {0, 0, 0, 0, 0, 0} | ||
93 | }; | ||
94 | |||
95 | unsigned long PDC_get_input_fd(void) | ||
96 | { | ||
97 | PDC_LOG(("PDC_get_input_fd() - called\n")); | ||
98 | |||
99 | return 0L; /* test this */ | ||
100 | } | ||
101 | |||
102 | void PDC_set_keyboard_binary(bool on) | ||
103 | { | ||
104 | PDC_LOG(("PDC_set_keyboard_binary() - called\n")); | ||
105 | } | ||
106 | |||
107 | /* check if a key or mouse event is waiting */ | ||
108 | |||
109 | bool PDC_check_key(void) | ||
110 | { | ||
111 | Uint32 current = SDL_GetTicks(); | ||
112 | int haveevent = SDL_PollEvent(&event); | ||
113 | |||
114 | /* if we have an event, or 30 ms have passed without a screen | ||
115 | update, or the timer has wrapped, update now */ | ||
116 | |||
117 | if (haveevent || | ||
118 | current < pdc_lastupdate || ((current - pdc_lastupdate) > 30)) | ||
119 | PDC_update_rects(); | ||
120 | |||
121 | return haveevent; | ||
122 | } | ||
123 | |||
124 | static int _process_key_event(void) | ||
125 | { | ||
126 | int i, key = 0; | ||
127 | |||
128 | pdc_key_modifiers = 0L; | ||
129 | SP->key_code = FALSE; | ||
130 | |||
131 | if (event.type == SDL_KEYUP) | ||
132 | { | ||
133 | if (SP->return_key_modifiers && event.key.keysym.sym == oldkey) | ||
134 | { | ||
135 | switch (oldkey) | ||
136 | { | ||
137 | case SDLK_RSHIFT: | ||
138 | return KEY_SHIFT_R; | ||
139 | case SDLK_LSHIFT: | ||
140 | return KEY_SHIFT_L; | ||
141 | case SDLK_RCTRL: | ||
142 | return KEY_CONTROL_R; | ||
143 | case SDLK_LCTRL: | ||
144 | return KEY_CONTROL_L; | ||
145 | case SDLK_RALT: | ||
146 | return KEY_ALT_R; | ||
147 | case SDLK_LALT: | ||
148 | return KEY_ALT_L; | ||
149 | default: | ||
150 | break; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | return -1; | ||
155 | } | ||
156 | |||
157 | oldkey = event.key.keysym.sym; | ||
158 | |||
159 | if (SP->save_key_modifiers) | ||
160 | { | ||
161 | if (event.key.keysym.mod & KMOD_NUM) | ||
162 | pdc_key_modifiers |= PDC_KEY_MODIFIER_NUMLOCK; | ||
163 | |||
164 | if (event.key.keysym.mod & KMOD_SHIFT) | ||
165 | pdc_key_modifiers |= PDC_KEY_MODIFIER_SHIFT; | ||
166 | |||
167 | if (event.key.keysym.mod & KMOD_CTRL) | ||
168 | pdc_key_modifiers |= PDC_KEY_MODIFIER_CONTROL; | ||
169 | |||
170 | if (event.key.keysym.mod & KMOD_ALT) | ||
171 | pdc_key_modifiers |= PDC_KEY_MODIFIER_ALT; | ||
172 | } | ||
173 | |||
174 | for (i = 0; key_table[i].keycode; i++) | ||
175 | { | ||
176 | if (key_table[i].keycode == event.key.keysym.sym) | ||
177 | { | ||
178 | if ((event.key.keysym.mod & KMOD_SHIFT) || | ||
179 | (key_table[i].numkeypad && (event.key.keysym.mod & KMOD_NUM))) | ||
180 | { | ||
181 | key = key_table[i].shifted; | ||
182 | } | ||
183 | else if (event.key.keysym.mod & KMOD_CTRL) | ||
184 | { | ||
185 | key = key_table[i].control; | ||
186 | } | ||
187 | else if (event.key.keysym.mod & KMOD_ALT) | ||
188 | { | ||
189 | key = key_table[i].alt; | ||
190 | } | ||
191 | |||
192 | /* To get here, we ignore all other modifiers */ | ||
193 | |||
194 | else | ||
195 | key = key_table[i].normal; | ||
196 | |||
197 | SP->key_code = (key > 0x100); | ||
198 | break; | ||
199 | } | ||
200 | } | ||
201 | |||
202 | if (!key) | ||
203 | { | ||
204 | key = event.key.keysym.unicode; | ||
205 | |||
206 | if (key > 0x7f) | ||
207 | key = 0; | ||
208 | } | ||
209 | |||
210 | /* Handle ALT letters and numbers */ | ||
211 | |||
212 | if (event.key.keysym.mod & KMOD_ALT) | ||
213 | { | ||
214 | if (key >= 'A' && key <= 'Z') | ||
215 | { | ||
216 | key += ALT_A - 'A'; | ||
217 | SP->key_code = TRUE; | ||
218 | } | ||
219 | |||
220 | if (key >= 'a' && key <= 'z') | ||
221 | { | ||
222 | key += ALT_A - 'a'; | ||
223 | SP->key_code = TRUE; | ||
224 | } | ||
225 | |||
226 | if (key >= '0' && key <= '9') | ||
227 | { | ||
228 | key += ALT_0 - '0'; | ||
229 | SP->key_code = TRUE; | ||
230 | } | ||
231 | } | ||
232 | |||
233 | return key ? key : -1; | ||
234 | } | ||
235 | |||
236 | static int _process_mouse_event(void) | ||
237 | { | ||
238 | SDLMod keymods; | ||
239 | short shift_flags = 0; | ||
240 | |||
241 | memset(&pdc_mouse_status, 0, sizeof(MOUSE_STATUS)); | ||
242 | |||
243 | keymods = SDL_GetModState(); | ||
244 | |||
245 | if (keymods & KMOD_SHIFT) | ||
246 | shift_flags |= BUTTON_SHIFT; | ||
247 | |||
248 | if (keymods & KMOD_CTRL) | ||
249 | shift_flags |= BUTTON_CONTROL; | ||
250 | |||
251 | if (keymods & KMOD_ALT) | ||
252 | shift_flags |= BUTTON_ALT; | ||
253 | |||
254 | if (event.type == SDL_MOUSEMOTION) | ||
255 | { | ||
256 | int i; | ||
257 | |||
258 | pdc_mouse_status.x = event.motion.x / pdc_fwidth; | ||
259 | pdc_mouse_status.y = event.motion.y / pdc_fheight; | ||
260 | |||
261 | if (!event.motion.state || | ||
262 | (pdc_mouse_status.x == old_mouse_status.x && | ||
263 | pdc_mouse_status.y == old_mouse_status.y)) | ||
264 | return -1; | ||
265 | |||
266 | pdc_mouse_status.changes = PDC_MOUSE_MOVED; | ||
267 | |||
268 | for (i = 0; i < 3; i++) | ||
269 | { | ||
270 | if (event.motion.state & SDL_BUTTON(i + 1)) | ||
271 | { | ||
272 | pdc_mouse_status.button[i] = BUTTON_MOVED | shift_flags; | ||
273 | pdc_mouse_status.changes |= (1 << i); | ||
274 | } | ||
275 | } | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | short action = (event.button.state == SDL_PRESSED) ? | ||
280 | BUTTON_PRESSED : BUTTON_RELEASED; | ||
281 | Uint8 btn = event.button.button; | ||
282 | |||
283 | /* handle scroll wheel */ | ||
284 | |||
285 | if ((btn == 4 || btn == 5) && action == BUTTON_RELEASED) | ||
286 | { | ||
287 | pdc_mouse_status.x = pdc_mouse_status.y = -1; | ||
288 | |||
289 | pdc_mouse_status.changes = (btn == 5) ? | ||
290 | PDC_MOUSE_WHEEL_DOWN : PDC_MOUSE_WHEEL_UP; | ||
291 | |||
292 | return KEY_MOUSE; | ||
293 | } | ||
294 | |||
295 | if (btn < 1 || btn > 3) | ||
296 | return -1; | ||
297 | |||
298 | /* check for a click -- a press followed immediately by a release */ | ||
299 | |||
300 | if (action == BUTTON_PRESSED && SP->mouse_wait) | ||
301 | { | ||
302 | SDL_Event rel; | ||
303 | |||
304 | napms(SP->mouse_wait); | ||
305 | |||
306 | if (SDL_PollEvent(&rel)) | ||
307 | { | ||
308 | if (rel.type == SDL_MOUSEBUTTONUP && rel.button.button == btn) | ||
309 | action = BUTTON_CLICKED; | ||
310 | else | ||
311 | SDL_PushEvent(&rel); | ||
312 | } | ||
313 | } | ||
314 | |||
315 | pdc_mouse_status.x = event.button.x / pdc_fwidth; | ||
316 | pdc_mouse_status.y = event.button.y / pdc_fheight; | ||
317 | |||
318 | btn--; | ||
319 | |||
320 | pdc_mouse_status.button[btn] = action | shift_flags; | ||
321 | pdc_mouse_status.changes = (1 << btn); | ||
322 | } | ||
323 | |||
324 | old_mouse_status = pdc_mouse_status; | ||
325 | |||
326 | return KEY_MOUSE; | ||
327 | } | ||
328 | |||
329 | /* return the next available key or mouse event */ | ||
330 | |||
331 | int PDC_get_key(void) | ||
332 | { | ||
333 | switch (event.type) | ||
334 | { | ||
335 | case SDL_QUIT: | ||
336 | exit(1); | ||
337 | case SDL_VIDEORESIZE: | ||
338 | if (pdc_own_screen && | ||
339 | (event.resize.h / pdc_fheight != LINES || | ||
340 | event.resize.w / pdc_fwidth != COLS)) | ||
341 | { | ||
342 | pdc_sheight = event.resize.h; | ||
343 | pdc_swidth = event.resize.w; | ||
344 | |||
345 | if (!SP->resized) | ||
346 | { | ||
347 | SP->resized = TRUE; | ||
348 | return KEY_RESIZE; | ||
349 | } | ||
350 | } | ||
351 | break; | ||
352 | case SDL_MOUSEMOTION: | ||
353 | SDL_ShowCursor(SDL_ENABLE); | ||
354 | case SDL_MOUSEBUTTONUP: | ||
355 | case SDL_MOUSEBUTTONDOWN: | ||
356 | oldkey = SDLK_SPACE; | ||
357 | if (SP->_trap_mbe) | ||
358 | return _process_mouse_event(); | ||
359 | break; | ||
360 | case SDL_KEYUP: | ||
361 | case SDL_KEYDOWN: | ||
362 | PDC_mouse_set(); | ||
363 | return _process_key_event(); | ||
364 | } | ||
365 | |||
366 | return -1; | ||
367 | } | ||
368 | |||
369 | /* discard any pending keyboard or mouse input -- this is the core | ||
370 | routine for flushinp() */ | ||
371 | |||
372 | void PDC_flushinp(void) | ||
373 | { | ||
374 | PDC_LOG(("PDC_flushinp() - called\n")); | ||
375 | |||
376 | while (PDC_check_key()); | ||
377 | } | ||
378 | |||
379 | int PDC_mouse_set(void) | ||
380 | { | ||
381 | SDL_ShowCursor(SP->_trap_mbe ? SDL_ENABLE : SDL_DISABLE); | ||
382 | |||
383 | return OK; | ||
384 | } | ||
385 | |||
386 | int PDC_modifiers_set(void) | ||
387 | { | ||
388 | return OK; | ||
389 | } |
File sdl1/pdcscrn.c added (mode: 100644) (index 00000000..e422b25c) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcscrn.c,v 1.34 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | #include "deffont.h" | ||
9 | #include "deficon.h" | ||
10 | |||
11 | SDL_Surface *pdc_screen = NULL, *pdc_font = NULL, *pdc_icon = NULL, | ||
12 | *pdc_back = NULL, *pdc_tileback = NULL; | ||
13 | int pdc_sheight = 0, pdc_swidth = 0, pdc_yoffset = 0, pdc_xoffset = 0; | ||
14 | |||
15 | SDL_Color pdc_color[16]; | ||
16 | Uint32 pdc_mapped[16]; | ||
17 | int pdc_fheight, pdc_fwidth, pdc_flastc; | ||
18 | bool pdc_own_screen; | ||
19 | |||
20 | /* COLOR_PAIR to attribute encoding table. */ | ||
21 | |||
22 | static struct {short f, b;} atrtab[PDC_COLOR_PAIRS]; | ||
23 | |||
24 | void PDC_retile(void) | ||
25 | { | ||
26 | if (pdc_tileback) | ||
27 | SDL_FreeSurface(pdc_tileback); | ||
28 | |||
29 | pdc_tileback = SDL_DisplayFormat(pdc_screen); | ||
30 | |||
31 | if (pdc_back) | ||
32 | { | ||
33 | SDL_Rect dest; | ||
34 | |||
35 | dest.y = 0; | ||
36 | |||
37 | while (dest.y < pdc_tileback->h) | ||
38 | { | ||
39 | dest.x = 0; | ||
40 | |||
41 | while (dest.x < pdc_tileback->w) | ||
42 | { | ||
43 | SDL_BlitSurface(pdc_back, 0, pdc_tileback, &dest); | ||
44 | dest.x += pdc_back->w; | ||
45 | } | ||
46 | |||
47 | dest.y += pdc_back->h; | ||
48 | } | ||
49 | |||
50 | SDL_BlitSurface(pdc_tileback, 0, pdc_screen, 0); | ||
51 | } | ||
52 | } | ||
53 | |||
54 | void PDC_scr_close(void) | ||
55 | { | ||
56 | PDC_LOG(("PDC_scr_close() - called\n")); | ||
57 | } | ||
58 | |||
59 | void PDC_scr_free(void) | ||
60 | { | ||
61 | if (SP) | ||
62 | free(SP); | ||
63 | } | ||
64 | |||
65 | /* open the physical screen -- allocate SP, miscellaneous intialization */ | ||
66 | |||
67 | int PDC_scr_open(int argc, char **argv) | ||
68 | { | ||
69 | int i; | ||
70 | |||
71 | PDC_LOG(("PDC_scr_open() - called\n")); | ||
72 | |||
73 | SP = calloc(1, sizeof(SCREEN)); | ||
74 | |||
75 | if (!SP) | ||
76 | return ERR; | ||
77 | |||
78 | pdc_own_screen = !pdc_screen; | ||
79 | |||
80 | if (pdc_own_screen) | ||
81 | { | ||
82 | if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0) | ||
83 | { | ||
84 | fprintf(stderr, "Could not start SDL: %s\n", SDL_GetError()); | ||
85 | return ERR; | ||
86 | } | ||
87 | |||
88 | atexit(SDL_Quit); | ||
89 | } | ||
90 | |||
91 | if (!pdc_font) | ||
92 | { | ||
93 | const char *fname = getenv("PDC_FONT"); | ||
94 | pdc_font = SDL_LoadBMP(fname ? fname : "pdcfont.bmp"); | ||
95 | } | ||
96 | |||
97 | if (!pdc_font) | ||
98 | pdc_font = SDL_LoadBMP_RW(SDL_RWFromMem(deffont, sizeof(deffont)), 0); | ||
99 | |||
100 | if (!pdc_font) | ||
101 | { | ||
102 | fprintf(stderr, "Could not load font\n"); | ||
103 | return ERR; | ||
104 | } | ||
105 | |||
106 | SP->mono = !pdc_font->format->palette; | ||
107 | |||
108 | if (!SP->mono && !pdc_back) | ||
109 | { | ||
110 | const char *bname = getenv("PDC_BACKGROUND"); | ||
111 | pdc_back = SDL_LoadBMP(bname ? bname : "pdcback.bmp"); | ||
112 | } | ||
113 | |||
114 | if (!SP->mono && (pdc_back || !pdc_own_screen)) | ||
115 | { | ||
116 | SP->orig_attr = TRUE; | ||
117 | SP->orig_fore = COLOR_WHITE; | ||
118 | SP->orig_back = -1; | ||
119 | } | ||
120 | else | ||
121 | SP->orig_attr = FALSE; | ||
122 | |||
123 | pdc_fheight = pdc_font->h / 8; | ||
124 | pdc_fwidth = pdc_font->w / 32; | ||
125 | |||
126 | if (!SP->mono) | ||
127 | pdc_flastc = pdc_font->format->palette->ncolors - 1; | ||
128 | |||
129 | if (pdc_own_screen && !pdc_icon) | ||
130 | { | ||
131 | const char *iname = getenv("PDC_ICON"); | ||
132 | pdc_icon = SDL_LoadBMP(iname ? iname : "pdcicon.bmp"); | ||
133 | |||
134 | if (!pdc_icon) | ||
135 | pdc_icon = SDL_LoadBMP_RW(SDL_RWFromMem(deficon, | ||
136 | sizeof(deficon)), 0); | ||
137 | |||
138 | if (pdc_icon) | ||
139 | SDL_WM_SetIcon(pdc_icon, NULL); | ||
140 | } | ||
141 | |||
142 | if (pdc_own_screen) | ||
143 | { | ||
144 | const char *env = getenv("PDC_LINES"); | ||
145 | pdc_sheight = (env ? atoi(env) : 25) * pdc_fheight; | ||
146 | |||
147 | env = getenv("PDC_COLS"); | ||
148 | pdc_swidth = (env ? atoi(env) : 80) * pdc_fwidth; | ||
149 | |||
150 | pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, | ||
151 | SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); | ||
152 | } | ||
153 | else | ||
154 | { | ||
155 | if (!pdc_sheight) | ||
156 | pdc_sheight = pdc_screen->h - pdc_yoffset; | ||
157 | |||
158 | if (!pdc_swidth) | ||
159 | pdc_swidth = pdc_screen->w - pdc_xoffset; | ||
160 | } | ||
161 | |||
162 | if (!pdc_screen) | ||
163 | { | ||
164 | fprintf(stderr, "Couldn't create a surface: %s\n", SDL_GetError()); | ||
165 | return ERR; | ||
166 | } | ||
167 | |||
168 | if (SP->orig_attr) | ||
169 | PDC_retile(); | ||
170 | |||
171 | for (i = 0; i < 8; i++) | ||
172 | { | ||
173 | pdc_color[i].r = (i & COLOR_RED) ? 0xc0 : 0; | ||
174 | pdc_color[i].g = (i & COLOR_GREEN) ? 0xc0 : 0; | ||
175 | pdc_color[i].b = (i & COLOR_BLUE) ? 0xc0 : 0; | ||
176 | |||
177 | pdc_color[i + 8].r = (i & COLOR_RED) ? 0xff : 0x40; | ||
178 | pdc_color[i + 8].g = (i & COLOR_GREEN) ? 0xff : 0x40; | ||
179 | pdc_color[i + 8].b = (i & COLOR_BLUE) ? 0xff : 0x40; | ||
180 | } | ||
181 | |||
182 | for (i = 0; i < 16; i++) | ||
183 | pdc_mapped[i] = SDL_MapRGB(pdc_screen->format, pdc_color[i].r, | ||
184 | pdc_color[i].g, pdc_color[i].b); | ||
185 | |||
186 | SDL_EnableUNICODE(1); | ||
187 | |||
188 | PDC_mouse_set(); | ||
189 | |||
190 | if (pdc_own_screen) | ||
191 | PDC_set_title(argc ? argv[0] : "PDCurses"); | ||
192 | |||
193 | SP->lines = PDC_get_rows(); | ||
194 | SP->cols = PDC_get_columns(); | ||
195 | |||
196 | SP->mouse_wait = PDC_CLICK_PERIOD; | ||
197 | SP->audible = FALSE; | ||
198 | |||
199 | PDC_reset_prog_mode(); | ||
200 | |||
201 | return OK; | ||
202 | } | ||
203 | |||
204 | /* the core of resize_term() */ | ||
205 | |||
206 | int PDC_resize_screen(int nlines, int ncols) | ||
207 | { | ||
208 | if (!pdc_own_screen) | ||
209 | return ERR; | ||
210 | |||
211 | if (nlines && ncols) | ||
212 | { | ||
213 | pdc_sheight = nlines * pdc_fheight; | ||
214 | pdc_swidth = ncols * pdc_fwidth; | ||
215 | } | ||
216 | |||
217 | SDL_FreeSurface(pdc_screen); | ||
218 | |||
219 | pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, | ||
220 | SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); | ||
221 | |||
222 | if (pdc_tileback) | ||
223 | PDC_retile(); | ||
224 | |||
225 | SP->resized = FALSE; | ||
226 | SP->cursrow = SP->curscol = 0; | ||
227 | |||
228 | return OK; | ||
229 | } | ||
230 | |||
231 | void PDC_reset_prog_mode(void) | ||
232 | { | ||
233 | PDC_LOG(("PDC_reset_prog_mode() - called.\n")); | ||
234 | |||
235 | PDC_flushinp(); | ||
236 | SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); | ||
237 | } | ||
238 | |||
239 | void PDC_reset_shell_mode(void) | ||
240 | { | ||
241 | PDC_LOG(("PDC_reset_shell_mode() - called.\n")); | ||
242 | |||
243 | SDL_EnableKeyRepeat(0, 0); | ||
244 | PDC_flushinp(); | ||
245 | } | ||
246 | |||
247 | void PDC_restore_screen_mode(int i) | ||
248 | { | ||
249 | } | ||
250 | |||
251 | void PDC_save_screen_mode(int i) | ||
252 | { | ||
253 | } | ||
254 | |||
255 | void PDC_init_pair(short pair, short fg, short bg) | ||
256 | { | ||
257 | atrtab[pair].f = fg; | ||
258 | atrtab[pair].b = bg; | ||
259 | } | ||
260 | |||
261 | int PDC_pair_content(short pair, short *fg, short *bg) | ||
262 | { | ||
263 | *fg = atrtab[pair].f; | ||
264 | *bg = atrtab[pair].b; | ||
265 | |||
266 | return OK; | ||
267 | } | ||
268 | |||
269 | bool PDC_can_change_color(void) | ||
270 | { | ||
271 | return TRUE; | ||
272 | } | ||
273 | |||
274 | int PDC_color_content(short color, short *red, short *green, short *blue) | ||
275 | { | ||
276 | *red = DIVROUND(pdc_color[color].r * 1000, 255); | ||
277 | *green = DIVROUND(pdc_color[color].g * 1000, 255); | ||
278 | *blue = DIVROUND(pdc_color[color].b * 1000, 255); | ||
279 | |||
280 | return OK; | ||
281 | } | ||
282 | |||
283 | int PDC_init_color(short color, short red, short green, short blue) | ||
284 | { | ||
285 | pdc_color[color].r = DIVROUND(red * 255, 1000); | ||
286 | pdc_color[color].g = DIVROUND(green * 255, 1000); | ||
287 | pdc_color[color].b = DIVROUND(blue * 255, 1000); | ||
288 | |||
289 | pdc_mapped[color] = SDL_MapRGB(pdc_screen->format, pdc_color[color].r, | ||
290 | pdc_color[color].g, pdc_color[color].b); | ||
291 | |||
292 | wrefresh(curscr); | ||
293 | |||
294 | return OK; | ||
295 | } |
File sdl1/pdcsdl.h added (mode: 100644) (index 00000000..79df21a5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: pdcsdl.h,v 1.17 2008/07/14 04:24:52 wmcbrine Exp $ */ | ||
4 | |||
5 | #include <curspriv.h> | ||
6 | |||
7 | #include <SDL/SDL.h> | ||
8 | |||
9 | PDCEX SDL_Surface *pdc_screen, *pdc_font, *pdc_icon, *pdc_back; | ||
10 | PDCEX int pdc_sheight, pdc_swidth, pdc_yoffset, pdc_xoffset; | ||
11 | |||
12 | extern SDL_Surface *pdc_tileback; /* used to regenerate the background | ||
13 | of "transparent" cells */ | ||
14 | extern SDL_Color pdc_color[16]; /* colors for font palette */ | ||
15 | extern Uint32 pdc_mapped[16]; /* colors for FillRect(), as | ||
16 | used in _highlight() */ | ||
17 | extern int pdc_fheight, pdc_fwidth; /* font height and width */ | ||
18 | extern int pdc_flastc; /* font palette's last color | ||
19 | (treated as the foreground) */ | ||
20 | extern bool pdc_own_screen; /* if pdc_screen was not set | ||
21 | before initscr(), PDCurses is | ||
22 | responsible for (owns) it */ | ||
23 | extern Uint32 pdc_lastupdate; /* time of last update, in ticks */ | ||
24 | |||
25 | void PDC_update_rects(void); | ||
26 | void PDC_retile(void); |
File sdl1/pdcsetsc.c added (mode: 100644) (index 00000000..0df97ab7) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcsetsc.c,v 1.7 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdcsetsc | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_set_blink(bool blinkon); | ||
13 | void PDC_set_title(const char *title); | ||
14 | |||
15 | Description: | ||
16 | PDC_set_blink() toggles whether the A_BLINK attribute sets an | ||
17 | actual blink mode (TRUE), or sets the background color to high | ||
18 | intensity (FALSE). The default is platform-dependent (FALSE in | ||
19 | most cases). It returns OK if it could set the state to match | ||
20 | the given parameter, ERR otherwise. Current platforms also | ||
21 | adjust the value of COLORS according to this function -- 16 for | ||
22 | FALSE, and 8 for TRUE. | ||
23 | |||
24 | PDC_set_title() sets the title of the window in which the curses | ||
25 | program is running. This function may not do anything on some | ||
26 | platforms. (Currently it only works in Win32 and X11.) | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | PDC_set_blink - - - | ||
30 | PDC_set_title - - - | ||
31 | |||
32 | **man-end****************************************************************/ | ||
33 | |||
34 | int PDC_curs_set(int visibility) | ||
35 | { | ||
36 | int ret_vis; | ||
37 | |||
38 | PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); | ||
39 | |||
40 | ret_vis = SP->visibility; | ||
41 | |||
42 | SP->visibility = visibility; | ||
43 | |||
44 | PDC_gotoyx(SP->cursrow, SP->curscol); | ||
45 | |||
46 | return ret_vis; | ||
47 | } | ||
48 | |||
49 | void PDC_set_title(const char *title) | ||
50 | { | ||
51 | PDC_LOG(("PDC_set_title() - called:<%s>\n", title)); | ||
52 | |||
53 | SDL_WM_SetCaption(title, title); | ||
54 | } | ||
55 | |||
56 | int PDC_set_blink(bool blinkon) | ||
57 | { | ||
58 | if (pdc_color_started) | ||
59 | COLORS = 16; | ||
60 | |||
61 | return blinkon ? ERR : OK; | ||
62 | } |
File sdl1/pdcutil.c added (mode: 100644) (index 00000000..b2d84045) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcsdl.h" | ||
4 | |||
5 | RCSID("$Id: pdcutil.c,v 1.6 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | void PDC_beep(void) | ||
8 | { | ||
9 | PDC_LOG(("PDC_beep() - called\n")); | ||
10 | } | ||
11 | |||
12 | void PDC_napms(int ms) | ||
13 | { | ||
14 | PDC_LOG(("PDC_napms() - called: ms=%d\n", ms)); | ||
15 | |||
16 | PDC_update_rects(); | ||
17 | SDL_Delay(ms); | ||
18 | } | ||
19 | |||
20 | const char *PDC_sysname(void) | ||
21 | { | ||
22 | return "SDL"; | ||
23 | } |
File sdl1/sdltest.c added (mode: 100644) (index 00000000..d39533b3) | |||
1 | /* Here's a simple example of combining SDL and PDCurses functionality. | ||
2 | The top portion of the window is devoted to SDL, with a four-line | ||
3 | (assuming the default 8x16 font) stdscr at the bottom. | ||
4 | |||
5 | $Id: sdltest.c,v 1.2 2008/07/14 04:24:52 wmcbrine Exp $ | ||
6 | */ | ||
7 | |||
8 | #include <SDL/SDL.h> | ||
9 | #include <curses.h> | ||
10 | #include <stdlib.h> | ||
11 | #include <time.h> | ||
12 | |||
13 | /* You could #include pdcsdl.h, or just add the relevant declarations | ||
14 | here: */ | ||
15 | |||
16 | PDCEX SDL_Surface *pdc_screen; | ||
17 | PDCEX int pdc_yoffset; | ||
18 | |||
19 | int main(int argc, char **argv) | ||
20 | { | ||
21 | char inp[60]; | ||
22 | int i, j, seed; | ||
23 | |||
24 | seed = time((time_t *)0); | ||
25 | srand(seed); | ||
26 | |||
27 | /* Initialize SDL */ | ||
28 | |||
29 | if (SDL_Init(SDL_INIT_VIDEO) < 0) | ||
30 | exit(1); | ||
31 | |||
32 | atexit(SDL_Quit); | ||
33 | |||
34 | pdc_screen = SDL_SetVideoMode(640, 480, 0, SDL_SWSURFACE|SDL_ANYFORMAT); | ||
35 | |||
36 | /* Initialize PDCurses */ | ||
37 | |||
38 | pdc_yoffset = 416; /* 480 - 4 * 16 */ | ||
39 | |||
40 | initscr(); | ||
41 | start_color(); | ||
42 | scrollok(stdscr, TRUE); | ||
43 | |||
44 | PDC_set_title("PDCurses for SDL"); | ||
45 | |||
46 | /* Do some SDL stuff */ | ||
47 | |||
48 | for (i = 640, j = 416; j; i -= 2, j -= 2) | ||
49 | { | ||
50 | SDL_Rect dest; | ||
51 | |||
52 | dest.x = (640 - i) / 2; | ||
53 | dest.y = (416 - j) / 2; | ||
54 | dest.w = i; | ||
55 | dest.h = j; | ||
56 | |||
57 | SDL_FillRect(pdc_screen, &dest, | ||
58 | SDL_MapRGB(pdc_screen->format, rand() % 256, | ||
59 | rand() % 256, rand() % 256)); | ||
60 | } | ||
61 | |||
62 | SDL_UpdateRect(pdc_screen, 0, 0, 640, 416); | ||
63 | |||
64 | /* Do some curses stuff */ | ||
65 | |||
66 | init_pair(1, COLOR_WHITE + 8, COLOR_BLUE); | ||
67 | bkgd(COLOR_PAIR(1)); | ||
68 | |||
69 | addstr("This is a demo of "); | ||
70 | attron(A_UNDERLINE); | ||
71 | addstr("PDCurses for SDL"); | ||
72 | attroff(A_UNDERLINE); | ||
73 | addstr(".\nYour comments here: "); | ||
74 | getnstr(inp, 59); | ||
75 | addstr("Press any key to exit."); | ||
76 | |||
77 | getch(); | ||
78 | endwin(); | ||
79 | |||
80 | return 0; | ||
81 | } |
File term.h added (mode: 100644) (index 00000000..ce6bc4fa) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: term.h,v 1.16 2008/07/13 16:08:16 wmcbrine Exp $ */ | ||
4 | |||
5 | /* PDCurses doesn't operate with terminfo, but we need these functions for | ||
6 | compatibility, to allow some things (notably, interface libraries for | ||
7 | other languages) to be compiled. Anyone who tries to actually _use_ | ||
8 | them will be disappointed, since they only return ERR. */ | ||
9 | |||
10 | #ifndef __PDCURSES_TERM_H__ | ||
11 | #define __PDCURSES_TERM_H__ 1 | ||
12 | |||
13 | #include <curses.h> | ||
14 | |||
15 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
16 | extern "C" | ||
17 | { | ||
18 | #endif | ||
19 | |||
20 | typedef struct | ||
21 | { | ||
22 | const char *_termname; | ||
23 | } TERMINAL; | ||
24 | |||
25 | #ifdef PDC_DLL_BUILD | ||
26 | # ifndef CURSES_LIBRARY | ||
27 | __declspec(dllimport) TERMINAL *cur_term; | ||
28 | # else | ||
29 | __declspec(dllexport) extern TERMINAL *cur_term; | ||
30 | # endif | ||
31 | #else | ||
32 | extern TERMINAL *cur_term; | ||
33 | #endif | ||
34 | |||
35 | int del_curterm(TERMINAL *); | ||
36 | int putp(const char *); | ||
37 | int restartterm(const char *, int, int *); | ||
38 | TERMINAL *set_curterm(TERMINAL *); | ||
39 | int setterm(const char *); | ||
40 | int setupterm(const char *, int, int *); | ||
41 | int tgetent(char *, const char *); | ||
42 | int tgetflag(const char *); | ||
43 | int tgetnum(const char *); | ||
44 | char *tgetstr(const char *, char **); | ||
45 | char *tgoto(const char *, int, int); | ||
46 | int tigetflag(const char *); | ||
47 | int tigetnum(const char *); | ||
48 | char *tigetstr(const char *); | ||
49 | char *tparm(const char *, long, long, long, long, long, | ||
50 | long, long, long, long); | ||
51 | int tputs(const char *, int, int (*)(int)); | ||
52 | |||
53 | #if defined(__cplusplus) || defined(__cplusplus__) || defined(__CPLUSPLUS) | ||
54 | } | ||
55 | #endif | ||
56 | |||
57 | #endif /* __PDCURSES_TERM_H__ */ |
File version.mif added (mode: 100644) (index 00000000..9ff7335b) | |||
1 | # Version number macros for inclusion from makefiles | ||
2 | |||
3 | VER = 34 | ||
4 | VERDOT = 3.4 |
File watcom.mif added (mode: 100644) (index 00000000..023ea37e) | |||
1 | # Common elements for the Watcom makefiles | ||
2 | |||
3 | srcdir = $(PDCURSES_SRCDIR)\pdcurses | ||
4 | demodir = $(PDCURSES_SRCDIR)\demos | ||
5 | |||
6 | LIBOBJS = addch.obj addchstr.obj addstr.obj attr.obj beep.obj bkgd.obj & | ||
7 | border.obj clear.obj color.obj delch.obj deleteln.obj deprec.obj & | ||
8 | getch.obj getstr.obj getyx.obj inch.obj inchstr.obj initscr.obj inopts.obj & | ||
9 | insch.obj insstr.obj instr.obj kernel.obj keyname.obj mouse.obj move.obj & | ||
10 | outopts.obj overlay.obj pad.obj panel.obj printw.obj refresh.obj & | ||
11 | scanw.obj scr_dump.obj scroll.obj slk.obj termattr.obj terminfo.obj & | ||
12 | touch.obj util.obj window.obj debug.obj | ||
13 | |||
14 | PDCOBJS = pdcclip.obj pdcdisp.obj pdcgetsc.obj pdckbd.obj pdcscrn.obj & | ||
15 | pdcsetsc.obj pdcutil.obj | ||
16 | |||
17 | DEMOS = testcurs.exe newdemo.exe xmas.exe tuidemo.exe firework.exe & | ||
18 | ptest.exe rain.exe worm.exe | ||
19 | |||
20 | LIBCURSES = pdcurses.lib | ||
21 | |||
22 | LINK = wlink | ||
23 | |||
24 | !ifdef __LOADDLL__ | ||
25 | ! loaddll wcc wccd | ||
26 | ! loaddll wcc386 wccd386 | ||
27 | ! loaddll wlink wlink | ||
28 | ! loaddll wlib wlibd | ||
29 | !endif | ||
30 | |||
31 | all: $(LIBCURSES) $(DEMOS) | ||
32 | |||
33 | clean | ||
34 | -del *.obj | ||
35 | -del *.lib | ||
36 | -del *.exe | ||
37 | -del *.err | ||
38 | |||
39 | demos: $(DEMOS) | ||
40 | |||
41 | .c: $(srcdir);$(osdir);$(demodir) | ||
42 | .c.obj: .autodepend | ||
43 | $(CC) $(CFLAGS) $< | ||
44 | |||
45 | .obj.exe: | ||
46 | $(LINK) $(LDFLAGS) n $@ f $*.obj l $(LIBCURSES) | ||
47 | |||
48 | testcurs.exe: testcurs.obj $(LIBCURSES) | ||
49 | newdemo.exe: newdemo.obj $(LIBCURSES) | ||
50 | xmas.exe: xmas.obj $(LIBCURSES) | ||
51 | firework.exe: firework.obj $(LIBCURSES) | ||
52 | rain.exe: rain.obj $(LIBCURSES) | ||
53 | worm.exe: worm.obj $(LIBCURSES) | ||
54 | ptest.exe: ptest.obj $(LIBCURSES) | ||
55 | |||
56 | tuidemo.exe: tuidemo.obj tui.obj $(LIBCURSES) | ||
57 | $(LINK) $(LDFLAGS) n $@ f tuidemo.obj f tui.obj l $(LIBCURSES) | ||
58 | |||
59 | dist: .symbolic |
File win32/README added (mode: 100644) (index 00000000..bfe2ad95) | |||
1 | PDCurses for Win32 | ||
2 | ================== | ||
3 | |||
4 | This directory contains PDCurses source code files specific to Win32 | ||
5 | console mode (Win9x/Me/NT/2k/XP/Vista). | ||
6 | |||
7 | |||
8 | Building | ||
9 | -------- | ||
10 | |||
11 | . Choose the appropriate makefile for your compiler: | ||
12 | |||
13 | bccwin32.mak - Borland C++ 4.0.2+ | ||
14 | dmcwin32.mak - Digital Mars | ||
15 | gccwin32.mak - Cygnus GNU Compiler | ||
16 | lccwin32.mak - LCC-Win32 | ||
17 | mingwin32.mak - MinGW | ||
18 | vcwin32.mak - Microsoft Visual C++ 2.0+ | ||
19 | wccwin32.mak - Watcom 10.6+ | ||
20 | |||
21 | . Optionally, you can build in a different directory than the platform | ||
22 | directory by setting PDCURSES_SRCDIR to point to the directory where | ||
23 | you unpacked PDCurses, and changing to your target directory: | ||
24 | |||
25 | set PDCURSES_SRCDIR=c:\pdcurses | ||
26 | |||
27 | This won't work with the LCC or Digital Mars makefiles, nor will the | ||
28 | options described below. | ||
29 | |||
30 | . Build it: | ||
31 | |||
32 | make -f makefilename | ||
33 | |||
34 | (For Watcom, use "wmake" instead of "make"; for MSVC, "nmake".) You'll | ||
35 | get the libraries (pdcurses.lib or .a, depending on your compiler; and | ||
36 | panel.lib or .a), the demos (*.exe), and a lot of object files. Note | ||
37 | that the panel library is just a copy of the main library, provided | ||
38 | for convenience; both panel and curses functions are in the main | ||
39 | library. | ||
40 | |||
41 | You can also give the optional parameter "WIDE=Y", to build the | ||
42 | library with wide-character (Unicode) support: | ||
43 | |||
44 | make -f mingwin32.mak WIDE=Y | ||
45 | |||
46 | When built this way, the library is not compatible with Windows 9x, | ||
47 | unless you also link with the Microsoft Layer for Unicode (not | ||
48 | tested). | ||
49 | |||
50 | Another option, "UTF8=Y", makes PDCurses ignore the system locale, and | ||
51 | treat all narrow-character strings as UTF-8. This option has no effect | ||
52 | unless WIDE=Y is also set. Use it to get around the poor support for | ||
53 | UTF-8 in the Win32 console: | ||
54 | |||
55 | make -f mingwin32.mak WIDE=Y UTF8=Y | ||
56 | |||
57 | You can also use the optional parameter "DLL=Y" with Visual C++, | ||
58 | MinGW or Cygwin, to build the library as a DLL: | ||
59 | |||
60 | nmake -f vcwin32.mak WIDE=Y DLL=Y | ||
61 | |||
62 | When you build the library as a Windows DLL, you must always define | ||
63 | PDCURSES_DLL_BUILD when linking against it. (Or, if you only want to | ||
64 | use the DLL, you could add this definition to your curses.h.) | ||
65 | |||
66 | |||
67 | Distribution Status | ||
68 | ------------------- | ||
69 | |||
70 | The files in this directory are released to the Public Domain. | ||
71 | |||
72 | |||
73 | Acknowledgements | ||
74 | ---------------- | ||
75 | |||
76 | Generic Win32 port was provided by Chris Szurgot <szurgot@itribe.net> |
File win32/bccwin32.mak added (mode: 100644) (index 00000000..229ab4be) | |||
1 | # Borland MAKE Makefile for PDCurses library - Win32 BC++ 4.0+ | ||
2 | # | ||
3 | # Usage: make -f [path\]bccwin32.mak [DEBUG=] [WIDE=] [UTF8=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | O = obj | ||
9 | |||
10 | !ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)\win32 | ||
18 | |||
19 | CC = bcc32 -q | ||
20 | |||
21 | !ifdef DEBUG | ||
22 | CFLAGS = -N -v -y -DPDCDEBUG | ||
23 | !else | ||
24 | CFLAGS = -O | ||
25 | !endif | ||
26 | |||
27 | !ifdef WIDE | ||
28 | WIDEOPT = -DPDC_WIDE | ||
29 | !endif | ||
30 | |||
31 | !ifdef UTF8 | ||
32 | UTF8OPT = -DPDC_FORCE_UTF8 | ||
33 | !endif | ||
34 | |||
35 | BUILD = $(CC) -I$(PDCURSES_SRCDIR) -c -Tpe -w32 $(CFLAGS) -w-par \ | ||
36 | $(WIDEOPT) $(UTF8OPT) | ||
37 | |||
38 | LIBEXE = tlib /C /E /0 /a | ||
39 | |||
40 | LIBCURSES = pdcurses.lib | ||
41 | |||
42 | all: $(LIBCURSES) $(DEMOS) | ||
43 | |||
44 | clean: | ||
45 | -del *.obj | ||
46 | -del *.lib | ||
47 | -del *.tds | ||
48 | -del *.exe | ||
49 | |||
50 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
51 | -del $@ | ||
52 | $(LIBEXE) $@ $(LIBOBJS) $(PDCOBJS) | ||
53 | -copy $(LIBCURSES) panel.lib | ||
54 | |||
55 | .autodepend | ||
56 | |||
57 | {$(srcdir)\}.c.obj: | ||
58 | $(BUILD) $< | ||
59 | |||
60 | {$(osdir)\}.c.obj: | ||
61 | $(BUILD) $< | ||
62 | |||
63 | {$(demodir)\}.c.obj: | ||
64 | $(BUILD) $< | ||
65 | |||
66 | .c.obj: | ||
67 | $(BUILD) $< | ||
68 | |||
69 | .obj.exe: | ||
70 | $(CC) -e$@ $** $(LIBCURSES) | ||
71 | |||
72 | tuidemo.exe: tuidemo.obj tui.obj $(LIBCURSES) | ||
73 | $(CC) -e$@ $** | ||
74 | |||
75 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h $(PDCURSES_CURSES_H) | ||
76 | $(BUILD) -I$(demodir) $(demodir)\tui.c | ||
77 | |||
78 | tuidemo.obj: $(demodir)\tuidemo.c $(PDCURSES_CURSES_H) | ||
79 | $(BUILD) -I$(demodir) $(demodir)\tuidemo.c | ||
80 | |||
81 | PLATFORM1 = Borland C++ Win32 | ||
82 | PLATFORM2 = Borland C/C++ 5.5 for Win32 | ||
83 | ARCNAME = pdc$(VER)_bcc_w32 | ||
84 | |||
85 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File win32/dmcwin32.mak added (mode: 100644) (index 00000000..23522cc9) | |||
1 | # Makefile for PDCurses library - WIN32 Digital Mars | ||
2 | # | ||
3 | # Usage: make -f dmcwin32.mak [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | PDCURSES_SRCDIR = .. | ||
9 | |||
10 | PDCURSES_CURSES_H = $(PDCURSES_SRCDIR)\curses.h | ||
11 | PDCURSES_CURSPRIV_H = $(PDCURSES_SRCDIR)\curspriv.h | ||
12 | PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) | ||
13 | |||
14 | PANEL_HEADER = $(PDCURSES_SRCDIR)\panel.h | ||
15 | TERM_HEADER = $(PDCURSES_SRCDIR)\term.h | ||
16 | |||
17 | srcdir = $(PDCURSES_SRCDIR)\pdcurses | ||
18 | osdir = $(PDCURSES_SRCDIR)\win32 | ||
19 | demodir = $(PDCURSES_SRCDIR)\demos | ||
20 | |||
21 | PDCURSES_WIN_H = $(osdir)\pdcwin.h | ||
22 | |||
23 | CC = dmc | ||
24 | |||
25 | CFLAGS = -c -o+space -Nc | ||
26 | |||
27 | CPPFLAGS = -I$(PDCURSES_SRCDIR) #-DPDC_WIDE -DPDC_FORCE_UTF8 | ||
28 | |||
29 | LINK = dmc | ||
30 | LIBEXE = lib | ||
31 | |||
32 | LIBCURSES = pdcurses.lib | ||
33 | |||
34 | BUILD = $(CC) $(CFLAGS) $(CPPFLAGS) | ||
35 | |||
36 | DEMOS = testcurs.exe newdemo.exe xmas.exe tuidemo.exe \ | ||
37 | firework.exe ptest.exe rain.exe worm.exe | ||
38 | |||
39 | all: $(LIBCURSES) $(DEMOS) | ||
40 | |||
41 | clean: | ||
42 | -del *.obj | ||
43 | -del *.lib | ||
44 | -del *.exe | ||
45 | -del *.map | ||
46 | -del advapi32.def | ||
47 | |||
48 | LIBOBJS = addch.obj addchstr.obj addstr.obj attr.obj beep.obj bkgd.obj \ | ||
49 | border.obj clear.obj color.obj delch.obj deleteln.obj deprec.obj getch.obj \ | ||
50 | getstr.obj getyx.obj inch.obj inchstr.obj initscr.obj inopts.obj \ | ||
51 | insch.obj insstr.obj instr.obj kernel.obj keyname.obj mouse.obj move.obj \ | ||
52 | outopts.obj overlay.obj pad.obj panel.obj printw.obj refresh.obj \ | ||
53 | scanw.obj scr_dump.obj scroll.obj slk.obj termattr.obj terminfo.obj \ | ||
54 | touch.obj util.obj window.obj debug.obj | ||
55 | |||
56 | PDCOBJS = pdcclip.obj pdcdisp.obj pdcgetsc.obj pdckbd.obj pdcscrn.obj \ | ||
57 | pdcsetsc.obj pdcutil.obj | ||
58 | |||
59 | DEMOOBJS = testcurs.obj newdemo.obj xmas.obj tuidemo.obj tui.obj \ | ||
60 | firework.obj ptest.obj rain.obj worm.obj | ||
61 | |||
62 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
63 | $(PDCOBJS) : $(PDCURSES_WIN_H) | ||
64 | panel.obj ptest.obj: $(PANEL_HEADER) | ||
65 | terminfo.obj: $(TERM_HEADER) | ||
66 | |||
67 | $(DEMOOBJS) : $(PDCURSES_CURSES_H) | ||
68 | $(DEMOS) : $(LIBCURSES) | ||
69 | |||
70 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
71 | $(LIBEXE) -c $@ $(LIBOBJS) $(PDCOBJS) | ||
72 | -copy $(LIBCURSES) panel.lib | ||
73 | |||
74 | SRCBUILD = $(BUILD) $(srcdir)\$*.c | ||
75 | OSBUILD = $(BUILD) $(osdir)\$*.c | ||
76 | DEMOBUILD = $(LINK) $(CPPFLAGS) -o+space $@ $** | ||
77 | |||
78 | addch.obj: $(srcdir)\addch.c | ||
79 | $(SRCBUILD) | ||
80 | |||
81 | addchstr.obj: $(srcdir)\addchstr.c | ||
82 | $(SRCBUILD) | ||
83 | |||
84 | addstr.obj: $(srcdir)\addstr.c | ||
85 | $(SRCBUILD) | ||
86 | |||
87 | attr.obj: $(srcdir)\attr.c | ||
88 | $(SRCBUILD) | ||
89 | |||
90 | beep.obj: $(srcdir)\beep.c | ||
91 | $(SRCBUILD) | ||
92 | |||
93 | bkgd.obj: $(srcdir)\bkgd.c | ||
94 | $(SRCBUILD) | ||
95 | |||
96 | border.obj: $(srcdir)\border.c | ||
97 | $(SRCBUILD) | ||
98 | |||
99 | clear.obj: $(srcdir)\clear.c | ||
100 | $(SRCBUILD) | ||
101 | |||
102 | color.obj: $(srcdir)\color.c | ||
103 | $(SRCBUILD) | ||
104 | |||
105 | delch.obj: $(srcdir)\delch.c | ||
106 | $(SRCBUILD) | ||
107 | |||
108 | deleteln.obj: $(srcdir)\deleteln.c | ||
109 | $(SRCBUILD) | ||
110 | |||
111 | deprec.obj: $(srcdir)\deprec.c | ||
112 | $(SRCBUILD) | ||
113 | |||
114 | getch.obj: $(srcdir)\getch.c | ||
115 | $(SRCBUILD) | ||
116 | |||
117 | getstr.obj: $(srcdir)\getstr.c | ||
118 | $(SRCBUILD) | ||
119 | |||
120 | getyx.obj: $(srcdir)\getyx.c | ||
121 | $(SRCBUILD) | ||
122 | |||
123 | inch.obj: $(srcdir)\inch.c | ||
124 | $(SRCBUILD) | ||
125 | |||
126 | inchstr.obj: $(srcdir)\inchstr.c | ||
127 | $(SRCBUILD) | ||
128 | |||
129 | initscr.obj: $(srcdir)\initscr.c | ||
130 | $(SRCBUILD) | ||
131 | |||
132 | inopts.obj: $(srcdir)\inopts.c | ||
133 | $(SRCBUILD) | ||
134 | |||
135 | insch.obj: $(srcdir)\insch.c | ||
136 | $(SRCBUILD) | ||
137 | |||
138 | insstr.obj: $(srcdir)\insstr.c | ||
139 | $(SRCBUILD) | ||
140 | |||
141 | instr.obj: $(srcdir)\instr.c | ||
142 | $(SRCBUILD) | ||
143 | |||
144 | kernel.obj: $(srcdir)\kernel.c | ||
145 | $(SRCBUILD) | ||
146 | |||
147 | keyname.obj: $(srcdir)\keyname.c | ||
148 | $(SRCBUILD) | ||
149 | |||
150 | mouse.obj: $(srcdir)\mouse.c | ||
151 | $(SRCBUILD) | ||
152 | |||
153 | move.obj: $(srcdir)\move.c | ||
154 | $(SRCBUILD) | ||
155 | |||
156 | outopts.obj: $(srcdir)\outopts.c | ||
157 | $(SRCBUILD) | ||
158 | |||
159 | overlay.obj: $(srcdir)\overlay.c | ||
160 | $(SRCBUILD) | ||
161 | |||
162 | pad.obj: $(srcdir)\pad.c | ||
163 | $(SRCBUILD) | ||
164 | |||
165 | panel.obj: $(srcdir)\panel.c | ||
166 | $(SRCBUILD) | ||
167 | |||
168 | printw.obj: $(srcdir)\printw.c | ||
169 | $(SRCBUILD) | ||
170 | |||
171 | refresh.obj: $(srcdir)\refresh.c | ||
172 | $(SRCBUILD) | ||
173 | |||
174 | scanw.obj: $(srcdir)\scanw.c | ||
175 | $(SRCBUILD) | ||
176 | |||
177 | scr_dump.obj: $(srcdir)\scr_dump.c | ||
178 | $(SRCBUILD) | ||
179 | |||
180 | scroll.obj: $(srcdir)\scroll.c | ||
181 | $(SRCBUILD) | ||
182 | |||
183 | slk.obj: $(srcdir)\slk.c | ||
184 | $(SRCBUILD) | ||
185 | |||
186 | termattr.obj: $(srcdir)\termattr.c | ||
187 | $(SRCBUILD) | ||
188 | |||
189 | terminfo.obj: $(srcdir)\terminfo.c | ||
190 | $(SRCBUILD) | ||
191 | |||
192 | touch.obj: $(srcdir)\touch.c | ||
193 | $(SRCBUILD) | ||
194 | |||
195 | util.obj: $(srcdir)\util.c | ||
196 | $(SRCBUILD) | ||
197 | |||
198 | window.obj: $(srcdir)\window.c | ||
199 | $(SRCBUILD) | ||
200 | |||
201 | debug.obj: $(srcdir)\debug.c | ||
202 | $(SRCBUILD) | ||
203 | |||
204 | pdcclip.obj: $(osdir)\pdcclip.c | ||
205 | $(OSBUILD) | ||
206 | |||
207 | pdcdisp.obj: $(osdir)\pdcdisp.c | ||
208 | $(OSBUILD) | ||
209 | |||
210 | pdcgetsc.obj: $(osdir)\pdcgetsc.c | ||
211 | $(OSBUILD) | ||
212 | |||
213 | pdckbd.obj: $(osdir)\pdckbd.c | ||
214 | $(OSBUILD) | ||
215 | |||
216 | pdcscrn.obj: $(osdir)\pdcscrn.c | ||
217 | $(OSBUILD) | ||
218 | |||
219 | pdcsetsc.obj: $(osdir)\pdcsetsc.c | ||
220 | $(OSBUILD) | ||
221 | |||
222 | pdcutil.obj: $(osdir)\pdcutil.c | ||
223 | $(OSBUILD) | ||
224 | |||
225 | firework.exe: $(demodir)\firework.c | ||
226 | $(DEMOBUILD) | ||
227 | |||
228 | newdemo.exe: $(demodir)\newdemo.c | ||
229 | $(DEMOBUILD) | ||
230 | |||
231 | ptest.exe: $(demodir)\ptest.c | ||
232 | $(DEMOBUILD) | ||
233 | |||
234 | rain.exe: $(demodir)\rain.c | ||
235 | $(DEMOBUILD) | ||
236 | |||
237 | testcurs.exe: $(demodir)\testcurs.c | ||
238 | $(DEMOBUILD) advapi32.lib | ||
239 | |||
240 | tuidemo.exe: tuidemo.obj tui.obj | ||
241 | $(DEMOBUILD) | ||
242 | |||
243 | worm.exe: $(demodir)\worm.c | ||
244 | $(DEMOBUILD) | ||
245 | |||
246 | xmas.exe: $(demodir)\xmas.c | ||
247 | $(DEMOBUILD) | ||
248 | |||
249 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h | ||
250 | $(BUILD) -I$(demodir) $(demodir)\$*.c | ||
251 | |||
252 | tuidemo.obj: $(demodir)\tuidemo.c | ||
253 | $(BUILD) -I$(demodir) $(demodir)\$*.c |
File win32/gccwin32.mak added (mode: 100644) (index 00000000..7504bb34) | |||
1 | # GNU MAKE Makefile for PDCurses library - WIN32 Cygnus GCC | ||
2 | # | ||
3 | # Usage: make -f [path\]gccwin32.mak [DEBUG=Y] [DLL=Y] [WIDE=Y] [UTF8=Y] [tgt] | ||
4 | # | ||
5 | # where tgt can be any of: | ||
6 | # [all|demos|pdcurses.a|testcurs.exe...] | ||
7 | |||
8 | O = o | ||
9 | |||
10 | ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | endif | ||
13 | |||
14 | include $(PDCURSES_SRCDIR)/version.mif | ||
15 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)/win32 | ||
18 | |||
19 | PDCURSES_WIN_H = $(osdir)/pdcwin.h | ||
20 | |||
21 | CC = gcc | ||
22 | |||
23 | ifeq ($(DEBUG),Y) | ||
24 | CFLAGS = -g -Wall -DPDCDEBUG | ||
25 | LDFLAGS = -g | ||
26 | else | ||
27 | CFLAGS = -O2 -Wall | ||
28 | LDFLAGS = | ||
29 | endif | ||
30 | |||
31 | CFLAGS += -I$(PDCURSES_SRCDIR) | ||
32 | |||
33 | BASEDEF = $(PDCURSES_SRCDIR)/exp-base.def | ||
34 | WIDEDEF = $(PDCURSES_SRCDIR)/exp-wide.def | ||
35 | |||
36 | DEFDEPS = $(BASEDEF) | ||
37 | |||
38 | ifeq ($(WIDE),Y) | ||
39 | CFLAGS += -DPDC_WIDE | ||
40 | DEFDEPS += $(WIDEDEF) | ||
41 | endif | ||
42 | |||
43 | ifeq ($(UTF8),Y) | ||
44 | CFLAGS += -DPDC_FORCE_UTF8 | ||
45 | endif | ||
46 | |||
47 | DEFFILE = pdcurses.def | ||
48 | |||
49 | LINK = gcc | ||
50 | |||
51 | ifeq ($(DLL),Y) | ||
52 | CFLAGS += -DPDC_DLL_BUILD | ||
53 | LIBEXE = gcc $(DEFFILE) | ||
54 | LIBFLAGS = -Wl,--out-implib,pdcurses.a -shared -o | ||
55 | LIBCURSES = pdcurses.dll | ||
56 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) $(DEFFILE) | ||
57 | CLEAN = $(LIBCURSES) *.a $(DEFFILE) | ||
58 | else | ||
59 | LIBEXE = ar | ||
60 | LIBFLAGS = rcv | ||
61 | LIBCURSES = pdcurses.a | ||
62 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) | ||
63 | CLEAN = *.a | ||
64 | endif | ||
65 | |||
66 | .PHONY: all libs clean demos dist | ||
67 | |||
68 | all: libs demos | ||
69 | |||
70 | libs: $(LIBCURSES) | ||
71 | |||
72 | clean: | ||
73 | -rm -f *.o | ||
74 | -rm -f *.exe | ||
75 | -rm -f $(CLEAN) | ||
76 | |||
77 | demos: $(DEMOS) | ||
78 | strip *.exe | ||
79 | |||
80 | $(DEFFILE): $(DEFDEPS) | ||
81 | echo LIBRARY pdcurses > $@ | ||
82 | echo EXPORTS >> $@ | ||
83 | cat $(BASEDEF) >> $@ | ||
84 | ifeq ($(WIDE),Y) | ||
85 | cat $(WIDEDEF) >> $@ | ||
86 | endif | ||
87 | |||
88 | $(LIBCURSES) : $(LIBDEPS) | ||
89 | $(LIBEXE) $(LIBFLAGS) $@ $? | ||
90 | -cp pdcurses.a panel.a | ||
91 | |||
92 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
93 | $(PDCOBJS) : $(PDCURSES_WIN_H) | ||
94 | $(DEMOS) : $(PDCURSES_CURSES_H) $(LIBCURSES) | ||
95 | panel.o : $(PANEL_HEADER) | ||
96 | terminfo.o: $(TERM_HEADER) | ||
97 | |||
98 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
99 | $(CC) -c $(CFLAGS) $< | ||
100 | |||
101 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
102 | $(CC) -c $(CFLAGS) $< | ||
103 | |||
104 | firework.exe newdemo.exe rain.exe testcurs.exe worm.exe xmas.exe \ | ||
105 | ptest.exe: %.exe: $(demodir)/%.c | ||
106 | $(CC) $(CFLAGS) -o$@ $< $(LIBCURSES) | ||
107 | |||
108 | tuidemo.exe: tuidemo.o tui.o | ||
109 | $(LINK) $(LDFLAGS) -o$@ tuidemo.o tui.o $(LIBCURSES) | ||
110 | |||
111 | tui.o: $(demodir)/tui.c $(demodir)/tui.h $(PDCURSES_CURSES_H) | ||
112 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
113 | |||
114 | tuidemo.o: $(demodir)/tuidemo.c $(PDCURSES_CURSES_H) | ||
115 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
116 | |||
117 | dist: $(PDCLIBS) | ||
118 | echo PDCurses $(VERDOT) for Cygnus Win32 > file_id.diz | ||
119 | echo ------------------------------------------ >> file_id.diz | ||
120 | echo Public Domain Curses library for >> file_id.diz | ||
121 | echo Cygnus GCC for Win32. >> file_id.diz | ||
122 | echo Source available in PDCURS$(VER).ZIP >> file_id.diz | ||
123 | echo Public Domain. >> file_id.diz | ||
124 | zip -9jX pdc$(VER)_cyg_w32 \ | ||
125 | $(PDCURSES_SRCDIR)/README $(PDCURSES_SRCDIR)/HISTORY \ | ||
126 | $(PDCURSES_SRCDIR)/curses.h $(PDCURSES_SRCDIR)/panel.h \ | ||
127 | $(LIBCURSES) $(LIBPANEL) file_id.diz | ||
128 | rm file_id.diz |
File win32/lccwin32.mak added (mode: 100644) (index 00000000..90c1c894) | |||
1 | # Makefile for PDCurses library - WIN32 LCC-Win32 | ||
2 | # | ||
3 | # Usage: make -f lccwin32.mak [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | PDCURSES_SRCDIR = .. | ||
9 | |||
10 | PDCURSES_CURSES_H = $(PDCURSES_SRCDIR)\curses.h | ||
11 | PDCURSES_CURSPRIV_H = $(PDCURSES_SRCDIR)\curspriv.h | ||
12 | PDCURSES_HEADERS = $(PDCURSES_CURSES_H) $(PDCURSES_CURSPRIV_H) | ||
13 | |||
14 | PANEL_HEADER = $(PDCURSES_SRCDIR)\panel.h | ||
15 | TERM_HEADER = $(PDCURSES_SRCDIR)\term.h | ||
16 | |||
17 | srcdir = $(PDCURSES_SRCDIR)\pdcurses | ||
18 | osdir = $(PDCURSES_SRCDIR)\win32 | ||
19 | demodir = $(PDCURSES_SRCDIR)\demos | ||
20 | |||
21 | PDCURSES_WIN_H = $(osdir)\pdcwin.h | ||
22 | |||
23 | CC = lcc | ||
24 | |||
25 | #CFLAGS = -c -g3 -A -ansic | ||
26 | CFLAGS = -c -O -A -ansic | ||
27 | |||
28 | CPPFLAGS = -I$(PDCURSES_SRCDIR) #-DPDC_WIDE -DPDC_FORCE_UTF8 | ||
29 | |||
30 | LINK = lcclnk | ||
31 | LIBEXE = lcclib | ||
32 | |||
33 | LIBCURSES = pdcurses.lib | ||
34 | |||
35 | BUILD = $(CC) $(CFLAGS) $(CPPFLAGS) | ||
36 | PDCLIBS = $(LIBCURSES) | ||
37 | |||
38 | DEMOS = testcurs.exe newdemo.exe xmas.exe tuidemo.exe \ | ||
39 | firework.exe ptest.exe rain.exe worm.exe | ||
40 | |||
41 | all: $(PDCLIBS) $(DEMOS) | ||
42 | |||
43 | clean: | ||
44 | -del *.obj | ||
45 | -del *.lib | ||
46 | -del *.exe | ||
47 | |||
48 | LIBOBJS = addch.obj addchstr.obj addstr.obj attr.obj beep.obj bkgd.obj \ | ||
49 | border.obj clear.obj color.obj delch.obj deleteln.obj deprec.obj getch.obj \ | ||
50 | getstr.obj getyx.obj inch.obj inchstr.obj initscr.obj inopts.obj \ | ||
51 | insch.obj insstr.obj instr.obj kernel.obj keyname.obj mouse.obj move.obj \ | ||
52 | outopts.obj overlay.obj pad.obj panel.obj printw.obj refresh.obj \ | ||
53 | scanw.obj scr_dump.obj scroll.obj slk.obj termattr.obj terminfo.obj \ | ||
54 | touch.obj util.obj window.obj debug.obj | ||
55 | |||
56 | PDCOBJS = pdcclip.obj pdcdisp.obj pdcgetsc.obj pdckbd.obj pdcscrn.obj \ | ||
57 | pdcsetsc.obj pdcutil.obj | ||
58 | |||
59 | DEMOOBJS = testcurs.obj newdemo.obj xmas.obj tuidemo.obj tui.obj \ | ||
60 | firework.obj ptest.obj rain.obj worm.obj | ||
61 | |||
62 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
63 | $(PDCOBJS) : $(PDCURSES_WIN_H) | ||
64 | panel.obj ptest.obj: $(PANEL_HEADER) | ||
65 | terminfo.obj: $(TERM_HEADER) | ||
66 | |||
67 | $(DEMOOBJS) : $(PDCURSES_CURSES_H) | ||
68 | $(DEMOS) : $(LIBCURSES) | ||
69 | |||
70 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
71 | $(LIBEXE) /out:$@ $(LIBOBJS) $(PDCOBJS) | ||
72 | -copy $(LIBCURSES) panel.lib | ||
73 | |||
74 | SRCBUILD = $(BUILD) $(srcdir)\$*.c | ||
75 | OSBUILD = $(BUILD) $(osdir)\$*.c | ||
76 | |||
77 | addch.obj: $(srcdir)\addch.c | ||
78 | $(SRCBUILD) | ||
79 | |||
80 | addchstr.obj: $(srcdir)\addchstr.c | ||
81 | $(SRCBUILD) | ||
82 | |||
83 | addstr.obj: $(srcdir)\addstr.c | ||
84 | $(SRCBUILD) | ||
85 | |||
86 | attr.obj: $(srcdir)\attr.c | ||
87 | $(SRCBUILD) | ||
88 | |||
89 | beep.obj: $(srcdir)\beep.c | ||
90 | $(SRCBUILD) | ||
91 | |||
92 | bkgd.obj: $(srcdir)\bkgd.c | ||
93 | $(SRCBUILD) | ||
94 | |||
95 | border.obj: $(srcdir)\border.c | ||
96 | $(SRCBUILD) | ||
97 | |||
98 | clear.obj: $(srcdir)\clear.c | ||
99 | $(SRCBUILD) | ||
100 | |||
101 | color.obj: $(srcdir)\color.c | ||
102 | $(SRCBUILD) | ||
103 | |||
104 | delch.obj: $(srcdir)\delch.c | ||
105 | $(SRCBUILD) | ||
106 | |||
107 | deleteln.obj: $(srcdir)\deleteln.c | ||
108 | $(SRCBUILD) | ||
109 | |||
110 | deprec.obj: $(srcdir)\deprec.c | ||
111 | $(SRCBUILD) | ||
112 | |||
113 | getch.obj: $(srcdir)\getch.c | ||
114 | $(SRCBUILD) | ||
115 | |||
116 | getstr.obj: $(srcdir)\getstr.c | ||
117 | $(SRCBUILD) | ||
118 | |||
119 | getyx.obj: $(srcdir)\getyx.c | ||
120 | $(SRCBUILD) | ||
121 | |||
122 | inch.obj: $(srcdir)\inch.c | ||
123 | $(SRCBUILD) | ||
124 | |||
125 | inchstr.obj: $(srcdir)\inchstr.c | ||
126 | $(SRCBUILD) | ||
127 | |||
128 | initscr.obj: $(srcdir)\initscr.c | ||
129 | $(SRCBUILD) | ||
130 | |||
131 | inopts.obj: $(srcdir)\inopts.c | ||
132 | $(SRCBUILD) | ||
133 | |||
134 | insch.obj: $(srcdir)\insch.c | ||
135 | $(SRCBUILD) | ||
136 | |||
137 | insstr.obj: $(srcdir)\insstr.c | ||
138 | $(SRCBUILD) | ||
139 | |||
140 | instr.obj: $(srcdir)\instr.c | ||
141 | $(SRCBUILD) | ||
142 | |||
143 | kernel.obj: $(srcdir)\kernel.c | ||
144 | $(SRCBUILD) | ||
145 | |||
146 | keyname.obj: $(srcdir)\keyname.c | ||
147 | $(SRCBUILD) | ||
148 | |||
149 | mouse.obj: $(srcdir)\mouse.c | ||
150 | $(SRCBUILD) | ||
151 | |||
152 | move.obj: $(srcdir)\move.c | ||
153 | $(SRCBUILD) | ||
154 | |||
155 | outopts.obj: $(srcdir)\outopts.c | ||
156 | $(SRCBUILD) | ||
157 | |||
158 | overlay.obj: $(srcdir)\overlay.c | ||
159 | $(SRCBUILD) | ||
160 | |||
161 | pad.obj: $(srcdir)\pad.c | ||
162 | $(SRCBUILD) | ||
163 | |||
164 | panel.obj: $(srcdir)\panel.c | ||
165 | $(SRCBUILD) | ||
166 | |||
167 | printw.obj: $(srcdir)\printw.c | ||
168 | $(SRCBUILD) | ||
169 | |||
170 | refresh.obj: $(srcdir)\refresh.c | ||
171 | $(SRCBUILD) | ||
172 | |||
173 | scanw.obj: $(srcdir)\scanw.c | ||
174 | $(SRCBUILD) | ||
175 | |||
176 | scr_dump.obj: $(srcdir)\scr_dump.c | ||
177 | $(SRCBUILD) | ||
178 | |||
179 | scroll.obj: $(srcdir)\scroll.c | ||
180 | $(SRCBUILD) | ||
181 | |||
182 | slk.obj: $(srcdir)\slk.c | ||
183 | $(SRCBUILD) | ||
184 | |||
185 | termattr.obj: $(srcdir)\termattr.c | ||
186 | $(SRCBUILD) | ||
187 | |||
188 | terminfo.obj: $(srcdir)\terminfo.c | ||
189 | $(SRCBUILD) | ||
190 | |||
191 | touch.obj: $(srcdir)\touch.c | ||
192 | $(SRCBUILD) | ||
193 | |||
194 | util.obj: $(srcdir)\util.c | ||
195 | $(SRCBUILD) | ||
196 | |||
197 | window.obj: $(srcdir)\window.c | ||
198 | $(SRCBUILD) | ||
199 | |||
200 | debug.obj: $(srcdir)\debug.c | ||
201 | $(SRCBUILD) | ||
202 | |||
203 | pdcclip.obj: $(osdir)\pdcclip.c | ||
204 | $(OSBUILD) | ||
205 | |||
206 | pdcdisp.obj: $(osdir)\pdcdisp.c | ||
207 | $(OSBUILD) | ||
208 | |||
209 | pdcgetsc.obj: $(osdir)\pdcgetsc.c | ||
210 | $(OSBUILD) | ||
211 | |||
212 | pdckbd.obj: $(osdir)\pdckbd.c | ||
213 | $(OSBUILD) | ||
214 | |||
215 | pdcscrn.obj: $(osdir)\pdcscrn.c | ||
216 | $(OSBUILD) | ||
217 | |||
218 | pdcsetsc.obj: $(osdir)\pdcsetsc.c | ||
219 | $(OSBUILD) | ||
220 | |||
221 | pdcutil.obj: $(osdir)\pdcutil.c | ||
222 | $(OSBUILD) | ||
223 | |||
224 | firework.exe: firework.obj | ||
225 | $(LINK) -o $@ firework.obj $(LIBCURSES) | ||
226 | |||
227 | newdemo.exe: newdemo.obj | ||
228 | $(LINK) -o $@ newdemo.obj $(LIBCURSES) | ||
229 | |||
230 | ptest.exe: ptest.obj | ||
231 | $(LINK) -o $@ ptest.obj $(LIBCURSES) | ||
232 | |||
233 | rain.exe: rain.obj | ||
234 | $(LINK) -o $@ rain.obj $(LIBCURSES) | ||
235 | |||
236 | testcurs.exe: testcurs.obj | ||
237 | $(LINK) -o $@ testcurs.obj $(LIBCURSES) | ||
238 | |||
239 | tuidemo.exe: tuidemo.obj tui.obj | ||
240 | $(LINK) -o $@ tuidemo.obj tui.obj $(LIBCURSES) | ||
241 | |||
242 | worm.exe: worm.obj | ||
243 | $(LINK) -o $@ worm.obj $(LIBCURSES) | ||
244 | |||
245 | xmas.exe: xmas.obj | ||
246 | $(LINK) -o $@ xmas.obj $(LIBCURSES) | ||
247 | |||
248 | firework.obj: $(demodir)\firework.c | ||
249 | $(BUILD) $(demodir)\$*.c | ||
250 | |||
251 | newdemo.obj: $(demodir)\newdemo.c | ||
252 | $(BUILD) $(demodir)\$*.c | ||
253 | |||
254 | ptest.obj: $(demodir)\ptest.c | ||
255 | $(BUILD) $(demodir)\$*.c | ||
256 | |||
257 | rain.obj: $(demodir)\rain.c | ||
258 | $(BUILD) $(demodir)\$*.c | ||
259 | |||
260 | testcurs.obj: $(demodir)\testcurs.c | ||
261 | $(BUILD) $(demodir)\$*.c | ||
262 | |||
263 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h | ||
264 | $(BUILD) -I$(demodir) $(demodir)\$*.c | ||
265 | |||
266 | tuidemo.obj: $(demodir)\tuidemo.c | ||
267 | $(BUILD) -I$(demodir) $(demodir)\$*.c | ||
268 | |||
269 | worm.obj: $(demodir)\worm.c | ||
270 | $(BUILD) $(demodir)\$*.c | ||
271 | |||
272 | xmas.obj: $(demodir)\xmas.c | ||
273 | $(BUILD) $(demodir)\$*.c |
File win32/mingwin32.mak added (mode: 100644) (index 00000000..7fb17e8f) | |||
1 | # GNU MAKE Makefile for PDCurses library - WIN32 MinGW GCC | ||
2 | # | ||
3 | # Usage: make -f [path\]mingwin32.mak [DEBUG=Y] [DLL=Y] [WIDE=Y] [UTF8=Y] [tgt] | ||
4 | # | ||
5 | # where tgt can be any of: | ||
6 | # [all|demos|pdcurses.a|testcurs.exe...] | ||
7 | |||
8 | O = o | ||
9 | |||
10 | ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | endif | ||
13 | |||
14 | include $(PDCURSES_SRCDIR)/version.mif | ||
15 | include $(PDCURSES_SRCDIR)/libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)/win32 | ||
18 | |||
19 | PDCURSES_WIN_H = $(osdir)/pdcwin.h | ||
20 | |||
21 | CC = gcc | ||
22 | |||
23 | ifeq ($(DEBUG),Y) | ||
24 | CFLAGS = -g -Wall -DPDCDEBUG | ||
25 | LDFLAGS = -g | ||
26 | else | ||
27 | CFLAGS = -O2 -Wall | ||
28 | LDFLAGS = | ||
29 | endif | ||
30 | |||
31 | CFLAGS += -I$(PDCURSES_SRCDIR) | ||
32 | |||
33 | BASEDEF = $(PDCURSES_SRCDIR)\exp-base.def | ||
34 | WIDEDEF = $(PDCURSES_SRCDIR)\exp-wide.def | ||
35 | |||
36 | DEFDEPS = $(BASEDEF) | ||
37 | |||
38 | ifeq ($(WIDE),Y) | ||
39 | CFLAGS += -DPDC_WIDE | ||
40 | DEFDEPS += $(WIDEDEF) | ||
41 | endif | ||
42 | |||
43 | ifeq ($(UTF8),Y) | ||
44 | CFLAGS += -DPDC_FORCE_UTF8 | ||
45 | endif | ||
46 | |||
47 | DEFFILE = pdcurses.def | ||
48 | |||
49 | LINK = gcc | ||
50 | |||
51 | ifeq ($(DLL),Y) | ||
52 | CFLAGS += -DPDC_DLL_BUILD | ||
53 | LIBEXE = gcc $(DEFFILE) | ||
54 | LIBFLAGS = -Wl,--out-implib,pdcurses.a -shared -o | ||
55 | LIBCURSES = pdcurses.dll | ||
56 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) $(DEFFILE) | ||
57 | CLEAN = $(LIBCURSES) *.a $(DEFFILE) | ||
58 | else | ||
59 | LIBEXE = ar | ||
60 | LIBFLAGS = rcv | ||
61 | LIBCURSES = pdcurses.a | ||
62 | LIBDEPS = $(LIBOBJS) $(PDCOBJS) | ||
63 | CLEAN = *.a | ||
64 | endif | ||
65 | |||
66 | .PHONY: all libs clean demos dist | ||
67 | |||
68 | all: libs demos | ||
69 | |||
70 | libs: $(LIBCURSES) | ||
71 | |||
72 | clean: | ||
73 | -del *.o | ||
74 | -del *.exe | ||
75 | -del $(CLEAN) | ||
76 | |||
77 | demos: $(DEMOS) | ||
78 | strip *.exe | ||
79 | |||
80 | $(DEFFILE): $(DEFDEPS) | ||
81 | echo LIBRARY pdcurses > $@ | ||
82 | echo EXPORTS >> $@ | ||
83 | type $(BASEDEF) >> $@ | ||
84 | ifeq ($(WIDE),Y) | ||
85 | type $(WIDEDEF) >> $@ | ||
86 | endif | ||
87 | |||
88 | $(LIBCURSES) : $(LIBDEPS) | ||
89 | $(LIBEXE) $(LIBFLAGS) $@ $? | ||
90 | -copy pdcurses.a panel.a | ||
91 | |||
92 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
93 | $(PDCOBJS) : $(PDCURSES_WIN_H) | ||
94 | $(DEMOS) : $(PDCURSES_CURSES_H) $(LIBCURSES) | ||
95 | panel.o : $(PANEL_HEADER) | ||
96 | terminfo.o: $(TERM_HEADER) | ||
97 | |||
98 | $(LIBOBJS) : %.o: $(srcdir)/%.c | ||
99 | $(CC) -c $(CFLAGS) $< | ||
100 | |||
101 | $(PDCOBJS) : %.o: $(osdir)/%.c | ||
102 | $(CC) -c $(CFLAGS) $< | ||
103 | |||
104 | firework.exe newdemo.exe rain.exe testcurs.exe worm.exe xmas.exe \ | ||
105 | ptest.exe: %.exe: $(demodir)/%.c | ||
106 | $(CC) $(CFLAGS) -o$@ $< $(LIBCURSES) | ||
107 | |||
108 | tuidemo.exe: tuidemo.o tui.o | ||
109 | $(LINK) $(LDFLAGS) -o$@ tuidemo.o tui.o $(LIBCURSES) | ||
110 | |||
111 | tui.o: $(demodir)/tui.c $(demodir)/tui.h $(PDCURSES_CURSES_H) | ||
112 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
113 | |||
114 | tuidemo.o: $(demodir)/tuidemo.c $(PDCURSES_CURSES_H) | ||
115 | $(CC) -c $(CFLAGS) -I$(demodir) -o$@ $< | ||
116 | |||
117 | PLATFORM1 = MinGW Win32 | ||
118 | PLATFORM2 = MinGW for Win32 | ||
119 | ARCNAME = pdc$(VER)_ming_w32 | ||
120 | |||
121 | include $(PDCURSES_SRCDIR)/makedist.mif |
File win32/pdcclip.c added (mode: 100644) (index 00000000..35b6bba5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcclip.c,v 1.30 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: clipboard | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_getclipboard(char **contents, long *length); | ||
13 | int PDC_setclipboard(const char *contents, long length); | ||
14 | int PDC_freeclipboard(char *contents); | ||
15 | int PDC_clearclipboard(void); | ||
16 | |||
17 | Description: | ||
18 | PDC_getclipboard() gets the textual contents of the system's | ||
19 | clipboard. This function returns the contents of the clipboard | ||
20 | in the contents argument. It is the responsibilitiy of the | ||
21 | caller to free the memory returned, via PDC_freeclipboard(). | ||
22 | The length of the clipboard contents is returned in the length | ||
23 | argument. | ||
24 | |||
25 | PDC_setclipboard copies the supplied text into the system's | ||
26 | clipboard, emptying the clipboard prior to the copy. | ||
27 | |||
28 | PDC_clearclipboard() clears the internal clipboard. | ||
29 | |||
30 | Return Values: | ||
31 | indicator of success/failure of call. | ||
32 | PDC_CLIP_SUCCESS the call was successful | ||
33 | PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for | ||
34 | the clipboard contents | ||
35 | PDC_CLIP_EMPTY the clipboard contains no text | ||
36 | PDC_CLIP_ACCESS_ERROR no clipboard support | ||
37 | |||
38 | Portability X/Open BSD SYS V | ||
39 | PDC_getclipboard - - - | ||
40 | PDC_setclipboard - - - | ||
41 | PDC_freeclipboard - - - | ||
42 | PDC_clearclipboard - - - | ||
43 | |||
44 | **man-end****************************************************************/ | ||
45 | |||
46 | #ifdef PDC_WIDE | ||
47 | # define PDC_TEXT CF_UNICODETEXT | ||
48 | #else | ||
49 | # define PDC_TEXT CF_OEMTEXT | ||
50 | #endif | ||
51 | |||
52 | int PDC_getclipboard(char **contents, long *length) | ||
53 | { | ||
54 | HANDLE handle; | ||
55 | long len; | ||
56 | |||
57 | PDC_LOG(("PDC_getclipboard() - called\n")); | ||
58 | |||
59 | if (!OpenClipboard(NULL)) | ||
60 | return PDC_CLIP_ACCESS_ERROR; | ||
61 | |||
62 | if ((handle = GetClipboardData(PDC_TEXT)) == NULL) | ||
63 | { | ||
64 | CloseClipboard(); | ||
65 | return PDC_CLIP_EMPTY; | ||
66 | } | ||
67 | |||
68 | #ifdef PDC_WIDE | ||
69 | len = wcslen((wchar_t *)handle) * 3; | ||
70 | #else | ||
71 | len = strlen((char *)handle); | ||
72 | #endif | ||
73 | *contents = (char *)GlobalAlloc(GMEM_FIXED, len + 1); | ||
74 | |||
75 | if (!*contents) | ||
76 | { | ||
77 | CloseClipboard(); | ||
78 | return PDC_CLIP_MEMORY_ERROR; | ||
79 | } | ||
80 | |||
81 | #ifdef PDC_WIDE | ||
82 | len = PDC_wcstombs((char *)*contents, (wchar_t *)handle, len); | ||
83 | #else | ||
84 | strcpy((char *)*contents, (char *)handle); | ||
85 | #endif | ||
86 | *length = len; | ||
87 | CloseClipboard(); | ||
88 | |||
89 | return PDC_CLIP_SUCCESS; | ||
90 | } | ||
91 | |||
92 | int PDC_setclipboard(const char *contents, long length) | ||
93 | { | ||
94 | HGLOBAL ptr1; | ||
95 | LPTSTR ptr2; | ||
96 | |||
97 | PDC_LOG(("PDC_setclipboard() - called\n")); | ||
98 | |||
99 | if (!OpenClipboard(NULL)) | ||
100 | return PDC_CLIP_ACCESS_ERROR; | ||
101 | |||
102 | ptr1 = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, | ||
103 | (length + 1) * sizeof(TCHAR)); | ||
104 | |||
105 | if (!ptr1) | ||
106 | return PDC_CLIP_MEMORY_ERROR; | ||
107 | |||
108 | ptr2 = GlobalLock(ptr1); | ||
109 | |||
110 | #ifdef PDC_WIDE | ||
111 | PDC_mbstowcs((wchar_t *)ptr2, contents, length); | ||
112 | #else | ||
113 | memcpy((char *)ptr2, contents, length + 1); | ||
114 | #endif | ||
115 | GlobalUnlock(ptr1); | ||
116 | EmptyClipboard(); | ||
117 | |||
118 | if (!SetClipboardData(PDC_TEXT, ptr1)) | ||
119 | { | ||
120 | GlobalFree(ptr1); | ||
121 | return PDC_CLIP_ACCESS_ERROR; | ||
122 | } | ||
123 | |||
124 | CloseClipboard(); | ||
125 | GlobalFree(ptr1); | ||
126 | |||
127 | return PDC_CLIP_SUCCESS; | ||
128 | } | ||
129 | |||
130 | int PDC_freeclipboard(char *contents) | ||
131 | { | ||
132 | PDC_LOG(("PDC_freeclipboard() - called\n")); | ||
133 | |||
134 | GlobalFree(contents); | ||
135 | return PDC_CLIP_SUCCESS; | ||
136 | } | ||
137 | |||
138 | int PDC_clearclipboard(void) | ||
139 | { | ||
140 | PDC_LOG(("PDC_clearclipboard() - called\n")); | ||
141 | |||
142 | EmptyClipboard(); | ||
143 | |||
144 | return PDC_CLIP_SUCCESS; | ||
145 | } |
File win32/pdcdisp.c added (mode: 100644) (index 00000000..c2ad8142) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcdisp.c,v 1.47 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | #include <string.h> | ||
9 | |||
10 | #ifdef CHTYPE_LONG | ||
11 | |||
12 | # define A(x) ((chtype)x | A_ALTCHARSET) | ||
13 | |||
14 | chtype acs_map[128] = | ||
15 | { | ||
16 | A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10), | ||
17 | A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19), | ||
18 | A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), A(28), | ||
19 | A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', '\'', '(', | ||
20 | ')', '*', | ||
21 | |||
22 | # ifdef PDC_WIDE | ||
23 | 0x2192, 0x2190, 0x2191, 0x2193, | ||
24 | # else | ||
25 | A(0x1a), A(0x1b), A(0x18), A(0x19), | ||
26 | # endif | ||
27 | |||
28 | '/', | ||
29 | |||
30 | # ifdef PDC_WIDE | ||
31 | 0x2588, | ||
32 | # else | ||
33 | 0xdb, | ||
34 | # endif | ||
35 | |||
36 | '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', | ||
37 | '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | ||
38 | 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | ||
39 | 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', | ||
40 | |||
41 | # ifdef PDC_WIDE | ||
42 | 0x2666, 0x2592, | ||
43 | # else | ||
44 | A(0x04), 0xb1, | ||
45 | # endif | ||
46 | |||
47 | 'b', 'c', 'd', 'e', | ||
48 | |||
49 | # ifdef PDC_WIDE | ||
50 | 0x00b0, 0x00b1, 0x2591, 0x00a4, 0x2518, 0x2510, 0x250c, 0x2514, | ||
51 | 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, | ||
52 | 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, | ||
53 | 0x00b7, | ||
54 | # else | ||
55 | 0xf8, 0xf1, 0xb0, A(0x0f), 0xd9, 0xbf, 0xda, 0xc0, 0xc5, 0x2d, 0x2d, | ||
56 | 0xc4, 0x2d, 0x5f, 0xc3, 0xb4, 0xc1, 0xc2, 0xb3, 0xf3, 0xf2, 0xe3, | ||
57 | 0xd8, 0x9c, 0xf9, | ||
58 | # endif | ||
59 | |||
60 | A(127) | ||
61 | }; | ||
62 | |||
63 | # undef A | ||
64 | |||
65 | #endif | ||
66 | |||
67 | /* position hardware cursor at (y, x) */ | ||
68 | |||
69 | void PDC_gotoyx(int row, int col) | ||
70 | { | ||
71 | COORD coord; | ||
72 | |||
73 | PDC_LOG(("PDC_gotoyx() - called: row %d col %d from row %d col %d\n", | ||
74 | row, col, SP->cursrow, SP->curscol)); | ||
75 | |||
76 | coord.X = col; | ||
77 | coord.Y = row; | ||
78 | |||
79 | SetConsoleCursorPosition(pdc_con_out, coord); | ||
80 | } | ||
81 | |||
82 | /* update the given physical line to look like the corresponding line in | ||
83 | curscr */ | ||
84 | |||
85 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp) | ||
86 | { | ||
87 | CHAR_INFO ci[512]; | ||
88 | int j; | ||
89 | COORD bufSize, bufPos; | ||
90 | SMALL_RECT sr; | ||
91 | |||
92 | PDC_LOG(("PDC_transform_line() - called: lineno=%d\n", lineno)); | ||
93 | |||
94 | bufPos.X = bufPos.Y = 0; | ||
95 | |||
96 | bufSize.X = len; | ||
97 | bufSize.Y = 1; | ||
98 | |||
99 | sr.Top = lineno; | ||
100 | sr.Bottom = lineno; | ||
101 | sr.Left = x; | ||
102 | sr.Right = x + len - 1; | ||
103 | |||
104 | for (j = 0; j < len; j++) | ||
105 | { | ||
106 | chtype ch = srcp[j]; | ||
107 | |||
108 | ci[j].Attributes = pdc_atrtab[ch >> PDC_ATTR_SHIFT]; | ||
109 | #ifdef CHTYPE_LONG | ||
110 | if (ch & A_ALTCHARSET && !(ch & 0xff80)) | ||
111 | ch = acs_map[ch & 0x7f]; | ||
112 | #endif | ||
113 | ci[j].Char.UnicodeChar = ch & A_CHARTEXT; | ||
114 | } | ||
115 | |||
116 | WriteConsoleOutput(pdc_con_out, ci, bufSize, bufPos, &sr); | ||
117 | } |
File win32/pdcgetsc.c added (mode: 100644) (index 00000000..15f0dc5f) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcgetsc.c,v 1.36 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /* get the cursor size/shape */ | ||
8 | |||
9 | int PDC_get_cursor_mode(void) | ||
10 | { | ||
11 | CONSOLE_CURSOR_INFO ci; | ||
12 | |||
13 | PDC_LOG(("PDC_get_cursor_mode() - called\n")); | ||
14 | |||
15 | GetConsoleCursorInfo(pdc_con_out, &ci); | ||
16 | |||
17 | return ci.dwSize; | ||
18 | } | ||
19 | |||
20 | /* return number of screen rows */ | ||
21 | |||
22 | int PDC_get_rows(void) | ||
23 | { | ||
24 | CONSOLE_SCREEN_BUFFER_INFO scr; | ||
25 | |||
26 | PDC_LOG(("PDC_get_rows() - called\n")); | ||
27 | |||
28 | GetConsoleScreenBufferInfo(pdc_con_out, &scr); | ||
29 | |||
30 | return scr.srWindow.Bottom - scr.srWindow.Top + 1; | ||
31 | } | ||
32 | |||
33 | /* return number of buffer rows */ | ||
34 | |||
35 | int PDC_get_buffer_rows(void) | ||
36 | { | ||
37 | CONSOLE_SCREEN_BUFFER_INFO scr; | ||
38 | |||
39 | PDC_LOG(("PDC_get_buffer_rows() - called\n")); | ||
40 | |||
41 | GetConsoleScreenBufferInfo(pdc_con_out, &scr); | ||
42 | |||
43 | return scr.dwSize.Y; | ||
44 | } | ||
45 | |||
46 | /* return width of screen/viewport */ | ||
47 | |||
48 | int PDC_get_columns(void) | ||
49 | { | ||
50 | CONSOLE_SCREEN_BUFFER_INFO scr; | ||
51 | |||
52 | PDC_LOG(("PDC_get_columns() - called\n")); | ||
53 | |||
54 | GetConsoleScreenBufferInfo(pdc_con_out, &scr); | ||
55 | |||
56 | return scr.srWindow.Right - scr.srWindow.Left + 1; | ||
57 | } |
File win32/pdckbd.c added (mode: 100644) (index 00000000..1c5b05b0) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdckbd.c,v 1.115 2008/07/20 20:12:04 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdckbd | ||
10 | |||
11 | Synopsis: | ||
12 | unsigned long PDC_get_input_fd(void); | ||
13 | |||
14 | Description: | ||
15 | PDC_get_input_fd() returns the file descriptor that PDCurses | ||
16 | reads its input from. It can be used for select(). | ||
17 | |||
18 | Portability X/Open BSD SYS V | ||
19 | PDC_get_input_fd - - - | ||
20 | |||
21 | **man-end****************************************************************/ | ||
22 | |||
23 | unsigned long pdc_key_modifiers = 0L; | ||
24 | |||
25 | /* These variables are used to store information about the next | ||
26 | Input Event. */ | ||
27 | |||
28 | static INPUT_RECORD save_ip; | ||
29 | static MOUSE_STATUS old_mouse_status; | ||
30 | static DWORD event_count = 0; | ||
31 | static SHORT left_key; | ||
32 | static int key_count = 0; | ||
33 | static int save_press = 0; | ||
34 | |||
35 | #define KEV save_ip.Event.KeyEvent | ||
36 | #define MEV save_ip.Event.MouseEvent | ||
37 | |||
38 | /************************************************************************ | ||
39 | * Table for key code translation of function keys in keypad mode * | ||
40 | * These values are for strict IBM keyboard compatibles only * | ||
41 | ************************************************************************/ | ||
42 | |||
43 | typedef struct | ||
44 | { | ||
45 | unsigned short normal; | ||
46 | unsigned short shift; | ||
47 | unsigned short control; | ||
48 | unsigned short alt; | ||
49 | unsigned short extended; | ||
50 | } KPTAB; | ||
51 | |||
52 | static KPTAB kptab[] = | ||
53 | { | ||
54 | {0, 0, 0, 0, 0 }, /* 0 */ | ||
55 | {0, 0, 0, 0, 0 }, /* 1 VK_LBUTTON */ | ||
56 | {0, 0, 0, 0, 0 }, /* 2 VK_RBUTTON */ | ||
57 | {0, 0, 0, 0, 0 }, /* 3 VK_CANCEL */ | ||
58 | {0, 0, 0, 0, 0 }, /* 4 VK_MBUTTON */ | ||
59 | {0, 0, 0, 0, 0 }, /* 5 */ | ||
60 | {0, 0, 0, 0, 0 }, /* 6 */ | ||
61 | {0, 0, 0, 0, 0 }, /* 7 */ | ||
62 | {0x08, 0x08, 0x7F, ALT_BKSP, 0 }, /* 8 VK_BACK */ | ||
63 | {0x09, KEY_BTAB, CTL_TAB, ALT_TAB, 999 }, /* 9 VK_TAB */ | ||
64 | {0, 0, 0, 0, 0 }, /* 10 */ | ||
65 | {0, 0, 0, 0, 0 }, /* 11 */ | ||
66 | {KEY_B2, 0x35, CTL_PAD5, ALT_PAD5, 0 }, /* 12 VK_CLEAR */ | ||
67 | {0x0D, 0x0D, CTL_ENTER, ALT_ENTER, 1 }, /* 13 VK_RETURN */ | ||
68 | {0, 0, 0, 0, 0 }, /* 14 */ | ||
69 | {0, 0, 0, 0, 0 }, /* 15 */ | ||
70 | {0, 0, 0, 0, 0 }, /* 16 VK_SHIFT HANDLED SEPARATELY */ | ||
71 | {0, 0, 0, 0, 0 }, /* 17 VK_CONTROL HANDLED SEPARATELY */ | ||
72 | {0, 0, 0, 0, 0 }, /* 18 VK_MENU HANDLED SEPARATELY */ | ||
73 | {0, 0, 0, 0, 0 }, /* 19 VK_PAUSE */ | ||
74 | {0, 0, 0, 0, 0 }, /* 20 VK_CAPITAL HANDLED SEPARATELY */ | ||
75 | {0, 0, 0, 0, 0 }, /* 21 VK_HANGUL */ | ||
76 | {0, 0, 0, 0, 0 }, /* 22 */ | ||
77 | {0, 0, 0, 0, 0 }, /* 23 VK_JUNJA */ | ||
78 | {0, 0, 0, 0, 0 }, /* 24 VK_FINAL */ | ||
79 | {0, 0, 0, 0, 0 }, /* 25 VK_HANJA */ | ||
80 | {0, 0, 0, 0, 0 }, /* 26 */ | ||
81 | {0x1B, 0x1B, 0x1B, ALT_ESC, 0 }, /* 27 VK_ESCAPE */ | ||
82 | {0, 0, 0, 0, 0 }, /* 28 VK_CONVERT */ | ||
83 | {0, 0, 0, 0, 0 }, /* 29 VK_NONCONVERT */ | ||
84 | {0, 0, 0, 0, 0 }, /* 30 VK_ACCEPT */ | ||
85 | {0, 0, 0, 0, 0 }, /* 31 VK_MODECHANGE */ | ||
86 | {0x20, 0x20, 0x20, 0x20, 0 }, /* 32 VK_SPACE */ | ||
87 | {KEY_A3, 0x39, CTL_PAD9, ALT_PAD9, 3 }, /* 33 VK_PRIOR */ | ||
88 | {KEY_C3, 0x33, CTL_PAD3, ALT_PAD3, 4 }, /* 34 VK_NEXT */ | ||
89 | {KEY_C1, 0x31, CTL_PAD1, ALT_PAD1, 5 }, /* 35 VK_END */ | ||
90 | {KEY_A1, 0x37, CTL_PAD7, ALT_PAD7, 6 }, /* 36 VK_HOME */ | ||
91 | {KEY_B1, 0x34, CTL_PAD4, ALT_PAD4, 7 }, /* 37 VK_LEFT */ | ||
92 | {KEY_A2, 0x38, CTL_PAD8, ALT_PAD8, 8 }, /* 38 VK_UP */ | ||
93 | {KEY_B3, 0x36, CTL_PAD6, ALT_PAD6, 9 }, /* 39 VK_RIGHT */ | ||
94 | {KEY_C2, 0x32, CTL_PAD2, ALT_PAD2, 10 }, /* 40 VK_DOWN */ | ||
95 | {0, 0, 0, 0, 0 }, /* 41 VK_SELECT */ | ||
96 | {0, 0, 0, 0, 0 }, /* 42 VK_PRINT */ | ||
97 | {0, 0, 0, 0, 0 }, /* 43 VK_EXECUTE */ | ||
98 | {0, 0, 0, 0, 0 }, /* 44 VK_SNAPSHOT*/ | ||
99 | {PAD0, 0x30, CTL_PAD0, ALT_PAD0, 11 }, /* 45 VK_INSERT */ | ||
100 | {PADSTOP, 0x2E, CTL_PADSTOP, ALT_PADSTOP,12 }, /* 46 VK_DELETE */ | ||
101 | {0, 0, 0, 0, 0 }, /* 47 VK_HELP */ | ||
102 | {0x30, 0x29, 0, ALT_0, 0 }, /* 48 */ | ||
103 | {0x31, 0x21, 0, ALT_1, 0 }, /* 49 */ | ||
104 | {0x32, 0x40, 0, ALT_2, 0 }, /* 50 */ | ||
105 | {0x33, 0x23, 0, ALT_3, 0 }, /* 51 */ | ||
106 | {0x34, 0x24, 0, ALT_4, 0 }, /* 52 */ | ||
107 | {0x35, 0x25, 0, ALT_5, 0 }, /* 53 */ | ||
108 | {0x36, 0x5E, 0, ALT_6, 0 }, /* 54 */ | ||
109 | {0x37, 0x26, 0, ALT_7, 0 }, /* 55 */ | ||
110 | {0x38, 0x2A, 0, ALT_8, 0 }, /* 56 */ | ||
111 | {0x39, 0x28, 0, ALT_9, 0 }, /* 57 */ | ||
112 | {0, 0, 0, 0, 0 }, /* 58 */ | ||
113 | {0, 0, 0, 0, 0 }, /* 59 */ | ||
114 | {0, 0, 0, 0, 0 }, /* 60 */ | ||
115 | {0, 0, 0, 0, 0 }, /* 61 */ | ||
116 | {0, 0, 0, 0, 0 }, /* 62 */ | ||
117 | {0, 0, 0, 0, 0 }, /* 63 */ | ||
118 | {0, 0, 0, 0, 0 }, /* 64 */ | ||
119 | {0x61, 0x41, 0x01, ALT_A, 0 }, /* 65 */ | ||
120 | {0x62, 0x42, 0x02, ALT_B, 0 }, /* 66 */ | ||
121 | {0x63, 0x43, 0x03, ALT_C, 0 }, /* 67 */ | ||
122 | {0x64, 0x44, 0x04, ALT_D, 0 }, /* 68 */ | ||
123 | {0x65, 0x45, 0x05, ALT_E, 0 }, /* 69 */ | ||
124 | {0x66, 0x46, 0x06, ALT_F, 0 }, /* 70 */ | ||
125 | {0x67, 0x47, 0x07, ALT_G, 0 }, /* 71 */ | ||
126 | {0x68, 0x48, 0x08, ALT_H, 0 }, /* 72 */ | ||
127 | {0x69, 0x49, 0x09, ALT_I, 0 }, /* 73 */ | ||
128 | {0x6A, 0x4A, 0x0A, ALT_J, 0 }, /* 74 */ | ||
129 | {0x6B, 0x4B, 0x0B, ALT_K, 0 }, /* 75 */ | ||
130 | {0x6C, 0x4C, 0x0C, ALT_L, 0 }, /* 76 */ | ||
131 | {0x6D, 0x4D, 0x0D, ALT_M, 0 }, /* 77 */ | ||
132 | {0x6E, 0x4E, 0x0E, ALT_N, 0 }, /* 78 */ | ||
133 | {0x6F, 0x4F, 0x0F, ALT_O, 0 }, /* 79 */ | ||
134 | {0x70, 0x50, 0x10, ALT_P, 0 }, /* 80 */ | ||
135 | {0x71, 0x51, 0x11, ALT_Q, 0 }, /* 81 */ | ||
136 | {0x72, 0x52, 0x12, ALT_R, 0 }, /* 82 */ | ||
137 | {0x73, 0x53, 0x13, ALT_S, 0 }, /* 83 */ | ||
138 | {0x74, 0x54, 0x14, ALT_T, 0 }, /* 84 */ | ||
139 | {0x75, 0x55, 0x15, ALT_U, 0 }, /* 85 */ | ||
140 | {0x76, 0x56, 0x16, ALT_V, 0 }, /* 86 */ | ||
141 | {0x77, 0x57, 0x17, ALT_W, 0 }, /* 87 */ | ||
142 | {0x78, 0x58, 0x18, ALT_X, 0 }, /* 88 */ | ||
143 | {0x79, 0x59, 0x19, ALT_Y, 0 }, /* 89 */ | ||
144 | {0x7A, 0x5A, 0x1A, ALT_Z, 0 }, /* 90 */ | ||
145 | {0, 0, 0, 0, 0 }, /* 91 VK_LWIN */ | ||
146 | {0, 0, 0, 0, 0 }, /* 92 VK_RWIN */ | ||
147 | {0, 0, 0, 0, 0 }, /* 93 VK_APPS */ | ||
148 | {0, 0, 0, 0, 0 }, /* 94 */ | ||
149 | {0, 0, 0, 0, 0 }, /* 95 */ | ||
150 | {0x30, 0, CTL_PAD0, ALT_PAD0, 0 }, /* 96 VK_NUMPAD0 */ | ||
151 | {0x31, 0, CTL_PAD1, ALT_PAD1, 0 }, /* 97 VK_NUMPAD1 */ | ||
152 | {0x32, 0, CTL_PAD2, ALT_PAD2, 0 }, /* 98 VK_NUMPAD2 */ | ||
153 | {0x33, 0, CTL_PAD3, ALT_PAD3, 0 }, /* 99 VK_NUMPAD3 */ | ||
154 | {0x34, 0, CTL_PAD4, ALT_PAD4, 0 }, /* 100 VK_NUMPAD4 */ | ||
155 | {0x35, 0, CTL_PAD5, ALT_PAD5, 0 }, /* 101 VK_NUMPAD5 */ | ||
156 | {0x36, 0, CTL_PAD6, ALT_PAD6, 0 }, /* 102 VK_NUMPAD6 */ | ||
157 | {0x37, 0, CTL_PAD7, ALT_PAD7, 0 }, /* 103 VK_NUMPAD7 */ | ||
158 | {0x38, 0, CTL_PAD8, ALT_PAD8, 0 }, /* 104 VK_NUMPAD8 */ | ||
159 | {0x39, 0, CTL_PAD9, ALT_PAD9, 0 }, /* 105 VK_NUMPAD9 */ | ||
160 | {PADSTAR, SHF_PADSTAR,CTL_PADSTAR, ALT_PADSTAR,999 }, /* 106 VK_MULTIPLY*/ | ||
161 | {PADPLUS, SHF_PADPLUS,CTL_PADPLUS, ALT_PADPLUS,999 }, /* 107 VK_ADD */ | ||
162 | {0, 0, 0, 0, 0 }, /* 108 VK_SEPARATOR */ | ||
163 | {PADMINUS, SHF_PADMINUS,CTL_PADMINUS,ALT_PADMINUS,999}, /* 109 VK_SUBTRACT*/ | ||
164 | {0x2E, 0, CTL_PADSTOP, ALT_PADSTOP,0 }, /* 110 VK_DECIMAL */ | ||
165 | {PADSLASH, SHF_PADSLASH,CTL_PADSLASH,ALT_PADSLASH,2 }, /* 111 VK_DIVIDE */ | ||
166 | {KEY_F(1), KEY_F(13), KEY_F(25), KEY_F(37), 0 }, /* 112 VK_F1 */ | ||
167 | {KEY_F(2), KEY_F(14), KEY_F(26), KEY_F(38), 0 }, /* 113 VK_F2 */ | ||
168 | {KEY_F(3), KEY_F(15), KEY_F(27), KEY_F(39), 0 }, /* 114 VK_F3 */ | ||
169 | {KEY_F(4), KEY_F(16), KEY_F(28), KEY_F(40), 0 }, /* 115 VK_F4 */ | ||
170 | {KEY_F(5), KEY_F(17), KEY_F(29), KEY_F(41), 0 }, /* 116 VK_F5 */ | ||
171 | {KEY_F(6), KEY_F(18), KEY_F(30), KEY_F(42), 0 }, /* 117 VK_F6 */ | ||
172 | {KEY_F(7), KEY_F(19), KEY_F(31), KEY_F(43), 0 }, /* 118 VK_F7 */ | ||
173 | {KEY_F(8), KEY_F(20), KEY_F(32), KEY_F(44), 0 }, /* 119 VK_F8 */ | ||
174 | {KEY_F(9), KEY_F(21), KEY_F(33), KEY_F(45), 0 }, /* 120 VK_F9 */ | ||
175 | {KEY_F(10), KEY_F(22), KEY_F(34), KEY_F(46), 0 }, /* 121 VK_F10 */ | ||
176 | {KEY_F(11), KEY_F(23), KEY_F(35), KEY_F(47), 0 }, /* 122 VK_F11 */ | ||
177 | {KEY_F(12), KEY_F(24), KEY_F(36), KEY_F(48), 0 }, /* 123 VK_F12 */ | ||
178 | |||
179 | /* 124 through 218 */ | ||
180 | |||
181 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
182 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
183 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
184 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
185 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
186 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
187 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
188 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
189 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
190 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
191 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
192 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
193 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
194 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
195 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
196 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
197 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
198 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
199 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
200 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
201 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
202 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
203 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
204 | {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, | ||
205 | |||
206 | {0x5B, 0x7B, 0x1B, ALT_LBRACKET,0 }, /* 219 */ | ||
207 | {0x5C, 0x7C, 0x1C, ALT_BSLASH, 0 }, /* 220 */ | ||
208 | {0x5D, 0x7D, 0x1D, ALT_RBRACKET,0 }, /* 221 */ | ||
209 | {0, 0, 0x27, ALT_FQUOTE, 0 }, /* 222 */ | ||
210 | {0, 0, 0, 0, 0 }, /* 223 */ | ||
211 | {0, 0, 0, 0, 0 }, /* 224 */ | ||
212 | {0, 0, 0, 0, 0 } /* 225 */ | ||
213 | }; | ||
214 | |||
215 | static KPTAB ext_kptab[] = | ||
216 | { | ||
217 | {0, 0, 0, 0, }, /* MUST BE EMPTY */ | ||
218 | {PADENTER, SHF_PADENTER, CTL_PADENTER, ALT_PADENTER}, /* 13 */ | ||
219 | {PADSLASH, SHF_PADSLASH, CTL_PADSLASH, ALT_PADSLASH}, /* 111 */ | ||
220 | {KEY_PPAGE, KEY_SPREVIOUS, CTL_PGUP, ALT_PGUP }, /* 33 */ | ||
221 | {KEY_NPAGE, KEY_SNEXT, CTL_PGDN, ALT_PGDN }, /* 34 */ | ||
222 | {KEY_END, KEY_SEND, CTL_END, ALT_END }, /* 35 */ | ||
223 | {KEY_HOME, KEY_SHOME, CTL_HOME, ALT_HOME }, /* 36 */ | ||
224 | {KEY_LEFT, KEY_SLEFT, CTL_LEFT, ALT_LEFT }, /* 37 */ | ||
225 | {KEY_UP, KEY_SUP, CTL_UP, ALT_UP }, /* 38 */ | ||
226 | {KEY_RIGHT, KEY_SRIGHT, CTL_RIGHT, ALT_RIGHT }, /* 39 */ | ||
227 | {KEY_DOWN, KEY_SDOWN, CTL_DOWN, ALT_DOWN }, /* 40 */ | ||
228 | {KEY_IC, KEY_SIC, CTL_INS, ALT_INS }, /* 45 */ | ||
229 | {KEY_DC, KEY_SDC, CTL_DEL, ALT_DEL }, /* 46 */ | ||
230 | {PADSLASH, SHF_PADSLASH, CTL_PADSLASH, ALT_PADSLASH}, /* 191 */ | ||
231 | }; | ||
232 | |||
233 | /* End of kptab[] */ | ||
234 | |||
235 | unsigned long PDC_get_input_fd(void) | ||
236 | { | ||
237 | PDC_LOG(("PDC_get_input_fd() - called\n")); | ||
238 | |||
239 | return 0L; | ||
240 | } | ||
241 | |||
242 | void PDC_set_keyboard_binary(bool on) | ||
243 | { | ||
244 | PDC_LOG(("PDC_set_keyboard_binary() - called\n")); | ||
245 | } | ||
246 | |||
247 | /* check if a key or mouse event is waiting */ | ||
248 | |||
249 | bool PDC_check_key(void) | ||
250 | { | ||
251 | if (key_count > 0) | ||
252 | return TRUE; | ||
253 | |||
254 | GetNumberOfConsoleInputEvents(pdc_con_in, &event_count); | ||
255 | |||
256 | return (event_count != 0); | ||
257 | } | ||
258 | |||
259 | /* _get_key_count returns 0 if save_ip doesn't contain an event which | ||
260 | should be passed back to the user. This function filters "useless" | ||
261 | events. | ||
262 | |||
263 | The function returns the number of keys waiting. This may be > 1 | ||
264 | if the repetition of real keys pressed so far are > 1. | ||
265 | |||
266 | Returns 0 on NUMLOCK, CAPSLOCK, SCROLLLOCK. | ||
267 | |||
268 | Returns 1 for SHIFT, ALT, CTRL only if no other key has been pressed | ||
269 | in between, and SP->return_key_modifiers is set; these are returned | ||
270 | on keyup. | ||
271 | |||
272 | Normal keys are returned on keydown only. The number of repetitions | ||
273 | are returned. Dead keys (diacritics) are omitted. See below for a | ||
274 | description. | ||
275 | */ | ||
276 | |||
277 | static int _get_key_count(void) | ||
278 | { | ||
279 | int num_keys = 0, vk; | ||
280 | |||
281 | PDC_LOG(("_get_key_count() - called\n")); | ||
282 | |||
283 | vk = KEV.wVirtualKeyCode; | ||
284 | |||
285 | if (KEV.bKeyDown) | ||
286 | { | ||
287 | /* key down */ | ||
288 | |||
289 | save_press = 0; | ||
290 | |||
291 | if (vk == VK_CAPITAL || vk == VK_NUMLOCK || vk == VK_SCROLL) | ||
292 | { | ||
293 | /* throw away these modifiers */ | ||
294 | } | ||
295 | else if (vk == VK_SHIFT || vk == VK_CONTROL || vk == VK_MENU) | ||
296 | { | ||
297 | /* These keys are returned on keyup only. */ | ||
298 | |||
299 | save_press = vk; | ||
300 | switch (vk) | ||
301 | { | ||
302 | case VK_SHIFT: | ||
303 | left_key = GetKeyState(VK_LSHIFT); | ||
304 | break; | ||
305 | case VK_CONTROL: | ||
306 | left_key = GetKeyState(VK_LCONTROL); | ||
307 | break; | ||
308 | case VK_MENU: | ||
309 | left_key = GetKeyState(VK_LMENU); | ||
310 | } | ||
311 | } | ||
312 | else | ||
313 | { | ||
314 | /* Check for diacritics. These are dead keys. Some locales | ||
315 | have modified characters like umlaut-a, which is an "a" | ||
316 | with two dots on it. In some locales you have to press a | ||
317 | special key (the dead key) immediately followed by the | ||
318 | "a" to get a composed umlaut-a. The special key may have | ||
319 | a normal meaning with different modifiers. */ | ||
320 | |||
321 | if (KEV.uChar.UnicodeChar || !(MapVirtualKey(vk, 2) & 0x80000000)) | ||
322 | num_keys = KEV.wRepeatCount; | ||
323 | } | ||
324 | } | ||
325 | else | ||
326 | { | ||
327 | /* key up */ | ||
328 | |||
329 | /* Only modifier keys or the results of ALT-numpad entry are | ||
330 | returned on keyup */ | ||
331 | |||
332 | if ((vk == VK_MENU && KEV.uChar.UnicodeChar) || | ||
333 | ((vk == VK_SHIFT || vk == VK_CONTROL || vk == VK_MENU) && | ||
334 | vk == save_press)) | ||
335 | { | ||
336 | save_press = 0; | ||
337 | num_keys = 1; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | PDC_LOG(("_get_key_count() - returning: num_keys %d\n", num_keys)); | ||
342 | |||
343 | return num_keys; | ||
344 | } | ||
345 | |||
346 | /* _process_key_event returns -1 if the key in save_ip should be | ||
347 | ignored. Otherwise it returns the keycode which should be returned | ||
348 | by PDC_get_key(). save_ip must be a key event. | ||
349 | |||
350 | CTRL-ALT support has been disabled, when is it emitted plainly? */ | ||
351 | |||
352 | static int _process_key_event(void) | ||
353 | { | ||
354 | int key = (unsigned short)KEV.uChar.UnicodeChar; | ||
355 | WORD vk = KEV.wVirtualKeyCode; | ||
356 | DWORD state = KEV.dwControlKeyState; | ||
357 | |||
358 | int idx; | ||
359 | BOOL enhanced; | ||
360 | |||
361 | SP->key_code = TRUE; | ||
362 | |||
363 | /* Save the key modifiers if required. Do this first to allow to | ||
364 | detect e.g. a pressed CTRL key after a hit of NUMLOCK. */ | ||
365 | |||
366 | if (SP->save_key_modifiers) | ||
367 | { | ||
368 | if (state & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) | ||
369 | pdc_key_modifiers |= PDC_KEY_MODIFIER_ALT; | ||
370 | |||
371 | if (state & SHIFT_PRESSED) | ||
372 | pdc_key_modifiers |= PDC_KEY_MODIFIER_SHIFT; | ||
373 | |||
374 | if (state & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) | ||
375 | pdc_key_modifiers |= PDC_KEY_MODIFIER_CONTROL; | ||
376 | |||
377 | if (state & NUMLOCK_ON) | ||
378 | pdc_key_modifiers |= PDC_KEY_MODIFIER_NUMLOCK; | ||
379 | } | ||
380 | |||
381 | /* Handle modifier keys hit by themselves */ | ||
382 | |||
383 | switch (vk) | ||
384 | { | ||
385 | case VK_SHIFT: /* shift */ | ||
386 | if (!SP->return_key_modifiers) | ||
387 | return -1; | ||
388 | |||
389 | return (left_key & 0x8000) ? KEY_SHIFT_L : KEY_SHIFT_R; | ||
390 | |||
391 | case VK_CONTROL: /* control */ | ||
392 | if (!SP->return_key_modifiers) | ||
393 | return -1; | ||
394 | |||
395 | return (left_key & 0x8000) ? KEY_CONTROL_L : KEY_CONTROL_R; | ||
396 | |||
397 | case VK_MENU: /* alt */ | ||
398 | if (!key) | ||
399 | { | ||
400 | if (!SP->return_key_modifiers) | ||
401 | return -1; | ||
402 | |||
403 | return (left_key & 0x8000) ? KEY_ALT_L : KEY_ALT_R; | ||
404 | } | ||
405 | } | ||
406 | |||
407 | /* The system may emit Ascii or Unicode characters depending on | ||
408 | whether ReadConsoleInputA or ReadConsoleInputW is used. | ||
409 | |||
410 | Normally, if key != 0 then the system did the translation | ||
411 | successfully. But this is not true for LEFT_ALT (different to | ||
412 | RIGHT_ALT). In case of LEFT_ALT we can get key != 0. So | ||
413 | check for this first. */ | ||
414 | |||
415 | if (key && ( !(state & LEFT_ALT_PRESSED) || | ||
416 | (state & RIGHT_ALT_PRESSED) )) | ||
417 | { | ||
418 | /* This code should catch all keys returning a printable | ||
419 | character. Characters above 0x7F should be returned as | ||
420 | positive codes. But if'ndef NUMKEYPAD we have to return | ||
421 | extended keycodes for keypad codes. */ | ||
422 | |||
423 | #ifndef NUMKEYPAD | ||
424 | if (kptab[vk].extended == 0) | ||
425 | #endif | ||
426 | { | ||
427 | SP->key_code = FALSE; | ||
428 | return key; | ||
429 | } | ||
430 | } | ||
431 | |||
432 | /* This case happens if a functional key has been entered. */ | ||
433 | |||
434 | if ((state & ENHANCED_KEY) && (kptab[vk].extended != 999)) | ||
435 | { | ||
436 | enhanced = TRUE; | ||
437 | idx = kptab[vk].extended; | ||
438 | } | ||
439 | else | ||
440 | { | ||
441 | enhanced = FALSE; | ||
442 | idx = vk; | ||
443 | } | ||
444 | |||
445 | if (state & SHIFT_PRESSED) | ||
446 | key = enhanced ? ext_kptab[idx].shift : kptab[idx].shift; | ||
447 | |||
448 | else if (state & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) | ||
449 | key = enhanced ? ext_kptab[idx].control : kptab[idx].control; | ||
450 | |||
451 | else if (state & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) | ||
452 | key = enhanced ? ext_kptab[idx].alt : kptab[idx].alt; | ||
453 | |||
454 | else | ||
455 | key = enhanced ? ext_kptab[idx].normal : kptab[idx].normal; | ||
456 | |||
457 | if (key < KEY_CODE_YES) | ||
458 | SP->key_code = FALSE; | ||
459 | |||
460 | return key; | ||
461 | } | ||
462 | |||
463 | static int _process_mouse_event(void) | ||
464 | { | ||
465 | static const DWORD button_mask[] = {1, 4, 2}; | ||
466 | short action, shift_flags = 0; | ||
467 | int i; | ||
468 | |||
469 | save_press = 0; | ||
470 | SP->key_code = TRUE; | ||
471 | |||
472 | memset(&pdc_mouse_status, 0, sizeof(MOUSE_STATUS)); | ||
473 | |||
474 | /* Handle scroll wheel */ | ||
475 | |||
476 | if (MEV.dwEventFlags == 4) | ||
477 | { | ||
478 | pdc_mouse_status.changes = (MEV.dwButtonState & 0xFF000000) ? | ||
479 | PDC_MOUSE_WHEEL_DOWN : PDC_MOUSE_WHEEL_UP; | ||
480 | |||
481 | pdc_mouse_status.x = -1; | ||
482 | pdc_mouse_status.y = -1; | ||
483 | |||
484 | memset(&old_mouse_status, 0, sizeof(old_mouse_status)); | ||
485 | |||
486 | return KEY_MOUSE; | ||
487 | } | ||
488 | |||
489 | action = (MEV.dwEventFlags == 2) ? BUTTON_DOUBLE_CLICKED : | ||
490 | ((MEV.dwEventFlags == 1) ? BUTTON_MOVED : BUTTON_PRESSED); | ||
491 | |||
492 | for (i = 0; i < 3; i++) | ||
493 | pdc_mouse_status.button[i] = | ||
494 | (MEV.dwButtonState & button_mask[i]) ? action : 0; | ||
495 | |||
496 | if (action == BUTTON_PRESSED && MEV.dwButtonState & 7 && SP->mouse_wait) | ||
497 | { | ||
498 | /* Check for a click -- a PRESS followed immediately by a release */ | ||
499 | |||
500 | if (!event_count) | ||
501 | { | ||
502 | napms(SP->mouse_wait); | ||
503 | |||
504 | GetNumberOfConsoleInputEvents(pdc_con_in, &event_count); | ||
505 | } | ||
506 | |||
507 | if (event_count) | ||
508 | { | ||
509 | INPUT_RECORD ip; | ||
510 | DWORD count; | ||
511 | bool have_click = FALSE; | ||
512 | |||
513 | PeekConsoleInput(pdc_con_in, &ip, 1, &count); | ||
514 | |||
515 | for (i = 0; i < 3; i++) | ||
516 | { | ||
517 | if (pdc_mouse_status.button[i] == BUTTON_PRESSED && | ||
518 | !(ip.Event.MouseEvent.dwButtonState & button_mask[i])) | ||
519 | { | ||
520 | pdc_mouse_status.button[i] = BUTTON_CLICKED; | ||
521 | have_click = TRUE; | ||
522 | } | ||
523 | } | ||
524 | |||
525 | /* If a click was found, throw out the event */ | ||
526 | |||
527 | if (have_click) | ||
528 | ReadConsoleInput(pdc_con_in, &ip, 1, &count); | ||
529 | } | ||
530 | } | ||
531 | |||
532 | pdc_mouse_status.x = MEV.dwMousePosition.X; | ||
533 | pdc_mouse_status.y = MEV.dwMousePosition.Y; | ||
534 | |||
535 | pdc_mouse_status.changes = 0; | ||
536 | |||
537 | for (i = 0; i < 3; i++) | ||
538 | { | ||
539 | if (old_mouse_status.button[i] != pdc_mouse_status.button[i]) | ||
540 | pdc_mouse_status.changes |= (1 << i); | ||
541 | |||
542 | if (pdc_mouse_status.button[i] == BUTTON_MOVED) | ||
543 | { | ||
544 | /* Discard non-moved "moves" */ | ||
545 | |||
546 | if (pdc_mouse_status.x == old_mouse_status.x && | ||
547 | pdc_mouse_status.y == old_mouse_status.y) | ||
548 | return -1; | ||
549 | |||
550 | /* Motion events always flag the button as changed */ | ||
551 | |||
552 | pdc_mouse_status.changes |= (1 << i); | ||
553 | pdc_mouse_status.changes |= PDC_MOUSE_MOVED; | ||
554 | break; | ||
555 | } | ||
556 | } | ||
557 | |||
558 | old_mouse_status = pdc_mouse_status; | ||
559 | |||
560 | /* Treat click events as release events for comparison purposes */ | ||
561 | |||
562 | for (i = 0; i < 3; i++) | ||
563 | { | ||
564 | if (old_mouse_status.button[i] == BUTTON_CLICKED || | ||
565 | old_mouse_status.button[i] == BUTTON_DOUBLE_CLICKED) | ||
566 | old_mouse_status.button[i] = BUTTON_RELEASED; | ||
567 | } | ||
568 | |||
569 | /* Check for SHIFT/CONTROL/ALT */ | ||
570 | |||
571 | if (MEV.dwControlKeyState & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) | ||
572 | shift_flags |= BUTTON_ALT; | ||
573 | |||
574 | if (MEV.dwControlKeyState & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) | ||
575 | shift_flags |= BUTTON_CONTROL; | ||
576 | |||
577 | if (MEV.dwControlKeyState & SHIFT_PRESSED) | ||
578 | shift_flags |= BUTTON_SHIFT; | ||
579 | |||
580 | if (shift_flags) | ||
581 | { | ||
582 | for (i = 0; i < 3; i++) | ||
583 | { | ||
584 | if (pdc_mouse_status.changes & (1 << i)) | ||
585 | pdc_mouse_status.button[i] |= shift_flags; | ||
586 | } | ||
587 | } | ||
588 | |||
589 | return KEY_MOUSE; | ||
590 | } | ||
591 | |||
592 | /* return the next available key or mouse event */ | ||
593 | |||
594 | int PDC_get_key(void) | ||
595 | { | ||
596 | pdc_key_modifiers = 0L; | ||
597 | |||
598 | if (!key_count) | ||
599 | { | ||
600 | DWORD count; | ||
601 | |||
602 | ReadConsoleInput(pdc_con_in, &save_ip, 1, &count); | ||
603 | event_count--; | ||
604 | |||
605 | if (save_ip.EventType == MOUSE_EVENT) | ||
606 | key_count = 1; | ||
607 | else if (save_ip.EventType == KEY_EVENT) | ||
608 | key_count = _get_key_count(); | ||
609 | } | ||
610 | |||
611 | if (key_count) | ||
612 | { | ||
613 | key_count--; | ||
614 | |||
615 | switch (save_ip.EventType) | ||
616 | { | ||
617 | case KEY_EVENT: | ||
618 | return _process_key_event(); | ||
619 | |||
620 | case MOUSE_EVENT: | ||
621 | return _process_mouse_event(); | ||
622 | } | ||
623 | } | ||
624 | |||
625 | return -1; | ||
626 | } | ||
627 | |||
628 | /* discard any pending keyboard or mouse input -- this is the core | ||
629 | routine for flushinp() */ | ||
630 | |||
631 | void PDC_flushinp(void) | ||
632 | { | ||
633 | PDC_LOG(("PDC_flushinp() - called\n")); | ||
634 | |||
635 | FlushConsoleInputBuffer(pdc_con_in); | ||
636 | } | ||
637 | |||
638 | int PDC_mouse_set(void) | ||
639 | { | ||
640 | /* If turning on mouse input: Set ENABLE_MOUSE_INPUT, and clear | ||
641 | all other flags, including the extended flags; | ||
642 | If turning off the mouse: Set QuickEdit Mode to the status it | ||
643 | had on startup, and clear all other flags */ | ||
644 | |||
645 | SetConsoleMode(pdc_con_in, SP->_trap_mbe ? | ||
646 | (ENABLE_MOUSE_INPUT|0x0080) : (pdc_quick_edit|0x0080)); | ||
647 | |||
648 | memset(&old_mouse_status, 0, sizeof(old_mouse_status)); | ||
649 | |||
650 | return OK; | ||
651 | } | ||
652 | |||
653 | int PDC_modifiers_set(void) | ||
654 | { | ||
655 | return OK; | ||
656 | } |
File win32/pdcscrn.c added (mode: 100644) (index 00000000..b48ddaaf) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcscrn.c,v 1.92 2008/07/20 20:12:04 wmcbrine Exp $") | ||
6 | |||
7 | #ifdef CHTYPE_LONG | ||
8 | # define PDC_OFFSET 32 | ||
9 | #else | ||
10 | # define PDC_OFFSET 8 | ||
11 | #endif | ||
12 | |||
13 | /* COLOR_PAIR to attribute encoding table. */ | ||
14 | |||
15 | unsigned char *pdc_atrtab = (unsigned char *)NULL; | ||
16 | |||
17 | HANDLE pdc_con_out = INVALID_HANDLE_VALUE; | ||
18 | HANDLE pdc_con_in = INVALID_HANDLE_VALUE; | ||
19 | |||
20 | DWORD pdc_quick_edit; | ||
21 | |||
22 | static short curstoreal[16], realtocurs[16] = | ||
23 | { | ||
24 | COLOR_BLACK, COLOR_BLUE, COLOR_GREEN, COLOR_CYAN, COLOR_RED, | ||
25 | COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE, COLOR_BLACK + 8, | ||
26 | COLOR_BLUE + 8, COLOR_GREEN + 8, COLOR_CYAN + 8, COLOR_RED + 8, | ||
27 | COLOR_MAGENTA + 8, COLOR_YELLOW + 8, COLOR_WHITE + 8 | ||
28 | }; | ||
29 | |||
30 | enum { PDC_RESTORE_NONE, PDC_RESTORE_BUFFER, PDC_RESTORE_WINDOW }; | ||
31 | |||
32 | /* Struct for storing console registry keys, and for use with the | ||
33 | undocumented WM_SETCONSOLEINFO message. Originally by James Brown, | ||
34 | www.catch22.net. */ | ||
35 | |||
36 | static struct | ||
37 | { | ||
38 | ULONG Length; | ||
39 | COORD ScreenBufferSize; | ||
40 | COORD WindowSize; | ||
41 | ULONG WindowPosX; | ||
42 | ULONG WindowPosY; | ||
43 | |||
44 | COORD FontSize; | ||
45 | ULONG FontFamily; | ||
46 | ULONG FontWeight; | ||
47 | WCHAR FaceName[32]; | ||
48 | |||
49 | ULONG CursorSize; | ||
50 | ULONG FullScreen; | ||
51 | ULONG QuickEdit; | ||
52 | ULONG AutoPosition; | ||
53 | ULONG InsertMode; | ||
54 | |||
55 | USHORT ScreenColors; | ||
56 | USHORT PopupColors; | ||
57 | ULONG HistoryNoDup; | ||
58 | ULONG HistoryBufferSize; | ||
59 | ULONG NumberOfHistoryBuffers; | ||
60 | |||
61 | COLORREF ColorTable[16]; | ||
62 | |||
63 | ULONG CodePage; | ||
64 | HWND Hwnd; | ||
65 | |||
66 | WCHAR ConsoleTitle[0x100]; | ||
67 | } console_info; | ||
68 | |||
69 | static CONSOLE_SCREEN_BUFFER_INFO orig_scr; | ||
70 | |||
71 | static CHAR_INFO *ci_save = NULL; | ||
72 | static DWORD old_console_mode = 0; | ||
73 | |||
74 | static bool is_nt; | ||
75 | |||
76 | static HWND _find_console_handle(void) | ||
77 | { | ||
78 | TCHAR orgtitle[1024], temptitle[1024]; | ||
79 | HWND wnd; | ||
80 | |||
81 | GetConsoleTitle(orgtitle, 1024); | ||
82 | |||
83 | wsprintf(temptitle, TEXT("%d/%d"), GetTickCount(), GetCurrentProcessId()); | ||
84 | SetConsoleTitle(temptitle); | ||
85 | |||
86 | Sleep(40); | ||
87 | |||
88 | wnd = FindWindow(NULL, temptitle); | ||
89 | |||
90 | SetConsoleTitle(orgtitle); | ||
91 | |||
92 | return wnd; | ||
93 | } | ||
94 | |||
95 | /* Undocumented console message */ | ||
96 | |||
97 | #define WM_SETCONSOLEINFO (WM_USER + 201) | ||
98 | |||
99 | /* Wrapper around WM_SETCONSOLEINFO. We need to create the necessary | ||
100 | section (file-mapping) object in the context of the process which | ||
101 | owns the console, before posting the message. Originally by JB. */ | ||
102 | |||
103 | static void _set_console_info(void) | ||
104 | { | ||
105 | CONSOLE_SCREEN_BUFFER_INFO csbi; | ||
106 | CONSOLE_CURSOR_INFO cci; | ||
107 | DWORD dwConsoleOwnerPid; | ||
108 | HANDLE hProcess; | ||
109 | HANDLE hSection, hDupSection; | ||
110 | PVOID ptrView; | ||
111 | |||
112 | /* Each-time initialization for console_info */ | ||
113 | |||
114 | GetConsoleCursorInfo(pdc_con_out, &cci); | ||
115 | console_info.CursorSize = cci.dwSize; | ||
116 | |||
117 | GetConsoleScreenBufferInfo(pdc_con_out, &csbi); | ||
118 | console_info.ScreenBufferSize = csbi.dwSize; | ||
119 | |||
120 | console_info.WindowSize.X = csbi.srWindow.Right - csbi.srWindow.Left + 1; | ||
121 | console_info.WindowSize.Y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; | ||
122 | |||
123 | console_info.WindowPosX = csbi.srWindow.Left; | ||
124 | console_info.WindowPosY = csbi.srWindow.Top; | ||
125 | |||
126 | /* Open the process which "owns" the console */ | ||
127 | |||
128 | GetWindowThreadProcessId(console_info.Hwnd, &dwConsoleOwnerPid); | ||
129 | |||
130 | hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwConsoleOwnerPid); | ||
131 | |||
132 | /* Create a SECTION object backed by page-file, then map a view of | ||
133 | this section into the owner process so we can write the contents | ||
134 | of the CONSOLE_INFO buffer into it */ | ||
135 | |||
136 | hSection = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, | ||
137 | 0, sizeof(console_info), 0); | ||
138 | |||
139 | /* Copy our console structure into the section-object */ | ||
140 | |||
141 | ptrView = MapViewOfFile(hSection, FILE_MAP_WRITE|FILE_MAP_READ, | ||
142 | 0, 0, sizeof(console_info)); | ||
143 | |||
144 | memcpy(ptrView, &console_info, sizeof(console_info)); | ||
145 | |||
146 | UnmapViewOfFile(ptrView); | ||
147 | |||
148 | /* Map the memory into owner process */ | ||
149 | |||
150 | DuplicateHandle(GetCurrentProcess(), hSection, hProcess, &hDupSection, | ||
151 | 0, FALSE, DUPLICATE_SAME_ACCESS); | ||
152 | |||
153 | /* Send console window the "update" message */ | ||
154 | |||
155 | SendMessage(console_info.Hwnd, WM_SETCONSOLEINFO, (WPARAM)hDupSection, 0); | ||
156 | |||
157 | CloseHandle(hSection); | ||
158 | CloseHandle(hProcess); | ||
159 | } | ||
160 | |||
161 | /* One-time initialization for console_info -- color table and font info | ||
162 | from the registry; other values from functions. */ | ||
163 | |||
164 | static void _init_console_info(void) | ||
165 | { | ||
166 | DWORD scrnmode, len; | ||
167 | HKEY reghnd; | ||
168 | int i; | ||
169 | |||
170 | console_info.Hwnd = _find_console_handle(); | ||
171 | console_info.Length = sizeof(console_info); | ||
172 | |||
173 | GetConsoleMode(pdc_con_in, &scrnmode); | ||
174 | console_info.QuickEdit = !!(scrnmode & 0x0040); | ||
175 | console_info.InsertMode = !!(scrnmode & 0x0020); | ||
176 | |||
177 | console_info.FullScreen = FALSE; | ||
178 | console_info.AutoPosition = 0x10000; | ||
179 | console_info.ScreenColors = SP->orig_back << 4 | SP->orig_fore; | ||
180 | console_info.PopupColors = 0xf5; | ||
181 | |||
182 | console_info.HistoryNoDup = FALSE; | ||
183 | console_info.HistoryBufferSize = 50; | ||
184 | console_info.NumberOfHistoryBuffers = 4; | ||
185 | |||
186 | console_info.CodePage = GetConsoleOutputCP(); | ||
187 | |||
188 | RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Console"), 0, | ||
189 | KEY_QUERY_VALUE, ®hnd); | ||
190 | |||
191 | len = sizeof(DWORD); | ||
192 | |||
193 | /* Default color table */ | ||
194 | |||
195 | for (i = 0; i < 16; i++) | ||
196 | { | ||
197 | char tname[13]; | ||
198 | |||
199 | sprintf(tname, "ColorTable%02d", i); | ||
200 | RegQueryValueExA(reghnd, tname, NULL, NULL, | ||
201 | (LPBYTE)(&(console_info.ColorTable[i])), &len); | ||
202 | } | ||
203 | |||
204 | /* Font info */ | ||
205 | |||
206 | RegQueryValueEx(reghnd, TEXT("FontSize"), NULL, NULL, | ||
207 | (LPBYTE)(&console_info.FontSize), &len); | ||
208 | RegQueryValueEx(reghnd, TEXT("FontFamily"), NULL, NULL, | ||
209 | (LPBYTE)(&console_info.FontFamily), &len); | ||
210 | RegQueryValueEx(reghnd, TEXT("FontWeight"), NULL, NULL, | ||
211 | (LPBYTE)(&console_info.FontWeight), &len); | ||
212 | |||
213 | len = sizeof(WCHAR) * 32; | ||
214 | RegQueryValueExW(reghnd, L"FaceName", NULL, NULL, | ||
215 | (LPBYTE)(console_info.FaceName), &len); | ||
216 | |||
217 | RegCloseKey(reghnd); | ||
218 | } | ||
219 | |||
220 | /* close the physical screen -- may restore the screen to its state | ||
221 | before PDC_scr_open(); miscellaneous cleanup */ | ||
222 | |||
223 | void PDC_scr_close(void) | ||
224 | { | ||
225 | COORD origin; | ||
226 | SMALL_RECT rect; | ||
227 | |||
228 | PDC_LOG(("PDC_scr_close() - called\n")); | ||
229 | |||
230 | PDC_reset_shell_mode(); | ||
231 | |||
232 | if (SP->_restore != PDC_RESTORE_NONE) | ||
233 | { | ||
234 | if (SP->_restore == PDC_RESTORE_WINDOW) | ||
235 | { | ||
236 | rect.Top = orig_scr.srWindow.Top; | ||
237 | rect.Left = orig_scr.srWindow.Left; | ||
238 | rect.Bottom = orig_scr.srWindow.Bottom; | ||
239 | rect.Right = orig_scr.srWindow.Right; | ||
240 | } | ||
241 | else /* PDC_RESTORE_BUFFER */ | ||
242 | { | ||
243 | rect.Top = rect.Left = 0; | ||
244 | rect.Bottom = orig_scr.dwSize.Y - 1; | ||
245 | rect.Right = orig_scr.dwSize.X - 1; | ||
246 | } | ||
247 | |||
248 | origin.X = origin.Y = 0; | ||
249 | |||
250 | if (!WriteConsoleOutput(pdc_con_out, ci_save, orig_scr.dwSize, | ||
251 | origin, &rect)) | ||
252 | return; | ||
253 | } | ||
254 | |||
255 | if (SP->visibility != 1) | ||
256 | curs_set(1); | ||
257 | |||
258 | /* Position cursor to the bottom left of the screen. */ | ||
259 | |||
260 | PDC_gotoyx(PDC_get_buffer_rows() - 2, 0); | ||
261 | } | ||
262 | |||
263 | void PDC_scr_free(void) | ||
264 | { | ||
265 | if (SP) | ||
266 | free(SP); | ||
267 | if (pdc_atrtab) | ||
268 | free(pdc_atrtab); | ||
269 | |||
270 | pdc_atrtab = (unsigned char *)NULL; | ||
271 | } | ||
272 | |||
273 | /* open the physical screen -- allocate SP, miscellaneous intialization, | ||
274 | and may save the existing screen for later restoration */ | ||
275 | |||
276 | int PDC_scr_open(int argc, char **argv) | ||
277 | { | ||
278 | COORD bufsize, origin; | ||
279 | SMALL_RECT rect; | ||
280 | const char *str; | ||
281 | CONSOLE_SCREEN_BUFFER_INFO csbi; | ||
282 | int i; | ||
283 | |||
284 | PDC_LOG(("PDC_scr_open() - called\n")); | ||
285 | |||
286 | SP = calloc(1, sizeof(SCREEN)); | ||
287 | pdc_atrtab = calloc(PDC_COLOR_PAIRS * PDC_OFFSET, 1); | ||
288 | |||
289 | if (!SP || !pdc_atrtab) | ||
290 | return ERR; | ||
291 | |||
292 | for (i = 0; i < 16; i++) | ||
293 | curstoreal[realtocurs[i]] = i; | ||
294 | |||
295 | pdc_con_out = GetStdHandle(STD_OUTPUT_HANDLE); | ||
296 | pdc_con_in = GetStdHandle(STD_INPUT_HANDLE); | ||
297 | |||
298 | if (GetFileType(pdc_con_in) != FILE_TYPE_CHAR) | ||
299 | { | ||
300 | fprintf(stderr, "\nRedirection is not supported.\n"); | ||
301 | exit(1); | ||
302 | } | ||
303 | |||
304 | is_nt = !(GetVersion() & 0x80000000); | ||
305 | |||
306 | GetConsoleScreenBufferInfo(pdc_con_out, &csbi); | ||
307 | GetConsoleScreenBufferInfo(pdc_con_out, &orig_scr); | ||
308 | GetConsoleMode(pdc_con_in, &old_console_mode); | ||
309 | |||
310 | /* preserve QuickEdit Mode setting for use in PDC_mouse_set() when | ||
311 | the mouse is not enabled -- other console input settings are | ||
312 | cleared */ | ||
313 | |||
314 | pdc_quick_edit = old_console_mode & 0x0040; | ||
315 | |||
316 | SP->lines = (str = getenv("LINES")) ? atoi(str) : PDC_get_rows(); | ||
317 | SP->cols = (str = getenv("COLS")) ? atoi(str) : PDC_get_columns(); | ||
318 | |||
319 | SP->mouse_wait = PDC_CLICK_PERIOD; | ||
320 | SP->audible = TRUE; | ||
321 | |||
322 | if (SP->lines < 2 || SP->lines > csbi.dwMaximumWindowSize.Y) | ||
323 | { | ||
324 | fprintf(stderr, "LINES value must be >= 2 and <= %d: got %d\n", | ||
325 | csbi.dwMaximumWindowSize.Y, SP->lines); | ||
326 | |||
327 | return ERR; | ||
328 | } | ||
329 | |||
330 | if (SP->cols < 2 || SP->cols > csbi.dwMaximumWindowSize.X) | ||
331 | { | ||
332 | fprintf(stderr, "COLS value must be >= 2 and <= %d: got %d\n", | ||
333 | csbi.dwMaximumWindowSize.X, SP->cols); | ||
334 | |||
335 | return ERR; | ||
336 | } | ||
337 | |||
338 | SP->orig_fore = csbi.wAttributes & 0x0f; | ||
339 | SP->orig_back = (csbi.wAttributes & 0xf0) >> 4; | ||
340 | |||
341 | SP->orig_attr = TRUE; | ||
342 | |||
343 | SP->_restore = PDC_RESTORE_NONE; | ||
344 | |||
345 | if (getenv("PDC_RESTORE_SCREEN")) | ||
346 | { | ||
347 | /* Attempt to save the complete console buffer */ | ||
348 | |||
349 | ci_save = malloc(orig_scr.dwSize.X * orig_scr.dwSize.Y * | ||
350 | sizeof(CHAR_INFO)); | ||
351 | |||
352 | if (!ci_save) | ||
353 | { | ||
354 | PDC_LOG(("PDC_scr_open() - malloc failure (1)\n")); | ||
355 | |||
356 | return ERR; | ||
357 | } | ||
358 | |||
359 | bufsize.X = orig_scr.dwSize.X; | ||
360 | bufsize.Y = orig_scr.dwSize.Y; | ||
361 | |||
362 | origin.X = origin.Y = 0; | ||
363 | |||
364 | rect.Top = rect.Left = 0; | ||
365 | rect.Bottom = orig_scr.dwSize.Y - 1; | ||
366 | rect.Right = orig_scr.dwSize.X - 1; | ||
367 | |||
368 | if (!ReadConsoleOutput(pdc_con_out, ci_save, bufsize, origin, &rect)) | ||
369 | { | ||
370 | /* We can't save the complete buffer, so try and save just | ||
371 | the displayed window */ | ||
372 | |||
373 | free(ci_save); | ||
374 | ci_save = NULL; | ||
375 | |||
376 | bufsize.X = orig_scr.srWindow.Right - orig_scr.srWindow.Left + 1; | ||
377 | bufsize.Y = orig_scr.srWindow.Bottom - orig_scr.srWindow.Top + 1; | ||
378 | |||
379 | ci_save = malloc(bufsize.X * bufsize.Y * sizeof(CHAR_INFO)); | ||
380 | |||
381 | if (!ci_save) | ||
382 | { | ||
383 | PDC_LOG(("PDC_scr_open() - malloc failure (2)\n")); | ||
384 | |||
385 | return ERR; | ||
386 | } | ||
387 | |||
388 | origin.X = origin.Y = 0; | ||
389 | |||
390 | rect.Top = orig_scr.srWindow.Top; | ||
391 | rect.Left = orig_scr.srWindow.Left; | ||
392 | rect.Bottom = orig_scr.srWindow.Bottom; | ||
393 | rect.Right = orig_scr.srWindow.Right; | ||
394 | |||
395 | if (!ReadConsoleOutput(pdc_con_out, ci_save, bufsize, | ||
396 | origin, &rect)) | ||
397 | { | ||
398 | #ifdef PDCDEBUG | ||
399 | CHAR LastError[256]; | ||
400 | |||
401 | FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, | ||
402 | GetLastError(), MAKELANGID(LANG_NEUTRAL, | ||
403 | SUBLANG_DEFAULT), LastError, 256, NULL); | ||
404 | |||
405 | PDC_LOG(("PDC_scr_open() - %s\n", LastError)); | ||
406 | #endif | ||
407 | free(ci_save); | ||
408 | ci_save = NULL; | ||
409 | |||
410 | return ERR; | ||
411 | } | ||
412 | |||
413 | SP->_restore = PDC_RESTORE_WINDOW; | ||
414 | } | ||
415 | else | ||
416 | SP->_restore = PDC_RESTORE_BUFFER; | ||
417 | } | ||
418 | |||
419 | SP->_preserve = (getenv("PDC_PRESERVE_SCREEN") != NULL); | ||
420 | |||
421 | PDC_reset_prog_mode(); | ||
422 | |||
423 | SP->mono = FALSE; | ||
424 | |||
425 | return OK; | ||
426 | } | ||
427 | |||
428 | /* Calls SetConsoleWindowInfo with the given parameters, but fits them | ||
429 | if a scoll bar shrinks the maximum possible value. The rectangle | ||
430 | must at least fit in a half-sized window. */ | ||
431 | |||
432 | static BOOL _fit_console_window(HANDLE con_out, CONST SMALL_RECT *rect) | ||
433 | { | ||
434 | SMALL_RECT run; | ||
435 | SHORT mx, my; | ||
436 | |||
437 | if (SetConsoleWindowInfo(con_out, TRUE, rect)) | ||
438 | return TRUE; | ||
439 | |||
440 | run = *rect; | ||
441 | run.Right /= 2; | ||
442 | run.Bottom /= 2; | ||
443 | |||
444 | mx = run.Right; | ||
445 | my = run.Bottom; | ||
446 | |||
447 | if (!SetConsoleWindowInfo(con_out, TRUE, &run)) | ||
448 | return FALSE; | ||
449 | |||
450 | for (run.Right = rect->Right; run.Right >= mx; run.Right--) | ||
451 | if (SetConsoleWindowInfo(con_out, TRUE, &run)) | ||
452 | break; | ||
453 | |||
454 | if (run.Right < mx) | ||
455 | return FALSE; | ||
456 | |||
457 | for (run.Bottom = rect->Bottom; run.Bottom >= my; run.Bottom--) | ||
458 | if (SetConsoleWindowInfo(con_out, TRUE, &run)) | ||
459 | return TRUE; | ||
460 | |||
461 | return FALSE; | ||
462 | } | ||
463 | |||
464 | /* the core of resize_term() */ | ||
465 | |||
466 | int PDC_resize_screen(int nlines, int ncols) | ||
467 | { | ||
468 | SMALL_RECT rect; | ||
469 | COORD size, max; | ||
470 | |||
471 | if (nlines < 2 || ncols < 2) | ||
472 | return ERR; | ||
473 | |||
474 | max = GetLargestConsoleWindowSize(pdc_con_out); | ||
475 | |||
476 | rect.Left = rect.Top = 0; | ||
477 | rect.Right = ncols - 1; | ||
478 | |||
479 | if (rect.Right > max.X) | ||
480 | rect.Right = max.X; | ||
481 | |||
482 | rect.Bottom = nlines - 1; | ||
483 | |||
484 | if (rect.Bottom > max.Y) | ||
485 | rect.Bottom = max.Y; | ||
486 | |||
487 | size.X = rect.Right + 1; | ||
488 | size.Y = rect.Bottom + 1; | ||
489 | |||
490 | _fit_console_window(pdc_con_out, &rect); | ||
491 | SetConsoleScreenBufferSize(pdc_con_out, size); | ||
492 | _fit_console_window(pdc_con_out, &rect); | ||
493 | SetConsoleScreenBufferSize(pdc_con_out, size); | ||
494 | SetConsoleActiveScreenBuffer(pdc_con_out); | ||
495 | |||
496 | return OK; | ||
497 | } | ||
498 | |||
499 | void PDC_reset_prog_mode(void) | ||
500 | { | ||
501 | PDC_LOG(("PDC_reset_prog_mode() - called.\n")); | ||
502 | |||
503 | if (is_nt) | ||
504 | { | ||
505 | COORD bufsize; | ||
506 | SMALL_RECT rect; | ||
507 | |||
508 | bufsize.X = orig_scr.srWindow.Right - orig_scr.srWindow.Left + 1; | ||
509 | bufsize.Y = orig_scr.srWindow.Bottom - orig_scr.srWindow.Top + 1; | ||
510 | |||
511 | rect.Top = rect.Left = 0; | ||
512 | rect.Bottom = bufsize.Y - 1; | ||
513 | rect.Right = bufsize.X - 1; | ||
514 | |||
515 | SetConsoleScreenBufferSize(pdc_con_out, bufsize); | ||
516 | SetConsoleWindowInfo(pdc_con_out, TRUE, &rect); | ||
517 | SetConsoleScreenBufferSize(pdc_con_out, bufsize); | ||
518 | SetConsoleActiveScreenBuffer(pdc_con_out); | ||
519 | } | ||
520 | |||
521 | PDC_mouse_set(); | ||
522 | } | ||
523 | |||
524 | void PDC_reset_shell_mode(void) | ||
525 | { | ||
526 | PDC_LOG(("PDC_reset_shell_mode() - called.\n")); | ||
527 | |||
528 | if (is_nt) | ||
529 | { | ||
530 | SetConsoleScreenBufferSize(pdc_con_out, orig_scr.dwSize); | ||
531 | SetConsoleWindowInfo(pdc_con_out, TRUE, &orig_scr.srWindow); | ||
532 | SetConsoleScreenBufferSize(pdc_con_out, orig_scr.dwSize); | ||
533 | SetConsoleWindowInfo(pdc_con_out, TRUE, &orig_scr.srWindow); | ||
534 | SetConsoleActiveScreenBuffer(pdc_con_out); | ||
535 | } | ||
536 | |||
537 | SetConsoleMode(pdc_con_in, old_console_mode); | ||
538 | } | ||
539 | |||
540 | void PDC_restore_screen_mode(int i) | ||
541 | { | ||
542 | } | ||
543 | |||
544 | void PDC_save_screen_mode(int i) | ||
545 | { | ||
546 | } | ||
547 | |||
548 | void PDC_init_pair(short pair, short fg, short bg) | ||
549 | { | ||
550 | unsigned char att, temp_bg; | ||
551 | chtype i; | ||
552 | |||
553 | fg = curstoreal[fg]; | ||
554 | bg = curstoreal[bg]; | ||
555 | |||
556 | for (i = 0; i < PDC_OFFSET; i++) | ||
557 | { | ||
558 | att = fg | (bg << 4); | ||
559 | |||
560 | if (i & (A_REVERSE >> PDC_ATTR_SHIFT)) | ||
561 | att = bg | (fg << 4); | ||
562 | if (i & (A_UNDERLINE >> PDC_ATTR_SHIFT)) | ||
563 | att = 1; | ||
564 | if (i & (A_INVIS >> PDC_ATTR_SHIFT)) | ||
565 | { | ||
566 | temp_bg = att >> 4; | ||
567 | att = temp_bg << 4 | temp_bg; | ||
568 | } | ||
569 | if (i & (A_BOLD >> PDC_ATTR_SHIFT)) | ||
570 | att |= 8; | ||
571 | if (i & (A_BLINK >> PDC_ATTR_SHIFT)) | ||
572 | att |= 128; | ||
573 | |||
574 | pdc_atrtab[pair * PDC_OFFSET + i] = att; | ||
575 | } | ||
576 | } | ||
577 | |||
578 | int PDC_pair_content(short pair, short *fg, short *bg) | ||
579 | { | ||
580 | *fg = realtocurs[pdc_atrtab[pair * PDC_OFFSET] & 0x0F]; | ||
581 | *bg = realtocurs[(pdc_atrtab[pair * PDC_OFFSET] & 0xF0) >> 4]; | ||
582 | |||
583 | return OK; | ||
584 | } | ||
585 | |||
586 | bool PDC_can_change_color(void) | ||
587 | { | ||
588 | return is_nt; | ||
589 | } | ||
590 | |||
591 | int PDC_color_content(short color, short *red, short *green, short *blue) | ||
592 | { | ||
593 | DWORD col; | ||
594 | |||
595 | if (!console_info.Hwnd) | ||
596 | _init_console_info(); | ||
597 | |||
598 | col = console_info.ColorTable[curstoreal[color]]; | ||
599 | |||
600 | *red = DIVROUND(GetRValue(col) * 1000, 255); | ||
601 | *green = DIVROUND(GetGValue(col) * 1000, 255); | ||
602 | *blue = DIVROUND(GetBValue(col) * 1000, 255); | ||
603 | |||
604 | return OK; | ||
605 | } | ||
606 | |||
607 | int PDC_init_color(short color, short red, short green, short blue) | ||
608 | { | ||
609 | if (!console_info.Hwnd) | ||
610 | _init_console_info(); | ||
611 | |||
612 | console_info.ColorTable[curstoreal[color]] = | ||
613 | RGB(DIVROUND(red * 255, 1000), | ||
614 | DIVROUND(green * 255, 1000), | ||
615 | DIVROUND(blue * 255, 1000)); | ||
616 | |||
617 | _set_console_info(); | ||
618 | |||
619 | return OK; | ||
620 | } |
File win32/pdcsetsc.c added (mode: 100644) (index 00000000..cfb12315) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcsetsc.c,v 1.40 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdcsetsc | ||
10 | |||
11 | Synopsis: | ||
12 | int PDC_set_blink(bool blinkon); | ||
13 | void PDC_set_title(const char *title); | ||
14 | |||
15 | Description: | ||
16 | PDC_set_blink() toggles whether the A_BLINK attribute sets an | ||
17 | actual blink mode (TRUE), or sets the background color to high | ||
18 | intensity (FALSE). The default is platform-dependent (FALSE in | ||
19 | most cases). It returns OK if it could set the state to match | ||
20 | the given parameter, ERR otherwise. Current platforms also | ||
21 | adjust the value of COLORS according to this function -- 16 for | ||
22 | FALSE, and 8 for TRUE. | ||
23 | |||
24 | PDC_set_title() sets the title of the window in which the curses | ||
25 | program is running. This function may not do anything on some | ||
26 | platforms. (Currently it only works in Win32 and X11.) | ||
27 | |||
28 | Portability X/Open BSD SYS V | ||
29 | PDC_set_blink - - - | ||
30 | PDC_set_title - - - | ||
31 | |||
32 | **man-end****************************************************************/ | ||
33 | |||
34 | int PDC_curs_set(int visibility) | ||
35 | { | ||
36 | CONSOLE_CURSOR_INFO cci; | ||
37 | int ret_vis; | ||
38 | |||
39 | PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); | ||
40 | |||
41 | ret_vis = SP->visibility; | ||
42 | |||
43 | if (GetConsoleCursorInfo(pdc_con_out, &cci) == FALSE) | ||
44 | return ERR; | ||
45 | |||
46 | switch(visibility) | ||
47 | { | ||
48 | case 0: /* invisible */ | ||
49 | cci.bVisible = FALSE; | ||
50 | break; | ||
51 | case 2: /* highly visible */ | ||
52 | cci.bVisible = TRUE; | ||
53 | cci.dwSize = 95; | ||
54 | break; | ||
55 | default: /* normal visibility */ | ||
56 | cci.bVisible = TRUE; | ||
57 | cci.dwSize = SP->orig_cursor; | ||
58 | break; | ||
59 | } | ||
60 | |||
61 | if (SetConsoleCursorInfo(pdc_con_out, &cci) == FALSE) | ||
62 | return ERR; | ||
63 | |||
64 | SP->visibility = visibility; | ||
65 | return ret_vis; | ||
66 | } | ||
67 | |||
68 | void PDC_set_title(const char *title) | ||
69 | { | ||
70 | #ifdef PDC_WIDE | ||
71 | wchar_t wtitle[512]; | ||
72 | #endif | ||
73 | PDC_LOG(("PDC_set_title() - called:<%s>\n", title)); | ||
74 | |||
75 | #ifdef PDC_WIDE | ||
76 | PDC_mbstowcs(wtitle, title, 511); | ||
77 | SetConsoleTitleW(wtitle); | ||
78 | #else | ||
79 | SetConsoleTitleA(title); | ||
80 | #endif | ||
81 | } | ||
82 | |||
83 | int PDC_set_blink(bool blinkon) | ||
84 | { | ||
85 | if (pdc_color_started) | ||
86 | COLORS = 16; | ||
87 | |||
88 | return blinkon ? ERR : OK; | ||
89 | } |
File win32/pdcurses.ico added (mode: 100644) (index 00000000..53a6dde3) |
File win32/pdcurses.rc added (mode: 100644) (index 00000000..1b8bba4b) | |||
1 | #include "winver.h" | ||
2 | |||
3 | 1 VERSIONINFO | ||
4 | FILEVERSION 3,4,0,0 | ||
5 | PRODUCTVERSION 3,4,0,0 | ||
6 | FILEFLAGSMASK 0x3fL | ||
7 | FILEFLAGS 0x0L | ||
8 | FILEOS VOS_UNKNOWN | ||
9 | FILETYPE VFT_DLL | ||
10 | FILESUBTYPE 0x0L | ||
11 | BEGIN | ||
12 | BLOCK "StringFileInfo" | ||
13 | BEGIN | ||
14 | BLOCK "040904b0" | ||
15 | BEGIN | ||
16 | VALUE "Maintainer", "William McBrine\0" | ||
17 | VALUE "FileDescription", "Public Domain Curses\0" | ||
18 | VALUE "FileVersion", "3.4.0\0" | ||
19 | VALUE "InternalName", "PDCurses\0" | ||
20 | VALUE "LegalCopyright", "Public Domain\0" | ||
21 | VALUE "OriginalFilename", "PDCURSES.DLL\0" | ||
22 | VALUE "ProductName", "Public Domain Curses Library\0" | ||
23 | VALUE "ProductVersion", "3.4.0\0" | ||
24 | END | ||
25 | END | ||
26 | END | ||
27 | |||
28 | 1 ICON DISCARDABLE "PDCURSES.ico" |
File win32/pdcutil.c added (mode: 100644) (index 00000000..f7be019e) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcwin.h" | ||
4 | |||
5 | RCSID("$Id: pdcutil.c,v 1.14 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | void PDC_beep(void) | ||
8 | { | ||
9 | PDC_LOG(("PDC_beep() - called\n")); | ||
10 | |||
11 | /* MessageBeep(MB_OK); */ | ||
12 | MessageBeep(0XFFFFFFFF); | ||
13 | } | ||
14 | |||
15 | void PDC_napms(int ms) | ||
16 | { | ||
17 | PDC_LOG(("PDC_napms() - called: ms=%d\n", ms)); | ||
18 | |||
19 | Sleep(ms); | ||
20 | } | ||
21 | |||
22 | const char *PDC_sysname(void) | ||
23 | { | ||
24 | return "Win32"; | ||
25 | } |
File win32/pdcwin.h added (mode: 100644) (index 00000000..bb3396f0) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: pdcwin.h,v 1.6 2008/07/13 06:36:32 wmcbrine Exp $ */ | ||
4 | |||
5 | #ifdef PDC_WIDE | ||
6 | # define UNICODE | ||
7 | #endif | ||
8 | |||
9 | #include <windows.h> | ||
10 | #undef MOUSE_MOVED | ||
11 | #include <curspriv.h> | ||
12 | |||
13 | extern unsigned char *pdc_atrtab; | ||
14 | extern HANDLE pdc_con_out, pdc_con_in; | ||
15 | extern DWORD pdc_quick_edit; | ||
16 | |||
17 | extern int PDC_get_buffer_rows(void); |
File win32/vcwin32.mak added (mode: 100644) (index 00000000..b8dc4043) | |||
1 | # Visual C++ NMakefile for PDCurses library - Win32 VC++ 2.0+ | ||
2 | # | ||
3 | # Usage: nmake -f [path\]vcwin32.mak [DEBUG=] [DLL=] [WIDE=] [UTF8=] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | O = obj | ||
9 | |||
10 | !ifndef PDCURSES_SRCDIR | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | !include $(PDCURSES_SRCDIR)\libobjs.mif | ||
16 | |||
17 | osdir = $(PDCURSES_SRCDIR)\win32 | ||
18 | |||
19 | PDCURSES_WIN_H = $(osdir)\pdcwin.h | ||
20 | |||
21 | CC = cl.exe -nologo | ||
22 | |||
23 | !ifdef DEBUG | ||
24 | CFLAGS = -Z7 -DPDCDEBUG | ||
25 | LDFLAGS = -debug -pdb:none | ||
26 | !else | ||
27 | CFLAGS = -O1 | ||
28 | LDFLAGS = | ||
29 | !endif | ||
30 | |||
31 | BASEDEF = $(PDCURSES_SRCDIR)\exp-base.def | ||
32 | WIDEDEF = $(PDCURSES_SRCDIR)\exp-wide.def | ||
33 | |||
34 | DEFDEPS = $(BASEDEF) | ||
35 | |||
36 | !ifdef WIDE | ||
37 | WIDEOPT = -DPDC_WIDE | ||
38 | DEFDEPS = $(DEFDEPS) $(WIDEDEF) | ||
39 | !endif | ||
40 | |||
41 | !ifdef UTF8 | ||
42 | UTF8OPT = -DPDC_FORCE_UTF8 | ||
43 | !endif | ||
44 | |||
45 | DEFFILE = pdcurses.def | ||
46 | SHL_LD = link $(LDFLAGS) /NOLOGO /DLL /OUT:pdcurses.dll /DEF:$(DEFFILE) | ||
47 | |||
48 | LINK = link.exe -nologo | ||
49 | |||
50 | CCLIBS = user32.lib advapi32.lib | ||
51 | # may need to add msvcrt.lib for VC 2.x, VC 5.0 doesn't want it | ||
52 | #CCLIBS = msvcrt.lib user32.lib advapi32.lib | ||
53 | |||
54 | LIBEXE = lib -nologo | ||
55 | |||
56 | LIBCURSES = pdcurses.lib | ||
57 | CURSESDLL = pdcurses.dll | ||
58 | |||
59 | !ifdef DLL | ||
60 | DLLOPT = -DPDC_DLL_BUILD | ||
61 | PDCLIBS = $(CURSESDLL) | ||
62 | !else | ||
63 | PDCLIBS = $(LIBCURSES) | ||
64 | !endif | ||
65 | |||
66 | BUILD = $(CC) -I$(PDCURSES_SRCDIR) -c $(CFLAGS) $(DLLOPT) \ | ||
67 | $(WIDEOPT) $(UTF8OPT) | ||
68 | |||
69 | all: $(PDCLIBS) $(DEMOS) | ||
70 | |||
71 | clean: | ||
72 | -del *.obj | ||
73 | -del *.lib | ||
74 | -del *.exe | ||
75 | -del *.dll | ||
76 | -del *.exp | ||
77 | -del *.res | ||
78 | -del *.def | ||
79 | |||
80 | DEMOOBJS = $(DEMOS:.exe=.obj) tui.obj | ||
81 | |||
82 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
83 | $(PDCOBJS) : $(PDCURSES_WIN_H) | ||
84 | $(DEMOOBJS) : $(PDCURSES_CURSES_H) | ||
85 | $(DEMOS) : $(LIBCURSES) | ||
86 | panel.obj : $(PANEL_HEADER) | ||
87 | terminfo.obj: $(TERM_HEADER) | ||
88 | |||
89 | !ifndef DLL | ||
90 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
91 | $(LIBEXE) -out:$@ $(LIBOBJS) $(PDCOBJS) | ||
92 | -copy $(LIBCURSES) panel.lib | ||
93 | !endif | ||
94 | |||
95 | $(DEFFILE) : $(DEFDEPS) | ||
96 | echo LIBRARY pdcurses > $(DEFFILE) | ||
97 | echo EXPORTS >> $(DEFFILE) | ||
98 | type $(BASEDEF) >> $(DEFFILE) | ||
99 | !ifdef WIDE | ||
100 | type $(WIDEDEF) >> $(DEFFILE) | ||
101 | !endif | ||
102 | |||
103 | $(CURSESDLL) : $(LIBOBJS) $(PDCOBJS) $(DEFFILE) pdcurses.obj | ||
104 | $(SHL_LD) $(LIBOBJS) $(PDCOBJS) pdcurses.obj $(CCLIBS) | ||
105 | -copy $(LIBCURSES) panel.lib | ||
106 | |||
107 | pdcurses.res pdcurses.obj: $(osdir)\pdcurses.rc $(osdir)\pdcurses.ico | ||
108 | rc /r /fopdcurses.res $(osdir)\pdcurses.rc | ||
109 | cvtres /MACHINE:IX86 /NOLOGO /OUT:pdcurses.obj pdcurses.res | ||
110 | |||
111 | {$(srcdir)\}.c{}.obj:: | ||
112 | $(BUILD) $< | ||
113 | |||
114 | {$(osdir)\}.c{}.obj:: | ||
115 | $(BUILD) $< | ||
116 | |||
117 | {$(demodir)\}.c{}.obj:: | ||
118 | $(BUILD) $< | ||
119 | |||
120 | .obj.exe: | ||
121 | $(LINK) $(LDFLAGS) $< $(LIBCURSES) $(CCLIBS) | ||
122 | |||
123 | tuidemo.exe: tuidemo.obj tui.obj | ||
124 | $(LINK) $(LDFLAGS) $*.obj tui.obj $(LIBCURSES) $(CCLIBS) | ||
125 | |||
126 | tui.obj: $(demodir)\tui.c $(demodir)\tui.h | ||
127 | $(BUILD) -I$(demodir) $(demodir)\tui.c | ||
128 | |||
129 | tuidemo.obj: $(demodir)\tuidemo.c | ||
130 | $(BUILD) -I$(demodir) $(demodir)\tuidemo.c | ||
131 | |||
132 | PLATFORM1 = Visual C++ | ||
133 | PLATFORM2 = Microsoft Visual C/C++ for Win32 | ||
134 | ARCNAME = pdc$(VER)_vc_w32 | ||
135 | |||
136 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File win32/wccwin32.mak added (mode: 100644) (index 00000000..1363897b) | |||
1 | # Watcom WMAKE Makefile for PDCurses library - Win32 Watcom C/C++ 10.6+ | ||
2 | # | ||
3 | # Usage: wmake -f [win32\]wccwin32.mak [DEBUG=Y] [WIDE=Y] [UTF8=Y] [target] | ||
4 | # | ||
5 | # where target can be any of: | ||
6 | # [all|demos|pdcurses.lib|testcurs.exe...] | ||
7 | |||
8 | !ifdef %PDCURSES_SRCDIR | ||
9 | PDCURSES_SRCDIR = $(%PDCURSES_SRCDIR) | ||
10 | !else | ||
11 | PDCURSES_SRCDIR = .. | ||
12 | !endif | ||
13 | |||
14 | !include $(PDCURSES_SRCDIR)\version.mif | ||
15 | |||
16 | osdir = $(PDCURSES_SRCDIR)\win32 | ||
17 | |||
18 | CC = wcc386 | ||
19 | TARGET = nt | ||
20 | |||
21 | CFLAGS = /ei /zq /wx /i=$(PDCURSES_SRCDIR) | ||
22 | |||
23 | !ifeq DEBUG Y | ||
24 | CFLAGS += /d2 /DPDCDEBUG | ||
25 | LDFLAGS = D W A op q sys $(TARGET) | ||
26 | !else | ||
27 | CFLAGS += /oneatx | ||
28 | LDFLAGS = op q sys $(TARGET) | ||
29 | !endif | ||
30 | |||
31 | !ifeq WIDE Y | ||
32 | CFLAGS += /DPDC_WIDE | ||
33 | !endif | ||
34 | |||
35 | !ifeq UTF8 Y | ||
36 | CFLAGS += /DPDC_FORCE_UTF8 | ||
37 | !endif | ||
38 | |||
39 | LIBEXE = wlib /q /n /t | ||
40 | |||
41 | !include $(PDCURSES_SRCDIR)\watcom.mif | ||
42 | |||
43 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
44 | $(LIBEXE) $@ $(LIBOBJS) $(PDCOBJS) | ||
45 | -copy $(LIBCURSES) panel.lib | ||
46 | |||
47 | PLATFORM1 = Watcom C++ Win32 | ||
48 | PLATFORM2 = Open Watcom 1.6 for Win32 | ||
49 | ARCNAME = pdc$(VER)_wcc_w32 | ||
50 | |||
51 | !include $(PDCURSES_SRCDIR)\makedist.mif |
File x11/Makefile.aix.in added (mode: 100644) (index 00000000..0fe5db78) | |||
1 | # Makefile for PDCurses library for AIX/X11 | ||
2 | |||
3 | SHELL = @SHELL@ | ||
4 | THIS = Makefile | ||
5 | |||
6 | @SET_MAKE@ | ||
7 | |||
8 | PDCURSES_SRCDIR = .. | ||
9 | |||
10 | osdir = . | ||
11 | srcdir = $(PDCURSES_SRCDIR)/pdcurses | ||
12 | |||
13 | PDCURSES_CONFIG_H =$(PDCURSES_SRCDIR)/config.h | ||
14 | PDCURSES_CURSES_H =$(PDCURSES_SRCDIR)/curses.h | ||
15 | PDCURSES_CURSPRIV_H =$(PDCURSES_SRCDIR)/curspriv.h | ||
16 | PDCURSES_HEADERS =$(PDCURSES_CONFIG_H) $(PDCURSES_CURSES_H) \ | ||
17 | $(PDCURSES_CURSPRIV_H) | ||
18 | PDCURSES_X11_H =$(osdir)/pdcx11.h | ||
19 | |||
20 | MH_EXTRA_LIBS = @MH_EXTRA_LIBS@ | ||
21 | |||
22 | CFLAGS = @CFLAGS@ @DYN_COMP@ | ||
23 | |||
24 | CPPFLAGS = @DEFS@ -DXCURSES @SYS_DEFS@ -I$(PDCURSES_SRCDIR) | ||
25 | |||
26 | BUILD = @CC@ -c $(CFLAGS) $(CPPFLAGS) @MH_XINC_DIR@ | ||
27 | |||
28 | LINK = @CC@ | ||
29 | LDFLAGS = | ||
30 | |||
31 | LIBCURSES = libXCurses.a | ||
32 | |||
33 | all : $(LIBCURSES) | ||
34 | |||
35 | install : | ||
36 | echo Does nothing at the moment | ||
37 | |||
38 | clean : | ||
39 | -rm -rf *.o *.sho trace $(LIBCURSES) | ||
40 | |||
41 | distclean: clean | ||
42 | -rm -f Makefile | ||
43 | |||
44 | mostlyclean: clean | ||
45 | |||
46 | realclean: distclean | ||
47 | |||
48 | LIBOBJS = addch.o addchstr.o addstr.o attr.o beep.o bkgd.o border.o \ | ||
49 | clear.o color.o delch.o deleteln.o deprec.o getch.o getstr.o getyx.o \ | ||
50 | inch.o inchstr.o initscr.o inopts.o insch.o insstr.o instr.o kernel.o \ | ||
51 | keyname.o mouse.o move.o outopts.o overlay.o pad.o panel.o printw.o \ | ||
52 | refresh.o scanw.o scr_dump.o scroll.o slk.o termattr.o terminfo.o \ | ||
53 | touch.o util.o window.o debug.o | ||
54 | |||
55 | PDCOBJS = pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o \ | ||
56 | pdcutil.o pdcx11.o x11.o sb.o ScrollBox.o | ||
57 | |||
58 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) curses.exp | ||
59 | ld -bnoentry -bM:SRE -bE:curses.exp $(MH_LIBS) $(MH_EXTRA_LIBS) \ | ||
60 | $(LIBOBJS) $(PDCOBJS) -o $@ | ||
61 | |||
62 | $(LIBOBJS) $(PDCOBJS) : $(PDCURSES_HEADERS) | ||
63 | $(PDCOBJS) : $(PDCURSES_X11_H) | ||
64 | terminfo.o: $(TERM_HEADER) | ||
65 | |||
66 | curses.exp: ../exp-base.def | ||
67 | cat ../exp-base.def > curses.exp | ||
68 | echo Xinitscr >> curses.exp | ||
69 | echo XCursesExit >> curses.exp | ||
70 | echo sb_init >> curses.exp | ||
71 | echo sb_set_horz >> curses.exp | ||
72 | echo sb_set_vert >> curses.exp | ||
73 | echo sb_get_horz >> curses.exp | ||
74 | echo sb_get_vert >> curses.exp | ||
75 | echo sb_refresh >> curses.exp | ||
76 | |||
77 | addch.o: $(srcdir)/addch.c | ||
78 | $(BUILD) $(srcdir)/addch.c | ||
79 | |||
80 | addchstr.o: $(srcdir)/addchstr.c | ||
81 | $(BUILD) $(srcdir)/addchstr.c | ||
82 | |||
83 | addstr.o: $(srcdir)/addstr.c | ||
84 | $(BUILD) $(srcdir)/addstr.c | ||
85 | |||
86 | attr.o: $(srcdir)/attr.c | ||
87 | $(BUILD) $(srcdir)/attr.c | ||
88 | |||
89 | beep.o: $(srcdir)/beep.c | ||
90 | $(BUILD) $(srcdir)/beep.c | ||
91 | |||
92 | bkgd.o: $(srcdir)/bkgd.c | ||
93 | $(BUILD) $(srcdir)/bkgd.c | ||
94 | |||
95 | border.o: $(srcdir)/border.c | ||
96 | $(BUILD) $(srcdir)/border.c | ||
97 | |||
98 | clear.o: $(srcdir)/clear.c | ||
99 | $(BUILD) $(srcdir)/clear.c | ||
100 | |||
101 | color.o: $(srcdir)/color.c | ||
102 | $(BUILD) $(srcdir)/color.c | ||
103 | |||
104 | delch.o: $(srcdir)/delch.c | ||
105 | $(BUILD) $(srcdir)/delch.c | ||
106 | |||
107 | deleteln.o: $(srcdir)/deleteln.c | ||
108 | $(BUILD) $(srcdir)/deleteln.c | ||
109 | |||
110 | deprec.o: $(srcdir)/deprec.c | ||
111 | $(BUILD) $(srcdir)/deprec.c | ||
112 | |||
113 | getch.o: $(srcdir)/getch.c | ||
114 | $(BUILD) $(srcdir)/getch.c | ||
115 | |||
116 | getstr.o: $(srcdir)/getstr.c | ||
117 | $(BUILD) $(srcdir)/getstr.c | ||
118 | |||
119 | getyx.o: $(srcdir)/getyx.c | ||
120 | $(BUILD) $(srcdir)/getyx.c | ||
121 | |||
122 | inch.o: $(srcdir)/inch.c | ||
123 | $(BUILD) $(srcdir)/inch.c | ||
124 | |||
125 | inchstr.o: $(srcdir)/inchstr.c | ||
126 | $(BUILD) $(srcdir)/inchstr.c | ||
127 | |||
128 | initscr.o: $(srcdir)/initscr.c | ||
129 | $(BUILD) $(srcdir)/initscr.c | ||
130 | |||
131 | inopts.o: $(srcdir)/inopts.c | ||
132 | $(BUILD) $(srcdir)/inopts.c | ||
133 | |||
134 | insch.o: $(srcdir)/insch.c | ||
135 | $(BUILD) $(srcdir)/insch.c | ||
136 | |||
137 | insstr.o: $(srcdir)/insstr.c | ||
138 | $(BUILD) $(srcdir)/insstr.c | ||
139 | |||
140 | instr.o: $(srcdir)/instr.c | ||
141 | $(BUILD) $(srcdir)/instr.c | ||
142 | |||
143 | kernel.o: $(srcdir)/kernel.c | ||
144 | $(BUILD) $(srcdir)/kernel.c | ||
145 | |||
146 | keyname.o: $(srcdir)/keyname.c | ||
147 | $(BUILD) $(srcdir)/keyname.c | ||
148 | |||
149 | mouse.o: $(srcdir)/mouse.c | ||
150 | $(BUILD) $(srcdir)/mouse.c | ||
151 | |||
152 | move.o: $(srcdir)/move.c | ||
153 | $(BUILD) $(srcdir)/move.c | ||
154 | |||
155 | outopts.o: $(srcdir)/outopts.c | ||
156 | $(BUILD) $(srcdir)/outopts.c | ||
157 | |||
158 | overlay.o: $(srcdir)/overlay.c | ||
159 | $(BUILD) $(srcdir)/overlay.c | ||
160 | |||
161 | pad.o: $(srcdir)/pad.c | ||
162 | $(BUILD) $(srcdir)/pad.c | ||
163 | |||
164 | panel.o: $(srcdir)/panel.c $(PDCURSES_SRCDIR)/panel.h | ||
165 | $(BUILD) $(srcdir)/panel.c | ||
166 | |||
167 | printw.o: $(srcdir)/printw.c | ||
168 | $(BUILD) $(srcdir)/printw.c | ||
169 | |||
170 | refresh.o: $(srcdir)/refresh.c | ||
171 | $(BUILD) $(srcdir)/refresh.c | ||
172 | |||
173 | scanw.o: $(srcdir)/scanw.c | ||
174 | $(BUILD) $(srcdir)/scanw.c | ||
175 | |||
176 | scr_dump.o: $(srcdir)/scr_dump.c | ||
177 | $(BUILD) $(srcdir)/scr_dump.c | ||
178 | |||
179 | scroll.o: $(srcdir)/scroll.c | ||
180 | $(BUILD) $(srcdir)/scroll.c | ||
181 | |||
182 | slk.o: $(srcdir)/slk.c | ||
183 | $(BUILD) $(srcdir)/slk.c | ||
184 | |||
185 | termattr.o: $(srcdir)/termattr.c | ||
186 | $(BUILD) $(srcdir)/termattr.c | ||
187 | |||
188 | terminfo.o: $(srcdir)/terminfo.c | ||
189 | $(BUILD) $(srcdir)/terminfo.c | ||
190 | |||
191 | touch.o: $(srcdir)/touch.c | ||
192 | $(BUILD) $(srcdir)/touch.c | ||
193 | |||
194 | util.o: $(srcdir)/util.c | ||
195 | $(BUILD) $(srcdir)/util.c | ||
196 | |||
197 | window.o: $(srcdir)/window.c | ||
198 | $(BUILD) $(srcdir)/window.c | ||
199 | |||
200 | debug.o: $(srcdir)/debug.c | ||
201 | $(BUILD) $(srcdir)/debug.c | ||
202 | |||
203 | pdcclip.o: $(osdir)/pdcclip.c | ||
204 | $(BUILD) $(osdir)/pdcclip.c | ||
205 | |||
206 | pdcdisp.o: $(osdir)/pdcdisp.c | ||
207 | $(BUILD) $(osdir)/pdcdisp.c | ||
208 | |||
209 | pdcgetsc.o: $(osdir)/pdcgetsc.c | ||
210 | $(BUILD) $(osdir)/pdcgetsc.c | ||
211 | |||
212 | pdckbd.o: $(osdir)/pdckbd.c | ||
213 | $(BUILD) $(osdir)/pdckbd.c | ||
214 | |||
215 | pdcscrn.o: $(osdir)/pdcscrn.c | ||
216 | $(BUILD) $(osdir)/pdcscrn.c | ||
217 | |||
218 | pdcsetsc.o: $(osdir)/pdcsetsc.c | ||
219 | $(BUILD) $(osdir)/pdcsetsc.c | ||
220 | |||
221 | pdcutil.o: $(osdir)/pdcutil.c | ||
222 | $(BUILD) $(osdir)/pdcutil.c | ||
223 | |||
224 | pdcx11.o: $(osdir)/pdcx11.c | ||
225 | $(BUILD) $(osdir)/pdcx11.c | ||
226 | |||
227 | ScrollBox.o: $(osdir)/ScrollBox.c | ||
228 | $(BUILD) $(osdir)/ScrollBox.c | ||
229 | |||
230 | sb.o: $(osdir)/sb.c | ||
231 | $(BUILD) $(osdir)/sb.c | ||
232 | |||
233 | x11.o: $(osdir)/x11.c | ||
234 | $(BUILD) $(osdir)/x11.c |
File x11/Makefile.in added (mode: 100644) (index 00000000..d23a214f) | |||
1 | # Makefile for PDCurses library for X11 | ||
2 | |||
3 | SHELL = @SHELL@ | ||
4 | THIS = Makefile | ||
5 | |||
6 | @SET_MAKE@ | ||
7 | |||
8 | PDCURSES_SRCDIR = .. | ||
9 | |||
10 | osdir = . | ||
11 | srcdir = $(PDCURSES_SRCDIR)/pdcurses | ||
12 | demodir = $(PDCURSES_SRCDIR)/demos | ||
13 | |||
14 | PDCURSES_CONFIG_H =$(PDCURSES_SRCDIR)/config.h | ||
15 | PDCURSES_CURSES_H =$(PDCURSES_SRCDIR)/curses.h | ||
16 | PDCURSES_CURSPRIV_H =$(PDCURSES_SRCDIR)/curspriv.h | ||
17 | PDCURSES_HEADERS =$(PDCURSES_CONFIG_H) $(PDCURSES_CURSES_H) \ | ||
18 | $(PDCURSES_CURSPRIV_H) | ||
19 | PDCURSES_X11_H =$(osdir)/pdcx11.h | ||
20 | |||
21 | SHLPRE = @SHLPRE@ | ||
22 | SHLPST = @SHLPST@ | ||
23 | LD_RXLIB1 = @LD_RXLIB1@ | ||
24 | LD_RXLIB2 = @MH_XLIBS@ @MH_EXTRA_LIBS@ -lc | ||
25 | |||
26 | CFLAGS = @CFLAGS@ | ||
27 | |||
28 | CPPFLAGS = @DEFS@ -DXCURSES @SYS_DEFS@ -I$(PDCURSES_SRCDIR) | ||
29 | |||
30 | BUILD = @CC@ -c $(CFLAGS) $(CPPFLAGS) @MH_XINC_DIR@ | ||
31 | DYN_BUILD = @O2SAVE@ $(BUILD) @DYN_COMP@ @CC2O@ | ||
32 | |||
33 | LINK = @PURIFY@ @CC@ | ||
34 | #LDFLAGS = $(LIB_DEPS) @LDFLAGS@ @LIBS@ @MH_XLIBS@ @MH_EXTRA_LIBS@ | ||
35 | LDFLAGS = $(LIBCURSES) @LDFLAGS@ @LIBS@ @MH_XLIBS@ @MH_EXTRA_LIBS@ | ||
36 | |||
37 | RANLIB = @RANLIB@ | ||
38 | |||
39 | LIBCURSES = libXCurses.a | ||
40 | |||
41 | LIB_DEPS = -L$(PDCURSES_SRCDIR)/x11 -lXCurses | ||
42 | |||
43 | PDCLIBS = $(LIBCURSES) @SHL_TARGETS@ | ||
44 | |||
45 | DEMOS = firework newdemo ptest rain testcurs tuidemo worm xmas | ||
46 | DEMOOBJS = firework.o newdemo.o ptest.o rain.o testcurs.o tui.o \ | ||
47 | tuidemo.o worm.o xmas.o | ||
48 | |||
49 | SHLFILE = XCurses | ||
50 | |||
51 | all: $(PDCLIBS) $(DEMOS) | ||
52 | |||
53 | install: | ||
54 | echo Does nothing at the moment | ||
55 | |||
56 | clean: | ||
57 | -rm -rf *.o *.sho trace $(PDCLIBS) $(DEMOS) | ||
58 | |||
59 | demos: $(DEMOS) | ||
60 | |||
61 | distclean: clean | ||
62 | -rm -f Makefile | ||
63 | |||
64 | mostlyclean: clean | ||
65 | |||
66 | realclean: distclean | ||
67 | |||
68 | LIBOBJS = addch.o addchstr.o addstr.o attr.o beep.o bkgd.o border.o \ | ||
69 | clear.o color.o delch.o deleteln.o deprec.o getch.o getstr.o getyx.o \ | ||
70 | inch.o inchstr.o initscr.o inopts.o insch.o insstr.o instr.o kernel.o \ | ||
71 | keyname.o mouse.o move.o outopts.o overlay.o pad.o panel.o printw.o \ | ||
72 | refresh.o scanw.o scr_dump.o scroll.o slk.o termattr.o terminfo.o \ | ||
73 | touch.o util.o window.o debug.o | ||
74 | |||
75 | PDCOBJS = pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o \ | ||
76 | pdcutil.o pdcx11.o x11.o sb.o ScrollBox.o | ||
77 | |||
78 | LIBSHOBJS = $(LIBOBJS:.o=.sho) | ||
79 | PDCSHOBJS = $(PDCOBJS:.o=.sho) | ||
80 | |||
81 | SHOFILES = $(LIBSHOBJS) $(PDCSHOBJS) | ||
82 | |||
83 | $(LIBCURSES) : $(LIBOBJS) $(PDCOBJS) | ||
84 | ar rv $@ $? | ||
85 | -$(RANLIB) $@ | ||
86 | |||
87 | $(SHLPRE)$(SHLFILE)$(SHLPST) : $(SHOFILES) | ||
88 | $(LD_RXLIB1) -o $@ $(SHOFILES) $(LD_RXLIB2) | ||
89 | |||
90 | $(LIBOBJS) $(PDCOBJS) $(SHOFILES) : $(PDCURSES_HEADERS) | ||
91 | $(PDCOBJS) $(PDCSHOBJS) : $(PDCURSES_X11_H) | ||
92 | $(DEMOOBJS) : $(PDCURSES_CURSES_H) | ||
93 | $(DEMOS) : $(LIBCURSES) | ||
94 | terminfo.o terminfo.sho: $(TERM_HEADER) | ||
95 | |||
96 | addch.o: $(srcdir)/addch.c | ||
97 | $(BUILD) $(srcdir)/addch.c | ||
98 | |||
99 | addchstr.o: $(srcdir)/addchstr.c | ||
100 | $(BUILD) $(srcdir)/addchstr.c | ||
101 | |||
102 | addstr.o: $(srcdir)/addstr.c | ||
103 | $(BUILD) $(srcdir)/addstr.c | ||
104 | |||
105 | attr.o: $(srcdir)/attr.c | ||
106 | $(BUILD) $(srcdir)/attr.c | ||
107 | |||
108 | beep.o: $(srcdir)/beep.c | ||
109 | $(BUILD) $(srcdir)/beep.c | ||
110 | |||
111 | bkgd.o: $(srcdir)/bkgd.c | ||
112 | $(BUILD) $(srcdir)/bkgd.c | ||
113 | |||
114 | border.o: $(srcdir)/border.c | ||
115 | $(BUILD) $(srcdir)/border.c | ||
116 | |||
117 | clear.o: $(srcdir)/clear.c | ||
118 | $(BUILD) $(srcdir)/clear.c | ||
119 | |||
120 | color.o: $(srcdir)/color.c | ||
121 | $(BUILD) $(srcdir)/color.c | ||
122 | |||
123 | delch.o: $(srcdir)/delch.c | ||
124 | $(BUILD) $(srcdir)/delch.c | ||
125 | |||
126 | deleteln.o: $(srcdir)/deleteln.c | ||
127 | $(BUILD) $(srcdir)/deleteln.c | ||
128 | |||
129 | deprec.o: $(srcdir)/deprec.c | ||
130 | $(BUILD) $(srcdir)/deprec.c | ||
131 | |||
132 | getch.o: $(srcdir)/getch.c | ||
133 | $(BUILD) $(srcdir)/getch.c | ||
134 | |||
135 | getstr.o: $(srcdir)/getstr.c | ||
136 | $(BUILD) $(srcdir)/getstr.c | ||
137 | |||
138 | getyx.o: $(srcdir)/getyx.c | ||
139 | $(BUILD) $(srcdir)/getyx.c | ||
140 | |||
141 | inch.o: $(srcdir)/inch.c | ||
142 | $(BUILD) $(srcdir)/inch.c | ||
143 | |||
144 | inchstr.o: $(srcdir)/inchstr.c | ||
145 | $(BUILD) $(srcdir)/inchstr.c | ||
146 | |||
147 | initscr.o: $(srcdir)/initscr.c | ||
148 | $(BUILD) $(srcdir)/initscr.c | ||
149 | |||
150 | inopts.o: $(srcdir)/inopts.c | ||
151 | $(BUILD) $(srcdir)/inopts.c | ||
152 | |||
153 | insch.o: $(srcdir)/insch.c | ||
154 | $(BUILD) $(srcdir)/insch.c | ||
155 | |||
156 | insstr.o: $(srcdir)/insstr.c | ||
157 | $(BUILD) $(srcdir)/insstr.c | ||
158 | |||
159 | instr.o: $(srcdir)/instr.c | ||
160 | $(BUILD) $(srcdir)/instr.c | ||
161 | |||
162 | kernel.o: $(srcdir)/kernel.c | ||
163 | $(BUILD) $(srcdir)/kernel.c | ||
164 | |||
165 | keyname.o: $(srcdir)/keyname.c | ||
166 | $(BUILD) $(srcdir)/keyname.c | ||
167 | |||
168 | mouse.o: $(srcdir)/mouse.c | ||
169 | $(BUILD) $(srcdir)/mouse.c | ||
170 | |||
171 | move.o: $(srcdir)/move.c | ||
172 | $(BUILD) $(srcdir)/move.c | ||
173 | |||
174 | outopts.o: $(srcdir)/outopts.c | ||
175 | $(BUILD) $(srcdir)/outopts.c | ||
176 | |||
177 | overlay.o: $(srcdir)/overlay.c | ||
178 | $(BUILD) $(srcdir)/overlay.c | ||
179 | |||
180 | pad.o: $(srcdir)/pad.c | ||
181 | $(BUILD) $(srcdir)/pad.c | ||
182 | |||
183 | panel.o: $(srcdir)/panel.c $(PDCURSES_SRCDIR)/panel.h | ||
184 | $(BUILD) $(srcdir)/panel.c | ||
185 | |||
186 | printw.o: $(srcdir)/printw.c | ||
187 | $(BUILD) $(srcdir)/printw.c | ||
188 | |||
189 | refresh.o: $(srcdir)/refresh.c | ||
190 | $(BUILD) $(srcdir)/refresh.c | ||
191 | |||
192 | scanw.o: $(srcdir)/scanw.c | ||
193 | $(BUILD) $(srcdir)/scanw.c | ||
194 | |||
195 | scr_dump.o: $(srcdir)/scr_dump.c | ||
196 | $(BUILD) $(srcdir)/scr_dump.c | ||
197 | |||
198 | scroll.o: $(srcdir)/scroll.c | ||
199 | $(BUILD) $(srcdir)/scroll.c | ||
200 | |||
201 | slk.o: $(srcdir)/slk.c | ||
202 | $(BUILD) $(srcdir)/slk.c | ||
203 | |||
204 | termattr.o: $(srcdir)/termattr.c | ||
205 | $(BUILD) $(srcdir)/termattr.c | ||
206 | |||
207 | terminfo.o: $(srcdir)/terminfo.c | ||
208 | $(BUILD) $(srcdir)/terminfo.c | ||
209 | |||
210 | touch.o: $(srcdir)/touch.c | ||
211 | $(BUILD) $(srcdir)/touch.c | ||
212 | |||
213 | util.o: $(srcdir)/util.c | ||
214 | $(BUILD) $(srcdir)/util.c | ||
215 | |||
216 | window.o: $(srcdir)/window.c | ||
217 | $(BUILD) $(srcdir)/window.c | ||
218 | |||
219 | debug.o: $(srcdir)/debug.c | ||
220 | $(BUILD) $(srcdir)/debug.c | ||
221 | |||
222 | pdcclip.o: $(osdir)/pdcclip.c | ||
223 | $(BUILD) $(osdir)/pdcclip.c | ||
224 | |||
225 | pdcdisp.o: $(osdir)/pdcdisp.c | ||
226 | $(BUILD) $(osdir)/pdcdisp.c | ||
227 | |||
228 | pdcgetsc.o: $(osdir)/pdcgetsc.c | ||
229 | $(BUILD) $(osdir)/pdcgetsc.c | ||
230 | |||
231 | pdckbd.o: $(osdir)/pdckbd.c | ||
232 | $(BUILD) $(osdir)/pdckbd.c | ||
233 | |||
234 | pdcscrn.o: $(osdir)/pdcscrn.c | ||
235 | $(BUILD) $(osdir)/pdcscrn.c | ||
236 | |||
237 | pdcsetsc.o: $(osdir)/pdcsetsc.c | ||
238 | $(BUILD) $(osdir)/pdcsetsc.c | ||
239 | |||
240 | pdcutil.o: $(osdir)/pdcutil.c | ||
241 | $(BUILD) $(osdir)/pdcutil.c | ||
242 | |||
243 | pdcx11.o: $(osdir)/pdcx11.c | ||
244 | $(BUILD) $(osdir)/pdcx11.c | ||
245 | |||
246 | ScrollBox.o: $(osdir)/ScrollBox.c | ||
247 | $(BUILD) $(osdir)/ScrollBox.c | ||
248 | |||
249 | sb.o: $(osdir)/sb.c | ||
250 | $(BUILD) $(osdir)/sb.c | ||
251 | |||
252 | x11.o: $(osdir)/x11.c | ||
253 | $(BUILD) $(osdir)/x11.c | ||
254 | |||
255 | addch.sho: $(srcdir)/addch.c | ||
256 | $(DYN_BUILD) $(srcdir)/addch.c | ||
257 | @SAVE2O@ | ||
258 | |||
259 | addchstr.sho: $(srcdir)/addchstr.c | ||
260 | $(DYN_BUILD) $(srcdir)/addchstr.c | ||
261 | @SAVE2O@ | ||
262 | |||
263 | addstr.sho: $(srcdir)/addstr.c | ||
264 | $(DYN_BUILD) $(srcdir)/addstr.c | ||
265 | @SAVE2O@ | ||
266 | |||
267 | attr.sho: $(srcdir)/attr.c | ||
268 | $(DYN_BUILD) $(srcdir)/attr.c | ||
269 | @SAVE2O@ | ||
270 | |||
271 | beep.sho: $(srcdir)/beep.c | ||
272 | $(DYN_BUILD) $(srcdir)/beep.c | ||
273 | @SAVE2O@ | ||
274 | |||
275 | bkgd.sho: $(srcdir)/bkgd.c | ||
276 | $(DYN_BUILD) $(srcdir)/bkgd.c | ||
277 | @SAVE2O@ | ||
278 | |||
279 | border.sho: $(srcdir)/border.c | ||
280 | $(DYN_BUILD) $(srcdir)/border.c | ||
281 | @SAVE2O@ | ||
282 | |||
283 | clear.sho: $(srcdir)/clear.c | ||
284 | $(DYN_BUILD) $(srcdir)/clear.c | ||
285 | @SAVE2O@ | ||
286 | |||
287 | color.sho: $(srcdir)/color.c | ||
288 | $(DYN_BUILD) $(srcdir)/color.c | ||
289 | @SAVE2O@ | ||
290 | |||
291 | delch.sho: $(srcdir)/delch.c | ||
292 | $(DYN_BUILD) $(srcdir)/delch.c | ||
293 | @SAVE2O@ | ||
294 | |||
295 | deleteln.sho: $(srcdir)/deleteln.c | ||
296 | $(DYN_BUILD) $(srcdir)/deleteln.c | ||
297 | @SAVE2O@ | ||
298 | |||
299 | deprec.sho: $(srcdir)/deprec.c | ||
300 | $(DYN_BUILD) $(srcdir)/deprec.c | ||
301 | @SAVE2O@ | ||
302 | |||
303 | getch.sho: $(srcdir)/getch.c | ||
304 | $(DYN_BUILD) $(srcdir)/getch.c | ||
305 | @SAVE2O@ | ||
306 | |||
307 | getstr.sho: $(srcdir)/getstr.c | ||
308 | $(DYN_BUILD) $(srcdir)/getstr.c | ||
309 | @SAVE2O@ | ||
310 | |||
311 | getyx.sho: $(srcdir)/getyx.c | ||
312 | $(DYN_BUILD) $(srcdir)/getyx.c | ||
313 | @SAVE2O@ | ||
314 | |||
315 | inch.sho: $(srcdir)/inch.c | ||
316 | $(DYN_BUILD) $(srcdir)/inch.c | ||
317 | @SAVE2O@ | ||
318 | |||
319 | inchstr.sho: $(srcdir)/inchstr.c | ||
320 | $(DYN_BUILD) $(srcdir)/inchstr.c | ||
321 | @SAVE2O@ | ||
322 | |||
323 | initscr.sho: $(srcdir)/initscr.c | ||
324 | $(DYN_BUILD) $(srcdir)/initscr.c | ||
325 | @SAVE2O@ | ||
326 | |||
327 | inopts.sho: $(srcdir)/inopts.c | ||
328 | $(DYN_BUILD) $(srcdir)/inopts.c | ||
329 | @SAVE2O@ | ||
330 | |||
331 | insch.sho: $(srcdir)/insch.c | ||
332 | $(DYN_BUILD) $(srcdir)/insch.c | ||
333 | @SAVE2O@ | ||
334 | |||
335 | insstr.sho: $(srcdir)/insstr.c | ||
336 | $(DYN_BUILD) $(srcdir)/insstr.c | ||
337 | @SAVE2O@ | ||
338 | |||
339 | instr.sho: $(srcdir)/instr.c | ||
340 | $(DYN_BUILD) $(srcdir)/instr.c | ||
341 | @SAVE2O@ | ||
342 | |||
343 | kernel.sho: $(srcdir)/kernel.c | ||
344 | $(DYN_BUILD) $(srcdir)/kernel.c | ||
345 | @SAVE2O@ | ||
346 | |||
347 | keyname.sho: $(srcdir)/keyname.c | ||
348 | $(DYN_BUILD) $(srcdir)/keyname.c | ||
349 | @SAVE2O@ | ||
350 | |||
351 | mouse.sho: $(srcdir)/mouse.c | ||
352 | $(DYN_BUILD) $(srcdir)/mouse.c | ||
353 | @SAVE2O@ | ||
354 | |||
355 | move.sho: $(srcdir)/move.c | ||
356 | $(DYN_BUILD) $(srcdir)/move.c | ||
357 | @SAVE2O@ | ||
358 | |||
359 | outopts.sho: $(srcdir)/outopts.c | ||
360 | $(DYN_BUILD) $(srcdir)/outopts.c | ||
361 | @SAVE2O@ | ||
362 | |||
363 | overlay.sho: $(srcdir)/overlay.c | ||
364 | $(DYN_BUILD) $(srcdir)/overlay.c | ||
365 | @SAVE2O@ | ||
366 | |||
367 | pad.sho: $(srcdir)/pad.c | ||
368 | $(DYN_BUILD) $(srcdir)/pad.c | ||
369 | @SAVE2O@ | ||
370 | |||
371 | panel.sho: $(srcdir)/panel.c $(PDCURSES_SRCDIR)/panel.h | ||
372 | $(DYN_BUILD) $(srcdir)/panel.c | ||
373 | @SAVE2O@ | ||
374 | |||
375 | printw.sho: $(srcdir)/printw.c | ||
376 | $(DYN_BUILD) $(srcdir)/printw.c | ||
377 | @SAVE2O@ | ||
378 | |||
379 | refresh.sho: $(srcdir)/refresh.c | ||
380 | $(DYN_BUILD) $(srcdir)/refresh.c | ||
381 | @SAVE2O@ | ||
382 | |||
383 | scanw.sho: $(srcdir)/scanw.c | ||
384 | $(DYN_BUILD) $(srcdir)/scanw.c | ||
385 | @SAVE2O@ | ||
386 | |||
387 | scr_dump.sho: $(srcdir)/scr_dump.c | ||
388 | $(DYN_BUILD) $(srcdir)/scr_dump.c | ||
389 | @SAVE2O@ | ||
390 | |||
391 | scroll.sho: $(srcdir)/scroll.c | ||
392 | $(DYN_BUILD) $(srcdir)/scroll.c | ||
393 | @SAVE2O@ | ||
394 | |||
395 | slk.sho: $(srcdir)/slk.c | ||
396 | $(DYN_BUILD) $(srcdir)/slk.c | ||
397 | @SAVE2O@ | ||
398 | |||
399 | termattr.sho: $(srcdir)/termattr.c | ||
400 | $(DYN_BUILD) $(srcdir)/termattr.c | ||
401 | @SAVE2O@ | ||
402 | |||
403 | terminfo.sho: $(srcdir)/terminfo.c | ||
404 | $(DYN_BUILD) $(srcdir)/terminfo.c | ||
405 | @SAVE2O@ | ||
406 | |||
407 | touch.sho: $(srcdir)/touch.c | ||
408 | $(DYN_BUILD) $(srcdir)/touch.c | ||
409 | @SAVE2O@ | ||
410 | |||
411 | util.sho: $(srcdir)/util.c | ||
412 | $(DYN_BUILD) $(srcdir)/util.c | ||
413 | @SAVE2O@ | ||
414 | |||
415 | window.sho: $(srcdir)/window.c | ||
416 | $(DYN_BUILD) $(srcdir)/window.c | ||
417 | @SAVE2O@ | ||
418 | |||
419 | debug.sho: $(srcdir)/debug.c | ||
420 | $(DYN_BUILD) $(srcdir)/debug.c | ||
421 | @SAVE2O@ | ||
422 | |||
423 | pdcclip.sho: $(osdir)/pdcclip.c | ||
424 | $(DYN_BUILD) $(osdir)/pdcclip.c | ||
425 | @SAVE2O@ | ||
426 | |||
427 | pdcdisp.sho: $(osdir)/pdcdisp.c | ||
428 | $(DYN_BUILD) $(osdir)/pdcdisp.c | ||
429 | @SAVE2O@ | ||
430 | |||
431 | pdcgetsc.sho: $(osdir)/pdcgetsc.c | ||
432 | $(DYN_BUILD) $(osdir)/pdcgetsc.c | ||
433 | @SAVE2O@ | ||
434 | |||
435 | pdckbd.sho: $(osdir)/pdckbd.c | ||
436 | $(DYN_BUILD) $(osdir)/pdckbd.c | ||
437 | @SAVE2O@ | ||
438 | |||
439 | pdcscrn.sho: $(osdir)/pdcscrn.c | ||
440 | $(DYN_BUILD) $(osdir)/pdcscrn.c | ||
441 | @SAVE2O@ | ||
442 | |||
443 | pdcsetsc.sho: $(osdir)/pdcsetsc.c | ||
444 | $(DYN_BUILD) $(osdir)/pdcsetsc.c | ||
445 | @SAVE2O@ | ||
446 | |||
447 | pdcutil.sho: $(osdir)/pdcutil.c | ||
448 | $(DYN_BUILD) $(osdir)/pdcutil.c | ||
449 | @SAVE2O@ | ||
450 | |||
451 | pdcx11.sho: $(osdir)/pdcx11.c | ||
452 | $(DYN_BUILD) $(osdir)/pdcx11.c | ||
453 | @SAVE2O@ | ||
454 | |||
455 | ScrollBox.sho: $(osdir)/ScrollBox.c | ||
456 | $(DYN_BUILD) $(osdir)/ScrollBox.c | ||
457 | @SAVE2O@ | ||
458 | |||
459 | sb.sho: $(osdir)/sb.c | ||
460 | $(DYN_BUILD) $(osdir)/sb.c | ||
461 | @SAVE2O@ | ||
462 | |||
463 | x11.sho: $(osdir)/x11.c | ||
464 | $(DYN_BUILD) $(osdir)/x11.c | ||
465 | @SAVE2O@ | ||
466 | |||
467 | firework: firework.o | ||
468 | $(LINK) firework.o -o $@ $(LDFLAGS) | ||
469 | |||
470 | newdemo: newdemo.o | ||
471 | $(LINK) newdemo.o -o $@ $(LDFLAGS) | ||
472 | |||
473 | ptest: ptest.o | ||
474 | $(LINK) ptest.o -o $@ $(LDFLAGS) | ||
475 | |||
476 | rain: rain.o | ||
477 | $(LINK) rain.o -o $@ $(LDFLAGS) | ||
478 | |||
479 | testcurs: testcurs.o | ||
480 | $(LINK) testcurs.o -o $@ $(LDFLAGS) | ||
481 | |||
482 | tuidemo: tuidemo.o tui.o | ||
483 | $(LINK) tui.o tuidemo.o -o $@ $(LDFLAGS) | ||
484 | |||
485 | worm: worm.o | ||
486 | $(LINK) worm.o -o $@ $(LDFLAGS) | ||
487 | |||
488 | xmas: xmas.o | ||
489 | $(LINK) xmas.o -o $@ $(LDFLAGS) | ||
490 | |||
491 | firework.o: $(demodir)/firework.c | ||
492 | $(BUILD) $(demodir)/firework.c | ||
493 | |||
494 | newdemo.o: $(demodir)/newdemo.c | ||
495 | $(BUILD) $(demodir)/newdemo.c | ||
496 | |||
497 | ptest.o: $(demodir)/ptest.c $(PDCURSES_SRCDIR)/panel.h | ||
498 | $(BUILD) $(demodir)/ptest.c | ||
499 | |||
500 | rain.o: $(demodir)/rain.c | ||
501 | $(BUILD) $(demodir)/rain.c | ||
502 | |||
503 | testcurs.o: $(demodir)/testcurs.c | ||
504 | $(BUILD) $(demodir)/testcurs.c | ||
505 | |||
506 | tui.o: $(demodir)/tui.c $(demodir)/tui.h | ||
507 | $(BUILD) $(demodir)/tui.c | ||
508 | |||
509 | tuidemo.o: $(demodir)/tuidemo.c | ||
510 | $(BUILD) $(demodir)/tuidemo.c | ||
511 | |||
512 | worm.o: $(demodir)/worm.c | ||
513 | $(BUILD) $(demodir)/worm.c | ||
514 | |||
515 | xmas.o: $(demodir)/xmas.c | ||
516 | $(BUILD) $(demodir)/xmas.c | ||
517 | |||
518 | # This section provides for compiling and linking the | ||
519 | # ncurses test programs. | ||
520 | |||
521 | ncurses_testdir = $(HOME)/ncurses-5.6/test | ||
522 | |||
523 | NCURSES_TESTS = bs gdc hanoi knight tclock ncurses | ||
524 | |||
525 | ncurses_tests: $(NCURSES_TESTS) | ||
526 | |||
527 | ncurses_clean: | ||
528 | -rm -f *.o trace $(NCURSES_TESTS) | ||
529 | |||
530 | NCFLAGS = -I. -I$(ncurses_testdir) | ||
531 | |||
532 | bs: bs.o $(LIBCURSES) | ||
533 | $(LINK) bs.o -o $@ $(LDFLAGS) | ||
534 | |||
535 | gdc: gdc.o $(LIBCURSES) | ||
536 | $(LINK) gdc.o -o $@ $(LDFLAGS) | ||
537 | |||
538 | hanoi: hanoi.o $(LIBCURSES) | ||
539 | $(LINK) hanoi.o -o $@ $(LDFLAGS) | ||
540 | |||
541 | knight: knight.o $(LIBCURSES) | ||
542 | $(LINK) knight.o -o $@ $(LDFLAGS) | ||
543 | |||
544 | tclock: tclock.o $(LIBCURSES) | ||
545 | $(LINK) tclock.o -o $@ $(LDFLAGS) -lm | ||
546 | |||
547 | view: view.o $(LIBCURSES) | ||
548 | $(LINK) view.o -o $@ $(LDFLAGS) | ||
549 | |||
550 | ncurses: ncurses.o $(LIBCURSES) | ||
551 | $(LINK) ncurses.o -o $@ $(LDFLAGS) | ||
552 | |||
553 | bs.o: $(ncurses_testdir)/bs.c $(PDCURSES_CURSES_H) | ||
554 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/bs.c | ||
555 | |||
556 | gdc.o: $(ncurses_testdir)/gdc.c $(PDCURSES_CURSES_H) | ||
557 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/gdc.c | ||
558 | |||
559 | hanoi.o: $(ncurses_testdir)/hanoi.c $(PDCURSES_CURSES_H) | ||
560 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/hanoi.c | ||
561 | |||
562 | knight.o: $(ncurses_testdir)/knight.c $(PDCURSES_CURSES_H) | ||
563 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/knight.c | ||
564 | |||
565 | tclock.o: $(ncurses_testdir)/tclock.c $(PDCURSES_CURSES_H) | ||
566 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/tclock.c | ||
567 | |||
568 | view.o: $(ncurses_testdir)/view.c $(PDCURSES_CURSES_H) | ||
569 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/view.c | ||
570 | |||
571 | ncurses.o: $(ncurses_testdir)/ncurses.c $(PDCURSES_CURSES_H) | ||
572 | $(BUILD) $(NCFLAGS) $(ncurses_testdir)/ncurses.c |
File x11/README added (mode: 100644) (index 00000000..37b45d06) | |||
1 | PDCurses for X11 | ||
2 | ================ | ||
3 | |||
4 | This is a port of PDCurses for X11, aka XCurses. It is designed to | ||
5 | allow existing curses programs to be re-compiled with PDCurses, | ||
6 | resulting in native X11 programs. | ||
7 | |||
8 | |||
9 | Building | ||
10 | -------- | ||
11 | |||
12 | . Run "./configure" in the top-level directory. | ||
13 | |||
14 | To build the wide-character version of the library, specify | ||
15 | "--enable-widec" as a parameter. To use X Input Methods, add | ||
16 | "--enable-xim". I recommend these options, but I haven't yet made | ||
17 | them the defaults, for the sake of backwards compatibility and due to | ||
18 | their new and relatively untested status. | ||
19 | |||
20 | If your system is lacking in UTF-8 support, you can force the use of | ||
21 | UTF-8 instead of the system locale via "--enable-force-utf8". This is | ||
22 | generally more useful in Windows. | ||
23 | |||
24 | If configure can't find your X include files or X libraries, you can | ||
25 | specify the paths with the arguments "--x-includes=inc_path" and/or | ||
26 | "--x-libraries=lib_path". | ||
27 | |||
28 | By default, the library and demo programs are built with the optimizer | ||
29 | switch -O2. You can turn this off, and turn on debugging (-g), by | ||
30 | adding "--with-debug" to the configure command. | ||
31 | |||
32 | . Run "make". This should build libXCurses and all the demo programs. | ||
33 | |||
34 | . Optionally, run "make install". curses.h and panel.h will be renamed | ||
35 | when installed (to xcurses.h and xpanel.h), to avoid conflicts with | ||
36 | any existing curses installations. Unrenamed copies of curses.h and | ||
37 | panel.h are installed in (by default) /usr/local/include/xcurses. | ||
38 | |||
39 | libXpanel is just a symlink to libXCurses. Both curses and panel | ||
40 | functions are in the main library. | ||
41 | |||
42 | |||
43 | Distribution Status | ||
44 | ------------------- | ||
45 | |||
46 | As of April 13, 2006, the files in this directory are released to the | ||
47 | Public Domain, except for ScrollBox*, which are under essentially the | ||
48 | MIT X License. | ||
49 | |||
50 | |||
51 | To be Done | ||
52 | ---------- | ||
53 | |||
54 | - have newterm() create a new X window | ||
55 | |||
56 | - provide a command line parsing function to enable X command line | ||
57 | arguments to be parsed and stripped from the arguments passed back | ||
58 | to the calling procedure. | ||
59 | |||
60 | |||
61 | Acknowledgements | ||
62 | ---------------- | ||
63 | |||
64 | X11 port was provided by Mark Hessling <mark@rexx.org> |
File x11/ScrollBox.c added (mode: 100644) (index 00000000..48ea38fd) | |||
1 | /* | ||
2 | * Copyright 1989 O'Reilly and Associates, Inc. | ||
3 | |||
4 | The X Consortium, and any party obtaining a copy of these files from | ||
5 | the X Consortium, directly or indirectly, is granted, free of charge, a | ||
6 | full and unrestricted irrevocable, world-wide, paid up, royalty-free, | ||
7 | nonexclusive right and license to deal in this software and | ||
8 | documentation files (the "Software"), including without limitation the | ||
9 | rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | and/or sell copies of the Software, and to permit persons who receive | ||
11 | copies from any such party to do so. This license includes without | ||
12 | limitation a license to do the foregoing actions under any patents of | ||
13 | the party supplying this software to the X Consortium. | ||
14 | |||
15 | $Id: ScrollBox.c,v 1.15 2008/07/14 04:24:52 wmcbrine Exp $ | ||
16 | */ | ||
17 | |||
18 | /* ScrollBox.c - scrollBox composite widget */ | ||
19 | |||
20 | #include <X11/IntrinsicP.h> | ||
21 | #include <X11/StringDefs.h> | ||
22 | #include <X11/Shell.h> | ||
23 | |||
24 | #include "x11/ScrollBoxP.h" | ||
25 | |||
26 | #include <stdio.h> | ||
27 | |||
28 | #define INITIAL_WIDTH 300 | ||
29 | #define INITIAL_HEIGHT 300 | ||
30 | |||
31 | /************************************************************************ | ||
32 | * * | ||
33 | * scrollBox Resources * | ||
34 | * * | ||
35 | ************************************************************************/ | ||
36 | |||
37 | static XtResource resources[] = | ||
38 | { | ||
39 | { XtNhSpace, XtCHSpace, XtRDimension, sizeof(Dimension), | ||
40 | XtOffset(ScrollBoxWidget, scrollBox.h_space), | ||
41 | XtRImmediate, (XtPointer)4 }, | ||
42 | { XtNvSpace, XtCVSpace, XtRDimension, sizeof(Dimension), | ||
43 | XtOffset(ScrollBoxWidget, scrollBox.v_space), | ||
44 | XtRImmediate, (XtPointer)4 }, | ||
45 | { XtNheightInc, XtCHeightInc, XtRDimension, sizeof(Dimension), | ||
46 | XtOffset(ScrollBoxWidget, scrollBox.increment_height), | ||
47 | XtRImmediate, (XtPointer)13 }, | ||
48 | { XtNwidthInc, XtCWidthInc, XtRDimension, sizeof(Dimension), | ||
49 | XtOffset(ScrollBoxWidget, scrollBox.increment_width), | ||
50 | XtRImmediate, (XtPointer)7 }, | ||
51 | }; | ||
52 | |||
53 | /************************************************************************ | ||
54 | * * | ||
55 | * Full class record constant * | ||
56 | * * | ||
57 | ************************************************************************/ | ||
58 | |||
59 | static void Initialize(Widget, Widget, ArgList, Cardinal *); | ||
60 | static void Resize(Widget); | ||
61 | static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *); | ||
62 | static void ChangeManaged(Widget); | ||
63 | static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *, | ||
64 | XtWidgetGeometry *); | ||
65 | static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry *, | ||
66 | XtWidgetGeometry *); | ||
67 | static void RefigureLocations(Widget); | ||
68 | |||
69 | ScrollBoxClassRec scrollBoxClassRec = { | ||
70 | { | ||
71 | /* core_class fields */ | ||
72 | /* superclass */ (WidgetClass) &compositeClassRec, | ||
73 | /* class_name */ "scrollBox", | ||
74 | /* widget_size */ sizeof(ScrollBoxRec), | ||
75 | /* class_initialize */ NULL, | ||
76 | /* class_part_init */ NULL, | ||
77 | /* class_inited */ FALSE, | ||
78 | /* initialize */ Initialize, | ||
79 | /* initialize_hook */ NULL, | ||
80 | /* realize */ XtInheritRealize, | ||
81 | /* actions */ NULL, | ||
82 | /* num_actions */ 0, | ||
83 | /* resources */ resources, | ||
84 | /* num_resources */ XtNumber(resources), | ||
85 | /* xrm_class */ NULLQUARK, | ||
86 | /* compress_motion */ TRUE, | ||
87 | /* compress_exposure */ TRUE, | ||
88 | /* compress_enterleave */ TRUE, | ||
89 | /* visible_interest */ FALSE, | ||
90 | /* destroy */ NULL, | ||
91 | /* resize */ Resize, | ||
92 | /* expose */ NULL, | ||
93 | /* set_values */ SetValues, | ||
94 | /* set_values_hook */ NULL, | ||
95 | /* set_values_almost */ XtInheritSetValuesAlmost, | ||
96 | /* get_values_hook */ NULL, | ||
97 | /* accept_focus */ NULL, | ||
98 | /* version */ XtVersion, | ||
99 | /* callback_private */ NULL, | ||
100 | /* tm_table */ NULL, | ||
101 | /* query_geometry */ QueryGeometry, | ||
102 | /* display_accelerator */ XtInheritDisplayAccelerator, | ||
103 | /* extension */ NULL | ||
104 | },{ | ||
105 | /* composite_class fields */ | ||
106 | /* geometry_manager */ GeometryManager, | ||
107 | /* change_managed */ ChangeManaged, | ||
108 | /* insert_child */ XtInheritInsertChild, | ||
109 | /* delete_child */ XtInheritDeleteChild, | ||
110 | /* extension */ NULL | ||
111 | },{ | ||
112 | /* scrollBox class fields */ | ||
113 | /* empty */ 0, | ||
114 | } | ||
115 | }; | ||
116 | |||
117 | WidgetClass scrollBoxWidgetClass = (WidgetClass)&scrollBoxClassRec; | ||
118 | |||
119 | |||
120 | /************************************************************************ | ||
121 | * * | ||
122 | * Private Routines * | ||
123 | * * | ||
124 | ************************************************************************/ | ||
125 | |||
126 | /* Do a layout, either actually assigning positions, or just | ||
127 | calculating size. */ | ||
128 | |||
129 | static void DoLayout(Widget w, Boolean doit) | ||
130 | { | ||
131 | ScrollBoxWidget sbw = (ScrollBoxWidget)w; | ||
132 | Widget wmain, vscroll, hscroll, child; | ||
133 | Dimension mw, mh; /* main window */ | ||
134 | Dimension vh; /* vertical scrollbar length (height) */ | ||
135 | Dimension hw; /* horizontal scrollbar length (width) */ | ||
136 | Position vx; | ||
137 | Position hy; | ||
138 | Cardinal i; | ||
139 | |||
140 | if (sbw->composite.num_children != 3) | ||
141 | XtAppError(XtWidgetToApplicationContext(w), | ||
142 | "ScrollBox: must manage exactly three widgets."); | ||
143 | |||
144 | for (i = 0; i < sbw->composite.num_children; i++) | ||
145 | { | ||
146 | child = sbw->composite.children[i]; | ||
147 | |||
148 | if (!XtIsManaged(child)) | ||
149 | XtAppError(XtWidgetToApplicationContext(w), | ||
150 | "ScrollBox: all three widgets must be managed."); | ||
151 | } | ||
152 | |||
153 | /* Child one is the main window, two is the vertical scrollbar, | ||
154 | and three is the horizontal scrollbar. */ | ||
155 | |||
156 | wmain = sbw->composite.children[0]; | ||
157 | vscroll = sbw->composite.children[1]; | ||
158 | hscroll = sbw->composite.children[2]; | ||
159 | |||
160 | /* Size all three widgets so that space is fully utilized. */ | ||
161 | |||
162 | mw = sbw->core.width - (2 * sbw->scrollBox.h_space) - | ||
163 | vscroll->core.width - (2 * vscroll->core.border_width) - | ||
164 | (2 * wmain->core.border_width); | ||
165 | |||
166 | mh = sbw->core.height - (2 * sbw->scrollBox.v_space) - | ||
167 | hscroll->core.height - (2 * hscroll->core.border_width) - | ||
168 | (2 * wmain->core.border_width); | ||
169 | |||
170 | /* Force the main window to be sized to the appropriate increment. */ | ||
171 | |||
172 | mw = (mw / sbw->scrollBox.increment_width) * | ||
173 | sbw->scrollBox.increment_width; | ||
174 | |||
175 | mh = ((mh / sbw->scrollBox.increment_height) * | ||
176 | sbw->scrollBox.increment_height) + | ||
177 | sbw->scrollBox.increment_height; | ||
178 | |||
179 | vx = wmain->core.x + mw + sbw->scrollBox.h_space + | ||
180 | wmain->core.border_width + vscroll->core.border_width; | ||
181 | |||
182 | hy = wmain->core.y + mh + sbw->scrollBox.v_space + | ||
183 | wmain->core.border_width + hscroll->core.border_width; | ||
184 | |||
185 | vh = mh; /* scrollbars are always same length as main window */ | ||
186 | hw = mw; | ||
187 | |||
188 | if (doit) | ||
189 | { | ||
190 | XtResizeWidget(wmain, mw, mh, 1); | ||
191 | |||
192 | XtResizeWidget(vscroll, vscroll->core.width, vh, 1); | ||
193 | XtMoveWidget(vscroll, vx, vscroll->core.y); | ||
194 | |||
195 | XtResizeWidget(hscroll, hw, hscroll->core.height, 1); | ||
196 | XtMoveWidget(hscroll, hscroll->core.x, hy); | ||
197 | } | ||
198 | } | ||
199 | |||
200 | static XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *request, | ||
201 | XtWidgetGeometry *reply) | ||
202 | { | ||
203 | XtWidgetGeometry allowed; | ||
204 | |||
205 | if (request->request_mode & ~(XtCWQueryOnly | CWWidth | CWHeight)) | ||
206 | return XtGeometryNo; | ||
207 | |||
208 | if (request->request_mode & CWWidth) | ||
209 | allowed.width = request->width; | ||
210 | else | ||
211 | allowed.width = w->core.width; | ||
212 | |||
213 | if (request->request_mode & CWHeight) | ||
214 | allowed.height = request->height; | ||
215 | else | ||
216 | allowed.height = w->core.height; | ||
217 | |||
218 | if (allowed.width == w->core.width && allowed.height == w->core.height) | ||
219 | return XtGeometryNo; | ||
220 | |||
221 | if (!(request->request_mode & XtCWQueryOnly)) | ||
222 | RefigureLocations(w); | ||
223 | |||
224 | return XtGeometryYes; | ||
225 | } | ||
226 | |||
227 | static void RefigureLocations(Widget w) | ||
228 | { | ||
229 | DoLayout(w, False); | ||
230 | } | ||
231 | |||
232 | /* Calculate preferred size. We can't just use the current sizes | ||
233 | of the children, because that calculation would always end up with | ||
234 | our current size. Could query each child, and use that size to | ||
235 | recalculate a size for us, then if it ends up being larger than width | ||
236 | and height passed in, accept bounding box. However, we know our | ||
237 | children and they don't have any particular preferred geometry, | ||
238 | except the bigger the better. Therefore, if the parent suggested a | ||
239 | size, we'll take it. */ | ||
240 | |||
241 | static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *request, | ||
242 | XtWidgetGeometry *reply_return) | ||
243 | { | ||
244 | XtGeometryResult result=XtGeometryNo; | ||
245 | |||
246 | request->request_mode &= CWWidth | CWHeight; | ||
247 | |||
248 | /* parent isn't going to change w or h, so nothing to re-compute */ | ||
249 | |||
250 | if (request->request_mode == 0) | ||
251 | return XtGeometryYes; | ||
252 | |||
253 | /* if proposed size is large enough, accept it. Otherwise, suggest | ||
254 | our arbitrary initial size. */ | ||
255 | |||
256 | if (request->request_mode & CWHeight) | ||
257 | { | ||
258 | if (request->height < INITIAL_HEIGHT) | ||
259 | { | ||
260 | result = XtGeometryAlmost; | ||
261 | reply_return->height = INITIAL_HEIGHT; | ||
262 | reply_return->request_mode &= CWHeight; | ||
263 | } | ||
264 | else | ||
265 | result = XtGeometryYes; | ||
266 | } | ||
267 | |||
268 | if (request->request_mode & CWWidth) | ||
269 | { | ||
270 | if (request->width < INITIAL_WIDTH) | ||
271 | { | ||
272 | result = XtGeometryAlmost; | ||
273 | reply_return->width = INITIAL_WIDTH; | ||
274 | reply_return->request_mode &= CWWidth; | ||
275 | } | ||
276 | else | ||
277 | result = XtGeometryYes; | ||
278 | } | ||
279 | |||
280 | return result; | ||
281 | } | ||
282 | |||
283 | /* Actually layout the scrollBox */ | ||
284 | |||
285 | static void Resize(Widget w) | ||
286 | { | ||
287 | DoLayout(w, True); | ||
288 | } | ||
289 | |||
290 | static void ChangeManaged(Widget w) | ||
291 | { | ||
292 | DoLayout(w, True); | ||
293 | } | ||
294 | |||
295 | static void Initialize(Widget request, Widget new, | ||
296 | ArgList args, Cardinal *num_args) | ||
297 | { | ||
298 | ScrollBoxWidget newsbw = (ScrollBoxWidget)new; | ||
299 | |||
300 | if (newsbw->core.width == 0) | ||
301 | newsbw->core.width = INITIAL_WIDTH; | ||
302 | |||
303 | if (newsbw->core.height == 0) | ||
304 | newsbw->core.height = INITIAL_HEIGHT; | ||
305 | |||
306 | } | ||
307 | |||
308 | static Boolean SetValues(Widget current, Widget request, Widget new, | ||
309 | ArgList args, Cardinal *num_args) | ||
310 | { | ||
311 | ScrollBoxWidget sbwcurrent = (ScrollBoxWidget)current; | ||
312 | ScrollBoxWidget sbwnew = (ScrollBoxWidget)new; | ||
313 | |||
314 | /* need to relayout if h_space or v_space change */ | ||
315 | |||
316 | if ((sbwnew->scrollBox.h_space != sbwcurrent->scrollBox.h_space) || | ||
317 | (sbwnew->scrollBox.v_space != sbwcurrent->scrollBox.v_space)) | ||
318 | DoLayout(new, True); | ||
319 | |||
320 | return False; | ||
321 | } |
File x11/ScrollBox.h added (mode: 100644) (index 00000000..58258627) | |||
1 | /* | ||
2 | * Copyright 1989 O'Reilly and Associates, Inc. | ||
3 | |||
4 | The X Consortium, and any party obtaining a copy of these files from | ||
5 | the X Consortium, directly or indirectly, is granted, free of charge, a | ||
6 | full and unrestricted irrevocable, world-wide, paid up, royalty-free, | ||
7 | nonexclusive right and license to deal in this software and | ||
8 | documentation files (the "Software"), including without limitation the | ||
9 | rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | and/or sell copies of the Software, and to permit persons who receive | ||
11 | copies from any such party to do so. This license includes without | ||
12 | limitation a license to do the foregoing actions under any patents of | ||
13 | the party supplying this software to the X Consortium. | ||
14 | |||
15 | $Id: ScrollBox.h,v 1.4 2008/07/14 04:24:52 wmcbrine Exp $ | ||
16 | */ | ||
17 | |||
18 | #ifndef _XORAscrollBox_h | ||
19 | #define _XORAscrollBox_h | ||
20 | |||
21 | /************************************************************************ | ||
22 | * * | ||
23 | * scrollBox Widget (subclass of CompositeClass) * | ||
24 | * * | ||
25 | ************************************************************************/ | ||
26 | |||
27 | /* Parameters: | ||
28 | |||
29 | Name Class RepType Default Value | ||
30 | ---- ----- ------- ------------- | ||
31 | background Background Pixel XtDefaultBackground | ||
32 | border BorderColor Pixel XtDefaultForeground | ||
33 | borderWidth BorderWidth Dimension 1 | ||
34 | destroyCallback Callback Pointer NULL | ||
35 | hSpace HSpace Dimension 4 | ||
36 | height Height Dimension 0 | ||
37 | mappedWhenManaged MappedWhenManaged Boolean True | ||
38 | vSpace VSpace Dimension 4 | ||
39 | width Width Dimension 0 | ||
40 | x Position Position 0 | ||
41 | y Position Position 0 | ||
42 | |||
43 | */ | ||
44 | |||
45 | |||
46 | /* Class record constants */ | ||
47 | |||
48 | extern WidgetClass scrollBoxWidgetClass; | ||
49 | |||
50 | typedef struct _ScrollBoxClassRec *ScrollBoxWidgetClass; | ||
51 | typedef struct _ScrollBoxRec *ScrollBoxWidget; | ||
52 | |||
53 | #endif /* _XORAscrollBox_h */ |
File x11/ScrollBoxP.h added (mode: 100644) (index 00000000..069666da) | |||
1 | /* | ||
2 | * Copyright 1989 O'Reilly and Associates, Inc. | ||
3 | |||
4 | The X Consortium, and any party obtaining a copy of these files from | ||
5 | the X Consortium, directly or indirectly, is granted, free of charge, a | ||
6 | full and unrestricted irrevocable, world-wide, paid up, royalty-free, | ||
7 | nonexclusive right and license to deal in this software and | ||
8 | documentation files (the "Software"), including without limitation the | ||
9 | rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | and/or sell copies of the Software, and to permit persons who receive | ||
11 | copies from any such party to do so. This license includes without | ||
12 | limitation a license to do the foregoing actions under any patents of | ||
13 | the party supplying this software to the X Consortium. | ||
14 | |||
15 | $Id: ScrollBoxP.h,v 1.5 2008/07/14 04:24:52 wmcbrine Exp $ | ||
16 | */ | ||
17 | |||
18 | /* | ||
19 | * scrollBoxP.h - Private definitions for scrollBox widget | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef _XORAscrollBoxP_h | ||
24 | #define _XORAscrollBoxP_h | ||
25 | |||
26 | /************************************************************************ | ||
27 | * * | ||
28 | * scrollBox Widget Private Data * | ||
29 | * * | ||
30 | ************************************************************************/ | ||
31 | |||
32 | #include "x11/ScrollBox.h" | ||
33 | |||
34 | #include <X11/CompositeP.h> | ||
35 | |||
36 | /* New fields for the scrollBox widget class record */ | ||
37 | typedef struct _ScrollBoxClass { | ||
38 | int empty; | ||
39 | } ScrollBoxClassPart; | ||
40 | |||
41 | /* Full class record declaration */ | ||
42 | typedef struct _ScrollBoxClassRec { | ||
43 | CoreClassPart core_class; | ||
44 | CompositeClassPart composite_class; | ||
45 | ScrollBoxClassPart scrollBox_class; | ||
46 | } ScrollBoxClassRec; | ||
47 | |||
48 | extern ScrollBoxClassRec scrollBoxClassRec; | ||
49 | |||
50 | /* New fields for the scrollBox widget record */ | ||
51 | typedef struct { | ||
52 | Dimension h_space, v_space; | ||
53 | Dimension preferred_width, preferred_height; | ||
54 | Dimension last_query_width, last_query_height; | ||
55 | Dimension increment_width, increment_height; | ||
56 | XtGeometryMask last_query_mode; | ||
57 | } ScrollBoxPart; | ||
58 | |||
59 | |||
60 | /************************************************************************ | ||
61 | * * | ||
62 | * Full instance record declaration * | ||
63 | * * | ||
64 | ************************************************************************/ | ||
65 | |||
66 | typedef struct _ScrollBoxRec { | ||
67 | CorePart core; | ||
68 | CompositePart composite; | ||
69 | ScrollBoxPart scrollBox; | ||
70 | } ScrollBoxRec; | ||
71 | |||
72 | #endif /* _XORAscrollBoxP_h */ |
File x11/big_icon.xbm added (mode: 100644) (index 00000000..04b98a5b) | |||
1 | #define big_icon_width 64 | ||
2 | #define big_icon_height 64 | ||
3 | static unsigned char big_icon_bits[] = { | ||
4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, | ||
9 | 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xc1, 0x03, 0x00, 0x00, | ||
10 | 0x00, 0x00, 0xf0, 0xff, 0xc3, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, | ||
11 | 0xc3, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0xc7, 0x03, 0x00, 0x00, | ||
12 | 0x00, 0x00, 0xf0, 0x80, 0xc7, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x80, | ||
13 | 0xc7, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x80, 0xc7, 0x03, 0x00, 0x00, | ||
14 | 0x00, 0x00, 0xf0, 0x80, 0xc7, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, | ||
15 | 0xc7, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe0, 0xc3, 0x03, 0x00, 0x00, | ||
16 | 0x00, 0x00, 0xf0, 0xf0, 0xe3, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, | ||
17 | 0xf1, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xfc, 0xf8, 0x03, 0x00, 0x00, | ||
18 | 0x00, 0x00, 0xf0, 0x7e, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, | ||
19 | 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0xff, 0x03, 0x00, 0x00, | ||
20 | 0x00, 0x00, 0xf0, 0x8f, 0xdf, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc7, | ||
21 | 0xcf, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe3, 0xc7, 0x03, 0x00, 0x00, | ||
22 | 0x00, 0x00, 0xf0, 0xf1, 0xc3, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, | ||
23 | 0xc1, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xc0, 0x03, 0x00, 0x00, | ||
24 | 0x00, 0x00, 0xf0, 0x78, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, | ||
25 | 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x78, 0xc0, 0x03, 0x00, 0x00, | ||
26 | 0x00, 0x00, 0xf0, 0x78, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, | ||
27 | 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x03, 0x00, 0x00, | ||
28 | 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe0, | ||
29 | 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0xff, 0x03, 0x00, 0x00, | ||
30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x23, 0x50, 0x1e, | ||
33 | 0x7c, 0xf0, 0xe0, 0x03, 0x60, 0x26, 0x50, 0x33, 0xc6, 0x98, 0x31, 0x06, | ||
34 | 0x30, 0x2c, 0xd0, 0x61, 0x83, 0x0d, 0x1b, 0x0c, 0x10, 0x28, 0xd0, 0x40, | ||
35 | 0x01, 0x05, 0x0a, 0x08, 0x10, 0x20, 0x50, 0x00, 0x01, 0x05, 0x0a, 0x08, | ||
36 | 0x10, 0x20, 0x50, 0x00, 0x03, 0x04, 0x1a, 0x00, 0x10, 0x20, 0x50, 0x00, | ||
37 | 0x06, 0x04, 0x32, 0x00, 0x10, 0x20, 0x50, 0x00, 0x7c, 0xfc, 0xe3, 0x03, | ||
38 | 0x10, 0x20, 0x50, 0x00, 0xc0, 0x04, 0x00, 0x06, 0x10, 0x20, 0x50, 0x00, | ||
39 | 0x80, 0x05, 0x00, 0x0c, 0x10, 0x20, 0x50, 0x00, 0x01, 0x05, 0x0a, 0x08, | ||
40 | 0x10, 0x28, 0x50, 0x00, 0x01, 0x05, 0x0a, 0x08, 0x30, 0x6c, 0x58, 0x00, | ||
41 | 0x83, 0x0d, 0x1b, 0x0c, 0x60, 0xc6, 0x4c, 0x00, 0xc6, 0x98, 0x31, 0x06, | ||
42 | 0xc0, 0x83, 0x47, 0x00, 0x7c, 0xf0, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, | ||
43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
File x11/compose.h added (mode: 100644) (index 00000000..12b85fa1) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: compose.h,v 1.3 2008/07/14 04:24:52 wmcbrine Exp $ */ | ||
4 | |||
5 | /* Tables and variables for the built-in compose key system. This file | ||
6 | is not included when PDCurses is built with XIM support. */ | ||
7 | |||
8 | #define MAX_COMPOSE_CHARS 14 | ||
9 | #define MAX_COMPOSE_PRE 60 | ||
10 | |||
11 | static const char *compose_chars = | ||
12 | "`'~^,/\"AaPpSs!?0123CcRr-_<>Xx.=Yy |EeIiOoUu+NnLlgDd:*TtMmVv"; | ||
13 | |||
14 | /* | ||
15 | ` : À È Ì Ò Ù à è ì ò ù | ||
16 | ' : ´ Á É Í Ó Ú Ý á é í ó ú ý ´ | ||
17 | ~ : Ã Ñ Õ ã ñ õ | ||
18 | ^ : Â Ê Î Ô Û â ê î ô û ° ¹ ² ³ | ||
19 | , : ¸ Ç ç ¸ | ||
20 | / : Ø ø µ µ | ||
21 | " : ¨ Ä Ë Ï Ö Ü ä ë ï ö ü ÿ ¨ | ||
22 | A : Æ À Á Ã Â Å Å Ã Â ª | ||
23 | a : æ à á ã â å å ã â ª | ||
24 | P : Þ ¶ ¶ | ||
25 | p : þ ¶ ¶ | ||
26 | S : § § § º ª | ||
27 | s : ß § ª ¹ ² ³ º § | ||
28 | ! : ¡ ¡ | ||
29 | ? : ¿ ¿ | ||
30 | 0 : ° ° | ||
31 | 1 : ¹ ½ ¼ ¹ | ||
32 | 2 : ² ² | ||
33 | 3 : ³ ¾ ³ | ||
34 | C : © Ç ¢ ¢ | ||
35 | c : ¢ © ç ¢ ¢ | ||
36 | R : ® | ||
37 | r : ® | ||
38 | - : ± ¬ ¯ ÷ | ||
39 | _ : ¯ ¯ | ||
40 | < : « | ||
41 | > : « | ||
42 | X : ¤ × | ||
43 | x : × ¤ × | ||
44 | . : · · · | ||
45 | = : ¥ ¥ | ||
46 | Y : ¥ Ý ¥ | ||
47 | y : ¥ ý ÿ ¥ ¥ | ||
48 | : | ||
49 | | : ¦ ¢ ¦ Þ þ ¦ £ | ||
50 | E : È É Ê Ë Ê | ||
51 | e : è é ê ë ê | ||
52 | I : Ì Í Î Ï Î | ||
53 | i : ì í î ï î | ||
54 | O : Ò Ó Ô Õ Ö Ø © ® Õ Ô Å å | ||
55 | o : ° Å å ¤ õ ò ó ô õ ö ø ô º | ||
56 | U : Ù Ú Û Ü Û | ||
57 | u : ù ú û ü µ û | ||
58 | + : ± | ||
59 | N : Ñ Ñ ¬ | ||
60 | n : ñ ñ ¬ | ||
61 | L : £ £ £ | ||
62 | l : £ £ £ | ||
63 | g : ¤ | ||
64 | D : ° Ð | ||
65 | d : ° ð | ||
66 | : : ÷ | ||
67 | * : µ µ å Å | ||
68 | T : Þ | ||
69 | t : þ | ||
70 | M : × | ||
71 | m : × | ||
72 | V : ¦ | ||
73 | v : ¦ | ||
74 | */ | ||
75 | |||
76 | static const char compose_lookups[MAX_COMPOSE_PRE][MAX_COMPOSE_CHARS] = | ||
77 | { | ||
78 | /* ` */ {'A','E','I','O','U','a','e','i','o','u', 0, 0, 0, 0}, | ||
79 | /* ' */ {' ','A','E','I','O','U','Y','a','e','i','o','u','y', 39}, | ||
80 | /* ~ */ {'A','N','O','a','n','o', 0, 0, 0, 0, 0, 0, 0, 0}, | ||
81 | /* ^ */ {'A','E','I','O','U','a','e','i','o','u','0','1','2','3'}, | ||
82 | /* , */ {' ','C','c',',', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
83 | /* / */ {'O','o','u','U', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
84 | /* " */ {' ','A','E','I','O','U','a','e','i','o','u','y','\"', 0}, | ||
85 | /* A */ {'E','`', 39,'~','^','"','o','*','-','>','_', 0, 0, 0}, | ||
86 | /* a */ {'e','`', 39,'~','^','"','o','*','-','>','_', 0, 0, 0}, | ||
87 | /* P */ {' ','G','!', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
88 | /* p */ {' ','g','!', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
89 | /* S */ {'S','!','O','0','A', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
90 | /* s */ {'s','!','a','1','2','3','0','o', 0, 0, 0, 0, 0, 0}, | ||
91 | /* ! */ {' ','!', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
92 | /* ? */ {' ','?', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
93 | /* 0 */ {'^','*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
94 | /* 1 */ {' ','2','4','^', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
95 | /* 2 */ {' ','^', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
96 | /* 3 */ {' ','4','^', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
97 | /* C */ {'O',',','$','|', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
98 | /* c */ {'|','o',',','/','$', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
99 | /* R */ {'O', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
100 | /* r */ {'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
101 | /* - */ {' ','+',',','-','^',':', 0, 0, 0, 0, 0, 0, 0, 0}, | ||
102 | /* _ */ {'_','^', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
103 | /* < */ {'<', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
104 | /* > */ {'>', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
105 | /* X */ {'O','X', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
106 | /* x */ {' ','o','x', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
107 | /* . */ {' ','^','.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
108 | /* = */ {'Y','y', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
109 | /* Y */ {'=', 39,'-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
110 | /* y */ {'=', 39,'"','$','-', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
111 | /* */ {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
112 | /* | */ {' ','c','|','P','p','^','-', 0, 0, 0, 0, 0, 0, 0}, | ||
113 | /* E */ {'`', 39,'^','"','>', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
114 | /* e */ {'`', 39,'^','"','>', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
115 | /* I */ {'`', 39,'^','"','>', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
116 | /* i */ {'`', 39,'^','"','>', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
117 | /* O */ {'`', 39,'^','~','"','/','C','R','-','>','A','a', 0, 0}, | ||
118 | /* o */ {' ','A','a','x','-','`', 39,'^','~','"','/','>','_', 0}, | ||
119 | /* U */ {'`', 39,'^','"','>', 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
120 | /* u */ {'`', 39,'^','"',' ','>', 0, 0, 0, 0, 0, 0, 0, 0}, | ||
121 | /* + */ {'-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
122 | /* N */ {'~','-','O', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
123 | /* n */ {'~','-','o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
124 | /* L */ {'$','=','-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
125 | /* l */ {'$','=','-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
126 | /* g */ {'$', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
127 | /* D */ {'E','-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
128 | /* d */ {'e','-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
129 | /* : */ {'-', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
130 | /* * */ {'m','M','a','A', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
131 | /* T */ {'H', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
132 | /* t */ {'h', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
133 | /* M */ {'U', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
134 | /* m */ {'u', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
135 | /* V */ {'B', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
136 | /* v */ {'b', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
137 | }; | ||
138 | |||
139 | static const unsigned char compose_keys[MAX_COMPOSE_PRE][MAX_COMPOSE_CHARS] = | ||
140 | { | ||
141 | /* ` */ {192,200,204,210,217,224,232,236,242,249, 0, 0, 0, 0}, | ||
142 | /* ' */ {180,193,201,205,211,218,221,225,233,237,243,250,253,180}, | ||
143 | /* ~ */ {195,209,213,227,241,245, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
144 | /* ^ */ {194,202,206,212,219,226,234,238,244,251,176,185,178,179}, | ||
145 | /* , */ {184,199,231,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
146 | /* / */ {216,248,181,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
147 | /* " */ {168,196,203,207,214,220,228,235,239,246,252,255,168, 0}, | ||
148 | /* A */ {198,192,193,195,194,196,197,197,195,194,170, 0, 0, 0}, | ||
149 | /* a */ {230,224,225,227,226,228,229,229,227,226,170, 0, 0, 0}, | ||
150 | /* P */ {222,182,182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
151 | /* p */ {254,182,182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
152 | /* S */ {167,167,167,186,170, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
153 | /* s */ {223,167,170,185,178,179,186,167, 0, 0, 0, 0, 0, 0}, | ||
154 | /* ! */ {161,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
155 | /* ? */ {191,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
156 | /* 0 */ {176,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
157 | /* 1 */ {185,189,188,185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
158 | /* 2 */ {178,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
159 | /* 3 */ {179,190,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
160 | /* C */ {169,199,162,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
161 | /* c */ {162,169,231,162,162, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
162 | /* R */ {174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
163 | /* r */ {174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
164 | /* - */ {173,177,172,173,175,247, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
165 | /* _ */ {175,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
166 | /* < */ {171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
167 | /* > */ {187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
168 | /* X */ {164,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
169 | /* x */ {215,164,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
170 | /* . */ {183,183,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
171 | /* = */ {165,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
172 | /* Y */ {165,221,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
173 | /* y */ {165,253,255,165,165, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
174 | /* */ {160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
175 | /* | */ {166,162,166,222,254,166,163, 0, 0, 0, 0, 0, 0, 0}, | ||
176 | /* E */ {200,201,202,203,202, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
177 | /* e */ {232,233,234,235,234, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
178 | /* I */ {204,205,206,207,206, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
179 | /* i */ {236,237,238,239,238, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
180 | /* O */ {210,211,212,213,214,216,169,174,213,212,197,229, 0, 0}, | ||
181 | /* o */ {176,197,229,164,245,242,243,244,245,246,248,244,186, 0}, | ||
182 | /* U */ {217,218,219,220,219, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
183 | /* u */ {249,250,251,252,181,251, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
184 | /* + */ {177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
185 | /* N */ {209,209,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
186 | /* n */ {241,241,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
187 | /* L */ {163,163,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
188 | /* l */ {163,163,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
189 | /* g */ {164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
190 | /* D */ {176,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
191 | /* d */ {176,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
192 | /* : */ {247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
193 | /* * */ {181,181,229,197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
194 | /* T */ {222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
195 | /* t */ {254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
196 | /* M */ {215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
197 | /* u */ {215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
198 | /* V */ {166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
199 | /* v */ {166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
200 | }; | ||
201 | |||
202 | static KeySym compose_key = 0; | ||
203 | static int compose_mask = 0; |
File x11/little_icon.xbm added (mode: 100644) (index 00000000..d3e777e8) | |||
1 | #define little_icon_width 32 | ||
2 | #define little_icon_height 32 | ||
3 | static unsigned char little_icon_bits[] = { | ||
4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
5 | 0x00, 0xfc, 0x30, 0x00, 0x00, 0xfc, 0x31, 0x00, 0x00, 0x8c, 0x33, 0x00, | ||
6 | 0x00, 0x0c, 0x33, 0x00, 0x00, 0x0c, 0x33, 0x00, 0x00, 0x8c, 0x33, 0x00, | ||
7 | 0x00, 0xcc, 0x39, 0x00, 0x00, 0xec, 0x3c, 0x00, 0x00, 0x7c, 0x3e, 0x00, | ||
8 | 0x00, 0x3c, 0x37, 0x00, 0x00, 0x9c, 0x33, 0x00, 0x00, 0xcc, 0x31, 0x00, | ||
9 | 0x00, 0xcc, 0x30, 0x00, 0x00, 0xcc, 0x30, 0x00, 0x00, 0xcc, 0x31, 0x00, | ||
10 | 0x00, 0x8c, 0x3f, 0x00, 0x00, 0x0c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
11 | 0x00, 0x00, 0x00, 0x00, 0x4c, 0x2a, 0xc6, 0x18, 0x52, 0x5a, 0x29, 0x25, | ||
12 | 0x42, 0x0a, 0x21, 0x05, 0x42, 0x0a, 0xe6, 0x18, 0x42, 0x0a, 0x28, 0x20, | ||
13 | 0x52, 0x0a, 0x29, 0x25, 0x8c, 0x09, 0xc6, 0x18, 0x00, 0x00, 0x00, 0x00, | ||
14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
File x11/ncurses_cfg.h added (mode: 100644) (index 00000000..42571180) | |||
1 | /* $Id: ncurses_cfg.h,v 1.8 2006/12/28 01:02:03 wmcbrine Exp $ | ||
2 | * | ||
3 | * This file is only used with the ncurses test programs. | ||
4 | * | ||
5 | * Have ncurses-5.6 unpacked in your $(HOME) (you don't need to build | ||
6 | * it), or edit ncurses_testdir appropriately in the Makefile. Configure | ||
7 | * and build PDCurses for X11. (Sorry, other ports won't work yet.) | ||
8 | * Change to this directory, and: | ||
9 | * | ||
10 | * "make ncurses_tests" to start. | ||
11 | * "make ncurses_clean" when you're done. | ||
12 | * | ||
13 | * Builds: bs gdc hanoi knight tclock ncurses | ||
14 | */ | ||
15 | |||
16 | #define NCURSES_MOUSE_VERSION 2 | ||
17 | |||
18 | #include "../config.h" | ||
19 | #include <curses.h> | ||
20 | |||
21 | #define ExitProgram exit | ||
22 | |||
23 | #define HAVE_CURSES_VERSION 1 | ||
24 | #define HAVE_GETBEGX 1 | ||
25 | #define HAVE_GETCURX 1 | ||
26 | #define HAVE_GETMAXX 1 | ||
27 | #define HAVE_GETNSTR 1 | ||
28 | #define HAVE_GETTIMEOFDAY 1 | ||
29 | #define HAVE_GETWIN 1 | ||
30 | #define HAVE_LIBPANEL 1 | ||
31 | #define HAVE_LOCALE_H 1 | ||
32 | #define HAVE_NAPMS 1 | ||
33 | #define HAVE_PANEL_H 1 | ||
34 | #define HAVE_PUTWIN 1 | ||
35 | #define HAVE_SLK_COLOR 1 | ||
36 | #define HAVE_SLK_INIT 1 | ||
37 | #define HAVE_WRESIZE 1 | ||
38 | |||
39 | #ifdef PDC_WIDE | ||
40 | # define USE_WIDEC_SUPPORT 1 | ||
41 | #endif | ||
42 | |||
43 | /* Fool ncurses.c so it gives us all the tests, and doesn't redefine | ||
44 | ACS_ chars | ||
45 | */ | ||
46 | |||
47 | #define NCURSES_VERSION PDCURSES |
File x11/pdcclip.c added (mode: 100644) (index 00000000..1a3ce92a) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcclip.c,v 1.35 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <stdlib.h> | ||
8 | |||
9 | /*man-start************************************************************** | ||
10 | |||
11 | Name: clipboard | ||
12 | |||
13 | Synopsis: | ||
14 | int PDC_getclipboard(char **contents, long *length); | ||
15 | int PDC_setclipboard(const char *contents, long length); | ||
16 | int PDC_freeclipboard(char *contents); | ||
17 | int PDC_clearclipboard(void); | ||
18 | |||
19 | Description: | ||
20 | PDC_getclipboard() gets the textual contents of the system's | ||
21 | clipboard. This function returns the contents of the clipboard | ||
22 | in the contents argument. It is the responsibilitiy of the | ||
23 | caller to free the memory returned, via PDC_freeclipboard(). | ||
24 | The length of the clipboard contents is returned in the length | ||
25 | argument. | ||
26 | |||
27 | PDC_setclipboard copies the supplied text into the system's | ||
28 | clipboard, emptying the clipboard prior to the copy. | ||
29 | |||
30 | PDC_clearclipboard() clears the internal clipboard. | ||
31 | |||
32 | Return Values: | ||
33 | indicator of success/failure of call. | ||
34 | PDC_CLIP_SUCCESS the call was successful | ||
35 | PDC_CLIP_MEMORY_ERROR unable to allocate sufficient memory for | ||
36 | the clipboard contents | ||
37 | PDC_CLIP_EMPTY the clipboard contains no text | ||
38 | PDC_CLIP_ACCESS_ERROR no clipboard support | ||
39 | |||
40 | Portability X/Open BSD SYS V | ||
41 | PDC_getclipboard - - - | ||
42 | PDC_setclipboard - - - | ||
43 | PDC_freeclipboard - - - | ||
44 | PDC_clearclipboard - - - | ||
45 | |||
46 | **man-end****************************************************************/ | ||
47 | |||
48 | int PDC_getclipboard(char **contents, long *length) | ||
49 | { | ||
50 | #ifdef PDC_WIDE | ||
51 | wchar_t *wcontents; | ||
52 | #endif | ||
53 | int result = 0; | ||
54 | int len; | ||
55 | |||
56 | PDC_LOG(("PDC_getclipboard() - called\n")); | ||
57 | |||
58 | XCursesInstructAndWait(CURSES_GET_SELECTION); | ||
59 | |||
60 | if (XC_read_socket(xc_display_sock, &result, sizeof(int)) < 0) | ||
61 | XCursesExitCursesProcess(5, "exiting from PDC_getclipboard"); | ||
62 | |||
63 | if (result == PDC_CLIP_SUCCESS) | ||
64 | { | ||
65 | if (XC_read_socket(xc_display_sock, &len, sizeof(int)) < 0) | ||
66 | XCursesExitCursesProcess(5, "exiting from PDC_getclipboard"); | ||
67 | #ifdef PDC_WIDE | ||
68 | wcontents = malloc((len + 1) * sizeof(wchar_t)); | ||
69 | *contents = malloc(len * 3 + 1); | ||
70 | |||
71 | if (!wcontents || !*contents) | ||
72 | #else | ||
73 | *contents = malloc(len + 1); | ||
74 | |||
75 | if (!*contents) | ||
76 | #endif | ||
77 | XCursesExitCursesProcess(6, "exiting from PDC_getclipboard - " | ||
78 | "synchronization error"); | ||
79 | |||
80 | if (len) | ||
81 | { | ||
82 | if (XC_read_socket(xc_display_sock, | ||
83 | #ifdef PDC_WIDE | ||
84 | wcontents, len * sizeof(wchar_t)) < 0) | ||
85 | #else | ||
86 | *contents, len) < 0) | ||
87 | #endif | ||
88 | XCursesExitCursesProcess(5, "exiting from PDC_getclipboard"); | ||
89 | } | ||
90 | |||
91 | #ifdef PDC_WIDE | ||
92 | wcontents[len] = 0; | ||
93 | len = PDC_wcstombs(*contents, wcontents, len * 3); | ||
94 | free(wcontents); | ||
95 | #endif | ||
96 | (*contents)[len] = '\0'; | ||
97 | *length = len; | ||
98 | } | ||
99 | |||
100 | return result; | ||
101 | } | ||
102 | |||
103 | int PDC_setclipboard(const char *contents, long length) | ||
104 | { | ||
105 | #ifdef PDC_WIDE | ||
106 | wchar_t *wcontents; | ||
107 | #endif | ||
108 | int rc; | ||
109 | |||
110 | PDC_LOG(("PDC_setclipboard() - called\n")); | ||
111 | |||
112 | #ifdef PDC_WIDE | ||
113 | wcontents = malloc((length + 1) * sizeof(wchar_t)); | ||
114 | if (!wcontents) | ||
115 | return PDC_CLIP_MEMORY_ERROR; | ||
116 | |||
117 | length = PDC_mbstowcs(wcontents, contents, length); | ||
118 | #endif | ||
119 | XCursesInstruct(CURSES_SET_SELECTION); | ||
120 | |||
121 | /* Write, then wait for X to do its stuff; expect return code. */ | ||
122 | |||
123 | if (XC_write_socket(xc_display_sock, &length, sizeof(long)) >= 0) | ||
124 | { | ||
125 | if (XC_write_socket(xc_display_sock, | ||
126 | #ifdef PDC_WIDE | ||
127 | wcontents, length * sizeof(wchar_t)) >= 0) | ||
128 | { | ||
129 | free(wcontents); | ||
130 | #else | ||
131 | contents, length) >= 0) | ||
132 | { | ||
133 | #endif | ||
134 | if (XC_read_socket(xc_display_sock, &rc, sizeof(int)) >= 0) | ||
135 | return rc; | ||
136 | } | ||
137 | } | ||
138 | |||
139 | XCursesExitCursesProcess(5, "exiting from PDC_setclipboard"); | ||
140 | |||
141 | return PDC_CLIP_ACCESS_ERROR; /* not reached */ | ||
142 | } | ||
143 | |||
144 | int PDC_freeclipboard(char *contents) | ||
145 | { | ||
146 | PDC_LOG(("PDC_freeclipboard() - called\n")); | ||
147 | |||
148 | free(contents); | ||
149 | return PDC_CLIP_SUCCESS; | ||
150 | } | ||
151 | |||
152 | int PDC_clearclipboard(void) | ||
153 | { | ||
154 | int rc; | ||
155 | long len = 0; | ||
156 | |||
157 | PDC_LOG(("PDC_clearclipboard() - called\n")); | ||
158 | |||
159 | XCursesInstruct(CURSES_CLEAR_SELECTION); | ||
160 | |||
161 | /* Write, then wait for X to do its stuff; expect return code. */ | ||
162 | |||
163 | if (XC_write_socket(xc_display_sock, &len, sizeof(long)) >= 0) | ||
164 | if (XC_read_socket(xc_display_sock, &rc, sizeof(int)) >= 0) | ||
165 | return rc; | ||
166 | |||
167 | XCursesExitCursesProcess(5, "exiting from PDC_clearclipboard"); | ||
168 | |||
169 | return PDC_CLIP_ACCESS_ERROR; /* not reached */ | ||
170 | } |
File x11/pdcdisp.c added (mode: 100644) (index 00000000..3700edb5) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcdisp.c,v 1.46 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <string.h> | ||
8 | |||
9 | #ifdef CHTYPE_LONG | ||
10 | |||
11 | # define A(x) ((chtype)x | A_ALTCHARSET) | ||
12 | |||
13 | chtype acs_map[128] = | ||
14 | { | ||
15 | A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9), A(10), | ||
16 | A(11), A(12), A(13), A(14), A(15), A(16), A(17), A(18), A(19), | ||
17 | A(20), A(21), A(22), A(23), A(24), A(25), A(26), A(27), A(28), | ||
18 | A(29), A(30), A(31), ' ', '!', '"', '#', '$', '%', '&', '\'', '(', | ||
19 | ')', '*', | ||
20 | |||
21 | # ifdef PDC_WIDE | ||
22 | 0x2192, 0x2190, 0x2191, 0x2193, | ||
23 | # else | ||
24 | '>', '<', '^', 'v', | ||
25 | # endif | ||
26 | |||
27 | '/', | ||
28 | |||
29 | # ifdef PDC_WIDE | ||
30 | 0x2588, | ||
31 | # else | ||
32 | A(0), | ||
33 | # endif | ||
34 | |||
35 | '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', | ||
36 | '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | ||
37 | 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | ||
38 | 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', | ||
39 | |||
40 | # ifdef PDC_WIDE | ||
41 | 0x2666, 0x2592, | ||
42 | # else | ||
43 | A(1), A(2), | ||
44 | # endif | ||
45 | |||
46 | 'b', 'c', 'd', 'e', | ||
47 | |||
48 | # ifdef PDC_WIDE | ||
49 | 0x00b0, 0x00b1, 0x2591, 0x00a4, 0x2518, 0x2510, 0x250c, 0x2514, | ||
50 | 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, | ||
51 | 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, | ||
52 | 0x00b7, | ||
53 | # else | ||
54 | A(7), A(8), '#', 0xa4, A(11), A(12), A(13), A(14), A(15), A(16), | ||
55 | A(17), A(18), A(19), A(20), A(21), A(22), A(23), A(24), A(25), | ||
56 | A(26), A(27), A(28), A(29), A(30), 0xb7, | ||
57 | # endif | ||
58 | |||
59 | A(127) | ||
60 | }; | ||
61 | |||
62 | # undef A | ||
63 | |||
64 | #endif | ||
65 | |||
66 | int PDC_display_cursor(int oldrow, int oldcol, int newrow, int newcol, | ||
67 | int visibility) | ||
68 | { | ||
69 | char buf[30]; | ||
70 | int idx, pos; | ||
71 | |||
72 | PDC_LOG(("%s:PDC_display_cursor() - called: NEW row %d col %d, vis %d\n", | ||
73 | XCLOGMSG, newrow, newcol, visibility)); | ||
74 | |||
75 | if (visibility == -1) | ||
76 | { | ||
77 | /* Only send the CURSES_DISPLAY_CURSOR message, no data */ | ||
78 | |||
79 | idx = CURSES_DISPLAY_CURSOR; | ||
80 | memcpy(buf, &idx, sizeof(int)); | ||
81 | idx = sizeof(int); | ||
82 | } | ||
83 | else | ||
84 | { | ||
85 | idx = CURSES_CURSOR; | ||
86 | memcpy(buf, &idx, sizeof(int)); | ||
87 | |||
88 | idx = sizeof(int); | ||
89 | pos = oldrow + (oldcol << 8); | ||
90 | memcpy(buf + idx, &pos, sizeof(int)); | ||
91 | |||
92 | idx += sizeof(int); | ||
93 | pos = newrow + (newcol << 8); | ||
94 | memcpy(buf + idx, &pos, sizeof(int)); | ||
95 | |||
96 | idx += sizeof(int); | ||
97 | } | ||
98 | |||
99 | if (XC_write_socket(xc_display_sock, buf, idx) < 0) | ||
100 | XCursesExitCursesProcess(1, "exiting from PDC_display_cursor"); | ||
101 | |||
102 | return OK; | ||
103 | } | ||
104 | |||
105 | /* position hardware cursor at (y, x) */ | ||
106 | |||
107 | void PDC_gotoyx(int row, int col) | ||
108 | { | ||
109 | PDC_LOG(("PDC_gotoyx() - called: row %d col %d\n", row, col)); | ||
110 | |||
111 | PDC_display_cursor(SP->cursrow, SP->curscol, row, col, SP->visibility); | ||
112 | } | ||
113 | |||
114 | /* update the given physical line to look like the corresponding line in | ||
115 | curscr */ | ||
116 | |||
117 | void PDC_transform_line(int lineno, int x, int len, const chtype *srcp) | ||
118 | { | ||
119 | PDC_LOG(("PDC_transform_line() - called: line %d\n", lineno)); | ||
120 | |||
121 | XC_get_line_lock(lineno); | ||
122 | |||
123 | memcpy(Xcurscr + XCURSCR_Y_OFF(lineno) + (x * sizeof(chtype)), srcp, | ||
124 | len * sizeof(chtype)); | ||
125 | |||
126 | *(Xcurscr + XCURSCR_START_OFF + lineno) = x; | ||
127 | *(Xcurscr + XCURSCR_LENGTH_OFF + lineno) = len; | ||
128 | |||
129 | XC_release_line_lock(lineno); | ||
130 | |||
131 | XCursesInstructAndWait(CURSES_REFRESH); | ||
132 | } |
File x11/pdcgetsc.c added (mode: 100644) (index 00000000..8f7c0ad9) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcgetsc.c,v 1.26 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /* return width of screen/viewport */ | ||
8 | |||
9 | int PDC_get_columns(void) | ||
10 | { | ||
11 | PDC_LOG(("PDC_get_columns() - called\n")); | ||
12 | |||
13 | return XCursesCOLS; | ||
14 | } | ||
15 | |||
16 | /* get the cursor size/shape */ | ||
17 | |||
18 | int PDC_get_cursor_mode(void) | ||
19 | { | ||
20 | return 0; | ||
21 | } | ||
22 | |||
23 | /* return number of screen rows */ | ||
24 | |||
25 | int PDC_get_rows(void) | ||
26 | { | ||
27 | PDC_LOG(("PDC_get_rows() - called\n")); | ||
28 | |||
29 | return XCursesLINES; | ||
30 | } |
File x11/pdckbd.c added (mode: 100644) (index 00000000..30c37a87) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdckbd.c,v 1.62 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: pdckbd | ||
10 | |||
11 | Synopsis: | ||
12 | unsigned long PDC_get_input_fd(void); | ||
13 | |||
14 | Description: | ||
15 | PDC_get_input_fd() returns the file descriptor that PDCurses | ||
16 | reads its input from. It can be used for select(). | ||
17 | |||
18 | Portability X/Open BSD SYS V | ||
19 | PDC_get_input_fd - - - | ||
20 | |||
21 | **man-end****************************************************************/ | ||
22 | |||
23 | /* check if a key or mouse event is waiting */ | ||
24 | |||
25 | bool PDC_check_key(void) | ||
26 | { | ||
27 | struct timeval socket_timeout = {0}; | ||
28 | int s; | ||
29 | |||
30 | /* Is something ready to be read on the socket ? Must be a key. */ | ||
31 | |||
32 | FD_ZERO(&xc_readfds); | ||
33 | FD_SET(xc_key_sock, &xc_readfds); | ||
34 | |||
35 | if ((s = select(FD_SETSIZE, (FD_SET_CAST)&xc_readfds, NULL, | ||
36 | NULL, &socket_timeout)) < 0) | ||
37 | XCursesExitCursesProcess(3, "child - exiting from " | ||
38 | "PDC_check_key select failed"); | ||
39 | |||
40 | PDC_LOG(("%s:PDC_check_key() - returning %s\n", XCLOGMSG, | ||
41 | s ? "TRUE" : "FALSE")); | ||
42 | |||
43 | return !!s; | ||
44 | } | ||
45 | |||
46 | /* return the next available key or mouse event */ | ||
47 | |||
48 | int PDC_get_key(void) | ||
49 | { | ||
50 | unsigned long newkey = 0; | ||
51 | int key = 0; | ||
52 | |||
53 | if (XC_read_socket(xc_key_sock, &newkey, sizeof(unsigned long)) < 0) | ||
54 | XCursesExitCursesProcess(2, "exiting from PDC_get_key"); | ||
55 | |||
56 | pdc_key_modifiers = (newkey >> 24) & 0xFF; | ||
57 | key = (int)(newkey & 0x00FFFFFF); | ||
58 | |||
59 | if (key == KEY_MOUSE && SP->key_code) | ||
60 | { | ||
61 | if (XC_read_socket(xc_key_sock, &pdc_mouse_status, | ||
62 | sizeof(MOUSE_STATUS)) < 0) | ||
63 | XCursesExitCursesProcess(2, "exiting from PDC_get_key"); | ||
64 | } | ||
65 | |||
66 | PDC_LOG(("%s:PDC_get_key() - key %d returned\n", XCLOGMSG, key)); | ||
67 | |||
68 | return key; | ||
69 | } | ||
70 | |||
71 | unsigned long PDC_get_input_fd(void) | ||
72 | { | ||
73 | PDC_LOG(("PDC_get_input_fd() - called\n")); | ||
74 | |||
75 | return xc_key_sock; | ||
76 | } | ||
77 | |||
78 | void PDC_set_keyboard_binary(bool on) | ||
79 | { | ||
80 | PDC_LOG(("PDC_set_keyboard_binary() - called\n")); | ||
81 | } | ||
82 | |||
83 | /* discard any pending keyboard or mouse input -- this is the core | ||
84 | routine for flushinp() */ | ||
85 | |||
86 | void PDC_flushinp(void) | ||
87 | { | ||
88 | PDC_LOG(("PDC_flushinp() - called\n")); | ||
89 | |||
90 | while (PDC_check_key()) | ||
91 | PDC_get_key(); | ||
92 | } | ||
93 | |||
94 | int PDC_mouse_set(void) | ||
95 | { | ||
96 | return OK; | ||
97 | } | ||
98 | |||
99 | int PDC_modifiers_set(void) | ||
100 | { | ||
101 | return OK; | ||
102 | } |
File x11/pdcscrn.c added (mode: 100644) (index 00000000..07b1a042) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcscrn.c,v 1.55 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /* COLOR_PAIR to attribute encoding table. */ | ||
8 | |||
9 | short *xc_atrtab = (short *)NULL; | ||
10 | |||
11 | /* close the physical screen */ | ||
12 | |||
13 | void PDC_scr_close(void) | ||
14 | { | ||
15 | PDC_LOG(("PDC_scr_close() - called\n")); | ||
16 | } | ||
17 | |||
18 | void PDC_scr_free(void) | ||
19 | { | ||
20 | XCursesExit(); | ||
21 | |||
22 | xc_atrtab = (short *)NULL; | ||
23 | } | ||
24 | |||
25 | /* open the physical screen -- allocate SP, miscellaneous intialization */ | ||
26 | |||
27 | int PDC_scr_open(int argc, char **argv) | ||
28 | { | ||
29 | extern bool sb_started; | ||
30 | |||
31 | PDC_LOG(("PDC_scr_open() - called\n")); | ||
32 | |||
33 | if ((XCursesInitscr(argc, argv) == ERR) || !SP) | ||
34 | return ERR; | ||
35 | |||
36 | SP->cursrow = SP->curscol = 0; | ||
37 | SP->orig_attr = FALSE; | ||
38 | SP->sb_on = sb_started; | ||
39 | SP->sb_total_y = 0; | ||
40 | SP->sb_viewport_y = 0; | ||
41 | SP->sb_cur_y = 0; | ||
42 | SP->sb_total_x = 0; | ||
43 | SP->sb_viewport_x = 0; | ||
44 | SP->sb_cur_x = 0; | ||
45 | |||
46 | return OK; | ||
47 | } | ||
48 | |||
49 | /* the core of resize_term() */ | ||
50 | |||
51 | int PDC_resize_screen(int nlines, int ncols) | ||
52 | { | ||
53 | PDC_LOG(("PDC_resize_screen() - called. Lines: %d Cols: %d\n", | ||
54 | nlines, ncols)); | ||
55 | |||
56 | if (nlines || ncols || !SP->resized) | ||
57 | return ERR; | ||
58 | |||
59 | shmdt((char *)Xcurscr); | ||
60 | XCursesInstructAndWait(CURSES_RESIZE); | ||
61 | |||
62 | if ((shmid_Xcurscr = shmget(shmkey_Xcurscr, | ||
63 | SP->XcurscrSize + XCURSESSHMMIN, 0700)) < 0) | ||
64 | { | ||
65 | perror("Cannot allocate shared memory for curscr"); | ||
66 | kill(xc_otherpid, SIGKILL); | ||
67 | return ERR; | ||
68 | } | ||
69 | |||
70 | XCursesLINES = SP->lines; | ||
71 | XCursesCOLS = SP->cols; | ||
72 | |||
73 | PDC_LOG(("%s:shmid_Xcurscr %d shmkey_Xcurscr %d SP->lines %d " | ||
74 | "SP->cols %d\n", XCLOGMSG, shmid_Xcurscr, | ||
75 | shmkey_Xcurscr, SP->lines, SP->cols)); | ||
76 | |||
77 | Xcurscr = (unsigned char*)shmat(shmid_Xcurscr, 0, 0); | ||
78 | xc_atrtab = (short *)(Xcurscr + XCURSCR_ATRTAB_OFF); | ||
79 | |||
80 | SP->resized = FALSE; | ||
81 | |||
82 | return OK; | ||
83 | } | ||
84 | |||
85 | void PDC_reset_prog_mode(void) | ||
86 | { | ||
87 | PDC_LOG(("PDC_reset_prog_mode() - called.\n")); | ||
88 | } | ||
89 | |||
90 | void PDC_reset_shell_mode(void) | ||
91 | { | ||
92 | PDC_LOG(("PDC_reset_shell_mode() - called.\n")); | ||
93 | } | ||
94 | |||
95 | void PDC_restore_screen_mode(int i) | ||
96 | { | ||
97 | } | ||
98 | |||
99 | void PDC_save_screen_mode(int i) | ||
100 | { | ||
101 | } | ||
102 | |||
103 | void PDC_init_pair(short pair, short fg, short bg) | ||
104 | { | ||
105 | xc_atrtab[pair * 2] = fg; | ||
106 | xc_atrtab[pair * 2 + 1] = bg; | ||
107 | } | ||
108 | |||
109 | int PDC_pair_content(short pair, short *fg, short *bg) | ||
110 | { | ||
111 | *fg = xc_atrtab[pair * 2]; | ||
112 | *bg = xc_atrtab[pair * 2 + 1]; | ||
113 | |||
114 | return OK; | ||
115 | } | ||
116 | |||
117 | bool PDC_can_change_color(void) | ||
118 | { | ||
119 | return TRUE; | ||
120 | } | ||
121 | |||
122 | int PDC_color_content(short color, short *red, short *green, short *blue) | ||
123 | { | ||
124 | XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); | ||
125 | |||
126 | tmp->pixel = color; | ||
127 | |||
128 | XCursesInstructAndWait(CURSES_GET_COLOR); | ||
129 | |||
130 | *red = ((double)(tmp->red) * 1000 / 65535) + 0.5; | ||
131 | *green = ((double)(tmp->green) * 1000 / 65535) + 0.5; | ||
132 | *blue = ((double)(tmp->blue) * 1000 / 65535) + 0.5; | ||
133 | |||
134 | return OK; | ||
135 | } | ||
136 | |||
137 | int PDC_init_color(short color, short red, short green, short blue) | ||
138 | { | ||
139 | XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); | ||
140 | |||
141 | tmp->pixel = color; | ||
142 | |||
143 | tmp->red = ((double)red * 65535 / 1000) + 0.5; | ||
144 | tmp->green = ((double)green * 65535 / 1000) + 0.5; | ||
145 | tmp->blue = ((double)blue * 65535 / 1000) + 0.5; | ||
146 | |||
147 | XCursesInstructAndWait(CURSES_SET_COLOR); | ||
148 | |||
149 | return OK; | ||
150 | } |
File x11/pdcsetsc.c added (mode: 100644) (index 00000000..395060e8) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcsetsc.c,v 1.33 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <string.h> | ||
8 | |||
9 | /*man-start************************************************************** | ||
10 | |||
11 | Name: pdcsetsc | ||
12 | |||
13 | Synopsis: | ||
14 | int PDC_set_blink(bool blinkon); | ||
15 | void PDC_set_title(const char *title); | ||
16 | |||
17 | Description: | ||
18 | PDC_set_blink() toggles whether the A_BLINK attribute sets an | ||
19 | actual blink mode (TRUE), or sets the background color to high | ||
20 | intensity (FALSE). The default is platform-dependent (FALSE in | ||
21 | most cases). It returns OK if it could set the state to match | ||
22 | the given parameter, ERR otherwise. Current platforms also | ||
23 | adjust the value of COLORS according to this function -- 16 for | ||
24 | FALSE, and 8 for TRUE. | ||
25 | |||
26 | PDC_set_title() sets the title of the window in which the curses | ||
27 | program is running. This function may not do anything on some | ||
28 | platforms. (Currently it only works in Win32 and X11.) | ||
29 | |||
30 | Portability X/Open BSD SYS V | ||
31 | PDC_set_blink - - - | ||
32 | PDC_set_title - - - | ||
33 | |||
34 | **man-end****************************************************************/ | ||
35 | |||
36 | int PDC_curs_set(int visibility) | ||
37 | { | ||
38 | int ret_vis = SP->visibility; | ||
39 | |||
40 | PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); | ||
41 | |||
42 | if (visibility != -1) | ||
43 | SP->visibility = visibility; | ||
44 | |||
45 | PDC_display_cursor(SP->cursrow, SP->curscol, SP->cursrow, | ||
46 | SP->curscol, visibility); | ||
47 | |||
48 | return ret_vis; | ||
49 | } | ||
50 | |||
51 | void PDC_set_title(const char *title) | ||
52 | { | ||
53 | int len; | ||
54 | |||
55 | PDC_LOG(("PDC_set_title() - called:<%s>\n", title)); | ||
56 | |||
57 | len = strlen(title) + 1; /* write nul character */ | ||
58 | |||
59 | XCursesInstruct(CURSES_TITLE); | ||
60 | |||
61 | if (XC_write_display_socket_int(len) >= 0) | ||
62 | if (XC_write_socket(xc_display_sock, title, len) >= 0) | ||
63 | return; | ||
64 | |||
65 | XCursesExitCursesProcess(1, "exiting from PDC_set_title"); | ||
66 | } | ||
67 | |||
68 | int PDC_set_blink(bool blinkon) | ||
69 | { | ||
70 | if (pdc_color_started) | ||
71 | COLORS = 16; | ||
72 | |||
73 | return blinkon ? ERR : OK; | ||
74 | } |
File x11/pdcutil.c added (mode: 100644) (index 00000000..5b5109f8) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcutil.c,v 1.10 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #if defined(HAVE_POLL) && !defined(HAVE_USLEEP) | ||
8 | # include <poll.h> | ||
9 | #endif | ||
10 | |||
11 | void PDC_beep(void) | ||
12 | { | ||
13 | PDC_LOG(("PDC_beep() - called\n")); | ||
14 | |||
15 | XCursesInstruct(CURSES_BELL); | ||
16 | } | ||
17 | |||
18 | void PDC_napms(int ms) | ||
19 | { | ||
20 | PDC_LOG(("PDC_napms() - called: ms=%d\n", ms)); | ||
21 | |||
22 | #if defined(HAVE_USLEEP) | ||
23 | |||
24 | usleep(1000 * ms); | ||
25 | |||
26 | #elif defined(HAVE_POLL) | ||
27 | { | ||
28 | struct pollfd fd; | ||
29 | fd.fd = -1; | ||
30 | fd.events = 0; | ||
31 | poll(&fd, 1, ms); | ||
32 | } | ||
33 | #endif | ||
34 | } | ||
35 | |||
36 | const char *PDC_sysname(void) | ||
37 | { | ||
38 | return "X11"; | ||
39 | } |
File x11/pdcx11.c added (mode: 100644) (index 00000000..1e8d0d16) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: pdcx11.c,v 1.96 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | #include <errno.h> | ||
8 | #include <stdlib.h> | ||
9 | |||
10 | /*** Functions that are called by both processes ***/ | ||
11 | |||
12 | unsigned char *Xcurscr; | ||
13 | |||
14 | int XCursesProcess = 1; | ||
15 | int shmidSP; | ||
16 | int shmid_Xcurscr; | ||
17 | int shmkeySP; | ||
18 | int shmkey_Xcurscr; | ||
19 | int xc_otherpid; | ||
20 | int XCursesLINES = 24; | ||
21 | int XCursesCOLS = 80; | ||
22 | int xc_display_sock; | ||
23 | int xc_key_sock; | ||
24 | int xc_display_sockets[2]; | ||
25 | int xc_key_sockets[2]; | ||
26 | int xc_exit_sock; | ||
27 | |||
28 | fd_set xc_readfds; | ||
29 | |||
30 | static void _dummy_function(void) | ||
31 | { | ||
32 | } | ||
33 | |||
34 | void XC_get_line_lock(int row) | ||
35 | { | ||
36 | /* loop until we can write to the line -- Patch by: | ||
37 | Georg Fuchs, georg.fuchs@rz.uni-regensburg.de */ | ||
38 | |||
39 | while (*(Xcurscr + XCURSCR_FLAG_OFF + row)) | ||
40 | _dummy_function(); | ||
41 | |||
42 | *(Xcurscr + XCURSCR_FLAG_OFF + row) = 1; | ||
43 | } | ||
44 | |||
45 | void XC_release_line_lock(int row) | ||
46 | { | ||
47 | *(Xcurscr + XCURSCR_FLAG_OFF + row) = 0; | ||
48 | } | ||
49 | |||
50 | int XC_write_socket(int sock_num, const void *buf, int len) | ||
51 | { | ||
52 | int start = 0, rc; | ||
53 | |||
54 | PDC_LOG(("%s:XC_write_socket called: sock_num %d len %d\n", | ||
55 | XCLOGMSG, sock_num, len)); | ||
56 | |||
57 | #ifdef MOUSE_DEBUG | ||
58 | if (sock_num == xc_key_sock) | ||
59 | printf("%s:XC_write_socket(key) len: %d\n", XCLOGMSG, len); | ||
60 | #endif | ||
61 | while (1) | ||
62 | { | ||
63 | rc = write(sock_num, buf + start, len); | ||
64 | |||
65 | if (rc < 0 || rc == len) | ||
66 | return rc; | ||
67 | |||
68 | len -= rc; | ||
69 | start = rc; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | int XC_read_socket(int sock_num, void *buf, int len) | ||
74 | { | ||
75 | int start = 0, length = len, rc; | ||
76 | |||
77 | PDC_LOG(("%s:XC_read_socket called: sock_num %d len %d\n", | ||
78 | XCLOGMSG, sock_num, len)); | ||
79 | |||
80 | while (1) | ||
81 | { | ||
82 | rc = read(sock_num, buf + start, length); | ||
83 | |||
84 | #ifdef MOUSE_DEBUG | ||
85 | if (sock_num == xc_key_sock) | ||
86 | printf("%s:XC_read_socket(key) rc %d errno %d " | ||
87 | "resized: %d\n", XCLOGMSG, rc, errno, SP->resized); | ||
88 | #endif | ||
89 | if (rc < 0 && sock_num == xc_key_sock && errno == EINTR | ||
90 | && SP->resized != FALSE) | ||
91 | { | ||
92 | MOUSE_LOG(("%s:continuing\n", XCLOGMSG)); | ||
93 | |||
94 | rc = 0; | ||
95 | |||
96 | if (SP->resized > 1) | ||
97 | SP->resized = TRUE; | ||
98 | else | ||
99 | SP->resized = FALSE; | ||
100 | |||
101 | memcpy(buf, &rc, sizeof(int)); | ||
102 | |||
103 | return 0; | ||
104 | } | ||
105 | |||
106 | if (rc <= 0 || rc == length) | ||
107 | return rc; | ||
108 | |||
109 | length -= rc; | ||
110 | start = rc; | ||
111 | } | ||
112 | } | ||
113 | |||
114 | int XC_write_display_socket_int(int x) | ||
115 | { | ||
116 | return XC_write_socket(xc_display_sock, &x, sizeof(int)); | ||
117 | } | ||
118 | |||
119 | #ifdef PDCDEBUG | ||
120 | void XC_say(const char *msg) | ||
121 | { | ||
122 | PDC_LOG(("%s:%s", XCLOGMSG, msg)); | ||
123 | } | ||
124 | #endif | ||
125 | |||
126 | /*** Functions that are called by the "curses" process ***/ | ||
127 | |||
128 | int XCursesInstruct(int flag) | ||
129 | { | ||
130 | PDC_LOG(("%s:XCursesInstruct() - called flag %d\n", XCLOGMSG, flag)); | ||
131 | |||
132 | /* Send a request to X */ | ||
133 | |||
134 | if (XC_write_display_socket_int(flag) < 0) | ||
135 | XCursesExitCursesProcess(4, "exiting from XCursesInstruct"); | ||
136 | |||
137 | return OK; | ||
138 | } | ||
139 | |||
140 | int XCursesInstructAndWait(int flag) | ||
141 | { | ||
142 | int result; | ||
143 | |||
144 | XC_LOG(("XCursesInstructAndWait() - called\n")); | ||
145 | |||
146 | /* tell X we want to do something */ | ||
147 | |||
148 | XCursesInstruct(flag); | ||
149 | |||
150 | /* wait for X to say the refresh has occurred*/ | ||
151 | |||
152 | if (XC_read_socket(xc_display_sock, &result, sizeof(int)) < 0) | ||
153 | XCursesExitCursesProcess(5, "exiting from XCursesInstructAndWait"); | ||
154 | |||
155 | if (result != CURSES_CONTINUE) | ||
156 | XCursesExitCursesProcess(6, "exiting from XCursesInstructAndWait" | ||
157 | " - synchronization error"); | ||
158 | |||
159 | return OK; | ||
160 | } | ||
161 | |||
162 | static int _setup_curses(void) | ||
163 | { | ||
164 | int wait_value; | ||
165 | |||
166 | XC_LOG(("_setup_curses called\n")); | ||
167 | |||
168 | close(xc_display_sockets[1]); | ||
169 | close(xc_key_sockets[1]); | ||
170 | |||
171 | xc_display_sock = xc_display_sockets[0]; | ||
172 | xc_key_sock = xc_key_sockets[0]; | ||
173 | |||
174 | FD_ZERO(&xc_readfds); | ||
175 | |||
176 | XC_read_socket(xc_display_sock, &wait_value, sizeof(int)); | ||
177 | |||
178 | if (wait_value != CURSES_CHILD) | ||
179 | return ERR; | ||
180 | |||
181 | /* Set LINES and COLS now so that the size of the shared memory | ||
182 | segment can be allocated */ | ||
183 | |||
184 | if ((shmidSP = shmget(shmkeySP, sizeof(SCREEN) + XCURSESSHMMIN, 0700)) < 0) | ||
185 | { | ||
186 | perror("Cannot allocate shared memory for SCREEN"); | ||
187 | kill(xc_otherpid, SIGKILL); | ||
188 | return ERR; | ||
189 | } | ||
190 | |||
191 | SP = (SCREEN*)shmat(shmidSP, 0, 0); | ||
192 | |||
193 | XCursesLINES = SP->lines; | ||
194 | LINES = XCursesLINES - SP->linesrippedoff - SP->slklines; | ||
195 | XCursesCOLS = COLS = SP->cols; | ||
196 | |||
197 | if ((shmid_Xcurscr = shmget(shmkey_Xcurscr, | ||
198 | SP->XcurscrSize + XCURSESSHMMIN, 0700)) < 0) | ||
199 | { | ||
200 | perror("Cannot allocate shared memory for curscr"); | ||
201 | kill(xc_otherpid, SIGKILL); | ||
202 | return ERR; | ||
203 | } | ||
204 | |||
205 | PDC_LOG(("%s:shmid_Xcurscr %d shmkey_Xcurscr %d LINES %d COLS %d\n", | ||
206 | XCLOGMSG, shmid_Xcurscr, shmkey_Xcurscr, LINES, COLS)); | ||
207 | |||
208 | Xcurscr = (unsigned char *)shmat(shmid_Xcurscr, 0, 0); | ||
209 | xc_atrtab = (short *)(Xcurscr + XCURSCR_ATRTAB_OFF); | ||
210 | |||
211 | XC_LOG(("cursesprocess exiting from Xinitscr\n")); | ||
212 | |||
213 | /* Always trap SIGWINCH if the C library supports SIGWINCH */ | ||
214 | |||
215 | XCursesSetSignal(SIGWINCH, XCursesSigwinchHandler); | ||
216 | |||
217 | atexit(XCursesExit); | ||
218 | |||
219 | return OK; | ||
220 | } | ||
221 | |||
222 | int XCursesInitscr(int argc, char *argv[]) | ||
223 | { | ||
224 | int pid, rc; | ||
225 | |||
226 | XC_LOG(("XCursesInitscr() - called\n")); | ||
227 | |||
228 | shmkeySP = getpid(); | ||
229 | |||
230 | if (socketpair(AF_UNIX, SOCK_STREAM, 0, xc_display_sockets) < 0) | ||
231 | { | ||
232 | fprintf(stderr, "ERROR: cannot create display socketpair\n"); | ||
233 | return ERR; | ||
234 | } | ||
235 | |||
236 | if (socketpair(AF_UNIX, SOCK_STREAM, 0, xc_key_sockets) < 0) | ||
237 | { | ||
238 | fprintf(stderr, "ERROR: cannot create key socketpair\n"); | ||
239 | return ERR; | ||
240 | } | ||
241 | |||
242 | pid = fork(); | ||
243 | |||
244 | switch(pid) | ||
245 | { | ||
246 | case -1: | ||
247 | fprintf(stderr, "ERROR: cannot fork()\n"); | ||
248 | return ERR; | ||
249 | break; | ||
250 | |||
251 | case 0: /* child */ | ||
252 | shmkey_Xcurscr = getpid(); | ||
253 | #ifdef XISPARENT | ||
254 | XCursesProcess = 0; | ||
255 | rc = _setup_curses(); | ||
256 | #else | ||
257 | XCursesProcess = 1; | ||
258 | xc_otherpid = getppid(); | ||
259 | rc = XCursesSetupX(argc, argv); | ||
260 | #endif | ||
261 | break; | ||
262 | |||
263 | default: /* parent */ | ||
264 | shmkey_Xcurscr = pid; | ||
265 | #ifdef XISPARENT | ||
266 | XCursesProcess = 1; | ||
267 | xc_otherpid = pid; | ||
268 | rc = XCursesSetupX(argc, argv); | ||
269 | #else | ||
270 | XCursesProcess = 0; | ||
271 | rc = _setup_curses(); | ||
272 | #endif | ||
273 | } | ||
274 | |||
275 | return rc; | ||
276 | } | ||
277 | |||
278 | static void _cleanup_curses_process(int rc) | ||
279 | { | ||
280 | PDC_LOG(("%s:_cleanup_curses_process() - called: %d\n", XCLOGMSG, rc)); | ||
281 | |||
282 | shutdown(xc_display_sock, 2); | ||
283 | close(xc_display_sock); | ||
284 | |||
285 | shutdown(xc_key_sock, 2); | ||
286 | close(xc_key_sock); | ||
287 | |||
288 | shmdt((char *)SP); | ||
289 | shmdt((char *)Xcurscr); | ||
290 | |||
291 | if (rc) | ||
292 | _exit(rc); | ||
293 | } | ||
294 | |||
295 | void XCursesExitCursesProcess(int rc, char *msg) | ||
296 | { | ||
297 | PDC_LOG(("%s:XCursesExitCursesProcess() - called: %d %s\n", | ||
298 | XCLOGMSG, rc, msg)); | ||
299 | |||
300 | endwin(); | ||
301 | _cleanup_curses_process(rc); | ||
302 | } | ||
303 | |||
304 | void XCursesExit(void) | ||
305 | { | ||
306 | static bool called = FALSE; | ||
307 | |||
308 | XC_LOG(("XCursesExit() - called\n")); | ||
309 | |||
310 | if (FALSE == called) | ||
311 | { | ||
312 | XCursesInstruct(CURSES_EXIT); | ||
313 | _cleanup_curses_process(0); | ||
314 | |||
315 | called = TRUE; | ||
316 | } | ||
317 | } |
File x11/pdcx11.h added (mode: 100644) (index 00000000..0b66c880) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | /* $Id: pdcx11.h,v 1.64 2008/07/14 04:24:52 wmcbrine Exp $ */ | ||
4 | |||
5 | #include <curspriv.h> | ||
6 | |||
7 | #ifdef HAVE_UNISTD_H | ||
8 | # include <unistd.h> | ||
9 | #endif | ||
10 | |||
11 | #include <signal.h> | ||
12 | #include <ctype.h> | ||
13 | #include <pwd.h> | ||
14 | |||
15 | #include <sys/types.h> | ||
16 | #include <sys/socket.h> | ||
17 | #ifdef HAVE_FCNTL_H | ||
18 | # include <fcntl.h> | ||
19 | #endif | ||
20 | #ifdef HAVE_SYS_SELECT_H | ||
21 | # include <sys/select.h> /* AIX needs this for FD_ZERO etc macros */ | ||
22 | #endif | ||
23 | #include <sys/ipc.h> | ||
24 | #include <sys/shm.h> | ||
25 | |||
26 | #ifdef TIME_WITH_SYS_TIME | ||
27 | # include <sys/time.h> | ||
28 | # include <time.h> | ||
29 | #else | ||
30 | # ifdef HAVE_SYS_TIME_H | ||
31 | # include <sys/time.h> | ||
32 | # else | ||
33 | # include <time.h> | ||
34 | # endif | ||
35 | #endif | ||
36 | |||
37 | #include <Intrinsic.h> | ||
38 | #include <StringDefs.h> | ||
39 | #include <Shell.h> | ||
40 | |||
41 | #ifdef USE_XAW3D | ||
42 | # include <Xaw3d/Box.h> | ||
43 | # include <Xaw3d/Scrollbar.h> | ||
44 | #elif defined(USE_NEXTAW) | ||
45 | # include <neXtaw/Box.h> | ||
46 | # include <neXtaw/Scrollbar.h> | ||
47 | #else | ||
48 | # include <Xaw/Box.h> | ||
49 | # include <Xaw/Scrollbar.h> | ||
50 | #endif | ||
51 | #include "x11/ScrollBox.h" | ||
52 | |||
53 | #include "Xmu/StdSel.h" | ||
54 | #include "Xmu/Atoms.h" | ||
55 | |||
56 | #include <keysym.h> | ||
57 | #include <Xatom.h> | ||
58 | |||
59 | #define XCURSCR_Y_SIZE (XCursesLINES * XCursesCOLS * sizeof(chtype)) | ||
60 | #define XCURSCR_FLAG_SIZE (XCursesLINES * sizeof(int)) | ||
61 | #define XCURSCR_START_SIZE (XCursesLINES * sizeof(int)) | ||
62 | #define XCURSCR_LENGTH_SIZE (XCursesLINES * sizeof(int)) | ||
63 | #define XCURSCR_ATRTAB_SIZE (PDC_COLOR_PAIRS * 2 * sizeof(short)) | ||
64 | #define XCURSCR_SIZE (XCURSCR_FLAG_SIZE + XCURSCR_START_SIZE + \ | ||
65 | XCURSCR_LENGTH_SIZE + XCURSCR_Y_SIZE + XCURSCR_ATRTAB_SIZE + \ | ||
66 | sizeof(XColor)) | ||
67 | |||
68 | #define XCURSCR_Y_OFF(y) ((y) * XCursesCOLS * sizeof(chtype)) | ||
69 | #define XCURSCR_FLAG_OFF (XCURSCR_Y_OFF(0) + XCURSCR_Y_SIZE) | ||
70 | #define XCURSCR_START_OFF (XCURSCR_FLAG_OFF + XCURSCR_FLAG_SIZE) | ||
71 | #define XCURSCR_LENGTH_OFF (XCURSCR_START_OFF + XCURSCR_START_SIZE) | ||
72 | #define XCURSCR_ATRTAB_OFF (XCURSCR_LENGTH_OFF + XCURSCR_LENGTH_SIZE) | ||
73 | #define XCURSCR_XCOLOR_OFF (XCURSCR_ATRTAB_OFF + XCURSCR_ATRTAB_SIZE) | ||
74 | |||
75 | typedef struct | ||
76 | { | ||
77 | int lines; | ||
78 | int cols; | ||
79 | Pixel cursorColor; | ||
80 | Pixel colorBlack; | ||
81 | Pixel colorRed; | ||
82 | Pixel colorGreen; | ||
83 | Pixel colorYellow; | ||
84 | Pixel colorBlue; | ||
85 | Pixel colorMagenta; | ||
86 | Pixel colorCyan; | ||
87 | Pixel colorWhite; | ||
88 | Pixel colorBoldBlack; | ||
89 | Pixel colorBoldRed; | ||
90 | Pixel colorBoldGreen; | ||
91 | Pixel colorBoldYellow; | ||
92 | Pixel colorBoldBlue; | ||
93 | Pixel colorBoldMagenta; | ||
94 | Pixel colorBoldCyan; | ||
95 | Pixel colorBoldWhite; | ||
96 | Pixel pointerForeColor; | ||
97 | Pixel pointerBackColor; | ||
98 | XFontStruct *normalFont; | ||
99 | XFontStruct *italicFont; | ||
100 | char *bitmap; | ||
101 | #ifdef HAVE_XPM_H | ||
102 | char *pixmap; | ||
103 | #endif | ||
104 | char *composeKey; | ||
105 | Cursor pointer; | ||
106 | int shmmin; | ||
107 | int borderWidth; | ||
108 | int borderColor; | ||
109 | int clickPeriod; | ||
110 | int doubleClickPeriod; | ||
111 | int scrollbarWidth; | ||
112 | int cursorBlinkRate; | ||
113 | char *textCursor; | ||
114 | } XCursesAppData; | ||
115 | |||
116 | extern XCursesAppData xc_app_data; | ||
117 | |||
118 | #define XCURSESSHMMIN xc_app_data.shmmin | ||
119 | |||
120 | #define XCLOGMSG (XCursesProcess ? " X" : "CURSES") | ||
121 | |||
122 | void XC_get_line_lock(int); | ||
123 | void XC_release_line_lock(int); | ||
124 | |||
125 | int PDC_display_cursor(int, int, int, int, int); | ||
126 | |||
127 | void XCursesExitCursesProcess(int, char *); | ||
128 | int XCursesInstruct(int); | ||
129 | int XCursesInstructAndWait(int); | ||
130 | int XCursesInitscr(int, char **); | ||
131 | |||
132 | int XC_write_socket(int, const void *, int); | ||
133 | int XC_read_socket(int, void *, int); | ||
134 | int XC_write_display_socket_int(int); | ||
135 | |||
136 | int XCursesSetupX(int argc, char *argv[]); | ||
137 | RETSIGTYPE XCursesSigwinchHandler(int signo); | ||
138 | |||
139 | #ifdef _HPUX_SOURCE | ||
140 | # define FD_SET_CAST int * | ||
141 | #else | ||
142 | # define FD_SET_CAST fd_set * | ||
143 | #endif | ||
144 | |||
145 | extern fd_set xc_readfds; | ||
146 | |||
147 | extern unsigned char *Xcurscr; | ||
148 | extern int XCursesProcess; | ||
149 | extern int shmidSP; | ||
150 | extern int shmid_Xcurscr; | ||
151 | extern int shmkeySP; | ||
152 | extern int shmkey_Xcurscr; | ||
153 | extern int xc_otherpid; | ||
154 | extern int XCursesLINES; | ||
155 | extern int XCursesCOLS; | ||
156 | extern int xc_display_sock; | ||
157 | extern int xc_key_sock; | ||
158 | extern int xc_display_sockets[2]; | ||
159 | extern int xc_key_sockets[2]; | ||
160 | extern int xc_exit_sock; | ||
161 | |||
162 | typedef RETSIGTYPE (*signal_handler)(); | ||
163 | |||
164 | signal_handler XCursesSetSignal(int, signal_handler); | ||
165 | |||
166 | #ifdef PDCDEBUG | ||
167 | void XC_say(const char *msg); | ||
168 | # define XC_LOG(x) XC_say x | ||
169 | #else | ||
170 | # define XC_LOG(x) | ||
171 | #endif | ||
172 | |||
173 | #ifdef MOUSE_DEBUG | ||
174 | # define MOUSE_LOG(x) printf x | ||
175 | #else | ||
176 | # define MOUSE_LOG(x) | ||
177 | #endif | ||
178 | |||
179 | enum | ||
180 | { | ||
181 | CURSES_CLEAR_SELECTION, CURSES_DISPLAY_CURSOR, CURSES_SET_SELECTION, | ||
182 | CURSES_GET_SELECTION, CURSES_TITLE, CURSES_REFRESH_SCROLLBAR, | ||
183 | CURSES_RESIZE, CURSES_BELL, CURSES_CONTINUE, CURSES_CURSOR, | ||
184 | CURSES_CHILD, CURSES_REFRESH, CURSES_GET_COLOR, CURSES_SET_COLOR, | ||
185 | CURSES_EXIT | ||
186 | }; | ||
187 | |||
188 | extern short *xc_atrtab; |
File x11/sb.c added (mode: 100644) (index 00000000..a34f502b) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: sb.c,v 1.27 2008/07/14 04:24:52 wmcbrine Exp $") | ||
6 | |||
7 | /*man-start************************************************************** | ||
8 | |||
9 | Name: sb | ||
10 | |||
11 | Synopsis: | ||
12 | int sb_init(void) | ||
13 | int sb_set_horz(int total, int viewport, int cur) | ||
14 | int sb_set_vert(int total, int viewport, int cur) | ||
15 | int sb_get_horz(int *total, int *viewport, int *cur) | ||
16 | int sb_get_vert(int *total, int *viewport, int *cur) | ||
17 | int sb_refresh(void); | ||
18 | |||
19 | Description: | ||
20 | These functions manipulate the scrollbar. | ||
21 | |||
22 | Return Value: | ||
23 | All functions return OK on success and ERR on error. | ||
24 | |||
25 | Portability X/Open BSD SYS V | ||
26 | sb_init - - - | ||
27 | sb_set_horz - - - | ||
28 | sb_set_vert - - - | ||
29 | sb_get_horz - - - | ||
30 | sb_get_vert - - - | ||
31 | sb_refresh - - - | ||
32 | |||
33 | **man-end****************************************************************/ | ||
34 | |||
35 | bool sb_started = FALSE; | ||
36 | |||
37 | /* sb_init() is the sb initialization routine. | ||
38 | This must be called before initscr(). */ | ||
39 | |||
40 | int sb_init(void) | ||
41 | { | ||
42 | PDC_LOG(("sb_init() - called\n")); | ||
43 | |||
44 | if (SP) | ||
45 | return ERR; | ||
46 | |||
47 | sb_started = TRUE; | ||
48 | |||
49 | return OK; | ||
50 | } | ||
51 | |||
52 | /* sb_set_horz() - Used to set horizontal scrollbar. | ||
53 | |||
54 | total = total number of columns | ||
55 | viewport = size of viewport in columns | ||
56 | cur = current column in total */ | ||
57 | |||
58 | int sb_set_horz(int total, int viewport, int cur) | ||
59 | { | ||
60 | PDC_LOG(("sb_set_horz() - called: total %d viewport %d cur %d\n", | ||
61 | total, viewport, cur)); | ||
62 | |||
63 | if (!SP) | ||
64 | return ERR; | ||
65 | |||
66 | SP->sb_total_x = total; | ||
67 | SP->sb_viewport_x = viewport; | ||
68 | SP->sb_cur_x = cur; | ||
69 | |||
70 | return OK; | ||
71 | } | ||
72 | |||
73 | /* sb_set_vert() - Used to set vertical scrollbar. | ||
74 | |||
75 | total = total number of columns on line | ||
76 | viewport = size of viewport in columns | ||
77 | cur = current column in total */ | ||
78 | |||
79 | int sb_set_vert(int total, int viewport, int cur) | ||
80 | { | ||
81 | PDC_LOG(("sb_set_vert() - called: total %d viewport %d cur %d\n", | ||
82 | total, viewport, cur)); | ||
83 | |||
84 | if (!SP) | ||
85 | return ERR; | ||
86 | |||
87 | SP->sb_total_y = total; | ||
88 | SP->sb_viewport_y = viewport; | ||
89 | SP->sb_cur_y = cur; | ||
90 | |||
91 | return OK; | ||
92 | } | ||
93 | |||
94 | /* sb_get_horz() - Used to get horizontal scrollbar. | ||
95 | |||
96 | total = total number of lines | ||
97 | viewport = size of viewport in lines | ||
98 | cur = current line in total */ | ||
99 | |||
100 | int sb_get_horz(int *total, int *viewport, int *cur) | ||
101 | { | ||
102 | PDC_LOG(("sb_get_horz() - called\n")); | ||
103 | |||
104 | if (!SP) | ||
105 | return ERR; | ||
106 | |||
107 | if (total) | ||
108 | *total = SP->sb_total_x; | ||
109 | if (viewport) | ||
110 | *viewport = SP->sb_viewport_x; | ||
111 | if (cur) | ||
112 | *cur = SP->sb_cur_x; | ||
113 | |||
114 | return OK; | ||
115 | } | ||
116 | |||
117 | /* sb_get_vert() - Used to get vertical scrollbar. | ||
118 | |||
119 | total = total number of lines | ||
120 | viewport = size of viewport in lines | ||
121 | cur = current line in total */ | ||
122 | |||
123 | int sb_get_vert(int *total, int *viewport, int *cur) | ||
124 | { | ||
125 | PDC_LOG(("sb_get_vert() - called\n")); | ||
126 | |||
127 | if (!SP) | ||
128 | return ERR; | ||
129 | |||
130 | if (total) | ||
131 | *total = SP->sb_total_y; | ||
132 | if (viewport) | ||
133 | *viewport = SP->sb_viewport_y; | ||
134 | if (cur) | ||
135 | *cur = SP->sb_cur_y; | ||
136 | |||
137 | return OK; | ||
138 | } | ||
139 | |||
140 | /* sb_refresh() - Used to draw the scrollbars. */ | ||
141 | |||
142 | int sb_refresh(void) | ||
143 | { | ||
144 | PDC_LOG(("sb_refresh() - called\n")); | ||
145 | |||
146 | if (!SP) | ||
147 | return ERR; | ||
148 | |||
149 | XCursesInstruct(CURSES_REFRESH_SCROLLBAR); | ||
150 | |||
151 | return OK; | ||
152 | } | ||
153 |
File x11/x11.c added (mode: 100644) (index 00000000..97d44985) | |||
1 | /* Public Domain Curses */ | ||
2 | |||
3 | #include "pdcx11.h" | ||
4 | |||
5 | RCSID("$Id: x11.c,v 1.94 2008/07/14 04:33:26 wmcbrine Exp $") | ||
6 | |||
7 | #ifdef HAVE_DECKEYSYM_H | ||
8 | # include <DECkeysym.h> | ||
9 | #endif | ||
10 | |||
11 | #ifdef HAVE_SUNKEYSYM_H | ||
12 | # include <Sunkeysym.h> | ||
13 | #endif | ||
14 | |||
15 | #ifdef HAVE_XPM_H | ||
16 | # include <xpm.h> | ||
17 | #endif | ||
18 | |||
19 | #if defined PDC_XIM | ||
20 | # include <Xlocale.h> | ||
21 | #endif | ||
22 | |||
23 | #include <stdlib.h> | ||
24 | #include <string.h> | ||
25 | |||
26 | #ifndef XPOINTER_TYPEDEFED | ||
27 | typedef char * XPointer; | ||
28 | #endif | ||
29 | |||
30 | #ifndef MAX_PATH | ||
31 | # define MAX_PATH 256 | ||
32 | #endif | ||
33 | |||
34 | XCursesAppData xc_app_data; | ||
35 | |||
36 | #if NeedWidePrototypes | ||
37 | # define PDC_SCROLLBAR_TYPE double | ||
38 | #else | ||
39 | # define PDC_SCROLLBAR_TYPE float | ||
40 | #endif | ||
41 | |||
42 | #define MAX_COLORS 16 /* maximum of "normal" colors */ | ||
43 | #define COLOR_CURSOR MAX_COLORS /* color of cursor */ | ||
44 | #define COLOR_BORDER MAX_COLORS + 1 /* color of border */ | ||
45 | |||
46 | #define XCURSESDISPLAY (XtDisplay(drawing)) | ||
47 | #define XCURSESWIN (XtWindow(drawing)) | ||
48 | |||
49 | /* Default icons for XCurses applications. */ | ||
50 | |||
51 | #include "big_icon.xbm" | ||
52 | #include "little_icon.xbm" | ||
53 | |||
54 | static void _selection_off(void); | ||
55 | static void _display_cursor(int, int, int, int); | ||
56 | static void _redraw_cursor(void); | ||
57 | static void _exit_process(int, int, char *); | ||
58 | static void _send_key_to_curses(unsigned long, MOUSE_STATUS *, bool); | ||
59 | |||
60 | static void XCursesButton(Widget, XEvent *, String *, Cardinal *); | ||
61 | static void XCursesHandleString(Widget, XEvent *, String *, Cardinal *); | ||
62 | static void XCursesKeyPress(Widget, XEvent *, String *, Cardinal *); | ||
63 | static void XCursesPasteSelection(Widget, XButtonEvent *); | ||
64 | |||
65 | static struct | ||
66 | { | ||
67 | KeySym keycode; | ||
68 | bool numkeypad; | ||
69 | unsigned short normal; | ||
70 | unsigned short shifted; | ||
71 | unsigned short control; | ||
72 | unsigned short alt; | ||
73 | } key_table[] = | ||
74 | { | ||
75 | /* keycode keypad normal shifted control alt*/ | ||
76 | {XK_Left, FALSE, KEY_LEFT, KEY_SLEFT, CTL_LEFT, ALT_LEFT}, | ||
77 | {XK_Right, FALSE, KEY_RIGHT, KEY_SRIGHT, CTL_RIGHT, ALT_RIGHT}, | ||
78 | {XK_Up, FALSE, KEY_UP, KEY_SUP, CTL_UP, ALT_UP}, | ||
79 | {XK_Down, FALSE, KEY_DOWN, KEY_SDOWN, CTL_DOWN, ALT_DOWN}, | ||
80 | {XK_Home, FALSE, KEY_HOME, KEY_SHOME, CTL_HOME, ALT_HOME}, | ||
81 | /* Sun Type 4 keyboard */ | ||
82 | {XK_R7, FALSE, KEY_HOME, KEY_SHOME, CTL_HOME, ALT_HOME}, | ||
83 | {XK_End, FALSE, KEY_END, KEY_SEND, CTL_END, ALT_END}, | ||
84 | /* Sun Type 4 keyboard */ | ||
85 | {XK_R13, FALSE, KEY_END, KEY_SEND, CTL_END, ALT_END}, | ||
86 | {XK_Prior, FALSE, KEY_PPAGE, KEY_SPREVIOUS,CTL_PGUP, ALT_PGUP}, | ||
87 | /* Sun Type 4 keyboard */ | ||
88 | {XK_R9, FALSE, KEY_PPAGE, KEY_SPREVIOUS,CTL_PGUP, ALT_PGUP}, | ||
89 | {XK_Next, FALSE, KEY_NPAGE, KEY_SNEXT, CTL_PGDN, ALT_PGDN}, | ||
90 | /* Sun Type 4 keyboard */ | ||
91 | {XK_R15, FALSE, KEY_NPAGE, KEY_SNEXT, CTL_PGDN, ALT_PGDN}, | ||
92 | {XK_Insert, FALSE, KEY_IC, KEY_SIC, CTL_INS, ALT_INS}, | ||
93 | {XK_Delete, FALSE, KEY_DC, KEY_SDC, CTL_DEL, ALT_DEL}, | ||
94 | {XK_F1, FALSE, KEY_F(1), KEY_F(13), KEY_F(25), KEY_F(37)}, | ||
95 | {XK_F2, FALSE, KEY_F(2), KEY_F(14), KEY_F(26), KEY_F(38)}, | ||
96 | {XK_F3, FALSE, KEY_F(3), KEY_F(15), KEY_F(27), KEY_F(39)}, | ||
97 | {XK_F4, FALSE, KEY_F(4), KEY_F(16), KEY_F(28), KEY_F(40)}, | ||
98 | {XK_F5, FALSE, KEY_F(5), KEY_F(17), KEY_F(29), KEY_F(41)}, | ||
99 | {XK_F6, FALSE, KEY_F(6), KEY_F(18), KEY_F(30), KEY_F(42)}, | ||
100 | {XK_F7, FALSE, KEY_F(7), KEY_F(19), KEY_F(31), KEY_F(43)}, | ||
101 | {XK_F8, FALSE, KEY_F(8), KEY_F(20), KEY_F(32), KEY_F(44)}, | ||
102 | {XK_F9, FALSE, KEY_F(9), KEY_F(21), KEY_F(33), KEY_F(45)}, | ||
103 | {XK_F10, FALSE, KEY_F(10), KEY_F(22), KEY_F(34), KEY_F(46)}, | ||
104 | {XK_F11, FALSE, KEY_F(11), KEY_F(23), KEY_F(35), KEY_F(47)}, | ||
105 | {XK_F12, FALSE, KEY_F(12), KEY_F(24), KEY_F(36), KEY_F(48)}, | ||
106 | {XK_F13, FALSE, KEY_F(13), KEY_F(25), KEY_F(37), KEY_F(49)}, | ||
107 | {XK_F14, FALSE, KEY_F(14), KEY_F(26), KEY_F(38), KEY_F(50)}, | ||
108 | {XK_F15, FALSE, KEY_F(15), KEY_F(27), KEY_F(39), KEY_F(51)}, | ||
109 | {XK_F16, FALSE, KEY_F(16), KEY_F(28), KEY_F(40), KEY_F(52)}, | ||
110 | {XK_F17, FALSE, KEY_F(17), KEY_F(29), KEY_F(41), KEY_F(53)}, | ||
111 | {XK_F18, FALSE, KEY_F(18), KEY_F(30), KEY_F(42), KEY_F(54)}, | ||
112 | {XK_F19, FALSE, KEY_F(19), KEY_F(31), KEY_F(43), KEY_F(55)}, | ||
113 | {XK_F20, FALSE, KEY_F(20), KEY_F(32), KEY_F(44), KEY_F(56)}, | ||
114 | {XK_BackSpace, FALSE, 0x08, 0x08, CTL_BKSP, ALT_BKSP}, | ||
115 | {XK_Tab, FALSE, 0x09, KEY_BTAB, CTL_TAB, ALT_TAB}, | ||
116 | {XK_Select, FALSE, KEY_SELECT, KEY_SELECT, KEY_SELECT, KEY_SELECT}, | ||
117 | {XK_Print, FALSE, KEY_PRINT, KEY_SPRINT, KEY_PRINT, KEY_PRINT}, | ||
118 | {XK_Find, FALSE, KEY_FIND, KEY_SFIND, KEY_FIND, KEY_FIND}, | ||
119 | {XK_Pause, FALSE, KEY_SUSPEND, KEY_SSUSPEND, KEY_SUSPEND, KEY_SUSPEND}, | ||
120 | {XK_Clear, FALSE, KEY_CLEAR, KEY_CLEAR, KEY_CLEAR, KEY_CLEAR}, | ||
121 | {XK_Cancel, FALSE, KEY_CANCEL, KEY_SCANCEL, KEY_CANCEL, KEY_CANCEL}, | ||
122 | {XK_Break, FALSE, KEY_BREAK, KEY_BREAK, KEY_BREAK, KEY_BREAK}, | ||
123 | {XK_Help, FALSE, KEY_HELP, KEY_SHELP, KEY_LHELP, KEY_HELP}, | ||
124 | {XK_L4, FALSE, KEY_UNDO, KEY_SUNDO, KEY_UNDO, KEY_UNDO}, | ||
125 | {XK_L6, FALSE, KEY_COPY, KEY_SCOPY, KEY_COPY, KEY_COPY}, | ||
126 | {XK_L9, FALSE, KEY_FIND, KEY_SFIND, KEY_FIND, KEY_FIND}, | ||
127 | {XK_Menu, FALSE, KEY_OPTIONS, KEY_SOPTIONS, KEY_OPTIONS, KEY_OPTIONS}, | ||
128 | #ifdef HAVE_SUNKEYSYM_H | ||
129 | {SunXK_F36, FALSE, KEY_F(41), KEY_F(43), KEY_F(45), KEY_F(47)}, | ||
130 | {SunXK_F37, FALSE, KEY_F(42), KEY_F(44), KEY_F(46), KEY_F(48)}, | ||
131 | #endif | ||
132 | #ifdef HAVE_DECKEYSYM_H | ||
133 | {DXK_Remove, FALSE, KEY_DC, KEY_SDC, CTL_DEL, ALT_DEL}, | ||
134 | #endif | ||
135 | {XK_Escape, FALSE, 0x1B, 0x1B, 0x1B, ALT_ESC}, | ||
136 | {XK_KP_Enter, TRUE, PADENTER, PADENTER, CTL_PADENTER,ALT_PADENTER}, | ||
137 | {XK_KP_Add, TRUE, PADPLUS, '+', CTL_PADPLUS, ALT_PADPLUS}, | ||
138 | {XK_KP_Subtract,TRUE, PADMINUS, '-', CTL_PADMINUS,ALT_PADMINUS}, | ||
139 | {XK_KP_Multiply,TRUE, PADSTAR, '*', CTL_PADSTAR, ALT_PADSTAR}, | ||
140 | /* Sun Type 4 keyboard */ | ||
141 | {XK_R6, TRUE, PADSTAR, '*', CTL_PADSTAR, ALT_PADSTAR}, | ||
142 | {XK_KP_Divide, TRUE, PADSLASH, '/', CTL_PADSLASH,ALT_PADSLASH}, | ||
143 | /* Sun Type 4 keyboard */ | ||
144 | {XK_R5, TRUE, PADSLASH, '/', CTL_PADSLASH,ALT_PADSLASH}, | ||
145 | {XK_KP_Decimal,TRUE, PADSTOP, '.', CTL_PADSTOP, ALT_PADSTOP}, | ||
146 | {XK_KP_0, TRUE, PAD0, '0', CTL_PAD0, ALT_PAD0}, | ||
147 | {XK_KP_1, TRUE, KEY_C1, '1', CTL_PAD1, ALT_PAD1}, | ||
148 | {XK_KP_2, TRUE, KEY_C2, '2', CTL_PAD2, ALT_PAD2}, | ||
149 | {XK_KP_3, TRUE, KEY_C3, '3', CTL_PAD3, ALT_PAD3}, | ||
150 | {XK_KP_4, TRUE, KEY_B1, '4', CTL_PAD4, ALT_PAD4}, | ||
151 | {XK_KP_5, TRUE, KEY_B2, '5', CTL_PAD5, ALT_PAD5}, | ||
152 | /* Sun Type 4 keyboard */ | ||
153 | {XK_R11, TRUE, KEY_B2, '5', CTL_PAD5, ALT_PAD5}, | ||
154 | {XK_KP_6, TRUE, KEY_B3, '6', CTL_PAD6, ALT_PAD6}, | ||
155 | {XK_KP_7, TRUE, KEY_A1, '7', CTL_PAD7, ALT_PAD7}, | ||
156 | {XK_KP_8, TRUE, KEY_A2, '8', CTL_PAD8, ALT_PAD8}, | ||
157 | {XK_KP_9, TRUE, KEY_A3, '9', CTL_PAD9, ALT_PAD9}, | ||
158 | /* the following added to support Sun Type 5 keyboards */ | ||
159 | {XK_F21, FALSE, KEY_SUSPEND, KEY_SSUSPEND, KEY_SUSPEND, KEY_SUSPEND}, | ||
160 | {XK_F22, FALSE, KEY_PRINT, KEY_SPRINT, KEY_PRINT, KEY_PRINT}, | ||
161 | {XK_F24, TRUE, PADMINUS, '-', CTL_PADMINUS,ALT_PADMINUS}, | ||
162 | /* Sun Type 4 keyboard */ | ||
163 | {XK_F25, TRUE, PADSLASH, '/', CTL_PADSLASH,ALT_PADSLASH}, | ||
164 | /* Sun Type 4 keyboard */ | ||
165 | {XK_F26, TRUE, PADSTAR, '*', CTL_PADSTAR, ALT_PADSTAR}, | ||
166 | {XK_F27, TRUE, KEY_A1, '7', CTL_PAD7, ALT_PAD7}, | ||
167 | {XK_F29, TRUE, KEY_A3, '9', CTL_PAD9, ALT_PAD9}, | ||
168 | {XK_F31, TRUE, KEY_B2, '5', CTL_PAD5, ALT_PAD5}, | ||
169 | {XK_F35, TRUE, KEY_C3, '3', CTL_PAD3, ALT_PAD3}, | ||
170 | #ifdef HAVE_XK_KP_DELETE | ||
171 | {XK_KP_Delete, TRUE, PADSTOP, '.', CTL_PADSTOP, ALT_PADSTOP}, | ||
172 | #endif | ||
173 | #ifdef HAVE_XK_KP_INSERT | ||
174 | {XK_KP_Insert, TRUE, PAD0, '0', CTL_PAD0, ALT_PAD0}, | ||
175 | #endif | ||
176 | #ifdef HAVE_XK_KP_END | ||
177 | {XK_KP_End, TRUE, KEY_C1, '1', CTL_PAD1, ALT_PAD1}, | ||
178 | #endif | ||
179 | #ifdef HAVE_XK_KP_DOWN | ||
180 | {XK_KP_Down, TRUE, KEY_C2, '2', CTL_PAD2, ALT_PAD2}, | ||
181 | #endif | ||
182 | #ifdef HAVE_XK_KP_NEXT | ||
183 | {XK_KP_Next, TRUE, KEY_C3, '3', CTL_PAD3, ALT_PAD3}, | ||
184 | #endif | ||
185 | #ifdef HAVE_XK_KP_LEFT | ||
186 | {XK_KP_Left, TRUE, KEY_B1, '4', CTL_PAD4, ALT_PAD4}, | ||
187 | #endif | ||
188 | #ifdef HAVE_XK_KP_BEGIN | ||
189 | {XK_KP_Begin, TRUE, KEY_B2, '5', CTL_PAD5, ALT_PAD5}, | ||
190 | #endif | ||
191 | #ifdef HAVE_XK_KP_RIGHT | ||
192 | {XK_KP_Right, TRUE, KEY_B3, '6', CTL_PAD6, ALT_PAD6}, | ||
193 | #endif | ||
194 | #ifdef HAVE_XK_KP_HOME | ||
195 | {XK_KP_Home, TRUE, KEY_A1, '7', CTL_PAD7, ALT_PAD7}, | ||
196 | #endif | ||
197 | #ifdef HAVE_XK_KP_UP | ||
198 | {XK_KP_Up, TRUE, KEY_A2, '8', CTL_PAD8, ALT_PAD8}, | ||
199 | #endif | ||
200 | #ifdef HAVE_XK_KP_PRIOR | ||
201 | {XK_KP_Prior, TRUE, KEY_A3, '9', CTL_PAD9, ALT_PAD9}, | ||
202 | #endif | ||
203 | {0, 0, 0, 0, 0, 0} | ||
204 | }; | ||
205 | |||
206 | #ifndef PDC_XIM | ||
207 | # include "compose.h" | ||
208 | #endif | ||
209 | |||
210 | #define BITMAPDEPTH 1 | ||
211 | |||
212 | unsigned long pdc_key_modifiers = 0L; | ||
213 | |||
214 | static GC normal_gc, block_cursor_gc, rect_cursor_gc, italic_gc, border_gc; | ||
215 | static int font_height, font_width, font_ascent, font_descent, | ||
216 | window_width, window_height; | ||
217 | static int resize_window_width = 0, resize_window_height = 0; | ||
218 | static char *bitmap_file = NULL; | ||
219 | #ifdef HAVE_XPM_H | ||
220 | static char *pixmap_file = NULL; | ||
221 | #endif | ||
222 | static KeySym keysym = 0; | ||
223 | |||
224 | static int state_mask[8] = | ||
225 | { | ||
226 | ShiftMask, | ||
227 | LockMask, | ||
228 | ControlMask, | ||
229 | Mod1Mask, | ||
230 | Mod2Mask, | ||
231 | Mod3Mask, | ||
232 | Mod4Mask, | ||
233 | Mod5Mask | ||
234 | }; | ||
235 | |||
236 | static Atom wm_atom[2]; | ||
237 | static String class_name = "XCurses"; | ||
238 | static XtAppContext app_context; | ||
239 | static Widget topLevel, drawing, scrollBox, scrollVert, scrollHoriz; | ||
240 | static int received_map_notify = 0; | ||
241 | static bool mouse_selection = FALSE; | ||
242 | static chtype *tmpsel = NULL; | ||
243 | static unsigned long tmpsel_length = 0; | ||
244 | static int selection_start_x = 0, selection_start_y = 0, | ||
245 | selection_end_x = 0, selection_end_y = 0; | ||
246 | static Pixmap icon_bitmap; | ||
247 | #ifdef HAVE_XPM_H | ||
248 | static Pixmap icon_pixmap; | ||
249 | static Pixmap icon_pixmap_mask; | ||
250 | #endif | ||
251 | static bool visible_cursor = FALSE; | ||
252 | static bool window_entered = TRUE; | ||
253 | static char *program_name; | ||
254 | |||
255 | /* Macros just for app_resources */ | ||
256 | |||
257 | #ifdef PDC_WIDE | ||
258 | # define DEFFONT "-misc-fixed-medium-r-normal--20-200-75-75-c-100-iso10646-1" | ||
259 | #else | ||
260 | # define DEFFONT "7x13" | ||
261 | #endif | ||
262 | |||
263 | #define APPDATAOFF(n) XtOffsetOf(XCursesAppData, n) | ||
264 | |||
265 | #define RINT(name1, name2, value) { \ | ||
266 | #name1, #name2, XtRInt, \ | ||
267 | sizeof(int), APPDATAOFF(name1), XtRImmediate, \ | ||
268 | (XtPointer)value \ | ||
269 | } | ||
270 | |||
271 | #define RPIXEL(name1, name2, value) { \ | ||
272 | #name1, #name2, XtRPixel, \ | ||
273 | sizeof(Pixel), APPDATAOFF(name1), XtRString, \ | ||
274 | (XtPointer)#value \ | ||
275 | } | ||
276 | |||
277 | #define RCOLOR(name, value) RPIXEL(color##name, Color##name, value) | ||
278 | |||
279 | |||
280 | #define RSTRINGP(name1, name2, param) { \ | ||
281 | #name1, #name2, XtRString, \ | ||
282 | MAX_PATH, APPDATAOFF(name1), XtRString, (XtPointer)param \ | ||
283 | } | ||
284 | |||
285 | #define RSTRING(name1, name2) RSTRINGP(name1, name2, "") | ||
286 | |||
287 | #define RFONT(name1, name2, value) { \ | ||
288 | #name1, #name2, XtRFontStruct, \ | ||
289 | sizeof(XFontStruct), APPDATAOFF(name1), XtRString, \ | ||
290 | (XtPointer)value \ | ||
291 | } | ||
292 | |||
293 | #define RCURSOR(name1, name2, value) { \ | ||
294 | #name1, #name2, XtRCursor, \ | ||
295 | sizeof(Cursor), APPDATAOFF(name1), XtRString, \ | ||
296 | (XtPointer)#value \ | ||
297 | } | ||
298 | |||
299 | static XtResource app_resources[] = | ||
300 | { | ||
301 | RINT(lines, Lines, 24), | ||
302 | RINT(cols, Cols, 80), | ||
303 | |||
304 | RPIXEL(cursorColor, CursorColor, Red), | ||
305 | |||
306 | RCOLOR(Black, Black), | ||
307 | RCOLOR(Red, red3), | ||
308 | RCOLOR(Green, green3), | ||
309 | RCOLOR(Yellow, yellow3), | ||
310 | RCOLOR(Blue, blue3), | ||
311 | RCOLOR(Magenta, magenta3), | ||
312 | RCOLOR(Cyan, cyan3), | ||
313 | RCOLOR(White, Grey), | ||
314 | |||
315 | RCOLOR(BoldBlack, grey40), | ||
316 | RCOLOR(BoldRed, red1), | ||
317 | RCOLOR(BoldGreen, green1), | ||
318 | RCOLOR(BoldYellow, yellow1), | ||
319 | RCOLOR(BoldBlue, blue1), | ||
320 | RCOLOR(BoldMagenta, magenta1), | ||
321 | RCOLOR(BoldCyan, cyan1), | ||
322 | RCOLOR(BoldWhite, White), | ||
323 | |||
324 | RFONT(normalFont, NormalFont, DEFFONT), | ||
325 | RFONT(italicFont, ItalicFont, DEFFONT), | ||
326 | |||
327 | RSTRING(bitmap, Bitmap), | ||
328 | #ifdef HAVE_XPM_H | ||
329 | RSTRING(pixmap, Pixmap), | ||
330 | #endif | ||
331 | RSTRINGP(composeKey, ComposeKey, "Multi_key"), | ||
332 | |||
333 | RCURSOR(pointer, Pointer, xterm), | ||
334 | |||
335 | RPIXEL(pointerForeColor, PointerForeColor, Black), | ||
336 | RPIXEL(pointerBackColor, PointerBackColor, White), | ||
337 | |||
338 | RINT(shmmin, Shmmin, 0), | ||
339 | RINT(borderWidth, BorderWidth, 0), | ||
340 | |||
341 | RPIXEL(borderColor, BorderColor, Black), | ||
342 | |||
343 | RINT(doubleClickPeriod, DoubleClickPeriod, (PDC_CLICK_PERIOD * 2)), | ||
344 | RINT(clickPeriod, ClickPeriod, PDC_CLICK_PERIOD), | ||
345 | RINT(scrollbarWidth, ScrollbarWidth, 15), | ||
346 | RINT(cursorBlinkRate, CursorBlinkRate, 0), | ||
347 | |||
348 | RSTRING(textCursor, TextCursor) | ||
349 | }; | ||
350 | |||
351 | #undef RCURSOR | ||
352 | #undef RFONT | ||
353 | #undef RSTRING | ||
354 | #undef RCOLOR | ||
355 | #undef RPIXEL | ||
356 | #undef RINT | ||
357 | #undef APPDATAOFF | ||
358 | #undef DEFFONT | ||
359 | |||
360 | /* Macros for options */ | ||
361 | |||
362 | #define COPT(name) {"-" #name, "*" #name, XrmoptionSepArg, NULL} | ||
363 | #define CCOLOR(name) COPT(color##name) | ||
364 | |||
365 | static XrmOptionDescRec options[] = | ||
366 | { | ||
367 | COPT(lines), COPT(cols), COPT(normalFont), COPT(italicFont), | ||
368 | COPT(bitmap), | ||
369 | #ifdef HAVE_XPM_H | ||
370 | COPT(pixmap), | ||
371 | #endif | ||
372 | COPT(pointer), COPT(shmmin), COPT(composeKey), COPT(clickPeriod), | ||
373 | COPT(doubleClickPeriod), COPT(scrollbarWidth), | ||
374 | COPT(pointerForeColor), COPT(pointerBackColor), | ||
375 | COPT(cursorBlinkRate), COPT(cursorColor), COPT(textCursor), | ||
376 | |||
377 | CCOLOR(Black), CCOLOR(Red), CCOLOR(Green), CCOLOR(Yellow), | ||
378 | CCOLOR(Blue), CCOLOR(Magenta), CCOLOR(Cyan), CCOLOR(White), | ||
379 | |||
380 | CCOLOR(BoldBlack), CCOLOR(BoldRed), CCOLOR(BoldGreen), | ||
381 | CCOLOR(BoldYellow), CCOLOR(BoldBlue), CCOLOR(BoldMagenta), | ||
382 | CCOLOR(BoldCyan), CCOLOR(BoldWhite) | ||
383 | }; | ||
384 | |||
385 | #undef CCOLOR | ||
386 | #undef COPT | ||
387 | |||
388 | static XtActionsRec action_table[] = | ||
389 | { | ||
390 | {"XCursesButton", (XtActionProc)XCursesButton}, | ||
391 | {"XCursesKeyPress", (XtActionProc)XCursesKeyPress}, | ||
392 | {"XCursesPasteSelection", (XtActionProc)XCursesPasteSelection}, | ||
393 | {"string", (XtActionProc)XCursesHandleString} | ||
394 | }; | ||
395 | |||
396 | static bool after_first_curses_request = FALSE; | ||
397 | static Pixel colors[MAX_COLORS + 2]; | ||
398 | static bool vertical_cursor = FALSE; | ||
399 | |||
400 | #ifdef PDC_XIM | ||
401 | static XIM Xim = NULL; | ||
402 | static XIC Xic = NULL; | ||
403 | #endif | ||
404 | |||
405 | static const char *default_translations = | ||
406 | { | ||
407 | "<Key>: XCursesKeyPress() \n" \ | ||
408 | "<KeyUp>: XCursesKeyPress() \n" \ | ||
409 | "<BtnDown>: XCursesButton() \n" \ | ||
410 | "<BtnUp>: XCursesButton() \n" \ | ||
411 | "<BtnMotion>: XCursesButton()" | ||
412 | }; | ||
413 | |||
414 | static int _to_utf8(char *outcode, chtype code) | ||
415 | { | ||
416 | #ifdef PDC_WIDE | ||
417 | if (code & A_ALTCHARSET && !(code & 0xff80)) | ||
418 | code = acs_map[code & 0x7f]; | ||
419 | #endif | ||
420 | code &= A_CHARTEXT; | ||
421 | |||
422 | if (code < 0x80) | ||
423 | { | ||
424 | outcode[0] = code; | ||
425 | return 1; | ||
426 | } | ||
427 | else | ||
428 | if (code < 0x800) | ||
429 | { | ||
430 | outcode[0] = ((code & 0x07c0) >> 6) | 0xc0; | ||
431 | outcode[1] = (code & 0x003f) | 0x80; | ||
432 | return 2; | ||
433 | } | ||
434 | else | ||
435 | { | ||
436 | outcode[0] = ((code & 0xf000) >> 12) | 0xe0; | ||
437 | outcode[1] = ((code & 0x0fc0) >> 6) | 0x80; | ||
438 | outcode[2] = (code & 0x003f) | 0x80; | ||
439 | return 3; | ||
440 | } | ||
441 | } | ||
442 | |||
443 | static int _from_utf8(wchar_t *pwc, const char *s, size_t n) | ||
444 | { | ||
445 | wchar_t key; | ||
446 | int i = -1; | ||
447 | const unsigned char *string; | ||
448 | |||
449 | if (!s || (n < 1)) | ||
450 | return -1; | ||
451 | |||
452 | if (!*s) | ||
453 | return 0; | ||
454 | |||
455 | string = (const unsigned char *)s; | ||
456 | |||
457 | key = string[0]; | ||
458 | |||
459 | /* Simplistic UTF-8 decoder -- only does the BMP, minimal validation */ | ||
460 | |||
461 | if (key & 0x80) | ||
462 | { | ||
463 | if ((key & 0xe0) == 0xc0) | ||
464 | { | ||
465 | if (1 < n) | ||
466 | { | ||
467 | key = ((key & 0x1f) << 6) | (string[1] & 0x3f); | ||
468 | i = 2; | ||
469 | } | ||
470 | } | ||
471 | else if ((key & 0xe0) == 0xe0) | ||
472 | { | ||
473 | if (2 < n) | ||
474 | { | ||
475 | key = ((key & 0x0f) << 12) | | ||
476 | ((string[1] & 0x3f) << 6) | (string[2] & 0x3f); | ||
477 | i = 3; | ||
478 | } | ||
479 | } | ||
480 | } | ||
481 | else | ||
482 | i = 1; | ||
483 | |||
484 | if (i) | ||
485 | *pwc = key; | ||
486 | |||
487 | return i; | ||
488 | } | ||
489 | |||
490 | #ifndef X_HAVE_UTF8_STRING | ||
491 | static Atom XA_UTF8_STRING(Display *dpy) | ||
492 | { | ||
493 | static AtomPtr p = NULL; | ||
494 | |||
495 | if (!p) | ||
496 | p = XmuMakeAtom("UTF8_STRING"); | ||
497 | |||
498 | return XmuInternAtom(dpy, p); | ||
499 | } | ||
500 | #endif | ||
501 | |||
502 | signal_handler XCursesSetSignal(int signo, signal_handler action) | ||
503 | { | ||
504 | #if defined(SA_INTERRUPT) || defined(SA_RESTART) | ||
505 | struct sigaction sigact, osigact; | ||
506 | |||
507 | sigact.sa_handler = action; | ||
508 | |||
509 | sigact.sa_flags = | ||
510 | # ifdef SA_INTERRUPT | ||
511 | # ifdef SA_RESTART | ||
512 | SA_INTERRUPT | SA_RESTART; | ||
513 | # else | ||
514 | SA_INTERRUPT; | ||
515 | # endif | ||
516 | # else /* must be SA_RESTART */ | ||
517 | SA_RESTART; | ||
518 | # endif | ||
519 | sigemptyset(&sigact.sa_mask); | ||
520 | |||
521 | if (sigaction(signo, &sigact, &osigact)) | ||
522 | return SIG_ERR; | ||
523 | |||
524 | return osigact.sa_handler; | ||
525 | |||
526 | #else /* not SA_INTERRUPT or SA_RESTART, use plain signal */ | ||
527 | return signal(signo, action); | ||
528 | #endif | ||
529 | } | ||
530 | |||
531 | RETSIGTYPE XCursesSigwinchHandler(int signo) | ||
532 | { | ||
533 | PDC_LOG(("%s:XCursesSigwinchHandler() - called: SIGNO: %d\n", | ||
534 | XCLOGMSG, signo)); | ||
535 | |||
536 | /* Patch by: Georg Fuchs, georg.fuchs@rz.uni-regensburg.de | ||
537 | 02-Feb-1999 */ | ||
538 | |||
539 | SP->resized += 1; | ||
540 | |||
541 | /* Always trap SIGWINCH if the C library supports SIGWINCH */ | ||
542 | |||
543 | #ifdef SIGWINCH | ||
544 | XCursesSetSignal(SIGWINCH, XCursesSigwinchHandler); | ||
545 | #endif | ||
546 | } | ||
547 | |||
548 | /* Convert character positions x and y to pixel positions, stored in | ||
549 | xpos and ypos */ | ||
550 | |||
551 | static void _make_xy(int x, int y, int *xpos, int *ypos) | ||
552 | { | ||
553 | *xpos = (x * font_width) + xc_app_data.borderWidth; | ||
554 | *ypos = xc_app_data.normalFont->ascent + (y * font_height) + | ||
555 | xc_app_data.borderWidth; | ||
556 | } | ||
557 | |||
558 | /* Output a block of characters with common attributes */ | ||
559 | |||
560 | static int _new_packet(chtype attr, bool rev, int len, int col, int row, | ||
561 | #ifdef PDC_WIDE | ||
562 | XChar2b *text) | ||
563 | #else | ||
564 | char *text) | ||
565 | #endif | ||
566 | { | ||
567 | GC gc; | ||
568 | int xpos, ypos; | ||
569 | short fore, back; | ||
570 | |||
571 | PDC_pair_content(PAIR_NUMBER(attr), &fore, &back); | ||
572 | |||
573 | #ifdef PDC_WIDE | ||
574 | text[len].byte1 = text[len].byte2 = 0; | ||
575 | #else | ||
576 | text[len] = '\0'; | ||
577 | #endif | ||
578 | |||
579 | /* Specify the color table offsets */ | ||
580 | |||
581 | fore |= (attr & A_BOLD) ? 8 : 0; | ||
582 | back |= (attr & A_BLINK) ? 8 : 0; | ||
583 | |||
584 | /* Reverse flag = highlighted selection XOR A_REVERSE set */ | ||
585 | |||
586 | rev ^= !!(attr & A_REVERSE); | ||
587 | |||
588 | /* Determine which GC to use - normal or italic */ | ||
589 | |||
590 | gc = (attr & A_ITALIC) ? italic_gc : normal_gc; | ||
591 | |||
592 | /* Draw it */ | ||
593 | |||
594 | XSetForeground(XCURSESDISPLAY, gc, colors[rev ? back : fore]); | ||
595 | XSetBackground(XCURSESDISPLAY, gc, colors[rev ? fore : back]); | ||
596 | |||
597 | _make_xy(col, row, &xpos, &ypos); | ||
598 | |||
599 | #ifdef PDC_WIDE | ||
600 | XDrawImageString16( | ||
601 | #else | ||
602 | XDrawImageString( | ||
603 | #endif | ||
604 | XCURSESDISPLAY, XCURSESWIN, gc, xpos, ypos, text, len); | ||
605 | |||
606 | /* Underline, etc. */ | ||
607 | |||
608 | if (attr & (A_LEFTLINE|A_RIGHTLINE|A_UNDERLINE)) | ||
609 | { | ||
610 | int k; | ||
611 | |||
612 | if (SP->line_color != -1) | ||
613 | XSetForeground(XCURSESDISPLAY, gc, colors[SP->line_color]); | ||
614 | |||
615 | if (attr & A_UNDERLINE) /* UNDER */ | ||
616 | XDrawLine(XCURSESDISPLAY, XCURSESWIN, gc, | ||
617 | xpos, ypos + 1, xpos + font_width * len, ypos + 1); | ||
618 | |||
619 | if (attr & A_LEFTLINE) /* LEFT */ | ||
620 | for (k = 0; k < len; k++) | ||
621 | { | ||
622 | int x = xpos + font_width * k - 1; | ||
623 | XDrawLine(XCURSESDISPLAY, XCURSESWIN, gc, | ||
624 | x, ypos - font_ascent, x, ypos + font_descent); | ||
625 | } | ||
626 | |||
627 | if (attr & A_RIGHTLINE) /* RIGHT */ | ||
628 | for (k = 0; k < len; k++) | ||
629 | { | ||
630 | int x = xpos + font_width * (k + 1) - 1; | ||
631 | XDrawLine(XCURSESDISPLAY, XCURSESWIN, gc, | ||
632 | x, ypos - font_ascent, x, ypos + font_descent); | ||
633 | } | ||
634 | } | ||
635 | |||
636 | PDC_LOG(("%s:_new_packet() - row: %d col: %d " | ||
637 | "num_cols: %d fore: %d back: %d text:<%s>\n", | ||
638 | XCLOGMSG, row, col, len, fore, back, text)); | ||
639 | |||
640 | return OK; | ||
641 | } | ||
642 | |||
643 | /* The core display routine -- update one line of text */ | ||
644 | |||
645 | static int _display_text(const chtype *ch, int row, int col, | ||
646 | int num_cols, bool highlight) | ||
647 | { | ||
648 | #ifdef PDC_WIDE | ||
649 | XChar2b text[513]; | ||
650 | #else | ||
651 | char text[513]; | ||
652 | #endif | ||
653 | chtype old_attr, attr; | ||
654 | int i, j; | ||
655 | |||
656 | PDC_LOG(("%s:_display_text() - called: row: %d col: %d " | ||
657 | "num_cols: %d\n", XCLOGMSG, row, col, num_cols)); | ||
658 | |||
659 | if (!num_cols) | ||
660 | return OK; | ||
661 | |||
662 | old_attr = *ch & A_ATTRIBUTES; | ||
663 | |||
664 | for (i = 0, j = 0; j < num_cols; j++) | ||
665 | { | ||
666 | chtype curr = ch[j]; | ||
667 | |||
668 | attr = curr & A_ATTRIBUTES; | ||
669 | |||
670 | #ifdef CHTYPE_LONG | ||
671 | if (attr & A_ALTCHARSET && !(curr & 0xff80)) | ||
672 | { | ||
673 | attr ^= A_ALTCHARSET; | ||
674 | curr = acs_map[curr & 0x7f]; | ||
675 | } | ||
676 | #endif | ||
677 | |||
678 | #ifndef PDC_WIDE | ||
679 | /* Special handling for ACS_BLOCK */ | ||
680 | |||
681 | if (!(curr & A_CHARTEXT)) | ||
682 | { | ||
683 | curr |= ' '; | ||
684 | attr ^= A_REVERSE; | ||
685 | } | ||
686 | #endif | ||
687 | if (attr != old_attr) | ||
688 | { | ||
689 | if (_new_packet(old_attr, highlight, i, col, row, text) == ERR) | ||
690 | return ERR; | ||
691 | |||
692 | old_attr = attr; | ||
693 | col += i; | ||
694 | i = 0; | ||
695 | } | ||
696 | |||
697 | #ifdef PDC_WIDE | ||
698 | text[i].byte1 = (curr & 0xff00) >> 8; | ||
699 | text[i++].byte2 = curr & 0x00ff; | ||
700 | #else | ||
701 | text[i++] = curr & 0xff; | ||
702 | #endif | ||
703 | } | ||
704 | |||
705 | return _new_packet(old_attr, highlight, i, col, row, text); | ||
706 | } | ||
707 | |||
708 | static void _get_gc(GC *gc, XFontStruct *font_info, int fore, int back) | ||
709 | { | ||
710 | XGCValues values; | ||
711 | |||
712 | /* Create default Graphics Context */ | ||
713 | |||
714 | *gc = XCreateGC(XCURSESDISPLAY, XCURSESWIN, 0L, &values); | ||
715 | |||
716 | /* specify font */ | ||
717 | |||
718 | XSetFont(XCURSESDISPLAY, *gc, font_info->fid); | ||
719 | |||
720 | XSetForeground(XCURSESDISPLAY, *gc, colors[fore]); | ||
721 | XSetBackground(XCURSESDISPLAY, *gc, colors[back]); | ||
722 | } | ||
723 | |||
724 | static void _initialize_colors(void) | ||
725 | { | ||
726 | colors[COLOR_BLACK] = xc_app_data.colorBlack; | ||
727 | colors[COLOR_RED] = xc_app_data.colorRed; | ||
728 | colors[COLOR_GREEN] = xc_app_data.colorGreen; | ||
729 | colors[COLOR_YELLOW] = xc_app_data.colorYellow; | ||
730 | colors[COLOR_BLUE] = xc_app_data.colorBlue; | ||
731 | colors[COLOR_MAGENTA] = xc_app_data.colorMagenta; | ||
732 | colors[COLOR_CYAN] = xc_app_data.colorCyan; | ||
733 | colors[COLOR_WHITE] = xc_app_data.colorWhite; | ||
734 | |||
735 | colors[COLOR_BLACK + 8] = xc_app_data.colorBoldBlack; | ||
736 | colors[COLOR_RED + 8] = xc_app_data.colorBoldRed; | ||
737 | colors[COLOR_GREEN + 8] = xc_app_data.colorBoldGreen; | ||
738 | colors[COLOR_YELLOW + 8] = xc_app_data.colorBoldYellow; | ||
739 | colors[COLOR_BLUE + 8] = xc_app_data.colorBoldBlue; | ||
740 | colors[COLOR_MAGENTA + 8] = xc_app_data.colorBoldMagenta; | ||
741 | colors[COLOR_CYAN + 8] = xc_app_data.colorBoldCyan; | ||
742 | colors[COLOR_WHITE + 8] = xc_app_data.colorBoldWhite; | ||
743 | |||
744 | colors[COLOR_CURSOR] = xc_app_data.cursorColor; | ||
745 | colors[COLOR_BORDER] = xc_app_data.borderColor; | ||
746 | } | ||
747 | |||
748 | static void _refresh_scrollbar(void) | ||
749 | { | ||
750 | XC_LOG(("_refresh_scrollbar() - called\n")); | ||
751 | |||
752 | if (SP->sb_on) | ||
753 | { | ||
754 | PDC_SCROLLBAR_TYPE total_y = SP->sb_total_y; | ||
755 | PDC_SCROLLBAR_TYPE total_x = SP->sb_total_x; | ||
756 | |||
757 | if (total_y) | ||
758 | XawScrollbarSetThumb(scrollVert, | ||
759 | (PDC_SCROLLBAR_TYPE)(SP->sb_cur_y) / total_y, | ||
760 | (PDC_SCROLLBAR_TYPE)(SP->sb_viewport_y) / total_y); | ||
761 | |||
762 | if (total_x) | ||
763 | XawScrollbarSetThumb(scrollHoriz, | ||
764 | (PDC_SCROLLBAR_TYPE)(SP->sb_cur_x) / total_x, | ||
765 | (PDC_SCROLLBAR_TYPE)(SP->sb_viewport_x) / total_x); | ||
766 | } | ||
767 | } | ||
768 | |||
769 | static void _set_cursor_color(chtype *ch, short *fore, short *back) | ||
770 | { | ||
771 | int attr; | ||
772 | short f, b; | ||
773 | |||
774 | attr = PAIR_NUMBER(*ch); | ||
775 | |||
776 | if (attr) | ||
777 | { | ||
778 | PDC_pair_content(attr, &f, &b); | ||
779 | *fore = 7 - (f % 8); | ||
780 | *back = 7 - (b % 8); | ||
781 | } | ||
782 | else | ||
783 | { | ||
784 | if (*ch & A_REVERSE) | ||
785 | { | ||
786 | *back = COLOR_BLACK; | ||
787 | *fore = COLOR_WHITE; | ||
788 | } | ||
789 | else | ||
790 | { | ||
791 | *back = COLOR_WHITE; | ||
792 | *fore = COLOR_BLACK; | ||
793 | } | ||
794 | } | ||
795 | } | ||
796 | |||
797 | static void _get_icon(void) | ||
798 | { | ||
799 | XIconSize *icon_size; | ||
800 | int size_count = 0; | ||
801 | Status rc; | ||
802 | unsigned char *bitmap_bits = NULL; | ||
803 | unsigned icon_bitmap_width = 0, icon_bitmap_height = 0, | ||
804 | file_bitmap_width = 0, file_bitmap_height = 0; | ||
805 | |||
806 | XC_LOG(("_get_icon() - called\n")); | ||
807 | |||
808 | icon_size = XAllocIconSize(); | ||
809 | |||
810 | rc = XGetIconSizes(XtDisplay(topLevel), | ||
811 | RootWindowOfScreen(XtScreen(topLevel)), | ||
812 | &icon_size, &size_count); | ||
813 | |||
814 | /* if the WM can advise on icon sizes... */ | ||
815 | |||
816 | if (rc && size_count) | ||
817 | { | ||
818 | int i, max_height = 0, max_width = 0; | ||
819 | |||
820 | PDC_LOG(("%s:size_count: %d rc: %d\n", XCLOGMSG, size_count, rc)); | ||
821 | |||
822 | for (i = 0; i < size_count; i++) | ||
823 | { | ||
824 | if (icon_size[i].max_width > max_width) | ||
825 | max_width = icon_size[i].max_width; | ||
826 | if (icon_size[i].max_height > max_height) | ||
827 | max_height = icon_size[i].max_height; | ||
828 | |||
829 | PDC_LOG(("%s:min: %d %d\n", XCLOGMSG, | ||
830 | icon_size[i].min_width, icon_size[i].min_height)); | ||
831 | |||
832 | PDC_LOG(("%s:max: %d %d\n", XCLOGMSG, | ||
833 | icon_size[i].max_width, icon_size[i].max_height)); | ||
834 | |||
835 | PDC_LOG(("%s:inc: %d %d\n", XCLOGMSG, | ||
836 | icon_size[i].width_inc, icon_size[i].height_inc)); | ||
837 | } | ||
838 | |||
839 | if (max_width >= big_icon_width && max_height >= big_icon_height) | ||
840 | { | ||
841 | icon_bitmap_width = big_icon_width; | ||
842 | icon_bitmap_height = big_icon_height; | ||
843 | bitmap_bits = (unsigned char *)big_icon_bits; | ||
844 | } | ||
845 | else | ||
846 | { | ||
847 | icon_bitmap_width = little_icon_width; | ||
848 | icon_bitmap_height = little_icon_height; | ||
849 | bitmap_bits = (unsigned char *)little_icon_bits; | ||
850 | } | ||
851 | |||
852 | } | ||
853 | else /* use small icon */ | ||
854 | { | ||
855 | icon_bitmap_width = little_icon_width; | ||
856 | icon_bitmap_height = little_icon_height; | ||
857 | bitmap_bits = (unsigned char *)little_icon_bits; | ||
858 | } | ||
859 | |||
860 | XFree(icon_size); | ||
861 | |||
862 | #ifdef HAVE_XPM_H | ||
863 | if (xc_app_data.pixmap && xc_app_data.pixmap[0]) /* supplied pixmap */ | ||
864 | { | ||
865 | XpmReadFileToPixmap(XtDisplay(topLevel), | ||
866 | RootWindowOfScreen(XtScreen(topLevel)), | ||
867 | (char *)xc_app_data.pixmap, | ||
868 | &icon_pixmap, &icon_pixmap_mask, NULL); | ||
869 | return; | ||
870 | } | ||
871 | #endif | ||
872 | |||
873 | if (xc_app_data.bitmap && xc_app_data.bitmap[0]) /* supplied bitmap */ | ||
874 | { | ||
875 | int x_hot = 0, y_hot = 0; | ||
876 | |||
877 | rc = XReadBitmapFile(XtDisplay(topLevel), | ||
878 | RootWindowOfScreen(XtScreen(topLevel)), | ||
879 | (char *)xc_app_data.bitmap, | ||
880 | &file_bitmap_width, &file_bitmap_height, | ||
881 | &icon_bitmap, &x_hot, &y_hot); | ||
882 | |||
883 | switch(rc) | ||
884 | { | ||
885 | case BitmapOpenFailed: | ||
886 | fprintf(stderr, "bitmap file %s: not found\n", | ||
887 | xc_app_data.bitmap); | ||
888 | break; | ||
889 | case BitmapFileInvalid: | ||
890 | fprintf(stderr, "bitmap file %s: contents invalid\n", | ||
891 | xc_app_data.bitmap); | ||
892 | break; | ||
893 | default: | ||
894 | return; | ||
895 | } | ||
896 | } | ||
897 | |||
898 | icon_bitmap = XCreateBitmapFromData(XtDisplay(topLevel), | ||
899 | RootWindowOfScreen(XtScreen(topLevel)), | ||
900 | (char *)bitmap_bits, icon_bitmap_width, icon_bitmap_height); | ||
901 | } | ||
902 | |||
903 | static void _draw_border(void) | ||
904 | { | ||
905 | /* Draw the border if required */ | ||
906 | |||
907 | if (xc_app_data.borderWidth) | ||
908 | XDrawRectangle(XCURSESDISPLAY, XCURSESWIN, border_gc, | ||
909 | xc_app_data.borderWidth / 2, | ||
910 | xc_app_data.borderWidth / 2, | ||
911 | window_width - xc_app_data.borderWidth, | ||
912 | window_height - xc_app_data.borderWidth); | ||
913 | } | ||
914 | |||
915 | /* Redraw the entire screen */ | ||
916 | |||
917 | static void _display_screen(void) | ||
918 | { | ||
919 | int row; | ||
920 | |||
921 | XC_LOG(("_display_screen() - called\n")); | ||
922 | |||
923 | for (row = 0; row < XCursesLINES; row++) | ||
924 | { | ||
925 | XC_get_line_lock(row); | ||
926 | |||
927 | _display_text((const chtype *)(Xcurscr + XCURSCR_Y_OFF(row)), | ||
928 | row, 0, COLS, FALSE); | ||
929 | |||
930 | XC_release_line_lock(row); | ||
931 | } | ||
932 | |||
933 | _redraw_cursor(); | ||
934 | _draw_border(); | ||
935 | } | ||
936 | |||
937 | /* Draw changed portions of the screen */ | ||
938 | |||
939 | static void _refresh_screen(void) | ||
940 | { | ||
941 | int row, start_col, num_cols; | ||
942 | |||
943 | XC_LOG(("_refresh_screen() - called\n")); | ||
944 | |||
945 | for (row = 0; row < XCursesLINES; row++) | ||
946 | { | ||
947 | num_cols = (int)*(Xcurscr + XCURSCR_LENGTH_OFF + row); | ||
948 | |||
949 | if (num_cols) | ||
950 | { | ||
951 | XC_get_line_lock(row); | ||
952 | |||
953 | start_col = (int)*(Xcurscr + XCURSCR_START_OFF + row); | ||
954 | |||
955 | _display_text((const chtype *)(Xcurscr + XCURSCR_Y_OFF(row) + | ||
956 | (start_col * sizeof(chtype))), row, start_col, | ||
957 | num_cols, FALSE); | ||
958 | |||
959 | *(Xcurscr + XCURSCR_LENGTH_OFF + row) = 0; | ||
960 | |||
961 | XC_release_line_lock(row); | ||
962 | } | ||
963 | } | ||
964 | |||
965 | if (mouse_selection) | ||
966 | _selection_off(); | ||
967 | } | ||
968 | |||
969 | static void _handle_expose(Widget w, XtPointer client_data, XEvent *event, | ||
970 | Boolean *unused) | ||
971 | { | ||
972 | XC_LOG(("_handle_expose() - called\n")); | ||
973 | |||
974 | /* ignore all Exposes except last */ | ||
975 | |||
976 | if (event->xexpose.count) | ||
977 | return; | ||
978 | |||
979 | if (after_first_curses_request && received_map_notify) | ||
980 | _display_screen(); | ||
981 | } | ||
982 | |||
983 | static void _handle_nonmaskable(Widget w, XtPointer client_data, XEvent *event, | ||
984 | Boolean *unused) | ||
985 | { | ||
986 | XClientMessageEvent *client_event = (XClientMessageEvent *)event; | ||
987 | |||
988 | PDC_LOG(("%s:_handle_nonmaskable called: xc_otherpid %d event %d\n", | ||
989 | XCLOGMSG, xc_otherpid, event->type)); | ||
990 | |||
991 | if (event->type == ClientMessage) | ||
992 | { | ||
993 | XC_LOG(("ClientMessage received\n")); | ||
994 | |||
995 | /* This code used to include handling of WM_SAVE_YOURSELF, but | ||
996 | it resulted in continual failure of THE on my Toshiba laptop. | ||
997 | Removed on 3-3-2001. Now only exits on WM_DELETE_WINDOW. */ | ||
998 | |||
999 | if ((Atom)client_event->data.s[0] == wm_atom[0]) | ||
1000 | _exit_process(0, SIGKILL, ""); | ||
1001 | } | ||
1002 | } | ||
1003 | |||
1004 | static void XCursesKeyPress(Widget w, XEvent *event, String *params, | ||
1005 | Cardinal *nparams) | ||
1006 | { | ||
1007 | enum { STATE_NORMAL, STATE_COMPOSE, STATE_CHAR }; | ||
1008 | |||
1009 | #ifdef PDC_XIM | ||
1010 | Status status; | ||
1011 | wchar_t buffer[120]; | ||
1012 | #else | ||
1013 | unsigned char buffer[120]; | ||
1014 | XComposeStatus compose; | ||
1015 | static int compose_state = STATE_NORMAL; | ||
1016 | static int compose_index = 0; | ||
1017 | int char_idx = 0; | ||
1018 | #endif | ||
1019 | unsigned long key = 0; | ||
1020 | int buflen = 40; | ||
1021 | int i, count; | ||
1022 | unsigned long modifier = 0; | ||
1023 | bool key_code = FALSE; | ||
1024 | |||
1025 | XC_LOG(("XCursesKeyPress() - called\n")); | ||
1026 | |||
1027 | /* Handle modifier keys first; ignore other KeyReleases */ | ||
1028 | |||
1029 | if (event->type == KeyRelease) | ||
1030 | { | ||
1031 | /* The keysym value was set by a previous call to this function | ||
1032 | with a KeyPress event (or reset by the mouse event handler) */ | ||
1033 | |||
1034 | if (SP->return_key_modifiers && | ||
1035 | #ifndef PDC_XIM | ||
1036 | keysym != compose_key && | ||
1037 | #endif | ||
1038 | IsModifierKey(keysym)) | ||
1039 | { | ||
1040 | switch (keysym) { | ||
1041 | case XK_Shift_L: | ||
1042 | key = KEY_SHIFT_L; | ||
1043 | break; | ||
1044 | case XK_Shift_R: | ||
1045 | key = KEY_SHIFT_R; | ||
1046 | break; | ||
1047 | case XK_Control_L: | ||
1048 | key = KEY_CONTROL_L; | ||
1049 | break; | ||
1050 | case XK_Control_R: | ||
1051 | key = KEY_CONTROL_R; | ||
1052 | break; | ||
1053 | case XK_Alt_L: | ||
1054 | key = KEY_ALT_L; | ||
1055 | break; | ||
1056 | case XK_Alt_R: | ||
1057 | key = KEY_ALT_R; | ||
1058 | } | ||
1059 | |||
1060 | if (key) | ||
1061 | _send_key_to_curses(key, NULL, TRUE); | ||
1062 | } | ||
1063 | |||
1064 | return; | ||
1065 | } | ||
1066 | |||
1067 | buffer[0] = '\0'; | ||
1068 | |||
1069 | #ifdef PDC_XIM | ||
1070 | count = XwcLookupString(Xic, &(event->xkey), buffer, buflen, | ||
1071 | &keysym, &status); | ||
1072 | #else | ||
1073 | count = XLookupString(&(event->xkey), (char *)buffer, buflen, | ||
1074 | &keysym, &compose); | ||
1075 | #endif | ||
1076 | |||
1077 | /* translate keysym into curses key code */ | ||
1078 | |||
1079 | PDC_LOG(("%s:Key mask: %x\n", XCLOGMSG, event->xkey.state)); | ||
1080 | |||
1081 | #ifdef PDCDEBUG | ||
1082 | for (i = 0; i < 4; i++) | ||
1083 | PDC_debug("%s:Keysym %x %d\n", XCLOGMSG, | ||
1084 | XKeycodeToKeysym(XCURSESDISPLAY, event->xkey.keycode, i), i); | ||
1085 | #endif | ||
1086 | |||
1087 | #ifndef PDC_XIM | ||
1088 | |||
1089 | /* Check if the key just pressed is the user-specified compose | ||
1090 | key; if it is, set the compose state and exit. */ | ||
1091 | |||
1092 | if (keysym == compose_key) | ||
1093 | { | ||
1094 | chtype *ch; | ||
1095 | int xpos, ypos, save_visibility = SP->visibility; | ||
1096 | short fore = 0, back = 0; | ||
1097 | |||
1098 | /* Change the shape of the cursor to an outline rectangle to | ||
1099 | indicate we are in "compose" status */ | ||
1100 | |||
1101 | SP->visibility = 0; | ||
1102 | |||
1103 | _redraw_cursor(); | ||
1104 | |||
1105 | SP->visibility = save_visibility; | ||
1106 | _make_xy(SP->curscol, SP->cursrow, &xpos, &ypos); | ||
1107 | |||
1108 | ch = (chtype *)(Xcurscr + XCURSCR_Y_OFF(SP->cursrow) + | ||
1109 | (SP->curscol * sizeof(chtype))); | ||
1110 | |||
1111 | _set_cursor_color(ch, &fore, &back); | ||
1112 | |||
1113 | XSetForeground(XCURSESDISPLAY, rect_cursor_gc, colors[back]); | ||
1114 | |||
1115 | XDrawRectangle(XCURSESDISPLAY, XCURSESWIN, rect_cursor_gc, | ||
1116 | xpos + 1, ypos - font_height + | ||
1117 | xc_app_data.normalFont->descent + 1, | ||
1118 | font_width - 2, font_height - 2); | ||
1119 | |||
1120 | compose_state = STATE_COMPOSE; | ||
1121 | return; | ||
1122 | } | ||
1123 | |||
1124 | switch (compose_state) | ||
1125 | { | ||
1126 | case STATE_COMPOSE: | ||
1127 | if (IsModifierKey(keysym)) | ||
1128 | return; | ||
1129 | |||
1130 | if (event->xkey.state & compose_mask) | ||
1131 | { | ||
1132 | compose_state = STATE_NORMAL; | ||
1133 | _redraw_cursor(); | ||
1134 | break; | ||
1135 | } | ||
1136 | |||
1137 | if (buffer[0] && count == 1) | ||
1138 | key = buffer[0]; | ||
1139 | |||
1140 | compose_index = -1; | ||
1141 | |||
1142 | for (i = 0; i < (int)strlen(compose_chars); i++) | ||
1143 | if (compose_chars[i] == key) | ||
1144 | { | ||
1145 | compose_index = i; | ||
1146 | break; | ||
1147 | } | ||
1148 | |||
1149 | if (compose_index == -1) | ||
1150 | { | ||
1151 | compose_state = STATE_NORMAL; | ||
1152 | compose_index = 0; | ||
1153 | _redraw_cursor(); | ||
1154 | break; | ||
1155 | } | ||
1156 | |||
1157 | compose_state = STATE_CHAR; | ||
1158 | return; | ||
1159 | |||
1160 | case STATE_CHAR: | ||
1161 | if (IsModifierKey(keysym)) | ||
1162 | return; | ||
1163 | |||
1164 | if (event->xkey.state & compose_mask) | ||
1165 | { | ||
1166 | compose_state = STATE_NORMAL; | ||
1167 | _redraw_cursor(); | ||
1168 | break; | ||
1169 | } | ||
1170 | |||
1171 | if (buffer[0] && count == 1) | ||
1172 | key = buffer[0]; | ||
1173 | |||
1174 | char_idx = -1; | ||
1175 | |||
1176 | for (i = 0; i < MAX_COMPOSE_CHARS; i++) | ||
1177 | if (compose_lookups[compose_index][i] == key) | ||
1178 | { | ||
1179 | char_idx = i; | ||
1180 | break; | ||
1181 | } | ||
1182 | |||
1183 | if (char_idx == -1) | ||
1184 | { | ||
1185 | compose_state = STATE_NORMAL; | ||
1186 | compose_index = 0; | ||
1187 | _redraw_cursor(); | ||
1188 | break; | ||
1189 | } | ||
1190 | |||
1191 | _send_key_to_curses(compose_keys[compose_index][char_idx], | ||
1192 | NULL, FALSE); | ||
1193 | |||
1194 | compose_state = STATE_NORMAL; | ||
1195 | compose_index = 0; | ||
1196 | |||
1197 | _redraw_cursor(); | ||
1198 | |||
1199 | return; | ||
1200 | } | ||
1201 | |||
1202 | #endif /* PDC_XIM */ | ||
1203 | |||
1204 | /* To get here we are procesing "normal" keys */ | ||
1205 | |||
1206 | PDC_LOG(("%s:Keysym %x %d\n", XCLOGMSG, | ||
1207 | XKeycodeToKeysym(XCURSESDISPLAY, event->xkey.keycode, key), key)); | ||
1208 | |||
1209 | if (SP->save_key_modifiers) | ||
1210 | { | ||
1211 | /* 0x10: usually, numlock modifier */ | ||
1212 | |||
1213 | if (event->xkey.state & Mod2Mask) | ||
1214 | modifier |= PDC_KEY_MODIFIER_NUMLOCK; | ||
1215 | |||
1216 | /* 0x01: shift modifier */ | ||
1217 | |||
1218 | if (event->xkey.state & ShiftMask) | ||
1219 | modifier |= PDC_KEY_MODIFIER_SHIFT; | ||
1220 | |||
1221 | /* 0x04: control modifier */ | ||
1222 | |||
1223 | if (event->xkey.state & ControlMask) | ||
1224 | modifier |= PDC_KEY_MODIFIER_CONTROL; | ||
1225 | |||
1226 | /* 0x08: usually, alt modifier */ | ||
1227 | |||
1228 | if (event->xkey.state & Mod1Mask) | ||
1229 | modifier |= PDC_KEY_MODIFIER_ALT; | ||
1230 | } | ||
1231 | |||
1232 | for (i = 0; key_table[i].keycode; i++) | ||
1233 | { | ||
1234 | if (key_table[i].keycode == keysym) | ||
1235 | { | ||
1236 | PDC_LOG(("%s:State %x\n", XCLOGMSG, event->xkey.state)); | ||
1237 | |||
1238 | /* ControlMask: 0x04: control modifier | ||
1239 | Mod1Mask: 0x08: usually, alt modifier | ||
1240 | Mod2Mask: 0x10: usually, numlock modifier | ||
1241 | ShiftMask: 0x01: shift modifier */ | ||
1242 | |||
1243 | if ((event->xkey.state & ShiftMask) || | ||
1244 | (key_table[i].numkeypad && | ||
1245 | (event->xkey.state & Mod2Mask))) | ||
1246 | { | ||
1247 | key = key_table[i].shifted; | ||
1248 | } | ||
1249 | else if (event->xkey.state & ControlMask) | ||
1250 | { | ||
1251 | key = key_table[i].control; | ||
1252 | } | ||
1253 | else if (event->xkey.state & Mod1Mask) | ||
1254 | { | ||
1255 | key = key_table[i].alt; | ||
1256 | } | ||
1257 | |||
1258 | /* To get here, we ignore all other modifiers */ | ||
1259 | |||
1260 | else | ||
1261 | key = key_table[i].normal; | ||
1262 | |||
1263 | key_code = (key > 0x100); | ||
1264 | break; | ||
1265 | } | ||
1266 | } | ||
1267 | |||
1268 | if (!key && buffer[0] && count == 1) | ||
1269 | key = buffer[0]; | ||
1270 | |||
1271 | PDC_LOG(("%s:Key: %s pressed - %x Mod: %x\n", XCLOGMSG, | ||
1272 | XKeysymToString(keysym), key, event->xkey.state)); | ||
1273 | |||
1274 | /* Handle ALT letters and numbers */ | ||
1275 | |||
1276 | if (event->xkey.state == Mod1Mask) | ||
1277 | { | ||
1278 | if (key >= 'A' && key <= 'Z') | ||
1279 | { | ||
1280 | key += ALT_A - 'A'; | ||
1281 | key_code = TRUE; | ||
1282 | } | ||
1283 | |||
1284 | if (key >= 'a' && key <= 'z') | ||
1285 | { | ||
1286 | key += ALT_A - 'a'; | ||
1287 | key_code = TRUE; | ||
1288 | } | ||
1289 | |||
1290 | if (key >= '0' && key <= '9') | ||
1291 | { | ||
1292 | key += ALT_0 - '0'; | ||
1293 | key_code = TRUE; | ||
1294 | } | ||
1295 | } | ||
1296 | |||
1297 | /* After all that, send the key back to the application if is | ||
1298 | NOT zero. */ | ||
1299 | |||
1300 | if (key) | ||
1301 | { | ||
1302 | key |= (modifier << 24); | ||
1303 | |||
1304 | _send_key_to_curses(key, NULL, key_code); | ||
1305 | } | ||
1306 | } | ||
1307 | |||
1308 | static void XCursesHandleString(Widget w, XEvent *event, String *params, | ||
1309 | Cardinal *nparams) | ||
1310 | { | ||
1311 | unsigned char *ptr; | ||
1312 | |||
1313 | if (*nparams != 1) | ||
1314 | return; | ||
1315 | |||
1316 | ptr = (unsigned char *)*params; | ||
1317 | |||
1318 | if (ptr[0] == '0' && ptr[1] == 'x' && ptr[2] != '\0') | ||
1319 | { | ||
1320 | unsigned char c; | ||
1321 | unsigned long total = 0; | ||
1322 | |||
1323 | for (ptr += 2; (c = tolower(*ptr)); ptr++) | ||
1324 | { | ||
1325 | total <<= 4; | ||
1326 | |||
1327 | if (c >= '0' && c <= '9') | ||
1328 | total += c - '0'; | ||
1329 | else | ||
1330 | if (c >= 'a' && c <= 'f') | ||
1331 | total += c - ('a' - 10); | ||
1332 | else | ||
1333 | break; | ||
1334 | } | ||
1335 | |||
1336 | if (c == '\0') | ||
1337 | _send_key_to_curses(total, NULL, FALSE); | ||
1338 | } | ||
1339 | else | ||
1340 | for (; *ptr; ptr++) | ||
1341 | _send_key_to_curses((unsigned long)*ptr, NULL, FALSE); | ||
1342 | } | ||
1343 | |||
1344 | static void _paste_string(Widget w, XtPointer data, Atom *selection, Atom *type, | ||
1345 | XtPointer value, unsigned long *length, int *format) | ||
1346 | { | ||
1347 | unsigned long i, key; | ||
1348 | unsigned char *string = value; | ||
1349 | |||
1350 | XC_LOG(("_paste_string() - called\n")); | ||
1351 | |||
1352 | if (!*type || !*length || !string) | ||
1353 | return; | ||
1354 | |||
1355 | for (i = 0; string[i] && (i < (*length)); i++) | ||
1356 | { | ||
1357 | key = string[i]; | ||
1358 | |||
1359 | if (key == 10) /* new line - convert to ^M */ | ||
1360 | key = 13; | ||
1361 | |||
1362 | _send_key_to_curses(key, NULL, FALSE); | ||
1363 | } | ||
1364 | |||
1365 | XtFree(value); | ||
1366 | } | ||
1367 | |||
1368 | static void _paste_utf8(Widget w, XtPointer event, Atom *selection, Atom *type, | ||
1369 | XtPointer value, unsigned long *length, int *format) | ||
1370 | { | ||
1371 | wchar_t key; | ||
1372 | size_t i = 0, len; | ||
1373 | char *string = value; | ||
1374 | |||
1375 | XC_LOG(("_paste_utf8() - called\n")); | ||
1376 | |||
1377 | if (!*type || !*length) | ||
1378 | { | ||
1379 | XtGetSelectionValue(w, XA_PRIMARY, XA_STRING, _paste_string, | ||
1380 | event, ((XButtonEvent *)event)->time); | ||
1381 | return; | ||
1382 | } | ||
1383 | |||
1384 | len = *length; | ||
1385 | |||
1386 | if (!string) | ||
1387 | return; | ||
1388 | |||
1389 | while (string[i] && (i < len)) | ||
1390 | { | ||
1391 | int retval = _from_utf8(&key, string + i, len - i); | ||
1392 | |||
1393 | if (retval < 1) | ||
1394 | return; | ||
1395 | |||
1396 | if (key == 10) /* new line - convert to ^M */ | ||
1397 | key = 13; | ||
1398 | |||
1399 | _send_key_to_curses(key, NULL, FALSE); | ||
1400 | |||
1401 | i += retval; | ||
1402 | } | ||
1403 | |||
1404 | XtFree(value); | ||
1405 | } | ||
1406 | |||
1407 | static void XCursesPasteSelection(Widget w, XButtonEvent *button_event) | ||
1408 | { | ||
1409 | XC_LOG(("XCursesPasteSelection() - called\n")); | ||
1410 | |||
1411 | XtGetSelectionValue(w, XA_PRIMARY, XA_UTF8_STRING(XtDisplay(w)), | ||
1412 | _paste_utf8, (XtPointer)button_event, | ||
1413 | button_event->time); | ||
1414 | } | ||
1415 | |||
1416 | static Boolean _convert_proc(Widget w, Atom *selection, Atom *target, | ||
1417 | Atom *type_return, XtPointer *value_return, | ||
1418 | unsigned long *length_return, int *format_return) | ||
1419 | { | ||
1420 | XC_LOG(("_convert_proc() - called\n")); | ||
1421 | |||
1422 | if (*target == XA_TARGETS(XtDisplay(topLevel))) | ||
1423 | { | ||
1424 | XSelectionRequestEvent *req = XtGetSelectionRequest(w, | ||
1425 | *selection, (XtRequestId)NULL); | ||
1426 | |||
1427 | Atom *targetP; | ||
1428 | XPointer std_targets; | ||
1429 | unsigned long std_length; | ||
1430 | |||
1431 | XmuConvertStandardSelection(topLevel, req->time, selection, | ||
1432 | target, type_return, &std_targets, | ||
1433 | &std_length, format_return); | ||
1434 | |||
1435 | *length_return = std_length + 2; | ||
1436 | *value_return = XtMalloc(sizeof(Atom) * (*length_return)); | ||
1437 | |||
1438 | targetP = *(Atom**)value_return; | ||
1439 | *targetP++ = XA_STRING; | ||
1440 | *targetP++ = XA_UTF8_STRING(XtDisplay(topLevel)); | ||
1441 | |||
1442 | memmove((void *)targetP, (const void *)std_targets, | ||
1443 | sizeof(Atom) * std_length); | ||
1444 | |||
1445 | XtFree((char *)std_targets); | ||
1446 | *type_return = XA_ATOM; | ||
1447 | *format_return = sizeof(Atom) * 8; | ||
1448 | |||
1449 | return True; | ||
1450 | } | ||
1451 | else if (*target == XA_UTF8_STRING(XtDisplay(topLevel)) || | ||
1452 | *target == XA_STRING) | ||
1453 | { | ||
1454 | bool utf8 = !(*target == XA_STRING); | ||
1455 | char *data = XtMalloc(tmpsel_length * 3 + 1); | ||
1456 | chtype *tmp = tmpsel; | ||
1457 | int ret_length = 0; | ||
1458 | |||
1459 | if (utf8) | ||
1460 | { | ||
1461 | while (*tmp) | ||
1462 | ret_length += _to_utf8(data + ret_length, *tmp++); | ||
1463 | } | ||
1464 | else | ||
1465 | while (*tmp) | ||
1466 | data[ret_length++] = *tmp++ & 0xff; | ||
1467 | |||
1468 | data[ret_length++] = '\0'; | ||
1469 | |||
1470 | *value_return = data; | ||
1471 | *length_return = ret_length; | ||
1472 | *format_return = 8; | ||
1473 | *type_return = *target; | ||
1474 | |||
1475 | return True; | ||
1476 | } | ||
1477 | else | ||
1478 | return XmuConvertStandardSelection(topLevel, CurrentTime, | ||
1479 | selection, target, type_return, (XPointer*)value_return, | ||
1480 | length_return, format_return); | ||
1481 | } | ||
1482 | |||
1483 | static void _lose_ownership(Widget w, Atom *type) | ||
1484 | { | ||
1485 | XC_LOG(("_lose_ownership() - called\n")); | ||
1486 | |||
1487 | if (tmpsel) | ||
1488 | free(tmpsel); | ||
1489 | |||
1490 | tmpsel = NULL; | ||
1491 | tmpsel_length = 0; | ||
1492 | _selection_off(); | ||
1493 | } | ||
1494 | |||
1495 | static void _show_selection(int start_x, int start_y, int end_x, int end_y, | ||
1496 | bool highlight) | ||
1497 | { | ||
1498 | int i, num_cols, start_col, row; | ||
1499 | |||
1500 | PDC_LOG(("%s:_show_selection() - called StartX: %d StartY: %d " | ||
1501 | "EndX: %d EndY: %d Highlight: %d\n", XCLOGMSG, | ||
1502 | start_x, start_y, end_x, end_y, highlight)); | ||
1503 | |||
1504 | for (i = 0; i < end_y - start_y + 1; i++) | ||
1505 | { | ||
1506 | if (start_y == end_y) /* only one line */ | ||
1507 | { | ||
1508 | start_col = start_x; | ||
1509 | num_cols = end_x - start_x + 1; | ||
1510 | row = start_y; | ||
1511 | } | ||
1512 | else if (!i) /* first line */ | ||
1513 | { | ||
1514 | start_col = start_x; | ||
1515 | num_cols = COLS - start_x; | ||
1516 | row = start_y; | ||
1517 | } | ||
1518 | else if (start_y + i == end_y) /* last line */ | ||
1519 | { | ||
1520 | start_col = 0; | ||
1521 | num_cols = end_x + 1; | ||
1522 | row = end_y; | ||
1523 | } | ||
1524 | else /* full line */ | ||
1525 | { | ||
1526 | start_col = 0; | ||
1527 | num_cols = COLS; | ||
1528 | row = start_y + i; | ||
1529 | } | ||
1530 | |||
1531 | XC_get_line_lock(row); | ||
1532 | |||
1533 | _display_text((const chtype *)(Xcurscr + XCURSCR_Y_OFF(row) + | ||
1534 | (start_col * sizeof(chtype))), row, start_col, | ||
1535 | num_cols, highlight); | ||
1536 | |||
1537 | XC_release_line_lock(row); | ||
1538 | } | ||
1539 | } | ||
1540 | |||
1541 | static void _selection_off(void) | ||
1542 | { | ||
1543 | XC_LOG(("_selection_off() - called\n")); | ||
1544 | |||
1545 | _display_screen(); | ||
1546 | |||
1547 | selection_start_x = selection_start_y = selection_end_x = | ||
1548 | selection_end_y = 0; | ||
1549 | |||
1550 | mouse_selection = FALSE; | ||
1551 | } | ||
1552 | |||
1553 | static void _selection_on(int x, int y) | ||
1554 | { | ||
1555 | XC_LOG(("_selection_on() - called\n")); | ||
1556 | |||
1557 | selection_start_x = selection_end_x = x; | ||
1558 | selection_start_y = selection_end_y = y; | ||
1559 | } | ||
1560 | |||
1561 | static void _selection_extend(int x, int y) | ||
1562 | { | ||
1563 | int temp, current_start, current_end, current_start_x, | ||
1564 | current_end_x, current_start_y, current_end_y, new_start, | ||
1565 | new_end, new_start_x, new_end_x, new_start_y, new_end_y; | ||
1566 | |||
1567 | XC_LOG(("_selection_extend() - called\n")); | ||
1568 | |||
1569 | mouse_selection = TRUE; | ||
1570 | |||
1571 | /* convert x/y coordinates into start/stop */ | ||
1572 | |||
1573 | current_start = (selection_start_y * COLS) + selection_start_x; | ||
1574 | current_end = (selection_end_y * COLS) + selection_end_x; | ||
1575 | |||
1576 | if (current_start > current_end) | ||
1577 | { | ||
1578 | current_start_x = selection_end_x; | ||
1579 | current_start_y = selection_end_y; | ||
1580 | current_end_x = selection_start_x; | ||
1581 | current_end_y = selection_start_y; | ||
1582 | temp = current_start; | ||
1583 | current_start = current_end; | ||
1584 | current_end = temp; | ||
1585 | } | ||
1586 | else | ||
1587 | { | ||
1588 | current_end_x = selection_end_x; | ||
1589 | current_end_y = selection_end_y; | ||
1590 | current_start_x = selection_start_x; | ||
1591 | current_start_y = selection_start_y; | ||
1592 | } | ||
1593 | |||
1594 | /* Now we have the current selection as a linear expression. | ||
1595 | Convert the new position to a linear expression. */ | ||
1596 | |||
1597 | selection_end_x = x; | ||
1598 | selection_end_y = y; | ||
1599 | |||
1600 | /* convert x/y coordinates into start/stop */ | ||
1601 | |||
1602 | new_start = (selection_start_y * COLS) + selection_start_x; | ||
1603 | new_end = (selection_end_y * COLS) + selection_end_x; | ||
1604 | |||
1605 | if (new_start > new_end) | ||
1606 | { | ||
1607 | new_start_x = selection_end_x; | ||
1608 | new_start_y = selection_end_y; | ||
1609 | new_end_x = selection_start_x; | ||
1610 | new_end_y = selection_start_y; | ||
1611 | temp = new_start; | ||
1612 | new_start = new_end; | ||
1613 | new_end = temp; | ||
1614 | } | ||
1615 | else | ||
1616 | { | ||
1617 | new_end_x = selection_end_x; | ||
1618 | new_end_y = selection_end_y; | ||
1619 | new_start_x = selection_start_x; | ||
1620 | new_start_y = selection_start_y; | ||
1621 | } | ||
1622 | |||
1623 | if (new_end > current_end) | ||
1624 | _show_selection(current_end_x, current_end_y, new_end_x, | ||
1625 | new_end_y, TRUE); | ||
1626 | else if (new_end < current_end) | ||
1627 | _show_selection(new_end_x, new_end_y, current_end_x, | ||
1628 | current_end_y, FALSE); | ||
1629 | else if (new_start < current_start) | ||
1630 | _show_selection(new_start_x, new_start_y, current_start_x, | ||
1631 | current_start_y, TRUE); | ||
1632 | else if (new_start > current_start) | ||
1633 | _show_selection(current_start_x, current_start_y, | ||
1634 | new_start_x, new_start_y, FALSE); | ||
1635 | else | ||
1636 | _show_selection(current_start_x, current_start_y, | ||
1637 | new_start_x, new_start_y, TRUE); | ||
1638 | } | ||
1639 | |||
1640 | static void _selection_set(void) | ||
1641 | { | ||
1642 | int i, j, start, end, start_x, end_x, start_y, end_y, num_cols, | ||
1643 | start_col, row, num_chars, ch, last_nonblank, length, newlen; | ||
1644 | chtype *ptr = NULL; | ||
1645 | |||
1646 | XC_LOG(("_selection_set() - called\n")); | ||
1647 | |||
1648 | /* convert x/y coordinates into start/stop */ | ||
1649 | |||
1650 | start = (selection_start_y * COLS) + selection_start_x; | ||
1651 | end = (selection_end_y * COLS) + selection_end_x; | ||
1652 | |||
1653 | if (start == end) | ||
1654 | { | ||
1655 | if (tmpsel) | ||
1656 | free(tmpsel); | ||
1657 | |||
1658 | tmpsel = NULL; | ||
1659 | tmpsel_length = 0; | ||
1660 | |||
1661 | return; | ||
1662 | } | ||
1663 | |||
1664 | if (start > end) | ||
1665 | { | ||
1666 | start_x = selection_end_x; | ||
1667 | start_y = selection_end_y; | ||
1668 | end_x = selection_start_x; | ||
1669 | end_y = selection_start_y; | ||
1670 | length = start - end + 1; | ||
1671 | } | ||
1672 | else | ||
1673 | { | ||
1674 | end_x = selection_end_x; | ||
1675 | end_y = selection_end_y; | ||
1676 | start_x = selection_start_x; | ||
1677 | start_y = selection_start_y; | ||
1678 | length = end - start + 1; | ||
1679 | } | ||
1680 | |||
1681 | newlen = length + end_y - start_y + 2; | ||
1682 | |||
1683 | if (length > (int)tmpsel_length) | ||
1684 | { | ||
1685 | if (!tmpsel_length) | ||
1686 | tmpsel = malloc(newlen * sizeof(chtype)); | ||
1687 | else | ||
1688 | tmpsel = realloc(tmpsel, newlen * sizeof(chtype)); | ||
1689 | } | ||
1690 | |||
1691 | if (!tmpsel) | ||
1692 | { | ||
1693 | tmpsel_length = 0; | ||
1694 | return; | ||
1695 | } | ||
1696 | |||
1697 | tmpsel_length = length; | ||
1698 | num_chars = 0; | ||
1699 | |||
1700 | for (i = 0; i < end_y - start_y + 1; i++) | ||
1701 | { | ||
1702 | |||
1703 | if (start_y == end_y) /* only one line */ | ||
1704 | { | ||
1705 | start_col = start_x; | ||
1706 | num_cols = end_x - start_x + 1; | ||
1707 | row = start_y; | ||
1708 | } | ||
1709 | else if (!i) /* first line */ | ||
1710 | { | ||
1711 | start_col = start_x; | ||
1712 | num_cols = COLS - start_x; | ||
1713 | row = start_y; | ||
1714 | } | ||
1715 | else if (start_y + i == end_y) /* last line */ | ||
1716 | { | ||
1717 | start_col = 0; | ||
1718 | num_cols = end_x + 1; | ||
1719 | row = end_y; | ||
1720 | } | ||
1721 | else /* full line */ | ||
1722 | { | ||
1723 | start_col = 0; | ||
1724 | num_cols = COLS; | ||
1725 | row = start_y + i; | ||
1726 | } | ||
1727 | |||
1728 | XC_get_line_lock(row); | ||
1729 | |||
1730 | ptr = (chtype *)(Xcurscr + XCURSCR_Y_OFF(row) + | ||
1731 | start_col * sizeof(chtype)); | ||
1732 | |||
1733 | if (i < end_y - start_y) | ||
1734 | { | ||
1735 | last_nonblank = 0; | ||
1736 | |||
1737 | for (j = 0; j < num_cols; j++) | ||
1738 | { | ||
1739 | ch = (int)(ptr[j] & A_CHARTEXT); | ||
1740 | if (ch != (int)' ') | ||
1741 | last_nonblank = j; | ||
1742 | } | ||
1743 | } | ||
1744 | else | ||
1745 | last_nonblank = num_cols - 1; | ||
1746 | |||
1747 | for (j = 0; j <= last_nonblank; j++) | ||
1748 | tmpsel[num_chars++] = ptr[j]; | ||
1749 | |||
1750 | XC_release_line_lock(row); | ||
1751 | |||
1752 | if (i < end_y - start_y) | ||
1753 | tmpsel[num_chars++] = '\n'; | ||
1754 | } | ||
1755 | |||
1756 | tmpsel[num_chars] = '\0'; | ||
1757 | tmpsel_length = num_chars; | ||
1758 | } | ||
1759 | |||
1760 | static void _display_cursor(int old_row, int old_x, int new_row, int new_x) | ||
1761 | { | ||
1762 | int xpos, ypos, i; | ||
1763 | chtype *ch; | ||
1764 | short fore = 0, back = 0; | ||
1765 | |||
1766 | PDC_LOG(("%s:_display_cursor() - draw char at row: %d col %d\n", | ||
1767 | XCLOGMSG, old_row, old_x)); | ||
1768 | |||
1769 | /* if the cursor position is outside the boundary of the screen, | ||
1770 | ignore the request */ | ||
1771 | |||
1772 | if (old_row >= XCursesLINES || old_x >= COLS || | ||
1773 | new_row >= XCursesLINES || new_x >= COLS) | ||
1774 | return; | ||
1775 | |||
1776 | /* display the character at the current cursor position */ | ||
1777 | |||
1778 | PDC_LOG(("%s:_display_cursor() - draw char at row: %d col %d\n", | ||
1779 | XCLOGMSG, old_row, old_x)); | ||
1780 | |||
1781 | _display_text((const chtype *)(Xcurscr + (XCURSCR_Y_OFF(old_row) + | ||
1782 | (old_x * sizeof(chtype)))), old_row, old_x, 1, FALSE); | ||
1783 | |||
1784 | /* display the cursor at the new cursor position */ | ||
1785 | |||
1786 | if (!SP->visibility) | ||
1787 | return; /* cursor not displayed, no more to do */ | ||
1788 | |||
1789 | _make_xy(new_x, new_row, &xpos, &ypos); | ||
1790 | |||
1791 | ch = (chtype *)(Xcurscr + XCURSCR_Y_OFF(new_row) + new_x * sizeof(chtype)); | ||
1792 | |||
1793 | _set_cursor_color(ch, &fore, &back); | ||
1794 | |||
1795 | if (vertical_cursor) | ||
1796 | { | ||
1797 | XSetForeground(XCURSESDISPLAY, rect_cursor_gc, colors[back]); | ||
1798 | |||
1799 | for (i = 1; i <= SP->visibility; i++) | ||
1800 | XDrawLine(XCURSESDISPLAY, XCURSESWIN, rect_cursor_gc, | ||
1801 | xpos + i, ypos - xc_app_data.normalFont->ascent, | ||
1802 | xpos + i, ypos - xc_app_data.normalFont->ascent + | ||
1803 | font_height - 1); | ||
1804 | } | ||
1805 | else | ||
1806 | { | ||
1807 | if (SP->visibility == 1) | ||
1808 | { | ||
1809 | /* cursor visibility normal */ | ||
1810 | |||
1811 | XSetForeground(XCURSESDISPLAY, rect_cursor_gc, colors[back]); | ||
1812 | |||
1813 | for (i = 0; i < xc_app_data.normalFont->descent + 2; i++) | ||
1814 | XDrawLine(XCURSESDISPLAY, XCURSESWIN, rect_cursor_gc, | ||
1815 | xpos, ypos - 2 + i, xpos + font_width, ypos - 2 + i); | ||
1816 | } | ||
1817 | else | ||
1818 | { | ||
1819 | /* cursor visibility high */ | ||
1820 | #ifdef PDC_WIDE | ||
1821 | XChar2b buf[2]; | ||
1822 | |||
1823 | buf[0].byte1 = (*ch & 0xff00) >> 8; | ||
1824 | buf[0].byte2 = *ch & 0x00ff; | ||
1825 | |||
1826 | buf[1].byte1 = buf[1].byte2 = 0; | ||
1827 | #else | ||
1828 | char buf[2]; | ||
1829 | |||
1830 | buf[0] = *ch & 0xff; | ||
1831 | buf[1] = '\0'; | ||
1832 | #endif | ||
1833 | XSetForeground(XCURSESDISPLAY, block_cursor_gc, colors[fore]); | ||
1834 | XSetBackground(XCURSESDISPLAY, block_cursor_gc, colors[back]); | ||
1835 | #ifdef PDC_WIDE | ||
1836 | XDrawImageString16( | ||
1837 | #else | ||
1838 | XDrawImageString( | ||
1839 | #endif | ||
1840 | XCURSESDISPLAY, XCURSESWIN, block_cursor_gc, | ||
1841 | xpos, ypos, buf, 1); | ||
1842 | } | ||
1843 | } | ||
1844 | |||
1845 | PDC_LOG(("%s:_display_cursor() - draw cursor at row %d col %d\n", | ||
1846 | XCLOGMSG, new_row, new_x)); | ||
1847 | } | ||
1848 | |||
1849 | static void _redraw_cursor(void) | ||
1850 | { | ||
1851 | _display_cursor(SP->cursrow, SP->curscol, SP->cursrow, SP->curscol); | ||
1852 | } | ||
1853 | |||
1854 | static void _handle_enter_leave(Widget w, XtPointer client_data, | ||
1855 | XEvent *event, Boolean *unused) | ||
1856 | { | ||
1857 | XC_LOG(("_handle_enter_leave called\n")); | ||
1858 | |||
1859 | switch(event->type) | ||
1860 | { | ||
1861 | case EnterNotify: | ||
1862 | XC_LOG(("EnterNotify received\n")); | ||
1863 | |||
1864 | window_entered = TRUE; | ||
1865 | break; | ||
1866 | |||
1867 | case LeaveNotify: | ||
1868 | XC_LOG(("LeaveNotify received\n")); | ||
1869 | |||
1870 | window_entered = FALSE; | ||
1871 | |||
1872 | /* Display the cursor so it stays on while the window is | ||
1873 | not current */ | ||
1874 | |||
1875 | _redraw_cursor(); | ||
1876 | break; | ||
1877 | |||
1878 | default: | ||
1879 | PDC_LOG(("%s:_handle_enter_leave - unknown event %d\n", | ||
1880 | XCLOGMSG, event->type)); | ||
1881 | } | ||
1882 | } | ||
1883 | |||
1884 | static void _send_key_to_curses(unsigned long key, MOUSE_STATUS *ms, | ||
1885 | bool key_code) | ||
1886 | { | ||
1887 | PDC_LOG(("%s:_send_key_to_curses() - called: sending %d\n", | ||
1888 | XCLOGMSG, key)); | ||
1889 | |||
1890 | SP->key_code = key_code; | ||
1891 | |||
1892 | if (XC_write_socket(xc_key_sock, &key, sizeof(unsigned long)) < 0) | ||
1893 | _exit_process(1, SIGKILL, "exiting from _send_key_to_curses"); | ||
1894 | |||
1895 | if (ms) | ||
1896 | { | ||
1897 | MOUSE_LOG(("%s:writing mouse stuff\n", XCLOGMSG)); | ||
1898 | |||
1899 | if (XC_write_socket(xc_key_sock, ms, sizeof(MOUSE_STATUS)) < 0) | ||
1900 | _exit_process(1, SIGKILL, "exiting from _send_key_to_curses"); | ||
1901 | } | ||
1902 | } | ||
1903 | |||
1904 | static void _blink_cursor(XtPointer unused, XtIntervalId *id) | ||
1905 | { | ||
1906 | XC_LOG(("_blink_cursor() - called:\n")); | ||
1907 | |||
1908 | if (window_entered) | ||
1909 | { | ||
1910 | if (visible_cursor) | ||
1911 | { | ||
1912 | /* Cursor currently ON, turn it off */ | ||
1913 | |||
1914 | int save_visibility = SP->visibility; | ||
1915 | SP->visibility = 0; | ||
1916 | _redraw_cursor(); | ||
1917 | SP->visibility = save_visibility; | ||
1918 | visible_cursor = FALSE; | ||
1919 | } | ||
1920 | else | ||
1921 | { | ||
1922 | /* Cursor currently OFF, turn it on */ | ||
1923 | |||
1924 | _redraw_cursor(); | ||
1925 | visible_cursor = TRUE; | ||
1926 | } | ||
1927 | } | ||
1928 | |||
1929 | XtAppAddTimeOut(app_context, xc_app_data.cursorBlinkRate, | ||
1930 | _blink_cursor, NULL); | ||
1931 | } | ||
1932 | |||
1933 | static void XCursesButton(Widget w, XEvent *event, String *params, | ||
1934 | Cardinal *nparams) | ||
1935 | { | ||
1936 | int button_no; | ||
1937 | static int last_button_no = 0; | ||
1938 | static Time last_button_press_time = 0; | ||
1939 | MOUSE_STATUS save_mouse_status; | ||
1940 | bool send_key = TRUE; | ||
1941 | static bool remove_release; | ||
1942 | static bool handle_real_release; | ||
1943 | |||
1944 | XC_LOG(("XCursesButton() - called\n")); | ||
1945 | |||
1946 | keysym = 0; /* suppress any modifier key return */ | ||
1947 | |||
1948 | save_mouse_status = Mouse_status; | ||
1949 | button_no = event->xbutton.button; | ||
1950 | |||
1951 | /* It appears that under X11R6 (at least on Linux), that an | ||
1952 | event_type of ButtonMotion does not include the mouse button in | ||
1953 | the event. The following code is designed to cater for this | ||
1954 | situation. */ | ||
1955 | |||
1956 | if (!button_no) | ||
1957 | button_no = last_button_no; | ||
1958 | |||
1959 | last_button_no = button_no; | ||
1960 | |||
1961 | Mouse_status.changes = 0; | ||
1962 | |||
1963 | switch(event->type) | ||
1964 | { | ||
1965 | case ButtonPress: | ||
1966 | /* Handle button 4 and 5, which are normally mapped to the wheel | ||
1967 | mouse scroll up and down */ | ||
1968 | |||
1969 | if (button_no == 4 || button_no == 5) | ||
1970 | { | ||
1971 | /* Send the KEY_MOUSE to curses program */ | ||
1972 | |||
1973 | memset(&Mouse_status, 0, sizeof(Mouse_status)); | ||
1974 | |||
1975 | Mouse_status.changes = (button_no == 5) ? | ||
1976 | PDC_MOUSE_WHEEL_DOWN : PDC_MOUSE_WHEEL_UP; | ||
1977 | |||
1978 | MOUSE_X_POS = MOUSE_Y_POS = -1; | ||
1979 | _send_key_to_curses(KEY_MOUSE, &Mouse_status, TRUE); | ||
1980 | remove_release = TRUE; | ||
1981 | |||
1982 | return; | ||
1983 | } | ||
1984 | |||
1985 | if (button_no == 2 && | ||
1986 | (!SP->_trap_mbe || (event->xbutton.state & ShiftMask))) | ||
1987 | { | ||
1988 | XCursesPasteSelection(drawing, (XButtonEvent *)event); | ||
1989 | remove_release = TRUE; | ||
1990 | |||
1991 | return; | ||
1992 | } | ||
1993 | |||
1994 | remove_release = False; | ||
1995 | handle_real_release = False; | ||
1996 | |||
1997 | MOUSE_LOG(("\nButtonPress\n")); | ||
1998 | |||
1999 | if ((event->xbutton.time - last_button_press_time) < | ||
2000 | xc_app_data.doubleClickPeriod) | ||
2001 | { | ||
2002 | MOUSE_X_POS = save_mouse_status.x; | ||
2003 | MOUSE_Y_POS = save_mouse_status.y; | ||
2004 | BUTTON_STATUS(button_no) = BUTTON_DOUBLE_CLICKED; | ||
2005 | |||
2006 | _selection_off(); | ||
2007 | remove_release = True; | ||
2008 | } | ||
2009 | else | ||
2010 | { | ||
2011 | napms(SP->mouse_wait); | ||
2012 | event->type = ButtonRelease; | ||
2013 | XSendEvent(event->xbutton.display, event->xbutton.window, | ||
2014 | True, 0, event); | ||
2015 | last_button_press_time = event->xbutton.time; | ||
2016 | |||
2017 | return; | ||
2018 | } | ||
2019 | |||
2020 | last_button_press_time = event->xbutton.time; | ||
2021 | break; | ||
2022 | |||
2023 | case MotionNotify: | ||
2024 | MOUSE_LOG(("\nMotionNotify: y: %d x: %d Width: %d " | ||
2025 | "Height: %d\n", event->xbutton.y, event->xbutton.x, | ||
2026 | font_width, font_height)); | ||
2027 | |||
2028 | MOUSE_X_POS = (event->xbutton.x - xc_app_data.borderWidth) / | ||
2029 | font_width; | ||
2030 | MOUSE_Y_POS = (event->xbutton.y - xc_app_data.borderWidth) / | ||
2031 | font_height; | ||
2032 | |||
2033 | if (button_no == 1 && | ||
2034 | (!SP->_trap_mbe || (event->xbutton.state & ShiftMask))) | ||
2035 | { | ||
2036 | _selection_extend(MOUSE_X_POS, MOUSE_Y_POS); | ||
2037 | send_key = FALSE; | ||
2038 | } | ||
2039 | else | ||
2040 | _selection_off(); | ||
2041 | |||
2042 | /* Throw away mouse movements if they are in the same character | ||
2043 | position as the last mouse event, or if we are currently in | ||
2044 | the middle of a double click event. */ | ||
2045 | |||
2046 | if ((MOUSE_X_POS == save_mouse_status.x && | ||
2047 | MOUSE_Y_POS == save_mouse_status.y) || | ||
2048 | save_mouse_status.button[button_no - 1] == BUTTON_DOUBLE_CLICKED) | ||
2049 | { | ||
2050 | send_key = FALSE; | ||
2051 | break; | ||
2052 | } | ||
2053 | |||
2054 | Mouse_status.changes |= PDC_MOUSE_MOVED; | ||
2055 | break; | ||
2056 | |||
2057 | case ButtonRelease: | ||
2058 | if (remove_release) | ||
2059 | { | ||
2060 | MOUSE_LOG(("Release at: %ld - removed\n", event->xbutton.time)); | ||
2061 | return; | ||
2062 | } | ||
2063 | else | ||
2064 | { | ||
2065 | MOUSE_X_POS = (event->xbutton.x - xc_app_data.borderWidth) / | ||
2066 | font_width; | ||
2067 | MOUSE_Y_POS = (event->xbutton.y - xc_app_data.borderWidth) / | ||
2068 | font_height; | ||
2069 | |||
2070 | if (!handle_real_release) | ||
2071 | { | ||
2072 | if ((event->xbutton.time - last_button_press_time) < | ||
2073 | SP->mouse_wait && | ||
2074 | (event->xbutton.time != last_button_press_time)) | ||
2075 | { | ||
2076 | /* The "real" release was shorter than usleep() time; | ||
2077 | therefore generate a click event */ | ||
2078 | |||
2079 | MOUSE_LOG(("Release at: %ld - click\n", | ||
2080 | event->xbutton.time)); | ||
2081 | |||
2082 | BUTTON_STATUS(button_no) = BUTTON_CLICKED; | ||
2083 | |||
2084 | if (button_no == 1 && mouse_selection && | ||
2085 | (!SP->_trap_mbe || (event->xbutton.state & ShiftMask))) | ||
2086 | { | ||
2087 | send_key = FALSE; | ||
2088 | |||
2089 | if (XtOwnSelection(topLevel, XA_PRIMARY, | ||
2090 | event->xbutton.time, _convert_proc, | ||
2091 | _lose_ownership, NULL) == False) | ||
2092 | _selection_off(); | ||
2093 | } | ||
2094 | else | ||
2095 | _selection_off(); | ||
2096 | |||
2097 | /* Ensure the "pseudo" release event is ignored */ | ||
2098 | |||
2099 | remove_release = True; | ||
2100 | handle_real_release = False; | ||
2101 | break; | ||
2102 | } | ||
2103 | else | ||
2104 | { | ||
2105 | /* Button release longer than usleep() time; | ||
2106 | therefore generate a press and wait for the real | ||
2107 | release to occur later. */ | ||
2108 | |||
2109 | MOUSE_LOG(("Generated Release at: %ld - " | ||
2110 | "press & release\n", event->xbutton.time)); | ||
2111 | |||
2112 | BUTTON_STATUS(button_no) = BUTTON_PRESSED; | ||
2113 | |||
2114 | if (button_no == 1 && | ||
2115 | (!SP->_trap_mbe || (event->xbutton.state & ShiftMask))) | ||
2116 | { | ||
2117 | _selection_off(); | ||
2118 | _selection_on(MOUSE_X_POS, MOUSE_Y_POS); | ||
2119 | } | ||
2120 | |||
2121 | handle_real_release = True; | ||
2122 | break; | ||
2123 | } | ||
2124 | } | ||
2125 | else | ||
2126 | { | ||
2127 | MOUSE_LOG(("Release at: %ld - released\n", | ||
2128 | event->xbutton.time)); | ||
2129 | } | ||
2130 | } | ||
2131 | |||
2132 | MOUSE_LOG(("\nButtonRelease\n")); | ||
2133 | |||
2134 | BUTTON_STATUS(button_no) = BUTTON_RELEASED; | ||
2135 | |||
2136 | if (button_no == 1 && mouse_selection && | ||
2137 | (!SP->_trap_mbe || (event->xbutton.state & ShiftMask))) | ||
2138 | { | ||
2139 | send_key = FALSE; | ||
2140 | |||
2141 | if (XtOwnSelection(topLevel, XA_PRIMARY, | ||
2142 | event->xbutton.time, _convert_proc, | ||
2143 | _lose_ownership, NULL) == False) | ||
2144 | _selection_off(); | ||
2145 | |||
2146 | _selection_set(); | ||
2147 | } | ||
2148 | else | ||
2149 | _selection_off(); | ||
2150 | |||
2151 | break; | ||
2152 | } | ||
2153 | |||
2154 | /* Set up the mouse status fields in preparation for sending */ | ||
2155 | |||
2156 | Mouse_status.changes |= 1 << (button_no - 1); | ||
2157 | |||
2158 | if (Mouse_status.changes & PDC_MOUSE_MOVED && | ||
2159 | BUTTON_STATUS(button_no) == BUTTON_PRESSED) | ||
2160 | BUTTON_STATUS(button_no) = BUTTON_MOVED; | ||
2161 | |||
2162 | if (event->xbutton.state & ShiftMask) | ||
2163 | BUTTON_STATUS(button_no) |= BUTTON_SHIFT; | ||
2164 | if (event->xbutton.state & ControlMask) | ||
2165 | BUTTON_STATUS(button_no) |= BUTTON_CONTROL; | ||
2166 | if (event->xbutton.state & Mod1Mask) | ||
2167 | BUTTON_STATUS(button_no) |= BUTTON_ALT; | ||
2168 | |||
2169 | /* If we are ignoring the event, or the mouse position is outside | ||
2170 | the bounds of the screen (because of the border), return here */ | ||
2171 | |||
2172 | MOUSE_LOG(("Button: %d x: %d y: %d Button status: %x " | ||
2173 | "Mouse status: %x\n", button_no, MOUSE_X_POS, MOUSE_Y_POS, | ||
2174 | BUTTON_STATUS(button_no), Mouse_status.changes)); | ||
2175 | |||
2176 | MOUSE_LOG(("Send: %d Button1: %x Button2: %x Button3: %x %d %d\n", | ||
2177 | send_key, BUTTON_STATUS(1), BUTTON_STATUS(2), | ||
2178 | BUTTON_STATUS(3), XCursesLINES, XCursesCOLS)); | ||
2179 | |||
2180 | if (!send_key || MOUSE_X_POS < 0 || MOUSE_X_POS >= XCursesCOLS || | ||
2181 | MOUSE_Y_POS < 0 || MOUSE_Y_POS >= XCursesLINES) | ||
2182 | return; | ||
2183 | |||
2184 | /* Send the KEY_MOUSE to curses program */ | ||
2185 | |||
2186 | _send_key_to_curses(KEY_MOUSE, &Mouse_status, TRUE); | ||
2187 | } | ||
2188 | |||
2189 | static void _scroll_up_down(Widget w, XtPointer client_data, | ||
2190 | XtPointer call_data) | ||
2191 | { | ||
2192 | int pixels = (long) call_data; | ||
2193 | int total_y = SP->sb_total_y * font_height; | ||
2194 | int viewport_y = SP->sb_viewport_y * font_height; | ||
2195 | int cur_y = SP->sb_cur_y * font_height; | ||
2196 | |||
2197 | /* When pixels is negative, right button pressed, move data down, | ||
2198 | thumb moves up. Otherwise, left button pressed, pixels positive, | ||
2199 | move data up, thumb down. */ | ||
2200 | |||
2201 | cur_y += pixels; | ||
2202 | |||
2203 | /* limit panning to size of overall */ | ||
2204 | |||
2205 | if (cur_y < 0) | ||
2206 | cur_y = 0; | ||
2207 | else | ||
2208 | if (cur_y > (total_y - viewport_y)) | ||
2209 | cur_y = total_y - viewport_y; | ||
2210 | |||
2211 | SP->sb_cur_y = cur_y / font_height; | ||
2212 | |||
2213 | XawScrollbarSetThumb(w, (double)((double)cur_y / (double)total_y), | ||
2214 | (double)((double)viewport_y / (double)total_y)); | ||
2215 | |||
2216 | /* Send a key: if pixels negative, send KEY_SCROLL_DOWN */ | ||
2217 | |||
2218 | _send_key_to_curses(KEY_SF, NULL, TRUE); | ||
2219 | } | ||
2220 | |||
2221 | static void _scroll_left_right(Widget w, XtPointer client_data, | ||
2222 | XtPointer call_data) | ||
2223 | { | ||
2224 | int pixels = (long) call_data; | ||
2225 | int total_x = SP->sb_total_x * font_width; | ||
2226 | int viewport_x = SP->sb_viewport_x * font_width; | ||
2227 | int cur_x = SP->sb_cur_x * font_width; | ||
2228 | |||
2229 | cur_x += pixels; | ||
2230 | |||
2231 | /* limit panning to size of overall */ | ||
2232 | |||
2233 | if (cur_x < 0) | ||
2234 | cur_x = 0; | ||
2235 | else | ||
2236 | if (cur_x > (total_x - viewport_x)) | ||
2237 | cur_x = total_x - viewport_x; | ||
2238 | |||
2239 | SP->sb_cur_x = cur_x / font_width; | ||
2240 | |||
2241 | XawScrollbarSetThumb(w, (double)((double)cur_x / (double)total_x), | ||
2242 | (double)((double)viewport_x / (double)total_x)); | ||
2243 | |||
2244 | _send_key_to_curses(KEY_SR, NULL, TRUE); | ||
2245 | } | ||
2246 | |||
2247 | static void _thumb_up_down(Widget w, XtPointer client_data, | ||
2248 | XtPointer call_data) | ||
2249 | { | ||
2250 | double percent = *(double *) call_data; | ||
2251 | double total_y = (double)SP->sb_total_y; | ||
2252 | double viewport_y = (double)SP->sb_viewport_y; | ||
2253 | int cur_y = SP->sb_cur_y; | ||
2254 | |||
2255 | /* If the size of the viewport is > overall area simply return, | ||
2256 | as no scrolling is permitted. */ | ||
2257 | |||
2258 | if (SP->sb_viewport_y >= SP->sb_total_y) | ||
2259 | return; | ||
2260 | |||
2261 | if ((SP->sb_cur_y = (int)((double)total_y * percent)) >= | ||
2262 | (total_y - viewport_y)) | ||
2263 | SP->sb_cur_y = total_y - viewport_y; | ||
2264 | |||
2265 | XawScrollbarSetThumb(w, (double)(cur_y / total_y), | ||
2266 | (double)(viewport_y / total_y)); | ||
2267 | |||
2268 | _send_key_to_curses(KEY_SF, NULL, TRUE); | ||
2269 | } | ||
2270 | |||
2271 | static void _thumb_left_right(Widget w, XtPointer client_data, | ||
2272 | XtPointer call_data) | ||
2273 | { | ||
2274 | double percent = *(double *) call_data; | ||
2275 | double total_x = (double)SP->sb_total_x; | ||
2276 | double viewport_x = (double)SP->sb_viewport_x; | ||
2277 | int cur_x = SP->sb_cur_x; | ||
2278 | |||
2279 | if (SP->sb_viewport_x >= SP->sb_total_x) | ||
2280 | return; | ||
2281 | |||
2282 | if ((SP->sb_cur_x = (int)((float)total_x * percent)) >= | ||
2283 | (total_x - viewport_x)) | ||
2284 | SP->sb_cur_x = total_x - viewport_x; | ||
2285 | |||
2286 | XawScrollbarSetThumb(w, (double)(cur_x / total_x), | ||
2287 | (double)(viewport_x / total_x)); | ||
2288 | |||
2289 | _send_key_to_curses(KEY_SR, NULL, TRUE); | ||
2290 | } | ||
2291 | |||
2292 | static void _exit_process(int rc, int sig, char *msg) | ||
2293 | { | ||
2294 | if (rc || sig) | ||
2295 | fprintf(stderr, "%s:_exit_process() - called: rc:%d sig:%d <%s>\n", | ||
2296 | XCLOGMSG, rc, sig, msg); | ||
2297 | |||
2298 | shmdt((char *)SP); | ||
2299 | shmdt((char *)Xcurscr); | ||
2300 | shmctl(shmidSP, IPC_RMID, 0); | ||
2301 | shmctl(shmid_Xcurscr, IPC_RMID, 0); | ||
2302 | |||
2303 | if (bitmap_file) | ||
2304 | { | ||
2305 | XFreePixmap(XCURSESDISPLAY, icon_bitmap); | ||
2306 | free(bitmap_file); | ||
2307 | } | ||
2308 | |||
2309 | #ifdef HAVE_XPM_H | ||
2310 | if (pixmap_file) | ||
2311 | { | ||
2312 | XFreePixmap(XCURSESDISPLAY, icon_pixmap); | ||
2313 | XFreePixmap(XCURSESDISPLAY, icon_pixmap_mask); | ||
2314 | free(pixmap_file); | ||
2315 | } | ||
2316 | #endif | ||
2317 | XFreeGC(XCURSESDISPLAY, normal_gc); | ||
2318 | XFreeGC(XCURSESDISPLAY, italic_gc); | ||
2319 | XFreeGC(XCURSESDISPLAY, block_cursor_gc); | ||
2320 | XFreeGC(XCURSESDISPLAY, rect_cursor_gc); | ||
2321 | XFreeGC(XCURSESDISPLAY, border_gc); | ||
2322 | #ifdef PDC_XIM | ||
2323 | XDestroyIC(Xic); | ||
2324 | #endif | ||
2325 | |||
2326 | shutdown(xc_display_sock, 2); | ||
2327 | close(xc_display_sock); | ||
2328 | |||
2329 | shutdown(xc_exit_sock, 2); | ||
2330 | close(xc_exit_sock); | ||
2331 | |||
2332 | shutdown(xc_key_sock, 2); | ||
2333 | close(xc_key_sock); | ||
2334 | |||
2335 | if (sig) | ||
2336 | kill(xc_otherpid, sig); /* to kill parent process */ | ||
2337 | |||
2338 | _exit(rc); | ||
2339 | } | ||
2340 | |||
2341 | static void _resize(void) | ||
2342 | { | ||
2343 | short save_atrtab[PDC_COLOR_PAIRS * 2]; | ||
2344 | |||
2345 | after_first_curses_request = FALSE; | ||
2346 | |||
2347 | SP->lines = XCursesLINES = ((resize_window_height - | ||
2348 | (2 * xc_app_data.borderWidth)) / font_height); | ||
2349 | |||
2350 | LINES = XCursesLINES - SP->linesrippedoff - SP->slklines; | ||
2351 | |||
2352 | SP->cols = COLS = XCursesCOLS = ((resize_window_width - | ||
2353 | (2 * xc_app_data.borderWidth)) / font_width); | ||
2354 | |||
2355 | window_width = resize_window_width; | ||
2356 | window_height = resize_window_height; | ||
2357 | visible_cursor = TRUE; | ||
2358 | |||
2359 | _draw_border(); | ||
2360 | |||
2361 | /* Detach and drop the current shared memory segment and create and | ||
2362 | attach to a new segment */ | ||
2363 | |||
2364 | memcpy(save_atrtab, xc_atrtab, sizeof(save_atrtab)); | ||
2365 | |||
2366 | SP->XcurscrSize = XCURSCR_SIZE; | ||
2367 | shmdt((char *)Xcurscr); | ||
2368 | shmctl(shmid_Xcurscr, IPC_RMID, 0); | ||
2369 | |||
2370 | if ((shmid_Xcurscr = shmget(shmkey_Xcurscr, | ||
2371 | SP->XcurscrSize + XCURSESSHMMIN, 0700 | IPC_CREAT)) < 0) | ||
2372 | { | ||
2373 | perror("Cannot allocate shared memory for curscr"); | ||
2374 | |||
2375 | _exit_process(4, SIGKILL, "exiting from _process_curses_requests"); | ||
2376 | } | ||
2377 | |||
2378 | Xcurscr = (unsigned char*)shmat(shmid_Xcurscr, 0, 0); | ||
2379 | memset(Xcurscr, 0, SP->XcurscrSize); | ||
2380 | xc_atrtab = (short *)(Xcurscr + XCURSCR_ATRTAB_OFF); | ||
2381 | memcpy(xc_atrtab, save_atrtab, sizeof(save_atrtab)); | ||
2382 | } | ||
2383 | |||
2384 | /* For PDC_set_title() */ | ||
2385 | |||
2386 | static void _set_title(void) | ||
2387 | { | ||
2388 | char title[1024]; /* big enough for window title */ | ||
2389 | int pos; | ||
2390 | |||
2391 | if ((XC_read_socket(xc_display_sock, &pos, sizeof(int)) < 0) || | ||
2392 | (XC_read_socket(xc_display_sock, title, pos) < 0)) | ||
2393 | { | ||
2394 | _exit_process(5, SIGKILL, "exiting from _set_title"); | ||
2395 | } | ||
2396 | |||
2397 | XtVaSetValues(topLevel, XtNtitle, title, NULL); | ||
2398 | } | ||
2399 | |||
2400 | /* For color_content() */ | ||
2401 | |||
2402 | static void _get_color(void) | ||
2403 | { | ||
2404 | XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); | ||
2405 | int index = tmp->pixel; | ||
2406 | Colormap cmap = DefaultColormap(XCURSESDISPLAY, | ||
2407 | DefaultScreen(XCURSESDISPLAY)); | ||
2408 | |||
2409 | if (index < 0 || index >= MAX_COLORS) | ||
2410 | _exit_process(4, SIGKILL, "exiting from _get_color"); | ||
2411 | |||
2412 | tmp->pixel = colors[index]; | ||
2413 | XQueryColor(XCURSESDISPLAY, cmap, tmp); | ||
2414 | } | ||
2415 | |||
2416 | /* For init_color() */ | ||
2417 | |||
2418 | static void _set_color(void) | ||
2419 | { | ||
2420 | XColor *tmp = (XColor *)(Xcurscr + XCURSCR_XCOLOR_OFF); | ||
2421 | int index = tmp->pixel; | ||
2422 | Colormap cmap = DefaultColormap(XCURSESDISPLAY, | ||
2423 | DefaultScreen(XCURSESDISPLAY)); | ||
2424 | |||
2425 | if (index < 0 || index >= MAX_COLORS) | ||
2426 | _exit_process(4, SIGKILL, "exiting from _set_color"); | ||
2427 | |||
2428 | if (XAllocColor(XCURSESDISPLAY, cmap, tmp)) | ||
2429 | { | ||
2430 | XFreeColors(XCURSESDISPLAY, cmap, colors + index, 1, 0); | ||
2431 | colors[index] = tmp->pixel; | ||
2432 | |||
2433 | _display_screen(); | ||
2434 | } | ||
2435 | } | ||
2436 | |||
2437 | /* For PDC_getclipboard() */ | ||
2438 | |||
2439 | static void _get_selection(Widget w, XtPointer data, Atom *selection, | ||
2440 | Atom *type, XtPointer value, | ||
2441 | unsigned long *length, int *format) | ||
2442 | { | ||
2443 | unsigned char *src = value; | ||
2444 | int pos, len = *length; | ||
2445 | |||
2446 | XC_LOG(("_get_selection() - called\n")); | ||
2447 | |||
2448 | if (!value && !len) | ||
2449 | { | ||
2450 | if (XC_write_display_socket_int(PDC_CLIP_EMPTY) < 0) | ||
2451 | _exit_process(4, SIGKILL, "exiting from _get_selection"); | ||
2452 | } | ||
2453 | else | ||
2454 | { | ||
2455 | /* Here all is OK, send PDC_CLIP_SUCCESS, then length, then | ||
2456 | contents */ | ||
2457 | |||
2458 | if (XC_write_display_socket_int(PDC_CLIP_SUCCESS) < 0) | ||
2459 | _exit_process(4, SIGKILL, "exiting from _get_selection"); | ||
2460 | |||
2461 | if (XC_write_display_socket_int(len) < 0) | ||
2462 | _exit_process(4, SIGKILL, "exiting from _get_selection"); | ||
2463 | |||
2464 | for (pos = 0; pos < len; pos++) | ||
2465 | { | ||
2466 | #ifdef PDC_WIDE | ||
2467 | wchar_t c; | ||
2468 | #else | ||
2469 | unsigned char c; | ||
2470 | #endif | ||
2471 | c = *src++; | ||
2472 | |||
2473 | if (XC_write_socket(xc_display_sock, &c, sizeof(c)) < 0) | ||
2474 | _exit_process(4, SIGKILL, "exiting from _get_selection"); | ||
2475 | } | ||
2476 | } | ||
2477 | } | ||
2478 | |||
2479 | #ifdef PDC_WIDE | ||
2480 | static void _get_selection_utf8(Widget w, XtPointer data, Atom *selection, | ||
2481 | Atom *type, XtPointer value, | ||
2482 | unsigned long *length, int *format) | ||
2483 | { | ||
2484 | int len = *length; | ||
2485 | |||
2486 | XC_LOG(("_get_selection_utf8() - called\n")); | ||
2487 | |||
2488 | if (!*type || !*length) | ||
2489 | { | ||
2490 | XtGetSelectionValue(w, XA_PRIMARY, XA_STRING, _get_selection, | ||
2491 | (XtPointer)NULL, 0); | ||
2492 | return; | ||
2493 | } | ||
2494 | |||
2495 | if (!value && !len) | ||
2496 | { | ||
2497 | if (XC_write_display_socket_int(PDC_CLIP_EMPTY) >= 0) | ||
2498 | return; | ||
2499 | } | ||
2500 | else | ||
2501 | { | ||
2502 | wchar_t *wcontents = malloc((len + 1) * sizeof(wchar_t)); | ||
2503 | char *src = value; | ||
2504 | int i = 0; | ||
2505 | |||
2506 | while (*src && i < (*length)) | ||
2507 | { | ||
2508 | int retval = _from_utf8(wcontents + i, src, len); | ||
2509 | |||
2510 | src += retval; | ||
2511 | len -= retval; | ||
2512 | i++; | ||
2513 | } | ||
2514 | |||
2515 | wcontents[i] = 0; | ||
2516 | len = i; | ||
2517 | |||
2518 | /* Here all is OK, send PDC_CLIP_SUCCESS, then length, then | ||
2519 | contents */ | ||
2520 | |||
2521 | if (XC_write_display_socket_int(PDC_CLIP_SUCCESS) >= 0) | ||
2522 | if (XC_write_display_socket_int(len) >= 0) | ||
2523 | if (XC_write_socket(xc_display_sock, | ||
2524 | wcontents, len * sizeof(wchar_t)) >= 0) | ||
2525 | { | ||
2526 | free(wcontents); | ||
2527 | return; | ||
2528 | } | ||
2529 | } | ||
2530 | |||
2531 | _exit_process(4, SIGKILL, "exiting from _get_selection_utf8"); | ||
2532 | } | ||
2533 | #endif | ||
2534 | |||
2535 | /* For PDC_setclipboard() */ | ||
2536 | |||
2537 | static void _set_selection(void) | ||
2538 | { | ||
2539 | long length, pos; | ||
2540 | int status; | ||
2541 | |||
2542 | if (XC_read_socket(xc_display_sock, &length, sizeof(long)) < 0) | ||
2543 | _exit_process(5, SIGKILL, "exiting from _set_selection"); | ||
2544 | |||
2545 | if (length > (long)tmpsel_length) | ||
2546 | { | ||
2547 | if (!tmpsel_length) | ||
2548 | tmpsel = malloc((length + 1) * sizeof(chtype)); | ||
2549 | else | ||
2550 | tmpsel = realloc(tmpsel, (length + 1) * sizeof(chtype)); | ||
2551 | } | ||
2552 | |||
2553 | if (!tmpsel) | ||
2554 | if (XC_write_display_socket_int(PDC_CLIP_MEMORY_ERROR) < 0) | ||
2555 | _exit_process(4, SIGKILL, "exiting from _set_selection"); | ||
2556 | |||
2557 | for (pos = 0; pos < length; pos++) | ||
2558 | { | ||
2559 | #ifdef PDC_WIDE | ||
2560 | wchar_t c; | ||
2561 | #else | ||
2562 | unsigned char c; | ||
2563 | #endif | ||
2564 | if (XC_read_socket(xc_display_sock, &c, sizeof(c)) < 0) | ||
2565 | _exit_process(5, SIGKILL, "exiting from _set_selection"); | ||
2566 | |||
2567 | tmpsel[pos] = c; | ||
2568 | } | ||
2569 | |||
2570 | tmpsel_length = length; | ||
2571 | tmpsel[length] = 0; | ||
2572 | |||
2573 | if (XtOwnSelection(topLevel, XA_PRIMARY, CurrentTime, | ||
2574 | _convert_proc, _lose_ownership, NULL) == False) | ||
2575 | { | ||
2576 | status = PDC_CLIP_ACCESS_ERROR; | ||
2577 | free(tmpsel); | ||
2578 | tmpsel = NULL; | ||
2579 | tmpsel_length = 0; | ||
2580 | } | ||
2581 | else | ||
2582 | status = PDC_CLIP_SUCCESS; | ||
2583 | |||
2584 | _selection_off(); | ||
2585 | |||
2586 | if (XC_write_display_socket_int(status) < 0) | ||
2587 | _exit_process(4, SIGKILL, "exiting from _set_selection"); | ||
2588 | } | ||
2589 | |||
2590 | /* The curses process is waiting; tell it to continue */ | ||
2591 | |||
2592 | static void _resume_curses(void) | ||
2593 | { | ||
2594 | if (XC_write_display_socket_int(CURSES_CONTINUE) < 0) | ||
2595 | _exit_process(4, SIGKILL, "exiting from _process_curses_requests"); | ||
2596 | } | ||
2597 | |||
2598 | /* The curses process sent us a message */ | ||
2599 | |||
2600 | static void _process_curses_requests(XtPointer client_data, int *fid, | ||
2601 | XtInputId *id) | ||
2602 | { | ||
2603 | struct timeval socket_timeout = {0}; | ||
2604 | int s; | ||
2605 | int old_row, new_row; | ||
2606 | int old_x, new_x; | ||
2607 | int pos, num_cols; | ||
2608 | |||
2609 | char buf[12]; /* big enough for 2 integers */ | ||
2610 | |||
2611 | XC_LOG(("_process_curses_requests() - called\n")); | ||
2612 | |||
2613 | if (!received_map_notify) | ||
2614 | return; | ||
2615 | |||
2616 | FD_ZERO(&xc_readfds); | ||
2617 | FD_SET(xc_display_sock, &xc_readfds); | ||
2618 | |||
2619 | if ((s = select(FD_SETSIZE, (FD_SET_CAST)&xc_readfds, NULL, | ||
2620 | NULL, &socket_timeout)) < 0) | ||
2621 | _exit_process(2, SIGKILL, "exiting from _process_curses_requests" | ||
2622 | " - select failed"); | ||
2623 | |||
2624 | if (!s) /* no requests pending - should never happen! */ | ||
2625 | return; | ||
2626 | |||
2627 | if (FD_ISSET(xc_display_sock, &xc_readfds)) | ||
2628 | { | ||
2629 | /* read first integer to determine total message has been | ||
2630 | received */ | ||
2631 | |||
2632 | XC_LOG(("_process_curses_requests() - before XC_read_socket()\n")); | ||
2633 | |||
2634 | if (XC_read_socket(xc_display_sock, &num_cols, sizeof(int)) < 0) | ||
2635 | _exit_process(3, SIGKILL, "exiting from _process_curses_requests" | ||
2636 | " - first read"); | ||
2637 | |||
2638 | XC_LOG(("_process_curses_requests() - after XC_read_socket()\n")); | ||
2639 | |||
2640 | after_first_curses_request = TRUE; | ||
2641 | |||
2642 | switch(num_cols) | ||
2643 | { | ||
2644 | case CURSES_EXIT: /* request from curses to stop */ | ||
2645 | XC_LOG(("CURSES_EXIT received from child\n")); | ||
2646 | _exit_process(0, 0, "XCursesProcess requested to exit by child"); | ||
2647 | break; | ||
2648 | |||
2649 | case CURSES_BELL: | ||
2650 | XC_LOG(("CURSES_BELL received from child\n")); | ||
2651 | XBell(XCURSESDISPLAY, 50); | ||
2652 | break; | ||
2653 | |||
2654 | /* request from curses to confirm completion of display */ | ||
2655 | |||
2656 | case CURSES_REFRESH: | ||
2657 | XC_LOG(("CURSES_REFRESH received from child\n")); | ||
2658 | _refresh_screen(); | ||
2659 | _resume_curses(); | ||
2660 | break; | ||
2661 | |||
2662 | case CURSES_REFRESH_SCROLLBAR: | ||
2663 | _refresh_scrollbar(); | ||
2664 | break; | ||
2665 | |||
2666 | case CURSES_CURSOR: | ||
2667 | XC_LOG(("CURSES_CURSOR received from child\n")); | ||
2668 | |||
2669 | if (XC_read_socket(xc_display_sock, buf, sizeof(int) * 2) < 0) | ||
2670 | _exit_process(5, SIGKILL, "exiting from CURSES_CURSOR " | ||
2671 | "_process_curses_requests"); | ||
2672 | |||
2673 | memcpy(&pos, buf, sizeof(int)); | ||
2674 | old_row = pos & 0xFF; | ||
2675 | old_x = pos >> 8; | ||
2676 | |||
2677 | memcpy(&pos, buf + sizeof(int), sizeof(int)); | ||
2678 | new_row = pos & 0xFF; | ||
2679 | new_x = pos >> 8; | ||
2680 | |||
2681 | visible_cursor = TRUE; | ||
2682 | _display_cursor(old_row, old_x, new_row, new_x); | ||
2683 | break; | ||
2684 | |||
2685 | case CURSES_DISPLAY_CURSOR: | ||
2686 | XC_LOG(("CURSES_DISPLAY_CURSOR received from child. Vis now: ")); | ||
2687 | XC_LOG((visible_cursor ? "1\n" : "0\n")); | ||
2688 | |||
2689 | /* If the window is not active, ignore this command. The | ||
2690 | cursor will stay solid. */ | ||
2691 | |||
2692 | if (window_entered) | ||
2693 | { | ||
2694 | if (visible_cursor) | ||
2695 | { | ||
2696 | /* Cursor currently ON, turn it off */ | ||
2697 | |||
2698 | int save_visibility = SP->visibility; | ||
2699 | SP->visibility = 0; | ||
2700 | _redraw_cursor(); | ||
2701 | SP->visibility = save_visibility; | ||
2702 | visible_cursor = FALSE; | ||
2703 | } | ||
2704 | else | ||
2705 | { | ||
2706 | /* Cursor currently OFF, turn it on */ | ||
2707 | |||
2708 | _redraw_cursor(); | ||
2709 | visible_cursor = TRUE; | ||
2710 | } | ||
2711 | } | ||
2712 | |||
2713 | break; | ||
2714 | |||
2715 | case CURSES_TITLE: | ||
2716 | XC_LOG(("CURSES_TITLE received from child\n")); | ||
2717 | _set_title(); | ||
2718 | break; | ||
2719 | |||
2720 | case CURSES_RESIZE: | ||
2721 | XC_LOG(("CURSES_RESIZE received from child\n")); | ||
2722 | _resize(); | ||
2723 | _resume_curses(); | ||
2724 | break; | ||
2725 | |||
2726 | case CURSES_GET_SELECTION: | ||
2727 | XC_LOG(("CURSES_GET_SELECTION received from child\n")); | ||
2728 | |||
2729 | _resume_curses(); | ||
2730 | |||
2731 | XtGetSelectionValue(topLevel, XA_PRIMARY, | ||
2732 | #ifdef PDC_WIDE | ||
2733 | XA_UTF8_STRING(XtDisplay(topLevel)), | ||
2734 | _get_selection_utf8, | ||
2735 | #else | ||
2736 | XA_STRING, _get_selection, | ||
2737 | #endif | ||
2738 | (XtPointer)NULL, 0); | ||
2739 | |||
2740 | break; | ||
2741 | |||
2742 | case CURSES_SET_SELECTION: | ||
2743 | XC_LOG(("CURSES_SET_SELECTION received from child\n")); | ||
2744 | _set_selection(); | ||
2745 | break; | ||
2746 | |||
2747 | case CURSES_CLEAR_SELECTION: | ||
2748 | XC_LOG(("CURSES_CLEAR_SELECTION received from child\n")); | ||
2749 | _resume_curses(); | ||
2750 | _selection_off(); | ||
2751 | break; | ||
2752 | |||
2753 | case CURSES_GET_COLOR: | ||
2754 | XC_LOG(("CURSES_GET_COLOR recieved from child\n")); | ||
2755 | _get_color(); | ||
2756 | _resume_curses(); | ||
2757 | break; | ||
2758 | |||
2759 | case CURSES_SET_COLOR: | ||
2760 | XC_LOG(("CURSES_SET_COLOR recieved from child\n")); | ||
2761 | _set_color(); | ||
2762 | _resume_curses(); | ||
2763 | break; | ||
2764 | |||
2765 | default: | ||
2766 | PDC_LOG(("%s:Unknown request %d\n", XCLOGMSG, num_cols)); | ||
2767 | } | ||
2768 | } | ||
2769 | } | ||
2770 | |||
2771 | static void _handle_structure_notify(Widget w, XtPointer client_data, | ||
2772 | XEvent *event, Boolean *unused) | ||
2773 | { | ||
2774 | XC_LOG(("_handle_structure_notify() - called\n")); | ||
2775 | |||
2776 | switch(event->type) | ||
2777 | { | ||
2778 | case ConfigureNotify: | ||
2779 | XC_LOG(("ConfigureNotify received\n")); | ||
2780 | |||
2781 | /* Window has been resized, change width and height to send to | ||
2782 | place_text and place_graphics in next Expose. Also will need | ||
2783 | to kill (SIGWINCH) curses process if screen size changes. */ | ||
2784 | |||
2785 | resize_window_width = event->xconfigure.width; | ||
2786 | resize_window_height = event->xconfigure.height; | ||
2787 | |||
2788 | after_first_curses_request = FALSE; | ||
2789 | |||
2790 | #ifdef SIGWINCH | ||
2791 | SP->resized = 1; | ||
2792 | |||
2793 | kill(xc_otherpid, SIGWINCH); | ||
2794 | #endif | ||
2795 | _send_key_to_curses(KEY_RESIZE, NULL, TRUE); | ||
2796 | break; | ||
2797 | |||
2798 | case MapNotify: | ||
2799 | XC_LOG(("MapNotify received\n")); | ||
2800 | |||
2801 | received_map_notify = 1; | ||
2802 | |||
2803 | _draw_border(); | ||
2804 | break; | ||
2805 | |||
2806 | default: | ||
2807 | PDC_LOG(("%s:_handle_structure_notify - unknown event %d\n", | ||
2808 | XCLOGMSG, event->type)); | ||
2809 | } | ||
2810 | } | ||
2811 | |||
2812 | static RETSIGTYPE _handle_signals(int signo) | ||
2813 | { | ||
2814 | int flag = CURSES_EXIT; | ||
2815 | |||
2816 | PDC_LOG(("%s:_handle_signals() - called: %d\n", XCLOGMSG, signo)); | ||
2817 | |||
2818 | /* Patch by: Georg Fuchs */ | ||
2819 | |||
2820 | XCursesSetSignal(signo, _handle_signals); | ||
2821 | |||
2822 | #ifdef SIGTSTP | ||
2823 | if (signo == SIGTSTP) | ||
2824 | { | ||
2825 | pause(); | ||
2826 | return; | ||
2827 | } | ||
2828 | #endif | ||
2829 | #ifdef SIGCONT | ||
2830 | if (signo == SIGCONT) | ||
2831 | return; | ||
2832 | #endif | ||
2833 | #ifdef SIGCLD | ||
2834 | if (signo == SIGCLD) | ||
2835 | return; | ||
2836 | #endif | ||
2837 | #ifdef SIGTTIN | ||
2838 | if (signo == SIGTTIN) | ||
2839 | return; | ||
2840 | #endif | ||
2841 | #ifdef SIGWINCH | ||
2842 | if (signo == SIGWINCH) | ||
2843 | return; | ||
2844 | #endif | ||
2845 | |||
2846 | /* End of patch by: Georg Fuchs */ | ||
2847 | |||
2848 | XCursesSetSignal(signo, SIG_IGN); | ||
2849 | |||
2850 | /* Send a CURSES_EXIT to myself */ | ||
2851 | |||
2852 | if (XC_write_socket(xc_exit_sock, &flag, sizeof(int)) < 0) | ||
2853 | _exit_process(7, signo, "exiting from _handle_signals"); | ||
2854 | } | ||
2855 | |||
2856 | #ifdef PDC_XIM | ||
2857 | static void _dummy_handler(Widget w, XtPointer client_data, | ||
2858 | XEvent *event, Boolean *unused) | ||
2859 | { | ||
2860 | } | ||
2861 | #endif | ||
2862 | |||
2863 | int XCursesSetupX(int argc, char *argv[]) | ||
2864 | { | ||
2865 | char *myargv[] = {"PDCurses", NULL}; | ||
2866 | extern bool sb_started; | ||
2867 | |||
2868 | int italic_font_valid; | ||
2869 | XColor pointerforecolor, pointerbackcolor; | ||
2870 | XrmValue rmfrom, rmto; | ||
2871 | int i = 0; | ||
2872 | int minwidth, minheight; | ||
2873 | |||
2874 | XC_LOG(("XCursesSetupX called\n")); | ||
2875 | |||
2876 | if (!argv) | ||
2877 | { | ||
2878 | argv = myargv; | ||
2879 | argc = 1; | ||
2880 | } | ||
2881 | |||
2882 | program_name = argv[0]; | ||
2883 | |||
2884 | /* Keep open the 'write' end of the socket so the XCurses process | ||
2885 | can send a CURSES_EXIT to itself from within the signal handler */ | ||
2886 | |||
2887 | xc_exit_sock = xc_display_sockets[0]; | ||
2888 | xc_display_sock = xc_display_sockets[1]; | ||
2889 | |||
2890 | close(xc_key_sockets[0]); | ||
2891 | xc_key_sock = xc_key_sockets[1]; | ||
2892 | |||
2893 | /* Trap all signals when XCurses is the child process, but only if | ||
2894 | they haven't already been ignored by the application. */ | ||
2895 | |||
2896 | for (i = 0; i < PDC_MAX_SIGNALS; i++) | ||
2897 | if (XCursesSetSignal(i, _handle_signals) == SIG_IGN) | ||
2898 | XCursesSetSignal(i, SIG_IGN); | ||
2899 | |||
2900 | /* Start defining X Toolkit things */ | ||
2901 | |||
2902 | #if XtSpecificationRelease > 4 | ||
2903 | XtSetLanguageProc(NULL, (XtLanguageProc)NULL, NULL); | ||
2904 | #endif | ||
2905 | |||
2906 | /* Exit if no DISPLAY variable set */ | ||
2907 | |||
2908 | if (!getenv("DISPLAY")) | ||
2909 | { | ||
2910 | fprintf(stderr, "Error: no DISPLAY variable set\n"); | ||
2911 | kill(xc_otherpid, SIGKILL); | ||
2912 | return ERR; | ||
2913 | } | ||
2914 | |||
2915 | /* Initialise the top level widget */ | ||
2916 | |||
2917 | topLevel = XtVaAppInitialize(&app_context, class_name, options, | ||
2918 | XtNumber(options), &argc, argv, NULL, NULL); | ||
2919 | |||
2920 | XtVaGetApplicationResources(topLevel, &xc_app_data, app_resources, | ||
2921 | XtNumber(app_resources), NULL); | ||
2922 | |||
2923 | /* Check application resource values here */ | ||
2924 | |||
2925 | font_width = xc_app_data.normalFont->max_bounds.rbearing - | ||
2926 | xc_app_data.normalFont->min_bounds.lbearing; | ||
2927 | |||
2928 | font_height = xc_app_data.normalFont->max_bounds.ascent + | ||
2929 | xc_app_data.normalFont->max_bounds.descent; | ||
2930 | |||
2931 | font_ascent = xc_app_data.normalFont->max_bounds.ascent; | ||
2932 | font_descent = xc_app_data.normalFont->max_bounds.descent; | ||
2933 | |||
2934 | /* Check that the italic font and normal fonts are the same size */ | ||
2935 | /* This appears backwards */ | ||
2936 | |||
2937 | italic_font_valid = font_width != | ||
2938 | xc_app_data.italicFont->max_bounds.rbearing - | ||
2939 | xc_app_data.italicFont->min_bounds.lbearing || | ||
2940 | font_height != | ||
2941 | xc_app_data.italicFont->max_bounds.ascent + | ||
2942 | xc_app_data.italicFont->max_bounds.descent; | ||
2943 | |||
2944 | /* Calculate size of display window */ | ||
2945 | |||
2946 | XCursesCOLS = xc_app_data.cols; | ||
2947 | XCursesLINES = xc_app_data.lines; | ||
2948 | |||
2949 | window_width = font_width * XCursesCOLS + | ||
2950 | 2 * xc_app_data.borderWidth; | ||
2951 | |||
2952 | window_height = font_height * XCursesLINES + | ||
2953 | 2 * xc_app_data.borderWidth; | ||
2954 | |||
2955 | minwidth = font_width * 2 + xc_app_data.borderWidth * 2; | ||
2956 | minheight = font_height * 2 + xc_app_data.borderWidth * 2; | ||
2957 | |||
2958 | /* Set up the icon for the application; the default is an internal | ||
2959 | one for PDCurses. Then set various application level resources. */ | ||
2960 | |||
2961 | _get_icon(); | ||
2962 | |||
2963 | #ifdef HAVE_XPM_H | ||
2964 | if (xc_app_data.pixmap && xc_app_data.pixmap[0]) | ||
2965 | XtVaSetValues(topLevel, XtNminWidth, minwidth, XtNminHeight, | ||
2966 | minheight, XtNbaseWidth, xc_app_data.borderWidth * 2, | ||
2967 | XtNbaseHeight, xc_app_data.borderWidth * 2, | ||
2968 | XtNiconPixmap, icon_pixmap, | ||
2969 | XtNiconMask, icon_pixmap_mask, NULL); | ||
2970 | else | ||
2971 | #endif | ||
2972 | XtVaSetValues(topLevel, XtNminWidth, minwidth, XtNminHeight, | ||
2973 | minheight, XtNbaseWidth, xc_app_data.borderWidth * 2, | ||
2974 | XtNbaseHeight, xc_app_data.borderWidth * 2, | ||
2975 | XtNiconPixmap, icon_bitmap, NULL); | ||
2976 | |||
2977 | /* Create a BOX widget in which to draw */ | ||
2978 | |||
2979 | if (xc_app_data.scrollbarWidth && sb_started) | ||
2980 | { | ||
2981 | scrollBox = XtVaCreateManagedWidget(program_name, | ||
2982 | scrollBoxWidgetClass, topLevel, XtNwidth, | ||
2983 | window_width + xc_app_data.scrollbarWidth, | ||
2984 | XtNheight, window_height + xc_app_data.scrollbarWidth, | ||
2985 | XtNwidthInc, font_width, XtNheightInc, font_height, NULL); | ||
2986 | |||
2987 | drawing = XtVaCreateManagedWidget(program_name, | ||
2988 | boxWidgetClass, scrollBox, XtNwidth, | ||
2989 | window_width, XtNheight, window_height, XtNwidthInc, | ||
2990 | font_width, XtNheightInc, font_height, NULL); | ||
2991 | |||
2992 | scrollVert = XtVaCreateManagedWidget("scrollVert", | ||
2993 | scrollbarWidgetClass, scrollBox, XtNorientation, | ||
2994 | XtorientVertical, XtNheight, window_height, XtNwidth, | ||
2995 | xc_app_data.scrollbarWidth, NULL); | ||
2996 | |||
2997 | XtAddCallback(scrollVert, XtNscrollProc, _scroll_up_down, drawing); | ||
2998 | XtAddCallback(scrollVert, XtNjumpProc, _thumb_up_down, drawing); | ||
2999 | |||
3000 | scrollHoriz = XtVaCreateManagedWidget("scrollHoriz", | ||
3001 | scrollbarWidgetClass, scrollBox, XtNorientation, | ||
3002 | XtorientHorizontal, XtNwidth, window_width, XtNheight, | ||
3003 | xc_app_data.scrollbarWidth, NULL); | ||
3004 | |||
3005 | XtAddCallback(scrollHoriz, XtNscrollProc, _scroll_left_right, drawing); | ||
3006 | XtAddCallback(scrollHoriz, XtNjumpProc, _thumb_left_right, drawing); | ||
3007 | } | ||
3008 | else | ||
3009 | { | ||
3010 | drawing = XtVaCreateManagedWidget(program_name, boxWidgetClass, | ||
3011 | topLevel, XtNwidth, window_width, XtNheight, window_height, | ||
3012 | XtNwidthInc, font_width, XtNheightInc, font_height, NULL); | ||
3013 | |||
3014 | XtVaSetValues(topLevel, XtNwidthInc, font_width, XtNheightInc, | ||
3015 | font_height, NULL); | ||
3016 | } | ||
3017 | |||
3018 | /* Process any default translations */ | ||
3019 | |||
3020 | XtAugmentTranslations(drawing, | ||
3021 | XtParseTranslationTable(default_translations)); | ||
3022 | XtAppAddActions(app_context, action_table, XtNumber(action_table)); | ||
3023 | |||
3024 | /* Process the supplied colors */ | ||
3025 | |||
3026 | _initialize_colors(); | ||
3027 | |||
3028 | /* Determine text cursor alignment from resources */ | ||
3029 | |||
3030 | if (!strcmp(xc_app_data.textCursor, "vertical")) | ||
3031 | vertical_cursor = TRUE; | ||
3032 | |||
3033 | /* Now have LINES and COLS. Set these in the shared SP so the curses | ||
3034 | program can find them. */ | ||
3035 | |||
3036 | LINES = XCursesLINES; | ||
3037 | COLS = XCursesCOLS; | ||
3038 | |||
3039 | if ((shmidSP = shmget(shmkeySP, sizeof(SCREEN) + XCURSESSHMMIN, | ||
3040 | 0700 | IPC_CREAT)) < 0) | ||
3041 | { | ||
3042 | perror("Cannot allocate shared memory for SCREEN"); | ||
3043 | kill(xc_otherpid, SIGKILL); | ||
3044 | return ERR; | ||
3045 | } | ||
3046 | |||
3047 | SP = (SCREEN*)shmat(shmidSP, 0, 0); | ||
3048 | memset(SP, 0, sizeof(SCREEN)); | ||
3049 | SP->XcurscrSize = XCURSCR_SIZE; | ||
3050 | SP->lines = XCursesLINES; | ||
3051 | SP->cols = XCursesCOLS; | ||
3052 | |||
3053 | SP->mouse_wait = xc_app_data.clickPeriod; | ||
3054 | SP->audible = TRUE; | ||
3055 | |||
3056 | PDC_LOG(("%s:SHM size for curscr %d\n", XCLOGMSG, SP->XcurscrSize)); | ||
3057 | |||
3058 | if ((shmid_Xcurscr = shmget(shmkey_Xcurscr, SP->XcurscrSize + | ||
3059 | XCURSESSHMMIN, 0700 | IPC_CREAT)) < 0) | ||
3060 | { | ||
3061 | perror("Cannot allocate shared memory for curscr"); | ||
3062 | kill(xc_otherpid, SIGKILL); | ||
3063 | shmdt((char *)SP); | ||
3064 | shmctl(shmidSP, IPC_RMID, 0); | ||
3065 | return ERR; | ||
3066 | } | ||
3067 | |||
3068 | Xcurscr = (unsigned char *)shmat(shmid_Xcurscr, 0, 0); | ||
3069 | memset(Xcurscr, 0, SP->XcurscrSize); | ||
3070 | xc_atrtab = (short *)(Xcurscr + XCURSCR_ATRTAB_OFF); | ||
3071 | |||
3072 | PDC_LOG(("%s:shmid_Xcurscr %d shmkey_Xcurscr %d LINES %d COLS %d\n", | ||
3073 | XCLOGMSG, shmid_Xcurscr, shmkey_Xcurscr, LINES, COLS)); | ||
3074 | |||
3075 | /* Add Event handlers to the drawing widget */ | ||
3076 | |||
3077 | XtAddEventHandler(drawing, ExposureMask, False, _handle_expose, NULL); | ||
3078 | XtAddEventHandler(drawing, StructureNotifyMask, False, | ||
3079 | _handle_structure_notify, NULL); | ||
3080 | XtAddEventHandler(drawing, EnterWindowMask | LeaveWindowMask, False, | ||
3081 | _handle_enter_leave, NULL); | ||
3082 | XtAddEventHandler(topLevel, 0, True, _handle_nonmaskable, NULL); | ||
3083 | |||
3084 | /* Add input handler from xc_display_sock (requests from curses | ||
3085 | program) */ | ||
3086 | |||
3087 | XtAppAddInput(app_context, xc_display_sock, (XtPointer)XtInputReadMask, | ||
3088 | _process_curses_requests, NULL); | ||
3089 | |||
3090 | /* If there is a cursorBlink resource, start the Timeout event */ | ||
3091 | |||
3092 | if (xc_app_data.cursorBlinkRate) | ||
3093 | XtAppAddTimeOut(app_context, xc_app_data.cursorBlinkRate, | ||
3094 | _blink_cursor, NULL); | ||
3095 | |||
3096 | /* Leave telling the curses process that it can start to here so | ||
3097 | that when the curses process makes a request, the Xcurses | ||
3098 | process can service the request. */ | ||
3099 | |||
3100 | XC_write_display_socket_int(CURSES_CHILD); | ||
3101 | |||
3102 | XtRealizeWidget(topLevel); | ||
3103 | |||
3104 | /* Handle trapping of the WM_DELETE_WINDOW property */ | ||
3105 | |||
3106 | wm_atom[0] = XInternAtom(XtDisplay(topLevel), "WM_DELETE_WINDOW", False); | ||
3107 | |||
3108 | XSetWMProtocols(XtDisplay(topLevel), XtWindow(topLevel), wm_atom, 1); | ||
3109 | |||
3110 | /* Create the Graphics Context for drawing. This MUST be done AFTER | ||
3111 | the associated widget has been realized. */ | ||
3112 | |||
3113 | XC_LOG(("before _get_gc\n")); | ||
3114 | |||
3115 | _get_gc(&normal_gc, xc_app_data.normalFont, COLOR_WHITE, COLOR_BLACK); | ||
3116 | |||
3117 | _get_gc(&italic_gc, italic_font_valid ? xc_app_data.italicFont : | ||
3118 | xc_app_data.normalFont, COLOR_WHITE, COLOR_BLACK); | ||
3119 | |||
3120 | _get_gc(&block_cursor_gc, xc_app_data.normalFont, | ||
3121 | COLOR_BLACK, COLOR_CURSOR); | ||
3122 | |||
3123 | _get_gc(&rect_cursor_gc, xc_app_data.normalFont, | ||
3124 | COLOR_CURSOR, COLOR_BLACK); | ||
3125 | |||
3126 | _get_gc(&border_gc, xc_app_data.normalFont, COLOR_BORDER, COLOR_BLACK); | ||
3127 | |||
3128 | XSetLineAttributes(XCURSESDISPLAY, rect_cursor_gc, 2, | ||
3129 | LineSolid, CapButt, JoinMiter); | ||
3130 | |||
3131 | XSetLineAttributes(XCURSESDISPLAY, border_gc, xc_app_data.borderWidth, | ||
3132 | LineSolid, CapButt, JoinMiter); | ||
3133 | |||
3134 | /* Set the cursor for the application */ | ||
3135 | |||
3136 | XDefineCursor(XCURSESDISPLAY, XCURSESWIN, xc_app_data.pointer); | ||
3137 | rmfrom.size = sizeof(Pixel); | ||
3138 | rmto.size = sizeof(XColor); | ||
3139 | |||
3140 | rmto.addr = (XPointer)&pointerforecolor; | ||
3141 | rmfrom.addr = (XPointer)&(xc_app_data.pointerForeColor); | ||
3142 | XtConvertAndStore(drawing, XtRPixel, &rmfrom, XtRColor, &rmto); | ||
3143 | |||
3144 | rmfrom.size = sizeof(Pixel); | ||
3145 | rmto.size = sizeof(XColor); | ||
3146 | |||
3147 | rmfrom.addr = (XPointer)&(xc_app_data.pointerBackColor); | ||
3148 | rmto.addr = (XPointer)&pointerbackcolor; | ||
3149 | XtConvertAndStore(drawing, XtRPixel, &rmfrom, XtRColor, &rmto); | ||
3150 | |||
3151 | XRecolorCursor(XCURSESDISPLAY, xc_app_data.pointer, | ||
3152 | &pointerforecolor, &pointerbackcolor); | ||
3153 | |||
3154 | #ifndef PDC_XIM | ||
3155 | |||
3156 | /* Convert the supplied compose key to a Keysym */ | ||
3157 | |||
3158 | compose_key = XStringToKeysym(xc_app_data.composeKey); | ||
3159 | |||
3160 | if (compose_key && IsModifierKey(compose_key)) | ||
3161 | { | ||
3162 | int i, j; | ||
3163 | KeyCode *kcp; | ||
3164 | XModifierKeymap *map; | ||
3165 | KeyCode compose_keycode = XKeysymToKeycode(XCURSESDISPLAY, compose_key); | ||
3166 | |||
3167 | map = XGetModifierMapping(XCURSESDISPLAY); | ||
3168 | kcp = map->modifiermap; | ||
3169 | |||
3170 | for (i = 0; i < 8; i++) | ||
3171 | { | ||
3172 | for (j = 0; j < map->max_keypermod; j++, kcp++) | ||
3173 | { | ||
3174 | if (!*kcp) | ||
3175 | continue; | ||
3176 | |||
3177 | if (compose_keycode == *kcp) | ||
3178 | { | ||
3179 | compose_mask = state_mask[i]; | ||
3180 | break; | ||
3181 | } | ||
3182 | } | ||
3183 | |||
3184 | if (compose_mask) | ||
3185 | break; | ||
3186 | } | ||
3187 | |||
3188 | XFreeModifiermap(map); | ||
3189 | } | ||
3190 | |||
3191 | #else | ||
3192 | Xim = XOpenIM(XCURSESDISPLAY, NULL, NULL, NULL); | ||
3193 | |||
3194 | if (Xim) | ||
3195 | { | ||
3196 | Xic = XCreateIC(Xim, XNInputStyle, | ||
3197 | XIMPreeditNothing | XIMStatusNothing, | ||
3198 | XNClientWindow, XCURSESWIN, NULL); | ||
3199 | } | ||
3200 | |||
3201 | if (Xic) | ||
3202 | { | ||
3203 | long im_event_mask; | ||
3204 | |||
3205 | XGetICValues(Xic, XNFilterEvents, &im_event_mask, NULL); | ||
3206 | if (im_event_mask) | ||
3207 | XtAddEventHandler(drawing, im_event_mask, False, | ||
3208 | _dummy_handler, NULL); | ||
3209 | |||
3210 | XSetICFocus(Xic); | ||
3211 | } | ||
3212 | else | ||
3213 | { | ||
3214 | perror("ERROR: Cannot create input context"); | ||
3215 | kill(xc_otherpid, SIGKILL); | ||
3216 | shmdt((char *)SP); | ||
3217 | shmdt((char *)Xcurscr); | ||
3218 | shmctl(shmidSP, IPC_RMID, 0); | ||
3219 | shmctl(shmid_Xcurscr, IPC_RMID, 0); | ||
3220 | return ERR; | ||
3221 | } | ||
3222 | |||
3223 | #endif | ||
3224 | |||
3225 | /* Wait for events */ | ||
3226 | |||
3227 | XtAppMainLoop(app_context); | ||
3228 | return OK; /* won't get here */ | ||
3229 | } |
File x11/xcurses-config.in added (mode: 100644) (index 00000000..55b4704c) | |||
1 | #! /bin/sh | ||
2 | # | ||
3 | # The idea to this kind of setup info script was stolen from numerous | ||
4 | # other packages, such as neon, libxml and gnome. | ||
5 | # | ||
6 | # $Id: xcurses-config.in,v 1.6 2007/11/07 23:33:07 wmcbrine Exp $ | ||
7 | # | ||
8 | |||
9 | verdot=3.4 | ||
10 | |||
11 | prefix=@prefix@ | ||
12 | exec_prefix=@exec_prefix@ | ||
13 | includedir=@includedir@/xcurses | ||
14 | |||
15 | usage() | ||
16 | { | ||
17 | echo "Usage: xcurses-config [OPTION]" | ||
18 | echo "" | ||
19 | echo "Available values for OPTION include:" | ||
20 | echo "" | ||
21 | echo " --help display this help and exit" | ||
22 | echo " --cflags pre-processor and compiler flags" | ||
23 | echo " [-I$includedir]" | ||
24 | echo " --libs library linking information" | ||
25 | echo " [-L$prefix/lib -lXCurses @LDFLAGS@ @MH_XLIBS@ @MH_EXTRA_LIBS@" | ||
26 | echo " --prefix PDCurses install prefix" | ||
27 | echo " [$prefix]" | ||
28 | echo " --version output version information" | ||
29 | echo " [$verdot]" | ||
30 | exit $1 | ||
31 | } | ||
32 | |||
33 | if test $# -eq 0; then | ||
34 | usage 1 | ||
35 | fi | ||
36 | |||
37 | while test $# -gt 0; do | ||
38 | case "$1" in | ||
39 | # this deals with options in the style | ||
40 | # --option=value and extracts the value part | ||
41 | # [not currently used] | ||
42 | -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; | ||
43 | *) value= ;; | ||
44 | esac | ||
45 | |||
46 | case "$1" in | ||
47 | --prefix) | ||
48 | echo $prefix | ||
49 | ;; | ||
50 | |||
51 | --version) | ||
52 | echo $verdot | ||
53 | exit 0 | ||
54 | ;; | ||
55 | |||
56 | --help) | ||
57 | usage 0 | ||
58 | ;; | ||
59 | |||
60 | --cflags) | ||
61 | echo -I$includedir | ||
62 | ;; | ||
63 | |||
64 | --libs) | ||
65 | echo -L$prefix/lib -lXCurses @LDFLAGS@ @MH_XLIBS@ @MH_EXTRA_LIBS@ | ||
66 | ;; | ||
67 | |||
68 | *) | ||
69 | usage | ||
70 | exit 1 | ||
71 | ;; | ||
72 | esac | ||
73 | shift | ||
74 | done | ||
75 | |||
76 | exit 0 |