Skip to content

Integrate Custom UI Shift+Tab Overlay#539

Open
Yasinnet0 wants to merge 7 commits into
Detanup01:devfrom
Yasinnet0:Custom-UI
Open

Integrate Custom UI Shift+Tab Overlay#539
Yasinnet0 wants to merge 7 commits into
Detanup01:devfrom
Yasinnet0:Custom-UI

Conversation

@Yasinnet0

@Yasinnet0 Yasinnet0 commented Jun 8, 2026

Copy link
Copy Markdown

Updated the Shift+Tab overlay code. This overhaul replaces the UI with a modern, themed interface featuring custom animations and persistent state saving.

Key Improvements

  • Visuals: Red-accented dark theme with window animations, FontAwesome 6 icons, and customizable procedural background effects.
  • Config Saving: Added GBE configuration support (SaveGBEConfig / LoadGBEConfig) to save window positions and UI preferences to gbe.cfg.

Technical Changes

  • Rewrote the overlay frontend and statistics rendering in steam_overlay.cpp and steam_overlay_stats.cpp.
  • Added FontAwesome 6 and single-header JSON support to the project.
  • Updated build dependencies and flags in premake5.lua.
  • Tasks :
  • Fix Build Errors

@universal963

Copy link
Copy Markdown
Collaborator

Isn't there already a single-header json lib here?

@ndiruhniu

ndiruhniu commented Jun 9, 2026

Copy link
Copy Markdown

and why did you return breaking/deprecated strings?

I tried the overlay after several fixes and it:

  1. Looks unusual and somewhat too "gamer-y" (Discord-like), also buggy (in some places the labels shift off and become unreadable, etc.).
  2. Breaks/rolls back Split achievement list into unlocked/locked sections #525 Notification history #524 Achievement Notification Queue with Configurable Delay #522.
  3. Spawns imgui_overlay_layout.ini next to steam_api64.dll. Why?
  4. Linux experimental build is broken.

@Yasinnet0

Copy link
Copy Markdown
Author

and why did you return breaking/deprecated strings?

I tried the overlay after several fixes and it:

  1. Looks unusual and somewhat too "gamer-y" (Discord-like), also buggy (in some places the labels shift off and become unreadable, etc.).
  2. Breaks/rolls back Split achievement list into unlocked/locked sections #525 Notification history #524 Achievement Notification Queue with Configurable Delay #522.
  3. Spawns imgui_overlay_layout.ini next to steam_api64.dll. Why?
  4. Linux experimental build is broken.

thanks for the awsome review and comment it helped me alot i'm currently working on fixing each of them but just i have a question :
what exactly you mean by discord like?
and the rollback was my fault because this code is like from like 2-3 month ago and since i didn't had internet at that time (i didn't had internet for around 3 month) i wasn't able to get latest updates and that was the reason
the imgui overlay layout gets created to save some UI positions and stuff in it but i think its unnecessary soo i will remove it or maybe do a global config where the other gse settings get saved

@Yasinnet0

Copy link
Copy Markdown
Author

Isn't there already a single-header json lib here?

thanks for letting me know about that sorry i wasn't aware of it fixed that issue and will be fixed in the next commit

@ndiruhniu

Copy link
Copy Markdown

what exactly you mean by discord like?

I meant bloat. Right now it looks "modern", but crooked. I think it's better to get rid of unnecessary, useless features - for example, "Background FX". I'd also like to understand whether features like Broadcasts and changing the avatar are necessary in the interface.

For some reason, when I click the chat button the profile opens. Not everything fits in the window, text shifts:
test

When switching window focus, the previous window becomes inaccessible:
test1

Do you think there's enough space here? Maybe it should be stretched out:
test2

I recommend first rewriting the code based on the latest commits, perfecting the core functionality, and then adding other features as needed. Background FX definitely needs to go - it's real bloat.

@Yasinnet0

