2 #include <wayland-server.h>
3 #include <tizen-launch-server-protocol.h>
7 #include <libds-tizen/launch.h>
9 #define TIZEN_EFFECT_VERSION 1
10 #define SPLASH_CLIENT_PID 321 // no meaning
11 #define CUSTOM_EFFECT_CALLEE "_CUSTOM_EFFECT_CALLEE_"
13 struct ds_tizen_launch_effect
15 struct wl_global *global;
17 struct wl_list clients;
20 struct wl_listener destroy;
23 struct wl_signal destroy;
24 struct wl_signal type_set;
25 struct wl_signal type_unset;
26 struct wl_signal new_splash;
30 struct ds_tizen_launch_effect_client
32 struct ds_tizen_launch_effect *effect;
34 struct wl_resource *resource;
35 struct wl_client *wl_client;
37 struct wl_list splashs;
39 struct wl_list link; // ds_tizen_launch_effect::clients
42 struct ds_tizen_launch_effect_info
47 struct wl_list link; // ds_tizen_launch_effect::infos
50 struct ds_tizen_launch_splash
52 struct ds_tizen_launch_effect *effect;
54 struct ds_tizen_launch_effect_client *client;
55 struct wl_resource *resource;
59 bool custom_effect_callee;
62 struct wl_signal destroy;
63 struct wl_signal owner;
66 struct wl_list link; // ds_tizen_launch_effect_client::splashs
69 static void effect_handle_display_destroy(struct wl_listener *listener,
72 static void effect_bind(struct wl_client *wl_client, void *data,
73 uint32_t version, uint32_t id);
75 WL_EXPORT struct ds_tizen_launch_effect *
76 ds_tizen_launch_effect_create(struct wl_display *display)
78 struct ds_tizen_launch_effect *effect;
80 effect = calloc(1, sizeof *effect);
82 ds_err("calloc() failed.");
86 effect->global = wl_global_create(display, &tizen_launch_effect_interface,
87 TIZEN_EFFECT_VERSION, effect, effect_bind);
88 if (!effect->global) {
89 ds_err("wl_global_create() failed. tizen_launch_effect_interface");
94 wl_list_init(&effect->clients);
95 wl_list_init(&effect->infos);
97 effect->destroy.notify = effect_handle_display_destroy;
98 wl_display_add_destroy_listener(display, &effect->destroy);
100 wl_signal_init(&effect->events.destroy);
101 wl_signal_init(&effect->events.type_set);
102 wl_signal_init(&effect->events.type_unset);
103 wl_signal_init(&effect->events.new_splash);
105 ds_inf("Global create: tizen_launch_effect. effect(%p)", effect);
112 ds_tizen_launch_effect_add_destroy_listener(
113 struct ds_tizen_launch_effect *effect, struct wl_listener *listener)
115 wl_signal_add(&effect->events.destroy, listener);
119 ds_tizen_launch_effect_add_type_set_listener(
120 struct ds_tizen_launch_effect *effect, struct wl_listener *listener)
122 wl_signal_add(&effect->events.type_set, listener);
126 ds_tizen_launch_effect_add_type_unset_listener(
127 struct ds_tizen_launch_effect *effect, struct wl_listener *listener)
129 wl_signal_add(&effect->events.type_unset, listener);
133 ds_tizen_launch_effect_add_new_splash_listener(
134 struct ds_tizen_launch_effect *effect, struct wl_listener *listener)
136 wl_signal_add(&effect->events.new_splash, listener);
140 ds_tizen_launch_effect_set_effect_type(struct ds_tizen_launch_effect *effect,
141 uint32_t pid, int effect_type)
143 struct ds_tizen_launch_effect_info *info;
145 ds_inf("ds_tizen_launch_effect_set_effect_type() pid(%u), effect_type(%d)", pid, effect_type);
147 info = calloc(1, sizeof *info);
149 ds_err("calloc() failed. tizen_effect_info");
153 info->effect_type = effect_type;
155 wl_list_insert(&effect->infos, &info->link);
159 ds_tizen_launch_effect_unset_effect_type(struct ds_tizen_launch_effect *effect,
162 struct ds_tizen_launch_effect_info *info, *tmp;
164 ds_inf("ds_tizen_launch_effect_unset_effect_type() pid(%u)", pid);
166 wl_list_for_each_safe(info, tmp, &effect->infos, link) {
167 if (info->pid == pid) {
168 ds_inf("ds_tizen_launch_effect_unset_effect_type() pid found.", pid);
169 wl_list_remove(&info->link);
176 ds_tizen_launch_effect_get_effect_type(struct ds_tizen_launch_effect *effect,
179 struct ds_tizen_launch_effect_info *info;
181 ds_inf("ds_tizen_launch_effect_get_effect_type() pid(%u)", pid);
183 wl_list_for_each(info, &effect->infos, link) {
184 if (info->pid == pid) {
185 return info->effect_type;
193 ds_tizen_launch_splash_add_destroy_listener(
194 struct ds_tizen_launch_splash *splash, struct wl_listener *listener)
196 wl_signal_add(&splash->events.destroy, listener);
200 ds_tizen_launch_splash_add_owner_listener(
201 struct ds_tizen_launch_splash *splash, struct wl_listener *listener)
203 wl_signal_add(&splash->events.owner, listener);
207 ds_tizen_launch_splash_get_pid(struct ds_tizen_launch_splash *splash)
213 ds_tizen_launch_splash_set_pid(struct ds_tizen_launch_splash *splash, uint32_t pid)
219 effect_client_destroy(struct ds_tizen_launch_effect_client *client)
221 struct ds_tizen_launch_splash *splash, *tmp;
223 wl_list_for_each_safe(splash, tmp, &client->splashs, link) {
224 wl_signal_emit_mutable(&splash->events.destroy, splash);
225 wl_list_remove(&splash->link);
229 wl_list_remove(&client->link);
233 static void effect_handle_display_destroy(struct wl_listener *listener,
236 struct ds_tizen_launch_effect *effect;
237 struct ds_tizen_launch_effect_client *client, *tmp_client;
238 struct ds_tizen_launch_effect_info *info, *tmp_info;
240 effect = wl_container_of(listener, effect, destroy);
242 ds_inf("Global destroy: effect(%p)", effect);
244 wl_signal_emit_mutable(&effect->events.destroy, effect);
245 wl_list_remove(&effect->destroy.link);
247 wl_list_for_each_safe(client, tmp_client, &effect->clients, link) {
248 effect_client_destroy(client);
251 wl_list_for_each_safe(info, tmp_info, &effect->infos, link) {
252 wl_list_remove(&info->link);
256 wl_global_destroy(effect->global);
261 effect_get_effect_type(const char *effect_type)
263 enum ds_tizen_launch_effect_type type = 0;
265 if (!effect_type) return 0;
267 if (!strncmp(effect_type, "launch", sizeof("launch"))) type = DS_TIZEN_LAUNCH_EFFECT_TYPE_LAUNCH;
268 else if (!strncmp(effect_type, "depth-in", sizeof("depth-in"))) type = DS_TIZEN_LAUNCH_EFFECT_TYPE_DEPTH_IN;
274 splash_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource)
276 wl_resource_destroy(resource);
280 splash_handle_launch(struct wl_client *wl_client,
281 struct wl_resource *resource, const char *pfname, uint32_t ftype,
282 uint32_t depth, uint32_t angle, uint32_t indicator,
283 const char *effect_type, const char *theme_type,
284 struct wl_array *options)
286 struct ds_tizen_launch_effect_event_type_set ds_event;
287 struct ds_tizen_launch_splash *splash;
288 struct ds_tizen_launch_effect *effect;
290 ds_inf("splash launch");
291 ds_inf("path %s(%s), indicator(%d), angle(%d), effect_type(%s)",
292 pfname, (ftype == DS_TIZEN_LAUNCH_SPLASH_FILE_TYPE_IMG) ? "IMG" : "EDC", indicator, angle, effect_type);
293 ds_inf("theme_type(%s), options(%p)",theme_type, options);
295 splash = wl_resource_get_user_data(resource);
296 splash->pid = SPLASH_CLIENT_PID;
297 effect = splash->effect;
299 ds_event.pid = SPLASH_CLIENT_PID;
300 ds_event.effect_type = effect_get_effect_type(effect_type);
302 ds_inf("Effect type_set. pid:%u type:%s", ds_event.pid, effect_type);
304 wl_signal_emit_mutable(&effect->events.type_set, &ds_event);
309 splash_handle_owner(struct wl_client *wl_client,
310 struct wl_resource *resource, uint32_t pid)
312 struct ds_tizen_launch_splash *splash;
313 struct ds_tizen_launch_splash_event_owner ds_event;
315 ds_inf("splash set owner. pid:%u", pid);
317 splash = wl_resource_get_user_data(resource);
320 wl_signal_emit_mutable(&splash->events.owner, &ds_event);
324 splash_handle_launch_v2(struct wl_client *wl_client,
325 struct wl_resource *resource, const char *pfname, uint32_t ftype,
326 uint32_t depth, uint32_t angle, uint32_t indicator,
327 const char *effect_type, const char *theme_type,
328 struct wl_array *options, struct wl_array *extra_config)
330 struct ds_tizen_launch_effect_event_type_set ds_event;
331 struct ds_tizen_launch_splash *splash;
332 struct ds_tizen_launch_effect *effect;
334 ds_inf("splash launch_v2");
335 ds_inf("path %s(%s), indicator(%d), angle(%d), effect_type(%s)",
336 pfname, (ftype == DS_TIZEN_LAUNCH_SPLASH_FILE_TYPE_IMG) ? "IMG" : "EDC", indicator, angle, effect_type);
337 ds_inf("theme_type(%s) options(%p) extra_config(%p)", theme_type, options, extra_config);
339 splash = wl_resource_get_user_data(resource);
340 splash->pid = SPLASH_CLIENT_PID;
341 effect = splash->effect;
343 ds_event.pid = SPLASH_CLIENT_PID;
344 ds_event.effect_type = effect_get_effect_type(effect_type);
346 ds_inf("Effect type_set. pid:%u type:%s", ds_event.pid, effect_type);
348 wl_signal_emit_mutable(&effect->events.type_set, &ds_event);
352 if ((extra_config) && (extra_config->size)) {
355 int size = extra_config->size;
358 p_char = extra_config->data + len;
359 len = strlen(p_char) + 1;
362 if (!strcmp(p_char, CUSTOM_EFFECT_CALLEE)) {
363 //parse next data(appid) from array
365 p_char = p_char + len;
366 len = strlen(p_char) + 1;
369 splash->appid = strdup(p_char);
370 splash->custom_effect_callee = true;
372 ds_inf("custom effect callee set appid(%s)",
381 static const struct tizen_launch_splash_interface splash_impl =
383 splash_handle_destroy,
384 splash_handle_launch,
386 splash_handle_launch_v2,
390 splash_client_handle_destroy(struct wl_resource *resource)
392 struct ds_tizen_launch_splash *splash;
394 splash = wl_resource_get_user_data(resource);
396 ds_inf("splash_client_handle_destroy (client:%p)", splash->client);
398 wl_signal_emit_mutable(&splash->events.destroy, splash);
399 wl_list_remove(&splash->link);
403 struct ds_tizen_launch_splash*
404 splash_create_splash_img(struct ds_tizen_launch_effect_client *client, uint32_t id)
406 struct ds_tizen_launch_splash *splash;
408 splash = calloc(1, sizeof *splash);
410 wl_client_post_no_memory(client->wl_client);
414 splash->resource = wl_resource_create(client->wl_client,
415 &tizen_launch_splash_interface, wl_resource_get_version(client->resource),
417 if (!splash->resource) {
419 wl_client_post_no_memory(client->wl_client);
422 splash->client = client;
423 splash->effect = client->effect;
424 splash->pid = SPLASH_CLIENT_PID;
426 wl_signal_init(&splash->events.destroy);
427 wl_signal_init(&splash->events.owner);
429 wl_resource_set_implementation(splash->resource, &splash_impl,
430 splash, splash_client_handle_destroy);
432 wl_list_insert(&client->splashs, &splash->link);
434 ds_inf("New Splash img %p (res %p)", splash, splash->resource);
440 effect_handle_create_splash_img(struct wl_client *wl_client,
441 struct wl_resource *resource, uint32_t id)
443 struct ds_tizen_launch_effect *effect;
444 struct ds_tizen_launch_effect_client *client;
445 struct ds_tizen_launch_splash *splash;
447 client = wl_resource_get_user_data(resource);
448 splash = splash_create_splash_img(client, id);
451 effect = client->effect;
452 wl_signal_emit_mutable(&effect->events.new_splash, splash);
456 effect_handle_type_set(struct wl_client *wl_client,
457 struct wl_resource *resource, const char *effect_type, uint32_t pid,
458 struct wl_array *options)
460 struct ds_tizen_launch_effect *effect;
461 struct ds_tizen_launch_effect_client *client;
462 struct ds_tizen_launch_effect_event_type_set ds_event;
464 client = wl_resource_get_user_data(resource);
465 effect = client->effect;
468 ds_event.effect_type = effect_get_effect_type(effect_type);
470 ds_inf("Effect type_set. pid:%u type:%s", pid, effect_type);
472 wl_signal_emit_mutable(&effect->events.type_set, &ds_event);
476 effect_handle_type_unset(struct wl_client *wl_client,
477 struct wl_resource *resource, uint32_t pid)
479 struct ds_tizen_launch_effect *effect;
480 struct ds_tizen_launch_effect_client *client;
481 struct ds_tizen_launch_effect_event_type_unset ds_event;
483 client = wl_resource_get_user_data(resource);
484 effect = client->effect;
488 ds_inf("Effect type_unset. pid:%u", pid);
490 wl_signal_emit_mutable(&effect->events.type_unset, &ds_event);
494 effect_handle_destroy(struct wl_client *wl_client,
495 struct wl_resource *resource)
497 wl_resource_destroy(resource);
500 static const struct tizen_launch_effect_interface effect_impl =
502 effect_handle_create_splash_img,
503 effect_handle_type_set,
504 effect_handle_type_unset,
505 effect_handle_destroy,
509 effect_client_handle_destroy(struct wl_resource *resource)
511 struct ds_tizen_launch_effect_client *client;
513 client = wl_resource_get_user_data(resource);
515 ds_inf("effect_client_handle_destroy (client:%p)", client);
517 effect_client_destroy(client);
520 static void effect_bind(struct wl_client *wl_client, void *data,
521 uint32_t version, uint32_t id)
523 struct ds_tizen_launch_effect *effect = data;
524 struct ds_tizen_launch_effect_client *client;
526 client = calloc(1, sizeof *client);
527 if (client == NULL) {
528 ds_err("calloc() failed. tizen_,launch_effect");
529 wl_client_post_no_memory(wl_client);
533 ds_inf("tizen_effect. client binds. (client:%p)", client);
535 client->effect = effect;
536 client->wl_client = wl_client;
538 client->resource = wl_resource_create(wl_client,
539 &tizen_launch_effect_interface,
540 MIN(version, TIZEN_EFFECT_VERSION), id);
542 if (client->resource == NULL) {
543 ds_err("tizen_effect : wl_resource_create() failed.");
545 wl_client_post_no_memory(wl_client);
549 wl_list_init(&client->splashs);
551 wl_resource_set_implementation(client->resource, &effect_impl, client,
552 effect_client_handle_destroy);
554 wl_list_insert(&effect->clients, &client->link);