struct wl_resource *resource;
struct wl_resource *shooter;
struct wl_resource *output;
+ struct wl_resource *resource_shoot;
Eina_Bool started;
enum tizen_screenmirror_stretch stretch;
static void _e_tz_screenmirror_destroy(E_Mirror *mirror);
static void _e_tz_screenmirror_buffer_dequeue(E_Mirror_Buffer *buffer);
static void _e_tz_screenmirror_buffer_cb_free(E_Comp_Wl_Video_Buf *vbuf, void *data);
+static void _e_output_capture_oneshot_cb(E_Output *eout, tbm_surface_h tsurface, void *user_data);
static Eina_Bool
_e_screenmirror_privilege_check(struct wl_client *client)
if (!mirror->oneshot_client_destroy)
screenshooter_send_done(mirror->resource);
}
+ else if (mirror->resource_shoot == mirror->shooter)
+ {
+ if (!mirror->oneshot_client_destroy)
+ tizen_screenshooter_send_done(mirror->resource_shoot);
+ }
else
tizen_screenmirror_send_dequeued(mirror->resource, buffer->vbuf->resource);
}
E_Mirror_Buffer *buffer = data;
E_Mirror *mirror = buffer->mirror;
- if (mirror->resource == mirror->shooter)
+ if (mirror->resource == mirror->shooter || mirror->resource_shoot == mirror->shooter)
mirror->oneshot_client_destroy = EINA_TRUE;
_e_tz_screenmirror_buffer_free(buffer);
{
E_Mirror *mirror = container_of(listener, E_Mirror, client_destroy_listener);
- if (mirror->resource == mirror->shooter)
+ if (mirror->resource == mirror->shooter || mirror->resource_shoot == mirror->shooter)
{
mirror->oneshot_client_destroy = EINA_TRUE;
return;
wl_list_remove(&mirror->client_destroy_listener.link);
mirror->client_destroy_listener.notify = NULL;
- wl_resource_set_destructor(mirror->resource, NULL);
+ if (mirror->resource)
+ wl_resource_set_destructor(mirror->resource, NULL);
+ if (mirror->resource_shoot)
+ wl_resource_set_destructor(mirror->resource_shoot, NULL);
eina_list_free(mirror->buffer_clear_check);
mirror->buffer_clear_check = NULL;
}
static void
+_e_tz_screenshooter_shoot(struct wl_client *client,
+ struct wl_resource *resource,
+ struct wl_resource *output_resource,
+ struct wl_resource *buffer_resource)
+{
+ E_Mirror *mirror;
+ E_Mirror_Buffer *buffer;
+ Eina_Bool ret;
+ E_Comp_Wl_Video_Buf *vbuf = NULL;
+
+ if (!_e_tz_screenmirror_buffer_check(buffer_resource))
+ {
+ wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
+ "tizen_screenshooter failed: wrong buffer resource");
+ return;
+ }
+
+ mirror = _e_tz_screenmirror_create(client, resource, output_resource);
+ if (!mirror)
+ {
+ wl_resource_post_no_memory(resource);
+ return;
+ }
+
+ mirror->resource_shoot = mirror->shooter;
+
+ if (_e_screenmirror_privilege_check(client) == EINA_FALSE)
+ {
+ ERR("priv check failed");
+ tizen_screenshooter_send_done(resource);
+ goto privilege_fail;
+ }
+
+ buffer = _e_tz_screenmirror_buffer_get(mirror, buffer_resource);
+ if (!buffer)
+ {
+ wl_resource_post_no_memory(resource);
+ _e_tz_screenmirror_destroy(mirror);
+ return;
+ }
+ e_comp_wl_video_buffer_clear(buffer->vbuf);
+
+ mirror->buffer_queue = eina_list_append(mirror->buffer_queue, buffer);
+
+ if (e_output_dpms_get(mirror->e_output))
+ {
+ ERR("dpms on fail");
+ goto dump_done;
+ }
+
+ if (buffer->vbuf->type == E_COMP_WL_VIDEO_BUF_TYPE_SHM)
+ {
+ if (!_e_tz_screenmirror_tmp_buffer_create(buffer))
+ {
+ ERR("tmp buffer create fail");
+ goto dump_done;
+ }
+
+ vbuf = buffer->tmp;
+ }
+ else
+ vbuf = buffer->vbuf;
+ EINA_SAFETY_ON_NULL_GOTO(vbuf, dump_done);
+
+ ret = e_output_capture(mirror->e_output, vbuf->tbm_surface, screenshot_auto_rotation, EINA_FALSE, _e_output_capture_oneshot_cb, buffer);
+ if (ret) return;
+ else ERR("capture fail");
+
+ if (buffer->vbuf->type == E_COMP_WL_VIDEO_BUF_TYPE_SHM)
+ _e_tz_screenmirror_copy_tmp_buffer(buffer);
+
+dump_done:
+ _e_tz_screenmirror_buffer_free(buffer);
+
+privilege_fail:
+ _e_tz_screenmirror_destroy(mirror);
+}
+
+static void
_e_tz_screenshooter_destroy(struct wl_client *client, struct wl_resource *resource)
{
wl_resource_destroy(resource);
_e_tz_screenshooter_get_screenmirror,
_e_tz_screenshooter_set_oneshot_auto_rotation,
_e_tz_screenshooter_destroy,
+ _e_tz_screenshooter_shoot,
};
static void
}
/* try to add tizen_screenshooter to wayland globals */
- if (!wl_global_create(e_comp_wl->wl.disp, &tizen_screenshooter_interface, 2,
+ if (!wl_global_create(e_comp_wl->wl.disp, &tizen_screenshooter_interface, 3,
NULL, _e_tz_screenshooter_cb_bind))
{
ERR("Could not add tizen_screenshooter to wayland globals");