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