From 673da8326038e0deb9837fd90d9e02351783b564 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Tue, 27 Nov 2018 23:27:44 -0500 Subject: [PATCH] Implement swaynag -B/--button-no-terminal In `i3 4.16`, `i3-nagbar` introduces the flags `-B/--button-no-terminal` to run the action directly instead of inside a terminal. This implements the flags for swaynag for compatibility. Since swaynag does not use an equivalent to `i3-sensible-terminal`, the flags `-b/--button` only uses a terminal when the environment variable `TERMINAL` is set, otherwise it acts the same as these new flags. --- include/swaynag/swaynag.h | 1 + swaynag/config.c | 10 ++++++++-- swaynag/swaynag.1.scd | 9 ++++++++- swaynag/swaynag.c | 7 +++++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/include/swaynag/swaynag.h b/include/swaynag/swaynag.h index a32d1503..0fd1eb50 100644 --- a/include/swaynag/swaynag.h +++ b/include/swaynag/swaynag.h @@ -44,6 +44,7 @@ struct swaynag_button { int y; int width; int height; + bool terminal; }; struct swaynag_details { diff --git a/swaynag/config.c b/swaynag/config.c index 63808ce4..e724aa0c 100644 --- a/swaynag/config.c +++ b/swaynag/config.c @@ -52,6 +52,7 @@ int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, static struct option opts[] = { {"button", required_argument, NULL, 'b'}, + {"button-no-terminal", required_argument, NULL, 'B'}, {"config", required_argument, NULL, 'c'}, {"debug", no_argument, NULL, 'd'}, {"edge", required_argument, NULL, 'e'}, @@ -86,7 +87,10 @@ int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, "Usage: swaynag [options...]\n" "\n" " -b, --button Create a button with text that " - "executes action when pressed. Multiple buttons can be defined.\n" + "executes action in a terminal when pressed. Multiple buttons can " + "be defined.\n" + " -B, --button-no-terminal Like --button, but does" + "not run the action in a terminal.\n" " -c, --config Path to config file.\n" " -d, --debug Enable debugging.\n" " -e, --edge top|bottom Set the edge to use.\n" @@ -117,12 +121,13 @@ int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, optind = 1; while (1) { - int c = getopt_long(argc, argv, "b:c:de:f:hlL:m:o:s:t:v", opts, NULL); + int c = getopt_long(argc, argv, "b:B:c:de:f:hlL:m:o:s:t:v", opts, NULL); if (c == -1) { break; } switch (c) { case 'b': // Button + case 'B': // Button (No Terminal) if (swaynag) { if (optind >= argc) { fprintf(stderr, "Missing action for button %s\n", optarg); @@ -133,6 +138,7 @@ int swaynag_parse_options(int argc, char **argv, struct swaynag *swaynag, button->text = strdup(optarg); button->type = SWAYNAG_ACTION_COMMAND; button->action = strdup(argv[optind]); + button->terminal = c == 'b'; list_add(swaynag->buttons, button); } optind++; diff --git a/swaynag/swaynag.1.scd b/swaynag/swaynag.1.scd index bb69e47d..b25568a0 100644 --- a/swaynag/swaynag.1.scd +++ b/swaynag/swaynag.1.scd @@ -12,7 +12,14 @@ _swaynag_ [options...] *-b, --button* Create a button with the text _text_ that executes _action_ when pressed. - Multiple buttons can be defined by providing the flag multiple times. + If the environment variable `TERMINAL` is set, _action_ will be run inside + the terminal. Otherwise, it will fallback to running directly. Multiple + buttons can be defined by providing the flag multiple times. + +*-B, --button-no-terminal* + Create a button with the text _text_ that executes _action_ when pressed. + _action_ will be run directly instead of in a terminal. Multiple buttons + can be defined by providing the flag multiple times. *-c, --config* The config file to use. By default, the following paths are checked: diff --git a/swaynag/swaynag.c b/swaynag/swaynag.c index 74e127b6..a2a0b412 100644 --- a/swaynag/swaynag.c +++ b/swaynag/swaynag.c @@ -49,14 +49,17 @@ static void swaynag_button_execute(struct swaynag *swaynag, if (fork() == 0) { // Child of the child. Will be reparented to the init process char *terminal = getenv("TERMINAL"); - if (terminal && strlen(terminal)) { + if (button->terminal && terminal && strlen(terminal)) { wlr_log(WLR_DEBUG, "Found $TERMINAL: %s", terminal); if (!terminal_execute(terminal, button->action)) { swaynag_destroy(swaynag); exit(EXIT_FAILURE); } } else { - wlr_log(WLR_DEBUG, "$TERMINAL not found. Running directly"); + if (button->terminal) { + wlr_log(WLR_DEBUG, + "$TERMINAL not found. Running directly"); + } execl("/bin/sh", "/bin/sh", "-c", button->action, NULL); } }