return EINA_FALSE;
}
-static Eina_Bool
-_drm_read_pixels(E_Comp_Wl_Output *output, void *pixels)
-{
- Ecore_Drm_Device *dev;
- Ecore_Drm_Fb *fb = NULL;
- const Eina_List *drm_devs, *l;
- int i = 0, bstride;
- unsigned char *s, *d = pixels;
-
- drm_devs = ecore_drm_devices_get();
- EINA_LIST_FOREACH(drm_devs, l, dev)
- {
- fb = dev->next;
- if (!fb) fb = dev->current;
- if (fb) break;
- }
-
- if (!fb) return EINA_FALSE;
-
- bstride = output->w * sizeof(int);
-
- for (i = output->y; i < output->y + output->h; i++)
- {
- s = fb->mmap;
- s += (fb->stride * i) + (output->x * sizeof(int));
- memcpy(d, s, (output->w * sizeof(int)));
- d += bstride;
- }
-
- return EINA_TRUE;
-}
-
E_API void
_e_comp_screen_keymap_set(struct xkb_context **ctx, struct xkb_keymap **map)
{
}
e_main_ts("\tE_Comp_Canvas Init Done");
- e_comp_wl->screenshooter.read_pixels = _drm_read_pixels;
-
/* pointer */
ecore_evas_pointer_xy_get(e_comp->ee,
&e_comp_wl->ptr.x,
#include "e.h"
-#include "e_comp_wl_screenshooter_server.h"
#include <wayland-tbm-server.h>
wl_resource_set_implementation(res, &_e_session_recovery_interface, e_comp, NULL);
}
-static void
-_e_comp_wl_screenshooter_cb_shoot(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, struct wl_resource *output_resource, struct wl_resource *buffer_resource)
-{
- E_Comp_Wl_Output *output;
- E_Comp_Wl_Buffer *buffer;
- struct wl_shm_buffer *shm_buffer;
- int stride;
- void *pixels = NULL, *d;
- Eina_Bool res;
-
- output = wl_resource_get_user_data(output_resource);
- buffer = e_comp_wl_buffer_get(buffer_resource, NULL);
-
- if (!output) return;
-
- if (!buffer)
- {
- wl_resource_post_no_memory(resource);
- return;
- }
-
- EINA_SAFETY_ON_NULL_RETURN(e_comp_wl->screenshooter.read_pixels);
-
- if ((buffer->w < output->w) || (buffer->h < output->h))
- {
- ERR("Buffer size less than output");
- /* send done with bad buffer error */
- return;
- }
-
- stride = buffer->w * sizeof(int);
-
- pixels = malloc(stride * buffer->h);
- if (!pixels)
- {
- /* send done with bad buffer error */
- ERR("Could not allocate space for destination");
- return;
- }
-
- res = e_comp_wl->screenshooter.read_pixels(output, pixels);
- if (!res)
- {
- free(pixels);
- return;
- }
-
- shm_buffer = wl_shm_buffer_get(buffer->resource);
- if (!shm_buffer)
- {
- ERR("Could not get shm_buffer from resource");
- free(pixels);
- return;
- }
-
- stride = wl_shm_buffer_get_stride(shm_buffer);
- d = wl_shm_buffer_get_data(shm_buffer);
- if (!d)
- {
- ERR("Could not get buffer data");
- free(pixels);
- return;
- }
-
- wl_shm_buffer_begin_access(shm_buffer);
- memcpy(d, pixels, buffer->h * stride);
- wl_shm_buffer_end_access(shm_buffer);
-
- screenshooter_send_done(resource);
-
- free(pixels);
-}
-
-static const struct screenshooter_interface _e_screenshooter_interface =
-{
- _e_comp_wl_screenshooter_cb_shoot
-};
-
-static void
-_e_comp_wl_screenshooter_cb_bind(struct wl_client *client, void *data, uint32_t version EINA_UNUSED, uint32_t id)
-{
- struct wl_resource *res;
-
- res = wl_resource_create(client, &screenshooter_interface, 1, id);
- if (!res)
- {
- ERR("Could not create screenshooter resource: %m");
- wl_client_post_no_memory(client);
- return;
- }
-
- wl_resource_set_implementation(res, &_e_screenshooter_interface, data, NULL);
-}
-
static void
_e_comp_wl_client_cb_new(void *data EINA_UNUSED, E_Client *ec)
{
/* initialize shm mechanism */
wl_display_init_shm(cdata->wl.disp);
- cdata->screenshooter.global =
- wl_global_create(cdata->wl.disp, &screenshooter_interface, 1,
- e_comp, _e_comp_wl_screenshooter_cb_bind);
- if (!cdata->screenshooter.global)
- {
- ERR("Could not create screenshooter global: %m");
- goto comp_global_err;
- }
-
/* _e_comp_wl_cb_randr_change(NULL, 0, NULL); */
/* try to init data manager */
+++ /dev/null
-#include <stdlib.h>
-#include <stdint.h>
-#include "wayland-util.h"
-
-extern const struct wl_interface wl_buffer_interface;
-extern const struct wl_interface wl_output_interface;
-
-static const struct wl_interface *types[] = {
- &wl_output_interface,
- &wl_buffer_interface,
-};
-
-static const struct wl_message screenshooter_requests[] = {
- { "shoot", "oo", types + 0 },
-};
-
-static const struct wl_message screenshooter_events[] = {
- { "done", "", types + 0 },
-};
-
-WL_EXPORT const struct wl_interface screenshooter_interface = {
- "screenshooter", 1,
- 1, screenshooter_requests,
- 1, screenshooter_events,
-};
-
+++ /dev/null
-#ifndef SCREENSHOOTER_SERVER_PROTOCOL_H
-#define SCREENSHOOTER_SERVER_PROTOCOL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-#include <stddef.h>
-#include "wayland-server.h"
-
-struct wl_client;
-struct wl_resource;
-
-struct screenshooter;
-struct wl_buffer;
-struct wl_output;
-
-extern const struct wl_interface screenshooter_interface;
-
-struct screenshooter_interface {
- /**
- * shoot - (none)
- * @output: (none)
- * @buffer: (none)
- */
- void (*shoot)(struct wl_client *client,
- struct wl_resource *resource,
- struct wl_resource *output,
- struct wl_resource *buffer);
-};
-
-#define SCREENSHOOTER_DONE 0
-
-#define SCREENSHOOTER_DONE_SINCE_VERSION 1
-
-static inline void
-screenshooter_send_done(struct wl_resource *resource_)
-{
- wl_resource_post_event(resource_, SCREENSHOOTER_DONE);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif