[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Avoiding clearing the screen
From: |
Christer Enfors |
Subject: |
Avoiding clearing the screen |
Date: |
Thu, 20 Dec 2007 09:03:01 +0100 |
User-agent: |
Thunderbird 2.0.0.9 (Windows/20071031) |
Hi.
I'm using ncurses 5.5 on an AIX 5.3 machine. I've had the TERM variable
set to vt100 and dtterm, but both values produce the same result. I've
created a menu program that uses the menu and panel libraries. My
program uses three non-overlapping windows, each using their own panel.
Meaning, if I understand panels correctly, I don't really need panels,
but I included it from the start anyway because I thought that my
program might eventually need overlapping windows (IE, panels).
Now, my problem is that the entire screen is cleared when I press a key
to go up or down in the menu, which causes some terminals to flicker
terribly. I was expecting ncurses to only redraw a subsection of the
menu - the menu item that was previously selected, and the new one. That
the entire screen is cleared is strange to me, because I don't clear the
entire screen - I only clear one of my windows (which takes up the
bottom fifth of the screen).
The function that causes the screen to be cleared is doupdate().
Here is the relevant parts of the code. Comments have been added for the
purpose of this post. Irrelevant parts of the code have been replaced
with /* [snip] */.
/* We start in this function. */
TreeNode *EnterMenu(TreeNode *node, ScreenInfo *screen_info)
{
/* [snip] */
while (done == 0)
{
switch (getch()) /* User presses j or KEY_DOWN here. */
{
case 'j':
case KEY_DOWN:
menu_driver(menu, REQ_DOWN_ITEM); /* Go one step down in menu. */
do_redraw = 1;
break;
/* [snip] */
}
if (do_redraw)
{
item = current_item(menu);
active_node = item_userptr(item);
/* Call PrintHelp, which clears bottom_win, which takes up the
* bottom fifth of the screen. This function is included below
* for reference.
*/
PrintHelp(active_node, screen_info->bottom_win);
/* Call RedrawScreen, included below. */
RedrawScreen();
}
do_redraw = 0;
}
/* [snip] */
}
/* [snip] */
void PrintHelp(TreeNode *node, WINDOW *win)
{
MenuItemData *data;
int lines, cols;
assert(win != NULL);
if (node == NULL)
return;
data = node->data;
assert(data != NULL);
wclear(win); /* Clear the bottom fifth of the screen. This is the
* only part of the relevant code where any type of
* clear function is called.
*/
if (data->help)
{
getmaxyx(win, lines, cols); /* Get size of window */
WrapText(data->help, cols - 1);
wattron(win, HELP_ATTR);
waddstr(win, data->help);
}
}
/* [snip] */
void RedrawScreen()
{
update_panels();
doupdate(); /* Somewhere in this function, the screen is cleard. Why? */
}
/* [snip] */
Any help would be appreciated.
--
Christer Enfors
- Avoiding clearing the screen,
Christer Enfors <=