}
g_rec_mutex_init(&e_comp_input_key->xkb.keymap_mutex);
- g_rec_mutex_init(&e_comp_input_key->kbd.resources_mutex);
- g_rec_mutex_init(&e_comp_input_key->kbd.focused_mutex);
e_comp_input = E_NEW(E_Comp_Input, 1);
if (!e_comp_input)
xkb_context_unref(e_comp_input_key->xkb.context);
g_rec_mutex_clear(&e_comp_input_key->xkb.keymap_mutex);
- g_rec_mutex_clear(&e_comp_input_key->kbd.resources_mutex);
- g_rec_mutex_clear(&e_comp_input_key->kbd.focused_mutex);
E_FREE(e_comp_input_key);
}
{
EINA_SAFETY_ON_NULL_RETURN_VAL(input_thread_info, NULL);
- return ((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources;
+ //TODO:
+ //return ((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources;
+ return NULL;
}
E_API int
{
EINA_SAFETY_ON_NULL_RETURN(input_thread_info);
- g_rec_mutex_lock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
+ //TODO:
+ //g_rec_mutex_lock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
}
E_API void
{
EINA_SAFETY_ON_NULL_RETURN(input_thread_info);
- g_rec_mutex_unlock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
-}
\ No newline at end of file
+ //TODO:
+ //g_rec_mutex_unlock(&((E_Comp_Input_Key_Data *)input_thread_info)->kbd.resources_mutex);
+}
struct
{
- Eina_List *resources;
- Eina_List *focused;
xkb_mod_index_t mod_shift, mod_caps;
xkb_mod_index_t mod_ctrl, mod_alt;
xkb_mod_index_t mod_super;
int mod_changed;
atomic_int repeat_delay;
atomic_int repeat_rate;
- GRecMutex resources_mutex;
- GRecMutex focused_mutex;
} kbd;
};
}
static void
-_e_comp_wl_send_keys(E_Comp_Wl_Data *comp_wl)
+_e_comp_wl_send_keys(E_Seat *seat)
{
uint32_t serial;
struct wl_resource *res;
Eina_List *l;
+ E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- return;
- }
+ if (e_seat_keyboard_focused_is_empty(seat)) return;
serial = wl_display_next_serial(comp_wl->wl.disp);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+ e_seat_keyboard_focused_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
{
e_seat_keyboard_resource_send_keys(NULL, res, serial, WL_KEYBOARD_KEY_STATE_PRESSED);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_unlock(seat);
}
static Eina_Bool
_e_comp_wl_client_focus_in_timer(E_Client *ec)
{
+ E_Seat *seat = NULL;
+
if (!ec) return EINA_FALSE;
if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
if (!ec->comp_data) return EINA_FALSE;
ec->comp_data->on_focus_timer = NULL;
- _e_comp_wl_send_keys(e_comp_wl_get());
+ seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+ if (!seat) return EINA_FALSE;
+
+ _e_comp_wl_send_keys(seat);
return EINA_FALSE;
}
static void
_e_comp_wl_client_focus_in(E_Client *ec)
{
- struct wl_resource *res, *surface;
+ struct wl_resource *surface;
struct wl_client *wc;
- Eina_List *l;
E_Seat *seat = NULL;
if (!ec) return;
wc = wl_resource_get_client(surface);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
- {
- if (wl_resource_get_client(res) == wc &&
- e_seat_keyboard_resource_is_for_ec(res, ec))
- {
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!eina_list_data_find(e_comp_input_key->kbd.focused, res))
- e_comp_input_key->kbd.focused = eina_list_append(e_comp_input_key->kbd.focused, res);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- }
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ e_seat_keyboard_focused_resource_add(seat, wc);
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- return;
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ if (e_seat_keyboard_focused_is_empty(seat)) return;
e_seat_keyboard_focus_surface_set(seat, surface);
e_seat_keyboard_send_enter(seat, surface);
/* update keyboard modifier state */
e_seat_keyboard_keys_state_update(seat, EINA_FALSE);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- if (!eina_list_count(e_comp_input_key->kbd.resources))
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
- return;
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ if (e_seat_keyboard_resources_is_empty(seat)) return;
/* send keyboard_leave to all keyboard resources */
serial = wl_display_next_serial(e_comp_wl_display_get());
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+ e_seat_keyboard_focused_lock(seat);
+ EINA_LIST_FOREACH_SAFE(e_seat_keyboard_focused_get(seat), l, ll, res)
{
e_seat_keyboard_resource_send_keys(NULL, res, serial, WL_KEYBOARD_KEY_STATE_RELEASED);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_unlock(seat);
e_seat_keyboard_send_leave(seat, surface);
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- e_comp_input_key->kbd.focused = eina_list_free(e_comp_input_key->kbd.focused);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_resource_remove(seat, wl_resource_get_client(surface));
e_seat_keyboard_focus_surface_set(seat, NULL);
}
}
static void
-_e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state, E_Client *ec)
+_e_comp_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, E_Seat *seat, enum wl_keyboard_key_state state, E_Client *ec)
{
struct wl_resource *res;
Eina_List *l;
const char *device_name = NULL;
E_Comp_Wl_Data *comp_wl;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+
keycode = (ev->keycode - 8);
comp_wl = e_comp_wl_get();
}
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+ e_seat_keyboard_focused_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
{
if (wl_resource_get_client(res) != wc) continue;
keycode, state);
TRACE_INPUT_END();
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_unlock(seat);
if (e_config->key_input_ttrace_enable)
{
return EINA_FALSE;
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- goto end;
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ if (e_seat_keyboard_focused_is_empty(seat))
+ goto end;
- _e_comp_wl_key_send_to_focused_list(ev, dev, WL_KEYBOARD_KEY_STATE_PRESSED, ec);
+ _e_comp_wl_key_send_to_focused_list(ev, dev, seat, WL_KEYBOARD_KEY_STATE_PRESSED, ec);
/* A key only sent to clients is added to the list */
if (!e_seat_keyboard_keys_keydata_add(NULL, keycode, dev))
Eina_Bool delivered;
E_Comp *comp;
const char *seat_name = NULL;
- E_Seat *seat;
+ E_Seat *seat = NULL;
E_Zone *zone = NULL;
if (ev->window != e_comp_ee_win_get())
ec = e_zone_focused_client_get(zone);
ELOGF("INPUT", "Key Up. seat:%s zone_id:%d", ec, seat_name, e_zone_id_get(zone));
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- goto end;
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ if (e_seat_keyboard_focused_is_empty(seat))
+ goto end;
- _e_comp_wl_key_send_to_focused_list(ev, dev, WL_KEYBOARD_KEY_STATE_RELEASED, ec);
+ _e_comp_wl_key_send_to_focused_list(ev, dev, seat, WL_KEYBOARD_KEY_STATE_RELEASED, ec);
}
end:
E_Comp_Config *comp_conf = NULL;
const char *dev_name = NULL;
E_Comp_Wl_Data *comp_wl;
+ E_Seat *seat = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE);
}
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+ seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+ if (!seat) return EINA_FALSE;
+
+ e_seat_keyboard_resources_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), l, res)
{
if (wl_resource_get_client(res) != wc) continue;
if (comp_conf && comp_conf->input_log_enable)
wl_keyboard_send_key(res, serial, time,
wl_keycode, state);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ e_seat_keyboard_resources_unlock(seat);
if (e_config->key_input_ttrace_enable)
{
uint32_t serial, wl_keycode, cancel_keycode;
E_Comp_Config *comp_conf = NULL;
E_Comp_Wl_Data *comp_wl;
+ E_Seat *seat = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE);
if (dev) _e_comp_wl_send_event_device(wc, time, dev, serial);
else _e_comp_wl_device_send_last_event_device(comp_wl, ec, ECORE_DEVICE_CLASS_KEYBOARD, time);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+ seat = e_seat_find_by_zone(e_comp_zone_find_by_ec(ec));
+ if (!seat) return EINA_FALSE;
+
+ e_seat_keyboard_resources_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), l, res)
{
if (wl_resource_get_client(res) != wc) continue;
if (comp_conf && comp_conf->input_log_enable)
wl_keyboard_send_key(res, serial, time,
cancel_keycode, WL_KEYBOARD_KEY_STATE_RELEASED);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ e_seat_keyboard_resources_unlock(seat);
return EINA_TRUE;
}
char *tmp;
xkb_mod_mask_t latched = 0, locked = 0, group = 0;
struct wl_resource *res;
- Eina_List *l;
+ Eina_List *l, *ll;
int rw_fd, ro_fd;
void *dst;
+ E_Seat *seat;
/* unreference any existing keymap */
g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
/* send updated keymap */
TRACE_INPUT_BEGIN(wl_keyboard_send_keymap_update);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
- e_comp_wl_input_keyboard_keymap_send(res);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
+ {
+ e_seat_keyboard_resources_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+ e_comp_wl_input_keyboard_keymap_send(res);
+ e_seat_keyboard_resources_unlock(seat);
+ }
TRACE_INPUT_END();
/* update modifiers */
EINA_LIST_FREE(comp_wl->ptr_constraints.resources, res)
wl_resource_destroy(res);
- /* destroy keyboard resources */
- EINA_LIST_FREE(e_comp_input_key->kbd.resources, res)
- wl_resource_destroy(res);
- e_comp_input_key->kbd.resources = eina_list_free(e_comp_input_key->kbd.resources);
-
/* unmap any existing keyboard area */
if (comp_wl->xkb.area)
munmap(comp_wl->xkb.area, comp_wl->xkb.size);
{
uint32_t serial;
struct wl_resource *res;
- Eina_List *l;
+ Eina_List *l, *ll;
+ E_Seat *seat;
E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
if (!e_comp_wl_input_keyboard_modifiers_serialize()) return;
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- return;
- }
serial = wl_display_next_serial(comp_wl->wl.disp);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
- wl_keyboard_send_modifiers(res, serial,
- e_comp_input_key->kbd.mod_depressed,
- e_comp_input_key->kbd.mod_latched,
- e_comp_input_key->kbd.mod_locked,
- e_comp_input_key->kbd.mod_group);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+
+ EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
+ {
+ e_seat_keyboard_focused_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), ll, res)
+ {
+ wl_keyboard_send_modifiers(res, serial,
+ e_comp_input_key->kbd.mod_depressed,
+ e_comp_input_key->kbd.mod_latched,
+ e_comp_input_key->kbd.mod_locked,
+ e_comp_input_key->kbd.mod_group);
+ }
+ e_seat_keyboard_focused_unlock(seat);
+ }
}
EINTERN void
e_comp_wl_input_keyboard_repeat_set(int delay, int rate)
{
struct wl_resource *res;
- Eina_List *l;
+ Eina_List *l, *ll;
+ E_Seat *seat;
EINA_SAFETY_ON_NULL_RETURN(e_comp_wl_get());
atomic_store(&e_comp_input_key->kbd.repeat_delay, delay);
atomic_store(&e_comp_input_key->kbd.repeat_rate, rate);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+ EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
{
- if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
- wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate,
- e_comp_input_key->kbd.repeat_delay);
+ e_seat_keyboard_resources_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+ {
+ if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
+ wl_keyboard_send_repeat_info(res, e_comp_input_key->kbd.repeat_rate,
+ e_comp_input_key->kbd.repeat_delay);
+ }
+ e_seat_keyboard_resources_unlock(seat);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
}
typedef struct _keycode_map{
e_comp_wl_input_kbd_resources_get()
{
EINA_SAFETY_ON_FALSE_RETURN_VAL(e_comp_input_key, NULL);
- return e_comp_input_key->kbd.resources;
+ //TODO:
+ //return e_comp_input_key->kbd.resources;
+ return NULL;
}
E_API int
e_comp_wl_input_kbd_resource_list_lock()
{
EINA_SAFETY_ON_NULL_RETURN(e_comp_input_key);
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
+ //TODO:
+ //g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
}
E_API void
e_comp_wl_input_kbd_resource_list_unlock()
{
EINA_SAFETY_ON_NULL_RETURN(e_comp_input_key);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ //TODO:
+ //g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
}
#include "e_surface_view_intern.h"
#include "e_view_client_intern.h"
#include "e_zone_intern.h"
+#include "e_seat_intern.h"
#include "e_comp_input_intern.h"
#include <assert.h>
static void
_e_surface_ec_del(E_Surface *surface)
{
- struct wl_resource *res, *surface_resource;
+ struct wl_resource *surface_resource;
struct wl_client *surface_client = NULL;
- Eina_List *l, *ll;
E_Zone *zone;
+ E_Seat *seat;
surface_resource = e_surface_resource_get(surface);
if (surface_resource)
ERR("_e_surface_ec_del: zone is NULL");
zone = e_zone_current_get();
}
+ seat = e_seat_find_by_zone(zone);
+ if (!seat)
+ {
+ ERR("_e_surface_ec_del: seat is NULL");
+ seat = e_seat_current_get();
+ }
if (surface_client &&
(surface->ec == e_zone_focused_client_get(zone)))
{
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
- {
- if (wl_resource_get_client(res) ==
- surface_client)
- {
- e_comp_input_key->kbd.focused =
- eina_list_remove_list(e_comp_input_key->kbd.focused, l);
- }
-
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_resource_remove(seat, surface_client);
}
e_comp_wl_client_surface_set(surface->ec, NULL);
_e_keyrouter_wl_key_send_to_resource_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state, struct wl_client *client, struct wl_resource *surface)
{
struct wl_resource *res;
- Eina_List *l;
+ Eina_List *l, *ll;
uint32_t serial, keycode;
E_Comp_Wl_Data *comp_wl;
+ E_Seat *seat;
keycode = (ev->keycode - 8);
e_comp_wl_send_event_e_device(client, ev->timestamp, dev, serial);
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.resources, l, res)
+ TRACE_INPUT_BEGIN(_e_keyrouter_wl_key_send);
+ EINA_LIST_FOREACH(e_seat_list_get(), l, seat)
{
- if (wl_resource_get_client(res) != client) continue;
- TRACE_INPUT_BEGIN(_e_keyrouter_wl_key_send);
- wl_keyboard_send_key(res, serial, ev->timestamp,
- keycode, state);
- TRACE_INPUT_END();
+ e_seat_keyboard_resources_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_resources_get(seat), ll, res)
+ {
+ if (wl_resource_get_client(res) != client) continue;
+ wl_keyboard_send_key(res, serial, ev->timestamp,
+ keycode, state);
+ }
+ e_seat_keyboard_resources_unlock(seat);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ TRACE_INPUT_END();
if (e_config->key_input_ttrace_enable)
{
}
static void
-_e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, enum wl_keyboard_key_state state)
+_e_keyrouter_wl_key_send_to_focused_list(Ecore_Event_Key *ev, E_Device *dev, E_Seat *seat, enum wl_keyboard_key_state state)
{
struct wl_resource *res;
Eina_List *l;
struct wl_client *wc;
E_Comp_Wl_Data *comp_wl;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+
keycode = (ev->keycode - 8);
comp_wl = e_comp_wl_get();
ELOGF("INPUT", "wl_keyboard_send_key:%s:%s|B|", NULL, (state ? "PRESS" : "RELEASE"), ev->keyname);
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+ e_seat_keyboard_focused_lock(seat);
+ EINA_LIST_FOREACH(e_seat_keyboard_focused_get(seat), l, res)
{
wc = wl_resource_get_client(res);
if (!e_input_thread_mode_get())
keycode, state);
TRACE_INPUT_END();
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ e_seat_keyboard_focused_unlock(seat);
if (e_config->key_input_ttrace_enable)
{
uint32_t keycode;
enum wl_keyboard_key_state state;
const char *seat_name = NULL;
- E_Seat *seat;
+ E_Seat *seat = NULL;
E_Zone *zone = NULL;
E_Comp_Config *comp_conf = NULL;
ec = e_zone_focused_client_get(zone);
ELOGF("KRT", "Key Send. seat:%s zone_id:%d", ec, seat_name, e_zone_id_get(zone));
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
- {
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- return EINA_FALSE;
- }
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
- _e_keyrouter_wl_key_send_to_focused_list(ev, dev, state);
+ if (e_seat_keyboard_focused_is_empty(seat)) return EINA_FALSE;
+ _e_keyrouter_wl_key_send_to_focused_list(ev, dev, seat, state);
/* update modifier state */
e_comp_wl_input_keyboard_state_update(keycode, pressed);
struct
{
+ Eina_List *resources;
+ Eina_List *focused;
Eina_Bool enabled : 1;
unsigned int num_devices;
struct wl_resource *focus;
struct wl_array keys;
+ GRecMutex resources_mutex;
+ GRecMutex focused_mutex;
} kbd;
E_Zone *zone;
};
Eina_List *l, *ll;
struct wl_resource *res;
+ E_Seat *seat;
+ seat = wl_resource_get_user_data(resource);
+ if (!seat) return;
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- e_comp_input_key->kbd.resources =
- eina_list_remove(e_comp_input_key->kbd.resources, resource);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ g_rec_mutex_lock(&seat->kbd.resources_mutex);
+ seat->kbd.resources =
+ eina_list_remove(seat->kbd.resources, resource);
+ g_rec_mutex_unlock(&seat->kbd.resources_mutex);
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+ EINA_LIST_FOREACH_SAFE(seat->kbd.focused, l, ll, res)
if (res == resource)
- e_comp_input_key->kbd.focused =
- eina_list_remove_list(e_comp_input_key->kbd.focused, l);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ seat->kbd.focused = eina_list_remove_list(seat->kbd.focused, l);
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
}
static enum wl_iterator_result
{
Eina_List *l, *ll;
struct wl_resource *res;
+ E_Seat *seat;
+ seat = wl_resource_get_user_data(resource);
+ if (!seat) return WL_ITERATOR_CONTINUE;
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- e_comp_input_key->kbd.resources = eina_list_remove(e_comp_input_key->kbd.resources, resource);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ g_rec_mutex_lock(&seat->kbd.resources_mutex);
+ seat->kbd.resources = eina_list_remove(seat->kbd.resources, resource);
+ g_rec_mutex_unlock(&seat->kbd.resources_mutex);
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH_SAFE(e_comp_input_key->kbd.focused, l, ll, res)
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+ EINA_LIST_FOREACH_SAFE(seat->kbd.focused, l, ll, res)
{
if (res == resource)
- e_comp_input_key->kbd.focused = eina_list_remove_list(e_comp_input_key->kbd.focused, l);
+ seat->kbd.focused = eina_list_remove_list(seat->kbd.focused, l);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
return WL_ITERATOR_CONTINUE;
}
return;
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.resources_mutex);
- e_comp_input_key->kbd.resources =
- eina_list_append(e_comp_input_key->kbd.resources, res);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.resources_mutex);
+ g_rec_mutex_lock(&seat->kbd.resources_mutex);
+ seat->kbd.resources =
+ eina_list_append(seat->kbd.resources, res);
+ g_rec_mutex_unlock(&seat->kbd.resources_mutex);
wl_resource_set_implementation(res, &_e_keyboard_interface,
seat,
if (!surface) return;
if (client != wl_resource_get_client(surface)) return;
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- e_comp_input_key->kbd.focused = eina_list_append(e_comp_input_key->kbd.focused, res);
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+ seat->kbd.focused = eina_list_append(seat->kbd.focused, res);
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
e_seat_keyboard_send_enter(seat, surface);
}
seat->resources = NULL;
+ g_rec_mutex_init(&seat->kbd.resources_mutex);
+ g_rec_mutex_init(&seat->kbd.focused_mutex);
+
wl_array_init(&seat->kbd.keys);
_seats = eina_list_append(_seats, seat);
E_FREE(seat->name);
+ g_rec_mutex_clear(&seat->kbd.resources_mutex);
+ g_rec_mutex_clear(&seat->kbd.focused_mutex);
+
wl_array_release(&seat->kbd.keys);
+ EINA_LIST_FREE(seat->kbd.resources, res)
+ wl_resource_destroy(res);
+ seat->kbd.resources = eina_list_free(seat->kbd.resources);
EINA_LIST_FREE(seat->ptr.resources, res)
wl_resource_destroy(res);
EINA_LIST_FREE(seat->touch.resources, res)
e_comp_wl_input_keyboard_state_update(k->key, pressed);
}
+EINTERN Eina_List *
+e_seat_keyboard_focused_get(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+ return seat->kbd.focused;
+}
+
+EINTERN Eina_List *
+e_seat_keyboard_resources_get(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+ return seat->kbd.resources;
+}
+
+EINTERN void
+e_seat_keyboard_resources_lock(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ g_rec_mutex_lock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_resources_unlock(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ g_rec_mutex_unlock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_lock(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_unlock(E_Seat *seat)
+{
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+}
+
+EINTERN Eina_Bool
+e_seat_keyboard_focused_is_empty(E_Seat *seat)
+{
+ E_Seat *s;
+
+ if (!seat) s = _current_seat;
+ else s = seat;
+
+ g_rec_mutex_lock(&s->kbd.focused_mutex);
+ if (!s->kbd.focused || !eina_list_count(s->kbd.focused))
+ {
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
+ return EINA_TRUE;
+ }
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
+ return EINA_FALSE;
+}
+
+EINTERN Eina_Bool
+e_seat_keyboard_resources_is_empty(E_Seat *seat)
+{
+ E_Seat *s;
+
+ if (!seat) s = _current_seat;
+ else s = seat;
+
+ g_rec_mutex_lock(&s->kbd.resources_mutex);
+ if (!s->kbd.resources || !eina_list_count(s->kbd.resources))
+ {
+ g_rec_mutex_unlock(&s->kbd.resources_mutex);
+ return EINA_TRUE;
+ }
+ g_rec_mutex_unlock(&s->kbd.resources_mutex);
+ return EINA_FALSE;
+}
+
+EINTERN void
+e_seat_keyboard_focused_resource_add(E_Seat *seat, struct wl_client *wc)
+{
+ struct wl_resource *res;
+ Eina_List *l;
+
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+
+ g_rec_mutex_lock(&seat->kbd.resources_mutex);
+ EINA_LIST_FOREACH(seat->kbd.resources, l, res)
+ {
+ if (wl_resource_get_client(res) == wc)
+ {
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+ if (!eina_list_data_find(seat->kbd.focused, res))
+ seat->kbd.focused = eina_list_append(seat->kbd.focused, res);
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+ }
+ }
+ g_rec_mutex_unlock(&seat->kbd.resources_mutex);
+}
+
+EINTERN void
+e_seat_keyboard_focused_resource_remove(E_Seat *seat, struct wl_client *wc)
+{
+ struct wl_resource *res;
+ Eina_List *l, *ll;
+
+ g_rec_mutex_lock(&seat->kbd.focused_mutex);
+ EINA_LIST_FOREACH_SAFE(seat->kbd.focused, l, ll, res)
+ {
+ if (wl_resource_get_client(res) == wc)
+ {
+ seat->kbd.focused =
+ eina_list_remove_list(seat->kbd.focused, l);
+ }
+ }
+ g_rec_mutex_unlock(&seat->kbd.focused_mutex);
+}
+
EINTERN void
e_seat_keyboard_resource_send_keys(E_Seat *seat, struct wl_resource *res, uint32_t serial,
uint32_t state)
if (!seat) s = _current_seat;
else s = seat;
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- if (!e_comp_input_key->kbd.focused)
+ g_rec_mutex_lock(&s->kbd.focused_mutex);
+ if (!s->kbd.focused)
{
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
return;
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
e_comp_wl_input_keyboard_modifiers_serialize();
*key = k->key;
}
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+ g_rec_mutex_lock(&s->kbd.focused_mutex);
+ EINA_LIST_FOREACH(s->kbd.focused, l, res)
{
- if (wl_resource_get_client(res) == wl_resource_get_client(surface))
- {
- ELOGF("Key", "Enter. keys(cnt:%d)", NULL, key_cnt);
- wl_keyboard_send_enter(res, serial, surface,
- &keys);
- }
+ if (wl_resource_get_client(res) != wl_resource_get_client(surface))
+ continue;
+
+ ELOGF("Key", "Enter. keys(cnt:%d)", NULL, key_cnt);
+ wl_keyboard_send_enter(res, serial, surface,
+ &keys);
wl_keyboard_send_modifiers(res, serial,
mod_depressed,
mod_locked,
mod_group);
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
wl_array_release(&keys);
}
Eina_List *l;
uint32_t serial;
E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
+ E_Seat *s;
- //seat;
+ if (!seat) s = _current_seat;
+ else s = seat;
serial = wl_display_next_serial(comp_wl->wl.disp);
- g_rec_mutex_lock(&e_comp_input_key->kbd.focused_mutex);
- EINA_LIST_FOREACH(e_comp_input_key->kbd.focused, l, res)
+ g_rec_mutex_lock(&s->kbd.focused_mutex);
+ EINA_LIST_FOREACH(s->kbd.focused, l, res)
{
if (wl_resource_get_client(res) == wl_resource_get_client(surface))
{
wl_keyboard_send_leave(res, serial, surface);
}
}
- g_rec_mutex_unlock(&e_comp_input_key->kbd.focused_mutex);
+ g_rec_mutex_unlock(&s->kbd.focused_mutex);
}
EINTERN Eina_Bool e_seat_keyboard_keys_keydata_remove(E_Seat *seat, uint32_t keycode);
EINTERN void e_seat_keyboard_keys_state_update(E_Seat *seat, Eina_Bool pressed);
+EINTERN Eina_List *e_seat_keyboard_focused_get(E_Seat *seat);
+EINTERN Eina_List *e_seat_keyboard_resources_get(E_Seat *seat);
+EINTERN void e_seat_keyboard_resources_lock(E_Seat *seat);
+EINTERN void e_seat_keyboard_resources_unlock(E_Seat *seat);
+EINTERN void e_seat_keyboard_focused_lock(E_Seat *seat);
+EINTERN void e_seat_keyboard_focused_unlock(E_Seat *seat);
+EINTERN Eina_Bool e_seat_keyboard_focused_is_empty(E_Seat *seat);
+EINTERN Eina_Bool e_seat_keyboard_resources_is_empty(E_Seat *seat);
+EINTERN void e_seat_keyboard_focused_resource_add(E_Seat *seat, struct wl_client *wc);
+EINTERN void e_seat_keyboard_focused_resource_remove(E_Seat *seat, struct wl_client *wc);
+
EINTERN void e_seat_keyboard_resource_send_keys(E_Seat *seat, struct wl_resource *res, uint32_t serial,
uint32_t state);
EINTERN void e_seat_keyboard_send_enter(E_Seat *seat, struct wl_resource *surface);
EINTERN void e_seat_keyboard_send_leave(E_Seat *seat, struct wl_resource *surface);
-
+EINTERN void e_seat_keyboard_send_keymap(struct wl_resource *resource);
#endif // E_SEAT_INTERN_H