Delete even more unused views code

Bug: skia:
Change-Id: I41480aa89dfcd8cb7e016e477cbabe354f35ce8a
Reviewed-on: https://skia-review.googlesource.com/75480
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/samplecode/ClockFaceView.cpp b/samplecode/ClockFaceView.cpp
index 8de2f93..841df26 100644
--- a/samplecode/ClockFaceView.cpp
+++ b/samplecode/ClockFaceView.cpp
@@ -207,7 +207,6 @@
                 fInterp = 0;
                 fDx = -fDx;
             }
-            this->inval(nullptr);
         }
     }
 
diff --git a/samplecode/GMSampleView.cpp b/samplecode/GMSampleView.cpp
deleted file mode 100644
index ffa33ce..0000000
--- a/samplecode/GMSampleView.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "GMSampleView.h"
-#include "SkData.h"
-
-GMSampleView::GMSampleView(GM* gm) : fShowSize(false), fGM(gm) {}
-
-GMSampleView::~GMSampleView() {
-    delete fGM;
-}
-
-SkEvent* GMSampleView::NewShowSizeEvt(bool doShowSize) {
-    SkEvent* evt = new SkEvent("GMSampleView::showSize");
-    evt->setFast32(doShowSize);
-    return evt;
-}
-
-bool GMSampleView::onQuery(SkEvent* evt) {
-    if (SampleCode::TitleQ(*evt)) {
-        SkString name("GM:");
-        name.append(fGM->getName());
-        SampleCode::TitleR(evt, name.c_str());
-        return true;
-    }
-
-    SkUnichar uni;
-    if (SampleCode::CharQ(*evt, &uni)) {
-        if (fGM->handleKey(uni)) {
-            this->inval(nullptr);
-            return true;
-        }
-    }
-
-    return this->INHERITED::onQuery(evt);
-}
-
-bool GMSampleView::onEvent(const SkEvent& evt) {
-    if (evt.isType("GMSampleView::showSize")) {
-        fShowSize = SkToBool(evt.getFast32());
-        return true;
-    }
-    return this->INHERITED::onEvent(evt);
-}
-
-#include "SkPicture.h"
-static sk_sp<SkPicture> round_trip_serialize(SkPicture* src) {
-    return SkPicture::MakeFromData(src->serialize().get());
-}
-
-#include "SkPictureRecorder.h"
-void GMSampleView::onDrawContent(SkCanvas* canvas) {
-    SkPictureRecorder recorder;
-    SkCanvas* origCanvas = canvas;
-
-    if (false) {
-        SkISize size = fGM->getISize();
-        canvas = recorder.beginRecording(SkRect::MakeIWH(size.width(), size.height()));
-    }
-
-    {
-        SkAutoCanvasRestore acr(canvas, fShowSize);
-        fGM->drawContent(canvas);
-    }
-
-    if (origCanvas != canvas) {
-        sk_sp<SkPicture> pic = recorder.finishRecordingAsPicture();
-        if (false) {
-            pic = round_trip_serialize(pic.get());
-        }
-        origCanvas->drawPicture(pic);
-        canvas = origCanvas;
-    }
-
-    if (fShowSize) {
-        SkISize size = fGM->getISize();
-        SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
-                                  SkIntToScalar(size.height()));
-        SkPaint paint;
-        paint.setColor(0x40FF8833);
-        canvas->drawRect(r, paint);
-    }
-}
-
-void GMSampleView::onDrawBackground(SkCanvas* canvas) {
-    fGM->drawBackground(canvas);
-}
-
-bool GMSampleView::onAnimate(const SkAnimTimer& timer) {
-    return fGM->animate(timer);
-}
diff --git a/samplecode/GMSampleView.h b/samplecode/GMSampleView.h
deleted file mode 100644
index 6424b43..0000000
--- a/samplecode/GMSampleView.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GMSampleView_DEFINED
-#define GMSampleView_DEFINED
-
-#include "SampleCode.h"
-#include "gm.h"
-
-class GMSampleView : public SampleView {
-private:
-    bool fShowSize;
-    typedef skiagm::GM GM;
-
-public:
-    GMSampleView(GM*);
-    ~GMSampleView() override;
-
-    static SkEvent* NewShowSizeEvt(bool doShowSize);
-
-protected:
-    bool onQuery(SkEvent*) override;
-    bool onEvent(const SkEvent&) override;
-    void onDrawContent(SkCanvas*) override;
-    void onDrawBackground(SkCanvas*) override;
-    bool onAnimate(const SkAnimTimer&) override;
-
-private:
-    GM* fGM;
-    typedef SampleView INHERITED;
-};
-
-#endif
diff --git a/samplecode/OverView.cpp b/samplecode/OverView.cpp
deleted file mode 100644
index cb56783..0000000
--- a/samplecode/OverView.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "OverView.h"
-#include "SampleCode.h"
-#include "SkCanvas.h"
-#include "SkView.h"
-
-static const char gIsOverview[] = "is-overview";
-
-static int to_lower(int c) {
-    if ('A' <= c && c <= 'Z') {
-        c = c - 'A' + 'a';
-    }
-    return c;
-}
-
-static void make_lc(SkString* str) {
-    char* ptr = str->writable_str();
-    while (*ptr) {
-        *ptr = to_lower(*ptr);
-        ptr += 1;
-    }
-}
-
-static bool case_insensitive_find(const SkString& base, const SkString& sub) {
-    SkString lcBase(base);
-    SkString lcSub(sub);
-    make_lc(&lcBase);
-    make_lc(&lcSub);
-    return lcBase.find(lcSub.c_str()) >= 0;
-}
-
-static bool draw_this_name(const SkString& name, const SkString& filter) {
-    if (filter.isEmpty()) {
-        return true;
-    }
-    return case_insensitive_find(name, filter);
-}
-
-class OverView : public SkView {
-public:
-    OverView(int count, const SkViewFactory* factories[]);
-    ~OverView() override;
-
-protected:
-    bool onEvent(const SkEvent&) override;
-    bool onQuery(SkEvent* evt) override {
-        if (SampleCode::TitleQ(*evt)) {
-            SampleCode::TitleR(evt, "Overview");
-            return true;
-        }
-        if (evt->isType(gIsOverview)) {
-            return true;
-        }
-        SkUnichar uni;
-        if (SampleCode::CharQ(*evt, &uni)) {
-            if (uni >= ' ') {
-                fMatchStr.appendUnichar(uni);
-            }
-            this->inval(nullptr);
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
-
-    void onDraw(SkCanvas* canvas) override;
-
-    bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) override {
-        return false;
-    }
-
-    Click* onFindClickHandler(SkScalar cx, SkScalar cy, unsigned modi) override {
-        const SkRect crect = SkRect::MakeXYWH(cx - 0.5f, cy - 0.5f, 1, 1);
-        SkPoint loc = this->start();
-        for (int i = 0; i < fCount; ++i) {
-            if (draw_this_name(fNames[i], fMatchStr)) {
-                if (this->bounds(loc).intersects(crect)) {
-                    SkEvent evt("set-curr-index");
-                    evt.setFast32(i);
-                    this->sendEventToParents(evt);
-                    break;
-                }
-                this->next(&loc);
-            }
-        }
-        return nullptr;
-    }
-
-private:
-    int fCount;
-    const SkViewFactory** fFactories;
-    SkString* fNames;
-    SkString fMatchStr;
-    SkPaint fNamePaint;
-    SkPaint::FontMetrics fNameMetrics;
-    SkScalar fNameW;
-    SkScalar fNameH;
-
-    SkRect bounds(const SkPoint& loc) const {
-        return SkRect::MakeXYWH(loc.x(), loc.y() + fNameMetrics.fAscent, fNameW, fNameH);
-    }
-
-    SkPoint start() const {
-        return SkPoint::Make(10, -fNameMetrics.fTop);
-    }
-
-    void next(SkPoint* loc) const {
-        loc->fY += fNameH;
-        if (loc->fY > this->height() - fNameMetrics.fBottom) {
-            loc->fY = -fNameMetrics.fTop;
-            loc->fX += fNameW;
-        }
-    }
-
-    typedef SkView INHERITED;
-};
-
-SkView* create_overview(int count, const SkViewFactory* factories[]) {
-    return new OverView(count, factories);
-}
-
-bool is_overview(SkView* view) {
-    SkEvent isOverview(gIsOverview);
-    return view->doQuery(&isOverview);
-}
-
-OverView::OverView(int count, const SkViewFactory* factories[]) {
-    fCount = count;
-    fFactories = factories;
-
-    fNames = new SkString[count];
-    for (int i = 0; i < count; ++i) {
-        SkView* view = (*fFactories[i])();
-        if (view) {
-            (void)SampleCode::RequestTitle(view, &fNames[i]);
-            if (0 == fNames[i].find("GM:")) {
-                fNames[i].remove(0, 3);
-            }
-        }
-    }
-
-    fNamePaint.setAntiAlias(true);
-    fNamePaint.setTextSize(12);
-    fNameW = 160;
-    fNameH = fNamePaint.getFontMetrics(&fNameMetrics);
-}
-
-OverView::~OverView() {
-    delete[] fNames;
-}
-
-bool OverView::onEvent(const SkEvent& evt) {
-    return this->INHERITED::onEvent(evt);
-}
-
-void OverView::onDraw(SkCanvas* canvas) {
-    SkPaint paint;
-    paint.setColor(0xFFF8F8F8);
-    canvas->drawPaint(paint);
-
-    SkPoint loc = this->start();
-    for (int i = 0; i < fCount; ++i) {
-        if (draw_this_name(fNames[i], fMatchStr)) {
-            canvas->drawRect(this->bounds(loc), paint);
-            canvas->drawString(fNames[i], loc.x(), loc.y(), fNamePaint);
-            this->next(&loc);
-        }
-    }
-}
diff --git a/samplecode/OverView.h b/samplecode/OverView.h
deleted file mode 100644
index 3412b19..0000000
--- a/samplecode/OverView.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SAMPLECODE_OVERVIEW_H_
-#define SAMPLECODE_OVERVIEW_H_
-
-class SkView;
-class SkViewFactory;
-
-SkView* create_overview(int, const SkViewFactory*[]);
-
-bool is_overview(SkView* view);
-
-#endif  // SAMPLECODE_OVERVIEW_H_
diff --git a/samplecode/PerlinPatch.cpp b/samplecode/PerlinPatch.cpp
index d20a0fb..9faf5ca 100644
--- a/samplecode/PerlinPatch.cpp
+++ b/samplecode/PerlinPatch.cpp
@@ -119,7 +119,7 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case 'g': fShowGrid = !fShowGrid; this->inval(nullptr); return true;
+                case 'g': fShowGrid = !fShowGrid; return true;
                 default: break;
             }
         }
