/*button.c*/
#include
#include
#include
#include
#include
#include
#include
extern Display* display;
extern int screen;
XFontStruct *fontinfo;
GC gr_context;
#include "button.h"
void CreatButtonGC(BUTTON* but)
{
XGCValues gr_values;
XColor color,dummy;
fontinfo = XLoadQueryFont(display,BUTTON_FONT);
XAllocNamedColor(display,DefaultColormap(display,DefaultScreendisplay)),
BUTTON_FT_COLOT,&color,&dummy);
gr_values.font = fontinfo->fid;
gr_values.foreground = color.pixel;
gr_context=XCreateGC(display,but->window,GCFont+GCForeground, &gr_values);
but->gc = gr_context;
}
BUTTON* MakeButton(win,type,startx,starty,w,h,label,fun,id,img1,img2)
int id;
int type;
int startx,starty;
int w,h;
char *label;
int (*fun)();
Window win;
char* img1;
char* img2;
{
BUTTON* but;
Cursor tempcursor;
int status;
XSetWindowAttributes setwinattr;
but=(BUTTON *)malloc(sizeof(BUTTON));
if(!but)
{
// Error("memery error:%s %s",__FILE__,__LINE___);
return NULL;
}
but->id =id;
but->parent=win;
if(type == SB_FOCUS)
but->focus=FOCUS_OUT;
else
but->focus=FOCUS_NONE;
if(type == SB_NORMAL)
but->isdown=BUTTON_UP;
else
but->isdown=BUTTON_NONE;
but->type=type;
but->startx=startx;
but->starty=starty;
but->width =w;
but->height=h;
if(label)
strncpy(but->label,label,SB_LONGLABEL);
but->func = fun;
but->window = XCreateSimpleWindow(display,win,
startx,starty,
w,h,0,BlackPixel(display,screen),WhitePixel(display,screen));
CreatButtonGC(but);
XSelectInput(display,but->window,SB_INPUTMASK );
tempcursor = XCreateFontCursor(display,SB_CURSOR);
XDefineCursor(display,but->window,tempcursor);
// load the xpm images
status=XpmReadFileToImage(display,img1,&but->normal,NULL,NULL);
if(status != XpmSuccess)
{
ERROR("XpmError when laod %s:%s
",img1,XpmGetErrorString(status));
return NULL;
}
status=XpmReadFileToImage(display,img2,&but->grey,NULL,NULL);
if(status != XpmSuccess)
{
ERROR("XpmError when laod %s:%s
",img2,XpmGetErrorString(status));
return NULL;
}
setwinattr.backing_store = Always;
XChangeWindowAttributes(display,but->window,CWBackingStore,&setwinattr);
XMapWindow(display,but->window);
return but;
}
void ExposeButton(BUTTON* but)
{
int width,center;
XClearWindow(display,but->window);
if(but->type == SB_FOCUS)
{
if(but->focus)
XPutImage(display,but->window,gr_context,but->normal,0,0,0,0,
but->width,but->height);
else
XPutImage(display,but->window,gr_context,but->grey,0,0,0,0,
but->width,but->height);
}
else if(but->type == SB_NORMAL)
{
if(but->isdown)
XPutImage(display,but->window,gr_context,but->grey,0,0,0,0,
but->width,but->height);
else
XPutImage(display,but->window,gr_context,but->normal,0,0,0,0,
but->width,but->height);
}
if(but->label)
{
width = XTextWidth(fontinfo,but->label,strlen(but->label));
center = (but->width-width)/2;
XDrawString(display,but->window,but->gc,center,
fontinfo->ascent,but->label,strlen(but->label));
}
XFlush(display);
}
int HandleButton(but,event)
BUTTON* but;
XEvent *event;
{
switch(event->type)
{
case Expose:
ExposeButton(but);
break;
case EnterNotify:
if(but->type == SB_FOCUS)
{
but->focus=FOCUS_IN;
ExposeButton(but);
}
break;
case LeaveNotify:
if(but->type == SB_FOCUS)
{
but->focus=FOCUS_OUT;
ExposeButton(but);
}
break;
case ButtonPress:
if(but->type == SB_NORMAL)
{
but->isdown=BUTTON_DOWN;
ExposeButton(but);
}
break;
case ButtonRelease:
but->func();
if(but->type == SB_NORMAL)
{
but->isdown=BUTTON_UP;
ExposeButton(but);
}
break;
default:
break;
}
}
void FreeButton(BUTTON* but)
{
if(!but) return;
if(but->label) free(but->label);
if(but->normal) XDestroyImage(but->normal);
if(but->grey) XDestroyImage(but->grey);
}
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一篇:Linux inode cache分析
下一篇:目录项缓存dcache
【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】
更多相关文章
|
|