GdkFilterReturn selection_event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data) { Display *xdisplay; GdkDisplay *gdkdisplay; XEvent *xevent = gdkxevent; int status; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); switch (xevent->type) { case SelectionRequest: decor_handle_selection_request (xdisplay, xevent, dm_sn_timestamp); break; case SelectionClear: status = decor_handle_selection_clear (xdisplay, xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) gtk_main_quit (); default: break; } return GDK_FILTER_CONTINUE; }
bool KWD::Decorator::x11EventFilter (XEvent *xevent) { KWD::Window *client; int status; switch (xevent->type) { case ConfigureNotify: { XConfigureEvent *xce = reinterpret_cast <XConfigureEvent *> (xevent); if (mFrames.contains (xce->window)) mFrames[xce->window]->updateFrame (xce->window); } break; case SelectionRequest: decor_handle_selection_request (QX11Info::display (), xevent, mDmSnTimestamp); break; case SelectionClear: status = decor_handle_selection_clear (QX11Info::display (), xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) KApplication::exit (0); break; case CreateNotify: /* We only care about windows that aren't managed here */ if (!KWindowSystem::hasWId (xevent->xcreatewindow.window)) { WId select; KWD::trapXError (); XSelectInput (QX11Info::display (), xevent->xcreatewindow.window, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (KWD::readWindowProperty (xevent->xcreatewindow.window, Atoms::switchSelectWindow, (long *) &select)) handleWindowAdded (xevent->xcreatewindow.window); } case PropertyNotify: if (xevent->xproperty.atom == Atoms::netInputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::netOutputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::compizShadowInfo || xevent->xproperty.atom == Atoms::compizShadowColor) { updateShadowProperties (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::switchSelectWindow) { WId id = xevent->xproperty.window; if (!mSwitcher || mSwitcher->xid () != id) handleWindowAdded (id); mSwitcher->update (); } else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity) { if (mClients.contains (xevent->xproperty.window)) mClients[xevent->xproperty.window]->updateOpacity (); } break; case EnterNotify: { XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent); QWidget *child; if (!mFrames.contains (xce->window)) break; client = mFrames[xce->window]; if (!client->decorWidget ()) break; child = client->childAt (xce->x, xce->y); if (child) { QEvent qe (QEvent::Enter); QApplication::sendEvent (child, &qe); client->setActiveChild (child); client->updateCursor (QPoint (xce->x, xce->y)); } } break; case LeaveNotify: { XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent); if (mFrames.contains (xce->window)) { QEvent qe (QEvent::Leave); client = mFrames[xce->window]; if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qe); XUndefineCursor (QX11Info::display (), client->frameId ()); } } break; case MotionNotify: { XMotionEvent *xme = reinterpret_cast <XMotionEvent *> (xevent); QWidget *child; if (!mFrames.contains (xme->window)) break; client = mFrames[xme->window]; if (!client->decorWidget ()) break; child = client->childAt (xme->x, xme->y); if (child) { QPoint qp (xme->x, xme->y); if (child != client->activeChild ()) { QEvent qee (QEvent::Enter); QEvent qle (QEvent::Leave); if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qle); QApplication::sendEvent (child, &qee); client->setActiveChild (child); } if (client->decorWidget () != child) qp = child->mapFrom (client->decorWidget (), qp); QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QApplication::sendEvent (child, &qme); client->updateCursor (QPoint (xme->x, xme->y)); } } break; case ButtonPress: case ButtonRelease: { XButtonEvent *xbe = reinterpret_cast <XButtonEvent *> (xevent); QWidget *child; if (!mFrames.contains (xbe->window)) break; client = mFrames[xbe->window]; if (!client->decorWidget ()) break; child = client->childAt (xbe->x, xbe->y); if (child) { XButtonEvent xbe2 = *xbe; xbe2.window = child->winId (); QPoint p; p = client->mapToChildAt (QPoint (xbe->x, xbe->y)); xbe2.x = p.x (); xbe2.y = p.y (); p = child->mapToGlobal(p); xbe2.x_root = p.x (); xbe2.y_root = p.y (); client->setFakeRelease (false); QApplication::x11ProcessEvent ((XEvent *) &xbe2); /* We won't get a button release event, because of the screengrabs in compiz */ if (client->getFakeRelease () && xevent->type == ButtonPress) { xbe2.type = ButtonRelease; QApplication::x11ProcessEvent ((XEvent *) &xbe2); } return true; } } break; case ClientMessage: if (xevent->xclient.message_type == Atoms::toolkitActionAtom) { unsigned long action; action = xevent->xclient.data.l[0]; if (action == Atoms::toolkitActionWindowMenuAtom) { if (mClients.contains (xevent->xclient.window)) { QPoint pos; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) { pos = QPoint (xevent->xclient.data.l[3], xevent->xclient.data.l[4]); } else { pos = client->clientGeometry ().topLeft (); } client->showWindowMenu (pos); } } else if (action == Atoms::toolkitActionForceQuitDialogAtom) { if (mClients.contains (xevent->xclient.window)) { Time timestamp = xevent->xclient.data.l[1]; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) client->showKillProcessDialog (timestamp); else client->hideKillProcessDialog (); } } } break; default: break; } return KApplication::x11EventFilter (xevent); }