]>
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
43 #endif // HAVE_CTYPE_H
46 #include "../src/i18n.hh"
47 #include "../src/GCCache.hh"
48 #include "../src/Texture.hh"
49 #include "../src/Util.hh"
50 #include "bsetroot.hh"
55 bsetroot::bsetroot(int argc
, char **argv
, char *dpy_name
)
56 : BaseDisplay(argv
[0], dpy_name
) {
58 bool mod
= False
, sol
= False
, grd
= False
;
59 int mod_x
= 0, mod_y
= 0;
61 for (int i
= 1; i
< argc
; i
++) {
62 if (! strcmp("-help", argv
[i
])) {
64 } else if ((! strcmp("-fg", argv
[i
])) ||
65 (! strcmp("-foreground", argv
[i
])) ||
66 (! strcmp("-from", argv
[i
]))) {
67 if ((++i
) >= argc
) usage(1);
70 } else if ((! strcmp("-bg", argv
[i
])) ||
71 (! strcmp("-background", argv
[i
])) ||
72 (! strcmp("-to", argv
[i
]))) {
73 if ((++i
) >= argc
) usage(1);
76 } else if (! strcmp("-solid", argv
[i
])) {
77 if ((++i
) >= argc
) usage(1);
81 } else if (! strcmp("-mod", argv
[i
])) {
82 if ((++i
) >= argc
) usage();
84 mod_x
= atoi(argv
[i
]);
86 if ((++i
) >= argc
) usage();
88 mod_y
= atoi(argv
[i
]);
90 if (mod_x
< 1) mod_x
= 1;
91 if (mod_y
< 1) mod_y
= 1;
94 } else if (! strcmp("-gradient", argv
[i
])) {
95 if ((++i
) >= argc
) usage();
99 } else if (! strcmp("-display", argv
[i
])) {
100 // -display passed through tests ealier... we just skip it now
107 if ((mod
+ sol
+ grd
) != True
) {
109 i18n(bsetrootSet
, bsetrootMustSpecify
,
110 "%s: error: must specify one of: -solid, -mod, -gradient\n"),
111 getApplicationName());
116 img_ctrl
= new BImageControl
*[getNumberOfScreens()];
117 for (unsigned int s
= 0; s
< getNumberOfScreens(); ++s
)
118 img_ctrl
[s
] = new BImageControl(this, getScreenInfo(s
), True
);
120 if (sol
&& ! fore
.empty())
122 else if (mod
&& mod_x
&& mod_y
&& ! (fore
.empty() || back
.empty()))
123 modula(mod_x
, mod_y
);
124 else if (grd
&& ! (grad
.empty() || fore
.empty() || back
.empty()))
130 bsetroot::~bsetroot(void) {
131 XSetCloseDownMode(getXDisplay(), RetainPermanent
);
133 XKillClient(getXDisplay(), AllTemporary
);
135 std::for_each(img_ctrl
, img_ctrl
+ getNumberOfScreens(), PointerAssassin());
141 // adapted from wmsetbg
142 void bsetroot::setPixmapProperty(int screen
, Pixmap pixmap
) {
143 static Atom rootpmap_id
= None
, esetroot_id
= None
;
146 unsigned long length
, after
;
148 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
150 if (rootpmap_id
== None
) {
151 rootpmap_id
= XInternAtom(getXDisplay(), "_XROOTPMAP_ID", False
);
152 esetroot_id
= XInternAtom(getXDisplay(), "ESETROOT_PMAP_ID", False
);
155 XGrabServer(getXDisplay());
157 /* Clear out the old pixmap */
158 XGetWindowProperty(getXDisplay(), screen_info
->getRootWindow(),
159 rootpmap_id
, 0L, 1L, False
, AnyPropertyType
,
160 &type
, &format
, &length
, &after
, &data
);
162 if ((type
== XA_PIXMAP
) && (format
== 32) && (length
== 1)) {
163 unsigned char* data_esetroot
= 0;
164 XGetWindowProperty(getXDisplay(), screen_info
->getRootWindow(),
165 esetroot_id
, 0L, 1L, False
, AnyPropertyType
,
166 &type
, &format
, &length
, &after
, &data_esetroot
);
167 if (data
&& data_esetroot
&& *((Pixmap
*) data
)) {
168 XKillClient(getXDisplay(), *((Pixmap
*) data
));
169 XSync(getXDisplay(), False
);
170 XFree(data_esetroot
);
176 XChangeProperty(getXDisplay(), screen_info
->getRootWindow(),
177 rootpmap_id
, XA_PIXMAP
, 32, PropModeReplace
,
178 (unsigned char *) &pixmap
, 1);
179 XChangeProperty(getXDisplay(), screen_info
->getRootWindow(),
180 esetroot_id
, XA_PIXMAP
, 32, PropModeReplace
,
181 (unsigned char *) &pixmap
, 1);
183 XDeleteProperty(getXDisplay(), screen_info
->getRootWindow(),
185 XDeleteProperty(getXDisplay(), screen_info
->getRootWindow(),
189 XUngrabServer(getXDisplay());
190 XFlush(getXDisplay());
194 // adapted from wmsetbg
195 Pixmap
bsetroot::duplicatePixmap(int screen
, Pixmap pixmap
,
196 int width
, int height
) {
197 XSync(getXDisplay(), False
);
199 Pixmap copyP
= XCreatePixmap(getXDisplay(),
200 getScreenInfo(screen
)->getRootWindow(),
202 DefaultDepth(getXDisplay(), screen
));
203 XCopyArea(getXDisplay(), pixmap
, copyP
, DefaultGC(getXDisplay(), screen
),
204 0, 0, width
, height
, 0, 0);
205 XSync(getXDisplay(), False
);
211 void bsetroot::solid(void) {
212 for (unsigned int screen
= 0; screen
< getNumberOfScreens(); screen
++) {
213 BColor
c(fore
, this, screen
);
214 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
216 XSetWindowBackground(getXDisplay(), screen_info
->getRootWindow(),
218 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
220 Pixmap pixmap
= XCreatePixmap(getXDisplay(),
221 screen_info
->getRootWindow(),
222 8, 8, DefaultDepth(getXDisplay(), screen
));
224 XFillRectangle(getXDisplay(), pixmap
, pen
.gc(), 0, 0, 8, 8);
226 setPixmapProperty(screen
, duplicatePixmap(screen
, pixmap
, 8, 8));
228 XFreePixmap(getXDisplay(), pixmap
);
233 void bsetroot::modula(int x
, int y
) {
237 unsigned int screen
, i
;
239 for (pattern
= 0, screen
= 0; screen
< getNumberOfScreens(); screen
++) {
240 for (i
= 0; i
< 16; i
++) {
246 for (i
= 0; i
< 16; i
++) {
248 data
[(i
* 2)] = static_cast<char>(0xff);
249 data
[(i
* 2) + 1] = static_cast<char>(0xff);
251 data
[(i
* 2)] = pattern
& 0xff;
252 data
[(i
* 2) + 1] = (pattern
>> 8) & 0xff;
256 BColor
f(fore
, this, screen
), b(back
, this, screen
);
259 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
262 XCreateBitmapFromData(getXDisplay(),
263 screen_info
->getRootWindow(), data
,
267 gcv
.foreground
= f
.pixel();
268 gcv
.background
= b
.pixel();
270 gc
= XCreateGC(getXDisplay(), screen_info
->getRootWindow(),
271 GCForeground
| GCBackground
, &gcv
);
273 Pixmap pixmap
= XCreatePixmap(getXDisplay(),
274 screen_info
->getRootWindow(),
275 16, 16, screen_info
->getDepth());
277 XCopyPlane(getXDisplay(), bitmap
, pixmap
, gc
,
278 0, 0, 16, 16, 0, 0, 1l);
279 XSetWindowBackgroundPixmap(getXDisplay(),
280 screen_info
->getRootWindow(),
282 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
284 setPixmapProperty(screen
,
285 duplicatePixmap(screen
, pixmap
, 16, 16));
287 XFreeGC(getXDisplay(), gc
);
288 XFreePixmap(getXDisplay(), bitmap
);
290 if (! (screen_info
->getVisual()->c_class
& 1))
291 XFreePixmap(getXDisplay(), pixmap
);
296 void bsetroot::gradient(void) {
298 we have to be sure that neither raised nor sunken is specified otherwise
299 odd looking borders appear. So we convert to lowercase then look for
300 'raised' or 'sunken' in the description and erase them. To be paranoid
301 the search is done in a loop.
304 descr
.reserve(grad
.size());
306 std::string::const_iterator it
= grad
.begin(), end
= grad
.end();
307 for (; it
!= end
; ++it
)
308 descr
+= tolower(*it
);
310 std::string::size_type pos
;
311 while ((pos
= descr
.find("raised")) != std::string::npos
)
312 descr
.erase(pos
, 6); // 6 is strlen raised
314 while ((pos
= descr
.find("sunken")) != std::string::npos
)
317 // now add on 'flat' to prevent the bevels from being added
320 for (unsigned int screen
= 0; screen
< getNumberOfScreens(); screen
++) {
321 BTexture
texture(descr
, this, screen
, img_ctrl
[screen
]);
322 const ScreenInfo
*screen_info
= getScreenInfo(screen
);
324 texture
.setColor(BColor(fore
, this, screen
));
325 texture
.setColorTo(BColor(back
, this, screen
));
328 img_ctrl
[screen
]->renderImage(screen_info
->getWidth(),
329 screen_info
->getHeight(),
332 XSetWindowBackgroundPixmap(getXDisplay(),
333 screen_info
->getRootWindow(),
335 XClearWindow(getXDisplay(), screen_info
->getRootWindow());
337 setPixmapProperty(screen
,
338 duplicatePixmap(screen
, pixmap
,
339 screen_info
->getWidth(),
340 screen_info
->getHeight()));
342 if (! (screen_info
->getVisual()->c_class
& 1)) {
343 img_ctrl
[screen
]->removeImage(pixmap
);
349 void bsetroot::usage(int exit_code
) {
351 i18n(bsetrootSet
, bsetrootUsage
,
353 "Copyright (c) 1997-2000, 2002 Bradley T Hughes\n"
354 "Copyright (c) 2001-2002 Sean 'Shaleh' Perry\n\n"
355 " -display <string> display connection\n"
356 " -mod <x> <y> modula pattern\n"
357 " -foreground, -fg <color> modula foreground color\n"
358 " -background, -bg <color> modula background color\n\n"
359 " -gradient <texture> gradient texture\n"
360 " -from <color> gradient start color\n"
361 " -to <color> gradient end color\n\n"
362 " -solid <color> solid color\n\n"
363 " -help print this help text and exit\n"),
364 getApplicationName());
369 int main(int argc
, char **argv
) {
370 char *display_name
= (char *) 0;
372 i18n
.openCatalog("openbox.cat");
374 for (int i
= 1; i
< argc
; i
++) {
375 if (! strcmp(argv
[i
], "-display")) {
376 // check for -display option
379 fprintf(stderr
, i18n(mainSet
, mainDISPLAYRequiresArg
,
380 "error: '-display' requires an argument\n"));
385 display_name
= argv
[i
];
389 bsetroot
app(argc
, argv
, display_name
);
This page took 0.049547 seconds and 4 git commands to generate.