Compare commits
4 Commits
b510b7b473
...
62f6bab611
| Author | SHA1 | Date | |
|---|---|---|---|
|
62f6bab611
|
|||
|
3a8c392d90
|
|||
|
87535835a8
|
|||
|
fed04cbffc
|
@@ -29,7 +29,9 @@ add_executable(${APP_NAME}
|
|||||||
${SOURCE_DIR}/backend/x11/event.c
|
${SOURCE_DIR}/backend/x11/event.c
|
||||||
${SOURCE_DIR}/backend/x11/window.c
|
${SOURCE_DIR}/backend/x11/window.c
|
||||||
|
|
||||||
|
${SOURCE_DIR}/bar/bar.c
|
||||||
${SOURCE_DIR}/bar/cell.c
|
${SOURCE_DIR}/bar/cell.c
|
||||||
|
${SOURCE_DIR}/bar/text.c
|
||||||
${SOURCE_DIR}/bar/workspaces.c
|
${SOURCE_DIR}/bar/workspaces.c
|
||||||
|
|
||||||
${SOURCE_DIR}/base/color.c
|
${SOURCE_DIR}/base/color.c
|
||||||
@@ -80,6 +82,8 @@ pkg_check_modules(deps REQUIRED
|
|||||||
|
|
||||||
cairo
|
cairo
|
||||||
cairo-xcb
|
cairo-xcb
|
||||||
|
pango
|
||||||
|
pangocairo
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(${APP_NAME} SYSTEM
|
target_include_directories(${APP_NAME} SYSTEM
|
||||||
|
|||||||
@@ -21,6 +21,16 @@ typedef struct zdwm_bar_config_t {
|
|||||||
|
|
||||||
const char *bg;
|
const char *bg;
|
||||||
const char *fg;
|
const char *fg;
|
||||||
|
|
||||||
|
uint32_t tag_cell_padding_x;
|
||||||
|
uint32_t tag_indicator_width;
|
||||||
|
const char *tag_bg;
|
||||||
|
const char *tag_fg;
|
||||||
|
const char *tag_active_bg;
|
||||||
|
const char *tag_active_fg;
|
||||||
|
const char *tag_urgent_bg;
|
||||||
|
const char *tag_urgent_fg;
|
||||||
|
|
||||||
const char *layout_bg;
|
const char *layout_bg;
|
||||||
const char *layout_fg;
|
const char *layout_fg;
|
||||||
const char *binding_mode_bg;
|
const char *binding_mode_bg;
|
||||||
|
|||||||
94
src/bar/bar.c
Normal file
94
src/bar/bar.c
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
#include "bar/bar.h"
|
||||||
|
|
||||||
|
#include <cairo.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <zdwm/bar.h>
|
||||||
|
#include <zdwm/types.h>
|
||||||
|
|
||||||
|
#include "bar/text.h"
|
||||||
|
#include "bar/types.h"
|
||||||
|
#include "bar/workspaces.h"
|
||||||
|
#include "base/array.h"
|
||||||
|
#include "base/memory.h"
|
||||||
|
|
||||||
|
static zdwm_bar_item_t *bar_add_item(
|
||||||
|
bar_output_t *bar_output,
|
||||||
|
zdwm_bar_side_type_t side_type,
|
||||||
|
zdwm_bar_item_type_t item_type,
|
||||||
|
void *config
|
||||||
|
) {
|
||||||
|
auto side = &bar_output->sides[side_type];
|
||||||
|
auto item = array_push(side->items, side->count, side->capacity);
|
||||||
|
item->api = item_type;
|
||||||
|
|
||||||
|
auto create_state = item_type.create_state;
|
||||||
|
if (create_state) item->state = create_state(bar_output->output_id, config);
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bar_item_cleanup(zdwm_bar_item_t *item) {
|
||||||
|
auto destroy_state = item->api.destroy_state;
|
||||||
|
if (destroy_state) destroy_state(item->state);
|
||||||
|
item->state = nullptr;
|
||||||
|
|
||||||
|
p_delete(&item->cells);
|
||||||
|
p_clear(item, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define VALUE(value, fallback) ((value) ? (value) : (fallback))
|
||||||
|
|
||||||
|
void bar_output_add_workspace(
|
||||||
|
bar_output_t *bar_output,
|
||||||
|
zdwm_bar_config_t *config
|
||||||
|
) {
|
||||||
|
auto side = ZDWM_BAR_SIDE_LEFT;
|
||||||
|
|
||||||
|
bar_workspace_config_t workspace_config = {
|
||||||
|
.cell_padding = VALUE(config->tag_cell_padding_x, config->padding_x),
|
||||||
|
.indicator_width = VALUE(config->tag_indicator_width, 4),
|
||||||
|
.bg = VALUE(config->tag_bg, config->bg),
|
||||||
|
.fg = VALUE(config->tag_fg, config->fg),
|
||||||
|
.active_bg = config->tag_active_bg,
|
||||||
|
.active_fg = config->tag_active_fg,
|
||||||
|
.urgent_bg = config->tag_urgent_bg,
|
||||||
|
.urgent_fg = config->tag_urgent_fg,
|
||||||
|
};
|
||||||
|
auto item = bar_add_item(bar_output, side, bar_workspace, &workspace_config);
|
||||||
|
item->cell_padding = workspace_config.cell_padding;
|
||||||
|
item->indicator_width = workspace_config.indicator_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bar_init(bar_t *bar) {
|
||||||
|
auto c = &bar->config;
|
||||||
|
bar->ctx = text_context_create(c->font_family, c->font_size, c->dpi);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < bar->count; ++i) {
|
||||||
|
auto bar_output = &bar->bars[i];
|
||||||
|
bar_output_add_workspace(bar_output, &bar->config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bar_side_cleanup(bar_side_t *side) {
|
||||||
|
for (size_t i = 0; i < side->count; ++i) bar_item_cleanup(&side->items[i]);
|
||||||
|
|
||||||
|
p_delete(&side->items);
|
||||||
|
p_clear(side, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bar_cleanup(bar_t *bar) {
|
||||||
|
text_context_destory(bar->ctx);
|
||||||
|
bar->ctx = nullptr;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < bar->count; ++i) {
|
||||||
|
auto bar_output = &bar->bars[i];
|
||||||
|
for (size_t j = 0; j < ZDWM_BAR_SIDE_COUNT; ++j) {
|
||||||
|
auto side = &bar_output->sides[j];
|
||||||
|
bar_side_cleanup(side);
|
||||||
|
}
|
||||||
|
cairo_destroy(bar_output->cr);
|
||||||
|
bar_output->cr = nullptr;
|
||||||
|
}
|
||||||
|
p_delete(&bar->bars);
|
||||||
|
bar->count = 0;
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <zdwm/bar.h>
|
#include <zdwm/bar.h>
|
||||||
#include <zdwm/types.h>
|
#include <zdwm/types.h>
|
||||||
|
|
||||||
|
#include "bar/text.h"
|
||||||
#include "bar/types.h"
|
#include "bar/types.h"
|
||||||
#include "base/color.h"
|
#include "base/color.h"
|
||||||
|
|
||||||
@@ -27,4 +28,8 @@ typedef struct bar_t {
|
|||||||
|
|
||||||
zdwm_bar_config_t config;
|
zdwm_bar_config_t config;
|
||||||
bar_palette_t palette;
|
bar_palette_t palette;
|
||||||
|
text_context_t *ctx;
|
||||||
} bar_t;
|
} bar_t;
|
||||||
|
|
||||||
|
void bar_init(bar_t *bar);
|
||||||
|
void bar_cleanup(bar_t *bar);
|
||||||
|
|||||||
69
src/bar/text.c
Normal file
69
src/bar/text.c
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#include "bar/text.h"
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
#include <pango/pango-attributes.h>
|
||||||
|
#include <pango/pango-context.h>
|
||||||
|
#include <pango/pango-font.h>
|
||||||
|
#include <pango/pango-layout.h>
|
||||||
|
#include <pango/pango-types.h>
|
||||||
|
#include <pango/pangocairo.h>
|
||||||
|
|
||||||
|
#include "base/memory.h"
|
||||||
|
|
||||||
|
struct text_context_t {
|
||||||
|
PangoContext *context;
|
||||||
|
PangoLayout *layout;
|
||||||
|
PangoAttrList *attr_list;
|
||||||
|
};
|
||||||
|
|
||||||
|
text_context_t *
|
||||||
|
text_context_create(const char *family, uint32_t size, uint32_t dpi) {
|
||||||
|
auto fontmap = pango_cairo_font_map_new();
|
||||||
|
auto context = pango_font_map_create_context(fontmap);
|
||||||
|
pango_cairo_context_set_resolution(context, (double)dpi);
|
||||||
|
|
||||||
|
auto desc = pango_font_description_from_string(family);
|
||||||
|
pango_font_description_set_size(desc, size * PANGO_SCALE);
|
||||||
|
auto attr = pango_attr_font_desc_new(desc);
|
||||||
|
|
||||||
|
auto attr_list = pango_attr_list_new();
|
||||||
|
pango_attr_list_insert(attr_list, attr);
|
||||||
|
|
||||||
|
auto layout = pango_layout_new(context);
|
||||||
|
pango_layout_set_attributes(layout, attr_list);
|
||||||
|
pango_layout_set_wrap(layout, PANGO_WRAP_NONE);
|
||||||
|
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||||
|
|
||||||
|
pango_font_description_free(desc);
|
||||||
|
g_object_unref(fontmap);
|
||||||
|
|
||||||
|
auto ctx = p_new(text_context_t, 1);
|
||||||
|
*ctx = (text_context_t){
|
||||||
|
.context = context,
|
||||||
|
.layout = layout,
|
||||||
|
.attr_list = attr_list,
|
||||||
|
};
|
||||||
|
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
void text_context_destory(text_context_t *context) {
|
||||||
|
if (!context) return;
|
||||||
|
|
||||||
|
if (context->layout) {
|
||||||
|
g_object_unref(context->layout);
|
||||||
|
context->layout = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context->attr_list) {
|
||||||
|
pango_attr_list_unref(context->attr_list);
|
||||||
|
context->attr_list = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context->context) {
|
||||||
|
g_object_unref(context->context);
|
||||||
|
context->context = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
p_delete(&context);
|
||||||
|
}
|
||||||
9
src/bar/text.h
Normal file
9
src/bar/text.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct text_context_t text_context_t;
|
||||||
|
|
||||||
|
text_context_t *
|
||||||
|
text_context_create(const char *family, uint32_t size, uint32_t dpi);
|
||||||
|
void text_context_destory(text_context_t *context);
|
||||||
@@ -26,9 +26,11 @@ struct zdwm_bar_item_t {
|
|||||||
bar_cell_t *cells;
|
bar_cell_t *cells;
|
||||||
size_t count;
|
size_t count;
|
||||||
bar_x_region_t region;
|
bar_x_region_t region;
|
||||||
|
uint32_t cell_padding;
|
||||||
|
uint32_t indicator_width;
|
||||||
|
|
||||||
void *state;
|
void *state;
|
||||||
uint8_t cell_padding;
|
zdwm_bar_item_type_t api;
|
||||||
uint8_t indicator_width;
|
|
||||||
bool dirty;
|
bool dirty;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -39,12 +41,3 @@ typedef struct bar_side_t {
|
|||||||
size_t capacity;
|
size_t capacity;
|
||||||
bar_x_region_t region;
|
bar_x_region_t region;
|
||||||
} bar_side_t;
|
} bar_side_t;
|
||||||
|
|
||||||
typedef struct bars_t {
|
|
||||||
size_t count;
|
|
||||||
int32_t height;
|
|
||||||
bool show_top; /* 如果为 false 则 bar 显示屏幕底部 */
|
|
||||||
bool visible;
|
|
||||||
|
|
||||||
zdwm_bar_config_t config;
|
|
||||||
} bars_t;
|
|
||||||
|
|||||||
@@ -10,6 +10,31 @@
|
|||||||
|
|
||||||
#include "base/array.h"
|
#include "base/array.h"
|
||||||
#include "base/memory.h"
|
#include "base/memory.h"
|
||||||
|
#include "core/listeners.h"
|
||||||
|
|
||||||
|
typedef struct bar_workspace_t {
|
||||||
|
zdwm_workspace_t info;
|
||||||
|
size_t window_count;
|
||||||
|
size_t urgent_window_count;
|
||||||
|
} bar_workspace_t;
|
||||||
|
|
||||||
|
typedef struct bar_workspace_state_t {
|
||||||
|
zdwm_output_id_t output_id;
|
||||||
|
zdwm_workspace_id_t workspace_id;
|
||||||
|
bar_workspace_t *workspaces;
|
||||||
|
size_t count;
|
||||||
|
size_t capacity;
|
||||||
|
|
||||||
|
zdwm_window_t *windows;
|
||||||
|
size_t window_count;
|
||||||
|
size_t window_capacity;
|
||||||
|
|
||||||
|
bar_workspace_config_t config;
|
||||||
|
|
||||||
|
bool list_inited;
|
||||||
|
bool active_inited;
|
||||||
|
bool dirty;
|
||||||
|
} bar_workspace_state_t;
|
||||||
|
|
||||||
static size_t state_workspace_get_urgent_window_count(
|
static size_t state_workspace_get_urgent_window_count(
|
||||||
const bar_workspace_state_t *state,
|
const bar_workspace_state_t *state,
|
||||||
@@ -55,18 +80,19 @@ static zdwm_window_t *state_get_window(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *bar_workspaces_create_state(zdwm_output_id_t output_id, void *config) {
|
static void *
|
||||||
const bar_workspace_palette_t *palette = config;
|
bar_workspaces_create_state(zdwm_output_id_t output_id, void *config) {
|
||||||
assert(palette);
|
const bar_workspace_config_t *workspace_config = config;
|
||||||
|
assert(workspace_config);
|
||||||
|
|
||||||
auto state = p_new(bar_workspace_state_t, 1);
|
auto state = p_new(bar_workspace_state_t, 1);
|
||||||
state->output_id = output_id;
|
state->output_id = output_id;
|
||||||
state->palette = *palette;
|
state->config = *workspace_config;
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_workspaces_update(
|
static void bar_workspaces_update(
|
||||||
zdwm_bar_item_t *item,
|
zdwm_bar_item_t *item,
|
||||||
const zdwm_bar_cell_api_t *cell_api,
|
const zdwm_bar_cell_api_t *cell_api,
|
||||||
void *state
|
void *state
|
||||||
@@ -78,7 +104,7 @@ void bar_workspaces_update(
|
|||||||
cell_api->set_cell_count(item, data->count);
|
cell_api->set_cell_count(item, data->count);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto palette = &data->palette;
|
auto config = &data->config;
|
||||||
for (size_t i = 0; i < data->count; ++i) {
|
for (size_t i = 0; i < data->count; ++i) {
|
||||||
auto workspace = &data->workspaces[i];
|
auto workspace = &data->workspaces[i];
|
||||||
auto info = &workspace->info;
|
auto info = &workspace->info;
|
||||||
@@ -92,25 +118,25 @@ void bar_workspaces_update(
|
|||||||
|
|
||||||
cell_api->cell_set_text(item, i, info->name);
|
cell_api->cell_set_text(item, i, info->name);
|
||||||
if (info->id == data->workspace_id) {
|
if (info->id == data->workspace_id) {
|
||||||
cell_api->cell_set_bg(item, i, palette->active_bg);
|
cell_api->cell_set_bg(item, i, config->active_bg);
|
||||||
cell_api->cell_set_fg(item, i, palette->active_fg);
|
cell_api->cell_set_fg(item, i, config->active_fg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (workspace->urgent_window_count > 0) {
|
if (workspace->urgent_window_count > 0) {
|
||||||
cell_api->cell_set_bg(item, i, palette->urgent_bg);
|
cell_api->cell_set_bg(item, i, config->urgent_bg);
|
||||||
cell_api->cell_set_fg(item, i, palette->urgent_fg);
|
cell_api->cell_set_fg(item, i, config->urgent_fg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell_api->cell_set_bg(item, i, palette->bg);
|
cell_api->cell_set_bg(item, i, config->bg);
|
||||||
cell_api->cell_set_fg(item, i, palette->fg);
|
cell_api->cell_set_fg(item, i, config->fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
data->dirty = false;
|
data->dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
zdwm_action_t bar_workspace_on_click(
|
static zdwm_action_t bar_workspace_on_click(
|
||||||
zdwm_bar_item_t *item,
|
zdwm_bar_item_t *item,
|
||||||
size_t cell_index,
|
size_t cell_index,
|
||||||
int32_t x,
|
int32_t x,
|
||||||
@@ -129,13 +155,23 @@ zdwm_action_t bar_workspace_on_click(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_workspace_destroy_state(void *state) {
|
static void bar_workspace_destroy_state(void *state) {
|
||||||
|
if (!state) return;
|
||||||
|
|
||||||
auto data = (bar_workspace_state_t *)state;
|
auto data = (bar_workspace_state_t *)state;
|
||||||
p_delete(&data->workspaces);
|
p_delete(&data->workspaces);
|
||||||
p_clear(data, 1);
|
p_delete(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_workspace_list_filter(
|
zdwm_bar_item_type_t bar_workspace = {
|
||||||
|
.create_state = bar_workspaces_create_state,
|
||||||
|
.update = bar_workspaces_update,
|
||||||
|
.on_click = bar_workspace_on_click,
|
||||||
|
.destroy_state = bar_workspace_destroy_state,
|
||||||
|
.update_interval_ms = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void bar_workspace_list_filter(
|
||||||
const zdwm_workspace_t *list,
|
const zdwm_workspace_t *list,
|
||||||
size_t count,
|
size_t count,
|
||||||
void *user_data
|
void *user_data
|
||||||
@@ -155,7 +191,7 @@ void bar_workspace_list_filter(
|
|||||||
state->dirty = true;
|
state->dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_workspace_active_updated(
|
static void bar_workspace_active_updated(
|
||||||
zdwm_output_id_t output_id,
|
zdwm_output_id_t output_id,
|
||||||
zdwm_workspace_id_t workspace_id,
|
zdwm_workspace_id_t workspace_id,
|
||||||
void *user_data
|
void *user_data
|
||||||
@@ -170,17 +206,6 @@ void bar_workspace_active_updated(
|
|||||||
state->dirty = true;
|
state->dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_workspace_initial_windows(
|
|
||||||
const zdwm_window_t *list,
|
|
||||||
size_t count,
|
|
||||||
void *user_data
|
|
||||||
) {
|
|
||||||
for (size_t i = 0; i < count; ++i) {
|
|
||||||
auto window = &list[i];
|
|
||||||
bar_workspace_window_added(window, user_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) {
|
void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) {
|
||||||
auto state = (bar_workspace_state_t *)user_data;
|
auto state = (bar_workspace_state_t *)user_data;
|
||||||
|
|
||||||
@@ -191,6 +216,17 @@ void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) {
|
|||||||
state->dirty = true;
|
state->dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bar_workspace_initial_windows(
|
||||||
|
const zdwm_window_t *list,
|
||||||
|
size_t count,
|
||||||
|
void *user_data
|
||||||
|
) {
|
||||||
|
for (size_t i = 0; i < count; ++i) {
|
||||||
|
auto window = &list[i];
|
||||||
|
bar_workspace_window_added(window, user_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void bar_workspace_window_updated(
|
void bar_workspace_window_updated(
|
||||||
const zdwm_window_t *window,
|
const zdwm_window_t *window,
|
||||||
void *user_data
|
void *user_data
|
||||||
@@ -222,3 +258,16 @@ void bar_workspace_window_removed(zdwm_window_id_t window_id, void *user_data) {
|
|||||||
state->dirty = true;
|
state->dirty = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bar_workspace_add_listeners(listeners_t *listeners, void *state) {
|
||||||
|
#define ADD(ADD_FN, LISTENER) ADD_FN(listeners, LISTENER, state)
|
||||||
|
|
||||||
|
ADD(listeners_add_initial_workspace_listener, bar_workspace_list_filter);
|
||||||
|
ADD(listeners_add_active_workspace_listener, bar_workspace_active_updated);
|
||||||
|
ADD(listeners_add_initial_window_listener, bar_workspace_initial_windows);
|
||||||
|
ADD(listeners_add_window_added_listener, bar_workspace_window_added);
|
||||||
|
ADD(listeners_add_window_updated_listener, bar_workspace_window_updated);
|
||||||
|
ADD(listeners_add_window_removed_listener, bar_workspace_window_removed);
|
||||||
|
|
||||||
|
#undef ADD
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,73 +1,21 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stdint.h>
|
||||||
#include <zdwm/action.h>
|
|
||||||
#include <zdwm/bar.h>
|
#include <zdwm/bar.h>
|
||||||
#include <zdwm/listeners.h>
|
|
||||||
#include <zdwm/types.h>
|
|
||||||
|
|
||||||
typedef struct bar_workspace_palette_t {
|
#include "core/listeners.h"
|
||||||
|
|
||||||
|
typedef struct bar_workspace_config_t {
|
||||||
|
uint32_t cell_padding;
|
||||||
|
uint32_t indicator_width;
|
||||||
const char *bg;
|
const char *bg;
|
||||||
const char *fg;
|
const char *fg;
|
||||||
const char *active_bg;
|
const char *active_bg;
|
||||||
const char *active_fg;
|
const char *active_fg;
|
||||||
const char *urgent_bg;
|
const char *urgent_bg;
|
||||||
const char *urgent_fg;
|
const char *urgent_fg;
|
||||||
} bar_workspace_palette_t;
|
} bar_workspace_config_t;
|
||||||
|
|
||||||
typedef struct bar_workspace_t {
|
extern zdwm_bar_item_type_t bar_workspace;
|
||||||
zdwm_workspace_t info;
|
|
||||||
size_t window_count;
|
|
||||||
size_t urgent_window_count;
|
|
||||||
} bar_workspace_t;
|
|
||||||
|
|
||||||
typedef struct bar_workspace_state_t {
|
void bar_workspace_add_listeners(listeners_t *listeners, void *state);
|
||||||
zdwm_output_id_t output_id;
|
|
||||||
zdwm_workspace_id_t workspace_id;
|
|
||||||
bar_workspace_t *workspaces;
|
|
||||||
size_t count;
|
|
||||||
size_t capacity;
|
|
||||||
|
|
||||||
zdwm_window_t *windows;
|
|
||||||
size_t window_count;
|
|
||||||
size_t window_capacity;
|
|
||||||
|
|
||||||
bar_workspace_palette_t palette;
|
|
||||||
|
|
||||||
bool list_inited;
|
|
||||||
bool active_inited;
|
|
||||||
bool dirty;
|
|
||||||
} bar_workspace_state_t;
|
|
||||||
|
|
||||||
void *bar_workspaces_create_state(zdwm_output_id_t output_id, void *config);
|
|
||||||
void bar_workspaces_update(
|
|
||||||
zdwm_bar_item_t *item,
|
|
||||||
const zdwm_bar_cell_api_t *cell_api,
|
|
||||||
void *state
|
|
||||||
);
|
|
||||||
zdwm_action_t bar_workspace_on_click(
|
|
||||||
zdwm_bar_item_t *item,
|
|
||||||
size_t cell_index,
|
|
||||||
int32_t x,
|
|
||||||
void *state
|
|
||||||
);
|
|
||||||
void bar_workspace_destroy_state(void *state);
|
|
||||||
|
|
||||||
void bar_workspace_list_filter(
|
|
||||||
const zdwm_workspace_t *list,
|
|
||||||
size_t count,
|
|
||||||
void *user_data
|
|
||||||
);
|
|
||||||
void bar_workspace_active_updated(
|
|
||||||
zdwm_output_id_t output_id,
|
|
||||||
zdwm_workspace_id_t workspace_id,
|
|
||||||
void *user_data
|
|
||||||
);
|
|
||||||
void bar_workspace_initial_windows(
|
|
||||||
const zdwm_window_t *list,
|
|
||||||
size_t count,
|
|
||||||
void *user_data
|
|
||||||
);
|
|
||||||
void bar_workspace_window_added(const zdwm_window_t *window, void *user_data);
|
|
||||||
void bar_workspace_window_updated(const zdwm_window_t *window, void *user_data);
|
|
||||||
void bar_workspace_window_removed(zdwm_window_id_t window_id, void *user_data);
|
|
||||||
|
|||||||
@@ -150,6 +150,8 @@ static void runtime_shutdown(runtime_t *runtime) {
|
|||||||
runtime->backend = nullptr;
|
runtime->backend = nullptr;
|
||||||
if (runtime->config_module_handle) dlclose(runtime->config_module_handle);
|
if (runtime->config_module_handle) dlclose(runtime->config_module_handle);
|
||||||
runtime->config_module_handle = nullptr;
|
runtime->config_module_handle = nullptr;
|
||||||
|
|
||||||
|
bar_cleanup(&runtime->bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void runtime_notify_initial_state(runtime_t *runtime) {
|
static void runtime_notify_initial_state(runtime_t *runtime) {
|
||||||
@@ -225,6 +227,8 @@ static void runtime_init_bar(runtime_t *runtime) {
|
|||||||
bar_output->window_id = bar_window.window_id;
|
bar_output->window_id = bar_window.window_id;
|
||||||
bar_output->output_id = output->id;
|
bar_output->output_id = output->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bar_init(&runtime->bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void runtime_setup(runtime_t *runtime) {
|
static void runtime_setup(runtime_t *runtime) {
|
||||||
|
|||||||
Reference in New Issue
Block a user