diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 9da45dad9a..4812590b5d 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -119,6 +119,17 @@ public interface RuneLiteConfig extends Config return WarningOnExit.LOGGED_IN; } + @ConfigItem( + keyName = "usernameInTitle", + name = "Display username in title", + description = "Toggles displaying of username in client title", + position = 18 + ) + default boolean usernameInTitle() + { + return true; + } + @ConfigItem( keyName = "notificationTray", name = "Enable tray notifications", diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 755f71a245..48ed636d98 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -24,6 +24,7 @@ */ package net.runelite.client.ui; +import com.google.common.base.Strings; import com.google.common.eventbus.Subscribe; import java.applet.Applet; import java.awt.Canvas; @@ -42,6 +43,7 @@ import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import javax.annotation.Nullable; import javax.inject.Inject; +import javax.inject.Provider; import javax.inject.Singleton; import javax.swing.BoxLayout; import javax.swing.ImageIcon; @@ -58,10 +60,13 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.GameState; +import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.client.RuneLite; import net.runelite.client.RuneLiteProperties; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ExpandResizeType; import net.runelite.client.config.Keybind; @@ -111,6 +116,7 @@ public class ClientUI private final KeyManager keyManager; private final Applet client; private final ConfigManager configManager; + private final Provider clientThreadProvider; private final CardLayout cardLayout = new CardLayout(); private ContainableFrame frame; private JPanel navContainer; @@ -131,13 +137,15 @@ public class ClientUI RuneLiteConfig config, KeyManager keyManager, @Nullable Applet client, - ConfigManager configManager) + ConfigManager configManager, + Provider clientThreadProvider) { this.properties = properties; this.config = config; this.keyManager = keyManager; this.client = client; this.configManager = configManager; + this.clientThreadProvider = clientThreadProvider; } @Subscribe @@ -235,6 +243,44 @@ public class ClientUI }); } + @Subscribe + public void onGameStateChanged(final GameStateChanged event) + { + if (event.getGameState() != GameState.LOGGED_IN || !(client instanceof Client) || !config.usernameInTitle()) + { + return; + } + + final Client client = (Client)this.client; + final ClientThread clientThread = clientThreadProvider.get(); + + // Keep scheduling event until we get our name + clientThread.invokeLater(() -> + { + if (client.getGameState() != GameState.LOGGED_IN) + { + return true; + } + + final Player player = client.getLocalPlayer(); + + if (player == null) + { + return false; + } + + final String name = player.getName(); + + if (Strings.isNullOrEmpty(name)) + { + return false; + } + + frame.setTitle(properties.getTitle() + " - " + name); + return true; + }); + } + /** * Initialize UI. * @@ -680,6 +726,20 @@ public class ClientUI return; } + if (config.usernameInTitle() && (client instanceof Client)) + { + final Player player = ((Client)client).getLocalPlayer(); + + if (player != null && player.getName() != null) + { + frame.setTitle(properties.getTitle() + " - " + player.getName()); + } + } + else + { + frame.setTitle(properties.getTitle()); + } + if (frame.isAlwaysOnTopSupported()) { frame.setAlwaysOnTop(config.gameAlwaysOnTop());