Thanks to visit codestin.com
Credit goes to github.com

Skip to content

abdorayden/raymp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽต RMP - Ray Media Platform

RMP Logo

A High-Performance Lua Framework for Terminal Applications

๐Ÿš€ Quick Start โ€ข ๐ŸŽฌ Demos โ€ข ๐Ÿ“– Examples โ€ข ๐Ÿ“š API Docs โ€ข ๐Ÿค Contribute

๐ŸŽต Music Player | ๐ŸŽจ Custom Themes | ๐Ÿ”Œ Plugin System | ๐ŸŽฎ 2D Games | ๐Ÿ“ฑ TUI Applications

GitHub Platform Language


โœจ What is RMP?

RMP (Ray Music Player) is a high-performance, extensible framework built in C with Lua scripting for creating sophisticated terminal user interfaces. Originally conceived as a music player, RMP has evolved into a comprehensive platform for terminal-based applications, featuring:

  • ๐ŸŽต Advanced Music Player - Multi-format audio support with real-time visualization
  • ๐Ÿ“ฑ Rich TUI Framework - Create complex terminal interfaces with ease
  • ๐ŸŽฎ Game Development Platform - Build 2D games directly in the terminal
  • ๐Ÿ”ง Extensible Plugin System - Modular architecture for unlimited customization
  • ๐ŸŽจ Dynamic Theming Engine - Hot-swappable themes with Lua scripting
  • โšก High Performance - Native C engine with Lua binding for optimal speed

Key Statistics:

  • ๐Ÿ”ข 140K+ lines of code across C, Lua, and documentation
  • ๐Ÿ—๏ธ Modular Architecture with separate engine and scripting layers
  • ๐ŸŒ Cross-Platform support for Linux, macOS, and Windows
  • ๐Ÿ“ฆ Self-Contained - Ships with embedded Lua 5.4.4 engine

๐Ÿš€ Key Features

๐ŸŽจ Advanced Theme System

  • Hot-swappable themes - Change entire UI appearance without restart
  • Lua-powered templates - Full programmatic control over interface design
  • Dynamic content - Real-time updates and interactive elements
  • Cross-platform rendering - Consistent appearance across all platforms
  • Unicode support - Rich visual elements with box drawing characters

๐Ÿ”Œ Robust Plugin Architecture

  • Event-driven system - React to user input, system events, and custom triggers
  • Isolated plugin contexts - Plugins run in separate environments for stability
  • Inter-plugin communication - Share data and events between plugins
  • Background services - Run plugins independently of UI
  • Hot-reload support - Update plugins without restarting application

๐ŸŽต Professional Music Player

  • Multi-format support - MP3, WAV, FLAC, and more audio formats
  • Intelligent file browser - Navigate music libraries with search and filtering
  • Advanced playback - Queue management, shuffle, repeat, crossfade
  • Real-time controls - Volume, seeking, speed, and equalizer controls
  • Audio visualization - Waveform and spectrum analysis displays

๐ŸŽฎ Game Development Platform

  • Virtual terminal engine - Advanced text-based graphics rendering
  • Input management - Comprehensive keyboard and mouse handling
  • Animation framework - Smooth animations with customizable frame rates
  • Collision detection - Built-in physics utilities for game development
  • State management - Efficient game state and scene management

โšก High-Performance Engine

  • Native C core - Optimized performance for complex terminal applications
  • Lua integration - Seamless C-Lua binding with minimal overhead
  • Memory efficient - Smart resource management and garbage collection
  • Asynchronous operations - Non-blocking I/O for responsive interfaces

๐ŸŽฌ Demo

3D Cube Renderer

Experience real-time 3D graphics rendered entirely in terminal characters.

Digital Clock Widget

Animated digital clock with customizable themes and timezone support.

๐Ÿ—๏ธ Architecture Overview

RMP follows a layered architecture designed for performance and extensibility:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           Lua Application Layer         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Themes โ”‚ Plugins โ”‚ Templates โ”‚ Config  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚          RMP Framework (Lua)            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚           C Engine Core                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Terminal โ”‚ Audio โ”‚ Input โ”‚ VirtualTerm โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Components:

  • C Engine Core - High-performance native operations
  • RMP Framework - Lua-based application framework
  • Plugin System - Modular functionality extensions
  • Theme Engine - Dynamic UI and layout management

๐Ÿ“ฆ Installation

Prerequisites

Required Dependencies:

