home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / edit / jade / src / x11_render.c < prev    next >
C/C++ Source or Header  |  1994-06-29  |  4KB  |  153 lines

  1. /* x11_render.c -- Rendering for X11
  2.    Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
  3.  
  4.    This file is part of Jade.
  5.  
  6.    Jade is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    Jade is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with Jade; see the file COPYING.  If not, write to
  18.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "jade.h"
  21. #include "jade_protos.h"
  22.  
  23. _PR void x11_handle_gexposures(VW *);
  24. _PR void x11_handle_expose(VW *, XExposeEvent *);
  25. _PR void sys_scroll_vw(VW *, long);
  26.  
  27. static Bool
  28. gex_pred(Display *dpy, XEvent *ev, XPointer arg)
  29. {
  30.     return((ev->type == NoExpose) || (ev->type == GraphicsExpose));
  31. }
  32. void
  33. x11_handle_gexposures(VW *vw)
  34. {
  35.     XEvent ev;
  36.     do {
  37.     POS start, end;
  38.     unsigned int x1, y1, x2, y2;
  39.     XIfEvent(x11_display, &ev, gex_pred, (XPointer)NULL);
  40.     if(ev.type == NoExpose)
  41.         return;
  42.     x1 = ev.xgraphicsexpose.x;
  43.     y1 = ev.xgraphicsexpose.y;
  44.     x2 = x1 + ev.xgraphicsexpose.width;
  45.     y2 = y1 + ev.xgraphicsexpose.height;
  46.     if(y2 >= vw->vw_MessageLineY)
  47.     {
  48.         y2 = vw->vw_MessageLineY - 1;
  49.         draw_message_line(vw);
  50.         if(vw->vw_Message)
  51.         redraw_message(vw, vw->vw_Message, strlen(vw->vw_Message));
  52.         else
  53.         redraw_message(vw, "", 0);
  54.         if(y1 >= vw->vw_MessageLineY)
  55.         continue;
  56.     }
  57.     start.pos_Col = ((x1 - vw->vw_XStartPix) / vw->vw_FontX)
  58.         + vw->vw_StartCol;
  59.     start.pos_Line = ((y1 - vw->vw_YStartPix) / vw->vw_FontY)
  60.         + vw->vw_StartLine;
  61.     end.pos_Col = (((x2 - 1)- vw->vw_XStartPix) / vw->vw_FontX)
  62.         + vw->vw_StartCol;
  63.     end.pos_Line = (((y2 - 1) - vw->vw_YStartPix) / vw->vw_FontY)
  64.         + vw->vw_StartLine;
  65.     redraw_rect(vw, &start, &end, FALSE);
  66.     } while(ev.xgraphicsexpose.count > 0);
  67. }
  68.  
  69. void
  70. x11_handle_expose(VW *vw, XExposeEvent *ev)
  71. {
  72.     POS start, end;
  73.     unsigned int x1, y1, x2, y2;
  74.     x1 = ev->x;
  75.     y1 = ev->y;
  76.     x2 = x1 + ev->width;
  77.     y2 = y1 + ev->height;
  78.     if(y2 >= vw->vw_MessageLineY)
  79.     {
  80.     y2 = vw->vw_MessageLineY - 1;
  81.     draw_message_line(vw);
  82.     if(vw->vw_Message)
  83.         redraw_message(vw, vw->vw_Message, strlen(vw->vw_Message));
  84.     else
  85.         redraw_message(vw, "", 0);
  86.     if(y1 >= vw->vw_MessageLineY)
  87.         return;
  88.     }
  89.     /*
  90.      * Special case of whole window being redrawn
  91.      */
  92.     if((x1 == 0) && (y1 == 0) && (x2 >= vw->vw_XEndPix)
  93.        && (y2 >= (vw->vw_MessageLineY - 1)))
  94.     redraw_all(vw);
  95.     else
  96.     {
  97.     start.pos_Col = ((x1 - vw->vw_XStartPix) / vw->vw_FontX)
  98.         + vw->vw_StartCol;
  99.     start.pos_Line = ((y1 - vw->vw_YStartPix) / vw->vw_FontY)
  100.         + vw->vw_StartLine;
  101.     end.pos_Col = (((x2 - 1)- vw->vw_XStartPix) / vw->vw_FontX)
  102.         + vw->vw_StartCol;
  103.     end.pos_Line = (((y2 - 1) - vw->vw_YStartPix) / vw->vw_FontY)
  104.         + vw->vw_StartLine;
  105.     redraw_rect(vw, &start, &end, TRUE);
  106.     }
  107. }
  108.  
  109. /*
  110.  * Scrolls the view `lines' towards line 0,
  111.  */
  112. void
  113. sys_scroll_vw(VW *vw, long lines)
  114. {
  115.     int xsrc, ysrc, xwth, yht, xdst, ydst;
  116.     xsrc = vw->vw_XStartPix;
  117.     xwth = vw->vw_XWidthPix;
  118.     xdst = vw->vw_XStartPix;
  119.     if(lines > 0)
  120.     {
  121.     ysrc = vw->vw_YStartPix + (lines * vw->vw_FontY);
  122.     yht  = vw->vw_YHeightPix - (lines * vw->vw_FontY);
  123.     ydst = vw->vw_YStartPix;
  124.     XCopyArea(x11_display, vw->vw_Window, vw->vw_Window,
  125.           vw->vw_WindowSys.ws_TextFontGC,
  126.           xsrc, ysrc,
  127.           xwth, yht,
  128.           xdst, ydst);
  129.     x11_handle_gexposures(vw);
  130.     XClearArea(x11_display, vw->vw_Window,
  131.            xsrc, vw->vw_YStartPix + yht,
  132.            xwth, ysrc - ydst,
  133.            False);
  134.     }
  135.     else if(lines < 0)
  136.     {
  137.     lines = 0 - lines;
  138.     ysrc = vw->vw_YStartPix;
  139.     yht  = vw->vw_YHeightPix - (lines * vw->vw_FontY);
  140.     ydst = vw->vw_YStartPix + (lines * vw->vw_FontY);
  141.     XCopyArea(x11_display, vw->vw_Window, vw->vw_Window,
  142.           vw->vw_WindowSys.ws_TextFontGC,
  143.           xsrc, ysrc,
  144.           xwth, yht,
  145.           xdst, ydst);
  146.     x11_handle_gexposures(vw);
  147.     XClearArea(x11_display, vw->vw_Window,
  148.            xsrc, ysrc,
  149.            xwth, ydst - ysrc,
  150.            False);
  151.     }
  152. }
  153.