diff --git a/apps/compositor.c b/apps/compositor.c index 161e5e9c..4953694b 100644 --- a/apps/compositor.c +++ b/apps/compositor.c @@ -697,6 +697,13 @@ uint32_t yutani_color_for_wid(yutani_wid_t wid) { return colors[i]; } +/** + * Determine if a matrix has an identity transformation for its linear component. + */ +static inline int matrix_is_translation(gfx_matrix_t m) { + return (m[0][0] == 1.0 && m[0][1] == 0.0 && m[1][0] == 0.0 && m[1][1] == 1.0); +} + /** * Blit a window to the framebuffer. * @@ -717,9 +724,10 @@ static int yutani_blit_window(yutani_globals_t * yg, yutani_server_window_t * wi _win_sprite.blank = 0; _win_sprite.alpha = ALPHA_EMBEDDED; + double opacity = (double)(window->opacity) / 255.0; + if (window->rotation || window == yg->resizing_window || window->anim_mode) { double m[2][3]; - double opacity = (double)(window->opacity) / 255.0; gfx_matrix_identity(m); gfx_matrix_translate(m,x,y); @@ -788,9 +796,13 @@ static int yutani_blit_window(yutani_globals_t * yg, yutani_server_window_t * wi } } } - draw_sprite_transform(yg->backend_ctx, &_win_sprite, m, opacity); + if (matrix_is_translation(m)) { + draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, opacity); + } else { + draw_sprite_transform(yg->backend_ctx, &_win_sprite, m, opacity); + } } else if (window->opacity != 255) { - draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, (float)window->opacity / 255.0); + draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, opacity); } else { draw_sprite(yg->backend_ctx, &_win_sprite, window->x, window->y); } diff --git a/apps/file-browser.c b/apps/file-browser.c index e24a1233..e77e6a12 100644 --- a/apps/file-browser.c +++ b/apps/file-browser.c @@ -1783,7 +1783,7 @@ int main(int argc, char * argv[]) { signal(SIGUSR1, sig_usr1); signal(SIGUSR2, sig_usr2); draw_background(yctx->display_width, yctx->display_height); - main_window = yutani_window_create_flags(yctx, yctx->display_width, yctx->display_height, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS); + main_window = yutani_window_create_flags(yctx, yctx->display_width, yctx->display_height, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS | YUTANI_WINDOW_FLAG_ALT_ANIMATION); yutani_window_move(yctx, main_window, 0, 0); yutani_set_stack(yctx, main_window, YUTANI_ZORDER_BOTTOM); arg_ind++; diff --git a/apps/panel.c b/apps/panel.c index b0033185..cd7ced98 100644 --- a/apps/panel.c +++ b/apps/panel.c @@ -1547,7 +1547,7 @@ int main (int argc, char ** argv) { height = yctx->display_height; /* Create the panel window */ - panel = yutani_window_create_flags(yctx, width, PANEL_HEIGHT, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS); + panel = yutani_window_create_flags(yctx, width, PANEL_HEIGHT, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS | YUTANI_WINDOW_FLAG_ALT_ANIMATION); /* And move it to the top layer */ yutani_set_stack(yctx, panel, YUTANI_ZORDER_TOP);