Bug Summary

File:sensors-applet/sensors-applet.c
Warning:line 867, column 5
Value stored to 'not_empty_tree' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name sensors-applet.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/sensors-applet -resource-dir /usr/lib/llvm-14/lib/clang/14.0.6 -D HAVE_CONFIG_H -I . -D CAFELOCALEDIR="/usr/local/share/locale/" -D G_LOG_DOMAIN="sensors-applet" -D PIXMAPS_DIR="/usr/local/share/pixmaps/cafe-sensors-applet/" -D DATADIR="/usr/local/share" -D LIBDIR="/usr/local/lib" -D UIDIR="/usr/local/share/cafe-sensors-applet/ui" -D SENSORS_APPLET_PLUGIN_DIR="/usr/local/lib/cafe-sensors-applet/plugins" -D SYSCONFDIR="/usr/local/etc" -D PREFIX="/usr/local" -I .. -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/cafe-panel-4.0/libcafe-panel-applet -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/cairo -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/pixman-1 -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/libpng16 -I /usr/include/x86_64-linux-gnu -I /usr/include/libmount -I /usr/include/blkid -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.6/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/rootdir/sensors-applet -ferror-limit 19 -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2023-07-21-120131-79067-1 -x c sensors-applet.c
1/*
2 * Copyright (C) 2005-2009 Alex Murray <murray.alex@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19/** Contain the functions for operating on the SensorsApplet structure
20 * (represents the applet itself, and its associated variables.
21 */
22
23#ifdef HAVE_CONFIG_H1
24#include "config.h"
25#endif /* HAVE_CONFIG_H */
26
27#ifdef HAVE_UNISTD_H1
28#include <unistd.h>
29#endif /* HAVE_UNISTD_H */
30
31#include <glib/gi18n.h>
32#include <glib/gprintf.h>
33#include <gio/gio.h>
34#include "sensors-applet.h"
35#include "active-sensor.h"
36#include "sensors-applet-settings.h"
37#include "sensors-applet-plugins.h"
38
39#ifdef HAVE_LIBNOTIFY1
40#include "active-sensor-libnotify.h"
41#define DEFAULT_NOTIFY_TIMEOUT3000 3000
42#endif
43
44#include "prefs-dialog.h"
45#include "about-dialog.h"
46
47#define SENSORS_APPLET_MENU_FILE"SensorsApplet.xml" "SensorsApplet.xml"
48/* initially set as sensors_applet->size to ensure a real value is stored */
49#define DEFAULT_APPLET_SIZE24 24
50#define COLUMN_SPACING2 2
51#define ROW_SPACING1 1
52
53
54/* builder for sensor sorting verification */
55static GVariantBuilder gvb_sensors_hash_list;
56
57
58/* callbacks for panel menu */
59static void prefs_cb(CtkAction *action, gpointer *data) {
60
61 SensorsApplet *sensors_applet;
62 sensors_applet = (SensorsApplet *)data;
63
64 if (sensors_applet->prefs_dialog) {
65 ctk_window_present(CTK_WINDOW(sensors_applet->prefs_dialog->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->prefs_dialog->dialog)), ((ctk_window_get_type
()))))))
);
66 return;
67 }
68 prefs_dialog_open(sensors_applet);
69}
70
71static void about_cb(CtkAction *action, gpointer data) {
72 SensorsApplet *sensors_applet;
73 sensors_applet = (SensorsApplet *)data;
74
75 about_dialog_open(sensors_applet);
76}
77
78static void help_cb(CtkAction *action, gpointer data) {
79
80 GError *error = NULL((void*)0);
81
82 ctk_show_uri_on_window(NULL((void*)0), "help:cafe-sensors-applet",
83
84 ctk_get_current_event_time(),
85 &error);
86
87 if (error) {
88 g_debug("Could not open help document: %s ",error->message);
89 g_error_free(error);
90 }
91}
92
93static void destroy_cb(CtkWidget *widget, gpointer data) {
94 SensorsApplet *sensors_applet;
95 sensors_applet = (SensorsApplet *)data;
96
97 /* destroy dialogs, remove timeout and clear sensors tree and finally the applet */
98 if (sensors_applet->prefs_dialog != NULL((void*)0)) {
99 /* destroy's dialog too */
100 prefs_dialog_close(sensors_applet);
101 }
102
103 if (sensors_applet->timeout_id) {
104 g_source_remove(sensors_applet->timeout_id);
105 }
106
107 if (sensors_applet->settings) {
108 g_object_unref (sensors_applet->settings);
109 sensors_applet->settings = NULL((void*)0);
110 }
111
112 /* destroy all active sensors */
113 g_list_foreach(sensors_applet->active_sensors,
114 (GFunc)active_sensor_destroy,
115 NULL((void*)0));
116
117 if (sensors_applet->sensors != NULL((void*)0)) {
118 ctk_tree_store_clear(sensors_applet->sensors);
119 }
120
121 ctk_widget_destroy(CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
122
123 g_free(sensors_applet);
124 return;
125}
126
127static void change_orient_cb (CafePanelApplet *applet,
128 CafePanelAppletOrient orient,
129 gpointer data) {
130
131 SensorsApplet *sensors_applet;
132 sensors_applet = (SensorsApplet *)data;
133
134 sensors_applet_display_layout_changed(sensors_applet);
135}
136
137static void size_allocate_cb(CafePanelApplet *applet,
138 CtkAllocation *allocation,
139 gpointer data) {
140
141 SensorsApplet *sensors_applet;
142 CafePanelAppletOrient orient;
143
144 sensors_applet = (SensorsApplet *)data;
145 orient = cafe_panel_applet_get_orient(sensors_applet->applet);
146
147 if ((orient == CAFE_PANEL_APPLET_ORIENT_LEFT) ||
148 (orient == CAFE_PANEL_APPLET_ORIENT_RIGHT)) {
149
150 if (sensors_applet->size == allocation->width)
151 return;
152 sensors_applet->size = allocation->width;
153 } else {
154 if (sensors_applet->size == allocation->height)
155 return;
156 sensors_applet->size = allocation->height;
157 }
158
159 /* update if new value */
160 sensors_applet_graph_size_changed(sensors_applet);
161 sensors_applet_display_layout_changed(sensors_applet);
162}
163
164static void style_set_cb(CtkWidget *widget, CtkStyle *old_style, gpointer data) {
165
166 /* update all icons in the sensors tree and update all active sensors */
167 CtkTreeIter interfaces_iter, sensors_iter;
168 CtkTreePath *path;
169 gboolean not_end_of_interfaces = TRUE(!(0)), not_end_of_sensors = TRUE(!(0));
170 IconType icon_type;
171 GdkPixbuf *new_icon;
172 gboolean enabled;
173 SensorsApplet *sensors_applet;
174 DisplayMode display_mode;
175
176 sensors_applet = (SensorsApplet *)data;
177
178 display_mode = g_settings_get_int (sensors_applet->settings, DISPLAY_MODE"display-mode");
179 if (sensors_applet->sensors) {
180 for (ctk_tree_model_get_iter_first(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &interfaces_iter);
181 not_end_of_interfaces;
182 not_end_of_interfaces = ctk_tree_model_iter_next(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &interfaces_iter)) {
183
184 /* reset sensors sentinel */
185 not_end_of_sensors = TRUE(!(0));
186
187 for (ctk_tree_model_iter_children(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter, &interfaces_iter);
188 not_end_of_sensors;
189 not_end_of_sensors = ctk_tree_model_iter_next(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter)) {
190
191 ctk_tree_model_get(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
,
192 &sensors_iter,
193 ENABLE_COLUMN, &enabled,
194 ICON_TYPE_COLUMN, &icon_type,
195 -1);
196 /* update icons */
197 new_icon = sensors_applet_load_icon(icon_type);
198
199 ctk_tree_store_set(sensors_applet->sensors,
200 &sensors_iter,
201 ICON_PIXBUF_COLUMN, new_icon,
202 -1);
203 g_object_unref(new_icon);
204
205 /* update icons only if currently being displayed */
206 if (enabled &&
207 (display_mode == DISPLAY_ICON ||
208 display_mode == DISPLAY_ICON_WITH_VALUE)) {
209
210 path = ctk_tree_model_get_path(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter);
211 sensors_applet_icon_changed(sensors_applet, path);
212 ctk_tree_path_free(path);
213 }
214 }
215 }
216 /* now update layout as size may have changed */
217 sensors_applet_display_layout_changed(sensors_applet);
218 }
219
220}
221
222static gboolean mouse_enter_cb(CtkWidget *widget, CdkEventCrossing *event, gpointer data)
223{
224 SensorsApplet *sensor_applet = data;
225 sensor_applet->show_tooltip = TRUE(!(0));
226 sensors_applet_update_active_sensors(sensor_applet);
227 return TRUE(!(0));
228}
229
230static gboolean mouse_leave_cb(CtkWidget *widget, CdkEventCrossing *event, gpointer data)
231{
232 SensorsApplet *sensor_applet = data;
233 sensor_applet->show_tooltip = FALSE(0);
234 return TRUE(!(0));
235}
236
237static const CtkActionEntry sensors_applet_menu_actions[] = {
238 { "Preferences", "document-properties", N_("_Preferences")("_Preferences"),
239 NULL((void*)0), NULL((void*)0),
240 G_CALLBACK(prefs_cb)((GCallback) (prefs_cb)) },
241 { "Help", "help-browser", N_("_Help")("_Help"),
242 NULL((void*)0), NULL((void*)0),
243 G_CALLBACK(help_cb)((GCallback) (help_cb)) },
244 { "About", "help-about", N_("_About")("_About"),
245 NULL((void*)0), NULL((void*)0),
246 G_CALLBACK(about_cb)((GCallback) (about_cb)) }
247};
248
249#ifdef HAVE_LIBNOTIFY1
250static void notif_closed_cb(NotifyNotification *notification, SensorsApplet *sensors_applet) {
251 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 251, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
252
253 sensors_applet->notification = NULL((void*)0);
254}
255#endif // HAVE_LIBNOTIFY
256
257void sensors_applet_notify_active_sensor(ActiveSensor *active_sensor, NotifType notif_type) {
258#ifdef HAVE_LIBNOTIFY1
259
260 SensorsApplet *sensors_applet;
261 gchar *summary, *message;
262 gint timeout_msecs;
263 gchar *sensor_label;
264 gchar *sensor_path;
265 SensorType sensor_type;
266 TemperatureScale temp_scale;
267 CtkTreeIter iter;
268 CtkTreePath *path;
269 const gchar *unit_type = NULL((void*)0);
270 const gchar *unit_type_title = NULL((void*)0);
271 const gchar *relation = NULL((void*)0);
272 const gchar *limit_type = NULL((void*)0);
273 const gchar *units = NULL((void*)0);
274 gdouble limit_value;
275 gdouble seconds;
276 gboolean show_notification = TRUE(!(0));
277
278 sensors_applet = active_sensor->sensors_applet;
279
280 if (!g_settings_get_boolean (sensors_applet->settings, DISPLAY_NOTIFICATIONS"display-notifications")) {
281 g_debug("Wanted to display notification, but user has disabled them");
282 return;
283 }
284
285 path = ctk_tree_row_reference_get_path(active_sensor->sensor_row);
286 if (ctk_tree_model_get_iter(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &iter, path)) {
287
288 ctk_tree_model_get(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &iter,
289 LABEL_COLUMN, &sensor_label,
290 PATH_COLUMN, &sensor_path,
291 SENSOR_TYPE_COLUMN, &sensor_type,
292 -1);
293 } else {
294 g_warning("Error getting data from tree for notification...");
295 ctk_tree_path_free(path);
296 return;
297 }
298
299 ctk_tree_path_free(path);
300
301 /* do different stuff for different notif types */
302 switch (notif_type) {
303 case LOW_ALARM: /* fall thru */
304 case HIGH_ALARM:
305 if (active_sensor->sensor_values[0] <= active_sensor->sensor_low_value && notif_type == LOW_ALARM) {
306
307 relation = _("is very low")gettext ("is very low");
308 limit_type = _("lower limit")gettext ("lower limit");
309 limit_value = active_sensor->sensor_low_value;
310 } else if (active_sensor->sensor_values[0] >= active_sensor->sensor_high_value && notif_type == HIGH_ALARM) {
311
312 /* assume high alarm condition */
313 relation = _("is very high")gettext ("is very high");
314 limit_type = _("upper limit")gettext ("upper limit");
315 limit_value = active_sensor->sensor_high_value;
316 } else {
317 g_warning("Alarm notify called when no alarm condition!");
318 g_free(sensor_path);
319 g_free(sensor_label);
320 return;
321 }
322
323 switch ((SensorType)sensor_type) {
324 case TEMP_SENSOR:
325 unit_type_title = _("Temperature")gettext ("Temperature");
326 unit_type = _("temperature")gettext ("temperature");
327 temp_scale = (TemperatureScale) g_settings_get_int (active_sensor->sensors_applet->settings, TEMPERATURE_SCALE"temperature-scale");
328
329 switch (temp_scale) {
330 case CELSIUS:
331 units = UNITS_CELSIUS"\302\260C";
332 break;
333 case FAHRENHEIT:
334 units = UNITS_FAHRENHEIT"\302\260F";
335 break;
336 case KELVIN:
337 units = UNITS_KELVIN"";
338 break;
339 default:
340 units = NULL((void*)0);
341 }
342 break;
343
344 case VOLTAGE_SENSOR:
345 unit_type_title = _("Voltage")gettext ("Voltage");
346 unit_type = _("voltage")gettext ("voltage");
347 units = UNITS_VOLTAGEgettext ("V");
348 break;
349
350 case FAN_SENSOR:
351 unit_type_title = _("Fan Speed")gettext ("Fan Speed");
352 unit_type = _("fan speed")gettext ("fan speed");
353 units = UNITS_RPMgettext ("RPM");
354 break;
355
356 case CURRENT_SENSOR:
357 unit_type_title = _("Current")gettext ("Current");
358 unit_type = _("current")gettext ("current");
359 units = UNITS_CURRENTgettext ("A");
360 break;
361 }
362
363 timeout_msecs = (active_sensor->alarm_timeout ? MIN(DEFAULT_NOTIFY_TIMEOUT, (active_sensor->alarm_timeout * 1000))(((3000) < ((active_sensor->alarm_timeout * 1000))) ? (
3000) : ((active_sensor->alarm_timeout * 1000)))
: DEFAULT_NOTIFY_TIMEOUT3000);
364
365 summary = g_strdup_printf("%s %s %s", sensor_label, unit_type_title, _("Alarm")gettext ("Alarm"));
366 message = g_strdup_printf("%s %s %s (%s %2.0f%s)", sensor_label, unit_type, relation, limit_type, limit_value, units);
367 break;
368
369 case SENSOR_INTERFACE_ERROR:
370 /* get time since the last error */
371 seconds = difftime(time(NULL((void*)0)), active_sensor->ierror_ts);
372
373 /* if the last error happened less than 10 seconds ago, don't display this one
374 * this should prevent recurring popups for removed sensors, like USB-HDDs */
375 if (seconds < 11.0) {
376 show_notification = FALSE(0);
377 }
378
379 summary = g_strdup_printf(_("Error updating sensor %s")gettext ("Error updating sensor %s"), sensor_label);
380 message = g_strdup_printf(_("An error occurred while trying to update the value of the sensor %s located at %s.")gettext ("An error occurred while trying to update the value of the sensor %s located at %s."
)
, sensor_label, sensor_path);
381 timeout_msecs = g_settings_get_int (active_sensor->sensors_applet->settings, TIMEOUT"timeout-delay");
382
383 /* update timestamp */
384 time(&(active_sensor->ierror_ts));
385 break;
386
387 default:
388 g_assert_not_reached()do { g_assertion_message_expr ("sensors-applet", "sensors-applet.c"
, 388, ((const char*) (__func__)), ((void*)0)); } while (0)
;
389 }
390
391 if (show_notification) {
392 active_sensor_libnotify_notify(active_sensor,
393 notif_type,
394 summary,
395 message,
396 "dialog-warning",
397 timeout_msecs);
398 }
399
400 g_free(sensor_path);
401 g_free(sensor_label);
402 g_free(summary);
403 g_free(message);
404#endif
405}
406
407void sensors_applet_notify_end(ActiveSensor *active_sensor, NotifType notif_type) {
408#ifdef HAVE_LIBNOTIFY1
409 active_sensor_libnotify_notify_end(active_sensor, notif_type);
410#endif
411}
412
413#ifdef HAVE_LIBNOTIFY1
414static void sensors_applet_notify_end_all_gfunc(ActiveSensor *active_sensor, gpointer data) {
415 active_sensor_libnotify_notify_end(active_sensor, LOW_ALARM);
416 active_sensor_libnotify_notify_end(active_sensor, HIGH_ALARM);
417}
418#endif
419
420void sensors_applet_notify_end_all(SensorsApplet *sensors_applet) {
421#ifdef HAVE_LIBNOTIFY1
422 g_list_foreach(sensors_applet->active_sensors, (GFunc)sensors_applet_notify_end_all_gfunc, NULL((void*)0));
423#endif
424}
425
426/* internal helper functions for updating display etc */
427
428/* should be called as a g_container_foreach at the start of
429 * pack_display if the grid already exists to remove but keep alive
430 * all children of the grid before repacking it */
431static void sensors_applet_pack_display_empty_grid_cb(CtkWidget *widget, gpointer data)
432{
433 CtkContainer *container;
434
435 container = CTK_CONTAINER(data)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_container_get_type ()))))))
;
436
437 /* ref then remove widget */
438 g_object_ref(widget)((__typeof__ (widget)) (g_object_ref) (widget));
439 ctk_container_remove(container, widget);
440}
441
442/* should be called as a g_container_foreach at the end of
443 * pack_display to unref any of the old children that we have readdded
444 * to the table to stop reference creep from the g_object_ref called
445 * on each child at the start of pack labels */
446static void sensors_applet_pack_display_cleanup_refs_cb(CtkWidget *widget, gpointer data) {
447
448 GList *old_children;
449
450 old_children = (GList *)data;
451 if (g_list_find(old_children, widget)) {
452 g_object_unref(widget);
453 }
454}
455
456static void sensors_applet_pack_display(SensorsApplet *sensors_applet) {
457 /* note the if () around each widget is to ensure we only
458 * operate on those that actually exist */
459 CtkLabel *no_sensors_enabled_label = NULL((void*)0);
460 gint num_active_sensors = 0, num_sensors_per_group, rows, cols, i, j;
461 GList *old_grid_children = NULL((void*)0);
462
463 GList *current_sensor;
464
465 DisplayMode display_mode;
466 LayoutMode layout_mode;
467
468 gboolean horizontal;
469 gint label_width, icon_width, value_width;
470 gint label_height, icon_height, value_height;
471
472 CtkRequisition req;
473
474 ActiveSensor *first_sensor;
475
476 /* it is possible that there could be no active sensors so
477 * handle that case first - make sure we dont do a NULL
478 * pointer access first though */
479 if (sensors_applet->active_sensors == NULL((void*)0) || g_list_length(sensors_applet->active_sensors) == 0) {
480 g_debug("no active sensors to pack in grid");
481 no_sensors_enabled_label = g_object_new(CTK_TYPE_LABEL(ctk_label_get_type ()), "label", _("No sensors enabled!")gettext ("No sensors enabled!"), NULL((void*)0));
482
483 if (sensors_applet->grid == NULL((void*)0)) {
484 /* only need 1 row and 1 col */
485 sensors_applet->grid = ctk_grid_new();
486 ctk_grid_set_column_spacing(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
, COLUMN_SPACING2);
487 ctk_grid_set_row_spacing(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
, ROW_SPACING1);
488 ctk_widget_set_halign(sensors_applet->grid, CTK_ALIGN_CENTER);
489 ctk_widget_set_valign(sensors_applet->grid, CTK_ALIGN_CENTER);
490 /* add grid to applet */
491 ctk_container_add(CTK_CONTAINER(sensors_applet->applet)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_container_get_type ()
))))))
, sensors_applet->grid);
492 } else {
493 /* destroy existing widgets - could be an
494 * existing version of no sensors label - okay
495 * to just add again though if destroy first */
496 g_debug("destroying any existing widgets in container");
497 ctk_container_foreach(CTK_CONTAINER(sensors_applet->grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_container_get_type ()))
))))
, (CtkCallback)ctk_widget_destroy, NULL((void*)0));
498 }
499 g_debug("packing no sensors enabled label");
500 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
501 CTK_WIDGET(no_sensors_enabled_label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((no_sensors_enabled_label)), ((ctk_widget_get_type ()))))
))
,
502 0, 0, 1, 1);
503 ctk_widget_show_all(CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
504 return;
505 }
506 /* otherwise can acess active_sensors without any worries */
507 num_active_sensors = g_list_length(sensors_applet->active_sensors);
508
509 display_mode = (DisplayMode) g_settings_get_int (sensors_applet->settings, DISPLAY_MODE"display-mode");
510 layout_mode = (LayoutMode) g_settings_get_int (sensors_applet->settings, LAYOUT_MODE"layout-mode");
511
512 horizontal = (((cafe_panel_applet_get_orient(sensors_applet->applet) == CAFE_PANEL_APPLET_ORIENT_UP) ||
513 (cafe_panel_applet_get_orient(sensors_applet->applet) == CAFE_PANEL_APPLET_ORIENT_DOWN)));
514
515 /* figure out num rows / cols by how high / wide sensors
516 * labels / icons are and how much size we have to put them in */
517
518 /* get the first active sensor */
519 first_sensor = (ActiveSensor *)sensors_applet->active_sensors->data;
520
521 switch (display_mode) {
522 case DISPLAY_VALUE:
523 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->value)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->value)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
524 value_width = req.width + COLUMN_SPACING2;
525 value_height = req.height + ROW_SPACING1;
526
527 /* make sure all widths and heights are non zero,
528 * otherwise will get a divide by zero exception below
529 * - is a non critical error since can happen when
530 * elements first added to list, so simply return - is
531 * not a programming error */
532 if (value_width == 0 && value_height == 0) {
533 return;
534 }
535
536 num_sensors_per_group = (sensors_applet->size / (horizontal ? value_height : value_width));
537 break;
538
539 case DISPLAY_LABEL_WITH_VALUE:
540 /* even though we end up packing the event boxes into the
541 * panel, these dont give back request sizes, so need to ask
542 * widgets directly */
543 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->value)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->value)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
544
545 value_width = req.width + COLUMN_SPACING2;
546 value_height = req.height + ROW_SPACING1;
547
548 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->label)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
549 label_width = req.width + COLUMN_SPACING2;
550 label_height = req.height + ROW_SPACING1;
551
552 /* make sure all widths and heights are non zero, otherwise
553 * will get a divide by zero exception below
554 * - is a non critical error since can happen when
555 * elements first added to list, so simply return - is
556 * not a programming error */
557 if (!(label_width && label_height && value_width && value_height)) {
558 return;
559 }
560
561 switch (layout_mode) {
562 case VALUE_BESIDE_LABEL:
563 num_sensors_per_group = (sensors_applet->size / (horizontal ? MAX(label_height, value_height)(((label_height) > (value_height)) ? (label_height) : (value_height
))
: (label_width + value_width)));
564 break;
565 case VALUE_BELOW_LABEL:
566 num_sensors_per_group = (sensors_applet->size / (horizontal ? (label_height + value_height) : MAX(label_width, value_width)(((label_width) > (value_width)) ? (label_width) : (value_width
))
));
567 break;
568 }
569 break;
570
571 case DISPLAY_ICON_WITH_VALUE:
572 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->value)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->value)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
573 value_width = req.width + COLUMN_SPACING2;
574 value_height = req.height + ROW_SPACING1;
575
576 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->icon)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->icon)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
577 icon_width = req.width + COLUMN_SPACING2;
578 icon_height = req.height + ROW_SPACING1;
579
580 if (!(icon_width && icon_height && value_width && value_height)) {
581 return;
582 }
583
584 switch (layout_mode) {
585 case VALUE_BESIDE_LABEL:
586 num_sensors_per_group = (sensors_applet->size / (horizontal ? MAX(icon_height, value_height)(((icon_height) > (value_height)) ? (icon_height) : (value_height
))
: (icon_width + value_width)));
587 break;
588
589 case VALUE_BELOW_LABEL:
590 num_sensors_per_group = (sensors_applet->size / (horizontal ? (icon_height + value_height) : MAX(icon_width, value_width)(((icon_width) > (value_width)) ? (icon_width) : (value_width
))
));
591 break;
592 }
593 break;
594
595 case DISPLAY_ICON:
596 ctk_widget_get_preferred_size(CTK_WIDGET(first_sensor->icon)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((first_sensor->icon)), ((ctk_widget_get_type ()))))))
, &req, NULL((void*)0));
597 icon_width = req.width + COLUMN_SPACING2;
598 icon_height = req.height + ROW_SPACING1;
599
600 if (!(icon_width && icon_height)) {
601 return;
602 }
603
604 num_sensors_per_group = (sensors_applet->size / (horizontal ? icon_height : icon_width));
605 break;
606
607 case DISPLAY_GRAPH:
608 /* only show graphs in a line like System Monitor applet */
609 num_sensors_per_group = 1;
610 break;
611 }
612
613 /* ensure always atleast 1 sensor per group */
614 if (num_sensors_per_group < 1) {
615 /* force a better layout */
616 if (horizontal && layout_mode == VALUE_BELOW_LABEL) {
617 layout_mode = VALUE_BESIDE_LABEL;
618 } else if (!horizontal && layout_mode == VALUE_BESIDE_LABEL) {
619 layout_mode = VALUE_BELOW_LABEL;
620 }
621 num_sensors_per_group = 1;
622 }
623
624 if (horizontal) {
625 /* if oriented horizontally, want as many
626 sensors per column as user has defined, then
627 enough columns to hold all the widgets */
628 rows = num_sensors_per_group;
629 cols = num_active_sensors / num_sensors_per_group;
630 while (rows * cols < num_active_sensors || cols == 0) {
631 cols++;
632 }
633
634 } else {
635 /* if oriented vertically, want as many
636 sensors per row as user has defined, then
637 enough rows to hold all the widgets*/
638 cols = num_sensors_per_group;
639 rows = num_active_sensors / num_sensors_per_group;
640 while (rows * cols < num_active_sensors || rows == 0) {
641 rows++;
642 }
643
644 }
645
646 /* if displaying labels / icons and values need to modify
647 number of rows / colums to accomodate this */
648 if (display_mode == DISPLAY_LABEL_WITH_VALUE || display_mode == DISPLAY_ICON_WITH_VALUE) {
649 if (layout_mode == VALUE_BESIDE_LABEL) {
650 /* to display labels next to values need twice as many columns */
651 cols *= 2;
652 } else {
653 /* to display labels above values, we need twice as many rows as without */
654 rows *= 2;
655 }
656 }
657
658 if (sensors_applet->grid == NULL((void*)0)) {
659 /* create grid and add to applet */
660 sensors_applet->grid = ctk_grid_new();
661 ctk_grid_set_column_spacing(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
, COLUMN_SPACING2);
662 ctk_grid_set_row_spacing(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
, ROW_SPACING1);
663 ctk_widget_set_halign(sensors_applet->grid, CTK_ALIGN_CENTER);
664 ctk_widget_set_valign(sensors_applet->grid, CTK_ALIGN_CENTER);
665 ctk_container_add(CTK_CONTAINER(sensors_applet->applet)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_container_get_type ()
))))))
, sensors_applet->grid);
666 } else {
667 /* remove all children if grid already exists so we can start again */
668 /* save a list of the old children for later */
669 old_grid_children = ctk_container_get_children(CTK_CONTAINER(sensors_applet->grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_container_get_type ()))
))))
);
670
671 ctk_container_foreach(CTK_CONTAINER(sensors_applet->grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_container_get_type ()))
))))
,
672 sensors_applet_pack_display_empty_grid_cb,
673 sensors_applet->grid);
674 }
675 /* pack icons / labels and values into grid */
676 current_sensor = sensors_applet->active_sensors;
677
678 /* if showing labels / icons and values, need to pack labels / icons these first */
679 if (display_mode == DISPLAY_ICON_WITH_VALUE || display_mode == DISPLAY_LABEL_WITH_VALUE) {
680 /* loop through columns */
681 for (i = 0; current_sensor != NULL((void*)0) && i < cols; /* increments depends on how we lay them out - see below */) {
682
683 /* loop through rows in a column */
684 for (j = 0; current_sensor && j < rows; /* see bottom of for loop*/) {
685 /* attach label / icon at this point */
686 if (display_mode == DISPLAY_ICON_WITH_VALUE) {
687 if (((ActiveSensor *)(current_sensor->data))->icon) {
688 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
689 ((ActiveSensor *)(current_sensor->data))->icon,
690 i, j, 1, 1);
691 }
692 } else {
693 if (((ActiveSensor *)(current_sensor->data))->label) {
694 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
695 ((ActiveSensor *)(current_sensor->data))->label,
696 i, j, 1, 1);
697 }
698 }
699 /* now attach sensor value to either row below or column next to */
700 if (layout_mode == VALUE_BESIDE_LABEL) {
701 /* left align labels */
702 if (((ActiveSensor *)(current_sensor->data))->icon) {
703 ctk_widget_set_halign (((ActiveSensor *)(current_sensor->data))->icon, CTK_ALIGN_START);
704 ctk_widget_set_valign (((ActiveSensor *)(current_sensor->data))->icon, CTK_ALIGN_CENTER);
705 }
706 if (((ActiveSensor *)(current_sensor->data))->label) {
707 ctk_label_set_xalign (CTK_LABEL(((ActiveSensor *)(current_sensor->data))->label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((((ActiveSensor *)(current_sensor->data))->label)),
((ctk_label_get_type ()))))))
, 0);
708 ctk_label_set_yalign (CTK_LABEL(((ActiveSensor *)(current_sensor->data))->label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((((ActiveSensor *)(current_sensor->data))->label)),
((ctk_label_get_type ()))))))
, 0.5);
709 }
710 if (((ActiveSensor *)(current_sensor->data))->value) {
711 ctk_widget_set_halign (((ActiveSensor *)(current_sensor->data))->value, CTK_ALIGN_START);
712 ctk_widget_set_valign (((ActiveSensor *)(current_sensor->data))->value, CTK_ALIGN_CENTER);
713 }
714
715 /* place value next to label */
716 if (((ActiveSensor *)(current_sensor->data))->value) {
717 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
718 ((ActiveSensor *)(current_sensor->data))->value,
719 i + 1, j, 1, 1);
720 }
721 j++;
722 } else { /* place value below label */
723
724 /* center align labels */
725 if (((ActiveSensor *)(current_sensor->data))->icon) {
726 ctk_widget_set_halign (((ActiveSensor *)(current_sensor->data))->icon, CTK_ALIGN_CENTER);
727 ctk_widget_set_valign (((ActiveSensor *)(current_sensor->data))->icon, CTK_ALIGN_CENTER);
728 }
729 if (((ActiveSensor *)(current_sensor->data))->label) {
730 ctk_label_set_xalign (CTK_LABEL(((ActiveSensor *)(current_sensor->data))->label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((((ActiveSensor *)(current_sensor->data))->label)),
((ctk_label_get_type ()))))))
, 0.5);
731 ctk_label_set_yalign (CTK_LABEL(((ActiveSensor *)(current_sensor->data))->label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((((ActiveSensor *)(current_sensor->data))->label)),
((ctk_label_get_type ()))))))
, 0.5);
732 }
733 if (((ActiveSensor *)(current_sensor->data))->value) {
734 ctk_widget_set_halign (((ActiveSensor *)(current_sensor->data))->value, CTK_ALIGN_CENTER);
735 ctk_widget_set_valign (((ActiveSensor *)(current_sensor->data))->value, CTK_ALIGN_CENTER);
736 }
737
738 if (((ActiveSensor *)(current_sensor->data))->value) {
739 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
740 ((ActiveSensor *)(current_sensor->data))->value,
741 i, j + 1, 1, 1);
742 }
743 j += 2;
744 }
745 current_sensor = g_list_next(current_sensor)((current_sensor) ? (((GList *)(current_sensor))->next) : (
(void*)0))
;
746 } /* end row loop */
747
748 /* now increment column index as needed */
749 if (layout_mode == VALUE_BESIDE_LABEL) { /* place value next to label */
750 i += 2;
751 } else {
752 i++;
753 }
754 } /* end column loop */
755
756 } else { /* not showing labels and icons with values, so just pack either only icons or values */
757 for (i = 0; current_sensor != NULL((void*)0) && i < cols; ++i) {
758 for (j = 0; current_sensor!= NULL((void*)0) && j < rows; ++j) {
759 if (display_mode == DISPLAY_VALUE) {
760 if (((ActiveSensor *)(current_sensor->data))->value) {
761 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
762 ((ActiveSensor *)(current_sensor->data))->value,
763 i, j, 1, 1);
764 }
765 } else if (display_mode == DISPLAY_ICON) {
766 if (((ActiveSensor *)(current_sensor->data))->value) {
767 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
768 ((ActiveSensor *)(current_sensor->data))->icon,
769 i, j, 1, 1);
770 }
771 } else if (display_mode == DISPLAY_GRAPH) {
772 if (((ActiveSensor *)(current_sensor->data))->graph) {
773 ctk_grid_attach(CTK_GRID(sensors_applet->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_grid_get_type ()))))))
,
774 ((ActiveSensor *)(current_sensor->data))->graph_frame,
775 i, j, 1, 1);
776 }
777 }
778
779 current_sensor = g_list_next(current_sensor)((current_sensor) ? (((GList *)(current_sensor))->next) : (
(void*)0))
;
780 }
781 }
782 }
783
784 if (old_grid_children != NULL((void*)0)) {
785 ctk_container_foreach(CTK_CONTAINER(sensors_applet->grid)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->grid)), ((ctk_container_get_type ()))
))))
,
786 sensors_applet_pack_display_cleanup_refs_cb,
787 old_grid_children);
788 g_list_free(old_grid_children);
789 }
790 ctk_widget_show_all(CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
791
792}
793
794/* must unref when done with returned pixbuf */
795GdkPixbuf *sensors_applet_load_icon(IconType icon_type) {
796 CtkIconTheme *icon_theme;
797 GdkPixbuf *icon = NULL((void*)0);
798 GError *error = NULL((void*)0);
799
800 /* try to load the icon */
801
802 /* not allowed to unref or ref icon_theme once we have it */
803 icon_theme = ctk_icon_theme_get_default();
804 icon = ctk_icon_theme_load_icon(icon_theme,
805 stock_icons[icon_type],
806 DEFAULT_ICON_SIZE22,
807 CTK_ICON_LOOKUP_USE_BUILTIN,
808 &error);
809
810 if (error) {
811 g_warning ("Could not load icon: %s", error->message);
812 g_error_free(error);
813 error = NULL((void*)0);
814
815 /* try again with default icon */
816 icon = ctk_icon_theme_load_icon(icon_theme,
817 "image-missing",
818 DEFAULT_ICON_SIZE22,
819 CTK_ICON_LOOKUP_USE_BUILTIN,
820 &error);
821
822 if (error) {
823 /* this will quit sensors-applet but it is a pretty major error so may as well */
824 g_error("Could not load CTK_STOCK_MISSING_IMAGE - major error!!!: %s", error->message);
825 g_error_free(error);
826 error = NULL((void*)0);
827 }
828
829 }
830 return icon;
831}
832
833// MUST FREE STRINGS AFTER CALLING THIS FUNCTION!!
834gboolean sensors_applet_add_sensor(SensorsApplet *sensors_applet,
835 const gchar *path,
836 const gchar *id,
837 const gchar *label,
838 const gchar *interface,
839 SensorType type,
840 gboolean enable,
841 gdouble low_value,
842 gdouble high_value,
843 gboolean alarm_enable,
844 const gchar *low_alarm_command,
845 const gchar *high_alarm_command,
846 gint alarm_timeout,
847 gdouble multiplier,
848 gdouble offset,
849 IconType icon_type,
850 const gchar *graph_color) {
851
852 CtkTreeIter interfaces_iter, sensors_iter;
853 gboolean not_empty_tree;
854
855 gchar *node_interface;
856 gboolean not_end_of_interfaces = TRUE(!(0)), interface_exists = FALSE(0);
857 gboolean not_end_of_sensors = TRUE(!(0));
858 gchar *sensor_id;
859 gchar *sensor_path;
860 SensorType sensor_type;
861 GdkPixbuf *icon;
862 CtkTreePath *tree_path;
863
864 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 864, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
865
866 /* assume tree is not empty */
867 not_empty_tree = TRUE(!(0));
Value stored to 'not_empty_tree' is never read
868
869 if (NULL((void*)0) == sensors_applet->sensors) {
870
871 sensors_applet->sensors = ctk_tree_store_new(N_COLUMNS,
872 G_TYPE_STRING((GType) ((16) << (2))), /* path */
873 G_TYPE_STRING((GType) ((16) << (2))), /* id */
874 G_TYPE_STRING((GType) ((16) << (2))), /* label */
875 G_TYPE_STRING((GType) ((16) << (2))), /* interface */
876 G_TYPE_UINT((GType) ((7) << (2))), /* sensor type */
877 G_TYPE_BOOLEAN((GType) ((5) << (2))), /* enable */
878 G_TYPE_BOOLEAN((GType) ((5) << (2))), /* visible */
879 G_TYPE_DOUBLE((GType) ((15) << (2))), /* low value */
880 G_TYPE_DOUBLE((GType) ((15) << (2))), /* high type */
881 G_TYPE_BOOLEAN((GType) ((5) << (2))), /* alarm enable */
882 G_TYPE_STRING((GType) ((16) << (2))), /* low alarm command */
883 G_TYPE_STRING((GType) ((16) << (2))), /* high alarm command */
884 G_TYPE_UINT((GType) ((7) << (2))), /* alarm timeout */
885 G_TYPE_DOUBLE((GType) ((15) << (2))), /* multiplier */
886 G_TYPE_DOUBLE((GType) ((15) << (2))), /* offset */
887 G_TYPE_UINT((GType) ((7) << (2))), /* icon type */
888 GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()), /* icon pixbuf */
889 G_TYPE_STRING((GType) ((16) << (2)))); /* graph color */
890
891 g_debug("Sensor tree created.");
892
893 /* we know tree is actually empty since we just created it */
894 not_empty_tree = FALSE(0);
895 }
896
897 /* search sensor tree for the parent interface to place this sensor under */
898 for (not_empty_tree = ctk_tree_model_get_iter_first(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &interfaces_iter);
899 not_empty_tree && not_end_of_interfaces && !interface_exists;
900 not_end_of_interfaces = ctk_tree_model_iter_next(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &interfaces_iter)) {
901
902 ctk_tree_model_get(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &interfaces_iter, INTERFACE_COLUMN, &node_interface, -1);
903 if (g_ascii_strcasecmp(interface, node_interface) == 0) {
904 /* found interface in tree */
905 interface_exists = TRUE(!(0));
906
907 /* now see if this actual sensor already exists within this interface - don't want to add duplicates */
908 /* see if have children */
909 for (not_end_of_sensors = ctk_tree_model_iter_children(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter, &interfaces_iter);
910 not_end_of_sensors;
911 not_end_of_sensors = ctk_tree_model_iter_next(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter)) {
912
913 ctk_tree_model_get(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter,
914 PATH_COLUMN, &sensor_path,
915 ID_COLUMN, &sensor_id,
916 SENSOR_TYPE_COLUMN, &sensor_type,
917 -1);
918 if (g_ascii_strcasecmp(sensor_id, id) == 0 && g_ascii_strcasecmp(sensor_path, path) == 0 && sensor_type == type) {
919 /* sensor already exists so dont add a second time */
920 g_debug("sensor with path: %s, id: %s already exists in tree, not adding a second time", sensor_path, sensor_id);
921 g_free(sensor_id);
922 g_free(sensor_path);
923 g_free(node_interface);
924 return FALSE(0);
925 }
926 g_free(sensor_id);
927 g_free(sensor_path);
928 }
929 g_free(node_interface);
930 break;
931 }
932 g_free(node_interface);
933 }
934
935 if (!interface_exists) {
936 /* add to required plugins hash table so we ensure this
937 plugin stays loaded to make sure we have a get sensor
938 value function if possible */
939 g_hash_table_insert(sensors_applet->required_plugins,
940 g_strdup(interface),
941 GINT_TO_POINTER(TRUE)((gpointer) (glong) ((!(0)))));
942 g_debug("added interface %s to required plugins", interface);
943
944 /* wasn't able to find interface root node so create it */
945 ctk_tree_store_append(sensors_applet->sensors,
946 &interfaces_iter,
947 NULL((void*)0));
948
949 ctk_tree_store_set(sensors_applet->sensors,
950 &interfaces_iter,
951 ID_COLUMN, interface,
952 INTERFACE_COLUMN, interface,
953 VISIBLE_COLUMN, FALSE(0),
954 -1);
955 g_debug("Added sensor interface %s to tree", interface);
956 }
957
958 /* then add sensor as a child under interface node - ie assume
959 * we either found it or created it - the inteface node that is */
960
961 /* for now just add sensors all in a single list */
962 ctk_tree_store_append(sensors_applet->sensors, &sensors_iter, &interfaces_iter);
963
964 /* if sensor is already in settings, load values from there */
965 gchar *applet_path = cafe_panel_applet_get_preferences_path (sensors_applet->applet);
966 gchar *gsuid = sensors_applet_settings_get_unique_id (interface, id, path);
967 gchar *settings_path = g_strdup_printf ("%s%s/", applet_path, gsuid);
968 GSettings *settings = g_settings_new_with_path ("org.cafe.sensors-applet.sensor", settings_path);
969
970 /* add hash to temp sorting list */
971 g_variant_builder_add (&gvb_sensors_hash_list, "s", gsuid);
972
973 g_free (applet_path);
974 g_free (gsuid);
975 g_free (settings_path);
976
977 gchar *settings_id = g_settings_get_string (settings, ID"id");
978
979 if (settings_id != NULL((void*)0) && settings_id[0] != '\0') {
980 enable = g_settings_get_boolean (settings, ENABLED"enabled");
981 icon = sensors_applet_load_icon(g_settings_get_int (settings, ICON_TYPE"icon-type"));
982 ctk_tree_store_set(sensors_applet->sensors,
983 &sensors_iter,
984 PATH_COLUMN, g_settings_get_string (settings, PATH"path"),
985 ID_COLUMN, settings_id,
986 LABEL_COLUMN, g_settings_get_string (settings, LABEL"label"),
987 INTERFACE_COLUMN, g_settings_get_string (settings, INTERFACE"interface"),
988 SENSOR_TYPE_COLUMN, g_settings_get_int (settings, SENSOR_TYPE"sensor-type"),
989 ENABLE_COLUMN, enable,
990 VISIBLE_COLUMN, TRUE(!(0)),
991 LOW_VALUE_COLUMN, g_settings_get_double (settings, LOW_VALUE"low-value"),
992 HIGH_VALUE_COLUMN, g_settings_get_double (settings, HIGH_VALUE"high-value"),
993 ALARM_ENABLE_COLUMN, g_settings_get_boolean (settings, ALARM_ENABLED"alarm-enabled"),
994 ALARM_TIMEOUT_COLUMN, g_settings_get_int (settings, ALARM_TIMEOUT"alarm-timeout"),
995 LOW_ALARM_COMMAND_COLUMN, g_settings_get_string (settings, LOW_ALARM_COMMAND"low-alarm-command"),
996 HIGH_ALARM_COMMAND_COLUMN, g_settings_get_string (settings, HIGH_ALARM_COMMAND"high-alarm-command"),
997 MULTIPLIER_COLUMN, g_settings_get_double (settings, MULTIPLIER"multiplier"),
998 OFFSET_COLUMN, g_settings_get_double (settings, OFFSET"offset"),
999 ICON_TYPE_COLUMN, g_settings_get_int (settings, ICON_TYPE"icon-type"),
1000 ICON_PIXBUF_COLUMN, icon,
1001 GRAPH_COLOR_COLUMN, g_settings_get_string (settings, GRAPH_COLOR"graph-color"),
1002 -1);
1003 g_free (settings_id);
1004 } else {
1005 icon = sensors_applet_load_icon(icon_type);
1006 ctk_tree_store_set(sensors_applet->sensors,
1007 &sensors_iter,
1008 PATH_COLUMN, path,
1009 ID_COLUMN, id,
1010 LABEL_COLUMN, label,
1011 INTERFACE_COLUMN, interface,
1012 SENSOR_TYPE_COLUMN, type,
1013 ENABLE_COLUMN, enable,
1014 VISIBLE_COLUMN, TRUE(!(0)),
1015 LOW_VALUE_COLUMN, low_value,
1016 HIGH_VALUE_COLUMN, high_value,
1017 ALARM_ENABLE_COLUMN, alarm_enable,
1018 ALARM_TIMEOUT_COLUMN, alarm_timeout,
1019 LOW_ALARM_COMMAND_COLUMN, low_alarm_command,
1020 HIGH_ALARM_COMMAND_COLUMN, high_alarm_command,
1021 MULTIPLIER_COLUMN, multiplier,
1022 OFFSET_COLUMN, offset,
1023 ICON_TYPE_COLUMN, icon_type,
1024 ICON_PIXBUF_COLUMN, icon,
1025 GRAPH_COLOR_COLUMN, graph_color,
1026 -1);
1027 }
1028 g_object_unref (settings);
1029 g_debug("added sensor %s to tree", path);
1030
1031 /* remove reference to icon as tree now has ref */
1032 g_object_unref(icon);
1033
1034 /* create the active sensor */
1035 if (enable) {
1036 tree_path = ctk_tree_model_get_path(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, &sensors_iter);
1037 sensors_applet_sensor_enabled(sensors_applet, tree_path);
1038 ctk_tree_path_free(tree_path);
1039 }
1040 return TRUE(!(0));
1041}
1042
1043static ActiveSensor *sensors_applet_find_active_sensor(SensorsApplet *sensors_applet, CtkTreePath *path) {
1044 CtkTreePath *sensor_tree_path;
1045 GList *current_sensor;
1046
1047 for (current_sensor = sensors_applet->active_sensors; current_sensor != NULL((void*)0); current_sensor = g_list_next(current_sensor)((current_sensor) ? (((GList *)(current_sensor))->next) : (
(void*)0))
) {
1048 sensor_tree_path = ctk_tree_row_reference_get_path(((ActiveSensor *)(current_sensor->data))->sensor_row);
1049
1050 if (ctk_tree_path_compare(path, sensor_tree_path) == 0) {
1051 ctk_tree_path_free(sensor_tree_path);
1052 return ((ActiveSensor *)(current_sensor->data));
1053 }
1054 ctk_tree_path_free(sensor_tree_path);
1055 }
1056 return NULL((void*)0);
1057}
1058
1059/* path should be the full path to a file representing the sensor (eg
1060 * /dev/hda or /sys/devices/platform/i2c-0/0-0290/temp1_input) */
1061void sensors_applet_display_layout_changed(SensorsApplet *sensors_applet) {
1062 /* update sensors since will need to update icons / graphs etc
1063 * if weren't displayed before */
1064 GList *list = NULL((void*)0);
1065 for (list = sensors_applet->active_sensors; list != NULL((void*)0); list = list->next) {
1066 ActiveSensor *as = (ActiveSensor *)list->data;
1067 as->updated = FALSE(0);
1068 }
1069 sensors_applet_update_active_sensors(sensors_applet);
1070 sensors_applet_pack_display(sensors_applet);
1071}
1072
1073void sensors_applet_alarm_off(SensorsApplet *sensors_applet,
1074 CtkTreePath *path,
1075 NotifType notif_type) {
1076 ActiveSensor *active_sensor;
1077
1078 if ((active_sensor = sensors_applet_find_active_sensor(sensors_applet, path)) != NULL((void*)0)) {
1079 active_sensor_alarm_off(active_sensor, notif_type);
1080 }
1081}
1082
1083void sensors_applet_all_alarms_off(SensorsApplet *sensors_applet, CtkTreePath *path) {
1084 sensors_applet_alarm_off(sensors_applet, path, LOW_ALARM);
1085 sensors_applet_alarm_off(sensors_applet, path, HIGH_ALARM);
1086}
1087
1088void sensors_applet_sensor_enabled(SensorsApplet *sensors_applet, CtkTreePath *path) {
1089 ActiveSensor *active_sensor;
1090
1091 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1091, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1092 g_assert(path)do { if (path) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1092, ((const char*) (__func__)), "path"
); } while (0)
;
1093
1094 active_sensor = active_sensor_new(sensors_applet, ctk_tree_row_reference_new(CTK_TREE_MODEL(sensors_applet->sensors)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->sensors)), ((ctk_tree_model_get_type (
)))))))
, path));
1095 active_sensor_update(active_sensor, sensors_applet);
1096
1097 /* keep list sorted */
1098 sensors_applet->active_sensors = g_list_insert_sorted(sensors_applet->active_sensors,
1099 active_sensor,
1100 (GCompareFunc)active_sensor_compare);
1101
1102 sensors_applet_pack_display(sensors_applet);
1103}
1104
1105void sensors_applet_reorder_sensors(SensorsApplet *sensors_applet) {
1106 sensors_applet->active_sensors = g_list_sort(sensors_applet->active_sensors, (GCompareFunc)active_sensor_compare);
1107
1108 sensors_applet_pack_display(sensors_applet);
1109}
1110
1111void sensors_applet_sensor_disabled(SensorsApplet *sensors_applet, CtkTreePath *path) {
1112
1113 ActiveSensor *active_sensor;
1114
1115 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1115, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1116 g_assert(path)do { if (path) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1116, ((const char*) (__func__)), "path"
); } while (0)
;
1117
1118 if ((active_sensor = sensors_applet_find_active_sensor(sensors_applet, path)) != NULL((void*)0)) {
1119 g_debug("Destroying active sensor...");
1120
1121 g_debug("-- removing from list...");
1122 sensors_applet->active_sensors = g_list_remove(sensors_applet->active_sensors, active_sensor);
1123 g_debug("-- repacking display....");
1124 sensors_applet_pack_display(sensors_applet);
1125
1126 active_sensor_destroy(active_sensor);
1127 }
1128}
1129
1130void sensors_applet_update_sensor(SensorsApplet *sensors_applet, CtkTreePath *path) {
1131 ActiveSensor *active_sensor;
1132
1133 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1133, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1134 g_assert(path)do { if (path) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1134, ((const char*) (__func__)), "path"
); } while (0)
;
1135
1136 if ((active_sensor = sensors_applet_find_active_sensor(sensors_applet, path)) != NULL((void*)0)) {
1137 active_sensor_update(active_sensor, sensors_applet);
1138 }
1139}
1140
1141void sensors_applet_icon_changed(SensorsApplet *sensors_applet, CtkTreePath *path) {
1142 ActiveSensor *active_sensor;
1143
1144 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1144, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1145 g_assert(path)do { if (path) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1145, ((const char*) (__func__)), "path"
); } while (0)
;
1146
1147 if ((active_sensor = sensors_applet_find_active_sensor(sensors_applet, path)) != NULL((void*)0)) {
1148 active_sensor_icon_changed(active_sensor, sensors_applet);
1149 }
1150}
1151
1152/* Cycle thru ActiveSensors and update them all */
1153gboolean sensors_applet_update_active_sensors(SensorsApplet *sensors_applet) {
1154 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1154, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1155
1156 if (sensors_applet->active_sensors) {
1157 g_list_foreach(sensors_applet->active_sensors,
1158 (GFunc)active_sensor_update,
1159 sensors_applet);
1160 return TRUE(!(0));
1161 }
1162 return FALSE(0);
1163}
1164
1165/* Cycle thru ActiveSensors and set new graph dimensions */
1166void sensors_applet_graph_size_changed(SensorsApplet *sensors_applet) {
1167 gint dimensions[2];
1168 gint graph_size;
1169 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1169, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1170
1171 if (sensors_applet->active_sensors) {
1172
1173 graph_size = g_settings_get_int (sensors_applet->settings, GRAPH_SIZE"graph-size");
1174 if (cafe_panel_applet_get_orient(sensors_applet->applet) == CAFE_PANEL_APPLET_ORIENT_UP ||
1175 cafe_panel_applet_get_orient(sensors_applet->applet) == CAFE_PANEL_APPLET_ORIENT_DOWN) {
1176
1177 /* is horizontal so set graph_size as width */
1178 dimensions[0] = graph_size;
1179 dimensions[1] = sensors_applet->size;
1180 } else {
1181 dimensions[0] = sensors_applet->size;
1182 dimensions[1] = graph_size;
1183 }
1184
1185 g_list_foreach(sensors_applet->active_sensors,
1186 (GFunc)active_sensor_update_graph_dimensions,
1187 &dimensions);
1188 }
1189
1190}
1191
1192gdouble sensors_applet_convert_temperature(gdouble value, TemperatureScale old, TemperatureScale new) {
1193
1194 switch (old) {
1195 case KELVIN:
1196 switch (new) {
1197 case CELSIUS:
1198 value = value - 273.0;
1199 break;
1200 case FAHRENHEIT:
1201 value = (9.0 * (value - 273) / 5.0) + 32.0;
1202 break;
1203 case KELVIN:
1204 break;
1205 }
1206 break;
1207
1208 case CELSIUS:
1209 switch (new) {
1210 case FAHRENHEIT:
1211 value = (9.0 * value / 5.0) + 32.0;
1212 break;
1213 case KELVIN:
1214 value = value + 273.0;
1215 break;
1216 case CELSIUS:
1217 break;
1218 }
1219 break;
1220
1221 case FAHRENHEIT:
1222 switch (new) {
1223 case CELSIUS:
1224 value = (5.0 * (value - 32.0) / 9.0);
1225 break;
1226 case KELVIN:
1227 value = (5.0 * (value - 32.0) / 9.0) + 273.0;
1228 break;
1229 case FAHRENHEIT:
1230 break;
1231 }
1232 break;
1233 }
1234 return value;
1235}
1236
1237void sensors_applet_init(SensorsApplet *sensors_applet) {
1238
1239 g_assert(sensors_applet)do { if (sensors_applet) ; else g_assertion_message_expr ("sensors-applet"
, "sensors-applet.c", 1239, ((const char*) (__func__)), "sensors_applet"
); } while (0)
;
1240 g_assert(sensors_applet->applet)do { if (sensors_applet->applet) ; else g_assertion_message_expr
("sensors-applet", "sensors-applet.c", 1240, ((const char*) (
__func__)), "sensors_applet->applet"); } while (0)
;
1241
1242 CtkActionGroup *action_group;
1243 gchar *ui_path;
1244
1245 /* Have our background automatically painted. */
1246 cafe_panel_applet_set_background_widget(CAFE_PANEL_APPLET(sensors_applet->applet)((((CafePanelApplet*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((cafe_panel_applet_get_type
()))))))
, CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
1247
1248 /* plugin functions are stored as name -> get_value_function pairs so
1249 * use standard string functions on hash table */
1250 sensors_applet->plugins = g_hash_table_new(g_str_hash, g_str_equal);
1251
1252 sensors_applet->required_plugins = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL((void*)0));
1253
1254 /* initialise size */
1255 sensors_applet->size = DEFAULT_APPLET_SIZE24;
1256
1257 cafe_panel_applet_set_flags(sensors_applet->applet, CAFE_PANEL_APPLET_EXPAND_MINOR);
1258
1259 g_signal_connect(sensors_applet->applet, "destroy",g_signal_connect_data ((sensors_applet->applet), ("destroy"
), (((GCallback) (destroy_cb))), (sensors_applet), ((void*)0)
, (GConnectFlags) 0)
1260 G_CALLBACK(destroy_cb),g_signal_connect_data ((sensors_applet->applet), ("destroy"
), (((GCallback) (destroy_cb))), (sensors_applet), ((void*)0)
, (GConnectFlags) 0)
1261 sensors_applet)g_signal_connect_data ((sensors_applet->applet), ("destroy"
), (((GCallback) (destroy_cb))), (sensors_applet), ((void*)0)
, (GConnectFlags) 0)
;
1262
1263 /* init gsettings */
1264 sensors_applet->settings = cafe_panel_applet_settings_new (sensors_applet->applet, "org.cafe.sensors-applet");
1265
1266
1267 /* set up builder for sorting verification */
1268 g_variant_builder_init (&gvb_sensors_hash_list, G_VARIANT_TYPE ("as")(g_variant_type_checked_ (("as"))));
1269
1270 /* set up / load sensors from the plugins */
1271 sensors_applet_plugins_load_all(sensors_applet);
1272
1273 /* set sorting hash array */
1274 GVariant *gv_temp = g_variant_builder_end (&gvb_sensors_hash_list);
1275 sensors_applet->sensors_hash_array = g_variant_dup_strv (gv_temp, NULL((void*)0));
1276 g_variant_unref (gv_temp);
1277
1278 /* sort sensors based on saved sorting */
1279 sensors_applet_settings_sort_sensors(sensors_applet);
1280
1281 /* free hash array */
1282 g_strfreev (sensors_applet->sensors_hash_array);
1283
1284
1285 /* should have created sensors tree above, but if have not was because we couldn't find any sensors */
1286 if (NULL((void*)0) == sensors_applet->sensors) {
1287 CtkWidget *label;
1288 label = ctk_label_new(_("No sensors found!")gettext ("No sensors found!"));
1289 ctk_container_add(CTK_CONTAINER(sensors_applet->applet)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_container_get_type ()
))))))
, label);
1290 ctk_widget_show_all(CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
1291 return;
1292 }
1293
1294 /* only do menu and signal connections if sensors are found */
1295 action_group = ctk_action_group_new ("Sensors Applet Actions");
1296 ctk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE"cafe-sensors-applet");
1297 ctk_action_group_add_actions (action_group,
1298 sensors_applet_menu_actions,
1299 G_N_ELEMENTS (sensors_applet_menu_actions)(sizeof (sensors_applet_menu_actions) / sizeof ((sensors_applet_menu_actions
)[0]))
,
1300 sensors_applet);
1301 ui_path = g_build_filename (UIDIR"/usr/local/share/cafe-sensors-applet/ui", SENSORS_APPLET_MENU_FILE"SensorsApplet.xml", NULL((void*)0));
1302 cafe_panel_applet_setup_menu_from_file (sensors_applet->applet, ui_path, action_group);
1303 g_free (ui_path);
1304 g_object_unref (action_group);
1305
1306 g_signal_connect(sensors_applet->applet, "style-set",g_signal_connect_data ((sensors_applet->applet), ("style-set"
), (((GCallback) (style_set_cb))), (sensors_applet), ((void*)
0), (GConnectFlags) 0)
1307 G_CALLBACK(style_set_cb),g_signal_connect_data ((sensors_applet->applet), ("style-set"
), (((GCallback) (style_set_cb))), (sensors_applet), ((void*)
0), (GConnectFlags) 0)
1308 sensors_applet)g_signal_connect_data ((sensors_applet->applet), ("style-set"
), (((GCallback) (style_set_cb))), (sensors_applet), ((void*)
0), (GConnectFlags) 0)
;
1309
1310 g_signal_connect(G_OBJECT(sensors_applet->applet), "change_orient",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("change_orient"), (((GCallback) (
change_orient_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
1311 G_CALLBACK(change_orient_cb),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("change_orient"), (((GCallback) (
change_orient_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
1312 sensors_applet)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("change_orient"), (((GCallback) (
change_orient_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
;
1313
1314 g_signal_connect(G_OBJECT(sensors_applet->applet), "size_allocate",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("size_allocate"), (((GCallback) (
size_allocate_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
1315 G_CALLBACK(size_allocate_cb),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("size_allocate"), (((GCallback) (
size_allocate_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
1316 sensors_applet)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("size_allocate"), (((GCallback) (
size_allocate_cb))), (sensors_applet), ((void*)0), (GConnectFlags
) 0)
;
1317
1318 g_signal_connect(G_OBJECT(sensors_applet->applet), "leave_notify_event",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("leave_notify_event"), (((GCallback
) (mouse_leave_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
1319 G_CALLBACK(mouse_leave_cb),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("leave_notify_event"), (((GCallback
) (mouse_leave_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
1320 (gpointer)sensors_applet)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("leave_notify_event"), (((GCallback
) (mouse_leave_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
;
1321
1322 g_signal_connect(G_OBJECT(sensors_applet->applet), "enter_notify_event",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("enter_notify_event"), (((GCallback
) (mouse_enter_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
1323 G_CALLBACK(mouse_enter_cb),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("enter_notify_event"), (((GCallback
) (mouse_enter_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
1324 (gpointer)sensors_applet)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((sensors_applet->applet)), (((GType) (
(20) << (2))))))))), ("enter_notify_event"), (((GCallback
) (mouse_enter_cb))), ((gpointer)sensors_applet), ((void*)0),
(GConnectFlags) 0)
;
1325
1326 sensors_applet_update_active_sensors(sensors_applet);
1327 sensors_applet_pack_display(sensors_applet);
1328
1329 sensors_applet->timeout_id = g_timeout_add_seconds(g_settings_get_int(sensors_applet->settings, TIMEOUT"timeout-delay") / 1000,
1330 (GSourceFunc)sensors_applet_update_active_sensors,
1331 sensors_applet);
1332
1333 g_object_set (ctk_settings_get_default (), "ctk-menu-images", TRUE(!(0)), NULL((void*)0));
1334 g_object_set (ctk_settings_get_default (), "ctk-button-images", TRUE(!(0)), NULL((void*)0));
1335
1336 ctk_widget_show_all(CTK_WIDGET(sensors_applet->applet)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((sensors_applet->applet)), ((ctk_widget_get_type ())))
)))
);
1337}
1338