home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Enlightenment / enl14.tgz / enl14.tar / enl14 / sliders.c < prev    next >
C/C++ Source or Header  |  1997-11-09  |  11KB  |  414 lines

  1. #include "enl.h"
  2.  
  3. void FreeSliderClass(SliderClass *item)
  4. {
  5.    if (!item) return;
  6.    
  7.    if (item->name) Efree(item->name);
  8.    Efree(item);
  9. }
  10.  
  11. void CfgReadSliderOrient(SliderOrient *o)
  12. {
  13.    char s[256];
  14.    
  15.    o->base.iclass=NULL;
  16.    o->base.thickness=0;
  17.    o->base.start_inset=0;
  18.    o->base.end_inset=0;
  19.    o->knob.iclass=NULL;
  20.    o->knob.x=0;
  21.    o->knob.y=0;
  22.    o->knob.width=0;
  23.    o->knob.height=0;
  24.    while(CfgGetLine(NULL))
  25.      {
  26.     word(line,1,s);
  27.     if (!strcmp(s,"end")) return;
  28.     else if (!strcmp(s,"base"))
  29.       {
  30.          word(line,2,s);
  31.          if (!strcmp(s,"image_class"))
  32.            {
  33.           word(line,3,s);
  34.           o->base.iclass=(ImageClass *)FindItem(s,LIST_TYPE_IMAGECLASS);
  35.            }
  36.          else if (!strcmp(s,"thickness"))
  37.            {
  38.           word(line,3,s);
  39.           o->base.thickness=atoi(s);
  40.            }
  41.       }
  42.     else if (!strcmp(s,"knob"))
  43.       {
  44.          word(line,2,s);
  45.          if (!strcmp(s,"image_class"))
  46.            {
  47.           word(line,3,s);
  48.           o->knob.iclass=(ImageClass *)FindItem(s,LIST_TYPE_IMAGECLASS);
  49.            }
  50.          else if (!strcmp(s,"location"))
  51.            sscanf(line,"%*s %*s %i %i %*s %i %i",&o->knob.x,&o->knob.y,
  52.               &o->knob.width,&o->knob.height);
  53.       }
  54.     else if (!strcmp(s,"insets"))
  55.       sscanf(line,"%*s %i %i",&o->base.start_inset,&o->base.end_inset);
  56.      }
  57. }
  58.  
  59. void CfgLoadSliderClass()
  60. {
  61.    SliderClass *sc;
  62.    char s[256];
  63.    
  64.    sc=Emalloc(sizeof(SliderClass));
  65.    if (!sc) return;
  66.    sc->name=NULL;
  67.    while (CfgGetLine(NULL))
  68.      {
  69.     word(line,1,s);
  70.     if (!strcmp(s,"name"))
  71.       {
  72.          word(line,2,s);
  73.          sc->name=duplicate(s);
  74.       }
  75.     else if (!strcmp(s,"begin"))
  76.       {
  77.          word(line,2,s);
  78.          if (!strcmp(s,"horizontal"))
  79.            CfgReadSliderOrient(&sc->horizontal);
  80.          else if (!strcmp(s,"vertical"))
  81.            CfgReadSliderOrient(&sc->vertical);
  82.       }
  83.     else if (!strcmp(s,"end"))
  84.       {
  85.          AddItem((void *)sc,sc->name,LIST_TYPE_SLIDERCLASS);
  86.          return;
  87.       }
  88.      }
  89.    if (sc->name) Efree(sc->name);
  90.    Efree(sc);
  91. }
  92.  
  93. Slider *CreateSlider(char *name, char *classname, char orientation, int len, int divisions)
  94. {
  95.    Slider *s;
  96.    XSetWindowAttributes att;
  97.    int mask;
  98.    
  99.    if ((!name)||(!classname)||(!len)) return NULL;
  100.    s=Emalloc(sizeof(Slider));
  101.    s->name=duplicate(name);
  102.    s->sclass=(SliderClass *)FindItem(classname,LIST_TYPE_SLIDERCLASS);
  103.    if (!s->sclass)
  104.      {
  105.     if (s->name) Efree(s->name);
  106.     Efree(s);
  107.     return NULL;
  108.      }
  109.    s->orientation=orientation;
  110.    s->length=len;
  111.    s->divisions=divisions;
  112.    s->value=0;
  113.    s->state=STATE_NORMAL;
  114.    s->pstate=-1;
  115.    s->baseX.x=0;
  116.    s->baseX.y=0;
  117.    s->action.id=0;
  118.    s->action.params=NULL;
  119.    if (orientation==STRIP_ORIENTATION_HORIZONTAL)
  120.      {
  121.     s->baseX.width=s->length+s->sclass->horizontal.base.start_inset+
  122.       s->sclass->horizontal.base.end_inset;
  123.     s->baseX.height=s->sclass->horizontal.base.thickness;
  124.     s->knobX.x=s->baseX.x+s->sclass->horizontal.base.start_inset+
  125.       s->sclass->horizontal.knob.x;
  126.     s->knobX.y=s->baseX.y+(s->sclass->horizontal.base.thickness>>1)+
  127.       s->sclass->horizontal.knob.y;
  128.     s->knobX.width=s->sclass->horizontal.knob.width;
  129.     s->knobX.height=s->sclass->horizontal.knob.height;
  130.      }
  131.    else
  132.      {
  133.     s->baseX.height=s->length+s->sclass->vertical.base.start_inset+
  134.       s->sclass->vertical.base.end_inset;
  135.     s->baseX.width=s->sclass->vertical.base.thickness;
  136.     s->knobX.x=s->baseX.x+(s->sclass->vertical.base.thickness>>1)+
  137.       s->sclass->vertical.knob.x;
  138.     s->knobX.y=s->baseX.y+s->baseX.height-
  139.       s->sclass->vertical.base.start_inset+
  140.       s->sclass->vertical.knob.y;
  141.     s->knobX.width=s->sclass->vertical.knob.width;
  142.     s->knobX.height=s->sclass->vertical.knob.height;
  143.      }
  144.    s->baseX.pmap=0;
  145.    s->baseX.mask=0;
  146.    s->knobX.pmap=0;
  147.    s->knobX.mask=0;
  148.    s->pbaseX.x=-1;
  149.    s->pbaseX.y=-1;
  150.    s->pbaseX.width=0;
  151.    s->pbaseX.height=0;
  152.    s->pknobX.x=-1;
  153.    s->pknobX.y=-1;
  154.    s->pknobX.width=0;
  155.    s->pknobX.height=0;
  156.    att.backing_store=NotUseful;/* NotUseful WhenMapped Always */
  157.    att.save_under=False;
  158.    att.override_redirect=True;
  159.    mask=CWOverrideRedirect|CWSaveUnder|CWBackingStore;
  160.    s->baseX.win=XCreateWindow(disp,DefaultRootWindow(disp),-10,-10,5,5,0,
  161.                   imd->x.depth,InputOutput,imd->x.visual,mask,&att);
  162.    s->knobX.win=XCreateWindow(disp,DefaultRootWindow(disp),-10,-10,5,5,0,
  163.                   imd->x.depth,InputOutput,imd->x.visual,mask,&att);
  164.    XSelectInput(disp,s->baseX.win,ButtonPressMask|ButtonReleaseMask|
  165.         KeyPressMask|KeyReleaseMask);
  166.    XSelectInput(disp,s->knobX.win,ButtonPressMask|ButtonReleaseMask|EnterWindowMask
  167.         |LeaveWindowMask|ButtonMotionMask|KeyPressMask|KeyReleaseMask);
  168.    return s;
  169. }
  170.  
  171. void DrawSlider(Slider *s)
  172.    int draw,move;
  173.    int v;
  174.    
  175.    if (!s) return;
  176.    draw=0;move=0;
  177.    
  178.    v=s->value;
  179.    if (v<0) v=0;
  180.    if (v>s->length) v=s->length;
  181.    if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
  182.      {
  183.     s->knobX.x=s->baseX.x+s->sclass->horizontal.base.start_inset+
  184.       (((v*s->divisions)/s->length)*(s->length/s->divisions))+
  185.       s->sclass->horizontal.knob.x;
  186.     s->knobX.y=s->baseX.y+(s->sclass->horizontal.base.thickness>>1)+
  187.       s->sclass->horizontal.knob.y;
  188.      }
  189.    else
  190.      {
  191.     s->knobX.x=s->baseX.x+(s->sclass->vertical.base.thickness>>1)+
  192.       s->sclass->vertical.knob.x;
  193.     s->knobX.y=s->baseX.y+s->baseX.height-
  194.       s->sclass->vertical.base.start_inset-
  195.       (((v*s->divisions)/s->length)*(s->length/s->divisions))+
  196.       s->sclass->vertical.knob.y;
  197.      }
  198.    if (s->baseX.x!=s->pbaseX.x) move=1;
  199.    if (s->baseX.y!=s->pbaseX.y) move=1;
  200.    if (s->state!=s->pstate) draw=1;
  201.    if (s->baseX.width!=s->pbaseX.width) draw=1;
  202.    if (s->baseX.height!=s->pbaseX.height) draw=1;
  203.    if (move)
  204.      {
  205.     XMoveWindow(disp,s->baseX.win,s->baseX.x,s->baseX.y);
  206.      }
  207.    if (draw)
  208.      {
  209.     if (s->baseX.pmap) ImlibFreePixmap(imd,s->baseX.pmap);
  210.     if (s->baseX.mask) ImlibFreePixmap(imd,s->baseX.mask);
  211.     if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
  212.       GetPixmaps(s->sclass->horizontal.base.iclass,s->state,s->baseX.width,
  213.              s->baseX.height,&s->baseX.pmap,&s->baseX.mask);
  214.     else
  215.       GetPixmaps(s->sclass->vertical.base.iclass,s->state,s->baseX.width,
  216.              s->baseX.height,&s->baseX.pmap,&s->baseX.mask);
  217.     XResizeWindow(disp,s->baseX.win,s->baseX.width,s->baseX.height);
  218.     if (s->baseX.pmap)
  219.       XSetWindowBackgroundPixmap(disp,s->baseX.win,s->baseX.pmap);
  220.     if (s->baseX.mask)
  221.       XShapeCombineMask(disp,s->baseX.win,ShapeBounding,0,0,s->baseX.mask,
  222.                 ShapeSet);
  223.     XClearWindow(disp,s->baseX.win);
  224.      }
  225.    if (move||draw) XSync(disp,False);
  226.    
  227.    if (draw) move=1;
  228.    draw=0;
  229.    if (s->state!=s->pstate) draw=1;
  230.    if (s->knobX.x!=s->pknobX.x) move=1;
  231.    if (s->knobX.y!=s->pknobX.y) move=1;
  232.    if (s->knobX.width!=s->pknobX.width) draw=1;
  233.    if (s->knobX.height!=s->pknobX.height) draw=1;
  234.    if (move)
  235.      {
  236.     XMoveWindow(disp,s->knobX.win,s->knobX.x,s->knobX.y);
  237.      }
  238.    if (draw)
  239.      {
  240.     if (s->knobX.pmap) ImlibFreePixmap(imd,s->knobX.pmap);
  241.     if (s->knobX.mask) ImlibFreePixmap(imd,s->knobX.mask);
  242.     if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
  243.       GetPixmaps(s->sclass->horizontal.knob.iclass,s->state,s->knobX.width,
  244.              s->knobX.height,&s->knobX.pmap,&s->knobX.mask);
  245.     else
  246.       GetPixmaps(s->sclass->vertical.knob.iclass,s->state,s->knobX.width,
  247.              s->knobX.height,&s->knobX.pmap,&s->knobX.mask);
  248.     XResizeWindow(disp,s->knobX.win,s->knobX.width,s->knobX.height);
  249.     if (s->knobX.pmap)
  250.       XSetWindowBackgroundPixmap(disp,s->knobX.win,s->knobX.pmap);
  251.     if (s->knobX.mask)
  252.       XShapeCombineMask(disp,s->knobX.win,ShapeBounding,0,0,s->knobX.mask,
  253.                 ShapeSet);
  254.     XClearWindow(disp,s->knobX.win);
  255.      }
  256.    if (move||draw) XSync(disp,False);
  257.    s->pstate=s->state;
  258.    s->pbaseX.x=s->baseX.x;
  259.    s->pbaseX.y=s->baseX.y;
  260.    s->pbaseX.width=s->baseX.width;
  261.    s->pbaseX.height=s->baseX.height;
  262.    s->pknobX.x=s->knobX.x;
  263.    s->pknobX.y=s->knobX.y;
  264.    s->pknobX.width=s->knobX.width;
  265.    s->pknobX.height=s->knobX.height;
  266. }
  267.  
  268. void FreeSlider(Slider *item)
  269. {
  270.    if (!item) return;
  271.    
  272.    if (item->name)          Efree(item->name);
  273.    if (item->action.params) Efree(item->action.params);
  274.    if (item->baseX.pmap)    ImlibFreePixmap(imd,item->baseX.pmap);
  275.    if (item->baseX.mask)    ImlibFreePixmap(imd,item->baseX.mask);
  276.    if (item->knobX.pmap)    ImlibFreePixmap(imd,item->knobX.pmap);
  277.    if (item->knobX.mask)    ImlibFreePixmap(imd,item->knobX.mask);
  278.    if (item->baseX.win)     XDestroyWindow(disp,item->baseX.win);
  279.    if (item->knobX.win)     XDestroyWindow(disp,item->knobX.win);
  280.    Efree(item);
  281. }
  282.  
  283. void MoveSliderBy(Slider *s, int x, int y)
  284. {
  285.    if (!s) return;
  286.    s->baseX.x+=x;
  287.    s->baseX.y+=y;
  288.    if (s->value>s->length) s->value=s->length;
  289.    if (s->value<0) s->value=0;
  290.    DrawSlider(s);
  291. }
  292. void MoveSliderTo(Slider *s, int x, int y)
  293. {
  294.    if (!s) return;
  295.    s->baseX.x=x;
  296.    s->baseX.y=y;
  297.    if (s->value>s->length) s->value=s->length;
  298.    if (s->value<0) s->value=0;
  299.    DrawSlider(s);
  300. }
  301.  
  302. void AddSliderValue(Slider *s, int value)
  303. {
  304.    if (!s) return;
  305.    s->value+=(value*s->length)/s->divisions;
  306.    if (s->value>s->length) s->value=s->length;
  307.    if (s->value<0) s->value=0;
  308.    DrawSlider(s);
  309. }
  310.  
  311. void SetSliderValue(Slider *s, int value)
  312. {
  313.    if (!s) return;
  314.    s->value=(value*s->length)/s->divisions;
  315.    if (s->value>s->length) s->value=s->length;
  316.    if (s->value<0) s->value=0;
  317.    DrawSlider(s);
  318. }
  319.  
  320. void SetSliderAction(Slider *s, Action *a)
  321. {
  322.    if (!s) return;
  323.    if (!a) return;
  324.    s->action.id=a->id;
  325.    s->action.params=a->params;
  326. }
  327.  
  328. int GetSliderValue(Slider *s)
  329. {
  330.    int v;
  331.    
  332.    if (!s) return 0;
  333.    v=s->value;
  334.    if (s->value>s->length) v=s->length;
  335.    if (s->value<0) v=0;
  336.    return (v*s->divisions)/s->length;
  337. }
  338.  
  339. void HandleSliderMouse(Slider *s, int dx, int dy)
  340. {
  341.    if (!s) return;
  342.    
  343.    if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
  344.      s->value+=dx;
  345.    else
  346.      s->value-=dy;
  347.    DrawSlider(s);
  348. }
  349.  
  350. void ShowSlider(Slider *s)
  351. {
  352.    if (!s) return;
  353.    
  354.    XMapWindow(disp,s->baseX.win);
  355.    XMapWindow(disp,s->knobX.win);
  356.    XSync(disp,False);
  357. }
  358.  
  359. void HideSlider(Slider *s)
  360. {
  361.    if (!s) return;
  362.    
  363.    XUnmapWindow(disp,s->knobX.win);
  364.    XUnmapWindow(disp,s->baseX.win);
  365.    XSync(disp,False);
  366. }
  367.  
  368. void SliderClick(Slider *s, int onoff)
  369. {
  370.    if (!s) return;
  371.    
  372.    if (s->state==STATE_DISABLED) return;
  373.    if (onoff)
  374.      s->state=STATE_CLICKED;
  375.    else
  376.      {
  377.     if (s->state==STATE_NORMAL)
  378.       s->state=STATE_NORMAL;
  379.     else
  380.       s->state=STATE_HILITED;
  381.      }
  382.    DrawSlider(s);
  383. }
  384.  
  385. void SliderHilite(Slider *s, int onoff)
  386. {
  387.    if (!s) return;
  388.    
  389.    if (s->state==STATE_DISABLED) return;
  390.    if (onoff)
  391.      {
  392.     if (s->state!=STATE_CLICKED)
  393.       s->state=STATE_HILITED;
  394.      }
  395.    else
  396.      {
  397.     if (s->state!=STATE_CLICKED)
  398.       s->state=STATE_NORMAL;
  399.      }
  400.    DrawSlider(s);
  401. }
  402.  
  403. void SliderDisable(Slider *s, int onoff)
  404. {
  405.    if (!s) return;
  406.    
  407.    if (onoff)
  408.      s->state=STATE_DISABLED;
  409.    else
  410.      s->state=STATE_NORMAL;
  411.    DrawSlider(s);
  412. }
  413.