From 3d9583281e302850ab5b503d5fa57c92638c8cd4 Mon Sep 17 00:00:00 2001 From: Belac Darkstorm Date: Sat, 16 Jun 2018 03:08:31 -0500 Subject: [PATCH] AppImage's are now processed better AppImage's desktop files are now extracted so name, category, and icon can be obtained Made all icons be scaled so you don't get icons that are too big or small --- app.go | 3 +- setup.go | 93 ++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 79 insertions(+), 17 deletions(-) diff --git a/app.go b/app.go index fa64341..b99c749 100644 --- a/app.go +++ b/app.go @@ -25,7 +25,8 @@ type app struct { func (a *app) getTreeIter(store *gtk.TreeStore) *gtk.TreeIter { it := store.Append(nil) - store.SetValue(it, 0, a.icon) + scaled,_ := a.icon.ScaleSimple(32,32,gdk.INTERP_HYPER) + store.SetValue(it, 0, scaled) if portableHide { store.SetValue(it, 1, strings.TrimSuffix(a.name, "Portable")) } else { diff --git a/setup.go b/setup.go index fd2c3ce..6f4edca 100644 --- a/setup.go +++ b/setup.go @@ -2,7 +2,6 @@ package main import ( "bufio" - "encoding/json" _ "image/png" "os" "os/exec" @@ -103,26 +102,63 @@ func processApp(fold string) (out app) { out.wine = true } out.icon = getIcon(fold) - if len(out.appimg) > 0 { - os.Mkdir(out.dir+"/.appimageconfig", 0777) - fil, err := os.Open(out.dir + "/.appimageconfig/info.json") - if err == os.ErrNotExist { - fil, _ = os.Create(out.dir + "/.appimageconfig/info.json") - ai := goappimage.NewAppImage(out.dir + "/" + out.appimg[0]) - ai.ExtractDesktop(out.dir + "/.appimageconfig/the.desktop") - //extract desktop and parse info then send to json - //also md5 so when updating happens it can update the desktop file - ai.Free() - } else { - //decode json, check if desktop needs to be updated - } - //Parse extracted desktop file - } out.ini = findInfo(fold) if out.ini != nil { out.name = getName(out.ini) out.cat = getCat(out.ini) } + if len(out.appimg) > 0 && out.name == "" && out.cat == "" && out.icon == nil { + os.Mkdir(out.dir+"/.appimageconfig", 0777) + ai := goappimage.NewAppImage(out.dir + "/" + out.appimg[0]) + fil, err := os.Open(out.dir + "/.appimageconfig/the.md5") + if os.IsNotExist(err) { + ai.Initialize() + ai.ExtractDesktop(out.dir + "/.appimageconfig/the.desktop") + desk, _ := os.Open(out.dir + "/.appimageconfig/the.desktop") + name, cat, icon := extractDesktopInfo(desk) + if out.name == "" { + out.name = name + } + if out.cat == "" { + out.cat = cat + } + if out.icon == nil { + it, _ := gtk.IconThemeGetDefault() + out.icon, err = it.LoadIcon(icon, 64, gtk.ICON_LOOKUP_GENERIC_FALLBACK) + } + fil, _ = os.Create(out.dir + "/.appimageconfig/the.md5") + wrtr := bufio.NewWriter(fil) + wrtr.WriteString(ai.Md5()) + wrtr.Flush() + } else { + md := ai.Md5() + rdr := bufio.NewReader(fil) + filMd, _, _ := rdr.ReadLine() + oldMd := string(filMd) + if oldMd != md { + ai.Initialize() + ai.ExtractDesktop(out.dir + "/.appimageconfig/the.desktop") + os.Remove(out.dir + "/.appimageconfig/the.md5") + fil, _ = os.Create(out.dir + "/.appimageconfig/the.md5") + wrtr := bufio.NewWriter(fil) + wrtr.WriteString(ai.Md5()) + wrtr.Flush() + } + } + ai.Free() + desk, _ := os.Open(out.dir + "/.appimageconfig/the.desktop") + name, cat, icon := extractDesktopInfo(desk) + if out.name == "" { + out.name = name + } + if out.cat == "" { + out.cat = cat + } + if out.icon == nil { + it, _ := gtk.IconThemeGetDefault() + out.icon, err = it.LoadIcon(icon, 32, gtk.ICON_LOOKUP_GENERIC_FALLBACK) + } + } if out.name == "" { out.name = strings.TrimPrefix(fold, "PortableApps/") } @@ -150,6 +186,31 @@ func getCat(ini *os.File) string { return ret } +func extractDesktopInfo(desk *os.File) (name, category, iconName string) { + rdr := bufio.NewReader(desk) + var nameGot, catGot, iconGot bool + for line, _, err := rdr.ReadLine(); err == nil; line, _, err = rdr.ReadLine() { + ln := string(line) + if !nameGot && strings.HasPrefix(ln, "Name=") { + name = strings.TrimPrefix(ln, "Name=") + nameGot = true + } else if !catGot && strings.HasPrefix(ln, "Categories=") { + cats := strings.Split(strings.TrimPrefix(ln, "Categories="), ";") + if len(cats) > 0 { + category = cats[0] + } + catGot = true + } else if !iconGot && strings.HasPrefix(ln, "Icon=") { + iconName = strings.TrimPrefix(ln, "Icon=") + iconGot = true + } + if nameGot && catGot && iconGot { + break + } + } + return +} + func getName(ini *os.File) string { rdr := bufio.NewReader(ini) var ret string