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; } }