diff --git a/dwm.c b/dwm.c index 27fd9ce..b99cc48 100644 --- a/dwm.c +++ b/dwm.c @@ -1547,8 +1547,9 @@ setup(void) /* do not transform children into zombies when they terminate */ sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; + sa.sa_flags = SA_NOCLDSTOP | SA_RESTART; + /* IGN -> DFL for cppipe so that waitpid works */ + sa.sa_handler = SIG_DFL; sigaction(SIGCHLD, &sa, NULL); /* clean up any zombies (inherited from .xinitrc etc) immediately */ @@ -1653,8 +1654,11 @@ spawn(const Arg *arg) if (fork() == 0) { if (dpy) close(ConnectionNumber(dpy)); + + /* Child starts a new session */ setsid(); + /* Don't inherit dwm's sigaction from setup */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = SIG_DFL; diff --git a/vene.cpp b/vene.cpp index b6ab113..b5733aa 100644 --- a/vene.cpp +++ b/vene.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -17,10 +18,8 @@ char SCREEN_CAPS_DIR[64]; namespace { time_point next_update; - void schedule_update() - { - next_update = system_clock::now() + 100ms; - } + bool has_child; + Proc child; } extern "C" @@ -62,25 +61,28 @@ extern "C" static string new_stat; new_stat.clear(); + // Net + string eth_state; + ifstream("/sys/class/net/eth0/operstate") >> eth_state; + if(eth_state == "up") + new_stat += "🌐 "; + + // Volume string amix_out = $(Cmd("amixer", "get", AUDIO_DEV)); - size_t bracket = amix_out.find('['); + size_t vol_bracket = amix_out.find('['); - if(bracket != string::npos) + if(vol_bracket != string::npos) { bool is_muted = amix_out.find("[on]") == string::npos; new_stat += is_muted ? "🔇" : "🔉"; - new_stat += amix_out[bracket+1]; - if(char second = amix_out[bracket+2]; second != '%') - new_stat += second; - if(char third = amix_out[bracket+3]; third != '%') - new_stat += third; - - new_stat += '%'; + size_t first_digit = vol_bracket + 1; + size_t close_bracket = amix_out.find(']', first_digit); + new_stat.append(amix_out, first_digit, close_bracket - first_digit); + new_stat += ' '; } - new_stat += ' '; // Time time_t rawtime; @@ -101,10 +103,19 @@ extern "C" { time_point now = system_clock::now(); - if(now > next_update) + if(has_child && check_exited(child)) { - next_update = now + 5s; + // Clean up all zombies + while (waitpid(-1, nullptr, WNOHANG) > 0); + + has_child = false; updatestatus(); + next_update = now + 5s; + } + else if(now > next_update) + { + updatestatus(); + next_update = now + 5s; } } @@ -137,25 +148,22 @@ extern "C" void vene_inc_vol(const Arg*) { - Cmd inc_vol("amixer", "set", AUDIO_DEV, "3%+"); - inc_vol.detach(); - - schedule_update(); + Cmd inc_vol("amixer", "-q", "set", AUDIO_DEV, "3%+"); + child = inc_vol.detach(); + has_child = true; } void vene_dec_vol(const Arg*) { - Cmd dec_vol("amixer", "set", AUDIO_DEV, "3%-"); - dec_vol.detach(); - - schedule_update(); + Cmd dec_vol("amixer", "-q", "set", AUDIO_DEV, "3%-"); + child = dec_vol.detach(); + has_child = true; } void vene_toggle_vol(const Arg*) { - Cmd toggle_vol("amixer", "set", AUDIO_DEV, "toggle"); - toggle_vol.detach(); - - schedule_update(); + Cmd toggle_vol("amixer", "-q", "set", AUDIO_DEV, "toggle"); + child = toggle_vol.detach(); + has_child = true; } }