home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 52
/
Amiga_Dream_52.iso
/
Linux
/
Enlightenment
/
enl14.tgz
/
enl14.tar
/
enl14
/
sliders.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-11-09
|
11KB
|
414 lines
#include "enl.h"
void FreeSliderClass(SliderClass *item)
{
if (!item) return;
if (item->name) Efree(item->name);
Efree(item);
}
void CfgReadSliderOrient(SliderOrient *o)
{
char s[256];
o->base.iclass=NULL;
o->base.thickness=0;
o->base.start_inset=0;
o->base.end_inset=0;
o->knob.iclass=NULL;
o->knob.x=0;
o->knob.y=0;
o->knob.width=0;
o->knob.height=0;
while(CfgGetLine(NULL))
{
word(line,1,s);
if (!strcmp(s,"end")) return;
else if (!strcmp(s,"base"))
{
word(line,2,s);
if (!strcmp(s,"image_class"))
{
word(line,3,s);
o->base.iclass=(ImageClass *)FindItem(s,LIST_TYPE_IMAGECLASS);
}
else if (!strcmp(s,"thickness"))
{
word(line,3,s);
o->base.thickness=atoi(s);
}
}
else if (!strcmp(s,"knob"))
{
word(line,2,s);
if (!strcmp(s,"image_class"))
{
word(line,3,s);
o->knob.iclass=(ImageClass *)FindItem(s,LIST_TYPE_IMAGECLASS);
}
else if (!strcmp(s,"location"))
sscanf(line,"%*s %*s %i %i %*s %i %i",&o->knob.x,&o->knob.y,
&o->knob.width,&o->knob.height);
}
else if (!strcmp(s,"insets"))
sscanf(line,"%*s %i %i",&o->base.start_inset,&o->base.end_inset);
}
}
void CfgLoadSliderClass()
{
SliderClass *sc;
char s[256];
sc=Emalloc(sizeof(SliderClass));
if (!sc) return;
sc->name=NULL;
while (CfgGetLine(NULL))
{
word(line,1,s);
if (!strcmp(s,"name"))
{
word(line,2,s);
sc->name=duplicate(s);
}
else if (!strcmp(s,"begin"))
{
word(line,2,s);
if (!strcmp(s,"horizontal"))
CfgReadSliderOrient(&sc->horizontal);
else if (!strcmp(s,"vertical"))
CfgReadSliderOrient(&sc->vertical);
}
else if (!strcmp(s,"end"))
{
AddItem((void *)sc,sc->name,LIST_TYPE_SLIDERCLASS);
return;
}
}
if (sc->name) Efree(sc->name);
Efree(sc);
}
Slider *CreateSlider(char *name, char *classname, char orientation, int len, int divisions)
{
Slider *s;
XSetWindowAttributes att;
int mask;
if ((!name)||(!classname)||(!len)) return NULL;
s=Emalloc(sizeof(Slider));
s->name=duplicate(name);
s->sclass=(SliderClass *)FindItem(classname,LIST_TYPE_SLIDERCLASS);
if (!s->sclass)
{
if (s->name) Efree(s->name);
Efree(s);
return NULL;
}
s->orientation=orientation;
s->length=len;
s->divisions=divisions;
s->value=0;
s->state=STATE_NORMAL;
s->pstate=-1;
s->baseX.x=0;
s->baseX.y=0;
s->action.id=0;
s->action.params=NULL;
if (orientation==STRIP_ORIENTATION_HORIZONTAL)
{
s->baseX.width=s->length+s->sclass->horizontal.base.start_inset+
s->sclass->horizontal.base.end_inset;
s->baseX.height=s->sclass->horizontal.base.thickness;
s->knobX.x=s->baseX.x+s->sclass->horizontal.base.start_inset+
s->sclass->horizontal.knob.x;
s->knobX.y=s->baseX.y+(s->sclass->horizontal.base.thickness>>1)+
s->sclass->horizontal.knob.y;
s->knobX.width=s->sclass->horizontal.knob.width;
s->knobX.height=s->sclass->horizontal.knob.height;
}
else
{
s->baseX.height=s->length+s->sclass->vertical.base.start_inset+
s->sclass->vertical.base.end_inset;
s->baseX.width=s->sclass->vertical.base.thickness;
s->knobX.x=s->baseX.x+(s->sclass->vertical.base.thickness>>1)+
s->sclass->vertical.knob.x;
s->knobX.y=s->baseX.y+s->baseX.height-
s->sclass->vertical.base.start_inset+
s->sclass->vertical.knob.y;
s->knobX.width=s->sclass->vertical.knob.width;
s->knobX.height=s->sclass->vertical.knob.height;
}
s->baseX.pmap=0;
s->baseX.mask=0;
s->knobX.pmap=0;
s->knobX.mask=0;
s->pbaseX.x=-1;
s->pbaseX.y=-1;
s->pbaseX.width=0;
s->pbaseX.height=0;
s->pknobX.x=-1;
s->pknobX.y=-1;
s->pknobX.width=0;
s->pknobX.height=0;
att.backing_store=NotUseful;/* NotUseful WhenMapped Always */
att.save_under=False;
att.override_redirect=True;
mask=CWOverrideRedirect|CWSaveUnder|CWBackingStore;
s->baseX.win=XCreateWindow(disp,DefaultRootWindow(disp),-10,-10,5,5,0,
imd->x.depth,InputOutput,imd->x.visual,mask,&att);
s->knobX.win=XCreateWindow(disp,DefaultRootWindow(disp),-10,-10,5,5,0,
imd->x.depth,InputOutput,imd->x.visual,mask,&att);
XSelectInput(disp,s->baseX.win,ButtonPressMask|ButtonReleaseMask|
KeyPressMask|KeyReleaseMask);
XSelectInput(disp,s->knobX.win,ButtonPressMask|ButtonReleaseMask|EnterWindowMask
|LeaveWindowMask|ButtonMotionMask|KeyPressMask|KeyReleaseMask);
return s;
}
void DrawSlider(Slider *s)
{
int draw,move;
int v;
if (!s) return;
draw=0;move=0;
v=s->value;
if (v<0) v=0;
if (v>s->length) v=s->length;
if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
{
s->knobX.x=s->baseX.x+s->sclass->horizontal.base.start_inset+
(((v*s->divisions)/s->length)*(s->length/s->divisions))+
s->sclass->horizontal.knob.x;
s->knobX.y=s->baseX.y+(s->sclass->horizontal.base.thickness>>1)+
s->sclass->horizontal.knob.y;
}
else
{
s->knobX.x=s->baseX.x+(s->sclass->vertical.base.thickness>>1)+
s->sclass->vertical.knob.x;
s->knobX.y=s->baseX.y+s->baseX.height-
s->sclass->vertical.base.start_inset-
(((v*s->divisions)/s->length)*(s->length/s->divisions))+
s->sclass->vertical.knob.y;
}
if (s->baseX.x!=s->pbaseX.x) move=1;
if (s->baseX.y!=s->pbaseX.y) move=1;
if (s->state!=s->pstate) draw=1;
if (s->baseX.width!=s->pbaseX.width) draw=1;
if (s->baseX.height!=s->pbaseX.height) draw=1;
if (move)
{
XMoveWindow(disp,s->baseX.win,s->baseX.x,s->baseX.y);
}
if (draw)
{
if (s->baseX.pmap) ImlibFreePixmap(imd,s->baseX.pmap);
if (s->baseX.mask) ImlibFreePixmap(imd,s->baseX.mask);
if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
GetPixmaps(s->sclass->horizontal.base.iclass,s->state,s->baseX.width,
s->baseX.height,&s->baseX.pmap,&s->baseX.mask);
else
GetPixmaps(s->sclass->vertical.base.iclass,s->state,s->baseX.width,
s->baseX.height,&s->baseX.pmap,&s->baseX.mask);
XResizeWindow(disp,s->baseX.win,s->baseX.width,s->baseX.height);
if (s->baseX.pmap)
XSetWindowBackgroundPixmap(disp,s->baseX.win,s->baseX.pmap);
if (s->baseX.mask)
XShapeCombineMask(disp,s->baseX.win,ShapeBounding,0,0,s->baseX.mask,
ShapeSet);
XClearWindow(disp,s->baseX.win);
}
if (move||draw) XSync(disp,False);
if (draw) move=1;
draw=0;
if (s->state!=s->pstate) draw=1;
if (s->knobX.x!=s->pknobX.x) move=1;
if (s->knobX.y!=s->pknobX.y) move=1;
if (s->knobX.width!=s->pknobX.width) draw=1;
if (s->knobX.height!=s->pknobX.height) draw=1;
if (move)
{
XMoveWindow(disp,s->knobX.win,s->knobX.x,s->knobX.y);
}
if (draw)
{
if (s->knobX.pmap) ImlibFreePixmap(imd,s->knobX.pmap);
if (s->knobX.mask) ImlibFreePixmap(imd,s->knobX.mask);
if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
GetPixmaps(s->sclass->horizontal.knob.iclass,s->state,s->knobX.width,
s->knobX.height,&s->knobX.pmap,&s->knobX.mask);
else
GetPixmaps(s->sclass->vertical.knob.iclass,s->state,s->knobX.width,
s->knobX.height,&s->knobX.pmap,&s->knobX.mask);
XResizeWindow(disp,s->knobX.win,s->knobX.width,s->knobX.height);
if (s->knobX.pmap)
XSetWindowBackgroundPixmap(disp,s->knobX.win,s->knobX.pmap);
if (s->knobX.mask)
XShapeCombineMask(disp,s->knobX.win,ShapeBounding,0,0,s->knobX.mask,
ShapeSet);
XClearWindow(disp,s->knobX.win);
}
if (move||draw) XSync(disp,False);
s->pstate=s->state;
s->pbaseX.x=s->baseX.x;
s->pbaseX.y=s->baseX.y;
s->pbaseX.width=s->baseX.width;
s->pbaseX.height=s->baseX.height;
s->pknobX.x=s->knobX.x;
s->pknobX.y=s->knobX.y;
s->pknobX.width=s->knobX.width;
s->pknobX.height=s->knobX.height;
}
void FreeSlider(Slider *item)
{
if (!item) return;
if (item->name) Efree(item->name);
if (item->action.params) Efree(item->action.params);
if (item->baseX.pmap) ImlibFreePixmap(imd,item->baseX.pmap);
if (item->baseX.mask) ImlibFreePixmap(imd,item->baseX.mask);
if (item->knobX.pmap) ImlibFreePixmap(imd,item->knobX.pmap);
if (item->knobX.mask) ImlibFreePixmap(imd,item->knobX.mask);
if (item->baseX.win) XDestroyWindow(disp,item->baseX.win);
if (item->knobX.win) XDestroyWindow(disp,item->knobX.win);
Efree(item);
}
void MoveSliderBy(Slider *s, int x, int y)
{
if (!s) return;
s->baseX.x+=x;
s->baseX.y+=y;
if (s->value>s->length) s->value=s->length;
if (s->value<0) s->value=0;
DrawSlider(s);
}
void MoveSliderTo(Slider *s, int x, int y)
{
if (!s) return;
s->baseX.x=x;
s->baseX.y=y;
if (s->value>s->length) s->value=s->length;
if (s->value<0) s->value=0;
DrawSlider(s);
}
void AddSliderValue(Slider *s, int value)
{
if (!s) return;
s->value+=(value*s->length)/s->divisions;
if (s->value>s->length) s->value=s->length;
if (s->value<0) s->value=0;
DrawSlider(s);
}
void SetSliderValue(Slider *s, int value)
{
if (!s) return;
s->value=(value*s->length)/s->divisions;
if (s->value>s->length) s->value=s->length;
if (s->value<0) s->value=0;
DrawSlider(s);
}
void SetSliderAction(Slider *s, Action *a)
{
if (!s) return;
if (!a) return;
s->action.id=a->id;
s->action.params=a->params;
}
int GetSliderValue(Slider *s)
{
int v;
if (!s) return 0;
v=s->value;
if (s->value>s->length) v=s->length;
if (s->value<0) v=0;
return (v*s->divisions)/s->length;
}
void HandleSliderMouse(Slider *s, int dx, int dy)
{
if (!s) return;
if (s->orientation==STRIP_ORIENTATION_HORIZONTAL)
s->value+=dx;
else
s->value-=dy;
DrawSlider(s);
}
void ShowSlider(Slider *s)
{
if (!s) return;
XMapWindow(disp,s->baseX.win);
XMapWindow(disp,s->knobX.win);
XSync(disp,False);
}
void HideSlider(Slider *s)
{
if (!s) return;
XUnmapWindow(disp,s->knobX.win);
XUnmapWindow(disp,s->baseX.win);
XSync(disp,False);
}
void SliderClick(Slider *s, int onoff)
{
if (!s) return;
if (s->state==STATE_DISABLED) return;
if (onoff)
s->state=STATE_CLICKED;
else
{
if (s->state==STATE_NORMAL)
s->state=STATE_NORMAL;
else
s->state=STATE_HILITED;
}
DrawSlider(s);
}
void SliderHilite(Slider *s, int onoff)
{
if (!s) return;
if (s->state==STATE_DISABLED) return;
if (onoff)
{
if (s->state!=STATE_CLICKED)
s->state=STATE_HILITED;
}
else
{
if (s->state!=STATE_CLICKED)
s->state=STATE_NORMAL;
}
DrawSlider(s);
}
void SliderDisable(Slider *s, int onoff)
{
if (!s) return;
if (onoff)
s->state=STATE_DISABLED;
else
s->state=STATE_NORMAL;
DrawSlider(s);
}