| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "host/libs/wayland/wayland_shell.h" |
| |
| #include <android-base/logging.h> |
| |
| #include <wayland-server-core.h> |
| #include <wayland-server-protocol.h> |
| #include <xdg-shell-server-protocol.h> |
| |
| namespace wayland { |
| namespace { |
| |
| void xdg_positioner_destroy(wl_client*, wl_resource* positioner) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner; |
| |
| wl_resource_destroy(positioner); |
| } |
| |
| void xdg_positioner_set_size(wl_client*, wl_resource* positioner, int32_t w, |
| int32_t h) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " w=" << w |
| << " h=" << h; |
| } |
| |
| void xdg_positioner_set_anchor_rect(wl_client*, wl_resource* positioner, |
| int32_t x, int32_t y, int32_t w, |
| int32_t h) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " x=" << x |
| << " y=" << y |
| << " w=" << w |
| << " h=" << h; |
| } |
| |
| void xdg_positioner_set_anchor(wl_client*, wl_resource* positioner, |
| uint32_t anchor) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " anchor=" << anchor; |
| } |
| |
| void xdg_positioner_set_gravity(wl_client*, wl_resource* positioner, |
| uint32_t gravity) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " gravity=" << gravity; |
| } |
| |
| void xdg_positioner_set_constraint_adjustment(wl_client*, |
| wl_resource* positioner, |
| uint32_t adjustment) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " adjustment=" << adjustment; |
| } |
| |
| void xdg_positioner_set_offset(wl_client*, wl_resource* positioner, int32_t x, |
| int32_t y) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " positioner=" << positioner |
| << " x=" << x |
| << " y=" << y; |
| } |
| |
| const struct xdg_positioner_interface xdg_positioner_implementation = { |
| .destroy = xdg_positioner_destroy, |
| .set_size = xdg_positioner_set_size, |
| .set_anchor_rect = xdg_positioner_set_anchor_rect, |
| .set_anchor = xdg_positioner_set_anchor, |
| .set_gravity = xdg_positioner_set_gravity, |
| .set_constraint_adjustment = xdg_positioner_set_constraint_adjustment, |
| .set_offset = xdg_positioner_set_offset}; |
| |
| void xdg_toplevel_destroy(wl_client*, wl_resource* toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| |
| wl_resource_destroy(toplevel); |
| } |
| |
| void xdg_toplevel_set_parent(wl_client*, wl_resource* toplevel, |
| wl_resource* parent_toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " parent_toplevel=" << parent_toplevel; |
| } |
| |
| void xdg_toplevel_set_title(wl_client*, wl_resource* toplevel, |
| const char* title) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " title=" << title; |
| } |
| |
| void xdg_toplevel_set_app_id(wl_client*, wl_resource* toplevel, |
| const char* app) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " app=" << app; |
| } |
| |
| void xdg_toplevel_show_window_menu(wl_client*, wl_resource* toplevel, |
| wl_resource* seat, uint32_t serial, |
| int32_t x, int32_t y) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " seat=" << seat |
| << " serial=" << serial |
| << " x=" << x |
| << " y=" << y; |
| } |
| |
| void xdg_toplevel_move(wl_client*, wl_resource* toplevel, wl_resource* seat, |
| uint32_t serial) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " seat=" << seat |
| << " serial=" << serial; |
| } |
| |
| void xdg_toplevel_resize(wl_client*, wl_resource* toplevel, wl_resource* seat, |
| uint32_t serial, uint32_t edges) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " seat=" << seat |
| << " serial=" << serial |
| << " edges=" << edges; |
| } |
| |
| void xdg_toplevel_set_max_size(wl_client*, wl_resource* toplevel, int32_t w, |
| int32_t h) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " w=" << w |
| << " h=" << h; |
| } |
| |
| void xdg_toplevel_set_min_size(wl_client*, wl_resource* toplevel, int32_t w, |
| int32_t h) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel |
| << " w=" << w |
| << " h=" << h; |
| } |
| |
| void xdg_toplevel_set_maximized(wl_client*, wl_resource* toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| } |
| |
| void xdg_toplevel_unset_maximized(wl_client*, wl_resource* toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| } |
| |
| void xdg_toplevel_set_fullscreen(wl_client*, wl_resource* toplevel, |
| wl_resource*) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| } |
| |
| void xdg_toplevel_unset_fullscreen(wl_client*, wl_resource* toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| } |
| |
| void xdg_toplevel_set_minimized(wl_client*, wl_resource* toplevel) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " toplevel=" << toplevel; |
| } |
| |
| const struct xdg_toplevel_interface xdg_toplevel_implementation = { |
| .destroy = xdg_toplevel_destroy, |
| .set_parent = xdg_toplevel_set_parent, |
| .set_title = xdg_toplevel_set_title, |
| .set_app_id = xdg_toplevel_set_app_id, |
| .show_window_menu = xdg_toplevel_show_window_menu, |
| .move = xdg_toplevel_move, |
| .resize = xdg_toplevel_resize, |
| .set_max_size = xdg_toplevel_set_max_size, |
| .set_min_size = xdg_toplevel_set_min_size, |
| .set_maximized = xdg_toplevel_set_maximized, |
| .unset_maximized = xdg_toplevel_unset_maximized, |
| .set_fullscreen = xdg_toplevel_set_fullscreen, |
| .unset_fullscreen = xdg_toplevel_unset_fullscreen, |
| .set_minimized = xdg_toplevel_set_minimized}; |
| |
| void xdg_popup_destroy(wl_client*, wl_resource* popup) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " popup=" << popup; |
| |
| wl_resource_destroy(popup); |
| } |
| |
| void xdg_popup_grab(wl_client*, wl_resource* popup, wl_resource* seat, |
| uint32_t serial) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " popup=" << popup |
| << " seat=" << seat |
| << " serial=" << serial; |
| } |
| |
| const struct xdg_popup_interface xdg_popup_implementation = { |
| .destroy = xdg_popup_destroy, .grab = xdg_popup_grab}; |
| |
| void xdg_surface_destroy(wl_client*, wl_resource* surface) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " surface=" << surface; |
| |
| wl_resource_destroy(surface); |
| } |
| |
| void toplevel_destroy_resource_callback(struct wl_resource*) {} |
| |
| void xdg_surface_get_toplevel(wl_client* client, wl_resource* surface, |
| uint32_t id) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " surface=" << surface |
| << " id=" << id; |
| |
| wl_resource* xdg_toplevel_resource = |
| wl_resource_create(client, &xdg_toplevel_interface, 1, id); |
| |
| wl_resource_set_implementation(xdg_toplevel_resource, |
| &xdg_toplevel_implementation, nullptr, |
| toplevel_destroy_resource_callback); |
| } |
| |
| void popup_destroy_resource_callback(struct wl_resource*) {} |
| |
| void xdg_surface_get_popup(wl_client* client, wl_resource* surface, uint32_t id, |
| wl_resource* parent_surface, |
| wl_resource* positioner) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " surface=" << surface |
| << " id=" << id |
| << " parent_surface=" << parent_surface |
| << " positioner=" << positioner; |
| |
| wl_resource* xdg_popup_resource = |
| wl_resource_create(client, &xdg_popup_interface, 1, id); |
| |
| wl_resource_set_implementation(xdg_popup_resource, &xdg_popup_implementation, |
| nullptr, popup_destroy_resource_callback); |
| } |
| |
| void xdg_surface_set_window_geometry(wl_client*, wl_resource* surface, |
| int32_t x, int32_t y, int32_t w, |
| int32_t h) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " surface=" << surface |
| << " x=" << x |
| << " y=" << y |
| << " w=" << w |
| << " h=" << h; |
| } |
| |
| void xdg_surface_ack_configure(wl_client*, wl_resource* surface, |
| uint32_t serial) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " surface=" << surface |
| << " serial=" << serial; |
| } |
| |
| const struct xdg_surface_interface xdg_surface_implementation = { |
| .destroy = xdg_surface_destroy, |
| .get_toplevel = xdg_surface_get_toplevel, |
| .get_popup = xdg_surface_get_popup, |
| .set_window_geometry = xdg_surface_set_window_geometry, |
| .ack_configure = xdg_surface_ack_configure}; |
| |
| void xdg_shell_destroy(wl_client*, wl_resource* shell) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " shell=" << shell; |
| |
| wl_resource_destroy(shell); |
| } |
| |
| void positioner_destroy_resource_callback(struct wl_resource*) {} |
| |
| void xdg_shell_create_positioner(wl_client* client, wl_resource* shell, |
| uint32_t id) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " shell=" << shell |
| << " id=" << id; |
| |
| wl_resource* positioner_resource = |
| wl_resource_create(client, &xdg_positioner_interface, 1, id); |
| |
| wl_resource_set_implementation(positioner_resource, |
| &xdg_positioner_implementation, nullptr, |
| positioner_destroy_resource_callback); |
| } |
| |
| void surface_destroy_resource_callback(struct wl_resource*) {} |
| |
| void xdg_shell_get_xdg_surface(wl_client* client, wl_resource* shell, |
| uint32_t id, wl_resource* surface) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " shell=" << shell |
| << " id=" << id |
| << " surface=" << surface; |
| |
| wl_resource* surface_resource = |
| wl_resource_create(client, &xdg_surface_interface, 1, id); |
| |
| wl_resource_set_implementation(surface_resource, &xdg_surface_implementation, |
| nullptr, surface_destroy_resource_callback); |
| } |
| |
| void xdg_shell_pong(wl_client*, wl_resource* shell, uint32_t serial) { |
| LOG(VERBOSE) << __FUNCTION__ |
| << " shell=" << shell |
| << " serial=" << serial; |
| } |
| |
| const struct xdg_wm_base_interface xdg_shell_implementation = { |
| .destroy = xdg_shell_destroy, |
| .create_positioner = xdg_shell_create_positioner, |
| .get_xdg_surface = xdg_shell_get_xdg_surface, |
| .pong = xdg_shell_pong}; |
| |
| void bind_shell(wl_client* client, void* data, uint32_t version, uint32_t id) { |
| wl_resource* shell_resource = |
| wl_resource_create(client, &xdg_wm_base_interface, version, id); |
| |
| wl_resource_set_implementation(shell_resource, &xdg_shell_implementation, |
| data, nullptr); |
| } |
| |
| } // namespace |
| |
| void BindShellInterface(wl_display* display) { |
| wl_global_create(display, &xdg_wm_base_interface, 1, nullptr, bind_shell); |
| } |
| |
| } // namespace wayland |