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