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);
97 int (*add_pre_callback)(widget_pre_callback_e type, widget_pre_callback_t cb, void *data);
98 int (*del_pre_callback)(widget_pre_callback_e type, widget_pre_callback_t cb, void *data);
99 int (*orientation)(const char *id);
102 LOAD_TYPE_UNKNOWN = -1,
109 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);
113 int (*send)(widget_buffer_h handle, int idx, int x, int y, int w, int h, int gbar);
117 .find_pkgname = NULL,
118 .request_update_by_id = NULL,
119 .trigger_update_monitor = NULL,
120 .update_extra_info = NULL,
121 .add_pre_callback = NULL,
122 .del_pre_callback = NULL,
124 .type = LOAD_TYPE_UNKNOWN, /* Not initialized */
135 #define FUNC_PREFIX "widget_"
136 #define FUNC_WIDGET_SEND_UPDATED FUNC_PREFIX "send_buffer_updated"
137 #define FUNC_WIDGET_FIND_PKGNAME FUNC_PREFIX "find_pkgname"
138 #define FUNC_WIDGET_REQUEST_UPDATE_BY_ID FUNC_PREFIX "request_update_by_id"
139 #define FUNC_WIDGET_TRIGGER_UPDATE_MONITOR FUNC_PREFIX "trigger_update_monitor"
140 #define FUNC_WIDGET_UPDATE_EXTRA_INFO FUNC_PREFIX "update_extra_info"
142 #define FUNC_WIDGET_PROVIDER_APP_UPDATED FUNC_PREFIX "provider_app_buffer_updated"
144 #define FUNC_WIDGET_PROVIDER_APP_ADD_PRE_CALLBACK FUNC_PREFIX "provider_app_add_pre_callback"
145 #define FUNC_WIDGET_PROVIDER_APP_DEL_PRE_CALLBACK FUNC_PREFIX "provider_app_del_pre_callback"
146 #define FUNC_WIDGET_PROVIDER_APP_ORIENTATION FUNC_PREFIX "provider_app_get_orientation"
148 static inline void load_update_function(void)
150 /* Must to be checked the slave function first. */
151 s_info.binder.slave.send = dlsym(RTLD_DEFAULT, FUNC_WIDGET_SEND_UPDATED);
152 if (s_info.binder.slave.send) {
153 s_info.type = LOAD_TYPE_SLAVE;
154 DbgPrint("Slave detected\n");
156 s_info.binder.app.send = dlsym(RTLD_DEFAULT, FUNC_WIDGET_PROVIDER_APP_UPDATED);
157 if (s_info.binder.app.send) {
158 s_info.type = LOAD_TYPE_APP;
159 DbgPrint("App detected\n");
164 PUBLIC int widget_get_orientation(const char *id)
166 if (!s_info.orientation) {
167 s_info.orientation = dlsym(RTLD_DEFAULT, FUNC_WIDGET_PROVIDER_APP_ORIENTATION);
168 if (!s_info.orientation) {
169 return WIDGET_ERROR_NOT_SUPPORTED;
173 return s_info.orientation(id);
176 PUBLIC int widget_add_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
178 if (!s_info.add_pre_callback) {
179 s_info.add_pre_callback = dlsym(RTLD_DEFAULT, FUNC_WIDGET_PROVIDER_APP_ADD_PRE_CALLBACK);
180 if (!s_info.add_pre_callback) {
181 return WIDGET_ERROR_NOT_SUPPORTED;
185 return s_info.add_pre_callback(type, cb, data);
188 PUBLIC int widget_del_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
190 if (!s_info.del_pre_callback) {
191 s_info.del_pre_callback = dlsym(RTLD_DEFAULT, FUNC_WIDGET_PROVIDER_APP_DEL_PRE_CALLBACK);
192 if (!s_info.del_pre_callback) {
193 return WIDGET_ERROR_NOT_SUPPORTED;
197 return s_info.del_pre_callback(type, cb, data);
200 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)
202 int ret = WIDGET_ERROR_INVALID_PARAMETER;
204 if (s_info.type == LOAD_TYPE_UNKNOWN) {
205 load_update_function();
208 if (s_info.type == LOAD_TYPE_APP) {
209 ret = s_info.binder.app.send(handle, idx, x, y, w, h, gbar);
210 } else if (s_info.type == LOAD_TYPE_SLAVE) {
212 * pkgname, id are used for finding handle of direct connection.
214 ret = s_info.binder.slave.send(pkgname, id, handle, idx, x, y, w, h, gbar, descfile);
216 widget_damage_region_s region = {
222 ret = widget_provider_send_buffer_updated(handle, idx, ®ion, gbar, descfile);
228 static char *id_to_uri(const char *id)
233 uri_len = strlen(id) + strlen(FILE_SCHEMA) + 1;
235 uri = malloc(uri_len);
240 snprintf(uri, uri_len, FILE_SCHEMA "%s", id);
244 static inline int event_handler_wrapper(widget_buffer_h buffer, widget_buffer_event_data_t event_info, void *data)
248 struct widget_buffer_data *cbdata = data;
251 pkgname = widget_provider_buffer_pkgname(buffer);
253 ErrPrint("pkgname is not valid\n");
254 return WIDGET_ERROR_INVALID_PARAMETER;
257 id = widget_provider_buffer_id(buffer);
259 ErrPrint("id is not valid[%s]\n", pkgname);
260 return WIDGET_ERROR_INVALID_PARAMETER;
263 if (cbdata->handler) {
264 ret = cbdata->handler(buffer, event_info, cbdata->cbdata);
266 ret = WIDGET_ERROR_FAULT;
269 switch (event_info->type) {
270 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT:
271 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_NEXT:
272 case WIDGET_BUFFER_EVENT_ACCESS_HIGHLIGHT_PREV:
273 case WIDGET_BUFFER_EVENT_ACCESS_ACTIVATE:
274 case WIDGET_BUFFER_EVENT_ACCESS_ACTION_UP:
275 case WIDGET_BUFFER_EVENT_ACCESS_ACTION_DOWN:
276 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_UP:
277 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_MOVE:
278 case WIDGET_BUFFER_EVENT_ACCESS_SCROLL_DOWN:
279 case WIDGET_BUFFER_EVENT_ACCESS_UNHIGHLIGHT:
280 case WIDGET_BUFFER_EVENT_ACCESS_VALUE_CHANGE:
281 case WIDGET_BUFFER_EVENT_ACCESS_MOUSE:
282 case WIDGET_BUFFER_EVENT_ACCESS_BACK:
283 case WIDGET_BUFFER_EVENT_ACCESS_OVER:
284 case WIDGET_BUFFER_EVENT_ACCESS_READ:
285 case WIDGET_BUFFER_EVENT_ACCESS_ENABLE:
286 case WIDGET_BUFFER_EVENT_ACCESS_DISABLE:
287 DbgPrint("Accessibility event: %d\n", event_info->type);
289 (void)widget_provider_send_access_status(pkgname, id, WIDGET_ACCESS_STATUS_ERROR);
291 (void)widget_provider_send_access_status(pkgname, id, ret);
294 case WIDGET_BUFFER_EVENT_KEY_UP:
295 case WIDGET_BUFFER_EVENT_KEY_DOWN:
296 case WIDGET_BUFFER_EVENT_KEY_FOCUS_IN:
297 case WIDGET_BUFFER_EVENT_KEY_FOCUS_OUT:
298 DbgPrint("Key event: %d\n", event_info->type);
300 (void)widget_provider_send_key_status(pkgname, id, WIDGET_KEY_STATUS_ERROR);
302 (void)widget_provider_send_key_status(pkgname, id, ret);
312 static inline int default_event_handler(widget_buffer_h buffer, widget_buffer_event_data_t event_info, void *data)
318 PUBLIC struct widget_desc *widget_desc_open(const char *filename, int for_pd)
320 struct widget_desc *handle;
323 handle = calloc(1, sizeof(*handle));
325 ErrPrint("Error: %d\n", errno);
331 len = strlen(filename) + strlen(".desc") + 1;
332 new_fname = malloc(len);
334 ErrPrint("Error: %d\n", errno);
338 snprintf(new_fname, len, "%s.desc", filename);
340 new_fname = strdup(filename);
342 ErrPrint("Error: %d\n", errno);
348 DbgPrint("Open a file %s with merge mode %s\n",
350 access(new_fname, F_OK) == 0 ? "enabled" : "disabled");
352 handle->fp = fopen(new_fname, "at");
355 ErrPrint("Failed to open a file: %d\n", errno);
363 PUBLIC int widget_desc_close(struct widget_desc *handle)
370 return WIDGET_ERROR_INVALID_PARAMETER;
373 dlist_foreach_safe(handle->block_list, l, n, block) {
374 handle->block_list = dlist_remove(handle->block_list, l);
376 fprintf(handle->fp, "{\n");
378 fprintf(handle->fp, "type=%s\n", block->type);
382 fprintf(handle->fp, "part=%s\n", block->part);
386 fprintf(handle->fp, "data=%s\n", block->data);
390 fprintf(handle->fp, "option=%s\n", block->option);
394 fprintf(handle->fp, "id=%s\n", block->id);
397 if (block->target_id) {
398 fprintf(handle->fp, "target=%s\n", block->target_id);
400 fprintf(handle->fp, "}\n");
407 free(block->target_id);
411 if (fclose(handle->fp) != 0) {
412 ErrPrint("fclose: %d\n", errno);
415 return WIDGET_ERROR_NONE;
418 PUBLIC int widget_desc_set_category(struct widget_desc *handle, const char *id, const char *category)
422 if (!handle || !category) {
423 return WIDGET_ERROR_INVALID_PARAMETER;
426 block = calloc(1, sizeof(*block));
428 return WIDGET_ERROR_OUT_OF_MEMORY;
431 block->type = strdup(WIDGET_DESC_TYPE_INFO);
434 return WIDGET_ERROR_OUT_OF_MEMORY;
437 block->part = strdup("category");
441 return WIDGET_ERROR_OUT_OF_MEMORY;
444 block->data = strdup(category);
449 return WIDGET_ERROR_OUT_OF_MEMORY;
453 block->id = strdup(id);
459 return WIDGET_ERROR_OUT_OF_MEMORY;
463 block->idx = handle->last_idx++;
464 handle->block_list = dlist_append(handle->block_list, block);
468 PUBLIC int widget_desc_set_size(struct widget_desc *handle, const char *id, int w, int h)
474 return WIDGET_ERROR_INVALID_PARAMETER;
477 block = calloc(1, sizeof(*block));
479 return WIDGET_ERROR_OUT_OF_MEMORY;
482 block->type = strdup(WIDGET_DESC_TYPE_INFO);
485 return WIDGET_ERROR_OUT_OF_MEMORY;
488 block->part = strdup("size");
492 return WIDGET_ERROR_OUT_OF_MEMORY;
496 block->id = strdup(id);
501 return WIDGET_ERROR_OUT_OF_MEMORY;
505 snprintf(buffer, sizeof(buffer), "%dx%d", w, h);
506 block->data = strdup(buffer);
512 return WIDGET_ERROR_OUT_OF_MEMORY;
515 block->idx = handle->last_idx++;
516 handle->block_list = dlist_append(handle->block_list, block);
520 PUBLIC int widget_desc_set_id(struct widget_desc *handle, int idx, const char *id)
525 dlist_foreach(handle->block_list, l, block) {
526 if (block->idx == idx) {
527 if (strcasecmp(block->type, WIDGET_DESC_TYPE_SCRIPT)) {
528 ErrPrint("Invalid block is used\n");
529 return WIDGET_ERROR_INVALID_PARAMETER;
532 free(block->target_id);
533 block->target_id = NULL;
535 if (!id || !strlen(id)) {
536 return WIDGET_ERROR_NONE;
539 block->target_id = strdup(id);
540 if (!block->target_id) {
541 ErrPrint("Heap: %d\n", errno);
542 return WIDGET_ERROR_OUT_OF_MEMORY;
545 return WIDGET_ERROR_NONE;
549 return WIDGET_ERROR_NOT_EXIST;
555 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)
559 if (!handle || !type) {
560 return WIDGET_ERROR_INVALID_PARAMETER;
571 block = calloc(1, sizeof(*block));
573 ErrPrint("Heap: %d\n", errno);
574 return WIDGET_ERROR_OUT_OF_MEMORY;
577 block->type = strdup(type);
579 ErrPrint("Heap: %d\n", errno);
581 return WIDGET_ERROR_OUT_OF_MEMORY;
584 block->part = strdup(part);
586 ErrPrint("Heap: %d\n", errno);
589 return WIDGET_ERROR_OUT_OF_MEMORY;
592 block->data = strdup(data);
594 ErrPrint("Heap: %d\n", errno);
598 return WIDGET_ERROR_OUT_OF_MEMORY;
602 block->option = strdup(option);
603 if (!block->option) {
604 ErrPrint("Heap: %d\n", errno);
609 return WIDGET_ERROR_OUT_OF_MEMORY;
614 block->id = strdup(id);
616 ErrPrint("Heap: %d\n", errno);
622 return WIDGET_ERROR_OUT_OF_MEMORY;
626 block->idx = handle->last_idx++;
627 handle->block_list = dlist_append(handle->block_list, block);
631 PUBLIC int widget_desc_del_block(struct widget_desc *handle, int idx)
636 if (!handle || idx < 0) {
637 return WIDGET_ERROR_INVALID_PARAMETER;
640 dlist_foreach(handle->block_list, l, block) {
641 if (block->idx == idx) {
642 handle->block_list = dlist_remove(handle->block_list, l);
648 free(block->target_id);
650 return WIDGET_ERROR_NONE;
654 return WIDGET_ERROR_NOT_EXIST;
657 PUBLIC int widget_viewer_acquire_buffer(widget_buffer_h handle, int idx, int width, int height, int pixel_size)
661 if (!handle || width <= 0 || height <= 0 || pixel_size <= 0 || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
662 return WIDGET_ERROR_INVALID_PARAMETER;
669 /* To validate the buffer */
670 if (widget_provider_buffer_get_size(handle, &_width, &_height, &_pixel_size) < 0) {
671 ErrPrint("Failed to get buffer size\n");
674 if (_width != width || _height != height || pixel_size != _pixel_size) {
675 DbgPrint("Extra buffer's geometry is not matched with primary one\n");
678 ret = widget_provider_buffer_extra_acquire(handle, idx, width, height, pixel_size);
680 ret = widget_provider_buffer_acquire(handle, width, height, pixel_size);
686 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)
688 struct widget_buffer_data *user_data;
690 widget_buffer_h handle;
694 ErrPrint("Invalid argument: %p(%dx%d)\n", filename);
698 user_data = calloc(1, sizeof(*user_data));
700 ErrPrint("Heap: %d\n", errno);
704 user_data->is_gbar = is_gbar;
705 user_data->handler = handler ? handler : default_event_handler;
706 user_data->cbdata = data;
708 uri = id_to_uri(filename);
710 ErrPrint("Heap: %d\n", errno);
715 if (!s_info.find_pkgname) {
716 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_WIDGET_FIND_PKGNAME);
717 if (!s_info.find_pkgname) {
718 ErrPrint("Failed to find a \"widget_find_pkgname\"\n");
725 pkgname = s_info.find_pkgname(uri);
727 ErrPrint("Invalid Request\n");
733 handle = widget_provider_buffer_create((!!is_gbar) ? WIDGET_TYPE_GBAR : WIDGET_TYPE_WIDGET, pkgname, uri, auto_align, event_handler_wrapper, user_data);
740 (void)widget_provider_buffer_set_user_data(handle, user_data);
744 PUBLIC int widget_request_update(const char *filename)
750 ErrPrint("Invalid argument\n");
751 return WIDGET_ERROR_INVALID_PARAMETER;
754 uri = id_to_uri(filename);
756 ErrPrint("Heap: %d\n", errno);
757 return WIDGET_ERROR_OUT_OF_MEMORY;
760 if (!s_info.request_update_by_id) {
761 s_info.request_update_by_id = dlsym(RTLD_DEFAULT, FUNC_WIDGET_REQUEST_UPDATE_BY_ID);
762 if (!s_info.request_update_by_id) {
763 ErrPrint("\"widget_request_update_by_id\" is not exists\n");
765 return WIDGET_ERROR_FAULT;
769 ret = s_info.request_update_by_id(uri);
774 PUBLIC unsigned int widget_viewer_get_resource_id(widget_buffer_h handle, int idx)
778 if (!handle || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
779 return WIDGET_ERROR_INVALID_PARAMETER;
783 ret = widget_provider_buffer_extra_resource_id(handle, idx);
785 ret = widget_provider_buffer_resource_id(handle);
791 PUBLIC int widget_viewer_release_buffer(widget_buffer_h handle, int idx)
795 if (!handle || idx > WIDGET_CONF_EXTRA_BUFFER_COUNT) {
796 return WIDGET_ERROR_INVALID_PARAMETER;
800 ret = widget_provider_buffer_extra_release(handle, idx);
802 ret = widget_provider_buffer_release(handle);
805 DbgPrint("Release buffer: %d (%d)\n", idx, ret);
809 PUBLIC int widget_destroy_buffer(widget_buffer_h handle)
811 struct widget_buffer_data *user_data;
814 return WIDGET_ERROR_INVALID_PARAMETER;
817 user_data = widget_provider_buffer_user_data(handle);
819 if (user_data->frame_wait_timer) {
820 ecore_timer_del(user_data->frame_wait_timer);
821 user_data->frame_wait_timer = NULL;
823 free(user_data->content);
824 free(user_data->title);
825 free(user_data->icon);
826 free(user_data->name);
828 widget_provider_buffer_set_user_data(handle, NULL);
831 DbgPrint("Destroy buffer\n");
832 return widget_provider_buffer_destroy(handle);
835 PUBLIC void *widget_ref_buffer(widget_buffer_h handle)
837 struct widget_buffer_data *user_data;
846 user_data = widget_provider_buffer_user_data(handle);
851 if (user_data->accelerated) {
852 DbgPrint("H/W accelerated buffer is allocated\n");
856 ret = widget_provider_buffer_get_size(handle, &w, &h, &size);
858 data = widget_provider_buffer_ref(handle);
859 if (data && !ret && w > 0 && h > 0 && size > 0) {
860 memset(data, 0, w * h * size);
861 (void)widget_provider_buffer_sync(handle);
864 DbgPrint("Ref buffer %ds%d(%d)\n", w, h, size);
868 PUBLIC int widget_unref_buffer(void *buffer)
871 return WIDGET_ERROR_INVALID_PARAMETER;
874 DbgPrint("Unref buffer\n");
875 return widget_provider_buffer_unref(buffer);
878 PUBLIC int widget_viewer_sync_buffer(widget_buffer_h handle)
880 struct widget_buffer_data *user_data;
889 return WIDGET_ERROR_INVALID_PARAMETER;
892 user_data = widget_provider_buffer_user_data(handle);
894 ErrPrint("Invalid buffer\n");
895 return WIDGET_ERROR_INVALID_PARAMETER;
898 if (user_data->accelerated) {
899 DbgPrint("H/W Buffer allocated. skip the sync buffer\n");
900 return WIDGET_ERROR_NONE;
903 pkgname = widget_provider_buffer_pkgname(handle);
905 ErrPrint("Invalid buffer handler\n");
906 return WIDGET_ERROR_INVALID_PARAMETER;
909 id = widget_provider_buffer_id(handle);
911 ErrPrint("Invalid buffer handler\n");
912 return WIDGET_ERROR_INVALID_PARAMETER;
915 (void)widget_provider_buffer_sync(handle);
917 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
918 ErrPrint("Failed to get size (%s)\n", id);
923 * manipulate the damaged region, so send update event only for the damaged region.
924 * to make more efficient updates
926 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
928 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
934 PUBLIC int widget_send_updated_by_idx(widget_buffer_h handle, int idx)
936 struct widget_buffer_data *user_data;
944 user_data = widget_provider_buffer_user_data(handle);
946 ErrPrint("Invalid buffer\n");
947 return WIDGET_ERROR_INVALID_PARAMETER;
950 pkgname = widget_provider_buffer_pkgname(handle);
952 ErrPrint("Invalid buffer handler\n");
953 return WIDGET_ERROR_INVALID_PARAMETER;
956 id = widget_provider_buffer_id(handle);
958 ErrPrint("Invalid buffer handler\n");
959 return WIDGET_ERROR_INVALID_PARAMETER;
962 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
963 ErrPrint("Failed to get size (%s)\n", id);
966 ret = send_updated(pkgname, id, handle, idx, 0, 0, w, h, user_data->is_gbar, NULL);
968 ErrPrint("Failed to send%supdated (%s) %d\n", user_data->is_gbar ? " GBAR " : " ", id, idx);
974 PUBLIC int widget_support_hw_buffer(widget_buffer_h handle)
977 return WIDGET_ERROR_INVALID_PARAMETER;
980 return widget_provider_buffer_is_support_hw(handle);
983 PUBLIC int widget_create_hw_buffer(widget_buffer_h handle)
985 struct widget_buffer_data *user_data;
989 return WIDGET_ERROR_INVALID_PARAMETER;
992 user_data = widget_provider_buffer_user_data(handle);
994 return WIDGET_ERROR_INVALID_PARAMETER;
997 if (user_data->accelerated) {
998 return WIDGET_ERROR_ALREADY_EXIST;
1001 ret = widget_provider_buffer_create_hw(handle);
1002 user_data->accelerated = (ret == 0);
1006 PUBLIC int widget_destroy_hw_buffer(widget_buffer_h handle)
1008 struct widget_buffer_data *user_data;
1011 LOGD("handle is NULL\n");
1012 return WIDGET_ERROR_INVALID_PARAMETER;
1015 user_data = widget_provider_buffer_user_data(handle);
1016 if (!user_data || !user_data->accelerated) {
1017 LOGD("user_data is NULL\n");
1018 return WIDGET_ERROR_INVALID_PARAMETER;
1021 user_data->accelerated = 0;
1023 return widget_provider_buffer_destroy_hw(handle);
1026 PUBLIC void *widget_buffer_hw_buffer(widget_buffer_h handle)
1028 struct widget_buffer_data *user_data;
1034 user_data = widget_provider_buffer_user_data(handle);
1035 if (!user_data || !user_data->accelerated) {
1039 return widget_provider_buffer_hw_addr(handle);
1042 PUBLIC int widget_buffer_pre_render(widget_buffer_h handle)
1044 struct widget_buffer_data *user_data;
1047 return WIDGET_ERROR_INVALID_PARAMETER;
1050 user_data = widget_provider_buffer_user_data(handle);
1052 return WIDGET_ERROR_INVALID_PARAMETER;
1055 if (!user_data->accelerated) {
1056 return WIDGET_ERROR_NONE;
1061 * Do preprocessing for accessing the H/W render buffer
1063 return widget_provider_buffer_pre_render(handle);
1066 static Eina_Bool frame_wait_cb(void *data)
1068 widget_buffer_h handle = data;
1069 struct widget_buffer_data *user_data;
1070 const char *pkgname;
1077 user_data = widget_provider_buffer_user_data(handle);
1079 ErrPrint("Failed to get a user data\n");
1080 return ECORE_CALLBACK_CANCEL;
1083 pkgname = widget_provider_buffer_pkgname(handle);
1084 id = widget_provider_buffer_id(handle);
1086 if (!pkgname || !id) {
1087 ErrPrint("Failed to get instance information (%s), (%s)\n", pkgname, id);
1088 user_data->frame_wait_timer = NULL;
1089 return ECORE_CALLBACK_CANCEL;
1092 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1093 ErrPrint("Failed to get size (%s)\n", id);
1096 pixel_size = sizeof(int);
1099 DbgPrint("Frame skip waiting timer is fired (%s)\n", id);
1103 * manipulate the damaged region, so send update event only for the damaged region.
1104 * to make more efficient updates
1106 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1108 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1111 (void)widget_provider_buffer_clear_frame_skip(handle);
1113 user_data->frame_wait_timer = NULL;
1114 return ECORE_CALLBACK_CANCEL;
1117 PUBLIC int widget_buffer_post_render(widget_buffer_h handle)
1120 const char *pkgname;
1122 struct widget_buffer_data *user_data;
1130 PERF_MARK("post_render");
1131 return WIDGET_ERROR_INVALID_PARAMETER;
1134 user_data = widget_provider_buffer_user_data(handle);
1136 PERF_MARK("post_render");
1137 return WIDGET_ERROR_INVALID_PARAMETER;
1140 if (!user_data->accelerated) {
1141 PERF_MARK("post_render");
1142 return WIDGET_ERROR_NONE;
1145 pkgname = widget_provider_buffer_pkgname(handle);
1147 ErrPrint("Invalid buffer handle\n");
1148 PERF_MARK("post_render");
1149 return WIDGET_ERROR_INVALID_PARAMETER;
1152 id = widget_provider_buffer_id(handle);
1154 ErrPrint("Invalid buffer handler\n");
1155 PERF_MARK("post_render");
1156 return WIDGET_ERROR_INVALID_PARAMETER;
1159 ret = widget_provider_buffer_post_render(handle);
1161 ErrPrint("Failed to post render processing\n");
1162 PERF_MARK("post_render");
1166 if (widget_provider_buffer_frame_skip(handle) == 0) {
1167 if (widget_provider_buffer_get_size(handle, &w, &h, &pixel_size) < 0) {
1168 ErrPrint("Failed to get size (%s)\n", id);
1173 * manipulate the damaged region, so send update event only for the damaged region.
1174 * to make more efficient updates
1176 ret = send_updated(pkgname, id, handle, WIDGET_PRIMARY_BUFFER, 0, 0, w, h, user_data->is_gbar, NULL);
1178 ErrPrint("Failed to send%supdated (%s)\n", user_data->is_gbar ? " GBAR " : " ", id);
1181 if (user_data->frame_wait_timer) {
1182 ecore_timer_del(user_data->frame_wait_timer);
1183 user_data->frame_wait_timer = NULL;
1186 if (user_data->frame_wait_timer) {
1187 ecore_timer_reset(user_data->frame_wait_timer);
1189 user_data->frame_wait_timer = ecore_timer_add(FRAME_WAIT_INTERVAL, frame_wait_cb, handle);
1190 if (!user_data->frame_wait_timer) {
1191 ErrPrint("Failed to add waiting timer for next frame\n");
1196 PERF_MARK("post_render");
1200 PUBLIC int widget_buffer_stride(widget_buffer_h handle)
1203 return WIDGET_ERROR_INVALID_PARAMETER;
1206 return widget_provider_buffer_stride(handle);
1209 PUBLIC int widget_content_is_updated(const char *filename, int is_gbar)
1211 if (!s_info.trigger_update_monitor) {
1212 s_info.trigger_update_monitor = dlsym(RTLD_DEFAULT, FUNC_WIDGET_TRIGGER_UPDATE_MONITOR);
1213 if (!s_info.trigger_update_monitor) {
1214 ErrPrint("Trigger update monitor function is not exists\n");
1215 return WIDGET_ERROR_FAULT;
1219 return s_info.trigger_update_monitor(filename, is_gbar);
1222 PUBLIC int widget_request_close_glance_bar(const char *pkgname, const char *id, int reason)
1225 int schema_len = strlen(FILE_SCHEMA);
1228 if (!pkgname || !id) {
1229 ErrPrint("Invalid parameters (%s) (%s)\n", pkgname, id);
1230 return WIDGET_ERROR_INVALID_PARAMETER;
1233 if (strncmp(id, FILE_SCHEMA, schema_len)) {
1234 uri = id_to_uri(id);
1236 ErrPrint("Heap: %d\n", errno);
1237 return WIDGET_ERROR_OUT_OF_MEMORY;
1242 ErrPrint("Heap: %d\n", errno);
1243 return WIDGET_ERROR_OUT_OF_MEMORY;
1247 ret = widget_provider_send_request_close_gbar(pkgname, uri, reason);
1252 PUBLIC int widget_freeze_scroller(const char *pkgname, const char *id)
1257 if (!pkgname || !id) {
1258 return WIDGET_ERROR_INVALID_PARAMETER;
1261 uri = id_to_uri(id);
1263 ErrPrint("Heap: %d\n", errno);
1264 return WIDGET_ERROR_OUT_OF_MEMORY;
1267 ret = widget_provider_send_hold_scroll(pkgname, uri, 1);
1272 PUBLIC int widget_thaw_scroller(const char *pkgname, const char *id)
1277 if (!pkgname || !id) {
1278 return WIDGET_ERROR_INVALID_PARAMETER;
1281 uri = id_to_uri(id);
1283 ErrPrint("Heap: %d\n", errno);
1284 return WIDGET_ERROR_OUT_OF_MEMORY;
1287 ret = widget_provider_send_hold_scroll(pkgname, uri, 0);
1292 PUBLIC int widget_set_extra_info(const char *id, const char *content, const char *title, const char *icon, const char *name)
1294 widget_buffer_h handle;
1295 const char *pkgname;
1298 uri = id_to_uri(id);
1300 ErrPrint("Heap: %d\n", errno);
1301 return WIDGET_ERROR_OUT_OF_MEMORY;
1304 if (!s_info.find_pkgname) {
1305 s_info.find_pkgname = dlsym(RTLD_DEFAULT, FUNC_WIDGET_FIND_PKGNAME);
1306 if (!s_info.find_pkgname) {
1307 ErrPrint("Failed to find a \"widget_find_pkgname\"\n");
1309 return WIDGET_ERROR_FAULT;
1313 pkgname = s_info.find_pkgname(uri);
1315 ErrPrint("Failed to find a package (%s)\n", uri);
1317 return WIDGET_ERROR_INVALID_PARAMETER;
1320 handle = widget_provider_buffer_find_buffer(WIDGET_TYPE_WIDGET, pkgname, uri);
1322 struct widget_buffer_data *user_data;
1324 user_data = widget_provider_buffer_user_data(handle);
1326 ErrPrint("User data is not available\n");
1328 return WIDGET_ERROR_FAULT;
1331 if (content && strlen(content)) {
1334 _content = strdup(content);
1336 if (user_data->content) {
1337 free(user_data->content);
1340 user_data->content = _content;
1342 ErrPrint("Heap: %d\n", errno);
1346 if (title && strlen(title)) {
1349 _title = strdup(title);
1351 if (user_data->title) {
1352 free(user_data->title);
1355 user_data->title = _title;
1357 ErrPrint("Heap: %d\n", errno);
1361 if (icon && strlen(icon)) {
1364 _icon = strdup(icon);
1366 if (user_data->icon) {
1367 free(user_data->icon);
1370 user_data->icon = _icon;
1372 ErrPrint("Heap: %d\n", errno);
1376 if (name && strlen(name)) {
1379 _name = strdup(name);
1381 if (user_data->name) {
1382 free(user_data->name);
1385 user_data->name = _name;
1387 ErrPrint("Heap: %d\n", errno);
1391 if (widget_provider_send_extra_info(pkgname, uri, -1.0f, user_data->content, user_data->title, user_data->icon, user_data->name) < 0) {
1392 ErrPrint("Failed to send extra info (%s)\n", id);
1396 return WIDGET_ERROR_NONE;
1400 if (!s_info.update_extra_info) {
1401 s_info.update_extra_info = dlsym(RTLD_DEFAULT, FUNC_WIDGET_UPDATE_EXTRA_INFO);
1402 if (!s_info.update_extra_info) {
1403 ErrPrint("Failed to find a \"widget_update_extra_info\"\n");
1404 return WIDGET_ERROR_INVALID_PARAMETER;
1408 return s_info.update_extra_info(id, content, title, icon, name);