From 1cc5bb5ec4778d366d74340d60188b4910c6f8b7 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 19 Jul 2013 15:39:48 -0400 Subject: [PATCH] shell-app: Fade the app icon on the left in RTL layouts The point of fading the icon is to make the text displayed over the icon more legible. In RTL layouts, the text is displayed on the left of the icon, so fading the right-hand-side of the icon doesn't work well. https://bugzilla.gnome.org/show_bug.cgi?id=704583 --- js/ui/panel.js | 13 +++++++------ src/shell-app.c | 32 +++++++++++++++++++++++++------- src/shell-app.h | 2 +- 3 files changed, 33 insertions(+), 14 deletions(-) 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);