]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/tui/tuiGeneralWin.c
import gdb-1999-07-07 post reformat
[thirdparty/binutils-gdb.git] / gdb / tui / tuiGeneralWin.c
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 */
16 static void _winResize PARAMS ((void));
17
18
19 /***********************
20 ** PUBLIC FUNCTIONS
21 ***********************/
22 /*
23 ** tuiRefreshWin()
24 ** Refresh the window
25 */
26 void
27 #ifdef __STDC__
28 tuiRefreshWin (
29 TuiGenWinInfoPtr winInfo)
30 #else
31 tuiRefreshWin (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 */
68 void
69 #ifdef __STDC__
70 tuiDelwin (
71 WINDOW * window)
72 #else
73 tuiDelwin (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 */
87 void
88 #ifdef __STDC__
89 boxWin (
90 TuiGenWinInfoPtr winInfo,
91 int highlightFlag)
92 #else
93 boxWin (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 */
117 void
118 #ifdef __STDC__
119 unhighlightWin (
120 TuiWinInfoPtr winInfo)
121 #else
122 unhighlightWin (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 */
138 void
139 #ifdef __STDC__
140 highlightWin (
141 TuiWinInfoPtr winInfo)
142 #else
143 highlightWin (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 */
160 void
161 #ifdef __STDC__
162 checkAndDisplayHighlightIfNeeded (
163 TuiWinInfoPtr winInfo)
164 #else
165 checkAndDisplayHighlightIfNeeded (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 */
184 void
185 #ifdef __STDC__
186 makeWindow (
187 TuiGenWinInfoPtr winInfo,
188 int boxIt)
189 #else
190 makeWindow (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 */
229 void
230 #ifdef __STDC__
231 tuiClearWin (
232 TuiGenWinInfoPtr winInfo)
233 #else
234 tuiClearWin (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 */
259 void
260 #ifdef __STDC__
261 makeVisible (
262 TuiGenWinInfoPtr winInfo,
263 int visible)
264 #else
265 makeVisible (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 */
302 void
303 #ifdef __STDC__
304 makeAllVisible (
305 int visible)
306 #else
307 makeAllVisible (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 */
332 void
333 #ifdef __STDC__
334 scrollWinForward (
335 TuiGenWinInfoPtr winInfo,
336 int numLines)
337 #else
338 scrollWinForward (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 */
382 void
383 #ifdef __STDC__
384 scrollWinBackward (
385 TuiGenWinInfoPtr winInfo,
386 int numLines)
387 #else
388 scrollWinBackward (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 */
432 void
433 #ifdef __STDC__
434 refreshAll (
435 TuiWinInfoPtr * list)
436 #else
437 refreshAll (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 *********************************/