e_seat/e_pointer: multi-pointer(cursor) feature added in e_comp_Wl 71/321571/3
authorduna.oh <duna.oh@samsung.com>
Mon, 17 Feb 2025 09:31:19 +0000 (18:31 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 25 Mar 2025 08:22:32 +0000 (17:22 +0900)
a new E_Pointer (cursor) is created when a seat is added.
Find a current seat from (mouse/touch) evas events and send events to the seat
and update the position of the seat's cursor.

Change-Id: I13665f4bf7146480b73c7d890ff86cc57eb5c409

src/bin/compmgr/e_comp.c
src/bin/compmgr/e_comp_intern.h
src/bin/e_comp_screen.c
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_input.c
src/bin/server/e_comp_wl_input_thread.c
src/bin/server/e_seat.c
src/bin/server/e_seat_intern.h
src/bin/windowmgr/e_pointer.c
src/bin/windowmgr/e_pointer_intern.h
src/include/e_pointer.h

index 783e185f4dbe440c8e18199b2d145f60f380cd6d..2f5cb7e59cb142e4455cbfad7da422ce69384f64 100644 (file)
@@ -16,6 +16,7 @@
 #include "e_display_intern.h"
 #include "e_policy_zone_intern.h"
 #include "e_comp_canvas_intern.h"
+#include "e_pointer_intern.h"
 
 #include <sys/xattr.h>
 #include <sys/types.h>
@@ -936,6 +937,19 @@ e_comp_pointer_get(void)
    return e_comp->pointer;
 }
 
+EINTERN void
+e_comp_pointer_set(E_Pointer *pointer)
+{
+   EINA_SAFETY_ON_NULL_RETURN(e_comp);
+   EINA_SAFETY_ON_NULL_RETURN(pointer);
+
+   if(e_comp->pointer == pointer) return;
+
+   INF("Changed pointer from %s -> %s", e_comp->pointer ?  e_pointer_name_get(e_comp->pointer) : "NULL",
+       e_pointer_name_get(pointer));
+   e_comp->pointer = pointer;
+}
+
 E_API E_Comp_Screen *
 e_comp_screen_get(void)
 {
index 3aff73768232c7ca0470bde6b8c5acb7ac07bb50..161a4ff839e5cd07ec7c8bd7ee497fbdafefd8a1 100644 (file)
@@ -69,4 +69,6 @@ EINTERN void          e_comp_launchscrn_ec_add(E_Client *ec);
 
 EINTERN void          e_comp_canvas_render_delayed_unset(E_Comp *comp);
 
+EINTERN void          e_comp_pointer_set(E_Pointer *pointer);
+
 #endif
index 4d9f5cee003eaf67677a877c56a82e733be6f8d9..e66cb00fd4204062b920d02d8d67de6b41469fe9 100644 (file)
@@ -295,7 +295,7 @@ _e_comp_screen_input_rotation_set(int rotation)
         e_comp_wl->ptr.x = wl_fixed_from_int(ptr_x);
         e_comp_wl->ptr.y = wl_fixed_from_int(ptr_y);
 
-        e_pointer_mouse_move(e_comp->pointer, ptr_x, ptr_y);
+        e_pointer_mouse_move(e_comp_pointer_get(), ptr_x, ptr_y);
      }
 }
 