@@ -207,7 +207,6 @@
             fTexScale += yDiff / 10.0f;
             fTexScale = SkTMax(0.1f, SkTMin(20.f, fTexScale));
         }
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 55aebda..3d5426e 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -883,7 +883,6 @@
 
     bool constructPath() {
         construct_path(fPath);
-        this->inval(nullptr);
         return true;
     }
 
@@ -909,7 +908,6 @@
         PathUndo* next = fUndo->fNext;
         delete fUndo;
         fUndo = next;
-        this->inval(nullptr);
         return true;
     }
 
@@ -932,7 +930,6 @@
 
     bool hideAll() {
         fHideAll ^= true;
-        this->inval(nullptr);
         return true;
     }
 
@@ -991,7 +988,6 @@
         matrix.setScale(1.f / 1.5f, 1.f / 1.5f, bounds.centerX(), bounds.centerY());
         fPath.transform(matrix);
         validatePath();
-        this->inval(nullptr);
         return true;
     }
 
@@ -1007,7 +1003,6 @@
         SkScalar offsetY = (this->height() - bounds.height()) / 2 - bounds.fTop;
         fPath.offset(offsetX, offsetY);
         validatePath();
-        this->inval(nullptr);
         return true;
     }
 
@@ -1017,7 +1012,6 @@
         matrix.setScale(1.5f, 1.5f, bounds.centerX(), bounds.centerY());
         fPath.transform(matrix);
         validatePath();
-        this->inval(nullptr);
         return true;
     }
 
@@ -1038,7 +1032,6 @@
 
     bool showLegend() {
         fShowLegend ^= true;
-        this->inval(nullptr);
         return true;
     }
 
@@ -1670,7 +1663,6 @@
                         SkIntToScalar(click->fICurr.fY - click->fIPrev.fY));
                 set_path_pt(fActivePt, pt, &fPath);
                 validatePath();
-                this->inval(nullptr);
                 return true;
                 }
             case MyClick::kPathType:
@@ -1678,7 +1670,6 @@
                 fPath.offset(SkIntToScalar(click->fICurr.fX - click->fIPrev.fX),
                         SkIntToScalar(click->fICurr.fY - click->fIPrev.fY));
                 validatePath();
-                this->inval(nullptr);
                 return true;
             case MyClick::kVerbType: {
                 fActiveVerb = myClick->verbHit();
@@ -1790,7 +1781,6 @@
                 break;
         }
         setControlButtonsPos();
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index ea7d508..5e4700a 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -431,7 +431,6 @@
 
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
         fClickPt.set(x, y);
