)]}'
{
  "commit": "34067b1a6e2c5121dbaf5915517f989c2f48fe68",
  "tree": "6a9131c6f9b5fcccbbc848af5cb5f2effb6cf6e1",
  "parents": [
    "abacb7417205339cd75ad09e55b8e6063a983ec0"
  ],
  "author": {
    "name": "John McDole",
    "email": "codefu@google.com",
    "time": "Tue Sep 29 16:01:25 2026 -0700"
  },
  "committer": {
    "name": "John McDole",
    "email": "codefu@google.com",
    "time": "Thu Oct 01 20:06:56 2026 -0700"
  },
  "message": "[Linux] Cancel active frame wait and defer GTK window destruction during multi-window teardown\n\nWhen tearing down an active secondary window on Linux:\n\n1. Calling gtk_widget_destroy() synchronously from a Dart platform task running inside fl_view_renderer_opengl_draw() -\u003e wait_for_frame() -\u003e fl_task_runner_wait() unrealized the GdkWindow and freed the GtkWindow while gtk_widget_draw_internal() was still active on the C call stack. Add fl_view_begin_destroy() and fl_view_renderer_opengl_cancel_wait() to abort wait_for_frame() immediately, and schedule gtk_widget_destroy() on the GLib main loop in fl_view_monitor_dispose() once the draw stack unwinds.\n\n2. In BaseWindowControllerLinux.destroy(), unreference FlViewMonitor and FlWindowMonitor before closing their Dart NativeCallables so that GTK signals emitted during teardown do not invoke closed callbacks.\n\n3. Suppress listener notifications in _ToplevelWindowControllerLinux once _destroyed is true to prevent window manager signals (such as notify::is-active) from triggering rebuilds on destroyed views.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "e565a24a049379bc65ee4843f2e17e9071d29110",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view.cc",
      "new_id": "a48b9ae097e293ce1b7f47ccd772986e09114364",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view.cc"
    },
    {
      "type": "modify",
      "old_id": "79ceac53089b3753f3a342cf318f4a1e532e5ac6",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_monitor.cc",
      "new_id": "8e20baf44cd3f69582cd8e42311bb2ab97718c16",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_monitor.cc"
    },
    {
      "type": "modify",
      "old_id": "cbdcef2ba3e510e93890e6765d2a87b7d1e30775",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_private.h",
      "new_id": "5d9e1ea6147c1a873e434c691830b3a88649a0fd",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_private.h"
    },
    {
      "type": "modify",
      "old_id": "2a2b1d5cea3862532c55c2fc65a87d81d24df265",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.cc",
      "new_id": "0fc2ab6482deffd5124e880c6c3329462edac454",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.cc"
    },
    {
      "type": "modify",
      "old_id": "c0d07d508e4d1a00247d687c134fa73efe78f38c",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.h",
      "new_id": "482f4e81243884c1bd5701a33c774fa849c67bb5",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/linux/fl_view_renderer_opengl.h"
    },
    {
      "type": "modify",
      "old_id": "ec68b994e3d4e07e63ff69b214afbfcefbc3e613",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/widgets/_window_linux.dart",
      "new_id": "650f14e3bc87d503dca5b68b90661f55850ba15b",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/widgets/_window_linux.dart"
    }
  ]
}
