[SDL_Tizen] Improve indicator functions
[platform/upstream/SDL.git] / src / video / tizen / SDL_tizenwindow.c
index cdc5f96..fcc9089 100755 (executable)
@@ -70,8 +70,26 @@ Ecore_Ipc_Server *ipc = NULL;
    if (ecore_ipc_client_server_get(e->client) != ipc) \
      return ECORE_CALLBACK_PASS_ON
 
-void Tizen_ExecuteIndicatorProcess()
+void _tizen_quickpanel_on(SDL_WindowData *wind)
 {
+    SDL_Log("[SDL]Quick panel on");
+    ecore_wl_window_indicator_state_set(wind->window, ECORE_WL_INDICATOR_STATE_ON);
+    ecore_wl_indicator_visible_type_set(wind->window, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
+}
+
+void _tizen_quickpanel_off(SDL_WindowData *wind)
+{
+    SDL_Log("[SDL]Quick panel off");
+    ecore_wl_window_indicator_state_set(wind->window, ECORE_WL_INDICATOR_STATE_OFF);
+    ecore_wl_indicator_visible_type_set(wind->window, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
+}
+
+void Tizen_ExecuteIndicatorProcess(SDL_WindowData *wind)
+{
+    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
+    if(!videoData) return;
+
+
     _tizen_init_ecore_ipc();
     unsigned int childPID = fork();
     if(childPID == 0)
@@ -87,14 +105,72 @@ void Tizen_ExecuteIndicatorProcess()
     else if(childPID == -1)
     {
         SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Failed fork");
+        videoData->indicator_on = SDL_FALSE;
+        videoData->indicator_visible = SDL_FALSE;
     }
     else
     {
         SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] parent process : %d", getpid());
+        videoData->indicator_on = SDL_TRUE;
+        videoData->indicator_visible = SDL_TRUE;
+        videoData->indicator_parent_id = wind->id;
+    }
+}
+
+void
+Tizen_TerminateIndicatorProcess(SDL_WindowData *wind)
+{
+    if(!wind) return;
+
+    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
+    if(videoData->indicator_on)
+    {
+        _tizen_ecore_ipc_client_send(OP_TERMINATE, 0, 0, 0);
+        _tizen_quickpanel_off(wind);
     }
 }
 
-void _tizen_ecore_ipc_client_send(int major, int minor, int ref, int ref_to)
+SDL_bool
+Tizen_SupportIndicator(SDL_Window *window)
+{
+    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
+    return (!(window->flags & SDL_WINDOW_BORDERLESS) && !videoData->indicator_on);
+}
+
+void
+Tizen_chk_indicator(SDL_Window *window)
+{
+    SDL_WindowData *wind = window->driverdata;
+    int screen_w, screen_h;
+
+    int rotation = (wind->output_rotation + wind->rotation) % 360;
+    if(rotation==90 || rotation==270)
+        ecore_wl_screen_size_get(&screen_h, &screen_w);
+    else
+        ecore_wl_screen_size_get(&screen_w, &screen_h);
+
+    if(window->w == screen_w && window->h == screen_h && window->x ==0 && window->y == 0)
+    {
+        if(Tizen_SupportIndicator(window))
+        {
+            wind->support_indicator = SDL_TRUE;
+            Tizen_ExecuteIndicatorProcess(wind);
+        }
+        else
+        {
+            wind->support_indicator = SDL_FALSE;
+            Tizen_TerminateIndicatorProcess(wind);
+        }
+    }
+    else
+    {
+        wind->support_indicator = SDL_FALSE;
+        Tizen_TerminateIndicatorProcess(wind);
+    }
+}
+
+void
+_tizen_ecore_ipc_client_send(int major, int minor, int ref, int ref_to)
 {
     Eina_List *ipc_clients = ecore_ipc_server_clients_get(ipc);
     Eina_List *l;
@@ -103,7 +179,8 @@ void _tizen_ecore_ipc_client_send(int major, int minor, int ref, int ref_to)
     ecore_ipc_client_send(cl, major, minor, ref, ref_to, 0, NULL, 0);
 }
 
-static Eina_Bool _cb_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+static Eina_Bool
+_cb_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
     IPC_HEAD(Add);
 
@@ -123,7 +200,8 @@ static Eina_Bool _cb_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, vo
     return ECORE_CALLBACK_DONE;
 }
 
-static Eina_Bool _cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+static Eina_Bool
+_cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
     IPC_HEAD(Del);
     SDL_Log("[SDL]_cb_client_del");
@@ -141,16 +219,46 @@ static Eina_Bool _cb_client_del(void *data EINA_UNUSED, int type EINA_UNUSED, vo
     return ECORE_CALLBACK_DONE;
 }
 
