#include #include #include #include #include #include #include #include #define SHM_NAME "/breathing_color_shm" // Shared memory name (same as in exo.c) #define COLOR_SIZE 8 // Size for one color (e.g., #RRGGBB) int main() { // Open shared memory object int shm_fd = shm_open(SHM_NAME, O_RDONLY, 0666); if (shm_fd == -1) { perror("Failed to open shared memory"); return 1; } // Map shared memory into the process's address space char *shm_ptr = mmap(NULL, COLOR_SIZE, PROT_READ, MAP_SHARED, shm_fd, 0); if (shm_ptr == MAP_FAILED) { perror("Failed to map shared memory"); close(shm_fd); return 1; } // Initialize X11 Display *display = XOpenDisplay(NULL); if (display == NULL) { perror("Unable to open X display"); munmap(shm_ptr, COLOR_SIZE); close(shm_fd); return 1; } // Create a window int screen = DefaultScreen(display); Window window = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 400, 400, 1, BlackPixel(display, screen), BlackPixel(display, screen)); // Set window properties XStoreName(display, window, "Breathing Color Display"); XMapWindow(display, window); // Set the window's background color initially XFlush(display); // Start reading colors and updating the window while (1) { // Read the current color from shared memory XColor color; if (XParseColor(display, DefaultColormap(display, screen), shm_ptr, &color) == 0) { fprintf(stderr, "Invalid color in shared memory: %s\n", shm_ptr); continue; } // Allocate the color in the X server if (XAllocColor(display, DefaultColormap(display, screen), &color) == 0) { fprintf(stderr, "Failed to allocate color: %s\n", shm_ptr); continue; } // Change the background color of the window XSetWindowBackground(display, window, color.pixel); XClearWindow(display, window); // Process X events XEvent event; while (XPending(display)) { XNextEvent(display, &event); if (event.type == ClientMessage) { // Exit on close event (or any client message) XDestroyWindow(display, window); XCloseDisplay(display); munmap(shm_ptr, COLOR_SIZE); close(shm_fd); return 0; } } // Sleep a little before checking for the next color update usleep(100000); // 0.1 seconds } // Clean up XDestroyWindow(display, window); XCloseDisplay(display); munmap(shm_ptr, COLOR_SIZE); close(shm_fd); return 0; }