feat: 让 bar 支持点击触发动作

This commit is contained in:
2026-06-23 06:57:38 +08:00
parent 29e0f1e2dc
commit 42bddf5ac7
5 changed files with 86 additions and 2 deletions

View File

@@ -5,6 +5,7 @@
#include <stddef.h>
#include <stdint.h>
#include <unistd.h>
#include <zdwm/action.h>
#include <zdwm/bar.h>
#include <zdwm/types.h>
@@ -394,3 +395,49 @@ bool bar_draw(bar_t *bar) {
return changed;
}
static inline bool
bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) {
if (!(item->region.start <= x && item->region.end >= x)) return false;
if (!item->api.on_click) return true;
for (size_t i = 0; i < item->count; ++i) {
auto cell = &item->cells[i];
if (cell->region.start <= x && cell->region.end >= x) {
*action = item->api.on_click(item, i, x, item->state);
return true;
}
}
return true;
}
static inline bool
bar_side_click(bar_side_t *side, int32_t x, zdwm_action_t *action) {
if (side->region.start > x || side->region.end < x) return false;
for (size_t i = 0; i < side->count; ++i) {
if (bar_item_click(&side->items[i], x, action)) return true;
}
return true;
}
bool bar_click(
bar_t *bar,
zdwm_window_id_t window,
int32_t x,
zdwm_action_t *action
) {
for (size_t i = 0; i < bar->count; ++i) {
auto bar_output = &bar->bars[i];
if (bar_output->window_id != window) continue;
if (bar_side_click(&bar_output->left, x, action)) return true;
if (bar_item_click(&bar_output->center, x, action)) return true;
if (bar_side_click(&bar_output->right, x, action)) return true;
}
return false;
}

View File

@@ -3,6 +3,7 @@
#include <cairo.h>
#include <stddef.h>
#include <stdint.h>
#include <zdwm/action.h>
#include <zdwm/bar.h>
#include <zdwm/types.h>
@@ -42,3 +43,9 @@ void bar_init(bar_t *bar, listeners_t *listeners);
void bar_cleanup(bar_t *bar);
void bar_update(bar_t *bar);
bool bar_draw(bar_t *bar);
bool bar_click(
bar_t *bar,
zdwm_window_id_t window,
int32_t x,
zdwm_action_t *action
);