diff options
Diffstat (limited to 'src/instance.c')
-rw-r--r-- | src/instance.c | 277 |
1 files changed, 272 insertions, 5 deletions
diff --git a/src/instance.c b/src/instance.c index 6fc0f8b..18e8c51 100644 --- a/src/instance.c +++ b/src/instance.c @@ -62,6 +62,11 @@ struct resize_cbdata { int h; }; +struct update_mode_cbdata { + struct inst_info *inst; + int active_update; +}; + struct change_group_cbdata { struct inst_info *inst; char *cluster; @@ -94,7 +99,8 @@ struct inst_info { char *title; int is_pinned_up; double sleep_at; - int scroll_locked; + int scroll_locked; /*!< Scroller which is in viewer is locked. */ + int active_update; /*!< Viewer will reload the buffer by itself, so the provider doesn't need to send the updated event */ enum livebox_visible_state visible; @@ -255,6 +261,25 @@ static inline int instance_recover_visible_state(struct inst_info *inst) return ret; } +static inline void instance_send_update_mode_event(struct inst_info *inst, int active_mode, int status) +{ + struct packet *packet; + const char *pkgname; + + if (!inst->info) { + ErrPrint("Instance info is not ready to use\n"); + return; + } + + pkgname = package_name(inst->info); + + packet = packet_create_noack("update_mode", "ssii", pkgname, inst->id, status, active_mode); + if (packet) + CLIENT_SEND_EVENT(inst, packet); + else + ErrPrint("Failed to send update mode event\n"); +} + static inline void instance_send_resized_event(struct inst_info *inst, int is_pd, int w, int h, int status) { struct packet *packet; @@ -286,6 +311,36 @@ static inline void instance_send_resized_event(struct inst_info *inst, int is_pd ErrPrint("Failed to send size changed event\n"); } +static void update_mode_cb(struct slave_node *slave, const struct packet *packet, void *data) +{ + struct update_mode_cbdata *cbdata = data; + int ret; + + if (!packet) { + ErrPrint("Invalid packet\n"); + instance_send_update_mode_event(cbdata->inst, cbdata->active_update, LB_STATUS_ERROR_FAULT); + instance_unref(cbdata->inst); + DbgFree(cbdata); + return; + } + + if (packet_get(packet, "i", &ret) != 1) { + ErrPrint("Invalid parameters\n"); + instance_send_update_mode_event(cbdata->inst, cbdata->active_update, LB_STATUS_ERROR_INVALID); + instance_unref(cbdata->inst); + DbgFree(cbdata); + return; + } + + if (ret == LB_STATUS_SUCCESS) + cbdata->inst->active_update = cbdata->active_update; + + instance_send_update_mode_event(cbdata->inst, cbdata->active_update, ret); + + instance_unref(cbdata->inst); + DbgFree(cbdata); +} + HAPI int instance_unicast_created_event(struct inst_info *inst, struct client_node *client) { struct packet *packet; @@ -1354,7 +1409,7 @@ HAPI int instance_reactivate(struct inst_info *inst) break; } - packet = packet_create("renew", "sssiidssiis", + packet = packet_create("renew", "sssiidssiisii", package_name(inst->info), inst->id, inst->content, @@ -1364,7 +1419,9 @@ HAPI int instance_reactivate(struct inst_info *inst) inst->cluster, inst->category, inst->lb.width, inst->lb.height, - package_abi(inst->info)); + package_abi(inst->info), + inst->scroll_locked, + inst->active_update); if (!packet) { ErrPrint("Failed to build a packet for %s\n", package_name(inst->info)); return LB_STATUS_ERROR_FAULT; @@ -1459,6 +1516,156 @@ HAPI int instance_activate(struct inst_info *inst) return slave_rpc_async_request(package_slave(inst->info), package_name(inst->info), packet, activate_cb, instance_ref(inst), 1); } +HAPI int instance_lb_update_begin(struct inst_info *inst, double priority, const char *content, const char *title) +{ + struct packet *packet; + const char *fbfile; + + if (!inst->active_update) { + ErrPrint("Invalid request [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + switch (package_lb_type(inst->info)) { + case LB_TYPE_BUFFER: + if (!inst->lb.canvas.buffer) { + ErrPrint("Buffer is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + fbfile = buffer_handler_id(inst->lb.canvas.buffer); + break; + case LB_TYPE_SCRIPT: + if (!inst->lb.canvas.script) { + ErrPrint("Script is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + fbfile = fb_id(script_handler_fb(inst->lb.canvas.script)); + break; + default: + ErrPrint("Invalid request[%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + packet = packet_create_noack("lb_update_begin", "ssdsss", package_name(inst->info), inst->id, priority, content, title, fbfile); + if (!packet) { + ErrPrint("Unable to create a packet\n"); + return LB_STATUS_ERROR_FAULT; + } + + return CLIENT_SEND_EVENT(inst, packet); +} + +HAPI int instance_lb_update_end(struct inst_info *inst) +{ + struct packet *packet; + + if (!inst->active_update) { + ErrPrint("Invalid request [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + switch (package_lb_type(inst->info)) { + case LB_TYPE_BUFFER: + if (!inst->lb.canvas.buffer) { + ErrPrint("Buffer is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + break; + case LB_TYPE_SCRIPT: + if (!inst->lb.canvas.script) { + ErrPrint("Script is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + break; + default: + ErrPrint("Invalid request[%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + packet = packet_create_noack("lb_update_end", "ss", package_name(inst->info), inst->id); + if (!packet) { + ErrPrint("Unable to create a packet\n"); + return LB_STATUS_ERROR_FAULT; + } + + return CLIENT_SEND_EVENT(inst, packet); +} + +HAPI int instance_pd_update_begin(struct inst_info *inst) +{ + struct packet *packet; + const char *fbfile; + + if (!inst->active_update) { + ErrPrint("Invalid request [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + switch (package_pd_type(inst->info)) { + case PD_TYPE_BUFFER: + if (!inst->pd.canvas.buffer) { + ErrPrint("Buffer is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + fbfile = buffer_handler_id(inst->pd.canvas.buffer); + break; + case PD_TYPE_SCRIPT: + if (!inst->pd.canvas.script) { + ErrPrint("Script is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + fbfile = fb_id(script_handler_fb(inst->pd.canvas.script)); + break; + default: + ErrPrint("Invalid request[%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + packet = packet_create_noack("pd_update_begin", "sss", package_name(inst->info), inst->id, fbfile); + if (!packet) { + ErrPrint("Unable to create a packet\n"); + return LB_STATUS_ERROR_FAULT; + } + + return CLIENT_SEND_EVENT(inst, packet); +} + +HAPI int instance_pd_update_end(struct inst_info *inst) +{ + struct packet *packet; + + if (!inst->active_update) { + ErrPrint("Invalid request [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + switch (package_pd_type(inst->info)) { + case PD_TYPE_BUFFER: + if (!inst->pd.canvas.buffer) { + ErrPrint("Buffer is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + break; + case PD_TYPE_SCRIPT: + if (!inst->pd.canvas.script) { + ErrPrint("Script is null [%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + break; + default: + ErrPrint("Invalid request[%s]\n", inst->id); + return LB_STATUS_ERROR_INVALID; + } + + packet = packet_create_noack("pd_update_end", "ss", package_name(inst->info), inst->id); + if (!packet) { + ErrPrint("Unable to create a packet\n"); + return LB_STATUS_ERROR_FAULT; + } + + return CLIENT_SEND_EVENT(inst, packet); +} + HAPI void instance_lb_updated(const char *pkgname, const char *id) { struct inst_info *inst; @@ -1520,16 +1727,17 @@ HAPI int instance_hold_scroll(struct inst_info *inst, int hold) struct packet *packet; if (inst->scroll_locked == hold) { - DbgPrint("There is changes for hold state: %d\n", hold); + DbgPrint("[HOLD] There is changes for hold state: %d\n", hold); return LB_STATUS_ERROR_ALREADY; } packet = packet_create_noack("scroll", "ssi", package_name(inst->info), inst->id, hold); if (!packet) { - ErrPrint("Failed to build a packet\n"); + ErrPrint("[HOLD] Failed to build a packet\n"); return LB_STATUS_ERROR_FAULT; } + DbgPrint("[HOLD] (%s) %d\n", inst->id, hold); inst->scroll_locked = hold; return CLIENT_SEND_EVENT(inst, packet); } @@ -1600,6 +1808,47 @@ HAPI void instance_pd_updated(const char *pkgname, const char *id, const char *d instance_pd_updated_by_instance(inst, descfile); } +HAPI int instance_set_update_mode(struct inst_info *inst, int active_update) +{ + struct packet *packet; + struct update_mode_cbdata *cbdata; + + if (package_is_fault(inst->info)) { + DbgPrint("Fault package [%s]\n", package_name(inst->info)); + return LB_STATUS_ERROR_FAULT; + } + + if (inst->active_update == active_update) { + DbgPrint("Active update is not changed: %d\n", inst->active_update); + return LB_STATUS_ERROR_ALREADY; + } + + cbdata = malloc(sizeof(*cbdata)); + if (!cbdata) { + ErrPrint("Heap: %s\n", strerror(errno)); + return LB_STATUS_ERROR_MEMORY; + } + + cbdata->inst = instance_ref(inst); + cbdata->active_update = active_update; + + /* NOTE: param is resued from here */ + packet = packet_create("update_mode", "ssi", package_name(inst->info), inst->id, active_update); + if (!packet) { + ErrPrint("Failed to build a packet for %s\n", package_name(inst->info)); + instance_unref(cbdata->inst); + free(cbdata); + return LB_STATUS_ERROR_FAULT; + } + + return slave_rpc_async_request(package_slave(inst->info), package_name(inst->info), packet, update_mode_cb, cbdata, 0); +} + +HAPI int instance_active_update(struct inst_info *inst) +{ + return inst->active_update; +} + HAPI void instance_set_lb_info(struct inst_info *inst, int w, int h, double priority, const char *content, const char *title) { char *_content = NULL; @@ -2509,6 +2758,24 @@ HAPI int instance_need_slave(struct inst_info *inst) return ret; } +HAPI int instance_forward_packet(struct inst_info *inst, struct packet *packet) +{ + return CLIENT_SEND_EVENT(inst, packet); +} + +HAPI int instance_send_access_status(struct inst_info *inst, int status) +{ + struct packet *packet; + + packet = packet_create_noack("access_status", "ssi", package_name(inst->info), inst->id, status); + if (!packet) { + ErrPrint("Failed to build a packet\n"); + return LB_STATUS_ERROR_FAULT; + } + + return CLIENT_SEND_EVENT(inst, packet); +} + HAPI void instance_slave_set_pd_pos(struct inst_info *inst, double x, double y) { inst->pd.x = x; |