Kevin Ryde > X11-Protocol-Other > X11::Protocol::XSetRoot

Download:
X11-Protocol-Other-29.tar.gz

Dependencies

Annotate this POD

Website

CPAN RT

Open  0
View/Report Bugs
Module Version: 29   Source  

NAME ^

X11::Protocol::XSetRoot -- set root window background

SYNOPSIS ^

 use X11::Protocol::XSetRoot;
 X11::Protocol::XSetRoot->set_background (color => 'green');

 # or given $X, but which then can't be used any more
 X11::Protocol::XSetRoot->set_background
                  (X       => $X,
                   pixmap  => $pixmap_xid,
                   pixmap_allocated_colors => 1);

DESCRIPTION ^

This module sets the X root window background in the style of the xsetroot program.

The simplest use is a named colour interpreted by the server's usual AllocNamedColor() or a 1 to 4 digit hex string like "#RRGGBB" or "#RRRRGGGGBBBB".

    X11::Protocol::XSetRoot->set_background
                               (color => 'green');

    X11::Protocol::XSetRoot->set_background
                               (color => '#FF0000'); # red

A pattern can be set with a pixmap. A pixmap the size of the screen can give a full background picture.

    # draw $pixmap with say $X->black_pixel and $X->white_pixel,
    # then set it with
    X11::Protocol::XSetRoot->set_background
                               (X      => $X,
                                pixmap => $pixmap);

set_background() takes ownership of the given $pixmap and frees it with FreePixmap() once put into the window background.

Setting the root to a pixmap drawn by a program is the main use for this module. If you just want a solid colour then that can be done easily enough with the actual xsetroot program.

Retained Resources

Allocated pixel colours and any use_esetroot preserve pixels and pixmap with SetCloseDownMode('RetainPermanent') and leave root window properties _XSETROOT_ID or ESETROOT_PMAP_ID ready to released by KillClient() at a future background change.

In these cases the $X connection cannot be used any more since a further background change and consequent KillClient() could occur at any time, perhaps immediately.

If a pixmap is given then if it contains any allocated pixels (AllocColor() etc) then this should be indicated with the pixmap_allocated_colors option. (Allocated pixels are noticed automatically for pixel and color options.)

    # AllocColor colours, draw $pixmap with them, then
    #
    X11::Protocol::XSetRoot->set_background
                               (X      => $X,
                                pixmap => $pixmap,
                                pixmap_allocated_colors => 1);
    # don't use $X any more

The easiest thing is to close an $X connection immediately after a set_background(). Perhaps there could be a return value to say whether a retain was done and so the connection cannot be used again. Or perhaps if in the future X11::Protocol had an explicit $X->close() then that could be done here so a closed connection would indicate it cannot be used further.

If the root visual is static such as TrueColor then there's no colour allocation as such (AllocColor() is just a lookup). In this case set_background() knows there's no need for RetainPermanent for colours, only for pixmaps.

If the color or pixel options are the screen black_pixel or white_pixel then those pixels exist permanently in the root colormap and set_background() knows there's no need for RetainPermanent. Similarly if the server has the TOG-CUP extension (see X11::Protocol::Ext::TOG_CUP) then any reserved pixels listed there are recognised as permanent.

Virtual Root ^

XSetRoot looks for __SWM_VROOT using X11::Protocol::WM root_to_virtual_root() and acts on that when applicable. Such a virtual root is used by amiwm, swm and tvtwm window managers and the xscreensaver program.

Alas the enlightenment window manager uses a background window covering the root window. This stops most root window programs from working, including XSetRoot here.

Esetroot ^

The Esetroot program and various compatible programs such as fvwm-root use different properties than xsetroot. The Esetroot method records the root pixmap ready for use by programs such as Eterm, for example to implement pseudo-transparency (Eterm --trans, which is what the method was designed for).

The set_background() option use_esetroot uses the Esetroot style rather than the default xsetroot style. If this is given with pixel or color options then set_background() makes a 1x1 pixmap to give a solid colour.

set_background() always deletes and kills (as appropriate) both the xsetroot and Esetroot properties since both are superseded by a new background.

For reference, to use Eterm --trans (as of its version 0.9.6 March 2011) an Esetroot background should be present at Eterm startup and should not be removed later (or set to "None"). It doesn't notice a later Esetroot or re-install. In practice this means Esetroot before running Eterm and then all future background changes in Esetroot style.

The advantage of the Esetroot method is that the root pixmap is available for client programs to use in creative ways. If the client draws some of the root pixmap as its own background then it can appear semi-transparent without the SHAPE extension, and perhaps do some visual effects like shading or dithering.