@@ -303,20 +303,21 @@ static Eina_Bool
 _e_comp_screen_cb_input_device_add(void *data, int type, void *event)
 {
    Ecore_Event_Device_Info *e;
-   E_Comp *comp = data;
    E_Seat *seat;
+   E_Pointer *comp_pointer;
 
    if (!(e = event)) goto end;
    ELOGF("COMP_SCREEN", "Input Device Add. name:%s(%s), seat:%s", NULL, e->name, e->identifier, e->seatname);
 
    seat = e_seat_find(e->seatname);
    if (!seat) goto end;
+   comp_pointer = e_pointer_find(e->seatname);
 
    if (e->clas == ECORE_DEVICE_CLASS_MOUSE)
      {
         if (e_seat_pointer_device_count(seat) == 0)
           {
-             e_pointer_view_set(comp->pointer, NULL, 0, 0);
+             e_pointer_view_set(comp_pointer, NULL, 0, 0);
              e_seat_pointer_enabled_set(seat, EINA_TRUE);
           }
 
@@ -383,14 +384,15 @@ static Eina_Bool
 _e_comp_screen_cb_input_device_del(void *data, int type, void *event)
 {
    Ecore_Event_Device_Info *e;
-   E_Comp *comp = data;
    E_Seat *seat;
+   E_Pointer *comp_pointer;
 
    if (!(e = event)) goto end;
    ELOGF("COMP_SCREEN", "Input Device Del. name:%s(%s), seat:%s", NULL, e->name, e->identifier, e->seatname);
 
    seat = e_seat_find(e->seatname);
    if (!seat) goto end;
+   comp_pointer = e_pointer_find(e->seatname);
 
    if (e->clas == ECORE_DEVICE_CLASS_MOUSE)
      {
@@ -398,8 +400,8 @@ _e_comp_screen_cb_input_device_del(void *data, int type, void *event)
         if (e_seat_pointer_device_count(seat) == 0)
           {
              e_seat_pointer_enabled_set(seat, EINA_FALSE);
-             e_pointer_view_set(comp->pointer, NULL, 0, 0);
-             e_pointer_hide(comp->pointer);
+             e_pointer_view_set(comp_pointer, NULL, 0, 0);
+             e_pointer_hide(comp_pointer);
 
              _e_comp_screen_pointer_renew(seat);
           }
@@ -1038,7 +1040,7 @@ e_comp_screen_init()
    evas_event_feed_mouse_in(comp->evas, 0, NULL);
 
    e_main_ts_begin("\tE_Pointer New");
-   if ((comp->pointer = e_pointer_canvas_new(comp->ee, EINA_TRUE)))
+   if ((comp->pointer = e_pointer_canvas_new("default", EINA_TRUE)))
      {
         e_pointer_hide(comp->pointer);
      }
index efa2ad2962dc1fa8974f3c7b7e663ad7cd25cb87..175cfd9f392a0eadd3f87e5316d9b999306dd9e6 100644 (file)
@@ -849,7 +849,7 @@ _e_comp_wl_device_client_last_device_set(E_Client *ec, Ecore_Device_Class dev_cl
 }
 
 static void
-_e_comp_wl_device_send_event_device(E_Comp_Wl_Data *comp_wl, E_Client *ec, Evas_Device *dev, uint32_t timestamp)
+_e_comp_wl_device_send_event_device(E_Comp_Wl_Data *comp_wl, E_Client *ec, const Evas_Device *dev, uint32_t timestamp)
 {
    E_Devicemgr_Input_Device *last_device, *ec_last_device, *input_dev;
    struct wl_resource *dev_res;
@@ -1268,6 +1268,9 @@ _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
    struct wl_client *wc;
    E_Client *prev_ptr_ec;
    E_Comp_Wl_Data *comp_wl;
+   const Evas_Device *dev = NULL, *seat_dev;
+   const char *dev_name, *seat_name;
+   E_Seat *seat;
 
    ev = event;
    comp_wl = e_comp_wl_get();
@@ -1288,9 +1291,16 @@ _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
 
    comp_wl->ptr.ec = ec;
 
-   ELOGF("Mouse", "In  (obj: %p, time: %d, canvas(%d, %d) output(%d, %d), name:%20s)",
+   dev = ev->dev;
+   dev_name = evas_device_description_get(dev);
+   seat_dev = evas_device_parent_get(dev);
+   seat_name = evas_device_name_get(seat_dev);
+   seat = e_seat_find(seat_name);
+   e_seat_current_set(seat);
+
+   ELOGF("Mouse", "In  (obj: %p, time: %d, canvas(%d, %d) output(%d, %d), name:%20s) (dev:%s, seat:%s)",
          ec, obj, ev->timestamp, ev->canvas.x, ev->canvas.y, ev->output.x, ev->output.y,
-         e_client_util_name_get(ec));
+         e_client_util_name_get(ec), dev_name, seat_name);
 
    if (_e_comp_wl_check_cursor_timer_needed(ec))
      {
@@ -1469,12 +1479,14 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 {
    E_Client *ec;
    Evas_Event_Mouse_Move *ev;
-   Evas_Device *dev = NULL;
-   const char *dev_name;
+   const Evas_Device *dev = NULL, *seat_dev;
+   const char *dev_name, *seat_name;
    E_Comp_Config *comp_conf;
    Evas_Device_Class dev_class;
    struct wl_resource *surface;
    E_Comp_Wl_Data *comp_wl;
+   E_Seat *seat;
+   E_Pointer *pointer;
 
    ev = event;
    comp_wl = e_comp_wl_get();
@@ -1492,12 +1504,18 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
    dev = ev->dev;
    dev_name = evas_device_description_get(dev);
    dev_class = evas_device_class_get(dev);
+   seat_dev = evas_device_parent_get(dev);
+   seat_name = evas_device_name_get(seat_dev);
+   seat = e_seat_find(seat_name);
+   e_seat_current_set(seat);
+   pointer = e_pointer_find(seat_name);
+   e_comp_pointer_set(pointer);
 
    comp_conf = e_comp_config_get();
    if (comp_conf && comp_conf->input_log_enable)
-     ELOGF("Mouse", "Move (obj: %p, time: %d, canvas(%d, %d), output(%d, %d), name:%20s) (dev:%s)",
+     ELOGF("Mouse", "Move (obj: %p, time: %d, canvas(%d, %d), output(%d, %d), name:%20s) (dev:%s, seat:%s)",
            ec, obj, ev->timestamp, ev->cur.canvas.x, ev->cur.canvas.y, ev->cur.output.x, ev->cur.output.y,
-           e_client_util_name_get(ec), dev_name);
+           e_client_util_name_get(ec), dev_name, seat_name);
 
    if (e_input_backend_mouse_printing_needed())
      e_input_backend_mouse_timestamp_append(ev->timestamp);
@@ -1516,7 +1534,6 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
                   _e_comp_wl_send_touch_move(comp_wl, ec, 0, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp);
                }
           }
-
         e_pointer_touch_move(e_comp_pointer_get(), ev->cur.output.x, ev->cur.output.y);
      }
    else
@@ -1573,11 +1590,12 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 {
    E_Client *ec;
    Evas_Event_Mouse_Down *ev;
-   Evas_Device *dev = NULL;
-   const Evas_Device *seat_dev;
+   const Evas_Device *dev = NULL, *seat_dev;
    const char *dev_name, *seat_name;
    Evas_Device_Class dev_class;
    E_Comp_Wl_Data *comp_wl;
+   E_Seat *seat;
+   E_Pointer *pointer;
 
    if (!(ec = data)) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
@@ -1588,10 +1606,13 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
 
    dev = ev->dev;
    dev_name = evas_device_description_get(dev);
-
+   dev_class = evas_device_class_get(dev);
    seat_dev = evas_device_parent_get(dev);
    seat_name = evas_device_name_get(seat_dev);
-   dev_class = evas_device_class_get(dev);
+   seat = e_seat_find(seat_name);
+   e_seat_current_set(seat);
+   pointer = e_pointer_find(seat_name);
+   e_comp_pointer_set(pointer);
 
    ELOGF("Mouse", "Down (obj: %p, button: %d, time: %d, x:%d, y:%d, name:%20s) (dev:%s, seat:%s)",
          ec, obj, ev->button, ev->timestamp, ev->output.x, ev->output.y, e_client_util_name_get(ec),
index 084c1497a8b6bfea5a732d4193fc2836aaaf276d..97579efa6157cd2f2e70610c83362e97e97a0ac2 100644 (file)
@@ -1080,6 +1080,7 @@ _e_comp_wl_input_cb_input_device_add(void *data, int type, void *event)
      {
         ERR("Seat added. name: %s identifier: %s, seatname: %s", e->name, e->identifier, e->seatname);
         e_seat_create(e->name);
+        e_pointer_canvas_new(e->name, EINA_TRUE);
      }
 
 end:
@@ -1090,6 +1091,7 @@ EINTERN Eina_Bool
 e_comp_wl_input_init(void)
 {
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
+   E_Seat *seat;
 
    dont_set_e_input_keymap = e_secure_getenv("NO_E_INPUT_KEYMAP_CACHE") ? EINA_TRUE : EINA_FALSE;
    dont_use_xkb_cache = e_secure_getenv("NO_KEYMAP_CACHE") ? EINA_TRUE : EINA_FALSE;
@@ -1108,7 +1110,8 @@ e_comp_wl_input_init(void)
    if (e_comp_input_key->kbd.repeat_rate < 0)
      atomic_store(&e_comp_input_key->kbd.repeat_rate, 25);
 
-   e_seat_create("default");
+   seat = e_seat_create("default");
+   e_seat_current_set(seat);
 
    /* create the global resource for relative pointer */
    comp_wl->relative_ptr.global =
index 1ae13615bf3f00b3eae3b11dbd39d749a4f4393d..d7a52329719bd224678b5860538da17f8c5f80d2 100644 (file)
@@ -220,6 +220,7 @@ _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, voi
    struct wl_resource *surface;
    struct wl_client *wc;
    E_Seat *seat;
+   E_Pointer *pointer;
 
    comp_wl = e_comp_wl_get();
    comp_wl->ptr.x = wl_fixed_from_int(ev->x);
@@ -249,6 +250,7 @@ _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, voi
    dev_class = e_device_class_get(dev);
    seat_name = e_device_seatname_get(dev);
    seat = e_seat_find(seat_name);
+   pointer = e_pointer_find(seat_name);
 
    if (comp_conf && comp_conf->input_log_enable)
      ELOGF("Mouse", "Move (time: %d, x:%d, y:%d), (name:%20s) (dev:%s, class:%d, seat:%s)",
@@ -287,7 +289,7 @@ _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, voi
                }
           }
 
-        e_pointer_touch_move(e_comp_pointer_get(), ev->x, ev->y);
+        e_pointer_touch_move(pointer, ev->x, ev->y);
      }
    else
      {
@@ -299,7 +301,7 @@ _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, voi
              e_seat_pointer_send_motion(seat, wc, ev->x - client_x, ev->y - client_y, ev->timestamp);
           }
 
-        e_pointer_mouse_move(e_comp_pointer_get(), ev->x, ev->y);
+        e_pointer_mouse_move(pointer, ev->x, ev->y);
      }
 
 err:
@@ -334,6 +336,7 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS
    struct wl_client *wc;
    E_Seat *seat;
    uint32_t btn;
+   E_Pointer *pointer;
 
    ELOGF("Mouse", "E Event Mouse Down (time: %d, x:%d y:%d)", NULL, ev->timestamp, ev->x, ev->y);
 
@@ -358,6 +361,7 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS
    dev_class = e_device_class_get(dev);
    seat_name = e_device_seatname_get(dev);
    seat = e_seat_find(seat_name);
+   pointer = e_pointer_find(seat_name);
 
    ELOGF("Mouse", "Down (button: %d, time: %d, x:%d, y:%d) (name:%20s) (dev:%s, class:%d, seat:%s)",
          NULL, ev->buttons, ev->timestamp, ev->x, ev->y,
@@ -381,7 +385,7 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS
         wc = wl_resource_get_client(surface);
         e_seat_touch_send_downup(seat, wc, surface, 0, ev->x - client_x, ev->y - client_y, ev->timestamp, EINA_TRUE);
 
-        e_pointer_touch_move(e_comp_pointer_get(), ev->x, ev->y);
+        e_pointer_touch_move(pointer, ev->x, ev->y);
 
         comp_wl->touch.pressed |= (1 << 0);
      }
@@ -392,7 +396,7 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS
         wc = wl_resource_get_client(surface);
         e_seat_pointer_send_button(seat, wc, btn, WL_POINTER_BUTTON_STATE_PRESSED, ev->timestamp);
 
-        e_pointer_mouse_move(e_comp_pointer_get(), ev->x, ev->y);
+        e_pointer_mouse_move(pointer, ev->x, ev->y);
      }
 
    need_send_released = EINA_TRUE;
index 6e8c2cb6910aed1d8a0f832552689462b19d968e..64b10e53e10e30102ac7def8be77656c7a4ed8e4 100644 (file)
@@ -36,6 +36,7 @@ struct _E_Seat
 
 static Eina_List *_ecore_event_handlers = NULL;
 static Eina_List *_seats = NULL;
+static E_Seat    *_current_seat = NULL;
 
 static void
 _e_seat_cb_pointer_unbind(struct wl_resource *resource)
@@ -109,10 +110,12 @@ _e_seat_pointer_cb_cursor_set(struct wl_client *client, struct wl_resource *reso
    E_Client *ec;
    Eina_Bool got_mouse = EINA_FALSE;
    struct wl_resource *surface;
-   E_Pointer *comp_pointer = e_comp_pointer_get();
+   E_Pointer *comp_pointer;
    E_Seat *seat;
    seat = wl_resource_get_user_data(resource);
    if (!seat) return;
+   comp_pointer = e_pointer_find(e_seat_name_get(seat));
+   e_comp_pointer_set(comp_pointer);
 
    E_Input_Thread_Request_EClient_Data ec_data;
    memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data));
@@ -600,6 +603,8 @@ e_seat_destroy(E_Seat *seat)
 
    _seats = eina_list_remove(_seats, seat);
    wl_global_destroy(seat->global);
+
+   E_FREE(seat);
 }
 
 EINTERN E_Zone *
@@ -656,13 +661,14 @@ EINTERN void
 e_seat_touch_send_motion(E_Seat *seat, struct wl_client *wc,
                          int idx, int x, int y, uint32_t timestamp)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->touch.resources, l, res)
