From ef0c6a2b8b648bf99fe06eb102150079726ab058 Mon Sep 17 00:00:00 2001 From: Ilia Permiashkin Date: Tue, 21 Oct 2025 08:34:19 +0000 Subject: [PATCH] [grazie] IJPL-213792 GrazieStatusBarWidget disposed before child disposable Merge-request: IJ-MR-179148 Merged-by: Ilia Permiashkin GitOrigin-RevId: defcc678392798333234974e31fac77aa6e5bd68 --- platform/platform-impl/api-dump.txt | 3 +++ .../status/widget/StatusBarWidgetsManager.kt | 6 ++++-- .../ui/widget/GrazieStatusBarWidgetFactory.kt | 19 +++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/platform/platform-impl/api-dump.txt b/platform/platform-impl/api-dump.txt index e5f803e82118..4be4c1cbe0e7 100644 --- a/platform/platform-impl/api-dump.txt +++ b/platform/platform-impl/api-dump.txt @@ -905,6 +905,9 @@ com.intellij.openapi.wm.impl.content.tabActions.ContentTabActionProvider - sf:Companion:com.intellij.openapi.wm.impl.content.tabActions.ContentTabActionProvider$Companion - sf:EP_NAME:com.intellij.openapi.extensions.ExtensionPointName - a:createTabActions(com.intellij.ui.content.Content):java.util.List +f:com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager +- f:updateWidget(com.intellij.openapi.wm.StatusBarWidgetFactory,kotlin.coroutines.CoroutineContext):V +- bs:updateWidget$default(com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager,com.intellij.openapi.wm.StatusBarWidgetFactory,kotlin.coroutines.CoroutineContext,I,java.lang.Object):V f:com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService - f:runCloneTask(java.nio.file.Path,com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService$CloneTask):V f:com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService$CloneableProject diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/widget/StatusBarWidgetsManager.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/widget/StatusBarWidgetsManager.kt index 50e28f6e2602..e91f51858fdb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/widget/StatusBarWidgetsManager.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/widget/StatusBarWidgetsManager.kt @@ -29,6 +29,7 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.swing.JComponent +import kotlin.coroutines.CoroutineContext private val LOG = logger() @@ -74,7 +75,8 @@ class StatusBarWidgetsManager( } } - fun updateWidget(factory: StatusBarWidgetFactory) { + @JvmOverloads + fun updateWidget(factory: StatusBarWidgetFactory, coroutineContext: CoroutineContext = Dispatchers.EDT) { if ((factory.isConfigurable && !StatusBarWidgetSettings.getInstance().isEnabled(factory)) || !factory.isAvailable(project)) { disableWidget(factory) return @@ -95,7 +97,7 @@ class StatusBarWidgetsManager( val widget = createWidget(factory, dataContext, parentScope) widgetFactories.put(factory, widget) widgetIdMap.put(widget.ID(), factory) - parentScope.launch(Dispatchers.EDT) { + parentScope.launch(coroutineContext) { when (val statusBar = WindowManager.getInstance().getStatusBar(project)) { is IdeStatusBarImpl -> statusBar.addWidget(widget, order) null -> { diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/widget/GrazieStatusBarWidgetFactory.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/widget/GrazieStatusBarWidgetFactory.kt index 8604f7543176..5703d043ff28 100644 --- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/widget/GrazieStatusBarWidgetFactory.kt +++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/widget/GrazieStatusBarWidgetFactory.kt @@ -6,6 +6,9 @@ import com.intellij.grazie.GrazieConfig.State.Processing.Cloud import com.intellij.grazie.cloud.GrazieCloudConnector import com.intellij.grazie.ide.msg.GrazieInitializerManager import com.intellij.grazie.ide.msg.GrazieStateLifecycle +import com.intellij.openapi.application.EDT +import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.application.asContextElement import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager @@ -16,10 +19,13 @@ import com.intellij.openapi.wm.StatusBarWidget import com.intellij.openapi.wm.StatusBarWidgetFactory import com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager import com.intellij.util.application +import kotlinx.coroutines.Dispatchers internal class GrazieStatusBarWidgetFactory : StatusBarWidgetFactory, GrazieStateLifecycle { - init { service().register(this) } + init { + service().register(this) + } override fun getId(): String { return widgetId @@ -48,13 +54,14 @@ internal class GrazieStatusBarWidgetFactory : StatusBarWidgetFactory, GrazieStat } override fun update(prevState: GrazieConfig.State, newState: GrazieConfig.State) { - application.invokeLater { - if (newState.explicitlyChosenProcessing != prevState.explicitlyChosenProcessing && prevState.explicitlyChosenProcessing != null) { + if (newState.explicitlyChosenProcessing == prevState.explicitlyChosenProcessing) return + application.invokeLater( + { ProjectManager.getInstance().openProjects.forEach { project -> - project.service().updateWidget(this) + project.service() + .updateWidget(this, Dispatchers.EDT + ModalityState.any().asContextElement()) } - } - } + }, ModalityState.any()) } companion object {