Ejemplo n.º 1
0
void WindowSelector::start(std::function<void(KWin::Toplevel*)> callback, const QByteArray &cursorName)
{
    xcb_cursor_t cursor = createCursor(cursorName);
    if (m_active) {
        callback(nullptr);
        return;
    }

    xcb_connection_t *c = connection();
    ScopedCPointer<xcb_grab_pointer_reply_t> grabPointer(xcb_grab_pointer_reply(c, xcb_grab_pointer_unchecked(c, false, rootWindow(),
        XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
        XCB_EVENT_MASK_POINTER_MOTION |
        XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW,
        XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE,
        cursor, XCB_TIME_CURRENT_TIME), NULL));
    if (grabPointer.isNull() || grabPointer->status != XCB_GRAB_STATUS_SUCCESS) {
        callback(nullptr);
        return;
    }
    m_active = grabXKeyboard();
    if (!m_active) {
        xcb_ungrab_pointer(connection(), XCB_TIME_CURRENT_TIME);
        callback(nullptr);
        return;
    }
    grabXServer();
    m_callback = callback;
}
Ejemplo n.º 2
0
void KillWindow::start()
{
    static Cursor kill_cursor = 0;
    if(!kill_cursor)
        kill_cursor = XCreateFontCursor(qt_xdisplay(), XC_pirate);

    if(XGrabPointer(qt_xdisplay(), qt_xrootwin(), False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask,
                    GrabModeAsync, GrabModeAsync, None, kill_cursor, CurrentTime)
       == GrabSuccess)
    {
        XGrabKeyboard(qt_xdisplay(), qt_xrootwin(), False, GrabModeAsync, GrabModeAsync, CurrentTime);

        XEvent ev;
        int return_pressed = 0;
        int escape_pressed = 0;
        int button_released = 0;

        grabXServer();

        while(!return_pressed && !escape_pressed && !button_released)
        {
            XMaskEvent(qt_xdisplay(), KeyPressMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &ev);

            if(ev.type == KeyPress)
            {
                int kc = XKeycodeToKeysym(qt_xdisplay(), ev.xkey.keycode, 0);
                int mx = 0;
                int my = 0;
                return_pressed = (kc == XK_Return) || (kc == XK_space);
                escape_pressed = (kc == XK_Escape);
                if(kc == XK_Left)
                    mx = -10;
                if(kc == XK_Right)
                    mx = 10;
                if(kc == XK_Up)
                    my = -10;
                if(kc == XK_Down)
                    my = 10;
                if(ev.xkey.state & ControlMask)
                {
                    mx /= 10;
                    my /= 10;
                }
                QCursor::setPos(QCursor::pos() + QPoint(mx, my));
            }

            if(ev.type == ButtonRelease)
            {
                button_released = (ev.xbutton.button == Button1);
                if(ev.xbutton.button == Button3)
                {
                    escape_pressed = TRUE;
                    break;
                }
                if(ev.xbutton.button == Button1 || ev.xbutton.button == Button2)
                    workspace->killWindowId(ev.xbutton.subwindow);
            }
            continue;
        }
        if(return_pressed)
        {
            Window root, child;
            int dummy1, dummy2, dummy3, dummy4;
            unsigned int dummy5;
            if(XQueryPointer(qt_xdisplay(), qt_xrootwin(), &root, &child, &dummy1, &dummy2, &dummy3, &dummy4, &dummy5) == true && child != None)
                workspace->killWindowId(child);
        }

        ungrabXServer();

        XUngrabKeyboard(qt_xdisplay(), CurrentTime);
        XUngrabPointer(qt_xdisplay(), CurrentTime);
    }
}
Ejemplo n.º 3
0
bool Manager::animateMinimize(bool iconify)
{
   int style = Static::instance()->animationStyle();

   switch (style)
   {
      case 1:
      {
         // Double twisting double back, with pike ;)

         if (!iconify) // No animation for restore.
            return true;

         // Go away quick.
         helperShowHide(false);
         tqApp->syncX();

         TQRect r = iconGeometry();

         if (!r.isValid())
            return true;

         // Algorithm taken from Window Maker (http://www.windowmaker.org)

         int sx = geometry().x();
         int sy = geometry().y();
         int sw = width();
         int sh = height();
         int dx = r.x();
         int dy = r.y();
         int dw = r.width();
         int dh = r.height();

         double steps = 12;

         double xstep = double((dx-sx)/steps);
         double ystep = double((dy-sy)/steps);
         double wstep = double((dw-sw)/steps);
         double hstep = double((dh-sh)/steps);

         double cx = sx;
         double cy = sy;
         double cw = sw;
         double ch = sh;

         double finalAngle = 3.14159265358979323846;

         double delta  = finalAngle / steps;

         TQPainter p(workspaceWidget());
         p.setRasterOp(TQt::NotROP);

         for (double angle = 0; ; angle += delta)
         {
            if (angle > finalAngle)
               angle = finalAngle;

            double dx = (cw / 10) - ((cw / 5) * sin(angle));
            double dch = (ch / 2) * cos(angle);
            double midy = cy + (ch / 2);

            TQPoint p1(int(cx + dx), int(midy - dch));
            TQPoint p2(int(cx + cw - dx), p1.y());
            TQPoint p3(int(cx + dw + dx), int(midy + dch));
            TQPoint p4(int(cx - dx), p3.y());

            grabXServer();

            p.drawLine(p1, p2);
            p.drawLine(p2, p3);
            p.drawLine(p3, p4);
            p.drawLine(p4, p1);

            p.flush();

            usleep(500);

            p.drawLine(p1, p2);
            p.drawLine(p2, p3);
            p.drawLine(p3, p4);
            p.drawLine(p4, p1);

            ungrabXServer();

            cx += xstep;
            cy += ystep;
            cw += wstep;
            ch += hstep;

            if (angle >= finalAngle)
               break;
         }
      }
      break;

      case 2:
      {
         // KVirc style ? Maybe. For qwertz.

         if (!iconify) // No animation for restore.
            return true;

         // Go away quick.
         helperShowHide(false);
         tqApp->syncX();

         int stepCount = 12;

         TQRect r(geometry());

         int dx = r.width() / (stepCount * 2);
         int dy = r.height() / (stepCount * 2);

         TQPainter p(workspaceWidget());
         p.setRasterOp(TQt::NotROP);

         for (int step = 0; step < stepCount; step++)
         {
            r.moveBy(dx, dy);
            r.setWidth(r.width() - 2 * dx);
            r.setHeight(r.height() - 2 * dy);

            grabXServer();

            p.drawRect(r);
            p.flush();
            usleep(200);
            p.drawRect(r);

            ungrabXServer();
         }
      }
      break;


      default:
      {
         TQRect icongeom = iconGeometry();

         if (!icongeom.isValid())
            return true;

         TQRect wingeom = geometry();

         TQPainter p(workspaceWidget());

         p.setRasterOp(TQt::NotROP);
#if 0
         if (iconify)
            p.setClipRegion(TQRegion(workspaceWidget()->rect()) - wingeom);
#endif
         grabXServer();

         p.drawLine(wingeom.bottomRight(), icongeom.bottomRight());
         p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft());
         p.drawLine(wingeom.topLeft(), icongeom.topLeft());
         p.drawLine(wingeom.topRight(), icongeom.topRight());

         p.flush();

         tqApp->syncX();

         usleep(30000);

         p.drawLine(wingeom.bottomRight(), icongeom.bottomRight());
         p.drawLine(wingeom.bottomLeft(), icongeom.bottomLeft());
         p.drawLine(wingeom.topLeft(), icongeom.topLeft());
         p.drawLine(wingeom.topRight(), icongeom.topRight());

         ungrabXServer();
      }
      break;
   }
   return true;
}