Update to latest madtty.
[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(main_w, true);
34     clearok(main_w, 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     if (sidebar_w)
53         wnoutrefresh(sidebar_w);
54     if (main_w)
55         wnoutrefresh(main_w);
56     wrefresh(stdscr);
57 }
58
59 void mutt_endwin(const char *msg)
60 {
61     if (!option(OPTNOCURSES)) {
62         CLEARLINE(stdscr, LINES - 1);
63
64         if (sidebar_w) {
65             delwin(sidebar_w);
66             sidebar_w = NULL;
67         }
68 #if 0
69         if (main_w) {
70             delwin(main_w);
71             main_w = NULL;
72         }
73 #endif
74
75         mutt_refresh();
76         endwin();
77     }
78
79     if (!m_strisempty(msg)) {
80         puts(msg);
81         fflush(stdout);
82     }
83 }
84
85 void ui_layout_init(void)
86 {
87     erase();
88     main_w = newwin(LINES - 1, COLS, 0, 0);
89     SETCOLOR(main_w, MT_COLOR_NORMAL);
90     mutt_error   = mutt_curses_error;
91     mutt_message = mutt_curses_message;
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(main_w, 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             mvwin(main_w, 0, SidebarWidth);
130         }
131
132         getmaxyx(sidebar_w, sh, sw);
133
134         if (sh != LINES - 1 || sw != SidebarWidth) {
135             wresize(sidebar_w, LINES - 1, SidebarWidth);
136             wresize(main_w, LINES - 1, COLS - SidebarWidth);
137             mvwin(main_w, 0, SidebarWidth);
138         }
139     } else {
140         if (sidebar_w) {
141             delwin(sidebar_w);
142             sidebar_w = NULL;
143             wresize(main_w, LINES - 1, COLS);
144             mvwin(main_w, 0, 0);
145         }
146     }
147     return sidebar_w;
148 }