File: theme.h

package info (click to toggle)
labwc 0.9.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,992 kB
  • sloc: ansic: 34,788; perl: 5,837; xml: 873; sh: 162; python: 131; makefile: 12
file content (232 lines) | stat: -rw-r--r-- 5,573 bytes parent folder | download
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
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Theme engine for labwc
 *
 * Copyright Johan Malm 2020-2021
 */

#ifndef LABWC_THEME_H
#define LABWC_THEME_H

#include <cairo.h>
#include <stdbool.h>
#include "common/node-type.h"

struct lab_img;

/*
 * Openbox defines 7 types of Gradient background in addition to Solid.
 * Currently, labwc supports only Vertical and SplitVertical.
 */
enum lab_gradient {
	LAB_GRADIENT_NONE, /* i.e. Solid */
	LAB_GRADIENT_VERTICAL,
	LAB_GRADIENT_SPLITVERTICAL,
};

enum lab_justification {
	LAB_JUSTIFY_LEFT,
	LAB_JUSTIFY_CENTER,
	LAB_JUSTIFY_RIGHT,
};

struct theme_snapping_overlay {
	bool bg_enabled;
	bool border_enabled;
	float bg_color[4];
	int border_width;
	float border_color[3][4];
};

enum lab_button_state {
	LAB_BS_DEFAULT = 0,

	LAB_BS_HOVERED = 1 << 0,
	LAB_BS_TOGGLED = 1 << 1,
	LAB_BS_ROUNDED = 1 << 2,

	LAB_BS_ALL = LAB_BS_HOVERED | LAB_BS_TOGGLED | LAB_BS_ROUNDED,
};

struct theme_background {
	/* gradient type or none/solid */
	enum lab_gradient gradient;
	/* gradient stops */
	float color[4];
	float color_split_to[4];
	float color_to[4];
	float color_to_split_to[4];
};

struct theme {
	int border_width;

	/*
	 * the space between title bar border and
	 * buttons on the left/right/top
	 */
	int window_titlebar_padding_width;
	int window_titlebar_padding_height;

	int titlebar_height;

	float window_toggled_keybinds_color[4];
	enum lab_justification window_label_text_justify;

	/* buttons */
	int window_button_width;
	int window_button_height;
	int window_button_spacing;

	/* the corner radius of the hover effect */
	int window_button_hover_bg_corner_radius;

	/*
	 * Themes/textures for each active/inactive window. Indexed by
	 * ssd_active_state.
	 */
	struct {
		/* title background pattern (solid or gradient) */
		struct theme_background title_bg;

		/* TODO: add toggled/hover/pressed/disabled colors for buttons */
		float button_colors[LAB_NODE_BUTTON_LAST + 1][4];

		float border_color[4];
		float toggled_keybinds_color[4];
		float label_text_color[4];

		/* window drop-shadows */
		int shadow_size;
		float shadow_color[4];

		/*
		 * The texture of a window buttons for each hover/toggled/rounded
		 * state. This can be accessed like:
		 *
		 * buttons[LAB_NODE_BUTTON_ICONIFY][LAB_BS_HOVERED | LAB_BS_TOGGLED]
		 *
		 * Elements in buttons[0] are all NULL since LAB_NODE_BUTTON_FIRST is 1.
		 */
		struct lab_img *button_imgs
			[LAB_NODE_BUTTON_LAST + 1][LAB_BS_ALL + 1];

		/*
		 * The titlebar background is specified as a cairo_pattern
		 * and then also rendered into a 1px wide buffer, which is
		 * stretched horizontally across the titlebar.
		 *
		 * This approach enables vertical gradients while saving
		 * some memory vs. rendering the entire titlebar into an
		 * image. It does not work for horizontal gradients.
		 */
		cairo_pattern_t *titlebar_pattern;
		struct lab_data_buffer *titlebar_fill;

		struct lab_data_buffer *corner_top_left_normal;
		struct lab_data_buffer *corner_top_right_normal;

		struct lab_data_buffer *shadow_corner_top;
		struct lab_data_buffer *shadow_corner_bottom;
		struct lab_data_buffer *shadow_edge;
	} window[2];

	/* Derived from font sizes */
	int menu_item_height;
	int menu_header_height;

	int menu_overlap_x;
	int menu_overlap_y;
	int menu_min_width;
	int menu_max_width;
	int menu_border_width;
	float menu_border_color[4];

	int menu_items_padding_x;
	int menu_items_padding_y;
	float menu_items_bg_color[4];
	float menu_items_text_color[4];
	float menu_items_active_bg_color[4];
	float menu_items_active_text_color[4];

	int menu_separator_line_thickness;
	int menu_separator_padding_width;
	int menu_separator_padding_height;
	float menu_separator_color[4];

	float menu_title_bg_color[4];
	enum lab_justification menu_title_text_justify;
	float menu_title_text_color[4];

	int osd_border_width;

	float osd_bg_color[4];
	float osd_border_color[4];
	float osd_label_text_color[4];

	struct window_switcher_classic_theme {
		int width;
		int padding;
		int item_padding_x;
		int item_padding_y;
		int item_active_border_width;
		float item_active_border_color[4];
		float item_active_bg_color[4];
		int item_icon_size;
		bool width_is_percent;

		/*
		 * Not set in rc.xml/themerc, but derived from the tallest
		 * titlebar object plus 2 * window_titlebar_padding_height
		 */
		int item_height;
	} osd_window_switcher_classic;

	struct window_switcher_thumbnail_theme {
		int max_width;
		int padding;
		int item_width;
		int item_height;
		int item_padding;
		int item_active_border_width;
		float item_active_border_color[4];
		float item_active_bg_color[4];
		int item_icon_size;
		bool max_width_is_percent;

		int title_height;
	} osd_window_switcher_thumbnail;

	int osd_window_switcher_preview_border_width;
	float osd_window_switcher_preview_border_color[3][4];

	int osd_workspace_switcher_boxes_width;
	int osd_workspace_switcher_boxes_height;
	int osd_workspace_switcher_boxes_border_width;

	struct theme_snapping_overlay
		snapping_overlay_region, snapping_overlay_edge;

	/* magnifier */
	float mag_border_color[4];
	int mag_border_width;
};

struct server;

/**
 * theme_init - read openbox theme and generate button textures
 * @theme: theme data
 * @server: server
 * @theme_name: theme-name in <theme-dir>/<theme-name>/labwc/themerc
 * Note <theme-dir> is obtained in theme-dir.c
 */
void theme_init(struct theme *theme, struct server *server, const char *theme_name);

/**
 * theme_finish - free button textures
 * @theme: theme data
 */
void theme_finish(struct theme *theme);

#endif /* LABWC_THEME_H */