diff options
Diffstat (limited to 'x11-wm/cwm/files/patch-kbfunc.c')
-rw-r--r-- | x11-wm/cwm/files/patch-kbfunc.c | 75 |
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; |