+   EINA_LIST_FOREACH(s->touch.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_touch_check(res)) continue;
@@ -670,18 +676,6 @@ e_seat_touch_send_motion(E_Seat *seat, struct wl_client *wc,
         wl_touch_send_motion(res, timestamp, idx, wl_fixed_from_int(x), wl_fixed_from_int(y));
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->touch.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_touch_check(res)) continue;
-
-             wl_touch_send_motion(res, timestamp, idx, wl_fixed_from_int(x), wl_fixed_from_int(y));
-          }
-     }
 }
 
 EINTERN void
@@ -689,7 +683,7 @@ e_seat_touch_send_downup(E_Seat *seat, struct wl_client *wc,
                          struct wl_resource *surface, int idx, int x, int y, uint32_t timestamp,
                          Eina_Bool pressed)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    uint32_t serial;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
@@ -697,9 +691,10 @@ e_seat_touch_send_downup(E_Seat *seat, struct wl_client *wc,
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->touch.resources, l, res)
+   EINA_LIST_FOREACH(s->touch.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_touch_check(res)) continue;
@@ -718,41 +713,19 @@ e_seat_touch_send_downup(E_Seat *seat, struct wl_client *wc,
         TRACE_INPUT_END();
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->touch.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_touch_check(res)) continue;
-
-             TRACE_INPUT_BEGIN(e_seat_touch_send_downup);
-             if (pressed)
-               {
-                  ELOGF("Touch", "Down (id: %d, time: %d, x:%d, y:%d)", NULL, idx, timestamp, x, y);
-                  wl_touch_send_down(res, serial, timestamp, surface, idx, wl_fixed_from_int(x), wl_fixed_from_int(y));
-               }
-             else
-               {
-                  ELOGF("Touch", "Up (id: %d, time: %d, x:%d, y:%d)", NULL, idx, timestamp, x, y);
-                  wl_touch_send_up(res, serial, timestamp, idx);
-               }
-             TRACE_INPUT_END();
-          }
-     }
 }
 
 EINTERN void
 e_seat_touch_send_cancel(E_Seat *seat, struct wl_client *wc, E_Client *ec)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->touch.resources, l, res)
