labwc/include/theme.h

220 lines
5.1 KiB
C
Raw Normal View History

2021-11-13 21:56:53 +00:00
/* SPDX-License-Identifier: GPL-2.0-only */
2020-06-29 19:27:59 +01:00
/*
* Theme engine for labwc
2020-06-29 19:27:59 +01:00
*
* Copyright Johan Malm 2020-2021
2020-06-29 19:27:59 +01:00
*/
#ifndef LABWC_THEME_H
#define LABWC_THEME_H
2020-06-11 21:20:43 +01:00
#include <cairo.h>
2020-06-29 19:27:59 +01:00
#include <wlr/render/wlr_renderer.h>
#include "ssd.h"
2020-06-11 21:20:43 +01:00
struct lab_img;
/*
* Openbox defines 7 types of Gradient background in addition to Solid.
* Currently, labwc supports only Vertical and SplitVertical.
*/
enum lab_gradient {
LAB_GRADIENT_NONE, /* i.e. Solid */
LAB_GRADIENT_VERTICAL,
LAB_GRADIENT_SPLITVERTICAL,
};
enum lab_justification {
LAB_JUSTIFY_LEFT,
LAB_JUSTIFY_CENTER,
LAB_JUSTIFY_RIGHT,
};
struct theme_snapping_overlay {
bool bg_enabled;
bool border_enabled;
float bg_color[4];
int border_width;
float border_color[3][4];
};
enum lab_button_state {
LAB_BS_DEFAULT = 0,
LAB_BS_HOVERD = 1 << 0,
LAB_BS_TOGGLED = 1 << 1,
LAB_BS_ROUNDED = 1 << 2,
LAB_BS_ALL = LAB_BS_HOVERD | LAB_BS_TOGGLED | LAB_BS_ROUNDED,
};
struct theme_background {
/* gradient type or none/solid */
enum lab_gradient gradient;
/* gradient stops */
float color[4];
float color_split_to[4];
float color_to[4];
float color_to_split_to[4];
};
2020-06-11 21:20:43 +01:00
struct theme {
2021-03-27 21:09:45 +00:00
int border_width;
/*
* the space between title bar border and
* buttons on the left/right/top
*/
int window_titlebar_padding_width;
int window_titlebar_padding_height;
int titlebar_height;
2021-03-27 21:09:45 +00:00
2023-03-05 10:35:56 +01:00
float window_toggled_keybinds_color[4];
enum lab_justification window_label_text_justify;
/* buttons */
int window_button_width;
int window_button_height;
int window_button_spacing;
/* the corner radius of the hover effect */
int window_button_hover_bg_corner_radius;
/*
* Themes/textures for each active/inactive window. Indexed by
* THEME_INACTIVE and THEME_ACTIVE.
*/
struct {
/* title background pattern (solid or gradient) */
struct theme_background title_bg;
/* TODO: add toggled/hover/pressed/disabled colors for buttons */
float button_colors[LAB_SSD_BUTTON_LAST + 1][4];
float border_color[4];
float toggled_keybinds_color[4];
float label_text_color[4];
/* window drop-shadows */
int shadow_size;
float shadow_color[4];
/*
* The texture of a window buttons for each hover/toggled/rounded
* state. This can be accessed like:
*
* buttons[LAB_SSD_BUTTON_ICONIFY][LAB_BS_HOVERD | LAB_BS_TOGGLED]
*
* Elements in buttons[0] are all NULL since LAB_SSD_BUTTON_FIRST is 1.
*/
struct lab_img *button_imgs
[LAB_SSD_BUTTON_LAST + 1][LAB_BS_ALL + 1];
/*
* The titlebar background is specified as a cairo_pattern
* and then also rendered into a 1px wide buffer, which is
* stretched horizontally across the titlebar.
*
* This approach enables vertical gradients while saving
* some memory vs. rendering the entire titlebar into an
* image. It does not work for horizontal gradients.
*/
cairo_pattern_t *titlebar_pattern;
struct lab_data_buffer *titlebar_fill;
struct lab_data_buffer *corner_top_left_normal;
struct lab_data_buffer *corner_top_right_normal;
struct lab_data_buffer *shadow_corner_top;
struct lab_data_buffer *shadow_corner_bottom;
struct lab_data_buffer *shadow_edge;
} window[2];
/* Derived from font sizes */
int menu_item_height;
int menu_header_height;
int menu_overlap_x;
int menu_overlap_y;
int menu_min_width;
int menu_max_width;
int menu_border_width;
float menu_border_color[4];
int menu_items_padding_x;
int menu_items_padding_y;
2021-02-16 20:43:20 +00:00
float menu_items_bg_color[4];
float menu_items_text_color[4];
float menu_items_active_bg_color[4];
float menu_items_active_text_color[4];
int menu_separator_line_thickness;
int menu_separator_padding_width;
int menu_separator_padding_height;
float menu_separator_color[4];
float menu_title_bg_color[4];
enum lab_justification menu_title_text_justify;
float menu_title_text_color[4];
int osd_border_width;
2021-10-13 21:29:32 +01:00
float osd_bg_color[4];
float osd_border_color[4];
2021-10-13 21:29:32 +01:00
float osd_label_text_color[4];
struct window_switcher_classic_theme {
int width;
int padding;
int item_padding_x;
int item_padding_y;
int item_active_border_width;
int item_icon_size;
bool width_is_percent;
/*
* Not set in rc.xml/themerc, but derived from the tallest
* titlebar object plus 2 * window_titlebar_padding_height
*/
int item_height;
} osd_window_switcher_classic;
int osd_window_switcher_preview_border_width;
float osd_window_switcher_preview_border_color[3][4];
int osd_workspace_switcher_boxes_width;
int osd_workspace_switcher_boxes_height;
int osd_workspace_switcher_boxes_border_width;
struct theme_snapping_overlay
snapping_overlay_region, snapping_overlay_edge;
/* magnifier */
float mag_border_color[4];
int mag_border_width;
2020-06-11 21:20:43 +01:00
};
ssd: clean up scene management Our codebase for ssd scenes has grown with a lot of technical debts: - We needed to call `ssd_get_part()` everywhere to get the scene node of a ssd part. We then needed to cast it to `wlr_scene_rect` and `wlr_scene_buffer`. This bloated our codebase and even blocked duplicated button types in `<titlebar><layout>`. - `ssd_get_part_type()` was a dirty hack. It compared parent, grandparent and grandgrandparent of a node with each subtree in the ssd to get the part type of the node. To resolve this issues, this commit changes how ssd scenes are managed: - Access scene rects and scene buffers just as a member of `struct ssd`. - `ssd_part` is now a attachment to a scene node that can be accessed via node_descriptor->data, with a new node-descriptor type `LAB_NODE_DESC_SSD_PART`. `LAB_NODE_DESC_SSD_BUTTON` is unified into it. Now the scene graph under ssd->tree looks like below. The parentheses indicate the type of ssd_part attached to the node: ssd->tree (LAB_SSD_NONE) +--titlebar (LAB_SSD_PART_TITLEBAR) | +--inactive | | +--background bar | | +--left corner | | +--right corner | | +--title (LAB_SSD_PART_TITLE) | | +--iconify button (LAB_SSD_BUTTON_ICONIFY) | | | +--normal close icon image | | | +--hovered close icon image | | | +--... | | +--window icon (LAB_SSD_BUTTON_WINDOW_ICON) | | | +--window icon image | | +--... | +--active | +--... +--border | +--inactive | | +--top | | +--... | +--active | +--top | +--... +--shadow | +--inactive | | +--top | | +--... | +--active | +--top | +--... +--extents +--top +--... When hovering on SSD, `get_cursor_context()` traverses this scene node from the leaf. If it finds a `ssd_part` attached to the node, it returns `ssd_part_type` that represents the resizing direction, button types or `Title`/`Titlebar`.
2025-08-13 21:00:11 +09:00
/* TODO: replace with enum ssd_active_state */
#define THEME_INACTIVE 0
#define THEME_ACTIVE 1
struct server;
2020-08-07 20:21:14 +01:00
/**
2021-02-21 21:54:40 +00:00
* theme_init - read openbox theme and generate button textures
2021-02-21 22:03:14 +00:00
* @theme: theme data
* @server: server
* @theme_name: theme-name in <theme-dir>/<theme-name>/labwc/themerc
2020-08-07 20:21:14 +01:00
* Note <theme-dir> is obtained in theme-dir.c
*/
void theme_init(struct theme *theme, struct server *server, const char *theme_name);
2020-06-11 21:20:43 +01:00
2021-02-21 22:03:14 +00:00
/**
* theme_finish - free button textures
* @theme: theme data
*/
void theme_finish(struct theme *theme);
#endif /* LABWC_THEME_H */