Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
437 changes: 345 additions & 92 deletions gresources/nemo-desktop-preferences.glade

Large diffs are not rendered by default.

29 changes: 5 additions & 24 deletions gresources/nemo-style-application.css
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* Desktop text stuff */
/* Desktop window structure — always applied regardless of theme.
* The desktop window must be transparent so the wallpaper shows through. */

.nemo-window.nemo-desktop-window notebook,
.nemo-window.nemo-desktop-window paned {
Expand All @@ -11,37 +12,17 @@
box-shadow: none;
}

NemoDesktopWindow GtkPaned {
background-color: transparent;
}

.nemo-canvas-item {
border-radius: 3px;
}

/* Custom widget property — controls nemo behavior, not appearance. */
.nemo-desktop {
-NemoIconContainer-activate-prelight-icon-label: true;
}

.nemo-desktop.nemo-canvas-item {
color: #eeeeee;
text-shadow: 1px 1px alpha(black, 0.8);
}

.nemo-desktop.nemo-canvas-item:hover {
background-color: alpha(black, 0.5);
background-image: none;
text-shadow: none;
}

.nemo-desktop.nemo-canvas-item:selected {
background-color: alpha(@theme_selected_bg_color, 0.8);
background-image: none;
text-shadow: none;
color: #f5f5f5;
}

/* EelEditableLabel (icon labels) */
/* EelEditableLabel (inline rename entry on desktop).
* Always applied so the rename box stays legible over any wallpaper. */
.nemo-desktop.view .entry,
.nemo-desktop.view .entry:active,
.nemo-desktop.view .entry:focus,
Expand Down
45 changes: 45 additions & 0 deletions gresources/nemo-style-desktop.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/* Desktop icon label text shadows.
*
* Nemo applies one of these classes (shadow-normal / shadow-darker /
* shadow-darkest) to the icon container based on the user's preference.
* If "Use GTK theme" is enabled and the current theme provides its own
* .nemo-desktop styling, this entire stylesheet is not loaded — the
* theme controls text appearance directly.
*/

/* Shadow variant: Normal (traditional nemo default) */
.nemo-desktop.nemo-canvas-item.shadow-normal {
color: #eeeeee;
text-shadow: 1px 1px alpha(black, 0.8);
}

/* Shadow variant: Darker */
.nemo-desktop.nemo-canvas-item.shadow-darker {
color: #eeeeee;
text-shadow: 1px 1px black;
}

/* Shadow variant: Darkest */
.nemo-desktop.nemo-canvas-item.shadow-darkest {
color: #eeeeee;
text-shadow: 1px 1px black, 1px 0px alpha(black, 0.6), 0px 1px alpha(black, 0.6);
}

/* Hover for shadow modes */
.nemo-desktop.nemo-canvas-item.shadow-normal:hover,
.nemo-desktop.nemo-canvas-item.shadow-darker:hover,
.nemo-desktop.nemo-canvas-item.shadow-darkest:hover {
background-color: alpha(black, 0.5);
background-image: none;
text-shadow: none;
}

/* Selected for shadow modes */
.nemo-desktop.nemo-canvas-item.shadow-normal:selected,
.nemo-desktop.nemo-canvas-item.shadow-darker:selected,
.nemo-desktop.nemo-canvas-item.shadow-darkest:selected {
background-color: alpha(@theme_selected_bg_color, 0.8);
background-image: none;
text-shadow: none;
color: #f5f5f5;
}
1 change: 1 addition & 0 deletions gresources/nemo.gresource.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@
<file>nemo-style-fallback.css</file>
<file>nemo-style-fallback-mandatory.css</file>
<file>nemo-style-application.css</file>
<file>nemo-style-desktop.css</file>
</gresource>
</gresources>
180 changes: 178 additions & 2 deletions libnemo-extension/nemo-desktop-preferences.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,32 @@
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <math.h>
#include <glib/gi18n.h>
#include "nemo-desktop-preferences.h"

#define NUM_SHADOW_OPTIONS 3

static const gchar *shadow_options[NUM_SHADOW_OPTIONS] = {
"normal",
"darker",
"darkest",
};

static const gchar *preview_bg_css =
".shadow-preview-bg {"
" background-image: linear-gradient(to bottom, #7ba4d4, #d4e6f7);"
"}";

typedef struct
{
GtkBuilder *builder;
GSettings *desktop_settings;
GtkCssProvider *desktop_css_provider;
GtkCssProvider *preview_bg_provider;
GtkWidget *shadow_radios[NUM_SHADOW_OPTIONS];
GtkWidget *shadow_labels[NUM_SHADOW_OPTIONS];
gulong shadow_setting_handler;
gulong font_changed_handler;
} NemoDesktopPreferencesPrivate;

struct _NemoDesktopPreferences
Expand Down Expand Up @@ -43,6 +63,141 @@ bind_builder_string_combo (GtkBuilder *builder,
"active-id", G_SETTINGS_BIND_DEFAULT);
}