# Debian/Ubuntu
sudo apt-get install gcc build-essential

# macOS (with Homebrew)
brew install gcc

# Windows (MSYS2/MinGW)
choco install gcc
# Install MinGW-w64 using chocolaty package manager

Note: RMP ships with an embedded Lua 5.4.4 engine - no external Lua installation required!

Build from Source

Unix like build

git clone https://github.com/abdorayden/raymp.git
cd raymp/install
./install.sh compile -v && sudo ./install.sh install -v
cd ..
./rmp

Windows Build

git clone https://github.com/abdorayden/raymp.git
cd raymp\install
install.bat compile
install.bat install
cd ..
rmp.exe

Verifying Installation

Test your installation with the built-in demos:

# Start the music player (default)
./rmp

# Check version and help
./rmp --version
./rmp --help

โšก Quick Start

1. Launch Default rmp templates

./rmp

Navigate with arrow keys, press Space to play/pause, Q to quit.

2. Create Your First TUI App with rmp framework only

-- hello_world.lua
-- NOTE: rmp framework installed by rmp engine
local api = require("rmp.rmp")

local frame = api.Frame.new()
frame:setFps(60)

local window = api.Window.new(1):createWindow(
    "Hello RMP!", 40, 10, 5, 5, nil, nil, nil,
    function(x, y, w, h)
        return api.Text.new("Welcome to RMP Framework!", 
                           x+2, y+2, api.FGColors.Brights.Green)
    end
)

while true do
    frame:add(window)
    local key = api.Terminal:handleKey()
    if key == api.KEY_Q then break end
    frame:run(key)
end

3. Load a Custom Theme

cat ~/.rmp/init.lua # config file
# this is the place where u configure your rmp audio player
# the (themes/templates) are located in ~/.rmp/themes/ folder
# you can download or create you own template and add it to this path 
# and load it in init.lua config file

4. Load a plugins

cat ~/.rmp/init.lua # config file
# this is the place where u configure your rmp audio player
# the (plugins) are located in ~/.rmp/plugins/ folder
# you can download or create you own plugin and add it to this path 
# and load it in init.lua config file

๐ŸŽฏ Usage Examples

๐ŸŽต Music Player (Default Mode)

The default configuration provides a full-featured music player:

-- Default mode - just run ./rmp
-- Features included:
-- โ€ข File browser with music library scanning
-- โ€ข Playback controls (play, pause, seek, volume)
-- โ€ข Playlist management
-- โ€ข Audio format detection
-- โ€ข Keyboard shortcuts for all functions

๐Ÿ“ฑ Custom TUI Application

-- multi_window_app.lua
local api = require("rmp.rmp")

-- Create application frame
local frame = api.Frame.new()
frame:setFps(60)

-- Main window with dynamic content
local mainWindow = api.Window.new(1):createWindow(
    "Multi-Window Demo", "w-4", "h-8", 2, 2, 
    api.BoxDrawing.LightBorder, api.BGColors.NoBrights.Black, nil,
    function(x, y, w, h)
        local vterm = api.VirtualTerminal.new()
        vterm:writeText(x+1, y+1, "Main Content Area", api.FGColors.Brights.White)
        vterm:writeText(x+1, y+3, "Press TAB to switch panels", api.FGColors.NoBrights.Yellow)
        return vterm
    end
)

-- Status bar
local statusWindow = api.Window.new(2):createWindow(
    nil, "w-2", 3, 1, "h-3",
    api.BoxDrawing.NoBorder, api.BGColors.NoBrights.Blue, nil,
    function(x, y, w, h)
        local vterm = api.VirtualTerminal.new()
        vterm:writeText(x+1, y+1, "Status: Ready", api.FGColors.Brights.White)
        return vterm
    end
)


-- Event loop
while true do
    frame:add(mainWindow)
    frame:add(statusWindow)
    local key = api.Terminal:handleKey()
    if key == api.KEY_Q then break end
    frame:run(key)
end

๐ŸŽฎ 2D Game Development

-- simple_game.lua
local api = require("rmp.rmp")

local gameState = {
    playerX = 10, playerY = 5,
    enemies = {{x=20, y=8}, {x=30, y=12}},
    score = 0
}

local frame = api.Frame.new()
frame:setFps(30)  -- 30 FPS for smooth gameplay

