summaryrefslogtreecommitdiffstats
path: root/include/theme.h
blob: a0b55675ad4e54fb763d31c4a7834f6f2bf90b95 (plain)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
#ifndef THEME_H
#define THEME_H
#include <glib.h>
#include <cairo.h>
#include <widgets/widget.h>

typedef enum {
    SOLID,
    DASH
} LineStyle;
/**
 * Distance unit type.
 */
typedef enum {
    /** PixelWidth in pixels. */
    PW_PX,
    /** PixelWidth in EM. */
    PW_EM,
    /** PixelWidget in percentage */
    PW_PERCENT,
} PixelWidth;

/**
 * Structure representing a distance.
 */
typedef struct {
    /** Distance */
    double     distance;
    /** Unit type of the distance */
    PixelWidth type;
    /** Style of the line */
    LineStyle  style;
} Distance;

/**
 * Type of orientation.
 */
typedef enum {
    ORIENTATION_VERTICAL,
    ORIENTATION_HORIZONTAL
} Orientation;
/**
 * Type of property
 */
typedef enum {
    /** Integer */
    P_INTEGER,
    /** Double */
    P_DOUBLE,
    /** String */
    P_STRING,
    /** Boolean */
    P_BOOLEAN,
    /** Color */
    P_COLOR,
    /** Padding */
    P_PADDING,
    /** Link to global setting */
    P_LINK,
} PropertyType;

/**
 * Represent the color in theme.
 */
typedef struct
{
    /** red channel */
    double red;
    /** green channel */
    double green;
    /** blue channel */
    double blue;
    /**  alpha channel */
    double alpha;
} ThemeColor;

/**
 * Padding
 */
typedef struct
 {
    Distance top;
    Distance right;
    Distance bottom;
    Distance left;
} Padding;

typedef struct Property {
    char *name;
    PropertyType type;
    union {
        int           i;
        double        f;
        char          *s;
        int           b;
        ThemeColor color;
        Padding    padding;
        struct {
            char *name;
            struct Property *ref;
        } link;
    } value;
} Property;
/**
 * ThemeWidget.
 */
typedef struct ThemeWidget {
    int set;
    char *name;

    unsigned int num_widgets;
    struct ThemeWidget **widgets;

    GHashTable *properties;

    struct ThemeWidget *parent;
} ThemeWidget;


/**
 * Global pointer to the current active theme.
 */
extern ThemeWidget *rofi_theme;

/**
 * @param base Handle to the current level in the theme.
 * @param name Name of the new element.
 *
 * Create a new element in the theme structure.
 *
 * @returns handle to the new entry.
 */
ThemeWidget *rofi_theme_find_or_create_name ( ThemeWidget *base, const char *name );

/**
 * @param widget The widget handle.
 *
 * Print out the widget to the commandline.
 */
void rofi_theme_print ( ThemeWidget *widget );

/**
 * @param type The type of the property to create.
 *
 * Create a theme property of type.
 *
 * @returns a new property.
 */
Property *rofi_theme_property_create ( PropertyType type );

/**
 * @param p The property to free.
 *
 * Free the content of the property.
 */
void rofi_theme_property_free ( Property *p );

/**
 * @param wid
 *
 * Free the widget and alll children.
 */
void rofi_theme_free ( ThemeWidget *wid );

/**
 * @param file filename to parse.
 *
 * Parse the input theme file.
 */
void rofi_theme_parse_file ( const char *file );

/**
 * @param widget The widget handle.
 * @param table HashTable containing properties set.
 *
 * Merge properties with widgets current property.
 */
void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table );

/**
 * Public API
 */

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param def      The default value.
 *
 * Obtain the distance of the widget.
 *
 * @returns The distance value of this property for this widget.
 */
Distance rofi_theme_get_distance ( const widget *widget, const char *property, int def );

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param def      The default value.
 *
 * Obtain the integer of the widget.
 *
 * @returns The integer value of this property for this widget.
 */
int rofi_theme_get_integer   (  const widget *widget,  const char *property, int def );

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param def      The default value.
 *
 * Obtain the boolean of the widget.
 *
 * @returns The boolean value of this property for this widget.
 */
int rofi_theme_get_boolean   (  const widget *widget,  const char *property, int def );

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param def      The default value.
 *
 * Obtain the string of the widget.
 *
 * @returns The string value of this property for this widget.
 */
char *rofi_theme_get_string  (  const widget *widget,  const char *property, char *def );

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param def      The default value.
 *
 * Obtain the padding of the widget.
 *
 * @returns The double value of this property for this widget.
 */
double rofi_theme_get_double (  const widget *widget,  const char *property, double def );

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param d        The drawable to apply color.
 *
 * Obtain the color of the widget and applies this to the drawable d.
 *
 */
void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t *d);

/**
 * @param widget   The widget to query
 * @param property The property to query.
 * @param pad      The default value.
 *
 * Obtain the padding of the widget.
 *
 * @returns The padding of this property for this widget.
 */
Padding rofi_theme_get_padding ( const widget *widget, const char *property, Padding pad );

/**
 * @param d The distance handle.
 * @param ori The orientation.
 *
 * Convert Distance into pixels.
 * @returns the number of pixels this distance represents.
 */
int distance_get_pixel ( Distance d, Orientation ori );
/**
 * @param d The distance handle.
 * @param draw The cairo drawable.
 *
 * Set linestyle.
 */
void distance_get_linestyle ( Distance d, cairo_t *draw );

#ifdef THEME_CONVERTER
/**
 * Function to convert old theme into new theme format.
 */
void rofi_theme_convert_old_theme ( void );
#endif
#endif