diff --git a/js/ui/panel.js b/js/ui/panel.js index 1eca2b352..55c991929 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -297,13 +297,16 @@ const AppMenuButton = new Lang.Class({ this._updateIconBoxClip(); }, + _syncIcon: function() { + let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE, this._iconBox.text_direction); + this._iconBox.set_child(icon); + }, + _onIconThemeChanged: function() { if (this._iconBox.child == null) return; - this._iconBox.child.destroy(); - let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE); - this._iconBox.set_child(icon); + this._syncIcon(); }, _updateIconBoxClip: function() { @@ -526,12 +529,10 @@ const AppMenuButton = new Lang.Class({ } this._targetApp = targetApp; - let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE); - this._label.setText(targetApp.get_name()); this.setName(targetApp.get_name()); - this._iconBox.set_child(icon); + this._syncIcon(); this._iconBox.show(); if (targetApp.get_state() == Shell.AppState.STARTING || diff --git a/src/shell-app.c b/src/shell-app.c index 6afa56a34..9fa659246 100644 --- a/src/shell-app.c +++ b/src/shell-app.c @@ -214,6 +214,7 @@ shell_app_create_icon_texture (ShellApp *app, typedef struct { ShellApp *app; int size; + ClutterTextDirection direction; } CreateFadedIconData; static CoglHandle @@ -231,7 +232,7 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache, guint8 n_channels; gboolean have_alpha; gint fade_start; - gint fade_range; + gint fade_end; guint i, j; guint pixbuf_byte_size; guint8 *orig_pixels; @@ -283,14 +284,26 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache, pixels = g_malloc0 (rowstride * height); memcpy (pixels, orig_pixels, pixbuf_byte_size); - fade_start = width / 2; - fade_range = width - fade_start; - for (i = fade_start; i < width; i++) + /* fade on the right side for LTR, left side for RTL */ + if (data->direction == CLUTTER_TEXT_DIRECTION_LTR) + { + fade_start = width / 2; + fade_end = width; + } + else + { + fade_start = 0; + fade_end = width / 2; + } + + for (i = fade_start; i < fade_end; i++) { for (j = 0; j < height; j++) { guchar *pixel = &pixels[j * rowstride + i * n_channels]; - float fade = 1.0 - ((float) i - fade_start) / fade_range; + float fade = ((float) i - fade_start) / (fade_end - fade_start); + if (data->direction == CLUTTER_TEXT_DIRECTION_LTR) + fade = 1.0 - fade; pixel[0] = 0.5 + pixel[0] * fade; pixel[1] = 0.5 + pixel[1] * fade; pixel[2] = 0.5 + pixel[2] * fade; @@ -316,13 +329,14 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache, * shell_app_get_faded_icon: * @app: A #ShellApp * @size: Size in pixels + * @direction: Whether to fade on the left or right * * Return an actor with a horizontally faded look. * * Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon */ ClutterActor * -shell_app_get_faded_icon (ShellApp *app, int size) +shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction) { CoglHandle texture; ClutterActor *result; @@ -338,9 +352,13 @@ shell_app_get_faded_icon (ShellApp *app, int size) /* Use icon: prefix so that we get evicted from the cache on * icon theme changes. */ - cache_key = g_strdup_printf ("icon:%s,size=%d,faded", shell_app_get_id (app), size); + cache_key = g_strdup_printf ("icon:%s,size=%d,faded-%s", + shell_app_get_id (app), + size, + direction == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr"); data.app = app; data.size = size; + data.direction = direction; texture = st_texture_cache_load (st_texture_cache_get_default (), cache_key, ST_TEXTURE_CACHE_POLICY_FOREVER, diff --git a/src/shell-app.h b/src/shell-app.h index 3009d8ff7..43779143b 100644 --- a/src/shell-app.h +++ b/src/shell-app.h @@ -43,7 +43,7 @@ GMenuTreeEntry *shell_app_get_tree_entry (ShellApp *app); GDesktopAppInfo *shell_app_get_app_info (ShellApp *app); ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size); -ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size); +ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction); const char *shell_app_get_name (ShellApp *app); const char *shell_app_get_description (ShellApp *app); gboolean shell_app_is_window_backed (ShellApp *app);