Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a0213d1886 | |||
| 695ce815d9 | |||
| 01556c1eb0 | |||
| d7410bb88f | |||
| bc63e6d10f | |||
| 0403825c3d | |||
| 0f1bb3fabd | |||
| 78c6842fab | |||
| dc1edbad3a |
@@ -30,8 +30,6 @@ Photos are found [Here](https://goo.gl/photos/VtBUL6DyZTMidj5n6)
|
||||
|
||||
# TODO (Might be in order)
|
||||
1. MAKE IT BETTER
|
||||
1. Add settings menu
|
||||
1. Add updater for .AppImage files
|
||||
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. 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)
|
||||
|
||||
@@ -25,9 +25,16 @@ func (a *app) getTreeIter(store *gtk.TreeStore) *gtk.TreeIter {
|
||||
store.SetValue(it, 0, a.icon)
|
||||
store.SetValue(it, 1, a.name)
|
||||
if len(a.ex) > 1 {
|
||||
for _, v := range a.ex {
|
||||
i := store.Append(it)
|
||||
store.SetValue(i, 1, v)
|
||||
if wine {
|
||||
for _, v := range a.ex {
|
||||
i := store.Append(it)
|
||||
store.SetValue(i, 1, v)
|
||||
}
|
||||
} else {
|
||||
for _, v := range a.lin {
|
||||
i := store.Append(it)
|
||||
store.SetValue(i, 1, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
return it
|
||||
@@ -38,7 +45,11 @@ func (a *app) launch() {
|
||||
if wine {
|
||||
var cmd *exec.Cmd
|
||||
if !contains(a.lin, a.ex[0]) {
|
||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+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]+"\"")
|
||||
}
|
||||
} else {
|
||||
if comEnbld {
|
||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[0]+"\"")
|
||||
@@ -64,7 +75,11 @@ func (a *app) launch() {
|
||||
if wine {
|
||||
var cmd *exec.Cmd
|
||||
if len(a.lin) == 0 {
|
||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+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]+"\"")
|
||||
}
|
||||
} else {
|
||||
var ind int
|
||||
for i, v := range a.lin {
|
||||
@@ -109,7 +124,11 @@ func (a *app) launchSub(sub int) {
|
||||
if wine {
|
||||
var cmd *exec.Cmd
|
||||
if !contains(a.lin, a.ex[sub]) {
|
||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; wine \""+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]+"\"")
|
||||
}
|
||||
} else {
|
||||
if comEnbld {
|
||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||
@@ -120,189 +139,15 @@ func (a *app) launchSub(sub int) {
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Start()
|
||||
}
|
||||
var cmd *exec.Cmd
|
||||
if comEnbld {
|
||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||
} else {
|
||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||
var cmd *exec.Cmd
|
||||
if comEnbld {
|
||||
cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||
} else {
|
||||
cmd = exec.Command("/bin/sh", "-c", "cd \""+a.dir+"\"; \"./"+a.ex[sub]+"\"")
|
||||
}
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Start()
|
||||
}
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Start()
|
||||
}
|
||||
|
||||
// type appExNode struct {
|
||||
// ap app
|
||||
// exInd int
|
||||
// }
|
||||
//
|
||||
// func (a *appExNode) launch() {
|
||||
// if wine {
|
||||
// var cmd *exec.Cmd
|
||||
// if !contains(a.ap.lin, a.ap.ex[a.exInd]) {
|
||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; wine \""+a.ap.ex[a.exInd]+"\"")
|
||||
// } else {
|
||||
// if comEnbld {
|
||||
// cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
||||
// } else {
|
||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
||||
// }
|
||||
// }
|
||||
// cmd.Stdout = os.Stdout
|
||||
// cmd.Stderr = os.Stderr
|
||||
// cmd.Start()
|
||||
// }
|
||||
// var cmd *exec.Cmd
|
||||
// if comEnbld {
|
||||
// cmd = exec.Command("/bin/sh", "-c", ". PortableApps/LinuxPACom/common.sh || exit 1;cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
||||
// } else {
|
||||
// cmd = exec.Command("/bin/sh", "-c", "cd \""+a.ap.dir+"\"; \"./"+a.ap.ex[a.exInd]+"\"")
|
||||
// }
|
||||
// cmd.Stdout = os.Stdout
|
||||
// cmd.Stderr = os.Stderr
|
||||
// cmd.Start()
|
||||
// }
|
||||
|
||||
// func (a *appExNode) Count() int {
|
||||
// return 0
|
||||
// }
|
||||
//
|
||||
// func (a *appExNode) NodeAt(int) gxui.TreeNode {
|
||||
// return nil
|
||||
// }
|
||||
//
|
||||
// func (a *appExNode) ItemIndex(gxui.AdapterItem) int {
|
||||
// return -1
|
||||
// }
|
||||
//
|
||||
// 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,11 @@
|
||||
package appimg
|
||||
|
||||
type appimg struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func newApp(name string) appimg {
|
||||
var out appimg
|
||||
out.name = name
|
||||
return out
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
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.name + "...")
|
||||
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.name)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
name := strings.Split(ap.name, "-")[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, 0777)
|
||||
foldName = "PortableApps/" + name
|
||||
}
|
||||
fil, err := os.Create(foldName + "/" + ap.name)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
io.Copy(fil, resp.Body)
|
||||
_ = fil.Chmod(0777)
|
||||
}(win, ap)
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
//Package appimg is for downloading new AppImages for LinuxPA
|
||||
package appimg
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"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(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) {
|
||||
for i := range apch {
|
||||
glib.IdleAdd(func(list *gtk.ListBox, i appimg) {
|
||||
lbl, _ := gtk.LabelNew(i.name)
|
||||
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)
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/gob"
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/gotk3/gotk3/gtk"
|
||||
)
|
||||
@@ -20,10 +22,10 @@ var (
|
||||
wine bool
|
||||
comEnbld bool
|
||||
wineAvail bool
|
||||
showMsg = true
|
||||
)
|
||||
|
||||
func main() {
|
||||
runtime.GOMAXPROCS(4)
|
||||
os.MkdirAll("PortableApps/LinuxPACom", 0777)
|
||||
master = make(map[string][]app)
|
||||
linmaster = make(map[string][]app)
|
||||
@@ -39,6 +41,7 @@ func uiStart() {
|
||||
}
|
||||
win.SetTitle("LinuxPA")
|
||||
win.Connect("destroy", func() {
|
||||
savePrefs()
|
||||
gtk.MainQuit()
|
||||
})
|
||||
win.SetDefaultSize(500, 500)
|
||||
@@ -50,6 +53,27 @@ func uiStart() {
|
||||
gtk.Main()
|
||||
}
|
||||
|
||||
func savePrefs() {
|
||||
fil, err := os.Open("PortableApps/LinuxPACom/Prefs.gob")
|
||||
if os.IsNotExist(err) {
|
||||
fil, err = os.Create("PortableApps/LinuxPACom/Prefs.gob")
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
enc := gob.NewEncoder(fil)
|
||||
enc.Encode(wine)
|
||||
}
|
||||
|
||||
func loadPrefs() {
|
||||
fil, err := os.Open("PortableApps/LinuxPACom/Prefs.gob")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
dec := gob.NewDecoder(fil)
|
||||
dec.Decode(&wine)
|
||||
}
|
||||
|
||||
func contains(arr []string, str string) bool {
|
||||
for _, v := range arr {
|
||||
if v == str {
|
||||
|
||||
@@ -2,7 +2,6 @@ package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
_ "image/png"
|
||||
"os"
|
||||
"os/exec"
|
||||
@@ -15,6 +14,7 @@ import (
|
||||
)
|
||||
|
||||
func setup() {
|
||||
loadPrefs()
|
||||
if _, err := os.Open("PortableApps/LinuxPACom/Wine"); os.IsNotExist(err) {
|
||||
if _, errd := exec.LookPath("wine"); errd == nil {
|
||||
wineAvail = true
|
||||
@@ -22,6 +22,9 @@ func setup() {
|
||||
} else if err == nil {
|
||||
wineAvail = true
|
||||
}
|
||||
if !wineAvail {
|
||||
wine = false
|
||||
}
|
||||
PortableAppsFold, err := os.Open("PortableApps")
|
||||
if PAStat, _ := PortableAppsFold.Stat(); err != nil || !PAStat.IsDir() {
|
||||
os.Mkdir("PortableApps", 0777)
|
||||
@@ -33,15 +36,10 @@ func setup() {
|
||||
if _, err = os.Open("PortableApps/LinuxPACom"); err != nil {
|
||||
os.Mkdir("PortableApps/LinuxPACom", 0777)
|
||||
}
|
||||
fmt.Println(err)
|
||||
_, err = os.Open("PortableApps/LinuxPACom/common.sh")
|
||||
if err == nil {
|
||||
comEnbld = true
|
||||
}
|
||||
_, err = os.Open("PortableApps/LinuxPACom/Info.ini")
|
||||
if err != nil {
|
||||
os.Create("PortableApps/LinuxPACom/Info.ini")
|
||||
}
|
||||
PAFolds, _ := PortableAppsFold.Readdirnames(-1)
|
||||
sort.Strings(PAFolds)
|
||||
for _, v := range PAFolds {
|
||||
@@ -124,6 +122,8 @@ func getCat(ini *os.File) string {
|
||||
if strings.HasPrefix(string(line), "Category=") {
|
||||
ret = strings.TrimPrefix(string(line), "Category=")
|
||||
break
|
||||
} else if strings.HasPrefix(string(line), "category=") {
|
||||
ret = strings.TrimPrefix(string(line), "category=")
|
||||
}
|
||||
}
|
||||
rdr.Reset(ini)
|
||||
@@ -137,6 +137,9 @@ func getName(ini *os.File) string {
|
||||
if strings.HasPrefix(string(line), "Name=") {
|
||||
ret = strings.TrimPrefix(string(line), "Name=")
|
||||
break
|
||||
} else if strings.HasPrefix(string(line), "name=") {
|
||||
ret = strings.TrimPrefix(string(line), "name=")
|
||||
break
|
||||
}
|
||||
}
|
||||
rdr.Reset(ini)
|
||||
@@ -167,7 +170,7 @@ func getIcon(fold string) *gdk.Pixbuf {
|
||||
pic = fold + "/appicon.png"
|
||||
} else {
|
||||
img, _ := gtk.ImageNewFromIconName("application-x-executable", gtk.ICON_SIZE_BUTTON)
|
||||
buf, _ := img.GetPixbuf().ScaleSimple(32, 32, gdk.INTERP_BILINEAR)
|
||||
buf := img.GetPixbuf()
|
||||
return buf
|
||||
}
|
||||
img, _ := gtk.ImageNewFromFile(pic)
|
||||
|
||||
@@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/CalebQ42/LinuxPA/appimg"
|
||||
"github.com/gotk3/gotk3/glib"
|
||||
"github.com/gotk3/gotk3/gtk"
|
||||
)
|
||||
@@ -18,8 +19,11 @@ func ui(win *gtk.Window) {
|
||||
settings.Connect("clicked", func() {
|
||||
settingsUI()
|
||||
})
|
||||
settings.SetTooltipText("Settings (Coming Soon!)")
|
||||
settings.SetTooltipText("Settings")
|
||||
dnl, _ := gtk.ButtonNewFromIconName("emblem-downloads", gtk.ICON_SIZE_SMALL_TOOLBAR)
|
||||
dnl.SetTooltipText("Download Apps")
|
||||
header.PackStart(settings)
|
||||
header.PackEnd(dnl)
|
||||
win.SetTitlebar(header)
|
||||
topLvl, _ := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0)
|
||||
lrBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 5)
|
||||
@@ -56,10 +60,12 @@ func ui(win *gtk.Window) {
|
||||
wineCheck.SetSensitive(false)
|
||||
wineCheck.SetTooltipText("Download wine to run windows apps")
|
||||
}
|
||||
wineCheck.SetActive(wine)
|
||||
wineCheck.Connect("toggled", func() {
|
||||
wine = wineCheck.GetActive()
|
||||
for i := range ls {
|
||||
catList.Remove(catList.GetRowAtIndex(i))
|
||||
fmt.Println(len(ls) - i)
|
||||
catList.Remove(catList.GetRowAtIndex(len(ls) - i - 1))
|
||||
}
|
||||
ls = getCatRows()
|
||||
for _, v := range ls {
|
||||
@@ -72,7 +78,7 @@ func ui(win *gtk.Window) {
|
||||
topLvl.PackEnd(botBox, false, true, 0)
|
||||
win.Add(topLvl)
|
||||
for _, v := range ls {
|
||||
catList.Prepend(v)
|
||||
catList.Add(v)
|
||||
}
|
||||
catList.Connect("row-selected", func() {
|
||||
store.Clear()
|
||||
@@ -116,6 +122,15 @@ func ui(win *gtk.Window) {
|
||||
}
|
||||
}
|
||||
})
|
||||
dnl.Connect("clicked", func() {
|
||||
appimg.ShowUI(func() {
|
||||
store.Clear()
|
||||
ls = getCatRows()
|
||||
for _, v := range ls {
|
||||
catList.Add(v)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func getCatRows() (out []*gtk.Label) {
|
||||
@@ -123,13 +138,11 @@ func getCatRows() (out []*gtk.Label) {
|
||||
for _, v := range cats {
|
||||
txt, _ := gtk.LabelNew(v)
|
||||
out = append(out, txt)
|
||||
fmt.Println(v)
|
||||
}
|
||||
} else {
|
||||
for _, v := range lin {
|
||||
txt, _ := gtk.LabelNew(v)
|
||||
out = append(out, txt)
|
||||
fmt.Println(v)
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
@@ -19,6 +19,11 @@ const (
|
||||
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")
|
||||
@@ -33,7 +38,7 @@ func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||
win.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT)
|
||||
win.ShowAll()
|
||||
win.Show()
|
||||
go func(win *gtk.Window) {
|
||||
go func(win *gtk.Window, txt *gtk.Label) {
|
||||
defer win.Close()
|
||||
wineTar, err := os.Create("PortableApps/LinuxPACom/wine2.5.tar.bz2")
|
||||
if err != nil {
|
||||
@@ -41,7 +46,6 @@ func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||
cb <- false
|
||||
return
|
||||
}
|
||||
wineTar.Chmod(0777)
|
||||
defer wineTar.Close()
|
||||
check := http.Client{
|
||||
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
||||
@@ -55,6 +59,7 @@ func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||
cb <- false
|
||||
return
|
||||
}
|
||||
os.RemoveAll("PortableApps/LinuxPACom/Wine")
|
||||
defer resp.Body.Close()
|
||||
_, err = io.Copy(wineTar, resp.Body)
|
||||
if err != nil {
|
||||
@@ -63,14 +68,12 @@ func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||
return
|
||||
}
|
||||
txt.SetText("Extracting Wine")
|
||||
os.RemoveAll("PortableApps/LinuxPACom/Wine")
|
||||
err = archiver.TarBz2.Open("PortableApps/LinuxPACom/wine2.5.tar.bz2", "PortableApps/LinuxPACom/Wine")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
cb <- false
|
||||
return
|
||||
}
|
||||
os.Remove("PortableApps/LinuxPACom/wine2.5.tar.bz2")
|
||||
fil, err := os.Open("PortableApps/LinuxPACom/common.sh")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
@@ -83,19 +86,16 @@ func downloadWine(parent *gtk.Window, cb chan bool) {
|
||||
cb <- false
|
||||
return
|
||||
}
|
||||
fmt.Println("Hello")
|
||||
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)
|
||||
fmt.Println("Hello2")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
cb <- false
|
||||
return
|
||||
}
|
||||
}
|
||||
fmt.Println("HelloT")
|
||||
cb <- true
|
||||
return
|
||||
}(win)
|
||||
}(win, txt)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user