2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 * @brief statusbar application
19 #include <libwebsockets.h>
22 #include <Ecore_Wayland.h>
23 #include <Ecore_Evas.h>
26 #include "ico_uxf_conf.h"
27 #include "ico_uxf_conf_ecore.h"
29 #include "home_screen.h"
30 #include "home_screen_res.h"
31 #include "home_screen_conf.h"
33 /*============================================================================*/
34 /* Define data types */
35 /*============================================================================*/
36 #define ICO_SB_TIME_AM (10) /* f_name in sb_time_data */
37 #define ICO_SB_TIME_PM (11) /* f_name in sb_time_data */
38 #define ICO_SB_TIME_IMG_PARTS (12) /* total counts of sb_time_data */
39 #define ICO_SB_TIMEOUT (0.2)
41 #define ICO_SB_WS_TIMEOUT (0.05)
42 #define ICO_SB_WS_ADDRESS "127.0.0.1"
43 #define ICO_SB_WS_PROTOCOL_NAME ICO_HS_PROTOCOL_SB
44 #define ICO_SB_BUF_SIZE (1024)
45 #define ICO_SB_VERTICAL (1)
46 #define ICO_SB_HORIZONTAL (2)
48 #define ICO_SB_POS_Y (0)
49 #define ICO_SB_POS_COLON_X (689)
50 #define ICO_SB_POS_COLON_Y (30)
51 #define ICO_SB_POS_AMPM_X (582)
52 #define ICO_SB_POS_AMPM_Y (27)
53 #define ICO_SB_POS_HOUR1_X (640)
54 #define ICO_SB_POS_HOUR1_Y (18)
55 #define ICO_SB_POS_HOUR2_X (662)
56 #define ICO_SB_POS_HOUR2_Y (18)
57 #define ICO_SB_POS_MIN1_X (703)
58 #define ICO_SB_POS_MIN1_Y (18)
59 #define ICO_SB_POS_MIN2_X (725)
60 #define ICO_SB_POS_MIN2_Y (18)
62 #define ICO_SB_SIZE_SHTCT_W (ICO_HS_SIZE_SB_HEIGHT)
64 #define ICO_SB_POS_LIST_X (ICO_HS_SIZE_SB_HEIGHT * 5)
65 #define ICO_SB_POS_SHTCT1_X (ICO_SB_POS_LIST_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 2 / 2)
66 #define ICO_SB_POS_SHTCT2_X (ICO_SB_POS_SHTCT1_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 1 / 2)
68 #define ICO_SB_SIZE_COLON_W (6)
69 #define ICO_SB_SIZE_COLON_H (17)
70 #define ICO_SB_SIZE_NUM_W (20)
71 #define ICO_SB_SIZE_NUM_H (30)
72 #define ICO_SB_SIZE_AMPM_W (47)
73 #define ICO_SB_SIZE_AMPM_H (27)
75 #define ICO_SB_CHTCT_MAX (5)
77 #define ICO_SB_NO_WAIT (1)
78 #define ICO_SB_WAIT_REPLY (2)
80 #define ICO_SB_APPLIST_OFFICON "applist_off.png"
81 #define ICO_SB_APPLIST_ONICON "applist_on.png"
82 #define ICO_SB_HOME_OFFICON "home_off.png"
83 #define ICO_SB_HOME_ONICON "home_on.png"
85 /*============================================================================*/
86 /* static(internal) functions prototype */
87 /*============================================================================*/
88 static void sb_on_destroy(Ecore_Evas *ee);
89 static int sb_callback_http(struct libwebsocket_context *context,
90 struct libwebsocket *wsi,
91 enum libwebsocket_callback_reasons reason, void *user, void *in,
93 static int sb_callback_statusbar(struct libwebsocket_context *context,
94 struct libwebsocket *wsi,
95 enum libwebsocket_callback_reasons reason, void *user,
96 void *in, size_t len);
97 static void sb_create_ws_context(void);
98 static void sb_time_hour(struct tm *t_st);
99 static void sb_time_min(struct tm *t_st);
100 static Eina_Bool sb_time_show(void* thread_data);
101 static void sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info);
102 static void sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info);
103 static void sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info);
104 static void sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info);
105 static void sb_clock_display_fixation(Evas *canvas);
106 static void sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info);
107 static void sb_config_event(const char *appid, int type);
108 static void sb_add_shortcut(Evas *canvas);
110 /*============================================================================*/
111 /* variabe & table */
112 /*============================================================================*/
113 static Evas *sb_canvas;
114 static Eina_List *sb_shtct_list = NULL;
115 static int sb_wait_reply = ICO_SB_NO_WAIT;
116 static int sb_ws_port = ICO_HS_WS_PORT;
117 static int sb_ws_connected = 0;
118 static struct libwebsocket_context *sb_ws_context;
119 static struct libwebsocket *sb_wsi_mirror;
121 static int sb_width = 0;
122 static char sb_respath[ICO_SB_BUF_SIZE];
123 static struct tm sb_st_buf;
124 static Evas_Object *sb_ampm;
125 static Evas_Object *sb_hour1;
126 static Evas_Object *sb_hour2;
127 static Evas_Object *sb_min1;
128 static Evas_Object *sb_min2;
130 struct _sb_time_data {
132 Evas_Object *time_img;
135 struct _sb_time_data sb_time_data[ICO_SB_TIME_IMG_PARTS] = {
136 {fname_num0, }, {fname_num1, },
137 {fname_num2, }, {fname_num3, },
138 {fname_num4, }, {fname_num5, },
139 {fname_num6, }, {fname_num7, },
140 {fname_num8, }, {fname_num9, },
141 {fname_am, }, {fname_pm, }
144 static struct libwebsocket_protocols ws_protocols[] = {
151 "statusbar-protocol",
152 sb_callback_statusbar,
163 /*============================================================================*/
165 /*============================================================================*/
166 /*--------------------------------------------------------------------------*/
168 * @brief sb_on_destroy
169 * callback function called by EFL when ecore destroyed.
170 * exit ecore main loop.
172 * @param[in] ee ecore evas object
175 /*--------------------------------------------------------------------------*/
177 sb_on_destroy(Ecore_Evas *ee)
179 /* Quits the main loop */
180 ecore_main_loop_quit();
183 /*--------------------------------------------------------------------------*/
185 * @brief sb_callback_http
186 * Connection status is notified from libwebsockets.
188 * @param[in] context libwebsockets context
189 * @param[in] wsi libwebsockets management table
190 * @param[in] reason event type
191 * @param[in] user intact
192 * @param[in] in receive message
193 * @param[in] len message size[BYTE]
198 /*--------------------------------------------------------------------------*/
200 sb_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi,
201 enum libwebsocket_callback_reasons reason, void *user, void *in,
204 uifw_trace("sb_callback_http %p", context);
205 uifw_trace("SB-REASON %d", reason);
209 /*--------------------------------------------------------------------------*/
211 * @brief sb_callback_statusbar
212 * this callback function is notified from libwebsockets
215 * @param[in] context libwebsockets context
216 * @param[in] wsi libwebsockets management table
217 * @param[in] reason event type
218 * @param[in] user intact
219 * @param[in] in receive message
220 * @param[in] len message size[BYTE]
225 /*--------------------------------------------------------------------------*/
227 sb_callback_statusbar(struct libwebsocket_context *context,
228 struct libwebsocket *wsi,
229 enum libwebsocket_callback_reasons reason, void *user,
230 void *in, size_t len)
233 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
234 + LWS_SEND_BUFFER_POST_PADDING];
235 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
237 uifw_trace("sb_callback_statusbar %p", context);
240 case LWS_CALLBACK_CLIENT_ESTABLISHED:
241 uifw_trace("SB-ESTABLISHED %x", wsi);
243 n = sprintf((char *)p, "%s", "ANS HELLO");
245 case LWS_CALLBACK_CLIENT_RECEIVE:
246 uifw_trace("SB-RECEIVE[%d] %s", len, in);
248 if (strncmp("RECEIVE OK", in, 10) == 0) {
249 sb_wait_reply = ICO_SB_NO_WAIT;
252 n = sprintf((char *)p, "ANS %s OK", (char *)in);
255 case LWS_CALLBACK_CLOSED:
256 uifw_trace("SB-CLOSE");
257 sb_wsi_mirror = NULL;
260 uifw_trace("SB-REASON %d", reason);
265 n = libwebsocket_write(wsi, p, n, LWS_WRITE_TEXT);
271 /*--------------------------------------------------------------------------*/
273 * @brief sb_create_ws_context
274 * connect to the homescreen using websocket.
279 /*--------------------------------------------------------------------------*/
281 sb_create_ws_context(void)
284 = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL,
286 libwebsocket_internal_extensions,
287 NULL, NULL, -1, -1, 0);
288 uifw_trace("sb_create_ws_context ctx = %p", sb_ws_context);
291 if (sb_ws_context == NULL) {
292 uifw_trace("libwebsocket_create_context failed.");
296 = libwebsocket_client_connect(sb_ws_context, ICO_SB_WS_ADDRESS,
298 ICO_SB_WS_ADDRESS, NULL,
299 ICO_SB_WS_PROTOCOL_NAME, -1);
300 uifw_trace("sb_create_ws_context wsi = %p", sb_wsi_mirror);
301 if (sb_wsi_mirror != NULL) {
307 /*--------------------------------------------------------------------------*/
309 * @brief sb_ecore_event
310 * timer handler called by Ecore.
312 * @param[in] data user data
313 * @return call back setting
314 * @retval ECORE_CALLBACK_RENEW set callback
316 /*--------------------------------------------------------------------------*/
318 sb_ecore_event(void *data)
320 if (sb_ws_connected) {
321 libwebsocket_service(sb_ws_context, 0);
324 if (sb_ws_context != NULL) {
325 libwebsocket_context_destroy(sb_ws_context);
328 = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL,
330 libwebsocket_internal_extensions,
331 NULL, NULL, -1, -1, 0);
332 if (sb_ws_context == NULL) {
333 uifw_trace("libwebsocket_create_context failed.");
337 = libwebsocket_client_connect(sb_ws_context,
340 ICO_SB_WS_ADDRESS, NULL,
341 ICO_SB_WS_PROTOCOL_NAME, -1);
342 if (sb_wsi_mirror != NULL) {
347 return ECORE_CALLBACK_RENEW;
350 /*--------------------------------------------------------------------------*/
352 * @brief sb_time_hour
353 * show the clock's hour image on statubar
355 * @param[in] tm time data
358 /*--------------------------------------------------------------------------*/
360 sb_time_hour(struct tm *t_st)
362 char file[ICO_SB_BUF_SIZE];
363 if (t_st->tm_hour < 12) {
364 sprintf(file, "%s%s", sb_respath, sb_time_data[ICO_SB_TIME_AM].f_name);
365 evas_object_image_file_set(sb_ampm, file, NULL);
366 sprintf(file, "%s%s", sb_respath,
367 sb_time_data[t_st->tm_hour / 10].f_name);
368 evas_object_image_file_set(sb_hour1, file, NULL);
369 sprintf(file, "%s%s", sb_respath,
370 sb_time_data[t_st->tm_hour % 10].f_name);
371 evas_object_image_file_set(sb_hour2, file, NULL);
374 sprintf(file, "%s%s", sb_respath, sb_time_data[ICO_SB_TIME_PM].f_name);
375 evas_object_image_file_set(sb_ampm, file, NULL);
376 sprintf(file, "%s%s", sb_respath, sb_time_data[(t_st->tm_hour - 12)
378 evas_object_image_file_set(sb_hour1, file, NULL);
379 sprintf(file, "%s%s", sb_respath, sb_time_data[(t_st->tm_hour - 12)
381 evas_object_image_file_set(sb_hour2, file, NULL);
384 /*Makes the given Evas object visible*/
385 evas_object_show(sb_ampm);
386 evas_object_show(sb_hour1);
387 evas_object_show(sb_hour2);
390 /*--------------------------------------------------------------------------*/
392 * @brief sb_time_hour
393 * show the clock's minite image on statubar
395 * @param[in] tm time data
398 /*--------------------------------------------------------------------------*/
400 sb_time_min(struct tm *t_st)
402 char file[ICO_SB_BUF_SIZE];
403 sprintf(file, "%s%s", sb_respath, sb_time_data[t_st->tm_min / 10].f_name);
404 evas_object_image_file_set(sb_min1, file, NULL);
405 sprintf(file, "%s%s", sb_respath, sb_time_data[t_st->tm_min % 10].f_name);
406 evas_object_image_file_set(sb_min2, file, NULL);
408 /*Makes the given Evas object visible*/
409 evas_object_show(sb_min1);
410 evas_object_show(sb_min2);
413 /*--------------------------------------------------------------------------*/
415 * @brief sb_time_show
416 * callback function called by Ecore.
417 * get time data, and show the clock's image on statubar.
419 * @param[in] thread_data user data
420 * @return call back setting
421 * @retval ECORE_CALLBACK_RENEW set callback
423 /*--------------------------------------------------------------------------*/
425 sb_time_show(void *thread_data)
428 struct tm *t_st, *old_t_st;
430 old_t_st = &sb_st_buf;
434 t_st = localtime(&timer);
436 if (old_t_st->tm_hour != t_st->tm_hour) {
440 if (old_t_st->tm_min != t_st->tm_min) {
444 memcpy(old_t_st, t_st, sizeof(struct tm));
446 return ECORE_CALLBACK_RENEW;
449 /*--------------------------------------------------------------------------*/
451 * @brief sb_touch_up_shortcut
452 * processing when application button touch up.
454 * @param[in] data user data
455 * @param[in] evas evas of the button
456 * @param[in] obj evas object of the button
457 * @param[in] event_info evas event infomation
460 /*--------------------------------------------------------------------------*/
462 sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info)
465 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
466 + LWS_SEND_BUFFER_POST_PADDING];
467 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
468 char *appid = (char *)data;
470 if (sb_wait_reply == ICO_SB_NO_WAIT) {
471 if ((sb_wsi_mirror != NULL) && (appid != NULL)) {
472 n = sprintf((char *)p, "SHOW %s %s", appid, getenv("PKG_NAME"));
473 libwebsocket_write(sb_wsi_mirror, p, n,
474 LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
475 uifw_trace("SB: SHOW %s", appid);
476 sb_wait_reply = ICO_SB_WAIT_REPLY;
478 /* operation sound */
479 hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT));
483 /*--------------------------------------------------------------------------*/
485 * @brief sb_touch_down_applist
486 * processing when application button touch down.
488 * @param[in] data user data
489 * @param[in] evas evas of the button
490 * @param[in] obj evas object of the button
491 * @param[in] event_info evas event infomation
494 /*--------------------------------------------------------------------------*/
496 sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info)
498 char img[ICO_HS_TEMP_BUF_SIZE];
499 char path[ICO_HS_TEMP_BUF_SIZE];
501 hs_get_image_path(path, sizeof(path));
502 sprintf(img, "%s"ICO_SB_APPLIST_ONICON, path);
504 evas_object_image_file_set(obj, img, NULL);
505 evas_object_show(obj);
508 /*--------------------------------------------------------------------------*/
510 * @brief sb_touch_up_applist
511 * processing when application button touch up.
513 * @param[in] data user data
514 * @param[in] evas evas of the button
515 * @param[in] obj evas object of the button
516 * @param[in] event_info evas event infomation
519 /*--------------------------------------------------------------------------*/
521 sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info)
524 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
525 + LWS_SEND_BUFFER_POST_PADDING];
526 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
527 char path[ICO_HS_TEMP_BUF_SIZE];
528 char img[ICO_HS_TEMP_BUF_SIZE];
530 hs_get_image_path(path, sizeof(path));
531 sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path);
533 evas_object_image_file_set(obj, img, NULL);
534 evas_object_show(obj);
536 if (sb_wait_reply == ICO_SB_NO_WAIT) {
537 if (sb_wsi_mirror != NULL) {
538 hs_get_ons_edj_path(path, sizeof(path));
539 n = sprintf((char *)p, "OPEN %s%s %s", path,
540 ICO_HS_ONS_APPLI_LIST_NAME, getenv("PKG_NAME"));
541 libwebsocket_write(sb_wsi_mirror, p, n,
542 LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
543 uifw_trace("SB: CLICK APPLIST");
544 sb_wait_reply = ICO_SB_WAIT_REPLY;
549 /*--------------------------------------------------------------------------*/
551 * @brief sb_touch_down_escathion
552 * processing when escathion button touch down.
554 * @param[in] data user data
555 * @param[in] evas evas of the button
556 * @param[in] obj evas object of the button
557 * @param[in] event_info evas event infomation
560 /*--------------------------------------------------------------------------*/
562 sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info)
564 char img[ICO_HS_TEMP_BUF_SIZE];
565 char path[ICO_HS_TEMP_BUF_SIZE];
567 hs_get_image_path(path, sizeof(path));
568 sprintf(img, "%s"ICO_SB_HOME_ONICON, path);
570 evas_object_image_file_set(obj, img, NULL);
571 evas_object_show(obj);
574 /*--------------------------------------------------------------------------*/
576 * @brief sb_touch_up_escathion
577 * processing when change button touch up.
579 * @param[in] data user data
580 * @param[in] evas evas of the button
581 * @param[in] obj evas object of the button
582 * @param[in] event_info evas event infomation
585 /*--------------------------------------------------------------------------*/
587 sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info)
590 unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512
591 + LWS_SEND_BUFFER_POST_PADDING];
592 unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
593 char path[ICO_HS_TEMP_BUF_SIZE];
594 char img[ICO_HS_TEMP_BUF_SIZE];
596 hs_get_image_path(path, sizeof(path));
597 sprintf(img, "%s"ICO_SB_HOME_OFFICON, path);
599 evas_object_image_file_set(obj, img, NULL);
600 evas_object_show(obj);
602 if (sb_wait_reply == ICO_SB_NO_WAIT) {
603 if (sb_wsi_mirror != NULL) {
604 n = sprintf((char *)p, "%s", "CLICK ESCUTCHEON 1");
605 libwebsocket_write(sb_wsi_mirror, p, n,
606 LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT);
607 uifw_trace("SB: CLICK ESCUTCHEON 1");
608 sb_wait_reply = ICO_SB_WAIT_REPLY;
613 /*--------------------------------------------------------------------------*/
615 * @brief sb_clock_display_fixation
616 * set up fixed images on status bar
618 * @param[in] canvas evas to draw
621 /*--------------------------------------------------------------------------*/
623 sb_clock_display_fixation(Evas *canvas)
625 Evas_Object *tile, *colon;
628 char file[ICO_SB_BUF_SIZE];
629 char img[ICO_HS_TEMP_BUF_SIZE];
630 char path[ICO_HS_TEMP_BUF_SIZE];
632 moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
633 escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2;
635 /* show escutcheon */
636 hs_get_image_path(path, sizeof(path));
637 sprintf(img, "%s"ICO_SB_HOME_OFFICON, path);
638 tile = evas_object_image_filled_add(canvas);
639 evas_object_image_file_set(tile, img, NULL);
640 evas_object_move(tile, escPosX, ICO_SB_POS_Y);
641 evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT);
642 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
643 sb_touch_up_escathion, NULL);
644 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN,
645 sb_touch_down_escathion, NULL);
646 evas_object_show(tile);
649 hs_get_image_path(path, sizeof(path));
650 sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path);
651 tile = evas_object_image_filled_add(canvas);
652 evas_object_image_file_set(tile, img, NULL);
653 evas_object_move(tile, ICO_SB_POS_LIST_X, ICO_SB_POS_Y);
654 evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT * 3 / 2, ICO_HS_SIZE_SB_HEIGHT);
655 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
656 sb_touch_up_applist, NULL);
657 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN,
658 sb_touch_down_applist, NULL);
659 evas_object_show(tile);
661 /* shortcut bottun */
662 sb_add_shortcut(canvas);
664 /* show clock's colon */
665 /*Creates a new image object*/
666 colon = evas_object_image_filled_add(canvas);
667 /*Set the image file */
668 sprintf(file, "%s%s", sb_respath, fname_colon);
669 evas_object_image_file_set(colon, file, NULL);
670 /*This function will make layout change*/
671 evas_object_move(colon, moveH + ICO_SB_POS_COLON_X, ICO_SB_POS_COLON_Y);
672 /*This function will make size change of a picture*/
673 evas_object_resize(colon, ICO_SB_SIZE_COLON_W, ICO_SB_SIZE_COLON_H);
674 /*Makes the given Evas object visible*/
675 evas_object_show(colon);
680 /*--------------------------------------------------------------------------*/
682 * @brief sb_add_shortcut
683 * add shurtcut bottun
685 * @param[in] canvas evas to draw
688 /*--------------------------------------------------------------------------*/
690 sb_add_shortcut(Evas *canvas)
695 char config[ICO_UXF_MAX_PROCESS_NAME];
697 const Ico_Uxf_conf_application *appconf;
698 Eina_List *l, *l_next;
700 escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2;
702 /* delete shortcut */
703 EINA_LIST_FOREACH_SAFE(sb_shtct_list, l, l_next, tile) {
704 evas_object_del(tile);
705 sb_shtct_list = eina_list_remove_list(sb_shtct_list, l);
709 for (idx = 0; idx < ICO_SB_CHTCT_MAX; idx++) {
710 sprintf(config, ICO_SB_CONFIG_SHTCT_APP"%d", idx);
711 x = ICO_SB_POS_SHTCT1_X + (ICO_SB_SIZE_SHTCT_W + ICO_HS_SIZE_SB_HEIGHT * 1 / 2) * idx;
715 appid = hs_conf_get_string(ICO_HS_CONFIG_STATUBAR, config, NULL);
716 if ((appid != NULL) && (strcmp(appid, "none") != 0)) {
717 appconf = ico_uxf_getAppByAppid(appid);
719 tile = evas_object_image_filled_add(canvas);
720 evas_object_image_file_set(tile,
721 appconf->icon_key_name, NULL);
722 evas_object_move(tile, x, ICO_SB_POS_Y);
723 evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT);
724 evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP,
725 sb_touch_up_shortcut, appid);
726 evas_object_show(tile);
727 sb_shtct_list = eina_list_append(sb_shtct_list, tile);
735 /*--------------------------------------------------------------------------*/
737 * @brief sb_config_event
738 * This is a callback function called when the configurations
741 * @param[in] appid application id
742 * @param[in] type event type(install/uninstall)
745 /*--------------------------------------------------------------------------*/
747 sb_config_event(const char *appid, int type)
749 uifw_trace("sb_config_event: Enter(appid=%s, type=%d)", appid, type);
751 sb_add_shortcut(sb_canvas);
753 uifw_trace("sb_config_event: Leave");
758 /*--------------------------------------------------------------------------*/
760 * @brief status bar application
763 * @param main() finction's standard parameter (argc,argv)
768 /*--------------------------------------------------------------------------*/
770 main(int argc, char *argv[])
775 char file[ICO_SB_BUF_SIZE];
778 int orientation = ICO_SB_HORIZONTAL;
781 static Ecore_Evas *ee;
784 hs_get_image_path(sb_respath, ICO_SB_BUF_SIZE);
787 if (getenv("PKG_NAME")) {
788 ico_uxf_log_open(getenv("PKG_NAME"));
791 ico_uxf_log_open(ICO_HS_APPID_DEFAULT_SB);
796 for (ii = 1; ii < argc; ii++) {
797 if (argv[ii][0] != '-')
799 if (strncasecmp(argv[ii], "-orientaion=", strlen("-orientaion=")) == 0) {
800 if (strcmp(&argv[ii][strlen("-orientaion=")], "vertical") == 0) {
801 orientation = ICO_SB_VERTICAL;
803 else if (strcmp(&argv[ii][strlen("-orientaion=")], "horizontal")
805 orientation = ICO_SB_HORIZONTAL;
810 /* load configuration */
811 ret = initHomeScreenConfig(ICO_STATUSBAR_CONFIG_FILE);
812 if (ret == ICO_HS_OK) {
813 sb_ws_port = hs_conf_get_integer(ICO_HS_CONFIG_STATUBAR,
814 ICO_HS_CONFIG_WS_PORT,
816 orientation = hs_conf_get_integer(ICO_HS_CONFIG_STATUBAR,
817 ICO_HS_CONFIG_ORIENTAION,
822 /* Initialize a new system of Ecore_Evas */
825 /* Generate Ecore_Evas */
826 ee = ecore_evas_new(NULL, 0, 0, 1, 1, "frame=0");
830 ecore_main_loop_iterate();
831 ecore_wl_screen_size_get(&width, &height);
833 if (orientation == ICO_SB_VERTICAL) {
834 sb_width = width > height ? height : width;
835 moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
838 sb_width = width < height ? height : width;
839 moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH;
842 /* Set the window size of the maximum and minimum */
843 ecore_evas_size_min_set(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
844 ecore_evas_size_max_set(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
846 /* Set a callback for Ecore_Evas delete request events */
847 ecore_evas_callback_delete_request_set(ee, sb_on_destroy);
849 /* Set the title of an Ecore_Evas window */
850 /* ecore_evas_title_set(ee, "Ecore_Evas buffer (image) example"); */
852 ecore_evas_move(ee, 0, 0);
853 ecore_evas_resize(ee, sb_width, ICO_HS_SIZE_SB_HEIGHT);
856 /* Wrapper of Evas */
857 sb_canvas = ecore_evas_get(ee);
860 bg = evas_object_rectangle_add(sb_canvas);
861 evas_object_color_set(bg, 0, 0, 0, 255);
862 evas_object_move(bg, 0, 0);
863 evas_object_resize(bg, sb_width, ICO_HS_SIZE_SB_HEIGHT);
864 evas_object_show(bg);
866 /* Call the function */
867 sb_clock_display_fixation(sb_canvas);
870 sb_ampm = evas_object_image_filled_add(sb_canvas);
871 sb_hour1 = evas_object_image_filled_add(sb_canvas);
872 sb_hour2 = evas_object_image_filled_add(sb_canvas);
873 sb_min1 = evas_object_image_filled_add(sb_canvas);
874 sb_min2 = evas_object_image_filled_add(sb_canvas);
876 /* This function will make layout change */
877 evas_object_move(sb_ampm, moveH + ICO_SB_POS_AMPM_X, ICO_SB_POS_AMPM_Y);
878 evas_object_move(sb_hour1, moveH + ICO_SB_POS_HOUR1_X, ICO_SB_POS_HOUR1_Y);
879 evas_object_move(sb_hour2, moveH + ICO_SB_POS_HOUR2_X, ICO_SB_POS_HOUR2_Y);
881 /* This function will make size change of picture */
882 evas_object_resize(sb_ampm, ICO_SB_SIZE_AMPM_W, ICO_SB_SIZE_AMPM_H);
883 evas_object_resize(sb_hour1, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
884 evas_object_resize(sb_hour2, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
886 /* Makes the given Evas object visible */
887 evas_object_show(sb_ampm);
888 evas_object_show(sb_hour1);
889 evas_object_show(sb_hour2);
891 /* Change default layout of Evas object */
892 evas_object_move(sb_min1, moveH + ICO_SB_POS_MIN1_X, ICO_SB_POS_MIN1_Y);
893 evas_object_move(sb_min2, moveH + ICO_SB_POS_MIN2_X, ICO_SB_POS_MIN2_Y);
895 /* Change default size of Evas object */
896 evas_object_resize(sb_min1, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
897 evas_object_resize(sb_min2, ICO_SB_SIZE_NUM_W, ICO_SB_SIZE_NUM_H);
899 /* Makes the given Evas object visible */
900 evas_object_show(sb_min1);
901 evas_object_show(sb_min2);
904 t_st = localtime(&timer);
908 /* Set the image file */
909 for (ii = 0; ii < ICO_SB_TIME_IMG_PARTS; ii++) {
910 sb_time_data[ii].time_img = evas_object_image_filled_add(sb_canvas);
911 sprintf(file, "%s%s", sb_respath, sb_time_data[ii].f_name);
912 evas_object_image_file_set(sb_time_data[ii].time_img, file, NULL);
914 ecore_timer_add(ICO_SB_TIMEOUT, sb_time_show, NULL);
916 /* Init websockets */
917 sb_create_ws_context();
918 ecore_timer_add(ICO_SB_WS_TIMEOUT, sb_ecore_event, NULL);
920 /* add callback to app configuration */
921 ico_uxf_econf_setAppUpdateCb(sb_config_event);
923 /* Runs the application main loop */
924 ecore_main_loop_begin();
925 /* Free an Ecore_Evas */
927 /* Shut down the Ecore_Evas system */
928 ecore_evas_shutdown();
932 uifw_warn("status_bar: error use ecore")
933 ecore_evas_shutdown();