static void
update_preview_fonts (NemoDesktopPreferencesPrivate *priv)
{
gchar *font_str;
PangoFontDescription *font_desc;
gint i;

font_str = g_settings_get_string (priv->desktop_settings, "font");
font_desc = pango_font_description_from_string (font_str);
g_free (font_str);

for (i = 0; i < NUM_SHADOW_OPTIONS; i++) {
PangoAttrList *attrs = pango_attr_list_new ();
pango_attr_list_insert (attrs, pango_attr_font_desc_new (font_desc));
gtk_label_set_attributes (GTK_LABEL (priv->shadow_labels[i]), attrs);
pango_attr_list_unref (attrs);
}

pango_font_description_free (font_desc);
}

static void
on_shadow_button_toggled (GtkToggleButton *button, gpointer user_data)
{
NemoDesktopPreferencesPrivate *priv = user_data;
const gchar *id;

if (!gtk_toggle_button_get_active (button))
return;

id = g_object_get_data (G_OBJECT (button), "shadow-id");
g_settings_set_string (priv->desktop_settings, "desktop-text-shadow", id);
}

static void
on_shadow_setting_changed (GSettings *settings,
const gchar *key,
gpointer user_data)
{
NemoDesktopPreferences *preferences = NEMO_DESKTOP_PREFERENCES (user_data);
NemoDesktopPreferencesPrivate *priv = preferences->priv;
gchar *current;
gint i;

current = g_settings_get_string (priv->desktop_settings, "desktop-text-shadow");

for (i = 0; i < NUM_SHADOW_OPTIONS; i++) {
if (g_strcmp0 (current, shadow_options[i]) == 0) {
g_signal_handlers_block_by_func (priv->shadow_radios[i],
on_shadow_button_toggled, priv);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->shadow_radios[i]), TRUE);
g_signal_handlers_unblock_by_func (priv->shadow_radios[i],
on_shadow_button_toggled, priv);
break;
}
}

g_free (current);
}

static void
on_desktop_font_changed (GSettings *settings,
const gchar *key,
gpointer user_data)
{
NemoDesktopPreferences *preferences = NEMO_DESKTOP_PREFERENCES (user_data);
update_preview_fonts (preferences->priv);
}

static void
add_provider_to_widget (GtkWidget *widget, GtkCssProvider *provider)
{
gtk_style_context_add_provider (gtk_widget_get_style_context (widget),
GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}

static void
setup_shadow_preview_buttons (NemoDesktopPreferences *preferences)
{
NemoDesktopPreferencesPrivate *priv = preferences->priv;
gchar *current;
gint i;

priv->desktop_css_provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (priv->desktop_css_provider,
"/org/nemo/nemo-style-desktop.css");

priv->preview_bg_provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (priv->preview_bg_provider, preview_bg_css, -1, NULL);

current = g_settings_get_string (priv->desktop_settings, "desktop-text-shadow");

for (i = 0; i < NUM_SHADOW_OPTIONS; i++) {
gchar *name;

name = g_strdup_printf ("shadow_radio_%s", shadow_options[i]);
priv->shadow_radios[i] = GTK_WIDGET (gtk_builder_get_object (priv->builder, name));
g_free (name);

name = g_strdup_printf ("shadow_frame_%s", shadow_options[i]);
add_provider_to_widget (GTK_WIDGET (gtk_builder_get_object (priv->builder, name)),
priv->preview_bg_provider);
g_free (name);

name = g_strdup_printf ("shadow_label_%s", shadow_options[i]);
priv->shadow_labels[i] = GTK_WIDGET (gtk_builder_get_object (priv->builder, name));
g_free (name);

add_provider_to_widget (priv->shadow_labels[i], priv->desktop_css_provider);

g_object_set_data (G_OBJECT (priv->shadow_radios[i]), "shadow-id",
(gpointer) shadow_options[i]);

g_signal_connect (priv->shadow_radios[i], "toggled",
G_CALLBACK (on_shadow_button_toggled), priv);

if (g_strcmp0 (current, shadow_options[i]) == 0) {
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->shadow_radios[i]), TRUE);
}
}

g_free (current);

update_preview_fonts (priv);

priv->shadow_setting_handler =
g_signal_connect (priv->desktop_settings, "changed::desktop-text-shadow",
G_CALLBACK (on_shadow_setting_changed), preferences);

priv->font_changed_handler =
g_signal_connect (priv->desktop_settings, "changed::font",
G_CALLBACK (on_desktop_font_changed), preferences);
}

static void
nemo_desktop_preferences_init (NemoDesktopPreferences *preferences)
{
Expand Down Expand Up @@ -96,16 +251,37 @@ nemo_desktop_preferences_init (NemoDesktopPreferences *preferences)
"orphan_switch",
"show-orphaned-desktop-icons");

bind_builder_bool (priv->builder,
priv->desktop_settings,
"use_theme_switch",
"desktop-text-shadow-use-theme");

setup_shadow_preview_buttons (preferences);

gtk_widget_show_all (GTK_WIDGET (preferences));
}

