From 4af112945feccfea0fd32a6302b7ce92a509be01 Mon Sep 17 00:00:00 2001 From: Nakamura Hayato Date: Fri, 24 May 2013 20:22:12 +0900 Subject: [PATCH] Bug fix TIVI-839 ,change the design and permit operation of the music player while driving. Change-Id: I0db2681a58a057f48cb0caccafd451fa17163555 Signed-off-by: Nakamura Hayato --- apps_controller/ico_syc_apc_control.c | 274 ++++++++----- apps_controller/ico_syc_apc_private.h | 3 +- apps_controller/ico_syc_apc_regulation.c | 89 +++- configure.ac | 6 + ico-app-framework/Makefile.am | 13 +- ico-app-framework/Makefile.am.bk | 41 ++ ico-app-framework/ico_uxf_conf_app.c | 477 ++++++++++++++++++++-- ico-app-framework/ico_uxf_conf_ecore.c | 168 ++++++++ ico-app-framework/ico_uxf_init.c | 273 ++++++++++++- ico-app-framework/ico_uxf_launcher.c | 1 - ico-app-framework/ico_uxf_private.h | 14 +- ico-app-framework/ico_uxf_window.c | 201 ++++++--- include/home_screen.h | 9 +- include/ico_apf_resource_control.h | 4 + include/ico_syc_apc.h | 10 +- include/ico_syc_def.h | 2 + include/ico_syc_error.h | 46 --- include/ico_uxf_conf.h | 24 +- include/ico_uxf_conf_ecore.h | 47 +++ include/ico_uxf_proto.h | 8 + include/ico_uxf_sysdef.h | 6 +- include/ico_uxf_typedef.h | 4 + install-appcore.sh | 4 +- packaging/ico-uxf-HomeScreen.changes | 17 + packaging/ico-uxf-HomeScreen.spec | 9 +- res/apps/org.tizen.ico.homescreen/homescreen.conf | 5 +- res/apps/org.tizen.ico.statusbar/statusbar.conf | 5 +- res/config/app_attr.conf | 5 +- res/config/system.conf | 2 + res/images/applist_off.png | Bin 0 -> 8492 bytes res/images/applist_on.png | Bin 0 -> 13645 bytes res/images/home_off.png | Bin 0 -> 8795 bytes res/images/home_on.png | Bin 0 -> 16320 bytes settings/S99zz_ico_weston | 248 ----------- src/Makefile.am | 8 +- src/home_screen_lib.c | 169 ++++++-- src/home_screen_main.c | 310 ++++++++++---- src/on_screen.c | 142 +++++-- src/status_bar.c | 359 +++++++++++++--- start_homescreen_appcore | 2 +- test/ico_send_hscommand.c | 20 +- test/ico_set_vehicleinfo.c | 3 + 42 files changed, 2241 insertions(+), 787 deletions(-) create mode 100644 ico-app-framework/Makefile.am.bk create mode 100644 ico-app-framework/ico_uxf_conf_ecore.c delete mode 100644 include/ico_syc_error.h create mode 100644 include/ico_uxf_conf_ecore.h create mode 100755 res/images/applist_off.png create mode 100755 res/images/applist_on.png create mode 100755 res/images/home_off.png create mode 100755 res/images/home_on.png delete mode 100755 settings/S99zz_ico_weston diff --git a/apps_controller/ico_syc_apc_control.c b/apps_controller/ico_syc_apc_control.c index 0153e69..a19e20f 100644 --- a/apps_controller/ico_syc_apc_control.c +++ b/apps_controller/ico_syc_apc_control.c @@ -94,6 +94,9 @@ static ico_apc_request_t *search_soundrequest(const Ico_Uxf_conf_application *co /*==============================================================================*/ /* define fixed value */ /*==============================================================================*/ +/* initiale allocate request blocks */ +#define INIT_REQCB 50 + /* maximum number of request blocks */ #if ICO_UXF_DISPLAY_ZONE_MAX > ICO_UXF_SOUND_ZONE_MAX #if ICO_UXF_INPUT_SW_MAX > ICO_UXF_DISPLAY_ZONE_MAX @@ -111,6 +114,30 @@ static ico_apc_request_t *search_soundrequest(const Ico_Uxf_conf_application *co /*--------------------------------------------------------------------------*/ /** + * @brief get_appconf: application configure(static function) + * + * @param appid application id + * @return result + * @retval != NULL success(request block address) + * @retval == NULL error(out of memory) + */ +/*--------------------------------------------------------------------------*/ +static Ico_Uxf_conf_application * +get_appconf(const char *appid) +{ + Ico_Uxf_conf_application *appconf = NULL; + + appconf = (Ico_Uxf_conf_application *)ico_uxf_getAppByAppid(appid); + if (! appconf) { + /* application id dose not exist, search application name */ + appconf = (Ico_Uxf_conf_application *)ico_uxf_getAppByName(appid); + } + + return appconf; +} + +/*--------------------------------------------------------------------------*/ +/** * @brief get_freereq: get free request block(static function) * * @param none @@ -170,7 +197,7 @@ search_disprequest(const Ico_Uxf_conf_application *conf, const int resid, const for (i = 0; i < ndispzone; i++) { p = dispzone[i].req; while (p) { - if ((p->conf == conf) && + if ((strcmp(p->appid, conf->appid) == 0) && ((int)p->resid == resid)) { if ((id < 0) || (p->id == id)) { return p; @@ -207,7 +234,7 @@ search_soundrequest(const Ico_Uxf_conf_application *conf, const int resid, for (i = 0; i < nsoundzone; i++) { p = soundzone[i].req; while (p) { - if ((p->conf == conf) && + if ((strcmp(p->appid, conf->appid) == 0) && ((int)p->resid == resid)) { if ((id < 0) || (p->id == id)) { if (first_req) { @@ -296,7 +323,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) for (i = 0; i < ndispzone; i++) { p = dispzone[i].req; while (p) { - if (p->conf == appconf) { + if (strcmp(p->appid, appconf->appid) == 0) { reqsave[count++] = p; } p = p->next; @@ -310,7 +337,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) for (i = 0; i < nsoundzone; i++) { p = soundzone[i].req; while (p) { - if (p->conf == appconf) { + if (strcmp(p->appid, appconf->appid) == 0) { reqsave[count++] = p; } p = p->next; @@ -324,7 +351,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) for (i = 0; i < ninputsw; i++) { p = inputsw[i].req; while (p) { - if (p->conf == appconf) { + if (strcmp(p->appid, appconf->appid) == 0) { reqsave[count++] = p; } p = p->next; @@ -341,7 +368,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) if (! req) { return; } - req->conf = appconf; + strncpy(req->appid, appconf->appid, ICO_UXF_MAX_PROCESS_NAME); req->resid = info->resid; if (info->device[0]) { strcpy(req->device, info->device); @@ -490,7 +517,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) apfw_warn("resource_reqcb: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(p->conf, 1); + (*soundcontrol)(get_appconf(req->appid), 1); } } p->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); @@ -502,7 +529,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) p = search_soundrequest(appconf, ICO_APF_RESID_BASIC_SOUND, -1, &freq); if (p) { apfw_trace("resource_reqcb: app(%s,state=%x,prio=%08x,pid=%d=>%d) " - "requested sound, Nop", p->conf->appid, p->state, p->prio, + "requested sound, Nop", p->appid, p->state, p->prio, p->pid, info->pid); p->pid = info->pid; if (p->state & ICO_APC_REQSTATE_WAITREQ) { @@ -512,7 +539,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) apfw_warn("resource_reqcb: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(p->conf, 0); + (*soundcontrol)(get_appconf(p->appid), 0); } if ((freq->state & ICO_APC_REQSTATE_WAITREQ) == 0) { if (ico_apf_resource_send_to_soundctl(ICO_APF_SOUND_COMMAND_MUTEOFF, @@ -521,7 +548,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) apfw_warn("resource_reqcb: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(freq->conf, 1); + (*soundcontrol)(get_appconf(freq->appid), 1); } } } @@ -569,7 +596,7 @@ resource_reqcb(ico_apf_resource_notify_info_t* info, void *user_data) apfw_warn("resource_reqcb: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(p->conf, 1); + (*soundcontrol)(get_appconf(p->appid), 1); } } p->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); @@ -637,7 +664,7 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) { int prio; int i, j; - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = (Ico_Uxf_conf_application *)get_appconf(req->appid); Ico_Uxf_conf_display_zone *zone; ico_apc_dispzone_t *czone; ico_apc_request_t *p; @@ -685,7 +712,7 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) p = czone->req; bp = NULL; while (p) { - if ((p->conf == req->conf) && (p->resid == req->resid) && + if ((strcmp(p->appid, req->appid) == 0) && (p->resid == req->resid) && (p->zoneidx == req->zoneidx)) { break; } @@ -726,13 +753,13 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) req->next = bp->next; bp->next = req; apfw_trace("app_getdisplay: app(%s) set after(%s) of zone(%s)", - conf->appid, bp->conf->appid, req->device); + conf->appid, bp->appid, req->device); } else { req->next = czone->req; czone->req = req; apfw_trace("app_getdisplay: app(%s) set top of zone(%s) next %s", - conf->appid, req->device, req->next ? req->next->conf->appid : "(NULL)"); + conf->appid, req->device, req->next ? req->next->appid : "(NULL)"); } /* check if maximum priority */ @@ -812,7 +839,7 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) } /* send change event to invisible application */ apfw_trace("app_getdisplay: next=%08x %s next_state=%x", - req->next, req->next ? req->next->conf->appid : " ", + req->next, req->next ? req->next->appid : " ", req->next ? req->next->state : 0x9999); if ((req->next) && ((req->next->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { p = req->next; @@ -826,12 +853,12 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) if (p != NULL) { if ((p->state & ICO_APC_REQSTATE_WAITREQ) == 0) { p->state |= ICO_APC_REQSTATE_WAITREQ; - apfw_trace("app_getdisplay: overlaped(%s), waitting", p->conf->appid); + apfw_trace("app_getdisplay: overlaped(%s), waitting", p->appid); if (p->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - p->conf->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, + p->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, p->resid, p->device, p->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("app_getdisplay: send(%s) Error)", p->conf->appid); + apfw_warn("app_getdisplay: send(%s) Error)", p->appid); } else { req->state &= ~ICO_APC_REQSTATE_REPLYACTIVE; @@ -840,9 +867,9 @@ app_getdisplay(ico_apc_request_t *req, const int addprio) timer_count ++; } } - ico_uxf_window_control(p->conf->appid, -1, ICO_UXF_APPSCTL_INVISIBLE, 1); + ico_uxf_window_control(p->appid, -1, ICO_UXF_APPSCTL_INVISIBLE, 1); if (displaycontrol) { - (*displaycontrol)(p->conf, 0); + (*displaycontrol)(get_appconf(p->appid), 0); } } } @@ -867,12 +894,12 @@ static void app_freedisplay(ico_apc_request_t *req, const int send) { int idx; - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = get_appconf(req->appid); ico_apc_dispzone_t *czone; ico_apc_request_t *p; ico_apc_request_t *bp; - apfw_trace("app_freedisplay: Entry(app=%s)", conf->appid); + apfw_trace("app_freedisplay: Entry(app=%s)", req->appid); czone = &dispzone[req->zoneidx]; idx = czone->conf->display->id; @@ -883,7 +910,7 @@ app_freedisplay(ico_apc_request_t *req, const int send) } if ((send !=0) && (req->reqtype == ICO_APC_REQTYPE_REQUEST)) { (void) ico_apf_resource_send_to_client( - req->conf->appid, ICO_APF_RESOURCE_STATE_RELEASED, + req->appid, ICO_APF_RESOURCE_STATE_RELEASED, req->resid, req->device, req->id); } @@ -933,17 +960,17 @@ static void change_disprequest(ico_apc_request_t *req, const int active) { apfw_trace("change_disprequest: change to %s(%s)", active ? "active" : "inactive", - req->conf->appid); + req->appid); req->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); if (req->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - req->conf->appid, + req->appid, active ? ICO_APF_RESOURCE_STATE_ACQUIRED : ICO_APF_RESOURCE_STATE_DEPRIVED, req->resid, req->device, req->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("change_disprequest: send(%s) Error", req->conf->appid); + apfw_warn("change_disprequest: send(%s) Error", req->appid); } else { req->state |= (active ? ICO_APC_REQSTATE_REPLYACTIVE : @@ -953,10 +980,10 @@ change_disprequest(ico_apc_request_t *req, const int active) } } if ((req->state & ICO_APC_REQSTATE_REPLYACTIVE) == 0) { - ico_uxf_window_control(req->conf->appid, req->id, ICO_UXF_APPSCTL_INVISIBLE, + ico_uxf_window_control(req->appid, req->id, ICO_UXF_APPSCTL_INVISIBLE, active ? 0 : 1); if (displaycontrol) { - (*displaycontrol)(req->conf, active); + (*displaycontrol)(get_appconf(req->appid), active); } } if (active) { @@ -1014,7 +1041,7 @@ recalc_dispzone(const int idx) p->state &= ~ICO_APC_REQSTATE_WAITPROC; } apfw_trace("recalc_dispzone: Leave(%s no need visible control)", - czone2->req->conf->appid); + czone2->req->appid); return; } @@ -1059,7 +1086,7 @@ app_getsound(ico_apc_request_t *req, const int addprio) { int prio; int i, j; - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = get_appconf(req->appid); Ico_Uxf_conf_sound_zone *zone; ico_apc_soundzone_t *czone; ico_apc_request_t *p; @@ -1107,7 +1134,7 @@ app_getsound(ico_apc_request_t *req, const int addprio) p = czone->req; bp = NULL; while (p) { - if ((p->conf == req->conf) && (p->resid == req->resid) && + if ((strcmp(p->appid, req->appid) == 0) && (p->resid == req->resid) && (p->zoneidx == req->zoneidx)) { break; } @@ -1205,7 +1232,7 @@ app_getsound(ico_apc_request_t *req, const int addprio) } /* send change event to mute application */ apfw_trace("app_getsound: next=%08x %s next_state=%x", - req->next, req->next ? req->next->conf->appid : " ", + req->next, req->next ? req->next->appid : " ", req->next ? req->next->state : 0x9999); if ((req->next) && ((req->next->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { p = req->next; @@ -1219,12 +1246,12 @@ app_getsound(ico_apc_request_t *req, const int addprio) if (p != NULL) { if ((p->state & ICO_APC_REQSTATE_WAITREQ) == 0) { p->state |= ICO_APC_REQSTATE_WAITREQ; - apfw_trace("app_getsound: overlaped(%s), waitting", p->conf->appid); + apfw_trace("app_getsound: overlaped(%s), waitting", p->appid); if (p->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - p->conf->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, + p->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, p->resid, p->device, p->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("app_getsound: send(%s) Error)", p->conf->appid); + apfw_warn("app_getsound: send(%s) Error)", p->appid); } else { p->state |= ICO_APC_REQSTATE_REPLYQUIET; @@ -1238,7 +1265,7 @@ app_getsound(ico_apc_request_t *req, const int addprio) apfw_warn("app_getsound: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(p->conf, 0); + (*soundcontrol)(get_appconf(p->appid), 0); } } if (i >= czone->noverlap) break; @@ -1263,12 +1290,12 @@ static void app_freesound(ico_apc_request_t *req, const int send) { int idx; - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = get_appconf(req->appid); ico_apc_soundzone_t *czone; ico_apc_request_t *p; ico_apc_request_t *bp; - apfw_trace("app_freesound: Entry(app=%s)", conf->appid); + apfw_trace("app_freesound: Entry(app=%s)", req->appid); czone = &soundzone[req->zoneidx]; idx = czone->conf->sound->id; @@ -1282,7 +1309,7 @@ app_freesound(ico_apc_request_t *req, const int send) } if ((send !=0) && (req->reqtype == ICO_APC_REQTYPE_REQUEST)) { (void) ico_apf_resource_send_to_client( - req->conf->appid, ICO_APF_RESOURCE_STATE_RELEASED, + req->appid, ICO_APF_RESOURCE_STATE_RELEASED, req->resid, req->device, req->id); } @@ -1332,17 +1359,17 @@ static void change_soundrequest(ico_apc_request_t *req, const int active) { apfw_trace("change_soundrequest: change to %s(%s)", active ? "active" : "quiet", - req->conf->appid); + req->appid); req->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); if (req->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - req->conf->appid, + req->appid, active ? ICO_APF_RESOURCE_STATE_ACQUIRED : ICO_APF_RESOURCE_STATE_DEPRIVED, req->resid, req->device, req->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("change_soundrequest: send(%s) Error", req->conf->appid); + apfw_warn("change_soundrequest: send(%s) Error", req->appid); } else { req->state |= (active ? ICO_APC_REQSTATE_REPLYACTIVE : @@ -1358,7 +1385,7 @@ change_soundrequest(ico_apc_request_t *req, const int active) apfw_warn("change_soundrequest: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(req->conf, active); + (*soundcontrol)(get_appconf(req->appid), active); } } if (active) { @@ -1416,7 +1443,7 @@ recalc_soundzone(const int idx) p->state &= ~ICO_APC_REQSTATE_WAITPROC; } apfw_trace("recalc_soundzone: Leave(%s no need sound control)", - czone2->req->conf->appid); + czone2->req->appid); return; } @@ -1425,7 +1452,7 @@ recalc_soundzone(const int idx) p->state &= ~ICO_APC_REQSTATE_WAITPROC; if (p->prio & ICO_UXF_PRIO_REGULATION) { apfw_trace("recalc_soundzone: Start %s(prio=%08x and no regulation)", - p->conf->appid, p->prio); + p->appid, p->prio); change_soundrequest(p, 1); } @@ -1437,7 +1464,7 @@ recalc_soundzone(const int idx) p->state &= ~ICO_APC_REQSTATE_WAITPROC; if (p->prio & ICO_UXF_PRIO_REGULATION) { apfw_trace("recalc_soundzone: Overlap Stop %s(top and no regulation)", - p->conf->appid); + p->appid); change_soundrequest(p, 0); } else { @@ -1456,7 +1483,7 @@ recalc_soundzone(const int idx) if (p->state & ICO_APC_REQSTATE_WAITREQ) { if (p->prio & ICO_UXF_PRIO_REGULATION) { apfw_trace("recalc_soundzone: Overlap Start %s(top and no regulation)", - p->conf->appid); + p->appid); change_soundrequest(p, 1); } } @@ -1478,7 +1505,7 @@ app_getinput(ico_apc_request_t *req, const int addprio) { int prio; int i; - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = get_appconf(req->appid); ico_apc_inputsw_t *czone; ico_apc_request_t *p; ico_apc_request_t *bp; @@ -1524,7 +1551,7 @@ app_getinput(ico_apc_request_t *req, const int addprio) p = czone->req; bp = NULL; while (p) { - if ((p->conf == req->conf) && (p->resid == req->resid) && + if ((strcmp(p->appid, req->appid) == 0) && (p->resid == req->resid) && (p->zoneidx == req->zoneidx)) { break; } @@ -1575,7 +1602,7 @@ app_getinput(ico_apc_request_t *req, const int addprio) /* insert application to zone application list and */ /* change zone priority, if request application is top priority */ req->state |= ICO_APC_REQSTATE_WAITREQ; - if (ico_uxf_input_control(0, req->conf->appid, czone->inputdev->device, + if (ico_uxf_input_control(0, req->appid, czone->inputdev->device, czone->inputsw->input) != ICO_UXF_EOK) { apfw_warn("app_getinput: send MIM Error"); } @@ -1611,7 +1638,7 @@ app_getinput(ico_apc_request_t *req, const int addprio) timer_count ++; } } - if (ico_uxf_input_control(1, req->conf->appid, czone->inputdev->device, + if (ico_uxf_input_control(1, req->appid, czone->inputdev->device, czone->inputsw->input) != ICO_UXF_EOK) { apfw_warn("app_getinput: send MIM Error"); } @@ -1619,12 +1646,12 @@ app_getinput(ico_apc_request_t *req, const int addprio) if ((req->next) && ((req->next->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { p = req->next; p->state |= ICO_APC_REQSTATE_WAITREQ; - apfw_trace("app_getinput: lower priority(%s), waitting", p->conf->appid); + apfw_trace("app_getinput: lower priority(%s), waitting", p->appid); if (p->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - p->conf->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, + p->appid, ICO_APF_RESOURCE_STATE_DEPRIVED, p->resid, p->device, p->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("app_getinput: send(%s) Error)", p->conf->appid); + apfw_warn("app_getinput: send(%s) Error)", p->appid); } else { p->state |= ICO_APC_REQSTATE_REPLYQUIET; @@ -1650,12 +1677,12 @@ app_getinput(ico_apc_request_t *req, const int addprio) static void app_freeinput(ico_apc_request_t *req, const int send) { - Ico_Uxf_conf_application *conf = req->conf; + Ico_Uxf_conf_application *conf = get_appconf(req->appid); ico_apc_inputsw_t *czone; ico_apc_request_t *p; ico_apc_request_t *bp; - apfw_trace("app_freeinput: Entry(app=%s)", conf->appid); + apfw_trace("app_freeinput: Entry(app=%s)", req->appid); czone = &inputsw[req->zoneidx]; @@ -1668,7 +1695,7 @@ app_freeinput(ico_apc_request_t *req, const int send) } if ((send !=0) && (req->reqtype == ICO_APC_REQTYPE_REQUEST)) { (void) ico_apf_resource_send_to_client( - req->conf->appid, ICO_APF_RESOURCE_STATE_RELEASED, + req->appid, ICO_APF_RESOURCE_STATE_RELEASED, req->resid, req->device, req->id); } @@ -1720,17 +1747,17 @@ change_inputrequest(ico_apc_request_t *req, const int active) ico_apc_inputsw_t *czone; apfw_trace("change_inputrequest: change to %s(%s)", active ? "use" : "unuse", - req->conf->appid); + req->appid); czone = &inputsw[req->zoneidx]; if (req->reqtype == ICO_APC_REQTYPE_REQUEST) { if (ico_apf_resource_send_to_client( - req->conf->appid, + req->appid, active ? ICO_APF_RESOURCE_STATE_ACQUIRED : ICO_APF_RESOURCE_STATE_DEPRIVED, req->resid, req->device, req->id) != ICO_APF_RESOURCE_E_NONE) { - apfw_warn("change_inputrequest: send(%s) Error", req->conf->appid); + apfw_warn("change_inputrequest: send(%s) Error", req->appid); } else { req->state |= (active ? ICO_APC_REQSTATE_REPLYACTIVE : @@ -1739,12 +1766,12 @@ change_inputrequest(ico_apc_request_t *req, const int active) timer_count ++; } } - if (ico_uxf_input_control(active, req->conf->appid, czone->inputdev->device, + if (ico_uxf_input_control(active, req->appid, czone->inputdev->device, czone->inputsw->input) != ICO_UXF_EOK) { apfw_warn("app_getinput: send MIM Error"); } if (inputcontrol) { - (*inputcontrol)(req->conf, active); + (*inputcontrol)(get_appconf(req->appid), active); } if (active) { req->state &= ~ICO_APC_REQSTATE_WAITREQ; @@ -1780,7 +1807,7 @@ recalc_inputsw(const int idx) } if ((p->state & ICO_APC_REQSTATE_WAITREQ) == 0) { /* not wait request */ - apfw_trace("recalc_inputsw: Leave(%s no need input control)", p->conf->appid); + apfw_trace("recalc_inputsw: Leave(%s no need input control)", p->appid); return; } @@ -1788,7 +1815,7 @@ recalc_inputsw(const int idx) p->state &= ~ICO_APC_REQSTATE_WAITPROC; if (p->prio & ICO_UXF_PRIO_REGULATION) { apfw_trace("recalc_inputsw: Start %s(prio=%08x and no regulation)", - p->conf->appid, p->prio); + p->appid, p->prio); change_inputrequest(p, 1); } @@ -1824,6 +1851,8 @@ regulation_listener(const int appcategory, sound = 0; input = 0; + confapp = (Ico_Uxf_App_Config *)ico_uxf_getAppConfig(); + if (control.display != ICO_SYC_APC_REGULATION_NOCHANGE) { /* display regulation control */ apfw_trace("regulation_listener: disp category=%d display=%d", @@ -1835,13 +1864,13 @@ regulation_listener(const int appcategory, if (!p) continue; bp = NULL; while (p) { - if (p->conf == &confapp->application[i]) { + if (strcmp(p->appid, confapp->application[i].appid) == 0) { flag = 0; if (control.display == ICO_SYC_APC_REGULATION_REGULATION) { if (p->prio & ICO_UXF_PRIO_REGULATION) { p->prio &= ~ICO_UXF_PRIO_REGULATION; flag ++; - ico_uxf_window_control(p->conf->appid, p->id, + ico_uxf_window_control(p->appid, p->id, ICO_UXF_APPSCTL_REGULATION, 1); } } @@ -1849,7 +1878,7 @@ regulation_listener(const int appcategory, if ((p->prio & ICO_UXF_PRIO_REGULATION) == 0) { p->prio |= ICO_UXF_PRIO_REGULATION; flag ++; - ico_uxf_window_control(p->conf->appid, p->id, + ico_uxf_window_control(p->appid, p->id, ICO_UXF_APPSCTL_REGULATION, 0); } } @@ -1861,7 +1890,7 @@ regulation_listener(const int appcategory, reqdisp[disp++] = dispzone[k].conf->display->id; } apfw_trace("regulation_listener: disp %s %08x", - p->conf->appid, p->prio); + p->appid, p->prio); if (bp) { bp->next = p->next; } @@ -1915,7 +1944,7 @@ regulation_listener(const int appcategory, } } - if (control.sound != ICO_SYC_APC_REGULATION_NOCHANGE) { + if (control.sound != ICO_SYC_APC_REGULATION_NOCHANGE) { /* sound regulation control */ apfw_trace("regulation_listener: sound category=%d sound=%d", appcategory, control.sound); @@ -1926,7 +1955,7 @@ regulation_listener(const int appcategory, if (!p) continue; bp = NULL; while (p) { - if (p->conf == &confapp->application[i]) { + if (strcmp(p->appid, confapp->application[i].appid) == 0) { flag = 0; if (control.sound == ICO_SYC_APC_REGULATION_REGULATION) { if (p->prio & ICO_UXF_PRIO_REGULATION) { @@ -1946,7 +1975,7 @@ regulation_listener(const int appcategory, if (flag) { apfw_trace("regulation_listener: sound change category=%d " "app(%s) sound=%d prio=%08x", - appcategory, p->conf->appid, control.sound, p->prio); + appcategory, p->appid, control.sound, p->prio); for (j = 0; j < sound; j++) { if (soundzone[k].conf->sound->id == reqsound[j]) break; } @@ -1954,7 +1983,7 @@ regulation_listener(const int appcategory, reqsound[sound++] = soundzone[k].conf->sound->id; } apfw_trace("regulation_listener: sound %s %08x %08x", - p->conf->appid, p->prio, (int)bp); + p->appid, p->prio, (int)bp); if (bp) { bp->next = p->next; } @@ -2019,7 +2048,7 @@ regulation_listener(const int appcategory, if (!p) continue; bp = NULL; while (p) { - if (p->conf == &confapp->application[i]) { + if (strcmp(p->appid, confapp->application[i].appid) == 0) { flag = 0; if (control.input == ICO_SYC_APC_REGULATION_REGULATION) { if (p->prio & ICO_UXF_PRIO_REGULATION) { @@ -2039,7 +2068,7 @@ regulation_listener(const int appcategory, if (flag) { apfw_trace("regulation_listener: input change category=%d " "app(%s) input=%d prio=%08x", - appcategory, p->conf->appid, control.input, p->prio); + appcategory, p->appid, control.input, p->prio); for (j = 0; j < sound; j++) { if (inputsw[k].inputsw->input == reqinput[j]) break; } @@ -2047,7 +2076,7 @@ regulation_listener(const int appcategory, reqinput[input++] = inputsw[k].inputsw->input; } apfw_trace("regulation_listener: input %s %08x %08x", - p->conf->appid, p->prio, (int)bp); + p->appid, p->prio, (int)bp); if (bp) { bp->next = p->next; } @@ -2137,13 +2166,13 @@ request_timer(void *user_data) p->timer --; if (p->timer == 0) { apfw_trace("request_timer: display timedout(%s %d %d prio=%08x)", - p->conf->appid, p->resid, p->id, p->prio); + p->appid, p->resid, p->id, p->prio); if ((p->state & ICO_APC_REQSTATE_REPLYACTIVE) && ((p->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { - ico_uxf_window_control(p->conf->appid, p->id, + ico_uxf_window_control(p->appid, p->id, ICO_UXF_APPSCTL_INVISIBLE, 0); if (displaycontrol) { - (*displaycontrol)(p->conf, 1); + (*displaycontrol)(get_appconf(p->appid), 1); } } p->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); @@ -2164,7 +2193,7 @@ request_timer(void *user_data) p->timer --; if (p->timer == 0) { apfw_trace("request_timer: sound timedout(%s %d %d prio=%08x)", - p->conf->appid, p->resid, p->id, p->prio); + p->appid, p->resid, p->id, p->prio); if ((p->state & ICO_APC_REQSTATE_REPLYACTIVE) && ((p->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { if (ico_apf_resource_send_to_soundctl(ICO_APF_SOUND_COMMAND_MUTEOFF, @@ -2173,7 +2202,7 @@ request_timer(void *user_data) apfw_warn("request_timer: send MSM Error"); } if (soundcontrol) { - (*soundcontrol)(p->conf, 1); + (*soundcontrol)(get_appconf(p->appid), 1); } } p->state &= ~(ICO_APC_REQSTATE_REPLYACTIVE|ICO_APC_REQSTATE_REPLYQUIET); @@ -2203,6 +2232,7 @@ ico_syc_apc_active(const char *appid) int disp, sound, input; int flag; Ico_Uxf_conf_application *appconf; + char *child_appid; ico_apc_request_t *p; ico_apc_request_t *bp; ico_apc_request_t *p2; @@ -2225,6 +2255,18 @@ ico_syc_apc_active(const char *appid) appconf = NULL; } + if (appconf) { + /* save child process if exist */ + child_appid = ico_uxf_getchild_appid(appconf->appid); + /* set last active process for child process */ + ico_uxf_set_lastapp(appconf->appid); + } + else { + /* reset last active process for child process */ + ico_uxf_set_lastapp(NULL); + child_appid = NULL; + } + /* change all screen request from this application */ disp = 0; for (i = 0; i < ndispzone; i++) { @@ -2232,13 +2274,13 @@ ico_syc_apc_active(const char *appid) flag = 0; bp = NULL; while (p) { - if (p->conf == appconf) { + if (appconf && (strcmp(p->appid, appconf->appid) == 0)) { apfw_trace("ico_syc_apc_active: disp %s prio=%08x is %s", - p->conf->appid, p->prio, bp ? "not top" : "top"); + p->appid, p->prio, bp ? "not top" : "top"); if ((p->prio & ICO_UXF_PRIO_ACTIVEAPP) != ICO_UXF_PRIO_ACTIVEAPP) { p->prio |= ICO_UXF_PRIO_ACTIVEAPP; apfw_trace("ico_syc_apc_active: cgange active %s prio to %08x", - p->conf->appid, p->prio); + p->appid, p->prio); flag ++; if (bp) { @@ -2250,12 +2292,12 @@ ico_syc_apc_active(const char *appid) p->next = p2; if (bp2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, dispzone[i].req->conf->appid, + p->appid, dispzone[i].req->appid, dispzone[i].req->prio); bp2->next = p; } else { - if ((p2->conf != appconf) && + if (appconf && (strcmp(p2->appid, appconf->appid) != 0) && ((p2->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { change_disprequest(p2, 0); } @@ -2268,7 +2310,7 @@ ico_syc_apc_active(const char *appid) } if (! p2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, dispzone[i].req->conf->appid, + p->appid, dispzone[i].req->appid, dispzone[i].req->prio); if (bp2) { bp2->next = p; @@ -2280,7 +2322,7 @@ ico_syc_apc_active(const char *appid) } } else { - apfw_trace("ico_syc_apc_active: app %s is top", p->conf->appid); + apfw_trace("ico_syc_apc_active: app %s is top", p->appid); } } } @@ -2312,13 +2354,13 @@ ico_syc_apc_active(const char *appid) flag = 0; bp = NULL; while (p) { - if (p->conf == appconf) { + if (appconf && (strcmp(p->appid, appconf->appid) == 0)) { apfw_trace("ico_syc_apc_active: sound %s prio=%08x is %s", - p->conf->appid, p->prio, bp ? "not top" : "top"); + p->appid, p->prio, bp ? "not top" : "top"); if ((p->prio & ICO_UXF_PRIO_ACTIVEAPP) != ICO_UXF_PRIO_ACTIVEAPP) { p->prio |= ICO_UXF_PRIO_ACTIVEAPP; apfw_trace("ico_syc_apc_active: cgange active %s prio to %08x", - p->conf->appid, p->prio); + p->appid, p->prio); flag ++; if (bp) { @@ -2330,12 +2372,12 @@ ico_syc_apc_active(const char *appid) p->next = p2; if (bp2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, soundzone[i].req->conf->appid, + p->appid, soundzone[i].req->appid, soundzone[i].req->prio); bp2->next = p; } else { - if ((p2->conf != appconf) && + if (appconf && (strcmp(p2->appid, appconf->appid) != 0) && ((p2->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { change_soundrequest(p2, 0); } @@ -2348,7 +2390,7 @@ ico_syc_apc_active(const char *appid) } if (! p2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, soundzone[i].req->conf->appid, + p->appid, soundzone[i].req->appid, soundzone[i].req->prio); if (bp2) { bp2->next = p; @@ -2360,7 +2402,7 @@ ico_syc_apc_active(const char *appid) } } else { - apfw_trace("ico_syc_apc_active: app %s is top", p->conf->appid); + apfw_trace("ico_syc_apc_active: app %s is top", p->appid); } } } @@ -2392,11 +2434,11 @@ ico_syc_apc_active(const char *appid) flag = 0; bp = NULL; while (p) { - if (p->conf == appconf) { + if (appconf && (strcmp(p->appid, appconf->appid) == 0)) { if ((p->prio & ICO_UXF_PRIO_ACTIVEAPP) != ICO_UXF_PRIO_ACTIVEAPP) { p->prio |= ICO_UXF_PRIO_ACTIVEAPP; apfw_trace("ico_syc_apc_active: cgange active %s prio to %08x", - p->conf->appid, p->prio); + p->appid, p->prio); flag ++; if (bp) { @@ -2408,12 +2450,12 @@ ico_syc_apc_active(const char *appid) p->next = p2; if (bp2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, inputsw[i].req->conf->appid, + p->appid, inputsw[i].req->appid, inputsw[i].req->prio); bp2->next = p; } else { - if ((p2->conf != appconf) && + if (appconf && (strcmp(p2->appid, appconf->appid) != 0) && ((p2->state & ICO_APC_REQSTATE_WAITREQ) == 0)) { change_inputrequest(p2, 0); } @@ -2426,7 +2468,7 @@ ico_syc_apc_active(const char *appid) } if (! p2) { apfw_trace("ico_syc_apc_active: %s is not top=%s(%08x)", - p->conf->appid, inputsw[i].req->conf->appid, + p->appid, inputsw[i].req->appid, inputsw[i].req->prio); if (bp2) { bp2->next = p; @@ -2438,7 +2480,7 @@ ico_syc_apc_active(const char *appid) } } else { - apfw_trace("ico_syc_apc_active: app %s is top", p->conf->appid); + apfw_trace("ico_syc_apc_active: app %s is top", p->appid); } } } @@ -2473,6 +2515,10 @@ ico_syc_apc_active(const char *appid) for (i = 0; i < input; i++) { recalc_inputsw(reqinput[i]); } + if (child_appid) { + apfw_trace("ico_syc_apc_active: active child app(%s)", child_appid); + ico_syc_apc_active(child_appid); + } apfw_trace("ico_syc_apc_active: Leave"); } @@ -2495,7 +2541,7 @@ app_display_hook(const char *appid, const int surface, const int object) Ico_Uxf_conf_application *appconf; ico_apc_request_t *req; - apfw_trace("app_display_hook: Enter(%s,%x,%x)", appid, surface, object); + apfw_trace("app_display_hook: Enter(%s,%08x,%x)", appid, surface, object); appconf = (Ico_Uxf_conf_application *)ico_uxf_getAppByAppid(appid); if (! appconf) { @@ -2516,7 +2562,7 @@ app_display_hook(const char *appid, const int surface, const int object) for (i = 0; i < ndispzone; i++) { req = dispzone[i].req; while (req) { - if ((req->conf == appconf) && + if ((strcmp(req->appid, appconf->appid) == 0) && (req->resid == ICO_APF_RESID_BASIC_SCREEN)) break; req = req->next; } @@ -2526,16 +2572,18 @@ app_display_hook(const char *appid, const int surface, const int object) apfw_trace("app_display_hook: app(%s) requested display, Nop", appid); } else { - apfw_trace("app_display_hook: app(%s) not requested display, set default", - appid); + apfw_trace("app_display_hook: app(%s) not requested display, set default[%s]", + appid, + confsys->display[appconf->display[0].displayId]. + zone[appconf->display[0].zoneId].name); req = get_freereq(); if (req) { - req->conf = appconf; + strncpy(req->appid, appconf->appid, ICO_UXF_MAX_PROCESS_NAME); req->resid = ICO_APF_RESID_BASIC_SCREEN; req->reqtype = ICO_APC_REQTYPE_CREATE; strcpy(req->device, - confsys->display[confsys->misc.default_displayId]. - zone[confsys->misc.default_dispzoneId].name); + confsys->display[appconf->display[0].displayId]. + zone[appconf->display[0].zoneId].name); app_getdisplay(req, 0); } } @@ -2546,7 +2594,7 @@ app_display_hook(const char *appid, const int surface, const int object) for (i = 0; i < ndispzone; i++) { req = dispzone[i].req; while (req) { - if (req->conf == appconf) { + if (strcmp(req->appid, appconf->appid) == 0) { reqsave[count++] = req; } req = req->next; @@ -2652,7 +2700,7 @@ ico_syc_apc_init(ico_apc_resource_control_t display, ico_apc_resource_control_t apfw_error("ico_syc_apc_init: Leave(No Memory)"); return ICO_SYC_ENOMEM; } - memset(soundzone, 0, sizeof(ico_apc_dispzone_t) * nsoundzone); + memset(soundzone, 0, sizeof(ico_apc_soundzone_t) * nsoundzone); count = 0; for (i = 0; i < confsys->soundNum; i++) { base_count = count; @@ -2705,16 +2753,16 @@ ico_syc_apc_init(ico_apc_resource_control_t display, ico_apc_resource_control_t } /* initialize request table */ - ico_apc_request_t *req = malloc(sizeof(ico_apc_request_t) * 50); + ico_apc_request_t *req = malloc(sizeof(ico_apc_request_t) * INIT_REQCB); ico_apc_request_t *breq; if (! req) { ico_apps_controller_init = 0; apfw_error("ico_syc_apc_init: Leave(No Memory)"); return ICO_SYC_ENOMEM; } - memset(req, 0, sizeof(ico_apc_request_t) * 50); + memset(req, 0, sizeof(ico_apc_request_t) * INIT_REQCB); free_request = req; - for (count = 1; count < 50; count++) { + for (count = 1; count < INIT_REQCB; count++) { breq = req; req ++; breq->next = req; diff --git a/apps_controller/ico_syc_apc_private.h b/apps_controller/ico_syc_apc_private.h index d3eb1d7..390bb6b 100644 --- a/apps_controller/ico_syc_apc_private.h +++ b/apps_controller/ico_syc_apc_private.h @@ -35,7 +35,8 @@ extern "C" { /* request information */ typedef struct _ico_apc_request { struct _ico_apc_request *next; /* requestt list link */ - Ico_Uxf_conf_application *conf; /* application configuration */ + char appid[ICO_UXF_MAX_PROCESS_NAME+1]; + /* application id */ ico_apf_resid_e resid; /* resource id */ char device[ICO_UXF_MAX_DEVICE_NAME+1]; /* request device */ diff --git a/apps_controller/ico_syc_apc_regulation.c b/apps_controller/ico_syc_apc_regulation.c index 2b058c8..3a11a4a 100644 --- a/apps_controller/ico_syc_apc_regulation.c +++ b/apps_controller/ico_syc_apc_regulation.c @@ -28,6 +28,7 @@ #include #include #include "ico_apf.h" +#include "ico_uxf.h" #include "ico_syc_apc.h" #include "ico_syc_apc_private.h" @@ -35,8 +36,9 @@ /* static tables */ /*==============================================================================*/ /* callback function */ -static ico_apc_regulation_cb_t regulation_cb = NULL; -static void *regulation_cb_user_data = NULL; +static int nregulation_cb = 0; +static ico_apc_regulation_cb_t regulation_cb[ICO_SYC_APC_REGULATION_LISTENERS]; +static void *regulation_cb_user_data[ICO_SYC_APC_REGULATION_LISTENERS]; /* Ecore/D-Bus static valiables */ static Ecore_Timer *vehicle_timer = NULL; @@ -54,8 +56,15 @@ static const struct _vehicle_info_property { "/org/automotive/runningstatus/vehicleSpeed", "org.automotive.vehicleSpeed" }, { ICO_SYC_VEHICLEINFO_SHIFT_POSITION, "ShiftPosition", "/org/automotive/runningstatus/transmission", "org.automotive.transmission" }, +#if 0 /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ { ICO_SYC_VEHICLEINFO_TURN_SIGNAL, "TurnSignal", "/org/automotive/runningstatus/turnSignal", "org.automotive.turnSignal" }, +#else /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ + { ICO_SYC_VEHICLEINFO_LIGHT_LEFT, "LeftTurn", + "/org/automotive/runningstatus/lightStatus", "org.automotive.lightStatus" }, + { ICO_SYC_VEHICLEINFO_LIGHT_RIGHT, "RightTurn", + "/org/automotive/runningstatus/lightStatus", "org.automotive.lightStatus" }, +#endif /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ { 0, "\0", "\0", "\0" } }; @@ -103,8 +112,6 @@ request_vehicle_info(void) vehicle_data[idx].key = vehicle_info[idx].key; if (vehicle_data[idx].pending) { - apfw_trace("request_vehicle_info: (%s) not complite", - vehicle_info[idx].property); continue; } @@ -193,8 +200,6 @@ get_vehicle_info(void) continue; } if (! dbus_pending_call_get_completed(vehicle_data[idx].pending)) { - apfw_trace("get_vehicle_info: (%s) NOT complite", - vehicle_info[idx].property); continue; } @@ -254,6 +259,11 @@ get_vehicle_info(void) vehicle_info[idx].property, ((int)type) & 0x0ff); break; } +#if 0 /* too many logout, change to comment */ + apfw_trace("get_vehicle_info: %s = %d", + vehicle_info[idx].property, (int)vehicle_data[idx].val); +#endif /* too many logout, change to comment */ + /* free message and pending */ dbus_message_unref(dbus_message); dbus_pending_call_unref(vehicle_data[idx].pending); @@ -274,11 +284,15 @@ static Eina_Bool rule_engine_wake(void *user_data) { int idx; + int i; ico_apc_reguration_control_t wkcontrol[ICO_UXF_CATEGORY_MAX]; ico_apc_reguration_control_t change; double VehicleSpeed = 0.0; - int ShiftPosition = 0; - int Blinker = 0; + int ShiftPosition = ICO_SYC_APC_REGULATION_SHIFT_NEUTRALS; + int Blinker = ICO_SYC_APC_REGULATION_BLINKER_NONE; + + /* call UX-FW timer */ + ico_uxf_timer_wake(100); memset(wkcontrol, 0, sizeof(ico_apc_reguration_control_t) * ncategory); @@ -293,9 +307,32 @@ rule_engine_wake(void *user_data) else if (vehicle_data[idx].key == ICO_SYC_VEHICLEINFO_SHIFT_POSITION) { ShiftPosition = (int)vehicle_data[idx].val; } +#if 0 /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ else if (vehicle_data[idx].key == ICO_SYC_VEHICLEINFO_TURN_SIGNAL) { Blinker = (int)vehicle_data[idx].val; } +#else /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ + else if (vehicle_data[idx].key == ICO_SYC_VEHICLEINFO_LIGHT_LEFT) { + if (vehicle_data[idx].val == 0.0) { + if (Blinker == ICO_SYC_APC_REGULATION_BLINKER_LEFT) { + Blinker = ICO_SYC_APC_REGULATION_BLINKER_NONE; + } + } + else { + Blinker = ICO_SYC_APC_REGULATION_BLINKER_LEFT; + } + } + else if (vehicle_data[idx].key == ICO_SYC_VEHICLEINFO_LIGHT_RIGHT) { + if (vehicle_data[idx].val == 0.0) { + if (Blinker == ICO_SYC_APC_REGULATION_BLINKER_RIGHT) { + Blinker = ICO_SYC_APC_REGULATION_BLINKER_NONE; + } + } + else { + Blinker = ICO_SYC_APC_REGULATION_BLINKER_RIGHT; + } + } +#endif /* use LightStatus, because AMB not support access of TurnSignal by D-Bus */ } /* Make control code */ @@ -334,7 +371,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_LEFT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_LEFT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].display = ICO_SYC_APC_REGULATION_REGULATION; else @@ -342,7 +378,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_RIGHT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_RIGHT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].display = ICO_SYC_APC_REGULATION_REGULATION; else @@ -384,7 +419,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_LEFT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_LEFT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].sound = ICO_SYC_APC_REGULATION_REGULATION; else @@ -392,7 +426,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_RIGHT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_RIGHT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].sound = ICO_SYC_APC_REGULATION_REGULATION; else @@ -434,7 +467,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_LEFT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_LEFT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].input = ICO_SYC_APC_REGULATION_REGULATION; else @@ -442,7 +474,6 @@ rule_engine_wake(void *user_data) break; case ICO_UXF_POLICY_BLINKER_RIGHT: if ((Blinker != ICO_SYC_APC_REGULATION_BLINKER_RIGHT) || - (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_PARKING) || (ShiftPosition == ICO_SYC_APC_REGULATION_SHIFT_REVERSES)) wkcontrol[idx].input = ICO_SYC_APC_REGULATION_REGULATION; else @@ -464,7 +495,7 @@ rule_engine_wake(void *user_data) control[idx].sound, wkcontrol[idx].sound, control[idx].input, wkcontrol[idx].input); - if (regulation_cb) { + if (nregulation_cb > 0) { if (control[idx].display != wkcontrol[idx].display) change.display = wkcontrol[idx].display; else @@ -478,7 +509,9 @@ rule_engine_wake(void *user_data) else change.input = ICO_SYC_APC_REGULATION_NOCHANGE; - (*regulation_cb)(idx, change, regulation_cb_user_data); + for (i = 0; i < nregulation_cb; i++) { + (*regulation_cb[i])(idx, change, regulation_cb_user_data[i]); + } } control[idx].display = wkcontrol[idx].display; control[idx].sound = wkcontrol[idx].sound; @@ -589,13 +622,27 @@ ico_syc_apc_regulation_listener(ico_apc_regulation_cb_t func, void *user_data) { int idx; - regulation_cb = func; - regulation_cb_user_data = user_data; + if (func == NULL) { + nregulation_cb = 0; + return; + } - if (regulation_cb) { - for (idx = 0; idx < ncategory; idx++) { - (*regulation_cb)(idx, control[idx], regulation_cb_user_data); + for (idx = 0; idx < nregulation_cb; idx++) { + if (regulation_cb[idx] == func) break; + } + if (idx >= nregulation_cb) { + if (nregulation_cb >= ICO_SYC_APC_REGULATION_LISTENERS) { + apfw_error("ico_syc_apc_regulation_listener: Too many listeners"); + return; } + idx = nregulation_cb; + nregulation_cb ++; + } + regulation_cb[idx] = func; + regulation_cb_user_data[idx] = user_data; + + for (idx = 0; idx < ncategory; idx++) { + (*func)(idx, control[idx], user_data); } } diff --git a/configure.ac b/configure.ac index 4faae62..f8d94ba 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,12 @@ AUL_LIBS="$AUL_LIBS $AIL_LIBS $BUNDLE_LIBS" AC_SUBST(AUL_CFLAGS) AC_SUBST(AUL_LIBS) +PKG_CHECK_MODULES([SLPPKGMGR], [pkgmgr]) +SLPPKGMGR_CFLAGS="$SLPPKGMGR_CFLAGS" +SLPPKGMGR_LIBS="$SLPPKGMGR_LIBS" +AC_SUBST(SLPPKGMGR_CFLAGS) +AC_SUBST(SLPPKGMGR_LIBS) + PKG_CHECK_MODULES([WAYLANDCLIENT], [wayland-client]) PKG_CHECK_MODULES([WAYLANDCURSOR], [wayland-cursor]) WL_CFLAGS="$WAYLANDCLIENT_CFLAGS $WAYLANDCURSOR_CFLAGS" diff --git a/ico-app-framework/Makefile.am b/ico-app-framework/Makefile.am index f1aa819..9334c3b 100644 --- a/ico-app-framework/Makefile.am +++ b/ico-app-framework/Makefile.am @@ -7,8 +7,9 @@ lib_LTLIBRARIES = libico-app-fw.la \ # ico_apf_resource_control.h \ # ico_apf_ecore.h -libico_app_fw_la_CFLAGS = -I../include -I/usr/include/ico-uxf-weston-plugin $(AUL_CFLAGS) @GLIB_CFLAGS@ -libico_app_fw_la_LDFLAGS = -version-info 0:5:0 +libico_app_fw_la_CFLAGS = -I../include -I/usr/include/ico-uxf-weston-plugin $(AUL_CFLAGS) $(SLPPKGMGR_CFLAGS) @GLIB_CFLAGS@ +libico_app_fw_la_LIBADD = $(WL_LIBS) $(AUL_LIBS) $(SLPPKGMGR_LIBS) @GLIB_LIBS@ +libico_app_fw_la_LDFLAGS = -version-info 0:5:0 libico_app_fw_la_SOURCES = \ ico_uxf_conf_common.c \ ico_uxf_conf_sys.c \ @@ -22,17 +23,19 @@ libico_app_fw_la_SOURCES = \ ico_apf_resource_control.c \ ico_apf_appmgr.c -libico_app_fw_efl_la_CFLAGS = -I../include $(EFL_CFLAGS) @GLIB_CFLAGS@ +libico_app_fw_efl_la_CFLAGS = -I../include -I/usr/include/ico-uxf-weston-plugin $(EFL_CFLAGS) @GLIB_CFLAGS@ +libico_app_fw_efl_la_LIBADD = $(WL_LIBS) $(EFL_LIBS) @GLIB_LIBS@ libico_app_fw_efl_la_LDFLAGS = -version-info 0:5:0 libico_app_fw_efl_la_SOURCES = \ - ico_apf_ecore.c + ico_apf_ecore.c \ + ico_uxf_conf_ecore.c AM_CFLAGS = $(GCC_CFLAGS) AM_CPPFLAGS = $(GCC_CFLAGS) \ -DDATADIR='"$(datadir)"' \ -DMODULEDIR='"$(moduledir)"' \ -DLIBEXECDIR='"$(libexecdir)"' -AM_LDFLAGS = -module -avoid-version -rpath $(libdir) -lwayland-egl -lEGL -lGLESv2 +AM_LDFLAGS = -module -avoid-version -rpath $(libdir) -lwayland-egl -lEGL -lGLESv2 .FORCE : diff --git a/ico-app-framework/Makefile.am.bk b/ico-app-framework/Makefile.am.bk new file mode 100644 index 0000000..0fb7db8 --- /dev/null +++ b/ico-app-framework/Makefile.am.bk @@ -0,0 +1,41 @@ +lib_LTLIBRARIES = libico-app-fw.la \ + libico-app-fw-efl.la + +#include_HEADERS = \ +# ico_apf.h \ +# ico_apf_error.h \ +# ico_apf_resource_control.h \ +# ico_apf_ecore.h + +libico_app_fw_la_CFLAGS = -I../include -I/usr/include/ico-uxf-weston-plugin $(AUL_CFLAGS) $(SLPPKGMGR_CFLAGS) @GLIB_CFLAGS@ +libico_app_fw_la_LIBADD = $(AUL_LIBS) $(SLPPKGMGR_LIBS) @GLIB_LIBS@ +libico_app_fw_la_LDFLAGS = -version-info 0:5:0 +libico_app_fw_la_SOURCES = \ + ico_uxf_conf_common.c \ + ico_uxf_conf_sys.c \ + ico_uxf_conf_app.c \ + ico_uxf_init.c \ + ico_uxf_launcher.c \ + ico_uxf_window.c \ + ico_uxf_inputdev.c \ + ico_apf_log.c \ + ico_apf_communication.c \ + ico_apf_resource_control.c \ + ico_apf_appmgr.c + +libico_app_fw_efl_la_CFLAGS = -I../include -I/usr/include/ico-uxf-weston-plugin $(EFL_CFLAGS) @GLIB_CFLAGS@ +libico_app_fw_efl_la_LIBADD = $(EFL_LIBS) @GLIB_LIBS@ +libico_app_fw_efl_la_LDFLAGS = -version-info 0:5:0 +libico_app_fw_efl_la_SOURCES = \ + ico_apf_ecore.c \ + ico_uxf_conf_ecore.c + +AM_CFLAGS = $(GCC_CFLAGS) +AM_CPPFLAGS = $(GCC_CFLAGS) \ + -DDATADIR='"$(datadir)"' \ + -DMODULEDIR='"$(moduledir)"' \ + -DLIBEXECDIR='"$(libexecdir)"' +AM_LDFLAGS = -module -avoid-version -rpath $(libdir) -lwayland-egl -lEGL -lGLESv2 + +.FORCE : + diff --git a/ico-app-framework/ico_uxf_conf_app.c b/ico-app-framework/ico_uxf_conf_app.c index e35d776..310ad7b 100644 --- a/ico-app-framework/ico_uxf_conf_app.c +++ b/ico-app-framework/ico_uxf_conf_app.c @@ -23,19 +23,51 @@ #include #include +#include + #include "ico_apf_log.h" #include "ico_apf_apimacro.h" #include "ico_uxf_conf_common.h" +/*==============================================================================*/ +/* define */ +/*==============================================================================*/ #define APP_CONF_AIL_NULL_STR "(null)" +#define APP_CONF_EVENT_OK (0) +#define APP_CONF_EVENT_FAIL (1) + +typedef struct _conf_pkgmgr_event conf_pkgmgr_event_t; + +struct _conf_pkgmgr_event { + conf_pkgmgr_event_t *next; + char pkg_name[ICO_UXF_MAX_PROCESS_NAME]; + int type; +}; + +/*==============================================================================*/ +/* define static function prototype */ +/*==============================================================================*/ static Ico_Uxf_App_Config *readAilApplist(void); -static void Ico_Uxf_conf_remakeAppHash(void); +static void ico_uxf_conf_remakeAppHash(void); +static int ico_uxf_conf_pkgmgrEvent(int req_id, const char *pkg_type, + const char *pkg_name, const char *key, const char *val, + const void *pmsg, void *data); +static int ico_uxf_conf_addPkgmgrEventListener(void); +static int ico_uxf_conf_startEvent(const char *pkg_name, int type); +static int ico_uxf_conf_endEvent(const char *pkg_name, int status); +/*==============================================================================*/ +/* static tables */ +/*==============================================================================*/ static Ico_Uxf_App_Config *_ico_app_config = NULL; +static Ico_Uxf_App_Config *_ico_app_config_update = NULL; static Ico_Uxf_Sys_Config *sys_config = NULL; static GKeyFile *sappfile = NULL; +static pkgmgr_client *conf_pc = NULL; +static conf_pkgmgr_event_t *conf_prog_event = NULL; +static Ico_Uxf_AppUpdata_Cb conf_cb_func = NULL; /*--------------------------------------------------------------------------*/ /** @@ -54,6 +86,7 @@ ico_uxf_getAppConfig(void) return _ico_app_config; } _ico_app_config = g_new0(Ico_Uxf_App_Config,1); + _ico_app_config_update = _ico_app_config; return readAilApplist(); } @@ -86,6 +119,8 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) struct stat buff; Ico_Uxf_conf_application *apptbl; + _ico_app_config_update->ailNum++; + /* get package name for appid */ ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package); if (strcmp(package, APP_CONF_AIL_NULL_STR) == 0) { @@ -169,7 +204,7 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) } if ((package != NULL) && (*package != 0)) { - apptbl = &_ico_app_config->application[_ico_app_config->applicationNum]; + apptbl = &_ico_app_config_update->application[_ico_app_config_update->applicationNum]; apptbl->appid = strdup(package); if (icon) { apptbl->icon_key_name = strdup(icon); @@ -188,6 +223,7 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) apptbl->hostId = sys_config->misc.default_hostId; apptbl->kindId = sys_config->misc.default_kindId; apptbl->categoryId = sys_config->misc.default_categoryId; + apptbl->invisiblecpu = 100; /* get NoDisplay */ if ((icon != NULL) && (*icon != 0)) { @@ -211,7 +247,7 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) Ico_Uxf_conf_sound *sound; char work[64]; - apfw_trace("Ail.%d category=%s", _ico_app_config->applicationNum, category); + apfw_trace("Ail.%d category=%s", _ico_app_config_update->applicationNum, category); j = 0; for (i = 0;; i++) { @@ -557,12 +593,43 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) apfw_error("infoAilpkg: [%s] unknown input", work); } + /* NoDisplay */ + if ((found == 0) && (work[0] != 0)) { + if (strncasecmp(work, "NoDisplay", 9) == 0) { + apptbl->noicon = 1; + if (work[9] == '=') { + if (strcasecmp(&work[10], "false") == 0) { + apptbl->noicon = 0; + } + } + found = 9; + } + } + + /* cpu % at invisible */ + if ((found == 0) && (work[0] != 0)) { + if (strncasecmp(work, "invisiblecpu", 12) == 0) { + apptbl->invisiblecpu = 0; + if (work[12] == '=') { + if (strcasecmp(&work[13], "yes") == 0) { + apptbl->invisiblecpu = 100; + } + else if (strcasecmp(&work[13], "no") != 0) { + apptbl->invisiblecpu = strtol(&work[13], (char **)0, 0); + if (apptbl->invisiblecpu > 100) + apptbl->invisiblecpu = 100; + } + } + found = 9; + } + } + /* start mode */ if ((found == 0) && (work[0] != 0)) { - if (strcasecmp(work, "auto") == 0) { + if (strcasecmp(work, "autostart") == 0) { apptbl->autostart = 1; } - else if (strcasecmp(work, "noauto") == 0) { + else if (strcasecmp(work, "noautostart") == 0) { apptbl->autostart = 0; } else { @@ -588,20 +655,21 @@ infoAilpkg(const ail_appinfo_h appinfo, void *data) apptbl->sound[0].zoneId = sys_config->misc.default_soundzoneId; } apfw_trace("Ail.%d: appid=%s name=%s exec=%s type=%s", - _ico_app_config->applicationNum, apptbl->appid, apptbl->name, + _ico_app_config_update->applicationNum, apptbl->appid, apptbl->name, apptbl->exec, apptbl->type); apfw_trace("Ail.%d: categ=%d kind=%d disp=%d layer=%d zone=%d " - "sound=%d zone=%d auto=%d noicon=%d", - _ico_app_config->applicationNum, apptbl->categoryId, apptbl->kindId, + "sound=%d zone=%d auto=%d noicon=%d cpu=%d", + _ico_app_config_update->applicationNum, apptbl->categoryId, apptbl->kindId, apptbl->display[0].displayId, apptbl->display[0].layerId, apptbl->display[0].zoneId, apptbl->sound[0].soundId, - apptbl->sound[0].zoneId, apptbl->autostart, apptbl->noicon); - _ico_app_config->applicationNum++; + apptbl->sound[0].zoneId, apptbl->autostart, apptbl->noicon, + apptbl->invisiblecpu); + _ico_app_config_update->applicationNum++; } else { } - if (_ico_app_config->applicationNum > num) + if (_ico_app_config_update->applicationNum > num) return AIL_CB_RET_CANCEL; return AIL_CB_RET_CONTINUE; @@ -624,6 +692,8 @@ readAilApplist(void) ail_filter_h filter; GError *error = NULL; + _ico_app_config_update->applicationNum = 0; + /* get system configuration */ sys_config = (Ico_Uxf_Sys_Config *)ico_uxf_getSysConfig(); if (! sys_config) { @@ -653,43 +723,90 @@ readAilApplist(void) g_key_file_free(sappfile); sappfile = NULL; } + apfw_trace("readAilApplist: Leave(Ail:cannot count appinfo) = %d", ret); return NULL; } apfw_trace("readAilApplist: number of off AIL package = %d", num); ail_filter_new(&filter); ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "menu"); - ail_filter_count_appinfo(filter, &num); + ret = ail_filter_count_appinfo(filter, &num); + if (ret != AIL_ERROR_OK) { + if( sappfile) { + g_key_file_free(sappfile); + sappfile = NULL; + } + apfw_trace("readAilApplist: Leave(Ail:cannot count appinfo(menu)) = %d", ret); + return NULL; + } apfw_trace("readAilApplist: number of menu AIL package = %d", num); ail_filter_destroy(filter); ail_filter_new(&filter); ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "Application"); - ail_filter_count_appinfo(filter, &wnum); + ret = ail_filter_count_appinfo(filter, &wnum); + if (ret != AIL_ERROR_OK) { + if( sappfile) { + g_key_file_free(sappfile); + sappfile = NULL; + } + apfw_trace("readAilApplist: Leave(Ail:cannot count appinfo(Application)) = %d", ret); + return NULL; + } apfw_trace("readAilApplist: number of Application AIL package = %d", wnum); ail_filter_destroy(filter); num += wnum; - _ico_app_config->application = g_new0(Ico_Uxf_conf_application, num); + _ico_app_config_update->application = g_new0(Ico_Uxf_conf_application, num); ail_filter_new(&filter); - ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "menu"); - ail_filter_list_appinfo_foreach(filter, infoAilpkg, (void *)num); + ret = ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "menu"); + ret = ail_filter_list_appinfo_foreach(filter, infoAilpkg, (void *)num); + if (ret != AIL_ERROR_OK) { + if( sappfile) { + g_key_file_free(sappfile); + sappfile = NULL; + } + ail_filter_destroy(filter); + apfw_trace("readAilApplist: Leave(Ail:cannot get appinfo(menu)) = %d", ret); + return NULL; + } ail_filter_destroy(filter); ail_filter_new(&filter); ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "Application"); - ail_filter_list_appinfo_foreach(filter, infoAilpkg, (void *)num); + ret = ail_filter_list_appinfo_foreach(filter, infoAilpkg, (void *)num); + if (ret != AIL_ERROR_OK) { + if( sappfile) { + g_key_file_free(sappfile); + sappfile = NULL; + } + ail_filter_destroy(filter); + apfw_trace("readAilApplist: Leave(Ail:cannot get appinfo(Application)) = %d", ret); + return NULL; + } ail_filter_destroy(filter); + if (_ico_app_config_update->ailNum != num) { + if( sappfile) { + g_key_file_free(sappfile); + sappfile = NULL; + } + apfw_trace("readAilApplist: Leave(cannot read ail correctly %d =! %d", + _ico_app_config_update->ailNum, num); + return NULL; + } + /* create Hash Table */ - Ico_Uxf_conf_remakeAppHash(); + ico_uxf_conf_remakeAppHash(); if( sappfile) { g_key_file_free(sappfile); } + + apfw_trace("readAilApplist: Leave"); - return _ico_app_config; + return _ico_app_config_update; } /*--------------------------------------------------------------------------*/ @@ -712,47 +829,47 @@ ico_uxf_closeAppConfig(void) /*--------------------------------------------------------------------------*/ /** - * @brief Ico_Uxf_conf_remakeAppHash: make application hash table(static function) + * @brief ico_uxf_conf_remakeAppHash: make application hash table(static function) * * @param none * @return none */ /*--------------------------------------------------------------------------*/ static void -Ico_Uxf_conf_remakeAppHash(void) +ico_uxf_conf_remakeAppHash(void) { int i; int hash; Ico_Uxf_conf_application *app; - memset(_ico_app_config->hashnametable, 0, sizeof(_ico_app_config->hashnametable)); + memset(_ico_app_config_update->hashnametable, 0, sizeof(_ico_app_config_update->hashnametable)); - for (i = 0; i < _ico_app_config->applicationNum; i++) { + for (i = 0; i < _ico_app_config_update->applicationNum; i++) { - _ico_app_config->application[i].nextidhash = NULL; + _ico_app_config_update->application[i].nextidhash = NULL; hash = ICO_UXF_MISC_HASHBYID(i); - app = _ico_app_config->hashidtable[hash]; + app = _ico_app_config_update->hashidtable[hash]; if (! app) { - _ico_app_config->hashidtable[hash] = &_ico_app_config->application[i]; + _ico_app_config_update->hashidtable[hash] = &_ico_app_config_update->application[i]; } else { while (app->nextidhash) { app = app->nextidhash; } - app->nextidhash = &_ico_app_config->application[i]; + app->nextidhash = &_ico_app_config_update->application[i]; } - _ico_app_config->application[i].nextnamehash = NULL; - hash = ICO_UXF_MISC_HASHBYNAME(_ico_app_config->application[i].appid); - app = _ico_app_config->hashnametable[hash]; + _ico_app_config_update->application[i].nextnamehash = NULL; + hash = ICO_UXF_MISC_HASHBYNAME(_ico_app_config_update->application[i].appid); + app = _ico_app_config_update->hashnametable[hash]; if (! app) { - _ico_app_config->hashnametable[hash] = &_ico_app_config->application[i]; + _ico_app_config_update->hashnametable[hash] = &_ico_app_config_update->application[i]; } else { while (app->nextnamehash) { app = app->nextnamehash; } - app->nextnamehash = &_ico_app_config->application[i]; + app->nextnamehash = &_ico_app_config_update->application[i]; } } } @@ -858,3 +975,299 @@ ico_uxf_getAppDisplay(const Ico_Uxf_conf_application *app, const int idx, return 0; } +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_conf_addPkgmgrEventListener: + * request to listen the pkgmgr's broadcasting. + * + * @param none + * @return result + * @retval ICO_UXF_EOK success + * @retval ICO_UXF_ENOSYS cannot regist listener + */ +/*--------------------------------------------------------------------------*/ +static int +ico_uxf_conf_addPkgmgrEventListener(void) +{ + int ret; + + if (conf_pc) { + /* already registied listener */ + return ICO_UXF_EOK; + } + + conf_pc = pkgmgr_client_new(PC_LISTENING); + if (conf_pc == NULL) { + apfw_trace("ico_uxf_conf_addPkgmgrEventListener: cannot create pkgmgr client"); + return ICO_UXF_ENOSYS; + } + + ret = pkgmgr_client_listen_status(conf_pc, ico_uxf_conf_pkgmgrEvent, NULL); + if (ret < 0) { + apfw_trace("ico_uxf_conf_addPkgmgrEventListener: " + "cannot register listener of pkgmgr(%d)", ret); + pkgmgr_client_free(conf_pc); + conf_pc = NULL; + return ICO_UXF_ENOSYS; + } + + return ICO_UXF_EOK; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_conf_pkgmgrEvent: + * This is callback function from pkgmgr. + * + * @param[in] req_id request id + * @param[in] pkg_type package type + * @param[in] pkg_name package name + * @param[in] key broadcast key(=start/end/...) + * @param[in] val broadcast value(=install/uninstall/ok/fail) + * @param[in] pmsg broadcast comment + * @param[in] data user data + * @return always 0 + */ +/*--------------------------------------------------------------------------*/ +static int +ico_uxf_conf_pkgmgrEvent(int req_id, const char *pkg_type, const char *pkg_name, + const char *key, const char *val, const void *pmsg, void *data) +{ + apfw_trace("ico_uxf_conf_PkgmgrEvent: " + "Enter(pkg_type=%s, pkg_name=%s, key=%s, val=%s, pmsg=%s)", + pkg_type, pkg_name, key, val, pmsg); + + if (strcasecmp(key, "start") == 0) { + if (strcasecmp(val, "install") == 0) { + ico_uxf_conf_startEvent(pkg_name, ICO_UXF_CONF_EVENT_INSTALL); + } + else if (strcasecmp(val, "uninstall") == 0) { + ico_uxf_conf_startEvent(pkg_name, ICO_UXF_CONF_EVENT_UNINSTALL); + } + } + else if (strcasecmp(key, "install_percent") == 0) { + ico_uxf_conf_startEvent(pkg_name, ICO_UXF_CONF_EVENT_INSTALL); + } + else if (strcasecmp(key, "progress_percent") == 0) { + + } + else if (strcasecmp(key, "error") == 0) { + } + else if (strcasecmp(key, "end") == 0) { + if (strcasecmp(val, "ok") == 0) { + ico_uxf_conf_endEvent(pkg_name, APP_CONF_EVENT_OK); + } + else if (strcasecmp(val, "fail") == 0) { + ico_uxf_conf_endEvent(pkg_name, APP_CONF_EVENT_FAIL); + } + } + + return 0; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_conf_startEvent: mark event is start + * + * @param[in] pkg_name package name + * @param[in] type event type + * @return result + * @retval ICO_UXF_EOK success + * @retval ICO_UXF_ENOMEM cannot allocate memory + */ +/*--------------------------------------------------------------------------*/ +static int +ico_uxf_conf_startEvent(const char *pkg_name, int type) +{ + conf_pkgmgr_event_t *new = NULL; + conf_pkgmgr_event_t *event = NULL; + + /* check the queue whether the package' event is exist */ + event = conf_prog_event; + while (event) { + if (strncmp(event->pkg_name, pkg_name, ICO_UXF_MAX_PROCESS_NAME) == 0) { + new = event; + break; + } + event = event->next; + } + + if (!new) { + new = malloc(sizeof(conf_pkgmgr_event_t)); + if (!new) { + apfw_warn("ico_uxf_conf_startEvent: cannot allocate memory"); + return ICO_UXF_ENOMEM; + } + memset(new, 0, sizeof(new)); + /* insert queue */ + event = conf_prog_event; + while (event) { + if (!event->next) { + break; + } + event = event->next; + } + if (!event) { + conf_prog_event = new; + } + else { + event->next = new; + } + strncpy(new->pkg_name, pkg_name, ICO_UXF_MAX_PROCESS_NAME); + new->type = type; + } + + + + return ICO_UXF_EOK; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_conf_endEvent: mark event is end + * + * @param[in] pkg_name package name + * @param[in] status end status + * @return result + * @retval ICO_UXF_EOK success + */ +/*--------------------------------------------------------------------------*/ +static int +ico_uxf_conf_endEvent(const char *pkg_name, int status) +{ + int type; + int cnt; + int ii, jj; + int exist = 0; + conf_pkgmgr_event_t *current = NULL; + conf_pkgmgr_event_t *event; + conf_pkgmgr_event_t *bevent; + static Ico_Uxf_App_Config *config = NULL; + static Ico_Uxf_App_Config *tmp = NULL; + + apfw_trace("ico_uxf_conf_endEvent: Enter(pkg=%s, stat=%d)", pkg_name, status); + /* get start event from queue */ + event = conf_prog_event; + bevent = NULL; + while (event) { + if (strncmp(event->pkg_name, pkg_name, ICO_UXF_MAX_PROCESS_NAME) == 0) { + current = event; + break; + } + bevent = event; + event = event->next; + } + if (current) { + if (!bevent) { + /* top */ + conf_prog_event = current->next; + current->next = NULL; + } + else { + bevent->next = current->next; + current->next = NULL; + } + } + else { + return ICO_UXF_ENOSYS; + } + + type = current->type; + free(current); + + if (status == APP_CONF_EVENT_OK) { + config = g_new0(Ico_Uxf_App_Config, 1); + _ico_app_config_update = config; + config = readAilApplist(); + cnt = 0; + while (! config) { + usleep(10000); + apfw_trace("ico_uxf_conf_endEvent: Retry %d", cnt); + config = readAilApplist(); + if (cnt > 500) { + break; + } + else { + cnt++; + } + } + if (! config) { + apfw_warn("ico_uxf_getAppByAppid: cannot access ail normally"); + return ICO_UXF_EBUSY; + } + tmp = config; + /* old list */ + config = _ico_app_config; + /* new list */ + _ico_app_config = tmp; + + if (type == ICO_UXF_CONF_EVENT_INSTALL) { + for (ii = 0; ii < _ico_app_config->applicationNum; ii++) { + exist = 0; + for (jj = 0; jj < config->applicationNum; jj++) { + if (strcmp(_ico_app_config->application[ii].appid, + config->application[jj].appid) == 0) { + exist = 1; + break; + } + } + if ((exist == 0) && conf_cb_func) { + conf_cb_func(_ico_app_config->application[ii].appid, + ICO_UXF_CONF_EVENT_INSTALL); + } + } + } + else if (type == ICO_UXF_CONF_EVENT_UNINSTALL) { + for (jj = 0; jj < config->applicationNum; jj++) { + exist = 0; + for (ii = 0; ii < _ico_app_config->applicationNum; ii++) { + if (strcmp(config->application[jj].appid, + _ico_app_config->application[ii].appid) == 0) { + exist = 1; + break; + } + } + if ((exist == 0) && conf_cb_func) { + conf_cb_func(config->application[jj].appid, + ICO_UXF_CONF_EVENT_UNINSTALL); + } + } + } + /* free old list */ + if (config != NULL) { + g_free(config->application); + g_free(config); + } + } + + apfw_trace("ico_uxf_conf_endEvent: Leave"); + + return ICO_UXF_EOK; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_setAppUpdateCb: + * + * @param none + * @return result + * @retval ICO_UXF_EOK success + * @retval ICO_UXF_ENOSYS cannot regist callback + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API int +ico_uxf_conf_setAppUpdateCb(Ico_Uxf_AppUpdata_Cb func) +{ + int ret; + + ret = ico_uxf_conf_addPkgmgrEventListener(); + + if (ret != ICO_UXF_EOK) { + apfw_trace("ico_uxf_conf_setAppUpdateCb: cannot add listener"); + return ICO_UXF_ENOSYS; + } + conf_cb_func = func; + + return ICO_UXF_EOK; +} + diff --git a/ico-app-framework/ico_uxf_conf_ecore.c b/ico-app-framework/ico_uxf_conf_ecore.c new file mode 100644 index 0000000..16a9aeb --- /dev/null +++ b/ico-app-framework/ico_uxf_conf_ecore.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2013, TOYOTA MOTOR CORPORATION. + * + * This program is licensed under the terms and conditions of the + * Apache License, version 2.0. The full text of the Apache License is at + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +/** + * @brief user experiance library(config's callback to Ecore(EFL) application) + * + * @date May-17-2013 + */ + +#include +#include +#include +#include + +#include "ico_apf_log.h" +#include "ico_apf_apimacro.h" +#include "ico_uxf_conf_common.h" +#include "ico_uxf_conf_ecore.h" +#include "ico_uxf_private.h" + +/*==============================================================================*/ +/* define */ +/*==============================================================================*/ +typedef struct _econf_pkgmgr_event econf_pkgmgr_event_t; +typedef struct _econf_cb_func_info econf_cb_func_info_t; + +struct _econf_pkgmgr_event { + char appid[ICO_UXF_MAX_PROCESS_NAME]; + int type; +}; + +struct _econf_cb_func_info { + econf_cb_func_info_t *next; + Ico_Uxf_AppUpdata_Cb func; +}; +/*==============================================================================*/ +/* define static function prototype */ +/*==============================================================================*/ +static void ico_uxf_econf_updateEvent(const char *appid, int type); +static Eina_Bool ico_uxf_econf_ecoreEvent(void *data, int type, void *event); + +/*==============================================================================*/ +/* static tables */ +/*==============================================================================*/ +static int econf_event_type = -1; +static Ecore_Event_Handler *econf_handle = NULL; + +static econf_cb_func_info_t *econf_cb_func = NULL; + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_econf_setAppUpdateCb: + * + * @param none + * @return result + * @retval ICO_UXF_EOK success + * @retval ICO_UXF_ENOSYS cannot regist callback + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API int +ico_uxf_econf_setAppUpdateCb(Ico_Uxf_AppUpdata_Cb func) +{ + econf_cb_func_info_t *func_info; + + if (econf_handle == NULL) { + econf_event_type = ecore_event_type_new(); + + econf_handle = ecore_event_handler_add(econf_event_type, + ico_uxf_econf_ecoreEvent, NULL); + if (econf_handle == NULL) { + apfw_warn("ico_uxf_setAppUpdateCb: cannot add ecore event handler"); + return ICO_UXF_ENOSYS; + } + ico_uxf_conf_setAppUpdateCb(ico_uxf_econf_updateEvent); + } + if (func) { + func_info = malloc(sizeof(econf_cb_func_info_t)); + if (! func_info) { + apfw_warn("ico_uxf_setAppUpdateCb: cannot allocate memory"); + return ICO_UXF_ENOSYS; + } + memset(func_info, 0, sizeof(econf_cb_func_info_t)); + func_info->func = func; + if (! econf_cb_func) { + econf_cb_func = func_info; + } + else { + func_info->next = econf_cb_func; + econf_cb_func = func_info; + } + } + + return ICO_UXF_EOK; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_econf_updateEvent: + * pass configuration change event to ecore event. + * + * @param[in] data data + * @param[in] type type + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +ico_uxf_econf_updateEvent(const char *appid, int type) +{ + econf_pkgmgr_event_t *conf_event; + + apfw_trace("ico_uxf_econf_updateEvent: Enter(appid=%s, type=%d)", appid, type); + + conf_event = malloc(sizeof(econf_pkgmgr_event_t)); + if (!conf_event) { + apfw_warn("ico_uxf_econf_updateEvent: cannot allocate memory"); + return; + } + + strncpy(conf_event->appid, appid, ICO_UXF_MAX_PROCESS_NAME); + conf_event->type = type; + + ecore_event_add(econf_event_type, conf_event, NULL, NULL); + + apfw_trace("ico_uxf_econf_updateEvent: Leave"); + + return; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_econf_ecoreEvent: + * callback function from ecore when change app configuration + * + * @param[in] data data + * @param[in] type type + * @param[in] event event + * @return always ECORE_CALLBACK_PASS_ON + */ +/*--------------------------------------------------------------------------*/ +static Eina_Bool +ico_uxf_econf_ecoreEvent(void *data, int type, void *event) +{ + econf_cb_func_info_t *func_info; + econf_pkgmgr_event_t *conf_event = (econf_pkgmgr_event_t *)event; + apfw_trace("ico_uxf_econf_ecoreEvent: Enter(ev=%08x)", (unsigned int)event); + + if (conf_event) { + ico_uxf_update_procwin(conf_event->appid, conf_event->type); + func_info = econf_cb_func; + while (func_info) { + if (func_info->func) { + apfw_trace("ico_uxf_econf_ecoreEvent: func=%08x", (unsigned int)func_info->func); + func_info->func(conf_event->appid, conf_event->type); + } + func_info = func_info->next; + } + } + + apfw_trace("ico_uxf_econf_ecoreEvent: Leave"); + + return ECORE_CALLBACK_DONE; +} + diff --git a/ico-app-framework/ico_uxf_init.c b/ico-app-framework/ico_uxf_init.c index a394d94..fa1721e 100644 --- a/ico-app-framework/ico_uxf_init.c +++ b/ico-app-framework/ico_uxf_init.c @@ -155,6 +155,7 @@ ico_uxf_init(const char *name) gIco_Uxf_Api_Mng.EventMask = 0; gIco_Uxf_Api_Mng.WaylandFd = -1; gIco_Uxf_Api_Mng.Wayland_Display = NULL; + gIco_Uxf_Api_Mng.InitTimer = ICO_UXF_SUSP_INITTIME; /* read configurations */ sysconf = (Ico_Uxf_Sys_Config *)ico_uxf_getSysConfig(); @@ -201,6 +202,9 @@ ico_uxf_init(const char *name) prc->attr.type = appconf->application[dn].categoryId; prc->attr.hostId = appconf->application[dn].hostId; prc->attr.myHost = (prc->attr.hostId == sysconf->misc.myhostId) ? 1 : 0; + prc->attr.noicon = appconf->application[dn].noicon; + prc->attr.autostart = appconf->application[dn].autostart; + prc->attr.invisiblecpu = appconf->application[dn].invisiblecpu; appdsp = &appconf->application[dn].display[0]; prc->attr.mainwin.window = 0; @@ -936,16 +940,13 @@ ico_uxf_window_visiblecb(void *data, struct ico_window_mgr *ico_window_mgr, int ovisible; int oraise; - uifw_trace("ico_uxf_window_visiblecb: Enter(surf=%08x vis=%d raise=%d hint=%d)", - (int)surfaceid, visible, raise, hint); - ico_uxf_enter_critical(); win = ico_uxf_mng_window(surfaceid, 0); if (!win) { ico_uxf_leave_critical(); - uifw_trace("ico_uxf_window_visiblecb: Leave(Surface=%08x dose not exist)", + uifw_trace("ico_uxf_window_visiblecb: Surface=%08x dose not exist", (int)surfaceid); return; } @@ -985,7 +986,6 @@ ico_uxf_window_visiblecb(void *data, struct ico_window_mgr *ico_window_mgr, } } ico_uxf_leave_critical(); - uifw_trace("ico_uxf_window_visiblecb: Leave"); } /*--------------------------------------------------------------------------*/ @@ -1015,8 +1015,8 @@ ico_uxf_window_configurecb(void *data, struct ico_window_mgr *ico_window_mgr, int display; Ico_Uxf_Mng_Process *prc; - uifw_trace("ico_uxf_window_configurecb: Enter(surf=%08x app=%s layer=%d " - "x/y=%d/%d w/h=%d/%d hint=%d)", + uifw_trace("ico_uxf_window_configurecb: surf=%08x app=%s layer=%d " + "x/y=%d/%d w/h=%d/%d hint=%d", (int)surfaceid, appid, layer, x, y, width, height, hint); ico_uxf_enter_critical(); @@ -1040,6 +1040,7 @@ ico_uxf_window_configurecb(void *data, struct ico_window_mgr *ico_window_mgr, hint = 0; prc = ico_uxf_mng_process(appid, 0); + win->mng_process = prc; if ((prc != NULL) && (prc->attr.mainwin.window != (int)surfaceid)) { /* sub-window */ win->attr.subwindow = 1; @@ -1091,19 +1092,23 @@ ico_uxf_window_configurecb(void *data, struct ico_window_mgr *ico_window_mgr, ico_uxf_regist_eventque(que); } - win->attr.x = x; - win->attr.y = y; - win->attr.w = width; - win->attr.h = height; - if (win->attr.layer != layer) { - win->attr.layer = layer; - win->mng_layer = ico_uxf_mng_layer(win->mng_display->attr.display, - layer, 0); + if (hint == 0) { + win->attr.x = x; + win->attr.y = y; + win->attr.w = width; + win->attr.h = height; + if (win->attr.layer != layer) { + win->attr.layer = layer; + win->mng_layer = ico_uxf_mng_layer(win->mng_display->attr.display, + layer, 0); + } + } + else if ((win->attr.w != width) || (win->attr.h != height)) { + (void)ico_uxf_window_resize(win->attr.window, win->attr.w, win->attr.h); } } } ico_uxf_leave_critical(); - uifw_trace("ico_uxf_window_configurecb: Leave"); } /*--------------------------------------------------------------------------*/ @@ -1384,10 +1389,13 @@ ico_uxf_aul_aulcb(int pid, void *data) dead = (int)data; memset(appid, 0, sizeof(appid)); - (void) aul_app_get_appid_bypid(pid, appid, sizeof(appid)); - - uifw_trace("ico_uxf_aul_aulcb: Enter(pid=%d, dead=%d, appid=%s)", pid, dead, appid); - + if (dead == 0) { + (void) aul_app_get_appid_bypid(pid, appid, sizeof(appid)); + uifw_trace("ico_uxf_aul_aulcb: Enter(pid=%d, dead=No, appid=%s)", pid, appid); + } + else { + uifw_trace("ico_uxf_aul_aulcb: Enter(pid=%d, dead=Yes)", pid); + } for (hash = 0; hash < ICO_UXF_MISC_HASHSIZE; hash++) { proc = gIco_Uxf_Api_Mng.Hash_ProcessId[hash]; while (proc) { @@ -1428,8 +1436,13 @@ ico_uxf_aul_aulcb(int pid, void *data) proc->attr.internalid = pid; if (proc->attr.status != ICO_UXF_PROCSTATUS_INIT) { /* child process, search parent process */ - uifw_trace("ico_uxf_aul_aulcb: fork&exec %s", proc->attr.process); + uifw_trace("ico_uxf_aul_aulcb: fork&exec %s(proc=%08x, last=%08x)", + proc->attr.process, (unsigned int)proc, (unsigned int)gIco_Uxf_Api_Mng.Mng_LastProcess); proc->attr.child = 1; + /* save parent application if exist */ + if (proc != gIco_Uxf_Api_Mng.Mng_LastProcess) { + proc->parent = gIco_Uxf_Api_Mng.Mng_LastProcess; + } } else { proc->attr.child = 0; @@ -1449,6 +1462,119 @@ ico_uxf_aul_aulcb(int pid, void *data) /*--------------------------------------------------------------------------*/ /** + * @brief ico_uxf_set_lastapp: save last application + * + * @param[in] appid applicationId (if NULL, no last application) + * @return none + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API void +ico_uxf_set_lastapp(const char *appid) +{ + if (appid) { + uifw_trace("ico_uxf_set_lastapp: set last app %s", appid); + gIco_Uxf_Api_Mng.Mng_LastProcess = ico_uxf_mng_process(appid, 0); + } + else { + uifw_trace("ico_uxf_set_lastapp: set last app NULL"); + gIco_Uxf_Api_Mng.Mng_LastProcess = NULL; + } +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_getchild_appid: get child applicationId + * + * @param[in] appid parent applicationId + * @return last child applicationId + * @retval !=NULL success(applicationId) + * @retval ==NULL no child application + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API char * +ico_uxf_getchild_appid(const char *appid) +{ + Ico_Uxf_Mng_Process *pproc; + Ico_Uxf_Mng_Process *proc; + int hash; + + pproc = ico_uxf_mng_process(appid, 0); + if (! pproc) { + /* unknown parent application, no child */ + uifw_trace("ico_uxf_getchild_appid: Unknown parent(%s)", appid); + return NULL; + } + + /* search parent */ + for (hash = 0; hash < ICO_UXF_MISC_HASHSIZE; hash++) { + proc = gIco_Uxf_Api_Mng.Hash_ProcessId[hash]; + while (proc) { + if (proc->parent == pproc) { + uifw_trace("ico_uxf_getchild_appid: child(%s) parent(%s)", + proc->attr.process, appid); + return proc->attr.process; + } + proc = proc->nextidhash; + } + } + uifw_trace("ico_uxf_getchild_appid: parent(%s) has no child", appid); + return NULL; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_set_lastapp: save last application + * + * @param[in] appid applicationId (if NULL, no last application) + * @return none + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API void +ico_uxf_timer_wake(const int msec) +{ + Ico_Uxf_Mng_Process *proc; + int hash; + + if (gIco_Uxf_Api_Mng.InitTimer > 0) { + gIco_Uxf_Api_Mng.InitTimer -= msec; + if (gIco_Uxf_Api_Mng.InitTimer > 0) { + return; + } + gIco_Uxf_Api_Mng.InitTimer = 0; + } + + if (gIco_Uxf_Api_Mng.NeedTimer == 0) { + return; + } + gIco_Uxf_Api_Mng.NeedTimer = 0; + + for (hash = 0; hash < ICO_UXF_MISC_HASHSIZE; hash++) { + proc = gIco_Uxf_Api_Mng.Hash_ProcessId[hash]; + while (proc) { + if (proc->susptimer > 0) { + if (msec >= proc->susptimer) { + proc->susptimer = 0; + if (proc->attr.suspend) { + if (proc->susp == 0) { + proc->susp = 1; + uifw_trace("ico_uxf_timer_wake: CPU suspend pid=%d", + proc->attr.internalid); + kill(proc->attr.internalid, SIGSTOP); + } + } + } + else { + proc->susptimer -= msec; + gIco_Uxf_Api_Mng.NeedTimer ++; + } + } + proc = proc->nextidhash; + } + } +} + +/*--------------------------------------------------------------------------*/ +/** * @brief ico_uxf_enter_critical: enter critical section(internal function) * * @param none @@ -1852,6 +1978,111 @@ ico_uxf_mng_process(const char *process, const int create) /*--------------------------------------------------------------------------*/ /** + * @brief ico_uxf_update_procwin: update a process management table + * + * @param[in] appid application id + * @param[in] type type(install/uninstall) + * @param[in] func window create/destroy hook function + * @return none + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API void +ico_uxf_update_procwin(const char *appid, int type) +{ + Ico_Uxf_Mng_Process *prc = NULL; + Ico_Uxf_Sys_Config *sysconf; + Ico_Uxf_App_Config *appconf; + Ico_Uxf_conf_appdisplay *appdsp; + int dn, tn; + Ico_Uxf_conf_application *app = NULL; + + uifw_trace("ico_uxf_update_procwin: Enter(appid=%s, type=%d)", appid, type); + + if (gIco_Uxf_Api_Mng.Initialized <= 0) { + uifw_trace("ico_uxf_callback_remove: Leave(not initialized)"); + return; + } + prc = ico_uxf_mng_process(appid, 0); + + if (type == ICO_UXF_CONF_EVENT_INSTALL) { + if (!prc) { + sysconf = (Ico_Uxf_Sys_Config *)ico_uxf_getSysConfig(); + appconf = (Ico_Uxf_App_Config *)ico_uxf_getAppConfig(); + if ((sysconf == NULL) || (appconf == NULL)) { + uifw_trace("ico_uxf_update_procwin: Leave(cannot find tables)"); + return; + } + for (dn = 0; dn < appconf->applicationNum; dn++) { + app = &appconf->application[dn]; + if (strncmp(app->appid, appid, ICO_UXF_MAX_PROCESS_NAME) == 0) { + uifw_trace("ico_uxf_update_procwin: Install(%s)", appid); + /* add process management table */ + prc = ico_uxf_mng_process(appid, 1); + prc->attr.internalid = 0; + prc->attr.status = ICO_UXF_PROCSTATUS_STOP; + prc->attr.type = app->categoryId; + prc->attr.hostId = app->hostId; + prc->attr.myHost = (prc->attr.hostId == sysconf->misc.myhostId) ? 1 : 0; + + appdsp = &app->display[0]; + prc->attr.mainwin.window = 0; + prc->attr.mainwin.windowtype = app->categoryId; + prc->attr.mainwin.display = appdsp->displayId; + prc->attr.mainwin.layer = appdsp->layerId; + prc->attr.mainwin.x = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].x; + prc->attr.mainwin.y = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].y; + prc->attr.mainwin.w = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].width; + prc->attr.mainwin.h = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].height; + prc->attr.mainwin.name[ICO_UXF_MAX_WIN_NAME] = 0; + prc->attr.numwindows = app->displayzoneNum; + /* get sub windows */ + if (prc->attr.numwindows > 1) { + prc->attr.subwin = malloc(sizeof(Ico_Uxf_ProcessWin) * + (prc->attr.numwindows - 1)); + if (! prc->attr.subwin) { + uifw_trace("ico_uxf_update_procwin: Install(No memory)"); + app->displayzoneNum = 1; + prc->attr.numwindows = 1; + } + else { + memset(prc->attr.subwin, 0, (prc->attr.numwindows - 1)); + for (tn = 0; tn < (prc->attr.numwindows - 1); tn++) { + appdsp ++; + prc->attr.subwin[tn].windowtype = prc->attr.mainwin.windowtype; + prc->attr.subwin[tn].display = appdsp->displayId; + prc->attr.subwin[tn].layer = appdsp->layerId; + prc->attr.subwin[tn].x = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].x; + prc->attr.subwin[tn].y = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].y; + prc->attr.subwin[tn].w = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].width; + prc->attr.subwin[tn].h = + sysconf->display[appdsp->displayId].zone[appdsp->zoneId].height; + } + } + } + } + } + } + } + else if (type == ICO_UXF_CONF_EVENT_UNINSTALL) { + if (prc) { + /* not delete process management table */ + } + } + + uifw_trace("ico_uxf_update_procwin: Leave"); + + return; +} + +/*--------------------------------------------------------------------------*/ +/** * @brief ico_uxf_window_screen_size_get: get display physical size * * @param[out] width variable to receive the width of the display diff --git a/ico-app-framework/ico_uxf_launcher.c b/ico-app-framework/ico_uxf_launcher.c index 924a561..35be2db 100644 --- a/ico-app-framework/ico_uxf_launcher.c +++ b/ico-app-framework/ico_uxf_launcher.c @@ -60,7 +60,6 @@ ico_uxf_process_execute(const char *name) for (hash = 0; hash < ICO_UXF_MISC_HASHSIZE; hash++) { proc = gIco_Uxf_Api_Mng.Hash_ProcessId[hash]; while (proc) { - uifw_trace("ico_uxf_process_execute: PROC(%s)", proc->attr.process); if (strcasecmp(proc->attr.process, name) == 0) break; proc = proc->nextidhash; } diff --git a/ico-app-framework/ico_uxf_private.h b/ico-app-framework/ico_uxf_private.h index 5ad7703..196225b 100644 --- a/ico-app-framework/ico_uxf_private.h +++ b/ico-app-framework/ico_uxf_private.h @@ -62,6 +62,10 @@ typedef struct _Ico_Uxf_Mng_Process { struct _Ico_Uxf_Mng_Process *nextidhash;/* next process of the same id and hash */ Ico_Uxf_Mng_ProcWin *procwin; /* process's subwindow */ void *exttable; /* extended table */ + struct _Ico_Uxf_Mng_Process *parent; /* parent process */ + short susptimer; /* suspend timer */ + char susp; /* real suspend flag */ + char res; /* (unused) */ Ico_Uxf_ProcessAttr attr; /* process configuration */ } Ico_Uxf_Mng_Process; @@ -92,7 +96,7 @@ typedef struct _Ico_Uxf_Mng_Window { struct _Ico_Uxf_Mng_Window *mng_parent; /* parent window */ short state; /* Window status */ unsigned char request; /* Request */ - unsigned char timecount; /* Time counter */ + char res; /* (unused) */ Ico_Uxf_WindowAttr attr; /* window attribute */ } Ico_Uxf_Mng_Window; @@ -110,12 +114,15 @@ typedef struct _Ico_Uxf_Api_Mng { int EventMask; /* receive event */ unsigned int LastEvent; /* last receive event(end synchronization)*/ int AppsCtlVisible; /* Tempolary visible all windows */ + int NeedTimer; /* need timer control */ + int InitTimer; /* initial timer */ /* process information myprocess */ char MyProcess[ICO_UXF_MAX_PROCESS_NAME+1]; /* process id */ Ico_Uxf_Mng_Process *Mng_MyProcess; /* process management table */ int MyMainWindow; /* main window id */ + Ico_Uxf_Mng_Process *Mng_LastProcess;/* last active process management table*/ /* table management callback function */ Ico_Uxf_Mng_Callback *Callback; /* callback management table */ @@ -179,8 +186,13 @@ Ico_Uxf_Mng_Window *ico_uxf_mng_window(const int window, const int create); /* get a window management table */ Ico_Uxf_Mng_Process *ico_uxf_mng_process(const char *process, const int create); /* get a process management table */ +void ico_uxf_update_procwin(const char *appid, int type); + /* update a process management table */ void ico_uxf_free_procwin(Ico_Uxf_Mng_Process *prc); /* release application windows */ +void ico_uxf_window_visible_control(Ico_Uxf_Mng_Window *winmng, + const int show, const int raise); + /* Window visible and cpu control */ int ico_uxf_gl_create_window(const int display, const int layer, const int x, const int y, const int w, const int h, const int full); /* create window by OpenGL ES/EGL */ diff --git a/ico-app-framework/ico_uxf_window.c b/ico-app-framework/ico_uxf_window.c index 3c8f356..f65673c 100644 --- a/ico-app-framework/ico_uxf_window.c +++ b/ico-app-framework/ico_uxf_window.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "ico_uxf.h" @@ -26,6 +27,50 @@ extern Ico_Uxf_Api_Mng gIco_Uxf_Api_Mng; /*--------------------------------------------------------------------------*/ /** + * @brief ico_uxf_window_visible_control: window visible control(internal function) + * + * @param[in] winmng process management table + * @param[in] show show(1)/hide(0)/nochange(9) + * @param[in] raise raise(1)/lower(0)/nochange(9) + * @return none + */ +/*--------------------------------------------------------------------------*/ +void +ico_uxf_window_visible_control(Ico_Uxf_Mng_Window *winmng, const int show, const int raise) +{ + uifw_trace("ico_uxf_window_visible_control: send visible to weston(%s,%08x,%d,%d)", + (winmng->mng_process)->attr.process, winmng->attr.window, show, raise); + if ((show == 1) && ((winmng->mng_process)->attr.invisiblecpu == 0) && + ((winmng->mng_process)->attr.suspend != 0)) { + /* change to show, application resume */ + (winmng->mng_process)->attr.suspend = 0; + (winmng->mng_process)->susptimer = 0; + if ((winmng->mng_process)->susp) { + (winmng->mng_process)->susp = 0; + uifw_trace("ico_uxf_window_visible_control: CPU resume(%s)", + (winmng->mng_process)->attr.process); + kill((winmng->mng_process)->attr.internalid, SIGCONT); + } + } + + /* send visible control to Weston(Multi Window Manager) */ + ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, + winmng->attr.window, show, raise); + wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + + if ((show == 0) && ((winmng->mng_process)->attr.invisiblecpu == 0) && + ((winmng->mng_process)->attr.suspend == 0)) { + /* change to hide, application suspend */ + (winmng->mng_process)->attr.suspend = 1; + (winmng->mng_process)->susptimer = ICO_UXF_SUSP_DELAY; + gIco_Uxf_Api_Mng.NeedTimer = 1; + uifw_trace("ico_uxf_window_visible_control: set CPU suspend(%s)", + (winmng->mng_process)->attr.process); + } +} + +/*--------------------------------------------------------------------------*/ +/** * @brief ico_uxf_window_layer: Set window layer * * @param[in] window window Id @@ -142,23 +187,20 @@ ico_uxf_window_resize(const int window, const int w, const int h) return ICO_UXF_ENOENT; } - uifw_trace("ico_uxf_window_resize: layer(%d,%d)", - winmng->mng_layer->attr.w, winmng->mng_layer->attr.h); if ((w <= 0) || (w > winmng->mng_layer->attr.w) || (h <= 0) || (h > winmng->mng_layer->attr.h)) { uifw_warn("ico_uxf_window_resize: Leave(EINVAL)"); return ICO_UXF_EINVAL; } - if ((w != winmng->attr.w) || (h != winmng->attr.h)) { - winmng->attr.w = w; - winmng->attr.h = h; + winmng->attr.w = w; + winmng->attr.h = h; + + ico_window_mgr_set_positionsize(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, + winmng->attr.x, winmng->attr.y, + winmng->attr.w, winmng->attr.h); + wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); - ico_window_mgr_set_positionsize(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, - winmng->attr.x, winmng->attr.y, - winmng->attr.w, winmng->attr.h); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); - } uifw_trace("ico_uxf_window_resize: Leave(EOK)"); return ICO_UXF_EOK; } @@ -235,9 +277,7 @@ ico_uxf_window_raise(const int window) return ICO_UXF_ENOENT; } - uifw_trace("ico_uxf_window_raise: ico_window_mgr_set_visible(%08x,%d,%d)", window, 9, 1); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, 9, 1); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + ico_uxf_window_visible_control(winmng, 9, 1); uifw_trace("ico_uxf_window_raise: Leave(EOK)"); return ICO_UXF_EOK; @@ -272,9 +312,7 @@ ico_uxf_window_lower(const int window) return ICO_UXF_ENOENT; } - uifw_trace("ico_uxf_window_lower: ico_window_mgr_set_visible(%08x,%d,%d)", window, 9, 0); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, 9, 0); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + ico_uxf_window_visible_control(winmng, 9, 0); uifw_trace("ico_uxf_window_lower: Leave(EOK)"); return ICO_UXF_EOK; @@ -537,18 +575,25 @@ ico_uxf_window_control(const char *appid, const int winidx, winmng = gIco_Uxf_Api_Mng.Hash_WindowId[hash]; while (winmng) { if ((winmng->attr.window > 0) && (winmng->attr.visible)) { - if ((gIco_Uxf_Api_Mng.AppsCtlVisible != 0) || - (winmng->attr.control == 0)) { - i = 1; + if ((winmng->mng_process)->attr.noicon == 0) { + if ((gIco_Uxf_Api_Mng.AppsCtlVisible != 0) || + (winmng->attr.control == 0)) { + i = 1; + } + else { + i = 0; + } } else { - i = 0; + if ((gIco_Uxf_Api_Mng.AppsCtlVisible == 0) && + (winmng->attr.control == 0)) { + i = 1; + } + else { + i = 0; + } } - uifw_trace("ico_uxf_window_control: ico_window_mgr_set_visible" - "(%08x,%d,9)", winmng->attr.window, i); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, - winmng->attr.window, i, 9); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + ico_uxf_window_visible_control(winmng, i, 9); } winmng = winmng->nextidhash; } @@ -583,19 +628,20 @@ ico_uxf_window_control(const char *appid, const int winidx, if (onoff) newcontrol |= control; else newcontrol &= (~control); - uifw_trace("ico_uxf_window_control: control %08x %02x=>%02x", - procattr[i].window, winmng->attr.control, newcontrol); + uifw_trace("ico_uxf_window_control: control %08x(%s) %02x=>%02x vis=%d icon=%d", + procattr[i].window, (winmng->mng_process)->attr.process, + winmng->attr.control, newcontrol, winmng->attr.visible, + (winmng->mng_process)->attr.noicon); if (winmng->attr.control != newcontrol) { winmng->attr.control = newcontrol; if (winmng->attr.visible != 0) { - if (gIco_Uxf_Api_Mng.AppsCtlVisible) newcontrol = 0; - /* request to Weston(Window Manager) */ - uifw_trace("ico_uxf_window_control: visible(%08x,%d) to weston", - procattr[i].window, (newcontrol != 0) ? 0 : 1); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, - procattr[i].window, - (newcontrol != 0) ? 0 : 1, 9); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + if (gIco_Uxf_Api_Mng.AppsCtlVisible != 0) { + if ((winmng->mng_process)->attr.noicon == 0) newcontrol = 0; + else newcontrol = 1; + } + /* request to Weston(Multi Window Manager) */ + ico_uxf_window_visible_control(winmng, + (newcontrol != 0) ? 0 : 1, 9); } } uifw_trace("ico_uxf_window_control: Leave(EOK) control=%x(%d) visible=%d", @@ -638,11 +684,8 @@ ico_uxf_window_show(const int window) winmng->attr.visible = 1; if (winmng->attr.control == 0) { - /* request to display to Weston(Window Manager) */ - uifw_trace("ico_uxf_window_show: ico_window_mgr_set_visible(%08x,%d,%d)", - window, 1, 9); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, 1, 9); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + /* request to display to Weston(Multi Window Manager) */ + ico_uxf_window_visible_control(winmng, 1, 9); } uifw_trace("ico_uxf_window_show: Leave(EOK) control=%x", winmng->attr.control); return ICO_UXF_EOK; @@ -679,10 +722,8 @@ ico_uxf_window_hide(const int window) } winmng->attr.visible = 0; - /* request to hide to Weston(Window Manager) */ - uifw_trace("ico_uxf_window_hide: ico_window_mgr_set_visible(%08x,%d,%d)", window, 0, 9); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, 0, 9); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + /* request to hide to Weston(Multi Window Manager) */ + ico_uxf_window_visible_control(winmng, 0, 9); uifw_trace("ico_uxf_window_hide: Leave(EOK)"); return ICO_UXF_EOK; @@ -726,21 +767,75 @@ ico_uxf_window_visible_raise(const int window, const int visible, const int rais } else if (vis == 1) { winmng->attr.visible = 1; - if ((winmng->attr.control != 0) && (gIco_Uxf_Api_Mng.AppsCtlVisible == 0)) { - uifw_trace("ico_uxf_window_visible_raise: change to hide(control=%x menu=%d", - winmng->attr.control, gIco_Uxf_Api_Mng.AppsCtlVisible); - vis = 0; + if (gIco_Uxf_Api_Mng.AppsCtlVisible == 0) { + /* application screen */ + if (winmng->attr.control != 0) { + uifw_trace("ico_uxf_window_visible_raise: change to hide(ctrl=%x menu=0)", + winmng->attr.control); + vis = 0; + } + } + else { + /* HomeScreen menu screen */ + if ((winmng->mng_process)->attr.noicon != 0) { + uifw_trace("ico_uxf_window_visible_raise: change to hide(ctrl=%x menu=1)", + winmng->attr.control); + vis = 0; + } } } if ((vis != 9) || (raise != 9)) { - /* request to visible status and order status to Weston(Window Manager) */ - uifw_trace("ico_uxf_window_visible_raise: ico_window_mgr_set_visible(%08x,%d,%d)", - window, vis, raise); - ico_window_mgr_set_visible(gIco_Uxf_Api_Mng.Wayland_WindowMgr, window, vis, raise); - wl_display_flush(gIco_Uxf_Api_Mng.Wayland_Display); + /* request to visible status and order status to Weston(Multi Window Manager) */ + ico_uxf_window_visible_control(winmng, vis, raise); } uifw_trace("ico_uxf_window_visible_raise: Leave(EOK)"); return ICO_UXF_EOK; } +/*--------------------------------------------------------------------------*/ +/** + * @brief ico_uxf_window_animation: set window animation + * + * @param[in] window Window identity + * @param[in] animation Animation name + * @return result + * @retval ICO_UXF_EOK success + * @retval ICO_UXF_ESRCH error(not initialized) + * @retval ICO_UXF_ENOENT error(not exist) + */ +/*--------------------------------------------------------------------------*/ +ICO_APF_API int +ico_uxf_window_animation(const int window, const char *animation) +{ + Ico_Uxf_Mng_Window *winmng; /* window management table */ + char nullname[4]; + + uifw_trace("ico_uxf_window_animation: Enter(%08x, %s)", + window, animation ? animation : "NULL"); + + if (gIco_Uxf_Api_Mng.Initialized <= 0) { + uifw_warn("ico_uxf_window_animation: Leave(ESRCH)"); + return ICO_UXF_ESRCH; + } + + winmng = ico_uxf_mng_window(window, 0); + if ((! winmng) || (! winmng->mng_display)) { + uifw_warn("ico_uxf_window_animation: Leave(ENOENT)"); + return ICO_UXF_ENOENT; + } + + if (animation) { + ico_window_mgr_set_animation(gIco_Uxf_Api_Mng.Wayland_WindowMgr, + winmng->attr.window, animation); + } + else { + nullname[0] = ' '; + nullname[1] = 0; + ico_window_mgr_set_animation(gIco_Uxf_Api_Mng.Wayland_WindowMgr, + winmng->attr.window, nullname); + } + uifw_trace("ico_uxf_window_animation: Leave(EOK)"); + return ICO_UXF_EOK; +} + diff --git a/include/home_screen.h b/include/home_screen.h index f7b8511..8788309 100644 --- a/include/home_screen.h +++ b/include/home_screen.h @@ -28,11 +28,13 @@ #define ICO_HS_TOUCH_IN_HIDE (3) #define ICO_HS_TOUCH_IN_SHOW (4) +#define ICO_HS_TILE_NOCHANGE (1) +#define ICO_HS_TILE_APPLIST (2) +#define ICO_HS_TILE_OTHERS (5) #define ICO_HS_TILE_SMALL (11) #define ICO_HS_TILE_HWIDE (21) #define ICO_HS_TILE_VWIDE (12) #define ICO_HS_TILE_LARGE (22) -#define ICO_HS_TILE_OTHERS (0) #define ICO_HS_TILE_CHAN (18) #define ICO_HS_TILE_SIZE_S (170) @@ -78,6 +80,7 @@ #define ICO_HS_WINDOW_NUM_MAX (10) #define ICO_HS_MSG_SIZE (1024) #define ICO_HS_TEMP_BUF_SIZE (256) +#define ICO_HS_NOTILE_APP_MAX (20) #define ICO_HS_PROTOCOL_CM "gui-protocol" /* protocol to communicate external tools */ @@ -96,6 +99,9 @@ #define ICO_HS_SIZE_LAYOUT_WIDTH (768) #define ICO_HS_SIZE_LAYOUT_HEIGHT (1024) +/* define for statusbar configuration */ +#define ICO_SB_CONFIG_SHTCT_APP "shortcut_app" + /* define for sound configuration */ #define ICO_HS_SND_TYPE_DEFAULT (1) @@ -132,6 +138,7 @@ extern void hs_tile_show_screen(void); extern int hs_get_index_appscreendata(const char *appid); extern void hs_req_ctlr_tile(void); extern void hs_click_escutcheon(void); +extern int hs_click_applist(void); extern void hs_show_onscreen(void); extern void hs_hide_onscreen(void); extern void hs_show_appscreen(const char *appid); diff --git a/include/ico_apf_resource_control.h b/include/ico_apf_resource_control.h index 043ebc9..6784e6f 100644 --- a/include/ico_apf_resource_control.h +++ b/include/ico_apf_resource_control.h @@ -17,6 +17,10 @@ #ifndef __ICO_APF_RESOURCE_CONTROL_H__ #define __ICO_APF_RESOURCE_CONTROL_H__ +#ifdef __cplusplus +extern "C" { +#endif + /* * id of resource */ diff --git a/include/ico_syc_apc.h b/include/ico_syc_apc.h index 621b6e7..7e64c72 100644 --- a/include/ico_syc_apc.h +++ b/include/ico_syc_apc.h @@ -25,6 +25,9 @@ extern "C" { #endif +/* Maximum values */ +#define ICO_SYC_APC_REGULATION_LISTENERS 4 /* number of regulation listeners */ + /* Vehicle information values */ #define ICO_SYC_APC_REGULATION_SPEED_RUNNING (4.0) #define ICO_SYC_APC_REGULATION_SHIFT_NEUTRALS (0) @@ -34,12 +37,13 @@ extern "C" { #define ICO_SYC_APC_REGULATION_SHIFT_DRIVE (4) #define ICO_SYC_APC_REGULATION_SHIFT_REVERSES (128) #define ICO_SYC_APC_REGULATION_SHIFT_PARKING (255) -#define ICO_SYC_APC_REGULATION_BLINKER_LEFT (2) +#define ICO_SYC_APC_REGULATION_BLINKER_NONE (0) #define ICO_SYC_APC_REGULATION_BLINKER_RIGHT (1) +#define ICO_SYC_APC_REGULATION_BLINKER_LEFT (2) -#define ICO_SYC_APC_REGULATION_NOCHANGE (9) -#define ICO_SYC_APC_REGULATION_NOREGULATION (1) #define ICO_SYC_APC_REGULATION_REGULATION (0) +#define ICO_SYC_APC_REGULATION_NOREGULATION (1) +#define ICO_SYC_APC_REGULATION_NOCHANGE (9) typedef struct _ico_apc_reguration_control { unsigned char display; /* display(1=visible/0=invisible) */ diff --git a/include/ico_syc_def.h b/include/ico_syc_def.h index 6a39c06..d8405ae 100644 --- a/include/ico_syc_def.h +++ b/include/ico_syc_def.h @@ -35,6 +35,8 @@ enum _ico_syc_regulation_vehicleinfo_id { ICO_SYC_VEHICLEINFO_VEHICLE_SPEED = 1, /* vehicle speed */ ICO_SYC_VEHICLEINFO_SHIFT_POSITION, /* shift position */ ICO_SYC_VEHICLEINFO_TURN_SIGNAL, /* blinker signal */ + ICO_SYC_VEHICLEINFO_LIGHT_LEFT, /* left turn light status */ + ICO_SYC_VEHICLEINFO_LIGHT_RIGHT, /* right turn light status */ ICO_SYC_VEHICLEINFO_MAX /* maximum number of type */ }; diff --git a/include/ico_syc_error.h b/include/ico_syc_error.h deleted file mode 100644 index 1b1f2c9..0000000 --- a/include/ico_syc_error.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2013, TOYOTA MOTOR CORPORATION. - * - * This program is licensed under the terms and conditions of the - * Apache License, version 2.0. The full text of the Apache License is at - * http://www.apache.org/licenses/LICENSE-2.0 - * - */ -/** - * @brief System Controller public header for permanent value - * - * @date Feb-28-2013 - */ - -#ifndef _ICO_SYC_DEF_H_ -#define _ICO_SYC_DEF_H_ - -#include "ico_apf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* common API error code */ -#define ICO_SYC_EOK ICO_APF_RESOURCE_E_NONE /* OK */ -#define ICO_SYC_ENOENT ICO_APF_RESOURCE_E_UNKOWN /* No such object */ -#define ICO_SYC_ESRCH ICO_APF_RESOURCE_E_NOT_INITIALIZED /* Not initialized */ -#define ICO_SYC_EIO ICO_APF_RESOURCE_E_COMMUNICATION /* I/O error */ -#define ICO_SYC_ENOMEM ICO_APF_RESOURCE_E_NOT_IMPLEMENTED /* Out of memory */ -#define ICO_SYC_EINVAL ICO_APF_RESOURCE_E_INVAL /* Invalid argument */ -#define ICO_SYC_ENOSYS (-99) /* System error */ - -/* Vehicle information internal key */ -enum _ico_syc_regulation_vehicleinfo_id { - ICO_SYC_VEHICLEINFO_VEHICLE_SPEED = 1, /* vehicle speed */ - ICO_SYC_VEHICLEINFO_SHIFT_POSITION, /* shift position */ - ICO_SYC_VEHICLEINFO_BLINKER, /* blinker(not inpliment in AMB) */ - - ICO_SYC_VEHICLEINFO_MAX /* maximum number of type */ -}; - -#ifdef __cplusplus -} -#endif -#endif /* _ICO_SYC_DEF_H_ */ - diff --git a/include/ico_uxf_conf.h b/include/ico_uxf_conf.h index b1cf0d6..8a80590 100644 --- a/include/ico_uxf_conf.h +++ b/include/ico_uxf_conf.h @@ -101,16 +101,17 @@ typedef struct _ico_uxf_conf_application { char *exec; char *type; int hostId; - char noicon; - char res[3]; /* (unused) */ char *location; char *icon_key_name; + char autostart; + char noicon; + unsigned short invisiblecpu; short kindId; short categoryId; - short autostart; short displayzoneNum; short soundzoneNum; short inputdevNum; + char res[2]; Ico_Uxf_conf_appdisplay display[ICO_UXF_APPDISPLAY_MAX]; Ico_Uxf_conf_appsound sound[ICO_UXF_APPSOUND_MAX]; Ico_Uxf_conf_appinput input[ICO_UXF_APPINPUT_MAX]; @@ -206,11 +207,14 @@ typedef struct _ico_uxf_sys_config { typedef struct _ico_uxf_app_config { int applicationNum; + int ailNum; Ico_Uxf_conf_application *application; Ico_Uxf_conf_application *hashidtable[ICO_UXF_MISC_HASHSIZE]; Ico_Uxf_conf_application *hashnametable[ICO_UXF_MISC_HASHSIZE]; } Ico_Uxf_App_Config; +typedef void (*Ico_Uxf_AppUpdata_Cb)(const char *appid, int type); + const Ico_Uxf_Sys_Config* ico_uxf_getSysConfig(void); const Ico_Uxf_Sys_Config* ico_uxf_ifGetSysConfig(void); const Ico_Uxf_App_Config* ico_uxf_getAppConfig(void); @@ -241,6 +245,8 @@ const Ico_Uxf_conf_category* ico_uxf_getAppCategoryById(const int categoryId); const Ico_Uxf_conf_display* ico_uxf_getSysDisplayById(const int displayId); const char *ico_uxf_get_SysLocation( const int hostId ); +int ico_uxf_conf_setAppUpdateCb(Ico_Uxf_AppUpdata_Cb func); + /* define log macros */ #ifndef uifw_trace #define uifw_debug ICO_UXF_DEBUG @@ -254,16 +260,8 @@ const char *ico_uxf_get_SysLocation( const int hostId ); void ico_uxf_closeSysConfig(void); -#define ICO_UXF_EVENT_WAIT_DEFAULT (0) -#define ICO_UXF_EVENT_WAIT_WAYLAND (1) -#define ICO_UXF_EVENT_WAIT_WEBSOCKET (2) -#define ICO_UXF_EVENT_WAIT_JULIUS (3) - -#define ICO_UXF_EFFECT_NONE (0) -#define ICO_UXF_EFFECT_GRAYOUT (1) -#define ICO_UXF_EFFECT_BLACKOUT (2) -#define ICO_UXF_EFFECT_INVISIBLE (3) -#define ICO_UXF_EFFECT_TERMINATE (4) +#define ICO_UXF_CONF_EVENT_INSTALL (0) +#define ICO_UXF_CONF_EVENT_UNINSTALL (1) #ifdef __cplusplus } diff --git a/include/ico_uxf_conf_ecore.h b/include/ico_uxf_conf_ecore.h new file mode 100644 index 0000000..1997da4 --- /dev/null +++ b/include/ico_uxf_conf_ecore.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013, TOYOTA MOTOR CORPORATION. + * + * This program is licensed under the terms and conditions of the + * Apache License, version 2.0. The full text of the Apache License is at + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +/** + * @brief user experiance library public header file(configuration) + * + * @date Feb-28-2013 + */ + +#ifndef _ICO_UXF_CONF_ECORE_H_ +#define _ICO_UXF_CONF_ECORE_H_ + +#include +#include "ico_uxf_conf_def.h" +#include "ico_uxf_sysdef.h" +#include "ico_uxf_def.h" +#include "ico_uxf_typedef.h" +#include "ico_apf_log.h" +#include "ico_uxf_conf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int ico_uxf_econf_setAppUpdateCb(Ico_Uxf_AppUpdata_Cb func); + +/* define log macros */ +#ifndef uifw_trace +#define uifw_debug ICO_UXF_DEBUG +#define uifw_trace ICO_UXF_DEBUG +#define uifw_critical ICO_UXF_CRITICAL +#define uifw_info ICO_UXF_INFO +#define uifw_warn ICO_UXF_WARN +#define uifw_error ICO_UXF_ERROR +#define uifw_logflush ico_uxf_log_flush +#endif /*uifw_trace*/ + +#ifdef __cplusplus +} +#endif +#endif /* _ICO_UXF_CONF_ECORE_H_ */ + diff --git a/include/ico_uxf_proto.h b/include/ico_uxf_proto.h index c676006..79e33f5 100644 --- a/include/ico_uxf_proto.h +++ b/include/ico_uxf_proto.h @@ -33,6 +33,8 @@ int ico_uxf_callback_set(const unsigned int mask, int ico_uxf_callback_remove(const unsigned int mask, Ico_Uxf_Event_Cb func, const int arg); /* Remove event callback function */ +void ico_uxf_timer_wake(const int msec); + /* UX-FW timer */ /* Control window */ int ico_uxf_window_event_mask(const int window, const unsigned int mask); @@ -75,6 +77,8 @@ int ico_uxf_window_lower(const int window); /* Lower window */ int ico_uxf_window_active(const int window, const int target); /* Activate window */ +int ico_uxf_window_animation(const int window, const char *animation); + /* Set window animation */ int ico_uxf_window_control(const char *appid, const int winidx, const int control, const int onoff); /* Window visible control from AppsController*/ @@ -109,6 +113,10 @@ int ico_uxf_process_window_get_one(const char *process, /* Get one windows of one application */ int ico_uxf_process_query_processes(Ico_Uxf_ProcessAttr attr[], const int num); /* Get all aplications attribute */ +void ico_uxf_set_lastapp(const char *appid); + /* Set/Reset last application */ +char *ico_uxf_getchild_appid(const char *appid); + /* Get child applicationId */ /* Wayland depend function */ int ico_uxf_wl_display_fd(void); diff --git a/include/ico_uxf_sysdef.h b/include/ico_uxf_sysdef.h index 9eeac7b..c218c89 100644 --- a/include/ico_uxf_sysdef.h +++ b/include/ico_uxf_sysdef.h @@ -29,7 +29,7 @@ extern "C" { #define ICO_UXF_HOST_MAX 16 /* Maximum number of ECUs */ #define ICO_UXF_DISPLAY_LAYER_MAX 16 /* Maximum number of Layers */ #define ICO_UXF_CATEGORY_MAX 20 /* Maximum number of application categorys*/ -#define ICO_UXF_DISPLAY_ZONE_MAX 10 /* Maximum zone on display in car */ +#define ICO_UXF_DISPLAY_ZONE_MAX 30 /* Maximum zone on display in car */ #define ICO_UXF_SOUND_ZONE_MAX 10 /* Maximum zone on sound in car */ #define ICO_UXF_INPUT_SW_MAX 50 /* Maximum input sw in car */ #define ICO_UXF_REGULATION_VIC_MAX 20 /* Maxumum vehicle info for regulation */ @@ -61,6 +61,10 @@ extern "C" { /* maximum value */ #define ICO_UXF_MAX_COORDINATE 16384 /* maximum coordinate position + 1 */ +/* timer */ +#define ICO_UXF_SUSP_INITTIME (10*1000) /* initiale no suspend time (ms) */ +#define ICO_UXF_SUSP_DELAY (300) /* suspend delay time (ms) */ + #ifdef __cplusplus } #endif diff --git a/include/ico_uxf_typedef.h b/include/ico_uxf_typedef.h index e527a77..68d5a22 100644 --- a/include/ico_uxf_typedef.h +++ b/include/ico_uxf_typedef.h @@ -133,6 +133,10 @@ typedef struct _Ico_Uxf_ProcessAttr { short status; /* Running status */ char active; /* Active/Inactive */ char child; /* Child process */ + char noicon; /* No icon flag */ + char autostart; /* Autostart flag */ + char suspend; /* application susupend flag */ + unsigned char invisiblecpu; /* cpu % at invisible */ } Ico_Uxf_ProcessAttr; /* Detail of event */ diff --git a/install-appcore.sh b/install-appcore.sh index 4c8f895..5805c1a 100755 --- a/install-appcore.sh +++ b/install-appcore.sh @@ -54,6 +54,8 @@ cp -rf data/apps/$PKGNAME /opt/apps/ mkdir -p /opt/apps/$PKGNAME/bin/ cp src/StatusBar /opt/apps/$PKGNAME/bin/ cp res/images/time*.png /opt/apps/$PKGNAME/res/images +cp res/images/applist_*.png /opt/apps/$PKGNAME/res/images +cp res/images/home*.png /opt/apps/$PKGNAME/res/images chmod 666 /opt/apps/$PKGNAME/res/images/time*.png cp data/share/applications/$PKGNAME.desktop /opt/share/applications/ cp res/apps/$PKGNAME/* /opt/apps/$PKGNAME/res/config @@ -70,7 +72,7 @@ cp src/OnScreen /opt/apps/$PKGNAME/bin/ cp src/appli_list.edj /opt/apps/$PKGNAME/res/edj cp src/appli_kill.edj /opt/apps/$PKGNAME/res/edj chmod 666 /opt/apps/$PKGNAME/res/edj/*.edj -chmod 666 /opt/apps/$PKGNAME/res/images/*.png +chmod 666 /opt/apps/$PKGNAME/res/images/*.png > /dev/null 2>&1 cp data/share/applications/$PKGNAME.desktop /opt/share/applications/ cp res/apps/$PKGNAME/* /opt/apps/$PKGNAME/res/config diff --git a/packaging/ico-uxf-HomeScreen.changes b/packaging/ico-uxf-HomeScreen.changes index 7333fb1..ab9612e 100644 --- a/packaging/ico-uxf-HomeScreen.changes +++ b/packaging/ico-uxf-HomeScreen.changes @@ -1,3 +1,20 @@ +* Fri May 24 2013 Shibata Makoto accepted/2.0alpha-wayland/20130520.093309@f56086f +- 0.3.03 release +- Fix for TIVI-839 - [WLD] Install app with wrt install, No new app icon shown in Homescreen App list. + Homescreen reload the application informations when receive the package update messages from the package manager. + (use pkgcmd to install or uninstall application) +- Work around TIVI-832 - [WLD]Video player Segfault when playing video from gallery. + Gave child process the screen right of the process that worked just before that. +- Changed the image of application change button on the statubar. +- Added the application list button to the statusbar. +- Removed the application list button from the homescreen tile. +- Added the application list button to the statusbar. +- Added the shortcut button to the statusbar. +- Tile menu indication and the application choice prevent them from being able to do it during a run. +- Support of the mirror camera indication by the blinker operation. +- Permit the operation of the music player while driving. +- Appoint that more than ico-uxf-weston-plugin-0.5.03 are necessary for spec file. + * Wed May 22 2013 Shibata Makoto accepted/2.0alpha-wayland/20130520.093309@23824f8 - Fix for TIVI-803 - Enable new UI in wayland build. - Fix for TIVI-826 - weston-plugin should NOT create /root/ diff --git a/packaging/ico-uxf-HomeScreen.spec b/packaging/ico-uxf-HomeScreen.spec index 580e536..fba465b 100644 --- a/packaging/ico-uxf-HomeScreen.spec +++ b/packaging/ico-uxf-HomeScreen.spec @@ -1,6 +1,6 @@ Name: ico-uxf-HomeScreen Summary: sample homescreen -Version: 0.3.02 +Version: 0.3.04 Release: 1.1 Group: TO_BE/FILLED_IN License: Apache License, Version 2.0 @@ -9,7 +9,7 @@ Source0: %{name}-%{version}.tar.bz2 BuildRequires: pkgconfig(wayland-client) >= 1.0 BuildRequires: pkgconfig(glib-2.0) -BuildRequires: ico-uxf-weston-plugin-devel >= 0.5.0 +BuildRequires: ico-uxf-weston-plugin-devel >= 0.5.03 BuildRequires: pkgconfig(eina) BuildRequires: pkgconfig(evas) BuildRequires: pkgconfig(eina) @@ -22,11 +22,12 @@ BuildRequires: pkgconfig(json-glib-1.0) BuildRequires: pkgconfig(aul) BuildRequires: pkgconfig(bundle) BuildRequires: pkgconfig(ail) +BuildRequires: pkgconfig(pkgmgr) BuildRequires: libwebsockets-devel BuildRequires: capi-base-common-devel BuildRequires: edje-tools Requires: weston >= 1.0 -Requires: ico-uxf-weston-plugin >= 0.5.0 +Requires: ico-uxf-weston-plugin >= 0.5.03 %description Sample homescreen application. @@ -106,6 +107,8 @@ cp -rf data/apps/%{APP} %{buildroot}/%{PREFIX}/ cp -rf res/apps/%{APP}/* %{buildroot}%{APPSDIR}/res/config/ install -m 0755 src/StatusBar %{buildroot}%{APPSDIR}/bin/ install -m 0644 res/images/time*.png %{buildroot}%{APPSDIR}/res/images/ +install -m 0644 res/images/applist_*.png %{buildroot}%{APPSDIR}/res/images/ +install -m 0644 res/images/home*.png %{buildroot}%{APPSDIR}/res/images/ install -m 0644 data/share/applications/%{APP}.desktop %{buildroot}/opt/share/applications/ #onscreen diff --git a/res/apps/org.tizen.ico.homescreen/homescreen.conf b/res/apps/org.tizen.ico.homescreen/homescreen.conf index c7b6125..0f62a78 100644 --- a/res/apps/org.tizen.ico.homescreen/homescreen.conf +++ b/res/apps/org.tizen.ico.homescreen/homescreen.conf @@ -1,8 +1,8 @@ [homescreen] tileinfo_rowcnt=3 tileinfo_colcnt=5 -tileinfo_valid=1;0;1;1;0;0;0;1;1;1;1;1;0;1;1 -tileinfo_type=22;0;11;12;0;0;0;21;11;11;11;11;0;11;0 +tileinfo_valid=1;0;1;1;0;0;0;1;1;1;1;1;0;1;0 +tileinfo_type=22;0;11;12;0;0;0;21;11;11;11;11;0;12;0 tileinfo_app0=org.tizen.browser tileinfo_app3=org.tizen.music-player tileinfo_app2=org.tizen.gallery @@ -12,6 +12,7 @@ tileinfo_app9=org.tizen.dialer tileinfo_app10=org.tizen.calculator tileinfo_app11=org.tizen.memo tileinfo_app13=org.tizen.smartsearch +tileinfo_app14=none statusbar=org.tizen.ico.statusbar onscreen=org.tizen.ico.onscreen diff --git a/res/apps/org.tizen.ico.statusbar/statusbar.conf b/res/apps/org.tizen.ico.statusbar/statusbar.conf index 1314c9c..5a7d6df 100644 --- a/res/apps/org.tizen.ico.statusbar/statusbar.conf +++ b/res/apps/org.tizen.ico.statusbar/statusbar.conf @@ -1,9 +1,12 @@ ## statusbar private configration [statusbar] wsport=10001 -#orientaion(1:VERTICAL, 2:HORIZONTAL) +##orientaion(1:VERTICAL, 2:HORIZONTAL) #orientaion=2 +shortcut_app0=org.tizen.ico.app-samplenavi +shortcut_app1=org.tizen.music-player + [sound] #configuration for sounds sound_default=/usr/share/sounds/mm-camcorder/af_succeed.wav diff --git a/res/config/app_attr.conf b/res/config/app_attr.conf index 792c3e8..fdc7084 100644 --- a/res/config/app_attr.conf +++ b/res/config/app_attr.conf @@ -7,9 +7,12 @@ [app-attributes] # attrinutes of native applictions org.tizen.soft-keyboard=Menu;SysApp;dispzone=SysApp;layer=SoftKeyboard -org.tizen.setting=Message;kind=SysApp.audio +org.tizen.setting=CarSetting;kind=SysApp.audio +org.tizen.music-player=Map # attributes of web applications DemoMeterApp=Map GhostCluster=Map +WinkerLeft=Camera.Left;kind=Maker;dispzone=SysApp.Left;layer=InterruptApp;NoDisplay;autostart;invisiblecpu=no +WinkerRight=Camera.Right;kind=Maker;dispzone=SysApp.Right;layer=InterruptApp;NoDisplay;autostart;invisiblecpu=no # diff --git a/res/config/system.conf b/res/config/system.conf index 3638e8b..012b7ed 100644 --- a/res/config/system.conf +++ b/res/config/system.conf @@ -55,6 +55,8 @@ 0.zone.6=LowerLeft;0;heigh-64/2+64;dispw/2;disph-64/2;Full;Lower 0.zone.7=LowerRight;dispw/2;heigh-64/2+64;dispw/2;disph-64/2;Full;Lower 0.zone.8=SysApp;0;64;dispw;disph-64 +0.zone.9=SysApp.Left;0;64;dispw/2-181;disph-64 +0.zone.10=SysApp.Right;dispw/2+181;64;dispw/2-181;disph-64 # ## Sound [sound] diff --git a/res/images/applist_off.png b/res/images/applist_off.png new file mode 100755 index 0000000000000000000000000000000000000000..539923668beb0e9e6dbef19d5ba629369faa85ce GIT binary patch literal 8492 zcma*t1xy^#+BfjU-Q8trX(XISxNM;mcM7G8JBt;H6c%0Fy~q}q z#mgd#>`U*>cXM-d^S$p$W=`hGnaNBtC;6R!PV_4+WfDS0LI40jqN<{xd*3hKAIbQ* z_vhhh=*E4A@m^P14geWt-o3xTeWR|d03ZWI0?_qkg%tM{0(TXY_W%G9)!zdHkoA@R zzKG|gs;P*#j6;hpI`@ZvXU{_Yvd}S0y zN(TV215_1c_5FSwn5)OLC_^4#AQetuicDha6A27b(OAh7J{`9XD*AHaQ-2f{7H z!53xMc0R*YBN{K2s={rKbAd+ttv( zdrnl+r(jM_@h)^QBLpplMDrlEKm3-Lp2hm+e>|p#u9icm;tk691oxkWpjB?QU!#{l zYR`|~iM3yC4rQGGu)WQZ_CG5{o}N`Wio?NS$im>20EPSAOwHT9%wP&!|5Gw{P9CMI)DuOZEY~Bow7=Tj9biqram-4@ z7EG2B(Q7xf&aIsY7TVw409X0%n!S*&WB~ z8vad6I`R%2Rm(S+k;epU$kb_$T1Asy_*}*^>75==tga0G@w?eLd3}5T2L0L!XF(r4 z0s<<;IH^fME|@#^wwNHc-c1?^P&TZ-UMTQNh~l=!3=L-rX)x4yiuIEQA1G@o;@R!~BoZTX4bltkby!7_kMsXpGi^&Ga z^}d8`b3ev+vta3fbLW9Ql>03Xdxop!d+Lk<o%tNwUEw1_uNInZMS$8D zzV7&r(53NRiuo14C8%jZ2>e2;q?D;1)X?Q4nzTwcJi3@#N3~}fD%UY)S{icbtj<0> zG7^R1Lk(3Rm*J89{X0&-aVNMKj)zVNizW{zP|(=k9@~~akrkZ?sPVi#t1px2h-W#4;6&Cb9KW zGU9FG0WFfI@Hsu!e$3?oMzRu|g?+KfGkI)oyw2j5SBEX_1SRxxdVKrjM;JHkkwq3+ zO~j?hwe-Ojrkx|J8ys1;W<2PlXCC8%Kz3*?4p{jS}} zB#Q#J-%fqg^0P-!Z_#9~g7-UiNXUj*nIR2I{B-!cxtu_!cfy3N4yUI%3w2V?6+AVS zxl%yhwoU?~@TCs1@UilmDZGvko3l$K-=U2BT{v{6wb$;IPa+^$I$Z$Xz^2}B6NxxI z$*{(ZC7STOTW5~Ohw0DsV>P&(jeoPL7`rCL(_-j1de-5Jk`<6LI!!+3sQZjlz8X}U zP>tg#(B&xiw%OBOevdU}Kp074{a^`CuB*Fi7JsDUwl-!=hjFo8psqwOT~##U4uvru zoN^-bQBu=JNR&8-?ziZYmQH~Ex$8?XCKF?O*%LQwUPVK#SuL8cg!~St!sMR}&eH|G zAve|;h6Ul4qOMX91SrJ$V^$LmbM-5wB2cJyP2 z(&h|3mtU*3T_S(0EbowG(oM(6^QfB0iI9VZguk%%Kr@m2#iQ+9lo~KYE{J%+0G)om zz6aC3k)B88prp@gh!bW6q*)CzTWYruvnNF5QqHP2i{QA}-3A(CkY=TlcH%S-#-NBm z_Re4n2JsU~EG!Ki^TbCE-xwd{*ACxBgVslGxc)4J-d4K1VzFt(`~1SVWqHTdQ3G!jqZ|n>gHc7P zI%*N-*#XrfZT7zQ7cwQn8u6GGe9!lppVT<_X8U${L=eXgZkH|Sid?>2AegCfM4ucX zHrBi&B;ut_MGPsG4oQGTZ!iSD%s+dxkwRdK;f4z%no1<2>e$(Sido(}pV|hLeDu0D z5>O995L0HK3D$&*L~~|h$p7?j^a*lXS10%X-Kf0TwNj&&{%r2$3kIyR?ITdAH=l#B z^#%kx+K%dZ6JCIPsGZtTH-YnrmQ{8t%`V&CtaF`^S58DYIZZt=4MsY}-g$@ElW(Js z-un^=S)E~-JAXTIguR%nPf}uK5g_*5CiA>)&4WA zVhqobF%P7ESC}{#pP_xCmuw8`tbEgZvR~D(-PC}RA+NjFp?%o$M2E*k;2Na_(}yIpC#A6loL6SemCvOZC&(+Ht!86ORwLG&s9Df_`G-D zTWJqsLS_}A5r{dj`;oDQfj3w&!&)(Kemxm2)OAy-=?*#;;}OUtPW zqw3$WY}XNugM4zhqq&7Lt5(AW04I$^v)}SWc%i8Ck^B>Fn{1Bi=pFEcTX*;~iqBVE zamN;w1N4Z^KDZ`A#1wr8;TD6t_g1%PrUHD8Z#?oF$>-@wS6-qa%v6qVi+SSKi3c`Q zc6V{h>TKyhZ|5h7tL^`k{x}eD+Hhyt9@so$U|;y)XTSxYTm{?gE`O_Z`~lL9Y;{d= z{o=;G=QoY^NA*$ zC<3R)a_^+8qIbuF3}!xk*~tLzpw~_**(E8Obq_MXnvF^KUwbSFL*fa)^7x^L9RC7K ztzKrnxA!AdB=RxQC0H&TOE*SE#>VgW56cjz-P(5{^)WFqpngjaoswL=C$*TtZ}|(plKcFoKzW3a zGW#1|3`$H=!J{HyzF;{1a*JqOZlFw&wAz2bIXSCC1|m|fZXqSL5>T^-uG0&uLHHc>DU`DIjhu$p`Pr@y z3LQ+8E<5Ww&j@I0gc{G55(}J5T9u|hto4|yvHJSLT;%?jP&b@OV3Tq6S#5rr|LsLU z<6G~braNO|+j88kx6tB~e=60?4Bw&cE~NbH>&LCo^_X@)xc z!f-9o4N0~#`_2)~!X0FFGs@T8l4fId$B#rri7-{roNKy~SStaMEqMs9nm~^?#>koY zL>}f*&Jr#zsEs7)y6Gyn?1NCWqWV3s)R?oe92WvmbMuuzNBmkw(^|qSecXQ%)$VEW zFuI$s`4__F^5W|1PxC9-8QOilqC7v2ypiqvN!yh*Ce5cJ$mmDgR`VkdCh+$5b_^1I zyb8NAbCr9B0_SyQbSdg~b3QtAynFl|gX$c|9FIu~Tz!vXp^X4jgVrxjpEUw07Y|0; zhyRIFhQ-VLjE6*rbq3o|*C!2TXu}~sh>M#)J`>!0K5uJLFY_n&vT=dqsC11buBO6J znTd-c;nNhqNlWr_qDNx68~>DP_^(gK{>+Gpv}>kLpm$&KE+x877ajalCcBAG0z#JI z)cKLz^ShxF{(rhu)>JXc$)M21u2&+!zkkydn{M#eZz7|+0f}45wQ*@pm$>8} z!K)%dw_Equi6g;4O&JAu&+$ErPhLi-Y{eJs!kb;BC#-L(<>!YM=i@)gku?~shv2Or z`E$O^Gd-h-mJgL5pWQe8H5tPM|KhBh2J`uuQ}u_}3@dnCUu?1*%q^1bBE0U-Bz2?} zq}3j^O>3{h%)nY4AYe-p^dTZOs~u5Z8~=e9Qt+rIZg>gQj(pGi|47;r_QJY6p=Y)g zt3XVOH^9AVma)x@y)fdlMmve_l__7=&p>+^q;OxH4c{Zg>15eBYCg{{!cpP=A? zctOZyhMG^LGI;(92R@yaLGRO%CSc5Q=;s$!OT#CpE@q!6RHBo>D4i(4YC3$|Va>C`h5jx>9Tf??sPcRd0TEsKT!Sj%AYVyEfL335 z?;7bZqguBIvDMKc*S*>=%b^j|QNH7mEB01_Pps!Llt^o8cg$c6lnGDQBiSVx~9l2i~qJHh+z0MuX=6pMfij?8)wh@U< zP^Kw%t-NaSz6s|cGrj+Kd!UWK3l6O{RmB7qR|Cv&k!1K`OPwpAdvLS^peIYmMVM8h z6z#xUAHuonCnPfvC<>^;u0jVCwpkuUs;gk~NS-GvEU zis9O;8Nz4W1KD7i2vJ`iF~R# zhhYKpogC~F*THuzl;osJs5R8ZjVlX7FOHiuW%?_%+=x;-ao@CflByVcoC}#~-O>KS z735D0MC>SZ9hZSVZA`De$niL=j;h>x=58H6H_(f~^=1xgbgblxU1CyF>&3JZthMRs z=ca1JTp^C7E9PK(7&Nh8#9C_&OPIev%7)f1;qMFaj=@5PV zWKw3jYT>Q@jszYK2ag>C4<;{g`XJ2BP%1}f>yXl}W9O*qK`E$QfXHrHp%k+4q?F&Z zy|9OhC^Sl(+DtY4tv3A>3ozoXjAe(_M)Fj7+}ca(2!_74jNtkc83RrjWvt^^e`qjPuIn&VD4g0Zj~dp=30r6NN2yvZ{e;uViE>~mI@xhzJ@g4Z z*B9$b;ft|q3^hS@5+q2+v1)x)625pSciD{Uo6HesM(F3`j>x|G{^JXUF57pf84iXd znRH&C6y@uhL~Z7k34G7o^A`e7Tpt3N6*bw@7|B3SGC=Dj)EoQ z@lB{6;MbY=7{REd=2a8%rOf_}WQ$dtLEGDljjAm=8D!4!T++-z#9w7qL%KRMl`&>B z*_%6}Xh{LcgKWihFice5f@(sh03L~B!%6)|m2tJrIOW;wPy#f2)~WIC)?C}Qef6`Y zclINU!PWNjVF!nJd4{=XTk?7hE2~dwIvb|58{}4o&akCRkgoxRGCrSJnb#AB=9gIOs&HY z)v)C&E8kufQgtp}frhXlO_p)CPJ3fo@;!)1sb+OSlYy_Proh+b6TPQ-e&$1)$W@d{~^f?>xU zZqU2gNt>xVJ32Z#4(Ukb3&#DNVs8Vd0eN)Lc2kV5EP`(OcjR#5Q@4P<5X)VP zN~^6!la}OgWoEQ+Bg1$vi^a{&u25=V{cDcbTYO&ONqc@TME$McnQ~+=SXb`zPt|FA z$5IrnI(6+W2rn1(&CQq?$d*&9bWVCPh_!`Fg-vG6_yt3oq z;7HieKegge>MmGL@euW6(}>d$4vHTACcUhMhP!nN_Dkfx*7TfM=NPAy z$~m-lnqCD2=^HrV%VJ>ur^eR4Y#O09e`SX-Y{kxUN_2zef5Qv-p@$yAOj$% zU|rGKARNa#>6I)0^B0h`?WT|)N@#g*4#Kp221Z6T<0sDcPi)E62&7nc|E8w%>m&i2 zPbcs5%Ln9JTU%HZ^tz?Wc;0+~6&2f_!H@&B|0KlmnIl6WMB@$;8^nfxqyr zmGz;M*=&&{h$23EP#VZw^6h^C=}zK5KwA3Z-Q8oahm_|c5C0oTB}4xO(uG4Ebm-?a z;9i4T!d#APIs(4O+0$^KNoKv?N|bFE7;r!F3Y~6^Zu9ZZhjODGK5{>~P|AxT(nb-< zd27z$rry}K-@R~9c?BV<;IN6V^bGL|u|z3dWDJrdr=c#^pBD6poV!PPJ!u;S^EvT8>Wp zaoXNSGMZ-GtWU>`4s%LL-S7>9XLxQ~gG0Ao9W-4+0S!TPtTs$6%Y-ylRY&5IhG{V# zpO;z#ifdik>XAV&HqAE=b?LtcKY!Y92Tdww<9sge;2j|91Ykpkj_W%gvI6NLw~YIn zF3!pdc~w*8C(wu!U)x`K=MPbzdN?{b9GuRd9tift9ci48sM<)bjLv?bg-YXzmE~(iYFe6kmyscX_GE0K5B8Sv|){L^2B!r3W?>p-7*hp z?XHL~d@o5kEYr-~1J*J<5|!`6i*l-(7{Za0DDB^ntWSk*<_`?{+Bsu8#tEtEMazmj zpl<85E}6`7!v-5zmym`2q0P~&)r&_IDXFaP1wEflvoT`5{$ZdV>9i|E30L8YJGk^T z!jC+!|2UtOh)_KeN=?1qNNnA6!ttxMHzF> zu_mk3ajVJC{?CKSu+urx!uCSRXh5!kwh0~m50CEuEhEhs#~jvy8K86rMvr&u7r+)m znxVDSCgLWN2JSpRJLYq!@`|$S$9cy~l@V;LFq;_hm5ZRDWr5IN2+3ri?$K65H;bMkU&5`Tp|DdRk#=j`~OgOi%$7ZOBqdz`!T%tabUs#`9 zBK?g@lvzrTa3c!=Wj@{}v%clK4c*cNj@CW+WU$%tWi%Ym6k2ZxBO5w4CRtzC`B=u} z)b7dx%^mDc7jC>==+Cq;4O5)&aXiCTt*X6t!>W&lR5Eqc)Cmc6=#S$>hi{eXa54_< zgH@id3~LL5N5r0-ox?lU!}t~75K%<8$`{X<3&y$l(u)tPJPWk{0>svw0{&Y*8iu?7 z7Efai@y~d)or*i`NQqDAVNC$!z-z{zhIk>1nh*Yek4MedwSwk!!^rKUTSI$)E!8Rl z_!mPnM-PVkX;r8MmAKxOu#Cf#lrV{}T>^j;#F>s#9+`z(h2)N+b#I>+k49^>V7zk< zs7VU49~%|xvhZsAfX6J>-%%R)E$gX41X*g%E0T(HHgvldpM_ZI`cA!p%>(O=6#-oy zT0lxP3s6b=OAXDjoz+hPk}Cm>*x(h;+}E)r*^N|jHUG*-i{1rk=HuISkXL`JGKVi- zQi52U4s@Dp#43|*hecj#!(Q%PNpe`_5HV`fH$RchU%)0k>|7zw{W5v&j%iv?HUH37 z5f#-UlD$uCzMadi(90{Y7-|b@d2u}QxkPAi$-Il0{LXhn7^$_ag37L7pP!fef{hUV{`)a%^Tkx3!anrTERSyir~&S+G+i0w}>Q#cu`ix zv#KB1kAu$_5R7NYC>HZqJ~0XwUBpQzf#;bRQ-J2J?IwSo)edG#x(XqcmR!Xk|Cv*X zcN<(!HYDSF9N)~we69KLEzq@aHj+0XC(JBVg8(`4X{l3vc=S_ic+(#zX2QkFWd@0m zryVxoc{sk8liJ1weNR(x5q|nGo}@sNAN6UK70O7E~f1>Ywz zLEEDR6q+n<<{e-owFDZVNimej+`-l^xFZvHY6?5NF?ec*-yZQ7fp_Mt=SZYTTT4sb zzNe8D1EFBB-RxAi0=VyAh`D zr7IckOm~uYf=%W_$%RQa7x-sugy*)px_Wn}!pI$#a4TzSOUHp_|7sHKF0iE&D)LZ; z?>O%x*2|!4yNSO6TjHF;+1Snx>&{I4-oRufKmOUbvB=Z)qhe%MRY=HOO14|mn$hw@ zwNOdkyXQKl_|C+5Zn+^w@dP4*dTB6^$c@v1Gp`8!1wrE8_Y-~04}2`ZT^ld1UZeRf z+n2V=g(fLi+5+hEX2=j{8Rl$#=cpf1?jB!G0)m@#|4K^NTcE7kYaYKP6ZPCEx~>yfcsc%)`NTi6BLV_@3lkCHI23&M4N5 zr=uA091w{^uyt_V?=buA(P Xx7t9V)T!h9*8r$0YAHbEtit~XuhhT? literal 0 HcmV?d00001 diff --git a/res/images/applist_on.png b/res/images/applist_on.png new file mode 100755 index 0000000000000000000000000000000000000000..c2b621080d9e3d765a4bf915c433d11ec1318b3f GIT binary patch literal 13645 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 literal 0 HcmV?d00001 diff --git a/res/images/home_off.png b/res/images/home_off.png new file mode 100755 index 0000000000000000000000000000000000000000..885123b10b1da0693a7d68c609c91974100ac9bf GIT binary patch literal 8795 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 3.2-14) to ensure that this file is present -# and status_of_proc is working. -. /lib/lsb/init-functions - -# -# Function that starts the daemon/service -# -do_start() -{ - # Make sure we have a sane XDG_RUNTIME_DIR environment - # variable set. - if [ -z "${XDG_RUNTIME_DIR}" ]; then - . /etc/profile.d/weston.sh - fi - - # Return - # 0 if daemon has been started - # 1 if daemon was already running - # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ - || return 1 - - # kill pulseaudio and weston, and start pulseaudio - /usr/bin/killall pulseaudio > /dev/null 2>&1 - /usr/bin/killall weston > /dev/null 2>&1 - /bin/sleep 0.2 - /usr/bin/killall -9 pulseaudio > /dev/null 2>&1 - /usr/bin/killall -9 weston > /dev/null 2>&1 - /bin/sleep 0.2 - /usr/bin/pulseaudio --system & - /bin/sleep 0.2 - - # Start Device Input Controller for eGalax TouchPanel - #/usr/bin/ico_ictl-touch_egalax -t - /usr/bin/ico_ictl-touch_egalax - # Remove weston log - /bin/rm -f /var/log/weston.log - /bin/ps ax | /bin/grep launchpad_preloading | /bin/grep -v grep > /dev/null - if [ "$?" = "0" ] ; then - /usr/bin/killall launchpad_preloading_preinitializing_daemon - /bin/sleep 0.3 - fi - /usr/bin/launchpad_preloading_preinitializing_daemon & - - # start-stop-daemon --start --background --quiet --pidfile $PIDFILE --exec $DAEMON -- \ - # $DAEMON_ARGS \ - # || return 2 - $DAEMON $DAEMON_ARGS & - weston_pid=$! - /bin/sleep 0.2 - - if [ $weston_pid = 0 ]; then - return 2 - else - echo $weston_pid > $PIDFILE - fi - - # Add code here, if necessary, that waits for the process to be ready - # to handle requests from services started subsequently which depend - # on this one. As a last resort, sleep for some time. - - # ************************************************************ - # HACK TO WORK AROUND INSUFFICIENT ACCESS PERMISSIONS FOR - # UNPRIVILEGED USERS. - # - # Ideally we should launch weston with weston-launch with the - # appropriate --user flag. Unfortunately, weston-launch isn't - # available due to missing package dependencies. - # ************************************************************ - wayland_socket="$XDG_RUNTIME_DIR/wayland-0" - MAX_ATTEMPTS=8 - attempt=0 - while [ ! -f $wayland_socket ] && [ $attempt -lt $MAX_ATTEMPTS ] - do - /bin/sleep 0.5 - attempt=$[$attempt + 1] - done - /bin/chmod 777 $wayland_socket - - # Start wayland-client for display mouse cursor - #/usr/bin/nice -19 /usr/bin/wayland-smoke & - - ## if pulseaudio dose not start ... kick pulseaudio - /bin/ps ax | /bin/grep pulseaudio | /bin/grep -v grep > /dev/null - if [ "$?" = "1" ] ; then - /usr/bin/pulseaudio --system & - /bin/sleep 1 - fi - - # Start HomeScreen - /bin/sleep 1 - /bin/mkdir /tmp/log/ - /bin/chmod -R 0777 /tmp/log - /bin/rm -f /tmp/log/* - /usr/bin/killall menu-screen - /usr/bin/killall menu-daemon - /usr/bin/killall power_manager - /usr/bin/launch_app org.tizen.ico.homescreen & - - # *********************************************************** - # HACK TO WORK AROUND BROKEN INFINITE LOOPS IN BOOT ANIMATION - # VIRTUAL KEYBOARD BOOT SCRIPTS. - # *********************************************************** - touch /tmp/.X0-lock - touch /tmp/.wm_ready - # *********************************************************** -} - -# -# Function that stops the daemon/service -# -do_stop() -{ - # Return - # 0 if daemon has been stopped - # 1 if daemon was already stopped - # 2 if daemon could not be stopped - # other if a failure occurred - #start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME - start-stop-daemon --stop --quiet --pidfile $PIDFILE --name $NAME - RETVAL="$?" - [ "$RETVAL" = 2 ] && return 2 - # Wait for children to finish too if this is a daemon that forks - # and if the daemon is only ever run from this initscript. - # If the above conditions are not satisfied then add some other code - # that waits for the process to drop all resources that could be - # needed by services started subsequently. A last resort is to - # sleep for some time. - #start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON - start-stop-daemon --stop --quiet --oknodo --exec $DAEMON - [ "$?" = 2 ] && return 2 - # Many daemons don't delete their pidfiles when they exit. - rm -f $PIDFILE - return "$RETVAL" -} - -# -# Function that sends a SIGHUP to the daemon/service -# -do_reload() { - # - # If the daemon can reload its configuration without - # restarting (for example, when it is sent a SIGHUP), - # then implement that here. - # - start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME - return 0 -} - -case "$1" in - start) - [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" - do_start - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - stop) - [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" - do_stop - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - status) - status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? - ;; - #reload|force-reload) - # - # If do_reload() is not implemented then leave this commented out - # and leave 'force-reload' as an alias for 'restart'. - # - #log_daemon_msg "Reloading $DESC" "$NAME" - #do_reload - #log_end_msg $? - #;; - restart|force-reload) - # - # If the "reload" option is implemented then remove the - # 'force-reload' alias - # - log_daemon_msg "Restarting $DESC" "$NAME" - do_stop - case "$?" in - 0|1) - do_start - case "$?" in - 0) log_end_msg 0 ;; - 1) log_end_msg 1 ;; # Old process is still running - *) log_end_msg 1 ;; # Failed to start - esac - ;; - *) - # Failed to stop - log_end_msg 1 - ;; - esac - ;; - *) - #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 - exit 3 - ;; -esac - -: diff --git a/src/Makefile.am b/src/Makefile.am index c0b40db..3daae98 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,7 @@ HomeScreen_SOURCES = \ home_screen_sound.c \ resource_conf.c HomeScreen_CFLAGS = -I../include $(EFL_CFLAGS) $(OPT_CFLAGS) $(WL_CFLAGS) $(AUL_CFLAGS) -HomeScreen_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so $(AUL_LIBS) +HomeScreen_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so OnScreen_SOURCES = \ on_screen.c \ @@ -25,15 +25,15 @@ OnScreen_SOURCES = \ home_screen_sound.c \ resource_conf.c OnScreen_CFLAGS = -I../include $(EFL_CFLAGS) $(OPT_CFLAGS) $(WL_CFLAGS) $(AUL_CFLAGS) -OnScreen_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so $(AUL_LIBS) +OnScreen_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so StatusBar_SOURCES = \ status_bar.c \ home_screen_conf.c \ home_screen_sound.c \ resource_conf.c -StatusBar_CFLAGS = -I../include $(EFL_CFLAGS) $(OPT_CFLAGS) $(WL_CFLAGS) $(AUL_CFLAGS) -StatusBar_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so $(AUL_LIBS) +StatusBar_CFLAGS = -I../include $(EFL_CFLAGS) $(OPT_CFLAGS) $(WL_CFLAGS) $(AUL_CFLAGS) +StatusBar_LDADD = $(EFL_LIBS) $(OPT_LIBS) $(WL_LIBS) $(COMMON_LIBS) ../apps_controller/libico_syc-apc.a ../ico-app-framework/.libs/libico-app-fw-efl.so ../ico-app-framework/.libs/libico-app-fw.so SUFFIXES = .edc .edj diff --git a/src/home_screen_lib.c b/src/home_screen_lib.c index 11d932b..2ed2ac8 100644 --- a/src/home_screen_lib.c +++ b/src/home_screen_lib.c @@ -136,35 +136,35 @@ static int hs_lib_callback_app(struct libwebsocket_context *context, /*============================================================================*/ /* table */ /*============================================================================*/ -static struct libwebsocket_protocols protocols[] = { +static struct libwebsocket_protocols protocols[] = { { - "http-only", - hs_lib_callback_http, + "http-only", + hs_lib_callback_http, 0 - }, + }, { /* HomeScreen - command */ - ICO_HS_PROTOCOL_CM, - hs_lib_callback_command, + ICO_HS_PROTOCOL_CM, + hs_lib_callback_command, 0 - }, + }, { /* HomeScreen - StatusBar */ - ICO_HS_PROTOCOL_SB, - hs_lib_callback_statusbar, + ICO_HS_PROTOCOL_SB, + hs_lib_callback_statusbar, 0 - }, + }, { /* HomeScreen - OnScreen */ - ICO_HS_PROTOCOL_OS, - hs_lib_callback_onscreen, + ICO_HS_PROTOCOL_OS, + hs_lib_callback_onscreen, 0 - }, + }, { /* HomeScreen - OtherNatiiveApps */ - ICO_HS_PROTOCOL_APP, - hs_lib_callback_app, + ICO_HS_PROTOCOL_APP, + hs_lib_callback_app, 0 - }, + }, { - NULL, - NULL, + NULL, + NULL, 0 } }; @@ -175,7 +175,7 @@ static struct libwebsocket_protocols protocols[] = { /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_handle_command - * callback at received message from external command tools, + * callback at received message from external command tools, * and handle the message. * * @param[in] msg received message @@ -247,7 +247,7 @@ hs_lib_handle_command(hs_lib_msg_t *msg) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_handle_application - * callback at received message from a application, and handle the + * callback at received message from a application, and handle the * message. * * @param[in] msg received message @@ -300,7 +300,7 @@ hs_lib_handle_application(hs_lib_msg_t *msg) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_handle_onscreen - * callback at received message from onscreen, and handle the + * callback at received message from onscreen, and handle the * message. * * @param[in] msg received message @@ -375,7 +375,7 @@ hs_lib_handle_onscreen(hs_lib_msg_t *msg) /* do nothing */ } else if (strcmp(hs_active_onscreen, ICO_UXF_PROC_DEFAULT_HOMESCREEN) - == 0) { + == 0) { /* get 2nd phrase */ ptr = get_parsed_str(p_msg_data, tmp_buf, sizeof(tmp_buf), 1); if (strncmp(getFileName(ptr, strlen(ptr)), @@ -436,6 +436,11 @@ hs_lib_handle_onscreen(hs_lib_msg_t *msg) memset(hs_active_onscreen, 0, sizeof(hs_active_onscreen)); } + else { + hs_hide_onscreen(); + memset(hs_active_onscreen, 0, + sizeof(hs_active_onscreen)); + } } } else if (strncmp(getFileName(ptr, strlen(ptr)), @@ -500,7 +505,7 @@ hs_lib_handle_onscreen(hs_lib_msg_t *msg) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_handle_statusbar - * callback at received message from statusbar, and handle the + * callback at received message from statusbar, and handle the * message. * * @param[in] msg received message @@ -510,10 +515,94 @@ hs_lib_handle_onscreen(hs_lib_msg_t *msg) static void hs_lib_handle_statusbar(hs_lib_msg_t *msg) { - uifw_trace("hs_lib_handle_statusbar: Enter"); - /* clicked escutcheon button and send a command to outer commander */ + hs_lib_msg_t *send; + char tmp_buf[ICO_HS_MSG_SIZE]; + char *cmd; + Ico_Uxf_ProcessWin wins[1]; + Ico_Uxf_ProcessAttr attr; + int ret; + int idx; + int cnt = 0; + + uifw_trace("hs_lib_handle_statusbar: Enter(%s)", msg->data); + if (strncmp("CLICK ESCUTCHEON", msg->data, 16) == 0) { + /* clicked escutcheon button and send a command to outer commander */ hs_click_escutcheon(); + /* send "Receive OK" message to statusbar */ + send = hs_lib_alloc_msg("RECEIVE OK", strlen("RECEIVE OK")); + if (send) { + send->type = ICO_HS_PROTOCOL_TYPE_SB; + hs_lib_put_sendmsg(send); + } + } + else if (strncmp("OPEN", msg->data, 4) == 0) { + /* forward the message to onscreen */ + if (hs_click_applist()) { + send = hs_lib_alloc_msg(msg->data, msg->len); + if (send) { + strncpy(hs_active_onscreen, ICO_UXF_PROC_DEFAULT_HOMESCREEN, + sizeof(hs_active_onscreen)); + send->type = ICO_HS_PROTOCOL_TYPE_OS; + hs_lib_put_sendmsg(send); + } + } + /* send "Receive OK" message to statusbar */ + send = hs_lib_alloc_msg("RECEIVE OK", strlen("RECEIVE OK")); + if (send) { + send->type = ICO_HS_PROTOCOL_TYPE_SB; + hs_lib_put_sendmsg(send); + } + } + else if (strncmp("SHOW", msg->data, 4) == 0) { + /* show the application on the application screen */ + cmd = get_parsed_str(msg->data, tmp_buf, sizeof(tmp_buf), 1); + if (cmd) { + /* wait for creating the application's window */ + memset(wins, 0, sizeof(wins)); + while (wins[0].window <= 0) { + ret = ico_uxf_process_window_get(cmd, wins, 1); + if (ret > 0) { + ret = ico_uxf_process_attribute_get(cmd, &attr); + if (wins[0].window > 0) { + break; + } + else if ((ret >= 0) && (attr.status != ICO_UXF_PROCSTATUS_RUN)) { + /* launch the application */ + ret = ico_uxf_process_execute(cmd); + if ((ret == ICO_UXF_EOK) || (ret == ICO_UXF_EBUSY)) { + idx = hs_tile_get_index_app(cmd); + if (idx < 0) { + idx = hs_tile_get_minchange(); + } + hs_tile_set_app(idx, cmd); + } + } + } + else { + /* unknown application */ + break; + } + usleep(10000); + ecore_main_loop_iterate(); + + if (cnt > 100) { + break; + } + else { + cnt++; + } + } + + /* show the application screen*/ + hs_show_appscreen(cmd); + } + /* send "Receive OK" message to statusbar */ + send = hs_lib_alloc_msg("RECEIVE OK", strlen("RECEIVE OK")); + if (send) { + send->type = ICO_HS_PROTOCOL_TYPE_SB; + hs_lib_put_sendmsg(send); + } } uifw_trace("hs_lib_handle_statusbar: Leave"); } @@ -523,7 +612,7 @@ hs_lib_handle_statusbar(hs_lib_msg_t *msg) * @brief hs_lib_alloc_msg * Allocate a msg structure * - * @param[in] data data + * @param[in] data data * @param[in] len data length * @return address * @retval > 0 success @@ -560,9 +649,9 @@ hs_lib_alloc_msg(char *data, int len) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_free_msg - * free the msg + * free the msg * - * @param[in] data data + * @param[in] data data * @param[in] free data lenght * @return none */ @@ -589,7 +678,7 @@ hs_lib_free_msg(hs_lib_msg_t *msg) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_free_handle - * free the indecated handle. + * free the indecated handle. * * @param handle handle to free * @return none @@ -624,7 +713,7 @@ hs_lib_free_handle(hs_lib_handle_t *handle) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_alloc_handle - * Allocate handle. + * Allocate handle. * * @param none * @return address @@ -676,7 +765,7 @@ hs_lib_realsend(hs_lib_msg_t *msg) strcpy((char*)pt, msg->data); - uifw_trace("hs_lib_realsend: send(wsi=%x, type=h:%d(m:%d), len=%d, msg=%s)", + uifw_trace("hs_lib_realsend: send(wsi=%x, type=h:%d(m:%d), len=%d, msg=%s)", msg->handle->wsi, msg->handle->type, msg->type, msg->len, msg->data); n = libwebsocket_write(msg->handle->wsi, pt, strlen((char *)pt), LWS_WRITE_TEXT); @@ -738,7 +827,7 @@ hs_lib_get_sendmsg(int type) * @brief hs_lib_put_sendmsg * put the send message to the send queue end. * - * @param[in] data send message + * @param[in] data send message * @return result * @retval ICO_HS_OK success * @retval ICO_HS_ERR error @@ -798,7 +887,7 @@ hs_lib_put_sendmsg(hs_lib_msg_t *send) * @brief hs_lib_get_recvmsg * get the receive message from the receive queue end. * - * @param none + * @param none * @return recv message address * @retval > 0 success * @retval NULL error @@ -823,7 +912,7 @@ hs_lib_get_recvmsg(void) * @brief hs_lib_put_recvmsg * put the receive message to the receive queue end. * - * @param[in] data receive message + * @param[in] data receive message * @return none */ /*--------------------------------------------------------------------------*/ @@ -852,7 +941,7 @@ hs_lib_put_recvmsg(hs_lib_msg_t *recv) * @brief hs_lib_com_dispatch * The accumulated data that transmitted or received is procecssed * - * @param[in] _handle connect handle, + * @param[in] _handle connect handle, * if NULL target is all connection * @param[in] timeoutms maximum wait time on miri-sec. * 0 is no wait, -1 is wait forever. @@ -939,7 +1028,7 @@ hs_lib_poll_fd_event(hs_lib_poll_t *poll, int flags) /*--------------------------------------------------------------------------*/ /** * @brief hs_lib_ecore_fdevent - * callback function called by Ecore when the websocket's file + * callback function called by Ecore when the websocket's file * descriptor had change * * @param[in] data user data(ico_apf_com_poll_t) @@ -1343,7 +1432,7 @@ hs_lib_callback_http(struct libwebsocket_context *context, /*--------------------------------------------------------------------------*/ /* * @brief hs_lib_callback_command - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * command protocol * * @param[in] context libwebsockets context @@ -1471,7 +1560,7 @@ hs_lib_callback_command(struct libwebsocket_context *context, /*--------------------------------------------------------------------------*/ /* * @brief hs_lib_callback_statusbar - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * statusbar protocol * * @param[in] context libwebsockets context @@ -1588,7 +1677,7 @@ hs_lib_callback_statusbar(struct libwebsocket_context *context, /*--------------------------------------------------------------------------*/ /* * @brief hs_lib_callback_onscreen - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * statusbar protocol * * @param[in] context libwebsockets context @@ -1707,7 +1796,7 @@ hs_lib_callback_onscreen(struct libwebsocket_context *context, /*--------------------------------------------------------------------------*/ /* * @brief hs_lib_callback_app - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * application protocol * * @param[in] context libwebsockets context diff --git a/src/home_screen_main.c b/src/home_screen_main.c index 436c5ae..d66b17d 100644 --- a/src/home_screen_main.c +++ b/src/home_screen_main.c @@ -24,16 +24,16 @@ #include #include +#include "ico_apf.h" #include "ico_uxf.h" #include "ico_uxf_conf.h" +#include "ico_syc_apc.h" +#include "ico_uxf_conf_ecore.h" -#include "ico_apf_log.h" #include "home_screen_lib.h" #include "home_screen_res.h" #include "home_screen_conf.h" #include "home_screen_parser.h" -#include "ico_uxf_conf_common.h" -#include "ico_syc_apc.h" /*============================================================================*/ /* definition */ @@ -57,6 +57,7 @@ struct _hs_tile_info { }; #define HS_DISPLAY_HOMESCREEN 0 /* HomeScreen target display Id */ +#define NUM_ONSCREEN_WINDOWS 10 /* max number of windows in OnScreen*/ #define HS_LAYER_BACKGROUND 0 /* layer of BackGround */ #define HS_LAYER_HOMESCREEN 1 /* layer of HomeScreen menu */ @@ -70,6 +71,7 @@ struct _hs_tile_info { /* static(internal) functions prototype */ /*============================================================================*/ static int hs_is_special_app(const char *appid); +static int hs_is_noicon_app(const char *appid); static void hs_set_invisible_all(void); static void hs_set_appscreen(const char *appid); static void hs_tile_start_apps(void); @@ -83,15 +85,18 @@ static void hs_sound_control(const Ico_Uxf_conf_application *conf, const int adj static void hs_input_control(const Ico_Uxf_conf_application *conf, const int inputsw); static void *hs_create_window(int type); static void hs_touch_up_api_list(void *data, Evas *evas, Evas_Object *obj, - void *event_info); + void *event_info); static void hs_touch_down_api_list(void *data, Evas *evas, Evas_Object *obj, - void *event_info); + void *event_info); static Eina_Bool hs_ecore_timer_event(void *data); static void hs_touch_up_tile(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void hs_touch_down_tile(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void hs_add_touch_listener(Evas *canvas_fg); static void hs_add_bg_image(Evas *canvas_bg); static void hs_terminate_all_app(void); +static void hs_regulation_listener(const int appcategory, + const ico_apc_reguration_control_t control, + void *user_data); /*============================================================================*/ /* variables and tables */ @@ -107,6 +112,9 @@ static char gStatusbarName[ICO_UXF_MAX_PROCESS_NAME + 1]; static char gOnscreenName[ICO_UXF_MAX_PROCESS_NAME + 1]; static hs_tile_info_t *hs_tile_info; static int hs_tile_cnt = 0; +static int hs_notile_cnt = 0; +static int hs_regulation_category = 0; +static int hs_regulation_visible = 1; /*============================================================================*/ /* functions */ @@ -180,12 +188,18 @@ hs_uxf_event(int ev, Ico_Uxf_EventDetail dd, int arg) else { /* other normal application */ if (hs_is_special_app(winAttr.process) == FALSE) { - if (hs_stat_touch == ICO_HS_TOUCH_IN_SHOW) { + if (hs_is_noicon_app(winAttr.process) != FALSE) { + hs_set_appscreen(winAttr.process); + if (hs_stat_touch == ICO_HS_TOUCH_IN_SHOW) { + hs_tile_show_screen(); + } + } + else if (hs_stat_touch == ICO_HS_TOUCH_IN_SHOW) { /* set layer of Application in HomeScreen menu */ ico_uxf_window_layer(dd.window.window, HS_LAYER_HOMESCREEN); hs_tile_show_screen(); } - if (hs_stat_touch == ICO_HS_TOUCH_IN_HIDE) { + else if (hs_stat_touch == ICO_HS_TOUCH_IN_HIDE) { hs_set_appscreen(winAttr.process); } } @@ -342,6 +356,8 @@ hs_set_appscreen(const char *appid) int ret; Ico_Uxf_ProcessWin window; const Ico_Uxf_conf_application *appConf; + const Ico_Uxf_Sys_Config *sysConf; + Ico_Uxf_conf_display_zone *zone; idx = hs_get_index_appscreendata(appid); @@ -352,27 +368,10 @@ hs_set_appscreen(const char *appid) /* visible raise */ ret = ico_uxf_process_window_get(hs_app_screen_window[idx].appid, &window, 1); if ((ret > 0) || (ret == ICO_UXF_E2BIG)) { - uifw_trace( - "hs_set_appscreen: app[%d]:visible=%d raise=%d %dx%d(%d,%d)", - idx, hs_app_screen_window[idx].visible, - hs_app_screen_window[idx].raise, - hs_app_screen_window[idx].resize_w, - hs_app_screen_window[idx].resize_h, - hs_app_screen_window[idx].move_x, - hs_app_screen_window[idx].move_y); -#if 0 -#if 1 /* 05/15 TEST TEST TEST */ - if ((hs_app_screen_window[idx].move_x < 0) && - (hs_app_screen_window[idx].move_y < 0)) { - hs_app_screen_window[idx].visible = 1; - hs_app_screen_window[idx].raise = 1; - hs_app_screen_window[idx].resize_w = 1920; - hs_app_screen_window[idx].resize_h = 1016; - hs_app_screen_window[idx].move_x = 0; - hs_app_screen_window[idx].move_y = 64; - } -#endif -#endif + uifw_trace("hs_set_appscreen: app[%d]:visible=%d raise=%d %dx%d(%d,%d)", + idx, hs_app_screen_window[idx].visible, hs_app_screen_window[idx].raise, + hs_app_screen_window[idx].resize_w, hs_app_screen_window[idx].resize_h, + hs_app_screen_window[idx].move_x, hs_app_screen_window[idx].move_y); /* move application window to application layer */ appConf = ico_uxf_getAppByAppid(hs_app_screen_window[idx].appid); if (! appConf) { @@ -384,6 +383,23 @@ hs_set_appscreen(const char *appid) ico_uxf_window_layer(window.window, appConf->display[0].layerId); /* show application layer */ ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, appConf->display[0].layerId, 1); + + if ((hs_app_screen_window[idx].resize_w <= 0) && + (hs_app_screen_window[idx].resize_h <= 0) && + (hs_app_screen_window[idx].move_x <= 0) && + (hs_app_screen_window[idx].move_y <= 0)) { + /* not set size and position, set default(zone size) */ + sysConf = ico_uxf_getSysConfig(); + zone = (Ico_Uxf_conf_display_zone *)&sysConf-> + display[appConf->display[0].displayId]. + zone[appConf->display[0].zoneId]; + hs_app_screen_window[idx].resize_w = zone->width; + hs_app_screen_window[idx].resize_h = zone->height; + hs_app_screen_window[idx].move_x = zone->x; + hs_app_screen_window[idx].move_y = zone->y; + hs_app_screen_window[idx].visible = 1; + hs_app_screen_window[idx].raise = 1; + } } ico_uxf_window_move(window.window, hs_app_screen_window[idx].move_x, hs_app_screen_window[idx].move_y); @@ -480,8 +496,7 @@ hs_show_appscreen(const char *appid) uifw_trace("hs_show_appscreen: move %d=%dx%d(%d,%d)", ii, hs_app_screen_window[ii].resize_w, hs_app_screen_window[ii].resize_h, - hs_app_screen_window[ii].move_x, - hs_app_screen_window[ii].move_y); + hs_app_screen_window[ii].move_x, hs_app_screen_window[ii].move_y); /* move application window to application layer */ ico_uxf_window_resize(window.window, hs_app_screen_window[ii].resize_w, @@ -506,6 +521,10 @@ hs_show_appscreen(const char *appid) } /* hide HomeScreen layer menu */ ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_HOMESCREEN, 0); + /* hide Touch layer */ + ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_TOUCH, 0); + /* hide OnScreen windows */ + hs_hide_onscreen(); /* show own apps */ if (appid != NULL) { @@ -584,7 +603,6 @@ hs_show_appscreen(const char *appid) ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_HOMESCREEN, 0); } } - hs_stat_touch = ICO_HS_TOUCH_IN_HIDE; ico_uxf_main_loop_iterate(); @@ -606,25 +624,49 @@ hs_tile_start_apps(void) { char cName[ICO_UXF_MAX_PROCESS_NAME + 1]; int idx, ret; + int idx1, idx2; const char *appName; + const Ico_Uxf_App_Config *appConf; hs_tile_info_t *tinfo; - /* excute */ + /* excute applications in tile menu */ for (idx = 0; idx < hs_tile_cnt; idx++) { tinfo = &hs_tile_info[idx]; - if (tinfo->valid == 0) - continue; sprintf(cName, ICO_HS_CONFIG_TILE_APP"%d", idx); + if (tinfo->valid == 0) continue; + sprintf(cName, ICO_HS_CONFIG_TILE_APP"%d", idx); appName = hs_conf_get_string(ICO_HS_CONFIG_HOMESCREEN, cName, NULL); if ((appName != NULL) && (strcmp(appName, "none") != 0)) { ret = ico_uxf_process_execute(appName); if (ret >= 0) { - uifw_trace("hs_tile_start_apps: execute tile[%d]=%s", idx, - appName); + uifw_trace("hs_tile_start_apps: execute tile[%d]=%s", idx, appName); memset(tinfo->appid, 0, ICO_UXF_MAX_PROCESS_NAME + 1); strncpy(tinfo->appid, appName, ICO_UXF_MAX_PROCESS_NAME); } } } + + /* excute no menu applications */ + appConf = ico_uxf_getAppConfig(); + idx = hs_tile_cnt; + for (idx1 = 0; idx1 < appConf->applicationNum; idx1++) { + if (appConf->application[idx1].autostart == 0) continue; + for (idx2 = 0; idx2 < hs_tile_cnt; idx2++) { + if (! strcmp(hs_tile_info[idx2].appid, appConf->application[idx1].appid)) break; + } + if (idx2 >= hs_tile_cnt) { + ret = ico_uxf_process_execute(appConf->application[idx1].appid); + if (ret >= 0) { + uifw_trace("hs_tile_start_apps: execute no tile[%d]=%s", + idx, appConf->application[idx1].appid); + memset(hs_tile_info[idx].appid, 0, ICO_UXF_MAX_PROCESS_NAME + 1); + strncpy(hs_tile_info[idx].appid, + appConf->application[idx1].appid, ICO_UXF_MAX_PROCESS_NAME); + idx ++; + if ((idx - hs_tile_cnt) >= ICO_HS_NOTILE_APP_MAX) break; + } + } + } + hs_notile_cnt = idx - hs_tile_cnt; } /*--------------------------------------------------------------------------*/ @@ -663,9 +705,9 @@ hs_tile_init_info(void) tilecnt = colcnt * rowcnt; /* allocate tile info structure */ - hs_tile_info = malloc(sizeof(hs_tile_info_t) * tilecnt); - valid = (int *)malloc(sizeof(int) * tilecnt); - type = (int *)malloc(sizeof(int) * tilecnt); + hs_tile_info = malloc(sizeof(hs_tile_info_t) * (tilecnt + ICO_HS_NOTILE_APP_MAX)); + valid = (int *)malloc(sizeof(int) * (tilecnt + ICO_HS_NOTILE_APP_MAX)); + type = (int *)malloc(sizeof(int) * (tilecnt + ICO_HS_NOTILE_APP_MAX)); if (!hs_tile_info || !valid || !type) { uifw_warn("hs_tile_init_info: Leave(err malloc tile str failed)"); return ICO_HS_ERR; @@ -802,6 +844,11 @@ hs_tile_show_screen(void) int idx, sid; hs_tile_info_t *tinfo; + if (hs_regulation_visible == 0) { + uifw_trace("hs_regulation_visible: regulation, no menu display"); + return; + } + /* all apps invisible */ /* hide HomeScreen layer menu */ ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_HOMESCREEN, 0); @@ -834,10 +881,12 @@ hs_tile_show_screen(void) } /* show HomeScreen layer menu */ ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_HOMESCREEN, 1); + /* show Touch layer */ + ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_TOUCH, 1); /* hide application layer */ ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_APPLICATION, 0); - /* chnage to noraml mode for AppsControler */ + /* chnage to menu mode for AppsControler */ ico_uxf_window_control(NULL, -1, ICO_UXF_APPSCTL_TEMPVISIBLE, 1); ico_uxf_main_loop_iterate(); @@ -892,12 +941,12 @@ hs_tile_get_minchange(void) for (ii = 0; ii < hs_tile_cnt; ii++) { tinfo = &hs_tile_info[ii]; - if ((tinfo->type != ICO_HS_TILE_OTHERS) && ((tinfo->change <= min) + if ((tinfo->type > ICO_HS_TILE_OTHERS) && ((tinfo->change <= min) || (min == -1))) { idx = ii; min = tinfo->change; } - if ((tinfo->type != ICO_HS_TILE_OTHERS) && (strlen(tinfo->appid) == 0)) { + if ((tinfo->type > ICO_HS_TILE_OTHERS) && (strlen(tinfo->appid) == 0)) { return ii; } } @@ -1044,10 +1093,6 @@ hs_show_onscreen(void) if ((ret > 0) || (ret == ICO_UXF_E2BIG)) { ico_uxf_window_layer(window.window, HS_LAYER_ONSCREEN); } - - usleep(10000); - - ico_uxf_main_loop_iterate(); } /*--------------------------------------------------------------------------*/ @@ -1071,10 +1116,6 @@ hs_hide_onscreen(void) ico_uxf_window_layer(window.window, HS_LAYER_BACKGROUND); ico_uxf_window_lower(window.window); } - - usleep(10000); - - ico_uxf_main_loop_iterate(); } /*--------------------------------------------------------------------------*/ @@ -1089,47 +1130,118 @@ hs_hide_onscreen(void) void hs_click_escutcheon(void) { - uifw_trace("hs_click_escutcheon: Enter"); + uifw_trace("hs_click_escutcheon: Enter(regulation=%d)", hs_regulation_visible); if (strlen(hs_active_onscreen) > 0) { - uifw_trace("hs_click_escutcheon: do nothing(active=%s)", hs_active_onscreen); + uifw_trace("hs_click_escutcheon: Leave(active=%s)", hs_active_onscreen); + return; + } + if (hs_regulation_visible == 0) { + uifw_trace("hs_click_escutcheon: Leave(regulation)"); return; } if (hs_stat_touch == ICO_HS_TOUCH_IN_SHOW) { + hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT)); uifw_trace("hs_click_escutcheon: hs_show_appscreen"); hs_show_appscreen(NULL); } else if (hs_stat_touch == ICO_HS_TOUCH_IN_HIDE) { + hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT)); uifw_trace("hs_click_escutcheon: hs_tile_show_screen"); hs_tile_show_screen(); } uifw_trace("hs_click_escutcheon: Leave"); } + +/*--------------------------------------------------------------------------*/ +/** + * @brief hs_click_applist + * processing when application list button is clicked. + * + * @param none + * @return regulation + * @retval =0 regulation controlled(no display) + * @retval =1 no regulation + */ +/*--------------------------------------------------------------------------*/ +int +hs_click_applist(void) +{ + uifw_trace("hs_click_applist: Enter(regulation=%d)", hs_regulation_visible); + + if (hs_regulation_visible == 0) { + uifw_trace("hs_click_applist: Leave(regulation)"); + return 0; + } + + /* operation sound */ + hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT)); + uifw_trace("hs_click_applist: Leave"); + + /* show Touch layer */ + ico_uxf_layer_visible(HS_DISPLAY_HOMESCREEN, HS_LAYER_TOUCH, 1); + /* show OnScreen windows */ + hs_show_onscreen(); + + return 1; +} + /*--------------------------------------------------------------------------*/ /** * @brief hs_is_special_app * return 1 if the application is special one(homescreen) * /statusbar/onscreen). * - * @param none - * @return none + * @param[in] appid applicationId + * @return special application + * @retval 1 special application(HomeScreen/StatusBar ... etc) + * @retval 0 normal application */ /*--------------------------------------------------------------------------*/ static int hs_is_special_app(const char *appid) { - uifw_trace("hs_is_special_app: Enter(%s)", appid); if ((strncmp(appid, hs_name_homescreen, ICO_UXF_MAX_PROCESS_NAME) == 0) || (strncmp(appid, gStatusbarName, ICO_UXF_MAX_PROCESS_NAME) == 0) || (strncmp(appid, gOnscreenName, ICO_UXF_MAX_PROCESS_NAME) == 0) || (strncmp(appid, ICO_HS_APPID_DEFAULT_TOUCH, ICO_UXF_MAX_PROCESS_NAME) == 0)) { - uifw_trace("hs_is_special_app: Leave(TURE)"); + uifw_trace("hs_is_special_app: app(%s) is special", appid); + return 1; + } + uifw_trace("hs_is_special_app: app(%s) is normal", appid); + return 0; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief hs_is_noicon_app + * return 1 if the application has no menu icon + * + * @param[in] appid applicationId + * @return no need menu + * @retval 1 no need menu + * @retval 0 need menu + */ +/*--------------------------------------------------------------------------*/ +static int +hs_is_noicon_app(const char *appid) +{ + const Ico_Uxf_conf_application *appConf; + + appConf = ico_uxf_getAppByAppid(appid); + if (! appConf) { + uifw_trace("hs_is_noicon_app: appid(%s) dose not exist", appid); + return 0; + } + + if (appConf->noicon) { + uifw_trace("hs_is_noicon_app: appid(%s) has no icon", appid); return 1; } - uifw_trace("hs_is_special_app: Leave(FALSE)"); + uifw_trace("hs_is_noicon_app: appid(%s) has icon", appid); return 0; } @@ -1382,8 +1494,11 @@ hs_touch_down_tile(void *data, Evas *evas, Evas_Object *obj, void *event_info) tinfo->l_press = 1; if (strlen(tinfo->appid) != 0) { } - /* add timer to detect long push */ - ecore_timer_add(ICO_HS_TOUCH_TIME_OUT, hs_ecore_timer_event, &tinfo->idx); + + if (tinfo->type > ICO_HS_TILE_OTHERS) { + /* add timer to detect long push */ + ecore_timer_add(ICO_HS_TOUCH_TIME_OUT, hs_ecore_timer_event, &tinfo->idx); + } } /*--------------------------------------------------------------------------*/ @@ -1460,7 +1575,7 @@ hs_add_touch_listener(Evas *canvas_fg) sprintf(img, "%s"fname_api_all_off, path); /* setup tile */ - for (idx = 0; idx < hs_tile_cnt - 1; idx++) { + for (idx = 0; idx < hs_tile_cnt; idx++) { tinfo = &hs_tile_info[idx]; if (tinfo->valid == 0) continue; @@ -1481,15 +1596,17 @@ hs_add_touch_listener(Evas *canvas_fg) } /* application menu icon */ tinfo = &hs_tile_info[hs_tile_cnt - 1]; - canvas = evas_object_image_filled_add(canvas_fg); - evas_object_image_file_set(canvas, img, NULL); - evas_object_move(canvas, tinfo->coord_x, tinfo->coord_y - ICO_HS_SIZE_SB_HEIGHT); - evas_object_resize(canvas, tinfo->size_x, tinfo->size_y); - evas_object_event_callback_add(canvas, EVAS_CALLBACK_MOUSE_UP, - hs_touch_up_api_list, &tinfo->idx); - evas_object_event_callback_add(canvas, EVAS_CALLBACK_MOUSE_DOWN, - hs_touch_down_api_list, &tinfo->idx); - evas_object_show(canvas); + if ((tinfo->valid == 0) && (tinfo->type == ICO_HS_TILE_APPLIST)) { + canvas = evas_object_image_filled_add(canvas_fg); + evas_object_image_file_set(canvas, img, NULL); + evas_object_move(canvas, tinfo->coord_x, tinfo->coord_y - ICO_HS_SIZE_SB_HEIGHT); + evas_object_resize(canvas, tinfo->size_x, tinfo->size_y); + evas_object_event_callback_add(canvas, EVAS_CALLBACK_MOUSE_UP, + hs_touch_up_api_list, &tinfo->idx); + evas_object_event_callback_add(canvas, EVAS_CALLBACK_MOUSE_DOWN, + hs_touch_down_api_list, &tinfo->idx); + evas_object_show(canvas); + } } /*--------------------------------------------------------------------------*/ @@ -1636,6 +1753,45 @@ hs_input_control(const Ico_Uxf_conf_application *conf, const int inputsw) /*--------------------------------------------------------------------------*/ /** + * @brief hs_regulation_listener: change regulation callback(static function) + * + * @param[in] appcategory category Id + * @param[in] control control(display/sound/input active/inactive) + * @param[in] user_data user data(unused) + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +hs_regulation_listener(const int appcategory, + const ico_apc_reguration_control_t control, void *user_data) +{ + if ((appcategory == hs_regulation_category) && + (control.display != ICO_SYC_APC_REGULATION_NOCHANGE)) { + uifw_trace("hs_regulation_listener: Enter(category=%d disp=%d)", + appcategory, control.display); + + if (control.display == ICO_SYC_APC_REGULATION_REGULATION) { + /* Invisible by reguration */ + if (hs_regulation_visible) { + hs_regulation_visible = 0; + if (hs_stat_touch == ICO_HS_TOUCH_IN_SHOW) { + uifw_trace("hs_regulation_listener: Change to App screen"); + hs_show_appscreen(NULL); + } + hs_hide_onscreen(); + memset(hs_active_onscreen, 0, sizeof(hs_active_onscreen)); + } + } + else { + /* Visible */ + uifw_trace("hs_regulation_listener: Change to ALl screen"); + hs_regulation_visible = 1; + } + } +} + +/*--------------------------------------------------------------------------*/ +/** * @brief main * homescreen main. initialize UXF, app manager, and ecore. * @@ -1742,6 +1898,22 @@ main(int argc, char *argv[]) /* HomeScreen Menu(touch) */ hs_create_window(ICO_HS_WINDOW_TYPE_TOUCH); + /* initiailze regulation control */ + hs_regulation_category = ico_uxf_getSysCategoryByName("CarSetting"); + ico_syc_apc_regulation_listener(hs_regulation_listener, NULL); + + if (hs_regulation_visible) { + uifw_trace("main: no regulation"); + hs_tile_show_screen(); + } + else { + uifw_trace("main: regulation"); + hs_show_appscreen(NULL); + } + + /* add callback to app configuration */ + ico_uxf_econf_setAppUpdateCb(NULL); + /* wait events */ ecore_main_loop_begin(); diff --git a/src/on_screen.c b/src/on_screen.c index 8c65d4a..07a0573 100644 --- a/src/on_screen.c +++ b/src/on_screen.c @@ -22,6 +22,7 @@ #include "ico_uxf.h" #include "ico_uxf_conf.h" +#include "ico_uxf_conf_ecore.h" #include "home_screen.h" #include "home_screen_res.h" @@ -72,14 +73,16 @@ static int ons_callback_onscreen( static void ons_create_context(void); static Eina_Bool ons_ecore_event(void *data); static void ons_on_destroy(Ecore_Evas *ee); -static void ons_touch_up_edje(void *data, Evas *evas, +static void ons_touch_up_edje(void *data, Evas *evas, Evas_Object *obj, void *event_info); -static void ons_touch_up_next(void *data, Evas *evas, Evas_Object *obj, +static void ons_touch_up_next(void *data, Evas *evas, Evas_Object *obj, void *event_info); static const char *ons_get_fname(const char *filepath); static int ons_get_appindex(int idx); static void ons_set_appicon(Evas *evas, Evas_Object *edje, Evas_Object* part, const char *partname); +static void ons_load_config(void); +static void ons_config_event(const char *appid, int type); /*============================================================================*/ /* variabe & table */ @@ -89,7 +92,6 @@ static int ons_ws_connected = 0; static struct libwebsocket_context *ons_ws_context = NULL; static struct libwebsocket *ons_wsi_mirror = NULL; static char ons_edje_str[ICO_ONS_BUF_SIZE]; -static char ons_respath[ICO_ONS_BUF_SIZE]; static Ecore_Evas *ons_window; /* ecore-evas object */ static Evas *ons_evas = NULL; /* evas object */ @@ -104,21 +106,21 @@ static ons_msg_t *ons_send_msg = NULL; static int ons_command_wait = ICO_ONS_NO_WAIT; -static struct libwebsocket_protocols ws_protocols[] = { +static struct libwebsocket_protocols ws_protocols[] = { { - "http-only", - ons_callback_http, + "http-only", + ons_callback_http, 0 - }, + }, { - "onscreen-protocol", - ons_callback_onscreen, - 0, - }, + "onscreen-protocol", + ons_callback_onscreen, + 0, + }, { /* end of list */ - NULL, - NULL, + NULL, + NULL, 0 } }; @@ -148,7 +150,7 @@ ons_event_message(char *format, ...) va_end(list); uifw_trace("OnScreen: ons_event_message %s", message); - + send = ons_alloc_seendmsg(message, strlen(message)); if (!send) { uifw_warn("ons_event_message: ERROR(allocate send msg)"); @@ -190,7 +192,7 @@ ons_get_sendmsg(void) * @brief ons_put_sendmsg * put the send message to the send queue end. * - * @param[in] data send message + * @param[in] data send message * @return result * @retval ICO_HS_OK success * @retval ICO_HS_ERR error @@ -237,7 +239,7 @@ ons_put_sendmsg(ons_msg_t *send) * @brief ons_alloc_seendmsg * Allocate a send message buffer. * - * @param[in] data data + * @param[in] data data * @param[in] len data length * @return address * @retval > 0 success @@ -316,7 +318,7 @@ ons_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi /*--------------------------------------------------------------------------*/ /* * @brief ons_callback_onscreen - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * onscreen protocol * * @param[in] context libwebsockets context @@ -808,6 +810,80 @@ ons_loadinons_edje_file(const char *edje_file) } /*--------------------------------------------------------------------------*/ +/** + * @brief ons_load_config + * load/reload configuration. + * + * @param none + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +ons_load_config(void) +{ + Ico_Uxf_App_Config *appconf; + int appcnt; + int appidx, idx, cnt; + + uifw_trace("ons_load_config: Enter"); + + appconf = (Ico_Uxf_App_Config *)ico_uxf_getAppConfig(); + appcnt = appconf->applicationNum; + for (appidx = 0; appidx < appconf->applicationNum; appidx++) { + if ((appconf->application[appidx].noicon) || + (strcmp(appconf->application[appidx].type, ICO_HS_GROUP_SPECIAL) == 0)) { + appcnt--; + uifw_trace("ons_load_config: No Need appid=%s noicon=%d type=%s", + appconf->application[appidx].appid, + appconf->application[appidx].noicon, + appconf->application[appidx].type); + } + } + cnt = 0; + for (idx = 0; idx < appcnt; idx++) { + appidx = ons_get_appindex(idx); + if (appidx > 0) { + uifw_trace("ons_load_config: appid=%s seat=%d idx=%d seatcnt=%d", + appconf->application[appidx].appid, cnt + / ICO_ONS_APPLI_NUM, idx - ICO_ONS_APPLI_NUM + * (cnt / ICO_ONS_APPLI_NUM), ((appcnt - 1) + / ICO_ONS_APPLI_NUM) + 1); + cnt++; + } + } + + ons_app_cnt = appcnt; + ons_applist_idx = 0; + + uifw_trace("ons_load_config: Leave(appcnt=%d)", appcnt); + + return; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief ons_config_event + * This is a callback function called when the configurations + * is updata. + * + * @param[in] appid application id + * @param[in] type event type(install/uninstall) + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +ons_config_event(const char *appid, int type) +{ + uifw_trace("ons_config_event: Enter(appid=%s, type=%d)", appid, type); + + ons_load_config(); + + uifw_trace("ons_config_event: Leave"); + + return; +} + +/*--------------------------------------------------------------------------*/ /* * @brief onscreen application * main routine @@ -822,8 +898,6 @@ int main(int argc, char *argv[]) { int width, height; - Ico_Uxf_App_Config *appconf; - int appidx, idx, cnt; int orientation = ICO_ONS_HORIZONTAL; int ii; int ret; @@ -861,34 +935,9 @@ main(int argc, char *argv[]) ICO_HS_CONFIG_ORIENTAION, orientation); } + ons_load_config(); hs_snd_init(); - hs_get_image_path(ons_respath, ICO_ONS_BUF_SIZE); - appconf = (Ico_Uxf_App_Config *)ico_uxf_getAppConfig(); - ons_app_cnt = appconf->applicationNum; - for (appidx = 0; appidx < appconf->applicationNum; appidx++) { - if ((appconf->application[appidx].noicon) || - (strcmp(appconf->application[appidx].type, ICO_HS_GROUP_SPECIAL) == 0)) { - ons_app_cnt--; - uifw_trace("Application list: No Need appid=%s noicon=%d type=%s", - appconf->application[appidx].appid, - appconf->application[appidx].noicon, - appconf->application[appidx].type); - } - } - cnt = 0; - for (idx = 0; idx < ons_app_cnt; idx++) { - appidx = ons_get_appindex(idx); - if (appidx > 0) { - uifw_trace("Application list: appid=%s seat=%d idx=%d seatcnt=%d", - appconf->application[appidx].appid, cnt - / ICO_ONS_APPLI_NUM, idx - ICO_ONS_APPLI_NUM - * (cnt / ICO_ONS_APPLI_NUM), ((ons_app_cnt - 1) - / ICO_ONS_APPLI_NUM) + 1); - cnt++; - } - } - /* Reset a ecore_evas */ ecore_evas_init(); @@ -927,6 +976,9 @@ main(int argc, char *argv[]) ons_create_context(); ecore_timer_add(ICO_ONS_WS_TIMEOUT, ons_ecore_event, NULL); + /* add callback to app configuration */ + ico_uxf_econf_setAppUpdateCb(ons_config_event); + /* Start main loop */ ecore_main_loop_begin(); diff --git a/src/status_bar.c b/src/status_bar.c index 654b7a5..6b43eeb 100644 --- a/src/status_bar.c +++ b/src/status_bar.c @@ -21,10 +21,10 @@ #include #include #include -#include #include "ico_uxf.h" #include "ico_uxf_conf.h" +#include "ico_uxf_conf_ecore.h" #include "home_screen.h" #include "home_screen_res.h" @@ -59,6 +59,12 @@ #define ICO_SB_POS_MIN2_X (725) #define ICO_SB_POS_MIN2_Y (18) +#define ICO_SB_SIZE_SHTCT_W (ICO_HS_SIZE_SB_HEIGHT) + +#define ICO_SB_POS_LIST_X (ICO_HS_SIZE_SB_HEIGHT * 5) +#define ICO_SB_POS_SHTCT1_X (ICO_SB_POS_LIST_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 2 / 2) +#define ICO_SB_POS_SHTCT2_X (ICO_SB_POS_SHTCT1_X + ICO_HS_SIZE_SB_HEIGHT + ICO_HS_SIZE_SB_HEIGHT * 1 / 2) + #define ICO_SB_SIZE_COLON_W (6) #define ICO_SB_SIZE_COLON_H (17) #define ICO_SB_SIZE_NUM_W (20) @@ -66,11 +72,21 @@ #define ICO_SB_SIZE_AMPM_W (47) #define ICO_SB_SIZE_AMPM_H (27) +#define ICO_SB_CHTCT_MAX (5) + +#define ICO_SB_NO_WAIT (1) +#define ICO_SB_WAIT_REPLY (2) + +#define ICO_SB_APPLIST_OFFICON "applist_off.png" +#define ICO_SB_APPLIST_ONICON "applist_on.png" +#define ICO_SB_HOME_OFFICON "home_off.png" +#define ICO_SB_HOME_ONICON "home_on.png" + /*============================================================================*/ /* static(internal) functions prototype */ /*============================================================================*/ static void sb_on_destroy(Ecore_Evas *ee); -static int sb_callback_http(struct libwebsocket_context *context, +static int sb_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len); @@ -82,12 +98,21 @@ static void sb_create_ws_context(void); static void sb_time_hour(struct tm *t_st); static void sb_time_min(struct tm *t_st); static Eina_Bool sb_time_show(void* thread_data); -static void sb_touch_up_escathion(void *data, Evas_Object *obj, void *event_info); +static void sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static void sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static void sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static void sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info); static void sb_clock_display_fixation(Evas *canvas); +static void sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static void sb_config_event(const char *appid, int type); +static void sb_add_shortcut(Evas *canvas); /*============================================================================*/ /* variabe & table */ /*============================================================================*/ +static Evas *sb_canvas; +static Eina_List *sb_shtct_list = NULL; +static int sb_wait_reply = ICO_SB_NO_WAIT; static int sb_ws_port = ICO_HS_WS_PORT; static int sb_ws_connected = 0; static struct libwebsocket_context *sb_ws_context; @@ -118,19 +143,19 @@ struct _sb_time_data sb_time_data[ICO_SB_TIME_IMG_PARTS] = { static struct libwebsocket_protocols ws_protocols[] = { { - "http-only", - sb_callback_http, + "http-only", + sb_callback_http, 0 - }, + }, { - "statusbar-protocol", - sb_callback_statusbar, - 0, - }, + "statusbar-protocol", + sb_callback_statusbar, + 0, + }, { /* end of list */ - NULL, - NULL, + NULL, + NULL, 0 } }; @@ -184,7 +209,7 @@ sb_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi, /*--------------------------------------------------------------------------*/ /* * @brief sb_callback_statusbar - * this callback function is notified from libwebsockets + * this callback function is notified from libwebsockets * statusbar protocol * * @param[in] context libwebsockets context @@ -220,7 +245,12 @@ sb_callback_statusbar(struct libwebsocket_context *context, case LWS_CALLBACK_CLIENT_RECEIVE: uifw_trace("SB-RECEIVE[%d] %s", len, in); sb_wsi_mirror = wsi; - n = sprintf((char *)p, "ANS %s OK", (char *)in); + if (strncmp("RECEIVE OK", in, 10) == 0) { + sb_wait_reply = ICO_SB_NO_WAIT; + } + else { + n = sprintf((char *)p, "ANS %s OK", (char *)in); + } break; case LWS_CALLBACK_CLOSED: uifw_trace("SB-CLOSE"); @@ -418,32 +448,166 @@ sb_time_show(void *thread_data) /*--------------------------------------------------------------------------*/ /** + * @brief sb_touch_up_shortcut + * processing when application button touch up. + * + * @param[in] data user data + * @param[in] evas evas of the button + * @param[in] obj evas object of the button + * @param[in] event_info evas event infomation + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_touch_up_shortcut(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + int n = 0; + unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + + LWS_SEND_BUFFER_POST_PADDING]; + unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; + char *appid = (char *)data; + + if (sb_wait_reply == ICO_SB_NO_WAIT) { + if ((sb_wsi_mirror != NULL) && (appid != NULL)) { + n = sprintf((char *)p, "SHOW %s %s", appid, getenv("PKG_NAME")); + libwebsocket_write(sb_wsi_mirror, p, n, + LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT); + uifw_trace("SB: SHOW %s", appid); + sb_wait_reply = ICO_SB_WAIT_REPLY; + } + /* operation sound */ + hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT)); + } +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief sb_touch_down_applist + * processing when application button touch down. + * + * @param[in] data user data + * @param[in] evas evas of the button + * @param[in] obj evas object of the button + * @param[in] event_info evas event infomation + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_touch_down_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + char img[ICO_HS_TEMP_BUF_SIZE]; + char path[ICO_HS_TEMP_BUF_SIZE]; + + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_APPLIST_ONICON, path); + + evas_object_image_file_set(obj, img, NULL); + evas_object_show(obj); +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief sb_touch_up_applist + * processing when application button touch up. + * + * @param[in] data user data + * @param[in] evas evas of the button + * @param[in] obj evas object of the button + * @param[in] event_info evas event infomation + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_touch_up_applist(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + int n = 0; + unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + + LWS_SEND_BUFFER_POST_PADDING]; + unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; + char path[ICO_HS_TEMP_BUF_SIZE]; + char img[ICO_HS_TEMP_BUF_SIZE]; + + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path); + + evas_object_image_file_set(obj, img, NULL); + evas_object_show(obj); + + if (sb_wait_reply == ICO_SB_NO_WAIT) { + if (sb_wsi_mirror != NULL) { + hs_get_ons_edj_path(path, sizeof(path)); + n = sprintf((char *)p, "OPEN %s%s %s", path, + ICO_HS_ONS_APPLI_LIST_NAME, getenv("PKG_NAME")); + libwebsocket_write(sb_wsi_mirror, p, n, + LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT); + uifw_trace("SB: CLICK APPLIST"); + sb_wait_reply = ICO_SB_WAIT_REPLY; + } + } +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief sb_touch_down_escathion + * processing when escathion button touch down. + * + * @param[in] data user data + * @param[in] evas evas of the button + * @param[in] obj evas object of the button + * @param[in] event_info evas event infomation + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_touch_down_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + char img[ICO_HS_TEMP_BUF_SIZE]; + char path[ICO_HS_TEMP_BUF_SIZE]; + + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_HOME_ONICON, path); + + evas_object_image_file_set(obj, img, NULL); + evas_object_show(obj); +} + +/*--------------------------------------------------------------------------*/ +/** * @brief sb_touch_up_escathion * processing when change button touch up. * * @param[in] data user data + * @param[in] evas evas of the button * @param[in] obj evas object of the button * @param[in] event_info evas event infomation * @return none */ /*--------------------------------------------------------------------------*/ static void -sb_touch_up_escathion(void *data, Evas_Object *obj, void *event_info) +sb_touch_up_escathion(void *data, Evas *evas, Evas_Object *obj, void *event_info) { int n = 0; unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING]; unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; + char path[ICO_HS_TEMP_BUF_SIZE]; + char img[ICO_HS_TEMP_BUF_SIZE]; - if (sb_wsi_mirror != NULL) { - n = sprintf((char *)p, "%s", "CLICK ESCUTCHEON 1"); - libwebsocket_write(sb_wsi_mirror, p, n, - LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT); - uifw_trace("SB: CLICK ESCUTCHEON 1"); - } + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_HOME_OFFICON, path); - /* operation sound */ - hs_snd_play(hs_snd_get_filename(ICO_HS_SND_TYPE_DEFAULT)); + evas_object_image_file_set(obj, img, NULL); + evas_object_show(obj); + + if (sb_wait_reply == ICO_SB_NO_WAIT) { + if (sb_wsi_mirror != NULL) { + n = sprintf((char *)p, "%s", "CLICK ESCUTCHEON 1"); + libwebsocket_write(sb_wsi_mirror, p, n, + LWS_WRITE_CLIENT_IGNORE_XOR_MASK | LWS_WRITE_TEXT); + uifw_trace("SB: CLICK ESCUTCHEON 1"); + sb_wait_reply = ICO_SB_WAIT_REPLY; + } + } } /*--------------------------------------------------------------------------*/ @@ -458,30 +622,44 @@ sb_touch_up_escathion(void *data, Evas_Object *obj, void *event_info) static void sb_clock_display_fixation(Evas *canvas) { - Evas_Object *title, *colon; + Evas_Object *tile, *colon; int moveH; int escPosX; char file[ICO_SB_BUF_SIZE]; + char img[ICO_HS_TEMP_BUF_SIZE]; + char path[ICO_HS_TEMP_BUF_SIZE]; moveH = sb_width - ICO_HS_SIZE_LAYOUT_WIDTH; escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2; /* show escutcheon */ - Evas_Object *icon, *btn; - title = evas_object_rectangle_add(canvas); - evas_object_move(title, escPosX, ICO_SB_POS_Y); - evas_object_resize(title, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT); - evas_object_show(title); - - icon = elm_icon_add(title); - elm_icon_standard_set(icon, "refresh"); - - btn = elm_button_add(title); - elm_object_part_content_set(btn, "icon", icon); - evas_object_move(btn, escPosX, ICO_SB_POS_Y); - evas_object_resize(btn, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT); - evas_object_smart_callback_add(btn, "clicked", sb_touch_up_escathion, NULL ); - evas_object_show(btn); + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_HOME_OFFICON, path); + tile = evas_object_image_filled_add(canvas); + evas_object_image_file_set(tile, img, NULL); + evas_object_move(tile, escPosX, ICO_SB_POS_Y); + evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT); + evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP, + sb_touch_up_escathion, NULL); + evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN, + sb_touch_down_escathion, NULL); + evas_object_show(tile); + + /* show app list */ + hs_get_image_path(path, sizeof(path)); + sprintf(img, "%s"ICO_SB_APPLIST_OFFICON, path); + tile = evas_object_image_filled_add(canvas); + evas_object_image_file_set(tile, img, NULL); + evas_object_move(tile, ICO_SB_POS_LIST_X, ICO_SB_POS_Y); + evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT * 3 / 2, ICO_HS_SIZE_SB_HEIGHT); + evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP, + sb_touch_up_applist, NULL); + evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_DOWN, + sb_touch_down_applist, NULL); + evas_object_show(tile); + + /* shortcut bottun */ + sb_add_shortcut(canvas); /* show clock's colon */ /*Creates a new image object*/ @@ -495,6 +673,86 @@ sb_clock_display_fixation(Evas *canvas) evas_object_resize(colon, ICO_SB_SIZE_COLON_W, ICO_SB_SIZE_COLON_H); /*Makes the given Evas object visible*/ evas_object_show(colon); + + return; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief sb_add_shortcut + * add shurtcut bottun + * + * @param[in] canvas evas to draw + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_add_shortcut(Evas *canvas) +{ + Evas_Object *tile; + int escPosX; + int x, idx; + char config[ICO_UXF_MAX_PROCESS_NAME]; + const char *appid; + const Ico_Uxf_conf_application *appconf; + Eina_List *l, *l_next; + + escPosX = sb_width / 2 - ICO_HS_SIZE_SB_HEIGHT / 2; + + /* delete shortcut */ + EINA_LIST_FOREACH_SAFE(sb_shtct_list, l, l_next, tile) { + evas_object_del(tile); + sb_shtct_list = eina_list_remove_list(sb_shtct_list, l); + } + + /* add shortcut */ + for (idx = 0; idx < ICO_SB_CHTCT_MAX; idx++) { + sprintf(config, ICO_SB_CONFIG_SHTCT_APP"%d", idx); + x = ICO_SB_POS_SHTCT1_X + (ICO_SB_SIZE_SHTCT_W + ICO_HS_SIZE_SB_HEIGHT * 1 / 2) * idx; + if (x > escPosX) { + break; + } + appid = hs_conf_get_string(ICO_HS_CONFIG_STATUBAR, config, NULL); + if ((appid != NULL) && (strcmp(appid, "none") != 0)) { + appconf = ico_uxf_getAppByAppid(appid); + if (appid) { + tile = evas_object_image_filled_add(canvas); + evas_object_image_file_set(tile, + appconf->icon_key_name, NULL); + evas_object_move(tile, x, ICO_SB_POS_Y); + evas_object_resize(tile, ICO_HS_SIZE_SB_HEIGHT, ICO_HS_SIZE_SB_HEIGHT); + evas_object_event_callback_add(tile, EVAS_CALLBACK_MOUSE_UP, + sb_touch_up_shortcut, appid); + evas_object_show(tile); + sb_shtct_list = eina_list_append(sb_shtct_list, tile); + } + } + } + + return; +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief sb_config_event + * This is a callback function called when the configurations + * is updata. + * + * @param[in] appid application id + * @param[in] type event type(install/uninstall) + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +sb_config_event(const char *appid, int type) +{ + uifw_trace("sb_config_event: Enter(appid=%s, type=%d)", appid, type); + + sb_add_shortcut(sb_canvas); + + uifw_trace("sb_config_event: Leave"); + + return; } /*--------------------------------------------------------------------------*/ @@ -511,7 +769,6 @@ sb_clock_display_fixation(Evas *canvas) int main(int argc, char *argv[]) { - Evas * canvas; time_t timer; struct tm *t_st; Evas_Object *bg; @@ -597,25 +854,24 @@ main(int argc, char *argv[]) ecore_evas_show(ee); /* Wrapper of Evas */ - canvas = ecore_evas_get(ee); + sb_canvas = ecore_evas_get(ee); /* BG color set */ - bg = evas_object_rectangle_add(canvas); + bg = evas_object_rectangle_add(sb_canvas); evas_object_color_set(bg, 0, 0, 0, 255); evas_object_move(bg, 0, 0); evas_object_resize(bg, sb_width, ICO_HS_SIZE_SB_HEIGHT); evas_object_show(bg); /* Call the function */ - elm_init(argc, argv); - sb_clock_display_fixation(canvas); + sb_clock_display_fixation(sb_canvas); /* ... */ - sb_ampm = evas_object_image_filled_add(canvas); - sb_hour1 = evas_object_image_filled_add(canvas); - sb_hour2 = evas_object_image_filled_add(canvas); - sb_min1 = evas_object_image_filled_add(canvas); - sb_min2 = evas_object_image_filled_add(canvas); + sb_ampm = evas_object_image_filled_add(sb_canvas); + sb_hour1 = evas_object_image_filled_add(sb_canvas); + sb_hour2 = evas_object_image_filled_add(sb_canvas); + sb_min1 = evas_object_image_filled_add(sb_canvas); + sb_min2 = evas_object_image_filled_add(sb_canvas); /* This function will make layout change */ evas_object_move(sb_ampm, moveH + ICO_SB_POS_AMPM_X, ICO_SB_POS_AMPM_Y); @@ -651,7 +907,7 @@ main(int argc, char *argv[]) /* Set the image file */ for (ii = 0; ii < ICO_SB_TIME_IMG_PARTS; ii++) { - sb_time_data[ii].time_img = evas_object_image_filled_add(canvas); + sb_time_data[ii].time_img = evas_object_image_filled_add(sb_canvas); sprintf(file, "%s%s", sb_respath, sb_time_data[ii].f_name); evas_object_image_file_set(sb_time_data[ii].time_img, file, NULL); } @@ -661,6 +917,9 @@ main(int argc, char *argv[]) sb_create_ws_context(); ecore_timer_add(ICO_SB_WS_TIMEOUT, sb_ecore_event, NULL); + /* add callback to app configuration */ + ico_uxf_econf_setAppUpdateCb(sb_config_event); + /* Runs the application main loop */ ecore_main_loop_begin(); /* Free an Ecore_Evas */ diff --git a/start_homescreen_appcore b/start_homescreen_appcore index 1560ba7..50d1b9f 100755 --- a/start_homescreen_appcore +++ b/start_homescreen_appcore @@ -10,7 +10,7 @@ # 2. Delete log file /bin/mkdir /var/log/ico > /dev/null 2>&1 /bin/chmod -R 0777 /var/log/ico > /dev/null 2>&1 -/bin/rm -f /var/log/ico/* > /dev/null 2>&1 +/bin/rm -f /var/log/ico/* /var/log/weston.log > /dev/null 2>&1 # 3. Weston/Wayland Envionment export XDG_RUNTIME_DIR=/tmp/run-root diff --git a/test/ico_send_hscommand.c b/test/ico_send_hscommand.c index b1762d8..d58dfaf 100644 --- a/test/ico_send_hscommand.c +++ b/test/ico_send_hscommand.c @@ -78,7 +78,7 @@ static struct libwebsocket_protocols ws_protocols[] = { /*============================================================================*/ /* functions */ /*============================================================================*/ -static int +static int hscmd_callback_http(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, @@ -103,7 +103,7 @@ hscmd_callback_http(struct libwebsocket_context *context, * @retval =1 error */ /*--------------------------------------------------------------------------*/ -static int +static int hscmd_callback_command(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, @@ -149,10 +149,10 @@ hscmd_callback_command(struct libwebsocket_context *context, * @return none */ /*--------------------------------------------------------------------------*/ -static void +static void hscmd_create_ws_context(void) { - hscmd_ws_context + hscmd_ws_context = libwebsocket_create_context(CONTEXT_PORT_NO_LISTEN, NULL, ws_protocols, libwebsocket_internal_extensions, NULL, NULL, -1, -1, 0); @@ -161,10 +161,10 @@ hscmd_create_ws_context(void) if (hscmd_ws_context == NULL) { fprintf(stderr, "libwebsocket_create_context failed.\n"); } else { - hscmd_wsi_mirror + hscmd_wsi_mirror = libwebsocket_client_connect( hscmd_ws_context, ICO_HSCMD_WS_ADDRESS, hscmd_ws_port, - 0, "/", ICO_HSCMD_WS_ADDRESS, NULL, + 0, "/", ICO_HSCMD_WS_ADDRESS, NULL, ICO_HSCMD_WS_PROTOCOL_NAME, -1); if(hscmd_wsi_mirror != NULL) { hscmd_ws_connected = 1; @@ -181,7 +181,7 @@ hscmd_create_ws_context(void) * @return none */ /*--------------------------------------------------------------------------*/ -static void +static void hscmd_destroy_ws_context(void) { if (hscmd_ws_context) { @@ -191,7 +191,7 @@ hscmd_destroy_ws_context(void) } } -static void +static void hscmd_ws_service_loop(void) { while (hscmd_ws_connected) { @@ -209,7 +209,7 @@ hscmd_usage(const char *prog) /*--------------------------------------------------------------------------*/ /* * @brief test command tools - * send json format command to + * send json format command to * main routine * * @param main() finction's standard parameter (argc,argv) @@ -218,7 +218,7 @@ hscmd_usage(const char *prog) * @retval 1 failed */ /*--------------------------------------------------------------------------*/ -int +int main(int argc, char *argv[]) { diff --git a/test/ico_set_vehicleinfo.c b/test/ico_set_vehicleinfo.c index eea3d5a..f55fda5 100644 --- a/test/ico_set_vehicleinfo.c +++ b/test/ico_set_vehicleinfo.c @@ -67,6 +67,9 @@ static const struct { { "Blinker", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} }, { "Winker", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} }, { "TurnSignal", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} }, + { "Turn", "TURN_SIGNAL", {TYPE_INT32, TYPE_NULL, 0, 0} }, + { "lightStatus", "LIGHTSTATUS", {TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL} }, + { "light", "LIGHTSTATUS", {TYPE_BOOL, TYPE_BOOL, TYPE_BOOL, TYPE_BOOL} }, { "WATER_TEMP", "WATER_TEMP", {TYPE_INT32, TYPE_NULL, 0, 0} }, { "\0", "\0", {TYPE_NULL, 0,0,0} } }; -- 2.7.4