#include #include #include #include #include #include #include struct mainwin { int x; int y; int depth; int mousex; int mousey; int rmousex; int rmousey; int buttonpressed; int width; int height; int border_width; XColor green; Colormap color_map; } global; int mycmp(const void *a,const void *b) { // printf("comparing '%s' and '%s'\n",*(char **)a,*(char **)b); return strcmp(*(char **)a,*(char **)b); } char **ls(char *dir) { DIR *fd; char **files=malloc(sizeof(char *) * 1000); struct dirent *d; int i; fd = opendir("."); if (fd) { for (i=0;(d = readdir(fd)) != NULL;i++) { files[i]=strdup(d->d_name); } files[i]=0; closedir(fd); } //now to sort files in numerical order. // void qsort(void *base, size_t nmemb, size_t size, // int (*compar)(const void *, const void *)); qsort(files,i,sizeof(char *),mycmp); return files; } void freels(char **files) { int i; for(i=0;files[i];i++) { free(files[i]); } free(files); } void draw_screen(Display *dpy,Window w,GC gc) { int i; char **files; static int offset=0; XFontStruct *font=XLoadQueryFont(dpy,"fixed"); XCharStruct overall; int direction,ascent,descent; char coords[256]; int x,y; XEvent e; XClearWindow(dpy, w); snprintf(coords,sizeof(coords)-1,"x: %d y: %d",global.mousex,global.mousey); files=ls("."); for(i=0;files[i];i++) { XTextExtents(font,files[i],strlen(files[i]),&direction,&ascent,&descent,&overall); x=30; y=((ascent+descent)*(i+3))+offset; XDrawString(dpy,w,gc,x,y,files[i],strlen(files[i])); if(global.mousex > x && global.mousex < x+overall.width && global.mousey > y-ascent && global.mousey < y+descent) { if(global.buttonpressed) { if(chdir(files[i])) if(!fork()) execlp("xdg-open","xdg-open",files[i],0); else offset=0; } //top line XDrawLine(dpy,w,gc,0,y-ascent,x+overall.width,y-ascent); //bottom line XDrawLine(dpy,w,gc,x,y+descent,global.width,y+descent); //left line XDrawLine(dpy,w,gc,x,y-ascent,x,y+descent); //right line XDrawLine(dpy,w,gc,x+overall.width,y-ascent,x+overall.width,y+descent); } } // || // \||/ // \/ x=4; y=global.height-16; XDrawLine(dpy,w,gc,x+4+1,y+0+1,x+4+1,y+8+1); XDrawLine(dpy,w,gc,x+0+1,y+4+1,x+4+1,y+8+1); XDrawLine(dpy,w,gc,x+8+1,y+4+1,x+4+1,y+8+1); if(global.mousex > x && global.mousex < x+10 && global.mousey > y && global.mousey < y+10) { if(global.buttonpressed) { offset-=40; } XDrawLine(dpy,w,gc,x,y,x+10,y); XDrawLine(dpy,w,gc,x,y+10,x+10,y+10); XDrawLine(dpy,w,gc,x,y,x,y+10); XDrawLine(dpy,w,gc,x+10,y,x+10,y+10); } // /\ // /||\ // || x=4; y=16; XDrawLine(dpy,w,gc,x+4+1,y+0+1,x+4+1,y+8+1); XDrawLine(dpy,w,gc,x+0+1,y+4+1,x+4+1,y+0+1); XDrawLine(dpy,w,gc,x+8+1,y+4+1,x+4+1,y+0+1); if(global.mousex > x && global.mousex < x+10 && global.mousey > y && global.mousey < y+10) { if(global.buttonpressed) { offset+=40; } XDrawLine(dpy,w,gc,x,y,x+10,y); XDrawLine(dpy,w,gc,x,y+10,x+10,y+10); XDrawLine(dpy,w,gc,x,y,x,y+10); XDrawLine(dpy,w,gc,x+10,y,x+10,y+10); } XDrawString(dpy,w,gc,0,0+ascent,coords,strlen(coords)); XFlush(dpy); } int main(int argc,char *argv[]) { Display *dpy = XOpenDisplay(0); assert(dpy); unsigned int mask; XEvent e; XSetWindowAttributes attributes; int blackColor = BlackPixel(dpy, DefaultScreen(dpy)); int whiteColor = //WhitePixel(dpy, DefaultScreen(dpy)); attributes.background_pixel=blackColor; Window w = XCreateWindow(dpy,DefaultRootWindow(dpy),0,0,500,400,1,DefaultDepth(dpy,DefaultScreen(dpy)),InputOutput,DefaultVisual(dpy,DefaultScreen(dpy))\ ,CWBackPixel, &attributes); Window root,child; XSelectInput(dpy, w, PointerMotionMask|StructureNotifyMask|ButtonPressMask|ButtonReleaseMask|ResizeRedirectMask); XMapWindow(dpy, w); XStoreName(dpy,w,"hackhackhack"); GC gc = XCreateGC(dpy, w, 0, 0); global.color_map=DefaultColormap(dpy, DefaultScreen(dpy)); XAllocNamedColor(dpy, global.color_map, "green", &global.green, &global.green); XSetForeground(dpy, gc, global.green.pixel); // XSetForeground(dpy, gc, whiteColor); for(;;) { draw_screen(dpy,w,gc); XNextEvent(dpy, &e); switch(e.type) { case MotionNotify: XQueryPointer(dpy,w,&root,&child,&global.rmousex,&global.rmousey,&global.mousex,&global.mousey,&mask); break; case ButtonPress: global.buttonpressed=e.xbutton.button; break; case ButtonRelease: global.buttonpressed=0; break; case ResizeRequest: XGetGeometry(dpy,w,&root,&global.x,&global.y,&global.width,&global.height,&global.border_width,&global.depth); default: break; } } return 0; }