Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc84a05378 | ||
|
|
a249c37612 | ||
|
|
c7fa6e836a | ||
|
|
87a62e7bb6 | ||
|
|
11241cef0b | ||
|
|
87d2a74db0 | ||
|
|
41f7d58edf | ||
|
|
583ddfde0b | ||
|
|
383869906a | ||
|
|
54553ffae1 | ||
|
|
d8e7e0f6c2 | ||
|
|
7230d82be3 | ||
|
|
02b3930ef9 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -15,5 +15,7 @@
|
||||
bin
|
||||
nwg-drawer
|
||||
|
||||
/.idea
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
13
main.go
13
main.go
@@ -21,7 +21,7 @@ import (
|
||||
"github.com/gotk3/gotk3/gtk"
|
||||
)
|
||||
|
||||
const version = "0.3.0"
|
||||
const version = "0.3.1"
|
||||
|
||||
var (
|
||||
appDirs []string
|
||||
@@ -243,7 +243,10 @@ func main() {
|
||||
|
||||
// Copy default style sheet if not found
|
||||
if !pathExists(filepath.Join(configDirectory, "drawer.css")) {
|
||||
copyFile(filepath.Join(getDataHome(), "nwg-drawer/drawer.css"), filepath.Join(configDirectory, "drawer.css"))
|
||||
err := copyFile("/usr/share/nwg-drawer/drawer.css", filepath.Join(configDirectory, "drawer.css"))
|
||||
if err != nil {
|
||||
log.Errorf("Failed copying 'drawer.css' file: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
cacheDirectory := cacheDir()
|
||||
@@ -312,7 +315,11 @@ func main() {
|
||||
log.Infof("User demanded theme: %s", *gtkTheme)
|
||||
}
|
||||
} else {
|
||||
settings.SetProperty("gtk-application-prefer-dark-theme", true)
|
||||
err := settings.SetProperty("gtk-application-prefer-dark-theme", true)
|
||||
if err != nil {
|
||||
log.Error("Error setting 'gtk-application-prefer-dark-theme' property")
|
||||
return
|
||||
}
|
||||
log.Info("Preferring dark theme variants")
|
||||
}
|
||||
|
||||
|
||||
59
tools.go
59
tools.go
@@ -7,7 +7,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/fs"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
@@ -143,7 +142,7 @@ func tempDir() string {
|
||||
}
|
||||
|
||||
func readTextFile(path string) (string, error) {
|
||||
bytes, err := ioutil.ReadFile(path)
|
||||
bytes, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -197,12 +196,22 @@ func copyFile(src, dst string) error {
|
||||
if srcfd, err = os.Open(src); err != nil {
|
||||
return err
|
||||
}
|
||||
defer srcfd.Close()
|
||||
defer func(srcfd *os.File) {
|
||||
err := srcfd.Close()
|
||||
if err != nil {
|
||||
log.Errorf("Error closing file: %v", srcfd)
|
||||
}
|
||||
}(srcfd)
|
||||
|
||||
if dstfd, err = os.Create(dst); err != nil {
|
||||
return err
|
||||
}
|
||||
defer dstfd.Close()
|
||||
defer func(dstfd *os.File) {
|
||||
err := dstfd.Close()
|
||||
if err != nil {
|
||||
log.Errorf("Error closing file: %v", dstfd)
|
||||
}
|
||||
}(dstfd)
|
||||
|
||||
if _, err = io.Copy(dstfd, srcfd); err != nil {
|
||||
return err
|
||||
@@ -213,13 +222,6 @@ func copyFile(src, dst string) error {
|
||||
return os.Chmod(dst, srcinfo.Mode())
|
||||
}
|
||||
|
||||
func getDataHome() string {
|
||||
if os.Getenv("XDG_DATA_HOME") != "" {
|
||||
return os.Getenv("XDG_DATA_HOME")
|
||||
}
|
||||
return "/usr/share/"
|
||||
}
|
||||
|
||||
func getAppDirs() []string {
|
||||
var dirs []string
|
||||
xdgDataDirs := ""
|
||||
@@ -261,12 +263,20 @@ func loadPreferredApps(path string) (map[string]interface{}, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
defer func(jsonFile *os.File) {
|
||||
err := jsonFile.Close()
|
||||
if err != nil {
|
||||
log.Errorf("Error closing file: %v", jsonFile)
|
||||
}
|
||||
}(jsonFile)
|
||||
|
||||
byteValue, _ := ioutil.ReadAll(jsonFile)
|
||||
byteValue, _ := io.ReadAll(jsonFile)
|
||||
|
||||
var result map[string]interface{}
|
||||
json.Unmarshal([]byte(byteValue), &result)
|
||||
err = json.Unmarshal(byteValue, &result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(result) == 0 {
|
||||
return nil, errors.New("json invalid or empty")
|
||||
@@ -275,8 +285,8 @@ func loadPreferredApps(path string) (map[string]interface{}, error) {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func listFiles(dir string) ([]fs.FileInfo, error) {
|
||||
files, err := ioutil.ReadDir(dir)
|
||||
func listFiles(dir string) ([]fs.DirEntry, error) {
|
||||
files, err := os.ReadDir(dir)
|
||||
if err == nil {
|
||||
return files, nil
|
||||
}
|
||||
@@ -300,12 +310,12 @@ func listDesktopFiles() []string {
|
||||
}
|
||||
|
||||
func setUpCategories() {
|
||||
path := filepath.Join(getDataHome(), "nwg-drawer/desktop-directories")
|
||||
var other category
|
||||
|
||||
for _, cName := range categoryNames {
|
||||
fileName := fmt.Sprintf("%s.directory", cName)
|
||||
lines, err := loadTextFile(filepath.Join(path, fileName))
|
||||
fp := filepath.Join("/usr/share/nwg-drawer/desktop-directories", fileName)
|
||||
lines, err := loadTextFile(fp)
|
||||
if err == nil {
|
||||
var cat category
|
||||
cat.Name = cName
|
||||
@@ -350,6 +360,8 @@ func setUpCategories() {
|
||||
} else {
|
||||
other = cat
|
||||
}
|
||||
} else {
|
||||
log.Errorf("Couldn't open %s", fp)
|
||||
}
|
||||
}
|
||||
sort.Slice(categories, func(i, j int) bool {
|
||||
@@ -463,7 +475,7 @@ func pathExists(name string) bool {
|
||||
}
|
||||
|
||||
func loadTextFile(path string) ([]string, error) {
|
||||
bytes, err := ioutil.ReadFile(path)
|
||||
bytes, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -514,14 +526,19 @@ func savePinned() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
defer func(f *os.File) {
|
||||
err := f.Close()
|
||||
if err != nil {
|
||||
log.Errorf("Error closing file: %v", f)
|
||||
}
|
||||
}(f)
|
||||
|
||||
for _, line := range pinned {
|
||||
if line != "" {
|
||||
_, err := f.WriteString(line + "\n")
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("Error saving pinned", err)
|
||||
log.Error("Error saving pinned", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,8 +248,8 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
|
||||
button.SetImagePosition(gtk.POS_TOP)
|
||||
name := entry.NameLoc
|
||||
if len(name) > 20 {
|
||||
r := []rune(name)
|
||||
name = string(r[:17])
|
||||
r := []rune(name[:17])
|
||||
name = string(r)
|
||||
name = fmt.Sprintf("%s…", name)
|
||||
}
|
||||
button.SetLabel(name)
|
||||
@@ -259,8 +259,8 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
|
||||
terminal := entry.Terminal
|
||||
desc := entry.CommentLoc
|
||||
if len(desc) > 120 {
|
||||
r := []rune(desc)
|
||||
desc = string(r[:117])
|
||||
r := []rune(desc[:117])
|
||||
desc = string(r)
|
||||
desc = fmt.Sprintf("%s…", desc)
|
||||
}
|
||||
button.Connect("button-release-event", func(btn *gtk.Button, e *gdk.Event) bool {
|
||||
|
||||
@@ -54,7 +54,34 @@ func parseDesktopEntry(id string, in io.Reader) (entry desktopEntry, err error)
|
||||
case "Terminal":
|
||||
entry.Terminal, _ = strconv.ParseBool(value)
|
||||
case "NoDisplay":
|
||||
entry.NoDisplay, _ = strconv.ParseBool(value)
|
||||
if !entry.NoDisplay {
|
||||
entry.NoDisplay, _ = strconv.ParseBool(value)
|
||||
}
|
||||
case "Hidden":
|
||||
if !entry.NoDisplay {
|
||||
entry.NoDisplay, _ = strconv.ParseBool(value)
|
||||
}
|
||||
case "OnlyShowIn":
|
||||
if !entry.NoDisplay {
|
||||
entry.NoDisplay = true
|
||||
currentDesktop := os.Getenv("XDG_CURRENT_DESKTOP")
|
||||
if currentDesktop != "" {
|
||||
for _, ele := range strings.Split(value, ";") {
|
||||
if ele == currentDesktop && ele != "" {
|
||||
entry.NoDisplay = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case "NotShowIn":
|
||||
currentDesktop := os.Getenv("XDG_CURRENT_DESKTOP")
|
||||
if !entry.NoDisplay && currentDesktop != "" {
|
||||
for _, ele := range strings.Split(value, ";") {
|
||||
if ele == currentDesktop && ele != "" {
|
||||
entry.NoDisplay = true
|
||||
}
|
||||
}
|
||||
}
|
||||
case "Exec":
|
||||
entry.Exec = cleanexec.Replace(value)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user