Add a simple decorator theme demo
This commit is contained in:
parent
b7da7a4f73
commit
20b5d6fcca
BIN
hdd/usr/share/decors/demo/active.png
Normal file
BIN
hdd/usr/share/decors/demo/active.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
hdd/usr/share/decors/demo/close-active.png
Normal file
BIN
hdd/usr/share/decors/demo/close-active.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 273 B |
BIN
hdd/usr/share/decors/demo/close-inactive.png
Normal file
BIN
hdd/usr/share/decors/demo/close-inactive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 317 B |
18
hdd/usr/share/decors/demo/decor.conf
Normal file
18
hdd/usr/share/decors/demo/decor.conf
Normal file
@ -0,0 +1,18 @@
|
||||
[upper]
|
||||
height=27
|
||||
left=27
|
||||
right=27
|
||||
|
||||
[middle]
|
||||
height=27
|
||||
left=27
|
||||
right=27
|
||||
|
||||
[lower]
|
||||
height=27
|
||||
left=27
|
||||
right=27
|
||||
|
||||
[close]
|
||||
top=10
|
||||
right=10
|
BIN
hdd/usr/share/decors/demo/inactive.png
Normal file
BIN
hdd/usr/share/decors/demo/inactive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 846 B |
168
userspace/gui/lib/decor-piecewise.c
Normal file
168
userspace/gui/lib/decor-piecewise.c
Normal file
@ -0,0 +1,168 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "lib/yutani.h"
|
||||
#include "lib/graphics.h"
|
||||
#include "lib/shmemfonts.h"
|
||||
#include "lib/decorations.h"
|
||||
#include "lib/confreader.h"
|
||||
|
||||
static int u_height = 3;
|
||||
static int ul_width = 3;
|
||||
static int ur_width = 3;
|
||||
|
||||
static int m_height = 3;
|
||||
static int ml_width = 3;
|
||||
static int mr_width = 3;
|
||||
|
||||
static int l_height = 3;
|
||||
static int ll_width = 3;
|
||||
static int lr_width = 3;
|
||||
|
||||
static int close_top = 0;
|
||||
static int close_right = 0;
|
||||
static int close_left = -1;
|
||||
static int close_bottom = -1;
|
||||
|
||||
static sprite_t * sprites[4];
|
||||
|
||||
static void init_sprite_png(int id, char * path) {
|
||||
sprites[id] = malloc(sizeof(sprite_t));
|
||||
load_sprite_png(sprites[id], path);
|
||||
}
|
||||
|
||||
extern uint32_t getBilinearFilteredPixelColor(sprite_t * tex, double u, double v);
|
||||
|
||||
static void render_decorations_fancy(yutani_window_t * window, gfx_context_t * ctx, char * title, int decors_active) {
|
||||
int width = window->width;
|
||||
int height = window->height;
|
||||
|
||||
sprite_t * texture = sprites[decors_active == DECOR_ACTIVE ? 0 : 1];
|
||||
sprite_t * close_button = sprites[decors_active == DECOR_ACTIVE ? 2 : 3];
|
||||
|
||||
for (int j = 0; j < u_height; ++j) {
|
||||
for (int i = 0; i < ul_width; ++i) {
|
||||
GFX(ctx,i,j) = SPRITE(texture,i,j);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < u_height; ++j) {
|
||||
for (int i = 0; i < ur_width; ++i) {
|
||||
GFX(ctx,(width-ur_width+i),j) = SPRITE(texture,(texture->width - ur_width+i),j);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < l_height; ++j) {
|
||||
for (int i = 0; i < ll_width; ++i) {
|
||||
GFX(ctx,i,height-l_height+j) = SPRITE(texture,i,texture->width-l_height+j);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < u_height; ++j) {
|
||||
for (int i = 0; i < ur_width; ++i) {
|
||||
GFX(ctx,(width-lr_width+i),height-l_height+j) = SPRITE(texture,(texture->width - lr_width+i),texture->width-l_height+j);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = u_height; j < height-l_height; ++j) {
|
||||
double v = (double)(j - u_height)/(double)(height-l_height-u_height);
|
||||
v = ((double)u_height + v * (texture->height - u_height - l_height))/(double)(texture->height);
|
||||
for (int i = 0; i < ml_width; ++i) {
|
||||
double u = (double)i/(double)texture->width;
|
||||
GFX(ctx,i,j)=getBilinearFilteredPixelColor(texture,u,v);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = u_height; j < height-l_height; ++j) {
|
||||
double v = (double)(j - u_height)/(double)(height-l_height-u_height);
|
||||
v = ((double)u_height + v * (texture->height - u_height - l_height))/(double)(texture->height);
|
||||
for (int i = 0; i < mr_width; ++i) {
|
||||
double u = (double)(texture->width - mr_width + i)/(double)texture->width;
|
||||
GFX(ctx,width-mr_width+i,j)=getBilinearFilteredPixelColor(texture,u,v);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = ul_width; j < width - ur_width; ++j) {
|
||||
double u = (double)(j - ul_width)/(double)(width-ur_width-ul_width);
|
||||
u = ((double)ul_width + u * (texture->width - ul_width - ur_width))/(double)(texture->width);
|
||||
for (int i = 0; i < u_height; ++i) {
|
||||
double v = (double)i/(double)texture->height;
|
||||
GFX(ctx,j,i)=getBilinearFilteredPixelColor(texture,u,v);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = ll_width; j < width - lr_width; ++j) {
|
||||
double u = (double)(j - ll_width)/(double)(width-lr_width-ll_width);
|
||||
u = ((double)ll_width + u * (texture->width - ll_width - lr_width))/(double)(texture->width);
|
||||
for (int i = 0; i < u_height; ++i) {
|
||||
double v = (double)(texture->height - l_height + i)/(double)texture->height;
|
||||
GFX(ctx,j,height-l_height+i)=getBilinearFilteredPixelColor(texture,u,v);
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw the close button */
|
||||
int c_top = close_top == -1 ? height - close_bottom - sprites[2]->height : close_top;
|
||||
int c_left = close_left == -1 ? width - close_right - sprites[2]->width : close_left;
|
||||
|
||||
draw_sprite(ctx, close_button, c_left, c_top);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
static int check_button_press_fancy(yutani_window_t * window, int x, int y) {
|
||||
int c_top = close_top == -1 ? window->height - close_bottom - sprites[2]->height : close_top;
|
||||
int c_left = close_left == -1 ? window->width - close_right - sprites[2]->width : close_left;
|
||||
|
||||
if (x >= c_left && x < c_left + sprites[2]->width && y >= c_top && y < c_top + sprites[2]->height) {
|
||||
return DECOR_CLOSE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void decor_init(char * theme_name) {
|
||||
char tmp[256];
|
||||
|
||||
fprintf(stderr, "Theme name is %s\n", theme_name);
|
||||
|
||||
sprintf(tmp, "/usr/share/decors/%s/%s", theme_name, "decor.conf");
|
||||
confreader_t * conf = confreader_load(tmp);
|
||||
|
||||
u_height = confreader_intd(conf, "upper", "height", 1);
|
||||
ul_width = confreader_intd(conf, "upper", "left", 1);
|
||||
ur_width = confreader_intd(conf, "upper", "right", 1);
|
||||
|
||||
m_height = confreader_intd(conf, "middle", "height", 1);
|
||||
ml_width = confreader_intd(conf, "middle", "left", 1);
|
||||
mr_width = confreader_intd(conf, "middle", "right", 1);
|
||||
|
||||
l_height = confreader_intd(conf, "lower", "height", 1);
|
||||
ll_width = confreader_intd(conf, "lower", "left", 1);
|
||||
lr_width = confreader_intd(conf, "lower", "right", 1);
|
||||
|
||||
close_left = confreader_intd(conf, "close", "left", -1);
|
||||
close_right = confreader_intd(conf, "close", "right", -1);
|
||||
close_top = confreader_intd(conf, "close", "top", -1);
|
||||
close_bottom = confreader_intd(conf, "close", "bottom", -1);
|
||||
|
||||
confreader_free(conf);
|
||||
|
||||
/* Load sprites */
|
||||
sprintf(tmp, "/usr/share/decors/%s/%s", theme_name, "active.png");
|
||||
init_sprite_png(0, tmp);
|
||||
sprintf(tmp, "/usr/share/decors/%s/%s", theme_name, "inactive.png");
|
||||
init_sprite_png(1, tmp);
|
||||
sprintf(tmp, "/usr/share/decors/%s/%s", theme_name, "close-active.png");
|
||||
init_sprite_png(2, tmp);
|
||||
sprintf(tmp, "/usr/share/decors/%s/%s", theme_name, "close-inactive.png");
|
||||
init_sprite_png(3, tmp);
|
||||
|
||||
decor_top_height = u_height;
|
||||
decor_bottom_height = l_height;
|
||||
decor_left_width = ml_width;
|
||||
decor_right_width = mr_width;
|
||||
|
||||
decor_render_decorations = render_decorations_fancy;
|
||||
decor_check_button_press = check_button_press_fancy;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user