home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / x11 / lib / scroll.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-18  |  4.8 KB  |  215 lines

  1. /*    SCROLL . C
  2. #
  3. %    Copyright (c)    1992    Jin Guojun
  4. %
  5. % AUTHOR:    Jin Guojun - LBL    4/1/92
  6. */
  7.  
  8. #include "panel.h"
  9.  
  10. #ifdef    SCROLLBAR_on_CANVAS
  11. #define    SonC
  12. #endif    /* short name    */
  13.  
  14. ScrollBar*
  15. CreateScrollBar(aw, x, y, xv, yv, sbw, sblh, sblv, type, name, bc, rc)
  16. AnyWindow*    aw;
  17. char*    name;
  18. {
  19. register int    i=2;
  20. register ScrollBar*    sb = ZALLOC(sizeof(*sb) + 12 * sizeof(i), 1, name);
  21. sb->hvalid = !((sb->vvalid = sb->type = type) & 1);
  22. sb->awin = aw;    sb->name = name;
  23. sb->rx = (int*)((char*)sb + sizeof(*sb));
  24. sb->ry = sb->rx + i;
  25. sb->rw = sb->ry + i;
  26. sb->rl = sb->rw + i;
  27. sb->bx = sb->rl + i;
  28. sb->by = sb->bx + i;
  29. i--;
  30. sb->rx[i] = sb->bx[i] = xv;
  31. sb->ry[i] = sb->by[i] = yv;
  32. sb->rl[i] = sblv;
  33. *sb->rw = sb->rw[i] = sbw ? sbw : HandleWidth;
  34. i--;
  35. sb->rx[i] = sb->bx[i] = x;
  36. sb->ry[i] = sb->by[i] = y;
  37. sb->rl[i] = sblh;
  38. sb->rcolor = sb->vcolor = rc;
  39. sb->bcolor = bc;
  40. #ifdef    SonC
  41. #define    GetSW(aw,x,y,w,h)    \
  42.     XCreateSimpleWindow(aw->dpy, aw->win, x,y,w,h, 0, None, Black);
  43. sb->h_swin = GetSW(aw, 0 ,sblv, sblh, sb->rw[0]);
  44. sb->v_swin = GetSW(aw, sblh, 0, sb->rw[1], sblv);
  45. #endif
  46. return    sb;
  47. }
  48.  
  49.  
  50. static    void
  51. DrawScrollBar(sb, w, l, vert)
  52. register ScrollBar*    sb;
  53. {
  54. register AnyWindow*    awin=sb->awin;
  55. register int    x=sb->rx[vert],    y=sb->ry[vert];
  56. XGCValues    values;
  57. Window    dw = awin->win;
  58. Display    *dpy = awin->dpy;
  59. #define    SetGC(v)    XSetForeground(dpy, awin->gc, v)
  60. XGetGCValues(dpy, awin->gc, GCForeground, &values);
  61.  
  62. #ifdef    SonC
  63. dw = vert ? sb->v_swin : sb->h_swin;
  64. XMoveResizeWindow(dpy, dw, x+awin->x0, y+awin->y0, w, l);
  65. XMapWindow(dpy, dw);
  66. x = y = 0;
  67. #endif
  68. XClearArea(dpy, dw, x, y, w, l, 0);
  69. SetGC(sb->rcolor);
  70. XFillRectangle(dpy, dw, awin->gc, x, y, w, l);
  71. if (!vert)    w = l;
  72. SetGC(sb->bcolor);
  73. x = sb->bx[vert] - !vert;    y = sb->by[vert] - vert;
  74. #ifdef    SonC
  75. if (vert)    x=0;
  76. else    y=0;
  77. #endif
  78. XFillRectangle(dpy, dw, awin->gc, x, y, w + (1<<!vert), w + (vert<<1));
  79. SetGC(values.foreground);
  80. XFlush(dpy);
  81. }
  82.  
  83. void
  84. DrawScrollBars(sb, type)
  85. register ScrollBar*    sb;
  86. {
  87. register int    w, l;
  88.  
  89. if (type && sb->vvalid)    {
  90.     w = sb->rw[1];    l = sb->rl[1] + sb->hvalid * w;
  91.     DrawScrollBar(sb, w, l, 1 /* vertical */);
  92. }
  93. if (!(type & 1) && sb->hvalid)    {
  94.     w = *sb->rw;    l = *sb->rl;
  95.     DrawScrollBar(sb, l, w, 0);
  96. }
  97. }
  98.  
  99.  
  100. OnScrollBar(sb, xbutton)
  101. register ScrollBar*    sb;
  102. XButtonEvent    *xbutton;
  103. {
  104. register int    x=xbutton->x, y=xbutton->y, i=1;
  105. #ifdef SonC
  106. x -= sb->awin->x0;    y -= sb->awin->y0;
  107. #endif
  108. if (xbutton->window != sb->awin->win)    return    False;
  109. if (x < sb->bx[i] || x > sb->bx[i] + sb->rw[i] ||
  110.     y < 0 || y > sb->by[i] + sb->rl[i]) {
  111.     i--;
  112.     if (x < 0 || x > sb->bx[i] + sb->rl[i] ||
  113.         y < sb->by[i] || y > sb->by[i] + sb->rw[i])
  114.     i--;
  115. }
  116. return    ++i;
  117. }
  118.  
  119.  
  120. void
  121. SetScrollBar(sb, x, y, type)
  122. register ScrollBar*    sb;
  123. {
  124. register Image*    I = (Image*)sb->awin;
  125. register int    w = -sb->rw[0], resize = sb->rl[1] + w, m=x;
  126. #ifdef    SonC
  127. static    int    lx, ly;
  128. x -= I->x0;
  129. if (!(type&1))
  130.     if (Sign(m-lx) != Sign(x-*sb->bx))    return;
  131.     else    lx = m;
  132. m = y;
  133. y -= I->y0;
  134. if (type)
  135.     if (Sign(m-ly) != Sign(y-sb->by[1]))    return;
  136. else    ly = m;
  137. #endif
  138.  
  139. if (type && y > w && y < resize)
  140.     I->y0 = (I->height - resize) * (sb->by[1] = y) / I->resize_h;
  141. resize = *sb->rl;
  142. if (!(type & 1) && x > w && x < resize)
  143.     I->x0 = (I->width - resize) * (*sb->bx = x) / I->resize_w;
  144.  
  145. #ifdef    SonC
  146. if (I->frame != I->win)
  147.     XMoveWindow(I->dpy, I->win, -I->x0, -I->y0),    XFlush(I->dpy);
  148. #endif
  149.  
  150. DrawScrollBars(sb, type);
  151. }
  152.  
  153. void
  154. SetScrollBarLength(sb, vert, len)
  155. register ScrollBar *sb;
  156. register int    vert, len;
  157. {
  158. register bool    vv=sb->vvalid, hv=sb->hvalid;
  159. register Image    *i=(Image*)sb->awin;
  160.  
  161.     sb->rl[vert] = len + (vert & hv) * *sb->rw;
  162.     if (vert = !vert) {    /* if horizotal, set vertical rail pos */
  163.         sb->rx[vert] = sb->bx[vert] = len;
  164.         len = i->width - len;
  165.         if (!hv)    /* if horizon is not valid, reset x0    */
  166.             i->x0 = 0;
  167.         else if (i->x0 > len)    i->x0 = len;
  168.     } else    {
  169.         sb->ry[vert] = sb->by[vert] = len;
  170.         len = i->height - len;
  171.         if (!vv)    i->y0 = 0;
  172.         else if (i->y0 > len)    i->y0 = len;
  173.     }
  174. }
  175.  
  176.  
  177. void
  178. Draw_ImageScrollBars(img)
  179. Image    *img;
  180. {
  181. register int    A = img->resize_h < img->height,
  182.         B = img->resize_w < img->width;
  183.     if (img->parts && (A | B))
  184.         DrawScrollBars(img->parts, (A&B) + A);
  185. }
  186.  
  187. ResizeWindow(img, cevent)
  188. register Image    *img;
  189. register XConfigureEvent*    cevent;
  190. {
  191.     if (cevent->window == img->frame)    {
  192.     register int    offset=0, offsetx=
  193.             img->parts ? *img->parts->scrollbar.rw : offset;
  194.     if (offsetx)    {
  195.         if (img->parts->scrollbar.hvalid = img->width > cevent->width)
  196.             offset = offsetx;
  197.         if (!(img->parts->scrollbar.vvalid=img->height>cevent->height))
  198.             offsetx = 0;
  199.     }
  200.     img->resize_w = cevent->width - offsetx;
  201.     img->resize_h = cevent->height - offset;
  202.     if (img->parts)    {
  203.         SetScrollBarLength(img->parts, 0, img->resize_w);
  204.         SetScrollBarLength(img->parts, 1, img->resize_h);
  205.     }
  206. #ifdef    SonC
  207.     if (img->frame != img->win)
  208.         XMoveWindow(img->dpy, img->win, -img->x0, -img->y0),
  209.         Draw_ImageScrollBars(img);
  210. #endif
  211.     return    1;
  212.     }
  213. return    0;
  214. }
  215.