+   EINA_LIST_FOREACH(s->touch.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_touch_check(res)) continue;
@@ -762,32 +735,19 @@ e_seat_touch_send_cancel(E_Seat *seat, struct wl_client *wc, E_Client *ec)
         wl_touch_send_cancel(res);
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->touch.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_touch_check(res)) continue;
-
-             ELOGF("Touch", "Cancel name:%20s", ec, ec ? e_client_util_name_get(ec) : "Unknown");
-
-             wl_touch_send_cancel(res);
-          }
-     }
 }
 
 EINTERN void
 e_seat_touch_send_frame(E_Seat *seat, struct wl_client *wc)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->touch.resources, l, res)
+   EINA_LIST_FOREACH(s->touch.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_touch_check(res)) continue;
@@ -795,17 +755,6 @@ e_seat_touch_send_frame(E_Seat *seat, struct wl_client *wc)
         wl_touch_send_frame(res);
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->touch.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_touch_check(res)) continue;
-             wl_touch_send_frame(res);
-          }
-     }
 }
 
 EINTERN void
@@ -820,21 +769,14 @@ e_seat_touch_enabled_set(E_Seat *seat, Eina_Bool enabled)
 EINTERN Eina_Bool
 e_seat_touch_is_empty(E_Seat *seat)
 {
-   Eina_List *l = NULL;
+   E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   if (!eina_list_count(seat->touch.resources)) return EINA_TRUE;
+   if (!eina_list_count(s->touch.resources)) return EINA_TRUE;
 
    return EINA_FALSE;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, seat)
