all repos — tint2 @ e7c3f99e28d28539178679c4b3d1b46e793ec248

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

Attempt to fix icon rendering problems
o9000 o9000
commit

e7c3f99e28d28539178679c4b3d1b46e793ec248

parent

14d5c4e43dcf7d73e18a1abc9ef88f4c8487cd1d

M src/launcher/launcher.csrc/launcher/launcher.c

@@ -356,10 +356,14 @@ LauncherIcon *launcherIcon = (LauncherIcon*)obj;

Imlib_Image icon_scaled = launcherIcon->icon_scaled; // Render - imlib_context_set_image (icon_scaled); - imlib_context_set_blend(1); - imlib_context_set_drawable(launcherIcon->area.pix); - imlib_render_image_on_drawable(0, 0); + imlib_context_set_image(icon_scaled); + if (server.real_transparency) { + render_image(launcherIcon->area.pix, 0, 0); + } else { + imlib_context_set_blend(1); + imlib_context_set_drawable(launcherIcon->area.pix); + imlib_render_image_on_drawable(0, 0); + } } Imlib_Image scale_icon(Imlib_Image original, int icon_size)

@@ -368,11 +372,14 @@ Imlib_Image icon_scaled;

if (original) { imlib_context_set_image (original); icon_scaled = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), icon_size, icon_size); + imlib_context_set_image (icon_scaled); imlib_image_set_has_alpha(1); DATA32* data = imlib_image_get_data(); adjust_asb(data, icon_size, icon_size, launcher_alpha, (float)launcher_saturation/100, (float)launcher_brightness/100); imlib_image_put_back_data(data); + + imlib_context_set_image (icon_scaled); } else { icon_scaled = imlib_create_image(icon_size, icon_size); imlib_context_set_image (icon_scaled);
M src/systray/systraybar.csrc/systray/systraybar.c

@@ -601,7 +601,7 @@ if (systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0)

adjust_asb(data, traywin->width, traywin->height, systray.alpha, (float)systray.saturation/100, (float)systray.brightness/100); imlib_image_put_back_data(data); XCopyArea(server.dsp, render_background, systray.area.pix, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x-systray.area.posx, traywin->y-systray.area.posy); - render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height); + render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy); XCopyArea(server.dsp, systray.area.pix, panel->main_win, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x, traywin->y); imlib_free_image_and_decache(); XFreePixmap(server.dsp, tmp_pmap);
M src/taskbar/task.csrc/taskbar/task.c

@@ -348,9 +348,13 @@ else pos_x = panel->g_task.area.paddingxlr + tsk->area.bg->border.width;

// Render imlib_context_set_image (tsk->icon[tsk->current_state]); - imlib_context_set_blend(1); - imlib_context_set_drawable(tsk->area.pix); - imlib_render_image_on_drawable(pos_x, panel->g_task.icon_posy); + if (server.real_transparency) { + render_image(tsk->area.pix, pos_x, panel->g_task.icon_posy); + } else { + imlib_context_set_blend(1); + imlib_context_set_drawable(tsk->area.pix); + imlib_render_image_on_drawable(pos_x, panel->g_task.icon_posy); + } }
M src/util/common.csrc/util/common.c

@@ -363,24 +363,30 @@ }

} -void render_image(Drawable d, int x, int y, int w, int h) +void render_image(Drawable d, int x, int y) { - // in real_transparency mode imlib_render_image_on_drawable does not the right thing, because - // the operation is IMLIB_OP_COPY, but we would need IMLIB_OP_OVER (which does not exist) - // Therefore we have to do it with the XRender extension (i.e. copy what imlib is doing internally) - // But first we need to render the image onto itself with PictOpIn to adjust the colors to the alpha channel - Pixmap pmap_tmp = XCreatePixmap(server.dsp, server.root_win, w, h, 32); - imlib_context_set_drawable(pmap_tmp); + int w = imlib_image_get_width(), h = imlib_image_get_height(); + + Pixmap pixmap = XCreatePixmap(server.dsp, server.root_win, w, h, 32); + imlib_context_set_drawable(pixmap); imlib_context_set_blend(0); imlib_render_image_on_drawable(0, 0); - Picture pict_image = XRenderCreatePicture(server.dsp, pmap_tmp, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); + + Pixmap mask = XCreatePixmap(server.dsp, server.root_win, w, h, 32); + imlib_context_set_drawable(mask); + imlib_context_set_blend(0); + imlib_render_image_on_drawable(0, 0); + + Picture pict = XRenderCreatePicture(server.dsp, pixmap, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); Picture pict_drawable = XRenderCreatePicture(server.dsp, d, XRenderFindVisualFormat(server.dsp, server.visual), 0, 0); - XRenderComposite(server.dsp, PictOpIn, pict_image, None, pict_image, 0, 0, 0, 0, 0, 0, w, h); - XRenderComposite(server.dsp, PictOpOver, pict_image, None, pict_drawable, 0, 0, 0, 0, x, y, w, h); - imlib_context_set_blend(1); - XFreePixmap(server.dsp, pmap_tmp); - XRenderFreePicture(server.dsp, pict_image); + Picture pict_mask = XRenderCreatePicture(server.dsp, mask, XRenderFindStandardFormat(server.dsp, PictStandardARGB32), 0, 0); + XRenderComposite(server.dsp, PictOpOver, pict, pict_mask, pict_drawable, 0, 0, 0, 0, x, y, w, h); + + XRenderFreePicture(server.dsp, pict_mask); XRenderFreePicture(server.dsp, pict_drawable); + XRenderFreePicture(server.dsp, pict); + XFreePixmap(server.dsp, mask); + XFreePixmap(server.dsp, pixmap); } void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow)
M src/util/common.hsrc/util/common.h

@@ -6,7 +6,6 @@

#ifndef COMMON_H #define COMMON_H - #define WM_CLASS_TINT "panel" #include <Imlib2.h>

@@ -64,7 +63,7 @@ // alpha from 0 to 100, satur from 0 to 1, bright from 0 to 1.

void adjust_asb(DATA32 *data, int w, int h, int alpha, float satur, float bright); void createHeuristicMask(DATA32* data, int w, int h); -void render_image(Drawable d, int x, int y, int w, int h); +void render_image(Drawable d, int x, int y); void draw_text(PangoLayout *layout, cairo_t *c, int posx, int posy, Color *color, int font_shadow);