xref: /netbsd-src/lib/libcurses/curs_set.c (revision b09154d5e3c4bc76c29b34ed6d40921262a1080b)
1*b09154d5Srin /*	$NetBSD: curs_set.c,v 1.12 2021/09/06 07:45:48 rin Exp $	*/
2bb083e0eSblymn 
3bb083e0eSblymn /*-
4bb083e0eSblymn  * Copyright (c) 1998-2000 Brett Lymn
5bb083e0eSblymn  *                         (blymn@baea.com.au, brett_lymn@yahoo.com.au)
6bb083e0eSblymn  * All rights reserved.
7bb083e0eSblymn  *
8bb083e0eSblymn  * This code has been donated to The NetBSD Foundation by the Author.
9bb083e0eSblymn  *
10bb083e0eSblymn  * Redistribution and use in source and binary forms, with or without
11bb083e0eSblymn  * modification, are permitted provided that the following conditions
12bb083e0eSblymn  * are met:
13bb083e0eSblymn  * 1. Redistributions of source code must retain the above copyright
14bb083e0eSblymn  *    notice, this list of conditions and the following disclaimer.
15bb083e0eSblymn  * 2. The name of the author may not be used to endorse or promote products
16c03a48d6Swiz  *    derived from this software without specific prior written permission
17bb083e0eSblymn  *
18bb083e0eSblymn  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19bb083e0eSblymn  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20bb083e0eSblymn  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21bb083e0eSblymn  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22bb083e0eSblymn  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23bb083e0eSblymn  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24bb083e0eSblymn  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25bb083e0eSblymn  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26bb083e0eSblymn  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27bb083e0eSblymn  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28bb083e0eSblymn  *
29bb083e0eSblymn  *
30bb083e0eSblymn  */
31bb083e0eSblymn 
3266cab71cSblymn #include <sys/cdefs.h>
3366cab71cSblymn #ifndef lint
34*b09154d5Srin __RCSID("$NetBSD: curs_set.c,v 1.12 2021/09/06 07:45:48 rin Exp $");
3566cab71cSblymn #endif				/* not lint */
3666cab71cSblymn 
37bb083e0eSblymn #include "curses.h"
38bb083e0eSblymn #include "curses_private.h"
39bb083e0eSblymn 
40bb083e0eSblymn /*
41bb083e0eSblymn  * curs_set --
42bb083e0eSblymn  *    Set the visibility of the cursor, 0 means invisible, 1 means normal
43bb083e0eSblymn  *    visibility and 2 means high visibility.  Return the previous
44bb083e0eSblymn  *    visibility iff the terminal supports the new visibility otherwise
45bb083e0eSblymn  *    return ERR.
46bb083e0eSblymn  */
47bb083e0eSblymn int
curs_set(int visibility)48bb083e0eSblymn curs_set(int visibility)
49bb083e0eSblymn {
50bb083e0eSblymn 	int old_one;
51bb083e0eSblymn 
52c84d91aaSblymn 	old_one = _cursesi_screen->old_mode;
53bb083e0eSblymn 	switch (visibility) {
54bb083e0eSblymn 		case 0: /* invisible */
5598eb8895Sroy 			if (cursor_invisible != NULL) {
561f221324Sjdc 				__CTRACE(__CTRACE_MISC,
571f221324Sjdc 				    "curs_set: invisible\n");
58c84d91aaSblymn 				_cursesi_screen->old_mode = 0;
5998eb8895Sroy 				tputs(cursor_invisible, 0, __cputchar);
603da4a766Sblymn 				fflush(_cursesi_screen->outfd);
61bb083e0eSblymn 				return old_one;
62bb083e0eSblymn 			}
63bb083e0eSblymn 			break;
64bb083e0eSblymn 
65bb083e0eSblymn 		case 1: /* normal */
6698eb8895Sroy 			if (cursor_normal != NULL) {
671f221324Sjdc 				__CTRACE(__CTRACE_MISC, "curs_set: normal\n");
68c84d91aaSblymn 				_cursesi_screen->old_mode = 1;
6998eb8895Sroy 				tputs(cursor_normal, 0, __cputchar);
703da4a766Sblymn 				fflush(_cursesi_screen->outfd);
71bb083e0eSblymn 				return old_one;
72bb083e0eSblymn 			}
73bb083e0eSblymn 			break;
74bb083e0eSblymn 
75bb083e0eSblymn 		case 2: /* high visibility */
7698eb8895Sroy 			if (cursor_visible != NULL) {
77*b09154d5Srin 				__CTRACE(__CTRACE_MISC, "curs_set: high vis\n");
78c84d91aaSblymn 				_cursesi_screen->old_mode = 2;
7998eb8895Sroy 				tputs(cursor_visible, 0, __cputchar);
803da4a766Sblymn 				fflush(_cursesi_screen->outfd);
81bb083e0eSblymn 				return old_one;
82bb083e0eSblymn 			}
83bb083e0eSblymn 			break;
84bb083e0eSblymn 
85bb083e0eSblymn 		default:
86bb083e0eSblymn 			break;
87bb083e0eSblymn 	}
88bb083e0eSblymn 
89bb083e0eSblymn 	return ERR;
90bb083e0eSblymn }
91bb083e0eSblymn 
9266cab71cSblymn /*
9366cab71cSblymn  * __restore_cursor_vis --
9466cab71cSblymn  *     Restore the old cursor visibility.
9566cab71cSblymn  */
9666cab71cSblymn void
__restore_cursor_vis(void)9766cab71cSblymn __restore_cursor_vis(void)
9866cab71cSblymn {
99c84d91aaSblymn 	curs_set(_cursesi_screen->old_mode);
10066cab71cSblymn }
101bb083e0eSblymn 
102