summaryrefslogtreecommitdiff
path: root/sysutils/xfce4-fsguard-plugin/files/patch-panel-plugin_fsguard.c
blob: 77586f71c9b31d00ad742dd1636805f79b168d3b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
--- panel-plugin/fsguard.c.orig	2016-10-29 06:43:10 UTC
+++ panel-plugin/fsguard.c
@@ -70,6 +70,7 @@ typedef struct
     XfcePanelPlugin    *plugin;
     gboolean            seen;
     gint                icon_id;
+    gchar              *css_class;
     gint                timeout;
     guint               limit_warning;
     guint               limit_urgent;
@@ -135,6 +136,7 @@ fsguard_set_icon (FsGuard *fsguard, gint
     if (id == fsguard->icon_id)
         return;
 
+    DBG ("icon id: new=%d, cur=%d", id, fsguard->icon_id);
     fsguard->icon_id = id;
     size = xfce_panel_plugin_get_size (fsguard->plugin);
     size /= xfce_panel_plugin_get_nrows (fsguard->plugin);
@@ -177,7 +179,7 @@ fsguard_refresh_icon (FsGuard *fsguard)
 }
 
 static void
-fsguard_refresh_monitor (FsGuard *fsguard)
+fsguard_refresh_monitor_color (FsGuard *fsguard, gchar *css_class)
 {
     GdkRGBA             color;
 
@@ -197,23 +199,15 @@ fsguard_refresh_monitor (FsGuard *fsguar
     }
 
 #if GTK_CHECK_VERSION (3, 16, 0)
-    GtkCssProvider *css_provider;
-#if GTK_CHECK_VERSION (3, 20, 0)
-    gchar * css = g_strdup_printf("progressbar trough { min-width: 4px; min-height: 4px; } \
-                                   progressbar progress { min-width: 4px; min-height: 4px; \
-                                                          background-color: %s; background-image: none; }",
-#else
-    gchar * css = g_strdup_printf(".progressbar { background-color: %s; background-image: none; }",
-#endif
-                                  gdk_rgba_to_string(&color));
-    /* Setup Gtk style */
-    css_provider = gtk_css_provider_new ();
-    gtk_css_provider_load_from_data (css_provider, css, strlen(css), NULL);
-    gtk_style_context_add_provider (
-        GTK_STYLE_CONTEXT (gtk_widget_get_style_context (GTK_WIDGET (fsguard->progress_bar))),
-        GTK_STYLE_PROVIDER (css_provider),
-        GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-    g_free(css);
+    DBG("removing class %s, adding %s", fsguard->css_class, css_class);
+    gtk_style_context_remove_class (
+        GTK_STYLE_CONTEXT(gtk_widget_get_style_context (GTK_WIDGET (fsguard->progress_bar))),
+        fsguard->css_class);
+    gtk_style_context_add_class (
+        GTK_STYLE_CONTEXT(gtk_widget_get_style_context (GTK_WIDGET (fsguard->progress_bar))),
+        css_class);
+    g_free(fsguard->css_class);
+    fsguard->css_class = g_strdup(css_class);
 #else
     gtk_widget_override_background_color (GTK_WIDGET (fsguard->progress_bar),
                           GTK_STATE_PRELIGHT,
@@ -270,6 +264,7 @@ fsguard_check_fs (FsGuard *fsguard)
     float               totalblocks = 0;
     long                blocksize = 0;
     int                 err;
+    gchar              *css_class = "normal";
     gchar               msg_size[100], msg_total_size[100], msg[100];
     gint                icon_id = ICON_INSENSITIVE;
     static struct statfs fsd;
@@ -285,10 +280,13 @@ fsguard_check_fs (FsGuard *fsguard)
 
         if (freespace > (total * fsguard->limit_warning / 100)) {
             icon_id = ICON_NORMAL;
+            css_class = "normal";
         } else if (freespace > (total * fsguard->limit_urgent / 100) && freespace <= (total * fsguard->limit_warning / 100)) {
             icon_id = ICON_WARNING;
+            css_class = "warning";
         } else {
             icon_id = ICON_URGENT;
+            css_class = "urgent";
         }
     }
         g_snprintf (msg, sizeof (msg),
@@ -316,7 +314,8 @@ fsguard_check_fs (FsGuard *fsguard)
     if (fsguard->show_progress_bar) {
         gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(fsguard->progress_bar),
                                        (total > 0 ) ? 1.0 - (freespace / total) : 0.0);
-        fsguard_refresh_monitor (fsguard);
+        if (icon_id != fsguard->icon_id)
+            fsguard_refresh_monitor_color (fsguard, css_class);
     }
 
     gtk_widget_set_tooltip_text(fsguard->ebox, msg);
@@ -347,6 +346,7 @@ fsguard_read_config (FsGuard *fsguard)
     fsguard->name               = g_strdup ("");
     fsguard->show_name          = FALSE;
     fsguard->path               = g_strdup ("/");
+    fsguard->css_class          = g_strdup ("normal");
     fsguard->show_size          = TRUE;
     fsguard->show_progress_bar  = TRUE;
     fsguard->hide_button        = FALSE;
@@ -406,6 +406,9 @@ fsguard_write_config (XfcePanelPlugin *p
 static FsGuard *
 fsguard_new (XfcePanelPlugin *plugin)
 {
+#if GTK_CHECK_VERSION (3, 16, 0)
+    GtkCssProvider *css_provider;
+#endif
     FsGuard *fsguard = g_new0(FsGuard, 1);
 
     fsguard->plugin = plugin;
@@ -429,6 +432,37 @@ fsguard_new (XfcePanelPlugin *plugin)
     fsguard->icon_panel = gtk_image_new ();
 
     fsguard->progress_bar = gtk_progress_bar_new ();
+#if GTK_CHECK_VERSION (3, 16, 0)
+    css_provider = gtk_css_provider_new ();
+#if GTK_CHECK_VERSION (3, 20, 0)
+        gtk_css_provider_load_from_data (css_provider, "\
+            progressbar.horizontal trough { min-height: 4px; }\
+            progressbar.horizontal progress { min-height: 4px; }\
+            progressbar.vertical trough { min-width: 4px; }\
+            progressbar.vertical progress { min-width: 4px; }\
+            .normal progress { background-color: " COLOR_NORMAL " ; background-image: none; }\
+            .warning progress { background-color: " COLOR_WARNING " ; background-image: none; }\
+            .urgent progress { background-color: " COLOR_URGENT " ; background-image: none; }",
+             -1, NULL);
+#else
+        gtk_css_provider_load_from_data (css_provider, "\
+            .progressbar.horizontal trough { min-height: 4px; }\
+            .progressbar.horizontal progress { min-height: 4px; }\
+            .progressbar.vertical trough { min-width: 4px; }\
+            .progressbar.vertical progress { min-width: 4px; }\
+            .normal progress { background-color: " COLOR_NORMAL " ; background-image: none; }\
+            .warning progress { background-color: " COLOR_WARNING " ; background-image: none; }\
+            .urgent progress { background-color: " COLOR_URGENT " ; background-image: none; }",
+             -1, NULL);
+#endif
+    gtk_style_context_add_provider (
+        GTK_STYLE_CONTEXT (gtk_widget_get_style_context (GTK_WIDGET (fsguard->progress_bar))),
+        GTK_STYLE_PROVIDER (css_provider),
+        GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+    gtk_style_context_add_class (
+        GTK_STYLE_CONTEXT(gtk_widget_get_style_context (GTK_WIDGET (fsguard->progress_bar))),
+        fsguard->css_class);
+#endif
     gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(fsguard->progress_bar), 0.0);
     gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR(fsguard->progress_bar), (orientation == GTK_ORIENTATION_HORIZONTAL));
     gtk_orientable_set_orientation (GTK_ORIENTABLE(fsguard->progress_bar), !orientation);