-     {
-        if (eina_list_count(seat->touch.resources))
-          return EINA_FALSE;
-     }
-   return EINA_TRUE;
 }
 
 EINTERN Eina_Bool
@@ -872,13 +814,14 @@ EINTERN void
 e_seat_pointer_send_motion(E_Seat *seat, struct wl_client *wc,
                            int x, int y, uint32_t timestamp)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->ptr.resources, l, res)
+   EINA_LIST_FOREACH(s->ptr.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_pointer_check(res)) continue;
@@ -888,27 +831,13 @@ e_seat_pointer_send_motion(E_Seat *seat, struct wl_client *wc,
                                wl_fixed_from_int(y));
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->ptr.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_pointer_check(res)) continue;
-
-             wl_pointer_send_motion(res, timestamp,
-                                    wl_fixed_from_int(x),
-                                    wl_fixed_from_int(y));
-          }
-     }
 }
 
 EINTERN void
 e_seat_pointer_send_enter(E_Seat *seat, struct wl_client *wc, E_Client *ec,
                           struct wl_resource *surface, int x, int y)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    uint32_t serial;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
@@ -916,9 +845,10 @@ e_seat_pointer_send_enter(E_Seat *seat, struct wl_client *wc, E_Client *ec,
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->ptr.resources, l, res)
+   EINA_LIST_FOREACH(s->ptr.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_pointer_check(res)) continue;
@@ -933,32 +863,13 @@ e_seat_pointer_send_enter(E_Seat *seat, struct wl_client *wc, E_Client *ec,
           ec->pointer_enter_sent = EINA_TRUE;
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->ptr.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_pointer_check(res)) continue;
-
-             TRACE_INPUT_BEGIN(e_seat_pointer_send_enter);
-             ELOGF("Mouse", "Enter (x:%d, y:%d)", NULL, x, y);
-             wl_pointer_send_enter(res, serial, surface,
-                                   wl_fixed_from_int(x), wl_fixed_from_int(y));
-             TRACE_INPUT_END();
-
-             if (ec)
-               ec->pointer_enter_sent = EINA_TRUE;
-          }
-     }
 }
 
 EINTERN void
 e_seat_pointer_send_leave(E_Seat *seat, struct wl_client *wc, E_Client *ec,
                           struct wl_resource *surface)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    uint32_t serial;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
