| From 79d48c68d79e7436a045bb875e18f7e8c6829392 Mon Sep 17 00:00:00 2001 |
| From: Qian Hu <Qian.Hu@mediatek.com> |
| Date: Tue, 24 Sep 2019 14:25:47 +0800 |
| Subject: [PATCH 6/8] [PATCH 7/9] weston-screen-shot: add screen shot |
| |
| add screen shot |
| |
| Signed-off-by: Qian Hu <Qian.Hu@mediatek.com> |
| --- |
| Makefile.am | 26 +++- |
| clients/simple-screenshooter-mtk.c | 259 +++++++++++++++++++++++++++++++++++ |
| libweston/compositor.c | 3 + |
| libweston/compositor.h | 3 + |
| libweston/pixel-formats.c | 2 + |
| libweston/weston-screenshooter-mtk.c | 129 +++++++++++++++++ |
| protocol/weston-configure-mtk.xml | 67 +++++++++ |
| 7 files changed, 486 insertions(+), 3 deletions(-) |
| create mode 100644 clients/simple-screenshooter-mtk.c |
| create mode 100644 libweston/weston-screenshooter-mtk.c |
| create mode 100644 protocol/weston-configure-mtk.xml |
| |
| diff --git a/Makefile.am b/Makefile.am |
| index 769e103..a9e48f8 100644 |
| --- a/Makefile.am |
| +++ b/Makefile.am |
| @@ -96,6 +96,7 @@ libweston_@LIBWESTON_MAJOR@_la_SOURCES = \ |
| libweston/linux-dmabuf.h \ |
| libweston/pixel-formats.c \ |
| libweston/pixel-formats.h \ |
| + libweston/weston-screenshooter-mtk.c \ |
| shared/helpers.h \ |
| shared/matrix.c \ |
| shared/matrix.h \ |
| @@ -169,7 +170,10 @@ nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES = \ |
| protocol/input-timestamps-unstable-v1-protocol.c \ |
| protocol/input-timestamps-unstable-v1-server-protocol.h \ |
| protocol/weston-touch-calibration-protocol.c \ |
| - protocol/weston-touch-calibration-server-protocol.h |
| + protocol/weston-touch-calibration-server-protocol.h \ |
| + protocol/pointer-constraints-unstable-v1-server-protocol.h \ |
| + protocol/weston-configure-mtk-protocol.c \ |
| + protocol/weston-configure-mtk-server-protocol.h |
| |
| BUILT_SOURCES += $(nodist_libweston_@LIBWESTON_MAJOR@_la_SOURCES) |
| |
| @@ -652,6 +656,19 @@ weston_simple_dmabuf_v4l_CFLAGS = $(AM_CFLAGS) $(SIMPLE_DMABUF_V4L_CLIENT_CFLAGS |
| weston_simple_dmabuf_v4l_LDADD = $(SIMPLE_DMABUF_V4L_CLIENT_LIBS) libshared.la |
| endif |
| |
| +demo_clients += weston-simple-screenshooter-mtk |
| +weston_simple_screenshooter_mtk_SOURCES = clients/simple-screenshooter-mtk.c |
| +nodist_weston_simple_screenshooter_mtk_SOURCES = \ |
| + protocol/xdg-shell-unstable-v6-protocol.c \ |
| + protocol/xdg-shell-unstable-v6-client-protocol.h \ |
| + protocol/fullscreen-shell-unstable-v1-protocol.c \ |
| + protocol/fullscreen-shell-unstable-v1-client-protocol.h \ |
| + protocol/weston-configure-mtk-protocol.c \ |
| + protocol/weston-configure-mtk-client-protocol.h |
| +weston_simple_screenshooter_mtk_CFLAGS = $(AM_CFLAGS) $(CLIENT_CFLAGS) |
| +weston_simple_screenshooter_mtk_LDADD = $(EGL_LIBS) $(LIBDRM_LIBS) libtoytoolkit.la |
| + |
| + |
| noinst_LTLIBRARIES += libtoytoolkit.la |
| |
| libtoytoolkit_la_SOURCES = \ |
| @@ -911,7 +928,9 @@ BUILT_SOURCES += \ |
| protocol/tablet-unstable-v2-protocol.c \ |
| protocol/tablet-unstable-v2-client-protocol.h \ |
| protocol/input-timestamps-unstable-v1-protocol.c \ |
| - protocol/input-timestamps-unstable-v1-client-protocol.h |
| + protocol/input-timestamps-unstable-v1-client-protocol.h \ |
| + protocol/weston-configure-mtk-protocol.c \ |
| + protocol/weston-configure-mtk-client-protocol.h |
| |
| westondatadir = $(datadir)/weston |
| dist_westondata_DATA = \ |
| @@ -1564,7 +1583,8 @@ EXTRA_DIST += \ |
| protocol/weston-test.xml \ |
| protocol/weston-touch-calibration.xml \ |
| protocol/ivi-application.xml \ |
| - protocol/ivi-hmi-controller.xml |
| + protocol/ivi-hmi-controller.xml \ |
| + protocol/weston-configure-mtk.xml |
| |
| # |
| # manual test modules in tests subdirectory |
| diff --git a/clients/simple-screenshooter-mtk.c b/clients/simple-screenshooter-mtk.c |
| new file mode 100644 |
| index 0000000..cbca18b |
| --- /dev/null |
| +++ b/clients/simple-screenshooter-mtk.c |
| @@ -0,0 +1,259 @@ |
| +/* |
| + * Copyright © 2008 Kristian Høgsberg |
| + * |
| + * Permission is hereby granted, free of charge, to any person obtaining a |
| + * copy of this software and associated documentation files (the "Software"), |
| + * to deal in the Software without restriction, including without limitation |
| + * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| + * and/or sell copies of the Software, and to permit persons to whom the |
| + * Software is furnished to do so, subject to the following conditions: |
| + * |
| + * The above copyright notice and this permission notice (including the next |
| + * paragraph) shall be included in all copies or substantial portions of the |
| + * Software. |
| + * |
| + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| + * DEALINGS IN THE SOFTWARE. |
| + */ |
| + |
| +#include "config.h" |
| + |
| +#include <stdint.h> |
| +#include <errno.h> |
| +#include <stdlib.h> |
| +#include <stdio.h> |
| +#include <string.h> |
| +#include <fcntl.h> |
| +#include <unistd.h> |
| +#include <limits.h> |
| +#include <sys/param.h> |
| +#include <sys/mman.h> |
| +#include <cairo.h> |
| + |
| +#include <wayland-client.h> |
| +#include "weston-configure-mtk-client-protocol.h" |
| +#include "shared/os-compatibility.h" |
| +#include "shared/xalloc.h" |
| + |
| +/* The screenshooter is a good example of a custom object exposed by |
| + * the compositor and serves as a test bed for implementing client |
| + * side marshalling outside libwayland.so */ |
| + |
| +static struct wl_shm *shm; |
| +static struct weston_screenshooter_mtk *mtk_screenshooter; |
| +static struct wl_list output_list; |
| +int min_x, min_y, max_x, max_y; |
| +int buffer_copy_done; |
| + |
| +struct screenshooter_output { |
| + struct wl_output *output; |
| + struct wl_buffer *buffer; |
| + int width, height, offset_x, offset_y; |
| + void *data; |
| + struct wl_list link; |
| +}; |
| + |
| +static void |
| +display_handle_geometry(void *data, |
| + struct wl_output *wl_output, |
| + int x, |
| + int y, |
| + int physical_width, |
| + int physical_height, |
| + int subpixel, |
| + const char *make, |
| + const char *model, |
| + int transform) |
| +{ |
| + struct screenshooter_output *output; |
| + |
| + output = wl_output_get_user_data(wl_output); |
| + |
| + if (wl_output == output->output) { |
| + output->offset_x = x; |
| + output->offset_y = y; |
| + } |
| +} |
| + |
| +static void |
| +display_handle_mode(void *data, |
| + struct wl_output *wl_output, |
| + uint32_t flags, |
| + int width, |
| + int height, |
| + int refresh) |
| +{ |
| + struct screenshooter_output *output; |
| + |
| + output = wl_output_get_user_data(wl_output); |
| + |
| + if (wl_output == output->output && (flags & WL_OUTPUT_MODE_CURRENT)) { |
| + output->width = width; |
| + output->height = height; |
| + } |
| +} |
| + |
| +static const struct wl_output_listener output_listener = { |
| + display_handle_geometry, |
| + display_handle_mode |
| +}; |
| + |
| +static void |
| +screenshooter_done(void *data, struct weston_screenshooter_mtk *mtk_screenshooter) |
| +{ |
| + fprintf(stderr, "screenshooter_done\n"); |
| + buffer_copy_done = 1; |
| +} |
| + |
| +static const struct weston_screenshooter_mtk_listener screenshooter_mtk_listener = |
| +{ |
| + screenshooter_done |
| +}; |
| + |
| +static void |
| +handle_global(void *data, struct wl_registry *registry, |
| + uint32_t name, const char *interface, uint32_t version) |
| +{ |
| + static struct screenshooter_output *output; |
| + |
| + if (strcmp(interface, "wl_output") == 0) { |
| + output = xmalloc(sizeof *output); |
| + output->output = wl_registry_bind(registry, name, |
| + &wl_output_interface, 1); |
| + wl_list_insert(&output_list, &output->link); |
| + wl_output_add_listener(output->output, &output_listener, output); |
| + } else if (strcmp(interface, "wl_shm") == 0) { |
| + shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); |
| + } else if (strcmp(interface, "weston_screenshooter_mtk") == 0) { |
| + mtk_screenshooter = wl_registry_bind(registry, name, |
| + &weston_screenshooter_mtk_interface, |
| + 1); |
| + } |
| +} |
| + |
| +static void |
| +handle_global_remove(void *data, struct wl_registry *registry, uint32_t name) |
| +{ |
| + /* XXX: unimplemented */ |
| +} |
| + |
| +static const struct wl_registry_listener registry_listener = { |
| + handle_global, |
| + handle_global_remove |
| +}; |
| + |
| +static struct wl_buffer * |
| +create_shm_buffer(int width, int height, void **data_out) |
| +{ |
| + struct wl_shm_pool *pool; |
| + struct wl_buffer *buffer; |
| + int fd, size, stride; |
| + void *data; |
| + |
| + stride = width * 4; |
| + size = stride * height; |
| + |
| + fd = os_create_anonymous_file(size); |
| + if (fd < 0) { |
| + fprintf(stderr, "creating a buffer file for %d B failed: %m\n", |
| + size); |
| + return NULL; |
| + } |
| + |
| + data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
| + if (data == MAP_FAILED) { |
| + fprintf(stderr, "mmap failed: %m\n"); |
| + close(fd); |
| + return NULL; |
| + } |
| + |
| + pool = wl_shm_create_pool(shm, fd, size); |
| + close(fd); |
| + buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride, |
| + WL_SHM_FORMAT_XRGB8888); |
| + wl_shm_pool_destroy(pool); |
| + |
| + *data_out = data; |
| + fprintf(stderr,"create_shm_buffer\n"); |
| + return buffer; |
| +} |
| + |
| +static void |
| +usage(int error_code) |
| +{ |
| + fprintf(stderr, "Usage: simple-screenshooter-mtk [OPTIONS]\n\n" |
| + " -m dump mainscreen\n" |
| + " -s dump subscreen\n" |
| + " -h This help text! default dump all screens\n\n"); |
| + |
| + exit(error_code); |
| +} |
| + |
| +int main(int argc, char *argv[]) |
| +{ |
| + struct wl_display *display; |
| + struct wl_registry *registry; |
| + struct screenshooter_output *output; |
| + int i, width, height; |
| + int mainscreen=0; |
| + int subscreen=0; |
| + for (i = 1; i < argc; i++) { |
| + if (strcmp("-m", argv[i]) == 0) |
| + mainscreen = 1; |
| + else if (strcmp("-s", argv[i]) == 0) |
| + subscreen = 1; |
| + else if (strcmp("-h", argv[i]) == 0) |
| + usage(EXIT_SUCCESS); |
| + else |
| + usage(EXIT_SUCCESS); |
| + } |
| + |
| + display = wl_display_connect(NULL); |
| + if (display == NULL) { |
| + fprintf(stderr, "failed to create display: %m\n"); |
| + return -1; |
| + } |
| + |
| + wl_list_init(&output_list); |
| + registry = wl_display_get_registry(display); |
| + wl_registry_add_listener(registry, ®istry_listener, NULL); |
| + wl_display_dispatch(display); |
| + wl_display_roundtrip(display); |
| + if (mtk_screenshooter == NULL) { |
| + fprintf(stderr, "display doesn't support screenshooter\n"); |
| + return -1; |
| + } |
| + |
| + weston_screenshooter_mtk_add_listener(mtk_screenshooter, |
| + &screenshooter_mtk_listener, |
| + NULL); |
| + |
| + wl_list_for_each_reverse(output, &output_list, link) { |
| + if(mainscreen == 1) { |
| + output->buffer = create_shm_buffer(1920, 1080, &output->data); |
| + weston_screenshooter_mtk_shoot(mtk_screenshooter,output->output,output->buffer); |
| + buffer_copy_done = 0; |
| + while (!buffer_copy_done) |
| + wl_display_roundtrip(display); |
| + |
| + break; |
| + } |
| + else if(subscreen == 1) { |
| + subscreen = 0; |
| + } |
| + else { |
| + output->buffer = create_shm_buffer(1920, 1080, &output->data); |
| + weston_screenshooter_mtk_shoot(mtk_screenshooter,output->output,output->buffer); |
| + buffer_copy_done = 0; |
| + while (!buffer_copy_done) |
| + wl_display_roundtrip(display); |
| + } |
| + } |
| + fprintf(stderr,"end!!!!!\n"); |
| + return 0; |
| +} |
| diff --git a/libweston/compositor.c b/libweston/compositor.c |
| index 9deb781..fdf5d25 100644 |
| --- a/libweston/compositor.c |
| +++ b/libweston/compositor.c |
| @@ -2756,6 +2756,9 @@ weston_output_schedule_repaint(struct weston_output *output) |
| compositor->state == WESTON_COMPOSITOR_OFFSCREEN) |
| return; |
| |
| + if(output->screenshoot_needed) |
| + output->screenshoot_dump = 1; |
| + |
| if (!output->repaint_needed) |
| TL_POINT("core_repaint_req", TLP_OUTPUT(output), TLP_END); |
| |
| diff --git a/libweston/compositor.h b/libweston/compositor.h |
| index 8b7a102..8736691 100644 |
| --- a/libweston/compositor.h |
| +++ b/libweston/compositor.h |
| @@ -238,6 +238,9 @@ struct weston_output { |
| REPAINT_AWAITING_COMPLETION, /**< last repaint not yet finished */ |
| } repaint_status; |
| |
| + int screenshoot_needed; |
| + int screenshoot_dump; |
| + |
| /** If repaint_status is REPAINT_SCHEDULED, contains the time the |
| * next repaint should be run */ |
| struct timespec next_repaint; |
| diff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c |
| index df84a9f..b45db93 100644 |
| --- a/libweston/pixel-formats.c |
| +++ b/libweston/pixel-formats.c |
| @@ -145,6 +145,8 @@ static const struct pixel_format_info pixel_format_table[] = { |
| }, |
| { |
| .format = DRM_FORMAT_RGB888, |
| + .depth = 24, |
| + .bpp = 24, |
| }, |
| { |
| .format = DRM_FORMAT_BGR888, |
| diff --git a/libweston/weston-screenshooter-mtk.c b/libweston/weston-screenshooter-mtk.c |
| new file mode 100644 |
| index 0000000..7ad8f97 |
| --- /dev/null |
| +++ b/libweston/weston-screenshooter-mtk.c |
| @@ -0,0 +1,129 @@ |
| +/* |
| + * Copyright © 2008-2011 Kristian Høgsberg |
| + * |
| + * Permission is hereby granted, free of charge, to any person obtaining |
| + * a copy of this software and associated documentation files (the |
| + * "Software"), to deal in the Software without restriction, including |
| + * without limitation the rights to use, copy, modify, merge, publish, |
| + * distribute, sublicense, and/or sell copies of the Software, and to |
| + * permit persons to whom the Software is furnished to do so, subject to |
| + * the following conditions: |
| + * |
| + * The above copyright notice and this permission notice (including the |
| + * next paragraph) shall be included in all copies or substantial |
| + * portions of the Software. |
| + * |
| + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| + * SOFTWARE. |
| + */ |
| + |
| +#include "config.h" |
| + |
| +#include <stdlib.h> |
| +#include <stdio.h> |
| +#include <string.h> |
| +#include <linux/input.h> |
| +#include <fcntl.h> |
| +#include <unistd.h> |
| +#include <sys/uio.h> |
| + |
| +#include "compositor.h" |
| +#include "weston-configure-mtk-server-protocol.h" |
| +#include "shared/helpers.h" |
| + |
| +#include "wcap/wcap-decode.h" |
| + |
| +struct screenshooter { |
| + struct weston_compositor *ec; |
| + struct wl_global *global; |
| + struct wl_client *client; |
| + //struct weston_process process; |
| + struct wl_listener destroy_listener; |
| +}; |
| + |
| +struct screenshooter_frame_listener { |
| + struct wl_listener listener; |
| + struct weston_buffer *buffer; |
| + weston_screenshooter_done_func_t done; |
| + void *data; |
| +}; |
| + |
| +static void |
| +weston_screenshooter_mtk_shoot(struct wl_client *client, |
| + struct wl_resource *resource, |
| + struct wl_resource *output_resource, |
| + struct wl_resource *buffer_resource) |
| +{ |
| + struct weston_output *output = |
| + wl_resource_get_user_data(output_resource); |
| + struct weston_buffer *buffer = |
| + weston_buffer_from_resource(buffer_resource); |
| + weston_log("weston_screenshooter_mtk_shoot.\n"); |
| + output->screenshoot_needed = 1; |
| + weston_output_schedule_repaint(output); |
| + if (buffer == NULL) { |
| + wl_resource_post_no_memory(resource); |
| + return; |
| + } |
| + |
| + weston_screenshooter_mtk_send_done(resource); |
| +} |
| + |
| +static const struct weston_screenshooter_mtk_interface screenshooter_mtk_implementation = { |
| + weston_screenshooter_mtk_shoot |
| +}; |
| + |
| +static void |
| +bind_screenshooter_mtk(struct wl_client *client, |
| + void *data, uint32_t version, uint32_t id) |
| +{ |
| + struct screenshooter *shooter = data; |
| + struct wl_resource *resource; |
| + |
| + resource = wl_resource_create(client, |
| + &weston_screenshooter_mtk_interface, 1, id); |
| + |
| + if (resource == NULL) { |
| + wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, |
| + "screenshooter failed: permission denied"); |
| + wl_client_post_no_memory(client); |
| + return; |
| + } |
| + |
| + wl_resource_set_implementation(resource, &screenshooter_mtk_implementation, |
| + data, NULL); |
| +} |
| + |
| +static void |
| +screenshooter_destroy(struct wl_listener *listener, void *data) |
| +{ |
| + struct screenshooter *shooter = |
| + container_of(listener, struct screenshooter, destroy_listener); |
| + |
| + wl_global_destroy(shooter->global); |
| + free(shooter); |
| +} |
| + |
| +WL_EXPORT void |
| +screenshooter_mtk_create(struct weston_compositor *ec) |
| +{ |
| + struct screenshooter *shooter; |
| + |
| + shooter = malloc(sizeof *shooter); |
| + if (shooter == NULL) |
| + return; |
| + |
| + shooter->ec = ec; |
| + shooter->global = wl_global_create(ec->wl_display, |
| + &weston_screenshooter_mtk_interface, 1, |
| + shooter, bind_screenshooter_mtk); |
| + |
| + shooter->destroy_listener.notify = screenshooter_destroy; |
| + wl_signal_add(&ec->destroy_signal, &shooter->destroy_listener); |
| +} |
| diff --git a/protocol/weston-configure-mtk.xml b/protocol/weston-configure-mtk.xml |
| new file mode 100644 |
| index 0000000..120e904 |
| --- /dev/null |
| +++ b/protocol/weston-configure-mtk.xml |
| @@ -0,0 +1,66 @@ |
| +<?xml version="1.0" encoding="UTF-8"?> |
| +<protocol name="weston_configure_mtk"> |
| + |
| + <copyright> |
| + Copyright (C) 2016 MediaTek |
| + |
| + Permission is hereby granted, free of charge, to any person obtaining a |
| + copy of this software and associated documentation files (the "Software"), |
| + to deal in the Software without restriction, including without limitation |
| + the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| + and/or sell copies of the Software, and to permit persons to whom the |
| + Software is furnished to do so, subject to the following conditions: |
| + |
| + The above copyright notice and this permission notice (including the next |
| + paragraph) shall be included in all copies or substantial portions of the |
| + Software. |
| + |
| + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| + DEALINGS IN THE SOFTWARE. |
| + </copyright> |
| + |
| + <interface name="weston_screenshooter_mtk" version="1"> |
| + <request name="shoot"> |
| + <arg name="output" type="object" interface="wl_output"/> |
| + <arg name="buffer" type="object" interface="wl_buffer"/> |
| + </request> |
| + <event name="done"> |
| + </event> |
| + </interface> |
| + |
| + <interface name="config_switch_set" version="1"> |
| + <description summary="app interface for setting configure for the surface"/> |
| + |
| + <request name="sprite_switch"> |
| + <description summary="setting the surface configure"> |
| + This set view matched with the surface to show in overlay plane if |
| + overlay planes are available.Otherwise, it walk primary plane to |
| + render, and then send to drm to show. |
| + </description> |
| + <arg name="sprite_switch" type="int"/> |
| + </request> |
| + </interface> |
| + |
| + <interface name="config_switch" version="1"> |
| + <description summary="create app configure path for setting parameter"> |
| + This interface is exposed as a global singleton. |
| + This interface is implemented by server, it mainly provide channel to allow |
| + client to control some properties. |
| + </description> |
| + |
| + <request name="connect"> |
| + <description summary="connect to server for setting parameter"> |
| + This request gives client way to connect server.In fact, parameters set by |
| + app all through wl_surface because this is only way can be transmit by app. |
| + </description> |
| + <arg name="surface" type="object" interface="wl_surface" allow-null="true"/> |
| + <arg name="id" type="new_id" interface="config_switch_set"/> |
| + </request> |
| + </interface> |
| + |
| +</protocol> |
| -- |
| 2.6.4 |
| |