Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a55c82483a | |||
| 9e9bb82025 | |||
| ea91d3cd80 | |||
| 2a0d53db09 | |||
| a0213d1886 | |||
| 695ce815d9 | |||
| 01556c1eb0 | |||
| d7410bb88f | |||
| bc63e6d10f | |||
| 0403825c3d | |||
| 0f1bb3fabd | |||
| 78c6842fab | |||
| dc1edbad3a | |||
| 6dd00c5f8f | |||
| e68337886f |
@@ -30,8 +30,6 @@ Photos are found [Here](https://goo.gl/photos/VtBUL6DyZTMidj5n6)
|
|||||||
|
|
||||||
# TODO (Might be in order)
|
# TODO (Might be in order)
|
||||||
1. MAKE IT BETTER
|
1. MAKE IT BETTER
|
||||||
1. Add settings menu
|
|
||||||
1. Add updater for .AppImage files
|
1. Add updater for .AppImage files
|
||||||
1. Download .AppImage files (maybe)
|
1. Download .AppImage files (maybe)
|
||||||
1. Check if all apps are closed when it closes and ask if you want to force stop the apps.
|
1. Check if all apps are closed when it closes and ask if you want to force stop the apps.
|
||||||
1. Portable wine (Should be able to get a working version from PlayOnLinux, but I need to add a check to see if filesystem is EXT as Wine doesn't like filesystems w/o permission control)
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -25,10 +27,17 @@ func (a *app) getTreeIter(store *gtk.TreeStore) *gtk.TreeIter {
|
|||||||
store.SetValue(it, 0, a.icon)
|
store.SetValue(it, 0, a.icon)
|
||||||
store.SetValue(it, 1, a.name)
|
store.SetValue(it, 1, a.name)
|
||||||
if len(a.ex) > 1 {
|
if len(a.ex) > 1 {
|
||||||
|
if wine {
|
||||||
for _, v := range a.ex {
|
for _, v := range a.ex {
|
||||||
i := store.Append(it)
|
i := store.Append(it)
|
||||||
store.SetValue(i, 1, v)
|
store.SetValue(i, 1, v)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
for _, v := range a.lin {
|
||||||
|
i := store.Append(it)
|
||||||
|
store.SetValue(i, 1, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return it
|
return it
|
||||||
}
|
}
|
||||||
@@ -38,7 +47,11 @@ func (a *app) launch() {
|
|||||||
if wine {
|
if wine {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if !contains(a.lin, a.ex[0]) {
|
if !contains(a.lin, a.ex[0]) {
|
||||||
|
if comEnbld {
|
||||||
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
||||||
|
} else {
|
||||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if comEnbld {
|
if comEnbld {
|
||||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[0]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[0]+"\"")
|
||||||
@@ -64,7 +77,11 @@ func (a *app) launch() {
|
|||||||
if wine {
|
if wine {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if len(a.lin) == 0 {
|
if len(a.lin) == 0 {
|
||||||
|
if comEnbld {
|
||||||
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
||||||
|
} else {
|
||||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[0]+"\"")
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
var ind int
|
var ind int
|
||||||
for i, v := range a.lin {
|
for i, v := range a.lin {
|
||||||
@@ -109,7 +126,11 @@ func (a *app) launchSub(sub int) {
|
|||||||
if wine {
|
if wine {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if !contains(a.lin, a.ex[sub]) {
|
if !contains(a.lin, a.ex[sub]) {
|
||||||
|
if comEnbld {
|
||||||
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"")
|
||||||
|
} else {
|
||||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+a.ex[sub]+"\"")
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if comEnbld {
|
if comEnbld {
|
||||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||||
@@ -120,7 +141,7 @@ func (a *app) launchSub(sub int) {
|
|||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Start()
|
cmd.Start()
|
||||||
}
|
} else {
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
if comEnbld {
|
if comEnbld {
|
||||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||||
@@ -131,178 +152,130 @@ func (a *app) launchSub(sub int) {
|
|||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Start()
|
cmd.Start()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// type appExNode struct {
|
func (a *app) edit(parent *gtk.Window, reload func()) {
|
||||||
// ap app
|
tmp := *a
|
||||||
// exInd int
|
parent.SetSensitive(false)
|
||||||
// }
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
//
|
win.Connect("destroy", func() {
|
||||||
// func (a *appExNode) launch() {
|
master = make(map[string][]app)
|
||||||
// if wine {
|
linmaster = make(map[string][]app)
|
||||||
// var cmd *exec.Cmd
|
cats = make([]string, 0)
|
||||||
// if !contains(a.ap.lin, a.ap.ex[a.exInd]) {
|
lin = make([]string, 0)
|
||||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; wine \""+a.ap.ex[a.exInd]+"\"")
|
setup()
|
||||||
// } else {
|
reload()
|
||||||
// if comEnbld {
|
parent.SetSensitive(true)
|
||||||
// cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
})
|
||||||
// } else {
|
win.SetDefaultSize(400, 135)
|
||||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
// }
|
topLvl.SetMarginStart(10)
|
||||||
// }
|
topLvl.SetMarginEnd(10)
|
||||||
// cmd.Stdout = os.Stdout
|
topLvl.SetMarginTop(10)
|
||||||
// cmd.Stderr = os.Stderr
|
topLvl.SetMarginBottom(10)
|
||||||
// cmd.Start()
|
top, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
||||||
// }
|
img, _ := gtk.ImageNewFromPixbuf(a.icon)
|
||||||
// var cmd *exec.Cmd
|
imgBut, _ := gtk.ButtonNew()
|
||||||
// if comEnbld {
|
imgBut.SetImage(img)
|
||||||
// cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
imgBut.SetSizeRequest(100, 100)
|
||||||
// } else {
|
imgBut.Connect("clicked", func() {
|
||||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
fil, _ := gtk.FileChooserDialogNewWith2Buttons("Select Icon", win, gtk.FILE_CHOOSER_ACTION_OPEN, "Cancel", gtk.RESPONSE_CANCEL, "Open", gtk.RESPONSE_ACCEPT)
|
||||||
// }
|
filter, _ := gtk.FileFilterNew()
|
||||||
// cmd.Stdout = os.Stdout
|
filter.AddPixbufFormats()
|
||||||
// cmd.Stderr = os.Stderr
|
filter.SetName("Supported Pictures")
|
||||||
// cmd.Start()
|
fil.AddFilter(filter)
|
||||||
// }
|
resp := fil.Run()
|
||||||
|
if resp == int(gtk.RESPONSE_ACCEPT) {
|
||||||
|
filename := fil.GetFilename()
|
||||||
|
_, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pix, _ := gdk.PixbufNewFromFileAtSize(filename, 32, 32)
|
||||||
|
tmp.icon = pix
|
||||||
|
img.SetFromPixbuf(pix)
|
||||||
|
fil.Close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
topRt, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
nameLbl, _ := gtk.LabelNew("Name:")
|
||||||
|
nameLbl.SetHAlign(gtk.ALIGN_START)
|
||||||
|
txtgtbl, _ := gtk.TextTagTableNew()
|
||||||
|
txtBuf, _ := gtk.TextBufferNew(txtgtbl)
|
||||||
|
nameTxt, _ := gtk.TextViewNewWithBuffer(txtBuf)
|
||||||
|
nameTxt.SetAcceptsTab(false)
|
||||||
|
nameTxt.SetWrapMode(gtk.WRAP_CHAR)
|
||||||
|
nameTxt.SetPixelsBelowLines(5)
|
||||||
|
nameTxt.SetHExpand(true)
|
||||||
|
nameTxt.SetVExpand(false)
|
||||||
|
nameTxt.SetBorderWindowSize(gtk.TEXT_WINDOW_BOTTOM, 5)
|
||||||
|
txtBuf.SetText(tmp.name)
|
||||||
|
vScrollName, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
hScrollName, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
nameScr, _ := gtk.ScrolledWindowNew(hScrollName, vScrollName)
|
||||||
|
nameScr.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
|
||||||
|
nameScr.SetSizeRequest(300, 25)
|
||||||
|
nameScr.SetVExpand(false)
|
||||||
|
nameScr.Add(nameTxt)
|
||||||
|
catLbl, _ := gtk.LabelNew("Category:")
|
||||||
|
catLbl.SetHAlign(gtk.ALIGN_START)
|
||||||
|
catTbl, _ := gtk.TextTagTableNew()
|
||||||
|
catBuf, _ := gtk.TextBufferNew(catTbl)
|
||||||
|
catTxt, _ := gtk.TextViewNewWithBuffer(catBuf)
|
||||||
|
catBuf.SetText(tmp.cat)
|
||||||
|
catTxt.SetAcceptsTab(false)
|
||||||
|
catTxt.SetWrapMode(gtk.WRAP_CHAR)
|
||||||
|
catTxt.SetPixelsBelowLines(5)
|
||||||
|
catTxt.SetHExpand(true)
|
||||||
|
catTxt.SetVExpand(false)
|
||||||
|
catTxt.SetBorderWindowSize(gtk.TEXT_WINDOW_BOTTOM, 5)
|
||||||
|
vScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
hScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
catScr, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat)
|
||||||
|
catScr.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
|
||||||
|
catScr.SetSizeRequest(300, 25)
|
||||||
|
catScr.SetVExpand(false)
|
||||||
|
catScr.Add(catTxt)
|
||||||
|
topRt.Add(nameLbl)
|
||||||
|
topRt.Add(nameScr)
|
||||||
|
topRt.Add(catLbl)
|
||||||
|
topRt.Add(catScr)
|
||||||
|
top.Add(imgBut)
|
||||||
|
top.Add(topRt)
|
||||||
|
bot, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
||||||
|
sv, _ := gtk.ButtonNewWithLabel("Save")
|
||||||
|
sv.Connect("clicked", func() {
|
||||||
|
tmp.name, _ = txtBuf.GetText(txtBuf.GetStartIter(), txtBuf.GetEndIter(), true)
|
||||||
|
tmp.cat, _ = catBuf.GetText(catBuf.GetStartIter(), catBuf.GetEndIter(), true)
|
||||||
|
tmp.makeIni()
|
||||||
|
os.Remove(a.dir + "/appicon.png")
|
||||||
|
tmp.icon.SavePNG(a.dir+"/appicon.png", 0)
|
||||||
|
win.Close()
|
||||||
|
})
|
||||||
|
cnl, _ := gtk.ButtonNewWithLabel("Cancel")
|
||||||
|
cnl.Connect("clicked", func() {
|
||||||
|
win.Close()
|
||||||
|
})
|
||||||
|
bot.PackEnd(sv, false, false, 0)
|
||||||
|
bot.PackEnd(cnl, false, false, 0)
|
||||||
|
topLvl.Add(top)
|
||||||
|
topLvl.Add(bot)
|
||||||
|
win.Add(topLvl)
|
||||||
|
win.ShowAll()
|
||||||
|
win.Show()
|
||||||
|
}
|
||||||
|
|
||||||
// func (a *appExNode) Count() int {
|
func (a *app) makeIni() {
|
||||||
// return 0
|
os.Remove(a.dir + "/appinfo.ini")
|
||||||
// }
|
fil, err := os.Create(a.dir + "/appinfo.ini")
|
||||||
//
|
if err != nil {
|
||||||
// func (a *appExNode) NodeAt(int) gxui.TreeNode {
|
return
|
||||||
// return nil
|
}
|
||||||
// }
|
ini := "[General]\n"
|
||||||
//
|
ini += "Category=" + a.cat + "\n"
|
||||||
// func (a *appExNode) ItemIndex(gxui.AdapterItem) int {
|
ini += "Name=" + a.name + "\n"
|
||||||
// return -1
|
wrt := bufio.NewWriter(fil)
|
||||||
// }
|
wrt.WriteString(ini)
|
||||||
//
|
wrt.Flush()
|
||||||
// func (a *appExNode) Item() gxui.AdapterItem {
|
}
|
||||||
// if wine {
|
|
||||||
// return a.ap.ex[a.exInd]
|
|
||||||
// }
|
|
||||||
// return a.ap.lin[a.exInd]
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *appExNode) Create(the gxui.Theme) gxui.Control {
|
|
||||||
// box := the.CreateLinearLayout()
|
|
||||||
// box.SetDirection(gxui.LeftToRight)
|
|
||||||
// box.SetVerticalAlignment(gxui.AlignMiddle)
|
|
||||||
// img := the.CreateImage()
|
|
||||||
// img.SetTexture(a.ap.icon)
|
|
||||||
// img.SetExplicitSize(math.Size{H: 32, W: 32})
|
|
||||||
// lbl := the.CreateLabel()
|
|
||||||
// lbl.SetText(a.ap.ex[a.exInd])
|
|
||||||
// box.AddChild(img)
|
|
||||||
// box.AddChild(lbl)
|
|
||||||
// box.OnDoubleClick(func(gxui.MouseEvent) {
|
|
||||||
// a.launch()
|
|
||||||
// })
|
|
||||||
// return box
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func (a *appNode) Count() int {
|
|
||||||
// if wine {
|
|
||||||
// if len(a.ex) > 1 {
|
|
||||||
// return len(a.ap.ex)
|
|
||||||
// }
|
|
||||||
// return 0
|
|
||||||
// }
|
|
||||||
// if len(a.ap.lin) > 1 {
|
|
||||||
// return len(a.ap.lin)
|
|
||||||
// }
|
|
||||||
// return 0
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *appNode) NodeAt(i int) gxui.TreeNode {
|
|
||||||
// return &appExNode{ap: a.ap, exInd: i}
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *appNode) ItemIndex(item gxui.AdapterItem) int {
|
|
||||||
// if wine {
|
|
||||||
// for i, v := range a.ap.ex {
|
|
||||||
// if v == item {
|
|
||||||
// return i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// for i, v := range a.ap.lin {
|
|
||||||
// if v == item {
|
|
||||||
// return i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return -1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *appNode) Item() gxui.AdapterItem {
|
|
||||||
// return a.ap.name
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *appNode) Create(the gxui.Theme) gxui.Control {
|
|
||||||
// box := the.CreateLinearLayout()
|
|
||||||
// box.SetDirection(gxui.LeftToRight)
|
|
||||||
// box.SetPadding(math.CreateSpacing(2))
|
|
||||||
// box.SetVerticalAlignment(gxui.AlignMiddle)
|
|
||||||
// img := the.CreateImage()
|
|
||||||
// if a.ap.icon != nil {
|
|
||||||
// img.SetTexture(a.ap.icon)
|
|
||||||
// }
|
|
||||||
// img.SetExplicitSize(math.Size{H: 32, W: 32})
|
|
||||||
// lbl := the.CreateLabel()
|
|
||||||
// lbl.SetText(a.ap.name)
|
|
||||||
// box.AddChild(img)
|
|
||||||
// box.AddChild(lbl)
|
|
||||||
// box.OnDoubleClick(func(gxui.MouseEvent) {
|
|
||||||
// a.launch()
|
|
||||||
// })
|
|
||||||
// return box
|
|
||||||
// }
|
|
||||||
|
|
||||||
// type catAdap struct {
|
|
||||||
// gxui.AdapterBase
|
|
||||||
// cat string
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) setCat(cat string) {
|
|
||||||
// a.cat = cat
|
|
||||||
// a.DataChanged(false)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) refresh() {
|
|
||||||
// a.DataChanged(false)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) Count() int {
|
|
||||||
// if wine {
|
|
||||||
// return len(master[a.cat])
|
|
||||||
// }
|
|
||||||
// return len(linmaster[a.cat])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) NodeAt(i int) gxui.TreeNode {
|
|
||||||
// if wine {
|
|
||||||
// return &appNode{ap: master[a.cat][i]}
|
|
||||||
// }
|
|
||||||
// return &appNode{ap: linmaster[a.cat][i]}
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) Size(gxui.Theme) math.Size {
|
|
||||||
// return math.Size{H: 34, W: math.MaxSize.W}
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func (a *catAdap) ItemIndex(item gxui.AdapterItem) int {
|
|
||||||
// if wine {
|
|
||||||
// for i, v := range master[a.cat] {
|
|
||||||
// if v.name == item {
|
|
||||||
// return i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// for i, v := range linmaster[a.cat] {
|
|
||||||
// if v.name == item {
|
|
||||||
// return i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return -1
|
|
||||||
// }
|
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
func convert(in string) (out []tag) {
|
||||||
|
for i := 0; i < len(in); i++ {
|
||||||
|
v := in[i]
|
||||||
|
if v == '<' {
|
||||||
|
for j := i; j < len(in); j++ {
|
||||||
|
val := in[j]
|
||||||
|
if val == '>' {
|
||||||
|
var tmp tag
|
||||||
|
tmp.process(in[i+1 : j+1])
|
||||||
|
if !tmp.end && tmp.typ == "a" {
|
||||||
|
tmp.index[0] = i
|
||||||
|
tmp.index[1] = j
|
||||||
|
nd := fndend(tmp, in[j+1:])
|
||||||
|
if !reflect.DeepEqual(nd, tag{}) {
|
||||||
|
tmp.Meat = in[j+1 : nd.index[0]]
|
||||||
|
out = append(out, tmp)
|
||||||
|
str := in[tmp.index[1]:nd.index[0]]
|
||||||
|
in = in[:i] + str + in[nd.index[1]+1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func fndend(fnt tag, area string) tag {
|
||||||
|
var count int
|
||||||
|
for i, v := range area {
|
||||||
|
if v == '<' {
|
||||||
|
for j, val := range area[i:] {
|
||||||
|
if val == '>' {
|
||||||
|
var tmp tag
|
||||||
|
tmp.process(area[i+1 : i+j+1])
|
||||||
|
if tmp.typ == fnt.typ {
|
||||||
|
if tmp.end {
|
||||||
|
if count == 0 {
|
||||||
|
tmp.index[0] = fnt.index[1] + 1 + i
|
||||||
|
tmp.index[1] = fnt.index[1] + j + i + 1
|
||||||
|
return tmp
|
||||||
|
}
|
||||||
|
count--
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
count++
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tag{}
|
||||||
|
}
|
||||||
+115
@@ -0,0 +1,115 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
type tag struct {
|
||||||
|
typ string
|
||||||
|
end bool
|
||||||
|
params map[string]string
|
||||||
|
index [2]int
|
||||||
|
Meat string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tag) value(param string) string {
|
||||||
|
return t.params[param]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tag) setValue(param, value string) {
|
||||||
|
if t.params == nil {
|
||||||
|
t.params = make(map[string]string)
|
||||||
|
}
|
||||||
|
t.params[strings.TrimSpace(strings.ToLower(param))] = strings.TrimSpace(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tag) process(bbtag string) {
|
||||||
|
if strings.HasPrefix(bbtag, "/") {
|
||||||
|
t.end = true
|
||||||
|
t.typ = strings.ToLower(strings.TrimPrefix(bbtag[:len(bbtag)-1], "/"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for i, v := range bbtag {
|
||||||
|
if v == '=' || v == ' ' || v == '>' {
|
||||||
|
t.typ = strings.ToLower(bbtag[:i])
|
||||||
|
switch v {
|
||||||
|
case '=':
|
||||||
|
if qt := bbtag[i+1]; qt == '\'' || qt == '"' {
|
||||||
|
for j := i + 2; j < len(bbtag); j++ {
|
||||||
|
if bbtag[j] == qt {
|
||||||
|
t.setValue("starting", bbtag[i+2:j])
|
||||||
|
bbtag = bbtag[j+1:]
|
||||||
|
break
|
||||||
|
} else if bbtag[j] == '>' {
|
||||||
|
t.setValue("starting", bbtag[i+2:j])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for j := i + 1; j < len(bbtag); j++ {
|
||||||
|
if bbtag[j] == '>' {
|
||||||
|
t.setValue("starting", bbtag[i+1:j])
|
||||||
|
return
|
||||||
|
} else if bbtag[j] == ' ' {
|
||||||
|
t.setValue("starting", bbtag[i+1:j])
|
||||||
|
bbtag = bbtag[j+1:]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case '>':
|
||||||
|
return
|
||||||
|
case ' ':
|
||||||
|
bbtag = bbtag[i:]
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.processFurther(bbtag)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tag) processFurther(further string) {
|
||||||
|
further = strings.TrimSpace(further)
|
||||||
|
for i := 0; i < len(further); i++ {
|
||||||
|
switch further[i] {
|
||||||
|
case ' ':
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[:i])
|
||||||
|
further = strings.TrimSpace(further[i:])
|
||||||
|
i = -1
|
||||||
|
case '=':
|
||||||
|
if qt := further[i+1]; qt == '\'' || qt == '"' {
|
||||||
|
outloopqt:
|
||||||
|
for j := i + 2; j < len(further); j++ {
|
||||||
|
switch further[j] {
|
||||||
|
case '>':
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[i+2:j])
|
||||||
|
return
|
||||||
|
case qt:
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[i+2:j])
|
||||||
|
further = strings.TrimSpace(further[j+1:])
|
||||||
|
i = -1
|
||||||
|
break outloopqt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
outloop:
|
||||||
|
for j := i + 1; j < len(further); j++ {
|
||||||
|
switch further[j] {
|
||||||
|
case '>':
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[i+1:j])
|
||||||
|
return
|
||||||
|
case ' ':
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[i+1:j])
|
||||||
|
further = strings.TrimSpace(further[j:])
|
||||||
|
i = -1
|
||||||
|
break outloop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case '>':
|
||||||
|
if i != 0 {
|
||||||
|
t.setValue(strings.ToLower(further[:i]), further[:i])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
type appimg struct {
|
||||||
|
full string
|
||||||
|
name string
|
||||||
|
version string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newApp(name string) appimg {
|
||||||
|
var out appimg
|
||||||
|
out.full = name
|
||||||
|
return out
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gotk3/gotk3/gtk"
|
||||||
|
)
|
||||||
|
|
||||||
|
func downloadApp(parent *gtk.Window, ap appimg) {
|
||||||
|
parent.SetSensitive(false)
|
||||||
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
|
win.SetTransientFor(parent)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
parent.SetSensitive(true)
|
||||||
|
})
|
||||||
|
spn, _ := gtk.SpinnerNew()
|
||||||
|
spn.Start()
|
||||||
|
lbl, _ := gtk.LabelNew("Downloading " + ap.full + "...")
|
||||||
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
box.SetMarginStart(10)
|
||||||
|
box.SetMarginEnd(10)
|
||||||
|
box.SetMarginTop(10)
|
||||||
|
box.SetMarginBottom(10)
|
||||||
|
box.Add(spn)
|
||||||
|
box.Add(lbl)
|
||||||
|
win.Add(box)
|
||||||
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
win.ShowAll()
|
||||||
|
win.Show()
|
||||||
|
go func(win *gtk.Window, ap appimg) {
|
||||||
|
defer win.Close()
|
||||||
|
check := http.Client{
|
||||||
|
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
||||||
|
r.URL.Opaque = r.URL.Path
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
resp, err := check.Get(urlBase + ap.full)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
name := strings.Split(ap.full, "-")[0]
|
||||||
|
var foldName string
|
||||||
|
if _, err = os.Open("PortableApps/" + name + "Portable"); err == nil {
|
||||||
|
foldName = "PortableApps/" + name + "Portable"
|
||||||
|
} else if _, err = os.Open("PortableApps/" + name); err == nil {
|
||||||
|
foldName = "PortableApps/" + name
|
||||||
|
} else {
|
||||||
|
os.Mkdir("PortableApps/"+name+"Portable", 0777)
|
||||||
|
foldName = "PortableApps/" + name
|
||||||
|
}
|
||||||
|
os.Remove(foldName + "/" + ap.full)
|
||||||
|
fil, err := os.Create(foldName + "/" + ap.full)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
io.Copy(fil, resp.Body)
|
||||||
|
fil.Chmod(0777)
|
||||||
|
}(win, ap)
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
//Package appimg is for downloading new AppImages for LinuxPA
|
||||||
|
package appimg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gotk3/gotk3/glib"
|
||||||
|
"github.com/gotk3/gotk3/gtk"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
urlBase = "https://dl.bintray.com/probono/AppImages/"
|
||||||
|
)
|
||||||
|
|
||||||
|
//ShowUI shows the list of possible AppImages to be downloaded in a gtk.Window
|
||||||
|
func ShowUI(newestVersionOnly bool, clsFunc func()) {
|
||||||
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
clsFunc()
|
||||||
|
})
|
||||||
|
apps := make([]appimg, 0)
|
||||||
|
win.SetSizeRequest(400, 400)
|
||||||
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
appList, _ := gtk.ListBoxNew()
|
||||||
|
apch := make(chan appimg)
|
||||||
|
appList.SetHExpand(true)
|
||||||
|
appList.SetVExpand(true)
|
||||||
|
vScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
hScrollCat, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
lst, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat)
|
||||||
|
lst.SetSizeRequest(170, 500)
|
||||||
|
lst.Add(appList)
|
||||||
|
box.Add(lst)
|
||||||
|
win.Add(box)
|
||||||
|
appList.Connect("row-activated", func() {
|
||||||
|
if appList.GetSelectedRow().GetIndex() >= 0 {
|
||||||
|
downloadApp(win, apps[appList.GetSelectedRow().GetIndex()])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
win.ShowAll()
|
||||||
|
win.Show()
|
||||||
|
getList(win, apch)
|
||||||
|
go func(win *gtk.Window, apch chan appimg, list *gtk.ListBox) {
|
||||||
|
if newestVersionOnly {
|
||||||
|
imgs := make([]appimg, 0)
|
||||||
|
a := make(map[string][]appimg)
|
||||||
|
names := make([]string, 0)
|
||||||
|
for i := range apch {
|
||||||
|
imgs = append(imgs, i)
|
||||||
|
}
|
||||||
|
for i, v := range imgs {
|
||||||
|
sp := strings.Split(v.full, "-")
|
||||||
|
if len(sp) >= 2 {
|
||||||
|
vers := sp[1]
|
||||||
|
removeLetters(vers)
|
||||||
|
imgs[i].version = vers
|
||||||
|
imgs[i].name = sp[0]
|
||||||
|
if _, ok := a[imgs[i].name]; !ok {
|
||||||
|
names = append(names, imgs[i].name)
|
||||||
|
}
|
||||||
|
a[imgs[i].name] = append(a[imgs[i].name], imgs[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.Strings(names)
|
||||||
|
for _, name := range names {
|
||||||
|
glib.IdleAdd(func(name string, list *gtk.ListBox, i appimg) {
|
||||||
|
lbl, _ := gtk.LabelNew(name)
|
||||||
|
list.Add(lbl)
|
||||||
|
apps = append(apps, i)
|
||||||
|
lbl.Show()
|
||||||
|
}, name, list, a[name][compareVersions(a[name])])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := range apch {
|
||||||
|
glib.IdleAdd(func(list *gtk.ListBox, i appimg) {
|
||||||
|
lbl, _ := gtk.LabelNew(i.full)
|
||||||
|
list.Add(lbl)
|
||||||
|
apps = append(apps, i)
|
||||||
|
lbl.Show()
|
||||||
|
}, list, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(win, apch, appList)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getList(parent *gtk.Window, apch chan appimg) {
|
||||||
|
win, _ := gtk.WindowNew(gtk.WINDOW_POPUP)
|
||||||
|
win.SetTransientFor(parent)
|
||||||
|
win.SetDestroyWithParent(true)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
parent.SetSensitive(true)
|
||||||
|
})
|
||||||
|
parent.SetSensitive(false)
|
||||||
|
spin, _ := gtk.SpinnerNew()
|
||||||
|
spin.Start()
|
||||||
|
txt, _ := gtk.LabelNew("Getting List...")
|
||||||
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
box.SetMarginBottom(10)
|
||||||
|
box.SetMarginEnd(10)
|
||||||
|
box.SetMarginStart(10)
|
||||||
|
box.SetMarginTop(10)
|
||||||
|
box.Add(spin)
|
||||||
|
box.Add(txt)
|
||||||
|
win.Add(box)
|
||||||
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
win.ShowAll()
|
||||||
|
win.Show()
|
||||||
|
go func(win *gtk.Window, apch chan appimg) {
|
||||||
|
check := http.Client{
|
||||||
|
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
||||||
|
r.URL.Opaque = r.URL.Path
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
resp, err := check.Get(urlBase)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
close(apch)
|
||||||
|
win.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
btys, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
close(apch)
|
||||||
|
win.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tgs := convert(string(btys))
|
||||||
|
for _, v := range tgs {
|
||||||
|
if strings.HasSuffix(strings.ToLower(v.Meat), ".appimage") {
|
||||||
|
apch <- newApp(v.Meat)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(apch)
|
||||||
|
win.Close()
|
||||||
|
}(win, apch)
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
func removeLetters(vers string) string {
|
||||||
|
vers = strings.ToLower(vers)
|
||||||
|
letters := []string{"abcdefghijklmnopqrstuvwxyz"}
|
||||||
|
for _, v := range letters {
|
||||||
|
vers = strings.Replace(vers, v, "", -1)
|
||||||
|
}
|
||||||
|
return vers
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package appimg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func compareVersions(imgs []appimg) int {
|
||||||
|
for i := range imgs {
|
||||||
|
imgs[i].version = removeLetters(imgs[i].version)
|
||||||
|
}
|
||||||
|
highest := 0
|
||||||
|
higharr := strings.Split(imgs[0].version, ".")
|
||||||
|
for i := 0; i < len(imgs); i++ {
|
||||||
|
if i != highest {
|
||||||
|
varr := strings.Split(imgs[i].version, ".")
|
||||||
|
if len(higharr) < len(varr) {
|
||||||
|
for j := 0; j < len(higharr); j++ {
|
||||||
|
h, _ := strconv.Atoi(higharr[j])
|
||||||
|
c, _ := strconv.Atoi(varr[j])
|
||||||
|
if h > c {
|
||||||
|
break
|
||||||
|
} else if c > h {
|
||||||
|
highest = i
|
||||||
|
higharr = varr
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return highest
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/gob"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -8,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
version = "2.0.0.1"
|
version = "2.1.1.0"
|
||||||
defIni = ""
|
defIni = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,7 +20,9 @@ var (
|
|||||||
lin []string
|
lin []string
|
||||||
wine bool
|
wine bool
|
||||||
comEnbld bool
|
comEnbld bool
|
||||||
darkTheme = true
|
wineAvail bool
|
||||||
|
portableHide bool
|
||||||
|
versionNewest = true
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -38,6 +41,7 @@ func uiStart() {
|
|||||||
}
|
}
|
||||||
win.SetTitle("LinuxPA")
|
win.SetTitle("LinuxPA")
|
||||||
win.Connect("destroy", func() {
|
win.Connect("destroy", func() {
|
||||||
|
savePrefs()
|
||||||
gtk.MainQuit()
|
gtk.MainQuit()
|
||||||
})
|
})
|
||||||
win.SetDefaultSize(500, 500)
|
win.SetDefaultSize(500, 500)
|
||||||
@@ -49,6 +53,47 @@ func uiStart() {
|
|||||||
gtk.Main()
|
gtk.Main()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func savePrefs() {
|
||||||
|
os.Remove("PortableApps/LinuxPACom/Prefs.gob")
|
||||||
|
fil, err := os.Create("PortableApps/LinuxPACom/Prefs.gob")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
enc := gob.NewEncoder(fil)
|
||||||
|
err = enc.Encode(wine)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = enc.Encode(portableHide)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = enc.Encode(versionNewest)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadPrefs() {
|
||||||
|
fil, err := os.Open("PortableApps/LinuxPACom/Prefs.gob")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dec := gob.NewDecoder(fil)
|
||||||
|
err = dec.Decode(&wine)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = dec.Decode(&portableHide)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = dec.Decode(&versionNewest)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func contains(arr []string, str string) bool {
|
func contains(arr []string, str string) bool {
|
||||||
for _, v := range arr {
|
for _, v := range arr {
|
||||||
if v == str {
|
if v == str {
|
||||||
|
|||||||
+159
@@ -0,0 +1,159 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
|
||||||
|
"github.com/gotk3/gotk3/glib"
|
||||||
|
"github.com/gotk3/gotk3/gtk"
|
||||||
|
)
|
||||||
|
|
||||||
|
func settingsUI(parent *gtk.Window, onExit func()) {
|
||||||
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
|
win.SetTransientFor(parent)
|
||||||
|
parent.SetSensitive(false)
|
||||||
|
win.SetDefaultSize(600, 300)
|
||||||
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
parent.SetSensitive(true)
|
||||||
|
onExit()
|
||||||
|
})
|
||||||
|
comTagTbl, _ := gtk.TextTagTableNew()
|
||||||
|
comBuf, _ := gtk.TextBufferNew(comTagTbl)
|
||||||
|
ntbk, _ := gtk.NotebookNew()
|
||||||
|
gnrl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
gnrl.SetMarginStart(10)
|
||||||
|
gnrl.SetMarginEnd(10)
|
||||||
|
gnrl.SetMarginTop(10)
|
||||||
|
gnrl.SetMarginBottom(10)
|
||||||
|
dlWine, _ := gtk.ButtonNewWithLabel("Download Wine")
|
||||||
|
wineCheck, _ := gtk.CheckButtonNewWithLabel("Show Windows apps (Wine)")
|
||||||
|
wineLbl, _ := gtk.LabelNew("PortableApps/LinuxPACom/Wine present")
|
||||||
|
dlWine.Connect("clicked", func() {
|
||||||
|
cb := make(chan bool)
|
||||||
|
downloadWine(win, cb)
|
||||||
|
go func() {
|
||||||
|
v := <-cb
|
||||||
|
if v {
|
||||||
|
setupTxt(comBuf)
|
||||||
|
wineLbl.Show()
|
||||||
|
}
|
||||||
|
if _, err := os.Open("PortableApps/LinuxPACom/Wine"); os.IsNotExist(err) {
|
||||||
|
if _, errd := exec.LookPath("wine"); errd == nil {
|
||||||
|
wineAvail = true
|
||||||
|
}
|
||||||
|
} else if err == nil {
|
||||||
|
wineAvail = true
|
||||||
|
}
|
||||||
|
glib.IdleAdd(func() {
|
||||||
|
if !wineAvail {
|
||||||
|
wineCheck.SetSensitive(false)
|
||||||
|
wineCheck.SetTooltipText("Download wine to run windows apps")
|
||||||
|
} else {
|
||||||
|
wineCheck.SetSensitive(true)
|
||||||
|
wineCheck.SetTooltipText("")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
})
|
||||||
|
if !comEnbld {
|
||||||
|
dlWine.SetSensitive(false)
|
||||||
|
dlWine.SetTooltipText("common.sh needed")
|
||||||
|
}
|
||||||
|
pthdCheck, _ := gtk.CheckButtonNewWithLabel("Hide \"Portable\" from app name")
|
||||||
|
pthdCheck.Connect("toggled", func() {
|
||||||
|
portableHide = pthdCheck.GetActive()
|
||||||
|
master = make(map[string][]app)
|
||||||
|
linmaster = make(map[string][]app)
|
||||||
|
cats = make([]string, 0)
|
||||||
|
lin = make([]string, 0)
|
||||||
|
setup()
|
||||||
|
})
|
||||||
|
pthdCheck.SetActive(portableHide)
|
||||||
|
if !wineAvail {
|
||||||
|
wineCheck.SetSensitive(false)
|
||||||
|
wineCheck.SetTooltipText("Download wine to run windows apps")
|
||||||
|
}
|
||||||
|
wineCheck.SetActive(wine)
|
||||||
|
wineCheck.Connect("toggled", func() {
|
||||||
|
wine = wineCheck.GetActive()
|
||||||
|
})
|
||||||
|
versCheck, _ := gtk.CheckButtonNewWithLabel("Only show newest app version in downloads (A bit iffy ATM)")
|
||||||
|
versCheck.SetActive(versionNewest)
|
||||||
|
versCheck.Connect("toggled", func() {
|
||||||
|
versionNewest = versCheck.GetActive()
|
||||||
|
})
|
||||||
|
gnrl.Add(wineLbl)
|
||||||
|
gnrl.Add(dlWine)
|
||||||
|
gnrl.Add(pthdCheck)
|
||||||
|
gnrl.Add(wineCheck)
|
||||||
|
gnrl.Add(versCheck)
|
||||||
|
ntbk.AppendPage(gnrl, getLabel("General"))
|
||||||
|
com, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
com.SetMarginStart(10)
|
||||||
|
com.SetMarginEnd(10)
|
||||||
|
com.SetMarginTop(10)
|
||||||
|
com.SetMarginBottom(10)
|
||||||
|
comEdit, _ := gtk.TextViewNewWithBuffer(comBuf)
|
||||||
|
comEdit.SetVExpand(true)
|
||||||
|
comEdit.SetHExpand(true)
|
||||||
|
vScroll, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
hScroll, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
|
comScrl, _ := gtk.ScrolledWindowNew(hScroll, vScroll)
|
||||||
|
comScrl.Add(comEdit)
|
||||||
|
svBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
||||||
|
sv, _ := gtk.ButtonNewWithLabel("Save")
|
||||||
|
sv.Connect("clicked", func() {
|
||||||
|
beg, end := comBuf.GetBounds()
|
||||||
|
txt, _ := comBuf.GetText(beg, end, true)
|
||||||
|
ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", []byte(txt), 0777)
|
||||||
|
})
|
||||||
|
cnl, _ := gtk.ButtonNewWithLabel("Cancel")
|
||||||
|
cnl.Connect("clicked", func() {
|
||||||
|
setupTxt(comBuf)
|
||||||
|
})
|
||||||
|
svBox.Add(sv)
|
||||||
|
svBox.Add(cnl)
|
||||||
|
com.Add(comScrl)
|
||||||
|
com.Add(svBox)
|
||||||
|
ntbk.AppendPage(com, getLabel("common.sh"))
|
||||||
|
win.Add(ntbk)
|
||||||
|
win.ShowAll()
|
||||||
|
if !comEnbld {
|
||||||
|
comScrl.Hide()
|
||||||
|
svBox.Hide()
|
||||||
|
mkCom, _ := gtk.ButtonNewWithLabel("Create common.sh")
|
||||||
|
mkCom.Connect("clicked", func() {
|
||||||
|
err := ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", []byte("export HOME=$PWD/PortableApps/LinuxPACom/Home"), 0777)
|
||||||
|
if err == nil {
|
||||||
|
mkCom.Hide()
|
||||||
|
comScrl.Show()
|
||||||
|
svBox.Show()
|
||||||
|
setupTxt(comBuf)
|
||||||
|
comEnbld = true
|
||||||
|
dlWine.SetSensitive(true)
|
||||||
|
dlWine.SetTooltipText("")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
mkCom.Show()
|
||||||
|
com.Add(mkCom)
|
||||||
|
} else {
|
||||||
|
setupTxt(comBuf)
|
||||||
|
}
|
||||||
|
if _, err := os.Open("PortableApps/LinuxPACom/Wine"); err != nil && os.IsNotExist(err) {
|
||||||
|
wineLbl.Hide()
|
||||||
|
}
|
||||||
|
win.Show()
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupTxt(buf *gtk.TextBuffer) {
|
||||||
|
fil, _ := os.Open("PortableApps/LinuxPACom/common.sh")
|
||||||
|
btys, _ := ioutil.ReadAll(fil)
|
||||||
|
buf.SetText(string(btys))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLabel(name string) *gtk.Label {
|
||||||
|
lbl, _ := gtk.LabelNew(name)
|
||||||
|
return lbl
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
|
||||||
_ "image/png"
|
_ "image/png"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -14,6 +14,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func setup() {
|
func setup() {
|
||||||
|
loadPrefs()
|
||||||
|
if _, err := os.Open("PortableApps/LinuxPACom/Wine"); os.IsNotExist(err) {
|
||||||
|
if _, errd := exec.LookPath("wine"); errd == nil {
|
||||||
|
wineAvail = true
|
||||||
|
}
|
||||||
|
} else if err == nil {
|
||||||
|
wineAvail = true
|
||||||
|
}
|
||||||
|
if !wineAvail {
|
||||||
|
wine = false
|
||||||
|
}
|
||||||
PortableAppsFold, err := os.Open("PortableApps")
|
PortableAppsFold, err := os.Open("PortableApps")
|
||||||
if PAStat, _ := PortableAppsFold.Stat(); err != nil || !PAStat.IsDir() {
|
if PAStat, _ := PortableAppsFold.Stat(); err != nil || !PAStat.IsDir() {
|
||||||
os.Mkdir("PortableApps", 0777)
|
os.Mkdir("PortableApps", 0777)
|
||||||
@@ -25,34 +36,10 @@ func setup() {
|
|||||||
if _, err = os.Open("PortableApps/LinuxPACom"); err != nil {
|
if _, err = os.Open("PortableApps/LinuxPACom"); err != nil {
|
||||||
os.Mkdir("PortableApps/LinuxPACom", 0777)
|
os.Mkdir("PortableApps/LinuxPACom", 0777)
|
||||||
}
|
}
|
||||||
fmt.Println(err)
|
|
||||||
_, err = os.Open("PortableApps/LinuxPACom/common.sh")
|
_, err = os.Open("PortableApps/LinuxPACom/common.sh")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
comEnbld = true
|
comEnbld = true
|
||||||
}
|
}
|
||||||
fi, err := os.Open("PortableApps/LinuxPACom/Info.ini")
|
|
||||||
if err != nil {
|
|
||||||
fi, err = os.Create("PortableApps/LinuxPACom/Info.ini")
|
|
||||||
if err == nil {
|
|
||||||
wrt := bufio.NewWriter(fi)
|
|
||||||
wrt.WriteString(defIni)
|
|
||||||
wrt.Flush()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
rdr := bufio.NewReader(fi)
|
|
||||||
for err != nil {
|
|
||||||
ln, _, error := rdr.ReadLine()
|
|
||||||
err = error
|
|
||||||
str := string(ln)
|
|
||||||
if strings.HasPrefix(str, "theme=") {
|
|
||||||
str = strings.TrimPrefix(str, "theme=")
|
|
||||||
if str == "lt" {
|
|
||||||
darkTheme = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PAFolds, _ := PortableAppsFold.Readdirnames(-1)
|
PAFolds, _ := PortableAppsFold.Readdirnames(-1)
|
||||||
sort.Strings(PAFolds)
|
sort.Strings(PAFolds)
|
||||||
for _, v := range PAFolds {
|
for _, v := range PAFolds {
|
||||||
@@ -95,6 +82,9 @@ func processApp(fold string) (out app) {
|
|||||||
if out.cat == "" {
|
if out.cat == "" {
|
||||||
out.cat = "Other"
|
out.cat = "Other"
|
||||||
}
|
}
|
||||||
|
if portableHide {
|
||||||
|
out.name = strings.TrimSuffix(out.name, "Portable")
|
||||||
|
}
|
||||||
out.icon = getIcon(fold)
|
out.icon = getIcon(fold)
|
||||||
folder, _ := os.Open(fold)
|
folder, _ := os.Open(fold)
|
||||||
fis, _ := folder.Readdirnames(-1)
|
fis, _ := folder.Readdirnames(-1)
|
||||||
@@ -135,6 +125,8 @@ func getCat(ini *os.File) string {
|
|||||||
if strings.HasPrefix(string(line), "Category=") {
|
if strings.HasPrefix(string(line), "Category=") {
|
||||||
ret = strings.TrimPrefix(string(line), "Category=")
|
ret = strings.TrimPrefix(string(line), "Category=")
|
||||||
break
|
break
|
||||||
|
} else if strings.HasPrefix(string(line), "category=") {
|
||||||
|
ret = strings.TrimPrefix(string(line), "category=")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rdr.Reset(ini)
|
rdr.Reset(ini)
|
||||||
@@ -148,6 +140,9 @@ func getName(ini *os.File) string {
|
|||||||
if strings.HasPrefix(string(line), "Name=") {
|
if strings.HasPrefix(string(line), "Name=") {
|
||||||
ret = strings.TrimPrefix(string(line), "Name=")
|
ret = strings.TrimPrefix(string(line), "Name=")
|
||||||
break
|
break
|
||||||
|
} else if strings.HasPrefix(string(line), "name=") {
|
||||||
|
ret = strings.TrimPrefix(string(line), "name=")
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rdr.Reset(ini)
|
rdr.Reset(ini)
|
||||||
@@ -156,7 +151,9 @@ func getName(ini *os.File) string {
|
|||||||
|
|
||||||
func getIcon(fold string) *gdk.Pixbuf {
|
func getIcon(fold string) *gdk.Pixbuf {
|
||||||
var pic string
|
var pic string
|
||||||
if folder, err := os.Open(fold + "/App/AppInfo"); err == nil {
|
if _, err := os.Open(fold + "/appicon.png"); err == nil {
|
||||||
|
pic = fold + "/appicon.png"
|
||||||
|
} else if folder, err := os.Open(fold + "/App/AppInfo"); err == nil {
|
||||||
fis, _ := folder.Readdir(-1)
|
fis, _ := folder.Readdir(-1)
|
||||||
var pics []string
|
var pics []string
|
||||||
for _, v := range fis {
|
for _, v := range fis {
|
||||||
@@ -174,11 +171,9 @@ func getIcon(fold string) *gdk.Pixbuf {
|
|||||||
}
|
}
|
||||||
pic = fold + "/App/AppInfo/" + pics[ind]
|
pic = fold + "/App/AppInfo/" + pics[ind]
|
||||||
}
|
}
|
||||||
} else if _, err := os.Open(fold + "/appicon.png"); err == nil {
|
|
||||||
pic = fold + "/appicon.png"
|
|
||||||
} else {
|
} else {
|
||||||
img, _ := gtk.ImageNewFromIconName("application-x-executable", gtk.ICON_SIZE_BUTTON)
|
img, _ := gtk.ImageNewFromIconName("application-x-executable", gtk.ICON_SIZE_BUTTON)
|
||||||
buf, _ := img.GetPixbuf().ScaleSimple(32, 32, gdk.INTERP_BILINEAR)
|
buf := img.GetPixbuf()
|
||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
img, _ := gtk.ImageNewFromFile(pic)
|
img, _ := gtk.ImageNewFromFile(pic)
|
||||||
@@ -187,6 +182,9 @@ func getIcon(fold string) *gdk.Pixbuf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func findInfo(fold string) *os.File {
|
func findInfo(fold string) *os.File {
|
||||||
|
if fi, err := os.Open(fold + "/appinfo.ini"); err == nil {
|
||||||
|
return fi
|
||||||
|
}
|
||||||
tmp, err := os.Open(fold + "/App/AppInfo")
|
tmp, err := os.Open(fold + "/App/AppInfo")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
fis, _ := tmp.Readdirnames(-1)
|
fis, _ := tmp.Readdirnames(-1)
|
||||||
@@ -197,8 +195,5 @@ func findInfo(fold string) *os.File {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if fi, err := os.Open(fold + "/appinfo.ini"); err == nil {
|
|
||||||
return fi
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"github.com/CalebQ42/LinuxPA/appimg"
|
||||||
|
|
||||||
"github.com/gotk3/gotk3/glib"
|
"github.com/gotk3/gotk3/glib"
|
||||||
"github.com/gotk3/gotk3/gtk"
|
"github.com/gotk3/gotk3/gtk"
|
||||||
)
|
)
|
||||||
@@ -15,11 +14,11 @@ func ui(win *gtk.Window) {
|
|||||||
header.SetTitle("LinuxPA")
|
header.SetTitle("LinuxPA")
|
||||||
header.SetSubtitle("PortableApps.com type launcher")
|
header.SetSubtitle("PortableApps.com type launcher")
|
||||||
settings, _ := gtk.ButtonNewFromIconName("applications-system", gtk.ICON_SIZE_SMALL_TOOLBAR)
|
settings, _ := gtk.ButtonNewFromIconName("applications-system", gtk.ICON_SIZE_SMALL_TOOLBAR)
|
||||||
settings.Connect("clicked", func() {
|
settings.SetTooltipText("Settings")
|
||||||
//Open Settings window!
|
dnl, _ := gtk.ButtonNewFromIconName("emblem-downloads", gtk.ICON_SIZE_SMALL_TOOLBAR)
|
||||||
})
|
dnl.SetTooltipText("Download Apps")
|
||||||
settings.SetTooltipText("Settings (Coming Soon!)")
|
|
||||||
header.PackStart(settings)
|
header.PackStart(settings)
|
||||||
|
header.PackEnd(dnl)
|
||||||
win.SetTitlebar(header)
|
win.SetTitlebar(header)
|
||||||
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
|
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
|
||||||
lrBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
lrBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
||||||
@@ -33,6 +32,7 @@ func ui(win *gtk.Window) {
|
|||||||
txtColumn, _ := gtk.TreeViewColumnNewWithAttribute("", txtRender, "text", 1)
|
txtColumn, _ := gtk.TreeViewColumnNewWithAttribute("", txtRender, "text", 1)
|
||||||
appsList.AppendColumn(pixColumn)
|
appsList.AppendColumn(pixColumn)
|
||||||
appsList.AppendColumn(txtColumn)
|
appsList.AppendColumn(txtColumn)
|
||||||
|
appsList.SetHeadersVisible(false)
|
||||||
catList.SetHExpand(true)
|
catList.SetHExpand(true)
|
||||||
catList.SetVExpand(true)
|
catList.SetVExpand(true)
|
||||||
appsList.SetHExpand(true)
|
appsList.SetHExpand(true)
|
||||||
@@ -43,29 +43,59 @@ func ui(win *gtk.Window) {
|
|||||||
hScrollApp, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
hScrollApp, _ := gtk.AdjustmentNew(0, 0, 0, 0, 0, 0)
|
||||||
catScrl, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat)
|
catScrl, _ := gtk.ScrolledWindowNew(hScrollCat, vScrollCat)
|
||||||
catScrl.Add(catList)
|
catScrl.Add(catList)
|
||||||
|
catScrl.SetSizeRequest(170, 500)
|
||||||
appScrl, _ := gtk.ScrolledWindowNew(hScrollApp, vScrollApp)
|
appScrl, _ := gtk.ScrolledWindowNew(hScrollApp, vScrollApp)
|
||||||
appScrl.Add(appsList)
|
appScrl.Add(appsList)
|
||||||
|
appScrl.SetSizeRequest(300, 500)
|
||||||
lrBox.Add(catScrl)
|
lrBox.Add(catScrl)
|
||||||
lrBox.Add(appScrl)
|
lrBox.Add(appScrl)
|
||||||
botBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 2)
|
botBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 2)
|
||||||
wineCheck, _ := gtk.CheckButtonNewWithLabel("Show Windows apps (Wine)")
|
botBox.SetMarginStart(10)
|
||||||
wineCheck.Connect("toggled", func() {
|
botBox.SetMarginEnd(10)
|
||||||
wine = wineCheck.GetActive()
|
botBox.SetMarginTop(10)
|
||||||
|
botBox.SetMarginBottom(10)
|
||||||
|
edit, _ := gtk.ButtonNewWithLabel("Edit App..")
|
||||||
|
edit.Connect("clicked", func() {
|
||||||
|
selec, _ := appsList.GetSelection()
|
||||||
|
_, it, ok := selec.GetSelected()
|
||||||
|
if ok {
|
||||||
|
pth, _ := store.GetPath(it)
|
||||||
|
ind := pth.GetIndices()
|
||||||
|
if wine {
|
||||||
|
appLnch := master[cats[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
|
appLnch.edit(win, func() {
|
||||||
|
store.Clear()
|
||||||
for i := range ls {
|
for i := range ls {
|
||||||
catList.Remove(catList.GetRowAtIndex(i))
|
catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1))
|
||||||
}
|
}
|
||||||
ls = getCatRows()
|
ls = getCatRows()
|
||||||
for _, v := range ls {
|
for i, v := range ls {
|
||||||
catList.Add(v)
|
catList.Insert(v, i)
|
||||||
}
|
}
|
||||||
catList.ShowAll()
|
catList.ShowAll()
|
||||||
})
|
})
|
||||||
botBox.Add(wineCheck)
|
} else {
|
||||||
|
appLnch := linmaster[lin[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
|
appLnch.edit(win, func() {
|
||||||
|
store.Clear()
|
||||||
|
for i := range ls {
|
||||||
|
catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1))
|
||||||
|
}
|
||||||
|
ls = getCatRows()
|
||||||
|
for i, v := range ls {
|
||||||
|
catList.Insert(v, i)
|
||||||
|
}
|
||||||
|
catList.ShowAll()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
botBox.PackEnd(edit, false, false, 0)
|
||||||
topLvl.Add(lrBox)
|
topLvl.Add(lrBox)
|
||||||
topLvl.PackEnd(botBox, false, true, 0)
|
topLvl.PackEnd(botBox, false, true, 0)
|
||||||
win.Add(topLvl)
|
win.Add(topLvl)
|
||||||
for _, v := range ls {
|
for _, v := range ls {
|
||||||
catList.Prepend(v)
|
catList.Add(v)
|
||||||
}
|
}
|
||||||
catList.Connect("row-selected", func() {
|
catList.Connect("row-selected", func() {
|
||||||
store.Clear()
|
store.Clear()
|
||||||
@@ -92,23 +122,54 @@ func ui(win *gtk.Window) {
|
|||||||
ind := pth.GetIndices()
|
ind := pth.GetIndices()
|
||||||
if len(ind) == 1 {
|
if len(ind) == 1 {
|
||||||
if wine {
|
if wine {
|
||||||
app := master[cats[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
appLnch := master[cats[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
app.launch()
|
appLnch.launch()
|
||||||
} else {
|
} else {
|
||||||
app := linmaster[lin[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
appLnch := linmaster[lin[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
app.launch()
|
appLnch.launch()
|
||||||
}
|
}
|
||||||
} else if len(ind) == 2 {
|
} else if len(ind) == 2 {
|
||||||
if wine {
|
if wine {
|
||||||
app := master[cats[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
appLnch := master[cats[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
app.launchSub(ind[1])
|
appLnch.launchSub(ind[1])
|
||||||
} else {
|
} else {
|
||||||
app := linmaster[lin[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
appLnch := linmaster[lin[catList.GetSelectedRow().GetIndex()]][ind[0]]
|
||||||
app.launchSub(ind[1])
|
appLnch.launchSub(ind[1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
dnl.Connect("clicked", func() {
|
||||||
|
appimg.ShowUI(versionNewest, func() {
|
||||||
|
master = make(map[string][]app)
|
||||||
|
linmaster = make(map[string][]app)
|
||||||
|
cats = make([]string, 0)
|
||||||
|
lin = make([]string, 0)
|
||||||
|
setup()
|
||||||
|
store.Clear()
|
||||||
|
for i := range ls {
|
||||||
|
catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1))
|
||||||
|
}
|
||||||
|
ls = getCatRows()
|
||||||
|
for i, v := range ls {
|
||||||
|
catList.Insert(v, i)
|
||||||
|
}
|
||||||
|
catList.ShowAll()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
settings.Connect("clicked", func() {
|
||||||
|
settingsUI(win, func() {
|
||||||
|
store.Clear()
|
||||||
|
for i := range ls {
|
||||||
|
catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1))
|
||||||
|
}
|
||||||
|
ls = getCatRows()
|
||||||
|
for i, v := range ls {
|
||||||
|
catList.Insert(v, i)
|
||||||
|
}
|
||||||
|
catList.ShowAll()
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCatRows() (out []*gtk.Label) {
|
func getCatRows() (out []*gtk.Label) {
|
||||||
@@ -116,13 +177,11 @@ func getCatRows() (out []*gtk.Label) {
|
|||||||
for _, v := range cats {
|
for _, v := range cats {
|
||||||
txt, _ := gtk.LabelNew(v)
|
txt, _ := gtk.LabelNew(v)
|
||||||
out = append(out, txt)
|
out = append(out, txt)
|
||||||
fmt.Println(v)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for _, v := range lin {
|
for _, v := range lin {
|
||||||
txt, _ := gtk.LabelNew(v)
|
txt, _ := gtk.LabelNew(v)
|
||||||
out = append(out, txt)
|
out = append(out, txt)
|
||||||
fmt.Println(v)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ func downloadUpdate(newVersion string) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func update(win *gtk.Window) {
|
func update(win *gtk.Window) {
|
||||||
updateWin, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
updateWin, _ := gtk.WindowNew(gtk.WINDOW_POPUP)
|
||||||
updateWin.SetTransientFor(win)
|
updateWin.SetTransientFor(win)
|
||||||
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
spin, _ := gtk.SpinnerNew()
|
spin, _ := gtk.SpinnerNew()
|
||||||
@@ -129,6 +129,7 @@ func update(win *gtk.Window) {
|
|||||||
updateWin.ShowAll()
|
updateWin.ShowAll()
|
||||||
updateWin.Show()
|
updateWin.Show()
|
||||||
go func(win, updateWin *gtk.Window) {
|
go func(win, updateWin *gtk.Window) {
|
||||||
|
defer updateWin.Close()
|
||||||
stat, err := versionDL()
|
stat, err := versionDL()
|
||||||
if stat {
|
if stat {
|
||||||
res := getVersionFileInfo()
|
res := getVersionFileInfo()
|
||||||
@@ -137,7 +138,6 @@ func update(win *gtk.Window) {
|
|||||||
if stat {
|
if stat {
|
||||||
lbl.SetText("Updating!")
|
lbl.SetText("Updating!")
|
||||||
downloadUpdate(res)
|
downloadUpdate(res)
|
||||||
updateWin.Close()
|
|
||||||
win.Close()
|
win.Close()
|
||||||
cmd := exec.Command("./LinuxPA")
|
cmd := exec.Command("./LinuxPA")
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
@@ -145,15 +145,12 @@ func update(win *gtk.Window) {
|
|||||||
cmd.Start()
|
cmd.Start()
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
updateWin.Close()
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("Failed Version File Info")
|
fmt.Println("Failed Version File Info")
|
||||||
updateWin.Close()
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
updateWin.Close()
|
|
||||||
}
|
}
|
||||||
}(win, updateWin)
|
}(win, updateWin)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gotk3/gotk3/gtk"
|
||||||
"github.com/mholt/archiver"
|
"github.com/mholt/archiver"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,12 +16,36 @@ const (
|
|||||||
wineURL = "https://www.playonlinux.com/wine/binaries/linux-amd64/PlayOnLinux-wine-2.5-linux-amd64.pol"
|
wineURL = "https://www.playonlinux.com/wine/binaries/linux-amd64/PlayOnLinux-wine-2.5-linux-amd64.pol"
|
||||||
)
|
)
|
||||||
|
|
||||||
func downloadWine() (bool, error) {
|
func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||||
|
win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
|
||||||
|
win.SetTransientFor(parent)
|
||||||
|
win.SetDestroyWithParent(true)
|
||||||
|
win.Connect("destroy", func() {
|
||||||
|
parent.SetSensitive(true)
|
||||||
|
})
|
||||||
|
parent.SetSensitive(false)
|
||||||
|
spin, _ := gtk.SpinnerNew()
|
||||||
|
spin.Start()
|
||||||
|
txt, _ := gtk.LabelNew("Downloading Wine")
|
||||||
|
box, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 5)
|
||||||
|
box.SetMarginBottom(10)
|
||||||
|
box.SetMarginEnd(10)
|
||||||
|
box.SetMarginStart(10)
|
||||||
|
box.SetMarginTop(10)
|
||||||
|
box.Add(spin)
|
||||||
|
box.Add(txt)
|
||||||
|
win.Add(box)
|
||||||
|
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||||
|
win.ShowAll()
|
||||||
|
win.Show()
|
||||||
|
go func(win *gtk.Window, txt *gtk.Label) {
|
||||||
|
defer win.Close()
|
||||||
wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2")
|
wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
}
|
}
|
||||||
wineTar.Chmod(0777)
|
|
||||||
defer wineTar.Close()
|
defer wineTar.Close()
|
||||||
check := http.Client{
|
check := http.Client{
|
||||||
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
||||||
@@ -27,16 +55,47 @@ func downloadWine() (bool, error) {
|
|||||||
}
|
}
|
||||||
resp, err := check.Get(wineURL)
|
resp, err := check.Get(wineURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
os.RemoveAll("PortableApps/LinuxPACom/Wine")
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
_, err = io.Copy(wineTar, resp.Body)
|
_, err = io.Copy(wineTar, resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
txt.SetText("Extracting Wine")
|
||||||
err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine")
|
err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
}
|
}
|
||||||
return true, nil
|
fil, err := os.Open("PortableApps/LinuxPACom/common.sh")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tmp, err := ioutil.ReadAll(fil)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !strings.Contains(string(tmp), "export PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH") {
|
||||||
|
tmp = append(tmp, []byte("\nexport PATH=$PWD/PortableApps/LinuxPACom/Wine/wineversion/2.5/bin:$PATH")...)
|
||||||
|
ioutil.WriteFile("PortableApps/LinuxPACom/common.sh", tmp, 0777)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
cb <- false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb <- true
|
||||||
|
return
|
||||||
|
}(win, txt)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user