4 Copyright (C) 1999-2000 Timo Sirainen
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "gui-readline.h"
28 #include "mainwindows.h"
30 #ifdef HAVE_SYS_IOCTL_H
31 #include <sys/ioctl.h>
36 #define COLOR_PAIRS 64
39 #define MIN_SCREEN_WIDTH 20
41 static int scrx, scry;
42 static int use_colors;
43 static int freeze_refresh;
46 static int init_screen_int(void);
47 static void deinit_screen_int(void);
50 static void sig_winch(int p)
56 static void screen_resize(void)
58 #if defined (TIOCGWINSZ) && defined (HAVE_CURSES_RESIZETERM)
61 /* Get new window size */
62 if (ioctl(0, TIOCGWINSZ, &ws) < 0)
65 if (ws.ws_row == LINES && ws.ws_col == COLS) {
66 /* Same size, abort. */
70 if (ws.ws_col < MIN_SCREEN_WIDTH)
71 ws.ws_col = MIN_SCREEN_WIDTH;
73 /* Resize curses terminal */
74 resizeterm(ws.ws_row, ws.ws_col);
78 mainwindows_recreate();
81 mainwindows_resize(COLS, LINES);
84 void screen_check_resizes(void)
92 static void read_signals(void)
96 SIGHUP, SIGINT, SIGQUIT, SIGTERM,
97 SIGALRM, SIGUSR1, SIGUSR2
100 "hup", "int", "quit", "term",
101 "alrm", "usr1", "usr2"
105 struct sigaction act;
108 ignores = settings_get_str("ignore_signals");
110 sigemptyset (&act.sa_mask);
113 for (n = 0; n < sizeof(signals)/sizeof(signals[0]); n++) {
114 act.sa_handler = find_substr(ignores, signames[n]) ?
116 sigaction(signals[n], &act, NULL);
121 static void read_settings(void)
123 int old_colors = use_colors;
125 use_colors = settings_get_bool("colors");
127 if (use_colors && !has_colors())
130 if (use_colors != old_colors)
134 static int init_curses(void)
136 char ansi_tab[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
139 struct sigaction act;
145 if (COLS < MIN_SCREEN_WIDTH)
146 COLS = MIN_SCREEN_WIDTH;
149 sigemptyset (&act.sa_mask);
151 act.sa_handler = sig_winch;
152 sigaction(SIGWINCH, &act, NULL);
154 raw(); noecho(); idlok(stdscr, 1);
155 #ifdef HAVE_CURSES_IDCOK
158 intrflush(stdscr, FALSE); nodelay(stdscr, TRUE);
165 #ifdef HAVE_NCURSES_USE_DEFAULT_COLORS
166 /* this lets us to use the "default" background color for colors <= 7 so
167 background pixmaps etc. show up right */
168 use_default_colors();
170 for (num = 1; num < COLOR_PAIRS; num++)
171 init_pair(num, ansi_tab[num & 7], num <= 7 ? -1 : ansi_tab[num >> 3]);
173 init_pair(63, 0, -1); /* hm.. not THAT good idea, but probably more
174 people want dark grey than white on white.. */
176 for (num = 1; num < COLOR_PAIRS; num++)
177 init_pair(num, ansi_tab[num & 7], ansi_tab[num >> 3]);
185 static int init_screen_int(void)
187 use_colors = settings_get_bool("colors");
193 return init_curses();
196 static void deinit_screen_int(void)
201 /* Initialize screen, detect screen length */
202 int init_screen(void)
204 settings_add_bool("lookandfeel", "colors", TRUE);
205 settings_add_str("misc", "ignore_signals", "");
206 signal_add("setup changed", (SIGNAL_FUNC) read_settings);
208 return init_screen_int();
211 /* Deinitialize screen */
212 void deinit_screen(void)
215 signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
218 void set_color(WINDOW *window, int col)
223 attr = (col & 0x70) ? A_REVERSE : 0;
224 else if (col & ATTR_COLOR8)
225 attr = (A_DIM | COLOR_PAIR(63));
226 else if ((col & 0x77) == 0)
229 attr = (COLOR_PAIR((col&7) + (col&0x70)/2));
231 if (col & 0x08) attr |= A_BOLD;
232 if (col & 0x80) attr |= A_BLINK;
234 if (col & ATTR_UNDERLINE) attr |= A_UNDERLINE;
235 if (col & ATTR_REVERSE) attr |= A_REVERSE;
237 wattrset(window, attr);
240 void set_bg(WINDOW *window, int col)
245 attr = (col & 0x70) ? A_REVERSE : 0;
248 (A_DIM | COLOR_PAIR(63)) :
249 (COLOR_PAIR((col&7) + (col&0x70)/2));
252 if (col & 0x08) attr |= A_BOLD;
253 if (col & 0x80) attr |= A_BLINK;
255 wbkgdset(window, ' ' | attr);
258 void move_cursor(int y, int x)
264 void screen_refresh_freeze(void)
269 void screen_refresh_thaw(void)
271 if (freeze_refresh > 0) {
273 if (freeze_refresh == 0) screen_refresh(NULL);
277 void screen_refresh(WINDOW *window)
280 wnoutrefresh(window);
281 if (freeze_refresh == 0) {
283 wnoutrefresh(stdscr);