update for beta release
[framework/uifw/e17.git] / src / modules / temperature / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 #define FAR_2_CEL(x) ((x - 32) / 9.0) * 5.0
5 #define CEL_2_FAR(x) (x * 9.0 / 5.0) + 32
6
7 struct _E_Config_Dialog_Data 
8 {
9    struct 
10      {
11         int interval;
12      } poll;
13
14    int unit_method;
15 #ifdef HAVE_EEZE
16    int backend;
17 #endif
18    struct 
19      {
20         int low, high;
21      } temp;
22
23    int sensor;
24    Eina_List *sensors;
25
26    Evas_Object *o_high, *o_low;
27
28    Config_Face *inst;
29 };
30
31 /* local function prototypes */
32 static void *_create_data(E_Config_Dialog *cfd);
33 static void _fill_data_tempget(E_Config_Dialog_Data *cfdata);
34 static void _fill_sensors(E_Config_Dialog_Data *cfdata, const char *name);
35 static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
36 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
37 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
38 static void _cb_display_changed(void *data, Evas_Object *obj __UNUSED__);
39
40 void 
41 config_temperature_module(Config_Face *inst) 
42 {
43    E_Config_Dialog_View *v;
44    char buff[PATH_MAX];
45
46    v = E_NEW(E_Config_Dialog_View, 1);
47    v->create_cfdata = _create_data;
48    v->free_cfdata = _free_data;
49    v->basic.create_widgets = _basic_create;
50    v->basic.apply_cfdata = _basic_apply;
51
52    snprintf(buff, sizeof(buff), 
53             "%s/e-module-temperature.edj", inst->module->dir);
54    inst->config_dialog = 
55      e_config_dialog_new(e_container_current_get(e_manager_current_get()), 
56                          _("Temperature Settings"), "E", 
57                          "_e_mod_temperature_config_dialog", buff, 0, v, inst);
58 }
59
60 /* local function prototypes */
61 static void *
62 _create_data(E_Config_Dialog *cfd) 
63 {
64    E_Config_Dialog_Data *cfdata;
65
66    cfdata = E_NEW(E_Config_Dialog_Data, 1);
67    cfdata->inst = cfd->data;
68    _fill_data_tempget(cfdata);
69    return cfdata;
70 }
71
72 static void 
73 _fill_data_tempget(E_Config_Dialog_Data *cfdata) 
74 {
75    cfdata->unit_method = cfdata->inst->units;
76    cfdata->poll.interval = cfdata->inst->poll_interval;
77    cfdata->temp.low = cfdata->inst->low;
78    cfdata->temp.high = cfdata->inst->high;
79    cfdata->sensor = 0;
80 #ifdef HAVE_EEZE
81    cfdata->backend = cfdata->inst->backend;
82    if (cfdata->backend == TEMPGET)
83      {
84 #endif
85         switch (cfdata->inst->sensor_type) 
86           {
87            case SENSOR_TYPE_NONE:
88            case SENSOR_TYPE_FREEBSD:
89            case SENSOR_TYPE_OMNIBOOK:
90            case SENSOR_TYPE_LINUX_MACMINI:
91            case SENSOR_TYPE_LINUX_PBOOK:
92            case SENSOR_TYPE_LINUX_INTELCORETEMP:
93              break;
94            case SENSOR_TYPE_LINUX_I2C:
95              _fill_sensors(cfdata, "i2c");
96              break;
97            case SENSOR_TYPE_LINUX_PCI:
98              _fill_sensors(cfdata, "pci");
99              break;
100            case SENSOR_TYPE_LINUX_ACPI: 
101                {
102                   Eina_List *l;
103
104                   if ((l = ecore_file_ls("/proc/acpi/thermal_zone")))
105                     {
106                        char *name;
107                        int n = 0;
108
109                        EINA_LIST_FREE(l, name) 
110                          {
111                             cfdata->sensors = 
112                               eina_list_append(cfdata->sensors, name);
113                             if (!strcmp(cfdata->inst->sensor_name, name))
114                               cfdata->sensor = n;
115                             n++;
116                          }
117                     }
118                   break;
119                }
120            case SENSOR_TYPE_LINUX_SYS: 
121                {
122                   Eina_List *l;
123                   
124                   if ((l = ecore_file_ls("/sys/class/thermal")))
125                     {
126                        char *name;
127                        int n = 0;
128                        
129                        EINA_LIST_FREE(l, name) 
130                          {
131                             if (!strncmp(name, "thermal", 7))
132                               {
133                                  cfdata->sensors = 
134                                     eina_list_append(cfdata->sensors, name);
135                                  if (!strcmp(cfdata->inst->sensor_name, name))
136                                     cfdata->sensor = n;
137                                  n++;
138                               }
139                          }
140                     }
141                   break;
142                }
143            default:
144              break;
145           }
146 #ifdef HAVE_EEZE
147    }
148 #endif
149 }
150
151 static void 
152 _fill_sensors(E_Config_Dialog_Data *cfdata, const char *name) 
153 {
154    Eina_List *therms, *l;
155    char *n;
156
157    if (!name) return;
158    if ((therms = temperature_get_bus_files(name)))
159      {
160         char path[PATH_MAX];
161
162         EINA_LIST_FREE(therms, n) 
163           {
164              if (ecore_file_exists(n)) 
165                {
166                   int len;
167
168                   sprintf(path, "%s", ecore_file_file_get(n));
169                   len = strlen(path);
170                   if (len > 6) path[len - 6] = '\0';
171                   cfdata->sensors = 
172                     eina_list_append(cfdata->sensors, strdup(path));
173                }
174              free(n);
175           }
176      }
177    EINA_LIST_FOREACH(cfdata->sensors, l, n) 
178      {
179         if (!strcmp(cfdata->inst->sensor_name, n)) break;
180         cfdata->sensor++;
181      }
182 }
183
184 static void 
185 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
186 {
187    char *sensor;
188
189    cfdata->inst->config_dialog = NULL;
190    EINA_LIST_FREE(cfdata->sensors, sensor)
191      free(sensor);
192    E_FREE(cfdata);
193 }
194
195 static Evas_Object *
196 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata) 
197 {
198    Evas_Object *otb, *ol, *ow;
199    E_Radio_Group *rg;
200
201    otb = e_widget_toolbook_add(evas, 24, 24);
202
203    if (cfdata->sensors) 
204      {
205         Eina_List *l;
206         char *name;
207         int n = 0;
208
209         ol = e_widget_list_add(evas, 0, 0);
210         rg = e_widget_radio_group_new(&(cfdata->sensor));
211         EINA_LIST_FOREACH(cfdata->sensors, l, name) 
212           {
213              ow = e_widget_radio_add(evas, _(name), n, rg);
214              e_widget_list_object_append(ol, ow, 1, 0, 0.5);
215              n++;
216           }
217         e_widget_toolbook_page_append(otb, NULL, _("Sensors"), ol, 
218                                       1, 0, 1, 0, 0.5, 0.0);
219      }
220
221    ol = e_widget_list_add(evas, 0, 0);
222    rg = e_widget_radio_group_new(&(cfdata->unit_method));
223    ow = e_widget_radio_add(evas, _("Celsius"), CELCIUS, rg);
224    e_widget_on_change_hook_set(ow, _cb_display_changed, cfdata);
225    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
226    ow = e_widget_radio_add(evas, _("Fahrenheit"), FAHRENHEIT, rg);
227    e_widget_on_change_hook_set(ow, _cb_display_changed, cfdata);
228    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
229    e_widget_toolbook_page_append(otb, NULL, _("Display Units"), ol, 
230                                  0, 0, 0, 0, 0.5, 0.0);
231
232    ol = e_widget_list_add(evas, 0, 0);
233    ow = e_widget_slider_add(evas, 1, 0, _("%1.0f ticks"), 1, 1024, 4, 0, 
234                             NULL, &(cfdata->poll.interval), 150);
235    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
236    e_widget_toolbook_page_append(otb, NULL, _("Check Interval"), ol, 
237                                  1, 0, 1, 0, 0.5, 0.0);
238
239    ol = e_widget_list_add(evas, 0, 0);
240    ow = e_widget_label_add(evas, _("High Temperature"));
241    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
242    if (cfdata->unit_method == FAHRENHEIT)
243      cfdata->o_high = 
244      e_widget_slider_add(evas, 1, 0, _("%1.0f F"), 0, 230, 5, 0, 
245                          NULL, &(cfdata->temp.high), 150);
246    else
247      cfdata->o_high = 
248      e_widget_slider_add(evas, 1, 0, _("%1.0f C"), 0, 110, 5, 0, 
249                          NULL, &(cfdata->temp.high), 150);
250    e_widget_list_object_append(ol, cfdata->o_high, 1, 1, 0.5);
251
252    ow = e_widget_label_add(evas, _("Low Temperature"));
253    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
254    if (cfdata->unit_method == FAHRENHEIT)
255      cfdata->o_low = 
256      e_widget_slider_add(evas, 1, 0, _("%1.0f F"), 0, 200, 5, 0, 
257                          NULL, &(cfdata->temp.low), 150);
258    else
259      cfdata->o_low = 
260      e_widget_slider_add(evas, 1, 0, _("%1.0f C"), 0, 95, 5, 0, 
261                          NULL, &(cfdata->temp.low), 150);
262    e_widget_list_object_append(ol, cfdata->o_low, 1, 1, 0.5);
263
264    e_widget_toolbook_page_append(otb, NULL, _("Temperatures"), ol, 
265                                  1, 0, 1, 0, 0.5, 0.0);
266 #ifdef HAVE_EEZE
267    ol = e_widget_list_add(evas, 0, 0);
268    rg = e_widget_radio_group_new(&(cfdata->backend));
269    ow = e_widget_radio_add(evas, _("Internal"), TEMPGET, rg);
270    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
271    ow = e_widget_radio_add(evas, _("udev"), UDEV, rg);
272    e_widget_list_object_append(ol, ow, 1, 1, 0.5);
273    e_widget_toolbook_page_append(otb, NULL, _("Hardware"), ol, 
274                                  0, 0, 0, 0, 0.5, 0.0);
275 #endif
276    e_widget_toolbook_page_show(otb, 0);
277    return otb;
278 }
279
280 static int 
281 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
282 {
283    cfdata->inst->poll_interval = cfdata->poll.interval;
284    cfdata->inst->units = cfdata->unit_method;
285    cfdata->inst->low = cfdata->temp.low;
286    cfdata->inst->high = cfdata->temp.high;
287 #ifdef HAVE_EEZE
288    cfdata->inst->backend = cfdata->backend;
289 #endif
290
291    eina_stringshare_replace(&cfdata->inst->sensor_name, 
292                             eina_list_nth(cfdata->sensors, cfdata->sensor));
293
294    e_config_save_queue();
295    temperature_face_update_config(cfdata->inst);
296    return 1;
297 }
298
299 static void 
300 _cb_display_changed(void *data, Evas_Object *obj __UNUSED__) 
301 {
302    E_Config_Dialog_Data *cfdata;
303    int val;
304
305    if (!(cfdata = data)) return;
306    if (cfdata->unit_method == FAHRENHEIT)
307      {
308         e_widget_slider_value_range_set(cfdata->o_low, 0, 200);
309         e_widget_slider_value_range_set(cfdata->o_high, 0, 230);
310         e_widget_slider_value_int_get(cfdata->o_low, &val);
311         e_widget_slider_value_int_set(cfdata->o_low, CEL_2_FAR(val));
312         e_widget_slider_value_int_get(cfdata->o_high, &val);
313         e_widget_slider_value_int_set(cfdata->o_high, CEL_2_FAR(val));
314         e_widget_slider_value_format_display_set(cfdata->o_low, _("%1.0f F"));
315         e_widget_slider_value_format_display_set(cfdata->o_high, _("%1.0f F"));
316      }
317    else
318      {
319         e_widget_slider_value_range_set(cfdata->o_low, 0, 95);
320         e_widget_slider_value_range_set(cfdata->o_high, 0, 110);
321         e_widget_slider_value_int_get(cfdata->o_low, &val);
322         e_widget_slider_value_int_set(cfdata->o_low, FAR_2_CEL(val));
323         e_widget_slider_value_int_get(cfdata->o_high, &val);
324         e_widget_slider_value_int_set(cfdata->o_high, FAR_2_CEL(val));
325         e_widget_slider_value_format_display_set(cfdata->o_low, _("%1.0f C"));
326         e_widget_slider_value_format_display_set(cfdata->o_high, _("%1.0f C"));
327      }
328 }