t_rgba color_moy(unsigned int n, ...) { va_list ap; unsigned int len; t_rgba newcolor; len = n; ft_bzero(&newcolor, sizeof(t_rgba)); if (len <= 0) return ((t_rgba){0, 0, 0, 0}); va_start(ap, n); newcolor = color_cpy(va_arg(ap, t_rgba)); while (len > 0) newcolor = color_sum(newcolor, va_arg(ap, t_rgba)); va_end(ap); return (color_div(newcolor, n)); }
static void command_run(struct watch *w, uint8_t events) { union { char buf[256]; enum command cmd; struct command_color cmd_color; struct command_color_mask cmd_color_mask; struct command_sequence cmd_seq; } cmdbuf; ssize_t z = recv(Command_sock, cmdbuf.buf, sizeof(cmdbuf), 0); if (z < 0) { fprintf(stderr, "command recv: %m\n"); return; } #define CHECK_LEN(T) \ if (z < sizeof(cmdbuf.T)) \ { \ fprintf(stderr, "command len: %zd for %s\n", z, #T); \ return; \ } CHECK_LEN(cmd); enum color c; color_t ct = {}; enum led led; if (z >= sizeof(cmdbuf.cmd_color)) { color_cpy(ct, cmdbuf.cmd_color.color); if ((led = cmdbuf.cmd_color.led) >= LED_COUNT) return; } switch (cmdbuf.cmd) { case COMMAND_NULL: break; case COMMAND_COLOR_SET: if (z >= sizeof(cmdbuf.cmd_color_mask)) for_color (c) ct[c] = (ct[c] & cmdbuf.cmd_color_mask.mask[c]) | (Command_color[led][c] & ~cmdbuf.cmd_color_mask.mask[c]); command_color_set(ct, led); break; case COMMAND_COLOR_ADD: CHECK_LEN(cmd_color); for_color (c) ct[c] = Command_color[led][c] + ct[c]; command_color_set(ct, led); break; case COMMAND_COLOR_SUB: CHECK_LEN(cmd_color); for_color (c) ct[c] = Command_color[led][c] - ct[c]; command_color_set(ct, led); break; case COMMAND_SEQUENCE: command_sequence(cmdbuf.cmd_seq.seq, (z - offsetof(struct command_sequence, seq))/sizeof(*cmdbuf.cmd_seq.seq), led); break; } #undef CHECK_LEN }
static void command_color_set(color_t s, enum led led) { base_rm(Command_color[led], led); color_cpy(Command_color[led], s); base_add(Command_color[led], led); }