2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <stdlib.h> /* malloc */
20 #include <string.h> /* strdup */
22 #include <unistd.h> /* access */
27 #include <widget_errno.h>
28 #include <widget_service.h>
29 #include <widget_service_internal.h>
30 #include <widget_provider.h>
31 #include <widget_provider_buffer.h>
32 #include <widget_conf.h>
33 #include <widget_buffer.h>
34 #include <widget_util.h>
40 #include "widget_internal.h"
42 #define PUBLIC __attribute__((visibility("default")))
44 #define FILE_SCHEMA "file://"
48 * This value is configurable value.
50 #define FRAME_WAIT_INTERVAL (1.0f/6.0f)
68 unsigned int last_idx;
70 struct dlist *block_list;
73 struct widget_buffer_data {
77 /* for Buffer event wrapper */
78 int (*handler)(widget_buffer_h , widget_buffer_event_data_t, void *);
86 Ecore_Timer *frame_wait_timer;
90 * @brief These functions are defined in the data-provider-slave
93 const char *(*find_pkgname)(const char *filename);
94 int (*request_update_by_id)(const char *uri);
95 int (*trigger_update_monitor)(const char *id, int is_gbar);
96 int (*update_extra_info)(const char *id, const char *content, const char *title, const char *icon, const char *name);
99 LOAD_TYPE_UNKNOWN = -1,
106 int (*send)(const char *pkgname, const char *id, widget_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile);
110 int (*send)(widget_buffer_h handle, int idx, int x, int y, int w, int h, int gbar);
111 int (*add_pre_callback)(widget_pre_callback_e type, widget_pre_callback_t cb, void *data);
112 int (*del_pre_callback)(widget_pre_callback_e type, widget_pre_callback_t cb, void *data);
116 .find_pkgname = NULL,
117 .request_update_by_id = NULL,
118 .trigger_update_monitor = NULL,
119 .update_extra_info = NULL,
120 .type = LOAD_TYPE_UNKNOWN, /* Not initialized */
127 .add_pre_callback = NULL,
128 .del_pre_callback = NULL,
133 #define FUNC_PREFIX "widget_"
134 #define FUNC_WIDGET_SEND_UPDATED FUNC_PREFIX "send_buffer_updated"
135 #define FUNC_WIDGET_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated"
136 #define FUNC_WIDGET_FIND_PKGNAME FUNC_PREFIX "find_pkgname"
137 #define FUNC_WIDGET_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id"
138 #define FUNC_WIDGET_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor"
139 #define FUNC_WIDGET_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info"
140 #define FUNC_WIDGET_ADD_PRE_CALLBACK FUNC_PREFIX "provider_app_add_pre_callback"
141 #define FUNC_WIDGET_DEL_PRE_CALLBACK FUNC_PREFIX "provider_app_del_pre_callback"
143 static inline void load_update_function(void)
145 /* Must to be checked the slave function first. */
146 s_info.binder.slave.send = dlsym(RTLD_DEFAULT, FUNC_WIDGET_SEND_UPDATED);
147 if (s_info.binder.slave.send) {
148 s_info.type = LOAD_TYPE_SLAVE;
149 DbgPrint("Slave detected\n");
151 s_info.binder.app.send = dlsym(RTLD_DEFAULT, FUNC_WIDGET_PROVIDER_APP_UPDATED);
152 if (s_info.binder.app.send) {
153 s_info.type = LOAD_TYPE_APP;
154 DbgPrint("App detected\n");
159 int widget_add_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
161 static int loaded = 0;
162 if (!loaded && !s_info.binder.app.add_pre_callback) {
163 s_info.binder.app.add_pre_callback = dlsym(RTLD_DEFAULT, FUNC_WIDGET_ADD_PRE_CALLBACK);
167 if (!s_info.binder.app.add_pre_callback) {
168 return WIDGET_ERROR_NOT_SUPPORTED;
171 return s_info.binder.app.add_pre_callback(type, cb, data);
174 int widget_del_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
176 static int loaded = 0;
177 if (!loaded && !s_info.binder.app.del_pre_callback) {
178 s_info.binder.app.del_pre_callback = dlsym(RTLD_DEFAULT, FUNC_WIDGET_DEL_PRE_CALLBACK);
182 if (!s_info.binder.app.del_pre_callback) {
183 return WIDGET_ERROR_NOT_SUPPORTED;
186 return s_info.binder.app.del_pre_callback(type, cb, data);
189 static int send_updated(const char *pkgname, const char *id, widget_buffer_h handle, int idx, int x, int y, int w, int h, int gbar, const char *descfile)
191 int ret = WIDGET_ERROR_INVALID_PARAMETER;
193 if (s_info.type == LOAD_TYPE_UNKNOWN) {
194 load_update_function();
197 if (s_info.type == LOAD_TYPE_APP) {
198 ret = s_info.binder.app.send(handle, idx, x, y, w, h, gbar);
199 } else if (s_info.type == LOAD_TYPE_SLAVE) {
201 * pkgname, id are used for finding handle of direct connection.
203 ret = s_info.binder.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile);
205 widget_damage_region_s region = {
211 ret = widget_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile);
217 static char *id_to_uri(const char *id)
222 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
224 uri = malloc(uri_len);
229 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
233 static inline int event_handler_wrapper(widget_buffer_h buffer, widget_buffer_event_data_t event_info, void *data)
237 struct widget_buffer_data *cbdata = data;
240 pkgname = widget_provider_buffer_pkgname(buffer);
242 ErrPrint("pkgname is not valid\n");
243 return WIDGET_ERROR_INVALID_PARAMETER;
246 id = widget_provider_buffer_id(buffer);
248 ErrPrint("id is not valid[%s]\n", pkgname);
249 return WIDGET_ERROR_INVALID_PARAMETER;
252 if (cbdata->handler) {
253 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
255 ret = WIDGET_ERROR_FAULT;
258 switch (event_info->type) {
259 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT:
260 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
261 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
262 case WIDGET_BUFFER_EVENT_ACCESS_ACTIVATE:
263 case WIDGET_BUFFER_EVENT_ACCESS_ACTION_UP:
264 case WIDGET_BUFFER_EVENT_ACCESS_ACTION_DOWN:
265 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_UP:
266 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
267 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
268 case WIDGET_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
269 case WIDGET_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
270 case WIDGET_BUFFER_EVENT_ACCESS_MOUSE:
271 case WIDGET_BUFFER_EVENT_ACCESS_BACK:
272 case WIDGET_BUFFER_EVENT_ACCESS_OVER:
273 case WIDGET_BUFFER_EVENT_ACCESS_READ:
274 case WIDGET_BUFFER_EVENT_ACCESS_ENABLE:
275 case WIDGET_BUFFER_EVENT_ACCESS_DISABLE:
276 DbgPrint("Accessibility event: %d\n", event_info->type);
278 (void)widget_provider_send_access_status(pkgname, id, WIDGET_ACCESS_STATUS_ERROR);
280 (void)widget_provider_send_access_status(pkgname, id, ret);
283 case WIDGET_BUFFER_EVENT_KEY_UP:
284 case WIDGET_BUFFER_EVENT_KEY_DOWN:
285 case WIDGET_BUFFER_EVENT_KEY_FOCUS_IN:
286 case WIDGET_BUFFER_EVENT_KEY_FOCUS_OUT:
287 DbgPrint("Key event: %d\n", event_info->type);
289 (void)widget_provider_send_key_status(pkgname, id, WIDGET_KEY_STATUS_ERROR);
291 (void)widget_provider_send_key_status(pkgname, id, ret);
301 static inline int default_event_handler(widget_buffer_h buffer, widget_buffer_event_data_t event_info, void *data)
307 PUBLIC struct widget_desc *widget_desc_open(const char *filename, int for_pd)
309 struct widget_desc *handle;
312 handle = calloc(1, sizeof(*handle));
314 ErrPrint("Error: %s\n", strerror(errno));
320 len = strlen(filename) + strlen(".desc") + 1;
321 new_fname = malloc(len);
323 ErrPrint("Error: %s\n", strerror(errno));
327 snprintf(new_fname, len, "%s.desc", filename);
329 new_fname = strdup(filename);
331 ErrPrint("Error: %s\n", strerror(errno));
337 DbgPrint("Open a file %s with merge mode %s\n",
339 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
341 handle->fp = fopen(new_fname, "at");
344 ErrPrint("Failed to open a file: %s\n", strerror(errno));
352 PUBLIC int widget_desc_close(struct widget_desc *handle)
359 return WIDGET_ERROR_INVALID_PARAMETER;
362 dlist_foreach_safe(handle->block_list, l, n, block) {
363 handle->block_list = dlist_remove(handle->block_list, l);
365 fprintf(handle->fp, "{\n");
367 fprintf(handle->fp, "type=%s\n", block->type);
371 fprintf(handle->fp, "part=%s\n", block->part);
375 fprintf(handle->fp, "data=%s\n", block->data);
379 fprintf(handle->fp, "option=%s\n", block->option);
383 fprintf(handle->fp, "id=%s\n", block->id);
386 if (block->target_id) {
387 fprintf(handle->fp, "target=%s\n", block->target_id);
389 fprintf(handle->fp, "}\n");
396 free(block->target_id);
400 if (fclose(handle->fp) != 0) {
401 ErrPrint("fclose: %s\n", strerror(errno));
404 return WIDGET_ERROR_NONE;
407 PUBLIC int widget_desc_set_category(struct widget_desc *handle, const char *id, const char *category)
411 if (!handle || !category) {
412 return WIDGET_ERROR_INVALID_PARAMETER;
415 block = calloc(1, sizeof(*block));
417 return WIDGET_ERROR_OUT_OF_MEMORY;
420 block->type = strdup(WIDGET_DESC_TYPE_INFO);
423 return WIDGET_ERROR_OUT_OF_MEMORY;
426 block->part = strdup("category");
430 return WIDGET_ERROR_OUT_OF_MEMORY;
433 block->data = strdup(category);
438 return WIDGET_ERROR_OUT_OF_MEMORY;
442 block->id = strdup(id);
448 return WIDGET_ERROR_OUT_OF_MEMORY;
452 block->idx = handle->last_idx++;
453 handle->block_list = dlist_append(handle->block_list, block);
457 PUBLIC int widget_desc_set_size(struct widget_desc *handle, const char *id, int w, int h)
463 return WIDGET_ERROR_INVALID_PARAMETER;
466 block = calloc(1, sizeof(*block));
468 return WIDGET_ERROR_OUT_OF_MEMORY;
471 block->type = strdup(WIDGET_DESC_TYPE_INFO);
474 return WIDGET_ERROR_OUT_OF_MEMORY;
477 block->part = strdup("size");
481 return WIDGET_ERROR_OUT_OF_MEMORY;
485 block->id = strdup(id);
490 return WIDGET_ERROR_OUT_OF_MEMORY;
494 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
495 block->data = strdup(buffer);
501 return WIDGET_ERROR_OUT_OF_MEMORY;
504 block->idx = handle->last_idx++;
505 handle->block_list = dlist_append(handle->block_list, block);
509 PUBLIC int widget_desc_set_id(struct widget_desc *handle, int idx, const char *id)
514 dlist_foreach(handle->block_list, l, block) {
515 if (block->idx == idx) {
516 if (strcasecmp(block->type, WIDGET_DESC_TYPE_SCRIPT)) {
517 ErrPrint("Invalid block is used\n");
518 return WIDGET_ERROR_INVALID_PARAMETER;
521 free(block->target_id);
522 block->target_id = NULL;
524 if (!id || !strlen(id)) {
525 return WIDGET_ERROR_NONE;
528 block->target_id = strdup(id);
529 if (!block->target_id) {
530 ErrPrint("Heap: %s\n", strerror(errno));
531 return WIDGET_ERROR_OUT_OF_MEMORY;
534 return WIDGET_ERROR_NONE;
538 return WIDGET_ERROR_NOT_EXIST;
544 PUBLIC int widget_desc_add_block(struct widget_desc *handle, const char *id, const char *type, const char *part, const char *data, const char *option)
548 if (!handle || !type) {
549 return WIDGET_ERROR_INVALID_PARAMETER;
560 block = calloc(1, sizeof(*block));
562 ErrPrint("Heap: %s\n", strerror(errno));
563 return WIDGET_ERROR_OUT_OF_MEMORY;
566 block->type = strdup(type);
568 ErrPrint("Heap: %s\n", strerror(errno));
570 return WIDGET_ERROR_OUT_OF_MEMORY;
573 block->part = strdup(part);
575 ErrPrint("Heap: %s\n", strerror(errno));
578 return WIDGET_ERROR_OUT_OF_MEMORY;
581 block->data = strdup(data);
583 ErrPrint("Heap: %s\n", strerror(errno));
587 return WIDGET_ERROR_OUT_OF_MEMORY;
591 block->option = strdup(option);
592 if (!block->option) {
593 ErrPrint("Heap: %s\n", strerror(errno));
598 return WIDGET_ERROR_OUT_OF_MEMORY;
603 block->id = strdup(id);
605 ErrPrint("Heap: %s\n", strerror(errno));
611 return WIDGET_ERROR_OUT_OF_MEMORY;
615 block->idx = handle->last_idx++;
616 handle->block_list = dlist_append(handle->block_list, block);
620 PUBLIC int widget_desc_del_block(struct widget_desc *handle, int idx)
625 if (!handle || idx < 0) {
626 return WIDGET_ERROR_INVALID_PARAMETER;
629 dlist_foreach(handle->block_list, l, block) {
630 if (block->idx == idx) {
631 handle->block_list = dlist_remove(handle->block_list, l);
637 free(block->target_id);
639 return WIDGET_ERROR_NONE;
643 return WIDGET_ERROR_NOT_EXIST;
646 PUBLIC int widget_viewer_acquire_buffer(widget_buffer_h handle, int idx, int width, int height, int pixel_size)
650 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
651 return WIDGET_ERROR_INVALID_PARAMETER;
658 /* To validate the buffer */
659 if (widget_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
660 ErrPrint("Failed to get buffer size\n");
663 if (_width != width || _height != height || pixel_size != _pixel_size) {
664 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
667 ret = widget_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
669 ret = widget_provider_buffer_acquire(handle, width, height, pixel_size);
675 PUBLIC widget_buffer_h widget_create_buffer(const char *filename, int is_gbar, int auto_align, int (*handler)(widget_buffer_h , widget_buffer_event_data_t, void *), void *data)
677 struct widget_buffer_data *user_data;
679 widget_buffer_h handle;
683 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
687 user_data = calloc(1, sizeof(*user_data));
689 ErrPrint("Heap: %s\n", strerror(errno));
693 user_data->is_gbar = is_gbar;
694 user_data->handler = handler ? handler : default_event_handler;
695 user_data->cbdata = data;
697 uri = id_to_uri(filename);
699 ErrPrint("Heap: %s\n", strerror(errno));
704 if (!s_info.find_pkgname) {
705 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_WIDGET_FIND_PKGNAME);
706 if (!s_info.find_pkgname) {
707 ErrPrint("Failed to find a \"widget_find_pkgname\"\n");
714 pkgname = s_info.find_pkgname(uri);
716 ErrPrint("Invalid Request\n");
722 handle = widget_provider_buffer_create((!!is_gbar) ? WIDGET_TYPE_GBAR : WIDGET_TYPE_WIDGET, pkgname, uri, auto_align, event_handler_wrapper, user_data);
729 (void)widget_provider_buffer_set_user_data(handle, user_data);
733 PUBLIC int widget_request_update(const char *filename)
739 ErrPrint("Invalid argument\n");
740 return WIDGET_ERROR_INVALID_PARAMETER;
743 uri = id_to_uri(filename);
745 ErrPrint("Heap: %s\n", strerror(errno));
746 return WIDGET_ERROR_OUT_OF_MEMORY;
749 if (!s_info.request_update_by_id) {
750 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_WIDGET_REQUEST_UPDATE_BY_ID);
751 if (!s_info.request_update_by_id) {
752 ErrPrint("\"widget_request_update_by_id\" is not exists\n");
754 return WIDGET_ERROR_FAULT;
758 ret = s_info.request_update_by_id(uri);
763 PUBLIC unsigned int widget_viewer_get_resource_id(widget_buffer_h handle, int idx)
767 if (!handle || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
768 return WIDGET_ERROR_INVALID_PARAMETER;
772 ret = widget_provider_buffer_extra_resource_id(handle, idx);
774 ret = widget_provider_buffer_resource_id(handle);
780 PUBLIC int widget_viewer_release_buffer(widget_buffer_h handle, int idx)
784 if (!handle || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
785 return WIDGET_ERROR_INVALID_PARAMETER;
789 ret = widget_provider_buffer_extra_release(handle, idx);
791 ret = widget_provider_buffer_release(handle);
794 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
798 PUBLIC int widget_destroy_buffer(widget_buffer_h handle)
800 struct widget_buffer_data *user_data;
803 return WIDGET_ERROR_INVALID_PARAMETER;
806 user_data = widget_provider_buffer_user_data(handle);
808 if (user_data->frame_wait_timer) {
809 ecore_timer_del(user_data->frame_wait_timer);
810 user_data->frame_wait_timer = NULL;
812 free(user_data->content);
813 free(user_data->title);
814 free(user_data->icon);
815 free(user_data->name);
817 widget_provider_buffer_set_user_data(handle, NULL);
820 DbgPrint("Destroy buffer\n");
821 return widget_provider_buffer_destroy(handle);
824 PUBLIC void *widget_ref_buffer(widget_buffer_h handle)
826 struct widget_buffer_data *user_data;
835 user_data = widget_provider_buffer_user_data(handle);
840 if (user_data->accelerated) {
841 DbgPrint("H/W accelerated buffer is allocated\n");
845 ret = widget_provider_buffer_get_size(handle, &w, &h, &size);
847 data = widget_provider_buffer_ref(handle);
848 if (data && !ret && w > 0 && h > 0 && size > 0) {
849 memset(data, 0, w * h * size);
850 (void)widget_provider_buffer_sync(handle);
853 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
857 PUBLIC int widget_unref_buffer(void *buffer)
860 return WIDGET_ERROR_INVALID_PARAMETER;
863 DbgPrint("Unref buffer\n");
864 return widget_provider_buffer_unref(buffer);
867 PUBLIC int widget_viewer_sync_buffer(widget_buffer_h handle)
869 struct widget_buffer_data *user_data;
878 return WIDGET_ERROR_INVALID_PARAMETER;
881 user_data = widget_provider_buffer_user_data(handle);
883 ErrPrint("Invalid buffer\n");
884 return WIDGET_ERROR_INVALID_PARAMETER;
887 if (user_data->accelerated) {
888 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
889 return WIDGET_ERROR_NONE;
892 pkgname = widget_provider_buffer_pkgname(handle);
894 ErrPrint("Invalid buffer handler\n");
895 return WIDGET_ERROR_INVALID_PARAMETER;
898 id = widget_provider_buffer_id(handle);
900 ErrPrint("Invalid buffer handler\n");
901 return WIDGET_ERROR_INVALID_PARAMETER;
904 (void)widget_provider_buffer_sync(handle);
906 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
907 ErrPrint("Failed to get size (%s)\n", id);
912 * manipulate the damaged region, so send update event only for the damaged region.
913 * to make more efficient updates
915 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
917 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
923 PUBLIC int widget_send_updated_by_idx(widget_buffer_h handle, int idx)
925 struct widget_buffer_data *user_data;
933 user_data = widget_provider_buffer_user_data(handle);
935 ErrPrint("Invalid buffer\n");
936 return WIDGET_ERROR_INVALID_PARAMETER;
939 pkgname = widget_provider_buffer_pkgname(handle);
941 ErrPrint("Invalid buffer handler\n");
942 return WIDGET_ERROR_INVALID_PARAMETER;
945 id = widget_provider_buffer_id(handle);
947 ErrPrint("Invalid buffer handler\n");
948 return WIDGET_ERROR_INVALID_PARAMETER;
951 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
952 ErrPrint("Failed to get size (%s)\n", id);
955 ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL);
957 ErrPrint("Failed to send%supdated (%s) %d\n", user_data->is_gbar ? " GBAR " : " ", id, idx);
963 PUBLIC int widget_support_hw_buffer(widget_buffer_h handle)
966 return WIDGET_ERROR_INVALID_PARAMETER;
969 return widget_provider_buffer_is_support_hw(handle);
972 PUBLIC int widget_create_hw_buffer(widget_buffer_h handle)
974 struct widget_buffer_data *user_data;
978 return WIDGET_ERROR_INVALID_PARAMETER;
981 user_data = widget_provider_buffer_user_data(handle);
983 return WIDGET_ERROR_INVALID_PARAMETER;
986 if (user_data->accelerated) {
987 return WIDGET_ERROR_ALREADY_EXIST;
990 ret = widget_provider_buffer_create_hw(handle);
991 user_data->accelerated = (ret == 0);
995 PUBLIC int widget_destroy_hw_buffer(widget_buffer_h handle)
997 struct widget_buffer_data *user_data;
1000 LOGD("handle is NULL\n");
1001 return WIDGET_ERROR_INVALID_PARAMETER;
1004 user_data = widget_provider_buffer_user_data(handle);
1005 if (!user_data || !user_data->accelerated) {
1006 LOGD("user_data is NULL\n");
1007 return WIDGET_ERROR_INVALID_PARAMETER;
1010 user_data->accelerated = 0;
1012 return widget_provider_buffer_destroy_hw(handle);
1015 PUBLIC void *widget_buffer_hw_buffer(widget_buffer_h handle)
1017 struct widget_buffer_data *user_data;
1023 user_data = widget_provider_buffer_user_data(handle);
1024 if (!user_data || !user_data->accelerated) {
1028 return widget_provider_buffer_hw_addr(handle);
1031 PUBLIC int widget_buffer_pre_render(widget_buffer_h handle)
1033 struct widget_buffer_data *user_data;
1036 return WIDGET_ERROR_INVALID_PARAMETER;
1039 user_data = widget_provider_buffer_user_data(handle);
1041 return WIDGET_ERROR_INVALID_PARAMETER;
1044 if (!user_data->accelerated) {
1045 return WIDGET_ERROR_NONE;
1050 * Do preprocessing for accessing the H/W render buffer
1052 return widget_provider_buffer_pre_render(handle);
1055 static Eina_Bool frame_wait_cb(void *data)
1057 widget_buffer_h handle = data;
1058 struct widget_buffer_data *user_data;
1059 const char *pkgname;
1066 user_data = widget_provider_buffer_user_data(handle);
1068 ErrPrint("Failed to get a user data\n");
1069 return ECORE_CALLBACK_CANCEL;
1072 pkgname = widget_provider_buffer_pkgname(handle);
1073 id = widget_provider_buffer_id(handle);
1075 if (!pkgname || !id) {
1076 ErrPrint("Failed to get instance information (%s), (%s)\n", pkgname, id);
1077 user_data->frame_wait_timer = NULL;
1078 return ECORE_CALLBACK_CANCEL;
1081 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1082 ErrPrint("Failed to get size (%s)\n", id);
1085 pixel_size = sizeof(int);
1088 DbgPrint("Frame skip waiting timer is fired (%s)\n", id);
1092 * manipulate the damaged region, so send update event only for the damaged region.
1093 * to make more efficient updates
1095 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1097 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1100 (void)widget_provider_buffer_clear_frame_skip(handle);
1102 user_data->frame_wait_timer = NULL;
1103 return ECORE_CALLBACK_CANCEL;
1106 PUBLIC int widget_buffer_post_render(widget_buffer_h handle)
1109 const char *pkgname;
1111 struct widget_buffer_data *user_data;
1119 PERF_MARK("post_render");
1120 return WIDGET_ERROR_INVALID_PARAMETER;
1123 user_data = widget_provider_buffer_user_data(handle);
1125 PERF_MARK("post_render");
1126 return WIDGET_ERROR_INVALID_PARAMETER;
1129 if (!user_data->accelerated) {
1130 PERF_MARK("post_render");
1131 return WIDGET_ERROR_NONE;
1134 pkgname = widget_provider_buffer_pkgname(handle);
1136 ErrPrint("Invalid buffer handle\n");
1137 PERF_MARK("post_render");
1138 return WIDGET_ERROR_INVALID_PARAMETER;
1141 id = widget_provider_buffer_id(handle);
1143 ErrPrint("Invalid buffer handler\n");
1144 PERF_MARK("post_render");
1145 return WIDGET_ERROR_INVALID_PARAMETER;
1148 ret = widget_provider_buffer_post_render(handle);
1150 ErrPrint("Failed to post render processing\n");
1151 PERF_MARK("post_render");
1155 if (widget_provider_buffer_frame_skip(handle) == 0) {
1156 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1157 ErrPrint("Failed to get size (%s)\n", id);
1162 * manipulate the damaged region, so send update event only for the damaged region.
1163 * to make more efficient updates
1165 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1167 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1170 if (user_data->frame_wait_timer) {
1171 ecore_timer_del(user_data->frame_wait_timer);
1172 user_data->frame_wait_timer = NULL;
1175 if (user_data->frame_wait_timer) {
1176 ecore_timer_reset(user_data->frame_wait_timer);
1178 user_data->frame_wait_timer = ecore_timer_add(FRAME_WAIT_INTERVAL, frame_wait_cb, handle);
1179 if (!user_data->frame_wait_timer) {
1180 ErrPrint("Failed to add waiting timer for next frame\n");
1185 PERF_MARK("post_render");
1189 PUBLIC int widget_buffer_stride(widget_buffer_h handle)
1192 return WIDGET_ERROR_INVALID_PARAMETER;
1195 return widget_provider_buffer_stride(handle);
1198 PUBLIC int widget_content_is_updated(const char *filename, int is_gbar)
1200 if (!s_info.trigger_update_monitor) {
1201 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_WIDGET_TRIGGER_UPDATE_MONITOR);
1202 if (!s_info.trigger_update_monitor) {
1203 ErrPrint("Trigger update monitor function is not exists\n");
1204 return WIDGET_ERROR_FAULT;
1208 return s_info.trigger_update_monitor(filename, is_gbar);
1211 PUBLIC int widget_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1214 int schema_len = strlen(FILE_SCHEMA);
1217 if (!pkgname || !id) {
1218 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1219 return WIDGET_ERROR_INVALID_PARAMETER;
1222 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1223 uri = id_to_uri(id);
1225 ErrPrint("Heap: %s\n", strerror(errno));
1226 return WIDGET_ERROR_OUT_OF_MEMORY;
1231 ErrPrint("Heap: %s\n", strerror(errno));
1232 return WIDGET_ERROR_OUT_OF_MEMORY;
1236 ret = widget_provider_send_request_close_gbar(pkgname, uri, reason);
1241 PUBLIC int widget_freeze_scroller(const char *pkgname, const char *id)
1246 if (!pkgname || !id) {
1247 return WIDGET_ERROR_INVALID_PARAMETER;
1250 uri = id_to_uri(id);
1252 ErrPrint("Heap: %s\n", strerror(errno));
1253 return WIDGET_ERROR_OUT_OF_MEMORY;
1256 ret = widget_provider_send_hold_scroll(pkgname, uri, 1);
1261 PUBLIC int widget_thaw_scroller(const char *pkgname, const char *id)
1266 if (!pkgname || !id) {
1267 return WIDGET_ERROR_INVALID_PARAMETER;
1270 uri = id_to_uri(id);
1272 ErrPrint("Heap: %s\n", strerror(errno));
1273 return WIDGET_ERROR_OUT_OF_MEMORY;
1276 ret = widget_provider_send_hold_scroll(pkgname, uri, 0);
1281 PUBLIC int widget_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1283 widget_buffer_h handle;
1284 const char *pkgname;
1287 uri = id_to_uri(id);
1289 ErrPrint("Heap: %s\n", strerror(errno));
1290 return WIDGET_ERROR_OUT_OF_MEMORY;
1293 if (!s_info.find_pkgname) {
1294 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_WIDGET_FIND_PKGNAME);
1295 if (!s_info.find_pkgname) {
1296 ErrPrint("Failed to find a \"widget_find_pkgname\"\n");
1298 return WIDGET_ERROR_FAULT;
1302 pkgname = s_info.find_pkgname(uri);
1304 ErrPrint("Failed to find a package (%s)\n", uri);
1306 return WIDGET_ERROR_INVALID_PARAMETER;
1309 handle = widget_provider_buffer_find_buffer(WIDGET_TYPE_WIDGET, pkgname, uri);
1311 struct widget_buffer_data *user_data;
1313 user_data = widget_provider_buffer_user_data(handle);
1315 ErrPrint("User data is not available\n");
1317 return WIDGET_ERROR_FAULT;
1320 if (content && strlen(content)) {
1323 _content = strdup(content);
1325 if (user_data->content) {
1326 free(user_data->content);
1329 user_data->content = _content;
1331 ErrPrint("Heap: %s\n", strerror(errno));
1335 if (title && strlen(title)) {
1338 _title = strdup(title);
1340 if (user_data->title) {
1341 free(user_data->title);
1344 user_data->title = _title;
1346 ErrPrint("Heap: %s\n", strerror(errno));
1350 if (icon && strlen(icon)) {
1353 _icon = strdup(icon);
1355 if (user_data->icon) {
1356 free(user_data->icon);
1359 user_data->icon = _icon;
1361 ErrPrint("Heap: %s\n", strerror(errno));
1365 if (name && strlen(name)) {
1368 _name = strdup(name);
1370 if (user_data->name) {
1371 free(user_data->name);
1374 user_data->name = _name;
1376 ErrPrint("Heap: %s\n", strerror(errno));
1380 if (widget_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1381 ErrPrint("Failed to send extra info (%s)\n", id);
1385 return WIDGET_ERROR_NONE;
1389 if (!s_info.update_extra_info) {
1390 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_WIDGET_UPDATE_EXTRA_INFO);
1391 if (!s_info.update_extra_info) {
1392 ErrPrint("Failed to find a \"widget_update_extra_info\"\n");
1393 return WIDGET_ERROR_INVALID_PARAMETER;
1397 return s_info.update_extra_info(id, content, title, icon, name);