aboutsummaryrefslogtreecommitdiffstats
path: root/search.c
diff options
context:
space:
mode:
authorokan2012-11-07 14:39:44 +0000
committerokan2012-11-07 14:39:44 +0000
commit489dc845ec01dd4f84e2d9f70d8b7d673ee815e6 (patch)
tree30f23d8626fac3e0d695fbf769ac1f15d57a8550 /search.c
parent6d5057574241a69bc108171d662a901dda9973e2 (diff)
downloadcwm-489dc845ec01dd4f84e2d9f70d8b7d673ee815e6.tar.gz
tab completion support for menus; from Alexander Polakov.
ok sthen@ on an older incarnation
Diffstat (limited to 'search.c')
-rw-r--r--search.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/search.c b/search.c
index 9db2f70..33b4ec6 100644
--- a/search.c
+++ b/search.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: search.c,v 1.24 2011/07/25 15:10:24 okan Exp $
+ * $OpenBSD: search.c,v 1.25 2012/11/07 14:39:44 okan Exp $
*/
#include <sys/param.h>
@@ -29,9 +29,12 @@
#include <string.h>
#include <stdio.h>
#include <unistd.h>
+#include <glob.h>
#include "calmwm.h"
+#define PATH_EXEC 0x1
+
static int strsubmatch(char *, char *, int);
/*
@@ -161,6 +164,43 @@ search_print_client(struct menu *mi, int list)
}
}
+static void
+search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search, int flag)
+{
+ struct menu *mi;
+ char pattern[MAXPATHLEN];
+ glob_t g;
+ int i;
+
+ TAILQ_INIT(resultq);
+
+ (void)strlcpy(pattern, search, sizeof(pattern));
+ (void)strlcat(pattern, "*", sizeof(pattern));
+
+ if (glob(pattern, GLOB_MARK, NULL, &g) != 0)
+ return;
+ for (i = 0; i < g.gl_pathc; i++) {
+ if ((flag & PATH_EXEC) && access(g.gl_pathv[i], X_OK))
+ continue;
+ mi = xcalloc(1, sizeof(*mi));
+ (void)strlcpy(mi->text, g.gl_pathv[i], sizeof(mi->text));
+ TAILQ_INSERT_TAIL(resultq, mi, resultentry);
+ }
+ globfree(&g);
+}
+
+void
+search_match_path_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
+{
+ return (search_match_path(menuq, resultq, search, PATH_EXEC));
+}
+
+void
+search_match_path_any(struct menu_q *menuq, struct menu_q *resultq, char *search)
+{
+ return (search_match_path(menuq, resultq, search, 0));
+}
+
void
search_match_text(struct menu_q *menuq, struct menu_q *resultq, char *search)
{
@@ -196,6 +236,14 @@ search_match_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
}
}
+void
+search_match_exec_path(struct menu_q *menuq, struct menu_q *resultq, char *search)
+{
+ search_match_exec(menuq, resultq, search);
+ if (TAILQ_EMPTY(resultq))
+ search_match_path_exec(menuq, resultq, search);
+}
+
static int
strsubmatch(char *sub, char *str, int zeroidx)
{