#include "windowManager/WindowManager.hpp" #include "noise/perlin.hpp" #include #include #include #include WindowManager::WindowManager(int width, int height, int (*render)(u_int32_t *img)) : render(render), WindowX(0), WindowY(0), WindowWidth(width), WindowHeight(height), BorderWidth(0), WindowDepth(CopyFromParent), WindowClass(CopyFromParent), WindowVisual(CopyFromParent), AttributeValueMask(CWBackPixel | CWEventMask), isDisplayReady(false) { img = new u_int32_t[width * height]; MainDisplay = XOpenDisplay(0); RootWindow = XDefaultRootWindow(MainDisplay); WindowAttributes = {}; WindowAttributes.background_pixel = 0x0; WindowAttributes.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | ExposureMask; MainWindow = XCreateWindow(MainDisplay, RootWindow, WindowX, WindowY, WindowWidth, WindowHeight, BorderWidth, WindowDepth, WindowClass, WindowVisual, AttributeValueMask, &WindowAttributes); XMapWindow(MainDisplay, MainWindow); wmDelete = XInternAtom(MainDisplay, "WM_DELETE_WINDOW", false); XSetWMProtocols(MainDisplay, MainWindow, &wmDelete, 1); isWindowOpen = true; } WindowManager::~WindowManager() { XUnmapWindow(this->MainDisplay, this->MainWindow); XDestroyWindow(this->MainDisplay, this->MainWindow); XCloseDisplay(this->MainDisplay); delete[] img; } void WindowManager::handle_events(XEvent &GeneralEvent) { switch(GeneralEvent.type) { case KeyPress: case KeyRelease: { XKeyPressedEvent *event = (XKeyPressedEvent *)&GeneralEvent; if (event->keycode == XKeysymToKeycode(this->MainDisplay, XK_Escape)) { this->isWindowOpen = false; } } break; case ClientMessage: { if (static_cast(GeneralEvent.xclient.data.l[0]) == this->wmDelete) { this->isWindowOpen = false; } } break; case Expose: { if (!isDisplayReady) isDisplayReady = true; display_image(); } break; } } void WindowManager::loop() { while (isWindowOpen) { while (XPending(this->MainDisplay) > 0) { XEvent GeneralEvent = {}; XNextEvent(this->MainDisplay, &GeneralEvent); handle_events(GeneralEvent); } if (isDisplayReady) { update_image(this->render); display_image(); } } } void WindowManager::display_image() { XImage image; image.width = WindowWidth; image.height = WindowHeight; image.format = ZPixmap; image.data = reinterpret_cast(img); image.byte_order = LSBFirst; image.bitmap_unit = 32; image.byte_order = LSBFirst; image.bitmap_pad = 32; image.depth = 24; image.bytes_per_line = this->WindowWidth * 4; image.bits_per_pixel = 32; XPutImage(MainDisplay, MainWindow, DefaultGC(MainDisplay, 0), &image, 0, 0, 0, 0, WindowWidth, WindowHeight); XFlush(MainDisplay); } void WindowManager::update_image(int (*func)(u_int32_t *img)) { if (func(this->img)) this->isWindowOpen = false; }