aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorokan2015-09-16 17:58:25 +0000
committerokan2015-09-16 17:58:25 +0000
commitea3954427e3e3453eba49e302bf4e3a0272b172e (patch)
tree6c8c6c794afa080f95f35faa5c8ba69a756d4a90
parent7d8a5a92b3e6bba227470f31a83772cf42b00fa9 (diff)
downloadcwm-ea3954427e3e3453eba49e302bf4e3a0272b172e.tar.gz
On execwm, we should properly release resources before exec'ing into a
new window manager; so allow CWM_EXEC_WM to assign new wm to wm_argv and pass through cwm_status (now EXECWM) so that x_teardown() gets called before exec'ing the new window manager. Removes the need for a separate x_restart() now, using new wm_argv; and consolidates errno for execvp.
-rw-r--r--calmwm.c18
-rw-r--r--calmwm.h6
-rw-r--r--conf.c4
-rw-r--r--kbfunc.c7
-rw-r--r--util.c34
5 files changed, 44 insertions, 25 deletions
diff --git a/calmwm.c b/calmwm.c
index f0d009b..c0e93fe 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.c,v 1.93 2015/01/19 14:54:16 okan Exp $
+ * $OpenBSD: calmwm.c,v 1.94 2015/09/16 17:58:25 okan Exp $
*/
#include <sys/types.h>
@@ -46,12 +46,12 @@ struct screen_ctx_q Screenq = TAILQ_HEAD_INITIALIZER(Screenq);
int HasRandr, Randr_ev;
struct conf Conf;
const char *homedir;
+char *wm_argv;
volatile sig_atomic_t cwm_status;
static void sighdlr(int);
static int x_errorhandler(Display *, XErrorEvent *);
static void x_init(const char *);
-static void x_restart(char **);
static void x_teardown(void);
static int x_wmerrorhandler(Display *, XErrorEvent *);
@@ -60,7 +60,6 @@ main(int argc, char **argv)
{
const char *conf_file = NULL;
char *conf_path, *display_name = NULL;
- char **cwm_argv;
int ch;
struct passwd *pw;
@@ -68,7 +67,7 @@ main(int argc, char **argv)
warnx("no locale support");
mbtowc(NULL, NULL, MB_CUR_MAX);
- cwm_argv = argv;
+ wm_argv = u_argv(argv);
while ((ch = getopt(argc, argv, "c:d:")) != -1) {
switch (ch) {
case 'c':
@@ -117,8 +116,8 @@ main(int argc, char **argv)
while (cwm_status == CWM_RUNNING)
xev_process();
x_teardown();
- if (cwm_status == CWM_RESTART)
- x_restart(cwm_argv);
+ if (cwm_status == CWM_EXECWM)
+ u_exec(wm_argv);
return(0);
}
@@ -146,13 +145,6 @@ x_init(const char *dpyname)
}
static void
-x_restart(char **args)
-{
- (void)setsid();
- (void)execvp(args[0], args);
-}
-
-static void
x_teardown(void)
{
struct screen_ctx *sc;
diff --git a/calmwm.h b/calmwm.h
index 9d0233f..9147c65 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.h,v 1.304 2015/08/27 18:53:14 okan Exp $
+ * $OpenBSD: calmwm.h,v 1.305 2015/09/16 17:58:25 okan Exp $
*/
#ifndef _CALMWM_H_
@@ -88,7 +88,7 @@
#define CWM_QUIT 0x0000
#define CWM_RUNNING 0x0001
-#define CWM_RESTART 0x0002
+#define CWM_EXECWM 0x0002
union arg {
char *c;
@@ -334,6 +334,7 @@ extern Display *X_Dpy;
extern Time Last_Event_Time;
extern struct screen_ctx_q Screenq;
extern struct conf Conf;
+extern char *wm_argv;
extern const char *homedir;
extern int HasRandr, Randr_ev;
@@ -581,6 +582,7 @@ void xu_ewmh_handle_net_wm_state_msg(struct client_ctx *,
void xu_ewmh_set_net_wm_state(struct client_ctx *);
void xu_ewmh_restore_net_wm_state(struct client_ctx *);
+char *u_argv(char * const *);
void u_exec(char *);
void u_spawn(char *);
diff --git a/conf.c b/conf.c
index 92594c4..7d5bfab 100644
--- a/conf.c
+++ b/conf.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: conf.c,v 1.197 2015/08/24 15:42:57 okan Exp $
+ * $OpenBSD: conf.c,v 1.198 2015/09/16 17:58:25 okan Exp $
*/
#include <sys/types.h>
@@ -400,7 +400,7 @@ static const struct {
{ "vmaximize", kbfunc_client_toggle_vmaximize, CWM_WIN, {0} },
{ "hmaximize", kbfunc_client_toggle_hmaximize, CWM_WIN, {0} },
{ "freeze", kbfunc_client_toggle_freeze, CWM_WIN, {0} },
- { "restart", kbfunc_cwm_status, 0, {.i = CWM_RESTART} },
+ { "restart", kbfunc_cwm_status, 0, {.i = CWM_EXECWM} },
{ "quit", kbfunc_cwm_status, 0, {.i = CWM_QUIT} },
{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
{ "exec_wm", kbfunc_exec, 0, {.i = CWM_EXEC_WM} },
diff --git a/kbfunc.c b/kbfunc.c
index 2c2bd68..038834b 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: kbfunc.c,v 1.117 2015/08/28 12:07:28 okan Exp $
+ * $OpenBSD: kbfunc.c,v 1.118 2015/09/16 17:58:25 okan Exp $
*/
#include <sys/types.h>
@@ -325,8 +325,9 @@ kbfunc_exec(struct client_ctx *cc, union arg *arg)
u_spawn(mi->text);
break;
case CWM_EXEC_WM:
- u_exec(mi->text);
- warn("%s", mi->text);
+ cwm_status = CWM_EXECWM;
+ free(wm_argv);
+ wm_argv = xstrdup(mi->text);
break;
default:
errx(1, "kb_func: egad, cmd changed value!");
diff --git a/util.c b/util.c
index 9480448..e74797e 100644
--- a/util.c
+++ b/util.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: util.c,v 1.17 2015/01/19 14:54:16 okan Exp $
+ * $OpenBSD: util.c,v 1.18 2015/09/16 17:58:25 okan Exp $
*/
#include <sys/types.h>
@@ -31,15 +31,12 @@
#include "calmwm.h"
-#define MAXARGLEN 20
-
void
u_spawn(char *argstr)
{
switch (fork()) {
case 0:
u_exec(argstr);
- err(1, "%s", argstr);
break;
case -1:
warn("fork");
@@ -51,8 +48,10 @@ u_spawn(char *argstr)
void
u_exec(char *argstr)
{
+#define MAXARGLEN 20
char *args[MAXARGLEN], **ap = args;
char **end = &args[MAXARGLEN - 1], *tmp;
+ char *s = argstr;
while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) {
if (**ap == '\0')
@@ -75,8 +74,33 @@ u_exec(char *argstr)
}
}
}
-
*ap = NULL;
+
(void)setsid();
(void)execvp(args[0], args);
+ err(1, "%s", s);
+}
+
+char *
+u_argv(char * const *argv)
+{
+ size_t siz = 0;
+ int i;
+ char *p;
+
+ if (argv == 0)
+ return(NULL);
+
+ for (i = 0; argv[i]; i++)
+ siz += strlen(argv[i]) + 1;
+ if (siz == 0)
+ return(NULL);
+
+ p = xmalloc(siz);
+ strlcpy(p, argv[0], siz);
+ for (i = 1; argv[i]; i++) {
+ strlcat(p, " ", siz);
+ strlcat(p, argv[i], siz);
+ }
+ return(p);
}