From abf9bec7d2cd8576c648cafc5217fcb931442b0a Mon Sep 17 00:00:00 2001 From: swazrgb <65694696+swazrgb@users.noreply.github.com> Date: Wed, 9 Jun 2021 21:12:33 +0200 Subject: [PATCH] client: Make overlays aware of mouse focus This is helpful for plugins that wish to show overlays that perform actions when they have mouse focus, such as offering left click actions. While it's possible to track this within the overlay itself it is difficult to do correctly when considering overlapping overlays and overlays being removed while they have focus. --- .../runelite/client/ui/overlay/Overlay.java | 8 ++++++ .../client/ui/overlay/OverlayRenderer.java | 26 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java index 41944b5cd7..f946e62741 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java @@ -97,6 +97,14 @@ public abstract class Overlay implements LayoutableRenderableEntity { } + public void onMouseEnter() + { + } + + public void onMouseExit() + { + } + /** * Called when an overlay is dragged onto this, if dragTargetable is true. * Return true to consume the mouse event and prevent the other diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index b6adfa6813..4c3c7ee18b 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -107,6 +107,10 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener private boolean isResizeable; private OverlayBounds emptySnapCorners, snapCorners; + // focused overlay + private Overlay focusedOverlay; + private Overlay prevFocusedOverlay; + @Inject private OverlayRenderer( final Client client, @@ -174,6 +178,14 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener { menuEntries = null; + if (focusedOverlay == null && prevFocusedOverlay != null) + { + prevFocusedOverlay.onMouseExit(); + } + + prevFocusedOverlay = focusedOverlay; + focusedOverlay = null; + if (client.getGameState() == GameState.LOGGED_IN) { @@ -352,6 +364,20 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener menuEntries = createRightClickMenuEntries(overlay); } + if (focusedOverlay == null) + { + focusedOverlay = overlay; + if (focusedOverlay != prevFocusedOverlay) + { + if (prevFocusedOverlay != null) + { + prevFocusedOverlay.onMouseExit(); + } + + overlay.onMouseEnter(); + } + } + overlay.onMouseOver(); } }