mirror of
https://github.com/FelixKratz/SketchyBar
synced 2024-11-10 13:54:16 +00:00
added option to comletely remove an item
This commit is contained in:
parent
e505222dfe
commit
d88cda7dbb
8 changed files with 82 additions and 7 deletions
|
@ -199,6 +199,12 @@ This pushes the data point into the graph with name *name*.
|
|||
```bash
|
||||
sketchybar -m update
|
||||
```
|
||||
### Completely remove an item
|
||||
```bash
|
||||
sketchybar -m remove item <name>
|
||||
```
|
||||
This also works for components, just reference it by name.
|
||||
|
||||
|
||||
## Credits
|
||||
yabai,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "bar_item.h"
|
||||
#include "graph_data.h"
|
||||
|
||||
struct bar_item* bar_item_create() {
|
||||
struct bar_item* bar_item = malloc(sizeof(struct bar_item));
|
||||
|
@ -14,6 +15,7 @@ void bar_item_init(struct bar_item* bar_item, struct bar_item* default_item) {
|
|||
bar_item->counter = 0;
|
||||
bar_item->name = "";
|
||||
bar_item->type = BAR_ITEM;
|
||||
bar_item->identifier = "";
|
||||
bar_item->update_frequency = 0;
|
||||
bar_item->cache_scripts = false;
|
||||
bar_item->script = "";
|
||||
|
@ -23,10 +25,12 @@ void bar_item_init(struct bar_item* bar_item, struct bar_item* default_item) {
|
|||
bar_item->associated_space = 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 = "";
|
||||
bar_item->icon_spacing_left = 0;
|
||||
bar_item->icon_spacing_right = 0;
|
||||
bar_item->icon_color = rgba_color_from_hex(0xffffffff);
|
||||
bar_item->icon_highlight_color = rgba_color_from_hex(0xffffffff);
|
||||
bar_item->label = "";
|
||||
bar_item->label_spacing_left = 0;
|
||||
bar_item->label_spacing_right = 0;
|
||||
bar_item->label_color = rgba_color_from_hex(0xffffffff);
|
||||
|
@ -182,3 +186,25 @@ void bar_item_set_bounding_rect_for_space(struct bar_item* bar_item, uint32_t si
|
|||
bar_item->bounding_rects[sid - 1]->origin.y = rect.origin.y + bar_origin.y;
|
||||
bar_item->bounding_rects[sid - 1]->size = rect.size;
|
||||
}
|
||||
|
||||
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->on_click_script && !bar_item->cache_scripts) free(bar_item->on_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);
|
||||
if (bar_item->identifier) free(bar_item->identifier);
|
||||
|
||||
if (bar_item->bounding_rects) {
|
||||
for (int j = 0; j < bar_item->num_rects; j++) {
|
||||
free(bar_item->bounding_rects[j]);
|
||||
}
|
||||
free(bar_item->bounding_rects);
|
||||
}
|
||||
if (bar_item->has_graph) {
|
||||
graph_data_destroy(&bar_item->graph_data);
|
||||
}
|
||||
free(bar_item);
|
||||
}
|
||||
|
|
|
@ -68,6 +68,7 @@ struct bar_item {
|
|||
};
|
||||
|
||||
struct bar_item* bar_item_create();
|
||||
void bar_item_destroy(struct bar_item* bar_item);
|
||||
void bar_item_script_update(struct bar_item* bar_item, bool forced);
|
||||
void bar_item_update_component(struct bar_item* bar_item, uint32_t did, uint32_t sid);
|
||||
void bar_item_init(struct bar_item* bar_item, struct bar_item* default_item);
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#include "bar_manager.h"
|
||||
#include "bar_item.h"
|
||||
#include <_types/_uint32_t.h>
|
||||
#include <string.h>
|
||||
|
||||
extern struct event_loop g_event_loop;
|
||||
|
||||
|
@ -18,6 +20,15 @@ int bar_manager_get_item_index_for_name(struct bar_manager* bar_manager, char* n
|
|||
return -1;
|
||||
}
|
||||
|
||||
int bar_manager_get_item_index_by_address(struct bar_manager* bar_manager, struct bar_item* bar_item) {
|
||||
for (int i = 0; i < bar_manager->bar_item_count; i++) {
|
||||
if (bar_manager->bar_items[i] == bar_item) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void bar_manager_set_background_color(struct bar_manager *bar_manager, uint32_t color)
|
||||
{
|
||||
bar_manager->background_color = rgba_color_from_hex(color);
|
||||
|
@ -79,12 +90,20 @@ void bar_manager_resize(struct bar_manager *bar_manager)
|
|||
}
|
||||
|
||||
struct bar_item* bar_manager_create_item(struct bar_manager* bar_manager) {
|
||||
bar_manager->bar_items = (struct bar_item**) realloc(bar_manager->bar_items, sizeof(struct bar_item*) * (bar_manager->bar_item_count + 1));
|
||||
bar_manager->bar_item_count += 1;
|
||||
struct bar_item* bar_item = bar_item_create();
|
||||
bar_item_init(bar_item, &bar_manager->default_item);
|
||||
bar_manager->bar_items[bar_manager->bar_item_count - 1] = bar_item;
|
||||
return bar_item;
|
||||
bar_manager->bar_items = (struct bar_item**) realloc(bar_manager->bar_items, sizeof(struct bar_item*) * (bar_manager->bar_item_count + 1));
|
||||
bar_manager->bar_item_count += 1;
|
||||
struct bar_item* bar_item = bar_item_create();
|
||||
bar_item_init(bar_item, &bar_manager->default_item);
|
||||
bar_manager->bar_items[bar_manager->bar_item_count - 1] = bar_item;
|
||||
return bar_item;
|
||||
}
|
||||
|
||||
void bar_manager_destroy_item(struct bar_manager* bar_manager, struct bar_item* bar_item) {
|
||||
int index = bar_manager_get_item_index_by_address(bar_manager, bar_item);
|
||||
memmove(bar_manager->bar_items + index, bar_manager->bar_items + index + 1, bar_manager->bar_item_count - index - 1);
|
||||
bar_manager->bar_items = (struct bar_item**) realloc(bar_manager->bar_items, sizeof(struct bar_item*) * (bar_manager->bar_item_count - 1));
|
||||
bar_manager->bar_item_count -= 1;
|
||||
bar_item_destroy(bar_item);
|
||||
}
|
||||
|
||||
void bar_manager_init(struct bar_manager *bar_manager)
|
||||
|
|
|
@ -30,6 +30,7 @@ void bar_manager_custom_events_trigger(struct bar_manager* bar_manager, char* na
|
|||
|
||||
|
||||
struct bar_item* bar_manager_create_item(struct bar_manager* bar_manager);
|
||||
void bar_manager_destroy_item(struct bar_manager* bar_manager, struct bar_item* bar_item);
|
||||
void bar_manager_handle_notification(struct bar_manager* bar_manager, char* context);
|
||||
|
||||
void bar_manager_script_update(struct bar_manager* bar_manager, bool forced);
|
||||
|
|
|
@ -9,7 +9,7 @@ void graph_data_init(struct graph_data* graph_data, uint32_t graph_width) {
|
|||
graph_data->ready = true;
|
||||
}
|
||||
|
||||
void graph_data_destruct(struct graph_data* graph_data) {
|
||||
void graph_data_destroy(struct graph_data* graph_data) {
|
||||
if (!graph_data->ready) return;
|
||||
free(graph_data->y);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ struct graph_data {
|
|||
};
|
||||
|
||||
void graph_data_init(struct graph_data* graph_data, uint32_t graph_width);
|
||||
void graph_data_destroy(struct graph_data* graph_data);
|
||||
void graph_data_push_back(struct graph_data* graph_data, float y);
|
||||
void graph_data_destruct(struct graph_data* graph_data);
|
||||
float graph_data_get_y(struct graph_data* graph_data, uint32_t i);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "message.h"
|
||||
#include "bar_item.h"
|
||||
#include "bar_manager.h"
|
||||
|
||||
extern struct event_loop g_event_loop;
|
||||
extern struct display_manager g_display_manager;
|
||||
|
@ -17,6 +18,8 @@ extern bool g_verbose;
|
|||
#define COMMAND_ADD_PLUGIN "plugin"
|
||||
#define COMMAND_ADD_EVENT "event"
|
||||
|
||||
#define DOMAIN_REMOVE "remove"
|
||||
|
||||
#define DOMAIN_UPDATE "update"
|
||||
|
||||
#define DOMAIN_PUSH "push"
|
||||
|
@ -247,6 +250,16 @@ static void handle_domain_push(FILE* rsp, struct token domain, char* message) {
|
|||
bar_manager_refresh(&g_bar_manager);
|
||||
}
|
||||
|
||||
static void handle_domain_remove(FILE* rsp, struct token domain, char* message) {
|
||||
struct token command = get_token(&message);
|
||||
if (token_equals(command, COMMAND_ADD_ITEM) || token_equals(command, COMMAND_ADD_COMPONENT)) {
|
||||
struct token name = get_token(&message);
|
||||
int index = bar_manager_get_item_index_for_name(&g_bar_manager, token_to_string(name));
|
||||
if (index < 0) return;
|
||||
bar_manager_destroy_item(&g_bar_manager, g_bar_manager.bar_items[index]);
|
||||
}
|
||||
bar_manager_refresh(&g_bar_manager);
|
||||
}
|
||||
// Syntax: sketchybar -m add <item|component|plugin> (<identifier>) <name> <position>
|
||||
static void handle_domain_add(FILE* rsp, struct token domain, char* message) {
|
||||
struct token command = get_token(&message);
|
||||
|
@ -301,6 +314,12 @@ static void handle_domain_add(FILE* rsp, struct token domain, char* message) {
|
|||
} else {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (bar_manager_get_item_index_for_name(&g_bar_manager, token_to_string(name)) >= 0) {
|
||||
bar_manager_destroy_item(&g_bar_manager, bar_item);
|
||||
printf("Name already exists... skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
bar_item->position = token_to_string(position)[0];
|
||||
bar_item_set_name(bar_item, string_copy(token_to_string(name)));
|
||||
|
@ -483,6 +502,8 @@ void handle_message(FILE *rsp, char *message)
|
|||
handle_domain_config(rsp, domain, message);
|
||||
} else if (token_equals(domain, DOMAIN_ADD)){
|
||||
handle_domain_add(rsp, domain, message);
|
||||
} else if (token_equals(domain, DOMAIN_REMOVE)){
|
||||
handle_domain_remove(rsp, domain, message);
|
||||
} else if (token_equals(domain, DOMAIN_SET)){
|
||||
handle_domain_set(rsp, domain, message);
|
||||
} else if (token_equals(domain, DOMAIN_UPDATE)) {
|
||||
|
|
Loading…
Reference in a new issue