local gameWindow = api.Window.new(1):createWindow(
    "RMP Game Engine Demo", 60, 20, 5, 2,
    api.BoxDrawing.DoubleBorder, api.BGColors.NoBrights.Black, nil,
    function(x, y, w, h)
        local vterm = api.VirtualTerminal.new()
        
        -- Draw player
        vterm:writeText(x + gameState.playerX, y + gameState.playerY, 
                       "@", api.FGColors.Brights.Green)
        
        -- Draw enemies
        for _, enemy in ipairs(gameState.enemies) do
            vterm:writeText(x + enemy.x, y + enemy.y, 
                           "X", api.FGColors.Brights.Red)
        end
        
        -- Draw HUD
        vterm:writeText(x+1, y+1, "Score: " .. gameState.score, 
                       api.FGColors.Brights.Yellow)
        
        return vterm
    end
)

-- Game input handling
gameWindow:addEventListener(api.EventType.Keyboard, function(key)
    if key == api.KEY_W then
        gameState.playerY = math.max(1, gameState.playerY - 1)
    elseif key == api.KEY_S then
        gameState.playerY = math.min(18, gameState.playerY + 1)
    elseif key == api.KEY_A then
        gameState.playerX = math.max(1, gameState.playerX - 1)
    elseif key == api.KEY_D then
        gameState.playerX = math.min(58, gameState.playerX + 1)
    end
end)


-- Game loop
while true do
    local key = api.Terminal:handleKey()
    if key == api.KEY_Q then break end
    
    frame:add(gameWindow)
    -- Update game state here (enemy movement, collision detection, etc.)
    
    frame:run(key)
end

๐ŸŽจ (Theme/Template) Development

RMP's (theme/Template) system allows complete customization of the user interface through Lua templates.

Creating a Custom (Theme/Template)

-- themes/cyberpunk_theme.lua
-- Cyberpunk-inspired theme with neon colors and futuristic elements
-- the template lua file are returned a table with tables that has a different id's and types 

local api = require("rmp.rmp")

return {
    -- main window with a children
    {
        id = 1,
        type = "Window",
        title = {
            type = "Text",
            value = "โ–‹โ–ˆโ–Š RMP CYBERPUNK โ–Šโ–ˆโ–‹",
            foregroundColor = api.FGColors.Brights.Magenta,
            backgroundColor = api.BGColors.NoBrights.Black,
            style = api.TextStyle.Bold
        },
        width = "w",
        height = "h", 
        x = 1,
        y = 1,
        border = api.BoxDrawing.DoubleBorder,
        backgroundColor = api.BGColors.NoBrights.Black,
        children = {
            -- Header with animated elements
            {
                id = 2,
                type = "Window",
                title = {
                    type = "Text",
                    value = "",
                    dynamic = function(ctx)
                        -- ctx table for the self object
                        local time = os.date("%H:%M:%S")
                        return "โšก NEURAL INTERFACE ACTIVE โšก " .. time
                    end,
                    foregroundColor = api.FGColors.Brights.Cyan,
                    backgroundColor = api.BGColors.NoBrights.Magenta,
                    style = api.TextStyle.Bold,
                },
                width = "w - 2",
                height = 4,
                x = 2,
                y = 2,
                border = api.BoxDrawing.LightBorder,
                backgroundColor = api.BGColors.NoBrights.Magenta
            },
            
            -- Main content area
            {
                id = 3,
                type = "Window", 
                title = {
                    type = "Text",
                    value = "โ—ขโ–ˆโ—ฃ MAIN MATRIX โ—คโ–ˆโ—ฅ",
                    foregroundColor = api.FGColors.Brights.Green,
                    backgroundColor = api.BGColors.NoBrights.Black,
                    style = api.TextStyle.Bold
                },
                width = "w - 4",
                height = "h - 12",
                x = 3,
                y = 7,
                border = api.BoxDrawing.HeavyBorder,
                backgroundColor = api.BGColors.NoBrights.Black
            },
            
            -- Status/info panel
            {
                id = 4,
                type = "Window",
                title = {
                    type = "Text", 
                    value = function()
                        return "โš  SYSTEM STATUS: ONLINE โš "
                    end,
                    foregroundColor = api.FGColors.Brights.Yellow,
                    backgroundColor = api.BGColors.NoBrights.Red,
                    style = api.TextStyle.Bold,
                    dynamic = true
                },
                width = "w - 2",
                height = 4,
                x = 2,
                y = "h - 5",
                border = api.BoxDrawing.NoBorder,
                backgroundColor = api.BGColors.NoBrights.Red
            }
        }
    }
}

