bar item refactoring

This commit is contained in:
FelixKratz 2021-09-27 21:34:01 +02:00
parent 088bcc618a
commit 5629b88173
11 changed files with 323 additions and 289 deletions

74
src/background.c Normal file
View file

@ -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;
}

23
src/background.h Normal file
View file

@ -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

View file

@ -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);

View file

@ -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,

View file

@ -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);

View file

@ -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);

11
src/group.h Normal file
View file

@ -0,0 +1,11 @@
#ifndef GROUP_H_
#define GROUP_H_
struct group {
char* name;
// Background
struct rgba_color background_color;
};
#endif

View file

@ -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"

View file

@ -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 <property> <value>

69
src/text.c Normal file
View file

@ -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);
}

24
src/text.h Normal file
View file

@ -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_