退出时清理屏幕信息
This commit is contained in:
@@ -25,3 +25,27 @@ void monitor_initialize_tag(monitor_t *monitor, const char **tags) {
|
|||||||
|
|
||||||
monitor->selected_tag = monitor->tag_list;
|
monitor->selected_tag = monitor->tag_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tag_clean(tag_t *tag) {
|
||||||
|
tag_t *next_tag = nullptr;
|
||||||
|
for (tag_t *t = tag; t; t = next_tag) {
|
||||||
|
p_delete(&t->name);
|
||||||
|
|
||||||
|
next_tag = t->next;
|
||||||
|
p_delete(&t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void monitor_clean(monitor_t *monitor) {
|
||||||
|
monitor_t *next_monitor = nullptr;
|
||||||
|
for (monitor_t *m = monitor; m; m = next_monitor) {
|
||||||
|
p_delete(&m->name);
|
||||||
|
tag_clean(m->tag_list);
|
||||||
|
|
||||||
|
m->selected_tag = nullptr;
|
||||||
|
m->tag_list = nullptr;
|
||||||
|
|
||||||
|
next_monitor = m->next;
|
||||||
|
p_delete(&m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,3 +6,4 @@
|
|||||||
|
|
||||||
void monitor_initialize_tag(monitor_t *monitor, const char **tags);
|
void monitor_initialize_tag(monitor_t *monitor, const char **tags);
|
||||||
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask);
|
void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask);
|
||||||
|
void monitor_clean(monitor_t *monitor);
|
||||||
|
|||||||
35
src/wm.c
35
src/wm.c
@@ -28,6 +28,8 @@ static void wm_check_other_wm(void);
|
|||||||
static void wm_check_xcb_extensions(void);
|
static void wm_check_xcb_extensions(void);
|
||||||
static void wm_detect_monitor(void);
|
static void wm_detect_monitor(void);
|
||||||
static void wm_scan_clients(void);
|
static void wm_scan_clients(void);
|
||||||
|
static void wm_clean(void);
|
||||||
|
static void wm_setup(void);
|
||||||
|
|
||||||
wm_t wm;
|
wm_t wm;
|
||||||
|
|
||||||
@@ -37,7 +39,10 @@ static char **cmd_argv;
|
|||||||
/** A pipe that is used to asynchronously handle SIGCHLD */
|
/** A pipe that is used to asynchronously handle SIGCHLD */
|
||||||
static int sigchld_pipe[2];
|
static int sigchld_pipe[2];
|
||||||
|
|
||||||
static void wm_atexit(bool restart) { wm.need_restart = restart; }
|
static void wm_atexit(bool restart) {
|
||||||
|
wm.need_restart = restart;
|
||||||
|
wm_clean();
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean restart_on_signal(gpointer data) {
|
static gboolean restart_on_signal(gpointer data) {
|
||||||
wm_restart();
|
wm_restart();
|
||||||
@@ -63,10 +68,12 @@ static void signal_child(int signum) {
|
|||||||
assert(res == 1);
|
assert(res == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint sources[3] = {0};
|
||||||
|
|
||||||
void wm_setup_signal(void) {
|
void wm_setup_signal(void) {
|
||||||
g_unix_signal_add(SIGINT, exit_on_signal, NULL);
|
sources[0] = g_unix_signal_add(SIGINT, exit_on_signal, NULL);
|
||||||
g_unix_signal_add(SIGTERM, exit_on_signal, NULL);
|
sources[1] = g_unix_signal_add(SIGTERM, exit_on_signal, NULL);
|
||||||
g_unix_signal_add(SIGHUP, restart_on_signal, NULL);
|
sources[2] = g_unix_signal_add(SIGHUP, restart_on_signal, NULL);
|
||||||
|
|
||||||
struct sigaction sa = {.sa_handler = signal_fatal, .sa_flags = SA_RESETHAND};
|
struct sigaction sa = {.sa_handler = signal_fatal, .sa_flags = SA_RESETHAND};
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
@@ -239,6 +246,22 @@ void wm_detect_monitor(void) {
|
|||||||
|
|
||||||
void wm_scan_clients(void) {}
|
void wm_scan_clients(void) {}
|
||||||
|
|
||||||
|
void wm_clean(void) {
|
||||||
|
text_clean_pango_layout();
|
||||||
|
monitor_clean(wm.monitor_list);
|
||||||
|
|
||||||
|
for (int i = 0; i < countof(sources); i++) {
|
||||||
|
guint source_id = sources[i];
|
||||||
|
if (source_id) g_source_remove(source_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wm_setup(void) {
|
||||||
|
for (monitor_t *m = wm.monitor_list; m; m = m->next) {
|
||||||
|
monitor_initialize_tag(m, (const char **)tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void wm_restart(void) {
|
void wm_restart(void) {
|
||||||
wm_atexit(true);
|
wm_atexit(true);
|
||||||
execvp(cmd_argv[0], cmd_argv);
|
execvp(cmd_argv[0], cmd_argv);
|
||||||
@@ -272,9 +295,7 @@ int main(int argc, char *argv[]) {
|
|||||||
wm_check_xcb_extensions();
|
wm_check_xcb_extensions();
|
||||||
|
|
||||||
wm_detect_monitor();
|
wm_detect_monitor();
|
||||||
for (monitor_t *m = wm.monitor_list; m; m = m->next) {
|
wm_setup();
|
||||||
monitor_initialize_tag(m, (const char **)tags);
|
|
||||||
}
|
|
||||||
|
|
||||||
debug_show_monitor_list();
|
debug_show_monitor_list();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user