src/include/e_map.h \
src/include/e_input_event.h \
src/include/e_device.h \
-src/include/e_types.h
+src/include/e_types.h \
+src/include/e_input_thread_client.h
enlightenment_src = \
src/bin/e_actions.c \
src/bin/e_subsurface_watcher.c \
src/bin/e_tbm_gbm_server.c \
src/bin/e_comp_input.c \
-src/bin/e_linux_dmabuf.c
+src/bin/e_linux_dmabuf.c \
+src/bin/e_input_thread_client.c
src_bin_enlightenment_CPPFLAGS = $(E_CPPFLAGS) -DEFL_BETA_API_SUPPORT -DEFL_EO_API_SUPPORT -DE_LOGGING=2 @WAYLAND_CFLAGS@ $(TTRACE_CFLAGS) $(DLOG_CFLAGS) $(PIXMAN_CFLAGS) $(POLICY_CFLAGS) $(EGL_CFLAGS)
if HAVE_LIBGOMP
#include "e_desk_intern.h"
#include "e_zone_intern.h"
#include "e_config_intern.h"
+#include "e_input_thread_client_intern.h"
#define PRI(ec) ((E_Client_Private *)e_object_data_get(E_OBJECT(ec)))
return ec->visibility.obscured;
}
+static void
+_e_input_thread_client_visible_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memcpy(&ec_data, data, sizeof(E_Input_Thread_Request_EClient_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);
+}
+
EINTERN void
e_client_visibility_set(E_Client *ec, E_Visibility visibility)
{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
EINA_SAFETY_ON_NULL_RETURN(ec);
if (e_client_visibility_get(ec) == visibility) return;
ec->visibility.obscured = visibility;
+
+ ec_data.ec = ec;
+ ec_data.visible = 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));
}
static Eina_Bool
return E_LAYER_CLIENT_FULLSCREEN;
}
+static void
+_e_input_thread_client_new(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_new_data;
+ memcpy(&ec_new_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|%s] ec(%p), surface(%p)\n", __func__, ec_new_data.ec, ec_new_data.wl_surface);
+ e_input_thread_client_new(ec_new_data.ec, ec_new_data.wl_surface);
+}
+
E_API E_Client *
e_client_new(E_Pixmap *cp, int first_map, int internal)
{
ec->visibility.ignore_geometry = e_config->calc_vis_ignore_geometry;
+ E_Input_Thread_Request_EClient_Data ec_new_data;
+ memset(&ec_new_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ ec_new_data.ec = ec;
+ ec_new_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
+ INF("[%s] ec(%p), surface(%p)\n", __func__, ec, ec_new_data.wl_surface);
+ e_input_thread_safe_call(_e_input_thread_client_new, &ec_new_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
return ec;
}
ec->comp_data->shell.ping(ec->comp_data->shell.surface);
}
+static void
+_e_input_thread_client_icccm_name_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memcpy(&ec_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|%s] ec(%p), name(%s)\n", __func__, ec_data.ec, ec_data.icccm_name);
+ e_input_thread_client_icccm_name_set(e_input_thread_client_get(ec_data.ec), ec_data.icccm_name);
+}
+
EINTERN void
e_client_icccm_name_set(E_Client *ec, const char *name)
{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
EINA_SAFETY_ON_NULL_RETURN(ec);
if (eina_stringshare_replace(&ec->icccm.name, name))
- ec->changes.title = EINA_TRUE;
+ {
+ ec->changes.title = EINA_TRUE;
+
+ 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)
+ strncpy(ec_data.icccm_name, name, sizeof(ec_data.icccm_name)-1);
+
+ INF("[%s] ec(%p), surface(%p), name(%s)\n", __func__, ec, ec_data.wl_surface, name);
+ e_input_thread_safe_call(_e_input_thread_client_icccm_name_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
E_API Eina_Stringshare *
return ec->icccm.name;
}
+static void
+_e_input_thread_client_netwm_name_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memcpy(&ec_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|%s] ec(%p), name(%p)\n", __func__, ec_data.ec, ec_data.netwm_name);
+ e_input_thread_client_netwm_name_set(e_input_thread_client_get(ec_data.ec), ec_data.netwm_name);
+}
+
EINTERN void
e_client_netwm_name_set(E_Client *ec, const char *name)
{
+ E_Input_Thread_Request_EClient_Data ec_data = { NULL, NULL, EINA_FALSE, EINA_FALSE };
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
EINA_SAFETY_ON_NULL_RETURN(ec);
eina_stringshare_replace(&ec->netwm.name, 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);
+
+ INF("[%s] ec(%p), surface(%p), name(%s)\n", __func__, ec, ec_data.wl_surface, ec_data.netwm_name);
+ e_input_thread_safe_call(_e_input_thread_client_netwm_name_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
}
E_API Eina_Stringshare *
return ec->netwm.name;
}
+static void
+_e_input_thread_client_icccm_title_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memcpy(&ec_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|%s] ec(%p), title(%s)\n", __func__, ec_data.ec, ec_data.icccm_title);
+ e_input_thread_client_icccm_title_set(e_input_thread_client_get(ec_data.ec), ec_data.icccm_title);
+}
+
EINTERN void
e_client_icccm_title_set(E_Client *ec, const char *title)
{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
EINA_SAFETY_ON_NULL_RETURN(ec);
if (eina_stringshare_replace(&ec->icccm.title, title))
- ec->changes.title = EINA_TRUE;
+ {
+ ec->changes.title = EINA_TRUE;
+
+ ec_data.ec = ec;
+ ec_data.wl_surface = ec->comp_data ? ec->comp_data->wl_surface : NULL;
+ if (title)
+ strncpy(ec_data.icccm_title, title, sizeof(ec_data.icccm_title)-1);
+
+ INF("[%s] ec(%p), surface(%p)\n", __func__, ec, ec_data.wl_surface);
+ e_input_thread_safe_call(_e_input_thread_client_icccm_title_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+ }
}
E_API Eina_Stringshare *
ec->comp_data->mapped = 0;
}
}
+
+static void
+_e_input_thread_client_video_mode_set(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memcpy(&ec_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|%s] ec(%p), is_video(%d)\n", __func__, ec_data.ec, ec_data.is_video);
+ e_input_thread_client_video_set(e_input_thread_client_get(ec_data.ec), ec_data.is_video);
+}
+
+EINTERN void
+e_client_video_mode_set(E_Client *ec, Eina_Bool is_video)
+{
+ E_Input_Thread_Request_EClient_Data ec_data;
+ memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+ EINA_SAFETY_ON_NULL_RETURN(ec->hwc_window);
+
+ ec->hwc_window->is_video = is_video;
+
+ ec_data.ec = ec;
+ ec_data.is_video = is_video;
+
+ INF("[%s] ec(%p), is_video(%d)\n", __func__, ec, is_video);
+ e_input_thread_safe_call(_e_input_thread_client_video_mode_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data));
+}
EINTERN E_Visibility e_client_visibility_get(E_Client *ec);
EINTERN void e_client_visibility_set(E_Client *ec, E_Visibility visibility);
+EINTERN void e_client_video_mode_set(E_Client *ec, Eina_Bool is_video);
+
EINTERN Eina_Bool e_client_intercept_hook_focus_revert_call(E_Client *ec);
EINTERN Eina_Bool e_client_intercept_hook_auto_placement_call(E_Client *ec);
#include "e_hints_intern.h"
#include "e_comp_input_intern.h"
#include "e_blur_intern.h"
+#include "e_input_thread_client_intern.h"
#include <tizen-extension-server-protocol.h>
#include <relative-pointer-unstable-v1-server-protocol.h>
evas_object_hide(ec->frame);
}
+static void
+_e_input_thread_client_free(void *data)
+{
+ E_Input_Thread_Request_EClient_Data ec_free_data;
+ memcpy(&ec_free_data, data, sizeof(E_Input_Thread_Request_EClient_Data));
+
+ INF("[input thread|e_client_free] ec: %p, surface: %p\n", ec_free_data.ec, ec_free_data.wl_surface);
+}
+
EINTERN void
e_comp_wl_client_surface_finish(E_Client *ec)
{
}
}
+ E_Input_Thread_Request_EClient_Data ec_free_data;
+ memset(&ec_free_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
+ ec_free_data.ec = ec;
+ ec_free_data.wl_surface = ec->comp_data->wl_surface;
+
+ INF("[e_comp_wl_client_surface_finish] surface: %p\n", ec_free_data.wl_surface);
+ e_input_thread_safe_call(_e_input_thread_client_free, &ec_free_data, sizeof(E_Input_Thread_Request_EClient_Data));
+
e_comp_wl_client_surface_set(ec, NULL);
ec->comp_data->wl_surface = NULL;
#include "e_comp_input_intern.h"
#include "e_policy_intern.h"
#include "e_keyrouter_intern.h"
+#include "e_input_thread_client_intern.h"
#include <sys/mman.h>
#include <fcntl.h>
E_Input_Thread_Request_Keyboard_Get_Data keyboard_get_data;
memcpy(&keyboard_get_data, data, sizeof(E_Input_Thread_Request_Keyboard_Get_Data));
+ INF("[input thread|keyboard_get] resource: %p, client : %p\n", keyboard_get_data.resource, keyboard_get_data.client);
+
res = keyboard_get_data.resource;
e_comp_input_key->kbd.resources =
end:
/* video window */
if (state == E_HWC_WINDOW_STATE_VIDEO)
- ec->hwc_window->is_video = EINA_TRUE;
+ e_client_video_mode_set(ec, EINA_TRUE);
e_hwc_window_state_set(ec->hwc_window, state, EINA_TRUE);
unsigned int data_length;
} E_Input_Thread_Request_Data;
-typedef struct
-{
- struct wl_client *client;
- struct wl_resource *resource;
- struct wl_resource *surface;
- uint32_t key;
- uint32_t mode;
-} E_Input_Thread_Request_Keygrab_Data;
-
-typedef struct
-{
- struct wl_client *client;
- struct wl_resource *resource;
-} E_Input_Thread_Request_Keyboard_Get_Data;
-
struct _E_Input_Seat
{
const char *name;
--- /dev/null
+#include "e_input_thread_client_intern.h"
+
+struct _E_Input_Thread_Client
+{
+ void *ec;
+ struct wl_resource *surface;
+ Eina_Bool visible;
+ Eina_Bool is_video;
+ Eina_Stringshare *icccm_name;
+ Eina_Stringshare *netwm_name;
+ Eina_Stringshare *icccm_title;
+};
+
+static Eina_List *_itc_list = NULL;
+
+///////////////////////////////////////////
+EINTERN void
+e_input_thread_client_init()
+{
+
+}
+
+EINTERN void
+e_input_thread_client_shutdown()
+{
+ if (_itc_list)
+ eina_list_free(_itc_list);
+
+ _itc_list = NULL;
+}
+
+EINTERN E_Input_Thread_Client *
+e_input_thread_client_new(E_Client *ec, struct wl_resource *surface)
+{
+ E_Input_Thread_Client *itc = calloc(1, sizeof(E_Input_Thread_Client));
+ EINA_SAFETY_ON_NULL_RETURN_VAL(itc, NULL);
+
+ itc->ec = ec;
+ itc->surface = surface;
+
+ _itc_list = eina_list_append(_itc_list, itc);
+ INF("[%s] iec(%p), ec(%p), surface(%p)\n", __func__, itc, ec, surface);
+
+ return itc;
+}
+
+EINTERN void
+e_input_thread_client_free(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ _itc_list = eina_list_remove(_itc_list, iec);
+
+ free(iec);
+}
+
+EINTERN void
+e_input_thread_visible_set(E_Input_Thread_Client *iec, Eina_Bool visible)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ INF("[%s] iec(%p), visible(%d)\n", __func__, iec, visible);
+
+ iec->visible = visible;
+}
+
+E_API Eina_Bool
+e_input_thread_visible_get(E_Input_Thread_Client *iec, Eina_Bool visible)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
+
+ return iec->visible;
+}
+
+E_API Eina_Bool
+e_input_thread_client_video_mode_get(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
+
+ return iec->is_video;
+}
+
+EINTERN void
+e_input_thread_client_video_set(E_Input_Thread_Client *iec, Eina_Bool is_video)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->is_video = is_video;
+ INF("[%s] iec(%p), video(%d)\n", __func__, iec, is_video);
+}
+
+EINTERN void
+e_input_thread_client_visible_set(E_Input_Thread_Client *iec, Eina_Bool visible)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ iec->visible = visible;
+ INF("[%s] iec(%p), ec(%p), visible(%d)\n", __func__, iec, iec->ec, visible);
+}
+
+E_API Eina_Bool
+e_input_thread_client_visible_get(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, EINA_FALSE);
+
+ return iec->visible;
+}
+
+EINTERN void
+e_input_thread_client_icccm_name_set(E_Input_Thread_Client *iec, char *name)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ eina_stringshare_replace(&iec->icccm_name, name);
+ INF("[%s] iec(%p), name(%s)\n", __func__, iec, name);
+}
+
+E_API Eina_Stringshare *
+e_input_thread_client_icccm_name_get(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
+
+ return iec->icccm_name;
+}
+
+EINTERN void
+e_input_thread_client_icccm_title_set(E_Input_Thread_Client *iec, char *title)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ eina_stringshare_replace(&iec->icccm_title, title);
+
+ INF("[%s] iec(%p), title(%s)\n", __func__, iec, title);
+}
+
+E_API Eina_Stringshare *
+e_input_thread_client_icccm_title_get(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
+
+ return iec->icccm_title;
+}
+
+EINTERN void
+e_input_thread_client_netwm_name_set(E_Input_Thread_Client *iec, char *name)
+{
+ EINA_SAFETY_ON_NULL_RETURN(iec);
+
+ eina_stringshare_replace(&iec->icccm_name, name);
+
+ INF("[%s] iec(%p), name(%s)\n", __func__, iec, name);
+}
+
+E_API Eina_Stringshare *
+e_input_thread_client_netwm_name_get(E_Input_Thread_Client *iec)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iec, NULL);
+
+ return iec->icccm_name;
+}
+
+EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec)
+{
+ Eina_List *l;
+ void *list_data;
+ E_Input_Thread_Client *itc = NULL;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
+
+ EINA_LIST_FOREACH(_itc_list, l, list_data)
+ {
+ itc = (E_Input_Thread_Client *)list_data;
+ if (itc && itc->ec == ec)
+ return itc;
+ }
+
+ return NULL;
+}
--- /dev/null
+#ifndef E_INPUT_THREAD_CLIENT_INTERN_H
+#define E_INPUT_THREAD_CLIENT_INTERN_H
+
+#include "e_intern.h"
+
+#include <wayland-server.h>
+
+typedef struct _E_Input_Thread_Client E_Input_Thread_Client;
+
+typedef struct
+{
+ void *ec;
+ struct wl_resource *wl_surface;
+ bool visible;
+ bool is_video;
+ char icccm_name[1024];
+ char netwm_name[1024];
+ char icccm_title[1024];
+} E_Input_Thread_Request_EClient_Data;
+
+typedef struct
+{
+ struct wl_client *client;
+ struct wl_resource *resource;
+ struct wl_resource *surface;
+ uint32_t key;
+ uint32_t mode;
+} E_Input_Thread_Request_Keygrab_Data;
+
+typedef struct
+{
+ struct wl_client *client;
+ struct wl_resource *resource;
+} E_Input_Thread_Request_Keyboard_Get_Data;
+
+EINTERN E_Input_Thread_Client * e_input_thread_client_new(E_Client *ec, struct wl_resource *surface);
+EINTERN void e_input_thread_client_free(E_Input_Thread_Client *ec);
+EINTERN void e_input_thread_client_visible_set(E_Input_Thread_Client *ec, Eina_Bool visible);
+EINTERN void e_input_thread_client_video_set(E_Input_Thread_Client *ec, Eina_Bool is_video);
+
+EINTERN void e_input_thread_client_icccm_name_set(E_Input_Thread_Client *ec, char *name);
+EINTERN void e_input_thread_client_icccm_title_set(E_Input_Thread_Client *ec, char *title);
+EINTERN void e_input_thread_client_netwm_name_set(E_Input_Thread_Client *ec, char *name);
+
+EINTERN E_Input_Thread_Client * e_input_thread_client_get(E_Client *ec);
+
+#endif
#include "e_config_intern.h"
#include "e_security.h"
#include "e_comp_input_intern.h"
+#include "e_input_thread_client_intern.h"
#include <tizen-extension-server-protocol.h>
--- /dev/null
+#ifndef E_INPUT_THREAD_CLIENT_H
+#define E_INPUT_THREAD_CLIENT_H
+
+#include <e_types.h>
+
+typedef struct _E_Input_Thread_Client E_Input_Thread_Client;
+
+E_API Eina_Bool e_input_thread_client_video_mode_get(E_Input_Thread_Client *ec);
+E_API Eina_Bool e_input_thread_client_visible_get(E_Input_Thread_Client *ec);
+E_API Eina_Stringshare *e_input_thread_client_icccm_name_get(E_Input_Thread_Client *ec);
+E_API Eina_Stringshare *e_input_thread_client_netwm_name_get(E_Input_Thread_Client *ec);
+E_API Eina_Stringshare *e_input_thread_client_icccm_title_get(E_Input_Thread_Client *ec);
+
+#endif