summaryrefslogtreecommitdiffstats
path: root/x11-wm/cwm/files/patch-kbfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11-wm/cwm/files/patch-kbfunc.c')
-rw-r--r--x11-wm/cwm/files/patch-kbfunc.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/x11-wm/cwm/files/patch-kbfunc.c b/x11-wm/cwm/files/patch-kbfunc.c
new file mode 100644
index 0000000..20a2935
--- /dev/null
+++ b/x11-wm/cwm/files/patch-kbfunc.c
@@ -0,0 +1,75 @@
+--- kbfunc.c.orig 2021-07-28 22:35:08 UTC
++++ kbfunc.c
+@@ -753,6 +753,72 @@ out:
+ }
+
+ void
++kbfunc_menu_mosh(void *ctx, struct cargs *cargs)
++{
++ struct screen_ctx *sc = ctx;
++ struct cmd_ctx *cmd;
++ struct menu *mi;
++ struct menu_q menuq;
++ FILE *fp;
++ char *buf, *lbuf, *p;
++ char hostbuf[_POSIX_HOST_NAME_MAX+1];
++ char path[PATH_MAX];
++ int l;
++ size_t len;
++ ssize_t slen;
++ int mflags = (CWM_MENU_DUMMY);
++
++ TAILQ_FOREACH(cmd, &Conf.cmdq, entry) {
++ if (strcmp(cmd->name, "term") == 0)
++ break;
++ }
++ TAILQ_INIT(&menuq);
++
++ if ((fp = fopen(Conf.known_hosts, "r")) == NULL) {
++ warn("%s: %s", __func__, Conf.known_hosts);
++ goto menu;
++ }
++
++ lbuf = NULL;
++ len = 0;
++ while ((slen = getline(&lbuf, &len, fp)) != -1) {
++ buf = lbuf;
++ if (buf[slen - 1] == '\n')
++ buf[slen - 1] = '\0';
++
++ /* skip hashed hosts */
++ if (strncmp(buf, HASH_MARKER, strlen(HASH_MARKER)) == 0)
++ continue;
++ for (p = buf; *p != ',' && *p != ' ' && p != buf + slen; p++)
++ ;
++ /* ignore badness */
++ if (p - buf + 1 > sizeof(hostbuf))
++ continue;
++ (void)strlcpy(hostbuf, buf, p - buf + 1);
++ menuq_add(&menuq, NULL, "%s", hostbuf);
++ }
++ free(lbuf);
++ if (ferror(fp))
++ err(1, "%s", path);
++ (void)fclose(fp);
++menu:
++ if ((mi = menu_filter(sc, &menuq, "mosh", NULL, mflags,
++ search_match_text, search_print_text)) != NULL) {
++ if (mi->text[0] == '\0')
++ goto out;
++ l = snprintf(path, sizeof(path), "%s -T '[ssh] %s' -e mosh %s",
++ cmd->path, mi->text, mi->text);
++ if (l == -1 || l >= sizeof(path))
++ goto out;
++ u_spawn(path);
++ }
++out:
++ if (mi != NULL && mi->dummy)
++ free(mi);
++ menuq_clear(&menuq);
++}
++
++void
+ kbfunc_client_menu_label(void *ctx, struct cargs *cargs)
+ {
+ struct client_ctx *cc = ctx;