e_comp_wl: remove "unmaximize_done" smart call
[platform/upstream/enlightenment.git] / src / bin / e_client.c
index dc60597..065efdf 100644 (file)
@@ -108,6 +108,8 @@ struct _E_Client_Private
 
    Eina_Bool hide_by_request;
    Eina_Bool focus_check;
+
+   E_Client *modal;
 };
 
 static int _e_client_hooks_delete = 0;
@@ -980,10 +982,23 @@ _e_client_private_finish(E_Client *ec)
 }
 
 static void
+_e_input_thread_client_free(void *data)
+{
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+   INF("[input thread|%s] ec: %p\n", __func__, ec_data->ec);
+   e_input_thread_client_free(e_input_thread_client_get(ec_data->ec));
+}
+
+static void
 _e_client_free(E_Client *ec)
 {
    g_rec_mutex_lock(&e_comp->ec_list_mutex);
 
+   E_Input_Thread_Request_EClient_Data ec_data;
+   memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
    e_comp_object_redirected_set(ec->frame, 0);
    e_comp_object_render_update_del(ec->frame);
 
@@ -1028,6 +1043,10 @@ _e_client_free(E_Client *ec)
 
    e_uuid_store_entry_del(ec->uuid);
 
+   ec_data.ec = ec;
+   INF("[%s] ec: %p\n", __func__, ec);
+   e_input_thread_safe_call(_e_input_thread_client_free, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
    _e_client_private_finish(ec);
    free(ec);
 
@@ -1035,10 +1054,22 @@ _e_client_free(E_Client *ec)
 }
 
 static void
+_e_input_thread_client_del(void *data)
+{
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+   INF("[input thread|%s] ec: %p\n", __func__, ec_data->ec);
+   e_input_thread_client_del(e_input_thread_client_get(ec_data->ec));
+}
+
+static void
 _e_client_del(E_Client *ec)
 {
    E_Client *child;
    E_Pixmap_Type type;
+   E_Input_Thread_Request_EClient_Data ec_data;
+   memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
 
    g_rec_mutex_lock(&e_comp->ec_list_mutex);
 
@@ -1076,6 +1107,8 @@ _e_client_del(E_Client *ec)
 
    if (ec->parent)
      {
+        if (e_client_modal_child_get(ec->parent) == ec)
+          e_client_modal_child_set(ec->parent, NULL);
         ec->parent->transients = eina_list_remove(ec->parent->transients, ec);
         ec->parent = NULL;
      }
@@ -1113,6 +1146,10 @@ _e_client_del(E_Client *ec)
 
    e_comp_visibility_calculation_set(EINA_TRUE);
 
+   ec_data.ec = ec;
+   INF("[%s] ec: %p\n", __func__, ec);
+   e_input_thread_safe_call(_e_input_thread_client_del, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
    g_rec_mutex_unlock(&e_comp->ec_list_mutex);
 }
 
@@ -1150,7 +1187,6 @@ _e_client_cb_ping_poller(void *data)
         if (ec->hung)
           {
              ec->hung = 0;
-             evas_object_smart_callback_call(ec->frame, "unhung", NULL);
              E_FREE_FUNC(ec->kill_timer, ecore_timer_del);
           }
      }
@@ -1165,7 +1201,6 @@ _e_client_cb_ping_poller(void *data)
              if (!ec->hung)
                {
                   ec->hung = 1;
-                  evas_object_smart_callback_call(ec->frame, "hung", NULL);
                   /* FIXME: if below dialog is up - hide it now */
                }
              if (ec->delete_requested)
@@ -2656,13 +2691,13 @@ e_client_visibility_get(E_Client *ec)
 }
 
 static void
-_e_input_thread_client_visible_set(void *data)
+_e_input_thread_client_visibility_set(void *data)
 {
    E_Input_Thread_Request_EClient_Data *ec_data = data;
    EINA_SAFETY_ON_NULL_RETURN(ec_data);
 
-   INF("[input thread|%s] ec(%p), visible(%d)\n", __func__, ec_data->ec, ec_data->visible);
-   e_input_thread_client_visible_set(e_input_thread_client_get(ec_data->ec), ec_data->visible);
+   INF("[input thread|%s] ec(%p), visibility(%d)\n", __func__, ec_data->ec, ec_data->visibility);
+   e_input_thread_client_visibility_set(e_input_thread_client_get(ec_data->ec), ec_data->visibility);
 }
 
 EINTERN void
@@ -2678,10 +2713,10 @@ e_client_visibility_set(E_Client *ec, E_Visibility visibility)
    ec->visibility.obscured = visibility;
 
    ec_data.ec = ec;
-   ec_data.visible = ec->visibility.obscured;
+   ec_data.visibility = ec->visibility.obscured;
 
