1 #include<time.h>
2 #include<stdlib.h>
3 #include<sys/time.h>
4 #include<unistd.h>
5 
6 #include "image.h"
7 
8 Display *dpy;
9 Window root;
10 int scrn;
11 unsigned int depth;
12 GC gc;
13 
14 void
sleep_us(long us)15 sleep_us( long us )
16 {
17 	struct timeval t;
18 	t.tv_sec  = 0;
19 	t.tv_usec = us;
20 	select( 0,NULL,NULL,NULL,&t );
21 }
22 
23 void
main(int ac,char ** av)24 main(int ac,char **av){
25   Pixmap bkup,work,pixmap;
26   int width = 96;
27   int height = 104;
28   int x,y;
29   int gx,gy,gw,gh,gf = 0;
30   int i;
31   int r;
32   int w;
33   int h;
34   int p_w;
35   int p_h;
36   int repeat_flag = 1;
37   char *fname = NULL;
38   char *dpy_name = NULL;
39   char *fg = NULL;
40   char *bg = NULL;
41   unsigned long fgp,bgp;
42   int fl = 1;
43   static char *usage =
44     "Usege : %s [options] file\n"
45     "  options\n"
46     "    -display  <disp> : display\n"
47     "    -geometry <geom> : geometry\n"
48     "    -v               : verbose mode\n"
49     "    -fg <color>      : foreground color\n"
50     "    -bg <color>      : background color\n"
51     "    -repeat <n>      : repeat\n"
52     "    -nooverride      : on root window only\n";
53   for(i=1;i<ac;i++){
54     if( av[i][0] == '-' ){
55       switch( av[i][1] ){
56        case 'd':
57 	if( ++i < ac ){
58 	  dpy_name = av[i];
59 	}
60 	break;
61        case 'g':
62 	if( ++i < ac ){
63 	  gf = XParseGeometry( av[i],&gx,&gy,&gw,&gh );
64 	}
65 	break;
66        case 'v':
67 	set_verbose(1);
68 	break;
69        case 'f':
70 	if( ++i < ac ){
71 	  fg = av[i];
72 	}
73 	break;
74        case 'b':
75 	if( ++i < ac ){
76 	  bg = av[i];
77 	}
78 	break;
79        case 'r':
80 	if( ++i < ac ){
81 	  repeat_flag = atoi(av[i]);
82 	}
83 	break;
84        case 'n':
85 	fl = 0;
86 	break;
87        default:
88 	err_out( usage, av[0] );
89 	exit(1);
90       }
91     }else
92       fname = av[i];
93   }
94   if( (dpy = XOpenDisplay( dpy_name )) == NULL ){
95     err_out("Cant Open Display!\n");
96     exit(1);
97   }
98   scrn  = DefaultScreen(dpy);
99   root = RootWindow(dpy,scrn);
100   depth	= DefaultDepth(dpy,scrn);
101   w = DisplayWidth(dpy,scrn);
102   h = DisplayHeight(dpy,scrn);
103 
104   gc = XCreateGC(dpy,root,0,NULL);
105   if(fl)
106     XSetSubwindowMode(dpy,gc,IncludeInferiors);
107   if( fg != NULL ){
108     XColor c,e;
109     XAllocNamedColor(dpy,DefaultColormap(dpy,scrn),fg,&c,&e);
110     fgp = c.pixel;
111   }else
112     fgp = BlackPixel(dpy,scrn);
113   if( bg != NULL ){
114     XColor c,e;
115     XAllocNamedColor(dpy,DefaultColormap(dpy,scrn),bg,&c,&e);
116     bgp = c.pixel;
117   }else
118     bgp = BlackPixel(dpy,scrn);
119   XSetForeground(dpy,gc,bgp);
120 
121   srand((int)time(NULL));
122 
123   if(fname != NULL) {
124 	ImageData *base = image_new();
125     image_load(base,fname,-1,-1);
126     if( base->data == NULL ){
127       err_out("Can't open %s\n",fname );
128       exit(1);
129     }
130     image_set_col(base, dpy, root);
131     p_w = base->width;
132     p_h = base->height;
133     pixmap = image_pixmap(base,NULL);
134     image_free_data(base);
135   }
136   else {
137     if((gf&(WidthValue|HeightValue)) == (WidthValue|HeightValue)) {
138       p_w = gw;
139       p_h = gh;
140     } else {
141       p_w = rand()%(w/2+16);
142       p_h = rand()%(w/2+16);
143     }
144     pixmap = XCreatePixmap(dpy,root,p_w,p_h,depth);
145     XFillRectangle(dpy,pixmap,gc,0,0,p_w,p_h);
146   }
147   XSetForeground(dpy,gc,fgp);
148   do {
149     width = p_w+2;
150     height = p_h+2;
151     if((gf&(XValue|YValue)) == (XValue|YValue)) {
152       x = gx;
153       y = gy;
154     } else {
155       x = rand()%(w-width);
156       y = rand()%(h-height);
157     }
158     bkup = XCreatePixmap(dpy,root,width,height,depth);
159     work = XCreatePixmap(dpy,root,width,height,depth);
160 
161     XCopyArea(dpy,root,bkup,gc,x,y,width,height,0,0);
162     XCopyArea(dpy,bkup,work,gc,0,0,width,height,0,0);
163     XDrawRectangle(dpy,work,gc,0,0,width-1,height-1);
164     XCopyArea(dpy,work,root,gc,0,0,width,height,x,y);
165     XSync(dpy,True);
166 
167     sleep(1);
168     for(r=0;r<width;r+=width/64+1) {
169       XCopyArea(dpy,pixmap,work,gc,0,0,p_w,p_h,1,1);
170       XCopyArea(dpy,bkup,work,gc,0,0,width,height,r,0);
171       XDrawRectangle(dpy,work,gc,0,0,width-1,height-1);
172       XCopyArea(dpy,work,root,gc,0,0,width,height,x,y);
173       XSync(dpy,True);
174       sleep_us(10000);
175     }
176     XCopyArea(dpy,pixmap,work,gc,0,0,p_w,p_h,1,1);
177     XDrawRectangle(dpy,work,gc,0,0,width-1,height-1);
178     XCopyArea(dpy,work,root,gc,0,0,width,height,x,y);
179     XSync(dpy,True);
180     sleep(1);
181     for(;r>=0;r-=width/64+1) {
182       XCopyArea(dpy,pixmap,work,gc,0,0,p_w,p_h,1,1);
183       XCopyArea(dpy,bkup,work,gc,0,0,width,height,r,0);
184       XDrawRectangle(dpy,work,gc,0,0,width-1,height-1);
185       XCopyArea(dpy,work,root,gc,0,0,width,height,x,y);
186       XSync(dpy,True);
187       sleep_us(10000);
188     }
189     XCopyArea(dpy,bkup,work,gc,0,0,width,height,0,0);
190     XDrawRectangle(dpy,work,gc,0,0,width-1,height-1);
191     XCopyArea(dpy,work,root,gc,0,0,width,height,x,y);
192     XSync(dpy,True);
193     sleep(1);
194     XCopyArea(dpy,bkup,root,gc,0,0,width,height,x,y);
195     XSync(dpy,True);
196     XFreePixmap(dpy,bkup);
197     XFreePixmap(dpy,work);
198   } while(--repeat_flag > 0);
199 }
200