diff --git a/bin/nwg-drawer b/bin/nwg-drawer index 2f073d1..35f5a7e 100755 Binary files a/bin/nwg-drawer and b/bin/nwg-drawer differ diff --git a/main.go b/main.go index 046573d..039bc21 100644 --- a/main.go +++ b/main.go @@ -102,6 +102,8 @@ var ( userDirsMap map[string]string appFlowBox *gtk.FlowBox appFlowBoxWrapper *gtk.Box + pinnedFlowBox *gtk.FlowBox + pinnedFlowBoxWrapper *gtk.Box catButtons []*gtk.Button ) @@ -109,14 +111,13 @@ var ( var cssFileName = flag.String("s", "drawer.css", "Styling: css file name") var targetOutput = flag.String("o", "", "name of the Output to display the menu on") var displayVersion = flag.Bool("v", false, "display Version information") -var autohide = flag.Bool("d", false, "auto-hiDe: close window when left") var valign = flag.String("va", "bottom", "Vertical Alignment: \"bottom\" or \"top\"") var halign = flag.String("ha", "left", "Horizontal Alignment: \"left\" or \"right\"") var marginTop = flag.Int("mt", 0, "Margin Top") var marginLeft = flag.Int("ml", 0, "Margin Left") var marginRight = flag.Int("mr", 0, "Margin Right") var marginBottom = flag.Int("mb", 0, "Margin Bottom") -var iconSizeLarge = flag.Int("isl", 32, "Icon Size Large") +var iconSizeLarge = flag.Int("isl", 48, "Icon Size Large") var iconSizeSmall = flag.Int("iss", 16, "Icon Size Small") var itemPadding = flag.Uint("padding", 2, "vertical item padding") var lang = flag.String("lang", "", "force lang, e.g. \"en\", \"pl\"") @@ -159,12 +160,6 @@ func main() { if err == nil { i, err := strconv.Atoi(pid) if err == nil { - /*if !*autohide { - println("Running instance found, sending SIGTERM and exiting...") - syscall.Kill(i, syscall.SIGTERM) - } else { - println("Already running") - }*/ println("Running instance found, sending SIGTERM and exiting...") syscall.Kill(i, syscall.SIGTERM) } @@ -282,12 +277,10 @@ func main() { // Close the window on leave, but not immediately, to avoid accidental closes win.Connect("leave-notify-event", func() { - if *autohide { - src, err = glib.TimeoutAdd(uint(1000), func() bool { - gtk.MainQuit() - return false - }) - } + src, err = glib.TimeoutAdd(uint(500), func() bool { + gtk.MainQuit() + return false + }) }) win.Connect("enter-notify-event", func() { @@ -298,7 +291,6 @@ func main() { win.Add(outerBox) alignmentBox, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0) - //alignmentBox.SetHomogeneous(true) outerBox.PackStart(alignmentBox, true, true, 0) leftBox, _ = gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0) @@ -335,6 +327,12 @@ func main() { wrapper.PackEnd(searchEntry, true, false, 0) rightColumn.PackStart(wrapper, false, false, 10) + wrapper, _ = gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0) + pinnedFlowBoxWrapper, _ = gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0) + pinnedFlowBox = setUpPinnedFlowBox() + wrapper.PackStart(pinnedFlowBoxWrapper, true, false, 0) + rightColumn.PackStart(wrapper, false, false, 10) + wrapper, _ = gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0) categoriesMenuBar := setUpCategoriesButtonBox() wrapper.PackStart(categoriesMenuBar, true, false, 0) @@ -357,6 +355,10 @@ func main() { }) resultWrapper.PackStart(resultWindow, true, true, 0) + /*pinnedFlowBoxWrapper, _ = gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0) + resultWindow.Add(pinnedFlowBoxWrapper) + pinnedFlowBox = setUpPinnedFlowBox()*/ + appFlowBoxWrapper, _ = gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 0) resultWindow.Add(appFlowBoxWrapper) appFlowBox = setUpAppsFlowBox(nil, "") diff --git a/uicomponents.go b/uicomponents.go index 56cd312..2e50b60 100644 --- a/uicomponents.go +++ b/uicomponents.go @@ -82,6 +82,69 @@ func setUpPinnedListBoxRow(desktopID string) *gtk.ListBoxRow { return row } +func setUpPinnedFlowBox() *gtk.FlowBox { + if pinnedFlowBox != nil { + pinnedFlowBox.Destroy() + } + flowBox, _ := gtk.FlowBoxNew() + flowBox.SetMaxChildrenPerLine(6) + flowBox.SetColumnSpacing(20) + flowBox.SetHomogeneous(true) + flowBox.SetRowSpacing(20) + + if len(pinned) > 0 { + for _, desktopID := range pinned { + entry := id2entry[desktopID] + + btn, _ := gtk.ButtonNew() + pixbuf, _ := createPixbuf(entry.Icon, *iconSizeLarge) + img, err := gtk.ImageNewFromPixbuf(pixbuf) + if err != nil { + println(err, entry.Icon) + } + btn.SetImage(img) + btn.SetAlwaysShowImage(true) + btn.SetImagePosition(gtk.POS_TOP) + + name := "" + if entry.NameLoc != "" { + name = entry.NameLoc + } else { + name = entry.Name + } + if len(name) > 20 { + name = fmt.Sprintf("%s...", name[:17]) + } + btn.SetLabel(name) + + btn.Connect("button-release-event", func(row *gtk.Button, e *gdk.Event) bool { + btnEvent := gdk.EventButtonNewFromEvent(e) + if btnEvent.Button() == 1 { + launch(entry.Exec, entry.Terminal) + return true + } else if btnEvent.Button() == 3 { + unpinItem(entry.DesktopID) + pinnedFlowBox = setUpPinnedFlowBox() + return true + } + return false + }) + + flowBox.Add(btn) + } + } + + flowBox.Connect("enter-notify-event", func() { + cancelClose() + restoreButtonBox() + }) + + pinnedFlowBoxWrapper.PackStart(flowBox, true, true, 0) + flowBox.ShowAll() + + return flowBox +} + func setUpCategoriesListBox() *gtk.ListBox { listBox, _ := gtk.ListBoxNew() for _, cat := range categories { @@ -410,36 +473,12 @@ func setUpAppsFlowBox(categoryList []string, searchPhrase string) *gtk.FlowBox { for _, entry := range desktopEntries { if categoryList != nil { if !entry.NoDisplay && isIn(categoryList, entry.DesktopID) { - button, _ := gtk.ButtonNew() - button.SetAlwaysShowImage(true) - - pixbuf, _ := createPixbuf(entry.Icon, *iconSizeLarge) - img, _ := gtk.ImageNewFromPixbuf(pixbuf) - button.SetImage(img) - button.SetImagePosition(gtk.POS_TOP) - name := entry.NameLoc - if len(name) > 20 { - name = fmt.Sprintf("%s...", name[:17]) - } - button.SetLabel(name) - + button := flowBoxButton(entry) flowBox.Add(button) } } else { if !entry.NoDisplay { - button, _ := gtk.ButtonNew() - button.SetAlwaysShowImage(true) - - pixbuf, _ := createPixbuf(entry.Icon, *iconSizeLarge) - img, _ := gtk.ImageNewFromPixbuf(pixbuf) - button.SetImage(img) - button.SetImagePosition(gtk.POS_TOP) - name := entry.NameLoc - if len(name) > 20 { - name = fmt.Sprintf("%s...", name[:17]) - } - button.SetLabel(name) - + button := flowBoxButton(entry) flowBox.Add(button) } } @@ -450,6 +489,37 @@ func setUpAppsFlowBox(categoryList []string, searchPhrase string) *gtk.FlowBox { return flowBox } +func flowBoxButton(entry desktopEntry) *gtk.Button { + button, _ := gtk.ButtonNew() + button.SetAlwaysShowImage(true) + + pixbuf, _ := createPixbuf(entry.Icon, *iconSizeLarge) + img, _ := gtk.ImageNewFromPixbuf(pixbuf) + button.SetImage(img) + button.SetImagePosition(gtk.POS_TOP) + name := entry.NameLoc + if len(name) > 20 { + name = fmt.Sprintf("%s...", name[:17]) + } + button.SetLabel(name) + + ID := entry.DesktopID + exec := entry.Exec + terminal := entry.Terminal + button.Connect("button-release-event", func(row *gtk.Button, e *gdk.Event) bool { + btnEvent := gdk.EventButtonNewFromEvent(e) + if btnEvent.Button() == 1 { + launch(exec, terminal) + return true + } else if btnEvent.Button() == 3 { + pinItem(ID) + pinnedFlowBox = setUpPinnedFlowBox() + } + return false + }) + return button +} + func setUpFileSearchResult() *gtk.ListBox { listBox, _ := gtk.ListBoxNew() if fileSearchResultWindow != nil {