diff --git a/src/background.c b/src/background.c new file mode 100644 index 0000000..f73dcd8 --- /dev/null +++ b/src/background.c @@ -0,0 +1,74 @@ +#include "background.h" +#include "misc/helpers.h" + +void background_init(struct background* background) { + background->enabled = false; + + background->height = 0; + background->border_width = 0; + background->padding_left = 0; + background->padding_right = 0; + background->corner_radius = 0; + + background->color = rgba_color_from_hex(0xff000000); + background->border_color = rgba_color_from_hex(0xff000000); +} + +bool background_set_color(struct background* background, uint32_t color) { + struct rgba_color target_color = rgba_color_from_hex(color); + if (background->color.r == target_color.r + && background->color.g == target_color.g + && background->color.b == target_color.b + && background->color.a == target_color.a) return false; + background->color = target_color; + background_set_enabled(background, true); + return true; +} + +bool background_set_border_color(struct background* background, uint32_t color) { + struct rgba_color target_color = rgba_color_from_hex(color); + if (background->border_color.r == target_color.r + && background->border_color.g == target_color.g + && background->border_color.b == target_color.b + && background->border_color.a == target_color.a) return false; + background->border_color = target_color; + return true; +} + +bool background_set_enabled(struct background* background, bool enabled) { + if (background->enabled == enabled) return false; + background->enabled = enabled; + return true; +} + +bool background_set_height(struct background* background, uint32_t height) { + if (background->height == height) return false; + background->height = height; + return true; +} + +bool background_set_border_width(struct background* background, uint32_t border_width) { + if (background->border_width == border_width) return false; + background->border_width = border_width; + return true; +} + +bool background_set_corner_radius(struct background* background, uint32_t corner_radius) { + if (background->corner_radius == corner_radius) return false; + background->corner_radius = corner_radius; + return true; +} + + + + + + + + + + + + + + diff --git a/src/background.h b/src/background.h new file mode 100644 index 0000000..15d80a1 --- /dev/null +++ b/src/background.h @@ -0,0 +1,23 @@ +#ifndef BACKGROUND_H +#define BACKGROUND_H + +struct background { + bool enabled; + uint32_t height; + uint32_t corner_radius; + uint32_t border_width; + int padding_left; + int padding_right; + struct rgba_color color; + struct rgba_color border_color; +}; + +void background_init(struct background* background); +bool background_set_color(struct background* background, uint32_t color); +bool background_set_border_color(struct background* background, uint32_t color); +bool background_set_enabled(struct background* background, bool enabled); +bool background_set_height(struct background* background, uint32_t height); +bool background_set_border_width(struct background* background, uint32_t border_width); +bool background_set_corner_radius(struct background* background, uint32_t corner_radius); + +#endif // !BACKGROUND_H diff --git a/src/bar.c b/src/bar.c index 9b61615..ee92faa 100644 --- a/src/bar.c +++ b/src/bar.c @@ -132,9 +132,9 @@ static int bar_get_center_length(struct bar_manager* bar_manager) { for (int i = 0; i < bar_manager->bar_item_count; i++) { struct bar_item* bar_item = bar_manager->bar_items[i]; if (bar_item->position == BAR_POSITION_CENTER) { - total_length += bar_item->label_line.bounds.size.width + bar_item->icon_line.bounds.size.width + bar_item->icon_padding_right + bar_item->label_padding_left + (bar_item->has_graph ? bar_item->graph_data.graph_width : 0); + total_length += bar_item->label.line.bounds.size.width + bar_item->icon.line.bounds.size.width + bar_item->icon.padding_right + bar_item->label.padding_left + (bar_item->has_graph ? bar_item->graph_data.graph_width : 0); if (i > 0) { - total_length += bar_manager->bar_items[i-1]->label_padding_right + bar_item->icon_padding_left; + total_length += bar_manager->bar_items[i-1]->label.padding_right + bar_item->icon.padding_left; } } } @@ -147,12 +147,12 @@ void bar_draw_graph(struct bar* bar, struct bar_item* bar_item, uint32_t x, bool } void bar_draw_item_background(struct bar* bar, struct bar_item* bar_item, uint32_t adid) { - if (!bar_item->draws_background) return; - bool custom_height = bar_item->background_height != 0; - CGRect draw_region = {{bar_item->bounding_rects[adid - 1]->origin.x - bar->origin.x, custom_height ? ((bar->frame.size.height - bar_item->background_height)) / 2 : (g_bar_manager.border_width + 1)}, - {bar_item->bounding_rects[adid - 1]->size.width, custom_height ? bar_item->background_height : (bar->frame.size.height - 2*(g_bar_manager.border_width + 1))}}; - draw_region = CGRectInset(draw_region, bar_item->background_border_width / 2, bar_item->background_border_width / 2); - draw_rect(bar->context, draw_region, &bar_item->background_color, bar_item->background_corner_radius, bar_item->background_border_width, &bar_item->background_border_color, false); + if (!bar_item->background.enabled) return; + bool custom_height = bar_item->background.height != 0; + CGRect draw_region = {{bar_item->bounding_rects[adid - 1]->origin.x - bar->origin.x, custom_height ? ((bar->frame.size.height - bar_item->background.height)) / 2 : (g_bar_manager.border_width + 1)}, + {bar_item->bounding_rects[adid - 1]->size.width, custom_height ? bar_item->background.height : (bar->frame.size.height - 2*(g_bar_manager.border_width + 1))}}; + draw_region = CGRectInset(draw_region, bar_item->background.border_width / 2, bar_item->background.border_width / 2); + draw_rect(bar->context, draw_region, &bar_item->background.color, bar_item->background.corner_radius, bar_item->background.border_width, &bar_item->background.border_color, false); } void bar_draw_alias(struct bar* bar, struct bar_item* bar_item, uint32_t x) { @@ -182,21 +182,21 @@ void bar_redraw(struct bar* bar) { if (bar_item->associated_display > 0 && !(bar_item->associated_display & (1 << adid))) continue; if (bar_item->associated_space > 0 && !(bar_item->associated_space & (1 << sid)) && (bar_item->type != BAR_COMPONENT_SPACE)) continue; - struct bar_line* label = &bar_item->label_line; - struct bar_line* icon = &bar_item->icon_line; + struct bar_line* label = &bar_item->label.line; + struct bar_line* icon = &bar_item->icon.line; CGPoint icon_position = bar_align_line(bar, icon, ALIGN_CENTER, ALIGN_CENTER); CGPoint label_position = bar_align_line(bar, label, ALIGN_CENTER, ALIGN_CENTER); uint32_t graph_x = 0; bool graph_rtl = false; if (bar_item->position == BAR_POSITION_LEFT) { - icon_position.x = bar_left_final_item_x + bar_item->icon_padding_left + bar_item->background_padding_left; - label_position.x = icon_position.x + icon->bounds.size.width + bar_item->icon_padding_right + bar_item->label_padding_left; + icon_position.x = bar_left_final_item_x + bar_item->icon.padding_left + bar_item->background.padding_left; + label_position.x = icon_position.x + icon->bounds.size.width + bar_item->icon.padding_right + bar_item->label.padding_left; if (!bar_item->nospace) - bar_left_final_item_x = label_position.x + label->bounds.size.width + bar_item->label_padding_right + bar_item->background_padding_right; + bar_left_final_item_x = label_position.x + label->bounds.size.width + bar_item->label.padding_right + bar_item->background.padding_right; if (bar_item->has_graph) { - graph_x = bar_item->nospace ? label_position.x + label->bounds.size.width + bar_item->label_padding_right + bar_item->background_padding_right : bar_left_final_item_x; + graph_x = bar_item->nospace ? label_position.x + label->bounds.size.width + bar_item->label.padding_right + bar_item->background.padding_right : bar_left_final_item_x; if (!bar_item->nospace) bar_left_final_item_x += bar_item->graph_data.graph_width; } @@ -205,13 +205,13 @@ void bar_redraw(struct bar* bar) { } } else if (bar_item->position == BAR_POSITION_RIGHT) { - label_position.x = bar_right_first_item_x - label->bounds.size.width - bar_item->label_padding_right - bar_item->background_padding_right; - icon_position.x = label_position.x - icon->bounds.size.width - bar_item->icon_padding_right - bar_item->label_padding_left + 1; + label_position.x = bar_right_first_item_x - label->bounds.size.width - bar_item->label.padding_right - bar_item->background.padding_right; + icon_position.x = label_position.x - icon->bounds.size.width - bar_item->icon.padding_right - bar_item->label.padding_left + 1; if (!bar_item->nospace) - bar_right_first_item_x = icon_position.x - bar_item->icon_padding_left - bar_item->background_padding_left; + bar_right_first_item_x = icon_position.x - bar_item->icon.padding_left - bar_item->background.padding_left; if (bar_item->has_graph) { - graph_x = bar_item->nospace ? icon_position.x - bar_item->icon_padding_left - bar_item->background_padding_left : bar_right_first_item_x; + graph_x = bar_item->nospace ? icon_position.x - bar_item->icon.padding_left - bar_item->background.padding_left : bar_right_first_item_x; graph_rtl = true; if (!bar_item->nospace) bar_right_first_item_x -= bar_item->graph_data.graph_width; @@ -222,13 +222,13 @@ void bar_redraw(struct bar* bar) { } } else if (bar_item->position == BAR_POSITION_CENTER) { - icon_position.x = bar_center_first_item_x + bar_item->icon_padding_left + bar_item->background_padding_left; - label_position.x = icon_position.x + icon->bounds.size.width + bar_item->icon_padding_right + bar_item->label_padding_left; + icon_position.x = bar_center_first_item_x + bar_item->icon.padding_left + bar_item->background.padding_left; + label_position.x = icon_position.x + icon->bounds.size.width + bar_item->icon.padding_right + bar_item->label.padding_left; if (!bar_item->nospace) - bar_center_first_item_x = label_position.x + label->bounds.size.width + bar_item->label_padding_right + bar_item->background_padding_right; + bar_center_first_item_x = label_position.x + label->bounds.size.width + bar_item->label.padding_right + bar_item->background.padding_right; if (bar_item->has_graph) { - graph_x = bar_item->nospace ? label_position.x + label->bounds.size.width + bar_item->label_padding_right + bar_item->background_padding_right : bar_center_first_item_x; + graph_x = bar_item->nospace ? label_position.x + label->bounds.size.width + bar_item->label.padding_right + bar_item->background.padding_right : bar_center_first_item_x; if (!bar_item->nospace) bar_center_first_item_x += bar_item->graph_data.graph_width; } @@ -236,8 +236,8 @@ void bar_redraw(struct bar* bar) { bar_center_first_item_x += bar_item->alias.bounds.size.width; } } - bar_item->label_line.bounds.origin = label_position; - bar_item->icon_line.bounds.origin = icon_position; + bar_item->label.line.bounds.origin = label_position; + bar_item->icon.line.bounds.origin = icon_position; bar_item_append_associated_bar(bar_item, (1 << (adid - 1))); bar_item_set_bounding_rect_for_display(bar_item, adid, bar->origin); diff --git a/src/bar_item.c b/src/bar_item.c index cee85c2..3baaca7 100644 --- a/src/bar_item.c +++ b/src/bar_item.c @@ -15,24 +15,23 @@ void bar_item_inherit_from_item(struct bar_item* bar_item, struct bar_item* ance bar_item->lazy = ancestor->lazy; bar_item->updates = ancestor->updates; bar_item->drawing = ancestor->drawing; - bar_item->icon_color = ancestor->icon_color; - bar_item->icon_font_name = ancestor->icon_font_name; - bar_item->label_color = ancestor->label_color; - bar_item->label_font_name = ancestor->label_font_name; - bar_item->icon_padding_left = ancestor->icon_padding_left; - bar_item->icon_padding_right = ancestor->icon_padding_right; - bar_item->label_padding_left = ancestor->label_padding_left; - bar_item->label_padding_right = ancestor->label_padding_right; + + text_destroy(&bar_item->icon); + text_destroy(&bar_item->label); + + bar_item->icon = ancestor->icon; + bar_item->label = ancestor->label; + text_clear_pointers(&bar_item->icon); + text_clear_pointers(&bar_item->label); + text_set_font(&bar_item->icon, string_copy(ancestor->icon.font_name), true); + text_set_font(&bar_item->label, string_copy(ancestor->label.font_name), true); + text_set_string(&bar_item->icon, string_copy(ancestor->icon.string), true); + text_set_string(&bar_item->label, string_copy(ancestor->label.string), true); + bar_item->update_frequency = ancestor->update_frequency; bar_item->cache_scripts = ancestor->cache_scripts; - bar_item->icon_highlight_color = ancestor->icon_highlight_color; - bar_item->label_highlight_color = ancestor->label_highlight_color; - bar_item->background_color = ancestor->background_color; - bar_item->draws_background = ancestor->draws_background; - bar_item->background_height = ancestor->background_height; - bar_item->background_corner_radius = ancestor->background_corner_radius; - bar_item->background_border_color = ancestor->background_border_color; - bar_item->background_border_width = ancestor->background_border_width; + + bar_item->background = ancestor->background; bar_item->y_offset = ancestor->y_offset; } @@ -54,41 +53,20 @@ void bar_item_init(struct bar_item* bar_item, struct bar_item* default_item) { bar_item->associated_display = 0; bar_item->associated_space = 0; bar_item->associated_bar = 0; - bar_item->icon_font_name = "Hack Nerd Font:Bold:14.0"; - bar_item->label_font_name = "Hack Nerd Font:Bold:14.0"; - bar_item->icon_highlight = false; - bar_item->icon = ""; - bar_item->icon_padding_left = 0; - bar_item->icon_padding_right = 0; - bar_item->icon_color = rgba_color_from_hex(0xffffffff); - bar_item->icon_highlight_color = rgba_color_from_hex(0xffffffff); - bar_item->label_highlight = false; - bar_item->label = ""; - bar_item->label_padding_left = 0; - bar_item->label_padding_right = 0; - bar_item->label_color = rgba_color_from_hex(0xffffffff); - bar_item->label_highlight_color = rgba_color_from_hex(0xffffffff); - bar_item->has_graph = false; - bar_item->num_rects = 0; - bar_item->draws_background = false; - bar_item->background_color = rgba_color_from_hex(0x44ff0000); - bar_item->background_border_color = rgba_color_from_hex(0x44ff0000); - bar_item->background_height = 0; - bar_item->background_corner_radius = 0; - bar_item->background_border_width = 0; - bar_item->background_padding_left = 0; - bar_item->background_padding_right = 0; + bar_item->y_offset = 0; + bar_item->num_rects = 0; bar_item->bounding_rects = NULL; + bar_item->has_alias = false; + bar_item->has_graph = false; + text_init(&bar_item->icon); + text_init(&bar_item->label); + background_init(&bar_item->background); + if (default_item) bar_item_inherit_from_item(bar_item, default_item); - bar_item_set_icon(bar_item, string_copy(""), false); - bar_item_set_icon_font(bar_item, string_copy(bar_item->icon_font_name), true); - bar_item_set_label_font(bar_item, string_copy(bar_item->label_font_name), true); - bar_item_set_label(bar_item, string_copy(""), false); - strncpy(&bar_item->signal_args.name[0][0], "NAME", 255); strncpy(&bar_item->signal_args.name[1][0], "SELECTED", 255); strncpy(&bar_item->signal_args.value[1][0], "false", 255); @@ -199,77 +177,6 @@ void bar_item_set_click_script(struct bar_item* bar_item, char* script) { else bar_item->click_script = script; } -void bar_item_set_icon(struct bar_item* bar_item, char* icon, bool forced) { - if (!icon) return; - if (!forced && bar_item->icon && strcmp(bar_item->icon, icon) == 0) { free(icon); return; } - if (bar_item->icon_line.line) bar_destroy_line(&bar_item->icon_line); - if (icon != bar_item->icon && !bar_item->icon) free(bar_item->icon); - bar_item->icon = icon; - bar_prepare_line(&bar_item->icon_line, bar_item->icon_font, bar_item->icon, bar_item->icon_highlight ? bar_item->icon_highlight_color : bar_item->icon_color); - bar_item_needs_update(bar_item); -} - -void bar_item_update_icon_color(struct bar_item *bar_item) { - struct rgba_color target_color = bar_item->icon_highlight ? bar_item->icon_highlight_color : bar_item->icon_color; - if (bar_item->icon_line.color.r == target_color.r - && bar_item->icon_line.color.g == target_color.g - && bar_item->icon_line.color.b == target_color.b - && bar_item->icon_line.color.a == target_color.a) return; - bar_item->icon_line.color = target_color; - bar_item_needs_update(bar_item); -} - -void bar_item_set_icon_color(struct bar_item* bar_item, uint32_t color) { - bar_item->icon_color = rgba_color_from_hex(color); - bar_item_update_icon_color(bar_item); -} - -void bar_item_set_label(struct bar_item* bar_item, char* label, bool forced) { - if (!label) return; - if (!forced && bar_item->label && strcmp(bar_item->label, label) == 0) { free(label); return; } - if (bar_item->label_line.line) bar_destroy_line(&bar_item->label_line); - if (label != bar_item->label && !bar_item->label) free(bar_item->label); - bar_item->label = label; - bar_prepare_line(&bar_item->label_line, bar_item->label_font, bar_item->label, bar_item->label_highlight ? bar_item->label_highlight_color : bar_item->label_color); - bar_item_needs_update(bar_item); -} - - -void bar_item_set_label_color(struct bar_item* bar_item, uint32_t color) { - bar_item->label_color = rgba_color_from_hex(color); - bar_item_update_label_color(bar_item); -} - -void bar_item_update_label_color(struct bar_item *bar_item) { - struct rgba_color target_color = bar_item->label_highlight ? bar_item->label_highlight_color : bar_item->label_color; - if (bar_item->label_line.color.r == target_color.r - && bar_item->label_line.color.g == target_color.g - && bar_item->label_line.color.b == target_color.b - && bar_item->label_line.color.a == target_color.a) return; - bar_item->label_line.color = target_color; - bar_item_needs_update(bar_item); -} - -void bar_item_set_icon_font(struct bar_item* bar_item, char *font_string, bool forced) { - if (!font_string) return; - if (!forced && bar_item->icon_font_name && strcmp(bar_item->icon_font_name, font_string) == 0) { free(font_string); return; } - if (bar_item->icon_font) CFRelease(bar_item->icon_font); - - bar_item->icon_font = bar_create_font(font_string); - bar_item->icon_font_name = font_string; - bar_item_set_icon(bar_item, bar_item->icon, true); -} - -void bar_item_set_label_font(struct bar_item* bar_item, char *font_string, bool forced) { - if (!font_string) return; - if (!forced && bar_item->label_font_name && strcmp(bar_item->label_font_name, font_string) == 0) { free(font_string); return; } - if (bar_item->label_font) CFRelease(bar_item->label_font); - - bar_item->label_font = bar_create_font(font_string); - bar_item->label_font_name = font_string; - bar_item_set_label(bar_item, bar_item->label, true); -} - void bar_item_set_drawing(struct bar_item* bar_item, bool state) { if (bar_item->drawing == state) return; bar_item->drawing = state; @@ -282,51 +189,6 @@ void bar_item_on_click(struct bar_item* bar_item) { fork_exec(bar_item->click_script, &bar_item->signal_args); } -void bar_item_set_background_color(struct bar_item* bar_item, uint32_t color) { - struct rgba_color target_color = rgba_color_from_hex(color); - if (bar_item->background_color.r == target_color.r - && bar_item->background_color.g == target_color.g - && bar_item->background_color.b == target_color.b - && bar_item->background_color.a == target_color.a) return; - bar_item->background_color = target_color; - bar_item_set_draws_background(bar_item, true); - bar_item_needs_update(bar_item); -} - -void bar_item_set_background_border_color(struct bar_item* bar_item, uint32_t color) { - struct rgba_color target_color = rgba_color_from_hex(color); - if (bar_item->background_border_color.r == target_color.r - && bar_item->background_border_color.g == target_color.g - && bar_item->background_border_color.b == target_color.b - && bar_item->background_border_color.a == target_color.a) return; - bar_item->background_border_color = target_color; - bar_item_needs_update(bar_item); -} - -void bar_item_set_draws_background(struct bar_item* bar_item, bool enabled) { - if (bar_item->draws_background == enabled) return; - bar_item->draws_background = enabled; - bar_item_needs_update(bar_item); -} - -void bar_item_set_background_height(struct bar_item* bar_item, uint32_t height) { - if (bar_item->background_height == height) return; - bar_item->background_height = height; - bar_item_needs_update(bar_item); -} - -void bar_item_set_background_border_width(struct bar_item* bar_item, uint32_t border_width) { - if (bar_item->background_border_width == border_width) return; - bar_item->background_border_width = border_width; - bar_item_needs_update(bar_item); -} - -void bar_item_set_background_corner_radius(struct bar_item* bar_item, uint32_t corner_radius) { - if (bar_item->background_corner_radius == corner_radius) return; - bar_item->background_corner_radius = corner_radius; - bar_item_needs_update(bar_item); -} - void bar_item_set_yoffset(struct bar_item* bar_item, int offset) { if (bar_item->y_offset == offset) return; bar_item->y_offset = offset; @@ -335,13 +197,13 @@ void bar_item_set_yoffset(struct bar_item* bar_item, int offset) { CGRect bar_item_construct_bounding_rect(struct bar_item* bar_item) { CGRect bounding_rect; - bounding_rect.origin = bar_item->icon_line.bounds.origin; - bounding_rect.origin.x -= bar_item->icon_padding_left; - bounding_rect.origin.y = bar_item->icon_line.bounds.origin.y < bar_item->label_line.bounds.origin.y ? bar_item->icon_line.bounds.origin.y : bar_item->label_line.bounds.origin.y; - bounding_rect.size.width = bar_item->label_line.bounds.size.width + bar_item->icon_line.bounds.size.width - + bar_item->icon_padding_left + bar_item->icon_padding_right - + bar_item->label_padding_right + bar_item->label_padding_left; - bounding_rect.size.height = bar_item->label_line.bounds.size.height > bar_item->icon_line.bounds.size.height ? bar_item->label_line.bounds.size.height : bar_item->icon_line.bounds.size.height; + bounding_rect.origin = bar_item->icon.line.bounds.origin; + bounding_rect.origin.x -= bar_item->icon.padding_left; + bounding_rect.origin.y = bar_item->icon.line.bounds.origin.y < bar_item->label.line.bounds.origin.y ? bar_item->icon.line.bounds.origin.y : bar_item->label.line.bounds.origin.y; + bounding_rect.size.width = bar_item->label.line.bounds.size.width + bar_item->icon.line.bounds.size.width + + bar_item->icon.padding_left + bar_item->icon.padding_right + + bar_item->label.padding_right + bar_item->label.padding_left; + bounding_rect.size.height = bar_item->label.line.bounds.size.height > bar_item->icon.line.bounds.size.height ? bar_item->label.line.bounds.size.height : bar_item->icon.line.bounds.size.height; return bounding_rect; } @@ -365,10 +227,9 @@ void bar_item_destroy(struct bar_item* bar_item) { if (bar_item->name) free(bar_item->name); if (bar_item->script && !bar_item->cache_scripts) free(bar_item->script); if (bar_item->click_script && !bar_item->cache_scripts) free(bar_item->click_script); - if (bar_item->icon) free(bar_item->icon); - if (bar_item->icon_font_name) free(bar_item->icon_font_name); - if (bar_item->label) free(bar_item->label); - if (bar_item->label_font_name) free(bar_item->label_font_name); + + text_destroy(&bar_item->icon); + text_destroy(&bar_item->label); if (bar_item->bounding_rects) { for (int j = 0; j < bar_item->num_rects; j++) { @@ -427,28 +288,28 @@ void bar_item_serialize(struct bar_item* bar_item, FILE* rsp) { "\t\"bounding_rects\": {\n", bar_item->name, bar_item->type, - bar_item->icon, - bar_item->label, - bar_item->icon_font_name, - bar_item->label_font_name, + bar_item->icon.string, + bar_item->label.string, + bar_item->icon.font_name, + bar_item->label.font_name, bar_item->position, bar_item->nospace, - bar_item->background_padding_left, - bar_item->background_padding_right, - bar_item->icon_padding_left, - bar_item->icon_padding_right, - bar_item->label_padding_left, - bar_item->label_padding_right, - hex_from_rgba_color(bar_item->icon_color), - hex_from_rgba_color(bar_item->icon_highlight_color), - hex_from_rgba_color(bar_item->label_color), - hex_from_rgba_color(bar_item->label_highlight_color), - bar_item->draws_background, - bar_item->background_height, - bar_item->background_corner_radius, - bar_item->background_border_width, - hex_from_rgba_color(bar_item->background_color), - hex_from_rgba_color(bar_item->background_border_color), + bar_item->background.padding_left, + bar_item->background.padding_right, + bar_item->icon.padding_left, + bar_item->icon.padding_right, + bar_item->label.padding_left, + bar_item->label.padding_right, + hex_from_rgba_color(bar_item->icon.color), + hex_from_rgba_color(bar_item->icon.highlight_color), + hex_from_rgba_color(bar_item->label.color), + hex_from_rgba_color(bar_item->label.highlight_color), + bar_item->background.enabled, + bar_item->background.height, + bar_item->background.corner_radius, + bar_item->background.border_width, + hex_from_rgba_color(bar_item->background.color), + hex_from_rgba_color(bar_item->background.border_color), bar_item->drawing, bar_item->updates, bar_item->lazy, diff --git a/src/bar_item.h b/src/bar_item.h index 22635dd..a4c6028 100644 --- a/src/bar_item.h +++ b/src/bar_item.h @@ -44,36 +44,13 @@ struct bar_item { int y_offset; // Background - bool draws_background; - uint32_t background_height; - uint32_t background_corner_radius; - uint32_t background_border_width; - int background_padding_left; - int background_padding_right; - struct rgba_color background_color; - struct rgba_color background_border_color; + struct background background; // Icon properties - bool icon_highlight; - struct bar_line icon_line; - char* icon; - char* icon_font_name; - CTFontRef icon_font; - int icon_padding_left; - int icon_padding_right; - struct rgba_color icon_color; - struct rgba_color icon_highlight_color; + struct text icon; // Label properties - bool label_highlight; - struct bar_line label_line; - char* label; - char* label_font_name; - CTFontRef label_font; - int label_padding_left; - int label_padding_right; - struct rgba_color label_color; - struct rgba_color label_highlight_color; + struct text label; // Graph Data bool has_graph; @@ -109,21 +86,7 @@ void bar_item_set_name(struct bar_item* bar_item, char* name); void bar_item_set_type(struct bar_item* bar_item, char type); void bar_item_set_script(struct bar_item* bar_item, char* script); void bar_item_set_click_script(struct bar_item* bar_item, char* script); -void bar_item_set_icon(struct bar_item* bar_item, char* icon, bool forced); -void bar_item_set_icon_color(struct bar_item* bar_item, uint32_t color); -void bar_item_update_icon_color(struct bar_item* bar_item); -void bar_item_set_label(struct bar_item* bar_item, char* label, bool forced); -void bar_item_set_label_color(struct bar_item* bar_item, uint32_t color); -void bar_item_update_label_color(struct bar_item* bar_item); -void bar_item_set_label_font(struct bar_item* bar_item, char *font_string, bool forced); -void bar_item_set_icon_font(struct bar_item* bar_item, char *font_string, bool forced); void bar_item_set_drawing(struct bar_item* bar_item, bool state); -void bar_item_set_background_color(struct bar_item* bar_item, uint32_t color); -void bar_item_set_background_border_color(struct bar_item* bar_item, uint32_t color); -void bar_item_set_draws_background(struct bar_item* bar_item, bool enabled); -void bar_item_set_background_height(struct bar_item* bar_item, uint32_t height); -void bar_item_set_background_corner_radius(struct bar_item* bar_item, uint32_t corner_radius); -void bar_item_set_background_border_width(struct bar_item* bar_item, uint32_t border_width); void bar_item_set_yoffset(struct bar_item* bar_item, int offset); void bar_item_needs_update(struct bar_item* bar_item); void bar_item_clear_needs_update(struct bar_item* bar_item); diff --git a/src/event.h b/src/event.h index 5fd8da8..19e1e3c 100644 --- a/src/event.h +++ b/src/event.h @@ -89,7 +89,6 @@ struct event { void *context; volatile uint32_t *info; enum event_type type; - int param; }; struct event *event_create(struct event_loop *event_loop, enum event_type type, void *context); diff --git a/src/group.h b/src/group.h new file mode 100644 index 0000000..2e5823a --- /dev/null +++ b/src/group.h @@ -0,0 +1,11 @@ +#ifndef GROUP_H_ +#define GROUP_H_ + +struct group { + char* name; + + // Background + struct rgba_color background_color; +}; + +#endif diff --git a/src/manifest.m b/src/manifest.m index 28fa429..84b79c3 100644 --- a/src/manifest.m +++ b/src/manifest.m @@ -24,7 +24,9 @@ #include "workspace.h" #include "message.h" #include "display.h" +#include "background.h" #include "bar.h" +#include "text.h" #include "graph_data.h" #include "alias.h" #include "bar_item.h" @@ -37,7 +39,9 @@ #include "workspace.m" #include "message.c" #include "display.c" +#include "background.c" #include "bar.c" +#include "text.c" #include "graph_data.c" #include "alias.c" #include "bar_item.c" diff --git a/src/message.c b/src/message.c index a96f330..c6057d9 100644 --- a/src/message.c +++ b/src/message.c @@ -364,38 +364,40 @@ static void handle_domain_add(FILE* rsp, struct token domain, char* message) { } static void message_parse_set_message_for_bar_item(FILE* rsp, struct bar_item* bar_item, char* message) { + bool needs_update = false; struct token property = get_token(&message); if (token_equals(property, COMMAND_SET_ICON)) { - bar_item_set_icon(bar_item, string_copy(message), false); + printf("Message: %s \n", message); + needs_update = text_set_string(&bar_item->icon, token_to_string(get_token(&message)), false); } else if (token_equals(property, COMMAND_SET_LABEL)) { - bar_item_set_label(bar_item, string_copy(message), false); + needs_update = text_set_string(&bar_item->label, token_to_string(get_token(&message)), false); } else if (token_equals(property, COMMAND_SET_LABEL_COLOR)) { - bar_item_set_label_color(bar_item, token_to_uint32t(get_token(&message))); + needs_update = text_set_color(&bar_item->label, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_ICON_COLOR)) { - bar_item_set_icon_color(bar_item, token_to_uint32t(get_token(&message))); + needs_update = text_set_color(&bar_item->icon, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_SCRIPTING) || token_equals(property, COMMAND_SET_UPDATES)) { bar_item->updates = evaluate_boolean_state(get_token(&message), bar_item->updates); } else if (token_equals(property, COMMAND_SET_DRAWING)) { bar_item_set_drawing(bar_item, evaluate_boolean_state(get_token(&message), bar_item->drawing)); } else if (token_equals(property, COMMAND_SET_LABEL_HIGHLIGHT)) { - bar_item->label_highlight = evaluate_boolean_state(get_token(&message), bar_item->label_highlight); - bar_item_update_label_color(bar_item); + bar_item->label.highlight = evaluate_boolean_state(get_token(&message), bar_item->label.highlight); + needs_update = text_update_color(&bar_item->label); } else if (token_equals(property, COMMAND_SET_ICON_HIGHLIGHT)) { - bar_item->icon_highlight = evaluate_boolean_state(get_token(&message), bar_item->icon_highlight); - bar_item_update_icon_color(bar_item); + bar_item->icon.highlight = evaluate_boolean_state(get_token(&message), bar_item->icon.highlight); + needs_update = text_update_color(&bar_item->icon); } else if (token_equals(property, COMMAND_SET_DRAWS_BACKGROUND)) { - bar_item_set_draws_background(bar_item, evaluate_boolean_state(get_token(&message), bar_item->draws_background)); + needs_update = background_set_enabled(&bar_item->background, evaluate_boolean_state(get_token(&message), bar_item->background.enabled)); } else if (token_equals(property, COMMAND_SET_BACKGROUND_HEIGHT)) { - bar_item_set_background_height(bar_item, token_to_uint32t(get_token(&message))); + needs_update = background_set_height(&bar_item->background, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_BACKGROUND_CORNER_RADIUS)) { - bar_item_set_background_corner_radius(bar_item, token_to_uint32t(get_token(&message))); + needs_update = background_set_corner_radius(&bar_item->background, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_BACKGROUND_BORDER_WIDTH)) { - bar_item_set_background_border_width(bar_item, token_to_uint32t(get_token(&message))); + needs_update = background_set_border_width(&bar_item->background, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_ICON_FONT)) { - bar_item_set_icon_font(bar_item, string_copy(message), false); + needs_update = text_set_font(&bar_item->icon, string_copy(message), false); } else if (token_equals(property, COMMAND_SET_LABEL_FONT)) { - bar_item_set_label_font(bar_item, string_copy(message), false); + needs_update = text_set_font(&bar_item->label, string_copy(message), false); } else if (token_equals(property, COMMAND_SET_SCRIPT)) { bar_item_set_script(bar_item, string_copy(message)); } else if (token_equals(property, COMMAND_SET_CLICK_SCRIPT)) { @@ -408,18 +410,20 @@ static void message_parse_set_message_for_bar_item(FILE* rsp, struct bar_item* b } else if (token_equals(property, COMMAND_SET_GRAPH_FILL_COLOR)) { bar_item->graph_data.fill_color = rgba_color_from_hex(token_to_uint32t(get_token(&message))); bar_item->graph_data.overrides_fill_color = true; - bar_item_needs_update(bar_item); + needs_update = true; } else if (token_equals(property, COMMAND_SET_GRAPH_LINE_WIDTH)) { bar_item->graph_data.line_width = token_to_float(get_token(&message)); - bar_item_needs_update(bar_item); + needs_update = true; } else if (token_equals(property, COMMAND_SET_BACKGROUND_COLOR)) { - bar_item_set_background_color(bar_item, token_to_uint32t(get_token(&message))); + needs_update = background_set_color(&bar_item->background, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_BACKGROUND_BORDER_COLOR)) { - bar_item_set_background_border_color(bar_item, token_to_uint32t(get_token(&message))); + needs_update = background_set_border_color(&bar_item->background, token_to_uint32t(get_token(&message))); } else if (token_equals(property, COMMAND_SET_ICON_HIGHLIGHT_COLOR)) { - bar_item->icon_highlight_color = rgba_color_from_hex(token_to_uint32t(get_token(&message))); + bar_item->icon.highlight_color = rgba_color_from_hex(token_to_uint32t(get_token(&message))); + needs_update = text_update_color(&bar_item->icon); } else if (token_equals(property, COMMAND_SET_LABEL_HIGHLIGHT_COLOR)) { - bar_item->label_highlight_color = rgba_color_from_hex(token_to_uint32t(get_token(&message))); + bar_item->label.highlight_color = rgba_color_from_hex(token_to_uint32t(get_token(&message))); + needs_update = text_update_color(&bar_item->label); } else if (token_equals(property, COMMAND_SET_POSITION)) { bar_item->position = get_token(&message).text[0]; } else if (token_equals(property, COMMAND_SET_ASSOCIATED_SPACE)) { @@ -437,23 +441,23 @@ static void message_parse_set_message_for_bar_item(FILE* rsp, struct bar_item* b bar_item_append_associated_display(bar_item, 1 << strtoul(&token.text[sep + 1], NULL, 0)); } } else if (token_equals(property, COMMAND_SET_ICON_PADDING_LEFT)) { - bar_item->icon_padding_left = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->icon.padding_left = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_ICON_PADDING_RIGHT)) { - bar_item->icon_padding_right = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->icon.padding_right = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_LABEL_PADDING_LEFT)) { - bar_item->label_padding_left = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->label.padding_left = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_LABEL_PADDING_RIGHT)) { - bar_item->label_padding_right = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->label.padding_right = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_BACKGROUND_PADDING_LEFT)) { - bar_item->background_padding_left = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->background.padding_left = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_BACKGROUND_PADDING_RIGHT)) { - bar_item->background_padding_right = token_to_int(get_token(&message)); - bar_item_needs_update(bar_item); + bar_item->background.padding_right = token_to_int(get_token(&message)); + needs_update = true; } else if (token_equals(property, COMMAND_SET_YOFFSET)) { bar_item_set_yoffset(bar_item, token_to_int(get_token(&message))); } else if (token_equals(property, COMMAND_SET_CACHE_SCRIPTS)) { @@ -478,6 +482,8 @@ static void message_parse_set_message_for_bar_item(FILE* rsp, struct bar_item* b fprintf(rsp, "unknown command '%s' for domain 'set'\n", property.text); printf("unknown command '%s' for domain 'set'\n", property.text); } + + if (needs_update) bar_item_needs_update(bar_item); } // Syntax: sketchybar -m default diff --git a/src/text.c b/src/text.c new file mode 100644 index 0000000..a5d1e9b --- /dev/null +++ b/src/text.c @@ -0,0 +1,69 @@ +#include "text.h" +#include "misc/helpers.h" + +void text_init(struct text* text) { + text->highlight = false; + text->padding_left = 0; + text->padding_right = 0; + + text->color = rgba_color_from_hex(0xffffffff); + + text->font = NULL; + text->string = string_copy(""); + text->font_name = string_copy("Hack Nerd Font:Bold:14.0"); + text_set_font(text, text->font_name, true); + text_set_string(text, text->string, false); +} + +bool text_set_string(struct text* text, char* string, bool forced) { + if (!string) return false; + if (!forced && text->string && strcmp(text->string, string) == 0) { + if (!(string == text->string)) free(string); + return false; + } + if (text->line.line) bar_destroy_line(&text->line); + if (string != text->string && !text->string) free(text->string); + text->string = string; + bar_prepare_line(&text->line, text->font, text->string, text->highlight ? text->highlight_color : text->color); + return true; +} + +bool text_set_color(struct text* text, uint32_t color) { + text->color = rgba_color_from_hex(color); + return text_update_color(text); +} + +bool text_set_font(struct text* text, char* font_string, bool forced) { + if (!font_string) return false; + if (!forced && text->font_name && strcmp(text->font_name, font_string) == 0) { free(font_string); return false; } + if (text->font) CFRelease(text->font); + + text->font = bar_create_font(font_string); + text->font_name = font_string; + return text_set_string(text, text->string, true); +} + +bool text_update_color(struct text* text) { + struct rgba_color target_color = text->highlight ? text->highlight_color : text->color; + if (text->line.color.r == target_color.r + && text->line.color.g == target_color.g + && text->line.color.b == target_color.b + && text->line.color.a == target_color.a) return false; + text->line.color = target_color; + return true; +} + +void text_clear_pointers(struct text* text) { + text->string = NULL; + text->font_name = NULL; + text->font = NULL; + text->line.line = NULL; +} + +void text_destroy(struct text* text) { + if (text->string) free(text->string); + if (text->font_name) free(text->font_name); + if (text->font) CFRelease(text->font); + if (text->line.line) CFRelease(text->line.line); + text_clear_pointers(text); +} diff --git a/src/text.h b/src/text.h new file mode 100644 index 0000000..61fe2c6 --- /dev/null +++ b/src/text.h @@ -0,0 +1,24 @@ +#ifndef TEXT_H +#define TEXT_H + +struct text { + bool highlight; + struct bar_line line; + char* string; + char* font_name; + CTFontRef font; + int padding_left; + int padding_right; + struct rgba_color color; + struct rgba_color highlight_color; +}; + +void text_init(struct text* text); +void text_clear_pointers(struct text* text); +void text_destroy(struct text* text); +bool text_set_string(struct text* text, char* string, bool forced); +bool text_set_color(struct text* text, uint32_t color); +bool text_set_font(struct text* text, char* font_string, bool forced); +bool text_update_color(struct text* text); + +#endif // !TEXT_H_