Remove tui_scroll_direction enum
[deliverable/binutils-gdb.git] / gdb / tui / tui-data.c
CommitLineData
f377b406 1/* TUI data manipulation routines.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
f33c6cbf 4
f377b406
SC
5 Contributed by Hewlett-Packard Company.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 21
96ec9981
DJ
22#include "defs.h"
23#include "symtab.h"
d7b2e967
AC
24#include "tui/tui.h"
25#include "tui/tui-data.h"
26#include "tui/tui-wingeneral.h"
6a83354a 27#include "gdb_curses.h"
4e8f7a8b 28
c906108c
SS
29/****************************
30** GLOBAL DECLARATIONS
31****************************/
7fa29be9 32struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 33
c906108c
SS
34/***************************
35** Private data
36****************************/
6ba8e26f
AC
37static enum tui_layout_type current_layout = UNDEFINED_LAYOUT;
38static int term_height, term_width;
ab313b35
TT
39static struct tui_gen_win_info _locator (LOCATOR_WIN);
40static struct tui_gen_win_info source_win (EXEC_INFO_WIN);
41static struct tui_gen_win_info disasm_win (EXEC_INFO_WIN);
ad54d15b 42static std::vector<tui_source_window_base *> source_windows;
e65b5245 43static struct tui_win_info *win_with_focus = NULL;
08ef48c5
MS
44static struct tui_layout_def layout_def = {
45 SRC_WIN, /* DISPLAY_MODE */
7bd0be3a 46 FALSE}; /* SPLIT */
08ef48c5 47
6ba8e26f 48static int win_resized = FALSE;
c906108c
SS
49
50
51/*********************************
52** Static function forward decls
53**********************************/
08ef48c5
MS
54static void free_content (tui_win_content,
55 int,
56 enum tui_win_type);
57static void free_content_elements (tui_win_content,
58 int,
59 enum tui_win_type);
c906108c
SS
60
61
62
63/*********************************
64** PUBLIC FUNCTIONS
65**********************************/
66
6d012f14
AC
67int
68tui_win_is_auxillary (enum tui_win_type win_type)
69{
70 return (win_type > MAX_MAJOR_WINDOWS);
71}
72
c906108c
SS
73/******************************************
74** ACCESSORS & MUTATORS FOR PRIVATE DATA
75******************************************/
76
1cc6d956 77/* Answer a whether the terminal window has been resized or not. */
c906108c 78int
dd1abb8c 79tui_win_resized (void)
c906108c 80{
6ba8e26f 81 return win_resized;
dd1abb8c 82}
c906108c
SS
83
84
1cc6d956 85/* Set a whether the terminal window has been resized or not. */
c906108c 86void
dd1abb8c 87tui_set_win_resized_to (int resized)
c906108c 88{
6ba8e26f 89 win_resized = resized;
dd1abb8c 90}
c906108c
SS
91
92
1cc6d956 93/* Answer a pointer to the current layout definition. */
2a8854a7 94struct tui_layout_def *
dd1abb8c 95tui_layout_def (void)
c906108c 96{
6ba8e26f 97 return &layout_def;
dd1abb8c 98}
c906108c
SS
99
100
1cc6d956 101/* Answer the window with the logical focus. */
2a8854a7 102struct tui_win_info *
dd1abb8c 103tui_win_with_focus (void)
c906108c 104{
6ba8e26f 105 return win_with_focus;
dd1abb8c 106}
c906108c
SS
107
108
1cc6d956 109/* Set the window that has the logical focus. */
c906108c 110void
5b6fe301 111tui_set_win_with_focus (struct tui_win_info *win_info)
c906108c 112{
6ba8e26f 113 win_with_focus = win_info;
dd1abb8c 114}
c906108c
SS
115
116
6ba8e26f
AC
117/* Accessor for the current source window. Usually there is only one
118 source window (either source or disassembly), but both can be
119 displayed at the same time. */
ad54d15b 120std::vector<tui_source_window_base *> &
b4eb2452 121tui_source_windows ()
c906108c 122{
b4eb2452 123 return source_windows;
dd1abb8c 124}
c906108c
SS
125
126
dd1abb8c
AC
127/* Clear the list of source windows. Usually there is only one source
128 window (either source or disassembly), but both can be displayed at
129 the same time. */
c906108c 130void
b4eb2452 131tui_clear_source_windows ()
c906108c 132{
b4eb2452 133 source_windows.clear ();
dd1abb8c 134}
c906108c
SS
135
136
1cc6d956 137/* Clear the pertinant detail in the source windows. */
c906108c 138void
b4eb2452 139tui_clear_source_windows_detail ()
c906108c 140{
ad54d15b 141 for (tui_source_window_base *win : tui_source_windows ())
7778b912 142 win->clear_detail ();
dd1abb8c 143}
c906108c
SS
144
145
dd1abb8c
AC
146/* Add a window to the list of source windows. Usually there is only
147 one source window (either source or disassembly), but both can be
148 displayed at the same time. */
c906108c 149void
ad54d15b 150tui_add_to_source_windows (struct tui_source_window_base *win_info)
c906108c 151{
b4eb2452
TT
152 if (source_windows.size () < 2)
153 source_windows.push_back (win_info);
dd1abb8c 154}
c906108c 155
8761a91b
TT
156/* See tui-data.h. */
157
158void
5cf82909 159tui_source_window_base::clear_detail ()
8761a91b 160{
e6e41501
TT
161 gdbarch = NULL;
162 start_line_or_addr.loa = LOA_ADDRESS;
163 start_line_or_addr.u.addr = 0;
164 horizontal_offset = 0;
8761a91b
TT
165}
166
167/* See tui-data.h. */
168
169void
170tui_cmd_window::clear_detail ()
171{
cb2ce893 172 wmove (handle, 0, 0);
8761a91b
TT
173}
174
175/* See tui-data.h. */
176
177void
178tui_data_window::clear_detail ()
179{
238eb706
TT
180 data_content = NULL;
181 data_content_count = 0;
182 regs_content = NULL;
183 regs_content_count = 0;
184 regs_column_count = 1;
ceb13a13 185 display_regs = false;
8761a91b 186}
c906108c 187
6ba8e26f 188/* Accessor for the source execution info ptr. */
2a8854a7 189struct tui_gen_win_info *
dd1abb8c 190tui_source_exec_info_win_ptr (void)
c906108c 191{
ab313b35 192 return &source_win;
6ba8e26f 193}
c906108c
SS
194
195
6ba8e26f 196/* Accessor for the disassem execution info ptr. */
2a8854a7 197struct tui_gen_win_info *
dd1abb8c 198tui_disassem_exec_info_win_ptr (void)
c906108c 199{
ab313b35 200 return &disasm_win;
6ba8e26f 201}
c906108c
SS
202
203
dd1abb8c
AC
204/* Accessor for the locator win info. Answers a pointer to the static
205 locator win info struct. */
2a8854a7 206struct tui_gen_win_info *
dd1abb8c 207tui_locator_win_info_ptr (void)
c906108c
SS
208{
209 return &_locator;
2a8854a7 210}
c906108c
SS
211
212
6ba8e26f 213/* Accessor for the term_height. */
c906108c 214int
dd1abb8c 215tui_term_height (void)
c906108c 216{
6ba8e26f 217 return term_height;
dd1abb8c 218}
c906108c
SS
219
220
1cc6d956 221/* Mutator for the term height. */
c906108c 222void
dd1abb8c 223tui_set_term_height_to (int h)
c906108c 224{
6ba8e26f 225 term_height = h;
dd1abb8c 226}
c906108c
SS
227
228
1cc6d956 229/* Accessor for the term_width. */
c906108c 230int
dd1abb8c 231tui_term_width (void)
c906108c 232{
6ba8e26f 233 return term_width;
dd1abb8c 234}
c906108c
SS
235
236
6ba8e26f 237/* Mutator for the term_width. */
c906108c 238void
dd1abb8c 239tui_set_term_width_to (int w)
c906108c 240{
6ba8e26f 241 term_width = w;
dd1abb8c 242}
c906108c
SS
243
244
1cc6d956 245/* Accessor for the current layout. */
2a8854a7 246enum tui_layout_type
dd1abb8c 247tui_current_layout (void)
c906108c 248{
6ba8e26f 249 return current_layout;
dd1abb8c 250}
c906108c
SS
251
252
dd1abb8c 253/* Mutator for the current layout. */
c906108c 254void
6ba8e26f 255tui_set_current_layout_to (enum tui_layout_type new_layout)
c906108c 256{
6ba8e26f 257 current_layout = new_layout;
dd1abb8c 258}
c906108c
SS
259
260
c906108c
SS
261/*****************************
262** OTHER PUBLIC FUNCTIONS
263*****************************/
264
265
dd1abb8c
AC
266/* Answer the next window in the list, cycling back to the top if
267 necessary. */
2a8854a7 268struct tui_win_info *
5b6fe301 269tui_next_win (struct tui_win_info *cur_win)
c906108c 270{
cb2ce893 271 int type = cur_win->type;
e65b5245 272 struct tui_win_info *next_win = NULL;
c906108c 273
cb2ce893 274 if (cur_win->type == CMD_WIN)
c906108c
SS
275 type = SRC_WIN;
276 else
cb2ce893
TT
277 type = cur_win->type + 1;
278 while (type != cur_win->type && (next_win == NULL))
c906108c 279 {
e5908723 280 if (tui_win_list[type]
cb2ce893 281 && tui_win_list[type]->is_visible)
6ba8e26f 282 next_win = tui_win_list[type];
c906108c
SS
283 else
284 {
285 if (type == CMD_WIN)
286 type = SRC_WIN;
287 else
288 type++;
289 }
290 }
291
6ba8e26f
AC
292 return next_win;
293}
c906108c
SS
294
295
dd1abb8c
AC
296/* Answer the prev window in the list, cycling back to the bottom if
297 necessary. */
2a8854a7 298struct tui_win_info *
5b6fe301 299tui_prev_win (struct tui_win_info *cur_win)
c906108c 300{
cb2ce893 301 int type = cur_win->type;
e65b5245 302 struct tui_win_info *prev = NULL;
c906108c 303
cb2ce893 304 if (cur_win->type == SRC_WIN)
c906108c
SS
305 type = CMD_WIN;
306 else
cb2ce893
TT
307 type = cur_win->type - 1;
308 while (type != cur_win->type && (prev == NULL))
c906108c 309 {
37715c4c 310 if (tui_win_list[type]
cb2ce893 311 && tui_win_list[type]->is_visible)
6d012f14 312 prev = tui_win_list[type];
c906108c
SS
313 else
314 {
315 if (type == SRC_WIN)
316 type = CMD_WIN;
317 else
318 type--;
319 }
320 }
321
322 return prev;
cb50eddd 323}
c906108c
SS
324
325
1cc6d956 326/* Answer the window represented by name. */
2a8854a7 327struct tui_win_info *
a121b7c1 328tui_partial_win_by_name (const char *name)
c906108c 329{
e65b5245 330 struct tui_win_info *win_info = NULL;
c906108c 331
63a33118 332 if (name != NULL)
c906108c
SS
333 {
334 int i = 0;
335
6d012f14 336 while (i < MAX_MAJOR_WINDOWS && win_info == NULL)
c906108c 337 {
6d012f14 338 if (tui_win_list[i] != 0)
a4b99e53 339 {
152f3f4b 340 const char *cur_name = tui_win_list[i]->name ();
1c5313c5 341
e5908723 342 if (strlen (name) <= strlen (cur_name)
61012eef 343 && startswith (cur_name, name))
6d012f14 344 win_info = tui_win_list[i];
a4b99e53 345 }
c906108c
SS
346 i++;
347 }
348 }
349
6d012f14 350 return win_info;
6ba8e26f 351}
c906108c
SS
352
353
c906108c 354void
dd1abb8c 355tui_initialize_static_data (void)
c906108c 356{
dd1abb8c
AC
357 tui_init_generic_part (tui_source_exec_info_win_ptr ());
358 tui_init_generic_part (tui_disassem_exec_info_win_ptr ());
359 tui_init_generic_part (tui_locator_win_info_ptr ());
360}
c906108c
SS
361
362
c906108c 363void
5b6fe301 364tui_init_generic_part (struct tui_gen_win_info *win)
c906108c
SS
365{
366 win->width =
367 win->height =
368 win->origin.x =
369 win->origin.y =
6d012f14
AC
370 win->viewport_height =
371 win->content_size =
372 win->last_visible_line = 0;
e65b5245 373 win->handle = NULL;
22940a24 374 win->content = NULL;
56122977
TT
375 win->content_in_use = FALSE;
376 win->is_visible = false;
bc6b7f04
SC
377 win->title = 0;
378}
c906108c
SS
379
380
ef5eab5a 381/* init_content_element().
c5aa993b 382 */
2c0b251b 383static void
08ef48c5
MS
384init_content_element (struct tui_win_element *element,
385 enum tui_win_type type)
c906108c 386{
c906108c
SS
387 switch (type)
388 {
389 case SRC_WIN:
390 case DISASSEM_WIN:
e65b5245 391 element->which_element.source.line = NULL;
362c05fe
AS
392 element->which_element.source.line_or_addr.loa = LOA_LINE;
393 element->which_element.source.line_or_addr.u.line_no = 0;
6d012f14
AC
394 element->which_element.source.is_exec_point = FALSE;
395 element->which_element.source.has_break = FALSE;
c906108c
SS
396 break;
397 case DATA_WIN:
ab313b35 398 element->which_element.data_window = new struct tui_gen_win_info (DATA_ITEM_WIN);
dc2c33e4 399 element->which_element.data_window->content =
63ed8182 400 tui_alloc_content (1, DATA_ITEM_WIN);
dc2c33e4 401 element->which_element.data_window->content_size = 1;
c906108c
SS
402 break;
403 case CMD_WIN:
e65b5245 404 element->which_element.command.line = NULL;
c906108c
SS
405 break;
406 case DATA_ITEM_WIN:
e65b5245 407 element->which_element.data.name = NULL;
6d012f14
AC
408 element->which_element.data.type = TUI_REGISTER;
409 element->which_element.data.item_no = UNDEFINED_ITEM;
410 element->which_element.data.value = NULL;
411 element->which_element.data.highlight = FALSE;
e65b5245 412 element->which_element.data.content = NULL;
c906108c
SS
413 break;
414 case LOCATOR_WIN:
56d397a3 415 element->which_element.locator.full_name[0] =
6d012f14
AC
416 element->which_element.locator.proc_name[0] = (char) 0;
417 element->which_element.locator.line_no = 0;
418 element->which_element.locator.addr = 0;
c906108c
SS
419 break;
420 case EXEC_INFO_WIN:
6d012f14
AC
421 memset(element->which_element.simple_string, ' ',
422 sizeof(element->which_element.simple_string));
c906108c
SS
423 break;
424 default:
425 break;
426 }
6ba8e26f 427}
c906108c 428
33b906ab 429tui_win_info::tui_win_info (enum tui_win_type type)
cb2ce893 430 : tui_gen_win_info (type)
c906108c 431{
6ba8e26f 432}
c906108c 433
5cf82909 434tui_source_window_base::tui_source_window_base (enum tui_win_type type)
33b906ab
TT
435 : tui_win_info (type)
436{
437 gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
e6e41501
TT
438 start_line_or_addr.loa = LOA_ADDRESS;
439 start_line_or_addr.u.addr = 0;
33b906ab
TT
440}
441
2a8854a7 442struct tui_win_info *
22940a24 443tui_alloc_win_info (enum tui_win_type type)
c906108c 444{
33b906ab
TT
445 switch (type)
446 {
447 case SRC_WIN:
5cf82909
TT
448 return new tui_source_window ();
449
33b906ab 450 case DISASSEM_WIN:
5cf82909 451 return new tui_disasm_window ();
c906108c 452
33b906ab
TT
453 case DATA_WIN:
454 return new tui_data_window ();
c906108c 455
33b906ab
TT
456 case CMD_WIN:
457 return new tui_cmd_window ();
458 }
459
460 gdb_assert_not_reached (_("Unhandled window type"));
6ba8e26f 461}
c906108c
SS
462
463
6ba8e26f 464/* Allocates the content and elements in a block. */
2a8854a7 465tui_win_content
6ba8e26f 466tui_alloc_content (int num_elements, enum tui_win_type type)
c906108c 467{
c0645fb5 468 tui_win_content content;
7acd011b 469 struct tui_win_element *element_block_ptr;
c906108c
SS
470 int i;
471
8d749320 472 content = XNEWVEC (struct tui_win_element *, num_elements);
7acd011b
SM
473
474 /*
475 * All windows, except the data window, can allocate the
476 * elements in a chunk. The data window cannot because items
477 * can be added/removed from the data display by the user at any
478 * time.
479 */
480 if (type != DATA_WIN)
c0645fb5 481 {
7acd011b
SM
482 element_block_ptr = XNEWVEC (struct tui_win_element, num_elements);
483 for (i = 0; i < num_elements; i++)
c906108c 484 {
7acd011b
SM
485 content[i] = element_block_ptr;
486 init_content_element (content[i], type);
487 element_block_ptr++;
c906108c
SS
488 }
489 }
490
491 return content;
6ba8e26f 492}
c906108c
SS
493
494
dd1abb8c 495/* Adds the input number of elements to the windows's content. If no
6ba8e26f 496 content has been allocated yet, alloc_content() is called to do
dd1abb8c
AC
497 this. The index of the first element added is returned, unless
498 there is a memory allocation error, in which case, (-1) is
499 returned. */
c906108c 500int
08ef48c5
MS
501tui_add_content_elements (struct tui_gen_win_info *win_info,
502 int num_elements)
c906108c 503{
5b6fe301 504 struct tui_win_element *element_ptr;
6ba8e26f 505 int i, index_start;
c906108c 506
6d012f14 507 if (win_info->content == NULL)
c906108c 508 {
63ed8182 509 win_info->content = tui_alloc_content (num_elements, win_info->type);
6ba8e26f 510 index_start = 0;
c906108c
SS
511 }
512 else
6ba8e26f 513 index_start = win_info->content_size;
6d012f14 514 if (win_info->content != NULL)
c906108c 515 {
6ba8e26f 516 for (i = index_start; (i < num_elements + index_start); i++)
c906108c 517 {
8d749320 518 element_ptr = XNEW (struct tui_win_element);
730ead81
TT
519 win_info->content[i] = element_ptr;
520 init_content_element (element_ptr, win_info->type);
521 win_info->content_size++;
c906108c
SS
522 }
523 }
524
6ba8e26f
AC
525 return index_start;
526}
c906108c 527
5cf82909 528tui_source_window_base::~tui_source_window_base ()
c906108c 529{
e6e41501
TT
530 xfree (fullname);
531 struct tui_gen_win_info *generic_win = execution_info;
ee1d42d6
TT
532 if (generic_win != NULL)
533 {
534 tui_delete_win (generic_win->handle);
535 generic_win->handle = NULL;
536 tui_free_win_content (generic_win);
537 }
538}
c906108c 539
ee1d42d6
TT
540tui_data_window::~tui_data_window ()
541{
cb2ce893 542 if (content != NULL)
c906108c 543 {
238eb706
TT
544 tui_free_data_content (regs_content, regs_content_count);
545 regs_content = NULL;
546 regs_content_count = 0;
547 tui_free_data_content (data_content, data_content_count);
548 data_content = NULL;
549 data_content_count = 0;
550 regs_column_count = 1;
ceb13a13 551 display_regs = false;
cb2ce893
TT
552 content = NULL;
553 content_size = 0;
c906108c 554 }
ee1d42d6
TT
555}
556
557tui_win_info::~tui_win_info ()
558{
cb2ce893 559 if (handle != NULL)
c906108c 560 {
cb2ce893
TT
561 tui_delete_win (handle);
562 handle = NULL;
563 tui_free_win_content (this);
c906108c 564 }
cb2ce893
TT
565 if (title)
566 xfree (title);
bc6b7f04 567}
c906108c
SS
568
569
c906108c 570void
b4eb2452 571tui_free_all_source_wins_content ()
c906108c 572{
ad54d15b 573 for (tui_source_window_base *win_info : tui_source_windows ())
c906108c 574 {
cb2ce893 575 tui_free_win_content (win_info);
ad54d15b 576 tui_free_win_content (win_info->execution_info);
c906108c 577 }
dd1abb8c 578}
c906108c
SS
579
580
c906108c 581void
5b6fe301 582tui_free_win_content (struct tui_gen_win_info *win_info)
c906108c 583{
6d012f14 584 if (win_info->content != NULL)
c906108c 585 {
63a33118 586 free_content (win_info->content,
6d012f14
AC
587 win_info->content_size,
588 win_info->type);
589 win_info->content = NULL;
c906108c 590 }
6d012f14 591 win_info->content_size = 0;
6ba8e26f 592}
c906108c
SS
593
594
c906108c 595void
08ef48c5
MS
596tui_free_data_content (tui_win_content content,
597 int content_size)
c906108c
SS
598{
599 int i;
600
ef5eab5a
MS
601 /* Remember that data window content elements are of type struct
602 tui_gen_win_info *, each of which whose single element is a data
603 element. */
6ba8e26f 604 for (i = 0; i < content_size; i++)
c906108c 605 {
9a2b4c1b 606 struct tui_gen_win_info *generic_win
dc2c33e4 607 = content[i]->which_element.data_window;
c906108c 608
cafb3438 609 if (generic_win != NULL)
c906108c 610 {
6ba8e26f 611 tui_delete_win (generic_win->handle);
e65b5245 612 generic_win->handle = NULL;
6ba8e26f 613 tui_free_win_content (generic_win);
c906108c
SS
614 }
615 }
6ba8e26f 616 free_content (content,
08ef48c5
MS
617 content_size,
618 DATA_WIN);
6ba8e26f 619}
c906108c
SS
620
621
622/**********************************
623** LOCAL STATIC FUNCTIONS **
624**********************************/
625
626
c906108c 627static void
08ef48c5
MS
628free_content (tui_win_content content,
629 int content_size,
630 enum tui_win_type win_type)
c906108c 631{
d04b44a1 632 if (content != NULL)
c906108c 633 {
6ba8e26f 634 free_content_elements (content, content_size, win_type);
22940a24 635 xfree (content);
c906108c 636 }
6ba8e26f 637}
c906108c
SS
638
639
ef5eab5a 640/* free_content_elements().
c5aa993b 641 */
c906108c 642static void
08ef48c5
MS
643free_content_elements (tui_win_content content,
644 int content_size,
645 enum tui_win_type type)
c906108c 646{
d04b44a1 647 if (content != NULL)
c906108c
SS
648 {
649 int i;
650
62f29fda 651 if (type == DISASSEM_WIN)
c906108c 652 {
1cc6d956 653 /* Free whole source block. */
6d012f14 654 xfree (content[0]->which_element.source.line);
c906108c
SS
655 }
656 else
657 {
6ba8e26f 658 for (i = 0; i < content_size; i++)
c906108c 659 {
5b6fe301 660 struct tui_win_element *element;
c906108c
SS
661
662 element = content[i];
cafb3438 663 if (element != NULL)
c906108c
SS
664 {
665 switch (type)
666 {
62f29fda
TT
667 case SRC_WIN:
668 xfree (element->which_element.source.line);
669 break;
c906108c 670 case DATA_WIN:
ab313b35 671 delete element->which_element.data_window;
22940a24 672 xfree (element);
c906108c
SS
673 break;
674 case DATA_ITEM_WIN:
ef5eab5a
MS
675 /* Note that data elements are not allocated in
676 a single block, but individually, as
677 needed. */
6d012f14
AC
678 if (element->which_element.data.type != TUI_REGISTER)
679 xfree ((void *)element->which_element.data.name);
680 xfree (element->which_element.data.value);
10f59415 681 xfree (element->which_element.data.content);
22940a24 682 xfree (element);
c906108c
SS
683 break;
684 case CMD_WIN:
6d012f14 685 xfree (element->which_element.command.line);
c906108c
SS
686 break;
687 default:
688 break;
689 }
690 }
691 }
692 }
693 if (type != DATA_WIN && type != DATA_ITEM_WIN)
1cc6d956 694 xfree (content[0]); /* Free the element block. */
c906108c 695 }
6ba8e26f 696}
This page took 2.061104 seconds and 4 git commands to generate.