Changeset 22662d7


Ignore:
Timestamp:
Feb 4, 2011, 5:33:22 PM (13 years ago)
Author:
David Benjamin <davidben@mit.edu>
Branches:
release-1.7
Children:
27705b65
Parents:
b1ed3e2
git-author:
David Benjamin <davidben@mit.edu> (01/25/11 17:27:10)
git-committer:
David Benjamin <davidben@mit.edu> (02/04/11 17:33:22)
Message:
Don't reset colorpairs in the middle of drawing

Resetting colorpairs while drawing the mainwin causes the existing
contents in a popwin to refer to invalid color pairs. We used to draw
the mainwin first and redraw the contents of each window from scratch.
Moving to libpanel in 1.6 changed this, so background colors
occasionally bled into your popwin.

This changes the colorpair logic to only trigger when we need to, and to
forcibly dirty every window if needed. NOTE: if we don't have enough
color-pairs to draw the current screen, this will draw everything twice.
But it will probably almost never happen.

Reported-by: Alex Dehnert <adehnert@mit.edu>
Reviewed-by: Alejandro R. Sedeño <asedeno@mit.edu>
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • fmtext.c

    rb1ed3e2 r22662d7  
    925925  short i, j;
    926926
     927  cpmgr->overflow = false;
    927928  cpmgr->next = 8;
    928     /* The test is <= because we allocated COLORS+1 entries. */
     929  /* The test is <= because we allocated COLORS+1 entries. */
    929930  for(i = 0; i <= COLORS; i++) {
    930931    for(j = 0; j <= COLORS; j++) {
     
    974975      /* We still don't have a pair, drop the background color. Too bad. */
    975976      owl_function_debugmsg("colorpairs: color shortage - dropping background color.");
     977      cpmgr->overflow = true;
    976978      pair = owl_fmtext_get_colorpair(fg, OWL_COLOR_DEFAULT);
    977979    }
     
    979981      /* We still don't have a pair, defaults all around. */
    980982      owl_function_debugmsg("colorpairs: color shortage - dropping foreground and background color.");
     983      cpmgr->overflow = true;
    981984      pair = 0;
    982985    }
  • mainwin.c

    rb1ed3e2 r22662d7  
    5353  markedmsgid = owl_global_get_markedmsgid(&g);
    5454  v = owl_global_get_current_view(&g);
    55   owl_fmtext_reset_colorpairs(owl_global_get_colorpair_mgr(&g));
    5655
    5756  if (v==NULL) {
  • owl.c

    r337383e r22662d7  
    444444static int owl_refresh_pre_select_action(owl_ps_action *a, void *data)
    445445{
     446  owl_colorpair_mgr *cpmgr;
     447
    446448  /* if a resize has been scheduled, deal with it */
    447449  owl_global_check_resize(&g);
    448450  /* update the terminal if we need to */
    449451  owl_window_redraw_scheduled();
     452  /* On colorpair shortage, reset and redraw /everything/. NOTE: if
     453   * the current screen uses too many colorpairs, this draws
     454   * everything twice. But this is unlikely; COLOR_PAIRS is 64 with
     455   * 8+1 colors, and 256^2 with 256+1 colors. (+1 for default.) */
     456  cpmgr = owl_global_get_colorpair_mgr(&g);
     457  if (cpmgr->overflow) {
     458    owl_function_debugmsg("colorpairs: color shortage; reset pairs and redraw. COLOR_PAIRS = %d", COLOR_PAIRS);
     459    owl_fmtext_reset_colorpairs(cpmgr);
     460    owl_function_full_redisplay();
     461    owl_window_redraw_scheduled();
     462  }
    450463  return 0;
    451464}
  • owl.h

    r337383e r22662d7  
    549549  int next;
    550550  short **pairs;
     551  bool overflow;
    551552} owl_colorpair_mgr;
    552553
Note: See TracChangeset for help on using the changeset viewer.