-        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp
index f15df9f..3db994a 100644
--- a/samplecode/SampleAndroidShadows.cpp
+++ b/samplecode/SampleAndroidShadows.cpp
@@ -115,7 +115,6 @@
                     break;
             }
             if (handled) {
-                this->inval(nullptr);
                 return true;
             }
         }
diff --git a/samplecode/SampleAnimatedText.cpp b/samplecode/SampleAnimatedText.cpp
index 29bd192..f93ceca 100644
--- a/samplecode/SampleAnimatedText.cpp
+++ b/samplecode/SampleAnimatedText.cpp
@@ -13,7 +13,6 @@
 #include "SkColorFilter.h"
 #include "SkImage.h"
 #include "SkRandom.h"
-#include "SkSystemEventTypes.h"
 #include "SkTime.h"
 #include "SkTypeface.h"
 #include "Timer.h"
diff --git a/samplecode/SampleArc.cpp b/samplecode/SampleArc.cpp
index abdcdec..2073060 100644
--- a/samplecode/SampleArc.cpp
+++ b/samplecode/SampleArc.cpp
@@ -196,12 +196,6 @@
         return true;
     }
 
-    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-     //   fSweep += SK_Scalar1;
-        this->inval(nullptr);
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
-
 private:
     SkScalar fSweep;
 
diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp
index f89b37d..bb42fc1 100644
--- a/samplecode/SampleAtlas.cpp
+++ b/samplecode/SampleAtlas.cpp
@@ -223,7 +223,7 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case 'C': fDrawable->toggleUseColors(); this->inval(nullptr); return true;
+                case 'C': fDrawable->toggleUseColors(); return true;
                 default: break;
             }
         }
diff --git a/samplecode/SampleCCPRGeometry.cpp b/samplecode/SampleCCPRGeometry.cpp
index 8633398..16041f5 100644
--- a/samplecode/SampleCCPRGeometry.cpp
+++ b/samplecode/SampleCCPRGeometry.cpp
@@ -60,7 +60,6 @@
 
     void updateAndInval() {
         this->updateGpuData();
-        this->inval(nullptr);
     }
 
     void updateGpuData();
diff --git a/samplecode/SampleChart.cpp b/samplecode/SampleChart.cpp
index 46ce7d3..3e663ec 100644
--- a/samplecode/SampleChart.cpp
+++ b/samplecode/SampleChart.cpp
@@ -164,7 +164,6 @@
         }
 
         fShift += kShiftPerFrame;
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
index 536f2c2..fb9ba29 100644
--- a/samplecode/SampleChineseFling.cpp
+++ b/samplecode/SampleChineseFling.cpp
@@ -79,8 +79,6 @@
         // now "fling" a random amount
         fIndex += fRand.nextRangeU(5, 20);
         fIndex %= fBlobs.count();
-
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleClipDrawMatch.cpp b/samplecode/SampleClipDrawMatch.cpp
index b2158a6..0745eff 100644
--- a/samplecode/SampleClipDrawMatch.cpp
+++ b/samplecode/SampleClipDrawMatch.cpp
@@ -141,17 +141,17 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case '1': fGeom = kRect_Geometry; this->inval(nullptr); return true;
-                case '2': fGeom = kRRect_Geometry; this->inval(nullptr); return true;
-                case '3': fGeom = kCircle_Geometry; this->inval(nullptr); return true;
-                case '4': fGeom = kConvexPath_Geometry; this->inval(nullptr); return true;
-                case '5': fGeom = kConcavePath_Geometry; this->inval(nullptr); return true;
-                case '6': fGeom = kRectAndRect_Geometry; this->inval(nullptr); return true;
-                case '7': fGeom = kRectAndRRect_Geometry; this->inval(nullptr); return true;
-                case '8': fGeom = kRectAndConvex_Geometry; this->inval(nullptr); return true;
-                case '9': fGeom = kRectAndConcave_Geometry; this->inval(nullptr); return true;
-                case 'f': fSign = -fSign; this->inval(nullptr); return true;
-                case 't': fClipFirst = !fClipFirst; this->inval(nullptr); return true;
+                case '1': fGeom = kRect_Geometry; return true;
+                case '2': fGeom = kRRect_Geometry; return true;
+                case '3': fGeom = kCircle_Geometry; return true;
+                case '4': fGeom = kConvexPath_Geometry; return true;
+                case '5': fGeom = kConcavePath_Geometry; return true;
+                case '6': fGeom = kRectAndRect_Geometry; return true;
+                case '7': fGeom = kRectAndRRect_Geometry; return true;
+                case '8': fGeom = kRectAndConvex_Geometry; return true;
+                case '9': fGeom = kRectAndConcave_Geometry; return true;
+                case 'f': fSign = -fSign; return true;
+                case 't': fClipFirst = !fClipFirst; return true;
                 default: break;
             }
         }
@@ -239,8 +239,6 @@
         int saveCount = canvas->save();
         this->drawGeometry(canvas, offset, false);
         canvas->restoreToCount(saveCount);
-
-        this->inval(nullptr);
     }
 
     SkMSec GetMSecs() const {
diff --git a/samplecode/SampleCode.cpp b/samplecode/SampleCode.cpp
index 84c3945..252ca2a 100644
--- a/samplecode/SampleCode.cpp
+++ b/samplecode/SampleCode.cpp
@@ -26,16 +26,6 @@
     return false;
 }
 
-bool SampleCode::KeyQ(const SkEvent& evt, SkKey* outKey) {
-    if (evt.isType(gKeyEvtName, sizeof(gKeyEvtName) - 1)) {
-        if (outKey) {
-            *outKey = (SkKey)evt.getFast32();
-        }
-        return true;
-    }
-    return false;
-}
-
 bool SampleCode::TitleQ(const SkEvent& evt) {
     return evt.isType(gTitleEvtName, sizeof(gTitleEvtName) - 1);
 }
@@ -54,22 +44,6 @@
     return false;
 }
 
-bool SampleCode::PrefSizeQ(const SkEvent& evt) {
-    return evt.isType(gPrefSizeEvtName, sizeof(gPrefSizeEvtName) - 1);
-}
-
-void SampleCode::PrefSizeR(SkEvent* evt, SkScalar width, SkScalar height) {
-    SkASSERT(evt && PrefSizeQ(*evt));
-    SkScalar size[2];
-    size[0] = width;
-    size[1] = height;
-    evt->setScalars(gPrefSizeEvtName, 2, size);
-}
-
-bool SampleCode::FastTextQ(const SkEvent& evt) {
-    return evt.isType(gFastTextEvtName, sizeof(gFastTextEvtName) - 1);
-}
-
 SkViewRegister* SkViewRegister::gHead;
 SkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) {
     fFact->ref();
@@ -87,48 +61,21 @@
     return (*fCreateFunc)();
 }
 
