#include "bardata.h" #include #include #include #include #include "pipe.h" #include "tsar.h" color_t default_fg = {.pixel=0xFFFFFF}, default_bg = {.pixel=0x202020}; int bar_height = 20; // Global state, oh naur D: comp_t comps[64]; size_t comps_size = 0; comp_t *comps_left[32], *comps_right[32], *comps_center[32]; size_t left_size = 0, right_size = 0, center_size = 0; int padding = 0; int comp_gap = 0; void change_color(const char* name, color_t* xft_color) { if (xft_color != NULL) { XftColorFree( display, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)), xft_color ); } XftColorAllocName( display, DefaultVisual(display, DefaultScreen(display)), DefaultColormap(display, DefaultScreen(display)), name, xft_color ); } color_t parse_color(const char* col_str) { color_t col = {0}; if (col_str[0] == '#') { col_str++; } col.pixel = strtol(col_str, NULL, 16); col.color.red = (col.pixel >> 16) & 0xFF; col.color.green = (col.pixel >> 8) & 0xFF; col.color.blue = (col.pixel) & 0xFF; col.color.alpha = 255; return col; } void set_default_background(const char* name) { change_color(name, &default_bg); XSetWindowAttributes win_attr = { .background_pixel = default_bg.pixel, }; XChangeWindowAttributes(display, win, CWBackPixel, &win_attr); } void init_bardata(void) { change_color("#FFFFFF", &default_fg); set_default_background("#202020"); } comp_t *find_comp(const char *name) { for (size_t i = 0; i < comps_size; i++) { if (strcmp(comps[i].name, name) == 0) { return &comps[i]; } } comp_t *comp = &comps[comps_size++]; memset(comp, 0, sizeof(comp_t)); strcpy(comp->name, name); comp->fg = &default_fg; comp->bg = &default_bg; return comp; } void add_component(comp_side_t side, const char *name) { comp_t *comp = find_comp(name); if (side == SIDE_LEFT) { comps_left[left_size] = comp; left_size++; return; } if (side == SIDE_RIGHT) { comps_right[right_size] = comp; right_size++; return; } if (side == SIDE_CENTER) { comps_center[center_size] = comp; center_size++; return; } } void set_component(char argv[MAX_ARGS][MAX_ARG_LEN], int argc) { comp_t* comp = find_comp(argv[1]); for (int i = 2; i < argc; i++) { if (strcmp(argv[i], "-text") == 0) { const char* data = argv[i + 1]; size_t len = strlen(data); if (len > MAX_COMP_DATA - 1) { len = MAX_COMP_DATA - 4; char ellipse[] = "..."; memcpy(comp->data + len, ellipse, sizeof(ellipse)); } else { comp->data[len] = '\0'; } memcpy(comp->data, argv[i + 1], len); i++; continue; } if (strcmp(argv[i], "-margin-left") == 0) { int margin = atoi(argv[i + 1]); comp->margin_left = margin; i++; continue; } if (strcmp(argv[i], "-margin-right") == 0) { int margin = atoi(argv[i + 1]); comp->margin_right = margin; i++; continue; } if (strcmp(argv[i], "-margin") == 0) { int margin = atoi(argv[i + 1]); comp->margin_left = margin; comp->margin_right = margin; i++; continue; } if (strcmp(argv[i], "-fg") == 0) { const char* col_str = argv[i + 1]; comp->custom_fg = parse_color(col_str); comp->fg = &comp->custom_fg; change_color(argv[i + 1], comp->fg); i++; continue; } if (strcmp(argv[i], "-bg") == 0) { const char* col_str = argv[i + 1]; comp->custom_bg = parse_color(col_str); comp->bg = &comp->custom_bg; change_color(argv[i + 1], comp->bg); i++; continue; } } } void set_layout(char argv[MAX_ARGS][MAX_ARG_LEN], int argc) { comp_side_t side = SIDE_LEFT; left_size = 0; center_size = 0; right_size = 0; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-left") == 0) { side = SIDE_LEFT; continue; } if (strcmp(argv[i], "-center") == 0) { side = SIDE_CENTER; continue; } if (strcmp(argv[i], "-right") == 0) { side = SIDE_RIGHT; continue; } add_component(side, argv[i]); } } void set_config(char argv[MAX_ARGS][MAX_ARG_LEN], int argc) { const char *var = argv[1]; if (strcmp(var, "-height") == 0) { int new_bar_height = atoi(argv[2]); if (new_bar_height <= 0) { fprintf(stderr, "invalid bar height %d\n", new_bar_height); return; } bar_height = new_bar_height; return; } if (strcmp(var, "-font") == 0) { load_font(argv[2]); return; } if (strcmp(var, "-gap") == 0) { comp_gap = atoi(argv[2]); return; } if (strcmp(var, "-padding") == 0) { padding = atoi(argv[2]); return; } if (strcmp(var, "-background") == 0 || strcmp(var, "-bg") == 0) { set_default_background(argv[2]); return; } if (strcmp(var, "-foreground") == 0 || strcmp(var, "-fg") == 0) { change_color(argv[2], &default_fg); return; } }