bool EnterNotifyRequestHandler::processEvent(XEvent* event) {
    Window windowID = event->xcrossing.window;
    qDebug() << "[+] EnterNotify vent 0x" << hex << windowID;

    // Si la ventana es un cliente
    if(this->wl->existClient(windowID))
    {
        qDebug() << "\t EnterNotify: Entramos a la ventana";
        XWindow* xwindow = this->wl->getXWindowByClientID(windowID);

        // Si el cliente bypassea el WM
        if(xwindow->bypassWM())
        {
            qDebug() << "\tEl cliente bypassea el WM";
            return false;

        // Si no lo bypassea
        }
        else
        {
            return true;
        }

    // Si no es un cliente
    } else {
        qDebug() << "\tLa ventana no es un cliente";
        return false;
    }
}
bool MapRequestHandler::processEvent(XEvent* event) {
    Window windowID = event->xmaprequest.window;
    qDebug() << "[+] MapRequest event 0x" << hex << windowID;

    // Si la ventana es un cliente
    if(this->wl->existClient(windowID)) {
        qDebug() << "\tLa ventana es un cliente";
        XWindow* xwindow = this->wl->getXWindowByClientID(windowID);

        // Si el cliente bypassea el WM
        if(xwindow->bypassWM()) {
            qDebug() << "\tEl cliente bypassea el WM";
            return false;

        // Si no lo bypassea
        } else {

            // Si la ventana se mapea por primera vez
            if(xwindow->getState() == WithdrawnState) {
                qDebug() << "\tEl cliente se mapea por primera vez";

                if(xwindow->needFrame()) {
                    qDebug() << "\tAñadiendo un marco al cliente";
                    xwindow->addFrame();

                    // No hace falta añadir el cliente a la lista por que ya se
                    // añadió en CreateNotifyHandler

                    qDebug() << "\tAñadiendo el marco (0x" << hex
                             << xwindow->getFrameID() << ") a la lista";
                    wl->addFrame(xwindow->getFrameID(), xwindow);
                } else
                    qDebug() << "\tEl cliente no necesita marco";

                qDebug() << "\tMapeando la ventana";
                xwindow->setState(NormalState);

                qDebug() << "\tAñadiendo la ventana de la lista del EWMH";
                this->wl->addToManagedWindows(xwindow);

                qDebug() << "\tActualizando la ventana activa";
                this->wl->setActiveWindow(this->wl->getTopWindow());
            }

            return true;
        }

    // Si la ventana es un marco
    } else if(this->wl->existFrame(windowID)) {
        qDebug() << "\tLa ventana es un marco";
        return false;

    // Si no se ni un marco ni un cliente
    } else {
        qDebug() << "\tLa ventana no es ni un cliente ni un marco";
        return false;
    }

}
bool ConfigureRequestHandler::processEvent(XEvent* event) {
    Window windowID = event->xconfigurerequest.window;
    qDebug() << "[+] ConfigureRequest event 0x" << hex << windowID;

    // Si la ventana es un cliente
    if(this->wl->existClient(windowID)) {
        qDebug() << "\tLa ventana es un cliente, configurándolo...";
        XWindow* xwindow = this->wl->getXWindowByClientID(windowID);

        // Si el cliente bypassea el WM
        if(xwindow->bypassWM()) {
            qDebug() << "\tEl cliente bypassea el WM";
            return false;

        // Si no lo bypassea
        } else {
            if(event->xconfigurerequest.value_mask & CWX)
                xwindow->setX(event->xconfigurerequest.x);

            if(event->xconfigurerequest.value_mask & CWY)
                xwindow->setY(event->xconfigurerequest.y);

            // Hay que comprobar si la ventana tiene o no marco porque si no
            // las ventanas que solo aceptan tamaños múltiplos de un cierto
            // número dan problemas

            Config* cfg = Config::getInstance();

            if(event->xconfigurerequest.value_mask & CWWidth) {
                if(xwindow->haveFrame())
                    xwindow->setWidth(event->xconfigurerequest.width
                            + cfg->getLeftBorderWidth()
                            + cfg->getRightBorderWidth());
                else
                    xwindow->setWidth(event->xconfigurerequest.width);
            }

            if(event->xconfigurerequest.value_mask & CWHeight) {
                if(xwindow->haveFrame())
                    xwindow->setHeight(event->xconfigurerequest.height
                            + cfg->getTitlebarWidth() + cfg->getTopBorderWidth()
                            + cfg->getBottomBorderWidth());
                else
                    xwindow->setHeight(event->xconfigurerequest.height);
            }

            return true;
        }

    // Si no es un cliente
    } else {
        qDebug() << "\tLa ventana no es un cliente";
        return false;
    }
}