๐Ÿ”Œ Plugin Development

RMP's plugin system enables modular functionality through isolated Lua contexts.

Creating a Basic Plugin

-- plugins/system_monitor.lua
-- Real-time system monitoring plugin
-- the plugin lua file are returned function that accept 4 params and return VirtualTerminal object

local api = require("rmp.rmp")

-- params:
--  x,y : left top corner position (x position and y position)
--  xx,yy : right bottom corner position
-- return: 
--      VirtualTerminal
local vterm = api.VirtualTerminal.new()
return function(x, y, xx, yy)
    local w = xx - x - 1
    local h = yy - y - 1

    -- Plugin state
    local updateInterval = 1.0  -- seconds
    local lastUpdate = 0
    local systemData = {}
    
    -- Update system information
    local function updateSystemInfo()
        local currentTime = os.time()
        if currentTime - lastUpdate >= updateInterval then
            -- Get system info (simplified example)
            systemData = {
                time = os.date("%Y-%m-%d %H:%M:%S"),
                memory = "Memory: 4.2GB / 8.0GB",
                cpu = "CPU: 15.3%",
                processes = "Processes: 156"
            }
            lastUpdate = currentTime
        end
    end
    
    -- Render plugin content
    local function render()
        vterm:clear()
        updateSystemInfo()
        
        -- Header
        vterm:writeText(x, y, "โ•โ•โ• SYSTEM MONITOR โ•โ•โ•", 
                       api.FGColors.Brights.Cyan)
        
        -- System information
        local line = y + 2
        for key, value in pairs(systemData) do
            vterm:writeText(x, line, value, api.FGColors.NoBrights.White)
            line = line + 1
        end
        
        -- Instructions
        vterm:writeText(x, yy - 2, "Press 'R' to refresh", 
                       api.FGColors.NoBrights.Yellow)
    end
    
    -- Event handlers
    vterm:onKeyboard(function(key)
        if key == api.KEY_R then
            lastUpdate = 0  -- Force refresh
            render()
        end
    end)
    
    -- Initial render
    render()
    
    return vterm
end

Plugin Registration and Configuration

-- In your theme or main configuration
-- ~/.rmp/init.lua
return {
    -- the default configuration of the sound
    settings = {
        fps = 60,
        volume = 0.5,           -- 0 to 1
        speed = 1.0,            -- 0.25 to 4.0
        mode = api.PlaybackMode.ONES, -- playback modes
        restart_engine = api.KEY_CTRL_R,
        exit = api.KEY_Q,

        -- inc or dec
        inc_speed = 0.1,
        inc_volume = 0.1,
        inc_seek = 5
    },
    soundMap = {
        pause_sound = api.KEY_SPACE,
        resume_sound = api.KEY_SPACE,
        next_sound = api.KEY_N,
        prev_sound = api.KEY_P,
        vol_up = api.KEY_PLUS,
        vol_down = api.KEY_MINUS,
        seek_left = api.KEY_LEFT,
        seek_right = api.KEY_RIGHT,
        speed_up = api.KEY_UP,
        speed_down = api.KEY_DOWN,
        change_playback_mode = api.KEY_TAB
    },
    template = "<your template lua file name without extension>",
    -- plugins
    plugins = {        
        {
            -- if this attr is not nil or exists , the runner ignore activate
            themeWindowId = 2, -- the window id that the plugin injected in
            isActivated = true,-- isActivated (true activated by default otherwise is not)
            activate = api.KEY_E, -- toggle key for activation plugin
            switchPluginKey = api.KEY_I, -- switch key for multiple plugins that integrated on the same window id
            names = { -- plugins
                -- examples
                "matrix_digital_rain_effect",
                "music_waves",
                "text_editor",
                "tellme_yourname",
                "digital_clock_with_effects",
                "3d_cube",
                "filebrowser"
            }

        },
        {
            themeWindowId = 3,
            isActivated = true,
            activate = api.KEY_E,
            names = {
                "center_text"
            }
        },
        {
            isActivated = false,
            activate = api.KEY_O,
            names = {
                "other plugins"
            }
        }
    }
}

๐ŸŽฎ Game Development Guide

RMP provides a complete framework for developing 2D games in the terminal.

Game Engine Features

  • Frame-based rendering with customizable FPS (1-120 FPS)
  • Event-driven input system supporting all keyboard keys
  • Animation systems for smooth character and object movement
  • State management for complex game scenes
  • Audio integration for sound effects and background music

