1 /* General window behavior. 2 3 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, 4 Inc. 5 6 Contributed by Hewlett-Packard Company. 7 8 This file is part of GDB. 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 59 Temple Place - Suite 330, 23 Boston, MA 02111-1307, USA. */ 24 25 #include "defs.h" 26 #include "tui/tui.h" 27 #include "tui/tui-data.h" 28 #include "tui/tui-wingeneral.h" 29 #include "tui/tui-win.h" 30 31 #include "gdb_curses.h" 32 33 /*********************** 34 ** PUBLIC FUNCTIONS 35 ***********************/ 36 37 /* Refresh the window. */ 38 void 39 tui_refresh_win (struct tui_gen_win_info * win_info) 40 { 41 if (win_info->type == DATA_WIN && win_info->content_size > 0) 42 { 43 int i; 44 45 for (i = 0; (i < win_info->content_size); i++) 46 { 47 struct tui_gen_win_info * data_item_win_ptr; 48 49 data_item_win_ptr = &((tui_win_content) 50 win_info->content)[i]->which_element.data_window; 51 if (data_item_win_ptr != NULL 52 && data_item_win_ptr->handle != (WINDOW *) NULL) 53 wrefresh (data_item_win_ptr->handle); 54 } 55 } 56 else if (win_info->type == CMD_WIN) 57 { 58 /* Do nothing */ 59 } 60 else 61 { 62 if (win_info->handle != (WINDOW *) NULL) 63 wrefresh (win_info->handle); 64 } 65 66 return; 67 } 68 69 70 /* Function to delete the curses window, checking for NULL. */ 71 void 72 tui_delete_win (WINDOW * window) 73 { 74 if (window != (WINDOW *) NULL) 75 delwin (window); 76 77 return; 78 } 79 80 81 /* Draw a border arround the window. */ 82 void 83 box_win (struct tui_gen_win_info * win_info, int highlight_flag) 84 { 85 if (win_info && win_info->handle) 86 { 87 WINDOW *win; 88 int attrs; 89 90 win = win_info->handle; 91 if (highlight_flag == HILITE) 92 attrs = tui_active_border_attrs; 93 else 94 attrs = tui_border_attrs; 95 96 wattron (win, attrs); 97 #ifdef HAVE_WBORDER 98 wborder (win, tui_border_vline, tui_border_vline, 99 tui_border_hline, tui_border_hline, 100 tui_border_ulcorner, tui_border_urcorner, 101 tui_border_llcorner, tui_border_lrcorner); 102 #else 103 box (win, tui_border_vline, tui_border_hline); 104 #endif 105 if (win_info->title) 106 mvwaddstr (win, 0, 3, win_info->title); 107 wattroff (win, attrs); 108 } 109 } 110 111 112 void 113 tui_unhighlight_win (struct tui_win_info * win_info) 114 { 115 if (win_info != NULL && win_info->generic.handle != (WINDOW *) NULL) 116 { 117 box_win ((struct tui_gen_win_info *) win_info, NO_HILITE); 118 wrefresh (win_info->generic.handle); 119 tui_set_win_highlight (win_info, 0); 120 } 121 } 122 123 124 void 125 tui_highlight_win (struct tui_win_info * win_info) 126 { 127 if (win_info != NULL 128 && win_info->can_highlight 129 && win_info->generic.handle != (WINDOW *) NULL) 130 { 131 box_win ((struct tui_gen_win_info *) win_info, HILITE); 132 wrefresh (win_info->generic.handle); 133 tui_set_win_highlight (win_info, 1); 134 } 135 } 136 137 void 138 tui_check_and_display_highlight_if_needed (struct tui_win_info * win_info) 139 { 140 if (win_info != NULL && win_info->generic.type != CMD_WIN) 141 { 142 if (win_info->is_highlighted) 143 tui_highlight_win (win_info); 144 else 145 tui_unhighlight_win (win_info); 146 147 } 148 return; 149 } 150 151 152 void 153 tui_make_window (struct tui_gen_win_info * win_info, int box_it) 154 { 155 WINDOW *handle; 156 157 handle = newwin (win_info->height, 158 win_info->width, 159 win_info->origin.y, 160 win_info->origin.x); 161 win_info->handle = handle; 162 if (handle != (WINDOW *) NULL) 163 { 164 if (box_it == BOX_WINDOW) 165 box_win (win_info, NO_HILITE); 166 win_info->is_visible = TRUE; 167 scrollok (handle, TRUE); 168 } 169 } 170 171 172 /* We can't really make windows visible, or invisible. So we have to 173 delete the entire window when making it visible, and create it 174 again when making it visible. */ 175 static void 176 make_visible (struct tui_gen_win_info *win_info, int visible) 177 { 178 /* Don't tear down/recreate command window */ 179 if (win_info->type == CMD_WIN) 180 return; 181 182 if (visible) 183 { 184 if (!win_info->is_visible) 185 { 186 tui_make_window (win_info, 187 (win_info->type != CMD_WIN 188 && !tui_win_is_auxillary (win_info->type))); 189 win_info->is_visible = TRUE; 190 } 191 } 192 else if (!visible && 193 win_info->is_visible && win_info->handle != (WINDOW *) NULL) 194 { 195 win_info->is_visible = FALSE; 196 tui_delete_win (win_info->handle); 197 win_info->handle = (WINDOW *) NULL; 198 } 199 200 return; 201 } 202 203 void 204 tui_make_visible (struct tui_gen_win_info *win_info) 205 { 206 make_visible (win_info, 1); 207 } 208 209 void 210 tui_make_invisible (struct tui_gen_win_info *win_info) 211 { 212 make_visible (win_info, 0); 213 } 214 215 216 /* Makes all windows invisible (except the command and locator windows). */ 217 static void 218 make_all_visible (int visible) 219 { 220 int i; 221 222 for (i = 0; i < MAX_MAJOR_WINDOWS; i++) 223 { 224 if (tui_win_list[i] != NULL 225 && ((tui_win_list[i])->generic.type) != CMD_WIN) 226 { 227 if (tui_win_is_source_type ((tui_win_list[i])->generic.type)) 228 make_visible ((tui_win_list[i])->detail.source_info.execution_info, 229 visible); 230 make_visible ((struct tui_gen_win_info *) tui_win_list[i], visible); 231 } 232 } 233 234 return; 235 } 236 237 void 238 tui_make_all_visible (void) 239 { 240 make_all_visible (1); 241 } 242 243 void 244 tui_make_all_invisible (void) 245 { 246 make_all_visible (0); 247 } 248 249 /* Function to refresh all the windows currently displayed. */ 250 251 void 252 tui_refresh_all (struct tui_win_info * * list) 253 { 254 enum tui_win_type type; 255 struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); 256 257 for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) 258 { 259 if (list[type] && list[type]->generic.is_visible) 260 { 261 if (type == SRC_WIN || type == DISASSEM_WIN) 262 { 263 touchwin (list[type]->detail.source_info.execution_info->handle); 264 tui_refresh_win (list[type]->detail.source_info.execution_info); 265 } 266 touchwin (list[type]->generic.handle); 267 tui_refresh_win (&list[type]->generic); 268 } 269 } 270 if (locator->is_visible) 271 { 272 touchwin (locator->handle); 273 tui_refresh_win (locator); 274 } 275 } 276 277 278 /********************************* 279 ** Local Static Functions 280 *********************************/ 281