Tizen 2.0 Release
[apps/home/settings.git] / setting-display / src / setting-display-brightness.c
1 /*
2  * setting
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Flora License, Version 1.0 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #include <setting-display-brightness.h>
19 #define DISABLE_LOW_BATERY_CHANGE 0 //disable user to set the brightness when the Mobile is low battery.
20
21 #define Left_Bright_Icon IMG_BRIGTHNESS_LEFT
22 #define Right_Bright_Icon IMG_BRIGHTNESS_RIGHT
23 #define SUPPORT_DISPLAY_HOMESCREEN_IMAGE 0
24
25 static int setting_display_brightness_create(void *cb);
26 static int setting_display_brightness_destroy(void *cb);
27 static int setting_display_brightness_update(void *cb);
28 static int setting_display_brightness_cleanup(void *cb);
29
30 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value);
31
32 setting_view setting_view_display_brightness = {
33         .create = setting_display_brightness_create,
34         .destroy = setting_display_brightness_destroy,
35         .update = setting_display_brightness_update,
36         .cleanup = setting_display_brightness_cleanup,
37 };
38
39 static void __toggle_automatic_chk(void* data, int chk_status);
40
41 /* ***************************************************
42  *
43  *basic func
44  *
45  ***************************************************/
46 #define LOW_BATTERY_NOTIFY "Battery is too low, you cannot change brightness"
47 #define NORMAL_BATTERY_NOTIFY "Battery becomes normal, now you can change brightness.."
48
49 #if DISABLE_LOW_BATERY_CHANGE
50 static void
51 __low_battery_on_resp_cb(void *data, Evas_Object *obj, void *event_info)
52 {
53         SETTING_TRACE_BEGIN;
54         setting_retm_if(NULL == data, "NULL == data");
55         SettingDisplayUG *ad = (SettingDisplayUG *) data;
56         evas_object_del(ad->popup);
57         ad->popup = NULL;
58 }
59
60 static Eina_Bool __disable_on_idle(void *data)
61 {
62         SETTING_TRACE_BEGIN;
63         SettingDisplayUG *ad = (SettingDisplayUG *) data;
64
65         if (ad->popup)
66         {
67                 evas_object_del(ad->popup);
68                 ad->popup = NULL;
69         }
70         ad->popup = setting_create_popup_without_btn(ad, ad->win_get, NULL, _(LOW_BATTERY_NOTIFY),
71                                         __low_battery_on_resp_cb, POPUP_INTERVAL, FALSE, FALSE);
72         if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
73         if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
74         return FALSE;
75 }
76
77 // low battery
78 static void setting_display_brightness_lowbat_cb(keynode_t *key, void* data)
79 {
80 //      SETTING_TRACE_BEGIN;
81         ret_if(data == NULL);
82         SettingDisplayUG *ad = (SettingDisplayUG *) data;
83         SETTING_TRACE_BEGIN;
84
85         char* vconf_key = vconf_keynode_get_name(key);
86         SETTING_TRACE("the value of [ %s ] just changed", vconf_key);
87         ad->low_bat = vconf_keynode_get_int(key);
88         if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
89         {
90                 SETTING_TRACE("Battery becomes ctitical low !");
91                 //popup was showed by system FW
92                 // disabled
93                 if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
94                 if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
95         } else {
96                 SETTING_TRACE("Battery becomes normal!");
97                 if (ad->data_br_sli) {
98                         int automatic_val, err;
99                         setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &automatic_val, &err);
100                         if (ad->data_br_auto) setting_enable_genlist_item(ad->data_br_auto->item);
101                         if (automatic_val == SETTING_BRIGHTNESS_AUTOMATIC_OFF) // not automatic
102                         {
103                                 if (ad->data_br_sli) setting_enable_genlist_item(ad->data_br_sli->item);
104                         }
105                 }
106         }
107 }
108 #endif
109
110 static void __display_int_vconf_cb(keynode_t *key, void *data)
111 {
112         SettingDisplayUG *ad = data;
113         retm_if(!data, "Invalid argument: data is NULL");
114
115         int status = vconf_keynode_get_int(key);
116         char *vconf_name = vconf_keynode_get_name(key);
117         SETTING_TRACE("Enter %s(%s=%d)", __FUNCTION__, vconf_name, status);
118
119         if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_LCD_BRIGHTNESS)) {
120                 if (ad->data_br_sli)
121                 {
122                         elm_slider_value_set(ad->data_br_sli->eo_check, status);
123                 }
124         }
125         else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT)) {
126                 if (status)
127                 {
128                         if (ad->data_br_auto)
129                                 elm_check_state_set(ad->data_br_auto->eo_check, 1);
130
131                         if (ad->data_br_sli)
132                                 setting_disable_genlist_item(ad->data_br_sli->item);
133                 }
134                 else
135                 {
136                         if (ad->data_br_auto)
137                                 elm_check_state_set(ad->data_br_auto->eo_check, 0);
138
139                         if (ad->data_br_sli)
140                                 setting_enable_genlist_item(ad->data_br_sli->item);
141                 }
142         }
143         return;
144 }
145
146 static int setting_display_brightness_create(void *cb)
147 {
148         SETTING_TRACE_BEGIN;
149         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
150
151         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
152
153         Evas_Object *genlist = elm_genlist_add(ad->win_main_layout);
154         elm_object_style_set(genlist, "dialogue");
155         retvm_if(genlist == NULL, SETTING_RETURN_FAIL, "Cannot set scroller object as contento of layout");
156         elm_genlist_clear(genlist);     /* first to clear list */
157
158         /* add basic layout */
159         if (&setting_view_display_brightness == ad->view_to_load) {
160                 ad->ly_main =
161                     setting_create_layout_navi_bar(ad->win_main_layout,
162                                                    ad->win_get,
163                                                    _(KeyStr_Brightness),
164                                                    _("IDS_COM_BODY_BACK"),
165                                                    NULL, NULL,
166                                                    setting_display_brightness_click_softkey_cancel_cb,
167                                                    NULL, NULL, ad,
168                                                    genlist,
169                                                    &ad->navi_bar, NULL);
170         } else {
171                 setting_push_layout_navi_bar(_(KeyStr_Brightness),
172                                              _("IDS_COM_BODY_BACK"), NULL, NULL,
173                                              setting_display_brightness_click_softkey_cancel_cb,
174                                              NULL,
175                                              NULL, ad, genlist, ad->navi_bar, NULL);;
176         }
177
178
179         Elm_Object_Item *item = elm_genlist_item_append(genlist, &(ad->itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
180         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
181
182         // [control] AUTOMATIC - boolean - vconf
183         int auto_value = SETTING_BRIGHTNESS_AUTOMATIC_ON;
184         int err;
185         int ret = setting_get_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, &auto_value, &err);//if get failed,to hold value SETTING_BRIGHTNESS_AUTOMATIC_ON
186         SETTING_TRACE("auto_value:%d", auto_value);
187         if (0 != ret) //add error handle,due to different target env..
188                 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT);
189
190         // [UI] AUTOMATIC - boolean
191         ad->data_br_auto =
192             setting_create_Gendial_field_def(genlist, &(ad->itc_1text_1icon),
193                                              setting_display_brightness_mouse_up_Gendial_list_cb,
194                                              ad, SWALLOW_Type_1TOGGLE, NULL,
195                                              NULL, auto_value,
196                                              "IDS_COM_BODY_AUTOMATIC", NULL,
197                                              setting_display_brightness_chk_btn_cb);
198         if (ad->data_br_auto) {
199                 ad->data_br_auto->userdata = ad;
200         } else {
201                 SETTING_TRACE_ERROR("ad->data_br_auto is NULL");
202         }
203
204
205         /* check manual */
206         int value = SETTING_BRIGHTNESS_LEVEL5;
207         ret = setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &value, &err);
208         SETTING_TRACE("******* value = %d ", value);
209         if (0 != ret) //add error handle,due to different target env..
210                 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SETAPPL_LCD_BRIGHTNESS);
211
212         // [UI] Slider control for Bightness
213         ad->data_br_sli =
214             setting_create_Gendial_field_def(genlist, &(itc_1icon), NULL,
215                                              NULL, SWALLOW_Type_LAYOUT_SLIDER,
216                                              Left_Bright_Icon,
217                                              Right_Bright_Icon, value, NULL,
218                                              NULL,
219                                              setting_display_birghtness_bright_slider_value_change_cb);
220
221         if (ad->data_br_sli) {
222                 ad->data_br_sli->win_main = ad->win_main_layout;
223                 ad->data_br_sli->evas = ad->evas;
224                 ad->data_br_sli->isIndicatorVisible = false;
225                 ad->data_br_sli->slider_min = 1;
226
227                 ad->data_br_sli->slider_max = 100;
228                 ad->data_br_sli->userdata = ad;
229
230                 if (auto_value) {
231                         setting_disable_genlist_item(ad->data_br_sli->item);
232                 }
233
234         } else {
235                 SETTING_TRACE_ERROR("ad->data_br_sli is NULL");
236         }
237         #if DISABLE_LOW_BATERY_CHANGE
238         ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
239         vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
240         if (0 != ret) //add error handle,due to different target env..
241                 SETTING_TRACE_ERROR("Failed to get value of [%s]", VCONFKEY_SYSMAN_BATTERY_STATUS_LOW);
242
243         if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW) {
244                 SETTING_TRACE("battery is ctitical low");
245                 //have time delay to show all the item out,so user idler to disable
246                 //if (ad->data_br_sli) setting_disable_genlist_item(ad->data_br_sli->item);
247                 //if (ad->data_br_auto) setting_disable_genlist_item(ad->data_br_auto->item);
248                 ecore_idler_add(__disable_on_idle, ad);
249         }
250
251         // low battery handler - registration
252         vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb, ad);
253         #endif
254
255         vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb, ad);
256         vconf_notify_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb, ad);
257         setting_view_display_brightness.is_create = 1;
258         return SETTING_RETURN_SUCCESS;
259 }
260
261 static int setting_display_brightness_destroy(void *cb)
262 {
263         SETTING_TRACE_BEGIN;
264
265         /* error check */
266         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
267 #if DISABLE_LOW_BATERY_CHANGE
268         /* low battery handler - registration */
269         vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, setting_display_brightness_lowbat_cb);
270 #endif
271         vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __display_int_vconf_cb);
272         vconf_ignore_key_changed(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, __display_int_vconf_cb);
273
274         SettingDisplayUG *ad = (SettingDisplayUG *) cb;
275         elm_naviframe_item_pop(ad->navi_bar);
276         if (ad->popup)
277         {
278                 evas_object_del(ad->popup);
279                 ad->popup = NULL;
280         }
281
282         setting_view_display_brightness.is_create = 0;
283         return SETTING_RETURN_SUCCESS;
284 }
285
286 static int setting_display_brightness_update(void *cb)
287 {
288         SETTING_TRACE_BEGIN;
289         return SETTING_RETURN_SUCCESS;
290
291 }
292
293 static int setting_display_brightness_cleanup(void *cb)
294 {
295         SETTING_TRACE_BEGIN;
296         /* error check */
297         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
298         setting_display_brightness_destroy(cb);
299
300         return SETTING_RETURN_SUCCESS;
301 }
302
303 /* ***************************************************
304  *
305  *general func
306  *
307  ***************************************************/
308
309 /* ***************************************************
310  *
311  *call back func
312  *
313  ***************************************************/
314
315 static void
316 setting_display_brightness_click_softkey_cancel_cb(void *data,
317                                                    Evas_Object *obj,
318                                                    void *event_info)
319 {
320         SETTING_TRACE_BEGIN;
321         /* error check */
322         retm_if(data == NULL, "Data parameter is NULL");
323         SettingDisplayUG *ad = (SettingDisplayUG *) data;
324         if (&setting_view_display_brightness == ad->view_to_load) {
325                 /* Send destroy request */
326                 ug_destroy_me(ad->ug);
327                 return;
328         }
329
330         setting_view_change(&setting_view_display_brightness,
331                             &setting_view_display_main, ad);
332 }
333
334 /**
335  * toggle handler for 'Automatic'
336  */
337 static void __toggle_automatic_chk(void* data, int chk_status)
338 {
339         int err;
340         SettingDisplayUG *ad = (SettingDisplayUG *) data;
341         int ret = setting_set_int_slp_key(INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, chk_status, &err);
342         if (0 != ret) //add error handle,due to different target env..
343         {
344                 SETTING_TRACE("Operation failed");
345                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
346                                         NULL, POPUP_INTERVAL, FALSE, FALSE);
347                 return;
348         }
349         if (chk_status) {
350                 // TOGGLE ON
351                 setting_disable_genlist_item(ad->data_br_sli->item);
352
353         } else {
354                 // TOGGLE OFF
355                 #if DISABLE_LOW_BATERY_CHANGE
356                 //to get value every time
357                 ad->low_bat = VCONFKEY_SYSMAN_BAT_NORMAL;
358
359                 // in case of LOW BATTERY
360                 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &ad->low_bat);
361                 if (0 != ret) //add error handle,due to different target env..
362                 {
363                         SETTING_TRACE("Operation failed");
364                         setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
365                                                 NULL, POPUP_INTERVAL, FALSE, FALSE);
366                         return;
367                 }
368
369                 // in case of CRITICAL LOW BATTERY
370                 if (ad->low_bat <= VCONFKEY_SYSMAN_BAT_CRITICAL_LOW)
371                 {
372                         setting_disable_genlist_item(ad->data_br_sli->item);
373                         setting_disable_genlist_item(ad->data_br_auto->item);
374                 }
375                 else
376                 {       // in case of NORMAL OP
377                         // 1. set vconf
378                         // 2. call brightness set API
379                         int value = SETTING_BRIGHTNESS_LEVEL5;
380                         //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
381                         if (ad->data_br_sli) {
382                                 value = elm_slider_value_get(ad->data_br_sli->eo_check);
383                                 SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
384                                 setting_enable_genlist_item(ad->data_br_sli->item);
385                         }
386
387                         ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
388                         if (0 != ret) //add error handle,due to different target env..
389                         {
390                                 SETTING_TRACE("Operation failed");
391                                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
392                                                         NULL, POPUP_INTERVAL, FALSE, FALSE);
393                                 return;
394                         }
395
396                         /*  call brightness API */
397                         ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
398                         /* TODO error handling here */
399                 }
400                 #else
401                 int value = SETTING_BRIGHTNESS_LEVEL5;
402                 //device_get_brightness(BRIGHTNESS_DISPLAY, &value);
403                 if (ad->data_br_sli) {
404                         value = elm_slider_value_get(ad->data_br_sli->eo_check);
405                         SETTING_TRACE(" value of ad->data_br_sli->eo_check: %d ", value);
406                         setting_enable_genlist_item(ad->data_br_sli->item);
407                 }
408                 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
409                 if (0 != ret) //add error handle,due to different target env..
410                 {
411                         SETTING_TRACE("Operation failed");
412                         setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
413                                                 NULL, POPUP_INTERVAL, FALSE, FALSE);
414                         return;
415                 }
416                 #endif
417         }
418 }
419
420 static void
421 setting_display_brightness_chk_btn_cb(void *data, Evas_Object *obj,
422                                       void *event_info)
423 {
424         SETTING_TRACE_BEGIN;
425         /* error check */
426         retm_if(data == NULL, "Data parameter is NULL");
427         Setting_GenGroupItem_Data *list_item =
428             (Setting_GenGroupItem_Data *) data;
429         SettingDisplayUG *ad = list_item->userdata;
430         list_item->chk_status = elm_check_state_get(obj);       /*  for genlist update status */
431
432         // enable /disable toggle button
433         __toggle_automatic_chk(ad, list_item->chk_status);
434         return;
435 }
436
437 /**
438  * [UI] 'Automatic' toggle
439  */
440 static void setting_display_brightness_mouse_up_Gendial_list_cb(void *data,
441                                                                 Evas_Object * obj,
442                                                                 void *event_info)
443 {
444         /* error check */
445         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
446         retm_if(data == NULL, "Invalid argument: data is NULL");
447         SettingDisplayUG *ad = data;
448
449         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
450         elm_genlist_item_selected_set(item, 0);
451         Setting_GenGroupItem_Data *list_item =
452             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
453
454         int old_status = elm_check_state_get(list_item->eo_check);
455         /* new status */
456         list_item->chk_status = !old_status;
457         elm_check_state_set(list_item->eo_check, list_item->chk_status);
458
459         // enable /disable toggle button
460         __toggle_automatic_chk(ad,list_item->chk_status);
461 }
462
463 static void setting_display_set_slider_value(void* data, Evas_Object *obj, double value)
464
465 {
466         SETTING_TRACE_BEGIN;
467         retm_if(data == NULL, "Invalid argument: data is NULL");
468
469         SettingDisplayUG *ad = data;
470         int ret, err;
471         ret = device_set_brightness_to_settings(BRIGHTNESS_DISPLAY, value);
472         if (ret == DEVICE_ERROR_NONE) {
473                 ad->data_br_sli->chk_status = value;
474                 ret = setting_set_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, value, &err);
475                 //add error handle..
476                 if (0 != ret) setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
477                                                 NULL, POPUP_INTERVAL, FALSE, FALSE);
478         } else {
479                 SETTING_TRACE("device_set_brightness_to_settings : failed[ret=%d]", ret);
480                 //rollback..
481                 int tmp = SETTING_BRIGHTNESS_LEVEL5;
482                 setting_get_int_slp_key(INT_SLP_SETTING_LCD_BRIGHTNESS, &tmp, &err);
483                 elm_slider_value_set(obj, tmp);
484                 setting_create_popup_without_btn(ad, ad->win_get, NULL, _("IDS_COM_POP_FAILED"),
485                                                                 NULL, POPUP_INTERVAL, FALSE, FALSE);
486         }
487 }
488
489 static Eina_Bool __set_brightness_on_idle(void *data)
490 {
491         SETTING_TRACE_BEGIN;
492         SettingDisplayUG *ad = (SettingDisplayUG *) data;
493         if (!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check)
494         {
495                 SETTING_TRACE_ERROR("!ad || !ad->data_br_sli || !ad->data_br_sli->eo_check");
496                 if (ad) 
497                         ad->set_idler = NULL;
498                 return FALSE;
499         }
500         //Get the current real value of slider
501         Evas_Object *obj = ad->data_br_sli->eo_check;
502         double val = elm_slider_value_get(obj);
503         int value = (int)(val + 0.5);
504         SETTING_TRACE("val:%f", val);
505         SETTING_TRACE("value:%d", value);
506         setting_display_set_slider_value(ad, obj, value);
507         //After return False, the idler will be deleted directly,so here set ad->set_idler as NULL directly.
508         ad->set_idler = NULL;
509         return FALSE;
510 }
511
512 static void
513 setting_display_birghtness_bright_slider_value_change_cb(void *data,
514                                                          Evas_Object *obj,
515                                                          void *event_info)
516 {
517         SETTING_TRACE_BEGIN;
518         retm_if(data == NULL, "Data parameter is NULL");
519         int value = 0;
520         static int old_val = -1;
521         SettingDisplayUG *ad = NULL;
522         Setting_GenGroupItem_Data *list_item =
523             (Setting_GenGroupItem_Data *) data;
524         ad = list_item->userdata;
525
526         value = elm_check_state_get(ad->data_br_auto->eo_check);
527         if (value == 1) {       /* it is automatic setting mode, */
528                 /* do nothing */
529                 return;
530         }
531
532         double val = elm_slider_value_get(obj);
533         SETTING_TRACE("val:%f", val);
534         value = (int)(val + 0.5);
535         /* SETTING_TRACE("val:%f", val); */
536         SETTING_TRACE("value:%d", value);
537         if (value != old_val)
538         {
539                 //setting_display_set_slider_value(ad, obj, value);
540                 if(isEmulBin())
541                 {
542                         SETTING_TRACE("It is in Emulator, need special process to improve the performence");
543                         if (ad->set_idler) {
544                                 ecore_idler_del(ad->set_idler);
545                                 ad->set_idler = NULL;
546                         }
547                         ad->set_idler = ecore_idler_add((Ecore_Task_Cb) __set_brightness_on_idle, ad);
548                 }
549                 else
550                 {
551                         SETTING_TRACE("It is in Real Target, Set the brightness directly.");
552                         setting_display_set_slider_value(ad, obj, value);
553                 }
554                 old_val = value;
555         }
556 }
557
558