shithub: vdict

Download patch

ref: a7339fa17654de4bcf5a3e12d8f43279c4e1a834
parent: 3ab5f2ca87e8f035ff0a138258493f81f761ea69
author: phil9 <telephil9@gmail.com>
date: Wed Mar 23 03:53:30 EDT 2022

add middle-click menu to select search database

--- a/vdict.c
+++ b/vdict.c
@@ -16,6 +16,7 @@
 Rectangle searchr;
 Rectangle entryr;
 Rectangle viewr;
+char *db;
 
 enum
 {
@@ -32,9 +33,47 @@
 	flushimage(display, 1);
 }
 
+char*
+dictmenu(int index)
+{
+	Element *e;
+
+	if(index < 0 || index >= dvlen(dict->db) + 2)
+		return nil;
+	if(index == 0)
+		return "First matching result";
+	else if(index == 1)
+		return "All matching results";
+	e = dvref(dict->db, index - 2);
+	return e->desc;
+}
+
 void
 emouse(Mouse m)
 {
+	Menu menu;
+	Element *e;
+	int n;
+
+	if(ptinrect(m.xy, viewr) && m.buttons == 2){
+		menu.gen = dictmenu;
+		n = menuhit(2, mc, &menu, nil);
+		if(n < 0)
+			return;
+		switch(n){
+		case 0:
+			db = Dfirstmatch;
+			break;
+		case 1:
+			db = Dallmatches;
+			break;
+		default:
+			e = dvref(dict->db, n - 2);
+			db = e->name;
+			break;
+		}
+		return;
+	}
 	entrymouse(entry, m);
 	dviewmouse(m);
 }
@@ -80,7 +119,9 @@
 {
 	Dvec *v;
 
-	v = dictdefine(dict, Dfirstmatch, s);
+	v = dictdefine(dict, db, s);
+	if(v == nil)
+		sysfatal("dictdefine: %r");
 	dviewset(v);
 	dviewredraw();
 	flushimage(display, 1);
@@ -153,6 +194,7 @@
 	}ARGEND;
 	if(host == nil)
 		usage();
+	db = Dfirstmatch;
 	dict = dictdial(host, port);
 	if(dict == nil)
 		sysfatal("initdict: %r");