src/util/area.h (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
/************************************************************************** * Copyright (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr) * * base class for all graphical objects (panel, taskbar, task, systray, clock, ...). * Area is at the begining of each object (&object == &area). * * Area manage the background and border drawing, size and padding. * Each Area has one Pixmap (pix). * * Area manage the tree of all objects. Parent object drawn before child object. * panel -> taskbars -> tasks * -> systray -> icons * -> clock * * draw_foreground(obj) and resize(obj) are virtual function. * **************************************************************************/ #ifndef AREA_H #define AREA_H #include <glib.h> #include <X11/Xlib.h> #include <cairo.h> #include <cairo-xlib.h> typedef struct { double color[3]; double alpha; int width; int rounded; } Border; typedef struct { double color[3]; double alpha; } Color; typedef struct { Color back; Border border; } Background; // way to calculate the size // SIZE_BY_LAYOUT objects : taskbar and task // SIZE_BY_CONTENT objects : clock, battery, launcher, systray enum { SIZE_BY_LAYOUT, SIZE_BY_CONTENT }; enum { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2 }; typedef struct { // coordinate relative to panel window int posx, posy; // width and height including border int width, height; Pixmap pix; Background *bg; // list of child : Area object GList *list; // object visible on screen. // An object (like systray) could be enabled but hidden (because no tray icon). int on_screen; // way to calculate the size (SIZE_BY_CONTENT or SIZE_BY_LAYOUT) int size_mode; int alignment; // need to calculate position and width int resize; // need redraw Pixmap int redraw; // paddingxlr = horizontal padding left/right // paddingx = horizontal padding between childs int paddingxlr, paddingx, paddingy; // parent Area void *parent; // panel void *panel; // each object can overwrite following function void (*_draw_foreground)(void *obj, cairo_t *c); // update area's content and update size (width/heith). // return '1' if size changed, '0' otherwise. int (*_resize)(void *obj); // after pos/size changed, the rendering engine will call _on_change_layout(Area*) int on_changed; void (*_on_change_layout)(void *obj); const char* (*_get_tooltip_text)(void *obj); } Area; // on startup, initialize fixed pos/size void init_rendering(void *obj, int pos); void rendering(void *obj); void size_by_content (Area *a); void size_by_layout (Area *a, int level); // draw background and foreground void refresh (Area *a); // generic resize for SIZE_BY_LAYOUT objects int resize_by_layout(void *obj, int maximum_size); // set 'redraw' on an area and childs void set_redraw (Area *a); // hide/unhide area void hide(Area *a); void show(Area *a); // draw pixmap void draw (Area *a); void draw_background (Area *a, cairo_t *c); void remove_area (Area *a); void add_area (Area *a); void free_area (Area *a); // draw rounded rectangle void draw_rect(cairo_t *c, double x, double y, double w, double h, double r); // clear pixmap with transparent color void clear_pixmap(Pixmap p, int x, int y, int w, int h); #endif |