mirror of
https://github.com/labwc/labwc.git
synced 2026-04-07 08:21:20 -04:00
Bevels on selected menu items; support for sunken bevel rendering
This commit is contained in:
parent
0be9082ea8
commit
90e652a8a1
2 changed files with 135 additions and 3 deletions
|
|
@ -194,6 +194,30 @@ struct borderset * createBuffer(uint32_t id, int size, int type, int bevelSize)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // Sunken Single bevel borders have 1x1 sides
|
||||||
|
newBorderset->top = znew(uint32_t);
|
||||||
|
newBorderset->left = znew(uint32_t);
|
||||||
|
newBorderset->right = znew(uint32_t);
|
||||||
|
newBorderset->bottom = znew(uint32_t);
|
||||||
|
*newBorderset->top = ll32;
|
||||||
|
*newBorderset->left = ll32;
|
||||||
|
*newBorderset->right = hl32;
|
||||||
|
*newBorderset->bottom = hl32;
|
||||||
|
|
||||||
|
// Fill with solid
|
||||||
|
for (int j=0; j<size;j++) {
|
||||||
|
for (int k=0; k<size;k++) {
|
||||||
|
newBorderset->tl[PIXELSIZED(j, k, size)] = ll32;
|
||||||
|
newBorderset->tr[PIXELSIZED(size - 1 - j, k, size)] = (j > k) ? ll32 : hl32;
|
||||||
|
newBorderset->bl[PIXELSIZED(size - 1 -j, k, size)] = (j > k) ? ll32 : hl32;
|
||||||
|
newBorderset->br[PIXELSIZED(j, k, size)] = hl32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
114
src/menu/menu.c
114
src/menu/menu.c
|
|
@ -32,6 +32,8 @@
|
||||||
#include "translate.h"
|
#include "translate.h"
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
#include "workspaces.h"
|
#include "workspaces.h"
|
||||||
|
#include "common/borderset.h"
|
||||||
|
#include "buffer.h"
|
||||||
|
|
||||||
#define PIPEMENU_MAX_BUF_SIZE 1048576 /* 1 MiB */
|
#define PIPEMENU_MAX_BUF_SIZE 1048576 /* 1 MiB */
|
||||||
#define PIPEMENU_TIMEOUT_IN_MS 4000 /* 4 seconds */
|
#define PIPEMENU_TIMEOUT_IN_MS 4000 /* 4 seconds */
|
||||||
|
|
@ -163,10 +165,11 @@ item_create(struct menu *menu, const char *text, const char *icon_name, bool sho
|
||||||
|
|
||||||
static struct wlr_scene_tree *
|
static struct wlr_scene_tree *
|
||||||
item_create_scene_for_state(struct menuitem *item, float *text_color,
|
item_create_scene_for_state(struct menuitem *item, float *text_color,
|
||||||
float *bg_color)
|
float *bg_color, int state)
|
||||||
{
|
{
|
||||||
struct menu *menu = item->parent;
|
struct menu *menu = item->parent;
|
||||||
struct theme *theme = rc.theme;
|
struct theme *theme = rc.theme;
|
||||||
|
struct wlr_scene_buffer *top, *left, *right, *bottom, *tl, *tr, *bl, *br;
|
||||||
|
|
||||||
/* Tree to hold background and label buffers */
|
/* Tree to hold background and label buffers */
|
||||||
struct wlr_scene_tree *tree = lab_wlr_scene_tree_create(item->tree);
|
struct wlr_scene_tree *tree = lab_wlr_scene_tree_create(item->tree);
|
||||||
|
|
@ -191,6 +194,57 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
|
||||||
/* Create background */
|
/* Create background */
|
||||||
lab_wlr_scene_rect_create(tree, bg_width, theme->menu_item_height, bg_color);
|
lab_wlr_scene_rect_create(tree, bg_width, theme->menu_item_height, bg_color);
|
||||||
|
|
||||||
|
int bw = theme->menu_border_width;
|
||||||
|
if (rc.theme->beveled_border && state) {
|
||||||
|
float r = bg_color[0];
|
||||||
|
float g = bg_color[1];
|
||||||
|
float b = bg_color[2];
|
||||||
|
float a = bg_color[3];
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t colour32 = (uint32_t)(a*255) << 24 | (uint32_t)(r*255) << 16 | (uint32_t)(g*255) << 8 | (uint32_t)(b*255);
|
||||||
|
struct borderset * renderedborders = getBorders(colour32, bw, 3, 0);
|
||||||
|
struct lab_data_buffer *ttexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->top, 1, 1, 4);
|
||||||
|
top = wlr_scene_buffer_create(tree, &ttexture_buffer->base);
|
||||||
|
|
||||||
|
struct lab_data_buffer *ltexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->left, 1, 1, 4);
|
||||||
|
left = wlr_scene_buffer_create(tree, <exture_buffer->base);
|
||||||
|
|
||||||
|
struct lab_data_buffer *rtexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->right, 1, 1, 4);
|
||||||
|
right = wlr_scene_buffer_create(tree, &rtexture_buffer->base);
|
||||||
|
|
||||||
|
struct lab_data_buffer *btexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->bottom, 1, 1, 4);
|
||||||
|
bottom = wlr_scene_buffer_create(tree, &btexture_buffer->base);
|
||||||
|
|
||||||
|
|
||||||
|
struct lab_data_buffer *tltexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->tl, bw, bw, 4*bw);
|
||||||
|
tl = wlr_scene_buffer_create(tree, &tltexture_buffer->base);
|
||||||
|
|
||||||
|
|
||||||
|
struct lab_data_buffer *trtexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->tr, bw, bw, 4*bw);
|
||||||
|
tr = wlr_scene_buffer_create(tree, &trtexture_buffer->base);
|
||||||
|
|
||||||
|
|
||||||
|
struct lab_data_buffer *bltexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->bl, bw, bw, 4*bw);
|
||||||
|
bl = wlr_scene_buffer_create(tree, &bltexture_buffer->base);
|
||||||
|
|
||||||
|
struct lab_data_buffer *brtexture_buffer =
|
||||||
|
buffer_create_from_data(renderedborders->br, bw, bw, 4*bw);
|
||||||
|
br = wlr_scene_buffer_create(tree, &brtexture_buffer->base);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Create icon */
|
/* Create icon */
|
||||||
bool show_app_icon = !strcmp(item->parent->id, "client-list-combined-menu")
|
bool show_app_icon = !strcmp(item->parent->id, "client-list-combined-menu")
|
||||||
&& item->client_list_view;
|
&& item->client_list_view;
|
||||||
|
|
@ -218,6 +272,60 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
|
||||||
int x = theme->menu_items_padding_x + icon_width;
|
int x = theme->menu_items_padding_x + icon_width;
|
||||||
int y = (theme->menu_item_height - label_buffer->height) / 2;
|
int y = (theme->menu_item_height - label_buffer->height) / 2;
|
||||||
wlr_scene_node_set_position(&label_buffer->scene_buffer->node, x, y);
|
wlr_scene_node_set_position(&label_buffer->scene_buffer->node, x, y);
|
||||||
|
|
||||||
|
|
||||||
|
if (rc.theme->beveled_border && state) {
|
||||||
|
|
||||||
|
int height = theme->menu_item_height;
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(top,
|
||||||
|
bg_width, bw);
|
||||||
|
wlr_scene_node_set_position(&top->node,
|
||||||
|
0,0);
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(bottom,
|
||||||
|
bg_width, bw);
|
||||||
|
wlr_scene_node_set_position(&bottom->node,
|
||||||
|
0, height - bw);
|
||||||
|
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(left,
|
||||||
|
bw, height - bw * 2);
|
||||||
|
wlr_scene_node_set_position(&left->node,
|
||||||
|
0, bw);
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(right,
|
||||||
|
bw, height - bw * 2);
|
||||||
|
wlr_scene_node_set_position(&right->node,
|
||||||
|
bg_width - bw, bw);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(tl,
|
||||||
|
bw, bw);
|
||||||
|
wlr_scene_node_set_position(&tl->node,
|
||||||
|
0,0);
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(tr,
|
||||||
|
bw, bw);
|
||||||
|
wlr_scene_node_set_position(&tr->node,
|
||||||
|
bg_width-bw, 0);
|
||||||
|
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(br,
|
||||||
|
bw, bw);
|
||||||
|
wlr_scene_node_set_position(&br->node,
|
||||||
|
bg_width-bw , height-bw);
|
||||||
|
|
||||||
|
|
||||||
|
wlr_scene_buffer_set_dest_size(bl,
|
||||||
|
bw, bw);
|
||||||
|
wlr_scene_node_set_position(&bl->node,
|
||||||
|
0, height-bw);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!item->arrow) {
|
if (!item->arrow) {
|
||||||
return tree;
|
return tree;
|
||||||
|
|
@ -252,10 +360,10 @@ item_create_scene(struct menuitem *menuitem, int *item_y)
|
||||||
/* Create scenes for unselected/selected states */
|
/* Create scenes for unselected/selected states */
|
||||||
menuitem->normal_tree = item_create_scene_for_state(menuitem,
|
menuitem->normal_tree = item_create_scene_for_state(menuitem,
|
||||||
theme->menu_items_text_color,
|
theme->menu_items_text_color,
|
||||||
theme->menu_items_bg_color);
|
theme->menu_items_bg_color, 0);
|
||||||
menuitem->selected_tree = item_create_scene_for_state(menuitem,
|
menuitem->selected_tree = item_create_scene_for_state(menuitem,
|
||||||
theme->menu_items_active_text_color,
|
theme->menu_items_active_text_color,
|
||||||
theme->menu_items_active_bg_color);
|
theme->menu_items_active_bg_color, 1);
|
||||||
/* Hide selected state */
|
/* Hide selected state */
|
||||||
wlr_scene_node_set_enabled(&menuitem->selected_tree->node, false);
|
wlr_scene_node_set_enabled(&menuitem->selected_tree->node, false);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue