[ui] IJPL-234915: Bind widget scope to its plugin

GitOrigin-RevId: e183c49804d779911c847b9d0f23e92710443687
This commit is contained in:
Konstantin Nisht
2026-02-16 17:15:03 +00:00
committed by intellij-monorepo-bot
parent ab415d506e
commit f08e0b7915
@@ -6,6 +6,7 @@ package com.intellij.openapi.wm.impl.status.widget
import com.intellij.diagnostic.PluginException
import com.intellij.ide.lightEdit.LightEdit
import com.intellij.ide.lightEdit.LightEditCompatible
import com.intellij.ide.plugins.cl.PluginAwareClassLoader
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.EDT
@@ -31,7 +32,10 @@ import com.intellij.openapi.wm.WindowManager
import com.intellij.openapi.wm.impl.status.ChildStatusBarWidget
import com.intellij.openapi.wm.impl.status.IdeStatusBarImpl
import com.intellij.openapi.wm.impl.status.createComponentByWidgetPresentation
import com.intellij.platform.util.coroutines.attachAsChildTo
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.application
import com.intellij.util.asSafely
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
@@ -266,9 +270,18 @@ private fun createWidget(
}
val widgetScope = parentScope.childScope("${factory.id}-widget")
tryAttachWidgetScopeToPlugin(factory, widgetScope)
return WidgetPresentationWrapper(id = factory.id, factory = factory, dataContext = dataContext, scope = widgetScope)
}
private fun tryAttachWidgetScopeToPlugin(factory: StatusBarWidgetFactory, widgetScope: CoroutineScope) {
val pluginScope = factory.javaClass.classLoader.asSafely<PluginAwareClassLoader>()?.pluginCoroutineScope
if (pluginScope != null) {
widgetScope.attachAsChildTo(pluginScope)
}
}
/**
* Wrapper for V2 status bar widgets (those using WidgetPresentationFactory).
* Implements ChildStatusBarWidget to support child status bars in detached windows.