/* $Header: /home/yav/xpx/RCS/scrl.c,v 1.11 1995/11/23 16:28:39 yav Exp $ * xpx scroll * written by yav (UHD98984@pcvan.or.jp) */ #include #include #include "headers.h" #include "xpx.h" #include "work.h" #include "scrldef.h" #include "icondef.h" #define PUBLIC_SCRL_C #include "extern.h" char rcsid_scrl[] = "$Id: scrl.c,v 1.11 1995/11/23 16:28:39 yav Exp $"; int create_slider_window(); #define IMASK (ExposureMask|EnterWindowMask|LeaveWindowMask|\ ButtonPressMask|ButtonReleaseMask) int scrlev(); MENU scrlbar[] = { { SCRLBAR_TOP, MenuModeMaskBorder, 0, 0, 0, 0, 0, IMASK, 0, scrlev, NULL, 0, 0, NULL}, { SCRLBAR_BOTTOM, MenuModeMaskBorder, 0, 0, 0, 0, 0, IMASK, 0, scrlev, NULL, 0, 0, NULL}, { SCRLBAR_LEFT, MenuModeMaskBorder, 0, 0, 0, 0, 0, IMASK, 0, scrlev, NULL, 0, 0, NULL}, { SCRLBAR_RIGHT, MenuModeMaskBorder, 0, 0, 0, 0, 0, IMASK, 0, scrlev, NULL, 0, 0, NULL}, { -1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, NULL}}; void calc_resize_scrl(x0, y0, w0, h0) int x0; int y0; int w0; int h0; { scrlbar[SCRLBAR_TOP].y = y0-IMGSCRLW-1; scrlbar[SCRLBAR_BOTTOM].y = y0+h0+1; scrlbar[SCRLBAR_TOP].x = scrlbar[SCRLBAR_BOTTOM].x = x0; scrlbar[SCRLBAR_TOP].w = scrlbar[SCRLBAR_BOTTOM].w = w0; scrlbar[SCRLBAR_TOP].h = scrlbar[SCRLBAR_BOTTOM].h = IMGSCRLW; scrlbar[SCRLBAR_LEFT].x = x0-IMGSCRLW-1; scrlbar[SCRLBAR_RIGHT].x = x0+w0+1; scrlbar[SCRLBAR_LEFT].y = scrlbar[SCRLBAR_RIGHT].y = y0; scrlbar[SCRLBAR_LEFT].w = scrlbar[SCRLBAR_RIGHT].w = IMGSCRLW; scrlbar[SCRLBAR_LEFT].h = scrlbar[SCRLBAR_RIGHT].h = h0; } void resize_scrl_sub(n) int n; { MENU *p; p = scrlbar+n; XMoveResizeWindow(dsp, p->win, p->x, p->y, p->w, p->h); if (scrollbarmode & 1) XMapWindow(dsp, p->win); } void resize_scrl() { calc_resize_scrl(imgwx, imgwy, imgwinwidth, imgwinheight); resize_scrl_sub(SCRLBAR_TOP); resize_scrl_sub(SCRLBAR_BOTTOM); resize_scrl_sub(SCRLBAR_LEFT); resize_scrl_sub(SCRLBAR_RIGHT); } void create_scrlbar_window() { MENU *p; XSetWindowAttributes attr; calc_resize_scrl(imgwx, imgwy, imgwinwidth, imgwinheight); menuwin_create2(scrlbar, win, 0, 0, scrollbarmode & 1 ? 1 : 0); for (p = scrlbar; p->n >= 0; p++) { attr.win_gravity = UnmapGravity; XChangeWindowAttributes(dsp, p->win, CWWinGravity, &attr); } create_slider_window(); } int scrlev(p, ev) MENU *p; XEvent *ev; { int r; switch(ev->type) { case Expose: if (ev->xexpose.count) break; switch(p->n) { case SCRLBAR_TOP: r = ICON_up; break; case SCRLBAR_BOTTOM: r = ICON_down; break; case SCRLBAR_LEFT: r = ICON_left; break; case SCRLBAR_RIGHT: r = ICON_right; break; } menu_icon_center(p, r); return 1; case ButtonRelease: scroll_dx = scroll_dy = 0; break; } return 0; } /* * slider bar */ #define HSLIDER_X 0 #define HSLIDER_Y (BDW*2+1) #define VSLIDER_X (BDW*2+1) #define VSLIDER_Y 0 #define SLIDER_MIN IMGSCRLW Window hsliderbase; Window vsliderbase; int hslide_range; int vslide_range; int hslidev(p, ev) MENU *p; XEvent *ev; { int r; switch(ev->type) { case Expose: if (ev->xexpose.count) break; switch(p->n) { case HSLIDER_LEFT: r = ICON_left; break; case HSLIDER_RIGHT: r = ICON_right; break; } menu_icon_center(p, r); return 1; case ButtonRelease: scroll_dx = scroll_dy = 0; break; } return 0; } int vslidev(p, ev) MENU *p; XEvent *ev; { int r; switch(ev->type) { case Expose: if (ev->xexpose.count) break; switch(p->n) { case VSLIDER_UP: r = ICON_up; break; case VSLIDER_DOWN: r = ICON_down; break; } menu_icon_center(p, r); return 1; case ButtonRelease: scroll_dx = scroll_dy = 0; break; } return 0; } int hslidev2(p, ev) MENU *p; XEvent *ev; { int i; static int ox; switch(ev->type) { case ButtonPress: ox = p->x - (BDW+SLIDER_MIN+BDW) - ev->xbutton.x_root; return 1; case ButtonRelease: i = ev->xbutton.x_root; break; case MotionNotify: i = ev->xmotion.x_root; break; default: return 0; } i += ox; i *= imgfilew*zoomfactor - imgwinwidth; i = hslide_range ? i / hslide_range : 0; img_scroll(i-imgofsx, 0); return 1; } int vslidev2(p, ev) MENU *p; XEvent *ev; { int i; static int oy; switch(ev->type) { case ButtonPress: oy = p->y - (BDW+SLIDER_MIN+BDW) - ev->xbutton.y_root; return 1; case ButtonRelease: i = ev->xbutton.y_root; break; case MotionNotify: i = ev->xmotion.y_root; break; default: return 0; } i += oy; i *= imgfileh*zoomfactor - imgwinheight; i = vslide_range ? i / vslide_range : 0; img_scroll(0, i-imgofsy); return 1; } MENU hslider[] = { { HSLIDER_BAR, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, (ExposureMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask), 0, hslidev2, NULL, 0, 0, NULL}, { HSLIDER_LEFT, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, IMASK, 0, hslidev, NULL, 0, 0, NULL}, { HSLIDER_RIGHT, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, IMASK, 0, hslidev, NULL, 0, 0, NULL}, { -1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, NULL}}; MENU vslider[] = { { VSLIDER_BAR, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, (ExposureMask|ButtonPressMask|ButtonReleaseMask|ButtonMotionMask), 0, vslidev2, NULL, 0, 0, NULL}, { VSLIDER_UP, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, IMASK, 0, vslidev, NULL, 0, 0, NULL}, { VSLIDER_DOWN, MenuModeMaskBorder, 0, 0, SLIDER_MIN, SLIDER_MIN, 0, IMASK, 0, vslidev, NULL, 0, 0, NULL}, { -1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, NULL}}; void calc_hslider_pos() { int i; i = (imgfilew * zoomfactor) - imgwinwidth; if (i > 0) { i = (imgofsx * hslide_range) / i; } else { i = 0; } hslider[HSLIDER_BAR].x = BDW+SLIDER_MIN+BDW + i; } void calc_vslider_pos() { int i; i = (imgfileh * zoomfactor) - imgwinheight; if (i > 0) { i = (imgofsy * vslide_range) / i; } else { i = 0; } vslider[VSLIDER_BAR].y = BDW+SLIDER_MIN+BDW + i; } void calc_resize_hslider(w0) int w0; { int i; hslider[HSLIDER_LEFT].w = SLIDER_MIN; hslider[HSLIDER_RIGHT].w = SLIDER_MIN; i = w0 - (BDW+SLIDER_MIN+BDW); hslider[HSLIDER_RIGHT].x = i; i = w0 - (BDW + hslider[HSLIDER_LEFT].w + BDW + BDW + BDW + BDW + hslider[HSLIDER_RIGHT].w + BDW); i *= imgwinwidth; if (imgfilew) i /= imgfilew*zoomfactor; if (i < SLIDER_MIN) i = SLIDER_MIN; hslider[HSLIDER_BAR].w = i; i = w0 - (BDW + hslider[HSLIDER_LEFT].w + BDW + BDW + hslider[HSLIDER_BAR].w + BDW + BDW + hslider[HSLIDER_RIGHT].w + BDW); if (i < 0) i = 0; hslide_range = i; calc_hslider_pos(); } void calc_resize_vslider(h0) int h0; { int i; vslider[VSLIDER_UP].h = SLIDER_MIN; vslider[VSLIDER_DOWN].h = SLIDER_MIN; i = h0 - (BDW+SLIDER_MIN+BDW); vslider[VSLIDER_DOWN].y = i; i = h0 - (BDW + vslider[VSLIDER_UP].h + BDW + BDW + BDW + BDW + vslider[VSLIDER_DOWN].h + BDW); i *= imgwinheight; if (imgfileh) i /= imgfileh*zoomfactor; if (i < SLIDER_MIN) i = SLIDER_MIN; vslider[VSLIDER_BAR].h = i; i = h0 - (BDW + vslider[VSLIDER_UP].h + BDW + BDW + vslider[VSLIDER_BAR].h + BDW + BDW + vslider[VSLIDER_DOWN].h + BDW); if (i < 0) i = 0; vslide_range = i; calc_vslider_pos(); } int create_slider_window() { XSetWindowAttributes attr; hsliderbase = XCreateSimpleWindow(dsp, win, imgwx+HSLIDER_X, imgwy+imgwinheight+HSLIDER_Y, imgwinwidth, BDW+SLIDER_MIN+BDW, BDW, border_color, bg); attr.win_gravity = SouthWestGravity; attr.background_pixmap = hatch_pixmap; XChangeWindowAttributes(dsp, hsliderbase, CWWinGravity|CWBackPixmap, &attr); calc_resize_hslider(imgwinwidth); menuwin_create(hslider, hsliderbase, 0, 0); if (scrollbarmode & 2) XMapRaised(dsp, hsliderbase); vsliderbase = XCreateSimpleWindow(dsp, win, imgwx+imgwinwidth+VSLIDER_X, imgwy+HSLIDER_Y, BDW+SLIDER_MIN+BDW, imgwinheight, BDW, border_color, bg); attr.win_gravity = NorthEastGravity; attr.background_pixmap = hatch_pixmap; XChangeWindowAttributes(dsp, vsliderbase, CWBackPixmap|CWWinGravity, &attr); calc_resize_vslider(imgwinheight); menuwin_create(vslider, vsliderbase, 0, 0); if (scrollbarmode & 2) XMapRaised(dsp, vsliderbase); return 0; } void resize_scroll_slider() { MENU *p; XMoveResizeWindow(dsp, hsliderbase, imgwx+HSLIDER_X, imgwy+imgwinheight+HSLIDER_Y, imgwinwidth, BDW+SLIDER_MIN+BDW); calc_resize_hslider(imgwinwidth); p = hslider; while (p->n >= 0) { XMoveResizeWindow(dsp, p->win, p->x, p->y, p->w, p->h); p++; } XMoveResizeWindow(dsp, vsliderbase, imgwx+imgwinwidth+VSLIDER_X, imgwy+VSLIDER_Y, BDW+SLIDER_MIN+BDW, imgwinheight); calc_resize_vslider(imgwinheight); p = vslider; while (p->n >= 0) { XMoveResizeWindow(dsp, p->win, p->x, p->y, p->w, p->h); p++; } } void move_hslider() { MENU *p; calc_hslider_pos(); p = &hslider[HSLIDER_BAR]; XMoveWindow(dsp, p->win, p->x, p->y); } void move_vslider() { MENU *p; calc_vslider_pos(); p = &vslider[VSLIDER_BAR]; XMoveWindow(dsp, p->win, p->x, p->y); } /* End of file */