Yasinnet0 commented Jun 9, 2026

Copy link
Copy Markdown
Author

what exactly you mean by discord like?

I meant bloat. Right now it looks "modern", but crooked. I think it's better to get rid of unnecessary, useless features - for example, "Background FX". I'd also like to understand whether features like Broadcasts and changing the avatar are necessary in the interface.

For some reason, when I click the chat button the profile opens. Not everything fits in the window, text shifts: test

When switching window focus, the previous window becomes inaccessible: test1

Do you think there's enough space here? Maybe it should be stretched out: test2

I recommend first rewriting the code based on the latest commits, perfecting the core functionality, and then adding other features as needed. Background FX definitely needs to go - it's real bloat.

idk i think background FX is kinda good tbh and for the broadcast that you asked actually its kinda good since if you want to play on lan platforms like virtual lan platforms its a quick way to add virtual ip's on broadcast through overlay and not doing it manually outside of the overlay and kinda same reason for the avatar

@ndiruhniu

Copy link
Copy Markdown

idk i think background FX is kinda good

bloat.

if you want to play on lan platforms like virtual lan platforms its a quick way to add virtual ip's on broadcast through overlay

In my experience, you don’t even need to configure anything.

same reason for the avatar

then I’d like to understand how it searches for drives. For example, I have a Z: drive, but it’s not listed there. And, if I remember correctly, to enable avatars, you need to add enable_account_avatar=1 under [main::general] in configs.main.ini.

There are a lot of debatable points - we should wait to see what others say. I just preferred the old minimalist interface.

@Yasinnet0

Copy link
Copy Markdown
Author

idk i think background FX is kinda good

bloat.

if you want to play on lan platforms like virtual lan platforms its a quick way to add virtual ip's on broadcast through overlay

In my experience, you don’t even need to configure anything.

same reason for the avatar

then I’d like to understand how it searches for drives. For example, I have a Z: drive, but it’s not listed there. And, if I remember correctly, to enable avatars, you need to add enable_account_avatar=1 under [main::general] in configs.main.ini.

There are a lot of debatable points - we should wait to see what others say. I just preferred the old minimalist interface.

i'm constantly working on this to improve it and for the broadcast ip its actually alot useful since i have seen alot of people use it because when someone use a virtual lan software they get a virtual lan ip that they have to add to broadcast ip and thats why i have added that

@Yasinnet0

Yasinnet0 commented Jun 10, 2026

Copy link
Copy Markdown
Author

Fixes and updates on latest Commit :
Fixed the achievement rollback/break #525 and #524
removed imgui_overlay_layout.ini
Fixed all reported UI bugs/glitches
undo all changes on premake5.lua

    Implements locked/unlocked sections for achievements, adds a notification history panel to the steam overlay, and
  resolves build configuration issues.

    Detailed Changes:
      overlay: Added collapsible headers separating unlocked and locked achievements in the overlay UI.
      history: Implemented a Notification History window allowing users to browse formatted, cached timestamps and
  type-labeled history, with support for clearing notifications.
      robustness: Modified achievement notification logic to verify overlay readiness, preventing potential crashes
  during notification queuing.
      build: Corrected premake5.lua build properties for zlib and abseil random internal dependencies.
      cleanup: Deleted local redundant json.hpp header in favor of standard json/json.hpp.
@Yasinnet0 Yasinnet0 marked this pull request as draft June 10, 2026 06:34
@Yasinnet0

Yasinnet0 commented Jun 10, 2026

Copy link
Copy Markdown
Author

change to Draft until all issues are fixed

  • Fix the build Issues

