Reduce startup time

pull/9/head
Trevor Slocum 2019-11-15 09:52:22 -08:00
parent eee628190b
commit cabbf45d36
3 changed files with 84 additions and 54 deletions

View File

@ -1,3 +1,6 @@
0.2.4:
- Add -version flag
0.2.3:
- gmenu: Resolve search not always updating app list

View File

@ -40,14 +40,23 @@ func initList(container *gtk.Box) {
buffer, err := inputView.GetBuffer()
if err != nil {
log.Fatal("failed to create ListBox:", err)
log.Fatal("failed to create input buffer:", err)
}
_, err = buffer.Connect("changed", func(tb *gtk.TextBuffer) bool {
gmenu.SetInput(strings.TrimSpace(textViewText(inputView)))
return false
})
if err != nil {
log.Fatal("failed to connect to changed event of input buffer:", err)
}
container.Add(inputView)
listScroll, err := gtk.ScrolledWindowNew(nil, nil)
if err != nil {
log.Fatal("failed to create ListBox:", err)
log.Fatal("failed to create ScrolledWindow:", err)
}
listScroll.SetHExpand(true)
listScroll.SetVExpand(false)
@ -60,16 +69,6 @@ func initList(container *gtk.Box) {
listBox.SetHExpand(false)
listBox.SetFocusOnClick(false)
_, err = listBox.Connect("row-activated", func(_ *gtk.ListBox, _ *gtk.ListBoxRow) {
err := listSelect(inputView, false)
if err != nil {
log.Fatal(err)
}
})
if err != nil {
log.Fatal("failed to create ListBox:", err)
}
listScroll.Add(listBox)
container.PackEnd(listScroll, true, true, 0)
@ -111,27 +110,27 @@ func initList(container *gtk.Box) {
listBox.SetSortFunc(listSort, 0)
listBox.SetFilterFunc(listFilter, 0)
listBox.SelectRow(listBox.GetRowAtIndex(0))
_, err = buffer.Connect("changed", func(tb *gtk.TextBuffer) bool {
gmenu.SetInput(strings.TrimSpace(textViewText(inputView)))
return false
_, err = listBox.Connect("row-activated", func(_ *gtk.ListBox, _ *gtk.ListBoxRow) {
err := listSelect(inputView, false)
if err != nil {
log.Fatal(err)
}
})
if err != nil {
log.Fatal("failed to create ListBox:", err)
log.Fatal("failed to connect to row-activated event of ListBox:", err)
}
listBox.SelectRow(listBox.GetRowAtIndex(0))
gmenu.SetInput("")
}
func initRow(container *gtk.Box, entry *gmenu.ListEntry, i int, lastEntry int) {
if !config.HideAppIcons {
img, _ := gtk.ImageNew()
img.SetSizeRequest(iconSize, iconSize)
glib.IdleAdd(func() { loadIconImage(img, entry) })
container.PackStart(img, false, false, 0)
glib.IdleAdd(func() { loadIconImage(img, entry) })
}
labelContainer := newBox(gtk.ORIENTATION_VERTICAL)
@ -203,11 +202,15 @@ func initLabel(l *gtk.Label) {
}
func loadIconImage(img *gtk.Image, entry *gmenu.ListEntry) {
img.SetMarginStart(iconMarginStart)
img.SetMarginTop(iconMargin)
img.SetMarginEnd(iconMargin)
img.SetMarginBottom(iconMargin)
var (
pbuf *gdk.Pixbuf
err error
)
if entry.Entry != nil && entry.Icon != "" {
pbuf, err = loadIcon(entry.Icon)
}
@ -217,12 +220,8 @@ func loadIconImage(img *gtk.Image, entry *gmenu.ListEntry) {
if err != nil {
log.Fatal("failed to create Icon:", err)
}
img.SetFromPixbuf(pbuf)
img.SetMarginStart(iconMarginStart)
img.SetMarginTop(iconMargin)
img.SetMarginEnd(iconMargin)
img.SetMarginBottom(iconMargin)
img.SetFromPixbuf(pbuf)
}
func updateList(input string) {
@ -388,10 +387,7 @@ func fallbackIcon(entry *gmenu.ListEntry) string {
}
func setupKeyBindings(w *gtk.Window) {
_, err := w.Connect("key-press-event", handleKeybinding)
if err != nil {
log.Fatal("failed to connect key-press-event:", err)
}
}
func handleKeybinding(_ *gtk.Window, ev *gdk.Event) bool {

View File

@ -6,6 +6,7 @@ import (
"log"
"os"
"path"
"runtime/pprof"
"time"
"git.sr.ht/~tslocum/gmenu/pkg/gmenu"
@ -26,6 +27,8 @@ type Config struct {
Fullscreen bool
HideAppIcons bool
CPUProfile string
}
var (
@ -33,8 +36,12 @@ var (
listBox *gtk.ListBox
inputView *gtk.TextView
t = time.Now()
loaded = make(chan bool)
t = time.Now()
loaded = make(chan bool)
loadedGTK = make(chan bool)
profileCPU *os.File
container *gtk.Box
)
func init() {
@ -45,11 +52,10 @@ func init() {
flag.BoolVar(&config.Resizable, "resizable", false, "allow window to be resized")
flag.BoolVar(&config.Fullscreen, "fullscreen", false, "start fullscreen")
flag.BoolVar(&config.HideAppIcons, "no-icons", false, "hide application icons")
flag.StringVar(&config.CPUProfile, "cpuprofile", "", "write cpu profile")
}
func load() {
flag.Parse()
if config.PrintVersion {
fmt.Printf(gmenu.VersionInfo, "gtkmenu", gmenu.Version)
return
@ -75,21 +81,56 @@ func load() {
gmenu.Names = append(gmenu.Names, "")
gmenu.FilteredEntries = append(gmenu.FilteredEntries, &gmenu.ListEntry{Label: "", Entry: nil})
go gmenu.HandleInput(func(input string) {
_, err := glib.IdleAdd(updateList, input)
if err != nil {
log.Fatal(err)
}
})
loaded <- true
}
func main() {
flag.Parse()
if config.CPUProfile != "" {
var err error
profileCPU, err = os.Create(config.CPUProfile)
if err != nil {
log.Fatal(err)
}
err = pprof.StartCPUProfile(profileCPU)
if err != nil {
log.Fatal(err)
}
}
go load()
gtk.Init(nil)
container = newBox(gtk.ORIENTATION_VERTICAL)
w, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
if err != nil {
log.Fatal("failed to create application window:", err)
}
w.SetTitle("gmenu")
_, err = w.Connect("key-press-event", handleKeybinding)
if err != nil {
log.Fatal("failed to connect key-press-event:", err)
}
_, err = w.Connect("destroy", func() {
os.Exit(0)
})
if err != nil {
log.Fatal("failed to create application window:", err)
}
w.SetTitle("gmenu")
w.SetDecorated(false)
w.SetBorderWidth(0)
w.Stick()
@ -104,31 +145,21 @@ func main() {
w.Fullscreen()
}
_, err = w.Connect("destroy", func() {
os.Exit(0)
})
if err != nil {
log.Fatal("failed to create application window:", err)
}
setupKeyBindings(w)
go gmenu.HandleInput(func(input string) {
_, err := glib.IdleAdd(updateList, input)
if err != nil {
log.Fatal(err)
}
})
w.ShowNow()
<-loaded
container := newBox(gtk.ORIENTATION_VERTICAL)
initList(container)
w.Add(container)
w.SetFocus(&inputView.Widget)
w.ShowAll()
if config.CPUProfile != "" {
pprof.StopCPUProfile()
profileCPU.Close()
return
}
gtk.Main()
}