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. */ 38void 39tui_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. */ 71void 72tui_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. */ 82void 83box_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 112void 113tui_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 124void 125tui_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 137void 138tui_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 152void 153tui_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. */ 175static void 176make_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 203void 204tui_make_visible (struct tui_gen_win_info *win_info) 205{ 206 make_visible (win_info, 1); 207} 208 209void 210tui_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). */ 217static void 218make_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 237void 238tui_make_all_visible (void) 239{ 240 make_all_visible (1); 241} 242 243void 244tui_make_all_invisible (void) 245{ 246 make_all_visible (0); 247} 248 249/* Function to refresh all the windows currently displayed. */ 250 251void 252tui_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