From c1d107a682a01b3cf71b5d3fb85c6ed17bfc5009 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 0e17cdc6f..a6f73a5a3 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -371,13 +371,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() { @@ -595,12 +598,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 1f8d6f01f..9390bcf26 100644 --- a/src/shell-app.c +++ b/src/shell-app.c @@ -210,6 +210,7 @@ shell_app_create_icon_texture (ShellApp *app, typedef struct { ShellApp *app; int size; + ClutterTextDirection direction; } CreateFadedIconData; static CoglHandle @@ -227,7 +228,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; @@ -279,14 +280,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; @@ -312,13 +325,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; @@ -334,9 +348,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 6bf707a87..8a07e01a8 100644 --- a/src/shell-app.h +++ b/src/shell-app.h @@ -42,7 +42,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);