package app import ( "finally-a-monolithic-linux-hw-monitor/app/mem" "finally-a-monolithic-linux-hw-monitor/app/proc" "fmt" "os" "os/signal" "strings" "syscall" "time" ) func Run() { // Clear terminal screen and hide cursor fmt.Print("\033[2J\033[?25l") // Ensure cursor is restored when exiting (Ctrl+C / SIGTERM) cleanupChannel := make(chan os.Signal, 1) signal.Notify(cleanupChannel, os.Interrupt, syscall.SIGTERM) go func() { <-cleanupChannel // Restore cursor and move below output fmt.Print("\033[?25h\n") os.Exit(0) }() proc, _ := proc.GetProc() mem, _ := mem.GetMem() ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { console := &strings.Builder{} // Move cursor to top-left (0,0) without clearing full buffer (flicker-free) fmt.Fprint(console, "\033[H") proc.RenderProc(console) mem.Render(console) fmt.Fprint(console, "\nPress Ctrl+C to exit.\033[K\n") fmt.Fprint(console, "\033[0J") fmt.Print(console.String()) <-ticker.C } }