Patch in svn now. I modified it slightly for efl formatting.

Thank You :)

Dh


> -----Original Message-----
> From: zhiwen...@linux.intel.com [mailto:zhiwen...@linux.intel.com]
> Sent: 21 May 2012 15:17
> To: enlightenment-devel@lists.sourceforge.net
> Subject: [E-devel] [PATCH] Wayland: Port ecore to the wl_seat
> 
> From: Alex Wu <zhiwen...@linux.intel.com>
> 
> This commit tracks the changes in wayland input protocol from
> wl_input_device to wl_seat.
> ---
>  src/lib/ecore_wayland/Ecore_Wayland.h   |    6 +-
>  src/lib/ecore_wayland/ecore_wl_input.c  |  133 +++++++++++++++++++++--
> --------
>  src/lib/ecore_wayland/ecore_wl_window.c |   14 ++--
>  3 files changed, 104 insertions(+), 49 deletions(-)
> 
> diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h
> b/src/lib/ecore_wayland/Ecore_Wayland.h
> index 2d4ac51..15f6b7f 100644
> --- a/src/lib/ecore_wayland/Ecore_Wayland.h
> +++ b/src/lib/ecore_wayland/Ecore_Wayland.h
> @@ -119,7 +119,11 @@ struct _Ecore_Wl_Output
>  struct _Ecore_Wl_Input
>  {
>     Ecore_Wl_Display *display;
> -   struct wl_input_device *input_device;
> +   struct wl_seat *seat;
> +   struct wl_pointer *pointer;
> +   struct wl_keyboard *keyboard;
> +   struct wl_touch *touch;
> +
>     struct wl_data_device *data_device;
> 
>     Ecore_Wl_Window *pointer_focus;
> diff --git a/src/lib/ecore_wayland/ecore_wl_input.c
> b/src/lib/ecore_wayland/ecore_wl_input.c
> index 1627bc1..9f2c894 100644
> --- a/src/lib/ecore_wayland/ecore_wl_input.c
> +++ b/src/lib/ecore_wayland/ecore_wl_input.c
> @@ -41,19 +41,21 @@
>  #define MOD_CONTROL_MASK 0x04
> 
>  /* local function prototypes */
> -static void _ecore_wl_input_cb_motion(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int timestamp,
> wl_fixed_t sx, wl_fixed_t sy);
> -static void _ecore_wl_input_cb_button(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned
> int timestamp, unsigned int button, unsigned int state);
> -static void _ecore_wl_input_cb_axis(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int timestamp, unsigned int axis,
> int value);
> -static void _ecore_wl_input_cb_key(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, unsigned int timestamp,
> unsigned int key, unsigned int state);
> -static void _ecore_wl_input_cb_pointer_enter(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, struct
> wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy);
> -static void _ecore_wl_input_cb_pointer_leave(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, struct
> wl_surface *surface);
> -static void _ecore_wl_input_cb_keyboard_enter(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, struct
> wl_surface *surface, struct wl_array *keys __UNUSED__);
> -static void _ecore_wl_input_cb_keyboard_leave(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, struct
> wl_surface *surface);
> -static void _ecore_wl_input_cb_touch_down(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned
> int timestamp, struct wl_surface *surface __UNUSED__, int id
> __UNUSED__, wl_fixed_t x, wl_fixed_t y);
> -static void _ecore_wl_input_cb_touch_up(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned
> int timestamp, int id __UNUSED__);
> -static void _ecore_wl_input_cb_touch_motion(void *data, struct
> wl_input_device *input_device __UNUSED__, unsigned int timestamp, int
> id __UNUSED__, wl_fixed_t x, wl_fixed_t y);
> -static void _ecore_wl_input_cb_touch_frame(void *data __UNUSED__,
> struct wl_input_device *input_device __UNUSED__);
> -static void _ecore_wl_input_cb_touch_cancel(void *data __UNUSED__,
> struct wl_input_device *input_device __UNUSED__);
> +static void _ecore_wl_input_seat_handle_capabilities(void *data,
> struct wl_seat *seat, enum wl_seat_capability caps);
> +
> +static void _ecore_wl_input_cb_pointer_enter(void *data, struct
> wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface
> *surface, wl_fixed_t sx, wl_fixed_t sy);
> +static void _ecore_wl_input_cb_pointer_leave(void *data, struct
> wl_pointer *pointer __UNUSED__, unsigned int serial, struct wl_surface
> *surface);
> +static void _ecore_wl_input_cb_pointer_motion(void *data, struct
> wl_pointer *pointer __UNUSED__, unsigned int timestamp, wl_fixed_t sx,
> wl_fixed_t sy);
> +static void _ecore_wl_input_cb_pointer_button(void *data, struct
> wl_pointer *pointer __UNUSED__, unsigned int serial, unsigned int
> timestamp, unsigned int button, unsigned int state);
> +static void _ecore_wl_input_cb_pointer_axis(void *data, struct
> wl_pointer *pointer __UNUSED__, unsigned int timestamp, unsigned int
> axis, int value);
> +static void _ecore_wl_input_cb_keyboard_enter(void *data, struct
> wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct
> wl_surface *surface, struct wl_array *keys __UNUSED__);
> +static void _ecore_wl_input_cb_keyboard_leave(void *data, struct
> wl_keyboard *keyboard __UNUSED__, unsigned int serial, struct
> wl_surface *surface);
> +static void _ecore_wl_input_cb_keyboard_key(void *data, struct
> wl_keyboard *keyboard __UNUSED__, unsigned int serial, unsigned int
> timestamp, unsigned int key, unsigned int state);
> +static void _ecore_wl_input_cb_touch_down(void *data, struct wl_touch
> *touch __UNUSED__, unsigned int serial, unsigned int timestamp, struct
> wl_surface *surface __UNUSED__, int id __UNUSED__, wl_fixed_t x,
> wl_fixed_t y);
> +static void _ecore_wl_input_cb_touch_up(void *data, struct wl_touch
> *touch __UNUSED__, unsigned int serial, unsigned int timestamp, int id
> __UNUSED__);
> +static void _ecore_wl_input_cb_touch_motion(void *data, struct
> wl_touch *touch __UNUSED__, unsigned int timestamp, int id __UNUSED__,
> wl_fixed_t x, wl_fixed_t y);
> +static void _ecore_wl_input_cb_touch_frame(void *data __UNUSED__,
> struct wl_touch *touch __UNUSED__);
> +static void _ecore_wl_input_cb_touch_cancel(void *data __UNUSED__,
> struct wl_touch *touch __UNUSED__);
>  static void _ecore_wl_input_cb_data_offer(void *data, struct
> wl_data_device *data_device, unsigned int id);
>  static void _ecore_wl_input_cb_data_enter(void *data, struct
> wl_data_device *data_device, unsigned int timestamp, struct wl_surface
> *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *offer);
>  static void _ecore_wl_input_cb_data_leave(void *data, struct
> wl_data_device *data_device);
> @@ -73,16 +75,21 @@ static void
> _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int
>  /* static int _ecore_wl_input_keysym_to_string(unsigned int symbol,
> char *buffer, int len); */
> 
>  /* wayland interfaces */
> -static const struct wl_input_device_listener _ecore_wl_input_listener
> =
> -{
> -   _ecore_wl_input_cb_motion,
> -   _ecore_wl_input_cb_button,
> -   _ecore_wl_input_cb_axis,
> -   _ecore_wl_input_cb_key,
> +static const struct wl_pointer_listener pointer_listener = {
>     _ecore_wl_input_cb_pointer_enter,
>     _ecore_wl_input_cb_pointer_leave,
> +   _ecore_wl_input_cb_pointer_motion,
> +   _ecore_wl_input_cb_pointer_button,
> +   _ecore_wl_input_cb_pointer_axis
> +};
> +
> +static const struct wl_keyboard_listener keyboard_listener = {
>     _ecore_wl_input_cb_keyboard_enter,
>     _ecore_wl_input_cb_keyboard_leave,
> +   _ecore_wl_input_cb_keyboard_key
> +};
> +
> +static const struct wl_touch_listener touch_listener = {
>     _ecore_wl_input_cb_touch_down,
>     _ecore_wl_input_cb_touch_up,
>     _ecore_wl_input_cb_touch_motion,
> @@ -90,6 +97,12 @@ static const struct wl_input_device_listener
> _ecore_wl_input_listener =
>     _ecore_wl_input_cb_touch_cancel
>  };
> 
> +static const struct wl_seat_listener _ecore_wl_seat_listener =
> +{
> +   _ecore_wl_input_seat_handle_capabilities,
> +};
> +
> +
>  static const struct wl_data_device_listener _ecore_wl_data_listener =
>  {
>     _ecore_wl_input_cb_data_offer,
> @@ -136,16 +149,16 @@ _ecore_wl_input_add(Ecore_Wl_Display *ewd,
> unsigned int id)
>     input->pointer_focus = NULL;
>     input->keyboard_focus = NULL;
> 
> -   input->input_device =
> -     wl_display_bind(ewd->wl.display, id, &wl_input_device_interface);
> +   input->seat =
> +     wl_display_bind(ewd->wl.display, id, &wl_seat_interface);
>     wl_list_insert(ewd->inputs.prev, &input->link);
> -   wl_input_device_add_listener(input->input_device,
> -                                &_ecore_wl_input_listener, input);
> -   wl_input_device_set_user_data(input->input_device, input);
> +   wl_seat_add_listener(input->seat,
> +                        &_ecore_wl_seat_listener, input);
> +   wl_seat_set_user_data(input->seat, input);
> 
>     input->data_device =
>       wl_data_device_manager_get_data_device(ewd-
> >wl.data_device_manager,
> -                                            input->input_device);
> +                                            input->seat);
>     wl_data_device_add_listener(input->data_device,
>                                 &_ecore_wl_data_listener, input);
>     ewd->input = input;
> @@ -163,7 +176,7 @@ _ecore_wl_input_del(Ecore_Wl_Input *input)
>     input->selection_source = NULL;
> 
>     if (input->data_device) wl_data_device_destroy(input->data_device);
> -   if (input->input_device) wl_input_device_destroy(input-
> >input_device);
> +   if (input->seat) wl_seat_destroy(input->seat);
>     wl_list_remove(&input->link);
>     free(input);
>  }
> @@ -177,7 +190,45 @@ _ecore_wl_input_pointer_xy_get(int *x, int *y)
> 
>  /* local functions */
>  static void
> -_ecore_wl_input_cb_motion(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int timestamp, wl_fixed_t sx,
> wl_fixed_t sy)
> +_ecore_wl_input_seat_handle_capabilities(void *data, struct wl_seat
> *seat,
> +                                         enum wl_seat_capability caps)
> +{
> +   Ecore_Wl_Input *input = data;
> +
> +   if ((caps & WL_SEAT_CAPABILITY_POINTER) && !input->pointer) {
> +      input->pointer = wl_seat_get_pointer(seat);
> +      wl_pointer_set_user_data(input->pointer, input);
> +      wl_pointer_add_listener(input->pointer, &pointer_listener,
> +                              input);
> +   } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer)
> {
> +      wl_pointer_destroy(input->pointer);
> +      input->pointer = NULL;
> +   }
> +
> +   if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !input->keyboard) {
> +      input->keyboard = wl_seat_get_keyboard(seat);
> +      wl_keyboard_set_user_data(input->keyboard, input);
> +      wl_keyboard_add_listener(input->keyboard, &keyboard_listener,
> +                               input);
> +   } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input-
> >keyboard) {
> +      wl_keyboard_destroy(input->keyboard);
> +      input->keyboard = NULL;
> +   }
> +
> +   if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !input->touch) {
> +      input->touch = wl_seat_get_touch(seat);
> +      wl_touch_set_user_data(input->touch, input);
> +      wl_touch_add_listener(input->touch, &touch_listener,
> +                            input);
> +   } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) {
> +      wl_touch_destroy(input->touch);
> +      input->touch = NULL;
> +   }
> +}
> +
> +
> +static void
> +_ecore_wl_input_cb_pointer_motion(void *data, struct wl_pointer
> *pointer __UNUSED__, unsigned int timestamp, wl_fixed_t sx, wl_fixed_t
> sy)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -199,7 +250,7 @@ _ecore_wl_input_cb_motion(void *data, struct
> wl_input_device *input_device __UNU
>  }
> 
>  static void
> -_ecore_wl_input_cb_button(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, unsigned int timestamp,
> unsigned int button, unsigned int state)
> +_ecore_wl_input_cb_pointer_button(void *data, struct wl_pointer
> *pointer __UNUSED__, unsigned int serial, unsigned int timestamp,
> unsigned int button, unsigned int state)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -235,7 +286,7 @@ _ecore_wl_input_cb_button(void *data, struct
> wl_input_device *input_device __UNU
>  }
> 
>  static void
> -_ecore_wl_input_cb_axis(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int timestamp, unsigned int axis,
> int value)
> +_ecore_wl_input_cb_pointer_axis(void *data, struct wl_pointer *pointer
> __UNUSED__, unsigned int timestamp, unsigned int axis, int value)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -295,7 +346,7 @@ _ecore_wl_input_cb_axis(void *data, struct
> wl_input_device *input_device __UNUSE
>  /* } */
> 
>  static void
> -_ecore_wl_input_cb_key(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, unsigned int timestamp,
> unsigned int keycode, unsigned int state)
> +_ecore_wl_input_cb_keyboard_key(void *data, struct wl_keyboard
> *keyboard __UNUSED__, unsigned int serial, unsigned int timestamp,
> unsigned int keycode, unsigned int state)
>  {
>     Ecore_Wl_Input *input;
>     Ecore_Wl_Window *win;
> @@ -376,7 +427,7 @@ _ecore_wl_input_cb_key(void *data, struct
> wl_input_device *input_device __UNUSED
>  }
> 
>  static void
> -_ecore_wl_input_cb_pointer_enter(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, struct wl_surface
> *surface, wl_fixed_t sx, wl_fixed_t sy)
> +_ecore_wl_input_cb_pointer_enter(void *data, struct wl_pointer
> *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface,
> wl_fixed_t sx, wl_fixed_t sy)
>  {
>     Ecore_Wl_Input *input;
>     Ecore_Wl_Window *win = NULL;
> @@ -441,7 +492,7 @@ _ecore_wl_input_cb_pointer_enter(void *data, struct
> wl_input_device *input_devic
>  }
> 
>  static void
> -_ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, struct wl_surface
> *surface)
> +_ecore_wl_input_cb_pointer_leave(void *data, struct wl_pointer
> *pointer __UNUSED__, unsigned int serial, struct wl_surface *surface)
>  {
>     Ecore_Wl_Input *input;
>     Ecore_Wl_Window *win;
> @@ -470,7 +521,7 @@ _ecore_wl_input_cb_pointer_leave(void *data, struct
> wl_input_device *input_devic
>  }
> 
>  static void
> -_ecore_wl_input_cb_keyboard_enter(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, struct wl_surface
> *surface, struct wl_array *keys __UNUSED__)
> +_ecore_wl_input_cb_keyboard_enter(void *data, struct wl_keyboard
> *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface,
> struct wl_array *keys __UNUSED__)
>  {
>     Ecore_Wl_Input *input;
>     Ecore_Wl_Window *win = NULL;
> @@ -499,7 +550,7 @@ _ecore_wl_input_cb_keyboard_enter(void *data,
> struct wl_input_device *input_devi
>  }
> 
>  static void
> -_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, struct wl_surface
> *surface)
> +_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_keyboard
> *keyboard __UNUSED__, unsigned int serial, struct wl_surface *surface)
>  {
>     Ecore_Wl_Input *input;
>     Ecore_Wl_Window *win;
> @@ -528,7 +579,7 @@ _ecore_wl_input_cb_keyboard_leave(void *data,
> struct wl_input_device *input_devi
>  }
> 
>  static void
> -_ecore_wl_input_cb_touch_down(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, unsigned int timestamp,
> struct wl_surface *surface __UNUSED__, int id __UNUSED__, wl_fixed_t x,
> wl_fixed_t y)
> +_ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch
> __UNUSED__, unsigned int serial, unsigned int timestamp, struct
> wl_surface *surface __UNUSED__, int id __UNUSED__, wl_fixed_t x,
> wl_fixed_t y)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -547,7 +598,7 @@ _ecore_wl_input_cb_touch_down(void *data, struct
> wl_input_device *input_device _
>  }
> 
>  static void
> -_ecore_wl_input_cb_touch_up(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int serial, unsigned int timestamp,
> int id __UNUSED__)
> +_ecore_wl_input_cb_touch_up(void *data, struct wl_touch *touch
> __UNUSED__, unsigned int serial, unsigned int timestamp, int id
> __UNUSED__)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -564,7 +615,7 @@ _ecore_wl_input_cb_touch_up(void *data, struct
> wl_input_device *input_device __U
>  }
> 
>  static void
> -_ecore_wl_input_cb_touch_motion(void *data, struct wl_input_device
> *input_device __UNUSED__, unsigned int timestamp, int id __UNUSED__,
> wl_fixed_t x, wl_fixed_t y)
> +_ecore_wl_input_cb_touch_motion(void *data, struct wl_touch *touch
> __UNUSED__, unsigned int timestamp, int id __UNUSED__, wl_fixed_t x,
> wl_fixed_t y)
>  {
>     Ecore_Wl_Input *input;
> 
> @@ -582,13 +633,13 @@ _ecore_wl_input_cb_touch_motion(void *data,
> struct wl_input_device *input_device
>  }
> 
>  static void
> -_ecore_wl_input_cb_touch_frame(void *data __UNUSED__, struct
> wl_input_device *input_device __UNUSED__)
> +_ecore_wl_input_cb_touch_frame(void *data __UNUSED__, struct wl_touch
> *touch __UNUSED__)
>  {
>     LOGFN(__FILE__, __LINE__, __FUNCTION__);
>  }
> 
>  static void
> -_ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct
> wl_input_device *input_device __UNUSED__)
> +_ecore_wl_input_cb_touch_cancel(void *data __UNUSED__, struct wl_touch
> *touch __UNUSED__)
>  {
>     LOGFN(__FILE__, __LINE__, __FUNCTION__);
>  }
> @@ -846,12 +897,12 @@ _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input
> *input, unsigned int axis, int v
>     /* ev->root.x = input->sx; */
>     /* ev->root.y = input->sy; */
> 
> -   if (axis == WL_INPUT_DEVICE_AXIS_VERTICAL_SCROLL)
> +   if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL)
>       {
>          ev->direction = 0;
>          ev->z = -value;
>       }
> -   else if (axis == WL_INPUT_DEVICE_AXIS_HORIZONTAL_SCROLL)
> +   else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL)
>       {
>          ev->direction = 1;
>          ev->z = -value;
> diff --git a/src/lib/ecore_wayland/ecore_wl_window.c
> b/src/lib/ecore_wayland/ecore_wl_window.c
> index 70e6ee6..eb77acc 100644
> --- a/src/lib/ecore_wayland/ecore_wl_window.c
> +++ b/src/lib/ecore_wayland/ecore_wl_window.c
> @@ -173,9 +173,9 @@ ecore_wl_window_move(Ecore_Wl_Window *win, int x,
> int y)
>                 }
>            }
> 
> -        if ((!input) || (!input->input_device)) return;
> +        if ((!input) || (!input->seat)) return;
> 
> -        wl_shell_surface_move(win->shell_surface, input->input_device,
> +        wl_shell_surface_move(win->shell_surface, input->seat,
>                                input->display->serial);
>       }
>  }
> @@ -233,9 +233,9 @@ ecore_wl_window_resize(Ecore_Wl_Window *win, int w,
> int h, int location)
>                 }
>            }
> 
> -        if ((!input) || (!input->input_device)) return;
> +        if ((!input) || (!input->seat)) return;
> 
> -        wl_shell_surface_resize(win->shell_surface, input-
> >input_device,
> +        wl_shell_surface_resize(win->shell_surface, input->seat,
>                                  input->display->serial, location);
>       }
>  }
> @@ -338,7 +338,7 @@ ecore_wl_window_show(Ecore_Wl_Window *win)
>          break;
>        case ECORE_WL_WINDOW_TYPE_MENU:
>          wl_shell_surface_set_popup(win->shell_surface,
> -                                   _ecore_wl_disp->input-
> >input_device,
> +                                   _ecore_wl_disp->input->seat,
>                                     _ecore_wl_disp->serial,
>                                     /* win->parent->pointer_device-
> >input_device,  */
>                                     /* win->parent->pointer_device-
> >timestamp, */
> @@ -550,8 +550,8 @@ ecore_wl_window_pointer_set(Ecore_Wl_Window *win,
> struct wl_buffer *buffer, int
>     if (!win) return;
> 
>     input = _ecore_wl_disp->input;
> -   wl_input_device_attach(input->input_device, timestamp,
> -                          buffer, hot_x, hot_y);
> +   wl_pointer_attach(input->pointer, timestamp,
> +                     buffer, hot_x, hot_y);
>  }
> 
>  /* @since 1.2 */
> --
> 1.7.9.5
> 
> 
> -----------------------------------------------------------------------
> -------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and
> threat landscape has changed and how IT managers can respond.
> Discussions
> will include endpoint security, mobile security and the latest in
> malware
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to