#include "include/window_manager.h"
#include "include/X_functions.h"
#include "include/window_draw.h"
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>

#include <assert.h>

#define max(a, b) a>b?b:a

void on_unmap_request(const XUnmapEvent *event) {
    linked_window * window = get_window_definite(event->window);
    if (window != NULL) { // either error or redrawing taskbar
        XUnmapWindow(X_display, window->client);
        unframe(event->window);
    }
}

void on_map_request(const XMapRequestEvent *event) {
    GRAB_SHORTCUTS(event->display, event->window);
    reframe_decorate(event->window);
    XMapWindow(X_display, event->window);
}

void on_configure_request(const XConfigureRequestEvent *event) {
    XWindowChanges window_params;
    if(event->parent == root_window) {
        window_params.x = event->x;
        window_params.y = event->y;
    } else {
        window_params.x = window_params.y = 0; // documentation scarse, read somewhere that it's relative to parent???
    }
    
    window_params.width = max(event->width, XWidthOfScreen(XDefaultScreenOfDisplay(X_display)));
    window_params.height = max(event->height, XHeightOfScreen(XDefaultScreenOfDisplay(X_display)));
    window_params.border_width = event->border_width;
    window_params.sibling = event->above;
    window_params.stack_mode = event->detail;

    XConfigureWindow(event->display, event->window, event->value_mask, &window_params);

    linked_window* framelink = find_client(event->window);
    if (framelink != NULL) {
        window_params.width += 18;
        window_params.height += 4;
        XConfigureWindow(event->display, framelink->frame, event->value_mask, &window_params);
    }
}

void on_create_notify(const XCreateWindowEvent *event) {

}

void on_destroy_notify() {
    
}