Ticket #1837: RectTracking.patch

File RectTracking.patch, 2.5 KB (added by pulkomandy, 8 years ago)

Patch for handling RectTracking. Misses some redrawing I don't know how to do from the server side.

  • ServerWindow.h

     
    180180
    181181            DirectWindowInfo*   fDirectWindowInfo;
    182182            bool                fIsDirectlyAccessing;
     183
     184            BRect               fTrackedRect;
     185            bool                fIsTrackingRect;
    183186};
    184187
    185188#endif  // SERVER_WINDOW_H
  • ServerWindow.cpp

     
    171171    fCurrentDrawingRegionValid(false),
    172172
    173173    fDirectWindowInfo(NULL),
    174     fIsDirectlyAccessing(false)
     174    fIsDirectlyAccessing(false),
     175
     176    fIsTrackingRect(false)
    175177{
    176178    STRACE(("ServerWindow(%s)::ServerWindow()\n", title));
    177179
     
    20552057
    20562058        case AS_VIEW_BEGIN_RECT_TRACK:
    20572059        {
    2058             DTRACE(("ServerWindow %s: Message AS_VIEW_BEGIN_RECT_TRACK\n",
    2059                 Title()));
    2060             BRect dragRect;
     2060            /*DTRACE*/debug_printf("ServerWindow %s: Message AS_VIEW_BEGIN_RECT_TRACK\n",
     2061                Title());
    20612062            uint32 style;
    20622063
    2063             link.Read<BRect>(&dragRect);
     2064            link.Read<BRect>(&fTrackedRect);
    20642065            link.Read<uint32>(&style);
    20652066
    2066             // TODO: implement rect tracking (used sometimes for selecting
    2067             // a group of things, also sometimes used to appear to drag
    2068             // something, but without real drag message)
     2067            fCurrentView->ConvertToScreenForDrawing(&fTrackedRect);
     2068            fIsTrackingRect = true;
    20692069            break;
    20702070        }
    20712071        case AS_VIEW_END_RECT_TRACK:
    20722072        {
    2073             DTRACE(("ServerWindow %s: Message AS_VIEW_END_RECT_TRACK\n",
    2074                 Title()));
    2075             // TODO: implement rect tracking
     2073            /*DTRACE*/debug_printf("ServerWindow %s: Message AS_VIEW_END_RECT_TRACK\n",
     2074                Title());
     2075            //drawingEngine->InvertRect(fTrackedRect);
     2076            fIsTrackingRect = false;
    20762077            break;
    20772078        }
    20782079
     
    28352836            break;
    28362837    }
    28372838
     2839    if (fIsTrackingRect) {
     2840        debug_printf("Drawing trackrect : %f %f %f %f",fTrackedRect.top,
     2841            fTrackedRect.bottom, fTrackedRect.left, fTrackedRect.right);
     2842        //drawingEngine->InvertRect(fTrackedRect);
     2843            // erase the old rectangle
     2844
     2845        BPoint where;
     2846        int32 buttons;
     2847        fDesktop->GetLastMouseState(&where, &buttons);
     2848
     2849        if (where.x < fTrackedRect.left) {
     2850            if (where.y < fTrackedRect.top)
     2851                fTrackedRect.SetLeftTop(where);
     2852            else
     2853                fTrackedRect.SetLeftBottom(where);
     2854        } else {
     2855            if (where.y < fTrackedRect.top)
     2856                fTrackedRect.SetRightTop(where);
     2857            else
     2858                fTrackedRect.SetRightBottom(where);
     2859        }
     2860        drawingEngine->StrokeRect(fTrackedRect);
     2861        BRegion dirty(fTrackedRect);
     2862        fWindow->InvalidateView(fCurrentView, dirty);
     2863    }
     2864
    28382865    drawingEngine->UnlockParallelAccess();
    28392866}
    28402867