+static void retrace_glXCreatePbuffer(trace::Call &call) {
+ int width = 0;
+ int height = 0;
+
+ const trace::Array *attrib_list = dynamic_cast<const trace::Array *>(&call.arg(2));
+ if (attrib_list) {
+ for (size_t i = 0; i + 1 < attrib_list->values.size(); i += 2) {
+ int param = attrib_list->values[i]->toSInt();
+ if (param == 0) {
+ break;
+ }
+
+ int value = attrib_list->values[i + 1]->toSInt();
+
+ switch (param) {
+ case GLX_PBUFFER_WIDTH:
+ width = value;
+ break;
+ case GLX_PBUFFER_HEIGHT:
+ height = value;
+ break;
+ }
+ }
+ }
+
+ unsigned long long orig_drawable = call.ret->toUInt();
+
+ glws::Drawable *drawable = glretrace::createDrawable();
+
+ drawable->resize(width, height);
+ drawable->show();
+
+ drawable_map[orig_drawable] = drawable;
+}
+
+static void retrace_glXDestroyPbuffer(trace::Call &call) {
+ glws::Drawable *drawable = getDrawable(call.arg(1).toUInt());
+
+ if (!drawable) {
+ return;
+ }
+
+ delete drawable;
+}
+