2 * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <Elementary.h>
20 #include <app_debug.h>
25 #define VOLUME_WIN_ROLE "tv-volume-popup"
26 #define VOLUME_WIN_WIDTH 120
27 #define VOLUME_WIN_HEIGHT 530
28 #define STYLE_VOLUME_PROGRESSBAR "volume_progressbar"
37 Evas_Object *progress;
39 Ecore_Event_Handler *key_down;
40 Ecore_Timer *hide_timer;
44 static Eina_Bool _hide_timer(void *data);
46 Evas_Object *_add_win(const char *name)
50 win = elm_win_add(NULL, name, ELM_WIN_BASIC);
52 _ERR("failed to create win");
56 elm_win_title_set(win, name);
57 elm_win_role_set(win, VOLUME_WIN_ROLE);
58 elm_win_alpha_set(win, EINA_TRUE);
59 elm_win_prop_focus_skip_set(win, EINA_TRUE);
60 evas_object_resize(win, VOLUME_WIN_WIDTH, VOLUME_WIN_HEIGHT);
61 evas_object_show(win);
66 Evas_Object *_add_progressbar(Evas_Object *base)
71 _ERR("failed to get base object");
75 bar = elm_progressbar_add(base);
77 _ERR("failed to create progressbar");
81 evas_object_size_hint_weight_set(bar, EVAS_HINT_EXPAND,
83 elm_progressbar_horizontal_set(bar, EINA_FALSE);
84 elm_progressbar_inverted_set(bar, EINA_TRUE);
85 elm_object_style_set(bar, STYLE_VOLUME_PROGRESSBAR);
86 elm_object_part_content_set(base, PART_VOLUME_PROGRESSBAR, bar);
88 evas_object_show(bar);
93 void _update_volume_bar(struct _appdata *ad, int vol)
98 _ERR("failed to get ad");
102 value = (double)vol / VOLUME_MAX;
103 elm_progressbar_value_set(ad->progress, value);
106 void _show(struct _appdata *ad)
109 _ERR("failed to get ad");
114 ecore_timer_reset(ad->hide_timer);
116 ad->hide_timer = ecore_timer_add(HIDE_DUR, _hide_timer, ad);
118 evas_object_show(ad->base);
120 ad->visibility = EINA_TRUE;
123 void _update_volume_info(struct _appdata *ad)
129 _ERR("failed to get ad");
136 vol = volume_get_volume();
137 if (vol < VOLUME_MIN || vol > VOLUME_MAX) {
138 _ERR("failed to get volume info");
142 if (vol == 0 || volume_is_mute()) {
143 _update_volume_bar(ad, MUTE_VALUE);
144 snprintf(buf, sizeof(buf), "%d", MUTE_VALUE);
145 elm_object_part_text_set(ad->base, PART_VOLUME_TEXT, buf);
146 elm_object_signal_emit(ad->base,
147 SIGNAL_SHOW_MUTE, SOURCE_PROGRAM);
149 _update_volume_bar(ad, vol);
150 snprintf(buf, sizeof(buf), "%d", vol);
151 elm_object_part_text_set(ad->base, PART_VOLUME_TEXT, buf);
152 elm_object_signal_emit(ad->base,
153 SIGNAL_HIDE_MUTE, SOURCE_PROGRAM);
157 void _hide(struct _appdata *ad)
160 _ERR("failed to get ad");
164 if (ad->hide_timer) {
165 ecore_timer_del(ad->hide_timer);
166 ad->hide_timer = NULL;
169 evas_object_hide(ad->base);
171 ad->visibility = EINA_FALSE;
174 Eina_Bool _hide_timer(void *data)
179 return ECORE_CALLBACK_CANCEL;
183 ad->hide_timer = NULL;
185 if (!volume_is_mute())
188 return ECORE_CALLBACK_CANCEL;
191 static Eina_Bool _key_down(void *data, int type, void *ei)
194 Evas_Event_Key_Down *ev;
198 _ERR("failed to get data and ei");
199 return ECORE_CALLBACK_PASS_ON;
206 ecore_timer_reset(ad->hide_timer);
208 ad->hide_timer = ecore_timer_add(HIDE_DUR, _hide_timer, ad);
210 if (!strcmp(ev->keyname, KEY_VOLUMEUP)) {
211 vol = volume_get_volume() + 1;
213 r = volume_set_volume(vol);
215 _ERR("failed to set volume");
217 volume_set_mute(false);
219 _update_volume_info(ad);
220 } else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) {
221 vol = volume_get_volume() - 1;
223 r = volume_set_volume(vol);
225 _ERR("failed to set volume");
227 volume_set_mute(false);
229 _update_volume_info(ad);
230 } else if (!strcmp(ev->keyname, KEY_MUTE)) {
231 bool mute = !volume_is_mute();
233 volume_set_mute(mute);
235 _update_volume_info(ad);
238 return ECORE_CALLBACK_PASS_ON;
241 Eina_Bool _register_keygrab(void *data)
246 _ERR("failed to get data");
252 elm_win_keygrab_set(ad->win, KEY_VOLUMEUP,
253 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
254 elm_win_keygrab_set(ad->win, KEY_VOLUMEDOWN,
255 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
256 elm_win_keygrab_set(ad->win, KEY_MUTE,
257 0, 0, 0, ELM_WIN_KEYGRAB_SHARED);
259 return ECORE_CALLBACK_CANCEL;
262 static bool _create(void *data)
267 Evas_Object *progress;
270 _ERR("failed to get data");
278 elm_theme_overlay_add(NULL, THEMEFILE);
280 win = _add_win(ad->name);
282 _ERR("failed to create win object");
286 base = elm_layout_add(win);
288 _ERR("failed to create layout");
289 evas_object_del(win);
293 elm_layout_file_set(base, EDJEFILE, GRP_VOLUME);
294 evas_object_size_hint_weight_set(base,
295 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
296 elm_win_resize_object_add(win, base);
298 progress = _add_progressbar(base);
302 ad->progress = progress;
304 ecore_timer_add(1, _register_keygrab, ad);
305 ad->key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
311 static void _terminate(void *data)
320 elm_win_keygrab_unset(ad->win, KEY_VOLUMEUP, 0, 0);
321 elm_win_keygrab_unset(ad->win, KEY_VOLUMEDOWN, 0, 0);
322 elm_win_keygrab_unset(ad->win, KEY_MUTE, 0, 0);
324 ecore_event_handler_del(ad->key_down);
327 ecore_timer_del(ad->hide_timer);
330 evas_object_del(ad->win);
333 static void _pause(void *data)
337 static void _resume(void *data)
341 static void _control(app_control_h control, void *data)
345 int main(int argc, char **argv)
348 ui_app_lifecycle_callback_s cbs = {
350 .terminate = _terminate,
353 .app_control = _control,
356 memset(&ad, 0x00, sizeof(ad));
359 return ui_app_main(argc, argv, &cbs, &ad);