mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
theme: add window-switcher width/padding
...and calculate item-height based on font-height Add theme options - osd.window-switcher.width - osd.window-switcher.item.padding.x - osd.window-switcher.item.padding.y Issue #879
This commit is contained in:
parent
11ff820105
commit
df53c28a0f
5 changed files with 52 additions and 22 deletions
|
|
@ -146,6 +146,17 @@ elements are not listed here, but are supported.
|
||||||
*osd.label.text.color*
|
*osd.label.text.color*
|
||||||
Text color of on-screen-display
|
Text color of on-screen-display
|
||||||
|
|
||||||
|
*osd.window-switcher.width*
|
||||||
|
Width of window switcher in pixels. Default is 600.
|
||||||
|
|
||||||
|
*osd.window-switcher.item.padding.x*
|
||||||
|
Horizontal padding of window switcher entries in pixels.
|
||||||
|
Default is 10.
|
||||||
|
|
||||||
|
*osd.window-switcher.item.padding.y*
|
||||||
|
Vertical padding of window switcher entries in pixels.
|
||||||
|
Default is 6.
|
||||||
|
|
||||||
*border.color*
|
*border.color*
|
||||||
Set all border colors. This is obsolete, but supported for backward
|
Set all border colors. This is obsolete, but supported for backward
|
||||||
compatibility as some themes still contain it.
|
compatibility as some themes still contain it.
|
||||||
|
|
|
||||||
|
|
@ -52,3 +52,7 @@ osd.bg.color: #dddda6
|
||||||
osd.border.color: #000000
|
osd.border.color: #000000
|
||||||
osd.border.width: 1
|
osd.border.width: 1
|
||||||
osd.label.text.color: #000000
|
osd.label.text.color: #000000
|
||||||
|
|
||||||
|
osd.window-switcher.width: 600
|
||||||
|
osd.window-switcher.item.padding.x: 10
|
||||||
|
osd.window-switcher.item.padding.y: 6
|
||||||
|
|
|
||||||
|
|
@ -62,10 +62,15 @@ struct theme {
|
||||||
float menu_separator_color[4];
|
float menu_separator_color[4];
|
||||||
|
|
||||||
int osd_border_width;
|
int osd_border_width;
|
||||||
|
|
||||||
float osd_bg_color[4];
|
float osd_bg_color[4];
|
||||||
float osd_border_color[4];
|
float osd_border_color[4];
|
||||||
float osd_label_text_color[4];
|
float osd_label_text_color[4];
|
||||||
|
|
||||||
|
int osd_window_switcher_width;
|
||||||
|
int osd_window_switcher_item_padding_x;
|
||||||
|
int osd_window_switcher_item_padding_y;
|
||||||
|
|
||||||
/* textures */
|
/* textures */
|
||||||
struct lab_data_buffer *xbm_close_active_unpressed;
|
struct lab_data_buffer *xbm_close_active_unpressed;
|
||||||
struct lab_data_buffer *xbm_maximize_active_unpressed;
|
struct lab_data_buffer *xbm_maximize_active_unpressed;
|
||||||
|
|
@ -84,6 +89,7 @@ struct theme {
|
||||||
|
|
||||||
/* not set in rc.xml/themerc, but derived from font & padding_height */
|
/* not set in rc.xml/themerc, but derived from font & padding_height */
|
||||||
int title_height;
|
int title_height;
|
||||||
|
int osd_window_switcher_item_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
38
src/osd.c
38
src/osd.c
|
|
@ -18,10 +18,6 @@
|
||||||
#include "window-rules.h"
|
#include "window-rules.h"
|
||||||
#include "workspaces.h"
|
#include "workspaces.h"
|
||||||
|
|
||||||
#define OSD_ITEM_HEIGHT (20)
|
|
||||||
#define OSD_ITEM_WIDTH (600)
|
|
||||||
#define OSD_ITEM_PADDING (10)
|
|
||||||
|
|
||||||
/* is title different from app_id/class? */
|
/* is title different from app_id/class? */
|
||||||
static int
|
static int
|
||||||
is_title_different(struct view *view)
|
is_title_different(struct view *view)
|
||||||
|
|
@ -73,7 +69,7 @@ get_osd_height(struct wl_list *node_list)
|
||||||
if (!isfocusable(view) || skip == LAB_PROP_TRUE) {
|
if (!isfocusable(view) || skip == LAB_PROP_TRUE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
height += OSD_ITEM_HEIGHT;
|
height += rc.theme->osd_window_switcher_item_height;
|
||||||
}
|
}
|
||||||
height += 2 * rc.theme->osd_border_width;
|
height += 2 * rc.theme->osd_border_width;
|
||||||
return height;
|
return height;
|
||||||
|
|
@ -301,10 +297,9 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
|
||||||
draw_cairo_border(cairo, w, h, theme->osd_border_width);
|
draw_cairo_border(cairo, w, h, theme->osd_border_width);
|
||||||
|
|
||||||
/* Set up text rendering */
|
/* Set up text rendering */
|
||||||
|
int item_width = w - 2 * theme->osd_border_width;
|
||||||
set_cairo_color(cairo, theme->osd_label_text_color);
|
set_cairo_color(cairo, theme->osd_label_text_color);
|
||||||
PangoLayout *layout = pango_cairo_create_layout(cairo);
|
PangoLayout *layout = pango_cairo_create_layout(cairo);
|
||||||
pango_layout_set_width(layout,
|
|
||||||
(OSD_ITEM_WIDTH - 2 * OSD_ITEM_PADDING) * PANGO_SCALE);
|
|
||||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||||
|
|
||||||
PangoFontDescription *desc = font_to_pango_desc(&rc.font_osd);
|
PangoFontDescription *desc = font_to_pango_desc(&rc.font_osd);
|
||||||
|
|
@ -314,15 +309,11 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
|
||||||
|
|
||||||
int y = theme->osd_border_width;
|
int y = theme->osd_border_width;
|
||||||
|
|
||||||
/* Center text entries on the y axis */
|
|
||||||
int y_offset = (OSD_ITEM_HEIGHT - font_height(&rc.font_osd)) / 2;
|
|
||||||
y += y_offset;
|
|
||||||
|
|
||||||
/* Draw workspace indicator */
|
/* Draw workspace indicator */
|
||||||
if (show_workspace) {
|
if (show_workspace) {
|
||||||
/* Center workspace indicator on the x axis */
|
/* Center workspace indicator on the x axis */
|
||||||
int x = font_width(&rc.font_osd, workspace_name);
|
int x = font_width(&rc.font_osd, workspace_name);
|
||||||
x = (OSD_ITEM_WIDTH - x) / 2;
|
x = (theme->osd_window_switcher_width - x) / 2;
|
||||||
cairo_move_to(cairo, x, y);
|
cairo_move_to(cairo, x, y);
|
||||||
PangoWeight weight = pango_font_description_get_weight(desc);
|
PangoWeight weight = pango_font_description_get_weight(desc);
|
||||||
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
|
||||||
|
|
@ -331,7 +322,7 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
|
||||||
pango_cairo_show_layout(cairo, layout);
|
pango_cairo_show_layout(cairo, layout);
|
||||||
pango_font_description_set_weight(desc, weight);
|
pango_font_description_set_weight(desc, weight);
|
||||||
pango_layout_set_font_description(layout, desc);
|
pango_layout_set_font_description(layout, desc);
|
||||||
y += OSD_ITEM_HEIGHT;
|
y += theme->osd_window_switcher_item_height;
|
||||||
}
|
}
|
||||||
pango_font_description_free(desc);
|
pango_font_description_free(desc);
|
||||||
|
|
||||||
|
|
@ -350,11 +341,11 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int x = theme->osd_border_width + OSD_ITEM_PADDING;
|
int x = theme->osd_border_width + theme->osd_window_switcher_item_padding_x;
|
||||||
struct window_switcher_field *field;
|
struct window_switcher_field *field;
|
||||||
wl_list_for_each(field, &rc.window_switcher.fields, link) {
|
wl_list_for_each(field, &rc.window_switcher.fields, link) {
|
||||||
buf.len = 0;
|
buf.len = 0;
|
||||||
cairo_move_to(cairo, x, y);
|
cairo_move_to(cairo, x, y + theme->osd_window_switcher_item_padding_y - 1);
|
||||||
|
|
||||||
switch (field->content) {
|
switch (field->content) {
|
||||||
case LAB_FIELD_TYPE:
|
case LAB_FIELD_TYPE:
|
||||||
|
|
@ -369,21 +360,23 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h,
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int field_width = field->width / 100.0 * OSD_ITEM_WIDTH;
|
int field_width = field->width / 100.0 * item_width
|
||||||
|
- 2 * theme->osd_window_switcher_item_padding_x;
|
||||||
pango_layout_set_width(layout, field_width * PANGO_SCALE);
|
pango_layout_set_width(layout, field_width * PANGO_SCALE);
|
||||||
pango_layout_set_text(layout, buf.buf, -1);
|
pango_layout_set_text(layout, buf.buf, -1);
|
||||||
pango_cairo_show_layout(cairo, layout);
|
pango_cairo_show_layout(cairo, layout);
|
||||||
x += field_width;
|
x += field_width + theme->osd_window_switcher_item_padding_x;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view == cycle_view) {
|
if (view == cycle_view) {
|
||||||
/* Highlight current window */
|
/* Highlight current window */
|
||||||
cairo_rectangle(cairo, theme->osd_border_width,
|
cairo_rectangle(cairo, theme->osd_border_width, y,
|
||||||
y - y_offset, OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT);
|
theme->osd_window_switcher_width - 2 * theme->osd_border_width,
|
||||||
|
theme->osd_window_switcher_item_height);
|
||||||
cairo_stroke(cairo);
|
cairo_stroke(cairo);
|
||||||
}
|
}
|
||||||
|
|
||||||
y += OSD_ITEM_HEIGHT;
|
y += theme->osd_window_switcher_item_height;
|
||||||
}
|
}
|
||||||
free(buf.buf);
|
free(buf.buf);
|
||||||
g_object_unref(layout);
|
g_object_unref(layout);
|
||||||
|
|
@ -395,17 +388,18 @@ static void
|
||||||
display_osd(struct output *output)
|
display_osd(struct output *output)
|
||||||
{
|
{
|
||||||
struct server *server = output->server;
|
struct server *server = output->server;
|
||||||
|
struct theme *theme = server->theme;
|
||||||
struct wl_list *node_list =
|
struct wl_list *node_list =
|
||||||
&server->workspace_current->tree->children;
|
&server->workspace_current->tree->children;
|
||||||
bool show_workspace = wl_list_length(&rc.workspace_config.workspaces) > 1;
|
bool show_workspace = wl_list_length(&rc.workspace_config.workspaces) > 1;
|
||||||
const char *workspace_name = server->workspace_current->name;
|
const char *workspace_name = server->workspace_current->name;
|
||||||
|
|
||||||
float scale = output->wlr_output->scale;
|
float scale = output->wlr_output->scale;
|
||||||
int w = OSD_ITEM_WIDTH + (2 * server->theme->osd_border_width);
|
int w = theme->osd_window_switcher_width;
|
||||||
int h = get_osd_height(node_list);
|
int h = get_osd_height(node_list);
|
||||||
if (show_workspace) {
|
if (show_workspace) {
|
||||||
/* workspace indicator */
|
/* workspace indicator */
|
||||||
h += OSD_ITEM_HEIGHT;
|
h += theme->osd_window_switcher_item_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset buffer */
|
/* Reset buffer */
|
||||||
|
|
|
||||||
15
src/theme.c
15
src/theme.c
|
|
@ -140,6 +140,10 @@ theme_builtin(struct theme *theme)
|
||||||
theme->menu_separator_padding_height = 3;
|
theme->menu_separator_padding_height = 3;
|
||||||
parse_hexstr("#888888", theme->menu_separator_color);
|
parse_hexstr("#888888", theme->menu_separator_color);
|
||||||
|
|
||||||
|
theme->osd_window_switcher_width = 600;
|
||||||
|
theme->osd_window_switcher_item_padding_x = 10;
|
||||||
|
theme->osd_window_switcher_item_padding_y = 6;
|
||||||
|
|
||||||
/* inherit settings in post_processing() if not set elsewhere */
|
/* inherit settings in post_processing() if not set elsewhere */
|
||||||
theme->osd_bg_color[0] = FLT_MIN;
|
theme->osd_bg_color[0] = FLT_MIN;
|
||||||
theme->osd_border_width = INT_MIN;
|
theme->osd_border_width = INT_MIN;
|
||||||
|
|
@ -304,6 +308,15 @@ entry(struct theme *theme, const char *key, const char *value)
|
||||||
if (match_glob(key, "osd.border.color")) {
|
if (match_glob(key, "osd.border.color")) {
|
||||||
parse_hexstr(value, theme->osd_border_color);
|
parse_hexstr(value, theme->osd_border_color);
|
||||||
}
|
}
|
||||||
|
if (match_glob(key, "osd.window-switcher.width")) {
|
||||||
|
theme->osd_window_switcher_width = atoi(value);
|
||||||
|
}
|
||||||
|
if (match_glob(key, "osd.window-switcher.item.padding.x")) {
|
||||||
|
theme->osd_window_switcher_item_padding_x = atoi(value);
|
||||||
|
}
|
||||||
|
if (match_glob(key, "osd.window-switcher.item.padding.y")) {
|
||||||
|
theme->osd_window_switcher_item_padding_y = atoi(value);
|
||||||
|
}
|
||||||
if (match_glob(key, "osd.label.text.color")) {
|
if (match_glob(key, "osd.label.text.color")) {
|
||||||
parse_hexstr(value, theme->osd_label_text_color);
|
parse_hexstr(value, theme->osd_label_text_color);
|
||||||
}
|
}
|
||||||
|
|
@ -518,6 +531,8 @@ post_processing(struct theme *theme)
|
||||||
{
|
{
|
||||||
theme->title_height = font_height(&rc.font_activewindow)
|
theme->title_height = font_height(&rc.font_activewindow)
|
||||||
+ 2 * theme->padding_height;
|
+ 2 * theme->padding_height;
|
||||||
|
theme->osd_window_switcher_item_height = font_height(&rc.font_osd)
|
||||||
|
+ 2 * theme->osd_window_switcher_item_padding_y;
|
||||||
|
|
||||||
if (rc.corner_radius >= theme->title_height) {
|
if (rc.corner_radius >= theme->title_height) {
|
||||||
theme->title_height = rc.corner_radius + 1;
|
theme->title_height = rc.corner_radius + 1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue