Angus Leeming wrote:
>>> Hi, Alfredo. This is very peculiar. I too see the behaviour you
>>> describe with the HEAD version of xforms-lyx. However, the 1.3.x
>>> version behaves perfectly. I'd guess that the "'intelligent'
>>> painting
>> 
>> Exactly, this is very strange. I've had a fast look at recent
>> changes in XWorkArea but didn't find anything suspect ;-)
>>
>>> of the pixmap" patch that I committed six months ago is at fault.
>>> However, that is just a guess.
>>> I'll make some time to dig further.
>>> 
>>> See Revision 1.46 of XWorkArea.C
> 
> I'm not promising anything. But I will revert the change here and
> see if that makes a difference. Once LyX has finished compiling
> after Jean-Marc's regeneration of config.h that is.

The attached patch cures the problem for me. Maybe you could confirm 
that it works for you too?

-- 
Angus
Index: src/frontends/xforms/XWorkArea.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/XWorkArea.C,v
retrieving revision 1.50
diff -u -p -r1.50 XWorkArea.C
--- src/frontends/xforms/XWorkArea.C	16 Nov 2004 20:41:37 -0000	1.50
+++ src/frontends/xforms/XWorkArea.C	30 Nov 2004 14:46:16 -0000
@@ -175,9 +175,8 @@ XWorkArea::XWorkArea(LyXView & owner, in
 	XGCValues val;
 
 	val.function = GXcopy;
-	val.graphics_exposures = false;
 	copy_gc = XCreateGC(fl_get_display(), RootWindow(fl_get_display(), 0),
-			    GCFunction | GCGraphicsExposures, &val);
+			    GCFunction, &val);
 }
 
 
@@ -189,13 +188,17 @@ XWorkArea::~XWorkArea()
 }
 
 
-void XWorkArea::updateGeometry(int width, int height)
+void XWorkArea::redraw(int width, int height)
 {
 	static int cur_width = -1;
 	static int cur_height = -1;
 
-	if (cur_width == width && cur_height == height && workareapixmap)
+	if (cur_width == width && cur_height == height && workareapixmap) {
+		XCopyArea(fl_get_display(),
+			  getPixmap(), getWin(), copy_gc,
+			  0, 0, width, height, xpos(), ypos());
 		return;
+	}
 
 	cur_width = width;
 	cur_height = height;
@@ -219,20 +222,6 @@ void XWorkArea::updateGeometry(int width
 }
 
 
-void XWorkArea::paint(int x, int y, int w, int h)
-{
-	lyxerr[Debug::WORKAREA]
-		<< "XWorkarea::paint " << w << 'x' << h
-		<< '+' << x << '+' << y << endl;
-
-	updateGeometry(workWidth(), workHeight());
-	XCopyArea(fl_get_display(),
-		  getPixmap(), getWin(),
-		  copy_gc, x, y, w, h,
-		  work_area->x + x, work_area->y + y);
-}
-
-
 void XWorkArea::setScrollbarParams(int height, int pos, int line_height)
 {
 	// we need to cache this for scroll_cb
@@ -295,7 +284,7 @@ int XWorkArea::work_area_handler(FL_OBJE
 				 FL_Coord, FL_Coord,
 				 int key, void * xev)
 {
-	if (event != 11)
+	if (event != 10 && event != 11)
 		lyxerr[Debug::WORKAREA] << "Workarea event: EVENT: " << event << endl;
 
 	XEvent * ev = static_cast<XEvent*>(xev);
@@ -306,35 +295,12 @@ int XWorkArea::work_area_handler(FL_OBJE
 
 	switch (event) {
 
-	case FL_DRAW: {
+	case FL_DRAW:
 		if (!area->work_area || !area->work_area->form->visible)
 			return 1;
-
-		if (ev) {
-			lyxerr[Debug::WORKAREA]
-				<< "work_area_handler, handling X11 "
-				"expose event "
-				<< ev->xexpose.width << 'x'
-				<< ev->xexpose.height << '+'
-				<< ev->xexpose.x << '+'
-				<< ev->xexpose.y << endl;
-
-			// X11 generates XEvents with x, y relative to the
-			// top left corner of the window.
-			// XScreen::expose emulates this behaviour.
-			// We therefore need to remove this offset before
-			// generating the pixmap.
-			 int const x = ev->xexpose.x - ob->x;
-			 int const y = ev->xexpose.y - ob->y;
-
-			area->paint(x, y,
-				    ev->xexpose.width, ev->xexpose.height);
-		} else
-			area->paint(0, 0,
-				    area->workWidth(), area->workHeight());
-
+		lyxerr[Debug::WORKAREA] << "Workarea event: DRAW" << endl;
+		area->redraw(area->workWidth(), area->workHeight());
 		break;
-	}
 
 	case FL_PUSH:
 		if (!ev || ev->xbutton.button == 0) break;
Index: src/frontends/xforms/XWorkArea.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/XWorkArea.h,v
retrieving revision 1.28
diff -u -p -r1.28 XWorkArea.h
--- src/frontends/xforms/XWorkArea.h	16 Nov 2004 20:41:37 -0000	1.28
+++ src/frontends/xforms/XWorkArea.h	30 Nov 2004 14:46:16 -0000
@@ -67,10 +67,7 @@ public:
 private:
 	/// generate the pixmap, and copy backing pixmap to it,
 	/// and send resize event if needed
-	void updateGeometry(int, int);
-
-	///
-	void paint(int x, int y, int w, int h);
+	void redraw(int, int);
 
 	/// GC used for copying to the screen
 	GC copy_gc;
Index: src/frontends/xforms/xscreen.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/xscreen.C,v
retrieving revision 1.26
diff -u -p -r1.26 xscreen.C
--- src/frontends/xforms/xscreen.C	19 May 2004 15:11:37 -0000	1.26
+++ src/frontends/xforms/xscreen.C	30 Nov 2004 14:46:16 -0000
@@ -158,20 +158,13 @@ void XScreen::expose(int x, int y, int w
 	lyxerr[Debug::GUI] << "XScreen::expose " << w << 'x' << h
 		<< '+' << x << '+' << y << endl;
 
-	XEvent ev;
-
-	ev.type = Expose;
-	ev.xexpose.window = owner_.getWin();
-	// Adjust the x,y data so that XWorkArea can handle XEvents
-	// received from here in identical fashion to those it receives
-	// direct from X11.
-	ev.xexpose.x = owner_.xpos() + x;
-	ev.xexpose.y = owner_.ypos() + y;
-	ev.xexpose.width = w;
-	ev.xexpose.height = h;
-	ev.xexpose.count = 0;
-
-	XSendEvent(fl_get_display(), owner_.getWin(), False, 0, &ev);
+	XCopyArea(fl_get_display(),
+		  owner_.getPixmap(),
+		  owner_.getWin(),
+		  gc_copy,
+		  x, y, w, h,
+		  x + owner_.xpos(),
+		  y + owner_.ypos());
 }
 
 } // namespace frontend

Reply via email to