mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-04 04:42:05 -04:00
96 lines
2.7 KiB
Go
96 lines
2.7 KiB
Go
package providers
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/utils"
|
|
)
|
|
|
|
type MiracleProvider struct {
|
|
configPath string
|
|
}
|
|
|
|
func NewMiracleProvider(configPath string) *MiracleProvider {
|
|
if configPath == "" {
|
|
configDir, err := os.UserConfigDir()
|
|
if err == nil {
|
|
configPath = filepath.Join(configDir, "miracle-wm")
|
|
}
|
|
}
|
|
return &MiracleProvider{configPath: configPath}
|
|
}
|
|
|
|
func (m *MiracleProvider) Name() string {
|
|
return "miracle"
|
|
}
|
|
|
|
func (m *MiracleProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
|
|
config, err := ParseMiracleConfig(m.configPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse miracle-wm config: %w", err)
|
|
}
|
|
|
|
bindings := MiracleConfigToBindings(config)
|
|
categorizedBinds := make(map[string][]keybinds.Keybind)
|
|
|
|
for _, kb := range bindings {
|
|
category := m.categorizeAction(kb.Action)
|
|
bind := keybinds.Keybind{
|
|
Key: m.formatKey(kb),
|
|
Description: kb.Comment,
|
|
Action: kb.Action,
|
|
}
|
|
categorizedBinds[category] = append(categorizedBinds[category], bind)
|
|
}
|
|
|
|
return &keybinds.CheatSheet{
|
|
Title: "Miracle WM Keybinds",
|
|
Provider: m.Name(),
|
|
Binds: categorizedBinds,
|
|
}, nil
|
|
}
|
|
|
|
func (m *MiracleProvider) GetOverridePath() string {
|
|
expanded, err := utils.ExpandPath(m.configPath)
|
|
if err != nil {
|
|
return filepath.Join(m.configPath, "config.yaml")
|
|
}
|
|
return filepath.Join(expanded, "config.yaml")
|
|
}
|
|
|
|
func (m *MiracleProvider) formatKey(kb MiracleKeyBinding) string {
|
|
parts := make([]string, 0, len(kb.Mods)+1)
|
|
parts = append(parts, kb.Mods...)
|
|
parts = append(parts, kb.Key)
|
|
return strings.Join(parts, "+")
|
|
}
|
|
|
|
func (m *MiracleProvider) categorizeAction(action string) string {
|
|
switch {
|
|
case strings.HasPrefix(action, "select_workspace_") || strings.HasPrefix(action, "move_to_workspace_"):
|
|
return "Workspace"
|
|
case strings.Contains(action, "select_") || strings.Contains(action, "move_"):
|
|
return "Window"
|
|
case action == "toggle_resize" || strings.HasPrefix(action, "resize_"):
|
|
return "Window"
|
|
case action == "fullscreen" || action == "toggle_floating" || action == "quit_active_window" || action == "toggle_pinned_to_workspace":
|
|
return "Window"
|
|
case action == "toggle_tabbing" || action == "toggle_stacking" || action == "request_vertical" || action == "request_horizontal":
|
|
return "Layout"
|
|
case action == "quit_compositor":
|
|
return "System"
|
|
case action == "terminal":
|
|
return "Execute"
|
|
case strings.HasPrefix(action, "magnifier_"):
|
|
return "Accessibility"
|
|
case strings.HasPrefix(action, "dms ") || strings.Contains(action, "dms ipc"):
|
|
return "Execute"
|
|
default:
|
|
return "Execute"
|
|
}
|
|
}
|