Skip to content

Add Your Menu to Risa

Risa's All In One Menu 5.4+ includes an optional C API that lets another SKSE plugin add its own launcher button. The integration stays inside your plugin; users do not need a separate compatibility patch.

Native hotkey control is required

Your plugin must let Risa disable and restore its native menu hotkey at runtime. Risa rejects registrations without SetHotkeyEnabled so the same physical key cannot be handled by both mods.

Required callbacks

Open

OpenMenu requests that your menu open and returns whether the request was accepted.

Close

CloseMenu closes your menu. It must be safe to call when the menu is already closed.

State

IsMenuOpen reports whether your menu is currently open.

Hotkey

SetHotkeyEnabled enables or disables only your native opening hotkey.

SetHotkeyEnabled(false) means Risa is managing the menu. SetHotkeyEnabled(true) means the player excluded your menu or Risa stopped managing it. Keep this change runtime-only; do not overwrite the player's INI or save file.

Register your menu

Download the source package from Risa's All In One Menu on Nexus Mods and copy RisaMenuIntegrationAPI.h into your project. During SKSE kPostLoad, use GetModuleHandleW and GetProcAddress to request the interface. Do not call LoadLibrary. Only register when RisaAllInOneMenu.dll and the requested API version are already available.

#include "RisaMenuIntegrationAPI.h"

bool Open(void*) {
    return MyMenu::Open();
}

void Close(void*) {
    MyMenu::Close();
}

bool IsOpen(void*) {
    return MyMenu::IsOpen();
}

void SetNativeHotkey(void*, bool enabled) {
    MyInput::SetMenuHotkeyEnabled(enabled);
}

void RegisterWithRisa() {
    const HMODULE module = GetModuleHandleW(L"RisaAllInOneMenu.dll");
    if (!module) return;

    const auto getApi = reinterpret_cast<
        RisaMenuIntegrationAPI::GetInterfaceFn>(
            GetProcAddress(module,
                "RisaAllInOneMenu_GetIntegrationAPI"));
    if (!getApi) return;

    const auto* api = getApi(RisaMenuIntegrationAPI::kInterfaceVersion);
    if (!api) return;

    RisaMenuIntegrationAPI::MenuRegistrationV1 menu;
    menu.menuId = "YourName.YourMod";
    menu.displayName = "Your Menu";
    menu.iconCodepoint = 0xf0c9;
    menu.nativeHotkeyLabel = "F8";
    menu.OpenMenu = Open;
    menu.CloseMenu = Close;
    menu.IsMenuOpen = IsOpen;
    menu.SetHotkeyEnabled = SetNativeHotkey;

    const auto result = api->RegisterMenu(&menu);
    if (result != RisaMenuIntegrationAPI::Registration_Success) {
        // Log the result so integration problems are easy to diagnose.
    }
}

Register once. Risa copies all supplied text. Your callback code and optional context pointer must remain valid until the game exits or you call UnregisterMenu(menuId).

Registration fields

Field What to provide
menuId A permanent hidden identifier, such as YourName.YourMod.
displayName The UTF-8 name players see in the launcher and settings.
iconCodepoint A Font Awesome 6 Free Solid codepoint. Use 0 for Risa's default icon.
nativeHotkeyLabel A short display label for your configured native key, such as F8 or Shift + O.
context Optional state passed back to every callback.

All 1,375 Font Awesome Solid glyphs bundled with RisaUI are below. Click an icon to copy its code, or search by icon name, keyword, or hexadecimal code. Set menu.iconCodepoint to 0 to use Risa's default play icon.

Browse all 1,375 Font Awesome Solid icons

Keep the same ID

The ID is a hidden name Risa uses to recognize your menu between game sessions. Players never see it.

Choose one unique ID and keep using that exact value in every update. Changing it makes Risa treat the menu as a new integration, so the player's saved position, visibility, exclusion, and Risa hotkey will no longer be connected to it. Use only letters, numbers, ., _, and -.

Report the native key

Set nativeHotkeyLabel to the native key your plugin currently has configured. This text is informational; Risa does not simulate or parse it. If your plugin changes that key during the same game session, unregister and register again with the same menuId and the updated label.

Compatibility

If Risa or the requested API version is unavailable, skip registration and leave your plugin's normal hotkey enabled. Your menu should continue working normally without Risa installed.