@@ -966,9 +877,10 @@ e_seat_pointer_send_leave(E_Seat *seat, struct wl_client *wc, E_Client *ec,
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->ptr.resources, l, res)
+   EINA_LIST_FOREACH(s->ptr.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_pointer_check(res)) continue;
@@ -983,32 +895,13 @@ e_seat_pointer_send_leave(E_Seat *seat, struct wl_client *wc, E_Client *ec,
           ec->pointer_enter_sent = EINA_FALSE;
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->ptr.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_pointer_check(res)) continue;
-             if (ec && ec->pointer_enter_sent == EINA_FALSE) continue;
-
-             TRACE_INPUT_BEGIN(e_seat_pointer_send_leave);
-             ELOGF("Mouse", "Leave", NULL);
-             wl_pointer_send_leave(res, serial, surface);
-             TRACE_INPUT_END();
-
-             if (ec)
-               ec->pointer_enter_sent = EINA_FALSE;
-          }
-     }
 }
 
 EINTERN void
 e_seat_pointer_send_button(E_Seat *seat, struct wl_client *wc,
                            uint32_t button, uint32_t state, uint32_t timestamp)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    uint32_t serial;
    E_Comp_Wl_Data *comp_wl = e_comp_wl_get();
@@ -1016,9 +909,10 @@ e_seat_pointer_send_button(E_Seat *seat, struct wl_client *wc,
 
    serial = wl_display_next_serial(comp_wl->wl.disp);
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->ptr.resources, l, res)
+   EINA_LIST_FOREACH(s->ptr.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_pointer_check(res)) continue;
@@ -1030,35 +924,20 @@ e_seat_pointer_send_button(E_Seat *seat, struct wl_client *wc,
         TRACE_INPUT_END();
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->ptr.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_pointer_check(res)) continue;
-
-             TRACE_INPUT_BEGIN(e_seat_pointer_send_button);
-             ELOGF("Mouse", "Button %s (btn: %d, time: %d)", NULL, (state ? "Down" : "Up"), button, timestamp);
-             wl_pointer_send_button(res, serial, timestamp,
-                                    button, state);
-             TRACE_INPUT_END();
-          }
-     }
 }
 
 EINTERN void
 e_seat_pointer_send_axis(E_Seat *seat, struct wl_client *wc,
                          uint32_t axis, uint32_t dir, uint32_t timestamp)
 {
-   Eina_List *l, *ll;
+   Eina_List *l;
    struct wl_resource *res;
    E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   EINA_LIST_FOREACH(seat->ptr.resources, l, res)
+   EINA_LIST_FOREACH(s->ptr.resources, l, res)
      {
         if (wl_resource_get_client(res) != wc) continue;
         if (!e_seat_pointer_check(res)) continue;
@@ -1066,18 +945,6 @@ e_seat_pointer_send_axis(E_Seat *seat, struct wl_client *wc,
         wl_pointer_send_axis(res, timestamp, axis, dir);
      }
    return;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, s)
-     {
-        EINA_LIST_FOREACH(s->ptr.resources, ll, res)
-          {
-             if (wl_resource_get_client(res) != wc) continue;
-             if (!e_seat_pointer_check(res)) continue;
-
-             wl_pointer_send_axis(res, timestamp, axis, dir);
-          }
-     }
 }
 
 EINTERN void
