--- rxvt-unicode/src/screen.C 2012/05/28 21:13:36 1.418 +++ rxvt-unicode/src/screen.C 2013/01/13 20:16:40 1.430 @@ -171,7 +171,7 @@ int all_rows = total_rows + nrow + nrow; chunk_size = (sizeof (line_t) + rsize + tsize) * all_rows; - chunk = rxvt_malloc (chunk_size); + chunk = chunk_alloc (chunk_size, 0); char *base = (char *)chunk + sizeof (line_t) * all_rows; @@ -227,6 +227,7 @@ screen.bscroll = nrow - 1; void *prev_chunk = chunk; + size_t prev_chunk_size = chunk_size; line_t *prev_drawn_buf = drawn_buf; line_t *prev_swap_buf = swap_buf; line_t *prev_row_buf = row_buf; @@ -238,7 +239,7 @@ if (!prev_row_buf) { /* - * first time called so just malloc everything: don't rely on realloc + * first time called (or after scr_release) so just malloc everything: don't rely on realloc */ top_row = 0; term_start = 0; @@ -281,8 +282,11 @@ memcpy (drawn_buf [row].t, prev_drawn_buf [row].t, sizeof (text_t) * common_col); memcpy (drawn_buf [row].r, prev_drawn_buf [row].r, sizeof (rend_t) * common_col); + memcpy (swap_buf [row].t, prev_swap_buf [row].t, sizeof (text_t) * common_col); memcpy (swap_buf [row].r, prev_swap_buf [row].r, sizeof (rend_t) * common_col); + swap_buf [row].l = min (prev_swap_buf [row].l, ncol); + swap_buf [row].f = prev_swap_buf [row].f; } int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row @@ -391,6 +395,7 @@ memcpy (dst.t, src.t, sizeof (text_t) * common_col); memcpy (dst.r, src.r, sizeof (rend_t) * common_col); + dst.l = common_col; } for (int row = prev_nrow; row < nrow; row++) @@ -410,7 +415,7 @@ if (!drawn_buf [row].valid ()) scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); } - free (prev_chunk); + chunk_free (prev_chunk, prev_chunk_size); free (tabs); tabs = (char *)rxvt_malloc (ncol); @@ -428,15 +433,15 @@ HOOK_INVOKE ((this, HOOK_RESET, DT_END)); } -/* ------------------------------------------------------------------------- */ -/* - * Free everything. That way malloc debugging can find leakage. - */ void ecb_cold rxvt_term::scr_release () NOTHROW { - free (chunk); + chunk_free (chunk, chunk_size); + chunk = 0; + row_buf = 0; + free (tabs); + tabs = 0; } /* ------------------------------------------------------------------------- */ @@ -448,8 +453,6 @@ { scr_release (); - row_buf = 0; - tabs = 0; prev_nrow = prev_ncol = 0; rvideo_mode = false; scr_soft_reset (); @@ -1709,8 +1712,8 @@ rvideo_state = on; ::swap (pix_colors[Color_fg], pix_colors[Color_bg]); -#ifdef HAVE_BG_PIXMAP - if (bg_pixmap == None) +#ifdef HAVE_IMG + if (bg_img == 0) #endif XSetWindowBackground (dpy, vt, pix_colors[Color_bg]); @@ -2054,8 +2057,8 @@ unsigned int old_screen_flags = screen.flags; bool have_bg = 0; -#ifdef HAVE_BG_PIXMAP - have_bg = bg_pixmap != None; +#ifdef HAVE_IMG + have_bg = bg_img != 0; #endif ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ @@ -2535,13 +2538,13 @@ { bool transparent = false; -#ifdef HAVE_BG_PIXMAP - if (bg_pixmap != None) +#ifdef HAVE_IMG + if (bg_img != 0) { -# ifdef ENABLE_TRANSPARENCY +# if ENABLE_TRANSPARENCY if (bg_flags & BG_IS_TRANSPARENT) { - XSetWindowBackgroundPixmap (dpy, parent, bg_pixmap); + XSetWindowBackgroundPixmap (dpy, parent, bg_img->pm); XSetWindowBackgroundPixmap (dpy, vt, ParentRelative); transparent = true; @@ -2550,7 +2553,7 @@ # endif { XSetWindowBackground (dpy, parent, pix_colors[Color_border]); - XSetWindowBackgroundPixmap (dpy, vt, bg_pixmap); + XSetWindowBackgroundPixmap (dpy, vt, bg_img->pm); } } else @@ -2567,7 +2570,7 @@ if (transparent) XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative); else - XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]); + XSetWindowBackground (dpy, scrollBar.win, pix_colors[scrollBar.color ()]); scrollBar.state = SB_STATE_IDLE; scrollBar.show (0); } @@ -3534,7 +3537,7 @@ } /* ------------------------------------------------------------------------- */ -#ifdef USE_XIM +#if USE_XIM void ecb_cold rxvt_term::im_set_position (XPoint &pos) NOTHROW {