libxputty/xputty/xcolor.c

352 lines
11 KiB
C

/*
* 0BSD
*
* BSD Zero Clause License
*
* Copyright (c) 2019 Hermann Meyer
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
*/
#include "xcolor.h"
void set_dark_theme(Xputty *main) {
main->color_scheme->normal = (Colors) {
/* cairo / r / g / b / a / */
.fg = { 0.85, 0.85, 0.85, 1.0},
.bg = { 0.1, 0.1, 0.1, 1.0},
.base = { 0.0, 0.0, 0.0, 1.0},
.text = { 0.9, 0.9, 0.9, 1.0},
.shadow = { 0.0, 0.0, 0.0, 0.2},
.frame = { 0.0, 0.0, 0.0, 1.0},
.light = { 0.1, 0.1, 0.1, 1.0}
};
main->color_scheme->prelight = (Colors) {
.fg = { 1.0, 0.0, 1.0, 1.0},
.bg = { 0.25, 0.25, 0.25, 1.0},
.base = { 0.3, 0.3, 0.3, 1.0},
.text = { 1.0, 1.0, 1.0, 1.0},
.shadow = { 0.1, 0.1, 0.1, 0.4},
.frame = { 0.3, 0.3, 0.3, 1.0},
.light = { 0.3, 0.3, 0.3, 1.0}
};
main->color_scheme->selected = (Colors) {
.fg = { 0.9, 0.9, 0.9, 1.0},
.bg = { 0.2, 0.2, 0.2, 1.0},
.base = { 0.5, 0.18, 0.18, 1.0},
.text = { 1.0, 1.0, 1.0, 1.0},
.shadow = { 0.8, 0.18, 0.18, 0.2},
.frame = { 0.5, 0.18, 0.18, 1.0},
.light = { 0.5, 0.18, 0.18, 1.0}
};
main->color_scheme->active = (Colors) {
.fg = { 0.0, 1.0, 1.0, 1.0},
.bg = { 0.0, 0.0, 0.0, 1.0},
.base = { 0.18, 0.38, 0.38, 1.0},
.text = { 0.75, 0.75, 0.75, 1.0},
.shadow = { 0.18, 0.38, 0.38, 0.5},
.frame = { 0.18, 0.38, 0.38, 1.0},
.light = { 0.18, 0.38, 0.38, 1.0}
};
main->color_scheme->insensitive = (Colors) {
.fg = { 0.85, 0.85, 0.85, 0.5},
.bg = { 0.1, 0.1, 0.1, 0.5},
.base = { 0.0, 0.0, 0.0, 0.5},
.text = { 0.9, 0.9, 0.9, 0.5},
.shadow = { 0.0, 0.0, 0.0, 0.1},
.frame = { 0.0, 0.0, 0.0, 0.5},
.light = { 0.1, 0.1, 0.1, 0.5}
};
}
void set_light_theme(Xputty *main) {
main->color_scheme->normal = (Colors) {
/* cairo / r / g / b / a / */
.fg = { 0.15, 0.15, 0.15, 1.0},
.bg = { 0.85, 0.85, 0.85, 1.0},
.base = { 0.9, 0.9, 0.9, 1.0},
.text = { 0.25, 0.25, 0.25, 1.0},
.shadow = { 0.0, 0.0, 0.0, 0.2},
.frame = { 0.2, 0.2, 0.2, 1.0},
.light = { 0.9, 0.9, 0.9, 1.0}
};
main->color_scheme->prelight = (Colors) {
.fg = { 0.25, 0.25, 0.25, 1.0},
.bg = { 1.0, 1.0, 1.0, 1.0},
.base = { 0.75, 0.75, 0.75, 1.0},
.text = { 0.15, 0.15, 0.15, 1.0},
.shadow = { 0.1, 0.1, 0.1, 0.4},
.frame = { 0.3, 0.3, 0.3, 1.0},
.light = { 0.75, 0.75, 0.75, 1.0}
};
main->color_scheme->selected = (Colors) {
.fg = { 0.2, 0.2, 0.2, 1.0},
.bg = { 0.9, 0.9, 0.9, 1.0},
.base = { 0.0, 0.5, 0.65, 1.0},
.text = { 0.8, 0.8, 0.8, 1.0},
.shadow = { 0.8, 0.18, 0.18, 0.2},
.frame = { 0.5, 0.18, 0.18, 1.0},
.light = { 0.5, 0.5, 0.5, 1.0}
};
main->color_scheme->active = (Colors) {
.fg = { 0.0, 0.0, 0.0, 1.0},
.bg = { 1.0, 1.0, 1.0, 1.0},
.base = { 0.0, 0.3, 0.65, 1.0},
.text = { 0.8, 0.8, 0.8, 1.0},
.shadow = { 0.18, 0.38, 0.38, 0.5},
.frame = { 0.18, 0.38, 0.38, 1.0},
.light = { 0.3, 0.3, 0.3, 1.0}
};
main->color_scheme->insensitive = (Colors) {
.fg = { 0.15, 0.15, 0.15, 0.5},
.bg = { 0.85, 0.85, 0.85, 0.5},
.base = { 0.9, 0.9, 0.9, 0.5},
.text = { 0.25, 0.25, 0.25, 0.5},
.shadow = { 0.0, 0.0, 0.0, 0.1},
.frame = { 0.2, 0.2, 0.2, 0.5},
.light = { 0.9, 0.9, 0.9, 0.5}
};
}
void color_scheme_to_childs(Widget_t *wid) {
int i=0;
for(;i<wid->childlist->elem;i++) {
Widget_t* w = wid->childlist->childs[i];
memcpy(w->color_scheme, wid->color_scheme, sizeof (struct XColor_t));
color_scheme_to_childs(w);
}
}
void widget_set_color(double *c, double r, double g, double b, double a) {
c[0] = r;
c[1] = g;
c[2] = b;
c[3] = a;
}
void set_widget_color(Widget_t *w, Color_state st, Color_mod mod,
double r, double g, double b, double a) {
Colors *c = get_color_scheme(w, st);
switch(mod) {
case FORGROUND_:
c->fg[0] = r;
c->fg[1] = g;
c->fg[2] = b;
c->fg[3] = a;
break;
case BACKGROUND_:
c->bg[0] = r;
c->bg[1] = g;
c->bg[2] = b;
c->bg[3] = a;
break;
case BASE_:
c->base[0] = r;
c->base[1] = g;
c->base[2] = b;
c->base[3] = a;
break;
case TEXT_:
c->text[0] = r;
c->text[1] = g;
c->text[2] = b;
c->text[3] = a;
break;
case SHADOW_:
c->shadow[0] = r;
c->shadow[1] = g;
c->shadow[2] = b;
c->shadow[3] = a;
break;
case FRAME_:
c->frame[0] = r;
c->frame[1] = g;
c->frame[2] = b;
c->frame[3] = a;
break;
case LIGHT_:
c->light[0] = r;
c->light[1] = g;
c->light[2] = b;
c->light[3] = a;
break;
default:
break;
}
}
Colors *get_color_scheme(Widget_t *wid, Color_state st) {
switch(st) {
case NORMAL_:
return &wid->color_scheme->normal;
break;
case PRELIGHT_:
return &wid->color_scheme->prelight;
break;
case SELECTED_:
return &wid->color_scheme->selected;
break;
case ACTIVE_:
return &wid->color_scheme->active;
break;
case INSENSITIVE_:
return &wid->color_scheme->insensitive;
break;
default:
return &wid->color_scheme->normal;
break;
}
return NULL;
}
Color_state get_color_state(Widget_t *wid) {
switch(wid->state) {
case 0:
return NORMAL_;
break;
case 1:
return PRELIGHT_;
break;
case 2:
return SELECTED_;
break;
case 3:
return ACTIVE_;
break;
case 4:
return INSENSITIVE_;
break;
default:
return NORMAL_;
break;
}
}
void use_fg_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->fg[0], c->fg[1], c->fg[2], c->fg[3]);
cairo_set_source_rgba(w->crb, c->fg[0], c->fg[1], c->fg[2], c->fg[3]);
}
void use_bg_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->bg[0], c->bg[1], c->bg[2], c->bg[3]);
cairo_set_source_rgba(w->crb, c->bg[0], c->bg[1], c->bg[2], c->bg[3]);
}
void use_base_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->base[0], c->base[1], c->base[2], c->base[3]);
cairo_set_source_rgba(w->crb, c->base[0], c->base[1], c->base[2], c->base[3]);
}
void use_text_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->text[0], c->text[1], c->text[2], c->text[3]);
cairo_set_source_rgba(w->crb, c->text[0], c->text[1], c->text[2], c->text[3]);
}
void use_shadow_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->shadow[0], c->shadow[1], c->shadow[2], c->shadow[3]);
cairo_set_source_rgba(w->crb, c->shadow[0], c->shadow[1], c->shadow[2], c->shadow[3]);
}
void use_frame_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->frame[0], c->frame[1], c->frame[2], c->frame[3]);
cairo_set_source_rgba(w->crb, c->frame[0], c->frame[1], c->frame[2], c->frame[3]);
}
void use_light_color_scheme(Widget_t *w, Color_state st) {
Colors *c = get_color_scheme(w, st);
if (!c) return;
cairo_set_source_rgba(w->cr, c->light[0], c->light[1], c->light[2], c->light[3]);
cairo_set_source_rgba(w->crb, c->light[0], c->light[1], c->light[2], c->light[3]);
}
void use_systray_color(Widget_t *w) {
SystrayColor_t *c = w->app->systray_color;
cairo_set_source_rgba(w->cr, c->r, c->g, c->b, c->a);
cairo_set_source_rgba(w->crb, c->r, c->g, c->b, c->a);
}
void set_systray_color(Xputty *main, double r, double g, double b, double a) {
SystrayColor_t *c = main->systray_color;
c->r = r;
c->g = g;
c->b = b;
c->a = a;
}
void set_pattern(Widget_t *w, Colors *from, Colors *to, Color_mod mod) {
double *col_from = NULL;
double *col_to = NULL;
switch (mod) {
case FORGROUND_:
col_from = from->fg;
col_to = to->fg;
break;
case BACKGROUND_:
col_from = from->bg;
col_to = to->bg;
break;
case BASE_:
col_from = from->base;
col_to = to->base;
break;
case TEXT_:
col_from = from->text;
col_to = to->text;
break;
case SHADOW_:
col_from = from->shadow;
col_to = to->shadow;
break;
case FRAME_:
col_from = from->frame;
col_to = to->frame;
break;
case LIGHT_:
col_from = from->light;
col_to = to->light;
break;
}
XWindowAttributes attrs;
XGetWindowAttributes(w->app->dpy, (Window)w->widget, &attrs);
int width = attrs.width;
int height = attrs.height;
cairo_pattern_t *pat = cairo_pattern_create_linear (0, 0, width, height);
cairo_pattern_add_color_stop_rgba(pat, 0.0, col_from[0], col_from[1], col_from[2], col_from[3]);
cairo_pattern_add_color_stop_rgba(pat, 1.0, col_to[0], col_to[1], col_to[2], col_to[3]);
cairo_set_source(w->crb, pat);
cairo_set_source(w->cr, pat);
cairo_pattern_destroy (pat);
}