From 99389a763da082ccc231d2f2fd4a21fd1befb257 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Fri, 14 Nov 2025 05:17:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=80=E5=87=BA=E6=97=B6=E6=B8=85=E7=90=86?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/monitor.c | 24 ++++++++++++++++++++++++ src/monitor.h | 1 + src/wm.c | 35 ++++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/monitor.c b/src/monitor.c index 366b641..2d3898d 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -25,3 +25,27 @@ void monitor_initialize_tag(monitor_t *monitor, const char **tags) { 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); + } +} diff --git a/src/monitor.h b/src/monitor.h index cf1aa98..6ad12b1 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -6,3 +6,4 @@ void monitor_initialize_tag(monitor_t *monitor, const char **tags); void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask); +void monitor_clean(monitor_t *monitor); diff --git a/src/wm.c b/src/wm.c index d531adf..9a00794 100644 --- a/src/wm.c +++ b/src/wm.c @@ -28,6 +28,8 @@ static void wm_check_other_wm(void); static void wm_check_xcb_extensions(void); static void wm_detect_monitor(void); static void wm_scan_clients(void); +static void wm_clean(void); +static void wm_setup(void); wm_t wm; @@ -37,7 +39,10 @@ static char **cmd_argv; /** A pipe that is used to asynchronously handle SIGCHLD */ 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) { wm_restart(); @@ -63,10 +68,12 @@ static void signal_child(int signum) { assert(res == 1); } +static guint sources[3] = {0}; + void wm_setup_signal(void) { - g_unix_signal_add(SIGINT, exit_on_signal, NULL); - g_unix_signal_add(SIGTERM, exit_on_signal, NULL); - g_unix_signal_add(SIGHUP, restart_on_signal, NULL); + sources[0] = g_unix_signal_add(SIGINT, exit_on_signal, NULL); + sources[1] = g_unix_signal_add(SIGTERM, exit_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}; sigemptyset(&sa.sa_mask); @@ -239,6 +246,22 @@ void wm_detect_monitor(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) { wm_atexit(true); execvp(cmd_argv[0], cmd_argv); @@ -272,9 +295,7 @@ int main(int argc, char *argv[]) { wm_check_xcb_extensions(); wm_detect_monitor(); - for (monitor_t *m = wm.monitor_list; m; m = m->next) { - monitor_initialize_tag(m, (const char **)tags); - } + wm_setup(); debug_show_monitor_list();