]>
Dogcows Code - chaz/openbox/blob - util/bsetroot.cc
1 // -*- mode++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // bsetroot.cc for Blackbox - an X11 Window manager
3 // Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry <shaleh at debian.org>
4 // Copyright (c) 1997 - 2000, 2002 Brad Hughes <bhughes at trolltech.com>
6 // Permission is hereby granted, free of charge, to any person obtaining a
7 // copy of this software and associated documentation files (the "Software"),
8 // to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 // and/or sell copies of the Software, and to permit persons to whom the
11 // Software is furnished to do so, subject to the following conditions:
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 // DEALINGS IN THE SOFTWARE.
25 # include "../config.h"
26 #endif // HAVE_CONFIG_H
31 #endif // HAVE_STDLIB_H
35 #endif // HAVE_STRING_H
39 #endif // HAVE_STDIO_H
44 #include "../src/i18n.hh"
45 #include "../src/GCCache.hh"
46 #include "../src/Texture.hh"
47 #include "../src/Util.hh"
48 #include "bsetroot.hh"
53 bsetroot::bsetroot(int argc
, char **argv
, char *dpy_name
)
54 : BaseDisplay(argv
[0], dpy_name
) {
56 bool mod
= False
, sol
= False
, grd
= False
;
57 int mod_x
= 0, mod_y
= 0;
59 for (int i
= 1; i
< argc
; i
++) {
60 if (! strcmp("-help", argv
[i
])) {
62 } else if ((! strcmp("-fg", argv
[i
])) ||
63 (! strcmp("-foreground", argv
[i
])) ||
64 (! strcmp("-from", argv
[i
]))) {
65 if ((++i
) >= argc
) usage(1);
68 } else if ((! strcmp("-bg", argv
[i
])) ||
69 (! strcmp("-background", argv
[i
])) ||
70 (! strcmp("-to", argv
[i
]))) {
71 if ((++i
) >= argc
) usage(1);
74 } else if (! strcmp("-solid", argv
[i
])) {
75 if ((++i
) >= argc
) usage(1);
79 } else if (! strcmp("-mod", argv
[i
])) {
80 if ((++i
) >= argc
) usage();
82 mod_x
= atoi(argv
[i
]);
84 if ((++i
) >= argc
) usage();
86 mod_y
= atoi(argv
[i
]);
88 if (mod_x
< 1) mod_x
= 1;
89 if (mod_y
< 1) mod_y
= 1;
92 } else if (! strcmp("-gradient", argv
[i
])) {
93 if ((++i
) >= argc
) usage();
97 } else if (! strcmp("-display", argv
[i
])) {
98 // -display passed through tests ealier... we just skip it now
105 if ((mod
+ sol
+ grd
) != True
) {
107 i18n(bsetrootSet
, bsetrootMustSpecify
,
108 "%s: error: must specify one of: -solid, -mod, -gradient\n"),
109 getApplicationName());
114 img_ctrl
= new BImageControl
*[getNumberOfScreens()];
115 for (unsigned int s
= 0; s
< getNumberOfScreens(); ++s
)
116 img_ctrl
[s
] = new BImageControl(this, getScreenInfo(s
), True
);
118 if (sol
&& ! fore
.empty())
120 else if (mod
&& mod_x
&& mod_y
&& ! (fore
.empty() || back
.empty()))
121 modula(mod_x
, mod_y
);
122 else if (grd
&& ! (grad
.empty() || fore
.empty() || back
.empty()))
128 bsetroot::~bsetroot(void) {
129 XSetCloseDownMode(getXDisplay(), RetainPermanent
);
131 XKillClient(getXDisplay(), AllTemporary
);
133 std::for_each(img_ctrl
, img_ctrl
+ getNumberOfScreens(), PointerAssassin());
139 // adapted from wmsetbg
140 void bsetroot::setPixmapProperty(int screen
, Pixmap pixmap
) {
141 static Atom rootpmap_id
= None
, esetroot_id
= None
;
144 unsigned long length
, after
;
146 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
148 if (rootpmap_id
== None
) {
149 rootpmap_id
= XInternAtom(getXDisplay(), "_XROOTPMAP_ID", False
);
150 esetroot_id
= XInternAtom(getXDisplay(), "ESETROOT_PMAP_ID", False
);
153 XGrabServer(getXDisplay());
155 /* Clear out the old pixmap */
156 XGetWindowProperty(getXDisplay(), screen_info
->getRootWindow(),
157 rootpmap_id
, 0L, 1L, False
, AnyPropertyType
,
158 &type
, &format
, &length
, &after
, &data
);
160 if ((type
== XA_PIXMAP
) && (format
== 32) && (length
== 1)) {
161 unsigned char* data_esetroot
= 0;
162 XGetWindowProperty(getXDisplay(), screen_info
->getRootWindow(),
163 esetroot_id
, 0L, 1L, False
, AnyPropertyType
,
164 &type
, &format
, &length
, &after
, &data_esetroot
);
165 if (data
&& data_esetroot
&& *((Pixmap
*) data
)) {
166 XKillClient(getXDisplay(), *((Pixmap
*) data
));
167 XSync(getXDisplay(), False
);
168 XFree(data_esetroot
);
174 XChangeProperty(getXDisplay(), screen_info
->getRootWindow(),
175 rootpmap_id
, XA_PIXMAP
, 32, PropModeReplace
,
176 (unsigned char *) &pixmap
, 1);
177 XChangeProperty(getXDisplay(), screen_info
->getRootWindow(),
178 esetroot_id
, XA_PIXMAP
, 32, PropModeReplace
,
179 (unsigned char *) &pixmap
, 1);
181 XDeleteProperty(getXDisplay(), screen_info
->getRootWindow(),
183 XDeleteProperty(getXDisplay(), screen_info
->getRootWindow(),
187 XUngrabServer(getXDisplay());
188 XFlush(getXDisplay());
192 // adapted from wmsetbg
193 Pixmap
bsetroot::duplicatePixmap(int screen
, Pixmap pixmap
,
194 int width
, int height
) {
195 XSync(getXDisplay(), False
);
197 Pixmap copyP
= XCreatePixmap(getXDisplay(),
198 getScreenInfo(screen
)->getRootWindow(),
200 DefaultDepth(getXDisplay(), screen
));
201 XCopyArea(getXDisplay(), pixmap
, copyP
, DefaultGC(getXDisplay(), screen
),
202 0, 0, width
, height
, 0, 0);
203 XSync(getXDisplay(), False
);
209 void bsetroot::solid(void) {
210 for (unsigned int screen
= 0; screen
< getNumberOfScreens(); screen
++) {
211 BColor
c(fore
, this, screen
);
212 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
214 XSetWindowBackground(getXDisplay(), screen_info
->getRootWindow(),
216 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
218 Pixmap pixmap
= XCreatePixmap(getXDisplay(),
219 screen_info
->getRootWindow(),
220 8, 8, DefaultDepth(getXDisplay(), screen
));
222 XFillRectangle(getXDisplay(), pixmap
, pen
.gc(), 0, 0, 8, 8);
224 setPixmapProperty(screen
, duplicatePixmap(screen
, pixmap
, 8, 8));
226 XFreePixmap(getXDisplay(), pixmap
);
231 void bsetroot::modula(int x
, int y
) {
235 unsigned int screen
, i
;
237 for (pattern
= 0, screen
= 0; screen
< getNumberOfScreens(); screen
++) {
238 for (i
= 0; i
< 16; i
++) {
244 for (i
= 0; i
< 16; i
++) {
246 data
[(i
* 2)] = static_cast<char>(0xff);
247 data
[(i
* 2) + 1] = static_cast<char>(0xff);
249 data
[(i
* 2)] = pattern
& 0xff;
250 data
[(i
* 2) + 1] = (pattern
>> 8) & 0xff;
254 BColor
f(fore
, this, screen
), b(back
, this, screen
);
257 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
260 XCreateBitmapFromData(getXDisplay(),
261 screen_info
->getRootWindow(), data
,
265 gcv
.foreground
= f
.pixel();
266 gcv
.background
= b
.pixel();
268 gc
= XCreateGC(getXDisplay(), screen_info
->getRootWindow(),
269 GCForeground
| GCBackground
, &gcv
);
271 Pixmap pixmap
= XCreatePixmap(getXDisplay(),
272 screen_info
->getRootWindow(),
273 16, 16, screen_info
->getDepth());
275 XCopyPlane(getXDisplay(), bitmap
, pixmap
, gc
,
276 0, 0, 16, 16, 0, 0, 1l);
277 XSetWindowBackgroundPixmap(getXDisplay(),
278 screen_info
->getRootWindow(),
280 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
282 setPixmapProperty(screen
,
283 duplicatePixmap(screen
, pixmap
, 16, 16));
285 XFreeGC(getXDisplay(), gc
);
286 XFreePixmap(getXDisplay(), bitmap
);
288 if (! (screen_info
->getVisual()->c_class
& 1))
289 XFreePixmap(getXDisplay(), pixmap
);
294 void bsetroot::gradient(void) {
296 we have to be sure that neither raised nor sunken is specified otherwise
297 odd looking borders appear. So we convert to lowercase then look for
298 'raised' or 'sunken' in the description and erase them. To be paranoid
299 the search is done in a loop.
302 descr
.reserve(grad
.size());
304 std::string::const_iterator it
= grad
.begin(), end
= grad
.end();
305 for (; it
!= end
; ++it
)
306 descr
+= std::tolower(*it
);
308 std::string::size_type pos
;
309 while ((pos
= descr
.find("raised")) != std::string::npos
)
310 descr
.erase(pos
, 6); // 6 is strlen raised
312 while ((pos
= descr
.find("sunken")) != std::string::npos
)
315 // now add on 'flat' to prevent the bevels from being added
318 for (unsigned int screen
= 0; screen
< getNumberOfScreens(); screen
++) {
319 BTexture
texture(descr
, this, screen
, img_ctrl
[screen
]);
320 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
322 texture
.setColor(BColor(fore
, this, screen
));
323 texture
.setColorTo(BColor(back
, this, screen
));
326 img_ctrl
[screen
]->renderImage(screen_info
->getWidth(),
327 screen_info
->getHeight(),
330 XSetWindowBackgroundPixmap(getXDisplay(),
331 screen_info
->getRootWindow(),
333 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
335 setPixmapProperty(screen
,
336 duplicatePixmap(screen
, pixmap
,
337 screen_info
->getWidth(),
338 screen_info
->getHeight()));
340 if (! (screen_info
->getVisual()->c_class
& 1)) {
341 img_ctrl
[screen
]->removeImage(pixmap
);
347 void bsetroot::usage(int exit_code
) {
349 i18n(bsetrootSet
, bsetrootUsage
,
351 "Copyright (c) 1997-2000, 2002 Bradley T Hughes\n"
352 "Copyright (c) 2001-2002 Sean 'Shaleh' Perry\n\n"
353 " -display <string> display connection\n"
354 " -mod <x> <y> modula pattern\n"
355 " -foreground, -fg <color> modula foreground color\n"
356 " -background, -bg <color> modula background color\n\n"
357 " -gradient <texture> gradient texture\n"
358 " -from <color> gradient start color\n"
359 " -to <color> gradient end color\n\n"
360 " -solid <color> solid color\n\n"
361 " -help print this help text and exit\n"),
362 getApplicationName());
367 int main(int argc
, char **argv
) {
368 char *display_name
= (char *) 0;
370 i18n
.openCatalog("openbox.cat");
372 for (int i
= 1; i
< argc
; i
++) {
373 if (! strcmp(argv
[i
], "-display")) {
374 // check for -display option
377 fprintf(stderr
, i18n(mainSet
, mainDISPLAYRequiresArg
,
378 "error: '-display' requires an argument\n"));
383 display_name
= argv
[i
];
387 bsetroot
app(argc
, argv
, display_name
);
This page took 0.050588 seconds and 4 git commands to generate.