diff --git a/docs/visuals/theming.md b/docs/visuals/theming.md index 2f9993be..75c90f37 100644 --- a/docs/visuals/theming.md +++ b/docs/visuals/theming.md @@ -69,17 +69,17 @@ You can also color-code windows based on their state: ### Tab Bar For Monocle Layout | Setting | Default | Description | | :--- | :--- | :--- | -| `tab_bar_height` | `50` | Height of the tab bar for monocle layout. | -| `tab_bar_decorate_fg_color` | `0xc4939dff` | text color. -| `tab_bar_decorate_bg_color` | `0x201b14ff` | background color.| -| `tab_bar_decorate_focus_fg_color` | `0x201b14ff` | text color for focus. | -| `tab_bar_decorate_focus_bg_color` | `0xc4939dff` | background color for focus.| -| `tab_bar_decorate_border_color` | `0x8BAA9Bff` | border color.| -| `tab_bar_decorate_border_width` | `4` | border width.| -| `tab_bar_decorate_corner_radius` | `5` | corner radius.| -| `tab_bar_decorate_padding_x` | `0` | horizontal padding.| -| `tab_bar_decorate_padding_y` | `0` | vertical padding.| -| `tab_bar_decorate_font_desc` | `monospace Bold 16` | font set.| +| `group_bar_height` | `50` | Height of the tab bar for monocle layout. | +| `group_bar_decorate_fg_color` | `0xc4939dff` | text color. +| `group_bar_decorate_bg_color` | `0x201b14ff` | background color.| +| `group_bar_decorate_focus_fg_color` | `0x201b14ff` | text color for focus. | +| `group_bar_decorate_focus_bg_color` | `0xc4939dff` | background color for focus.| +| `group_bar_decorate_border_color` | `0x8BAA9Bff` | border color.| +| `group_bar_decorate_border_width` | `4` | border width.| +| `group_bar_decorate_corner_radius` | `5` | corner radius.| +| `group_bar_decorate_padding_x` | `0` | horizontal padding.| +| `group_bar_decorate_padding_y` | `0` | vertical padding.| +| `group_bar_decorate_font_desc` | `monospace Bold 16` | font set.| ## Borders diff --git a/src/action/client.h b/src/action/client.h index 41ca0663..aca5d2ef 100644 --- a/src/action/client.h +++ b/src/action/client.h @@ -57,14 +57,14 @@ void client_tile_resize(Client *c, struct wlr_box geo, int32_t interact) { if (!ISFAKETILED(c)) return; - if (c->isfullscreen && c->tab_bar_node) { - wlr_scene_node_set_enabled(&c->tab_bar_node->scene_buffer->node, false); + if (c->isfullscreen && c->group_bar) { + wlr_scene_node_set_enabled(&c->group_bar->scene_buffer->node, false); } - if (!c->mon->isoverview && c->tab_bar_node && !c->isfullscreen && + if (!c->mon->isoverview && c->group_bar && !c->isfullscreen && (c->group_next || c->group_prev)) { - geo.y = geo.y + config.tab_bar_height; - geo.height -= config.tab_bar_height; + geo.y = geo.y + config.group_bar_height; + geo.height -= config.group_bar_height; } if ((!c->isfullscreen && !c->ismaximizescreen) || @@ -115,27 +115,22 @@ void client_add_jump_label_node(Client *c) { wlr_scene_node_set_enabled(&c->jump_label_node->scene_buffer->node, false); } -void client_add_tab_bar_node(Client *c) { +void client_add_group_bar(Client *c) { - if (config.tab_bar_height <= 0) { + if (config.group_bar_height <= 0) { return; } - MangoCustomDecorate *MangoCustomDecorate = - ecalloc(1, sizeof(MangoCustomDecorate)); - MangoCustomDecorate->node_data = c; - MangoCustomDecorate->node_type = MANGO_TITLE_NODE; - MangoCustomDecorate->type = CustomDecorate; uint32_t layer = c->isoverlay ? LyrOverlay : c->isfloating || c->isfullscreen ? LyrTop : c->ismaximizescreen ? LyrMaximize : LyrTile; - c->tab_bar_node = mango_tab_bar_node_create( - MangoCustomDecorate, layers[layer], config.tabdata, 0, 0); - wlr_scene_node_lower_to_bottom(&c->tab_bar_node->scene_buffer->node); - wlr_scene_node_set_enabled(&c->tab_bar_node->scene_buffer->node, false); - mango_tab_bar_node_update(c->tab_bar_node, client_get_title(c), 1.0); + c->group_bar = mango_group_bar_create(c, GroupBar, layers[layer], + config.tabdata, 0, 0); + wlr_scene_node_lower_to_bottom(&c->group_bar->scene_buffer->node); + wlr_scene_node_set_enabled(&c->group_bar->scene_buffer->node, false); + mango_group_bar_update(c->group_bar, client_get_title(c), 1.0); } void client_focus_group_member(Client *c) { @@ -165,11 +160,11 @@ void client_focus_group_member(Client *c) { cur_focusing->isgroupfocusing = false; c->mon = cur_focusing->mon; client_replace(c, cur_focusing, true); - mango_tab_bar_node_set_focus(cur_focusing->tab_bar_node, false); + mango_group_bar_set_focus(cur_focusing->group_bar, false); } c->isgroupfocusing = true; - mango_tab_bar_node_set_focus(c->tab_bar_node, true); + mango_group_bar_set_focus(c->group_bar, true); client_reparent_group(c); @@ -189,14 +184,14 @@ void client_check_tab_node_visible(Client *c) { Client *cur = head; while (cur) { - if (!c->mon->isoverview && cur->tab_bar_node && + if (!c->mon->isoverview && cur->group_bar && (cur->group_next || cur->group_prev) && VISIBLEON(c, c->mon) && ISNORMAL(c) && !c->isfullscreen && (!is_monocle_layout(c->mon) || c == c->mon->sel)) { - wlr_scene_node_set_enabled(&cur->tab_bar_node->scene_buffer->node, + wlr_scene_node_set_enabled(&cur->group_bar->scene_buffer->node, true); } else { - wlr_scene_node_set_enabled(&cur->tab_bar_node->scene_buffer->node, + wlr_scene_node_set_enabled(&cur->group_bar->scene_buffer->node, false); } cur = cur->group_next; @@ -216,8 +211,8 @@ void client_raise_group(Client *c) { Client *cur = head; while (cur) { - if (cur->tab_bar_node) { - wlr_scene_node_raise_to_top(&cur->tab_bar_node->scene_buffer->node); + if (cur->group_bar) { + wlr_scene_node_raise_to_top(&cur->group_bar->scene_buffer->node); wlr_scene_node_raise_to_top(&cur->scene->node); } cur = cur->group_next; @@ -225,7 +220,7 @@ void client_raise_group(Client *c) { } void client_reparent_group(Client *c) { - if (!c || !c->tab_bar_node) + if (!c || !c->group_bar) return; if (!c->group_prev && !c->group_next) @@ -242,8 +237,8 @@ void client_reparent_group(Client *c) { Client *cur = head; while (cur) { - if (cur->tab_bar_node) { - wlr_scene_node_reparent(&cur->tab_bar_node->scene_buffer->node, + if (cur->group_bar) { + wlr_scene_node_reparent(&cur->group_bar->scene_buffer->node, layers[layer]); wlr_scene_node_reparent(&cur->scene->node, layers[layer]); } @@ -251,13 +246,13 @@ void client_reparent_group(Client *c) { } } -void client_handle_decorate_click(MangoCustomDecorate *md) { +void client_handle_decorate_click(MangoGroupBar *gb) { - if (!md) + if (!gb) return; - if (md->node_type == MANGO_TITLE_NODE) { - Client *c = md->node_data; + if (gb->node_data) { + Client *c = gb->node_data; client_focus_group_member(c); } } \ No newline at end of file diff --git a/src/animation/client.h b/src/animation/client.h index 10c3d836..eb0eb328 100644 --- a/src/animation/client.h +++ b/src/animation/client.h @@ -414,12 +414,12 @@ void client_draw_shadow(Client *c) { void client_draw_title(Client *c) { - if (!c || !c->tab_bar_node) + if (!c || !c->group_bar) return; - if (!c->group_next && !c->group_prev && c->tab_bar_node && - c->tab_bar_node->scene_buffer->node.enabled) { - wlr_scene_node_set_enabled(&c->tab_bar_node->scene_buffer->node, false); + if (!c->group_next && !c->group_prev && c->group_bar && + c->group_bar->scene_buffer->node.enabled) { + wlr_scene_node_set_enabled(&c->group_bar->scene_buffer->node, false); return; } @@ -438,21 +438,21 @@ void client_draw_title(Client *c) { } int32_t tab_x = c->animation.current.x; - int32_t tab_y = c->animation.current.y - config.tab_bar_height; + int32_t tab_y = c->animation.current.y - config.group_bar_height; int32_t tw = c->animation.current.width; - int32_t th = config.tab_bar_height; + int32_t th = config.group_bar_height; int32_t left_over = c->mon->m.x - tab_x; int32_t right_over = tab_x + tw - c->mon->m.x - c->mon->m.width; int32_t top_over = c->mon->m.y - tab_y; int32_t bottom_over = - tab_y + config.tab_bar_height - c->mon->m.y - c->mon->m.height; + tab_y + config.group_bar_height - c->mon->m.y - c->mon->m.height; if (c != grabc && (ISSCROLLTILED(c) || c->animation.tagining || c->animation.tagouting)) { if (top_over > 0) { tab_y = c->mon->m.y; - th = config.tab_bar_height - top_over; + th = config.group_bar_height - top_over; } if (bottom_over > 0) { th = th - bottom_over; @@ -469,9 +469,9 @@ void client_draw_title(Client *c) { if (tw <= 0 || th <= 0) { cur = head; while (cur) { - if (cur->tab_bar_node) - wlr_scene_node_set_enabled( - &cur->tab_bar_node->scene_buffer->node, false); + if (cur->group_bar) + wlr_scene_node_set_enabled(&cur->group_bar->scene_buffer->node, + false); cur = cur->group_next; } return; @@ -486,7 +486,7 @@ void client_draw_title(Client *c) { for (int i = 0; i < count && cur; i++) { int32_t w = bar_w + (i < rem ? 1 : 0); - global_draw_tab_bar(cur, x, tab_y, w, th); + global_draw_group_bar(cur, x, tab_y, w, th); x += w; cur = cur->group_next; } @@ -532,17 +532,17 @@ void client_draw_blur(Client *c, struct wlr_box clip_box, struct ivec2 offset) { } } -void global_draw_tab_bar(Client *c, int32_t x, int32_t y, int32_t width, - int32_t height) { - if (!c->tab_bar_node) +void global_draw_group_bar(Client *c, int32_t x, int32_t y, int32_t width, + int32_t height) { + if (!c->group_bar) return; if (height <= 0) { - wlr_scene_node_set_enabled(&c->tab_bar_node->scene_buffer->node, false); + wlr_scene_node_set_enabled(&c->group_bar->scene_buffer->node, false); } - wlr_scene_node_set_position(&c->tab_bar_node->scene_buffer->node, x, y); - mango_tab_bar_node_set_size(c->tab_bar_node, width, height); + wlr_scene_node_set_position(&c->group_bar->scene_buffer->node, x, y); + mango_group_bar_set_size(c->group_bar, width, height); } void apply_split_border(Client *c, bool hit_no_border) { diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 0bc26a7f..875ce081 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -333,7 +333,7 @@ typedef struct { uint32_t gappoh; uint32_t gappov; uint32_t borderpx; - uint32_t tab_bar_height; + uint32_t group_bar_height; float scratchpad_width_ratio; float scratchpad_height_ratio; float rootcolor[4]; @@ -1774,75 +1774,75 @@ bool parse_option(Config *config, char *key, char *value) { config->cursor_size = atoi(value); } else if (strcmp(key, "cursor_theme") == 0) { config->cursor_theme = strdup(value); - } else if (strcmp(key, "tab_bar_decorate_font_desc") == 0) { + } else if (strcmp(key, "group_bar_decorate_font_desc") == 0) { config->tabdata.font_desc = strdup(value); - } else if (strcmp(key, "tab_bar_decorate_fg_color") == 0) { + } else if (strcmp(key, "group_bar_decorate_fg_color") == 0) { int64_t color = parse_color(value); if (color == -1) { fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "tab_bar_decorate_fg_color " + "group_bar_decorate_fg_color " "format: %s\n", value); return false; } else { convert_hex_to_rgba(config->tabdata.fg_color, color); } - } else if (strcmp(key, "tab_bar_decorate_bg_color") == 0) { + } else if (strcmp(key, "group_bar_decorate_bg_color") == 0) { int64_t color = parse_color(value); if (color == -1) { fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "tab_bar_decorate_bg_color " + "group_bar_decorate_bg_color " "format: %s\n", value); return false; } else { convert_hex_to_rgba(config->tabdata.bg_color, color); } - } else if (strcmp(key, "tab_bar_decorate_focus_fg_color") == 0) { + } else if (strcmp(key, "group_bar_decorate_focus_fg_color") == 0) { int64_t color = parse_color(value); if (color == -1) { fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "tab_bar_decorate_focus_fg_color " + "group_bar_decorate_focus_fg_color " "format: %s\n", value); return false; } else { convert_hex_to_rgba(config->tabdata.focus_fg_color, color); } - } else if (strcmp(key, "tab_bar_decorate_focus_bg_color") == 0) { + } else if (strcmp(key, "group_bar_decorate_focus_bg_color") == 0) { int64_t color = parse_color(value); if (color == -1) { fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "tab_bar_decorate_focus_bg_color " + "group_bar_decorate_focus_bg_color " "format: %s\n", value); return false; } else { convert_hex_to_rgba(config->tabdata.focus_bg_color, color); } - } else if (strcmp(key, "tab_bar_decorate_border_color") == 0) { + } else if (strcmp(key, "group_bar_decorate_border_color") == 0) { int64_t color = parse_color(value); if (color == -1) { fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "tab_bar_decorate_border_color " + "group_bar_decorate_border_color " "format: %s\n", value); return false; } else { convert_hex_to_rgba(config->tabdata.border_color, color); } - } else if (strcmp(key, "tab_bar_decorate_border_width") == 0) { + } else if (strcmp(key, "group_bar_decorate_border_width") == 0) { config->tabdata.border_width = CLAMP_INT(atoi(value), 0, 100); - } else if (strcmp(key, "tab_bar_decorate_corner_radius") == 0) { + } else if (strcmp(key, "group_bar_decorate_corner_radius") == 0) { config->tabdata.corner_radius = CLAMP_INT(atoi(value), 0, 100); - } else if (strcmp(key, "tab_bar_decorate_padding_x") == 0) { + } else if (strcmp(key, "group_bar_decorate_padding_x") == 0) { config->tabdata.padding_x = CLAMP_INT(atoi(value), 0, 100); - } else if (strcmp(key, "tab_bar_decorate_padding_y") == 0) { + } else if (strcmp(key, "group_bar_decorate_padding_y") == 0) { config->tabdata.padding_y = CLAMP_INT(atoi(value), 0, 100); } else if (strcmp(key, "jump_label_decorate_font_desc") == 0) { config->jumplabeldata.font_desc = strdup(value); @@ -1960,8 +1960,8 @@ bool parse_option(Config *config, char *key, char *value) { config->scratchpad_height_ratio = atof(value); } else if (strcmp(key, "borderpx") == 0) { config->borderpx = atoi(value); - } else if (strcmp(key, "tab_bar_height") == 0) { - config->tab_bar_height = atoi(value); + } else if (strcmp(key, "group_bar_height") == 0) { + config->group_bar_height = atoi(value); } else if (strcmp(key, "rootcolor") == 0) { int64_t color = parse_color(value); if (color == -1) { @@ -3581,7 +3581,7 @@ void override_config(void) { config.scratchpad_height_ratio = CLAMP_FLOAT(config.scratchpad_height_ratio, 0.1f, 1.0f); config.borderpx = CLAMP_INT(config.borderpx, 0, 200); - config.tab_bar_height = CLAMP_INT(config.tab_bar_height, 0, 500); + config.group_bar_height = CLAMP_INT(config.group_bar_height, 0, 500); config.smartgaps = CLAMP_INT(config.smartgaps, 0, 1); config.blur = CLAMP_INT(config.blur, 0, 1); config.blur_layer = CLAMP_INT(config.blur_layer, 0, 1); @@ -3713,7 +3713,7 @@ void set_value_default() { config.idleinhibit_ignore_visible = 0; config.borderpx = 4; - config.tab_bar_height = 50; + config.group_bar_height = 50; config.overviewgappi = 5; config.overviewgappo = 30; config.cursor_hide_timeout = 0; @@ -4130,7 +4130,7 @@ void reapply_property(void) { mango_jump_label_node_apply_config(c->jump_label_node, &config.jumplabeldata); - mango_tab_bar_node_apply_config(c->tab_bar_node, &config.tabdata); + mango_group_bar_apply_config(c->group_bar, &config.tabdata); wlr_scene_rect_set_color(c->droparea, config.dropcolor); wlr_scene_rect_set_color(c->splitindicator[0], config.splitcolor); diff --git a/src/draw/text-node.c b/src/draw/text-node.c index c85b25dc..2b6c21d7 100644 --- a/src/draw/text-node.c +++ b/src/draw/text-node.c @@ -59,10 +59,9 @@ static const struct wlr_buffer_impl text_buffer_impl = { .end_data_ptr_access = text_buffer_end_data_ptr_access, }; -struct mango_jump_label_node * -mango_jump_label_node_create(struct wlr_scene_tree *parent, - DecorateDrawData data) { - struct mango_jump_label_node *node = calloc(1, sizeof(*node)); +MangoJumpLabel *mango_jump_label_node_create(struct wlr_scene_tree *parent, + DecorateDrawData data) { + MangoJumpLabel *node = calloc(1, sizeof(*node)); if (!node) return NULL; @@ -104,7 +103,7 @@ mango_jump_label_node_create(struct wlr_scene_tree *parent, return node; } -void mango_jump_label_node_destroy(struct mango_jump_label_node *node) { +void mango_jump_label_node_destroy(MangoJumpLabel *node) { if (!node) return; @@ -136,8 +135,8 @@ void mango_jump_label_node_destroy(struct mango_jump_label_node *node) { free(node); } -void mango_jump_label_node_set_background(struct mango_jump_label_node *node, - float r, float g, float b, float a) { +void mango_jump_label_node_set_background(MangoJumpLabel *node, float r, + float g, float b, float a) { if (!node) return; node->bg_color[0] = r; @@ -146,9 +145,9 @@ void mango_jump_label_node_set_background(struct mango_jump_label_node *node, node->bg_color[3] = a; } -void mango_jump_label_node_set_border(struct mango_jump_label_node *node, - float r, float g, float b, float a, - int32_t width, int32_t radius) { +void mango_jump_label_node_set_border(MangoJumpLabel *node, float r, float g, + float b, float a, int32_t width, + int32_t radius) { if (!node) return; node->border_color[0] = r; @@ -159,17 +158,16 @@ void mango_jump_label_node_set_border(struct mango_jump_label_node *node, node->corner_radius = radius; } -void mango_jump_label_node_set_padding(struct mango_jump_label_node *node, - int32_t pad_x, int32_t pad_y) { +void mango_jump_label_node_set_padding(MangoJumpLabel *node, int32_t pad_x, + int32_t pad_y) { if (!node) return; node->padding_x = pad_x >= 0 ? pad_x : 0; node->padding_y = pad_y >= 0 ? pad_y : 0; } -static void get_text_pixel_size(struct mango_jump_label_node *node, - const char *text, float scale, int32_t *out_w, - int32_t *out_h) { +static void get_text_pixel_size(MangoJumpLabel *node, const char *text, + float scale, int32_t *out_w, int32_t *out_h) { if (node->measure_scale != scale) { pango_cairo_context_set_resolution(node->measure_context, 96.0 * scale); node->measure_scale = scale; @@ -193,8 +191,8 @@ static void draw_rounded_rect(cairo_t *cr, double x, double y, double w, cairo_close_path(cr); } -void mango_jump_label_node_update(struct mango_jump_label_node *node, - const char *text, float scale) { +void mango_jump_label_node_update(MangoJumpLabel *node, const char *text, + float scale) { if (!node || !text) return; if (scale <= 0.0f) @@ -407,8 +405,7 @@ void mango_jump_label_node_update(struct mango_jump_label_node *node, node->logical_height); } -void mango_jump_label_node_set_focus(struct mango_jump_label_node *node, - bool focused) { +void mango_jump_label_node_set_focus(MangoJumpLabel *node, bool focused) { if (!node || node->focused == focused) return; node->focused = focused; @@ -419,55 +416,61 @@ void mango_jump_label_node_set_focus(struct mango_jump_label_node *node, } } -struct mango_tab_bar_node * -mango_tab_bar_node_create(void *mango_node_data, struct wlr_scene_tree *parent, - DecorateDrawData data, int32_t width, - int32_t height) { - struct mango_tab_bar_node *node = calloc(1, sizeof(*node)); - if (!node) +MangoGroupBar *mango_group_bar_create(void *cdata, uint32_t type, + struct wlr_scene_tree *parent, + DecorateDrawData data, int32_t width, + int32_t height) { + MangoGroupBar *mangobar = calloc(1, sizeof(*mangobar)); + if (!mangobar) return NULL; - node->scene_buffer = wlr_scene_buffer_create(parent, NULL); - if (!node->scene_buffer) { - free(node); + mangobar->scene_buffer = wlr_scene_buffer_create(parent, NULL); + if (!mangobar->scene_buffer) { + free(mangobar); return NULL; } - memcpy(node->fg_color, data.fg_color, sizeof(node->fg_color)); - memcpy(node->bg_color, data.bg_color, sizeof(node->bg_color)); - memcpy(node->focus_fg_color, data.focus_fg_color, - sizeof(node->focus_fg_color)); - memcpy(node->focus_bg_color, data.focus_bg_color, - sizeof(node->focus_bg_color)); - memcpy(node->border_color, data.border_color, sizeof(node->border_color)); - node->border_width = data.border_width; - node->corner_radius = data.corner_radius; - node->padding_x = data.padding_x; - node->padding_y = data.padding_y; - node->font_desc = + memcpy(mangobar->fg_color, data.fg_color, sizeof(mangobar->fg_color)); + memcpy(mangobar->bg_color, data.bg_color, sizeof(mangobar->bg_color)); + memcpy(mangobar->focus_fg_color, data.focus_fg_color, + sizeof(mangobar->focus_fg_color)); + memcpy(mangobar->focus_bg_color, data.focus_bg_color, + sizeof(mangobar->focus_bg_color)); + memcpy(mangobar->border_color, data.border_color, + sizeof(mangobar->border_color)); + mangobar->border_width = data.border_width; + mangobar->corner_radius = data.corner_radius; + mangobar->padding_x = data.padding_x; + mangobar->padding_y = data.padding_y; + mangobar->font_desc = g_strdup(data.font_desc ? data.font_desc : "monospace Bold 16"); - node->target_width = width; - node->target_height = height; - node->focused = false; - node->cached_focused = false; + mangobar->target_width = width; + mangobar->target_height = height; + mangobar->focused = false; + mangobar->cached_focused = false; - node->measure_surface = + mangobar->measure_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1); - node->measure_cr = cairo_create(node->measure_surface); - node->measure_context = pango_cairo_create_context(node->measure_cr); - node->measure_layout = pango_layout_new(node->measure_context); - node->measure_scale = 1.0f; + mangobar->measure_cr = cairo_create(mangobar->measure_surface); + mangobar->measure_context = + pango_cairo_create_context(mangobar->measure_cr); + mangobar->measure_layout = pango_layout_new(mangobar->measure_context); + mangobar->measure_scale = 1.0f; - node->cached_scale = -1.0f; - node->last_text = NULL; - node->last_scale = 0.0f; - node->scene_buffer->node.data = mango_node_data; + mangobar->cached_scale = -1.0f; + mangobar->last_text = NULL; + mangobar->last_scale = 0.0f; - return node; + mangobar->type = type; + mangobar->node_data = cdata; + + mangobar->scene_buffer->node.data = mangobar; + + return mangobar; } -void mango_tab_bar_node_destroy(struct mango_tab_bar_node *node) { +void mango_group_bar_destroy(MangoGroupBar *node) { if (!node) return; @@ -492,19 +495,15 @@ void mango_tab_bar_node_destroy(struct mango_tab_bar_node *node) { if (node->measure_cr) cairo_destroy(node->measure_cr); - void *data = node->scene_buffer->node.data; - wlr_scene_node_destroy(&node->scene_buffer->node); - g_free(node->font_desc); g_free(node->cached_text); g_free(node->cached_font_desc); g_free(node->last_text); - free(data); free(node); } -void mango_tab_bar_node_set_size(struct mango_tab_bar_node *node, int32_t width, - int32_t height) { +void mango_group_bar_set_size(MangoGroupBar *node, int32_t width, + int32_t height) { if (!node) return; @@ -522,11 +521,11 @@ void mango_tab_bar_node_set_size(struct mango_tab_bar_node *node, int32_t width, const char *redraw_text = node->last_text ? node->last_text : ""; float redraw_scale = node->last_scale > 0.0f ? node->last_scale : 1.0f; - mango_tab_bar_node_update(node, redraw_text, redraw_scale); + mango_group_bar_update(node, redraw_text, redraw_scale); } -void mango_tab_bar_node_update(struct mango_tab_bar_node *node, - const char *text, float scale) { +void mango_group_bar_update(MangoGroupBar *node, const char *text, + float scale) { if (!node || !text) return; if (scale <= 0.0f) @@ -765,19 +764,18 @@ void mango_tab_bar_node_update(struct mango_tab_bar_node *node, node->logical_height); } -void mango_tab_bar_node_set_focus(struct mango_tab_bar_node *node, - bool focused) { +void mango_group_bar_set_focus(MangoGroupBar *node, bool focused) { if (!node || node->focused == focused) return; node->focused = focused; if (node->last_text) { float scale = node->last_scale > 0.0f ? node->last_scale : 1.0f; - mango_tab_bar_node_update(node, node->last_text, scale); + mango_group_bar_update(node, node->last_text, scale); } } -void mango_tab_bar_node_set_colors(struct mango_tab_bar_node *node, - const float fg[4], const float bg[4]) { +void mango_group_bar_set_colors(MangoGroupBar *node, const float fg[4], + const float bg[4]) { if (!node) return; @@ -786,11 +784,11 @@ void mango_tab_bar_node_set_colors(struct mango_tab_bar_node *node, if (!node->focused && node->last_text) { float scale = node->last_scale > 0.0f ? node->last_scale : 1.0f; - mango_tab_bar_node_update(node, node->last_text, scale); + mango_group_bar_update(node, node->last_text, scale); } } -void mango_jump_label_node_apply_config(struct mango_jump_label_node *node, +void mango_jump_label_node_apply_config(MangoJumpLabel *node, const DecorateDrawData *data) { if (!node || !data) return; @@ -817,8 +815,8 @@ void mango_jump_label_node_apply_config(struct mango_jump_label_node *node, } } -void mango_tab_bar_node_apply_config(struct mango_tab_bar_node *node, - const DecorateDrawData *data) { +void mango_group_bar_apply_config(MangoGroupBar *node, + const DecorateDrawData *data) { if (!node || !data) return; @@ -840,6 +838,6 @@ void mango_tab_bar_node_apply_config(struct mango_tab_bar_node *node, if (node->last_text) { float scale = node->last_scale > 0.0f ? node->last_scale : 1.0f; - mango_tab_bar_node_update(node, node->last_text, scale); + mango_group_bar_update(node, node->last_text, scale); } } \ No newline at end of file diff --git a/src/draw/text-node.h b/src/draw/text-node.h index 079af908..2eb3c4e8 100644 --- a/src/draw/text-node.h +++ b/src/draw/text-node.h @@ -26,8 +26,7 @@ struct mango_text_buffer { struct wlr_buffer base; cairo_surface_t *surface; }; - -struct mango_jump_label_node { +typedef struct { struct wlr_scene_buffer *scene_buffer; struct mango_text_buffer *buffer; cairo_surface_t *surface; @@ -70,13 +69,15 @@ struct mango_jump_label_node { int32_t logical_width; int32_t logical_height; -}; +} MangoJumpLabel; -struct mango_tab_bar_node { +typedef struct { + uint32_t type; struct wlr_scene_buffer *scene_buffer; struct mango_text_buffer *buffer; cairo_surface_t *surface; int surface_pixel_w, surface_pixel_h; + void *node_data; // 存储窗口指针 // 初始配置 float fg_color[4]; @@ -126,41 +127,38 @@ struct mango_tab_bar_node { int32_t logical_width; int32_t logical_height; -}; +} MangoGroupBar; void mango_text_global_finish(void); -struct mango_jump_label_node * -mango_jump_label_node_create(struct wlr_scene_tree *parent, - DecorateDrawData data); -void mango_jump_label_node_destroy(struct mango_jump_label_node *node); -void mango_jump_label_node_set_background(struct mango_jump_label_node *node, - float r, float g, float b, float a); -void mango_jump_label_node_set_border(struct mango_jump_label_node *node, - float r, float g, float b, float a, - int32_t width, int32_t radius); -void mango_jump_label_node_set_padding(struct mango_jump_label_node *node, - int32_t pad_x, int32_t pad_y); -void mango_jump_label_node_update(struct mango_jump_label_node *node, - const char *text, float scale); +MangoJumpLabel *mango_jump_label_node_create(struct wlr_scene_tree *parent, + DecorateDrawData data); +void mango_jump_label_node_destroy(MangoJumpLabel *node); +void mango_jump_label_node_set_background(MangoJumpLabel *node, float r, + float g, float b, float a); +void mango_jump_label_node_set_border(MangoJumpLabel *node, float r, float g, + float b, float a, int32_t width, + int32_t radius); +void mango_jump_label_node_set_padding(MangoJumpLabel *node, int32_t pad_x, + int32_t pad_y); +void mango_jump_label_node_update(MangoJumpLabel *node, const char *text, + float scale); -struct mango_tab_bar_node * -mango_tab_bar_node_create(void *mango_node_data, struct wlr_scene_tree *parent, - DecorateDrawData data, int32_t width, int32_t height); -void mango_tab_bar_node_destroy(struct mango_tab_bar_node *node); -void mango_tab_bar_node_set_size(struct mango_tab_bar_node *node, int32_t width, - int32_t height); -void mango_tab_bar_node_update(struct mango_tab_bar_node *node, - const char *text, float scale); +MangoGroupBar *mango_group_bar_create(void *cdata, uint32_t type, + struct wlr_scene_tree *parent, + DecorateDrawData data, int32_t width, + int32_t height); +void mango_group_bar_destroy(MangoGroupBar *node); +void mango_group_bar_set_size(MangoGroupBar *node, int32_t width, + int32_t height); +void mango_group_bar_update(MangoGroupBar *node, const char *text, float scale); -void mango_jump_label_node_set_focus(struct mango_jump_label_node *node, - bool focused); -void mango_tab_bar_node_set_focus(struct mango_tab_bar_node *node, - bool focused); +void mango_jump_label_node_set_focus(MangoJumpLabel *node, bool focused); +void mango_group_bar_set_focus(MangoGroupBar *node, bool focused); -void mango_tab_bar_node_set_colors(struct mango_tab_bar_node *node, - const float fg[4], const float bg[4]); -void mango_jump_label_node_apply_config(struct mango_jump_label_node *node, +void mango_group_bar_set_colors(MangoGroupBar *node, const float fg[4], + const float bg[4]); +void mango_jump_label_node_apply_config(MangoJumpLabel *node, const DecorateDrawData *data); -void mango_tab_bar_node_apply_config(struct mango_tab_bar_node *node, - const DecorateDrawData *data); +void mango_group_bar_apply_config(MangoGroupBar *node, + const DecorateDrawData *data); #endif // jump_label_node_H \ No newline at end of file diff --git a/src/ext-protocol/text-input.h b/src/ext-protocol/text-input.h index 7b4e1a1f..ebe8c7b1 100644 --- a/src/ext-protocol/text-input.h +++ b/src/ext-protocol/text-input.h @@ -27,6 +27,7 @@ struct dwl_input_method_relay { }; struct dwl_input_method_popup { + uint32_t type; struct wlr_input_popup_surface_v2 *popup_surface; struct wlr_scene_tree *tree; struct wlr_scene_tree *scene_surface; @@ -404,6 +405,8 @@ static void handle_input_method_new_popup_surface(struct wl_listener *listener, popup->tree = wlr_scene_tree_create(layers[LyrIMPopup]); popup->scene_surface = wlr_scene_subsurface_tree_create( popup->tree, popup->popup_surface->surface); + + popup->type = XdgImPopup; popup->scene_surface->node.data = popup; wl_list_insert(&relay->popups, &popup->link); diff --git a/src/fetch/common.h b/src/fetch/common.h index fdd85be5..d017dff3 100644 --- a/src/fetch/common.h +++ b/src/fetch/common.h @@ -100,13 +100,12 @@ static bool layer_ignores_focus(LayerSurface *l) { } void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, - LayerSurface **pl, MangoCustomDecorate **pd, double *nx, - double *ny) { + LayerSurface **pl, MangoGroupBar **gb, double *nx, double *ny) { struct wlr_scene_node *node = NULL, *pnode = NULL; struct wlr_surface *surface = NULL; Client *c = NULL; LayerSurface *l = NULL; - MangoCustomDecorate *mangocustomdecorate = NULL; + MangoGroupBar *mangogroupbar = NULL; int32_t layer; Client *ovc = NULL; @@ -116,8 +115,8 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, *pc = NULL; if (pl) *pl = NULL; - if (pd) - *pd = NULL; + if (gb) + *gb = NULL; for (layer = NUM_LAYERS - 1; layer >= 0; layer--) { if (layer == LyrFadeOut) @@ -152,8 +151,8 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, Client *temp_c = (Client *)data; if (temp_c->type == LayerShell) { l = (LayerSurface *)temp_c; - } else if (temp_c->type == CustomDecorate) { - mangocustomdecorate = (MangoCustomDecorate *)temp_c; + } else if (temp_c->type == GroupBar) { + mangogroupbar = (MangoGroupBar *)temp_c; } else if (temp_c->type == XDGShell || temp_c->type == X11) { c = temp_c; } @@ -175,8 +174,8 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, *pc = c; if (pl) *pl = l; - if (pd) - *pd = mangocustomdecorate; + if (gb) + *gb = mangogroupbar; if (selmon && selmon->isoverview && config.ov_no_resize) { ovc = xytoclient(x, y); @@ -196,8 +195,8 @@ void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, *psurface = ovc ? client_surface(ovc) : NULL; if (pl) *pl = NULL; - if (pd) - *pd = NULL; + if (gb) + *gb = NULL; } } } \ No newline at end of file diff --git a/src/layout/arrange.h b/src/layout/arrange.h index 4a441f14..803970da 100644 --- a/src/layout/arrange.h +++ b/src/layout/arrange.h @@ -1132,7 +1132,7 @@ void pre_caculate_before_arrange(Monitor *m, bool want_animation, client_add_jump_label_node(c); } - if (c->tab_bar_node && c->tab_bar_node->scene_buffer->node.enabled) { + if (c->group_bar && c->group_bar->scene_buffer->node.enabled) { client_check_tab_node_visible(c); } diff --git a/src/layout/scroll.h b/src/layout/scroll.h index 63e52c99..dbdfe919 100644 --- a/src/layout/scroll.h +++ b/src/layout/scroll.h @@ -698,7 +698,7 @@ void vertical_scroller(Monitor *m) { } else { bar_height = !root_client->isfullscreen && (root_client->group_prev || root_client->group_next) - ? config.tab_bar_height + ? config.group_bar_height : 0; target_geom.y = root_client->geom.y - bar_height; @@ -718,7 +718,7 @@ void vertical_scroller(Monitor *m) { bar_height = !heads[focus_index - i + 1]->client->isfullscreen && (heads[focus_index - i + 1]->client->group_prev || heads[focus_index - i + 1]->client->group_next) - ? config.tab_bar_height + ? config.group_bar_height : 0; up_geom.y = heads[focus_index - i + 1]->client->geom.y - cur_gappiv - diff --git a/src/mango.c b/src/mango.c index d69e74d7..95ca4e91 100644 --- a/src/mango.c +++ b/src/mango.c @@ -165,9 +165,17 @@ enum { TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; enum { VERTICAL, HORIZONTAL }; enum { SWIPE_UP, SWIPE_DOWN, SWIPE_LEFT, SWIPE_RIGHT }; -enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -enum { XDGShell, LayerShell, X11, CustomDecorate, Snapshot }; /* client types */ -enum { AxisUp, AxisDown, AxisLeft, AxisRight }; // 滚轮滚动的方向 +enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ +enum { + XDGShell, + LayerShell, + X11, + Snapshot, + XdgPopup, + XdgImPopup, + GroupBar +}; /* client types */ +enum { AxisUp, AxisDown, AxisLeft, AxisRight }; // 滚轮滚动的方向 enum { LyrBg, LyrBlur, @@ -182,8 +190,6 @@ enum { NUM_LAYERS }; /* scene layers */ -enum mango_node_type { MANGO_TITLE_NODE, MANGO_JUMP_NODE }; - #ifdef XWAYLAND enum { NetWMWindowTypeDialog, @@ -249,13 +255,6 @@ typedef struct { uint32_t ui2; Client *tc; } Arg; - -typedef struct { - uint32_t type; - enum mango_node_type node_type; - void *node_data; -} MangoCustomDecorate; - typedef struct { uint32_t mod; uint32_t button; @@ -347,8 +346,8 @@ struct Client { struct wlr_ext_image_capture_source_v1 *image_capture_source; struct wlr_scene_surface *image_capture_scene_surface; struct wlr_scene_tree *overview_scene_surface; - struct mango_jump_label_node *jump_label_node; - struct mango_tab_bar_node *tab_bar_node; + MangoJumpLabel *jump_label_node; + MangoGroupBar *group_bar; struct wl_list link; struct wl_list flink; struct wl_list fadeout_link; @@ -540,6 +539,7 @@ typedef struct { } LayerSurface; typedef struct { + uint32_t type; struct wlr_xdg_popup *wlr_popup; struct wl_listener destroy; struct wl_listener commit; @@ -805,7 +805,7 @@ static Monitor *get_monitor_nearest_to(int32_t x, int32_t y); static void handle_iamge_copy_capture_new_session(struct wl_listener *listener, void *data); static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, MangoCustomDecorate **pd, + Client **pc, LayerSurface **pl, MangoGroupBar **tb, double *nx, double *ny); static void clear_fullscreen_flag(Client *c); static pid_t getparentprocess(pid_t p); @@ -943,8 +943,8 @@ static void overview_backup_surface(Client *c); static void create_jump_hints(Monitor *m); static void finish_jump_mode(Monitor *m); static void begin_jump_mode(Monitor *m); -static void global_draw_tab_bar(Client *c, int32_t x, int32_t y, int32_t width, - int32_t height); +static void global_draw_group_bar(Client *c, int32_t x, int32_t y, + int32_t width, int32_t height); static void client_reparent_group(Client *c); @@ -1333,7 +1333,7 @@ void client_replace(Client *c, Client *w, bool isgroupaction) { } if (c->isgroupfocusing) - mango_tab_bar_node_set_focus(c->tab_bar_node, true); + mango_group_bar_set_focus(c->group_bar, true); } if (w->overview_scene_surface) { @@ -1346,8 +1346,8 @@ void client_replace(Client *c, Client *w, bool isgroupaction) { overview_backup_surface(c); } - if (w->tab_bar_node && !isgroupaction) { - wlr_scene_node_set_enabled(&w->tab_bar_node->scene_buffer->node, false); + if (w->group_bar && !isgroupaction) { + wlr_scene_node_set_enabled(&w->group_bar->scene_buffer->node, false); } if (c->link.prev && c->link.next && c->link.prev != &c->link) { @@ -2436,7 +2436,7 @@ bool handle_buttonpress(struct wlr_pointer_button_event *event) { uint32_t hard_mods, mods; Client *c = NULL; LayerSurface *l = NULL; - MangoCustomDecorate *md = NULL; + MangoGroupBar *gb = NULL; struct wlr_surface *surface; Client *tmpc = NULL; int32_t ji; @@ -2458,7 +2458,7 @@ bool handle_buttonpress(struct wlr_pointer_button_event *event) { if (locked) break; - xytonode(cursor->x, cursor->y, &surface, NULL, NULL, &md, NULL, NULL); + xytonode(cursor->x, cursor->y, &surface, NULL, NULL, &gb, NULL, NULL); if (toplevel_from_wlr_surface(surface, &c, &l) >= 0) { if (c && c->scene->node.enabled && (!client_is_unmanaged(c) || client_wants_focus(c))) @@ -2489,7 +2489,7 @@ bool handle_buttonpress(struct wlr_pointer_button_event *event) { } // handle click on tile node - client_handle_decorate_click(md); + client_handle_decorate_click(gb); // 当鼠标焦点在layer上的时候,不检测虚拟键盘的mod状态, // 避免layer虚拟键盘锁死mod按键状态 @@ -3154,6 +3154,8 @@ static void createpopup(struct wl_listener *listener, void *data) { if (!popup) return; + popup->type = XdgPopup; + popup->destroy.notify = destroypopup; wl_signal_add(&wlr_popup->events.destroy, &popup->destroy); @@ -4521,7 +4523,7 @@ void init_client_properties(Client *c) { c->grid_col_per = 1.0f; c->grid_row_per = 1.0f; c->jump_label_node = NULL; - c->tab_bar_node = NULL; + c->group_bar = NULL; c->overview_scene_surface = NULL; c->drop_direction = UNDIR; c->enable_drop_area_draw = false; @@ -4698,7 +4700,7 @@ mapnotify(struct wl_listener *listener, void *data) { wlr_scene_node_set_enabled(&c->splitindicator[i]->node, false); } - client_add_tab_bar_node(c); + client_add_group_bar(c); c->droparea = wlr_scene_rect_create(c->scene, 0, 0, config.dropcolor); wlr_scene_node_lower_to_bottom(&c->droparea->node); @@ -5716,9 +5718,9 @@ void reset_maximizescreen_size(Client *c) { geom.width = c->mon->w.width - 2 * config.gappoh; geom.height = c->mon->w.height - 2 * config.gappov; - if ((c->group_next || c->group_prev) && c->tab_bar_node) { - geom.height -= config.tab_bar_height; - geom.y += config.tab_bar_height; + if ((c->group_next || c->group_prev) && c->group_bar) { + geom.height -= config.group_bar_height; + geom.y += config.group_bar_height; } resize(c, geom, 0); @@ -5763,9 +5765,9 @@ void setmaximizescreen(Client *c, int32_t maximizescreen, bool rearrange) { maximizescreen_box.width = c->mon->w.width - 2 * config.gappoh; maximizescreen_box.height = c->mon->w.height - 2 * config.gappov; - if ((c->group_next || c->group_prev) && c->tab_bar_node) { - maximizescreen_box.height -= config.tab_bar_height; - maximizescreen_box.y += config.tab_bar_height; + if ((c->group_next || c->group_prev) && c->group_bar) { + maximizescreen_box.height -= config.group_bar_height; + maximizescreen_box.y += config.group_bar_height; } wlr_scene_node_raise_to_top(&c->scene->node); @@ -6853,9 +6855,9 @@ void unmapnotify(struct wl_listener *listener, void *data) { mango_jump_label_node_destroy(c->jump_label_node); c->jump_label_node = NULL; } - if (c->tab_bar_node) { - mango_tab_bar_node_destroy(c->tab_bar_node); - c->tab_bar_node = NULL; + if (c->group_bar) { + mango_group_bar_destroy(c->group_bar); + c->group_bar = NULL; } wlr_scene_node_destroy(&c->image_capture_scene_surface->buffer->node); @@ -7015,7 +7017,7 @@ void updatetitle(struct wl_listener *listener, void *data) { const char *title; title = client_get_title(c); - mango_tab_bar_node_update(c->tab_bar_node, title, 1.0); + mango_group_bar_update(c->group_bar, title, 1.0); if (title && c->foreign_toplevel) wlr_foreign_toplevel_handle_v1_set_title(c->foreign_toplevel, title); if (title && c->ext_foreign_toplevel) {