static void
nemo_desktop_preferences_dispose (GObject *object)
{
NemoDesktopPreferences *preferences = NEMO_DESKTOP_PREFERENCES (object);
NemoDesktopPreferencesPrivate *priv = preferences->priv;

if (priv->desktop_settings != NULL) {
if (priv->shadow_setting_handler > 0) {
g_signal_handler_disconnect (priv->desktop_settings, priv->shadow_setting_handler);
priv->shadow_setting_handler = 0;
}
if (priv->font_changed_handler > 0) {
g_signal_handler_disconnect (priv->desktop_settings, priv->font_changed_handler);
priv->font_changed_handler = 0;
}
}

g_clear_object (&preferences->priv->builder);
g_clear_object (&preferences->priv->desktop_settings);
g_clear_object (&priv->desktop_css_provider);
g_clear_object (&priv->preview_bg_provider);
g_clear_object (&priv->builder);
g_clear_object (&priv->desktop_settings);

G_OBJECT_CLASS (nemo_desktop_preferences_parent_class)->dispose (object);
}
Expand Down
1 change: 1 addition & 0 deletions libnemo-private/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ nemo_private_sources = [
'nemo-signaller.c',
'nemo-thumbnails.c',
'nemo-trash-monitor.c',
'nemo-theme-utils.c',
'nemo-tree-view-drag-dest.c',
'nemo-ui-utilities.c',
'nemo-undo-manager.c',
Expand Down
2 changes: 2 additions & 0 deletions libnemo-private/nemo-global-preferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ typedef enum
#define NEMO_PREFERENCES_DESKTOP_VOLUMES_VISIBLE "volumes-visible"
#define NEMO_PREFERENCES_DESKTOP_NETWORK_VISIBLE "network-icon-visible"
#define NEMO_PREFERENCES_DESKTOP_BACKGROUND_FADE "background-fade"
#define NEMO_PREFERENCES_DESKTOP_TEXT_SHADOW "desktop-text-shadow"
#define NEMO_PREFERENCES_DESKTOP_TEXT_SHADOW_USE_THEME "desktop-text-shadow-use-theme"
#define NEMO_PREFERENCES_DESKTOP_IGNORED_DESKTOP_HANDLERS "ignored-desktop-handlers"

/* bulk rename utility */
Expand Down
42 changes: 42 additions & 0 deletions libnemo-private/nemo-icon-container.c
Original file line number Diff line number Diff line change
Expand Up @@ -7152,6 +7152,38 @@ nemo_icon_container_get_is_desktop (NemoIconContainer *container)
return container->details->is_desktop;
}

static const gchar *shadow_class_names[] = {
"shadow-normal",
"shadow-darker",
"shadow-darkest"
};

static void
update_desktop_shadow_class (NemoIconContainer *container)
{
GtkStyleContext *context;
gchar *setting, *class_name;
gint i;

context = gtk_widget_get_style_context (GTK_WIDGET (container));

for (i = 0; i < G_N_ELEMENTS (shadow_class_names); i++) {
gtk_style_context_remove_class (context, shadow_class_names[i]);
}

/* The class is always applied. When the user has opted into theme-driven
* styling and the theme supports it, nemo-theme-utils skips loading the
* shadow stylesheet, so the class simply matches no rules. */
setting = g_settings_get_string (nemo_desktop_preferences,
NEMO_PREFERENCES_DESKTOP_TEXT_SHADOW);
class_name = g_strdup_printf ("shadow-%s", setting);
gtk_style_context_add_class (context, class_name);
g_free (class_name);
g_free (setting);

gtk_widget_queue_draw (GTK_WIDGET (container));
}

void
nemo_icon_container_set_is_desktop (NemoIconContainer *container,
gboolean is_desktop)
Expand All @@ -7166,17 +7198,27 @@ nemo_icon_container_set_is_desktop (NemoIconContainer *container,
g_signal_handlers_disconnect_by_func (nemo_desktop_preferences,
text_ellipsis_limit_changed_container_callback,
container);
g_signal_handlers_disconnect_by_func (nemo_desktop_preferences,
update_desktop_shadow_class,
container);

if (is_desktop) {
GtkStyleContext *context;

context = gtk_widget_get_style_context (GTK_WIDGET (container));
gtk_style_context_add_class (context, "nemo-desktop");

update_desktop_shadow_class (container);

g_signal_connect_swapped (nemo_desktop_preferences,
"changed::" NEMO_PREFERENCES_DESKTOP_TEXT_ELLIPSIS_LIMIT,
G_CALLBACK (text_ellipsis_limit_changed_container_callback),
container);

g_signal_connect_swapped (nemo_desktop_preferences,
"changed::" NEMO_PREFERENCES_DESKTOP_TEXT_SHADOW,
G_CALLBACK (update_desktop_shadow_class),
container);
} else {
g_signal_connect_swapped (nemo_icon_view_preferences,
"changed::" NEMO_PREFERENCES_ICON_VIEW_TEXT_ELLIPSIS_LIMIT,
Expand Down
Loading
Loading