#ifndef ACCENT_H #define ACCENT_H #include #include #include #include #include #define SHMNAME "/breathing_color_shm" #define SHM_MAGIC 0xBEEFCAFEu #define SHM_VERSION 1u typedef struct { uint32_t magic; uint32_t version; volatile uint32_t seq; char color[8]; } ColorShm; static inline ColorShm * mapaccent(void) { int fd; ColorShm *blk; if ((fd = shm_open(SHMNAME, O_RDONLY, 0)) < 0) return NULL; blk = mmap(NULL, sizeof(ColorShm), PROT_READ, MAP_SHARED, fd, 0); close(fd); if (blk == MAP_FAILED) return NULL; if (blk->magic != SHM_MAGIC || blk->version != SHM_VERSION) { munmap(blk, sizeof(ColorShm)); return NULL; } return blk; } static inline int readaccent(ColorShm **blk, char out[8]) { uint32_t s1, s2; if (!*blk && !(*blk = mapaccent())) return 0; do { s1 = (*blk)->seq; memcpy(out, (*blk)->color, 8); s2 = (*blk)->seq; } while (s1 != s2); return out[0] == '#'; } #endif /* ACCENT_H */