package main import ( "encoding/json" "io/ioutil" "net/http" "net/url" "os" "os/exec" "./rofi" ) var ( serial = 0 ) func getSuggestions(query string) []string { param := url.Values{} param.Add("q", query) param.Add("type", "list") param.Add("kl", "en-US") resp, _ := http.Get("https://ac.duckduckgo.com/ac?" + param.Encode()) body, _ := ioutil.ReadAll(resp.Body) resp.Body.Close() var result []interface{} json.Unmarshal(body, &result) if len(result) < 2 { return []string{query} } rtn := make([]string, len(result[1].([]interface{}))+1) rtn[0] = query for i, v := range result[1].([]interface{}) { rtn[i+1] = v.(string) } return rtn } func handleSelect(input rofi.Input) { param := url.Values{} param.Add("q", input.Value) exec.Command("xdg-open", "https://duckduckgo.com/?"+param.Encode()).Start() os.Exit(0) } func handleInputChange(input rofi.Input) { serial++ go genOutput(input, serial) } func genOutput(input rofi.Input, mySerial int) { output := rofi.NewOutput() output.Lines = rofi.ConvertStringsToLine(getSuggestions(input.Value)) if serial == mySerial { rofi.SendOutput(output) } } func main() { // Setup rofi initialOutput := rofi.NewOutput() initialOutput.Prompt = "Search" initialOutput.InputAction = "send" rofi.SendOutput(initialOutput) rofi.InputChangeCallback = handleInputChange rofi.SelectEntryCallback = handleSelect rofi.InputLoop() }