๐ŸŒ Cross-Platform Support

RMP is designed for maximum compatibility across operating systems and terminal environments.

Supported Platforms

  • โœ… Linux (Debian, Ubuntu, Arch, CentOS, Fedora)
  • โœ… macOS (Intel and Apple Silicon M1/M2)
  • โœ… Windows (MinGW, MSYS2, WSL, Cygwin)
  • โœ… FreeBSD and other Unix-like systems

Terminal Compatibility

  • โœ… Modern terminals (Alacritty, Kitty, iTerm2, Windows Terminal)
  • โœ… Traditional terminals (xterm, GNOME Terminal, Konsole)

Platform-Specific Features

// Platform detection in C engine
#ifdef _WIN32
    #define PLATFORM_WINDOWS
    #define PATH_SEPARATOR "\\"
#elif defined(__APPLE__)
    #define PLATFORM_MACOS
    #define PATH_SEPARATOR "/"
#elif defined(__linux__)
    #define PLATFORM_LINUX
    #define PATH_SEPARATOR "/"
#endif

๐Ÿ“š Comprehensive API Reference

Core Framework Classes

api.Frame

Main application frame and event loop management. hight level class for rendering the frame

local frame = api.Frame.new()
frame:setFps(60)                    -- Set target FPS (1-120)
frame:add(frame)                    -- Add VirtualTerminal or Frame to it
frame:run(keyEvent)                 -- Process single frame

api.Window

Window management and layout system.

local window = api.Window.new(id)
window:createWindow(title, width, height, x, y, border, bgColor, fgColor, contentFunction)
window:setTitle(title)              -- Update window title
window:resize(w, h)                 -- Resize window
window:move(x, y)                   -- Move window position

api.Terminal

Low-level terminal control and input handling.

api.Terminal:clear()                -- Clear entire screen
api.Terminal:setCursor(x, y)        -- Move cursor position
api.Terminal:hideCursor()           -- Hide cursor
api.Terminal:showCursor()           -- Show cursor
local key = api.Terminal:handleKey() -- Get pressed key (non-blocking)
api.Terminal:getSize()              -- Get terminal dimensions

api.VirtualTerminal

Advanced text rendering and virtual screen buffer.

local vterm = api.VirtualTerminal.new()
vterm:writeText(x, y, text, color)  -- Write colored text
vterm:drawBox(x, y, w, h, border, color)   -- Draw bordered box
vterm:clear()                       -- Clear virtual buffer
vterm:addEventListener(EventType, callback)       -- Add event handler

api.Text

Rich text rendering with styles and colors.

local text = api.Text.new(content, x, y, fgColor, bgColor, style)
text:getText()         -- Update text content
text:getPosition()     -- Move text position
text:getColor()        -- Change text colors
text:getStyle()        -- Apply text style

Audio System

api.Audio

Audio playback and control for music and sound effects.

api.Audio:load(filename)            -- Load audio file
api.Audio:play()                    -- Start playback
api.Audio:pause()                   -- Pause playback
api.Audio:stop()                    -- Stop playback
api.Audio:setVolume(level)          -- Set volume (0.0-1.0)
api.Audio:seek(position)            -- Seek to position in seconds
api.Audio:getPosition()             -- Get current playback position
api.Audio:getDuration()             -- Get total track duration

Color Constants

Foreground Colors

-- Bright colors
api.FGColors.Brights.Black
api.FGColors.Brights.Red
api.FGColors.Brights.Green
api.FGColors.Brights.Yellow
api.FGColors.Brights.Blue
api.FGColors.Brights.Magenta
api.FGColors.Brights.Cyan
api.FGColors.Brights.White

-- Normal colors  
api.FGColors.NoBrights.Black
api.FGColors.NoBrights.Red
-- ... (similar pattern)

Background Colors

-- Background colors (similar structure)
api.BGColors.Brights.Black
api.BGColors.NoBrights.Red
-- ... etc

Colors From Hex

api.colorFromHex("ff0000" , api.FG) -- forground color
api.colorFromHex("ff0000" , api.BG) -- background color

Text Styles and Drawing

Text Styles

api.TextStyle.Normal                -- Normal text
api.TextStyle.Bold                  -- Bold text
api.TextStyle.Italic                -- Italic text
api.TextStyle.Underline             -- Underlined text
api.TextStyle.Strikethrough         -- Strikethrough text