-#include "GMSampleView.h"
-
-SkGMSampleViewFactory::SkGMSampleViewFactory(GMFactoryFunc func)
-    : fFunc(func) {
-}
-
-SkView* SkGMSampleViewFactory::operator() () const {
-    skiagm::GM* gm = fFunc(nullptr);
-    gm->setMode(skiagm::GM::kSample_Mode);
-    return new GMSampleView(gm);
-}
-
 SkViewRegister::SkViewRegister(SkViewCreateFunc func) {
     fFact = new SkFuncViewFactory(func);
     fChain = gHead;
     gHead = this;
 }
 
-SkViewRegister::SkViewRegister(GMFactoryFunc func) {
-    fFact = new SkGMSampleViewFactory(func);
-    fChain = gHead;
-    gHead = this;
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 static const char is_sample_view_tag[] = "sample-is-sample-view";
-static const char repeat_count_tag[] = "sample-set-repeat-count";
 
 bool SampleView::IsSampleView(SkView* view) {
     SkEvent evt(is_sample_view_tag);
     return view->doQuery(&evt);
 }
 
-bool SampleView::onEvent(const SkEvent& evt) {
-    if (evt.isType(repeat_count_tag)) {
-        fRepeatCount = evt.getFast32();
-        return true;
-    }
-    return this->INHERITED::onEvent(evt);
-}
-
 bool SampleView::onQuery(SkEvent* evt) {
     if (evt->isType(is_sample_view_tag)) {
         return true;
@@ -143,16 +90,14 @@
     }
     this->onDrawBackground(canvas);
 
-    for (int i = 0; i < fRepeatCount; i++) {
-        SkAutoCanvasRestore acr(canvas, true);
-        this->onDrawContent(canvas);
+    SkAutoCanvasRestore acr(canvas, true);
+    this->onDrawContent(canvas);
 #if SK_SUPPORT_GPU
-        // Ensure the GrContext doesn't combine GrDrawOps across draw loops.
-        if (GrContext* context = canvas->getGrContext()) {
-            context->flush();
-        }
-#endif
+    // Ensure the GrContext doesn't combine GrDrawOps across draw loops.
+    if (GrContext* context = canvas->getGrContext()) {
+        context->flush();
     }
+#endif
 }
 
 void SampleView::onDrawBackground(SkCanvas* canvas) {
diff --git a/samplecode/SampleCode.h b/samplecode/SampleCode.h
index 65b05a1..053d682 100644
--- a/samplecode/SampleCode.h
+++ b/samplecode/SampleCode.h
@@ -10,40 +10,25 @@
 
 #include "SkColor.h"
 #include "SkEvent.h"
-#include "SkKey.h"
 #include "SkView.h"
 
-class GrContext;
 class SkAnimTimer;
 
 #define DEF_SAMPLE(code) \
     static SkView*          SK_MACRO_APPEND_LINE(F_)() { code } \
     static SkViewRegister   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
 
-#define MAX_ZOOM_LEVEL  8
-#define MIN_ZOOM_LEVEL  -8
-
 static const char gCharEvtName[] = "SampleCode_Char_Event";
-static const char gKeyEvtName[] = "SampleCode_Key_Event";
 static const char gTitleEvtName[] = "SampleCode_Title_Event";
-static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
-static const char gFastTextEvtName[] = "SampleCode_FastText_Event";
-static const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle";
 
 class SampleCode {
 public:
-    static bool KeyQ(const SkEvent&, SkKey* outKey);
     static bool CharQ(const SkEvent&, SkUnichar* outUni);
 
     static bool TitleQ(const SkEvent&);
     static void TitleR(SkEvent*, const char title[]);
     static bool RequestTitle(SkView* view, SkString* title);
 
-    static bool PrefSizeQ(const SkEvent&);
-    static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
-
-    static bool FastTextQ(const SkEvent&);
-
     friend class SampleWindow;
 };
 
@@ -67,29 +52,10 @@
     SkViewCreateFunc fCreateFunc;
 };
 
-namespace skiagm {
-class GM;
-}
-
-// factory function that creates a skiagm::GM
-typedef skiagm::GM* (*GMFactoryFunc)(void*);
-
-// Takes a GM factory function and implements the SkViewFactory interface
-// by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
-// the SampleView interface to skiagm::GM.
-class SkGMSampleViewFactory : public SkViewFactory {
-public:
-    SkGMSampleViewFactory(GMFactoryFunc func);
-    SkView* operator() () const override;
-private:
-    GMFactoryFunc fFunc;
-};
-
 class SkViewRegister : public SkRefCnt {
 public:
     explicit SkViewRegister(SkViewFactory*);
     explicit SkViewRegister(SkViewCreateFunc);
-    explicit SkViewRegister(GMFactoryFunc);
 
     ~SkViewRegister() {
         fFact->unref();
@@ -113,7 +79,6 @@
 public:
     SampleView()
         : fBGColor(SK_ColorWHITE)
-        , fRepeatCount(1)
         , fHaveCalledOnceBeforeDraw(false)
     {}
 
@@ -129,14 +94,12 @@
     virtual void onOnceBeforeDraw() {}
 
     // overrides
-    virtual bool onEvent(const SkEvent& evt);
     virtual bool onQuery(SkEvent* evt);
     virtual void onDraw(SkCanvas*);
 
     SkColor fBGColor;
 
 private:
-    int fRepeatCount;
     bool fHaveCalledOnceBeforeDraw;
     typedef SkView INHERITED;
 };
diff --git a/samplecode/SampleConcavePaths.cpp b/samplecode/SampleConcavePaths.cpp
index 7ff6819..de9f9b6 100644
--- a/samplecode/SampleConcavePaths.cpp
+++ b/samplecode/SampleConcavePaths.cpp
@@ -134,12 +134,6 @@
         }
     }
 
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
-                                              unsigned modi) {
-        this->inval(nullptr);
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
-
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleDither.cpp b/samplecode/SampleDither.cpp
index 6d91fda..fbe25dd 100644
--- a/samplecode/SampleDither.cpp
+++ b/samplecode/SampleDither.cpp
@@ -159,7 +159,6 @@
         draw_sweep(canvas, fBM.width()>>2, fBM.height()>>2, fAngle);
 
         fAngle += SK_Scalar1/2;
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp
index 723dca8..e85c87b 100644
--- a/samplecode/SampleFatBits.cpp
+++ b/samplecode/SampleFatBits.cpp
@@ -379,7 +379,6 @@
 
     void setStyle(FatBits::Style s) {
         fFB.setStyle(s);
-        this->inval(nullptr);
     }
 
 protected:
@@ -393,19 +392,15 @@
             switch (uni) {
                 case 'c':
                     fFB.setUseClip(!fFB.getUseClip());
-                    this->inval(nullptr);
                     return true;
                 case 'r':
                     fIsRect = !fIsRect;
-                    this->inval(nullptr);
                     return true;
                 case 'o':
                     fFB.toggleRectAsOval();
-                    this->inval(nullptr);
                     return true;
                 case 'x':
                     fFB.setGrid(!fFB.getGrid());
-                    this->inval(nullptr);
                     return true;
                 case 's':
                     if (FatBits::kStroke_Style == fFB.getStyle()) {
@@ -419,32 +414,25 @@
                         SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap,
                     };
                     fFB.fStrokeCap = caps[(fFB.fStrokeCap + 1) % 3];
-                    this->inval(nullptr);
                     return true;
                 } break;
                 case 'a':
                     fFB.setAA(!fFB.getAA());
-                    this->inval(nullptr);
                     return true;
                 case 'w':
                     fFB.setShowSkeleton(!fFB.getShowSkeleton());
-                    this->inval(nullptr);
                     return true;
                 case 'g':
                     fFB.togglePixelColors();
-                    this->inval(nullptr);
                     return true;
                 case 't':
                     fFB.setTriangle(!fFB.getTriangle());
-                    this->inval(nullptr);
                     return true;
                 case '-':
                     fFB.fStrokeWidth -= 0.125f;
-                    this->inval(nullptr);
                     return true;
                 case '=':
                     fFB.fStrokeWidth += 0.125f;
-                    this->inval(nullptr);
                     return true;
             }
         }
