From d087296f00c4f330fabe130156c47b99648c96b0 Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Fri, 9 Jan 2026 19:44:34 +0100 Subject: [PATCH] IJPL-217440 Rework the inactive window rendering mechanism GitOrigin-RevId: 32e9e610d74aea5ccc1893689eab2f893b3cee39 --- .../frontend/src/NavBarRootPaneExtension.kt | 9 +- .../actionSystem/impl/ActionButton.java | 4 +- .../impl/InternalUICustomization.kt | 16 ++ .../impl/islands/IslandsGradientPainter.kt | 43 ++-- .../islands/IslandsInactiveFrameGraphics2D.kt | 188 ++++++++++++++++++ .../impl/islands/IslandsUICustomization.kt | 36 +++- .../header/CustomHeader.kt | 6 +- .../header/MacToolbarFrameHeader.kt | 6 +- .../header/toolbar/ToolbarFrameHeader.kt | 3 +- .../wm/impl/headertoolbar/MainToolbar.kt | 11 +- .../wm/impl/status/IdeStatusBarImpl.kt | 10 +- .../com/intellij/toolWindow/ToolWindowPane.kt | 5 +- .../intellij/toolWindow/ToolWindowToolbar.kt | 21 +- .../intellij/ui/mac/WindowTabsComponent.java | 7 +- .../util/resources/misc/registry.properties | 3 + 15 files changed, 328 insertions(+), 40 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInactiveFrameGraphics2D.kt diff --git a/platform/navbar/frontend/src/NavBarRootPaneExtension.kt b/platform/navbar/frontend/src/NavBarRootPaneExtension.kt index f3684b3b214d..ad4b389d655b 100644 --- a/platform/navbar/frontend/src/NavBarRootPaneExtension.kt +++ b/platform/navbar/frontend/src/NavBarRootPaneExtension.kt @@ -15,6 +15,7 @@ import com.intellij.openapi.application.EDT import com.intellij.openapi.application.UI import com.intellij.openapi.application.impl.BorderPainterHolder import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.project.Project import com.intellij.openapi.wm.IdeRootPaneNorthExtension import com.intellij.openapi.wm.StatusBar @@ -31,7 +32,6 @@ import com.intellij.ui.hover.HoverListener import com.intellij.ui.scale.JBUIScale.scale import com.intellij.util.concurrency.AppExecutorUtil import com.intellij.util.ui.JBInsets -import com.intellij.util.ui.JBSwingUtilities import com.intellij.util.ui.JBUI import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel @@ -100,7 +100,7 @@ internal class NavBarRootPaneExtension : IdeRootPaneNorthExtension { // used externally abstract class NavBarWrapperPanel(layout: LayoutManager?) : JPanel(layout), UISettingsListener { override fun getComponentGraphics(graphics: Graphics): Graphics { - return JBSwingUtilities.runGlobalCGTransform(this, super.getComponentGraphics(graphics)) + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, super.getComponentGraphics(graphics)) } } } @@ -276,6 +276,7 @@ internal open class MyNavBarWrapperPanel(private val project: Project, useAsComp } } +// todo remove with isIjpl217440 property internal class MyTopNavBarWrapperPanel(project: Project, useAsComponent: Boolean) : MyNavBarWrapperPanel(project, useAsComponent), BorderPainterHolder { @@ -283,7 +284,9 @@ internal class MyTopNavBarWrapperPanel(project: Project, useAsComponent: Boolean override fun paintChildren(g: Graphics) { super.paintChildren(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java index 3de05318908f..bd722e794e0a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java @@ -10,6 +10,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.*; import com.intellij.openapi.application.WriteIntentReadAction; import com.intellij.openapi.application.impl.InternalUICustomization; +import com.intellij.openapi.application.impl.islands.IslandsUICustomizationKt; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.keymap.KeymapUtil; @@ -472,12 +473,13 @@ public class ActionButton extends JComponent implements ActionButtonComponent, A return KeymapUtil.getFirstKeyboardShortcutText(myAction); } + // todo remove with isIjpl217440 property private final InternalUICustomization myCustomization = InternalUICustomization.getInstance(); @Override public void paintComponent(Graphics g) { jComponentPaint(g); - if (myCustomization != null) { + if (myCustomization != null && !IslandsUICustomizationKt.isIjpl217440()) { g = myCustomization.preserveGraphics(g); } paintButtonLook(g); diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt index ec4032a08307..b414f25e0b15 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt @@ -18,6 +18,7 @@ import com.intellij.toolWindow.StripesUxCustomizer import com.intellij.toolWindow.ToolWindowButtonManager import com.intellij.toolWindow.xNext.XNextStripesUxCustomizer import com.intellij.ui.BorderPainter +import com.intellij.ui.Graphics2DDelegate import com.intellij.ui.JBColor import com.intellij.ui.mac.WindowTabsComponent import com.intellij.ui.tabs.JBTabPainter @@ -25,6 +26,7 @@ import com.intellij.ui.tabs.JBTabsPosition import com.intellij.ui.tabs.impl.JBTabsImpl import com.intellij.ui.tabs.impl.TabLabel import com.intellij.ui.tabs.impl.TabPainterAdapter +import com.intellij.util.ui.JBSwingUtilities import com.intellij.util.ui.JBUI import org.jetbrains.annotations.ApiStatus import java.awt.* @@ -51,6 +53,17 @@ open class InternalUICustomization { instance = result return result } + + fun runGlobalCGTransformWithInactiveFrameSupport(component: JComponent, graphics: Graphics): Graphics { + if (graphics is Graphics2DDelegate) { + return graphics + } + + val customization = getInstance() + val inactiveFrameGraphics = customization?.inactiveFrameGraphics(graphics, component) ?: graphics + + return JBSwingUtilities.runGlobalCGTransform(component, inactiveFrameGraphics) + } } open fun progressWidget(project: Project): JComponent? = null @@ -132,6 +145,8 @@ open class InternalUICustomization { open fun preserveGraphics(graphics: Graphics): Graphics = graphics + open fun inactiveFrameGraphics(graphics: Graphics, component: Component): Graphics = graphics + open fun backgroundImageGraphics(component: JComponent, graphics: Graphics): Graphics = graphics open fun createCustomDivider(isVertical: Boolean, splitter: Splittable): Divider? = null @@ -196,6 +211,7 @@ open class InternalUICustomization { open fun getSingleRowTabInsets(tabsPosition: JBTabsPosition): Insets? = null } +// todo remove with isIjpl217440 property @ApiStatus.Internal interface BorderPainterHolder { var borderPainter: BorderPainter diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsGradientPainter.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsGradientPainter.kt index b84d158524ac..96c488aa142c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsGradientPainter.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsGradientPainter.kt @@ -22,21 +22,27 @@ import com.intellij.ui.scale.ScaleContext import com.intellij.util.ui.JBUI import java.awt.* import javax.swing.JComponent +import javax.swing.SwingUtilities + +/** + * The list of auto replaced colors. Should contain only very specific colors, don't add widely used like `Panel.background` + */ +private val islandsGradientColors = setOf( + // Root components + "MainWindow.background", + "MainToolbar.background", + "MainToolbar.inactiveBackground", + "ToolWindow.Stripe.background", + "StatusBar.background", +) + +internal fun isIslandsGradientColor(paint: Paint?): Boolean { + val colorName = (paint as? JBColor)?.name ?: return false + return colorName in islandsGradientColors +} internal class IslandsGradientPainter(private val frame: IdeFrame, private val mainColor: Color, private val enabled: () -> Boolean) : AbstractPainter() { - /** - * The list of auto replaced colors. Should contain only very specific colors, don't add widely used like `Panel.background` - */ - private val islandsGradientColors = setOf( - // Root components - "MainWindow.background", - "MainToolbar.background", - "MainToolbar.inactiveBackground", - "ToolWindow.Stripe.background", - "StatusBar.background", - ) - private val projectWindowCustomizer = ProjectWindowCustomizerService.getInstance() private var doPaint = true @@ -48,8 +54,7 @@ internal class IslandsGradientPainter(private val frame: IdeFrame, private val m try { doPaint = false - val colorName = (g.paint as? JBColor)?.name - if (colorName in islandsGradientColors) { + if (isIslandsGradientColor(g.paint)) { islandsGradientPaint(frame, mainColor, projectWindowCustomizer, component, g) } } @@ -98,6 +103,13 @@ private fun doGradientPaint(frame: IdeFrame, mainColor: Color, project: Project, val leftGradientTexture = cache.left.getHorizontalTexture(g, leftWidth, mainColor, blendedColor) val rightGradientTexture = cache.right.getHorizontalTexture(g, rightWidth, blendedColor, mainColor, leftWidth) + val initialComposite = g.composite + val islandsInactiveFrameGraphics2D = g as? IslandsInactiveFrameGraphics2D + + if (isIjpl217440 && SwingUtilities.getWindowAncestor(frame.component)?.isActive == false) { + islandsInactiveFrameGraphics2D?.preserveComposite = true + g.composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, islandsInactiveAlpha) + } g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY) @@ -114,6 +126,9 @@ private fun doGradientPaint(frame: IdeFrame, mainColor: Color, project: Project, val startColor = if (SystemInfo.isMac) Gray.TRANSPARENT else ColorUtil.toAlpha(mainColor, 0) g.paint = GradientPaint(0f, 0f, startColor, 0f, height.toFloat(), mainColor) g.fillRect(0, 0, totalWidth, height) + + g.composite = initialComposite + islandsInactiveFrameGraphics2D?.preserveComposite = false } private class GradientCache { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInactiveFrameGraphics2D.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInactiveFrameGraphics2D.kt new file mode 100644 index 000000000000..f8e771d8a94e --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInactiveFrameGraphics2D.kt @@ -0,0 +1,188 @@ +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.openapi.application.impl.islands + +import com.intellij.ui.Graphics2DDelegate +import java.awt.* +import java.awt.image.BufferedImage +import java.awt.image.BufferedImageOp +import java.awt.image.ImageObserver +import java.text.AttributedCharacterIterator +import javax.swing.SwingUtilities + +/** + * Paints everything with alpha [islandsInactiveAlpha] when the frame is not active + */ +internal class IslandsInactiveFrameGraphics2D(g: Graphics2D, private val component: Component) : Graphics2DDelegate(g) { + + var preserveComposite: Boolean = false + + private fun getAlpha(): Float { + return if (SwingUtilities.getWindowAncestor(component)?.isActive == false) islandsInactiveAlpha else 1f + } + + private fun wrapPaint(runnable: () -> R): R { + val alpha = getAlpha() + + if (alpha == 1f || preserveComposite || isIslandsGradientColor(paint)) { + return runnable.invoke() + } + + val composite = getComposite() + try { + when (composite) { + is AlphaComposite -> { + setComposite(AlphaComposite.getInstance(composite.getRule(), composite.alpha * alpha)) + } + null -> { + setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)) + } + } + + return runnable.invoke() + } + finally { + setComposite(composite) + } + } + + override fun clearRect(x: Int, y: Int, width: Int, height: Int) { + wrapPaint { + super.clearRect(x, y, width, height) + } + } + + override fun fillRect(x: Int, y: Int, width: Int, height: Int) { + wrapPaint { + super.fillRect(x, y, width, height) + } + } + + override fun fillArc(x: Int, y: Int, width: Int, height: Int, startAngle: Int, arcAngle: Int) { + wrapPaint { + super.fillArc(x, y, width, height, startAngle, arcAngle) + } + } + + override fun fillOval(x: Int, y: Int, width: Int, height: Int) { + wrapPaint { + super.fillOval(x, y, width, height) + } + } + + override fun fillPolygon(xPoints: IntArray, yPoints: IntArray, nPoints: Int) { + wrapPaint { + super.fillPolygon(xPoints, yPoints, nPoints) + } + } + + override fun fillPolygon(s: Polygon) { + wrapPaint { + super.fillPolygon(s) + } + } + + override fun fillRoundRect(x: Int, y: Int, width: Int, height: Int, arcWidth: Int, arcHeight: Int) { + wrapPaint { + super.fillRoundRect(x, y, width, height, arcWidth, arcHeight) + } + } + + override fun fill(s: Shape) { + wrapPaint { + super.fill(s) + } + } + + override fun drawImage(img: BufferedImage, op: BufferedImageOp?, x: Int, y: Int) { + wrapPaint { + super.drawImage(img, op, x, y) + } + } + + override fun drawImage(img: Image?, x: Int, y: Int, width: Int, height: Int, observer: ImageObserver?): Boolean { + return wrapPaint { + super.drawImage(img, x, y, width, height, observer) + } + } + + override fun drawImage(img: Image?, x: Int, y: Int, width: Int, height: Int, c: Color?, observer: ImageObserver?): Boolean { + return wrapPaint { + super.drawImage(img, x, y, width, height, c, observer) + } + } + + override fun drawImage(img: Image, x: Int, y: Int, observer: ImageObserver?): Boolean { + return wrapPaint { + super.drawImage(img, x, y, observer) + } + } + + override fun drawImage(img: Image, x: Int, y: Int, c: Color?, observer: ImageObserver?): Boolean { + return wrapPaint { + super.drawImage(img, x, y, c, observer) + } + } + + override fun drawImage( + img: Image?, + dx1: Int, + dy1: Int, + dx2: Int, + dy2: Int, + sx1: Int, + sy1: Int, + sx2: Int, + sy2: Int, + observer: ImageObserver?, + ): Boolean { + return wrapPaint { + super.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer) + } + } + + override fun drawImage( + img: Image?, + dx1: Int, + dy1: Int, + dx2: Int, + dy2: Int, + sx1: Int, + sy1: Int, + sx2: Int, + sy2: Int, + c: Color?, + observer: ImageObserver?, + ): Boolean { + return wrapPaint { + super.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, c, observer) + } + } + + override fun drawString(iterator: AttributedCharacterIterator?, x: Float, y: Float) { + wrapPaint { + super.drawString(iterator, x, y) + } + } + + override fun drawString(iterator: AttributedCharacterIterator?, x: Int, y: Int) { + wrapPaint { + super.drawString(iterator, x, y) + } + } + + override fun drawString(s: String?, x: Float, y: Float) { + wrapPaint { + super.drawString(s, x, y) + } + } + + override fun drawString(str: String, x: Int, y: Int) { + wrapPaint { + super.drawString(str, x, y) + } + } + + override fun create(): Graphics { + return IslandsInactiveFrameGraphics2D(super.create() as Graphics2D, component) + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt index d343a863d656..8c508f0b8afa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt @@ -27,6 +27,7 @@ import com.intellij.openapi.ui.* import com.intellij.openapi.util.Key import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.util.SystemInfoRt +import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.wm.* import com.intellij.openapi.wm.ex.ToolWindowManagerEx import com.intellij.openapi.wm.impl.* @@ -53,6 +54,7 @@ import com.intellij.ui.tabs.impl.JBTabsImpl import com.intellij.ui.tabs.impl.TabLabel import com.intellij.ui.tabs.impl.TabPainterAdapter import com.intellij.util.ui.* +import org.jetbrains.annotations.ApiStatus import java.awt.* import java.awt.event.AWTEventListener import java.awt.event.HierarchyEvent @@ -70,7 +72,21 @@ private data class WindowBackgroundComponentData(val origOpaque: Boolean, val or private val WINDOW_BACKGROUND_COMPONENT_KEY: Key = Key.create("Islands.WINDOW_BACKGROUND_COMPONENT_KEY") +/** + * After removing isIjpl217440 property + * * Re3move from registry.properties + * * Check all places, marked with: todo remove with isIjpl217440 property + * * Remove inactiveAlphaInStatusBar property from everywhere including themes + */ +@get:ApiStatus.Internal +val isIjpl217440: Boolean + get() = Registry.`is`("idea.islands.ijpl217440.enabled") + +internal val islandsInactiveAlpha: Float + get() = JBUI.getFloat("Island.inactiveAlpha", 0.5f) + internal class IslandsUICustomization : InternalUICustomization() { + private val isIslandsAvailable = ExperimentalUI.isNewUI() private var isManyIslandEnabledCache: Boolean? = null @@ -582,12 +598,14 @@ internal class IslandsUICustomization : InternalUICustomization() { } private fun configureMainFrameChildren(component: Component, install: Boolean) { - when (component) { - is IdeStatusBarImpl -> { - component.borderPainter = if (install) inactivePainter else DefaultBorderPainter() - } - is BorderPainterHolder -> { - component.borderPainter = if (install) inactivePainter else DefaultBorderPainter() + if (!isIjpl217440) { + when (component) { + is IdeStatusBarImpl -> { + component.borderPainter = if (install) inactivePainter else DefaultBorderPainter() + } + is BorderPainterHolder -> { + component.borderPainter = if (install) inactivePainter else DefaultBorderPainter() + } } } @@ -1062,6 +1080,12 @@ internal class IslandsUICustomization : InternalUICustomization() { return graphics } + override fun inactiveFrameGraphics(graphics: Graphics, component: Component): Graphics { + return if (isManyIslandEnabled && isIjpl217440) + IslandsInactiveFrameGraphics2D(graphics as Graphics2D, component) + else super.inactiveFrameGraphics(graphics, component) + } + override fun backgroundImageGraphics(component: JComponent, graphics: Graphics): Graphics { if (isManyIslandEnabled && isIslandsGradientEnabled) { return IdeBackgroundUtil.getOriginalGraphics(graphics) // not supported for island themes with gradients yet diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/CustomHeader.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/CustomHeader.kt index 020710c4577a..371228c5b3d2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/CustomHeader.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/CustomHeader.kt @@ -7,6 +7,7 @@ import com.intellij.icons.AllIcons import com.intellij.openapi.MnemonicHelper import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.impl.BorderPainterHolder +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.ui.JBPopupMenu import com.intellij.openapi.util.NlsActions @@ -290,9 +291,12 @@ internal sealed class CustomHeader(@JvmField internal val window: Window) : JPan closeMenuItem.font = JBFont.label().deriveFont(Font.BOLD) } + // todo remove with isIjpl217440 property override fun paint(g: Graphics) { super.paint(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } override fun getAccessibleContext(): AccessibleContext { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/MacToolbarFrameHeader.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/MacToolbarFrameHeader.kt index e12845e408e0..034a37384b75 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/MacToolbarFrameHeader.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/MacToolbarFrameHeader.kt @@ -13,6 +13,7 @@ import com.intellij.openapi.application.UI import com.intellij.openapi.application.asContextElement import com.intellij.openapi.application.impl.BorderPainterHolder import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.wm.impl.ToolbarHolder import com.intellij.openapi.wm.impl.customFrameDecorations.header.titleLabel.SimpleCustomDecorationPath import com.intellij.openapi.wm.impl.headertoolbar.MainToolbar @@ -159,9 +160,12 @@ internal class MacToolbarFrameHeader( return CustomWindowHeaderUtil.getPreferredWindowHeaderHeight(view is CompactHeaderView) } + // todo remove with isIjpl217440 property override fun paint(g: Graphics) { super.paint(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } override fun paintComponent(g: Graphics) { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/toolbar/ToolbarFrameHeader.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/toolbar/ToolbarFrameHeader.kt index 7ed625068096..aff92cf79cd7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/toolbar/ToolbarFrameHeader.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/customFrameDecorations/header/toolbar/ToolbarFrameHeader.kt @@ -33,7 +33,6 @@ import com.intellij.ui.dsl.gridLayout.VerticalAlign import com.intellij.ui.dsl.gridLayout.builders.RowsGridBuilder import com.intellij.util.ui.GridBag import com.intellij.util.ui.JBDimension -import com.intellij.util.ui.JBSwingUtilities import com.intellij.util.ui.JBUI import kotlinx.coroutines.* import kotlinx.coroutines.channels.BufferOverflow @@ -393,7 +392,7 @@ internal class ToolbarFrameHeader( } override fun getComponentGraphics(graphics: Graphics): Graphics { - return JBSwingUtilities.runGlobalCGTransform(this, super.getComponentGraphics(graphics)) + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, super.getComponentGraphics(graphics)) } override fun updateActive() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/MainToolbar.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/MainToolbar.kt index 24c503e91170..e042e63b5809 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/MainToolbar.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/MainToolbar.kt @@ -29,6 +29,7 @@ import com.intellij.openapi.application.EDT import com.intellij.openapi.application.UiWithModelAccess import com.intellij.openapi.application.impl.BorderPainterHolder import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.keymap.impl.ui.ActionsTreeUtil import com.intellij.openapi.project.DumbAwareAction @@ -48,7 +49,6 @@ import com.intellij.ui.components.panels.HorizontalLayout import com.intellij.ui.mac.touchbar.TouchbarSupport import com.intellij.util.containers.ContainerUtil import com.intellij.util.ui.JBInsets -import com.intellij.util.ui.JBSwingUtilities import com.intellij.util.ui.JBUI import com.intellij.util.ui.JBUI.CurrentTheme.Toolbar.mainToolbarButtonInsets import com.intellij.util.ui.showingScope @@ -181,7 +181,9 @@ class MainToolbar( } } - override fun getComponentGraphics(g: Graphics): Graphics = JBSwingUtilities.runGlobalCGTransform(this, g) + override fun getComponentGraphics(g: Graphics): Graphics { + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, g) + } suspend fun init(customTitleBar: WindowDecorations.CustomTitleBar? = null) { val schema = CustomActionsSchema.getInstanceAsync() @@ -301,9 +303,12 @@ class MainToolbar( } } + // todo remove with isIjpl217440 property override fun paintChildren(g: Graphics) { super.paintChildren(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } private fun installClickListener(popupHandler: PopupHandler, customTitleBar: WindowDecorations.CustomTitleBar?) { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.kt index 93b494c6992e..851f9137cd87 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.kt @@ -10,6 +10,8 @@ import com.intellij.internal.statistic.service.fus.collectors.UIEventLogger.Stat import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.* import com.intellij.openapi.application.* +import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.components.service import com.intellij.openapi.components.serviceAsync import com.intellij.openapi.diagnostic.debug @@ -57,7 +59,6 @@ import com.intellij.ui.util.height import com.intellij.util.EventDispatcher import com.intellij.util.concurrency.annotations.RequiresEdt import com.intellij.util.ui.EdtInvocationManager -import com.intellij.util.ui.JBSwingUtilities import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil import kotlinx.coroutines.* @@ -126,6 +127,7 @@ open class IdeStatusBarImpl @Internal constructor( private val progressFlow = MutableSharedFlow(replay = 1, extraBufferCapacity = Int.MAX_VALUE) + // todo remove with isIjpl217440 property internal var borderPainter: BorderPainter = DefaultBorderPainter() companion object { @@ -555,7 +557,9 @@ open class IdeStatusBarImpl @Internal constructor( override fun paintChildren(g: Graphics) { effectRenderer.paintBackground(g) super.paintChildren(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } private fun dispatchMouseEvent(e: MouseEvent): Boolean { @@ -635,7 +639,7 @@ open class IdeStatusBarImpl @Internal constructor( } override fun getComponentGraphics(g: Graphics): Graphics { - return JBSwingUtilities.runGlobalCGTransform(this, super.getComponentGraphics(g)) + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, super.getComponentGraphics(g)) } override fun removeWidget(id: String) { diff --git a/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowPane.kt b/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowPane.kt index 4fdd128cb019..5ffe04ca25f2 100644 --- a/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowPane.kt +++ b/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowPane.kt @@ -10,6 +10,7 @@ import com.intellij.ide.ui.UISettingsListener import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.impl.BorderPainterHolder import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.ui.Divider @@ -399,7 +400,9 @@ class ToolWindowPane private constructor( override fun paintChildren(g: Graphics) { super.paintChildren(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } } val bottomHeight: Int diff --git a/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowToolbar.kt b/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowToolbar.kt index 49db84324107..4178c909f9c2 100644 --- a/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowToolbar.kt +++ b/platform/platform-impl/src/com/intellij/toolWindow/ToolWindowToolbar.kt @@ -4,6 +4,8 @@ package com.intellij.toolWindow import com.intellij.accessibility.AccessibilityUtils import com.intellij.openapi.application.impl.BorderPainterHolder +import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.openapi.application.impl.islands.isIjpl217440 import com.intellij.openapi.project.Project import com.intellij.openapi.ui.VerticalFlowLayout import com.intellij.openapi.util.NlsSafe @@ -109,9 +111,16 @@ abstract class ToolWindowToolbar(private val isPrimary: Boolean, val anchor: Too open fun createBorder():Border = JBUI.Borders.empty() open fun getBorderColor(): Color? = JBUI.CurrentTheme.ToolWindow.borderColor() + // todo remove with isIjpl217440 property override fun paint(g: Graphics) { super.paint(g) - borderPainter.paintAfterChildren(this, g) + if (!isIjpl217440) { + borderPainter.paintAfterChildren(this, g) + } + } + + override fun getComponentGraphics(graphics: Graphics?): Graphics? { + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, graphics as Graphics2D) } internal abstract fun getStripeFor(anchor: ToolWindowAnchor): AbstractDroppableStripe @@ -175,9 +184,9 @@ abstract class ToolWindowToolbar(private val isPrimary: Boolean, val anchor: Too } internal class StripeV2(private val toolBar: ToolWindowToolbar, - paneId: String, - override val anchor: ToolWindowAnchor, - override val split: Boolean = false, + paneId: String, + override val anchor: ToolWindowAnchor, + override val split: Boolean = false, layout : LayoutManager = VerticalFlowLayout(0, 0) ) : AbstractDroppableStripe(paneId, layout) { var bottomAnchorDropAreaComponent: JComponent? = null @@ -236,6 +245,10 @@ abstract class ToolWindowToolbar(private val isPrimary: Boolean, val anchor: Too return super.containsPoint(screenPoint) } + override fun getComponentGraphics(graphics: Graphics?): Graphics { + return InternalUICustomization.runGlobalCGTransformWithInactiveFrameSupport(this, graphics as Graphics2D) + } + private fun getFirstVisibleToolWindowSize(width: Boolean): Int { for (button in getButtons()) { if (button.toolWindow.isVisible) { diff --git a/platform/platform-impl/src/com/intellij/ui/mac/WindowTabsComponent.java b/platform/platform-impl/src/com/intellij/ui/mac/WindowTabsComponent.java index cfc3aa0e41e4..d0d2accbed57 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/WindowTabsComponent.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/WindowTabsComponent.java @@ -8,6 +8,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.impl.BorderPainterHolder; import com.intellij.openapi.application.impl.InternalUICustomization; +import com.intellij.openapi.application.impl.islands.IslandsUICustomizationKt; import com.intellij.openapi.components.ComponentManagerEx; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; @@ -71,6 +72,7 @@ public final class WindowTabsComponent extends JBTabsImpl implements BorderPaint private final Disposable myParentDisposable; private final Map myIndexes = new HashMap<>(); + // todo remove with isIjpl217440 property private BorderPainter borderPainter = new DefaultBorderPainter(); public WindowTabsComponent(@NotNull IdeFrameImpl nativeWindow, @Nullable Project project, @NotNull Disposable parentDisposable) { @@ -141,10 +143,13 @@ public final class WindowTabsComponent extends JBTabsImpl implements BorderPaint return new Dimension(super.getPreferredSize().width, JBUI.scale(TAB_HEIGHT)); } + // todo remove with isIjpl217440 property @Override public void paintChildren(Graphics g) { super.paintChildren(g); - borderPainter.paintAfterChildren(this, g); + if (!IslandsUICustomizationKt.isIjpl217440()) { + borderPainter.paintAfterChildren(this, g); + } } @Override diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 8ef86e8444d0..f8ad3c301047 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -2359,6 +2359,9 @@ station.enable.welcome.screen.promo.description=Enables promo for Toolbox App idea.islands.color.gradient.enabled=false idea.islands.color.gradient.enabled.description=Enable gradient backgrounds for UI Islands color scheme elements +idea.islands.ijpl217440.enabled=false +idea.islands.ijpl217440.enabled.description=Enables IJPL-217440: Rework the inactive window rendering mechanism. Instead of restarting switching themes can be used +idea.islands.ijpl217440.enabled.restartRequired=true vfs.fetch.case.sensitivity.using.eel=true vfs.fetch.case.sensitivity.using.eel.description=Enable directory case sensitivity fetching using EEL on WSL and Docker. \