Samples: add name() virtual

Change-Id: I9b6e39bc7e35346bb73dfe014de1c8daa5a92f2a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/225428
Auto-Submit: Hal Canary <halcanary@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/samplecode/PerlinPatch.cpp b/samplecode/PerlinPatch.cpp
index 5950f7e..b6fcc3e 100644
--- a/samplecode/PerlinPatch.cpp
+++ b/samplecode/PerlinPatch.cpp
@@ -110,11 +110,9 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt)  override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PerlinPatch");
-            return true;
-        }
+    SkString name() override { return SkString("PerlinPatch"); }
+
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/Sample.cpp b/samplecode/Sample.cpp
index 9cff539..d528c12 100644
--- a/samplecode/Sample.cpp
+++ b/samplecode/Sample.cpp
@@ -34,7 +34,6 @@
 }
 
 const char* Sample::kCharEvtName = "SampleCode_Char_Event";
-const char* Sample::kTitleEvtName = "SampleCode_Title_Event";
 
 bool Sample::CharQ(const Event& evt, SkUnichar* outUni) {
     if (evt.isType(kCharEvtName)) {
@@ -46,24 +45,6 @@
     return false;
 }
 
-bool Sample::TitleQ(const Event& evt) {
-    return evt.isType(kTitleEvtName);
-}
-
-void Sample::TitleR(Event* evt, const char title[]) {
-    SkASSERT(evt && TitleQ(*evt));
-    evt->setString(kTitleEvtName, title);
-}
-
-bool Sample::RequestTitle(Sample* view, SkString* title) {
-    Event evt(kTitleEvtName);
-    if (view->doQuery(&evt)) {
-        title->set(evt.findString(kTitleEvtName));
-        return true;
-    }
-    return false;
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 bool Sample::doEvent(const Event& evt) {
diff --git a/samplecode/Sample.h b/samplecode/Sample.h
index 1f1bb4b..ed6fe1c 100644
--- a/samplecode/Sample.h
+++ b/samplecode/Sample.h
@@ -83,6 +83,8 @@
     void setBGColor(SkColor color) { fBGColor = color; }
     bool animate(const AnimTimer& timer) { return this->onAnimate(timer); }
 
+    virtual SkString name() = 0;
+
     class Event {
     public:
         Event();
@@ -189,7 +191,6 @@
     static bool CharQ(const Event&, SkUnichar* outUni);
     static bool TitleQ(const Event&);
     static void TitleR(Event*, const char title[]);
-    static bool RequestTitle(Sample* view, SkString* title);
 
 protected:
     /** Override to handle events in your subclass.
diff --git a/samplecode/Sample2PtRadial.cpp b/samplecode/Sample2PtRadial.cpp
index 44dec2f..64f9e66 100644
--- a/samplecode/Sample2PtRadial.cpp
+++ b/samplecode/Sample2PtRadial.cpp
@@ -14,13 +14,7 @@
     TwoPtConicalView() {}
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "2PtConical");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("2PtConical"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp
index 8ed1727..757ba40 100644
--- a/samplecode/SampleAAClip.cpp
+++ b/samplecode/SampleAAClip.cpp
@@ -61,13 +61,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AAClip");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("AAClip"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
 #if 1
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 144141b..fc47876 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -970,6 +970,8 @@
 
     #undef SET_BUTTON
 
+    SkString name() override { return SkString("AAGeometry"); }
+
     bool onQuery(Sample::Event* evt) override;
 
     void onSizeChange() override {
@@ -1820,10 +1822,6 @@
 }
 
 bool AAGeometryView::onQuery(Sample::Event* evt) {
-    if (Sample::TitleQ(*evt)) {
-        Sample::TitleR(evt, "AAGeometry");
-        return true;
-    }
     SkUnichar uni;
     if (false) {
         return this->INHERITED::onQuery(evt);
diff --git a/samplecode/SampleAARectModes.cpp b/samplecode/SampleAARectModes.cpp
index 98e7781..006734f 100644
--- a/samplecode/SampleAARectModes.cpp
+++ b/samplecode/SampleAARectModes.cpp
@@ -76,13 +76,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AARectsModes");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("AARectsModes"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         const SkRect bounds = SkRect::MakeWH(W, H);
diff --git a/samplecode/SampleAARects.cpp b/samplecode/SampleAARects.cpp
index 0a7dfed..e46f986 100644
--- a/samplecode/SampleAARects.cpp
+++ b/samplecode/SampleAARects.cpp
@@ -45,13 +45,7 @@
         fWidth = N;
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AA Rects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("AA Rects"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp
index 9ddfdd2..e6c67a0 100644
--- a/samplecode/SampleAndroidShadows.cpp
+++ b/samplecode/SampleAndroidShadows.cpp
@@ -106,12 +106,9 @@
         fLightPos = SkPoint3::Make(350, 0, 600);
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AndroidShadows");
-            return true;
-        }
+    SkString name() override { return SkString("AndroidShadows"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             bool handled = false;
diff --git a/samplecode/SampleAnimBlur.cpp b/samplecode/SampleAnimBlur.cpp
index 4d8f186..b53d3a6 100644
--- a/samplecode/SampleAnimBlur.cpp
+++ b/samplecode/SampleAnimBlur.cpp
@@ -27,13 +27,7 @@
     AnimBlurView() : fBlurSigma(0), fCircleRadius(100) {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AnimBlur");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("AnimBlur"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         static const SkBlurStyle gStyles[] = {
diff --git a/samplecode/SampleAnimatedImage.cpp b/samplecode/SampleAnimatedImage.cpp
index eabce6b..647ae26 100644
--- a/samplecode/SampleAnimatedImage.cpp
+++ b/samplecode/SampleAnimatedImage.cpp
@@ -96,12 +96,9 @@
         fDrawable = recorder.finishRecordingAsDrawable();
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AnimatedImage");
-            return true;
-        }
+    SkString name() override { return SkString("AnimatedImage"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (fImage && Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleAnimatedText.cpp b/samplecode/SampleAnimatedText.cpp
index 696be8d..bfd319e 100644
--- a/samplecode/SampleAnimatedText.cpp
+++ b/samplecode/SampleAnimatedText.cpp
@@ -47,12 +47,9 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "AnimatedText");
-            return true;
-        }
+    SkString name() override { return SkString("AnimatedText"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             if ('2' == uni) {
diff --git a/samplecode/SampleArc.cpp b/samplecode/SampleArc.cpp
index d640078..ec4e5ae 100644
--- a/samplecode/SampleArc.cpp
+++ b/samplecode/SampleArc.cpp
@@ -87,13 +87,7 @@
     ArcsView() { }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Arcs");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Arcs"); }
 
     static void DrawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
         canvas->drawRect(r, p);
diff --git a/samplecode/SampleAtlas.cpp b/samplecode/SampleAtlas.cpp
index 4ea32b3..a05674f 100644
--- a/samplecode/SampleAtlas.cpp
+++ b/samplecode/SampleAtlas.cpp
@@ -211,11 +211,9 @@
     DrawAtlasView(const char name[], DrawAtlasProc proc) : fName(name), fProc(proc) { }
 
 protected:
+    SkString name() override { return SkString(fName); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, fName);
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleBitmapRect.cpp b/samplecode/SampleBitmapRect.cpp
index abbbc38..6bd1a89 100644
--- a/samplecode/SampleBitmapRect.cpp
+++ b/samplecode/SampleBitmapRect.cpp
@@ -99,13 +99,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "BitmapRect");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("BitmapRect"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkRect srcR;
@@ -194,13 +188,7 @@
     BitmapRectView2() { }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "BigBitmapRect");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("BigBitmapRect"); }
 
     void onOnceBeforeDraw() override {
         make_big_bitmap(&fBitmap);
diff --git a/samplecode/SampleCCPRGeometry.cpp b/samplecode/SampleCCPRGeometry.cpp
index ee05f38..63ea48a 100644
--- a/samplecode/SampleCCPRGeometry.cpp
+++ b/samplecode/SampleCCPRGeometry.cpp
@@ -51,6 +51,7 @@
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned) override;
     bool onClick(Sample::Click*) override;
     bool onQuery(Sample::Event* evt) override;
+    SkString name() override { return SkString("CCPRGeometry"); }
 
 private:
     class Click;
@@ -441,10 +442,6 @@
 }
 
 bool CCPRGeometryView::onQuery(Sample::Event* evt) {
-    if (Sample::TitleQ(*evt)) {
-        Sample::TitleR(evt, "CCPRGeometry");
-        return true;
-    }
     SkUnichar unichar;
     if (Sample::CharQ(*evt, &unichar)) {
         if (unichar >= '1' && unichar <= '4') {
diff --git a/samplecode/SampleCamera.cpp b/samplecode/SampleCamera.cpp
index 28bbb1d..3e47070 100644
--- a/samplecode/SampleCamera.cpp
+++ b/samplecode/SampleCamera.cpp
@@ -48,13 +48,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Camera");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Camera"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(this->width()/2, this->height()/2);
diff --git a/samplecode/SampleChart.cpp b/samplecode/SampleChart.cpp
index 4e9c3ef..c849d32 100644
--- a/samplecode/SampleChart.cpp
+++ b/samplecode/SampleChart.cpp
@@ -88,13 +88,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Chart");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Chart"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         bool sizeChanged = false;
diff --git a/samplecode/SampleChineseFling.cpp b/samplecode/SampleChineseFling.cpp
index e9631f2..b250da4 100644
--- a/samplecode/SampleChineseFling.cpp
+++ b/samplecode/SampleChineseFling.cpp
@@ -42,13 +42,7 @@
     ChineseFlingView() : fBlobs(kNumBlobs) {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "chinese-fling");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("chinese-fling"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         if (!fInitialized) {
@@ -128,11 +122,9 @@
     ChineseZoomView() : fBlobs(kNumBlobs), fScale(15.0f), fTranslate(0.0f) {}
 
 protected:
+    SkString name() override { return SkString("chinese-zoom"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "chinese-zoom");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             if ('>' == uni) {
diff --git a/samplecode/SampleCircle.cpp b/samplecode/SampleCircle.cpp
index 56aaa62..3f83556 100644
--- a/samplecode/SampleCircle.cpp
+++ b/samplecode/SampleCircle.cpp
@@ -34,13 +34,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Circles");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Circles"); }
 
     void circle(SkCanvas* canvas, int width, bool aa) {
         SkPaint paint;
diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
index 05162a8..1e7b2ce 100644
--- a/samplecode/SampleClip.cpp
+++ b/samplecode/SampleClip.cpp
@@ -113,13 +113,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Clip");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Clip"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
diff --git a/samplecode/SampleClipDrawMatch.cpp b/samplecode/SampleClipDrawMatch.cpp
index 375a286..e57c338 100644
--- a/samplecode/SampleClipDrawMatch.cpp
+++ b/samplecode/SampleClipDrawMatch.cpp
@@ -133,11 +133,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("ClipDrawMatch"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ClipDrawMatch");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleClock.cpp b/samplecode/SampleClock.cpp
index aac04bf..040efa1 100644
--- a/samplecode/SampleClock.cpp
+++ b/samplecode/SampleClock.cpp
@@ -22,13 +22,7 @@
     ClockView() {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Clock");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Clock"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paintFill;
diff --git a/samplecode/SampleColorFilter.cpp b/samplecode/SampleColorFilter.cpp
index e394249..339a05c 100644
--- a/samplecode/SampleColorFilter.cpp
+++ b/samplecode/SampleColorFilter.cpp
@@ -123,13 +123,7 @@
         }
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ColorFilter");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("ColorFilter"); }
 
     void onDrawBackground(SkCanvas* canvas) override {
         SkPaint paint;
diff --git a/samplecode/SampleComplexClip.cpp b/samplecode/SampleComplexClip.cpp
index a898c37..9af4669 100644
--- a/samplecode/SampleComplexClip.cpp
+++ b/samplecode/SampleComplexClip.cpp
@@ -18,13 +18,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ComplexClip");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("ComplexClip"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPath path;
diff --git a/samplecode/SampleCowboy.cpp b/samplecode/SampleCowboy.cpp
index 0a2346a..22b8db4 100644
--- a/samplecode/SampleCowboy.cpp
+++ b/samplecode/SampleCowboy.cpp
@@ -96,14 +96,7 @@
         this->INHERITED::onSizeChange();
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, fLabel.c_str());
-            return true;
-        }
-
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return fLabel; }
 
     bool onAnimate(const AnimTimer& timer) override {
         if (!fDom) {
diff --git a/samplecode/SampleCusp.cpp b/samplecode/SampleCusp.cpp
index 59e5a62..f8ff078 100644
--- a/samplecode/SampleCusp.cpp
+++ b/samplecode/SampleCusp.cpp
@@ -103,13 +103,7 @@
 public:
     CuspView() {}
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Cusp");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Cusp"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint p;
diff --git a/samplecode/SampleDegenerateQuads.cpp b/samplecode/SampleDegenerateQuads.cpp
index 6711e54..5b6c28e 100644
--- a/samplecode/SampleDegenerateQuads.cpp
+++ b/samplecode/SampleDegenerateQuads.cpp
@@ -384,6 +384,7 @@
                                       unsigned) override;
     bool onClick(Sample::Click*) override;
     bool onQuery(Sample::Event* evt) override;
+    SkString name() override { return SkString("DegenerateQuad"); }
 
 private:
     class Click;
@@ -496,10 +497,6 @@
 }
 
 bool DegenerateQuadSample::onQuery(Sample::Event* event) {
-    if (Sample::TitleQ(*event)) {
-        Sample::TitleR(event, "DegenerateQuad");
-        return true;
-    }
     SkUnichar code;
     if (Sample::CharQ(*event, &code)) {
         switch(code) {
diff --git a/samplecode/SampleDegenerateTwoPtRadials.cpp b/samplecode/SampleDegenerateTwoPtRadials.cpp
index be9d650..2237d49 100644
--- a/samplecode/SampleDegenerateTwoPtRadials.cpp
+++ b/samplecode/SampleDegenerateTwoPtRadials.cpp
@@ -43,13 +43,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "DegenerateTwoPtRadials");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("DegenerateTwoPtRadials"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkScalar delta = fTime / 15.f;
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index a8b2905..1b21d13 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -90,13 +90,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Effects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Effects"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->scale(3, 3);
diff --git a/samplecode/SampleEmboss.cpp b/samplecode/SampleEmboss.cpp
index 3ac15d8..beacecb 100644
--- a/samplecode/SampleEmboss.cpp
+++ b/samplecode/SampleEmboss.cpp
@@ -33,13 +33,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Emboss");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Emboss"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp
index 6d3c9e8..73e1f523 100644
--- a/samplecode/SampleFatBits.cpp
+++ b/samplecode/SampleFatBits.cpp
@@ -391,11 +391,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("FatBits"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FatBits");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleFillType.cpp b/samplecode/SampleFillType.cpp
index 3ee684d..58e954a 100644
--- a/samplecode/SampleFillType.cpp
+++ b/samplecode/SampleFillType.cpp
@@ -25,13 +25,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FillType");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("FillType"); }
 
     void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
                   SkScalar scale, const SkPaint& paint) {
diff --git a/samplecode/SampleFilter2.cpp b/samplecode/SampleFilter2.cpp
index b1e5251..6d0357f 100644
--- a/samplecode/SampleFilter2.cpp
+++ b/samplecode/SampleFilter2.cpp
@@ -26,13 +26,13 @@
 
 class Filter2View : public Sample {
 public:
-    SkBitmap*   fBitmaps;
-    int         fBitmapCount;
-    int         fCurrIndex;
+    std::unique_ptr<SkBitmap[]> fBitmaps;
+    int fBitmapCount;
+    int fCurrIndex;
 
     Filter2View() {
         fBitmapCount = SK_ARRAY_COUNT(gNames)*2;
-        fBitmaps = new SkBitmap[fBitmapCount];
+        fBitmaps.reset(new SkBitmap[fBitmapCount]);
 
         for (int i = 0; i < fBitmapCount/2; i++) {
             decode_file(gNames[i], &fBitmaps[i]);
@@ -45,22 +45,10 @@
         this->setBGColor(SK_ColorGRAY);
     }
 
-    virtual ~Filter2View() {
-        delete[] fBitmaps;
-    }
-
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            SkString str("Filter/Dither ");
-            str.append(gNames[fCurrIndex]);
-            Sample::TitleR(evt, str.c_str());
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkStringPrintf("Filter/Dither %s", gNames[fCurrIndex]); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(50));
 
         const SkScalar W = SkIntToScalar(fBitmaps[0].width() + 1);
diff --git a/samplecode/SampleFilterQuality.cpp b/samplecode/SampleFilterQuality.cpp
index 05ef3a1..5b72149 100644
--- a/samplecode/SampleFilterQuality.cpp
+++ b/samplecode/SampleFilterQuality.cpp
@@ -166,11 +166,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("FilterQuality"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FilterQuality");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleFlutterAnimate.cpp b/samplecode/SampleFlutterAnimate.cpp
index 77d132d..026e521 100644
--- a/samplecode/SampleFlutterAnimate.cpp
+++ b/samplecode/SampleFlutterAnimate.cpp
@@ -33,14 +33,7 @@
         initChars();
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FlutterAnimate");
-            return true;
-        }
-
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("FlutterAnimate"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkFont font(fTypeface, 50);
diff --git a/samplecode/SampleFontCache.cpp b/samplecode/SampleFontCache.cpp
index 75d35b8..9f39e9c 100644
--- a/samplecode/SampleFontCache.cpp
+++ b/samplecode/SampleFontCache.cpp
@@ -111,13 +111,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FontCache");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("FontCache"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkScalar x = 0;
diff --git a/samplecode/SampleGlyphTransform.cpp b/samplecode/SampleGlyphTransform.cpp
index c81939b..4259ec5 100644
--- a/samplecode/SampleGlyphTransform.cpp
+++ b/samplecode/SampleGlyphTransform.cpp
@@ -30,13 +30,7 @@
         fEmojiFont.fText     = ToolUtils::emoji_sample_text();
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Glyph Transform");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Glyph Transform"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
diff --git a/samplecode/SampleGradients.cpp b/samplecode/SampleGradients.cpp
index eec5354..d52c1fe 100644
--- a/samplecode/SampleGradients.cpp
+++ b/samplecode/SampleGradients.cpp
@@ -118,13 +118,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Gradients");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Gradients"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPoint pts[2] = {
diff --git a/samplecode/SampleHT.cpp b/samplecode/SampleHT.cpp
index c8065f0..e225193 100644
--- a/samplecode/SampleHT.cpp
+++ b/samplecode/SampleHT.cpp
@@ -142,13 +142,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "HT");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("HT"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawDrawable(fRoot.get());
diff --git a/samplecode/SampleHairCurves.cpp b/samplecode/SampleHairCurves.cpp
index 2d84320..73a6aee 100644
--- a/samplecode/SampleHairCurves.cpp
+++ b/samplecode/SampleHairCurves.cpp
@@ -15,16 +15,9 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "HairCurves");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("HairCurves"); }
 
-
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
diff --git a/samplecode/SampleHairModes.cpp b/samplecode/SampleHairModes.cpp
index 21608e5..5df28f5 100644
--- a/samplecode/SampleHairModes.cpp
+++ b/samplecode/SampleHairModes.cpp
@@ -75,15 +75,9 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "HairlineModes");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("HairlineModes"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         const SkRect bounds = SkRect::MakeWH(W, H);
         static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
 
diff --git a/samplecode/SampleHairline.cpp b/samplecode/SampleHairline.cpp
index 51efead..af4244a 100644
--- a/samplecode/SampleHairline.cpp
+++ b/samplecode/SampleHairline.cpp
@@ -179,15 +179,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            SkString str;
-            str.printf("Hair-%s", gProcs[fProcIndex].fName);
-            Sample::TitleR(evt, str.c_str());
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkStringPrintf("Hair-%s", gProcs[fProcIndex].fName); }
 
     void show_bitmaps(SkCanvas* canvas, const SkBitmap& b0, const SkBitmap& b1,
                       const SkIRect& inset) {
diff --git a/samplecode/SampleIdentityScale.cpp b/samplecode/SampleIdentityScale.cpp
index 6df29d3..4e7b1dd 100644
--- a/samplecode/SampleIdentityScale.cpp
+++ b/samplecode/SampleIdentityScale.cpp
@@ -33,13 +33,7 @@
 protected:
     SkBitmap fBM;
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "IdentityScale");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("IdentityScale"); }
 
     void onDrawContent(SkCanvas* canvas) override {
 
diff --git a/samplecode/SampleLCD.cpp b/samplecode/SampleLCD.cpp
index 979dcb7..3c71415 100644
--- a/samplecode/SampleLCD.cpp
+++ b/samplecode/SampleLCD.cpp
@@ -15,13 +15,7 @@
     LCDView() {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "LCD Text");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("LCD Text"); }
 
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp
index 380f193..ab6b0e0 100644
--- a/samplecode/SampleLayerMask.cpp
+++ b/samplecode/SampleLayerMask.cpp
@@ -20,13 +20,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "LayerMask");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("LayerMask"); }
 
     void drawMask(SkCanvas* canvas, const SkRect& r) {
         SkPaint paint;
diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp
index bcdcdae..03388e6 100644
--- a/samplecode/SampleLayers.cpp
+++ b/samplecode/SampleLayers.cpp
@@ -100,13 +100,7 @@
     LayersView() {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Layers");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Layers"); }
 
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorGRAY);
@@ -201,13 +195,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Backdrop");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Backdrop"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawImage(fImage.get(), 0, 0, nullptr);
diff --git a/samplecode/SampleLighting.cpp b/samplecode/SampleLighting.cpp
index 3589ee9..68bc53f 100644
--- a/samplecode/SampleLighting.cpp
+++ b/samplecode/SampleLighting.cpp
@@ -51,13 +51,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Lighting");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Lighting"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         sk_sp<SkLights> lights(create_lights(fLightAngle, fColorFactor));
diff --git a/samplecode/SampleLines.cpp b/samplecode/SampleLines.cpp
index 806f9d8..4565aa1 100644
--- a/samplecode/SampleLines.cpp
+++ b/samplecode/SampleLines.cpp
@@ -28,13 +28,7 @@
     LinesView() {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Lines");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Lines"); }
 
     /*
      0x1F * x + 0x1F * (32 - x)
diff --git a/samplecode/SampleLitAtlas.cpp b/samplecode/SampleLitAtlas.cpp
index 1e1d921..1b804a8 100644
--- a/samplecode/SampleLitAtlas.cpp
+++ b/samplecode/SampleLitAtlas.cpp
@@ -447,11 +447,9 @@
     DrawLitAtlasView() : fDrawable(new DrawLitAtlasDrawable(SkRect::MakeWH(640, 480))) {}
 
 protected:
+    SkString name() override { return SkString("DrawLitAtlas"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "DrawLitAtlas");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleLua.cpp b/samplecode/SampleLua.cpp
index 582a0ca..8dbf115 100644
--- a/samplecode/SampleLua.cpp
+++ b/samplecode/SampleLua.cpp
@@ -68,11 +68,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("Lua"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Lua");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             lua_State* L = this->ensureLua();
diff --git a/samplecode/SampleManyRects.cpp b/samplecode/SampleManyRects.cpp
index 4209d99..cfd66c9 100644
--- a/samplecode/SampleManyRects.cpp
+++ b/samplecode/SampleManyRects.cpp
@@ -23,13 +23,7 @@
     ManyRectsView() {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ManyRects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("ManyRects"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkISize dsize = canvas->getBaseLayerSize();
diff --git a/samplecode/SampleMegaStroke.cpp b/samplecode/SampleMegaStroke.cpp
index 19912a3..43bb7b5 100644
--- a/samplecode/SampleMegaStroke.cpp
+++ b/samplecode/SampleMegaStroke.cpp
@@ -26,12 +26,9 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "MegaStroke");
-            return true;
-        }
+    SkString name() override { return SkString("MegaStroke"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
            fClip.set(0, 0, 950, 600);
diff --git a/samplecode/SampleMixer.cpp b/samplecode/SampleMixer.cpp
index 61cf0a7..34cc8d6 100644
--- a/samplecode/SampleMixer.cpp
+++ b/samplecode/SampleMixer.cpp
@@ -35,13 +35,7 @@
     MixerView() {}
 
 protected:
-    bool onQuery(Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Mixer");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Mixer"); }
 
     void dodraw(SkCanvas* canvas, sk_sp<SkColorFilter> cf0, sk_sp<SkColorFilter> cf1, float gap) {
         SkPaint paint;
@@ -131,13 +125,7 @@
     }
 
 protected:
-    bool onQuery(Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ShaderMixer");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("ShaderMixer"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         if (!fSurface) {
diff --git a/samplecode/SampleParagraph.cpp b/samplecode/SampleParagraph.cpp
index 4e9d457..72fca3b 100644
--- a/samplecode/SampleParagraph.cpp
+++ b/samplecode/SampleParagraph.cpp
@@ -36,13 +36,7 @@
 
 class ParagraphView1 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph1");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph1"); }
 
     void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) {
         const std::vector<
@@ -148,13 +142,7 @@
 
 class ParagraphView2 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph2");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph2"); }
 
     void drawCode(SkCanvas* canvas, SkScalar w, SkScalar h) {
         SkPaint comment;
@@ -391,13 +379,7 @@
 
 class ParagraphView3 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph3");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph3"); }
 
     void drawLine(SkCanvas* canvas, SkScalar w, SkScalar h, const std::string& text,
                   TextAlign align, size_t lineLimit = std::numeric_limits<size_t>::max(),
@@ -518,13 +500,7 @@
 
 class ParagraphView4 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph4");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph4"); }
 
     void drawFlutter(SkCanvas* canvas, SkScalar w, SkScalar h,
                      const char* ff = "Google Sans", SkScalar fs = 30,
@@ -662,13 +638,7 @@
 
 class ParagraphView5 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph4");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph4"); }
 
     void bidi(SkCanvas* canvas, SkScalar w, SkScalar h, const std::u16string& text,
               const std::u16string& expected, size_t lineLimit = std::numeric_limits<size_t>::max(),
@@ -789,13 +759,7 @@
 
 class ParagraphView6 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph4");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph4"); }
 
     void hangingS(SkCanvas* canvas, SkScalar w, SkScalar h, SkScalar fs = 60.0) {
         auto ff = "HangingS";
@@ -970,13 +934,7 @@
 
 class ParagraphView7 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph7");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph7"); }
 
     void drawText(SkCanvas* canvas, SkColor background, SkScalar letterSpace, SkScalar w,
                   SkScalar h) {
@@ -1048,13 +1006,7 @@
 
 class ParagraphView8 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph7");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph7"); }
 
     void drawText(SkCanvas* canvas, SkColor background, SkScalar wordSpace, SkScalar w,
                   SkScalar h) {
@@ -1126,12 +1078,9 @@
 
 class ParagraphView9 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph9");
-            return true;
-        }
+    SkString name() override { return SkString("Paragraph9"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
@@ -1230,13 +1179,7 @@
 
 class ParagraphView10 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph10");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph10"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawColor(SK_ColorWHITE);
@@ -1277,13 +1220,7 @@
 
 class ParagraphView11 : public Sample {
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paragraph11");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paragraph11"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawColor(SK_ColorWHITE);
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp
index 3e01b47..9424bda 100644
--- a/samplecode/SamplePatch.cpp
+++ b/samplecode/SamplePatch.cpp
@@ -236,13 +236,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt)  override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Patch");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Patch"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         const int nu = 10;
@@ -387,13 +381,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt)  override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PseudoInk");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("PseudoInk"); }
 
     bool onAnimate(const AnimTimer& timer) override { return true; }
 
@@ -458,13 +446,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt)  override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ManyStrokes");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("ManyStrokes"); }
 
     bool onAnimate(const AnimTimer& timer) override { return true; }
 
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index 2a27459..8ba8380 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -130,13 +130,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Paths");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Paths"); }
 
     void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j) {
         SkPaint paint;
@@ -250,11 +244,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("ArcTo"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ArcTo");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
@@ -367,11 +359,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("FatStroke"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "FatStroke");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
@@ -488,13 +478,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "CubicCurve");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("CubicCurve"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
@@ -617,11 +601,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("CubicCurve2"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "CubicCurve2");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index a6f3b3b..f5ef4c5 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -29,13 +29,7 @@
     PathClipView() : fOval(SkRect::MakeWH(200, 50)), fCenter(SkPoint::Make(250, 250)) {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PathClip");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("PathClip"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         const SkRect oval = fOval.makeOffset(fCenter.fX - fOval.centerX(),
@@ -171,13 +165,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "EdgeClip");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("EdgeClip"); }
 
     static SkScalar snap(SkScalar x) {
         return SkScalarRoundToScalar(x * 0.5f) * 2;
diff --git a/samplecode/SamplePathEffects.cpp b/samplecode/SamplePathEffects.cpp
index ded0f35..d501414 100644
--- a/samplecode/SamplePathEffects.cpp
+++ b/samplecode/SamplePathEffects.cpp
@@ -108,13 +108,7 @@
         this->setBGColor(0xFFDDDDDD);
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PathEffects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("PathEffects"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
diff --git a/samplecode/SamplePathOverstroke.cpp b/samplecode/SamplePathOverstroke.cpp
index 8f7d6d6..6346564 100644
--- a/samplecode/SamplePathOverstroke.cpp
+++ b/samplecode/SamplePathOverstroke.cpp
@@ -32,11 +32,9 @@
     }
 
    protected:
+    SkString name() override { return SkString("PathOverstroke"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PathOverstroke");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SamplePathText.cpp b/samplecode/SamplePathText.cpp
index a62fb86..288fe2e 100644
--- a/samplecode/SamplePathText.cpp
+++ b/samplecode/SamplePathText.cpp
@@ -54,11 +54,9 @@
     }
     void onSizeChange() final { this->INHERITED::onSizeChange(); this->reset(); }
 
-    bool onQuery(Sample::Event* evt) final {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, this->getName());
-            return true;
-        }
+    SkString name() override { return SkString(this->getName()); }
+
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar unichar;
         if (Sample::CharQ(*evt, &unichar)) {
             if (unichar == 'X') {
diff --git a/samplecode/SamplePdfFileViewer.cpp b/samplecode/SamplePdfFileViewer.cpp
index 3c5423c..9b6b54d 100644
--- a/samplecode/SamplePdfFileViewer.cpp
+++ b/samplecode/SamplePdfFileViewer.cpp
@@ -55,15 +55,11 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            SkString name("P:");
-            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
-            name.append(basename ? basename+1: fFilename.c_str());
-            Sample::TitleR(evt, name.c_str());
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
+    virtual SkString name() {
+        SkString name("P:");
+        const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
+        name.append(basename ? basename+1: fFilename.c_str());
+        return name;
     }
 
     virtual bool onEvent(const SkEvent& evt) {
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index ab94d03..f8caf38 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -69,13 +69,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt)  {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "PolyToPolyView");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("PolyToPolyView"); }
 
     static void doDraw(SkCanvas* canvas, SkPaint* paint, const SkFont& font, const int isrc[],
                        const int idst[], int count) {
diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp
index 7026285..c24d1d3 100644
--- a/samplecode/SampleQuadStroker.cpp
+++ b/samplecode/SampleQuadStroker.cpp
@@ -209,11 +209,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("QuadStroker"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "QuadStroker");
-            return true;
-        }
         SkUnichar uni;
         if (fTextButton.fEnabled && Sample::CharQ(*evt, &uni)) {
             switch (uni) {
diff --git a/samplecode/SampleRectanizer.cpp b/samplecode/SampleRectanizer.cpp
index ecf44c5..89a47c4 100644
--- a/samplecode/SampleRectanizer.cpp
+++ b/samplecode/SampleRectanizer.cpp
@@ -54,11 +54,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("Rectanizer"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Rectanizer");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             char utf8[SkUTF::kMaxBytesInUTF8Sequence];
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 4bd601d..a160549 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -176,13 +176,7 @@
 
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Regions");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Regions"); }
 
     static void drawstr(SkCanvas* canvas, const char text[], const SkPoint& loc,
                         bool hilite) {
diff --git a/samplecode/SampleRepeatTile.cpp b/samplecode/SampleRepeatTile.cpp
index 1ba6b69..3b7dea0 100644
--- a/samplecode/SampleRepeatTile.cpp
+++ b/samplecode/SampleRepeatTile.cpp
@@ -45,13 +45,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "RepeatTile");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("RepeatTile"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
diff --git a/samplecode/SampleSG.cpp b/samplecode/SampleSG.cpp
index a5db8cc..fc29c39 100644
--- a/samplecode/SampleSG.cpp
+++ b/samplecode/SampleSG.cpp
@@ -66,13 +66,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "SceneGraph");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("SceneGraph"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         fScene->render(canvas);
diff --git a/samplecode/SampleSVGFile.cpp b/samplecode/SampleSVGFile.cpp
index b3e3285..9fb62ed 100644
--- a/samplecode/SampleSVGFile.cpp
+++ b/samplecode/SampleSVGFile.cpp
@@ -59,14 +59,8 @@
         this->INHERITED::onSizeChange();
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, fLabel.c_str());
-            return true;
-        }
+    SkString name() override { return fLabel; }
 
-        return this->INHERITED::onQuery(evt);
-    }
 private:
     sk_sp<SkSVGDOM> fDom;
     SkString        fPath;
diff --git a/samplecode/SampleShaders.cpp b/samplecode/SampleShaders.cpp
index 212da37..7e14932 100644
--- a/samplecode/SampleShaders.cpp
+++ b/samplecode/SampleShaders.cpp
@@ -61,13 +61,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Shaders");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Shaders"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         canvas->drawBitmap(fBitmap, 0, 0);
diff --git a/samplecode/SampleShadowColor.cpp b/samplecode/SampleShadowColor.cpp
index 334452c..3affe79 100644
--- a/samplecode/SampleShadowColor.cpp
+++ b/samplecode/SampleShadowColor.cpp
@@ -44,12 +44,9 @@
         fRectPath.addRect(SkRect::MakeXYWH(-50, -50, 100, 100));
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ShadowColor");
-            return true;
-        }
+    SkString name() override { return SkString("ShadowColor"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             bool handled = false;
diff --git a/samplecode/SampleShadowReference.cpp b/samplecode/SampleShadowReference.cpp
index e629af8..22b17a1 100644
--- a/samplecode/SampleShadowReference.cpp
+++ b/samplecode/SampleShadowReference.cpp
@@ -38,12 +38,9 @@
         fReferenceImage = GetResourceAsImage("images/shadowreference.png");
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ShadowReference");
-            return true;
-        }
+    SkString name() override { return SkString("ShadowReference"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             bool handled = false;
diff --git a/samplecode/SampleShadowUtils.cpp b/samplecode/SampleShadowUtils.cpp
index d43a7e3..36a2a7d 100644
--- a/samplecode/SampleShadowUtils.cpp
+++ b/samplecode/SampleShadowUtils.cpp
@@ -73,12 +73,9 @@
         fConcavePaths.back().cubicTo(0, -25, 40, -50, 50, 0);
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "ShadowUtils");
-            return true;
-        }
+    SkString name() override { return SkString("ShadowUtils"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             bool handled = false;
diff --git a/samplecode/SampleShip.cpp b/samplecode/SampleShip.cpp
index 9b96e67..947b1a3 100644
--- a/samplecode/SampleShip.cpp
+++ b/samplecode/SampleShip.cpp
@@ -88,13 +88,7 @@
     ~DrawShipView() override {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, fName);
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString(fName); }
 
     void onDrawContent(SkCanvas* canvas) override {
         const float kCosDiff = 0.99984769515f;
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 8db5116..346ba60 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -436,13 +436,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Slides");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Slides"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         this->init();
diff --git a/samplecode/SampleStringArt.cpp b/samplecode/SampleStringArt.cpp
index 6062e90..50d2136 100644
--- a/samplecode/SampleStringArt.cpp
+++ b/samplecode/SampleStringArt.cpp
@@ -20,13 +20,7 @@
     StringArtView() : fAngle(0.305f) {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "StringArt");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("StringArt"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index bdebc61..4963f97 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -123,13 +123,7 @@
         this->setBGColor(0xFFDDDDDD);
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "StrokePath");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("StrokePath"); }
 
     SkRandom rand;
 
diff --git a/samplecode/SampleStrokeRect.cpp b/samplecode/SampleStrokeRect.cpp
index 17f1b8b..669a357 100644
--- a/samplecode/SampleStrokeRect.cpp
+++ b/samplecode/SampleStrokeRect.cpp
@@ -13,13 +13,7 @@
     StrokeRectSample() {}
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Stroke Rects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Stroke Rects"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
diff --git a/samplecode/SampleSubpixelTranslate.cpp b/samplecode/SampleSubpixelTranslate.cpp
index a48a9ff..b658bc3 100644
--- a/samplecode/SampleSubpixelTranslate.cpp
+++ b/samplecode/SampleSubpixelTranslate.cpp
@@ -42,13 +42,7 @@
 
     SkPoint fCurPos;
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "SubpixelTranslate");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("SubpixelTranslate"); }
 
     void onDrawContent(SkCanvas* canvas) override {
 
diff --git a/samplecode/SampleTextBox.cpp b/samplecode/SampleTextBox.cpp
index 014ecb3..90aec71 100644
--- a/samplecode/SampleTextBox.cpp
+++ b/samplecode/SampleTextBox.cpp
@@ -38,13 +38,7 @@
     TextBoxView() : fShaper(SkShaper::Make()) {}
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "TextBox");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("TextBox"); }
 
     void drawTest(SkCanvas* canvas, SkScalar w, SkScalar h, SkColor fg, SkColor bg) {
         SkAutoCanvasRestore acr(canvas, true);
diff --git a/samplecode/SampleTextEffects.cpp b/samplecode/SampleTextEffects.cpp
index a5b6453..2303288 100644
--- a/samplecode/SampleTextEffects.cpp
+++ b/samplecode/SampleTextEffects.cpp
@@ -117,13 +117,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Text Effects");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Text Effects"); }
 
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(SK_ColorWHITE);
diff --git a/samplecode/SampleTextureDomain.cpp b/samplecode/SampleTextureDomain.cpp
index 6807dc5..3bac799 100644
--- a/samplecode/SampleTextureDomain.cpp
+++ b/samplecode/SampleTextureDomain.cpp
@@ -33,13 +33,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Texture Domain");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Texture Domain"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkRect srcRect;
diff --git a/samplecode/SampleThinAA.cpp b/samplecode/SampleThinAA.cpp
index 8cdd0f6..bbf1475 100644
--- a/samplecode/SampleThinAA.cpp
+++ b/samplecode/SampleThinAA.cpp
@@ -373,12 +373,9 @@
         return true;
     }
 
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Thin-AA");
-            return true;
-        }
+    SkString name() override { return SkString("Thin-AA"); }
 
+    bool onQuery(Sample::Event* evt) override {
         SkUnichar key;
         if (Sample::CharQ(*evt, &key)) {
             switch(key) {
diff --git a/samplecode/SampleTiling.cpp b/samplecode/SampleTiling.cpp
index 9812666..743916f 100644
--- a/samplecode/SampleTiling.cpp
+++ b/samplecode/SampleTiling.cpp
@@ -72,13 +72,7 @@
     SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Tiling");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("Tiling"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
diff --git a/samplecode/SampleUnpremul.cpp b/samplecode/SampleUnpremul.cpp
index 5f191da..5fac3dc 100644
--- a/samplecode/SampleUnpremul.cpp
+++ b/samplecode/SampleUnpremul.cpp
@@ -42,11 +42,9 @@
     }
 
 protected:
+    SkString name() override { return SkString("unpremul"); }
+
     bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "unpremul");
-            return true;
-        }
         SkUnichar uni;
         if (Sample::CharQ(*evt, &uni)) {
             char utf8[SkUTF::kMaxBytesInUTF8Sequence];
diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp
index f3c90e2..911418b 100644
--- a/samplecode/SampleVertices.cpp
+++ b/samplecode/SampleVertices.cpp
@@ -66,13 +66,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "Vertices");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("Vertices"); }
 
     SkScalar fScale;
 
diff --git a/samplecode/SampleWritePixels.cpp b/samplecode/SampleWritePixels.cpp
index 298e58a..f6d31e5 100644
--- a/samplecode/SampleWritePixels.cpp
+++ b/samplecode/SampleWritePixels.cpp
@@ -32,13 +32,7 @@
     WritePixelsView() {}
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "WritePixels");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("WritePixels"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         SkBitmap bitmap;
diff --git a/samplecode/SampleXfer.cpp b/samplecode/SampleXfer.cpp
index 81534f7..ccf9f87 100644
--- a/samplecode/SampleXfer.cpp
+++ b/samplecode/SampleXfer.cpp
@@ -137,13 +137,7 @@
     }
 
 protected:
-    bool onQuery(Sample::Event* evt) override {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "XferDemo");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    SkString name() override { return SkString("XferDemo"); }
 
     void onDrawContent(SkCanvas* canvas) override {
         for (int i = 0; i < N_Modes; ++i) {
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index 5b89474..1d31524 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -73,13 +73,7 @@
     }
 
 protected:
-    virtual bool onQuery(Sample::Event* evt) {
-        if (Sample::TitleQ(*evt)) {
-            Sample::TitleR(evt, "XfermodesBlur");
-            return true;
-        }
-        return this->INHERITED::onQuery(evt);
-    }
+    virtual SkString name() { return SkString("XfermodesBlur"); }
 
     virtual void onDrawContent(SkCanvas* canvas) {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));