Box Drawing Characters

api.BoxDrawing.NoBorder             -- No border
api.BoxDrawing.LightBorder          -- Light single line border
api.BoxDrawing.HeavyBorder          -- Heavy single line border  
api.BoxDrawing.RoundedBorder        -- Rounded corner border

Input Handling

Key Constants

-- Letter keys
api.KEY_A, api.KEY_B, ..., api.KEY_Z

-- Number keys
api.KEY_0, api.KEY_1, ..., api.KEY_9

-- Special keys
api.KEY_SPACE                       -- Space bar
api.KEY_ENTER                       -- Enter/Return
api.KEY_TAB                         -- Tab
api.KEY_ESC                         -- Escape
api.KEY_BACKSPACE                   -- Backspace
api.KEY_DELETE                      -- Delete

-- Arrow keys
api.KEY_UP                          -- Up arrow
api.KEY_DOWN                        -- Down arrow 
api.KEY_LEFT                        -- Left arrow
api.KEY_RIGHT                       -- Right arrow

-- Modifier keys
api.KEY_CTRL_A, api.KEY_CTRL_B, ... -- Ctrl combinations

check the docs from RMP Framework

๐Ÿ› Troubleshooting

Common Issues

Build Errors

# Error: Permission denied during install
# Solution: Use sudo for system installation
sudo ./install.sh install -v

# Error: gcc not found
# Solution: Install build tools
sudo apt-get install build-essential gcc

๐Ÿค Contributing

We welcome contributions from developers of all skill levels! Here's how to get involved:

Code Style Guidelines

  • C Code: Follow Linux kernel coding style
  • Lua Code: Use 4-space indentation, descriptive variable names
  • Comments: Document complex algorithms and public APIs
  • Testing: Add tests for new features when possible

Contribution Areas

  • ๐ŸŽจ Theme Development - Create new visual themes
  • ๐Ÿ”Œ Plugin Development - Build plugins for new functionality
  • ๐ŸŽฎ Game Development - Create example games and demos
  • ๐Ÿ“š Documentation - Improve guides and API documentation
  • ๐Ÿ› Bug Fixes - Fix issues and improve stability
  • โšก Performance - Optimize engine and framework code

Submitting Changes

  1. Create descriptive commits

    git commit -m "feat: add cyberpunk theme with animations"
    git commit -m "fix: resolve memory leak in audio engine" 
    git commit -m "docs: improve plugin development guide"
  2. Test thoroughly

    # Run existing tests
    ./rmp --run-tests
    
    # Test on multiple platforms if possible
    # Test with different terminal emulators
  3. Submit pull request

    • Describe changes clearly
    • Link to related issues
    • Include screenshots/videos for visual changes

Reporting Issues

Please use GitHub Issues for bug reports and feature requests:

  • Bug reports: Include system info, steps to reproduce, expected vs actual behavior
  • Feature requests: Describe use case, proposed solution, and alternatives considered

For more details, see our Contributing Guide.

๐Ÿ“„ License

see the LICENCE file for details.

๐Ÿ™ Acknowledgments

RMP is built on the shoulders of amazing open-source projects:

  • Lua 5.4.4 - Embedded scripting language
  • Miniaudio - Cross-platform audio library
  • GCC/Clang - C compiler toolchains
  • Terminal emulator developers - For advancing terminal capabilities

Special thanks to the terminal application community for inspiration and feedback.

๐Ÿš€ What's Next?

Upcoming Features (Roadmap)

  • ๐Ÿ–ฑ๏ธ Mouse Support - Full mouse interaction support
  • ๐ŸŒ Network Support - TCP/UDP networking for multiplayer games
  • ๐ŸŽจ Advanced Graphics - Improved rendering with better Unicode support
  • ๐Ÿ”Œ Plugin Marketplace - Online repository for themes and plugins
  • ๐Ÿ“Š Performance Profiler - Built-in performance analysis tools

Getting Involved

  • โญ Star the repository to show support
  • ๐Ÿ› Report bugs to help improve stability
  • ๐Ÿ’ก Suggest features for future development
  • ๐Ÿค Contribute code to help build the future of terminal applications

๐ŸŽต Start creating amazing terminal applications with RMP today! ๐ŸŽต

๐Ÿš€ Quick Start โ€ข ๐Ÿ“– Examples โ€ข ๐Ÿ“š API Docs โ€ข ๐Ÿค Contribute โ€ข โญ GitHub

Made with love and C