feat: 添加按键绑定功能
This commit is contained in:
@@ -1,7 +1,17 @@
|
||||
#include "config/defaults.h"
|
||||
|
||||
#include <zdwm/action.h>
|
||||
#include <zdwm/types.h>
|
||||
|
||||
#include "base/macros.h"
|
||||
|
||||
static constexpr char launcher[] =
|
||||
"rofi -show combi -modes combi -combi-modes window,drun,run,ssh,windowcd";
|
||||
|
||||
static void spawn(const zdwm_action_ctx_t *ctx, const zdwm_action_arg_t *arg) {
|
||||
ctx->spawn(arg->str);
|
||||
}
|
||||
|
||||
bool config_defaults_build(
|
||||
const zdwm_api_t *api,
|
||||
zdwm_config_builder_t *builder,
|
||||
@@ -46,5 +56,20 @@ bool config_defaults_build(
|
||||
}
|
||||
}
|
||||
|
||||
auto default_mode = api->add_mode(builder, "default");
|
||||
|
||||
zdwm_action_arg_t launcher_arg = {.str = launcher};
|
||||
api->bind(builder, default_mode, "Mod4+r", spawn, &launcher_arg);
|
||||
|
||||
#define BIND(mode, key, fn, arg) \
|
||||
api->bind(builder, mode, key, fn, &(zdwm_action_arg_t)arg)
|
||||
|
||||
BIND(default_mode, "Mod4+r", spawn, {.str = launcher});
|
||||
|
||||
#undef BIND
|
||||
|
||||
api->set_default_mode(builder, default_mode);
|
||||
api->set_initial_mode(builder, default_mode);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "base/memory.h"
|
||||
#include "config/defaults.h"
|
||||
#include "config/loader.h"
|
||||
#include "core/binding.h"
|
||||
#include "core/layout.h"
|
||||
#include "core/rules.h"
|
||||
#include "core/runtime.h"
|
||||
@@ -21,6 +22,7 @@ struct zdwm_config_builder_t {
|
||||
size_t workspace_count;
|
||||
size_t workspace_capacity;
|
||||
size_t output_count;
|
||||
binding_table_t *binding_table;
|
||||
};
|
||||
|
||||
void runtime_config_cleanup(runtime_init_desc_t *desc) {
|
||||
@@ -30,6 +32,8 @@ void runtime_config_cleanup(runtime_init_desc_t *desc) {
|
||||
desc->layouts.slot_capacity) {
|
||||
layout_registry_cleanup(&desc->layouts);
|
||||
}
|
||||
binding_table_destroy(desc->binding_table);
|
||||
desc->binding_table = nullptr;
|
||||
workspace_desc_list_cleanup(&desc->workspaces, &desc->workspace_count);
|
||||
if (desc->config_module_handle) dlclose(desc->config_module_handle);
|
||||
desc->config_module_handle = nullptr;
|
||||
@@ -45,6 +49,9 @@ static void config_builder_cleanup(zdwm_config_builder_t *builder) {
|
||||
workspace_desc_list_cleanup(&builder->workspaces, &builder->workspace_count);
|
||||
builder->workspace_capacity = 0;
|
||||
builder->output_count = 0;
|
||||
|
||||
binding_table_destroy(builder->binding_table);
|
||||
builder->binding_table = nullptr;
|
||||
}
|
||||
|
||||
static layout_id_t runtime_config_register_layout(
|
||||
@@ -144,6 +151,35 @@ static bool runtime_config_add_rule(
|
||||
return true;
|
||||
}
|
||||
|
||||
static zdwm_binding_mode_id_t
|
||||
runtime_config_add_mode(zdwm_config_builder_t *builder, const char *mode_name) {
|
||||
return binding_table_add_mode(builder->binding_table, mode_name);
|
||||
}
|
||||
|
||||
static bool runtime_config_bind(
|
||||
zdwm_config_builder_t *builder,
|
||||
zdwm_binding_mode_id_t mode,
|
||||
const char *key,
|
||||
zdwm_action_fn fn,
|
||||
zdwm_action_arg_t *arg
|
||||
) {
|
||||
return binding_table_add_bind(builder->binding_table, mode, key, fn, arg);
|
||||
}
|
||||
|
||||
static bool runtime_config_set_default_mode(
|
||||
zdwm_config_builder_t *builder,
|
||||
zdwm_binding_mode_id_t mode_id
|
||||
) {
|
||||
return binding_table_set_default_mode(builder->binding_table, mode_id);
|
||||
}
|
||||
|
||||
static bool runtime_config_set_initial_mode(
|
||||
zdwm_config_builder_t *builder,
|
||||
zdwm_binding_mode_id_t mode_id
|
||||
) {
|
||||
return binding_table_set_current_mode(builder->binding_table, mode_id);
|
||||
}
|
||||
|
||||
static bool config_builder_finish(
|
||||
zdwm_config_builder_t *builder,
|
||||
runtime_init_desc_t *out
|
||||
@@ -154,8 +190,10 @@ static bool config_builder_finish(
|
||||
|
||||
if (!layout_registry_move(&builder->layouts, &out->layouts)) return false;
|
||||
if (!rules_move(&builder->rules, &out->rules)) return false;
|
||||
out->binding_table = builder->binding_table;
|
||||
out->workspaces = builder->workspaces;
|
||||
out->workspace_count = builder->workspace_count;
|
||||
builder->binding_table = nullptr;
|
||||
builder->workspaces = nullptr;
|
||||
builder->workspace_count = 0;
|
||||
builder->workspace_capacity = 0;
|
||||
@@ -172,6 +210,7 @@ static bool runtime_config_build(
|
||||
if (!setup || !out) return false;
|
||||
zdwm_config_builder_t builder = {0};
|
||||
builder.output_count = output_count;
|
||||
builder.binding_table = binding_table_create();
|
||||
|
||||
zdwm_api_t api = {
|
||||
.abi_version = ZDWM_CONFIG_ABI_VERSION,
|
||||
@@ -183,6 +222,10 @@ static bool runtime_config_build(
|
||||
.register_layout = runtime_config_register_layout,
|
||||
.define_workspace = runtime_config_define_workspace,
|
||||
.add_rule = runtime_config_add_rule,
|
||||
.add_mode = runtime_config_add_mode,
|
||||
.bind = runtime_config_bind,
|
||||
.set_default_mode = runtime_config_set_default_mode,
|
||||
.set_initial_mode = runtime_config_set_initial_mode,
|
||||
};
|
||||
bool ok = setup(&api, &builder, outputs, output_count) &&
|
||||
config_builder_finish(&builder, out);
|
||||
|
||||
Reference in New Issue
Block a user