home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 52
/
Amiga_Dream_52.iso
/
Linux
/
Enlightenment
/
enl_DR-0.10.tar.gz
/
enl_DR-0.10.tar
/
enl
/
menus.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-06-22
|
8KB
|
351 lines
#include "enlightenment.h"
void InitMenuList()
{
mlist.next=NULL;
mlist.menu=NULL;
active_mlist.next=NULL;
active_mlist.menu=NULL;
}
void AddMenuToList(Menu *menu)
{
struct menulist *ptr;
ptr=malloc(sizeof(struct menulist));
ptr->menu=menu;
ptr->next=mlist.next;
mlist.next=ptr;
}
Menu *FindMenu(char *name)
{
struct menulist *ptr;
ptr=mlist.next;
while(ptr)
{
if (!strcmp(name,ptr->menu->name)) return ptr->menu;
ptr=ptr->next;
}
return NULL;
}
Menu *GetMenuWin(Window w)
{
struct menulist *ptr;
ptr=mlist.next;
while(ptr)
{
if (w==ptr->menu->win) return ptr->menu;
ptr=ptr->next;
}
return NULL;
}
void AddActiveMenuToList(Menu *menu)
{
struct menulist *ptr;
ptr=malloc(sizeof(struct menulist));
ptr->menu=menu;
ptr->next=active_mlist.next;
active_mlist.next=ptr;
}
void DeleteToActiveMenu(char *name)
{
struct menulist *ptr;
struct menulist *pptr;
ptr=active_mlist.next;
while(ptr)
{
if (!strcmp(name,ptr->menu->name))
{
active_mlist.next=ptr;
return;
}
pptr=ptr;
HideMenu(ptr->menu);
ptr=ptr->next;
free(pptr);
}
active_mlist.next=NULL;
}
Menu *GetActiveMenuWin(Window w)
{
struct menulist *ptr;
ptr=mlist.next;
while(ptr)
{
if (w==ptr->menu->win) return ptr->menu;
ptr=ptr->next;
}
return NULL;
}
Menu *CreateMenu(char *name, int type, int num_items)
{
Menu *m;
int i;
m=malloc(sizeof(Menu));
if (!m) return NULL;
m->type=type;
m->num_items=num_items;
m->width=0;
m->height=0;
if (name) strncpy(m->name,name,255);
else name[0]=0;
m->popup_x=0;
m->popup_y=0;
m->win=0;
m->mask=0;
m->items=malloc(sizeof(MenuItem *)*num_items);
m->sel_item=-1;
for (i=0;i<num_items;i++)
{
m->items[i]=NULL;
}
return m;
}
void AddMenuItem(Menu *m, MenuItem* mi)
{
int i;
for (i=0;i<m->num_items;i++)
{
if (!m->items[i])
{
m->items[i]=mi;
break;
}
}
}
void RenderMenu(Menu *m)
{
int i;
XGCValues gcv;
GC gc;
GC or;
if (m->mask) XFreePixmap(disp,m->mask);
if (m->win) XDestroyWindow(disp,m->win);
m->win=XCreateSimpleWindow(disp,root,0,0,m->width,m->height,0,0,0);
m->mask=XCreatePixmap(disp,m->win,m->width,m->height,1);
gcv.function=GXor;
gc=XCreateGC(disp,m->mask,0,&gcv);
or=XCreateGC(disp,m->mask,GCFunction,&gcv);
XSetForeground(disp,gc,0);
XSetForeground(disp,or,1);
XFillRectangle(disp,m->mask,gc,0,0,m->width,m->height);
XSetForeground(disp,gc,1);
for(i=0;i<m->num_items;i++)
{
if (m->items[i])
{
if (m->items[i]->unsel_mask)
XCopyArea(disp,m->items[i]->unsel_mask,m->mask,or,
0,0,m->items[i]->width,m->items[i]->height,
m->items[i]->x,m->items[i]->y);
else
XFillRectangle(disp,m->mask,gc,m->items[i]->x,
m->items[i]->y,m->items[i]->width,
m->items[i]->height);
XReparentWindow(disp,m->items[i]->win,m->win,
m->items[i]->x,m->items[i]->y);
XMapWindow(disp,m->items[i]->win);
}
}
XShapeCombineMask(disp,m->win,ShapeBounding,0,0,m->mask,ShapeSet);
XFreeGC(disp,gc);
XFreeGC(disp,or);
}
MenuItem *CreateMenuItem(int type, int x, int y, int width, int height, char *text,
int text_x, int text_y, int text_w, int text_h,
char *unsel, ImColor *unsel_icl,
char *sel, ImColor *sel_icl)
{
MenuItem *mi;
Image *im1,*im2;
mi=malloc(sizeof(MenuItem));
mi->x=x;
mi->y=y;
mi->width=width;
mi->height=height;
mi->text=NULL;
mi->type=type;
mi->unsel_pmap=0;
mi->unsel_mask=0;
mi->sel_pmap=0;
mi->sel_mask=0;
if (mi->type==DECOR) sel=NULL;
mi->win=XCreateSimpleWindow(disp,root,0,0,mi->width,mi->height,0,0,0);
im1=LoadImage(imd,unsel,unsel_icl);
ImlibRender(imd,im1,mi->width,mi->height);
mi->unsel_pmap=ImlibMoveImageToPixmap(imd,im1);
mi->unsel_mask=ImlibMoveMaskToPixmap(imd,im1);
ImlibDestroyImage(imd,im1);
if (sel)
{
im2=LoadImage(imd,sel,sel_icl);
ImlibRender(imd,im2,mi->width,mi->height);
mi->sel_pmap=ImlibMoveImageToPixmap(imd,im2);
mi->sel_mask=ImlibMoveMaskToPixmap(imd,im2);
ImlibDestroyImage(imd,im2);
}
if (text)
{
mi->text=malloc(strlen(text)+1);
strcpy(mi->text,text);
DrawText(mi->unsel_pmap,mi->text,text_x,text_y,text_w,text_h);
if (mi->unsel_mask) DrawTextMask(mi->unsel_mask,mi->text,text_x,text_y,text_w,text_h);
if (mi->sel_pmap) DrawText(mi->sel_pmap,mi->text,text_x,text_y,text_w,text_h);
if (mi->sel_mask) DrawTextMask(mi->sel_mask,mi->text,text_x,text_y,text_w,text_h);
}
XSetWindowBackgroundPixmap(disp,mi->win,mi->unsel_pmap);
if (mi->unsel_mask)
XShapeCombineMask(disp,mi->win,ShapeBounding,0,0,mi->unsel_mask,ShapeSet);
return mi;
}
void DrawMenuItem(Menu *m, int num, int state)
{
XGCValues gcv;
GC gc;
GC or;
int i;
int in;
int inx,iny;
int xx1,xx2,yy1,yy2;
gcv.function=GXor;
gc=XCreateGC(disp,m->mask,0,&gcv);
or=XCreateGC(disp,m->mask,GCFunction,&gcv);
XSetForeground(disp,gc,0);
XSetForeground(disp,or,1);
XFillRectangle(disp,m->mask,gc,m->items[num]->x,m->items[num]->y,
m->items[num]->width,m->items[num]->height);
XSetForeground(disp,gc,1);
if (state==0)
{
XSetWindowBackgroundPixmap(disp,m->items[num]->win,m->items[num]->unsel_pmap);
if (m->items[num]->unsel_mask)
XShapeCombineMask(disp,m->items[num]->win,ShapeBounding,0,0,m->items[num]->unsel_mask,ShapeSet);
}
else
{
XSetWindowBackgroundPixmap(disp,m->items[num]->win,m->items[num]->sel_pmap);
if (m->items[num]->sel_mask)
XShapeCombineMask(disp,m->items[num]->win,ShapeBounding,0,0,m->items[num]->sel_mask,ShapeSet);
}
XClearWindow(disp,m->items[num]->win);
xx1=m->items[num]->x;
xx2=m->items[num]->x+m->items[num]->width;
yy1=m->items[num]->y;
yy2=m->items[num]->y+m->items[num]->height;
for(i=0;i<m->num_items;i++)
{
int x1,x2,y1,y2;
inx=0,iny=0;in=0;
x1=m->items[i]->x;
x2=m->items[i]->x+m->items[i]->width;
y1=m->items[i]->y;
y2=m->items[i]->y+m->items[i]->height;
if (((x1>=xx1)&&(x1<=xx2))||
((x2>=xx1)&&(x2<=xx2))||
((xx1>=x1)&&(xx2<=x2))) inx=1;
if (((y1>=yy1)&&(y1<=yy2))||
((y2>=yy1)&&(y2<=yy2))||
((yy1>=y1)&&(yy2<=y2))) iny=1;
if (inx&&iny) in=1;
if (in)
{
if ((i==num)&&(m->items[i]->type!=DECOR))
{
if (state==0)
{
if (m->items[i]->unsel_mask)
XCopyArea(disp,m->items[i]->unsel_mask,m->mask,or,
0,0,m->items[i]->width,m->items[i]->height,
m->items[i]->x,m->items[i]->y);
else
XFillRectangle(disp,m->mask,gc,m->items[i]->x,
m->items[i]->y,m->items[i]->width,
m->items[i]->height);
}
else
{
if (m->items[i]->sel_mask)
XCopyArea(disp,m->items[i]->sel_mask,m->mask,or,
0,0,m->items[i]->width,m->items[i]->height,
m->items[i]->x,m->items[i]->y);
else if (m->items[i]->type==DECOR)
XCopyArea(disp,m->items[i]->unsel_mask,m->mask,or,
0,0,m->items[i]->width,m->items[i]->height,
m->items[i]->x,m->items[i]->y);
else
XFillRectangle(disp,m->mask,gc,m->items[i]->x,
m->items[i]->y,m->items[i]->width,
m->items[i]->height);
}
}
else
{
if (m->items[i]->unsel_mask)
XCopyArea(disp,m->items[i]->unsel_mask,m->mask,or,
0,0,m->items[i]->width,m->items[i]->height,
m->items[i]->x,m->items[i]->y);
else
XFillRectangle(disp,m->mask,gc,m->items[i]->x,
m->items[i]->y,m->items[i]->width,
m->items[i]->height);
}
}
}
XShapeCombineMask(disp,m->win,ShapeBounding,0,0,m->mask,ShapeSet);
XFreeGC(disp,gc);
XFreeGC(disp,or);
XSync(disp,False);
}
void ShowMenu(Menu *menu)
{
XRaiseWindow(disp,menu->win);
XMapWindow(disp,menu->win);
XSync(disp,False);
}
void HideMenu(Menu *menu)
{
XUnmapWindow(disp,menu->win);
if (menu->sel_item>=0) DrawMenuItem(menu,menu->sel_item,0);
menu->sel_item=-1;
XSync(disp,False);
}
void HideAllMenus()
{
struct menulist *ptr;
ptr=mlist.next;
while(ptr)
{
HideMenu(ptr->menu);
ptr=ptr->next;
}
}