Comment thread overlay_experimental/steam_overlay.cpp Outdated
Comment on lines +298 to +310
static std::filesystem::path GetGoldbergSettingsPath()
{
const char* appdata = std::getenv("APPDATA");
if (appdata && *appdata) {
return std::filesystem::path(appdata) / "GSE Saves" / "settings";
}

const char* home = std::getenv("HOME");
if (home && *home) {
return std::filesystem::path(home) / ".config" / "GSE Saves" / "settings";
}

return std::filesystem::path("GSE Saves") / "settings";

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like you assume every user uses appdata path, forgetting the fact settings can also be set to be saved locally. And, I think it is not recommended to use this method to retrieve appdata path in Windows. And also, on Windows, std::getenv() or similar c lib functions are default to use ANSI codepages instead of UTF-8, resulting encoding issues. My suggestion is to use non std variant like _wgetenv() and convert the result to UTF-8 manually. Finally, std::filesystem suffers from the encoding issue on Windows too, even though it is a modern function. You may better pass the wide string as-is instead of UTF-8/narrow string.

Comment thread overlay_experimental/steam_overlay.cpp Outdated
Comment on lines +339 to +347
static std::wstring Utf8ToWide(const std::string& s)
{
if (s.empty()) return {};
int needed = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, nullptr, 0);
if (needed <= 0) return {};
std::wstring out((size_t)needed - 1, L'\0');
MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, &out[0], needed);
return out;
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Such utility functions already exists here.

