2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 //==========================================================================
12 * @file CicoSCWlWinMgrIF.cpp
14 * @brief This file implementation of CicoSCWlInputMgrIF class
16 //==========================================================================
20 #include <sys/types.h>
24 #include "ico_syc_type.h"
25 #include "CicoSCWlWinMgrIF.h"
26 #include "CicoSCWayland.h"
28 #include "CicoSystemConfig.h"
30 #include "CicoSCWindowController.h"
32 //==========================================================================
34 //==========================================================================
35 struct ico_window_mgr *CicoSCWlWinMgrIF::m_winmgr = NULL;
36 struct ivi_application *CicoSCWlWinMgrIF::m_ivi_app = NULL;
37 struct ivi_controller *CicoSCWlWinMgrIF::m_ivi_ctrl = NULL;
38 struct wl_output *CicoSCWlWinMgrIF::m_wloutput = NULL;
40 int CicoSCWlWinMgrIF::m_id_surface = 0;
42 struct creation_surface_wait *CicoSCWlWinMgrIF::m_wait_surface_creation = NULL;
43 struct creation_surface_wait *CicoSCWlWinMgrIF::m_free_surface_creation = NULL;
45 //--------------------------------------------------------------------------
47 * @brief default constructor
49 //--------------------------------------------------------------------------
50 CicoSCWlWinMgrIF::CicoSCWlWinMgrIF()
52 // ico_window_mgr listener
53 m_listener.window_active = wlActiveCB;
54 m_listener.map_surface = wlMapSurfaceCB;
55 m_listener.update_surface = wlUpdateSurfaceCB;
56 m_listener.destroy_surface = wlDestroySurfaceCB;
58 // genivi ivi_application listener
59 m_ivi_app_listener.wl_shell_info = wlIviAppNativeShellInfoCB;
61 // genivi ivi_controller listener
62 m_ivi_ctrl_listener.screen = wlIviCtrlScreenCB;
63 m_ivi_ctrl_listener.layer = wlIviCtrlLayerCB;
64 m_ivi_ctrl_listener.surface = wlIviCtrlSurfaceCB;
65 m_ivi_ctrl_listener.error = wlIviCtrlErrorCB;
66 m_ivi_ctrl_listener.native_handle = wlIviCtrlNativeHandleCB;
68 // wayland output listener
69 m_wlOutputListener.geometry = wlOutputGeometryCB;
70 m_wlOutputListener.mode = wlOutputModeCB;
73 //--------------------------------------------------------------------------
77 //--------------------------------------------------------------------------
78 CicoSCWlWinMgrIF::~CicoSCWlWinMgrIF()
82 //--------------------------------------------------------------------------
84 * @brief initialize ico_window_mgr interfaces
86 * @param [in] data user data
87 * @param [in] registry wayland registry
88 * @param [in] name wayland display id
89 * @parma [in] interface wayland interface name
90 * @parma [in] version wayland interface version number
92 //--------------------------------------------------------------------------
94 CicoSCWlWinMgrIF::initInterface(void *data,
95 struct wl_registry *registry,
97 const char *interface,
100 ICO_TRA("CicoSCWlWinMgrIF::initInterface Enter(interface=%s)", interface);
102 // check interface name
103 if (0 == strcmp(interface, ICO_WL_WIN_MGR_IF)) {
104 // get interface instance
105 ICO_DBG("called: wl_registry_bind");
106 void *wlProxy = wl_registry_bind(registry,
108 &ico_window_mgr_interface,
110 if (NULL == wlProxy) {
111 ICO_WRN("interface(%s) wl_registry_bind failed.",
113 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave(binding failed)");
118 m_winmgr = (struct ico_window_mgr *)wlProxy;
119 ico_window_mgr_add_listener(m_winmgr,
123 else if (0 == strcmp(interface, ICO_WL_IVI_APPLICATION_IF)) {
124 // get interface instance
125 ICO_DBG("called: wl_registry_bind for ivi_application");
126 void *wlProxy = wl_registry_bind(registry,
128 &ivi_application_interface,
130 if (NULL == wlProxy) {
131 ICO_WRN("interface(%s) wl_registry_bind failed.",
133 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave(binding failed)");
136 m_ivi_app = (struct ivi_application *)wlProxy;
137 ivi_application_add_listener(m_ivi_app,
141 else if (0 == strcmp(interface, ICO_WL_IVI_CONTROLLER_IF)) {
142 // get interface instance
143 ICO_DBG("called: wl_registry_bind for ivi_controller");
144 void *wlProxy = wl_registry_bind(registry,
146 &ivi_controller_interface,
148 if (NULL == wlProxy) {
149 ICO_WRN("interface(%s) wl_registry_bind failed.",
151 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave(binding failed)");
154 m_ivi_ctrl = (struct ivi_controller *)wlProxy;
155 ivi_controller_add_listener(m_ivi_ctrl,
156 &m_ivi_ctrl_listener,
159 else if (0 == strcmp(interface, ICO_WL_OUTPUT_IF)) {
160 // get interface instance
161 ICO_DBG("called: wl_registry_bind");
162 void *wlProxy = wl_registry_bind(registry,
164 &wl_output_interface,
166 if (NULL == wlProxy) {
167 ICO_WRN("interface(%s) wl_registry_bind failed.",
169 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave(binding failed)");
173 m_wloutput = (struct wl_output*)wlProxy;
174 wl_output_add_listener(m_wloutput,
179 ICO_WRN("unmatch interface");
180 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave(unmatch interface)");
184 if((NULL != m_winmgr) && (NULL != m_wloutput)) {
185 m_initialized = true;
188 ICO_TRA("CicoSCWlWinMgrIF::initInterface Leave");
191 //--------------------------------------------------------------------------
193 * @brief wrapper function of ilm_layerAddSurface
195 * @param [in] surfaceid wayland surface id
196 * @param [in] layer layer id
197 * @param [in] oldlayer old layer id(if 0xffffffff, no old layer)
199 //--------------------------------------------------------------------------
201 CicoSCWlWinMgrIF::setWindowLayer(uint32_t surfaceid, uint32_t layer, uint32_t oldlayer)
203 // set window layer request to Multi Window Manager
204 ICO_DBG("CicoSCWlWinMgrIF::setWindowLayer: "
205 "surfaceid=%08x layer=%d->%d", surfaceid, oldlayer, layer);
207 if (oldlayer == layer) {
208 ICO_DBG("CicoSCWlWinMgrIF::setWindowLayer: new layer same as old, NOP");
212 // remove original layer
213 if (oldlayer <= 0x7fffffff) {
214 ICO_TRA("CicoSCWlWinMgrIF::setWindowLayer: remove surface %08x "
215 "from layer(%d)", surfaceid, oldlayer);
216 if (ilm_layerRemoveSurface(oldlayer, surfaceid) != ILM_SUCCESS) {
217 ICO_ERR("CicoSCWlWinMgrIF::setWindowLayer ilm_layerRemoveSurface(%d,%08x) "
218 "Error", oldlayer, surfaceid);
220 // must need ilm_commitChanges() after ilm_layerRemoveSurface()
221 if (ilm_commitChanges() != ILM_SUCCESS) {
222 ICO_ERR("CicoSCWlWinMgrIF::setWindowLayer ilm_commitChanges Error");
226 ICO_TRA("CicoSCWlWinMgrIF::setWindowLayer: surface %08x has no old layer(%d)",
227 surfaceid, oldlayer);
231 if (ilm_layerAddSurface(layer, surfaceid) != ILM_SUCCESS) {
232 ICO_ERR("CicoSCWlWinMgrIF::setWindowLayer ilm_layerAddSurface(%d,%08x) Error",
235 if (ilm_commitChanges() != ILM_SUCCESS) {
236 ICO_ERR("CicoSCWlWinMgrIF::setWindowLayer ilm_commitChanges Error");
240 //--------------------------------------------------------------------------
242 * @brief wrapper function of ilm_surfaceSetDestinationRectangle
244 * @param [in] surfaceid wayland surface id
245 * @param [in] layer number of layer
251 //--------------------------------------------------------------------------
253 CicoSCWlWinMgrIF::setPositionsize(uint32_t surfaceid, uint32_t node,
254 int32_t x, int32_t y, int32_t width, int32_t height)
256 // set position size request to Multi Window Manager
257 ICO_DBG("called: ilm_surfaceSetDestinationRectangle"
258 "(surfaceid=%08x node=%d x=%d y=%d w=%d h=%d)",
259 surfaceid, node, x, y, width, height);
261 if (ilm_surfaceSetDestinationRectangle(surfaceid, x, y, width, height)
263 ICO_ERR("CicoSCWlWinMgrIF::setPositionsize ilm_surfaceSetDestinationRectangle"
264 "(%08x,%d,%d,%d,%d) Error", surfaceid, x, y, width, height);
266 else if (ilm_surfaceSetSourceRectangle(surfaceid, 0, 0, width, height)
268 ICO_ERR("CicoSCWlWinMgrIF::setPositionsize ilm_surfaceSetSourceRectangle"
269 "(%08x,0,0,%d,%d) Error", surfaceid, width, height);
271 else if (ilm_commitChanges() != ILM_SUCCESS) {
272 ICO_ERR("CicoSCWlWinMgrIF::setPositionsize ilm_commitChanges() Error");
276 //--------------------------------------------------------------------------
278 * @brief wrapper function of ilm_surfaceSetVisibility
280 * @param [in] surfaceid wayland surface id
281 * @param [in] visible visible state
283 //--------------------------------------------------------------------------
285 CicoSCWlWinMgrIF::setVisible(uint32_t surfaceid, int32_t visible)
287 // set visible request to Multi Window Manager
288 ICO_DBG("called: ilm_surfaceSetVisibility(surfaceid=%08x visible=%d)",
290 if ((visible == ICO_SYC_WIN_VISIBLE_SHOW) || (visible == ICO_SYC_WIN_VISIBLE_HIDE)) {
291 ilm_surfaceSetVisibility(surfaceid, visible);
292 if (ilm_commitChanges() != ILM_SUCCESS) {
293 ICO_ERR("CicoSCWlWinMgrIF::setVisible: ilm_commitChanges() Error");
298 //--------------------------------------------------------------------------
300 * @brief wrapper function of ico_window_mgr_set_animation
302 * @param [in] surfaceid wayland surface id
303 * @param [in] type transition type
304 * @param [in] animation name of animation
305 * @param [in] time time of animation
307 //--------------------------------------------------------------------------
309 CicoSCWlWinMgrIF::setAnimation(uint32_t surfaceid, int32_t type,
310 const char *animation, int32_t time)
312 ICO_DBG("called: ico_window_mgr_set_animation"
313 "(surfaceid=%08x type=%d anima=%s time=%d)",
314 surfaceid, type, animation, time);
315 ico_window_mgr_set_animation(m_winmgr, surfaceid, type, animation, time);
316 // need wayland flush for GENIVI layer management
317 CicoSCWayland::getInstance()->flushDisplay();
320 //--------------------------------------------------------------------------
322 * @brief wrapper function of ilm_SetKeyboardFocusOn
324 * @param [in] surfaceid wayland surface id
325 * @param [in] active flags or active device(unused)
327 //--------------------------------------------------------------------------
329 CicoSCWlWinMgrIF::setActive(uint32_t surfaceid, int32_t active)
331 ICO_DBG("called: ilm_SetKeyboardFocusOn"
332 "(surfaceid=%08x active=%d)", surfaceid, active);
333 if ((ilm_SetKeyboardFocusOn(surfaceid) != ILM_SUCCESS) ||
334 (ilm_commitChanges() != ILM_SUCCESS)) {
335 ICO_ERR("CicoSCWlWinMgrIF::setActive ilm_SetKeyboardFocusOn(%08x) Error", surfaceid);
339 //--------------------------------------------------------------------------
341 * @brief wrapper function of ilm_layerSetVisibility
343 * @param [in] surfaceid wayland surface id
344 * @param [in] layer id of layer
345 * @param [in] visible visible state
347 //--------------------------------------------------------------------------
349 CicoSCWlWinMgrIF::setLayerVisible(uint32_t layer, int32_t visible)
351 ICO_DBG("called: ilm_layerSetVisibility"
352 "(layer=%d visible=%d)", layer, visible);
353 if ((ilm_layerSetVisibility(layer, visible) != ILM_SUCCESS) ||
354 (ilm_commitChanges() != ILM_SUCCESS)) {
355 ICO_ERR("CicoSCWlWinMgrIF::setLayerVisible ilm_layerSetVisibility(%d,%d) Error",
360 //--------------------------------------------------------------------------
362 * @brief wrapper function of ilm_takeSurfaceScreenshot
364 * @param [in] surface id of wayland surface
365 * @param [in] filepath surface image pixel file path
367 //--------------------------------------------------------------------------
369 CicoSCWlWinMgrIF::setmapGet(int surfaceid, const char *filepath)
371 ICO_DBG("called: ilm_takeSurfaceScreenshot(filepath=%s,, surface=%08x)",
372 filepath ? filepath : "(null)", surfaceid);
373 if ((ilm_takeSurfaceScreenshot(filepath, surfaceid) != ILM_SUCCESS) ||
374 (ilm_commitChanges() != ILM_SUCCESS)) {
375 ICO_ERR("CicoSCWlWinMgrIF::setmapGet ilm_takeSurfaceScreenshot(%s,%x) Error",
376 filepath ? filepath : "(null)", surfaceid);
380 //--------------------------------------------------------------------------
382 * @brief wrapper function of ico_window_mgr_map_surface
384 * @param [in] surface id of wayland surface
385 * @param [in] framerate interval of changed notify[frame per second]
386 * @param [in] filepath surface image pixel file path
388 //--------------------------------------------------------------------------
390 CicoSCWlWinMgrIF::mapSurface(uint32_t surfaceid, int32_t framerate, const char *filepath)
392 ICO_DBG("called: ico_window_mgr_map_surface(surfaceid=%08x framerate=%d file=%s)",
393 surfaceid, framerate, filepath ? filepath : "(null)");
394 // currently GENIVI genivi-shell not support contents change, so use ico_window_mgr
395 if ((filepath != NULL) && (*filepath != 0) && (*filepath != ' ')) {
396 ico_window_mgr_map_surface(m_winmgr, surfaceid, framerate, filepath);
399 ico_window_mgr_map_surface(m_winmgr, surfaceid, framerate, " ");
403 //--------------------------------------------------------------------------
405 * @brief wrapper function of ico_window_mgr_unmap_surface
407 * @param [in] surface id of wayland surface
409 //--------------------------------------------------------------------------
411 CicoSCWlWinMgrIF::unmapSurface(uint32_t surfaceid)
413 ICO_DBG("called: ico_window_mgr_unmap_surface"
414 "(surfaceid=%08x)", surfaceid);
415 // currently GENIVI genivi-shell not support contents change, so use ico_window_mgr
416 ico_window_mgr_unmap_surface(m_winmgr, surfaceid);
419 //--------------------------------------------------------------------------
421 * @brief get creation surface window name(title) and pid
423 * @param [in] id_surface surface id
424 * @param [out] pid application process id
426 //--------------------------------------------------------------------------
428 CicoSCWlWinMgrIF::wlIviCtrlGetSurfaceWaiting(uint32_t id_surface, int *pid)
430 struct creation_surface_wait *tp = m_wait_surface_creation;
433 if (tp->id_surface == id_surface) {
434 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlGetSurfaceWaiting(%x) pid=%d title=<%s>",
435 id_surface, tp->pid, tp->title);
441 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlGetSurfaceWaiting(%x) dose not exist", id_surface);
445 //--------------------------------------------------------------------------
447 * @brief remove surface window
449 * @param [in] id_surface surface id
451 //--------------------------------------------------------------------------
453 CicoSCWlWinMgrIF::wlIviCtrlRemoveSurface(uint32_t id_surface)
455 struct creation_surface_wait *tp = m_wait_surface_creation;
456 struct creation_surface_wait *bp = NULL;
459 if (tp->id_surface == id_surface) {
464 m_wait_surface_creation = tp->next;
466 tp->next = m_free_surface_creation;
467 m_free_surface_creation = tp;
469 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlRemoveSurface(%x) removed", id_surface);
475 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlRemoveSurface(%x) dose not exist", id_surface);
478 //--------------------------------------------------------------------------
480 * @brief wayland surface active callback
482 * @param [in] data user data(unused)
483 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
484 * @param [in] surfaceid ico_window_mgr surface Id
485 * @param [in] select select device(unused)
486 * (0=not active/1=pointer/2=touch)
488 //--------------------------------------------------------------------------
490 CicoSCWlWinMgrIF::activeCB(void *data,
491 struct ico_window_mgr *ico_window_mgr,
495 ICO_WRN("CicoSCWlWinMgrIF::activeCB called.");
498 //--------------------------------------------------------------------------
500 * @brief surface map event callback
502 * @param [in] data user data(unused)
503 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
504 * @param [in] event event
505 * @param [in] surfaceid surface Id
506 * @param [in] type surface buffer type(EGL buffer/Shared memory)
507 * @param [in] width surface width
508 * @param [in] height surface height
509 * @param [in] stride surface buffer(frame buffer) stride
510 * @param [in] format surface buffer format
512 //--------------------------------------------------------------------------
514 CicoSCWlWinMgrIF::mapSurfaceCB(void *data,
515 struct ico_window_mgr *ico_window_mgr,
524 ICO_WRN("CicoSCWlWinMgrIF::mapSurfaceCB called.");
527 //--------------------------------------------------------------------------
529 * @brief surface update event callback
531 * @param [in] data user data(unused)
532 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
533 * @param [in] surfaceid surface Id
534 * @param [in] visible visibility
535 * @param [in] srcwidth application buffer width
536 * @param [in] srcheight application buffer height
539 * @param [in] width width
540 * @param [in] height height
542 //--------------------------------------------------------------------------
544 CicoSCWlWinMgrIF::updateSurfaceCB(void *data,
545 struct ico_window_mgr *ico_window_mgr,
555 ICO_WRN("CicoSCWlWinMgrIF::updateSurfaceCB called.");
558 //--------------------------------------------------------------------------
560 * @brief wayland surface destroy callback
562 * @param [in] data user data(unused)
563 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
564 * @param [in] surfaceid surface Id
566 //--------------------------------------------------------------------------
568 CicoSCWlWinMgrIF::destroySurfaceCB(void *data,
569 struct ico_window_mgr *ico_window_mgr,
572 ICO_WRN("CicoSCWlWinMgrIF::destroySurfaceCB called.");
575 //--------------------------------------------------------------------------
577 * @brief wayland update surface name callback
579 * @param [in] surfaceid surface Id
580 * @param [in] winname surface name (title)
582 //--------------------------------------------------------------------------
584 CicoSCWlWinMgrIF::updateWinnameCB(uint32_t surfaceid,
587 ICO_WRN("CicoSCWlWinMgrIF::updateWinnameCB called.");
590 //--------------------------------------------------------------------------
592 * @brief wayland display attribute callback
594 * @param [in] data user data(unused)
595 * @param [in] wl_output wayland wl_output interface
596 * @param [in] x display upper-left X coordinate
597 * @param [in] y display upper-left Y coordinate
598 * @param [in] physical_width display physical width
599 * @param [in] physical_height display physical height
600 * @param [in] subpixel display sub pixel
601 * @param [in] make display maker
602 * @param [in] model display model
603 * @param [in] transform transform
605 //--------------------------------------------------------------------------
607 CicoSCWlWinMgrIF::outputGeometryCB(void *data,
608 struct wl_output *wl_output,
611 int32_t physical_width,
612 int32_t physical_height,
618 ICO_WRN("CicoSCWlWinMgrIF::outputGeometryCB called.");
621 //--------------------------------------------------------------------------
623 * @brief wayland display mode callback
625 * @param [in] data user data(unused)
626 * @param [in] wl_output wayland wl_output interface
627 * @param [in] flags flags
628 * @param [in] width display width
629 * @param [in] height display height
630 * @param [in] refresh display refresh rate
632 //--------------------------------------------------------------------------
634 CicoSCWlWinMgrIF::outputModeCB(void *data,
635 struct wl_output *wl_output,
641 ICO_WRN("CicoSCWlWinMgrIF::outputModeCB called.");
644 //--------------------------------------------------------------------------
646 * @brief wayland genivi ivi-surface create callback
648 * @param [in] data user data(unused)
649 * @param [in] ivi_controller wayland ivi-controller plugin interface
650 * @param [in] id_surface surface id
651 * @param [in] pid surface creator process id
652 * @param [in] title surface title
654 //--------------------------------------------------------------------------
656 CicoSCWlWinMgrIF::createSurfaceCB(void *data,
657 struct ivi_controller *ivi_controller,
662 ICO_WRN("CicoSCWlWinMgrIF::createSurfaceCB called.");
665 //==========================================================================
667 //==========================================================================
669 //--------------------------------------------------------------------------
671 * @brief wayland surface active callback
673 * @param [in] data user data(unused)
674 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
675 * @param [in] surfaceid ico_window_mgr surface Id
676 * @param [in] select select device(unused)
677 * (0=not active/1=pointer/2=touch)
679 //--------------------------------------------------------------------------
681 CicoSCWlWinMgrIF::wlActiveCB(void *data,
682 struct ico_window_mgr *ico_window_mgr,
686 // ICO_TRA("CicoSCWlWinMgrIF::wlActiveCB Enter");
689 ICO_WRN("wlActiveCB: data is null");
692 static_cast<CicoSCWlWinMgrIF*>(data)->activeCB(data, ico_window_mgr,
694 // ICO_TRA("CicoSCWlWinMgrIF::wlActiveCB Leave");
697 //--------------------------------------------------------------------------
699 * @brief surface map event callback
701 * @param [in] data user data
702 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
703 * @param [in] event event
704 * @param [in] surfaceid surface Id
705 * @param [IN] type buffer type(fixed ICO_WINDOW_MGR_MAP_TYPE_EGL)
706 * @param [in] width surface width
707 * @param [in] height surface height
708 * @param [in] stride surface buffer(frame buffer) stride
709 * @param [in] format surface buffer format
711 //--------------------------------------------------------------------------
713 CicoSCWlWinMgrIF::wlMapSurfaceCB(void *data,
714 struct ico_window_mgr *ico_window_mgr,
723 // ICO_TRA("CicoSCWlWinMgrIF::wlMapSurfaceCB Enter");
726 ICO_WRN("wlMapSurfaceCB: data is null");
729 static_cast<CicoSCWlWinMgrIF*>(data)->mapSurfaceCB(data, ico_window_mgr,
734 // ICO_TRA("CicoSCWlWinMgrIF::wlMapSurfaceCB Leave");
737 //--------------------------------------------------------------------------
739 * @brief surface update event callback
741 * @param [in] data user data
742 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
743 * @param [in] surfaceid surface Id
744 * @param [in] visible visibility
745 * @param [in] srcwidth application buffer width
746 * @param [in] srcheight application buffer height
749 * @param [in] width width
750 * @param [in] height height
752 //--------------------------------------------------------------------------
754 CicoSCWlWinMgrIF::wlUpdateSurfaceCB(void *data,
755 struct ico_window_mgr *ico_window_mgr,
765 // ICO_TRA("CicoSCWlWinMgrIF::wlUpdateSurfaceCB Enter");
768 ICO_WRN("wlUpdateSurfaceCB: data is null");
771 static_cast<CicoSCWlWinMgrIF*>(data)->updateSurfaceCB(data, ico_window_mgr,
774 x, y, width, height);
775 // ICO_TRA("CicoSCWlWinMgrIF::wlUpdateSurfaceCB Leave");
778 //--------------------------------------------------------------------------
780 * @brief surface destroy event callback
782 * @param [in] data user data
783 * @param [in] ico_window_mgr wayland ico_window_mgr plugin interface
784 * @param [in] surfaceid surface Id
786 //--------------------------------------------------------------------------
788 CicoSCWlWinMgrIF::wlDestroySurfaceCB(void *data,
789 struct ico_window_mgr *ico_window_mgr,
792 // ICO_TRA("CicoSCWlWinMgrIF::wlDestroySurfaceCB Enter");
795 ICO_WRN("wlDestroySurfaceCB: data is null");
798 wlIviCtrlRemoveSurface(surfaceid);
800 static_cast<CicoSCWlWinMgrIF*>(data)->destroySurfaceCB(data, ico_window_mgr,
802 // ICO_TRA("CicoSCWlWinMgrIF::wlDestroySurfaceCB Leave");
805 //--------------------------------------------------------------------------
807 * @brief wayland display attribute callback
809 * @param [in] data user data(unused)
810 * @param [in] wl_output wayland wl_output interface
811 * @param [in] x display upper-left X coordinate
812 * @param [in] y display upper-left Y coordinate
813 * @param [in] physical_width display physical width
814 * @param [in] physical_height display physical height
815 * @param [in] subpixel display sub pixel
816 * @param [in] make display maker
817 * @param [in] model display model
818 * @param [in] transform transform
820 //--------------------------------------------------------------------------
822 CicoSCWlWinMgrIF::wlOutputGeometryCB(void *data,
823 struct wl_output *wl_output,
826 int32_t physical_width,
827 int32_t physical_height,
833 // ICO_TRA("CicoSCWlWinMgrIF::wlOutputGeometryCB Enter");
836 ICO_WRN("wlOutputGeometryCB: data is null");
839 static_cast<CicoSCWlWinMgrIF*>(data)->outputGeometryCB(data, wl_output,
847 // ICO_TRA("CicoSCWlWinMgrIF::wlOutputGeometryCB Leave");
850 //--------------------------------------------------------------------------
852 * @brief wayland display mode callback
854 * @param [in] data user data(unused)
855 * @param [in] wl_output wayland wl_output interface
856 * @param [in] flags flags
857 * @param [in] width display width
858 * @param [in] height display height
859 * @param [in] refresh display refresh rate
861 //--------------------------------------------------------------------------
863 CicoSCWlWinMgrIF::wlOutputModeCB(void *data,
864 struct wl_output *wl_output,
870 // ICO_TRA("CicoSCWlWinMgrIF::wlOutputModeCB Enter");
873 ICO_WRN("wlOutputGeometryCB: data is null");
876 static_cast<CicoSCWlWinMgrIF*>(data)->outputModeCB(data, wl_output, flags,
877 width, height, refresh);
878 // ICO_TRA("CicoSCWlWinMgrIF::wlOutputModeCB Leave");
881 //--------------------------------------------------------------------------
883 * @brief wayland ivi-shell ivi-application protocol create wl_surface callback
885 * @param [in] data user data(unused)
886 * @param [in] ivi_application wayland ivi-application interface
887 * @param [in] pid application process id
888 * @param [in] title surface title name
890 //--------------------------------------------------------------------------
892 CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB(void *data,
893 struct ivi_application *ivi_application,
894 int32_t pid, const char *title,
897 struct creation_surface_wait *tp;
898 struct creation_surface_wait *tp2;
900 ICO_TRA("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: Enter(%d,<%s>)",
901 pid, title ? title : "(null)");
904 ICO_WRN("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: Leave(data is null)");
908 ICO_TRA("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: Leave(no title)");
912 // if same pid and same title, skip
913 tp = m_wait_surface_creation;
915 if ((tp->pid == pid) && (strcmp(tp->title, title) == 0)) {
916 ICO_TRA("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: Leave(same title)");
922 // get native surface info
923 tp = m_free_surface_creation;
925 m_free_surface_creation = tp->next;
928 tp = (struct creation_surface_wait *)malloc(sizeof(struct creation_surface_wait));
930 ICO_ERR("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: out of memory");
934 memset(tp, 0, sizeof(struct creation_surface_wait));
935 tp->next = m_wait_surface_creation;
937 strncpy(tp->title, title, ICO_SYC_MAX_WINNAME_LEN-1);
938 tp->busy = SCWINMGR_GENIVI_BUSY_WAIT;
939 tp2 = m_wait_surface_creation;
941 if (tp2->busy != SCWINMGR_GENIVI_BUSY_NONE) break;
944 m_wait_surface_creation = tp;
946 tp->busy = SCWINMGR_GENIVI_BUSY_REQSURF;
947 ICO_TRA("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: "
948 "call ivi_controller_get_native_handle(%d,<%s>)", pid, title);
949 ivi_controller_get_native_handle(m_ivi_ctrl, pid, title);
951 ICO_TRA("CicoSCWlWinMgrIF::wlIviAppNativeShellInfoCB: Leave");
954 //--------------------------------------------------------------------------
956 * @brief wayland ivi-shell ivi-controller protocol create screen callback
958 * @param [in] data user data(unused)
959 * @param [in] ivi_controller wayland ivi-controller interface
960 * @param [in] id_screen screen id
961 * @param [in] screen screen information
963 //--------------------------------------------------------------------------
965 CicoSCWlWinMgrIF::wlIviCtrlScreenCB(void *data,
966 struct ivi_controller *ivi_controller,
968 struct ivi_controller_screen *screen)
970 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlScreenCB: Enter(%x)", id_screen);
973 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlScreenCB: data is null");
976 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlScreenCB: Leave");
979 //--------------------------------------------------------------------------
981 * @brief wayland ivi-shell ivi-controller protocol create layer callback
983 * @param [in] data user data(unused)
984 * @param [in] ivi_controller wayland ivi-controller interface
985 * @param [in] id_layer layer id
987 //--------------------------------------------------------------------------
989 CicoSCWlWinMgrIF::wlIviCtrlLayerCB(void *data,
990 struct ivi_controller *ivi_controller,
993 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlLayerCB: Enter(%x)", id_layer);
996 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlLayerCB: data is null");
999 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlLayerCB: Leave");
1002 //--------------------------------------------------------------------------
1004 * @brief wayland ivi-shell ivi-controller protocol create surface callback
1006 * @param [in] data user data(unused)
1007 * @param [in] ivi_controller wayland ivi-controller interface
1008 * @param [in] id_surface surface id
1009 * @param [in] pid surface creator process id
1010 * @param [in] title surface title
1012 //--------------------------------------------------------------------------
1014 CicoSCWlWinMgrIF::wlIviCtrlSurfaceCB(void *data,
1015 struct ivi_controller *ivi_controller,
1016 uint32_t id_surface,
1020 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlSurfaceCB: Enter(%x)", id_surface);
1023 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlSurfaceCB: data is null");
1027 static_cast<CicoSCWlWinMgrIF*>(data)->
1028 createSurfaceCB(data, ivi_controller, id_surface, pid, title);
1030 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlSurfaceCB: Leave");
1033 //--------------------------------------------------------------------------
1035 * @brief wayland ivi-shell ivi-controller protocol error callback
1037 * @param [in] data user data(unused)
1038 * @param [in] ivi_controller wayland ivi-controller interface
1039 * @param [in] error_code error code
1040 * @param [in] error_text error message
1042 //--------------------------------------------------------------------------
1044 CicoSCWlWinMgrIF::wlIviCtrlErrorCB(void *data,
1045 struct ivi_controller *ivi_controller,
1046 int32_t object_id, int32_t object_type,
1047 int32_t error_code, const char *error_text)
1049 struct creation_surface_wait *tp;
1050 struct creation_surface_wait *tp2;
1051 struct creation_surface_wait *deltp;
1053 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlErrorCB: Enter(%d[%d],%d,<%s>)",
1054 object_id, object_type, error_code, error_text ? error_text : "(null)");
1057 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlErrorCB: data is null");
1061 // search request wait
1062 tp = m_wait_surface_creation;
1066 if (tp->busy == SCWINMGR_GENIVI_BUSY_WAIT) {
1069 else if (tp->busy == SCWINMGR_GENIVI_BUSY_REQSURF) {
1072 else if (tp->busy != SCWINMGR_GENIVI_BUSY_NONE) {
1073 tp->busy = SCWINMGR_GENIVI_BUSY_NONE;
1078 if (m_wait_surface_creation == deltp) {
1079 m_wait_surface_creation = deltp->next;
1082 tp = m_wait_surface_creation;
1083 while(tp->next != deltp) {
1087 tp->next = deltp->next;
1090 deltp->next = m_free_surface_creation;
1091 m_free_surface_creation = deltp;
1094 tp2->busy = SCWINMGR_GENIVI_BUSY_REQSURF;
1095 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlErrorCB: "
1096 "call ivi_controller_get_native_handle(%d,<%s>)", tp2->pid, tp2->title);
1097 ivi_controller_get_native_handle(m_ivi_ctrl, tp2->pid, tp2->title);
1099 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlErrorCB: Leave");
1102 //--------------------------------------------------------------------------
1104 * @brief wayland ivi-shell ivi-controller protocol native handle callback
1106 * @param [in] data user data(unused)
1107 * @param [in] ivi_controller wayland ivi-controller interface
1108 * @param [in] surface weston_surface object
1110 //--------------------------------------------------------------------------
1112 CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB(void *data,
1113 struct ivi_controller *ivi_controller,
1114 struct wl_surface *surface)
1116 struct creation_surface_wait *tp;
1117 struct creation_surface_wait *tp2;
1118 struct creation_surface_wait *tp3;
1119 struct creation_surface_wait *bp;
1120 uint32_t id_surface;
1123 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: Enter(surf=%p)", (void *)surface);
1126 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: Leave(data is null)");
1130 // check same surface
1131 tp = m_wait_surface_creation;
1134 if (tp->busy == SCWINMGR_GENIVI_BUSY_REQSURF) break;
1139 ICO_WRN("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: Leave(no request)");
1144 tp3 = m_wait_surface_creation;
1146 if ((tp != tp3) && (tp3->pid == tp->pid)) {
1152 if (surface_count == 1) {
1153 // title change, delete old table
1154 id_surface = tp2->id_surface;
1155 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: winname change"
1156 "(%08x,<%s>)", id_surface, tp->title);
1157 strcpy(tp2->title, tp->title);
1159 bp->next = tp->next;
1162 m_wait_surface_creation = tp->next;
1164 tp->next = m_free_surface_creation;
1165 m_free_surface_creation = tp;
1167 static_cast<CicoSCWlWinMgrIF*>(data)->updateWinnameCB(tp2->id_surface, tp2->title);
1170 // create ivi-surface and bind to wl_surface
1172 if (m_id_surface >= 0x00ffffff) m_id_surface = 1;
1173 id_surface = m_id_surface | 0x40000000;
1175 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: "
1176 "call ivi_application_surface_create(%08x)", id_surface);
1177 if (ivi_application_surface_create(m_ivi_app, id_surface, surface) == NULL) {
1178 ICO_ERR("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: "
1179 "ivi_application_surface_create(%08x) Error", id_surface);
1181 bp->next = tp->next;
1184 m_wait_surface_creation = tp->next;
1186 tp->next = m_free_surface_creation;
1187 m_free_surface_creation = tp;
1190 tp->surface = surface;
1191 tp->id_surface = id_surface;
1192 tp->busy = SCWINMGR_GENIVI_BUSY_REQBIND;
1196 // search request wait
1197 tp = m_wait_surface_creation;
1200 if (tp->busy == SCWINMGR_GENIVI_BUSY_WAIT) {
1203 else if (tp->busy != SCWINMGR_GENIVI_BUSY_NONE) {
1208 if ((tp == NULL) && (tp2 != NULL)) {
1209 tp2->busy = SCWINMGR_GENIVI_BUSY_REQSURF;
1210 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: "
1211 "call ivi_controller_get_native_handle(%d,<%s>)", tp2->pid, tp2->title);
1212 ivi_controller_get_native_handle(m_ivi_ctrl, tp2->pid, tp2->title);
1214 ICO_TRA("CicoSCWlWinMgrIF::wlIviCtrlNativeHandleCB: Leave(id_surface=%08x)", id_surface);
1216 // vim:set expandtab ts=4 sw=4: