From c11585e79c13b24c7f522bb780e99ca179b0632a Mon Sep 17 00:00:00 2001 From: Jose Falanga Date: Fri, 7 Aug 2026 22:24:09 -0300 Subject: [PATCH] Add publish metadata: MIT license, README, icon, store tags, working make dist --- .gitignore | 1 + LICENSE | 21 +++++++++++++ Makefile | 11 ++++--- README.md | 62 ++++++++++++++++++++++++++++++++++++++ assets/session-switch.svg | 9 ++++++ docs/icon.png | Bin 0 -> 8313 bytes plugin.json | 15 +++++++-- 7 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/session-switch.svg create mode 100644 docs/icon.png diff --git a/.gitignore b/.gitignore index d0d0cbc..ac2e6cf 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ dist *.uid *.remap +*.import diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a0b7657 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Jose Falanga + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile index 52acd14..3004760 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,9 @@ PLUGIN_ID ?= $(shell grep 'plugin\.id' plugin.json | grep -o ':.*' | grep -o '"[^"]\+"' | sed 's/"//g') PLUGIN_NAME ?= $(shell grep 'plugin\.name' plugin.json | grep -o ':.*' | grep -o '"[^"]\+"' | sed 's/"//g') -GODOT ?= /usr/bin/godot +GODOT ?= $(shell command -v godot 2>/dev/null || echo godot) OPENGAMEPAD_UI_REPO ?= https://github.com/ShadowBlip/OpenGamepadUI.git +OPENGAMEPAD_UI_TAG ?= v0.40.4 OPENGAMEPAD_UI_BASE ?= ../OpenGamepadUI EXPORT_PRESETS ?= $(OPENGAMEPAD_UI_BASE)/export_presets.cfg PLUGINS_DIR := $(OPENGAMEPAD_UI_BASE)/plugins @@ -33,8 +34,8 @@ dist: build ## Build and package plugin .PHONY: build build: $(PLUGINS_DIR)/$(PLUGIN_ID) export_preset ## Build the plugin - @echo "Exporting plugin package" - cd $(OPENGAMEPAD_UI_BASE) && $(MAKE) addons + @echo "Importing project assets (expect non-fatal GDExtension errors without a built core addon)" + cd $(OPENGAMEPAD_UI_BASE) && $(GODOT) --headless --import > /dev/null 2>&1 || true mkdir -p dist touch dist/.gdignore $(GODOT) --headless \ @@ -51,7 +52,7 @@ install: dist ## Installs the plugin @echo "Installed plugin to $(INSTALL_DIR)" $(OPENGAMEPAD_UI_BASE): - git clone $(OPENGAMEPAD_UI_REPO) $@ + git clone --branch $(OPENGAMEPAD_UI_TAG) --depth 1 $(OPENGAMEPAD_UI_REPO) $@ $(PLUGINS_DIR)/$(PLUGIN_ID): $(OPENGAMEPAD_UI_BASE) if ! [ -L $(PLUGINS_DIR)/$(PLUGIN_ID) ]; then ln -s $(PWD) $(PLUGINS_DIR)/$(PLUGIN_ID); fi @@ -60,7 +61,7 @@ $(PLUGINS_DIR)/$(PLUGIN_ID): $(OPENGAMEPAD_UI_BASE) export_preset: $(OPENGAMEPAD_UI_BASE) ## Configure plugin export preset $(eval LAST_PRESET=$(shell grep -oEi '^\[preset\.([0-9]+)]' $(EXPORT_PRESETS) | tail -n 1)) $(eval LAST_PRESET_NUM=$(shell echo "$(LAST_PRESET)" | grep -oE '([0-9]+)')) - $(eval PRESET_NUM=$(shell echo "$(LAST_PRESET_NUM)+1" | bc)) + $(eval PRESET_NUM=$(shell expr $(LAST_PRESET_NUM) + 1)) @if grep 'name="$(PLUGIN_NAME)"' $(EXPORT_PRESETS) > /dev/null; then \ echo "Export preset already configured"; \ else \ diff --git a/README.md b/README.md new file mode 100644 index 0000000..a5bcef4 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Session Switch + +An OpenGamepadUI plugin that adds a **Switch to Steam** button to the power +menu so OpenGamepadUI can return to Steam game mode. + +OpenGamepadUI's built-in ChimeraOS platform support adds a "Switch to Desktop" +button but has no way to get back to Steam game mode once you leave it. This +plugin adds the missing round-trip button. + +## Features + +- Adds a **Switch to Steam** button to the power menu, right above the exit + button. +- Returns to the session that was active before OpenGamepadUI took over, so + your autologin configuration is left untouched. +- Restarts InputPlumber before switching so the gamepad is not left in an + exclusive (blocked) state for Steam. +- No configuration required. + +## Requirements + +- ChimeraOS or SteamOS with OpenGamepadUI running as an exclusive session. +- Godot 4.4.x on the build machine (the plugin bytecode must match the Godot + version embedded in the OpenGamepadUI release you are targeting). + +## Installation + +Download the plugin zip and place it in the plugins directory +(`~/.local/share/opengamepadui/plugins`), or build it yourself: + +```sh +make dist +``` + +Then restart OpenGamepadUI. The **Switch to Steam** button appears in the +power menu. + +## How it works + +- The plugin only activates when the OS session switcher + (`/usr/lib/os-session-select`) is present. On other systems the button is + never added. +- Pressing **Switch to Steam** runs + `os-session-select `, where `` is the value + ChimeraOS recorded in `~/.config/chimeraos-session-return` before + OpenGamepadUI took over (falling back to `gamescope-session-steam-plus`). +- Before switching, it runs `sudo -n systemctl restart inputplumber`. + ChimeraOS's default sudoers grants passwordless access to exactly this + command, so the switch stays non-interactive. If passwordless sudo for + `systemctl restart inputplumber` is not configured on your system, the + restart is skipped with a warning and the switch still proceeds. + +## Compatibility + +Tested with OpenGamepadUI v0.40.4 on ChimeraOS. The plugin pins to the +OpenGamepadUI tag it is built against (`OPENGAMEPAD_UI_TAG` in the Makefile) +so the compiled plugin bytecode always matches the running OpenGamepadUI +version. + +## License + +MIT diff --git a/assets/session-switch.svg b/assets/session-switch.svg new file mode 100644 index 0000000..9a536d4 --- /dev/null +++ b/assets/session-switch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/icon.png b/docs/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..493bc4a09750724f14c6b95772e01206cddc28fb GIT binary patch literal 8313 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