For comparison the xsetroot style means the root pixmap is not available to client programs and therefore in principle allows the server to apply it to the hardware and never refer to it again. In practice that might not occur, if for example on multiple console "virtual terminals" the server must give up the hardware when switched away.

FUNCTIONS ^

X11::Protocol::XSetRoot->set_background (key=>value, ...)

Set the root window background to a pixmap or colour. The key/value parameters are

    X        => X11::Protocol object
    display  => string ":0.0" etc

    screen   => integer, eg. 0
    root     => XID of root window

    color    => string
    pixel    => integer pixel value
    pixmap   => XID of pixmap to display, or "None"
    pixmap_allocated_colors => boolean, default false
    use_esetroot => boolean, default false

The server is given by an X connection object, or a display name to connect to, or the default is the DISPLAY environment variable.

The root window is given by root or screen, or the default is the default screen in $X either per $X->choose_screen() or the default from the display name.

The background to show is given by a colour name, pixel value, or pixmap. color can be anything understood by the server AllocNamedColor(), plus 1 to 4 digit hex

    blue              named colours
    #RGB              hex digits
    #RRGGBB
    #RRRGGGBBB
    #RRRRGGGGBBBB

pixel is an integer pixel value in the root window colormap. It's automatically recognised as allocated or not (the screen pre-defined black or white and TOG-CUP reserved pixels are permanent and so reckoned not allocated).

pixmap is an XID integer. set_background() takes ownership of this pixmap and will FreePixmap() once installed. "None" or 0 means no pixmap, which gives the server's default root background (usually a black and white weave pattern).

pixmap_allocated_colors should be true if any of the pixels in pixmap were allocated with AllocColor() etc, as opposed to just the screen pre-defined black and white pixels (and any TOG-CUP permanent pixels).

use_esetroot means use the root window properties in the style of Esetroot. This allows programs such as Eterm to use the root background for "pseudo-transparency" or in other creative ways.

When an allocated pixel or a pixmap with allocated pixels is set as the background the _XSETROOT_ID mechanism described above means the $X connection could be killed by another xsetroot at any time, perhaps immediately, and for that reason $X should not be used any more. The easiest way is to make set_background() the last thing done on $X.

Setting an allocated pixel or any pixmap can only be done on a $X connection as such, not with the display option. This is because retaining the colours with the _XSETROOT_ID mechanism can only be done from the client connection which created the resources, not a new separate client connection.

ROOT WINDOW PROPERTIES ^

_XSETROOT_ID

For xsetroot, if colours in the root window background are allocated by AllocColor() etc then _XSETROOT_ID is a pixmap XID which can be killed by KillClient() to free those colours when the root background is replaced. _XSETROOT_ID is only a 1x1 dummy pixmap, it's not the actual root background pixmap.

_XROOTPMAP_ID

For Esetroot style, this is the current root window background pixmap. It might be set by an Esetroot which has run and exited, or it might be set by a window manager or similar which is still running.

Client programs can use this to combine the root background into their own window in interesting ways. Listen to PropertyNotify on the root window for background changes. Note that since this pixmap belongs to another client it could be freed at any time, so protocol errors when copying or drawing from it should generally be ignored, or cause a fallback to some default.

ESETROOT_PMAP_ID

For Esetroot style, this is the same as _XROOTPMAP_ID if that pixmap was created by Esetroot and saved by SetCloseDownMode('RetainPermanent'). This should be freed by KillClient() if the background is replaced.

The specification http://www.eterm.org/docs/view.php?doc=ref#trans advises killing ESETROOT_PMAP_ID only when equal to _XROOTPMAP_ID. Probably it's safer to always kill ESETROOT_PMAP_ID if replacing its value, to be sure of not leaking resources. But perhaps if both ESETROOT_PMAP_ID and _XROOTPMAP_ID exist then they are always equal.

ENVIRONMENT ^

DISPLAY

The default X server.

FILES ^

/etc/X11/rgb.txt on the server, being the usual colour names database for the color option above.

SEE ALSO ^

X11::Protocol, X11::Protocol::Ext::TOG_CUP

xsetroot(1), Esetroot(1), Eterm(1), fvwm-root(1)

http://www.eterm.org/docs/view.php?doc=ref#trans http://www.eterm.org/doc/Eterm_reference.html#trans

HOME PAGE ^

http://user42.tuxfamily.org/x11-protocol-other/index.html

LICENSE ^

Copyright 2010, 2011, 2012, 2013 Kevin Ryde

X11-Protocol-Other is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

X11-Protocol-Other is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with X11-Protocol-Other. If not, see <http://www.gnu.org/licenses/>.

syntax highlighting: