Replace DMenu with Rofi (and fix spawning)

This commit is contained in:
Alex Kotov 2021-11-15 23:15:19 +05:00
parent 3c2538f72b
commit de65f13e12
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
4 changed files with 26 additions and 54 deletions

View File

@ -4,7 +4,6 @@
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
static const char *fonts[] = { "monospace:size=10" };
static const char dmenufont[] = "monospace:size=10";
static const char col_gray1[] = "#222222";
static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb";
@ -54,7 +53,7 @@ static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_n, nametag, {0} },
{ MODKEY, XK_slash, spawn, {.v = "menu" } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = "term" } },
{ MODKEY|ShiftMask, XK_slash, spawn, {.v = "term" } },
{ MODKEY|ShiftMask, XK_f, spawn, {.v = "firefox" } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },

4
dwm.c
View File

@ -1580,8 +1580,8 @@ nametag(const Arg *arg) {
int i;
errno = 0; // popen(3p) says on failure it "may" set errno
if(!(f = popen("dmenu < /dev/null", "r"))) {
fprintf(stderr, "polytreewm: popen 'dmenu < /dev/null' failed%s%s\n", errno ? ": " : "", errno ? strerror(errno) : "");
if(!(f = popen("rofi -dmenu", "r"))) {
fprintf(stderr, "polytreewm: popen 'rofi -dmenu' failed%s%s\n", errno ? ": " : "", errno ? strerror(errno) : "");
return;
}
if (!(p = fgets(name, TAGS_CUSTOM_NAME_SIZE, f)) && (i = errno) && ferror(f))

View File

@ -56,15 +56,15 @@ click on a tag label applies that tag to the focused window.
click on a tag label adds/removes that tag to/from the focused window.
.SS Keyboard commands
.TP
.B Mod1\-Shift\-Return
Start
.BR st(1).
.TP
.B Mod1\-/
Spawn
.BR dmenu(1)
.BR rofi(1)
for launching other programs.
.TP
.B Mod1\-Shift\-/
Start
.BR st(1).
.TP
.B Mod1\-,
Focus previous screen, if any.
.TP
@ -165,7 +165,7 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
PolytreeWM is customized by creating a custom config.h and (re)compiling the
source code. This keeps it fast, secure and simple.
.SH SEE ALSO
.BR dmenu (1),
.BR rofi (1),
.BR st (1)
.SH ISSUES
Java applications which use the XToolkit/XAWT backend may draw grey windows

61
spawn.c
View File

@ -19,38 +19,27 @@ struct Command {
static struct Command commands[] = {
{
.name = "menu",
.monitor_arg_index = 2,
.monitor_arg_index = 6,
.args = {
"dmenu_run",
// monitor
"-m",
"0",
// font
"-fn",
"monospace:size=10",
// color: gray 1
"-nb",
"#222222",
// color: gray 3
"-nf",
"#bbbbbb",
// color: cyan
"-sb",
"#005577",
// color: gray 4
"-sf",
"#eeeeee",
"rofi",
"-modi",
"drun",
"-show",
"drun",
"-monitor",
"-1",
"-show-icons",
NULL,
},
},
{
.name = "term",
.monitor_arg_index = -1,
.monitor_arg_index = 0,
.args = { "st", NULL },
},
{
.name = "firefox",
.monitor_arg_index = -1,
.monitor_arg_index = 0,
.args = { "firefox", NULL },
},
};
@ -73,10 +62,11 @@ void spawn_command(
// We discard const modifier
// because we will only change newly allocated version.
char **args = (char**)command->args;
char monitor_buffer[2] = { '0' + monitor, '\0' };
if (command->monitor_arg_index != -1) {
if (command->monitor_arg_index != 0) {
args = malloc(sizeof(char*) * ARGS_SIZE);
if (args == NULL) break;
if (args == NULL) return;
for (size_t arg_index = 0;; ++arg_index) {
// We discard const modifier
@ -85,24 +75,10 @@ void spawn_command(
if (args[arg_index] == NULL) break;
}
args[command->monitor_arg_index] =
malloc(sizeof(char) * MON_ARG_SIZE);
if (args[command->monitor_arg_index] == NULL) {
free(args);
break;
}
args[command->monitor_arg_index][0] = '0' + monitor;
args[command->monitor_arg_index][1] = '\0';
args[command->monitor_arg_index] = monitor_buffer;
}
if (fork() == 0) {
// TODO: DRY (see the same code below)
if (command->monitor_arg_index != -1) {
free(args[command->monitor_arg_index]);
free(args);
}
callback();
setsid();
execvp(args[0], args);
@ -111,11 +87,8 @@ void spawn_command(
exit(EXIT_SUCCESS);
}
if (command->monitor_arg_index != -1) {
free(args[command->monitor_arg_index]);
free(args);
}
if (command->monitor_arg_index != 0) free(args);
break;
return;
}
}