@@ -1092,39 +959,27 @@ e_seat_pointer_enabled_set(E_Seat *seat, Eina_Bool enabled)
 EINTERN Eina_Bool
 e_seat_pointer_enabled_get(E_Seat *seat)
 {
-   Eina_List *l = NULL;
-   if (!seat) goto iterate;
+   E_Seat *s;
 
-   if (seat->ptr.enabled) return EINA_TRUE;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   return EINA_FALSE;
+   if (s->ptr.enabled) return EINA_TRUE;
 
-iterate:
-   EINA_LIST_FOREACH(_seats, l, seat)
-     {
-        if (seat->ptr.enabled) return EINA_TRUE;
-     }
    return EINA_FALSE;
 }
 
 EINTERN Eina_Bool
 e_seat_pointer_is_empty(E_Seat *seat)
 {
-   Eina_List *l = NULL;
+   E_Seat *s;
 
-   if (!seat) goto iterate;
+   if (!seat) s = _current_seat;
+   else s = seat;
 
-   if (!eina_list_count(seat->ptr.resources)) return EINA_TRUE;
+   if (!eina_list_count(s->ptr.resources)) return EINA_TRUE;
 
    return EINA_FALSE;
-
-iterate:
-   EINA_LIST_FOREACH(_seats, l, seat)
-     {
-        if (eina_list_count(seat->ptr.resources))
-          return EINA_FALSE;
-     }
-   return EINA_TRUE;
 }
 
 EINTERN Eina_Bool
@@ -1174,3 +1029,27 @@ e_seat_resources_get(E_Seat *seat)
 {
    return seat->resources;
 }
+
+EINTERN void
+e_seat_current_set(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN(seat);
+   if (_current_seat == seat) return;
+
+   INF("Changed current seat from %s -> %s", _current_seat ? _current_seat->name : "NULL", seat->name);
+   _current_seat = seat;
+}
+
+EINTERN E_Seat *
+e_seat_current_get()
+{
+   return _current_seat;
+}
+
+EINTERN const char *
+e_seat_name_get(E_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+
+   return seat->name;
+}
index 98ea12d1fad18790ef0de4162755bf903c3496ca..a9933d5d861b49d6d0ba68f3ea8ed79e6ccd50cb 100644 (file)
@@ -61,5 +61,8 @@ EINTERN void        e_seat_pointer_device_count_decrease(E_Seat *seat);
 EINTERN Eina_Bool   e_seat_keyboard_check(struct wl_resource *res);
 
 EINTERN Eina_List  *e_seat_resources_get(E_Seat *seat);
