状态栏绘制添加图标和色彩设置
This commit is contained in:
@@ -45,6 +45,14 @@ pkg_check_modules(PULSE REQUIRED libpulse-mainloop-glib)
|
|||||||
add_subdirectory(xcb)
|
add_subdirectory(xcb)
|
||||||
add_subdirectory(renderer)
|
add_subdirectory(renderer)
|
||||||
|
|
||||||
|
# status icons(all from https://remixicon.com/)
|
||||||
|
set(NET_UP_ICON "${SOURCE_DIR}/resources/icons/corner-right-up-line.png")
|
||||||
|
set(NET_DOWN_ICON "${SOURCE_DIR}/resources/icons/corner-left-down-line.png")
|
||||||
|
set(SPEAKER_ICON "${SOURCE_DIR}/resources/icons/volume-up-fill.png")
|
||||||
|
set(MEM_ICON "${SOURCE_DIR}/resources/icons/ram-line.png")
|
||||||
|
set(CPU_ICON "${SOURCE_DIR}/resources/icons/cpu-line.png")
|
||||||
|
set(CLOCK_ICON "${SOURCE_DIR}/resources/icons/time-line.png")
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/app.h.in"
|
"${CMAKE_CURRENT_SOURCE_DIR}/app.h.in"
|
||||||
"${CMAKE_BINARY_DIR}/app.h"
|
"${CMAKE_BINARY_DIR}/app.h"
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define APP_NAME "@APP_NAME@"
|
#define APP_NAME "@APP_NAME@"
|
||||||
|
|
||||||
|
#define NET_UP_ICON "@NET_UP_ICON@"
|
||||||
|
#define NET_DOWN_ICON "@NET_DOWN_ICON@"
|
||||||
|
#define SPEAKER_ICON "@SPEAKER_ICON@"
|
||||||
|
#define MEM_ICON "@MEM_ICON@"
|
||||||
|
#define CPU_ICON "@CPU_ICON@"
|
||||||
|
#define CLOCK_ICON "@CLOCK_ICON@"
|
||||||
|
|||||||
10
src/config.h
10
src/config.h
@@ -152,7 +152,12 @@ const char *const client_name_bg = "#222222";
|
|||||||
const char *const client_name_color = "#bbbbbb";
|
const char *const client_name_color = "#bbbbbb";
|
||||||
const char *const active_client_name_bg = "#005577";
|
const char *const active_client_name_bg = "#005577";
|
||||||
const char *const active_client_name_color = "#eeeeee";
|
const char *const active_client_name_color = "#eeeeee";
|
||||||
const char *const status_color = "#bbbbbb";
|
const char *const status_net_recv_color = "#87af5f";
|
||||||
|
const char *const status_net_send_color = "#e54c62";
|
||||||
|
const char *const status_volume_color = "#7493d2";
|
||||||
|
const char *const status_memory_color = "#e0da37";
|
||||||
|
const char *const status_cpu_color = "#e33a6e";
|
||||||
|
const char *const status_datetime_color = "#7788af";
|
||||||
const char *const border_color = "#444444";
|
const char *const border_color = "#444444";
|
||||||
const char *const active_border_color = "#005577";
|
const char *const active_border_color = "#005577";
|
||||||
|
|
||||||
@@ -164,5 +169,6 @@ const uint32_t bar_y_padding = 1;
|
|||||||
const uint32_t tag_x_padding = 10;
|
const uint32_t tag_x_padding = 10;
|
||||||
const uint32_t layout_symbol_x_padding = 10;
|
const uint32_t layout_symbol_x_padding = 10;
|
||||||
const uint32_t client_name_x_padding = 10;
|
const uint32_t client_name_x_padding = 10;
|
||||||
const uint32_t status_x_padding = 6;
|
const uint32_t status_x_padding = 4;
|
||||||
|
const uint32_t status_icon_padding = 2;
|
||||||
const uint32_t border_width = 1;
|
const uint32_t border_width = 1;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cairo.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -9,11 +10,13 @@ uint32_t *generate_wallpaper(const wallpaper_config_t *wallpaper_config,
|
|||||||
const monitor_t *monitors, const uint32_t index,
|
const monitor_t *monitors, const uint32_t index,
|
||||||
const uint32_t screen_width,
|
const uint32_t screen_width,
|
||||||
const uint32_t screen_height);
|
const uint32_t screen_height);
|
||||||
|
uint32_t *generate_icon_pixels(const char *image_path, uint32_t width,
|
||||||
|
uint32_t height, uint32_t padding);
|
||||||
|
|
||||||
uint32_t get_font_height(const char *font_family, const uint32_t font_size,
|
uint32_t get_font_height(const char *font_family, const uint32_t font_size,
|
||||||
const uint32_t dpi);
|
const uint32_t dpi);
|
||||||
void draw_bar(monitor_t *monitor, bool is_current_monitor, status_t *status,
|
void draw_bar(monitor_t *monitor, bool is_current_monitor, status_t *status,
|
||||||
color_set_t *color_set, uint32_t height, uint32_t tag_x_padding,
|
icons_t *icons, color_set_t *color_set, uint32_t height,
|
||||||
uint32_t layout_x_padding, uint32_t client_name_x_padding,
|
uint32_t tag_x_padding, uint32_t layout_x_padding,
|
||||||
uint32_t status_x_padding);
|
uint32_t client_name_x_padding, uint32_t status_x_padding);
|
||||||
void clean_pango_context(void);
|
void clean_pango_context(void);
|
||||||
|
|||||||
@@ -115,7 +115,12 @@ typedef struct color_set_t {
|
|||||||
color_t client_name_color;
|
color_t client_name_color;
|
||||||
color_t active_client_name_bg;
|
color_t active_client_name_bg;
|
||||||
color_t active_client_name_color;
|
color_t active_client_name_color;
|
||||||
color_t status_color;
|
color_t status_net_recv_color;
|
||||||
|
color_t status_net_send_color;
|
||||||
|
color_t status_volume_color;
|
||||||
|
color_t status_memory_color;
|
||||||
|
color_t status_cpu_color;
|
||||||
|
color_t status_datetime_color;
|
||||||
color_t border_color;
|
color_t border_color;
|
||||||
color_t active_border_color;
|
color_t active_border_color;
|
||||||
} color_set_t;
|
} color_set_t;
|
||||||
@@ -160,3 +165,21 @@ typedef struct {
|
|||||||
double cpu_usage_percent;
|
double cpu_usage_percent;
|
||||||
char time[256];
|
char time[256];
|
||||||
} status_t;
|
} status_t;
|
||||||
|
|
||||||
|
typedef struct icons_t {
|
||||||
|
/* 像素数据 */
|
||||||
|
uint32_t *net_down_pixels;
|
||||||
|
uint32_t *net_up_pixels;
|
||||||
|
uint32_t *volume_pixels;
|
||||||
|
uint32_t *memory_pixels;
|
||||||
|
uint32_t *cpu_pixels;
|
||||||
|
uint32_t *clock_pixels;
|
||||||
|
|
||||||
|
/* cairo_t * 类型,为避免引入 cairo 库使用 void * 类型代替 */
|
||||||
|
void *net_down;
|
||||||
|
void *net_up;
|
||||||
|
void *volume;
|
||||||
|
void *memory;
|
||||||
|
void *cpu;
|
||||||
|
void *clock;
|
||||||
|
} icons_t;
|
||||||
|
|||||||
113
src/main.c
113
src/main.c
@@ -13,6 +13,7 @@
|
|||||||
#include <xcb/xproto.h>
|
#include <xcb/xproto.h>
|
||||||
|
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
|
#include "app.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "event-adapter.h"
|
#include "event-adapter.h"
|
||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
@@ -30,6 +31,8 @@ static void set_wallpaper_by_index(uint32_t index, wallpaper_config_t *config,
|
|||||||
cairo_t *cr);
|
cairo_t *cr);
|
||||||
static wallpaper_config_t *parse_wallpaper_config(void);
|
static wallpaper_config_t *parse_wallpaper_config(void);
|
||||||
static void free_wallpaper_config(wallpaper_config_t *wallpaper_config);
|
static void free_wallpaper_config(wallpaper_config_t *wallpaper_config);
|
||||||
|
static void init_icons(void);
|
||||||
|
static void clean_icons(void);
|
||||||
static void init_color_set(void);
|
static void init_color_set(void);
|
||||||
static void parse_color(const char *hex, color_t *color);
|
static void parse_color(const char *hex, color_t *color);
|
||||||
static void init_monitor_bar(void);
|
static void init_monitor_bar(void);
|
||||||
@@ -82,6 +85,7 @@ static monitor_t *monitors = NULL;
|
|||||||
static monitor_t *current_monitor = NULL;
|
static monitor_t *current_monitor = NULL;
|
||||||
static cairo_t *wallpaper_cr = NULL;
|
static cairo_t *wallpaper_cr = NULL;
|
||||||
static wallpaper_config_t *wallpaper_config = NULL;
|
static wallpaper_config_t *wallpaper_config = NULL;
|
||||||
|
static icons_t *icons = NULL;
|
||||||
static color_set_t *color_set = NULL;
|
static color_set_t *color_set = NULL;
|
||||||
static status_t *status = NULL;
|
static status_t *status = NULL;
|
||||||
static GMainLoop *loop = NULL;
|
static GMainLoop *loop = NULL;
|
||||||
@@ -94,6 +98,7 @@ static uint32_t tag_x_pad = tag_x_padding;
|
|||||||
static uint32_t layout_symbol_x_pad = layout_symbol_x_padding;
|
static uint32_t layout_symbol_x_pad = layout_symbol_x_padding;
|
||||||
static uint32_t client_name_x_pad = client_name_x_padding;
|
static uint32_t client_name_x_pad = client_name_x_padding;
|
||||||
static uint32_t status_x_pad = status_x_padding;
|
static uint32_t status_x_pad = status_x_padding;
|
||||||
|
static uint32_t status_icon_pad = status_icon_padding;
|
||||||
static uint32_t bar_height = 0;
|
static uint32_t bar_height = 0;
|
||||||
static uint32_t border_px = border_width;
|
static uint32_t border_px = border_width;
|
||||||
|
|
||||||
@@ -253,7 +258,12 @@ static void print_color_set(color_set_t *set) {
|
|||||||
print_color("== client name color:", &set->client_name_color);
|
print_color("== client name color:", &set->client_name_color);
|
||||||
print_color("== active client name bg:", &set->active_client_name_bg);
|
print_color("== active client name bg:", &set->active_client_name_bg);
|
||||||
print_color("== active client name color:", &set->active_client_name_color);
|
print_color("== active client name color:", &set->active_client_name_color);
|
||||||
print_color("== status color:", &set->status_color);
|
print_color("== status net recv color:", &set->status_net_recv_color);
|
||||||
|
print_color("== status net send color:", &set->status_net_send_color);
|
||||||
|
print_color("== status volume color:", &set->status_volume_color);
|
||||||
|
print_color("== status memory color:", &set->status_memory_color);
|
||||||
|
print_color("== status cpu color:", &set->status_cpu_color);
|
||||||
|
print_color("== status datetime color:", &set->status_datetime_color);
|
||||||
print_color("== border color:", &set->border_color);
|
print_color("== border color:", &set->border_color);
|
||||||
print_color("== active border color:", &set->active_border_color);
|
print_color("== active border color:", &set->active_border_color);
|
||||||
}
|
}
|
||||||
@@ -489,6 +499,66 @@ void free_wallpaper_config(wallpaper_config_t *wallpaper_config) {
|
|||||||
free(wallpaper_config);
|
free(wallpaper_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_icons(void) {
|
||||||
|
typedef struct {
|
||||||
|
const char *img_path;
|
||||||
|
cairo_surface_t **icon;
|
||||||
|
uint32_t **pixels;
|
||||||
|
} icon_path_surface_map_t;
|
||||||
|
|
||||||
|
if (icons) return;
|
||||||
|
|
||||||
|
icons = ecalloc(1, sizeof(icons_t));
|
||||||
|
icon_path_surface_map_t map[] = {
|
||||||
|
{NET_DOWN_ICON, (cairo_surface_t **)&icons->net_down,
|
||||||
|
&icons->net_down_pixels},
|
||||||
|
{NET_UP_ICON, (cairo_surface_t **)&icons->net_up, &icons->net_up_pixels},
|
||||||
|
{SPEAKER_ICON, (cairo_surface_t **)&icons->volume, &icons->volume_pixels},
|
||||||
|
{MEM_ICON, (cairo_surface_t **)&icons->memory, &icons->memory_pixels},
|
||||||
|
{CPU_ICON, (cairo_surface_t **)&icons->cpu, &icons->cpu_pixels},
|
||||||
|
{CLOCK_ICON, (cairo_surface_t **)&icons->clock, &icons->clock_pixels},
|
||||||
|
};
|
||||||
|
for (int i = 0; i < LENGTH(map); i++) {
|
||||||
|
const char *path = map[i].img_path;
|
||||||
|
uint32_t **pixels_addr = map[i].pixels;
|
||||||
|
cairo_surface_t **surface_addr = map[i].icon;
|
||||||
|
if (path && strlen(path)) {
|
||||||
|
*pixels_addr =
|
||||||
|
generate_icon_pixels(path, bar_height, bar_height, status_icon_pad);
|
||||||
|
cairo_format_t format = CAIRO_FORMAT_ARGB32;
|
||||||
|
int stride = cairo_format_stride_for_width(format, bar_height);
|
||||||
|
cairo_surface_t *surface = cairo_image_surface_create_for_data(
|
||||||
|
(uint8_t *)*pixels_addr, format, bar_height, bar_height, stride);
|
||||||
|
if (cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS) {
|
||||||
|
*surface_addr = surface;
|
||||||
|
} else {
|
||||||
|
cairo_surface_destroy(surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clean_icons(void) {
|
||||||
|
if (!icons) return;
|
||||||
|
|
||||||
|
if (icons->net_down) cairo_surface_destroy(icons->net_down);
|
||||||
|
if (icons->net_up) cairo_surface_destroy(icons->net_up);
|
||||||
|
if (icons->volume) cairo_surface_destroy(icons->volume);
|
||||||
|
if (icons->memory) cairo_surface_destroy(icons->memory);
|
||||||
|
if (icons->cpu) cairo_surface_destroy(icons->cpu);
|
||||||
|
if (icons->clock) cairo_surface_destroy(icons->clock);
|
||||||
|
|
||||||
|
if (icons->net_down_pixels) free(icons->net_down);
|
||||||
|
if (icons->net_up_pixels) free(icons->net_up);
|
||||||
|
if (icons->volume_pixels) free(icons->volume);
|
||||||
|
if (icons->memory_pixels) free(icons->memory);
|
||||||
|
if (icons->cpu_pixels) free(icons->cpu);
|
||||||
|
if (icons->clock_pixels) free(icons->clock);
|
||||||
|
|
||||||
|
free(icons);
|
||||||
|
icons = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void init_color_set(void) {
|
void init_color_set(void) {
|
||||||
color_set = ecalloc(1, sizeof(color_set_t));
|
color_set = ecalloc(1, sizeof(color_set_t));
|
||||||
char *bar_background = NULL;
|
char *bar_background = NULL;
|
||||||
@@ -501,7 +571,12 @@ void init_color_set(void) {
|
|||||||
char *client_name = NULL;
|
char *client_name = NULL;
|
||||||
char *active_client_name_background = NULL;
|
char *active_client_name_background = NULL;
|
||||||
char *active_client_name = NULL;
|
char *active_client_name = NULL;
|
||||||
char *status = NULL;
|
char *status_net_recv = NULL;
|
||||||
|
char *status_net_send = NULL;
|
||||||
|
char *status_volume = NULL;
|
||||||
|
char *status_memory = NULL;
|
||||||
|
char *status_cpu = NULL;
|
||||||
|
char *status_datetime = NULL;
|
||||||
char *border = NULL;
|
char *border = NULL;
|
||||||
char *active_border = NULL;
|
char *active_border = NULL;
|
||||||
|
|
||||||
@@ -520,7 +595,17 @@ void init_color_set(void) {
|
|||||||
&active_client_name_background, active_client_name_bg);
|
&active_client_name_background, active_client_name_bg);
|
||||||
get_xresource_string("zswm.color.active_client_name_color",
|
get_xresource_string("zswm.color.active_client_name_color",
|
||||||
&active_client_name, active_client_name_color);
|
&active_client_name, active_client_name_color);
|
||||||
get_xresource_string("zswm.color.status", &status, status_color);
|
get_xresource_string("zswm.color.status_net_recv", &status_net_recv,
|
||||||
|
status_net_recv_color);
|
||||||
|
get_xresource_string("zswm.color.status_net_send", &status_net_send,
|
||||||
|
status_net_send_color);
|
||||||
|
get_xresource_string("zswm.color.status_volume", &status_volume,
|
||||||
|
status_volume_color);
|
||||||
|
get_xresource_string("zswm.color.status_memory", &status_memory,
|
||||||
|
status_memory_color);
|
||||||
|
get_xresource_string("zswm.color.status_cpu", &status_cpu, status_cpu_color);
|
||||||
|
get_xresource_string("zswm.color.status_datetime", &status_datetime,
|
||||||
|
status_datetime_color);
|
||||||
get_xresource_string("zswm.color.border", &border, border_color);
|
get_xresource_string("zswm.color.border", &border, border_color);
|
||||||
get_xresource_string("zswm.color.active_border", &active_border,
|
get_xresource_string("zswm.color.active_border", &active_border,
|
||||||
active_border_color);
|
active_border_color);
|
||||||
@@ -535,7 +620,12 @@ void init_color_set(void) {
|
|||||||
parse_color(client_name, &color_set->client_name_color);
|
parse_color(client_name, &color_set->client_name_color);
|
||||||
parse_color(active_client_name_background, &color_set->active_client_name_bg);
|
parse_color(active_client_name_background, &color_set->active_client_name_bg);
|
||||||
parse_color(active_client_name, &color_set->active_client_name_color);
|
parse_color(active_client_name, &color_set->active_client_name_color);
|
||||||
parse_color(status, &color_set->status_color);
|
parse_color(status_net_recv, &color_set->status_net_recv_color);
|
||||||
|
parse_color(status_net_send, &color_set->status_net_send_color);
|
||||||
|
parse_color(status_volume, &color_set->status_volume_color);
|
||||||
|
parse_color(status_memory, &color_set->status_memory_color);
|
||||||
|
parse_color(status_cpu, &color_set->status_cpu_color);
|
||||||
|
parse_color(status_datetime, &color_set->status_datetime_color);
|
||||||
parse_color(border, &color_set->border_color);
|
parse_color(border, &color_set->border_color);
|
||||||
parse_color(active_border, &color_set->active_border_color);
|
parse_color(active_border, &color_set->active_border_color);
|
||||||
|
|
||||||
@@ -549,7 +639,12 @@ void init_color_set(void) {
|
|||||||
free(client_name);
|
free(client_name);
|
||||||
free(active_client_name_background);
|
free(active_client_name_background);
|
||||||
free(active_client_name);
|
free(active_client_name);
|
||||||
free(status);
|
free(status_net_recv);
|
||||||
|
free(status_net_send);
|
||||||
|
free(status_volume);
|
||||||
|
free(status_memory);
|
||||||
|
free(status_cpu);
|
||||||
|
free(status_datetime);
|
||||||
free(border);
|
free(border);
|
||||||
free(active_border);
|
free(active_border);
|
||||||
}
|
}
|
||||||
@@ -602,6 +697,7 @@ void get_xresource_config(void) {
|
|||||||
get_xresource_uint32("zswm.layout_symbol_x_padding", &layout_symbol_x_pad);
|
get_xresource_uint32("zswm.layout_symbol_x_padding", &layout_symbol_x_pad);
|
||||||
get_xresource_uint32("zswm.client_name_x_padding", &client_name_x_pad);
|
get_xresource_uint32("zswm.client_name_x_padding", &client_name_x_pad);
|
||||||
get_xresource_uint32("zswm.status_x_padding", &status_x_pad);
|
get_xresource_uint32("zswm.status_x_padding", &status_x_pad);
|
||||||
|
get_xresource_uint32("zswm.status_icon_padding", &status_icon_pad);
|
||||||
get_xresource_uint32("zswm.border_width", &border_px);
|
get_xresource_uint32("zswm.border_width", &border_px);
|
||||||
|
|
||||||
logger("dpi: %u, font family: %s, font size: %u\n", dpi, font_family,
|
logger("dpi: %u, font family: %s, font size: %u\n", dpi, font_family,
|
||||||
@@ -619,8 +715,8 @@ void draw_all_monitor_bars(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void draw_monitor_bar(monitor_t *m) {
|
void draw_monitor_bar(monitor_t *m) {
|
||||||
draw_bar(m, m == current_monitor, status, color_set, bar_height, tag_x_pad,
|
draw_bar(m, m == current_monitor, status, icons, color_set, bar_height,
|
||||||
layout_symbol_x_pad, client_name_x_pad, status_x_pad);
|
tag_x_pad, layout_symbol_x_pad, client_name_x_pad, status_x_pad);
|
||||||
flush_xcb_connection();
|
flush_xcb_connection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1294,6 +1390,8 @@ void cleanup(bool will_restart) {
|
|||||||
free(color_set);
|
free(color_set);
|
||||||
color_set = NULL;
|
color_set = NULL;
|
||||||
|
|
||||||
|
clean_icons();
|
||||||
|
|
||||||
free(font_family);
|
free(font_family);
|
||||||
font_family = NULL;
|
font_family = NULL;
|
||||||
|
|
||||||
@@ -1317,6 +1415,7 @@ int main(int argc, char *argv[]) {
|
|||||||
init_monitor_bar();
|
init_monitor_bar();
|
||||||
change_window_cursor(get_root_window(), cursor_normal);
|
change_window_cursor(get_root_window(), cursor_normal);
|
||||||
init_wallpaper();
|
init_wallpaper();
|
||||||
|
init_icons();
|
||||||
init_status(g_main_loop_get_context(loop), update_status);
|
init_status(g_main_loop_get_context(loop), update_status);
|
||||||
|
|
||||||
draw_all_monitor_bars();
|
draw_all_monitor_bars();
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#include <Imlib2.h>
|
#include <Imlib2.h>
|
||||||
|
#include <cairo.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -11,7 +13,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 生成需要由 xcb 绘制的壁纸数据
|
* @brief 生成需要由 xcb 绘制的壁纸数据
|
||||||
* @returns 壁纸数据,使用后记得释放
|
* @returns 壁纸像素数据( RGBA 顺序),使用后记得使用 free 释放
|
||||||
*/
|
*/
|
||||||
uint32_t *generate_wallpaper(const wallpaper_config_t *wallpaper_config,
|
uint32_t *generate_wallpaper(const wallpaper_config_t *wallpaper_config,
|
||||||
const monitor_t *monitors, const uint32_t index,
|
const monitor_t *monitors, const uint32_t index,
|
||||||
@@ -89,3 +91,47 @@ uint32_t *generate_wallpaper(const wallpaper_config_t *wallpaper_config,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成图标像素数据
|
||||||
|
* @returns 图标像素数据( RGBA 顺序),使用后记得使用 free 释放
|
||||||
|
*/
|
||||||
|
uint32_t *generate_icon_pixels(const char *image_path, uint32_t width,
|
||||||
|
uint32_t height, uint32_t padding) {
|
||||||
|
uint32_t dst_width = width - padding * 2;
|
||||||
|
uint32_t dst_height = height - padding * 2;
|
||||||
|
if (dst_width <= 0 || dst_height <= 0) return NULL;
|
||||||
|
|
||||||
|
Imlib_Image img = imlib_load_image(image_path);
|
||||||
|
imlib_context_set_image(img);
|
||||||
|
int w = imlib_image_get_width();
|
||||||
|
int h = imlib_image_get_height();
|
||||||
|
|
||||||
|
float width_ratio = (float)dst_width / w;
|
||||||
|
float height_ratio = (float)dst_height / h;
|
||||||
|
float scale = MAX(width_ratio, height_ratio);
|
||||||
|
|
||||||
|
int src_width = dst_width / scale;
|
||||||
|
int src_height = dst_height / scale;
|
||||||
|
int src_x = (w - src_width) / 2;
|
||||||
|
int src_y = (h - src_height) / 2;
|
||||||
|
|
||||||
|
Imlib_Image target_img = imlib_create_image(width, height);
|
||||||
|
imlib_context_set_image(target_img);
|
||||||
|
imlib_image_set_has_alpha(false);
|
||||||
|
imlib_context_set_color(0, 0, 0, 255);
|
||||||
|
imlib_image_fill_rectangle(0, 0, width, height);
|
||||||
|
|
||||||
|
imlib_blend_image_onto_image(img, 1, src_x, src_y, src_width, src_height,
|
||||||
|
padding, padding, dst_width, dst_height);
|
||||||
|
uint32_t *data = imlib_image_get_data_for_reading_only();
|
||||||
|
uint32_t data_size = width * height * sizeof(uint32_t);
|
||||||
|
uint32_t *pixels = ecalloc(1, data_size);
|
||||||
|
if (pixels) memcpy(pixels, data, data_size);
|
||||||
|
|
||||||
|
imlib_free_image_and_decache();
|
||||||
|
imlib_context_set_image(img);
|
||||||
|
imlib_free_image_and_decache();
|
||||||
|
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|||||||
@@ -137,33 +137,56 @@ static void draw_rect(cairo_t *cr, int32_t x, int32_t y, uint32_t width,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t draw_status(monitor_t *monitor, status_t *status,
|
static int32_t draw_status(monitor_t *monitor, status_t *status, icons_t *icons,
|
||||||
color_set_t *color_set, uint32_t height,
|
color_set_t *color_set, uint32_t height,
|
||||||
uint32_t x_padding, int32_t end) {
|
uint32_t x_padding, int32_t end) {
|
||||||
char cpu[16], mem[64], volume[600], net_down[140], net_up[140];
|
typedef struct {
|
||||||
sprintf(cpu, ":%.1f", status->cpu_usage_percent);
|
const char *const text;
|
||||||
sprintf(mem, ":%s(%.1f%%)", status->mem_usage.mem_used_text,
|
color_t *color;
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
} status_item_t;
|
||||||
|
|
||||||
|
char cpu[16], mem[64], volume[600];
|
||||||
|
sprintf(cpu, "%.1f", status->cpu_usage_percent);
|
||||||
|
sprintf(mem, "%s(%.1f%%)", status->mem_usage.mem_used_text,
|
||||||
status->mem_usage.mem_percent);
|
status->mem_usage.mem_percent);
|
||||||
sprintf(volume, ":%d%%%s%s%s", status->pulse.avg_volume,
|
sprintf(volume, "%d%%%s%s%s", status->pulse.avg_volume,
|
||||||
status->pulse.mute ? "M" : "",
|
status->pulse.mute ? "M" : "",
|
||||||
strlen(status->pulse.device) ? "|" : "", status->pulse.device);
|
strlen(status->pulse.device) ? "|" : "", status->pulse.device);
|
||||||
sprintf(net_down, ":%s", status->net_speed.down);
|
|
||||||
sprintf(net_up, ":%s", status->net_speed.up);
|
|
||||||
|
|
||||||
char *info[] = {net_down, net_up, volume, mem, cpu, status->time};
|
status_item_t items[] = {
|
||||||
|
{status->net_speed.down, &color_set->status_net_recv_color,
|
||||||
|
icons->net_down},
|
||||||
|
{status->net_speed.up, &color_set->status_net_send_color, icons->net_up},
|
||||||
|
{volume, &color_set->status_volume_color, icons->volume},
|
||||||
|
{mem, &color_set->status_memory_color, icons->memory},
|
||||||
|
{cpu, &color_set->status_cpu_color, icons->cpu},
|
||||||
|
{status->time, &color_set->status_datetime_color, icons->clock},
|
||||||
|
};
|
||||||
|
|
||||||
int32_t x = monitor->monitor_width;
|
int32_t x = monitor->monitor_width;
|
||||||
color_t *color = &color_set->status_color;
|
|
||||||
for (int i = LENGTH(info) - 1; i >= 0; i--) {
|
for (int i = LENGTH(items) - 1; i >= 0; i--) {
|
||||||
char *text = info[i];
|
const char *text = items[i].text;
|
||||||
if (!strlen(text)) continue;
|
if (!strlen(text)) continue;
|
||||||
|
|
||||||
|
color_t *color = items[i].color;
|
||||||
uint32_t width = get_text_width(text);
|
uint32_t width = get_text_width(text);
|
||||||
x -= width + x_padding;
|
x -= width + x_padding;
|
||||||
if (x < end) return x + (width + x_padding);
|
if (x < end) return x + (width + x_padding);
|
||||||
|
|
||||||
draw_text(monitor->cr, text, color, x, 0, width, height, false);
|
draw_text(monitor->cr, text, color, x, 0, width, height, false);
|
||||||
|
|
||||||
|
cairo_surface_t *surface = items[i].surface;
|
||||||
|
if (surface) {
|
||||||
|
if (x - height < end) return x;
|
||||||
|
|
||||||
|
x -= height;
|
||||||
|
cairo_set_source_surface(monitor->cr, surface, x, 0);
|
||||||
|
cairo_paint(monitor->cr);
|
||||||
|
/* refresh_window(monitor->bar_window); */
|
||||||
|
}
|
||||||
|
|
||||||
x -= x_padding;
|
x -= x_padding;
|
||||||
if (x < end) return x + x_padding;
|
if (x < end) return x + x_padding;
|
||||||
}
|
}
|
||||||
@@ -171,9 +194,9 @@ static int32_t draw_status(monitor_t *monitor, status_t *status,
|
|||||||
};
|
};
|
||||||
|
|
||||||
void draw_bar(monitor_t *monitor, bool is_current_monitor, status_t *status,
|
void draw_bar(monitor_t *monitor, bool is_current_monitor, status_t *status,
|
||||||
color_set_t *color_set, uint32_t height, uint32_t tag_x_padding,
|
icons_t *icons, color_set_t *color_set, uint32_t height,
|
||||||
uint32_t layout_x_padding, uint32_t client_name_x_padding,
|
uint32_t tag_x_padding, uint32_t layout_x_padding,
|
||||||
uint32_t status_x_padding) {
|
uint32_t client_name_x_padding, uint32_t status_x_padding) {
|
||||||
cairo_t *cr = monitor->cr;
|
cairo_t *cr = monitor->cr;
|
||||||
int32_t x = 0;
|
int32_t x = 0;
|
||||||
uint32_t width = 0;
|
uint32_t width = 0;
|
||||||
@@ -218,7 +241,7 @@ void draw_bar(monitor_t *monitor, bool is_current_monitor, status_t *status,
|
|||||||
|
|
||||||
/* 绘制状态栏信息 */
|
/* 绘制状态栏信息 */
|
||||||
int32_t status_start =
|
int32_t status_start =
|
||||||
draw_status(monitor, status, color_set, height, status_x_padding, x);
|
draw_status(monitor, status, icons, color_set, height, status_x_padding, x);
|
||||||
|
|
||||||
/* 绘制 client name 列表 */
|
/* 绘制 client name 列表 */
|
||||||
if (visible_client_count) {
|
if (visible_client_count) {
|
||||||
|
|||||||
BIN
src/resources/icons/corner-left-down-line.png
Normal file
BIN
src/resources/icons/corner-left-down-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 766 B |
BIN
src/resources/icons/corner-right-up-line.png
Normal file
BIN
src/resources/icons/corner-right-up-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 786 B |
BIN
src/resources/icons/cpu-line.png
Normal file
BIN
src/resources/icons/cpu-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 769 B |
BIN
src/resources/icons/ram-line.png
Normal file
BIN
src/resources/icons/ram-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 564 B |
BIN
src/resources/icons/time-line.png
Normal file
BIN
src/resources/icons/time-line.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/resources/icons/volume-up-fill.png
Normal file
BIN
src/resources/icons/volume-up-fill.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Reference in New Issue
Block a user