karenb@westford.ccur.com (Karen Bircsak) (04/12/90)
X Window System Bug Report
xbugs@expo.lcs.mit.edu
VERSION:
R4 (Patchlevel 9, not using SHAPE extension)
CLIENT MACHINE and OPERATING SYSTEM:
Concurrent 5400 (68020-based) running RTU (real-time unix)
DISPLAY TYPE:
Concurrent 12-plane GA1000
WINDOW MANAGER:
uwm (R3)
(I'm still trying to port the server to R4 & haven't started porting the
clients yet!:-)
AREA:
server
SYNOPSIS:
Window border portions are not being repainted when the window is resized.
DESCRIPTION:
If the window is changing size, SlideAndSizeWindow()
{mit/server/dix/window.c} saves the currently-visible border region in
the window's valdata.before.borderVisible structure. However, in certain
cases (as when the window is being resized) some portions of the existing
border may be overdrawn in the ddx CopyWindow routine, but are not removed
from borderVisible. miComputeClips() {mit/server/ddx/mi/mivaltree.c} uses
the borderVisible region to decide which portions of the border to repaint
in HandleExposures() {mit/server/dix/window.c}. The portions that were
overdrawn are not repainted because it is assumed they are still visible.
REPEAT BY:
I started up an xclock (with -bw 4 to make it easier to see.) Then I
resized the window using uwm. (I know it's unsupported but it doesn't slap
on its own borders like mwm. This problem doesn't show up with mwm.)
SAMPLE FIX:
This is a first cut and may not be the most efficient solution. It seems
to work OK for the few cases I tested. File is mit/server/dix/window.c.
***************
*** 2188,2193
SetWinSize (pWin);
SetBorderSize (pWin);
dw = (int)w - (int)width;
dh = (int)h - (int)height;
ResizeChildrenWinSize(pWin, x - oldx, y - oldy, dw, dh);
--- 2188,2209 -----
SetWinSize (pWin);
SetBorderSize (pWin);
+ /*
+ ** We need to redraw portions of the border that will be overwritten
+ ** when the window is moved to the new position. So remove them
+ ** from borderVisible.
+ */
+ if (borderVisible && (shrunk || newx != oldx || newy != oldy))
+ {
+ RegionRec overlap;
+
+ (*pScreen->RegionInit) (&overlap, NullBox, 0);
+ (*pScreen->Intersect) (&overlap, borderVisible,
+ &pWin->borderSize);
+ (*pScreen->Subtract) (borderVisible, borderVisible, &overlap);
+ (*pScreen->RegionUninit) (&overlap);
+ }
+
dw = (int)w - (int)width;
dh = (int)h - (int)height;
ResizeChildrenWinSize(pWin, x - oldx, y - oldy, dw, dh);
--------------------------------------------------------------------------------
...!{decvax,uunet}!masscomp!karenb
karenb@westford.ccur.com
--------------------------------------------------------------------------------