1 /* General window behavior.
2 Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3 Contributed by Hewlett-Packard Company.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
25 #include "tuiGeneralWin.h"
29 ** local support functions
31 static void _winResize (void);
34 /***********************
36 ***********************/
44 TuiGenWinInfoPtr winInfo
)
46 tuiRefreshWin (winInfo
)
47 TuiGenWinInfoPtr winInfo
;
50 if (winInfo
->type
== DATA_WIN
&& winInfo
->contentSize
> 0)
54 for (i
= 0; (i
< winInfo
->contentSize
); i
++)
56 TuiGenWinInfoPtr dataItemWinPtr
;
58 dataItemWinPtr
= &((TuiWinContent
)
59 winInfo
->content
)[i
]->whichElement
.dataWindow
;
60 if (m_genWinPtrNotNull (dataItemWinPtr
) &&
61 dataItemWinPtr
->handle
!= (WINDOW
*) NULL
)
62 wrefresh (dataItemWinPtr
->handle
);
65 else if (winInfo
->type
== CMD_WIN
)
71 if (winInfo
->handle
!= (WINDOW
*) NULL
)
72 wrefresh (winInfo
->handle
);
81 ** Function to delete the curses window, checking for null
92 if (window
!= (WINDOW
*) NULL
)
105 TuiGenWinInfoPtr winInfo
,
108 boxWin (winInfo
, highlightFlag
)
109 TuiGenWinInfoPtr winInfo
;
113 if (m_genWinPtrNotNull (winInfo
) && winInfo
->handle
!= (WINDOW
*) NULL
)
115 if (highlightFlag
== HILITE
)
116 box (winInfo
->handle
, '|', '-');
119 /* wattron(winInfo->handle, A_DIM); */
120 box (winInfo
->handle
, ':', '.');
121 /* wattroff(winInfo->handle, A_DIM); */
135 TuiWinInfoPtr winInfo
)
137 unhighlightWin (winInfo
)
138 TuiWinInfoPtr winInfo
;
141 if (m_winPtrNotNull (winInfo
) && winInfo
->generic
.handle
!= (WINDOW
*) NULL
)
143 boxWin ((TuiGenWinInfoPtr
) winInfo
, NO_HILITE
);
144 wrefresh (winInfo
->generic
.handle
);
145 m_setWinHighlightOff (winInfo
);
147 } /* unhighlightWin */
156 TuiWinInfoPtr winInfo
)
158 highlightWin (winInfo
)
159 TuiWinInfoPtr winInfo
;
162 if (m_winPtrNotNull (winInfo
) &&
163 winInfo
->canHighlight
&& winInfo
->generic
.handle
!= (WINDOW
*) NULL
)
165 boxWin ((TuiGenWinInfoPtr
) winInfo
, HILITE
);
166 wrefresh (winInfo
->generic
.handle
);
167 m_setWinHighlightOn (winInfo
);
173 ** checkAndDisplayHighlightIfNecessay
177 checkAndDisplayHighlightIfNeeded (
178 TuiWinInfoPtr winInfo
)
180 checkAndDisplayHighlightIfNeeded (winInfo
)
181 TuiWinInfoPtr winInfo
;
184 if (m_winPtrNotNull (winInfo
) && winInfo
->generic
.type
!= CMD_WIN
)
186 if (winInfo
->isHighlighted
)
187 highlightWin (winInfo
);
189 unhighlightWin (winInfo
);
193 } /* checkAndDisplayHighlightIfNeeded */
202 TuiGenWinInfoPtr winInfo
,
205 makeWindow (winInfo
, boxIt
)
206 TuiGenWinInfoPtr winInfo
;
212 handle
= newwin (winInfo
->height
,
216 winInfo
->handle
= handle
;
217 if (handle
!= (WINDOW
*) NULL
)
219 if (boxIt
== BOX_WINDOW
)
220 boxWin (winInfo
, NO_HILITE
);
221 winInfo
->isVisible
= TRUE
;
222 scrollok (handle
, TRUE
);
223 tuiRefreshWin (winInfo
);
226 if ( /*!m_WinIsAuxillary(winInfo->type) && */
227 (winInfo
->type
!= CMD_WIN
) &&
228 (winInfo
->content
== (OpaquePtr
) NULL
))
230 mvwaddstr (handle
, 1, 1, winName (winInfo
));
231 tuiRefreshWin (winInfo
);
242 ** Clear the window of all contents without calling wclear.
247 TuiGenWinInfoPtr winInfo
)
249 tuiClearWin (winInfo
)
250 TuiGenWinInfoPtr winInfo
;
253 if (m_genWinPtrNotNull (winInfo
) && winInfo
->handle
!= (WINDOW
*) NULL
)
257 for (curRow
= 0; (curRow
< winInfo
->height
); curRow
++)
258 for (curCol
= 0; (curCol
< winInfo
->width
); curCol
++)
259 mvwaddch (winInfo
->handle
, curRow
, curCol
, ' ');
261 tuiRefreshWin (winInfo
);
270 ** We can't really make windows visible, or invisible. So we
271 ** have to delete the entire window when making it visible,
272 ** and create it again when making it visible.
277 TuiGenWinInfoPtr winInfo
,
280 makeVisible (winInfo
, visible
)
281 TuiGenWinInfoPtr winInfo
;
285 /* Don't tear down/recreate command window */
286 if (winInfo
->type
== CMD_WIN
)
291 if (!winInfo
->isVisible
)
295 (winInfo
->type
!= CMD_WIN
&& !m_winIsAuxillary (winInfo
->type
)));
296 winInfo
->isVisible
= TRUE
;
298 tuiRefreshWin (winInfo
);
301 winInfo
->isVisible
&& winInfo
->handle
!= (WINDOW
*) NULL
)
303 winInfo
->isVisible
= FALSE
;
304 tuiClearWin (winInfo
);
305 tuiDelwin (winInfo
->handle
);
306 winInfo
->handle
= (WINDOW
*) NULL
;
315 ** Makes all windows invisible (except the command and locator windows)
322 makeAllVisible (visible
)
328 for (i
= 0; i
< MAX_MAJOR_WINDOWS
; i
++)
330 if (m_winPtrNotNull (winList
[i
]) &&
331 ((winList
[i
])->generic
.type
) != CMD_WIN
)
333 if (m_winIsSourceType ((winList
[i
])->generic
.type
))
334 makeVisible ((winList
[i
])->detail
.sourceInfo
.executionInfo
,
336 makeVisible ((TuiGenWinInfoPtr
) winList
[i
], visible
);
341 } /* makeAllVisible */
350 TuiGenWinInfoPtr winInfo
,
353 scrollWinForward (winInfo
, numLines
)
354 TuiGenWinInfoPtr winInfo
;
358 if (winInfo
->content
!= (OpaquePtr
) NULL
&&
359 winInfo
->lastVisibleLine
< winInfo
->contentSize
- 1)
361 int i
, firstLine
, newLastLine
;
363 firstLine
= winInfo
->lastVisibleLine
- winInfo
->viewportHeight
+ 1;
364 if (winInfo
->lastVisibleLine
+ numLines
> winInfo
->contentSize
)
365 newLastLine
= winInfo
->contentSize
- 1;
367 newLastLine
= winInfo
->lastVisibleLine
+ numLines
- 1;
369 for (i
= (newLastLine
- winInfo
->viewportHeight
);
370 (i
<= newLastLine
); i
++)
372 TuiWinElementPtr line
;
375 line
= (TuiWinElementPtr
) winInfo
->content
[i
];
377 wstandout (winInfo
->handle
);
378 mvwaddstr (winInfo
->handle
,
379 i
- (newLastLine
- winInfo
->viewportHeight
),
381 displayableWinContentOf (winInfo
, line
));
383 wstandend (winInfo
->handle
);
384 lineHeight
= winElementHeight (winInfo
, line
);
385 newLastLine
+= (lineHeight
- 1);
387 winInfo
->lastVisibleLine
= newLastLine
;
391 } /* scrollWinForward */
400 TuiGenWinInfoPtr winInfo
,
403 scrollWinBackward (winInfo
, numLines
)
404 TuiGenWinInfoPtr winInfo
;
408 if (winInfo
->content
!= (OpaquePtr
) NULL
&&
409 (winInfo
->lastVisibleLine
- winInfo
->viewportHeight
) > 0)
411 int i
, newLastLine
, firstLine
;
413 firstLine
= winInfo
->lastVisibleLine
- winInfo
->viewportHeight
+ 1;
414 if ((firstLine
- numLines
) < 0)
415 newLastLine
= winInfo
->viewportHeight
- 1;
417 newLastLine
= winInfo
->lastVisibleLine
- numLines
+ 1;
419 for (i
= newLastLine
- winInfo
->viewportHeight
; (i
<= newLastLine
); i
++)
421 TuiWinElementPtr line
;
424 line
= (TuiWinElementPtr
) winInfo
->content
[i
];
426 wstandout (winInfo
->handle
);
427 mvwaddstr (winInfo
->handle
,
428 i
- (newLastLine
- winInfo
->viewportHeight
),
430 displayableWinContentOf (winInfo
, line
));
432 wstandend (winInfo
->handle
);
433 lineHeight
= winElementHeight (winInfo
, line
);
434 newLastLine
+= (lineHeight
- 1);
436 winInfo
->lastVisibleLine
= newLastLine
;
440 } /* scrollWinBackward */
445 ** Function to refresh all the windows currently displayed
450 TuiWinInfoPtr
* list
)
457 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
459 for (type
= SRC_WIN
; (type
< MAX_MAJOR_WINDOWS
); type
++)
461 if (list
[type
]->generic
.isVisible
)
463 if (type
== SRC_WIN
|| type
== DISASSEM_WIN
)
465 touchwin (list
[type
]->detail
.sourceInfo
.executionInfo
->handle
);
466 tuiRefreshWin (list
[type
]->detail
.sourceInfo
.executionInfo
);
468 touchwin (list
[type
]->generic
.handle
);
469 tuiRefreshWin (&list
[type
]->generic
);
472 if (locator
->isVisible
)
474 touchwin (locator
->handle
);
475 tuiRefreshWin (locator
);
482 /*********************************
483 ** Local Static Functions
484 *********************************/