]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tuiGeneralWin.c
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / gdb / tui / tuiGeneralWin.c
CommitLineData
03b93bdc
DT
1/*
2** TuiGeneralWin.c
3** This module supports general window behavior
4*/
5
6#include <curses.h>
7#include "defs.h"
8#include "tui.h"
9#include "tuiData.h"
10#include "tuiGeneralWin.h"
11
12
13/*
14** local support functions
15*/
16static void _winResize PARAMS ((void));
17
18
19/***********************
20** PUBLIC FUNCTIONS
21***********************/
22/*
23** tuiRefreshWin()
24** Refresh the window
25*/
26void
27#ifdef __STDC__
28tuiRefreshWin (
29 TuiGenWinInfoPtr winInfo)
30#else
31tuiRefreshWin (winInfo)
32 TuiGenWinInfoPtr winInfo;
33#endif
34{
35 if (winInfo->type == DATA_WIN && winInfo->contentSize > 0)
36 {
37 int i;
38
39 for (i = 0; (i < winInfo->contentSize); i++)
40 {
41 TuiGenWinInfoPtr dataItemWinPtr;
42
43 dataItemWinPtr = &((TuiWinContent)
44 winInfo->content)[i]->whichElement.dataWindow;
45 if (m_genWinPtrNotNull (dataItemWinPtr) &&
46 dataItemWinPtr->handle != (WINDOW *) NULL)
47 wrefresh (dataItemWinPtr->handle);
48 }
49 }
50 else if (winInfo->type == CMD_WIN)
51 {
52 /* Do nothing */
53 }
54 else
55 {
56 if (winInfo->handle != (WINDOW *) NULL)
57 wrefresh (winInfo->handle);
58 }
59
60 return;
61} /* tuiRefreshWin */
62
63
64/*
65** tuiDelwin()
66** Function to delete the curses window, checking for null
67*/
68void
69#ifdef __STDC__
70tuiDelwin (
71 WINDOW * window)
72#else
73tuiDelwin (window)
74 WINDOW *window;
75#endif
76{
77 if (window != (WINDOW *) NULL)
78 delwin (window);
79
80 return;
81} /* tuiDelwin */
82
83
84/*
85** boxWin().
86*/
87void
88#ifdef __STDC__
89boxWin (
90 TuiGenWinInfoPtr winInfo,
91 int highlightFlag)
92#else
93boxWin (winInfo, highlightFlag)
94 TuiGenWinInfoPtr winInfo;
95 int highlightFlag;
96#endif
97{
98 if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL)
99 {
100 if (highlightFlag == HILITE)
101 box (winInfo->handle, '|', '-');
102 else
103 {
104/* wattron(winInfo->handle, A_DIM);*/
105 box (winInfo->handle, ':', '.');
106/* wattroff(winInfo->handle, A_DIM);*/
107 }
108 }
109
110 return;
111} /* boxWin */
112
113
114/*
115** unhighlightWin().
116*/
117void
118#ifdef __STDC__
119unhighlightWin (
120 TuiWinInfoPtr winInfo)
121#else
122unhighlightWin (winInfo)
123 TuiWinInfoPtr winInfo;
124#endif
125{
126 if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL)
127 {
128 boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE);
129 wrefresh (winInfo->generic.handle);
130 m_setWinHighlightOff (winInfo);
131 }
132} /* unhighlightWin */
133
134
135/*
136** highlightWin().
137*/
138void
139#ifdef __STDC__
140highlightWin (
141 TuiWinInfoPtr winInfo)
142#else
143highlightWin (winInfo)
144 TuiWinInfoPtr winInfo;
145#endif
146{
147 if (m_winPtrNotNull (winInfo) &&
148 winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL)
149 {
150 boxWin ((TuiGenWinInfoPtr) winInfo, HILITE);
151 wrefresh (winInfo->generic.handle);
152 m_setWinHighlightOn (winInfo);
153 }
154} /* highlightWin */
155
156
157/*
158** checkAndDisplayHighlightIfNecessay
159*/
160void
161#ifdef __STDC__
162checkAndDisplayHighlightIfNeeded (
163 TuiWinInfoPtr winInfo)
164#else
165checkAndDisplayHighlightIfNeeded (winInfo)
166 TuiWinInfoPtr winInfo;
167#endif
168{
169 if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN)
170 {
171 if (winInfo->isHighlighted)
172 highlightWin (winInfo);
173 else
174 unhighlightWin (winInfo);
175
176 }
177 return;
178} /* checkAndDisplayHighlightIfNeeded */
179
180
181/*
182** makeWindow().
183*/
184void
185#ifdef __STDC__
186makeWindow (
187 TuiGenWinInfoPtr winInfo,
188 int boxIt)
189#else
190makeWindow (winInfo, boxIt)
191 TuiGenWinInfoPtr winInfo;
192 int boxIt;
193#endif
194{
195 WINDOW *handle;
196
197 handle = newwin (winInfo->height,
198 winInfo->width,
199 winInfo->origin.y,
200 winInfo->origin.x);
201 winInfo->handle = handle;
202 if (handle != (WINDOW *) NULL)
203 {
204 if (boxIt == BOX_WINDOW)
205 boxWin (winInfo, NO_HILITE);
206 winInfo->isVisible = TRUE;
207 scrollok (handle, TRUE);
208 tuiRefreshWin (winInfo);
209
210#ifndef FOR_TEST
211 if ( /*!m_WinIsAuxillary(winInfo->type) && */
212 (winInfo->type != CMD_WIN) &&
213 (winInfo->content == (OpaquePtr) NULL))
214 {
215 mvwaddstr (handle, 1, 1, winName (winInfo));
216 tuiRefreshWin (winInfo);
217 }
218#endif /*FOR_TEST*/
219 }
220
221 return;
222} /* makeWindow */
223
224
225/*
226** tuiClearWin().
227** Clear the window of all contents without calling wclear.
228*/
229void
230#ifdef __STDC__
231tuiClearWin (
232 TuiGenWinInfoPtr winInfo)
233#else
234tuiClearWin (winInfo)
235 TuiGenWinInfoPtr winInfo;
236#endif
237{
238 if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL)
239 {
240 int curRow, curCol;
241
242 for (curRow = 0; (curRow < winInfo->height); curRow++)
243 for (curCol = 0; (curCol < winInfo->width); curCol++)
244 mvwaddch (winInfo->handle, curRow, curCol, ' ');
245
246 tuiRefreshWin (winInfo);
247 }
248
249 return;
250} /* tuiClearWin */
251
252
253/*
254** makeVisible().
255** We can't really make windows visible, or invisible. So we
256** have to delete the entire window when making it visible,
257** and create it again when making it visible.
258*/
259void
260#ifdef __STDC__
261makeVisible (
262 TuiGenWinInfoPtr winInfo,
263 int visible)
264#else
265makeVisible (winInfo, visible)
266 TuiGenWinInfoPtr winInfo;
267 int visible;
268#endif
269{
270 /* Don't tear down/recreate command window */
271 if (winInfo->type == CMD_WIN)
272 return;
273
274 if (visible)
275 {
276 if (!winInfo->isVisible)
277 {
278 makeWindow (
279 winInfo,
280 (winInfo->type != CMD_WIN && !m_winIsAuxillary (winInfo->type)));
281 winInfo->isVisible = TRUE;
282 }
283 tuiRefreshWin (winInfo);
284 }
285 else if (!visible &&
286 winInfo->isVisible && winInfo->handle != (WINDOW *) NULL)
287 {
288 winInfo->isVisible = FALSE;
289 tuiClearWin (winInfo);
290 tuiDelwin (winInfo->handle);
291 winInfo->handle = (WINDOW *) NULL;
292 }
293
294 return;
295} /* makeVisible */
296
297
298/*
299** makeAllVisible().
300** Makes all windows invisible (except the command and locator windows)
301*/
302void
303#ifdef __STDC__
304makeAllVisible (
305 int visible)
306#else
307makeAllVisible (visible)
308 int visible;
309#endif
310{
311 int i;
312
313 for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
314 {
315 if (m_winPtrNotNull (winList[i]) &&
316 ((winList[i])->generic.type) != CMD_WIN)
317 {
318 if (m_winIsSourceType ((winList[i])->generic.type))
319 makeVisible ((winList[i])->detail.sourceInfo.executionInfo,
320 visible);
321 makeVisible ((TuiGenWinInfoPtr) winList[i], visible);
322 }
323 }
324
325 return;
326} /* makeAllVisible */
327
328
329/*
330** scrollWinForward
331*/
332void
333#ifdef __STDC__
334scrollWinForward (
335 TuiGenWinInfoPtr winInfo,
336 int numLines)
337#else
338scrollWinForward (winInfo, numLines)
339 TuiGenWinInfoPtr winInfo;
340 int numLines;
341#endif
342{
343 if (winInfo->content != (OpaquePtr) NULL &&
344 winInfo->lastVisibleLine < winInfo->contentSize - 1)
345 {
346 int i, firstLine, newLastLine;
347
348 firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1;
349 if (winInfo->lastVisibleLine + numLines > winInfo->contentSize)
350 newLastLine = winInfo->contentSize - 1;
351 else
352 newLastLine = winInfo->lastVisibleLine + numLines - 1;
353
354 for (i = (newLastLine - winInfo->viewportHeight);
355 (i <= newLastLine); i++)
356 {
357 TuiWinElementPtr line;
358 int lineHeight;
359
360 line = (TuiWinElementPtr) winInfo->content[i];
361 if (line->highlight)
362 wstandout (winInfo->handle);
363 mvwaddstr (winInfo->handle,
364 i - (newLastLine - winInfo->viewportHeight),
365 1,
366 displayableWinContentOf (winInfo, line));
367 if (line->highlight)
368 wstandend (winInfo->handle);
369 lineHeight = winElementHeight (winInfo, line);
370 newLastLine += (lineHeight - 1);
371 }
372 winInfo->lastVisibleLine = newLastLine;
373 }
374
375 return;
376} /* scrollWinForward */
377
378
379/*
380** scrollWinBackward
381*/
382void
383#ifdef __STDC__
384scrollWinBackward (
385 TuiGenWinInfoPtr winInfo,
386 int numLines)
387#else
388scrollWinBackward (winInfo, numLines)
389 TuiGenWinInfoPtr winInfo;
390 int numLines;
391#endif
392{
393 if (winInfo->content != (OpaquePtr) NULL &&
394 (winInfo->lastVisibleLine - winInfo->viewportHeight) > 0)
395 {
396 int i, newLastLine, firstLine;
397
398 firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1;
399 if ((firstLine - numLines) < 0)
400 newLastLine = winInfo->viewportHeight - 1;
401 else
402 newLastLine = winInfo->lastVisibleLine - numLines + 1;
403
404 for (i = newLastLine - winInfo->viewportHeight; (i <= newLastLine); i++)
405 {
406 TuiWinElementPtr line;
407 int lineHeight;
408
409 line = (TuiWinElementPtr) winInfo->content[i];
410 if (line->highlight)
411 wstandout (winInfo->handle);
412 mvwaddstr (winInfo->handle,
413 i - (newLastLine - winInfo->viewportHeight),
414 1,
415 displayableWinContentOf (winInfo, line));
416 if (line->highlight)
417 wstandend (winInfo->handle);
418 lineHeight = winElementHeight (winInfo, line);
419 newLastLine += (lineHeight - 1);
420 }
421 winInfo->lastVisibleLine = newLastLine;
422 }
423
424 return;
425} /* scrollWinBackward */
426
427
428/*
429** refreshAll().
430** Function to refresh all the windows currently displayed
431*/
432void
433#ifdef __STDC__
434refreshAll (
435 TuiWinInfoPtr * list)
436#else
437refreshAll (list)
438 TuiWinInfoPtr *list;
439#endif
440{
441 TuiWinType type;
442 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
443
444 for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
445 {
446 if (list[type]->generic.isVisible)
447 {
448 if (type == SRC_WIN || type == DISASSEM_WIN)
449 {
450 touchwin (list[type]->detail.sourceInfo.executionInfo->handle);
451 tuiRefreshWin (list[type]->detail.sourceInfo.executionInfo);
452 }
453 touchwin (list[type]->generic.handle);
454 tuiRefreshWin (&list[type]->generic);
455 }
456 }
457 if (locator->isVisible)
458 {
459 touchwin (locator->handle);
460 tuiRefreshWin (locator);
461 }
462
463 return;
464} /* refreshAll */
465
466
467/*********************************
468** Local Static Functions
469*********************************/