@@ -503,7 +491,6 @@
             fPts[1].offset(dx, dy);
             fPts[2].offset(dx, dy);
         }
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index 97fe6fc..40dc87f 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -805,7 +805,6 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         do_fuzz(canvas);
-        this->inval(0);
     }
 
 private:
diff --git a/samplecode/SampleFilterQuality.cpp b/samplecode/SampleFilterQuality.cpp
index abe1a90..a68fa17 100644
--- a/samplecode/SampleFilterQuality.cpp
+++ b/samplecode/SampleFilterQuality.cpp
@@ -175,11 +175,11 @@
         SkUnichar uni;
         if (SampleCode::CharQ(*evt, &uni)) {
             switch (uni) {
-                case '1': fAngle.inc(-ANGLE_DELTA); this->inval(nullptr); return true;
-                case '2': fAngle.inc( ANGLE_DELTA); this->inval(nullptr); return true;
-                case '3': fScale.inc(-SCALE_DELTA); this->inval(nullptr); return true;
-                case '4': fScale.inc( SCALE_DELTA); this->inval(nullptr); return true;
-                case '5': fShowFatBits = !fShowFatBits; this->inval(nullptr); return true;
+                case '1': fAngle.inc(-ANGLE_DELTA); return true;
+                case '2': fAngle.inc( ANGLE_DELTA); return true;
+                case '3': fScale.inc(-SCALE_DELTA); return true;
+                case '4': fScale.inc( SCALE_DELTA); return true;
+                case '5': fShowFatBits = !fShowFatBits; return true;
                 default: break;
             }
         }
@@ -296,11 +296,6 @@
         return true;
     }
 
-    virtual bool handleKey(SkKey key) {
-        this->inval(nullptr);
-        return true;
-    }
-
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index a0cb0e0..63504cd 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -380,7 +380,6 @@
 
     virtual void onDrawContent(SkCanvas* canvas) {
         do_fuzz(canvas);
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleGradients.cpp b/samplecode/SampleGradients.cpp
index 19ba74b..247bcf6 100644
--- a/samplecode/SampleGradients.cpp
+++ b/samplecode/SampleGradients.cpp
@@ -160,7 +160,6 @@
         if (false) { // avoid bit rot, suppress warning
             test_alphagradients(canvas);
         }
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleHT.cpp b/samplecode/SampleHT.cpp
index e1483be..7eb9806 100644
--- a/samplecode/SampleHT.cpp
+++ b/samplecode/SampleHT.cpp
@@ -171,7 +171,6 @@
                 break;
             }
         }
-        this->inval(nullptr);
         return nullptr;
     }
 
diff --git a/samplecode/SampleHairline.cpp b/samplecode/SampleHairline.cpp
index fe9e07c..0adc9c3 100644
--- a/samplecode/SampleHairline.cpp
+++ b/samplecode/SampleHairline.cpp
@@ -228,7 +228,6 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fDoAA = !fDoAA;
-        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleIdentityScale.cpp b/samplecode/SampleIdentityScale.cpp
index 5fbba69..6bf948d 100644
--- a/samplecode/SampleIdentityScale.cpp
+++ b/samplecode/SampleIdentityScale.cpp
@@ -72,7 +72,6 @@
         canvas->drawBitmap( fBM, 100, 100, &paint );
         canvas->restore();
         canvas->drawString(text, 100, 400, paint );
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp
index 3ba6d69..36ed2ab 100644
--- a/samplecode/SampleLayers.cpp
+++ b/samplecode/SampleLayers.cpp
@@ -22,7 +22,6 @@
 #include "SkTime.h"
 #include "SkTypeface.h"
 #include "SkUtils.h"
-#include "SkKey.h"
 #include "SkDrawFilter.h"
 #include "SkClipOpPriv.h"
 
@@ -191,21 +190,6 @@
         test_fade(canvas);
     }
 
-    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(nullptr);
-
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
-
-    bool onClick(Click* click) override {
-        return this->INHERITED::onClick(click);
-    }
-
-    virtual bool handleKey(SkKey) {
-        this->inval(nullptr);
-        return true;
-    }
-
 private:
     typedef SkView INHERITED;
 };
@@ -271,12 +255,10 @@
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(nullptr);
         return new Click(this);
     }
 
     bool onClick(Click* click) override {
-        this->inval(nullptr);
         fCenter = click->fCurr;
         return this->INHERITED::onClick(click);
     }
diff --git a/samplecode/SampleLines.cpp b/samplecode/SampleLines.cpp
index bf43e8b..657962c 100644
--- a/samplecode/SampleLines.cpp
+++ b/samplecode/SampleLines.cpp
@@ -94,7 +94,6 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         fAlpha = SkScalarRoundToInt(y);
-        this->inval(nullptr);
         return nullptr;
     }
 private:
diff --git a/samplecode/SampleManyRects.cpp b/samplecode/SampleManyRects.cpp
index cb19595..737787a 100644
--- a/samplecode/SampleManyRects.cpp
+++ b/samplecode/SampleManyRects.cpp
@@ -62,7 +62,6 @@
             canvas->drawRect(rect, paint);
             canvas->restore();
         }
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp
index 47786bf..80f051d 100644
--- a/samplecode/SamplePatch.cpp
+++ b/samplecode/SamplePatch.cpp
@@ -322,7 +322,6 @@
 
     bool onClick(Click* click) override {
         fPts[((PtClick*)click)->fIndex].set(click->fCurr.fX - DX, click->fCurr.fY - DY);
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index ec92fdf..dceb925 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -197,7 +197,6 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fShowHairline = !fShowHairline;
-        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
@@ -248,7 +247,6 @@
 
     void toggle(bool& value) {
         value = !value;
-        this->inval(nullptr);
     }
 
 protected:
@@ -298,7 +296,6 @@
         if (click->fMeta.findS32("index", &index)) {
             SkASSERT((unsigned)index < N);
             fPts[index] = click->fCurr;
-            this->inval(nullptr);
             return true;
         }
         return false;
@@ -364,12 +361,10 @@
 
     void toggle(bool& value) {
         value = !value;
-        this->inval(nullptr);
     }
 
     void toggle3(int& value) {
         value = (value + 1) % 3;
-        this->inval(nullptr);
     }
 
 protected:
@@ -388,8 +383,8 @@
                 case '4': this->toggle3(fJoinType); return true;
                 case '5': this->toggle3(fCapType); return true;
                 case '6': this->toggle(fClosed); return true;
-                case '-': fWidth -= 5; this->inval(nullptr); return true;
-                case '=': fWidth += 5; this->inval(nullptr); return true;
+                case '-': fWidth -= 5; return true;
+                case '=': fWidth += 5; return true;
                 default: break;
             }
         }
@@ -435,7 +430,6 @@
         if (click->fMeta.findS32("index", &index)) {
             SkASSERT((unsigned)index < N);
             fPts[index] = click->fCurr;
-            this->inval(nullptr);
             return true;
         }
         return false;
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index 5fdaeed..029b1c9 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -61,7 +61,6 @@
 
     bool onClick(Click* click) override {
         fCenter.set(click->fCurr.fX, click->fCurr.fY);
-        this->inval(nullptr);
         return false;
     }
 
@@ -307,7 +306,6 @@
 
     bool onClick(Click* click) override {
         ((MyClick*)click)->handleMove();
-        this->inval(nullptr);
         return false;
     }
 
diff --git a/samplecode/SamplePathFinder.cpp b/samplecode/SamplePathFinder.cpp
index 7c7dca1..d53c40b 100644
--- a/samplecode/SamplePathFinder.cpp
+++ b/samplecode/SamplePathFinder.cpp
@@ -94,7 +94,6 @@
                     } else {
                         fTrail.push_back('X');
                     }
-                    this->inval(nullptr);
                 }
                 return true;
             case 'x':
@@ -104,7 +103,6 @@
                     fTossedPaths.reset(fPaths.begin() + midpt, fPaths.count() - midpt);
                     fPaths.resize_back(midpt);
                     fTrail.push_back('x');
-                    this->inval(nullptr);
                 }
                 return true;
             case 'Z': {
@@ -117,7 +115,6 @@
                         ch = fTrail.back();
                         fTrail.pop_back();
                     } while (ch != 'x');
-                    this->inval(nullptr);
                 }
                 return true;
             }
diff --git a/samplecode/SamplePathFuzz.cpp b/samplecode/SamplePathFuzz.cpp
index ac9ffc9..13c72ca 100644
--- a/samplecode/SamplePathFuzz.cpp
+++ b/samplecode/SamplePathFuzz.cpp
@@ -686,7 +686,6 @@
             path_fuzz_stroker(&offscreen, fIndex += 100);
             canvas->drawBitmap(offscreen, 0, 0);
         }
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SamplePathOverstroke.cpp b/samplecode/SamplePathOverstroke.cpp
index a2d1b89..b6202a7 100644
--- a/samplecode/SamplePathOverstroke.cpp
+++ b/samplecode/SamplePathOverstroke.cpp
@@ -43,27 +43,21 @@
             switch (uni) {
                 case ',':
                     fStroke += 1.0;
-                    this->inval(nullptr);
                     return true;
                 case '.':
                     fStroke -= 1.0;
-                    this->inval(nullptr);
                     return true;
                 case 'x':
                     fPathType = (fPathType + 1) % 4;
-                    this->inval(nullptr);
                     return true;
                 case 'c':
                     fClosePath = !fClosePath;
-                    this->inval(nullptr);
                     return true;
                 case 'f':
                     fDrawFillPath = !fDrawFillPath;
-                    this->inval(nullptr);
                     return true;
                 case 'D':
                     fDumpHex = !fDumpHex;
-                    this->inval(nullptr);
                     return true;
                 default:
                     break;
diff --git a/samplecode/SamplePathText.cpp b/samplecode/SamplePathText.cpp
index 12bb282..31b0a7d 100644
--- a/samplecode/SamplePathText.cpp
+++ b/samplecode/SamplePathText.cpp
@@ -58,7 +58,6 @@
         if (SampleCode::CharQ(*evt, &unichar)) {
             if (unichar == 'X') {
                 fDoClip = !fDoClip;
-                this->inval(nullptr);
                 return true;
             }
         }
diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp
index fa45d6e..59d6ed5 100644
--- a/samplecode/SampleQuadStroker.cpp
+++ b/samplecode/SampleQuadStroker.cpp
@@ -212,7 +212,6 @@
                 default:
                     fText.appendUnichar(uni);
             }
-            this->inval(nullptr);
             return true;
         }
         return this->INHERITED::onQuery(evt);
@@ -697,7 +696,6 @@
         draw_button(canvas, fRRectButton);
         draw_button(canvas, fCircleButton);
         draw_button(canvas, fTextButton);
