Reduce startup time
parent
eee628190b
commit
cabbf45d36
|
@ -1,3 +1,6 @@
|
|||
0.2.4:
|
||||
- Add -version flag
|
||||
|
||||
0.2.3:
|
||||
- gmenu: Resolve search not always updating app list
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue