1130803Smarcel/* General window behavior. 2130803Smarcel 3130803Smarcel Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, 4130803Smarcel Inc. 5130803Smarcel 6130803Smarcel Contributed by Hewlett-Packard Company. 7130803Smarcel 8130803Smarcel This file is part of GDB. 9130803Smarcel 10130803Smarcel This program is free software; you can redistribute it and/or modify 11130803Smarcel it under the terms of the GNU General Public License as published by 12130803Smarcel the Free Software Foundation; either version 2 of the License, or 13130803Smarcel (at your option) any later version. 14130803Smarcel 15130803Smarcel This program is distributed in the hope that it will be useful, 16130803Smarcel but WITHOUT ANY WARRANTY; without even the implied warranty of 17130803Smarcel MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18130803Smarcel GNU General Public License for more details. 19130803Smarcel 20130803Smarcel You should have received a copy of the GNU General Public License 21130803Smarcel along with this program; if not, write to the Free Software 22130803Smarcel Foundation, Inc., 59 Temple Place - Suite 330, 23130803Smarcel Boston, MA 02111-1307, USA. */ 24130803Smarcel 25130803Smarcel#include "defs.h" 26130803Smarcel#include "tui/tui.h" 27130803Smarcel#include "tui/tui-data.h" 28130803Smarcel#include "tui/tui-wingeneral.h" 29130803Smarcel#include "tui/tui-win.h" 30130803Smarcel 31130803Smarcel#include "gdb_curses.h" 32130803Smarcel 33130803Smarcel/*********************** 34130803Smarcel** PUBLIC FUNCTIONS 35130803Smarcel***********************/ 36130803Smarcel 37130803Smarcel/* Refresh the window. */ 38130803Smarcelvoid 39130803Smarceltui_refresh_win (struct tui_gen_win_info * win_info) 40130803Smarcel{ 41130803Smarcel if (win_info->type == DATA_WIN && win_info->content_size > 0) 42130803Smarcel { 43130803Smarcel int i; 44130803Smarcel 45130803Smarcel for (i = 0; (i < win_info->content_size); i++) 46130803Smarcel { 47130803Smarcel struct tui_gen_win_info * data_item_win_ptr; 48130803Smarcel 49130803Smarcel data_item_win_ptr = &((tui_win_content) 50130803Smarcel win_info->content)[i]->which_element.data_window; 51130803Smarcel if (data_item_win_ptr != NULL 52130803Smarcel && data_item_win_ptr->handle != (WINDOW *) NULL) 53130803Smarcel wrefresh (data_item_win_ptr->handle); 54130803Smarcel } 55130803Smarcel } 56130803Smarcel else if (win_info->type == CMD_WIN) 57130803Smarcel { 58130803Smarcel /* Do nothing */ 59130803Smarcel } 60130803Smarcel else 61130803Smarcel { 62130803Smarcel if (win_info->handle != (WINDOW *) NULL) 63130803Smarcel wrefresh (win_info->handle); 64130803Smarcel } 65130803Smarcel 66130803Smarcel return; 67130803Smarcel} 68130803Smarcel 69130803Smarcel 70130803Smarcel/* Function to delete the curses window, checking for NULL. */ 71130803Smarcelvoid 72130803Smarceltui_delete_win (WINDOW * window) 73130803Smarcel{ 74130803Smarcel if (window != (WINDOW *) NULL) 75130803Smarcel delwin (window); 76130803Smarcel 77130803Smarcel return; 78130803Smarcel} 79130803Smarcel 80130803Smarcel 81130803Smarcel/* Draw a border arround the window. */ 82130803Smarcelvoid 83130803Smarcelbox_win (struct tui_gen_win_info * win_info, int highlight_flag) 84130803Smarcel{ 85130803Smarcel if (win_info && win_info->handle) 86130803Smarcel { 87130803Smarcel WINDOW *win; 88130803Smarcel int attrs; 89130803Smarcel 90130803Smarcel win = win_info->handle; 91130803Smarcel if (highlight_flag == HILITE) 92130803Smarcel attrs = tui_active_border_attrs; 93130803Smarcel else 94130803Smarcel attrs = tui_border_attrs; 95130803Smarcel 96130803Smarcel wattron (win, attrs); 97130803Smarcel wborder (win, tui_border_vline, tui_border_vline, 98130803Smarcel tui_border_hline, tui_border_hline, 99130803Smarcel tui_border_ulcorner, tui_border_urcorner, 100130803Smarcel tui_border_llcorner, tui_border_lrcorner); 101130803Smarcel if (win_info->title) 102130803Smarcel mvwaddstr (win, 0, 3, win_info->title); 103130803Smarcel wattroff (win, attrs); 104130803Smarcel } 105130803Smarcel} 106130803Smarcel 107130803Smarcel 108130803Smarcelvoid 109130803Smarceltui_unhighlight_win (struct tui_win_info * win_info) 110130803Smarcel{ 111130803Smarcel if (win_info != NULL && win_info->generic.handle != (WINDOW *) NULL) 112130803Smarcel { 113130803Smarcel box_win ((struct tui_gen_win_info *) win_info, NO_HILITE); 114130803Smarcel wrefresh (win_info->generic.handle); 115130803Smarcel tui_set_win_highlight (win_info, 0); 116130803Smarcel } 117130803Smarcel} 118130803Smarcel 119130803Smarcel 120130803Smarcelvoid 121130803Smarceltui_highlight_win (struct tui_win_info * win_info) 122130803Smarcel{ 123130803Smarcel if (win_info != NULL 124130803Smarcel && win_info->can_highlight 125130803Smarcel && win_info->generic.handle != (WINDOW *) NULL) 126130803Smarcel { 127130803Smarcel box_win ((struct tui_gen_win_info *) win_info, HILITE); 128130803Smarcel wrefresh (win_info->generic.handle); 129130803Smarcel tui_set_win_highlight (win_info, 1); 130130803Smarcel } 131130803Smarcel} 132130803Smarcel 133130803Smarcelvoid 134130803Smarceltui_check_and_display_highlight_if_needed (struct tui_win_info * win_info) 135130803Smarcel{ 136130803Smarcel if (win_info != NULL && win_info->generic.type != CMD_WIN) 137130803Smarcel { 138130803Smarcel if (win_info->is_highlighted) 139130803Smarcel tui_highlight_win (win_info); 140130803Smarcel else 141130803Smarcel tui_unhighlight_win (win_info); 142130803Smarcel 143130803Smarcel } 144130803Smarcel return; 145130803Smarcel} 146130803Smarcel 147130803Smarcel 148130803Smarcelvoid 149130803Smarceltui_make_window (struct tui_gen_win_info * win_info, int box_it) 150130803Smarcel{ 151130803Smarcel WINDOW *handle; 152130803Smarcel 153130803Smarcel handle = newwin (win_info->height, 154130803Smarcel win_info->width, 155130803Smarcel win_info->origin.y, 156130803Smarcel win_info->origin.x); 157130803Smarcel win_info->handle = handle; 158130803Smarcel if (handle != (WINDOW *) NULL) 159130803Smarcel { 160130803Smarcel if (box_it == BOX_WINDOW) 161130803Smarcel box_win (win_info, NO_HILITE); 162130803Smarcel win_info->is_visible = TRUE; 163130803Smarcel scrollok (handle, TRUE); 164130803Smarcel } 165130803Smarcel} 166130803Smarcel 167130803Smarcel 168130803Smarcel/* We can't really make windows visible, or invisible. So we have to 169130803Smarcel delete the entire window when making it visible, and create it 170130803Smarcel again when making it visible. */ 171130803Smarcelstatic void 172130803Smarcelmake_visible (struct tui_gen_win_info *win_info, int visible) 173130803Smarcel{ 174130803Smarcel /* Don't tear down/recreate command window */ 175130803Smarcel if (win_info->type == CMD_WIN) 176130803Smarcel return; 177130803Smarcel 178130803Smarcel if (visible) 179130803Smarcel { 180130803Smarcel if (!win_info->is_visible) 181130803Smarcel { 182130803Smarcel tui_make_window (win_info, 183130803Smarcel (win_info->type != CMD_WIN 184130803Smarcel && !tui_win_is_auxillary (win_info->type))); 185130803Smarcel win_info->is_visible = TRUE; 186130803Smarcel } 187130803Smarcel } 188130803Smarcel else if (!visible && 189130803Smarcel win_info->is_visible && win_info->handle != (WINDOW *) NULL) 190130803Smarcel { 191130803Smarcel win_info->is_visible = FALSE; 192130803Smarcel tui_delete_win (win_info->handle); 193130803Smarcel win_info->handle = (WINDOW *) NULL; 194130803Smarcel } 195130803Smarcel 196130803Smarcel return; 197130803Smarcel} 198130803Smarcel 199130803Smarcelvoid 200130803Smarceltui_make_visible (struct tui_gen_win_info *win_info) 201130803Smarcel{ 202130803Smarcel make_visible (win_info, 1); 203130803Smarcel} 204130803Smarcel 205130803Smarcelvoid 206130803Smarceltui_make_invisible (struct tui_gen_win_info *win_info) 207130803Smarcel{ 208130803Smarcel make_visible (win_info, 0); 209130803Smarcel} 210130803Smarcel 211130803Smarcel 212130803Smarcel/* Makes all windows invisible (except the command and locator windows). */ 213130803Smarcelstatic void 214130803Smarcelmake_all_visible (int visible) 215130803Smarcel{ 216130803Smarcel int i; 217130803Smarcel 218130803Smarcel for (i = 0; i < MAX_MAJOR_WINDOWS; i++) 219130803Smarcel { 220130803Smarcel if (tui_win_list[i] != NULL 221130803Smarcel && ((tui_win_list[i])->generic.type) != CMD_WIN) 222130803Smarcel { 223130803Smarcel if (tui_win_is_source_type ((tui_win_list[i])->generic.type)) 224130803Smarcel make_visible ((tui_win_list[i])->detail.source_info.execution_info, 225130803Smarcel visible); 226130803Smarcel make_visible ((struct tui_gen_win_info *) tui_win_list[i], visible); 227130803Smarcel } 228130803Smarcel } 229130803Smarcel 230130803Smarcel return; 231130803Smarcel} 232130803Smarcel 233130803Smarcelvoid 234130803Smarceltui_make_all_visible (void) 235130803Smarcel{ 236130803Smarcel make_all_visible (1); 237130803Smarcel} 238130803Smarcel 239130803Smarcelvoid 240130803Smarceltui_make_all_invisible (void) 241130803Smarcel{ 242130803Smarcel make_all_visible (0); 243130803Smarcel} 244130803Smarcel 245130803Smarcel/* Function to refresh all the windows currently displayed. */ 246130803Smarcel 247130803Smarcelvoid 248130803Smarceltui_refresh_all (struct tui_win_info * * list) 249130803Smarcel{ 250130803Smarcel enum tui_win_type type; 251130803Smarcel struct tui_gen_win_info * locator = tui_locator_win_info_ptr (); 252130803Smarcel 253130803Smarcel for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) 254130803Smarcel { 255130803Smarcel if (list[type] && list[type]->generic.is_visible) 256130803Smarcel { 257130803Smarcel if (type == SRC_WIN || type == DISASSEM_WIN) 258130803Smarcel { 259130803Smarcel touchwin (list[type]->detail.source_info.execution_info->handle); 260130803Smarcel tui_refresh_win (list[type]->detail.source_info.execution_info); 261130803Smarcel } 262130803Smarcel touchwin (list[type]->generic.handle); 263130803Smarcel tui_refresh_win (&list[type]->generic); 264130803Smarcel } 265130803Smarcel } 266130803Smarcel if (locator->is_visible) 267130803Smarcel { 268130803Smarcel touchwin (locator->handle); 269130803Smarcel tui_refresh_win (locator); 270130803Smarcel } 271130803Smarcel} 272130803Smarcel 273130803Smarcel 274130803Smarcel/********************************* 275130803Smarcel** Local Static Functions 276130803Smarcel*********************************/ 277