-        this->inval(nullptr);
     }
 
     class MyClick : public Click {
@@ -771,7 +769,6 @@
         if (index < (int) SK_ARRAY_COUNT(fPts)) {
             fPts[index].offset(SkIntToScalar(click->fICurr.fX - click->fIPrev.fX),
                                SkIntToScalar(click->fICurr.fY - click->fIPrev.fY));
-            this->inval(nullptr);
         } else if (index == (int) SK_ARRAY_COUNT(fPts) + 1) {
             fWeight = MapScreenYtoValue(click->fICurr.fY, fWeightControl, 0, 5);
         } else if (index == (int) SK_ARRAY_COUNT(fPts) + 2) {
diff --git a/samplecode/SampleRectanizer.cpp b/samplecode/SampleRectanizer.cpp
index 0657464..fe1275d 100644
--- a/samplecode/SampleRectanizer.cpp
+++ b/samplecode/SampleRectanizer.cpp
@@ -126,8 +126,6 @@
 
         str.printf("Press \'h\' to toggle rects");
         canvas->drawString(str, 50, kHeight + 150, blackBigFont);
-
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 1fee2fa..0ddd894 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -395,7 +395,6 @@
     bool onClick(Click* click) override {
         fRect.offset(click->fICurr.fX - click->fIPrev.fX,
                      click->fICurr.fY - click->fIPrev.fY);
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleRepeatTile.cpp b/samplecode/SampleRepeatTile.cpp
index f56492d..e0f9910 100644
--- a/samplecode/SampleRepeatTile.cpp
+++ b/samplecode/SampleRepeatTile.cpp
@@ -8,7 +8,6 @@
 #include "SkView.h"
 #include "SkCanvas.h"
 #include "SkShader.h"
-#include "SkKey.h"
 
 static void make_bitmap(SkBitmap* bm) {
     const int W = 100;
@@ -64,21 +63,6 @@
         canvas->drawPaint(paint);
     }
 
-    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(nullptr);
-
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
-
-    bool onClick(Click* click) override {
-        return this->INHERITED::onClick(click);
-    }
-
-    virtual bool handleKey(SkKey) {
-        this->inval(nullptr);
-        return true;
-    }
-
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleShaders.cpp b/samplecode/SampleShaders.cpp
index 7ca74cc..2f545a3 100644
--- a/samplecode/SampleShaders.cpp
+++ b/samplecode/SampleShaders.cpp
@@ -100,15 +100,6 @@
         canvas->drawRect(r, paint);
     }
 
-    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        this->inval(nullptr);
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
-
-    bool onClick(Click* click)  override {
-        return this->INHERITED::onClick(click);
-    }
-
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleShadowColor.cpp b/samplecode/SampleShadowColor.cpp
index aa5a8ef..07720ae 100755
--- a/samplecode/SampleShadowColor.cpp
+++ b/samplecode/SampleShadowColor.cpp
@@ -89,7 +89,6 @@
                     break;
             }
             if (handled) {
-                this->inval(nullptr);
                 return true;
             }
         }
diff --git a/samplecode/SampleShadowReference.cpp b/samplecode/SampleShadowReference.cpp
index 99ff4b2..ef63fc5 100755
--- a/samplecode/SampleShadowReference.cpp
+++ b/samplecode/SampleShadowReference.cpp
@@ -69,7 +69,6 @@
                     break;
             }
             if (handled) {
-                this->inval(nullptr);
                 return true;
             }
         }
diff --git a/samplecode/SampleShadowUtils.cpp b/samplecode/SampleShadowUtils.cpp
index c37d8d2..7e60791 100755
--- a/samplecode/SampleShadowUtils.cpp
+++ b/samplecode/SampleShadowUtils.cpp
@@ -96,7 +96,6 @@
                     break;
             }
             if (handled) {
-                this->inval(nullptr);
                 return true;
             }
         }
diff --git a/samplecode/SampleShip.cpp b/samplecode/SampleShip.cpp
index 08f794a..3abfaf7 100644
--- a/samplecode/SampleShip.cpp
+++ b/samplecode/SampleShip.cpp
@@ -151,8 +151,6 @@
         canvas->drawRect(SkRect::MakeXYWH(0, 0, 200, 24), paint);
         paint.setColor(SK_ColorWHITE);
         canvas->drawString(outString, 5, 15, paint);
-
-        this->inval(nullptr);
     }
 
 #if 0
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 91daa2a..5c6fb79 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -702,7 +702,6 @@
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         this->init();
         fIndex = (fIndex + 1) % SK_ARRAY_COUNT(gProc);
-        this->inval(nullptr);
         return nullptr;
     }
 
diff --git a/samplecode/SampleStringArt.cpp b/samplecode/SampleStringArt.cpp
index 74f3bd8..e0e0691 100644
--- a/samplecode/SampleStringArt.cpp
+++ b/samplecode/SampleStringArt.cpp
@@ -59,7 +59,6 @@
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
         fAngle = x/width();
-        this->inval(nullptr);
         return nullptr;
     }
 private:
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index 3f84482..ce64155 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -205,11 +205,6 @@
         drawSet(canvas, &paint);
     }
 
-    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
-                                              unsigned modi) override {
-        this->inval(nullptr);
-        return this->INHERITED::onFindClickHandler(x, y, modi);
-    }
 private:
     typedef SampleView INHERITED;
 };
diff --git a/samplecode/SampleSubpixelTranslate.cpp b/samplecode/SampleSubpixelTranslate.cpp
index fd66de2..7950003 100644
--- a/samplecode/SampleSubpixelTranslate.cpp
+++ b/samplecode/SampleSubpixelTranslate.cpp
@@ -100,7 +100,6 @@
 
         fCurPos.fX += fHorizontalVelocity;
         fCurPos.fY += fVerticalVelocity;
-        this->inval(nullptr);
     }
 
 private:
diff --git a/samplecode/SampleText.cpp b/samplecode/SampleText.cpp
index 12f345c..bb3507e 100644
--- a/samplecode/SampleText.cpp
+++ b/samplecode/SampleText.cpp
@@ -148,7 +148,6 @@
     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
                                               unsigned modi) override {
         fClickX = x;
-        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
index c357e6d..097af8f 100644
--- a/samplecode/SampleTextAlpha.cpp
+++ b/samplecode/SampleTextAlpha.cpp
@@ -76,7 +76,6 @@
             y = 255;
         }
         fByte = y;
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleTextBox.cpp b/samplecode/SampleTextBox.cpp
index 947ed8e..c5fe4cf 100644
--- a/samplecode/SampleTextBox.cpp
+++ b/samplecode/SampleTextBox.cpp
@@ -23,7 +23,6 @@
 #include "SkTextBox.h"
 #include "SkOSFile.h"
 #include "SkStream.h"
-#include "SkKey.h"
 
 extern void skia_set_text_gamma(float blackGamma, float whiteGamma);
 
diff --git a/samplecode/SampleTextOnPath.cpp b/samplecode/SampleTextOnPath.cpp
index 63b7ef2..0e43181 100644
--- a/samplecode/SampleTextOnPath.cpp
+++ b/samplecode/SampleTextOnPath.cpp
@@ -143,21 +143,13 @@
 
         canvas->translate(SkIntToScalar(-275), SkIntToScalar(250));
         textPathMatrix(canvas);
-
-        if (REPEAT_COUNT > 1)
-            this->inval(nullptr);
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
         fHints += 1;
-        this->inval(nullptr);
         return this->INHERITED::onFindClickHandler(x, y, modi);
     }
 
-    bool onClick(Click* click) override {
-        return this->INHERITED::onClick(click);
-    }
-
 private:
     int fHints;
     typedef SampleView INHERITED;
diff --git a/samplecode/SampleUnpremul.cpp b/samplecode/SampleUnpremul.cpp
index cd05fcf..57f0efc 100644
--- a/samplecode/SampleUnpremul.cpp
+++ b/samplecode/SampleUnpremul.cpp
@@ -19,7 +19,6 @@
 #include "SkOSPath.h"
 #include "SkStream.h"
 #include "SkString.h"