-   INF("[%s] ec(%p), visible(%d)\n", __func__, ec, ec->visibility.obscured);
-   e_input_thread_safe_call(_e_input_thread_client_visible_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+   INF("[%s] ec(%p), visibility(%d)\n", __func__, ec, ec->visibility.obscured);
+   e_input_thread_safe_call(_e_input_thread_client_visibility_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
 }
 
 static Eina_Bool
@@ -3013,6 +3048,49 @@ e_client_mapped_set(E_Client *ec, Eina_Bool set)
    cdata->mapped = set;
 }
 
+EINTERN void
+e_client_modal_child_set(E_Client *ec, E_Client *modal)
+{
+   API_ENTRY;
+
+   E_Client *old_modal = priv->modal;
+   if (old_modal == modal) return;
+
+   ELOGF("E_CLIENT", "SET modal. new(ec:%p, win:0x%08zx), old(ec:%p, win:0x%08zx)", ec,
+         modal, e_client_util_win_get(modal), old_modal, e_client_util_win_get(old_modal));
+
+   // TODO: if ec has a modal window already, then how does we do?
+   priv->modal = modal;
+}
+
+EINTERN E_Client *
+e_client_modal_child_get(E_Client *ec)
+{
+   API_ENTRY_VAL(NULL);
+   return priv->modal;
+}
+
+EINTERN void
+e_client_modal_state_set(E_Client *ec, Eina_Bool modal)
+{
+   if (!ec) return;
+   ec->netwm.state.modal = modal;
+
+   if (ec->parent)
+     {
+        if (ec->netwm.state.modal)
+          e_client_modal_child_set(ec->parent, ec);
+        else
+          e_client_modal_child_set(ec->parent, NULL);
+     }
+}
+
+EINTERN Eina_Bool
+e_client_is_modal_state(E_Client *ec)
+{
+   if (!ec) return EINA_FALSE;
+   return ec->netwm.state.modal;
+}
 
 ////////////////////////////////////////////////
 EINTERN Eina_Bool
@@ -4405,8 +4483,6 @@ e_client_maximize(E_Client *ec, E_Maximize max)
         // store the E_Maximize value
         ec->maximized = max;
         ec->changes.need_unmaximize = 0;
-
-        evas_object_smart_callback_call(ec->frame, "maximize_done", NULL);
      }
    else
      {
@@ -4441,12 +4517,8 @@ e_client_unmaximize(E_Client *ec, E_Maximize max)
 
    if (!ec->fullscreen)
      {
-        evas_object_smart_callback_call(ec->frame, "unmaximize_pre", NULL);
-
         // call the unmaximize hook of a client
         wl_signal_emit(&PRI(ec)->events.unmaximize, &max);
-
-        evas_object_smart_callback_call(ec->frame, "unmaximize_done", NULL);
      }
 
    ec->maximized = E_MAXIMIZE_NONE;
@@ -6154,6 +6226,31 @@ e_client_util_move_resize_without_frame(E_Client *ec, int x, int y, int w, int h
      }
 }
 
+static void
+_e_input_thread_client_layer_set(void *data)
+{
+   E_Input_Thread_Request_EClient_Data *ec_data = data;
+   EINA_SAFETY_ON_NULL_RETURN(ec_data);
+
+   INF("[input thread|%s] ec(%p), layer(%d)\n", __func__, ec_data->ec, ec_data->layer);
+   e_input_thread_client_layer_set(e_input_thread_client_get(ec_data->ec), ec_data->layer);
+}
+
+EINTERN void
+e_client_input_thread_layer_set(E_Client *ec, E_Layer layer)
+{
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   E_Input_Thread_Request_EClient_Data ec_data;
+   memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+   ec_data.ec = ec;
+   ec_data.layer = layer;
+
+   INF("[%s] ec(%p), layer(%d)\n", __func__, ec, layer);
+   e_input_thread_safe_call(_e_input_thread_client_layer_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+}
+
 E_API Eina_Bool
 e_client_layer_set(E_Client *ec,
                    E_Layer layer)
@@ -6197,6 +6294,7 @@ e_client_layer_set(E_Client *ec,
         if (ec->layer_pending || ec->layer_block)
           {
              ec->layer = layer;
+             e_client_input_thread_layer_set(ec, layer);
              return EINA_TRUE;
           }
      }
@@ -7418,7 +7516,6 @@ e_client_icccm_name_set(E_Client *ec, const char *name)
 
         ec_data.ec = ec;
         ec_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
-        ec_data.visible = ec->visible;
         ec_data.is_video = EINA_FALSE;
 
         if (name)
@@ -7459,7 +7556,6 @@ e_client_netwm_name_set(E_Client *ec, const char *name)
 
    ec_data.ec = ec;
    ec_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
-   ec_data.visible = EINA_FALSE;
 
    if (name)
      strncpy(ec_data.netwm_name, name, sizeof(ec_data.netwm_name)-1);