+EINTERN void        e_seat_current_set(E_Seat *seat);
+EINTERN E_Seat     *e_seat_current_get();
+EINTERN const char *e_seat_name_get(E_Seat *seat);
 
 #endif // E_SEAT_INTERN_H
index 08373724e34ef9d2c9059e1cd07b37c719da2b3e..a3e206d05b9164dfd5f7e1a1edf3a5e9971f5d44 100644 (file)
@@ -262,6 +262,8 @@ _e_pointer_view_set(E_Pointer *ptr,  E_View_Client *view_client)
 static void
 _e_pointer_cb_free(E_Pointer *ptr)
 {
+   E_FREE(ptr->name);
+
    _e_pointer_view_set(ptr, NULL);
 
    _ptrs = eina_list_remove(_ptrs, ptr);
@@ -365,19 +367,29 @@ e_pointer_shutdown(void)
 }
 
 EINTERN E_Pointer *
-e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled)
+e_pointer_canvas_new(const char *name, Eina_Bool filled)
 {
    E_Pointer *ptr = NULL;
    E_Output *output = NULL;
 
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(ee, NULL);
    if (!_initted) return NULL;
 
+   ptr = e_pointer_find(name);
+   if (ptr)
+     {
+        ERR("Pointer with name (%s) already exists.", name);
+        return NULL;
+     }
+
+   INF("Created Pointer with name (%s).", name);
+
    /* allocate space for new pointer */
    if (!(ptr = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_cb_free)))
      return NULL;
 
    /* set default pointer properties */
+   if (name)
+     ptr->name = strdup(name);
    ptr->canvas = EINA_TRUE;
    ptr->w = ptr->h = e_config->cursor_size;
    ptr->e_cursor = e_config->use_e_cursor;
@@ -676,3 +688,28 @@ e_pointer_desk_zoom_enable_get(void)
 {
    return _desk_zoom_enable;
 }
+
+EINTERN E_Pointer *
+e_pointer_find(const char *name)
+{
+   const Eina_List *l;
+   E_Pointer *ptr;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
+
+   EINA_LIST_FOREACH(_ptrs, l, ptr)
+     {
+        if (ptr->name && !strcmp(ptr->name, name))
+          return ptr;
+     }
+
+  return NULL;
+}
+
+EINTERN const char *
+e_pointer_name_get(E_Pointer *ptr)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, NULL);
+
+   return ptr->name;
+}
index 4a3e5ad128d75bc5b260dd87c65c3217ccdd8acc..463b1c1233efe20b6468f762dad336fb54f7013c 100644 (file)
 EINTERN int        e_pointer_init(void);
 EINTERN int        e_pointer_shutdown(void);
 
-EINTERN E_Pointer *e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled);
+EINTERN E_Pointer *e_pointer_canvas_new(const char *name, Eina_Bool filled);
 EINTERN void       e_pointer_view_set(E_Pointer *ptr, E_View_Client *view, int x, int y);
 EINTERN void       e_pointer_touch_move(E_Pointer *ptr, int x, int y);
 EINTERN E_Pointer   *e_pointer_get(E_Client *ec);
 EINTERN void         e_pointer_hide(E_Pointer *ptr);
+EINTERN E_Pointer   *e_pointer_find(const char *name);
+EINTERN const char  *e_pointer_name_get(E_Pointer *ptr);
 
 #endif
index deea9b8732c90cc3f1bdf2f8ee2db7b5b93f2cb8..c6cbcb498ee9b0e82742d83d2b74c2009d7769a9 100644 (file)
@@ -63,6 +63,7 @@ struct _E_Pointer
      } hot;
 
    E_Pointer_Device device;
+   char *name;
 
    Eina_Bool e_cursor : 1;
    Eina_Bool canvas : 1;