]> icculus.org git repositories - dana/openbox.git/blob - util/bsetroot.cc
This commit was manufactured by cvs2svn to create tag
[dana/openbox.git] / util / bsetroot.cc
1 #ifdef    HAVE_CONFIG_H
2 #  include "../config.h"
3 #endif // HAVE_CONFIG_H
4
5 #ifdef    HAVE_STRING_H
6 #  include <string.h>
7 #endif // HAVE_STRING_H
8
9 #ifdef    HAVE_STDLIB_H
10 #  include <stdlib.h>
11 #endif // HAVE_STDLIB_H
12
13 #ifdef    HAVE_STDIO_H
14 #  include <stdio.h>
15 #endif // HAVE_STDIO_H
16
17 #include "../src/i18n.h"
18 #include "bsetroot.h"
19
20
21 bsetroot::bsetroot(int argc, char **argv, char *dpy_name)
22   : BaseDisplay(argv[0], dpy_name)
23 {
24   pixmaps = (Pixmap *) 0;
25   grad = fore = back = (char *) 0;
26
27   Bool mod = False, sol = False, grd = False;
28   int mod_x = 0, mod_y = 0, i = 0;
29
30   img_ctrl = new BImageControl*[getNumberOfScreens()];
31   for (; i < getNumberOfScreens(); i++)
32     img_ctrl[i] = new BImageControl(*this, *getScreenInfo(i), True);
33
34   for (i = 1; i < argc; i++) {
35     if (! strcmp("-help", argv[i])) {
36       usage();
37     } else if ((! strcmp("-fg", argv[i])) ||
38                (! strcmp("-foreground", argv[i])) ||
39                (! strcmp("-from", argv[i]))) {
40       if ((++i) >= argc) usage(1);
41
42       fore = argv[i];
43     } else if ((! strcmp("-bg", argv[i])) ||
44                (! strcmp("-background", argv[i])) ||
45                (! strcmp("-to", argv[i]))) {
46       if ((++i) >= argc) usage(1);
47
48       back = argv[i];
49     } else if (! strcmp("-solid", argv[i])) {
50       if ((++i) >= argc) usage(1);
51
52       fore = argv[i];
53       sol = True;
54     } else if (! strcmp("-mod", argv[i])) {
55       if ((++i) >= argc) usage();
56
57       mod_x = atoi(argv[i]);
58
59       if ((++i) >= argc) usage();
60
61       mod_y = atoi(argv[i]);
62
63       if (mod_x < 1) mod_x = 1;
64       if (mod_y < 1) mod_y = 1;
65
66       mod = True;
67     } else if (! strcmp("-gradient", argv[i])) {
68       if ((++i) >= argc) usage();
69
70       grad = argv[i];
71       grd = True;
72     } else if (! strcmp("-display", argv[i])) {
73       // -display passed through tests ealier... we just skip it now
74       i++;
75     } else
76       usage();
77   }
78
79   if ((mod + sol + grd) != True) {
80     fprintf(stderr,
81             i18n->
82             getMessage(
83 #ifdef    NLS
84                        bsetrootSet, bsetrootMustSpecify,
85 #else // !NLS
86                        0, 0,
87 #endif // NLS
88                        "%s: error: must specify one of: -solid, -mod, -gradient\n"),
89             getApplicationName());
90     
91     usage(2);
92   }
93   
94   if (sol && fore) solid();
95   else if (mod && mod_x && mod_y && fore && back) modula(mod_x, mod_y);
96   else if (grd && grad && fore && back) gradient();
97   else usage();
98 }
99
100
101 bsetroot::~bsetroot(void) {
102   XKillClient(getXDisplay(), AllTemporary);
103
104   if (pixmaps) {
105     int i;
106     for (i = 0; i < getNumberOfScreens(); i++)
107       if (pixmaps[i] != None) {
108         XSetCloseDownMode(getXDisplay(), RetainTemporary);
109         break;
110       }
111
112     delete [] pixmaps;
113   }
114
115   if (img_ctrl) {
116     int i = 0;
117     for (; i < getNumberOfScreens(); i++)
118       delete img_ctrl[i];
119
120     delete [] img_ctrl;
121   }
122 }
123
124
125 void bsetroot::solid(void) {
126   register int screen = 0;
127
128   for (; screen < getNumberOfScreens(); screen++) {
129     BColor c;
130
131     img_ctrl[screen]->parseColor(&c, fore);
132     if (! c.isAllocated()) c.setPixel(BlackPixel(getXDisplay(), screen));
133
134     XSetWindowBackground(getXDisplay(), getScreenInfo(screen)->getRootWindow(),
135                          c.getPixel());
136     XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow());
137   }
138 }
139
140
141 void bsetroot::modula(int x, int y) {
142   char data[32];
143   long pattern;
144
145   register int screen, i;
146
147   pixmaps = new Pixmap[getNumberOfScreens()];
148
149   for (pattern = 0, screen = 0; screen < getNumberOfScreens(); screen++) {
150     for (i = 0; i < 16; i++) {
151       pattern <<= 1;
152       if ((i % x) == 0)
153         pattern |= 0x0001;
154     }
155
156     for (i = 0; i < 16; i++)
157       if ((i %  y) == 0) {
158         data[(i * 2)] = (char) 0xff;
159         data[(i * 2) + 1] = (char) 0xff;
160       } else {
161         data[(i * 2)] = pattern & 0xff;
162         data[(i * 2) + 1] = (pattern >> 8) & 0xff;
163       }
164
165     BColor f, b;
166     GC gc;
167     Pixmap bitmap;
168     XGCValues gcv;
169
170     bitmap =
171       XCreateBitmapFromData(getXDisplay(),
172                             getScreenInfo(screen)->getRootWindow(), data,
173                             16, 16);
174
175     img_ctrl[screen]->parseColor(&f, fore);
176     img_ctrl[screen]->parseColor(&b, back);
177
178     if (! f.isAllocated()) f.setPixel(WhitePixel(getXDisplay(), screen));
179     if (! b.isAllocated()) b.setPixel(BlackPixel(getXDisplay(), screen));
180
181     gcv.foreground = f.getPixel();
182     gcv.background = b.getPixel();
183
184     gc = XCreateGC(getXDisplay(), getScreenInfo(screen)->getRootWindow(),
185                    GCForeground | GCBackground, &gcv);
186
187     pixmaps[screen] =
188       XCreatePixmap(getXDisplay(), getScreenInfo(screen)->getRootWindow(),
189                     16, 16, getScreenInfo(screen)->getDepth());
190
191     XCopyPlane(getXDisplay(), bitmap, pixmaps[screen], gc,
192                0, 0, 16, 16, 0, 0, 1l);
193     XSetWindowBackgroundPixmap(getXDisplay(),
194                                getScreenInfo(screen)->getRootWindow(),
195                                pixmaps[screen]);
196     XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow());
197
198     XFreeGC(getXDisplay(), gc);
199     XFreePixmap(getXDisplay(), bitmap);
200
201     if (! (getScreenInfo(screen)->getVisual()->c_class & 1)) {
202       XFreePixmap(getXDisplay(), pixmaps[screen]);
203       pixmaps[screen] = None;
204     }
205   }
206 }
207
208
209 void bsetroot::gradient(void) {
210   register int screen;
211
212   pixmaps = new Pixmap[getNumberOfScreens()];
213
214   for (screen = 0; screen < getNumberOfScreens(); screen++) {
215     BTexture texture;
216     img_ctrl[screen]->parseTexture(&texture, grad);
217     img_ctrl[screen]->parseColor(texture.getColor(), fore);
218     img_ctrl[screen]->parseColor(texture.getColorTo(), back);
219
220     if (! texture.getColor()->isAllocated())
221       texture.getColor()->setPixel(WhitePixel(getXDisplay(), screen));
222     if (! texture.getColorTo()->isAllocated())
223       texture.getColorTo()->setPixel(BlackPixel(getXDisplay(), screen));
224
225     pixmaps[screen] =
226       img_ctrl[screen]->renderImage(getScreenInfo(screen)->size().w(),
227                                     getScreenInfo(screen)->size().h(),
228                                     &texture);
229
230     XSetWindowBackgroundPixmap(getXDisplay(),
231                                getScreenInfo(screen)->getRootWindow(),
232                                pixmaps[screen]);
233     XClearWindow(getXDisplay(), getScreenInfo(screen)->getRootWindow());
234
235     if (! (getScreenInfo(screen)->getVisual()->c_class & 1)) {
236       img_ctrl[screen]->removeImage(pixmaps[screen]);
237       img_ctrl[screen]->timeout();
238       pixmaps[screen] = None;
239     }
240   }
241 }
242
243
244 void bsetroot::usage(int exit_code) {
245   fprintf(stderr,
246           i18n->
247           getMessage(
248 #ifdef    NLS
249                      bsetrootSet, bsetrootUsage,
250 #else // !NLS
251                      0, 0,
252 #endif // NLS
253                      "%s 2.0 : (c) 1997-1999 Brad Hughes\n\n"
254                      "  -display <string>        display connection\n"
255                      "  -mod <x> <y>             modula pattern\n"
256                      "  -foreground, -fg <color> modula foreground color\n"
257                      "  -background, -bg <color> modula background color\n\n"
258                      "  -gradient <texture>      gradient texture\n"
259                      "  -from <color>            gradient start color\n"
260                      "  -to <color>              gradient end color\n\n"
261                      "  -solid <color>           solid color\n\n"
262                      "  -help                    print this help text and exit\n"),
263           getApplicationName());
264   
265   exit(exit_code);
266 }
267
268
269 int main(int argc, char **argv) {
270   char *display_name = (char *) 0;
271   int i = 1;
272   
273   NLSInit("openbox.cat");
274   
275   for (; i < argc; i++) {
276     if (! strcmp(argv[i], "-display")) {
277       // check for -display option
278       
279       if ((++i) >= argc) {
280         fprintf(stderr,
281                 i18n->getMessage(
282 #ifdef    NLS
283                                  mainSet, mainDISPLAYRequiresArg,
284 #else // !NLS
285                                  0, 0,
286 #endif // NLS
287                                  "error: '-display' requires an argument\n"));
288         
289         ::exit(1);
290       }
291       
292       display_name = argv[i];
293     }
294   }
295   
296   bsetroot app(argc, argv, display_name);
297   
298   return 0;
299 }