From 042ab59b1f87a45c079b6df7ebeca379a83494df Mon Sep 17 00:00:00 2001 From: sasha Date: Wed, 15 Aug 2007 22:41:52 +0000 Subject: [PATCH] fixed segfault on resize by getting rid of touch() in apply(). rearranged redraw calls on configure notify to be sane --- src/command.C | 20 +++++++------------- src/main.C | 13 ++++++++----- src/screen.C | 2 +- src/xpm.C | 4 +++- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/command.C b/src/command.C index b06a27fc..70ac4e22 100644 --- a/src/command.C +++ b/src/command.C @@ -1485,22 +1485,16 @@ rxvt_term::x_cb (XEvent &ev) { seen_resize = 1; resize_all_windows (ev.xconfigure.width, ev.xconfigure.height, 1); -#ifdef XPM_BACKGROUND - /* TODO: replace with update_pixmap() that should unify transparency and bg image handling ! */ - if (!option (Opt_transparent) && bgPixmap.window_size_sensitive ()) - { - bgPixmap.render (); - scr_touch (true); - } -#endif } - - HOOK_INVOKE ((this, HOOK_CONFIGURE_NOTIFY, DT_XEVENT, &ev, DT_END)); - + else + { #ifdef ENABLE_TRANSPARENCY - if (option (Opt_transparent)) - bgPixmap.render (); + if (option (Opt_transparent)) + if (bgPixmap.render ()) + scr_touch (false); #endif + } + HOOK_INVOKE ((this, HOOK_CONFIGURE_NOTIFY, DT_XEVENT, &ev, DT_END)); } break; diff --git a/src/main.C b/src/main.C index c80c7ef3..5ff6f8b8 100644 --- a/src/main.C +++ b/src/main.C @@ -1151,11 +1151,13 @@ rxvt_term::resize_all_windows (unsigned int newwidth, unsigned int newheight, in window_vt_x, window_vt_y, width, height); - scr_clear (); #ifdef XPM_BACKGROUND - /* TODO: should that really be here ? */ - bgPixmap.render (); + /* TODO: replace with update_pixmap() that should unify transparency and bg image handling ! */ + if (bgPixmap.window_size_sensitive ()) + bgPixmap.render (); #endif + + scr_clear (); } if (fix_screen || old_height == 0) @@ -1165,8 +1167,9 @@ rxvt_term::resize_all_windows (unsigned int newwidth, unsigned int newheight, in //scr_touch (false); #ifdef HAVE_BG_PIXMAP - if (bgPixmap.pixmap) - scr_touch (false); +// TODO: this don't seem to have any effect - do we still need it ? If so - in which case exactly ? +// if (bgPixmap.pixmap) +// scr_touch (false); #endif #ifdef USE_XIM diff --git a/src/screen.C b/src/screen.C index e52b8d16..c30d7499 100644 --- a/src/screen.C +++ b/src/screen.C @@ -1803,7 +1803,7 @@ rxvt_term::scr_expose (int x, int y, int ewidth, int eheight, bool refresh) NOTH min_it (rc[i].col, ncol - 1); min_it (rc[i].row, nrow - 1); } - +// TODO: this line somehow causes segfault if scr_expose() is called just after resize for (i = rc[PART_BEG].row; i <= rc[PART_END].row; i++) fill_text (&drawn_buf[i].t[rc[PART_BEG].col], 0, rc[PART_END].col - rc[PART_BEG].col + 1); diff --git a/src/xpm.C b/src/xpm.C index 2d4bdee7..6e58ec96 100644 --- a/src/xpm.C +++ b/src/xpm.C @@ -1031,8 +1031,10 @@ bgPixmap_t::apply() target->scrollbar_show (0); } #endif + /* Is that really neccessary? we did a XClearArea to generate Expose events alreday ! */ target->want_refresh = target->want_full_refresh = 1; - target->flush (); + /* TODO: why do we need a flush here ??? It causes segfault on resize ! */ +// target->flush (); } } #endif /* HAVE_BG_PIXMAP */ -- 2.34.1