-static Eina_Bool _cb_client_data(void *data, int type EINA_UNUSED, void *event)
+static Eina_Bool
+_cb_client_data(void *data, int type EINA_UNUSED, void *event)
 {
     IPC_HEAD(Data);
 
     Ecore_Ipc_Event_Server_Data* epcEvent = (Ecore_Ipc_Event_Server_Data*)event;
     SDL_Log("[SDL]_cb_client_data: %d -> %d", epcEvent->major, epcEvent->minor);
+
+    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
+    SDL_Window * window = (SDL_Window*)eina_hash_find(videoData->windows, &videoData->indicator_parent_id);
+    switch(epcEvent->major)
+    {
+    case OP_INDICATOR_INIT:
+        videoData->indicator_height = epcEvent->minor;
+        _tizen_quickpanel_on(window->driverdata);
+    break;
+    case OP_INDICATOR_SHOW:
+        videoData->indicator_visible = SDL_TRUE;
+    break;
+    case OP_INDICATOR_HIDE:
+        if(epcEvent->minor == 1)
+        {
+            _tizen_quickpanel_off(window->driverdata);
+        }
+        else if(epcEvent->minor == 2)
+        {
+            videoData->indicator_visible = SDL_FALSE;
+        }
+    break;
+    case OP_TERMINATE:
+        videoData->indicator_on = SDL_FALSE;
+        videoData->indicator_visible = SDL_FALSE;
+    break;
+    }
+
     return ECORE_CALLBACK_DONE;
 }
 
-int _tizen_init_ecore_ipc()
+int
+_tizen_init_ecore_ipc()
 {
 
     if(!ipc)
@@ -261,17 +369,12 @@ Tizen_SetWindowTitle(_THIS, SDL_Window * window)
 void
 Tizen_ShowWindow(_THIS, SDL_Window *window)
 {
-    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
-
-    if(!(window->flags & SDL_WINDOW_BORDERLESS) && !videoData->indicator_on)
-    {
-        Tizen_ExecuteIndicatorProcess();
-    }
-
     SDL_WindowData *wind = window->driverdata;
     ecore_wl_window_show(wind->window);
+    Tizen_chk_indicator(window);
 }
 
+
 void
 Tizen_HideWindow(_THIS, SDL_Window *window)
 {
@@ -305,6 +408,7 @@ Tizen_SetWindowFullscreen(_THIS, SDL_Window *window,
 
     window->fullscreen_mode.w = screen_w;
     window->fullscreen_mode.h = screen_h;
+    Tizen_chk_indicator(window);
 }
 
 void
@@ -461,6 +565,16 @@ Tizen_rotate_update(SDL_Window *window)
     _tizen_rotation_do(window, wind, rotation);
 }
 
+SDL_Window*
+Tizen_FindWindow(_THIS, Ecore_Wl_Window *ewin)
+{
+    SDL_VideoData *data = _this->driverdata;
+    int id;
+
+    id = ecore_wl_window_id_get(ewin);
+    return (SDL_Window*)eina_hash_find(data->windows, &id);
+}
+
 void
 _tizen_window_orientaiton_hint_callback(void *userdata, const char *name, const char *oldValue, const char *newValue)
 {
@@ -728,9 +842,16 @@ Tizen_CreateWindow(_THIS, SDL_Window *window)
 void
 Tizen_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
 {
-    SDL_VideoData* videoData = SDL_GetVideoDevice()->driverdata;
-    if(!videoData->indicator_on)
-        Tizen_ExecuteIndicatorProcess();
+    if(!bordered)
+    {
+        SDL_WindowData *wind = window->driverdata;
+        wind->support_indicator = SDL_FALSE;
+        Tizen_TerminateIndicatorProcess(window->driverdata);
+    }
+    else
+    {
+        Tizen_chk_indicator(window);
+    }
 }
 
 void
@@ -758,7 +879,7 @@ Tizen_SetWindowSize(_THIS, SDL_Window *window)
     }
     SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h);
 #endif
-
+    Tizen_chk_indicator(window);
 }
 
 void
@@ -782,7 +903,8 @@ Tizen_SetWindowPosition(_THIS, SDL_Window * window)
     }
 
     // TODO : consider to rotation status.
-   ecore_wl_window_position_set(wind->window, window->x, window->y);
+    ecore_wl_window_position_set(wind->window, window->x, window->y);
+    Tizen_chk_indicator(window);
 }
 
 void
@@ -806,16 +928,6 @@ Tizen_DestroyWindow(_THIS, SDL_Window *window)
     window->driverdata = NULL;
 }
 
-SDL_Window*
-Tizen_FindWindow(_THIS, Ecore_Wl_Window *ewin)
-{
-    SDL_VideoData *data = _this->driverdata;
-    int id;
-
-    id = ecore_wl_window_id_get(ewin);
-    return (SDL_Window*)eina_hash_find(data->windows, &id);
-}
-
 Eina_Bool
 _tizen_cb_event_window_visibility_change(void *data, int type, void *event)
 {