glretrace: Show current frame number in window title

I find this can be useful to roughly identify which frames I want to be
looking at for a specific issue in a large trace, by replaying the trace
and looking at the current frame number when the issue occurs.

Change-Id: I53cdab0c3cffdd6944fc0bd6206de4b99990913b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/apitrace/+/2224541
Reviewed-by: Po-Hsien Wang <pwang@chromium.org>
Commit-Queue: Robert Tarasov <tutankhamen@chromium.org>
Tested-by: Robert Tarasov <tutankhamen@chromium.org>
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index e55367c..ae836a3 100644
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -571,6 +571,14 @@
         retrace::warning(call) << "could not infer drawable size (glViewport never called)\n";
     }
 
+    /* Display the frame number in the window title, except in benchmark mode
+     * as compositor/window manager activity may affect the profile. */
+    if (retrace::debug > 0 && !retrace::profiling) {
+        std::ostringstream str;
+        str << "glretrace [frame: " << retrace::frameNo << "]";
+        currentDrawable->setName(str.str().c_str());
+    }
+
     if (curMetricBackend) {
         curMetricBackend->beginQuery(QUERY_BOUNDARY_FRAME);
     }
diff --git a/retrace/glws.hpp b/retrace/glws.hpp
index 7f4f12c..af9b1bd 100644
--- a/retrace/glws.hpp
+++ b/retrace/glws.hpp
@@ -148,6 +148,8 @@
         visible = true;
     }
 
+    virtual void setName(const char *name) {}
+
     virtual void copySubBuffer(int x, int y, int width, int height);
 
     virtual void swapBuffers(void) = 0;
diff --git a/retrace/glws_glx.cpp b/retrace/glws_glx.cpp
index 82bd6df..a2dbdb3 100644
--- a/retrace/glws_glx.cpp
+++ b/retrace/glws_glx.cpp
@@ -141,6 +141,14 @@
         Drawable::show();
     }
 
+    void setName(const char *name) override {
+        if (!window) {
+            return;
+        }
+
+        setWindowName(window, name);
+    }
+
     void copySubBuffer(int x, int y, int width, int height) override {
         glXCopySubBufferMESA(display, drawable, x, y, width, height);
 
diff --git a/retrace/glws_xlib.cpp b/retrace/glws_xlib.cpp
index 0222d7d..c175f1a 100644
--- a/retrace/glws_xlib.cpp
+++ b/retrace/glws_xlib.cpp
@@ -282,4 +282,11 @@
 }
 
 
+void
+setWindowName(Window window, const char *name)
+{
+    XStoreName(display, window, const_cast<char *>(name));
+}
+
+
 } /* namespace glws */
diff --git a/retrace/glws_xlib.hpp b/retrace/glws_xlib.hpp
index 68d32c2..78007e8 100644
--- a/retrace/glws_xlib.hpp
+++ b/retrace/glws_xlib.hpp
@@ -63,6 +63,8 @@
 void
 showWindow(Window window);
 
+void
+setWindowName(Window window, const char *name);
 
 } /* namespace glws */