File: ssd-internal.h

package info (click to toggle)
labwc 0.9.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,980 kB
  • sloc: ansic: 34,416; perl: 5,836; xml: 875; sh: 162; python: 131; makefile: 12
file content (189 lines) | stat: -rw-r--r-- 5,291 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
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_SSD_INTERNAL_H
#define LABWC_SSD_INTERNAL_H

#include <wlr/util/box.h>
#include "common/border.h"
#include "theme.h"
#include "view.h"

struct ssd_state_title_width {
	int width;
	bool truncated;
};

/*
 * The scene-graph of SSD looks like below. The parentheses indicate the
 * type of each node (enum lab_node_type, stored in the node_descriptor
 * attached to the wlr_scene_node).
 *
 * ssd->tree (LAB_NODE_SSD_ROOT)
 * +--titlebar (LAB_NODE_TITLEBAR)
 * |  +--inactive
 * |  |  +--background bar
 * |  |  +--left corner
 * |  |  +--right corner
 * |  |  +--title (LAB_NODE_TITLE)
 * |  |  +--iconify button (LAB_NODE_BUTTON_ICONIFY)
 * |  |  |  +--normal close icon image
 * |  |  |  +--hovered close icon image
 * |  |  |  +--...
 * |  |  +--window icon (LAB_NODE_BUTTON_WINDOW_ICON)
 * |  |  |  +--window icon image
 * |  |  +--...
 * |  +--active
 * |     +--...
 * +--border
 * |  +--inactive
 * |  |  +--top
 * |  |  +--...
 * |  +--active
 * |     +--top
 * |     +--...
 * +--shadow
 * |  +--inactive
 * |  |  +--top
 * |  |  +--...
 * |  +--active
 * |     +--top
 * |     +--...
 * +--extents
 *    +--top
 *    +--...
 */
struct ssd {
	struct view *view;
	struct wlr_scene_tree *tree;

	/*
	 * Cache for current values.
	 * Used to detect actual changes so we
	 * don't update things we don't have to.
	 */
	struct {
		/* Button icons need to be swapped on shade or omnipresent toggles */
		bool was_shaded;
		bool was_omnipresent;

		/*
		 * Corners need to be (un)rounded and borders need be shown/hidden
		 * when toggling maximization, and the button needs to be swapped on
		 * maximization toggles.
		 */
		bool was_maximized;

		/*
		 * Corners need to be (un)rounded but borders should be kept shown when
		 * the window is (un)tiled and notified about it or when the window may
		 * become so small that only a squared scene-rect can be used to render
		 * such a small titlebar.
		 */
		bool was_squared;

		struct wlr_box geometry;
		struct ssd_state_title {
			char *text;
			/* indexed by enum ssd_active_state */
			struct ssd_state_title_width dstates[2];
		} title;
	} state;

	/* An invisible area around the view which allows resizing */
	struct ssd_extents_scene {
		struct wlr_scene_tree *tree;
		struct wlr_scene_rect *top, *bottom, *left, *right;
	} extents;

	/* The top of the view, containing buttons, title, .. */
	struct ssd_titlebar_scene {
		int height;
		struct wlr_scene_tree *tree;
		struct ssd_titlebar_subtree {
			struct wlr_scene_tree *tree;
			struct wlr_scene_buffer *corner_left;
			struct wlr_scene_buffer *corner_right;
			struct wlr_scene_buffer *bar;
			struct scaled_font_buffer *title;
			struct wl_list buttons_left; /* ssd_button.link */
			struct wl_list buttons_right; /* ssd_button.link */
		} subtrees[2]; /* indexed by enum ssd_active_state */
	} titlebar;

	/* Borders allow resizing as well */
	struct ssd_border_scene {
		struct wlr_scene_tree *tree;
		struct ssd_border_subtree {
			struct wlr_scene_tree *tree;
			struct wlr_scene_rect *top, *bottom, *left, *right;
		} subtrees[2]; /* indexed by enum ssd_active_state */
	} border;

	struct ssd_shadow_scene {
		struct wlr_scene_tree *tree;
		struct ssd_shadow_subtree {
			struct wlr_scene_tree *tree;
			struct wlr_scene_buffer *top, *bottom, *left, *right,
				*top_left, *top_right, *bottom_left, *bottom_right;
		} subtrees[2]; /* indexed by enum ssd_active_state */
	} shadow;

	/*
	 * Space between the extremities of the view's wlr_surface
	 * and the max extents of the server-side decorations.
	 * For xdg-shell views with CSD, this margin is zero.
	 */
	struct border margin;
};

struct ssd_button {
	struct wlr_scene_node *node;
	enum lab_node_type type;

	/*
	 * Bitmap of lab_button_state that represents a combination of
	 * hover/toggled/rounded states.
	 */
	uint8_t state_set;
	/*
	 * Image buffers for each combination of hover/toggled/rounded states.
	 * img_buffers[state_set] is displayed. Some of these can be NULL
	 * (e.g. img_buffers[LAB_BS_ROUNDED] is set only for corner buttons).
	 *
	 * When the button type is LAB_NODE_BUTTON_WINDOW_ICON,
	 * these are all NULL and window_icon is used instead.
	 */
	struct scaled_img_buffer *img_buffers[LAB_BS_ALL + 1];

	struct scaled_icon_buffer *window_icon;

	struct wl_list link; /* ssd_titlebar_subtree.buttons_{left,right} */
};

struct wlr_buffer;
struct wlr_scene_tree;

/* SSD internal helpers to create various SSD elements */
struct ssd_button *attach_ssd_button(struct wl_list *button_parts,
	enum lab_node_type type, struct wlr_scene_tree *parent,
	struct lab_img *imgs[LAB_BS_ALL + 1], int x, int y,
	struct view *view);

/* SSD internal */
void ssd_titlebar_create(struct ssd *ssd);
void ssd_titlebar_update(struct ssd *ssd);
void ssd_titlebar_destroy(struct ssd *ssd);
bool ssd_should_be_squared(struct ssd *ssd);

void ssd_border_create(struct ssd *ssd);
void ssd_border_update(struct ssd *ssd);
void ssd_border_destroy(struct ssd *ssd);

void ssd_extents_create(struct ssd *ssd);
void ssd_extents_update(struct ssd *ssd);
void ssd_extents_destroy(struct ssd *ssd);

void ssd_shadow_create(struct ssd *ssd);
void ssd_shadow_update(struct ssd *ssd);
void ssd_shadow_destroy(struct ssd *ssd);

#endif /* LABWC_SSD_INTERNAL_H */