+2004-05-04 Angus Leeming <leeming@lyx.org>
+
+ This is a resurrection of John Levon's June 2002 code.
+
+ * xscreen.C (expose): do the 'right thing' and ouput an XEvent
+ request to expose the work area.
+
+ * XWorkArea.C (updateGeometry, paint): split the old redraw function
+ into two. Use the x, y data.
+ (work_area_handler): if an XEvent * is passed on FL_DRAW, then use it.
+
2004-05-04 Angus Leeming <leeming@lyx.org>
* XWorkArea.C (XWorkArea): revert the red color of the frame widget.
XGCValues val;
val.function = GXcopy;
+ val.graphics_exposures = false;
copy_gc = XCreateGC(fl_get_display(), RootWindow(fl_get_display(), 0),
- GCFunction, &val);
+ GCFunction | GCGraphicsExposures, &val);
}
}
-void XWorkArea::redraw(int width, int height)
+void XWorkArea::updateGeometry(int width, int height)
{
static int cur_width = -1;
static int cur_height = -1;
- if (cur_width == width && cur_height == height && workareapixmap) {
- XCopyArea(fl_get_display(),
- getPixmap(), getWin(), copy_gc,
- 0, 0, width, height, xpos(), ypos());
+ if (cur_width == width && cur_height == height && workareapixmap)
return;
- }
cur_width = width;
cur_height = height;
}
+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
switch (event) {
- case FL_DRAW:
+ case FL_DRAW: {
if (!area->work_area || !area->work_area->form->visible)
return 1;
- lyxerr[Debug::WORKAREA] << "Workarea event: DRAW" << endl;
- area->redraw(area->workWidth(), area->workHeight());
+
+ 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());
+
break;
+ }
case FL_PUSH:
if (!ev || ev->xbutton.button == 0) break;
void XScreen::showCursor(int x, int y, int h, Cursor_Shape shape)
{
- // Update the cursor color. (a little slow dooing it like this ??)
+ // Update the cursor color. (a little slow doing it like this ??)
setCursorColor();
cursor_x_ = x;
void XScreen::expose(int x, int y, int w, int h)
{
- lyxerr[Debug::GUI] << "expose " << w << 'x' << h
+ lyxerr[Debug::GUI] << "XScreen::expose " << w << 'x' << h
<< '+' << x << '+' << y << endl;
- XCopyArea(fl_get_display(),
- owner_.getPixmap(),
- owner_.getWin(),
- gc_copy,
- x, y, w, h,
- x + owner_.xpos(),
- y + owner_.ypos());
+
+ 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);
}