mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
Somewhat streamline event loop/restart/quit handling; most notable
change allows a restart to trigger proper teardown first, even though teardown is not (yet) complete. After some discussion with oga@nicotinebsd.org regarding a more complicated version/idea.
This commit is contained in:
15
calmwm.c
15
calmwm.c
@@ -47,10 +47,12 @@ struct client_ctx_q Clientq = TAILQ_HEAD_INITIALIZER(Clientq);
|
|||||||
int HasRandr, Randr_ev;
|
int HasRandr, Randr_ev;
|
||||||
struct conf Conf;
|
struct conf Conf;
|
||||||
const char *homedir;
|
const char *homedir;
|
||||||
|
volatile sig_atomic_t cwm_status;
|
||||||
|
|
||||||
static void sigchld_cb(int);
|
static void sigchld_cb(int);
|
||||||
static int x_errorhandler(Display *, XErrorEvent *);
|
static int x_errorhandler(Display *, XErrorEvent *);
|
||||||
static void x_init(const char *);
|
static void x_init(const char *);
|
||||||
|
static void x_restart(void);
|
||||||
static void x_teardown(void);
|
static void x_teardown(void);
|
||||||
static int x_wmerrorhandler(Display *, XErrorEvent *);
|
static int x_wmerrorhandler(Display *, XErrorEvent *);
|
||||||
|
|
||||||
@@ -111,8 +113,12 @@ main(int argc, char **argv)
|
|||||||
free(conf_path);
|
free(conf_path);
|
||||||
|
|
||||||
x_init(display_name);
|
x_init(display_name);
|
||||||
xev_loop();
|
cwm_status = CWM_RUNNING;
|
||||||
|
while (cwm_status == CWM_RUNNING)
|
||||||
|
xev_process();
|
||||||
x_teardown();
|
x_teardown();
|
||||||
|
if (cwm_status == CWM_RESTART)
|
||||||
|
x_restart();
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -140,6 +146,13 @@ x_init(const char *dpyname)
|
|||||||
screen_init(i);
|
screen_init(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
x_restart(void)
|
||||||
|
{
|
||||||
|
(void)setsid();
|
||||||
|
(void)execvp(cwm_argv[0], cwm_argv);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
x_teardown(void)
|
x_teardown(void)
|
||||||
{
|
{
|
||||||
|
|||||||
10
calmwm.h
10
calmwm.h
@@ -85,6 +85,10 @@
|
|||||||
|
|
||||||
#define CWM_WIN 0x0001
|
#define CWM_WIN 0x0001
|
||||||
|
|
||||||
|
#define CWM_QUIT 0x0000
|
||||||
|
#define CWM_RUNNING 0x0001
|
||||||
|
#define CWM_RESTART 0x0002
|
||||||
|
|
||||||
union arg {
|
union arg {
|
||||||
char *c;
|
char *c;
|
||||||
int i;
|
int i;
|
||||||
@@ -327,6 +331,7 @@ extern struct client_ctx_q Clientq;
|
|||||||
extern struct conf Conf;
|
extern struct conf Conf;
|
||||||
extern const char *homedir;
|
extern const char *homedir;
|
||||||
extern int HasRandr, Randr_ev;
|
extern int HasRandr, Randr_ev;
|
||||||
|
extern volatile sig_atomic_t cwm_status;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
WM_STATE,
|
WM_STATE,
|
||||||
@@ -473,11 +478,10 @@ void kbfunc_client_search(struct client_ctx *, union arg *);
|
|||||||
void kbfunc_client_vmaximize(struct client_ctx *,
|
void kbfunc_client_vmaximize(struct client_ctx *,
|
||||||
union arg *);
|
union arg *);
|
||||||
void kbfunc_cmdexec(struct client_ctx *, union arg *);
|
void kbfunc_cmdexec(struct client_ctx *, union arg *);
|
||||||
|
void kbfunc_cwm_status(struct client_ctx *, union arg *);
|
||||||
void kbfunc_exec(struct client_ctx *, union arg *);
|
void kbfunc_exec(struct client_ctx *, union arg *);
|
||||||
void kbfunc_lock(struct client_ctx *, union arg *);
|
void kbfunc_lock(struct client_ctx *, union arg *);
|
||||||
void kbfunc_menu_search(struct client_ctx *, union arg *);
|
void kbfunc_menu_search(struct client_ctx *, union arg *);
|
||||||
void kbfunc_quit_wm(struct client_ctx *, union arg *);
|
|
||||||
void kbfunc_restart(struct client_ctx *, union arg *);
|
|
||||||
void kbfunc_ssh(struct client_ctx *, union arg *);
|
void kbfunc_ssh(struct client_ctx *, union arg *);
|
||||||
void kbfunc_term(struct client_ctx *, union arg *);
|
void kbfunc_term(struct client_ctx *, union arg *);
|
||||||
void kbfunc_tile(struct client_ctx *, union arg *);
|
void kbfunc_tile(struct client_ctx *, union arg *);
|
||||||
@@ -527,7 +531,7 @@ void conf_init(struct conf *);
|
|||||||
void conf_ignore(struct conf *, const char *);
|
void conf_ignore(struct conf *, const char *);
|
||||||
void conf_screen(struct screen_ctx *);
|
void conf_screen(struct screen_ctx *);
|
||||||
|
|
||||||
void xev_loop(void);
|
void xev_process(void);
|
||||||
|
|
||||||
void xu_btn_grab(Window, int, unsigned int);
|
void xu_btn_grab(Window, int, unsigned int);
|
||||||
void xu_btn_ungrab(Window);
|
void xu_btn_ungrab(Window);
|
||||||
|
|||||||
4
conf.c
4
conf.c
@@ -373,8 +373,8 @@ static const struct {
|
|||||||
{ "vmaximize", kbfunc_client_vmaximize, CWM_WIN, {0} },
|
{ "vmaximize", kbfunc_client_vmaximize, CWM_WIN, {0} },
|
||||||
{ "hmaximize", kbfunc_client_hmaximize, CWM_WIN, {0} },
|
{ "hmaximize", kbfunc_client_hmaximize, CWM_WIN, {0} },
|
||||||
{ "freeze", kbfunc_client_freeze, CWM_WIN, {0} },
|
{ "freeze", kbfunc_client_freeze, CWM_WIN, {0} },
|
||||||
{ "restart", kbfunc_restart, 0, {0} },
|
{ "restart", kbfunc_cwm_status, 0, {.i = CWM_RESTART} },
|
||||||
{ "quit", kbfunc_quit_wm, 0, {0} },
|
{ "quit", kbfunc_cwm_status, 0, {.i = CWM_QUIT} },
|
||||||
{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
|
{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
|
||||||
{ "exec_wm", kbfunc_exec, 0, {.i = CWM_EXEC_WM} },
|
{ "exec_wm", kbfunc_exec, 0, {.i = CWM_EXEC_WM} },
|
||||||
{ "ssh", kbfunc_ssh, 0, {0} },
|
{ "ssh", kbfunc_ssh, 0, {0} },
|
||||||
|
|||||||
14
kbfunc.c
14
kbfunc.c
@@ -35,9 +35,6 @@
|
|||||||
|
|
||||||
#define HASH_MARKER "|1|"
|
#define HASH_MARKER "|1|"
|
||||||
|
|
||||||
extern char **cwm_argv;
|
|
||||||
extern sig_atomic_t xev_quit;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
kbfunc_client_lower(struct client_ctx *cc, union arg *arg)
|
kbfunc_client_lower(struct client_ctx *cc, union arg *arg)
|
||||||
{
|
{
|
||||||
@@ -464,16 +461,9 @@ kbfunc_client_freeze(struct client_ctx *cc, union arg *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
|
kbfunc_cwm_status(struct client_ctx *cc, union arg *arg)
|
||||||
{
|
{
|
||||||
xev_quit = 1;
|
cwm_status = arg->i;
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
kbfunc_restart(struct client_ctx *cc, union arg *arg)
|
|
||||||
{
|
|
||||||
(void)setsid();
|
|
||||||
(void)execvp(cwm_argv[0], cwm_argv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
16
xevents.c
16
xevents.c
@@ -400,18 +400,14 @@ xev_handle_expose(XEvent *ee)
|
|||||||
client_draw_border(cc);
|
client_draw_border(cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
volatile sig_atomic_t xev_quit = 0;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
xev_loop(void)
|
xev_process(void)
|
||||||
{
|
{
|
||||||
XEvent e;
|
XEvent e;
|
||||||
|
|
||||||
while (xev_quit == 0) {
|
XNextEvent(X_Dpy, &e);
|
||||||
XNextEvent(X_Dpy, &e);
|
if (e.type - Randr_ev == RRScreenChangeNotify)
|
||||||
if (e.type - Randr_ev == RRScreenChangeNotify)
|
xev_handle_randr(&e);
|
||||||
xev_handle_randr(&e);
|
else if (e.type < LASTEvent && xev_handlers[e.type] != NULL)
|
||||||
else if (e.type < LASTEvent && xev_handlers[e.type] != NULL)
|
(*xev_handlers[e.type])(&e);
|
||||||
(*xev_handlers[e.type])(&e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user