mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	debug.c: try to id important elements
This commit is contained in:
		
							parent
							
								
									17d83402ee
								
							
						
					
					
						commit
						c2f7e0be3d
					
				
					 1 changed files with 140 additions and 47 deletions
				
			
		
							
								
								
									
										187
									
								
								src/debug.c
									
										
									
									
									
								
							
							
						
						
									
										187
									
								
								src/debug.c
									
										
									
									
									
								
							| 
						 | 
					@ -4,9 +4,14 @@
 | 
				
			||||||
#include "buffer.h"
 | 
					#include "buffer.h"
 | 
				
			||||||
#include "labwc.h"
 | 
					#include "labwc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define INDENT_SIZE (3)
 | 
					#define HEADER_CHARS "------------------------------"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char *
 | 
					#define INDENT_SIZE 3
 | 
				
			||||||
 | 
					#define IGNORE_SSD true
 | 
				
			||||||
 | 
					#define IGNORE_MENU true
 | 
				
			||||||
 | 
					#define LEFT_COL_SPACE 35
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *
 | 
				
			||||||
get_node_type(enum wlr_scene_node_type type)
 | 
					get_node_type(enum wlr_scene_node_type type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (type) {
 | 
						switch (type) {
 | 
				
			||||||
| 
						 | 
					@ -24,64 +29,152 @@ get_node_type(enum wlr_scene_node_type type)
 | 
				
			||||||
	return "error";
 | 
						return "error";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static const char *
 | 
				
			||||||
dump_tree(struct wlr_scene_node *node, int pos, int x, int y)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *type = get_node_type(node->type);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (pos) {
 | 
					 | 
				
			||||||
		printf("%*c+-- ", pos, ' ');
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	printf("%s (%d,%d) [%p]\n", type, x, y, node);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct wlr_scene_node *child;
 | 
					 | 
				
			||||||
	wl_list_for_each(child, &node->state.children, state.link) {
 | 
					 | 
				
			||||||
		dump_tree(child, pos + INDENT_SIZE, x + child->state.x,
 | 
					 | 
				
			||||||
			y + child->state.y);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static char *
 | 
					 | 
				
			||||||
get_layer_name(uint32_t layer)
 | 
					get_layer_name(uint32_t layer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (layer) {
 | 
						switch (layer) {
 | 
				
			||||||
	case ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND:
 | 
						case ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND:
 | 
				
			||||||
		return "background";
 | 
							return "layer-background";
 | 
				
			||||||
	case ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM:
 | 
						case ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM:
 | 
				
			||||||
		return "bottom";
 | 
							return "layer-bottom";
 | 
				
			||||||
	case ZWLR_LAYER_SHELL_V1_LAYER_TOP:
 | 
						case ZWLR_LAYER_SHELL_V1_LAYER_TOP:
 | 
				
			||||||
		return "top";
 | 
							return "layer-top";
 | 
				
			||||||
	case ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY:
 | 
						case ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY:
 | 
				
			||||||
		return "overlay";
 | 
							return "layer-overlay";
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		abort();
 | 
							abort();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *
 | 
				
			||||||
 | 
					get_view_part(struct view *view, struct wlr_scene_node *node)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (view && node == &view->scene_tree->node) {
 | 
				
			||||||
 | 
							return "view";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (view && node == view->scene_node) {
 | 
				
			||||||
 | 
							return "view->scene_node";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!view || !view->ssd.tree) {
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.tree->node) {
 | 
				
			||||||
 | 
							return "view->ssd";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.titlebar.active.tree->node) {
 | 
				
			||||||
 | 
							return "titlebar.active";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.titlebar.inactive.tree->node) {
 | 
				
			||||||
 | 
							return "titlebar.inactive";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.border.active.tree->node) {
 | 
				
			||||||
 | 
							return "border.active";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.border.inactive.tree->node) {
 | 
				
			||||||
 | 
							return "border.inactive";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &view->ssd.extents.tree->node) {
 | 
				
			||||||
 | 
							return "extents";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *
 | 
				
			||||||
 | 
					get_special(struct server *server, struct wlr_scene_node *node,
 | 
				
			||||||
 | 
						struct view **last_view)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (node == &server->scene->node) {
 | 
				
			||||||
 | 
							return "server->scene";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &server->osd_tree->node) {
 | 
				
			||||||
 | 
							return "server->osd_tree";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node == &server->menu_tree->node) {
 | 
				
			||||||
 | 
							return "server->menu_tree";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node->parent == &server->scene->node) {
 | 
				
			||||||
 | 
							struct output *output;
 | 
				
			||||||
 | 
							wl_list_for_each(output, &server->outputs, link) {
 | 
				
			||||||
 | 
								for (int i = 0; i < 4; i++) {
 | 
				
			||||||
 | 
									if (node == &output->layer_tree[i]->node) {
 | 
				
			||||||
 | 
										return get_layer_name(i);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#if HAVE_XWAYLAND
 | 
				
			||||||
 | 
						if (node == &server->unmanaged_tree->node) {
 | 
				
			||||||
 | 
							return "server->unmanaged_tree";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if (node == &server->view_tree->node) {
 | 
				
			||||||
 | 
							return "server->view_tree";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (node->parent == &server->view_tree->node) {
 | 
				
			||||||
 | 
							*last_view = node->data;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						const char *view_part = get_view_part(*last_view, node);
 | 
				
			||||||
 | 
						if (view_part) {
 | 
				
			||||||
 | 
							return view_part;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return get_node_type(node->type);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct pad {
 | 
				
			||||||
 | 
						uint8_t left;
 | 
				
			||||||
 | 
						uint8_t right;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct pad
 | 
				
			||||||
 | 
					get_center_padding(const char *text, uint8_t max_width)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pad pad;
 | 
				
			||||||
 | 
						size_t text_len = strlen(text);
 | 
				
			||||||
 | 
						pad.left = (double)(max_width - text_len) / 2 + 0.5f;
 | 
				
			||||||
 | 
						pad.right = max_width - pad.left - text_len;
 | 
				
			||||||
 | 
						return pad;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					dump_tree(struct server *server, struct wlr_scene_node *node,
 | 
				
			||||||
 | 
						int pos, int x, int y)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static struct view *view;
 | 
				
			||||||
 | 
						const char *type = get_special(server, node, &view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pos) {
 | 
				
			||||||
 | 
							printf("%*c+-- ", pos, ' ');
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							struct pad node_pad = get_center_padding("Node", 16);
 | 
				
			||||||
 | 
							printf(" %*c %4s  %4s  %*c%s\n", LEFT_COL_SPACE + 4, ' ',
 | 
				
			||||||
 | 
								"X", "Y", node_pad.left, ' ', "Node");
 | 
				
			||||||
 | 
							printf(" %*c %.4s  %.4s  %.16s\n", LEFT_COL_SPACE + 4, ' ',
 | 
				
			||||||
 | 
								HEADER_CHARS, HEADER_CHARS, HEADER_CHARS);
 | 
				
			||||||
 | 
							printf(" ");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						int padding = LEFT_COL_SPACE - pos - strlen(type);
 | 
				
			||||||
 | 
						if (!pos) {
 | 
				
			||||||
 | 
							padding += 3;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						printf("%s %*c %4d  %4d  [%p]\n", type, padding, ' ', x, y, node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((IGNORE_MENU && node == &server->menu_tree->node)
 | 
				
			||||||
 | 
								|| (IGNORE_SSD && view && view->ssd.tree
 | 
				
			||||||
 | 
								&& node == &view->ssd.tree->node)) {
 | 
				
			||||||
 | 
							printf("%*c%s\n", pos + 4 + INDENT_SIZE, ' ', "<skipping children>");
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						struct wlr_scene_node *child;
 | 
				
			||||||
 | 
						wl_list_for_each(child, &node->state.children, state.link) {
 | 
				
			||||||
 | 
							dump_tree(server, child, pos + INDENT_SIZE,
 | 
				
			||||||
 | 
								x + child->state.x, y + child->state.y);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
debug_dump_scene(struct server *server)
 | 
					debug_dump_scene(struct server *server)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wlr_scene_node *node;
 | 
						printf("\n");
 | 
				
			||||||
 | 
						dump_tree(server, &server->scene->node, 0, 0, 0);
 | 
				
			||||||
	printf(":: view_tree ::\n");
 | 
						printf("\n");
 | 
				
			||||||
	node = &server->view_tree->node;
 | 
					 | 
				
			||||||
	dump_tree(node, 0, node->state.x, node->state.y);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	printf(":: layer_tree ::\n");
 | 
					 | 
				
			||||||
	struct output *output;
 | 
					 | 
				
			||||||
	wl_list_for_each(output, &server->outputs, link) {
 | 
					 | 
				
			||||||
		for (int i = 0; i < 4; i++) {
 | 
					 | 
				
			||||||
			node = &output->layer_tree[i]->node;
 | 
					 | 
				
			||||||
			printf("layer-%s\n", get_layer_name(i));
 | 
					 | 
				
			||||||
			dump_tree(node, 0, node->state.x, node->state.y);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	printf(":: osd_tree ::\n");
 | 
					 | 
				
			||||||
	node = &server->osd_tree->node;
 | 
					 | 
				
			||||||
	dump_tree(node, 0, node->state.x, node->state.y);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	printf(":: menu_tree ::\n");
 | 
					 | 
				
			||||||
	node = &server->menu_tree->node;
 | 
					 | 
				
			||||||
	dump_tree(node, 0, node->state.x, node->state.y);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue