Eina_List *item_list;
Eina_List *update_list;
Eina_List *pending_list;
+ Eina_List *hidden_list;
Ecore_Timer *pending_timer;
Eina_List *pd_open_pending_list;
Ecore_Timer *pd_open_pending_timer;
.item_list = NULL,
.update_list = NULL,
.pending_list = NULL,
+ .hidden_list = NULL,
.pending_timer = NULL,
.pd_open_pending_list = NULL,
.pd_open_pending_timer = NULL,
static int append_pending_list(struct item *item)
{
+ if (item->deleteme) {
+ DbgPrint("Item will be deleted, ignore update request: %s\n", item->inst->id);
+ return LB_STATUS_ERROR_BUSY;
+ }
+
if (pd_is_opened(item->inst->item->pkgname) == 1) {
if (eina_list_data_find(s_info.pd_open_pending_list, item) == item) {
DbgPrint("Already pended - %s\n", item->inst->item->pkgname);
return LB_STATUS_ERROR_EXIST;
}
- if (activate_pending_consumer() < 0) {
- return LB_STATUS_ERROR_FAULT;
- }
+ if (IS_LB_SHOWN(item)) {
+ if (activate_pending_consumer() < 0) {
+ return LB_STATUS_ERROR_FAULT;
+ }
- s_info.pending_list = eina_list_append(s_info.pending_list, item);
+ s_info.pending_list = eina_list_append(s_info.pending_list, item);
+ } else {
+ if (eina_list_data_find(s_info.hidden_list, item) == item) {
+ DbgPrint("Already in hidden list - %s\n", item->inst->item->pkgname);
+ return LB_STATUS_ERROR_EXIST;
+ }
+
+ s_info.hidden_list = eina_list_append(s_info.hidden_list, item);
+ }
}
return 0;
}
+static inline void migrate_to_pending_list_from_hidden_list(struct item *item)
+{
+ if (!eina_list_data_find(s_info.hidden_list, item)) {
+ return;
+ }
+
+ s_info.hidden_list = eina_list_remove(s_info.hidden_list, item);
+ append_pending_list(item);
+}
+
/*!
* \brief
* This function can call the update callback
s_info.item_list = eina_list_remove_list(s_info.item_list, l);
s_info.update_list = eina_list_remove(s_info.update_list, item);
+ s_info.hidden_list = eina_list_remove(s_info.hidden_list, item);
+ clear_from_pd_open_pending_list(item);
+ clear_from_pending_list(item);
if (item->timer) {
- clear_from_pd_open_pending_list(item);
- clear_from_pending_list(item);
ecore_timer_del(item->timer);
item->timer = NULL;
-
- if (item->monitor) {
- item->deleteme = 1;
- } else {
- update_monitor_del(id, item);
- }
}
- if (!item->monitor) {
+ if (item->monitor) {
+ item->deleteme = 1;
+ } else {
+ update_monitor_del(id, item);
free(item);
(void)so_destroy(inst);
}
if (!strcmp(emission, "lb,show")) {
item->is_lb_show = 1;
+ migrate_to_pending_list_from_hidden_list(item);
+
if (item->is_lb_updated && !is_pended_item(item)) {
reset_lb_updated_flag(item);
}