mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-15 08:42:47 -04:00
app picker: extend App Picker to integrate with mime overrides
- Adds "DMS Opener" as an option (dms-open.desktop) - Add mime type GO utils - Add rememberance to App Picker modal
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
package mime
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/desktop"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
)
|
||||
|
||||
type defaultResult struct {
|
||||
MimeType string `json:"mimeType"`
|
||||
DesktopID string `json:"desktopId"`
|
||||
}
|
||||
|
||||
type appsResult struct {
|
||||
MimeType string `json:"mimeType"`
|
||||
DesktopIDs []string `json:"desktopIds"`
|
||||
}
|
||||
|
||||
type queryResult struct {
|
||||
Defaults map[string]string `json:"defaults"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request) {
|
||||
switch req.Method {
|
||||
case "mime.getDefault":
|
||||
handleGetDefault(conn, req)
|
||||
case "mime.setDefault":
|
||||
handleSetDefault(conn, req)
|
||||
case "mime.setDefaults":
|
||||
handleSetDefaults(conn, req)
|
||||
case "mime.appsForMime":
|
||||
handleAppsForMime(conn, req)
|
||||
case "mime.queryDefaults":
|
||||
handleQueryDefaults(conn, req)
|
||||
case "mime.invalidate":
|
||||
desktop.InvalidateCache()
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
default:
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetDefault(conn net.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
models.Respond(conn, req.ID, defaultResult{
|
||||
MimeType: mimeType,
|
||||
DesktopID: desktop.GetDefault(mimeType),
|
||||
})
|
||||
}
|
||||
|
||||
func handleSetDefault(conn net.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
desktopID, err := params.StringNonEmpty(req.Params, "desktopId")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
if err := desktop.SetDefault(mimeType, desktopID); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
}
|
||||
|
||||
func handleSetDefaults(conn net.Conn, req models.Request) {
|
||||
desktopID, err := params.StringNonEmpty(req.Params, "desktopId")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
mimeTypes, err := mimeListParam(req, "mimeTypes")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
if err := desktop.SetDefaults(mimeTypes, desktopID); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
}
|
||||
|
||||
func handleAppsForMime(conn net.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
ids := desktop.AppsForMime(mimeType)
|
||||
if ids == nil {
|
||||
ids = []string{}
|
||||
}
|
||||
models.Respond(conn, req.ID, appsResult{
|
||||
MimeType: mimeType,
|
||||
DesktopIDs: ids,
|
||||
})
|
||||
}
|
||||
|
||||
func handleQueryDefaults(conn net.Conn, req models.Request) {
|
||||
mimeTypes, err := mimeListParam(req, "mimeTypes")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
}
|
||||
models.Respond(conn, req.ID, queryResult{
|
||||
Defaults: desktop.QueryDefaults(mimeTypes),
|
||||
})
|
||||
}
|
||||
|
||||
func mimeParam(p map[string]any, key string) (string, error) {
|
||||
raw, err := params.StringNonEmpty(p, key)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
canonical := desktop.StripMimeParams(raw)
|
||||
if canonical == "" {
|
||||
return "", fmt.Errorf("invalid '%s' parameter", key)
|
||||
}
|
||||
return canonical, nil
|
||||
}
|
||||
|
||||
func mimeListParam(req models.Request, key string) ([]string, error) {
|
||||
raw, ok := models.Get[[]any](req, key)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("missing or invalid '%s' parameter", key)
|
||||
}
|
||||
out := make([]string, 0, len(raw))
|
||||
for _, v := range raw {
|
||||
s, ok := v.(string)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
canonical := desktop.StripMimeParams(s)
|
||||
if canonical == "" {
|
||||
continue
|
||||
}
|
||||
out = append(out, canonical)
|
||||
}
|
||||
if len(out) == 0 {
|
||||
return nil, fmt.Errorf("no valid mime types provided")
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
Reference in New Issue
Block a user