Menu bullet color support.
[openbox.git] / obrender / render.h
blobd8d47c9d629ca6e23c092bf0616e9d7be5170e85
1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 render.h for the Openbox window manager
4 Copyright (c) 2006 Mikael Magnusson
5 Copyright (c) 2003-2007 Dana Jansens
6 Copyright (c) 2003 Derek Foreman
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 See the COPYING file for a copy of the GNU General Public License.
21 #ifndef __render_h
22 #define __render_h
24 #include <X11/Xlib.h> /* some platforms dont include this as needed for Xft */
25 #include <pango/pangoxft.h>
26 #include <glib.h>
28 G_BEGIN_DECLS
30 #include "obrender/geom.h"
31 #include "obrender/version.h"
33 typedef union _RrTextureData RrTextureData;
34 typedef struct _RrAppearance RrAppearance;
35 typedef struct _RrSurface RrSurface;
36 typedef struct _RrFont RrFont;
37 typedef struct _RrTexture RrTexture;
38 typedef struct _RrTextureMask RrTextureMask;
39 typedef struct _RrTextureRGBA RrTextureRGBA;
40 typedef struct _RrTextureImage RrTextureImage;
41 typedef struct _RrTextureText RrTextureText;
42 typedef struct _RrTextureLineArt RrTextureLineArt;
43 typedef struct _RrPixmapMask RrPixmapMask;
44 typedef struct _RrInstance RrInstance;
45 typedef struct _RrColor RrColor;
46 typedef struct _RrImage RrImage;
47 typedef struct _RrImagePic RrImagePic;
48 typedef struct _RrImageCache RrImageCache;
49 typedef struct _RrButton RrButton;
51 typedef guint32 RrPixel32;
52 typedef guint16 RrPixel16;
53 typedef guchar RrPixel8;
55 typedef enum {
56 RR_RELIEF_FLAT,
57 RR_RELIEF_RAISED,
58 RR_RELIEF_SUNKEN,
59 RR_RELIEF_NUM_TYPES
60 } RrReliefType;
62 typedef enum {
63 RR_BEVEL_1,
64 RR_BEVEL_2,
65 RR_BEVEL_NUM_TYPES
66 } RrBevelType;
68 typedef enum {
69 RR_SURFACE_NONE,
70 RR_SURFACE_PARENTREL,
71 RR_SURFACE_SOLID,
72 RR_SURFACE_SPLIT_VERTICAL,
73 RR_SURFACE_HORIZONTAL,
74 RR_SURFACE_VERTICAL,
75 RR_SURFACE_DIAGONAL,
76 RR_SURFACE_CROSS_DIAGONAL,
77 RR_SURFACE_PYRAMID,
78 RR_SURFACE_MIRROR_HORIZONTAL,
79 RR_SURFACE_NUM_TYPES
80 } RrSurfaceColorType;
82 typedef enum {
83 RR_TEXTURE_NONE,
84 RR_TEXTURE_MASK,
85 RR_TEXTURE_TEXT,
86 RR_TEXTURE_LINE_ART,
87 RR_TEXTURE_RGBA,
88 RR_TEXTURE_IMAGE,
89 RR_TEXTURE_NUM_TYPES
90 } RrTextureType;
92 typedef enum {
93 RR_JUSTIFY_LEFT,
94 RR_JUSTIFY_CENTER,
95 RR_JUSTIFY_RIGHT,
96 RR_JUSTIFY_NUM_TYPES
97 } RrJustify;
99 /* Put middle first so it's the default */
100 typedef enum {
101 RR_ELLIPSIZE_MIDDLE,
102 RR_ELLIPSIZE_NONE,
103 RR_ELLIPSIZE_START,
104 RR_ELLIPSIZE_END,
105 RR_ELLIPSIZE_NUM_TYPES
106 } RrEllipsizeMode;
108 typedef enum {
109 RR_FONTWEIGHT_LIGHT,
110 RR_FONTWEIGHT_NORMAL,
111 RR_FONTWEIGHT_SEMIBOLD,
112 RR_FONTWEIGHT_BOLD,
113 RR_FONTWEIGHT_ULTRABOLD,
114 RR_FONTWEIGHT_NUM_TYPES
115 } RrFontWeight;
117 typedef enum {
118 RR_FONTSLANT_NORMAL,
119 RR_FONTSLANT_ITALIC,
120 RR_FONTSLANT_OBLIQUE,
121 RR_FONTSLANT_NUM_TYPES
122 } RrFontSlant;
124 struct _RrSurface {
125 RrSurfaceColorType grad;
126 RrReliefType relief;
127 RrBevelType bevel;
128 RrColor *primary;
129 RrColor *secondary;
130 RrColor *border_color;
131 RrColor *bevel_dark;
132 RrColor *bevel_light;
133 RrColor *interlace_color;
134 gboolean interlaced;
135 gboolean border;
136 RrAppearance *parent;
137 gint parentx;
138 gint parenty;
139 RrPixel32 *pixel_data;
140 gint bevel_dark_adjust; /* 0-255, default is 64 */
141 gint bevel_light_adjust; /* 0-255, default is 128 */
142 RrColor *split_primary;
143 RrColor *split_secondary;
146 struct _RrTextureText {
147 RrFont *font;
148 RrJustify justify;
149 RrColor *color;
150 const gchar *string;
151 gint shadow_offset_x;
152 gint shadow_offset_y;
153 RrColor *shadow_color;
154 gboolean shortcut; /*!< Underline a character */
155 guint shortcut_pos; /*!< Position in bytes of the character to underline */
156 RrEllipsizeMode ellipsize;
157 gboolean flow; /* allow multiple lines. must set maxwidth below */
158 gint maxwidth;
159 guchar shadow_alpha; /* at the bottom to improve alignment */
162 struct _RrPixmapMask {
163 const RrInstance *inst;
164 Pixmap mask;
165 gint width;
166 gint height;
167 gchar *data;
170 struct _RrTextureMask {
171 RrColor *color;
172 RrPixmapMask *mask;
175 struct _RrTextureRGBA {
176 gint width;
177 gint height;
178 gint alpha;
179 RrPixel32 *data;
180 /* size and position to draw at (if these are zero, then it will be
181 drawn to fill the entire texture */
182 gint tx;
183 gint ty;
184 gint twidth;
185 gint theight;
188 struct _RrTextureImage {
189 RrImage *image;
190 gint alpha;
191 /* size and position to draw at (if these are zero, then it will be
192 drawn to fill the entire texture */
193 gint tx;
194 gint ty;
195 gint twidth;
196 gint theight;
199 struct _RrTextureLineArt {
200 RrColor *color;
201 gint x1;
202 gint y1;
203 gint x2;
204 gint y2;
207 union _RrTextureData {
208 RrTextureRGBA rgba;
209 RrTextureImage image;
210 RrTextureText text;
211 RrTextureMask mask;
212 RrTextureLineArt lineart;
215 struct _RrTexture {
216 /* If changing the type of a texture, you should DEFINITELY call
217 RrAppearanceClearTextures() first! */
218 RrTextureType type;
219 RrTextureData data;
222 struct _RrAppearance {
223 const RrInstance *inst;
225 RrSurface surface;
226 gint textures;
227 RrTexture *texture;
228 Pixmap pixmap;
229 XftDraw *xftdraw;
231 /* cached for internal use */
232 gint w, h;
235 /*! Holds a RGBA image picture */
236 struct _RrImagePic {
237 gint width, height;
238 RrPixel32 *data;
239 /* The sum of all the pixels. This is used to compare pictures if their
240 hashes match. */
241 gint sum;
242 /* The name of the image. This is used to determine
243 if the named image already is loaded. May be NULL if the image
244 was not loaded from disk. */
245 gchar *name;
248 typedef void (*RrImageDestroyFunc)(RrImage *image, gpointer data);
250 /*! An RrImage is a sort of meta-image. It can contain multiple versions of
251 an image at different sizes, which may or may not be completely different
252 pictures */
253 struct _RrImage {
254 gint ref;
255 RrImageCache *cache;
257 /*! An array of "originals", that is of RrPictures that have been added
258 to the image in various sizes, and that have not been resized. These
259 are explicitly added to the RrImage. */
260 RrImagePic **original;
261 gint n_original;
262 /*! An array of "resized" pictures. When an "original" RrPicture
263 needs to be resized for drawing, it is saved in here so that it doesn't
264 need to be resized again. These are automatically added to the
265 RrImage. */
266 RrImagePic **resized;
267 gint n_resized;
269 /* This function (if not NULL) will be called just before destroying
270 RrImage. */
271 RrImageDestroyFunc destroy_func;
272 gpointer destroy_data;
275 struct _RrButton {
276 const RrInstance *inst;
278 /* colors */
279 RrColor *focused_unpressed_color;
280 RrColor *unfocused_unpressed_color;
281 RrColor *focused_pressed_color;
282 RrColor *unfocused_pressed_color;
283 RrColor *disabled_focused_color;
284 RrColor *disabled_unfocused_color;
285 RrColor *hover_focused_color;
286 RrColor *hover_unfocused_color;
287 RrColor *toggled_hover_focused_color;
288 RrColor *toggled_hover_unfocused_color;
289 RrColor *toggled_focused_pressed_color;
290 RrColor *toggled_unfocused_pressed_color;
291 RrColor *toggled_focused_unpressed_color;
292 RrColor *toggled_unfocused_unpressed_color;
294 /* masks */
295 RrPixmapMask *mask;
296 RrPixmapMask *pressed_mask;
297 RrPixmapMask *disabled_mask;
298 RrPixmapMask *hover_mask;
299 RrPixmapMask *toggled_mask;
300 RrPixmapMask *toggled_hover_mask;
301 RrPixmapMask *toggled_pressed_mask;
303 /* textures */
304 RrAppearance *a_focused_unpressed;
305 RrAppearance *a_unfocused_unpressed;
306 RrAppearance *a_focused_pressed;
307 RrAppearance *a_unfocused_pressed;
308 RrAppearance *a_disabled_focused;
309 RrAppearance *a_disabled_unfocused;
310 RrAppearance *a_hover_focused;
311 RrAppearance *a_hover_unfocused;
312 RrAppearance *a_toggled_focused_unpressed;
313 RrAppearance *a_toggled_unfocused_unpressed;
314 RrAppearance *a_toggled_focused_pressed;
315 RrAppearance *a_toggled_unfocused_pressed;
316 RrAppearance *a_toggled_hover_focused;
317 RrAppearance *a_toggled_hover_unfocused;
321 /* these are the same on all endian machines because it seems to be dependant
322 on the endianness of the gfx card, not the cpu. */
323 #define RrDefaultAlphaOffset 24
324 #define RrDefaultRedOffset 16
325 #define RrDefaultGreenOffset 8
326 #define RrDefaultBlueOffset 0
328 #define RrDefaultFontFamily "arial,sans"
329 #define RrDefaultFontSize 8
330 #define RrDefaultFontWeight RR_FONTWEIGHT_NORMAL
331 #define RrDefaultFontSlant RR_FONTSLANT_NORMAL
333 RrInstance* RrInstanceNew (Display *display, gint screen);
334 void RrInstanceFree (RrInstance *inst);
336 Display* RrDisplay (const RrInstance *inst);
337 gint RrScreen (const RrInstance *inst);
338 Window RrRootWindow (const RrInstance *inst);
339 Visual* RrVisual (const RrInstance *inst);
340 gint RrDepth (const RrInstance *inst);
341 Colormap RrColormap (const RrInstance *inst);
342 gint RrRedOffset (const RrInstance *inst);
343 gint RrGreenOffset (const RrInstance *inst);
344 gint RrBlueOffset (const RrInstance *inst);
345 gint RrRedShift (const RrInstance *inst);
346 gint RrGreenShift (const RrInstance *inst);
347 gint RrBlueShift (const RrInstance *inst);
348 gint RrRedMask (const RrInstance *inst);
349 gint RrGreenMask (const RrInstance *inst);
350 gint RrBlueMask (const RrInstance *inst);
352 RrColor *RrColorNew (const RrInstance *inst, gint r, gint g, gint b);
353 RrColor *RrColorCopy (RrColor *c);
354 RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
355 void RrColorFree (RrColor *in);
357 gint RrColorRed (const RrColor *c);
358 gint RrColorGreen (const RrColor *c);
359 gint RrColorBlue (const RrColor *c);
360 gulong RrColorPixel (const RrColor *c);
361 GC RrColorGC (RrColor *c);
363 RrAppearance *RrAppearanceNew (const RrInstance *inst, gint numtex);
364 RrAppearance *RrAppearanceCopy (RrAppearance *a);
365 void RrAppearanceFree (RrAppearance *a);
366 void RrAppearanceRemoveTextures(RrAppearance *a);
367 void RrAppearanceAddTextures(RrAppearance *a, gint numtex);
368 /*! Always call this when changing the type of a texture in an appearance */
369 void RrAppearanceClearTextures(RrAppearance *a);
371 RrButton *RrButtonNew (const RrInstance *inst);
372 void RrButtonFree(RrButton *b);
374 RrFont *RrFontOpen (const RrInstance *inst, const gchar *name,
375 gint size, RrFontWeight weight, RrFontSlant slant);
376 RrFont *RrFontOpenDefault (const RrInstance *inst);
377 void RrFontClose (RrFont *f);
378 /*! Returns an RrSize, that was allocated with g_slice_new(). Use g_slice_free() to
379 free it. */
380 RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
381 gint shadow_offset_x, gint shadow_offset_y,
382 gboolean flow, gint maxwidth);
383 gint RrFontHeight (const RrFont *f, gint shadow_offset_y);
384 gint RrFontMaxCharWidth (const RrFont *f);
386 /* Paint into the appearance. The old pixmap is returned (if there was one). It
387 is the responsibility of the caller to call XFreePixmap on the return when
388 it is non-null. */
389 Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
390 void RrPaint (RrAppearance *a, Window win, gint w, gint h);
391 void RrMinSize (RrAppearance *a, gint *w, gint *h);
392 gint RrMinWidth (RrAppearance *a);
393 /* For text textures, if flow is TRUE, then the string must be set before
394 calling this, otherwise it doesn't need to be */
395 gint RrMinHeight (RrAppearance *a);
396 void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
398 gboolean RrPixmapToRGBA(const RrInstance *inst,
399 Pixmap pmap, Pixmap mask,
400 gint *w, gint *h, RrPixel32 **data);
402 /*! Create a new image cache for RrImages.
403 @param max_resized_saved The number of resized copies of an image to save
405 RrImageCache* RrImageCacheNew(gint max_resized_saved);
406 void RrImageCacheRef(RrImageCache *self);
407 void RrImageCacheUnref(RrImageCache *self);
409 /*! Finds an image in the cache, if it is already in there */
410 RrImage* RrImageCacheFind(RrImageCache *self,
411 RrPixel32 *data, gint w, gint h);
412 /*! Finds an image in the cache, by searching for the name of the image */
413 RrImage* RrImageCacheFindName(RrImageCache *self,
414 const gchar *name);
416 RrImage* RrImageNew(RrImageCache *cache);
417 void RrImageRef(RrImage *im);
418 void RrImageUnref(RrImage *im);
420 void RrImageAddPicture(RrImage *im, const RrPixel32 *data, gint w, gint h);
421 /*! Adds a picture by name, from a file on disk.
422 @name Can be a full path to an image, or it can be a name as per the
423 freedesktop.org icon spec. */
424 gboolean RrImageAddPictureName(RrImage *im, const gchar *name);
425 void RrImageRemovePicture(RrImage *im, gint w, gint h);
427 G_END_DECLS
429 #endif /*__render_h*/