-#include "SkSystemEventTypes.h"
 #include "SkTypes.h"
 #include "SkUtils.h"
 #include "SkView.h"
@@ -164,7 +163,6 @@
             return;
         }
         fDecodeSucceeded = decode_file(fCurrFile.c_str(), &fBitmap, kN32_SkColorType, !fPremul);
-        this->inval(nullptr);
     }
 
     void togglePremul() {
diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp
index 9c6eeb8..004befe 100644
--- a/samplecode/SampleVertices.cpp
+++ b/samplecode/SampleVertices.cpp
@@ -113,7 +113,6 @@
     bool onClick(Click* click) override {
     //    fCurrX = click->fICurr.fX;
     //    fCurrY = click->fICurr.fY;
-        this->inval(nullptr);
         return true;
     }
 
diff --git a/samplecode/SampleXfer.cpp b/samplecode/SampleXfer.cpp
index 645ad4e..074613c 100644
--- a/samplecode/SampleXfer.cpp
+++ b/samplecode/SampleXfer.cpp
@@ -32,64 +32,36 @@
 
 static SkRandom gRand;
 
-class PushButtonWig : public SkView {
+struct ModeButton {
     SkString fLabel;
     SkColor  fColor;
-    uint32_t fFast32;
+    SkRect   fRect;
 
 public:
-    PushButtonWig(const char label[], uint32_t fast) : fLabel(label) {
+    void init(const char label[], const SkRect& rect) {
+        fLabel = label;
+        fRect = rect;
         fColor = (gRand.nextU() & 0x7F7F7F7F) | SkColorSetARGB(0xFF, 0, 0, 0x80);
-        fFast32 = fast;
     }
 
-    void postWidgetEvent() {
-        SkEvent evt;
-        evt.setType("push-button");
-        evt.setFast32(fFast32);
-        evt.setString("label", fLabel.c_str());
-        this->sendEventToParents(evt);
-    }
-
-protected:
-    void onDraw(SkCanvas* canvas) override {
-        SkRect r;
-        this->getLocalBounds(&r);
+    void draw(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setColor(fColor);
-        canvas->drawRoundRect(r, 8, 8, paint);
+        canvas->drawRoundRect(fRect, 8, 8, paint);
 
         paint.setColor(0xFFFFFFFF);
         paint.setTextSize(16);
         paint.setTextAlign(SkPaint::kCenter_Align);
         paint.setLCDRenderText(true);
-        canvas->drawString(fLabel, r.centerX(), r.fTop + 0.68f * r.height(), paint);
+        canvas->drawString(fLabel, fRect.centerX(), fRect.fTop + 0.68f * fRect.height(), paint);
     }
 
-    Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
-        return new Click(this);
-    }
-
-    bool onClick(Click* click) override {
-        SkRect target = SkRect::MakeXYWH(click->fCurr.x() - 1, click->fCurr.y() - 1, 3, 3);
-        SkRect r;
-        this->getLocalBounds(&r);
-        if (r.intersects(target)) {
-            fColor = SkColorSetA(fColor, 0x99);
-        } else {
-            fColor = SkColorSetA(fColor, 0xFF);
-        }
-        this->inval(nullptr);
-
-        if (click->fState == SkView::Click::kUp_State) {
-            this->postWidgetEvent();
-        }
-        return true;
+    bool hitTest(SkScalar x, SkScalar y) {
+        return fRect.intersects(x - 1, y - 1, x + 1, y + 1);
     }
 };
 
-
 class ModeDrawable : public SkDrawable {
 public:
     ModeDrawable() : fMode(SkBlendMode::kSrcOver), fLoc(SkPoint::Make(0, 0)) {}
@@ -136,6 +108,7 @@
     };
 
     SkRect        fModeRect[N_Modes];
+    ModeButton    fModeButtons[N_Modes];
     sk_sp<CircDrawable> fDrs[N];
     CircDrawable* fSelected;
 
@@ -143,12 +116,7 @@
         SkScalar x = 10;
         SkScalar y = 10;
         for (int i = 0; i < N_Modes; ++i) {
-            sk_sp<SkView> v(new PushButtonWig(SkBlendMode_Name(gModes[i]), (int)gModes[i]));
-            v->setSize(70, 25);
-            v->setLoc(x, y);
-            v->setVisibleP(true);
-            v->setEnabledP(true);
-            this->attachChildToFront(v.get());
+            fModeButtons[i].init(SkBlendMode_Name(gModes[i]), SkRect::MakeXYWH(x, y, 70, 25));
             fModeRect[i] = SkRect::MakeXYWH(x, y + 28, 70, 2);
             x += 80;
         }
@@ -168,17 +136,6 @@
     }
 
 protected:
-    bool onEvent(const SkEvent& evt) override {
-        if (evt.isType("push-button")) {
-            if (fSelected) {
-                fSelected->fMode = (SkBlendMode)evt.getFast32();
-                this->inval(nullptr);
-            }
-            return true;
-        }
-        return this->INHERITED::onEvent(evt);
-    }
-
     bool onQuery(SkEvent* evt) override {
         if (SampleCode::TitleQ(*evt)) {
             SampleCode::TitleR(evt, "XferDemo");
@@ -188,6 +145,10 @@
     }
 
     void onDrawContent(SkCanvas* canvas) override {
+        for (int i = 0; i < N_Modes; ++i) {
+            fModeButtons[i].draw(canvas);
+        }
+
         SkPaint paint;
         if (fSelected) {
             for (int i = 0; i < N_Modes; ++i) {
@@ -206,6 +167,14 @@
     }
 
     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override {
+        // Check mode buttons first
+        for (int i = 0; i < N_Modes; ++i) {
+            if (fModeButtons[i].hitTest(x, y)) {
+                Click* click = new Click(this);
+                click->fMeta.setS32("mode", i);
+                return click;
+            }
+        }
         fSelected = nullptr;
         for (int i = N - 1; i >= 0; --i) {
             if (fDrs[i]->hitTest(x, y)) {
@@ -213,14 +182,19 @@
                 break;
             }
         }
-        this->inval(nullptr);
         return fSelected ? new Click(this) : nullptr;
     }
 
     bool onClick(Click* click) override {
-        fSelected->fLoc.fX += click->fCurr.fX - click->fPrev.fX;
-        fSelected->fLoc.fY += click->fCurr.fY - click->fPrev.fY;
-        this->inval(nullptr);
+        int32_t mode;
+        if (click->fMeta.findS32("mode", &mode)) {
+            if (fSelected && Click::kUp_State == click->fState) {
+                fSelected->fMode = gModes[mode];
+            }
+        } else {
+            fSelected->fLoc.fX += click->fCurr.fX - click->fPrev.fX;
+            fSelected->fLoc.fY += click->fCurr.fY - click->fPrev.fY;
+        }
         return true;
     }