lchat

A line oriented chat front end for ii.
git clone git://git.suckless.org/lchat
Log | Files | Refs | README

commit 3a2446ff8f1e0d30bf3b1ee02617e15020bc829a
parent 595d8b5e4d763305139cbd482a8c469f9e926494
Author: Jan Klemkow <j.klemkow@wemelug.de>
Date:   Mon, 11 Jan 2016 21:49:31 +0100

add .prompt and .title file handling

add the possibility to set prompt and window title by file.

Diffstat:
Mlchat.1 | 6+++++-
Mlchat.c | 52++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/lchat.1 b/lchat.1 @@ -49,7 +49,7 @@ as prompt for the input line. .It Fl t Ar title Use .Ar title -as title terminal window. +as title for the terminal window. In a .Xr tmux 1 or @@ -84,6 +84,10 @@ If this file exists and has executable permissions, it is used as a filter program for the output lines. This program should read raw lines from stdin and outputs filtered or transformed lines to stdout. +.It .prompt +contains the prompt string. +.It .title +contains the terminal window title. .El .Sh SEE ALSO .Xr tail 1 , diff --git a/lchat.c b/lchat.c @@ -51,6 +51,35 @@ exit_handler(void) err(EXIT_FAILURE, "tcsetattr"); } +static char * +read_file_line(const char *file) +{ + FILE *fh; + char buf[BUFSIZ]; + char *line = NULL; + char *nl = NULL; + + if (access(file, R_OK) == -1) + return NULL; + + if ((fh = fopen(file, "r")) == NULL) + err(EXIT_FAILURE, "fopen"); + + if (fgets(buf, sizeof buf, fh) == NULL) + err(EXIT_FAILURE, "fgets"); + + if (fclose(fh) == EOF) + err(EXIT_FAILURE, "fclose"); + + if ((nl = strchr(buf, '\n')) != NULL) /* delete new line */ + *nl = '\0'; + + if ((line = strdup(buf)) == NULL) + err(EXIT_FAILURE ,"strdup"); + + return line; +} + static bool bell_match(const char *str, const char *regex_file) { @@ -114,7 +143,12 @@ main(int argc, char *argv[]) bool bell_flag = true; char *bell_file = ".bellmatch"; size_t history_len = 5; - char *prompt = ">"; + char *prompt = read_file_line(".prompt"); + char *title = read_file_line(".title"); + + if (prompt == NULL) /* set default prompt */ + prompt = ">"; + size_t prompt_len = strlen(prompt); size_t loverhang = 0; char *dir = "."; @@ -149,11 +183,9 @@ main(int argc, char *argv[]) err(EXIT_FAILURE, "strdup"); prompt_len = strlen(prompt); break; - case 't': /* set optarg to terminal's window title */ - if (strcmp(getenv("TERM"), "screen") == 0) - printf("\033k%s\033\\", optarg); - else - printf("\033]0;%s\a", optarg); + case 't': + if ((title = strdup(optarg)) == NULL) + err(EXIT_FAILURE, "strdup"); break; case 'h': default: @@ -182,6 +214,14 @@ main(int argc, char *argv[]) if (isatty(fd) == 0) err(EXIT_FAILURE, "isatty"); + /* set optarg to terminal's window title */ + if (title != NULL) { + if (strcmp(getenv("TERM"), "screen") == 0) + printf("\033k%s\033\\", title); + else + printf("\033]0;%s\a", title); + } + /* preprate terminal reset on exit */ if (tcgetattr(fd, &origin_term) == -1) err(EXIT_FAILURE, "tcgetattr");