use win-title script for customizing window title (#213)
this removes the cli flag `-T` as well as related config.h options. Co-authored-by: Berke Kocaoğlu <berke.kocaoglu@metu.edu.tr>
This commit is contained in:
parent
ad95012be9
commit
e26c81fe9a
13
config.def.h
13
config.def.h
|
@ -16,19 +16,6 @@ static const char *DEFAULT_BAR_FG = NULL; /* NULL means it will default to
|
|||
static const char *DEFAULT_FONT = "monospace-8";
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifdef _TITLE_CONFIG
|
||||
|
||||
/* default title prefix */
|
||||
static const char *TITLE_PREFIX = "nsxiv - ";
|
||||
|
||||
/* default title suffixmode, available options are:
|
||||
* SUFFIX_EMPTY
|
||||
* SUFFIX_BASENAME
|
||||
* SUFFIX_FULLPATH
|
||||
*/
|
||||
static const suffixmode_t TITLE_SUFFIXMODE = SUFFIX_BASENAME;
|
||||
|
||||
#endif
|
||||
#ifdef _IMAGE_CONFIG
|
||||
|
||||
|
|
27
examples/win-title
Executable file
27
examples/win-title
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Example for $XDG_CONFIG_HOME/nsxiv/exec/win-title
|
||||
# Called by nsxiv(1) on each redraw.
|
||||
# The output is set as nsxiv's window title.
|
||||
#
|
||||
# Arguments, "Optional" arguments might be empty:
|
||||
# $1: resolved absolute path of the current file
|
||||
# $2: current file number
|
||||
# $3: total file number
|
||||
# $4: image width (Optional: Disabled on thumbnails mode)
|
||||
# $5: image height (Optional: Disabled on thumbnails mode)
|
||||
# $6: current zoom (Optional: Disabled on thumbnails mode)
|
||||
#
|
||||
# The term file is used rather than image as nsxiv does not
|
||||
# precheck that the input files are valid images. Total file
|
||||
# count may be different from the actual count of valid images.
|
||||
|
||||
exec 2>/dev/null
|
||||
|
||||
filename="${1##*/}"
|
||||
|
||||
if [ -n "$4" ]; then # image mode
|
||||
printf "%s" "nsxiv - ${filename} | ${4}x${5} ${6}% [${2}/${3}]"
|
||||
else
|
||||
printf "%s" "nsxiv - ${filename} [${2}/${3}]"
|
||||
fi
|
38
main.c
38
main.c
|
@ -87,6 +87,10 @@ static struct {
|
|||
bool warned;
|
||||
} keyhandler;
|
||||
|
||||
static struct {
|
||||
extcmd_t f;
|
||||
} wintitle;
|
||||
|
||||
static timeout_t timeouts[] = {
|
||||
{ { 0, 0 }, false, redraw },
|
||||
{ { 0, 0 }, false, reset_cursor },
|
||||
|
@ -229,6 +233,33 @@ static bool check_timeouts(struct timeval *t)
|
|||
return tmin > 0;
|
||||
}
|
||||
|
||||
size_t get_win_title(char *buf, int len)
|
||||
{
|
||||
char *argv[8];
|
||||
spawn_t pfd;
|
||||
char w[12] = "", h[12] = "", z[12] = "", fidx[12], fcnt[12];
|
||||
ssize_t n = -1;
|
||||
|
||||
if (wintitle.f.err || buf == NULL || len <= 0)
|
||||
return 0;
|
||||
|
||||
if (mode == MODE_IMAGE) {
|
||||
snprintf(w, ARRLEN(w), "%d", img.w);
|
||||
snprintf(h, ARRLEN(h), "%d", img.h);
|
||||
snprintf(z, ARRLEN(z), "%d", (int)(img.zoom * 100));
|
||||
}
|
||||
snprintf(fidx, ARRLEN(fidx), "%d", fileidx+1);
|
||||
snprintf(fcnt, ARRLEN(fcnt), "%d", filecnt);
|
||||
construct_argv(argv, ARRLEN(argv), wintitle.f.cmd, files[fileidx].path,
|
||||
fidx, fcnt, w, h, z, NULL);
|
||||
pfd = spawn(wintitle.f.cmd, argv, X_READ);
|
||||
if (pfd.readfd >= 0) {
|
||||
if ((n = read(pfd.readfd, buf, len-1)) > 0)
|
||||
buf[n] = '\0';
|
||||
}
|
||||
return MAX(0, n);
|
||||
}
|
||||
|
||||
void close_info(void)
|
||||
{
|
||||
if (info.fd != -1) {
|
||||
|
@ -320,7 +351,6 @@ void load_image(int new)
|
|||
close_info();
|
||||
open_info();
|
||||
arl_setup(&arl, files[fileidx].path);
|
||||
win_set_title(&win, files[fileidx].path);
|
||||
|
||||
if (img.multi.cnt > 0 && img.multi.animate)
|
||||
set_timeout(animate, img.multi.frames[img.multi.sel].delay, true);
|
||||
|
@ -429,6 +459,7 @@ void redraw(void)
|
|||
tns_render(&tns);
|
||||
}
|
||||
update_info();
|
||||
win_set_title(&win);
|
||||
win_draw(&win);
|
||||
reset_timeout(redraw);
|
||||
reset_cursor();
|
||||
|
@ -879,8 +910,8 @@ int main(int argc, char *argv[])
|
|||
dsuffix = "/.config";
|
||||
}
|
||||
if (homedir != NULL) {
|
||||
extcmd_t *cmd[] = { &info.f, &keyhandler.f };
|
||||
const char *name[] = { "image-info", "key-handler" };
|
||||
extcmd_t *cmd[] = { &info.f, &keyhandler.f, &wintitle.f };
|
||||
const char *name[] = { "image-info", "key-handler", "win-title" };
|
||||
const char *s = "/nsxiv/exec/";
|
||||
|
||||
for (i = 0; i < ARRLEN(cmd); i++) {
|
||||
|
@ -906,7 +937,6 @@ int main(int argc, char *argv[])
|
|||
load_image(fileidx);
|
||||
}
|
||||
win_open(&win);
|
||||
win_set_title(&win, files[fileidx].path);
|
||||
win_set_cursor(&win, CURSOR_WATCH);
|
||||
|
||||
atexit(cleanup);
|
||||
|
|
33
nsxiv.1
33
nsxiv.1
|
@ -20,8 +20,6 @@ nsxiv \- Neo Simple X Image Viewer
|
|||
.IR DELAY ]
|
||||
.RB [ \-s
|
||||
.IR MODE ]
|
||||
.RB [ \-T
|
||||
.IR TITLE ]
|
||||
.RB [ \-z
|
||||
.IR ZOOM ]
|
||||
.IR FILE ...
|
||||
|
@ -101,19 +99,6 @@ may be a floating point number.
|
|||
Set scale mode according to MODE character. Supported modes are: [d]own,
|
||||
[f]it, [F]ill, [w]idth, [h]eight.
|
||||
.TP
|
||||
.BI "\-T " TITLE
|
||||
Set the window title to TITLE. Use the format `prefix:suffixmode'. Any string
|
||||
literal is accepted for prefix, and the format of suffixmode is:
|
||||
|
||||
.EX
|
||||
Value Format
|
||||
0 Empty
|
||||
1 Basename of file
|
||||
2 Full path to file
|
||||
.EE
|
||||
|
||||
By default, prefix is set to "nsxiv - " and suffixmode is set to 1 (basename).
|
||||
.TP
|
||||
.B \-t
|
||||
Start in thumbnail mode.
|
||||
.TP
|
||||
|
@ -439,6 +424,24 @@ Color of the bar foreground. Defaults to window.foreground
|
|||
Color of the mark foreground. Defaults to window.foreground
|
||||
.TP
|
||||
Please see xrdb(1) on how to change them.
|
||||
.SH WINDOW TITLE
|
||||
The window title can be replaced with the output of a user-provided script,
|
||||
which is called by nsxiv whenever there's a redraw. The path of this script is
|
||||
.I $XDG_CONFIG_HOME/nsxiv/exec/win-title
|
||||
and the arguments given to it (where "Optional" arguments might be empty) are:
|
||||
1) resolved absolute path of the current file,
|
||||
2) current file number,
|
||||
3) total file count,
|
||||
4) image width (Optional: Disabled on thumbnails mode),
|
||||
5) image height (Optional: Disabled on thumbnails mode),
|
||||
6) current zoom (Optional: Disabled on thumbnails mode).
|
||||
.P
|
||||
The term file is used rather than image as nsxiv does not precheck that the
|
||||
input files are valid images. Total file count may be different from the actual
|
||||
count of valid images.
|
||||
.P
|
||||
There is also an example script installed together with nsxiv as
|
||||
.IR EGPREFIX/win-title .
|
||||
.SH STATUS BAR
|
||||
The information displayed on the left side of the status bar can be replaced
|
||||
with the output of a user-provided script, which is called by nsxiv whenever an
|
||||
|
|
10
nsxiv.h
10
nsxiv.h
|
@ -111,12 +111,6 @@ typedef enum {
|
|||
FF_TN_INIT = 4
|
||||
} fileflags_t;
|
||||
|
||||
typedef enum {
|
||||
SUFFIX_EMPTY,
|
||||
SUFFIX_BASENAME,
|
||||
SUFFIX_FULLPATH
|
||||
} suffixmode_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* as given by user */
|
||||
const char *path; /* always absolute */
|
||||
|
@ -265,8 +259,6 @@ struct opt {
|
|||
Window embed; /* unsigned long */
|
||||
char *geometry;
|
||||
char *res_name;
|
||||
const char *title_prefix;
|
||||
suffixmode_t title_suffixmode;
|
||||
|
||||
/* misc flags: */
|
||||
bool quiet;
|
||||
|
@ -448,7 +440,7 @@ void win_toggle_bar(win_t*);
|
|||
void win_clear(win_t*);
|
||||
void win_draw(win_t*);
|
||||
void win_draw_rect(win_t*, int, int, int, int, bool, int, unsigned long);
|
||||
void win_set_title(win_t*, const char*);
|
||||
void win_set_title(win_t*);
|
||||
void win_set_cursor(win_t*, cursor_t);
|
||||
void win_cursor_pos(win_t*, int*, int*);
|
||||
|
||||
|
|
28
options.c
28
options.c
|
@ -18,8 +18,6 @@
|
|||
*/
|
||||
|
||||
#include "nsxiv.h"
|
||||
#define _TITLE_CONFIG
|
||||
#include "config.h"
|
||||
#include "version.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -31,10 +29,23 @@ const opt_t *options;
|
|||
void print_usage(void)
|
||||
{
|
||||
printf("usage: nsxiv [-abcfhiopqrtvZ0] [-A FRAMERATE] [-e WID] [-G GAMMA] "
|
||||
"[-g GEOMETRY] [-N NAME] [-T TITLE] [-n NUM] [-S DELAY] [-s MODE] "
|
||||
"[-g GEOMETRY] [-N NAME] [-n NUM] [-S DELAY] [-s MODE] "
|
||||
"[-z ZOOM] FILES...\n");
|
||||
}
|
||||
|
||||
static void title_deprecation_notice(void)
|
||||
{
|
||||
error(EXIT_FAILURE, 0, "\n"
|
||||
"################################################################\n"
|
||||
"# DEPRECATION NOTICE #\n"
|
||||
"################################################################\n"
|
||||
"# `-T` option has been deprecated in favour of `win-title`. #\n"
|
||||
"# Please read the `WINDOW TITLE` section of the manpage for #\n"
|
||||
"# more info. #\n"
|
||||
"################################################################"
|
||||
);
|
||||
}
|
||||
|
||||
static void print_version(void)
|
||||
{
|
||||
puts("nsxiv " VERSION);
|
||||
|
@ -69,8 +80,6 @@ void parse_options(int argc, char **argv)
|
|||
_options.hide_bar = false;
|
||||
_options.geometry = NULL;
|
||||
_options.res_name = NULL;
|
||||
_options.title_prefix = TITLE_PREFIX;
|
||||
_options.title_suffixmode = TITLE_SUFFIXMODE;
|
||||
|
||||
_options.quiet = false;
|
||||
_options.thumb_mode = false;
|
||||
|
@ -155,14 +164,7 @@ void parse_options(int argc, char **argv)
|
|||
_options.scalemode = s - scalemodes;
|
||||
break;
|
||||
case 'T':
|
||||
if ((s = strrchr(optarg, ':')) != NULL) {
|
||||
*s = '\0';
|
||||
n = strtol(++s, &end, 0);
|
||||
if (*end != '\0' || n < SUFFIX_EMPTY || n > SUFFIX_FULLPATH)
|
||||
error(EXIT_FAILURE, 0, "Invalid argument for option -T suffixmode: %s", s);
|
||||
_options.title_suffixmode = n;
|
||||
}
|
||||
_options.title_prefix = optarg;
|
||||
title_deprecation_notice(); /* TODO(v30): remove this option */
|
||||
break;
|
||||
case 't':
|
||||
_options.thumb_mode = true;
|
||||
|
|
2
thumbs.c
2
thumbs.c
|
@ -36,7 +36,6 @@ void exif_auto_orientate(const fileinfo_t*);
|
|||
Imlib_Image img_open(const fileinfo_t*);
|
||||
|
||||
static char *cache_dir;
|
||||
extern const int fileidx;
|
||||
|
||||
static char* tns_cache_filepath(const char *filepath)
|
||||
{
|
||||
|
@ -530,7 +529,6 @@ bool tns_move_selection(tns_t *tns, direction_t dir, int cnt)
|
|||
if (!tns->dirty)
|
||||
tns_highlight(tns, *tns->sel, true);
|
||||
}
|
||||
win_set_title(tns->win, tns->files[fileidx].path);
|
||||
return *tns->sel != old;
|
||||
}
|
||||
|
||||
|
|
21
window.c
21
window.c
|
@ -30,6 +30,8 @@
|
|||
#include <X11/Xatom.h>
|
||||
#include <X11/Xresource.h>
|
||||
|
||||
extern size_t get_win_title(char *, int);
|
||||
|
||||
#if HAVE_LIBFONTS
|
||||
#include "utf8.h"
|
||||
static XftFont *font;
|
||||
|
@ -499,27 +501,20 @@ void win_draw_rect(win_t *win, int x, int y, int w, int h, bool fill, int lw,
|
|||
XDrawRectangle(win->env.dpy, win->buf.pm, gc, x, y, w, h);
|
||||
}
|
||||
|
||||
void win_set_title(win_t *win, const char *path)
|
||||
void win_set_title(win_t *win)
|
||||
{
|
||||
enum { title_max = 512 };
|
||||
char title[title_max];
|
||||
const char *basename = strrchr(path, '/') + 1;
|
||||
char title[512];
|
||||
size_t len;
|
||||
|
||||
/* Return if window is not ready yet */
|
||||
if (win->xwin == None)
|
||||
if ((len = get_win_title(title, ARRLEN(title))) <= 0)
|
||||
return;
|
||||
|
||||
snprintf(title, title_max, "%s%s", options->title_prefix,
|
||||
options->title_suffixmode == SUFFIX_BASENAME ? basename : path);
|
||||
if (options->title_suffixmode == SUFFIX_EMPTY)
|
||||
*(title+strlen(options->title_prefix)) = '\0';
|
||||
|
||||
XChangeProperty(win->env.dpy, win->xwin, atoms[ATOM__NET_WM_NAME],
|
||||
XInternAtom(win->env.dpy, "UTF8_STRING", False), 8,
|
||||
PropModeReplace, (unsigned char *) title, strlen(title));
|
||||
PropModeReplace, (unsigned char *) title, len);
|
||||
XChangeProperty(win->env.dpy, win->xwin, atoms[ATOM__NET_WM_ICON_NAME],
|
||||
XInternAtom(win->env.dpy, "UTF8_STRING", False), 8,
|
||||
PropModeReplace, (unsigned char *) title, strlen(title));
|
||||
PropModeReplace, (unsigned char *) title, len);
|
||||
}
|
||||
|
||||
void win_set_cursor(win_t *win, cursor_t cursor)
|
||||
|
|
Loading…
Reference in a new issue