/*-
* Copyright (c) 2001 Jordan DeLong
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the author nor the names of contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef DECOR_H
#define DECOR_H
/* decoration types (alignment) */
#define DA_FULL 0 /* the entire length of the edge */
#define DA_NEAR 1 /* the low vals. i.e. further to the left, or further to the top */
#define DA_FAR 2 /* bigger vals of x/y. aligned down or aligned right */
/* decoration edges */
#define DE_TOP 0
#define DE_LEFT 1
#define DE_RIGHT 2
#define DE_BOTTOM 3
/* click_actions */
#define ACT_NONE 0
#define ACT_MOVE 1
#define ACT_RESIZE 2
#define ACT_DELETE 3
#define ACT_ICONIFY 5
#define ACT_ZOOM 6
/*
* a unit of window decoration. Each piece of decoration is implemented as an optionally
* shaped child window of the window's frame. Position and size are specified by the
* edge and type members, with finer control provied by size/position mods (see below). Window
* decoration may have an operation to perform on mouse presses, or it may function as a
* button, in which case the operation will be performed as the user would expect for a
* button: when the mouse is released, if it's still inside the button decor. Button
* decoration should also provide a pixmap that will be used when the button is pressed.
*
* note that the pressed button pixmap must have the same shape/size as the unpressed one.
* perhaps at some point this will be changed, but not for now....if you use one that's not
* the same size/shape yer gonna get some dumb crap happening.
*
* about the size pos modifification stuff: to give finer control on how decoration is sized
* or positioned these vals can be directly modified with numbers (lenmod and offset) or can
* be modified by a multiplier on the total size of the edge (using lenmult and offsetmult).
* for instance, to make something half as long as the edge, but indented by 1/8 of the size
* of the edge plus 10 pixels, you would set lenmult to .5, offsetmult to .125, offset to 10
* and lenmod to 0. (you'd use DA_NEAR for type in this case).
*/
struct decor {
char *ident; /* name of the decoration unit */
int type; /* type of decoration */
int edge; /* edge to put this decor on (top, left, etc) */
int offset; /* pixel offset for placement in primary direction */
int soffset; /* pixel offset in secondary direction; used to allow
* overlapping the client's area */
int lenmod; /* modification to the length of decor */
double offsetmult; /* factor * the total len of the edge to offset by */
double lenmult; /* factor * the total len of the edge to size by */
int lclick_action; /* what to do when pressed, or if button when clicked */
int rclick_action; /* same for the right click */
int mclick_action; /* same for the middle click */
pixmap_t *pixmap; /* pixmap struct for the decoration unit when focused */
pixmap_t *focpixmap; /* pixmap for when unit is focused */
pixmap_t *pressedmap; /* pixmap for the unit when it's pressed (for buttons) */
struct {
u_int shaped:1; /* should we shape the decor win? (frame ShapeUnion'd w/ rect if 0) */
u_int button:1; /* does this piece of decoration have button functionality */
} flags;
SLIST_ENTRY(decor) d_list;
};
#ifdef I18N
extern XFontSet titlefont;
#else
extern XFontStruct *titlefont;
#endif
void decor_init();
void decor_shutdown();
void decor_add(decor_t *decor);
decor_t *decor_ident(char *ident);
void decor_shapesize(client_t *client);
void decor_decorate(client_t *client);
void decor_undecor(client_t *client);
void decor_handlepress(client_t *client, decor_t *decor, XButtonEvent *e);
void decor_focus(client_t *client);
void decor_unfocus(client_t *client);
void decor_expose(client_t *client, decor_t *decor, XExposeEvent *e);
void decor_titlechange(client_t *client);
#endif
syntax highlighted by Code2HTML, v. 0.9.1