mirror of
https://github.com/vale981/yabar
synced 2025-03-05 17:41:40 -05:00
Add initial icon support
This commit is contained in:
parent
5019670ea5
commit
407992b5b5
4 changed files with 125 additions and 4 deletions
6
Makefile
6
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = $(shell git describe)
|
VERSION = $(shell git describe)
|
||||||
CPPFLAGS += -DVERSION=\"$(VERSION)\" -D_POSIX_C_SOURCE=199309L -DYA_INTERNAL -DYA_DYN_COL \
|
CPPFLAGS += -DVERSION=\"$(VERSION)\" -D_POSIX_C_SOURCE=199309L -DYA_INTERNAL -DYA_DYN_COL \
|
||||||
-DYA_ENV_VARS -DYA_INTERNAL_EWMH
|
-DYA_ENV_VARS -DYA_INTERNAL_EWMH -DYA_ICON
|
||||||
CFLAGS += -std=c99 -Iinclude -pedantic -Wall -Os `pkg-config --cflags pango pangocairo libconfig`
|
CFLAGS += -std=c99 -Iinclude -pedantic -Wall -Os `pkg-config --cflags pango pangocairo libconfig gdk-pixbuf-2.0`
|
||||||
LDLIBS := -lxcb -lpthread -lxcb-randr -lxcb-ewmh `pkg-config --libs pango pangocairo libconfig`
|
LDLIBS := -lxcb -lpthread -lxcb-randr -lxcb-ewmh `pkg-config --libs pango pangocairo libconfig gdk-pixbuf-2.0`
|
||||||
PROGRAM := yabar
|
PROGRAM := yabar
|
||||||
PREFIX ?= /usr
|
PREFIX ?= /usr
|
||||||
BINPREFIX ?= $(PREFIX)/bin
|
BINPREFIX ?= $(PREFIX)/bin
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include <xcb/randr.h>
|
#include <xcb/randr.h>
|
||||||
#include <xcb/xcb_ewmh.h>
|
#include <xcb/xcb_ewmh.h>
|
||||||
|
|
||||||
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
|
|
||||||
//just to suppress gcc syntastic warnings in vim
|
//just to suppress gcc syntastic warnings in vim
|
||||||
//VERSION is obtained from Makefile
|
//VERSION is obtained from Makefile
|
||||||
#ifndef VERSION
|
#ifndef VERSION
|
||||||
|
@ -86,7 +88,8 @@ enum {
|
||||||
BLKA_UNDERLINE = 1<<12,
|
BLKA_UNDERLINE = 1<<12,
|
||||||
BLKA_OVERLINE = 1<<13,
|
BLKA_OVERLINE = 1<<13,
|
||||||
BLKA_INHERIT = 1<<14,
|
BLKA_INHERIT = 1<<14,
|
||||||
BLKA_INTERN_X_EV = 1<<15
|
BLKA_INTERN_X_EV = 1<<15,
|
||||||
|
BLKA_ICON = 1<<16
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -182,6 +185,14 @@ struct ya_block {
|
||||||
uint32_t ulcolor_old; //initial underline color
|
uint32_t ulcolor_old; //initial underline color
|
||||||
uint32_t olcolor_old; //initial overline color
|
uint32_t olcolor_old; //initial overline color
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef YA_ICON
|
||||||
|
char *icon_path;
|
||||||
|
uint16_t ic_x;
|
||||||
|
uint16_t ic_y;
|
||||||
|
double ic_scale_w;
|
||||||
|
double ic_scale_h;
|
||||||
|
#endif //YA_ICON
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,4 +289,6 @@ ya_block_t * ya_get_blk_from_event( xcb_button_press_event_t *eb);
|
||||||
void ya_get_cur_window_title(ya_block_t * blk);
|
void ya_get_cur_window_title(ya_block_t * blk);
|
||||||
void ya_handle_button( xcb_button_press_event_t *eb);
|
void ya_handle_button( xcb_button_press_event_t *eb);
|
||||||
void ya_handle_prop_notify(xcb_property_notify_event_t *ep);
|
void ya_handle_prop_notify(xcb_property_notify_event_t *ep);
|
||||||
|
|
||||||
|
cairo_surface_t * ya_draw_graphics(ya_block_t *blk);
|
||||||
#endif /*YABAR_H*/
|
#endif /*YABAR_H*/
|
||||||
|
|
|
@ -179,6 +179,20 @@ void ya_draw_pango_text(struct ya_block *blk) {
|
||||||
xcb_poly_fill_rectangle(ya.c, blk->pixmap, blk->gc, 1, (const xcb_rectangle_t[]) { {0,0,blk->width, blk->bar->height} });
|
xcb_poly_fill_rectangle(ya.c, blk->pixmap, blk->gc, 1, (const xcb_rectangle_t[]) { {0,0,blk->width, blk->bar->height} });
|
||||||
cairo_surface_t *surface = cairo_xcb_surface_create(ya.c, blk->pixmap, ya.visualtype, blk->width, blk->bar->height);
|
cairo_surface_t *surface = cairo_xcb_surface_create(ya.c, blk->pixmap, ya.visualtype, blk->width, blk->bar->height);
|
||||||
cairo_t *cr = cairo_create(surface);
|
cairo_t *cr = cairo_create(surface);
|
||||||
|
#ifdef YA_ICON
|
||||||
|
if((blk->attr & BLKA_ICON)) {
|
||||||
|
cairo_surface_t *iconsrf = ya_draw_graphics(blk);
|
||||||
|
if (iconsrf) {
|
||||||
|
cairo_scale(cr, blk->ic_scale_w, blk->ic_scale_h);
|
||||||
|
cairo_set_source_surface(cr, iconsrf,
|
||||||
|
(double)(blk->ic_x)/(blk->ic_scale_w),
|
||||||
|
(double)(blk->ic_y)/(blk->ic_scale_h));
|
||||||
|
cairo_paint(cr);
|
||||||
|
cairo_surface_destroy(iconsrf);
|
||||||
|
cairo_scale(cr, 1.0/(blk->ic_scale_w), 1.0/(blk->ic_scale_h));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //YA_ICON
|
||||||
PangoContext *context = pango_cairo_create_context(cr);
|
PangoContext *context = pango_cairo_create_context(cr);
|
||||||
PangoLayout *layout = pango_layout_new(context);
|
PangoLayout *layout = pango_layout_new(context);
|
||||||
pango_layout_set_font_description(layout, blk->bar->desc);
|
pango_layout_set_font_description(layout, blk->bar->desc);
|
||||||
|
@ -347,3 +361,71 @@ inline void ya_get_cur_window_title(ya_block_t * blk) {
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif //YA_INTERNAL_EWMH
|
#endif //YA_INTERNAL_EWMH
|
||||||
|
|
||||||
|
#ifdef YA_ICON
|
||||||
|
//This function is obtained from Awesome WM code.
|
||||||
|
//I actually did not know how to copy pixbuf to surface.
|
||||||
|
static cairo_surface_t * ya_draw_surface_from_pixbuf(GdkPixbuf *buf) {
|
||||||
|
int width = gdk_pixbuf_get_width(buf);
|
||||||
|
int height = gdk_pixbuf_get_height(buf);
|
||||||
|
int pix_stride = gdk_pixbuf_get_rowstride(buf);
|
||||||
|
guchar *pixels = gdk_pixbuf_get_pixels(buf);
|
||||||
|
int channels = gdk_pixbuf_get_n_channels(buf);
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
int cairo_stride;
|
||||||
|
unsigned char *cairo_pixels;
|
||||||
|
|
||||||
|
|
||||||
|
cairo_format_t format = CAIRO_FORMAT_ARGB32;
|
||||||
|
if (channels == 3)
|
||||||
|
format = CAIRO_FORMAT_RGB24;
|
||||||
|
|
||||||
|
surface = cairo_image_surface_create(format, width, height);
|
||||||
|
cairo_surface_flush(surface);
|
||||||
|
cairo_stride = cairo_image_surface_get_stride(surface);
|
||||||
|
cairo_pixels = cairo_image_surface_get_data(surface);
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
guchar *row = pixels;
|
||||||
|
uint32_t *cairo = (uint32_t *) cairo_pixels;
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
if (channels == 3) {
|
||||||
|
uint8_t r = *row++;
|
||||||
|
uint8_t g = *row++;
|
||||||
|
uint8_t b = *row++;
|
||||||
|
*cairo++ = (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint8_t r = *row++;
|
||||||
|
uint8_t g = *row++;
|
||||||
|
uint8_t b = *row++;
|
||||||
|
uint8_t a = *row++;
|
||||||
|
double alpha = a / 255.0;
|
||||||
|
r = r * alpha;
|
||||||
|
g = g * alpha;
|
||||||
|
b = b * alpha;
|
||||||
|
*cairo++ = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pixels += pix_stride;
|
||||||
|
cairo_pixels += cairo_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
cairo_surface_mark_dirty(surface);
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cairo_surface_t * ya_draw_graphics(ya_block_t *blk) {
|
||||||
|
GError *gerr =NULL;
|
||||||
|
cairo_surface_t *ret = NULL;
|
||||||
|
GdkPixbuf *gbuf = gdk_pixbuf_new_from_file(blk->icon_path, &gerr);
|
||||||
|
if(gbuf == NULL) {
|
||||||
|
fprintf(stderr, "Cannot allocate pixbuf for block (%s.%s)\n. %s\n", blk->bar->name, blk->name, gerr->message);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret = ya_draw_surface_from_pixbuf(gbuf);
|
||||||
|
g_object_unref(gbuf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif //YA_ICON
|
||||||
|
|
|
@ -498,6 +498,32 @@ skip_type:
|
||||||
if(retcnf == CONFIG_TRUE) {
|
if(retcnf == CONFIG_TRUE) {
|
||||||
blk->button_cmd[4] = strdup(retstr);
|
blk->button_cmd[4] = strdup(retstr);
|
||||||
}
|
}
|
||||||
|
#ifdef YA_ICON
|
||||||
|
retcnf = config_setting_lookup_string(set, "image", &retstr);
|
||||||
|
if(retcnf == CONFIG_TRUE) {
|
||||||
|
blk->icon_path = strdup(retstr);
|
||||||
|
blk->attr |= BLKA_ICON;
|
||||||
|
double retflt;
|
||||||
|
if(config_setting_lookup_float(set, "image-scale-width", &retflt)==CONFIG_TRUE) {
|
||||||
|
blk->ic_scale_w = retflt;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
blk->ic_scale_w = 1.0;
|
||||||
|
}
|
||||||
|
if(config_setting_lookup_float(set, "image-scale-height", &retflt)==CONFIG_TRUE) {
|
||||||
|
blk->ic_scale_h = retflt;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
blk->ic_scale_h = 1.0;
|
||||||
|
}
|
||||||
|
if(config_setting_lookup_int(set, "image-shift-x", &retint)==CONFIG_TRUE) {
|
||||||
|
blk->ic_x = retint;
|
||||||
|
}
|
||||||
|
if(config_setting_lookup_int(set, "image-shift-y", &retint)==CONFIG_TRUE) {
|
||||||
|
blk->ic_y = retint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //YA_ICON
|
||||||
retcnf = config_setting_lookup_string(set, "align", &retstr);
|
retcnf = config_setting_lookup_string(set, "align", &retstr);
|
||||||
if(retcnf == CONFIG_FALSE) {
|
if(retcnf == CONFIG_FALSE) {
|
||||||
if(NOT_INHERIT_BLK(blk))
|
if(NOT_INHERIT_BLK(blk))
|
||||||
|
|
Loading…
Add table
Reference in a new issue