Make layout windows visible, makes the whole thing way simpler.
[apps/madmutt.git] / lib-ui / layout.c
1 /*
2  *  This program is free software; you can redistribute it and/or modify
3  *  it under the terms of the GNU General Public License as published by
4  *  the Free Software Foundation; either version 2 of the License, or (at
5  *  your option) any later version.
6  *
7  *  This program is distributed in the hope that it will be useful, but
8  *  WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  *  General Public License for more details.
11  *
12  *  You should have received a copy of the GNU General Public License
13  *  along with this program; if not, write to the Free Software
14  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
15  *  MA 02110-1301, USA.
16  *
17  *  Copyright © 2006 Pierre Habouzit
18  */
19
20 #include <lib-ui/lib-ui.h>
21
22 #include <termios.h>
23 #ifdef HAVE_SYS_IOCTL_H
24 #  include <sys/ioctl.h>
25 #elif defined(HAVE_IOCTL_H)
26 #  include <ioctl.h>
27 #endif
28
29 WINDOW *sidebar_w, *main_w;
30
31 void mutt_need_hard_redraw(void)
32 {
33     keypad(stdscr, true);
34     clearok(stdscr, true);
35     set_option(OPTNEEDREDRAW);
36 }
37
38 void mutt_refresh(void)
39 {
40     /* FIXME: UGGLY */
41     extern ssize_t UngetCount;
42
43     /* don't refresh when we are waiting for a child. */
44     if (option(OPTKEEPQUIET))
45         return;
46
47     /* don't refresh in the middle of macros unless necessary */
48     if (UngetCount && !option(OPTFORCEREFRESH))
49         return;
50
51     /* else */
52     wrefresh(stdscr);
53     if (sidebar_w)
54         wrefresh(sidebar_w);
55     wrefresh(main_w);
56     main_w = NULL;
57 }
58
59 void mutt_endwin(const char *msg)
60 {
61     if (!option(OPTNOCURSES)) {
62         CLEARLINE(LINES - 1);
63
64         if (sidebar_w) {
65             delwin(sidebar_w);
66             sidebar_w = NULL;
67         }
68         if (main_w) {
69             delwin(main_w);
70             main_w = NULL;
71         }
72
73         wattrset(stdscr, A_NORMAL);
74         mutt_refresh();
75         endwin();
76     }
77
78     if (!m_strisempty(msg)) {
79         puts(msg);
80         fflush(stdout);
81     }
82 }
83
84 void ui_layout_init(void)
85 {
86     SETCOLOR(MT_COLOR_NORMAL);
87     wclear(stdscr);
88     mutt_error   = mutt_curses_error;
89     mutt_message = mutt_curses_message;
90
91     main_w = newwin(LINES - 1, COLS, 0, 0);
92 }
93
94 void ui_layout_resize(void)
95 {
96     if (SigWinch) {
97         int fd, rows = -1, cols = -1;
98         struct winsize w;
99
100         if ((fd = open("/dev/tty", O_RDONLY)) != -1) {
101             if (ioctl(fd, TIOCGWINSZ, &w) != -1) {
102                 rows = w.ws_row;
103                 cols = w.ws_col;
104             }
105             close(fd);
106         }
107         if (rows <= 0) {
108             rows = atoi(getenv("LINES") ?: "24");
109         }
110         if (cols <= 0) {
111             cols = atoi(getenv("COLUMNS") ?: "80");
112         }
113         resizeterm(rows, cols);
114         SigWinch = 0;
115         /* force a real complete redraw. */
116         clearok(stdscr, true);
117     }
118 }
119
120 WINDOW *ui_layout_sidebar_w(void)
121 {
122     if (option(OPTMBOXPANE) && SidebarWidth > 1 && SidebarWidth < COLS)
123     {
124         int sw, sh;
125
126         if (!sidebar_w) {
127             sidebar_w = newwin(LINES - 1, SidebarWidth, 0, 0);
128             wresize(main_w, LINES - 1, COLS - SidebarWidth);
129         }
130
131         getmaxyx(sidebar_w, sh, sw);
132
133         if (sh != LINES - 1 || sw != SidebarWidth) {
134             wresize(sidebar_w, LINES - 1, SidebarWidth);
135             wresize(main_w, LINES - 1, COLS - SidebarWidth);
136         }
137     } else {
138         if (sidebar_w) {
139             delwin(sidebar_w);
140             sidebar_w = NULL;
141             wresize(main_w, LINES - 1, COLS);
142         }
143     }
144     return sidebar_w;
145 }