Comment thread overlay_experimental/steam_overlay.cpp Outdated
Comment on lines +526 to +533
#ifdef _WIN32
const char* userprofile = std::getenv("USERPROFILE");
if (userprofile && *userprofile) {
g_avatar_picker_current_dir = std::filesystem::path(userprofile) / "Pictures";
}
else {
g_avatar_picker_current_dir = std::filesystem::path("C:\\");
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same encoding issue. And I wonder if it is better to make the path configurable.

Comment thread overlay_experimental/steam_overlay.cpp Outdated

#ifdef _WIN32
{
const char* drive_items[] = { "C:\\", "D:\\", "E:\\", "F:\\", "G:\\" };

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused about these drives. What if someone has a lot of drives? What if even more drives than A:\ to Z:\?

Comment thread overlay_experimental/steam_overlay.cpp Outdated
ImGui::TextWrapped("%s", g_avatar_picker_selected_file.u8string().c_str());
}
else {
ImGui::TextColored(RedAccentTheme::TextDim, "Select a .png, .jpg, or .jpeg image.");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not an urgent problem, but it would be better to make all strings capable of being translated.

Comment on lines +769 to +782
static std::filesystem::path GetBroadcastsPath()
{
const char* appdata = std::getenv("APPDATA");
if (appdata && *appdata) {
return std::filesystem::path(appdata) / "GSE Saves" / "settings" / "custom_broadcasts.txt";
}

const char* home = std::getenv("HOME");
if (home && *home) {
return std::filesystem::path(home) / ".config" / "GSE Saves" / "settings" / "custom_broadcasts.txt";
}

return std::filesystem::path("GSE Saves") / "settings" / "custom_broadcasts.txt";
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same with the first comment.

Comment thread overlay_experimental/steam_overlay.cpp Outdated
@@ -383,8 +2232,7 @@ void Steam_Overlay::create_fonts()
font_ach_desc = add_overlay_font(font_size_ach_desc, settings->overlay_appearance.font_override_ach_desc);
stats.font = font_fps;

bool res = fonts_atlas.IsBuilt();
PRINT_DEBUG("isbuilt fonts atlas (result=%i)", (int)res);
bool res = fonts_atlas.Build();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apparently you still didn't refactor based on the latest commits, because this change breaks compilation.

Comment thread overlay_experimental/steam_overlay.cpp Outdated
return false;
}

g_profile_avatar_rsrc->SetAutoLoad(InGameOverlay::ResourceAutoLoad_t::OnUse);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That too.

font_cfg.GlyphExtraAdvanceX = settings->overlay_appearance.font_glyph_extra_spacing_x;
// font_cfg.GlyphExtraSpacing.x = settings->overlay_appearance.font_glyph_extra_spacing_x;
// font_cfg.GlyphExtraSpacing.y = settings->overlay_appearance.font_glyph_extra_spacing_y;
font_cfg.GlyphExtraSpacing.x = settings->overlay_appearance.font_glyph_extra_spacing_x;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this.

Comment thread overlay_experimental/steam_overlay.cpp Outdated
icon_handle = get_steam_client()->steam_user_stats->get_achievement_icon_handle(ach.name, achieved);
}
auto image_info = settings->get_image(icon_handle);
if (image_info) {
int icon_size = static_cast<int>(settings->overlay_appearance.icon_size);
//icon_rsrc->SetAutoLoad(InGameOverlay::ResourceAutoLoad_t::OnUse);
icon_rsrc->SetAutoLoad(InGameOverlay::ResourceAutoLoad_t::OnUse);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this.

Add overlay_avatar_picker_default_path to Settings and parse avatar_picker_default_path from overlay::general in the INI for both client and server. Expose selected/current language via Steam_Overlay (added selected_language member and GetSettings/GetCurrentLanguage accessors; stub GetCurrentLanguage updated). Increase translation buffer size and refresh many overlay translation strings (including Indonesian and other language fixes/punctuation) in steam_overlay_translations.h.
and resolved all the issued comments
Resolve merge conflicts, merge translations from upstream/dev, and fix achievement icon dimension and username safety issues in steam_overlay.cpp.
@Yasinnet0 Yasinnet0 marked this pull request as ready for review June 13, 2026 08:43
@Yasinnet0

Copy link
Copy Markdown
Author

my only consern right now is undef BLOCK_SIZE its the easiest way to do it but idk if its the best way
any suggestion?

@ndiruhniu

Copy link
Copy Markdown

You forgot to add the necessary lines to configs.overlay.EXAMPLE.ini. Also remove Background FX and its related functionality (no negativity intended - it just turns the emulator into a circus).

@ndiruhniu

Copy link
Copy Markdown

Some interface bugs:

Scrollbars. It would be better if they simply expanded downward:
test

Again, scrollbars. It would be better if they simply expanded downward:
test1

The bug with shifting text is still here:
test2

And a strange bug with the borders of all windows:
test3

@dasafe

dasafe commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

This is too much. gbe_fork is a Steam emulator; the overlay is just a utility that you tab into for 5 seconds. We don't need embedded icon fonts, background effects, or animations.

The overlay should be Lightweight, Unobtrusive, Functional-first and Consistent.

The "Config Saving" feature is good, you should make it's own PR.

@Yasinnet0

Copy link
Copy Markdown
Author

This is too much. gbe_fork is a Steam emulator; the overlay is just a utility that you tab into for 5 seconds. We don't need embedded icon fonts, background effects, or animations.

The overlay should be Lightweight, Unobtrusive, Functional-first and Consistent.

The "Config Saving" feature is good, you should make it's own PR.

i know but imgui is still lightweight no matter what you do and i first asked in an issue if this is good and user agrees on it and even Detanup01 said its good soo thats why i made this PR

the issue is here if you want to take a look Custom Shift + Tab UI Overhaul

@Yasinnet0

Copy link
Copy Markdown
Author

Some interface bugs:

Scrollbars. It would be better if they simply expanded downward: test

Again, scrollbars. It would be better if they simply expanded downward: test1

The bug with shifting text is still here: test2

And a strange bug with the borders of all windows: test3

thanks for suggestion i will remove the background FX since it got soo much negative feedback and i fixed the shifting text bug before idk why its still here but will take a look at it thanks

- Removed backgroundFX completely

- Added text wrapping margin to fix clipped UI text

- Fixed double-line corner border glitch on popups

- Made hidden achievement descriptions a toggle button

- Added smooth mouse-wheel scrolling to broadcast IP list

- Prevented tiny scrollbars on notifications and achievement lists
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants