From be37b17c2e788566d2192b084acbd1488cc00ec7 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sat, 6 Jun 2026 02:08:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(runtime):=20=E5=B0=86=20runtime=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BB=8E=20core=20=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=87=B3=E7=8B=AC=E7=AB=8B=E7=9A=84=20runtim?= =?UTF-8?q?e=20=E7=9B=AE=E5=BD=95=E5=B9=B6=E5=B0=81=E8=A3=85=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 +- src/config/runtime_config.c | 1 - src/config/runtime_config.h | 26 +++++++++++- src/core/runtime.h | 53 ------------------------ src/main.c | 42 ++----------------- src/{core => runtime}/runtime.c | 72 +++++++++++++++++++++++++++++---- src/runtime/runtime.h | 3 ++ 7 files changed, 98 insertions(+), 102 deletions(-) delete mode 100644 src/core/runtime.h rename src/{core => runtime}/runtime.c (86%) create mode 100644 src/runtime/runtime.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 37a0bda..f94870a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,6 @@ add_executable(${APP_NAME} ${SOURCE_DIR}/core/plan.c ${SOURCE_DIR}/core/policy.c ${SOURCE_DIR}/core/rules.c - ${SOURCE_DIR}/core/runtime.c ${SOURCE_DIR}/core/state.c ${SOURCE_DIR}/core/window.c @@ -58,6 +57,8 @@ add_executable(${APP_NAME} ${SOURCE_DIR}/layouts/fullscreen.c ${SOURCE_DIR}/layouts/maximize.c + ${SOURCE_DIR}/runtime/runtime.c + ${SOURCE_DIR}/main.c ) diff --git a/src/config/runtime_config.c b/src/config/runtime_config.c index e497a9a..f8e6b6c 100644 --- a/src/config/runtime_config.c +++ b/src/config/runtime_config.c @@ -13,7 +13,6 @@ #include "core/layout.h" #include "core/listeners.h" #include "core/rules.h" -#include "core/runtime.h" #include "core/types.h" #include "core/wm_desc.h" #include "layouts/fair.h" diff --git a/src/config/runtime_config.h b/src/config/runtime_config.h index 055a3df..30ccd96 100644 --- a/src/config/runtime_config.h +++ b/src/config/runtime_config.h @@ -1,6 +1,30 @@ #pragma once -typedef struct runtime_init_desc_t runtime_init_desc_t; +#include +#include + +#include "core/backend.h" +#include "core/binding.h" +#include "core/layout.h" +#include "core/listeners.h" +#include "core/rules.h" +#include "core/types.h" +#include "core/wm_desc.h" + +typedef struct runtime_init_desc_t { + backend_t *backend; + zdwm_output_info_t *outputs; + size_t output_count; + + layout_registry_t layouts; + rules_t rules; + border_config_t border; + workspace_desc_t *workspaces; + size_t workspace_count; + void *config_module_handle; + binding_table_t *binding_table; + listeners_t listeners; +} runtime_init_desc_t; bool runtime_config_load(const char *override_path, runtime_init_desc_t *out); void runtime_config_cleanup(runtime_init_desc_t *desc); diff --git a/src/core/runtime.h b/src/core/runtime.h deleted file mode 100644 index c4d09e8..0000000 --- a/src/core/runtime.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include -#include - -#include "core/backend.h" -#include "core/binding.h" -#include "core/command_buffer.h" -#include "core/layout.h" -#include "core/listeners.h" -#include "core/plan.h" -#include "core/rules.h" -#include "core/state.h" -#include "core/types.h" - -typedef struct runtime_init_desc_t { - backend_t *backend; - output_info_t *outputs; - size_t output_count; - - layout_registry_t layouts; - rules_t rules; - border_config_t border; - workspace_desc_t *workspaces; - size_t workspace_count; - void *config_module_handle; - binding_table_t *binding_table; - listeners_t listeners; -} runtime_init_desc_t; - -typedef struct runtime_t { - bool running; - bool will_restart; - - plan_t plan; - command_buffer_t command_buffer; - state_t state; - layout_result_t layout_result; - layout_registry_t layouts; - rules_t rules; - border_config_t border; - backend_t *backend; - void *config_module_handle; - binding_table_t *binding_table; - listeners_t listeners; -} runtime_t; - -bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc); -void runtime_init_desc_cleanup(runtime_init_desc_t *desc); -void runtime_shutdown(runtime_t *runtime); -void runtime_setup(runtime_t *runtime); -void runtime_scan(runtime_t *runtime); -void runtime_run(runtime_t *runtime); diff --git a/src/main.c b/src/main.c index bfc7c80..745c837 100644 --- a/src/main.c +++ b/src/main.c @@ -3,52 +3,16 @@ #include #include "base/log.h" -#include "config/runtime_config.h" -#include "core/backend.h" -#include "core/runtime.h" - -static void bootstrap(runtime_t *runtime) { - auto backend = backend_create(nullptr); - auto detect = backend_detect(backend); - if (!backend || !detect || detect->output_count == 0) { - fatal("backend detect failed"); - } - - runtime_init_desc_t desc = { - .backend = backend, - .outputs = detect->outputs, - .output_count = detect->output_count, - }; - if (!runtime_config_load(nullptr, &desc)) { - fatal("failed to build runtime inputs"); - } - - backend = nullptr; - - bool inited = runtime_init(runtime, &desc); - - runtime_init_desc_cleanup(&desc); - backend_detect_destroy(detect); - - if (!inited) { - fatal("runtime init failed"); - } -} +#include "runtime/runtime.h" char **cmd_argv = nullptr; int main(int argc, char *argv[]) { cmd_argv = argv; - runtime_t runtime = {0}; + auto restart = runtime_run(nullptr, nullptr); - bootstrap(&runtime); - runtime_setup(&runtime); - runtime_scan(&runtime); - runtime_run(&runtime); - runtime_shutdown(&runtime); - - if (runtime.will_restart) { + if (restart) { execvp(cmd_argv[0], cmd_argv); fatal("execvp() failed: %s", strerror(errno)); } diff --git a/src/core/runtime.c b/src/runtime/runtime.c similarity index 86% rename from src/core/runtime.c rename to src/runtime/runtime.c index c5c5d17..579adf1 100644 --- a/src/core/runtime.c +++ b/src/runtime/runtime.c @@ -1,4 +1,4 @@ -#include "core/runtime.h" +#include "runtime/runtime.h" #include #include @@ -6,7 +6,9 @@ #include #include "base/array.h" +#include "base/log.h" #include "base/memory.h" +#include "config/runtime_config.h" #include "core/backend.h" #include "core/binding.h" #include "core/command_buffer.h" @@ -21,6 +23,23 @@ #include "core/window.h" #include "core/wm_desc.h" +typedef struct runtime_t { + bool running; + bool will_restart; + + plan_t plan; + command_buffer_t command_buffer; + state_t state; + layout_result_t layout_result; + layout_registry_t layouts; + rules_t rules; + border_config_t border; + backend_t *backend; + void *config_module_handle; + binding_table_t *binding_table; + listeners_t listeners; +} runtime_t; + static bool runtime_workspace_desc_has_valid_layouts( const layout_registry_t *layouts, const workspace_desc_t *workspace @@ -52,7 +71,7 @@ static bool runtime_init_desc_valid(const runtime_init_desc_t *desc) { return true; } -bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc) { +static bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc) { if (!runtime || !runtime_init_desc_valid(desc)) return false; p_clear(runtime, 1); @@ -83,7 +102,7 @@ bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc) { return true; } -void runtime_init_desc_cleanup(runtime_init_desc_t *desc) { +static void runtime_init_desc_cleanup(runtime_init_desc_t *desc) { if (!desc) return; binding_table_destroy(desc->binding_table); @@ -107,7 +126,7 @@ void runtime_init_desc_cleanup(runtime_init_desc_t *desc) { desc->config_module_handle = nullptr; } -void runtime_shutdown(runtime_t *runtime) { +static void runtime_shutdown(runtime_t *runtime) { runtime->running = false; plan_cleanup(&runtime->plan); command_buffer_cleanup(&runtime->command_buffer); @@ -159,7 +178,7 @@ static void runtime_notify_initial_state(runtime_t *runtime) { listeners_notify_binding_mode(listeners, runtime->binding_table); } -void runtime_setup(runtime_t *runtime) { +static void runtime_setup(runtime_t *runtime) { size_t bind_count = 0; auto bindings = binding_table_get_current_bindings(runtime->binding_table, &bind_count); @@ -309,7 +328,7 @@ static policy_context_t policy_context_init(runtime_t *runtime) { return ctx; } -void runtime_scan(runtime_t *runtime) { +static void runtime_scan(runtime_t *runtime) { auto result = backend_scan_windows(runtime->backend); if (!result) return; @@ -341,7 +360,7 @@ void runtime_scan(runtime_t *runtime) { listeners_notify_initial_windows(&runtime->listeners, &runtime->state); } -void runtime_run(runtime_t *runtime) { +static void runtime_run_event_loop(runtime_t *runtime) { runtime->running = true; backend_t *backend = runtime->backend; @@ -370,3 +389,42 @@ void runtime_run(runtime_t *runtime) { event_cleanup(&event); } } + +bool runtime_run(const char *config_so_path, const char *display_name) { + auto backend = backend_create(nullptr); + auto detect = backend_detect(backend); + if (!backend || !detect || detect->output_count == 0) { + fatal("backend detect failed"); + } + + runtime_init_desc_t desc = { + .backend = backend, + .outputs = detect->outputs, + .output_count = detect->output_count, + }; + if (!runtime_config_load(nullptr, &desc)) { + fatal("failed to build runtime inputs"); + } + + backend = nullptr; + + auto runtime = p_new(runtime_t, 1); + bool inited = runtime_init(runtime, &desc); + + runtime_init_desc_cleanup(&desc); + backend_detect_destroy(detect); + + if (!inited) { + fatal("runtime init failed"); + } + + runtime_setup(runtime); + runtime_scan(runtime); + runtime_run_event_loop(runtime); + + auto restart = runtime->will_restart; + runtime_shutdown(runtime); + p_delete(&runtime); + + return restart; +} diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h new file mode 100644 index 0000000..a1c9331 --- /dev/null +++ b/src/runtime/runtime.h @@ -0,0 +1,3 @@ +#pragma once + +bool runtime_run(const char *config_so_path, const char *display_name);