aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/c_defs.go3
-rw-r--r--src/c_fuzz.go26
-rw-r--r--src/c_hardflip.go7
-rw-r--r--src/c_init.go67
-rw-r--r--src/c_utils.go14
-rw-r--r--src/e_events.go12
-rw-r--r--src/e_keys.go9
-rw-r--r--src/i_ui.go111
8 files changed, 109 insertions, 140 deletions
diff --git a/src/c_defs.go b/src/c_defs.go
index 09b81f6..480cf66 100644
--- a/src/c_defs.go
+++ b/src/c_defs.go
@@ -56,7 +56,7 @@ const (
STYLE_FILE_NAME = "colors.yml"
CONF_DIR_NAME = "hf"
DATA_DIR_NAME = "hf"
- VERSION = "v1.0.2"
+ VERSION = "v1.0.3"
VERSION_NAME = "wheelbite"
)
@@ -76,7 +76,6 @@ up: k`
const (
NORMAL_MODE = iota
DELETE_MODE
- LOAD_MODE
ERROR_MODE
WELCOME_MODE
MKDIR_MODE
diff --git a/src/c_fuzz.go b/src/c_fuzz.go
index e183a85..68976bd 100644
--- a/src/c_fuzz.go
+++ b/src/c_fuzz.go
@@ -84,7 +84,7 @@ func c_fuzz_find_item(str_out string, litems *ItemsList) (*ItemsNode) {
if ptr.is_dir() == true {
continue
}
- if strings.Compare(name, ptr.Host.Name) == 0 && strings.Compare(path, ptr.path()) == 0 {
+ if name == ptr.Host.Name && path == ptr.path() {
return ptr
}
}
@@ -92,9 +92,11 @@ func c_fuzz_find_item(str_out string, litems *ItemsList) (*ItemsNode) {
}
func c_fuzz(data *HardData, ui *HardUI) {
- if err := ui.s.Suspend(); err != nil {
- c_error_mode("screen", err, ui)
- return
+ if ui.s != nil {
+ if err := ui.s.Suspend(); err != nil {
+ c_error_mode("screen", err, ui)
+ return
+ }
}
search := exec.Command("fzf")
stdin, stdout := c_fuzz_init_pipes(ui, search)
@@ -103,7 +105,9 @@ func c_fuzz(data *HardData, ui *HardUI) {
}
if err := search.Start(); err != nil {
c_error_mode("fzf", err, ui)
- c_resume_or_die(ui)
+ if ui.s != nil {
+ c_resume_or_die(ui)
+ }
return
}
go func() {
@@ -117,15 +121,21 @@ func c_fuzz(data *HardData, ui *HardUI) {
}()
output, err := io.ReadAll(stdout)
if err != nil {
- ui.s.Fini()
+ if ui.s != nil {
+ ui.s.Fini()
+ }
c_die("search stdout", err)
}
str_out := strings.TrimSuffix(string(output), "\n")
- c_resume_or_die(ui)
+ if ui.s != nil {
+ c_resume_or_die(ui)
+ }
if len(str_out) > 0 {
item := c_fuzz_find_item(str_out, data.litems)
if item == nil {
- c_error_mode("item not found", nil, ui)
+ if ui.s != nil {
+ c_error_mode("item not found", nil, ui)
+ }
return
}
data.litems.curr = item
diff --git a/src/c_hardflip.go b/src/c_hardflip.go
index b09a150..a50a9ae 100644
--- a/src/c_hardflip.go
+++ b/src/c_hardflip.go
@@ -79,5 +79,10 @@ func main() {
n_arg, s_arg = c_cli_opts()
}
data_dir := c_get_data_dir(nil)
- i_ui(data_dir, n_arg, s_arg)
+ data := c_init_hard(data_dir, n_arg, s_arg)
+ if s_arg == true {
+ c_fuzz(data, &data.ui)
+ // TODO: exec instantly here
+ }
+ i_ui(data)
}
diff --git a/src/c_init.go b/src/c_init.go
index 130ca96..c2c7779 100644
--- a/src/c_init.go
+++ b/src/c_init.go
@@ -52,6 +52,7 @@
package main
import (
+ "fmt"
"os"
"path/filepath"
@@ -85,7 +86,7 @@ type HardStyle struct {
func c_recurse_data_dir(dir, root string, opts HardOpts,
ldirs *DirsList,
name string, parent *DirsNode, depth uint16,
- ui *HardUI, load_err *[]error) {
+ load_err *[]error) {
files, err := os.ReadDir(root + dir)
if err != nil {
*load_err = append(*load_err, err)
@@ -99,12 +100,11 @@ func c_recurse_data_dir(dir, root string, opts HardOpts,
nil,
}
ldirs.add_back(&dir_node)
- i_draw_load_ui(ui)
for _, file := range files {
filename := file.Name()
if file.IsDir() == true {
c_recurse_data_dir(dir + filename + "/", root, opts, ldirs,
- file.Name(), &dir_node, depth + 1, ui, load_err)
+ file.Name(), &dir_node, depth + 1, load_err)
} else if filepath.Ext(filename) == ".yml" {
host_node, err := c_read_yaml_file(root + dir + filename)
if err != nil {
@@ -117,16 +117,14 @@ func c_recurse_data_dir(dir, root string, opts HardOpts,
}
dir_node.lhost.add_back(host_node)
}
- i_draw_load_ui(ui)
}
}
}
-func c_load_data_dir(dir string, opts HardOpts,
- ui *HardUI, load_err *[]error) (*DirsList) {
+func c_load_data_dir(dir string, opts HardOpts, load_err *[]error) (*DirsList) {
ldirs := DirsList{}
- c_recurse_data_dir("", dir + "/", opts, &ldirs, "", nil, 1, ui, load_err)
+ c_recurse_data_dir("", dir + "/", opts, &ldirs, "", nil, 1, load_err)
return &ldirs
}
@@ -211,3 +209,58 @@ func c_get_styles(dir string, load_err *[]error) HardStyle {
}
return styles
}
+
+func i_load_data(data_dir string,
+ opts HardOpts,
+ load_err *[]error) (*DirsList, *ItemsList, []error) {
+ ldirs := c_load_data_dir(data_dir, opts, load_err)
+ litems := c_load_litems(ldirs)
+ if len(*load_err) == 0 {
+ *load_err = nil
+ }
+ return ldirs, litems, *load_err
+}
+
+func c_init_hard(data_dir string, no_loop, search_mode bool) (*HardData) {
+ ui := HardUI{}
+ var load_err []error
+
+ fmt.Println("loading config...")
+ home_dir, _ := os.UserHomeDir()
+ opts := HardOpts{}
+ conf_dir := c_get_conf_dir(&load_err)
+ if len(conf_dir) == 0 {
+ opts = DEFAULT_OPTS
+ } else {
+ opts = c_get_options(conf_dir, &load_err)
+ }
+ if no_loop == true {
+ opts.Loop = false
+ }
+ styles := c_get_styles(conf_dir, &load_err)
+ i_init_styles(&ui, styles)
+ fmt.Println("loading data...")
+ ldirs, litems, load_err := i_load_data(data_dir, opts, &load_err)
+ data := HardData{
+ litems,
+ ldirs,
+ ui,
+ opts,
+ styles,
+ make(map[*DirsNode]*ItemsList),
+ data_dir,
+ home_dir,
+ load_err,
+ nil,
+ [][2]string{},
+ nil,
+ nil,
+ no_loop,
+ search_mode,
+ }
+ if data.opts.GPG == DEFAULT_OPTS.GPG && data.litems.head == nil {
+ data.ui.mode = WELCOME_MODE
+ data.keys = c_get_secret_gpg_keyring()
+ }
+ return &data
+}
diff --git a/src/c_utils.go b/src/c_utils.go
index 839d6c8..76ac248 100644
--- a/src/c_utils.go
+++ b/src/c_utils.go
@@ -252,24 +252,18 @@ func c_print_version() {
// prints the help and exits
func c_print_help() {
- fmt.Println(`Usage:
+ fmt.Println(`usage:
hf [options]
-Options:`)
+options:`)
flag.PrintDefaults()
fmt.Println(`
-Report bugs to <rbo@gmx.us>`)
+report bugs to <rbo@gmx.us>`)
os.Exit(0)
}
-// wrong argument and exit
-func c_not_an_arg(arg string) {
- fmt.Println("hf: Unknown argument " + arg)
- os.Exit(1)
-}
-
func c_cli_opts() (bool, bool) {
- h := flag.Bool("h", false, "print this help")
+ h := flag.Bool("h", false, "show usage")
n := flag.Bool("n", false, "disable loop mode")
s := flag.Bool("s", false, "search-only mode (implies -n)")
v := flag.Bool("v", false, "print the version number and name")
diff --git a/src/e_events.go b/src/e_events.go
index 914756a..35e8faa 100644
--- a/src/e_events.go
+++ b/src/e_events.go
@@ -52,6 +52,7 @@
package main
import (
+ "fmt"
"maps"
"os"
@@ -178,8 +179,9 @@ func e_reload_data(data *HardData) {
tmp_parent_path = data.litems.curr.Host.parent.path()
}
}
+ fmt.Println("reloading config...")
conf_dir := c_get_conf_dir(&data.load_err)
- if conf_dir == "" {
+ if len(conf_dir) == 0 {
data.opts = DEFAULT_OPTS
} else {
data.opts = c_get_options(conf_dir, &data.load_err)
@@ -187,19 +189,19 @@ func e_reload_data(data *HardData) {
data.opts.Loop = false
}
}
- if conf_dir == "" {
+ if len(conf_dir) == 0 {
data.colors = DEFAULT_STYLE
} else {
data.colors = c_get_styles(conf_dir, &data.load_err)
}
i_init_styles(&data.ui, data.colors)
+ fmt.Println("reloading data...")
data.data_dir = c_get_data_dir(&data.ui)
if len(data.data_dir) == 0 {
return
}
- g_load_count = -1
- data.ldirs, data.litems, data.load_err = i_load_ui(data.data_dir, data.opts,
- &data.ui, &data.load_err)
+ data.ldirs, data.litems, data.load_err = i_load_data(data.data_dir, data.opts,
+ &data.load_err)
data.folds = make(map[*DirsNode]*ItemsList)
if tmp_name == "" {
data.litems.curr = data.litems.head
diff --git a/src/e_keys.go b/src/e_keys.go
index 40e8bde..1e598b5 100644
--- a/src/e_keys.go
+++ b/src/e_keys.go
@@ -187,7 +187,12 @@ func e_normal_events(data *HardData, ui *HardUI, event tcell.EventKey) bool {
ui.insert_sel_ok = false
ui.insert_scroll = 0
} else if event.Key() == tcell.KeyCtrlR {
+ if err := ui.s.Suspend(); err != nil {
+ c_error_mode("screen", err, ui)
+ return true
+ }
e_reload_data(data)
+ c_resume_or_die(ui)
} else if event.Rune() == 'm' ||
event.Key() == tcell.KeyF7 {
ui.mode = MKDIR_MODE
@@ -275,10 +280,6 @@ func e_delete_events(data *HardData, ui *HardUI, event tcell.EventKey) bool {
return false
}
-func e_load_events(data *HardData, ui *HardUI, event tcell.EventKey) bool {
- return true
-}
-
func e_error_events(data *HardData, ui *HardUI, event tcell.EventKey) bool {
if event.Rune() != 0 ||
event.Key() == tcell.KeyEscape ||
diff --git a/src/i_ui.go b/src/i_ui.go
index 4c87c76..b404cd3 100644
--- a/src/i_ui.go
+++ b/src/i_ui.go
@@ -210,10 +210,9 @@ func i_set_box_style(ui *HardUI) {
switch ui.mode {
case NORMAL_MODE,
- LOAD_MODE,
WELCOME_MODE,
HELP_MODE:
- // FIX: with custom config for default ayayaya
+ // TODO: with custom config for default ayayaya
ui.style[BOX_STYLE] = tmp.Foreground(tcell.ColorReset)
ui.style[HEAD_STYLE] = tmp.Foreground(tcell.ColorReset)
case DELETE_MODE,
@@ -239,8 +238,6 @@ func i_draw_bottom_text(ui HardUI, insert *HostNode, insert_err []error) {
text = NORMAL_KEYS_HINTS
case DELETE_MODE:
text = CONFIRM_KEYS_HINTS
- case LOAD_MODE:
- text = "Loading..."
case ERROR_MODE:
text = ERROR_KEYS_HINTS
case WELCOME_MODE:
@@ -656,60 +653,6 @@ func i_draw_match_buff(ui HardUI) {
ui.style[DEF_STYLE], ui.match_buff)
}
-var g_load_count int = -1
-
-func i_draw_load_ui(ui *HardUI) {
- g_load_count += 1
- if g_load_count % 1000 != 0 {
- return
- }
- i_draw_host_panel(*ui, false, nil, nil)
- i_draw_info_panel(*ui, false, nil)
- text := ""
- for i := 0; i < ui.dim[W] - 1; i++ {
- text += " "
- }
- i_draw_text(ui.s, 1, ui.dim[H] - 1, ui.dim[W], ui.dim[H] - 1,
- ui.style[BOT_STYLE], text)
- i_draw_bottom_text(*ui, nil, nil)
- i_draw_msg(ui.s, 1, ui.style[BOX_STYLE], ui.dim, " Loading ")
- text = "Loading " + strconv.Itoa(g_load_count) + " hosts"
- left, right := i_left_right(len(text), *ui)
- i_draw_text(ui.s,
- left, ui.dim[H] - 2 - 1, right, ui.dim[H] - 2 - 1,
- ui.style[DEF_STYLE], text)
- ui.s.Show()
- ui.s.PostEvent(nil)
- event := ui.s.PollEvent()
- switch event := event.(type) {
- case *tcell.EventResize:
- ui.dim[W], ui.dim[H], _ = term.GetSize(0)
- ui.s.Sync()
- case *tcell.EventKey:
- if event.Key() == tcell.KeyCtrlC ||
- event.Rune() == 'q' {
- ui.s.Fini()
- os.Exit(0)
- }
- }
-}
-
-func i_load_ui(data_dir string,
- opts HardOpts,
- ui *HardUI,
- load_err *[]error) (*DirsList, *ItemsList, []error) {
- ui.mode = LOAD_MODE
- ldirs := c_load_data_dir(data_dir, opts, ui, load_err)
- litems := c_load_litems(ldirs)
- if ui.mode != ERROR_MODE {
- ui.mode = NORMAL_MODE
- }
- if len(*load_err) == 0 {
- *load_err = nil
- }
- return ldirs, litems, *load_err
-}
-
func i_init_styles(ui *HardUI, styles HardStyle) {
for i := range STYLE_MAX + 1 {
tmp := tcell.StyleDefault.Background(tcell.ColorReset)
@@ -783,59 +726,21 @@ func i_init_styles(ui *HardUI, styles HardStyle) {
type key_event_mode_func func(*HardData, *HardUI, tcell.EventKey) bool
-func i_ui(data_dir string, no_loop, search_mode bool) {
- home_dir, _ := os.UserHomeDir()
- ui := HardUI{}
- opts := HardOpts{}
+func i_ui(data *HardData) {
var err error
- ui.s, err = tcell.NewScreen()
+ data.ui.s, err = tcell.NewScreen()
if err != nil {
c_die("view", err)
}
- if err := ui.s.Init(); err != nil {
+ if err := data.ui.s.Init(); err != nil {
c_die("view", err)
}
- ui.dim[W], ui.dim[H], _ = term.GetSize(0)
- var load_err []error
- conf_dir := c_get_conf_dir(&load_err)
- if len(conf_dir) == 0 {
- opts = DEFAULT_OPTS
- } else {
- opts = c_get_options(conf_dir, &load_err)
- }
- if no_loop == true {
- opts.Loop = false
- }
- styles := c_get_styles(conf_dir, &load_err)
- i_init_styles(&ui, styles)
- ui.s.SetStyle(ui.style[DEF_STYLE])
- ldirs, litems, load_err := i_load_ui(data_dir, opts, &ui, &load_err)
- data := HardData{
- litems,
- ldirs,
- ui,
- opts,
- styles,
- make(map[*DirsNode]*ItemsList),
- data_dir,
- home_dir,
- load_err,
- nil,
- [][2]string{},
- nil,
- nil,
- no_loop,
- search_mode,
- }
- if data.opts.GPG == DEFAULT_OPTS.GPG && data.litems.head == nil {
- data.ui.mode = WELCOME_MODE
- data.keys = c_get_secret_gpg_keyring()
- }
+ data.ui.dim[W], data.ui.dim[H], _ = term.GetSize(0)
+ data.ui.s.SetStyle(data.ui.style[DEF_STYLE])
fp := [MODE_MAX + 1]key_event_mode_func{
NORMAL_MODE: e_normal_events,
DELETE_MODE: e_delete_events,
- LOAD_MODE: e_load_events,
ERROR_MODE: e_error_events,
WELCOME_MODE: e_welcome_events,
MKDIR_MODE: e_mkdir_events,
@@ -847,7 +752,7 @@ func i_ui(data_dir string, no_loop, search_mode bool) {
data.ui.s.Clear()
i_set_box_style(&data.ui)
i_draw_bottom_text(data.ui, data.insert, data.insert_err)
- i_draw_host_panel(data.ui, data.opts.Icon, data.litems, &data)
+ i_draw_host_panel(data.ui, data.opts.Icon, data.litems, data)
i_draw_info_panel(data.ui, data.opts.Perc, data.litems)
i_draw_scrollhint(data.ui, data.litems)
if len(data.load_err) > 0 {
@@ -893,6 +798,6 @@ func i_ui(data_dir string, no_loop, search_mode bool) {
data.ui.match_buff = ""
}
data.ui.s.Show()
- e_events(&data, fp)
+ e_events(data, fp)
}
}