| /* |
| * Copyright © 2010-2012 Intel Corporation |
| * Copyright © 2011-2012 Collabora, Ltd. |
| * Copyright © 2013 Raspberry Pi Foundation |
| * |
| * 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 <stdbool.h> |
| #include <stdint.h> |
| #include <time.h> |
| |
| #include "compositor.h" |
| #include "xwayland/xwayland-api.h" |
| |
| #include "weston-desktop-shell-server-protocol.h" |
| |
| enum animation_type { |
| ANIMATION_NONE, |
| |
| ANIMATION_ZOOM, |
| ANIMATION_FADE, |
| ANIMATION_DIM_LAYER, |
| }; |
| |
| enum fade_type { |
| FADE_IN, |
| FADE_OUT |
| }; |
| |
| enum exposay_target_state { |
| EXPOSAY_TARGET_OVERVIEW, /* show all windows */ |
| EXPOSAY_TARGET_CANCEL, /* return to normal, same focus */ |
| EXPOSAY_TARGET_SWITCH, /* return to normal, switch focus */ |
| }; |
| |
| enum exposay_layout_state { |
| EXPOSAY_LAYOUT_INACTIVE = 0, /* normal desktop */ |
| EXPOSAY_LAYOUT_ANIMATE_TO_INACTIVE, /* in transition to normal */ |
| EXPOSAY_LAYOUT_OVERVIEW, /* show all windows */ |
| EXPOSAY_LAYOUT_ANIMATE_TO_OVERVIEW, /* in transition to all windows */ |
| }; |
| |
| struct exposay_output { |
| int num_surfaces; |
| int grid_size; |
| int surface_size; |
| |
| int hpadding_outer; |
| int vpadding_outer; |
| int padding_inner; |
| }; |
| |
| struct exposay { |
| /* XXX: Make these exposay_surfaces. */ |
| struct weston_view *focus_prev; |
| struct weston_view *focus_current; |
| struct weston_view *clicked; |
| struct workspace *workspace; |
| struct weston_seat *seat; |
| |
| struct wl_list surface_list; |
| |
| struct weston_keyboard_grab grab_kbd; |
| struct weston_pointer_grab grab_ptr; |
| |
| enum exposay_target_state state_target; |
| enum exposay_layout_state state_cur; |
| int in_flight; /* number of animations still running */ |
| |
| int row_current; |
| int column_current; |
| struct exposay_output *cur_output; |
| |
| bool mod_pressed; |
| bool mod_invalid; |
| }; |
| |
| struct focus_surface { |
| struct weston_surface *surface; |
| struct weston_view *view; |
| struct weston_transform workspace_transform; |
| }; |
| |
| struct workspace { |
| struct weston_layer layer; |
| |
| struct wl_list focus_list; |
| struct wl_listener seat_destroyed_listener; |
| |
| struct focus_surface *fsurf_front; |
| struct focus_surface *fsurf_back; |
| struct weston_view_animation *focus_animation; |
| }; |
| |
| struct shell_output { |
| struct desktop_shell *shell; |
| struct weston_output *output; |
| struct exposay_output eoutput; |
| struct wl_listener destroy_listener; |
| struct wl_list link; |
| |
| struct weston_surface *panel_surface; |
| struct wl_listener panel_surface_listener; |
| |
| struct weston_surface *background_surface; |
| struct wl_listener background_surface_listener; |
| |
| struct { |
| struct weston_view *view; |
| struct weston_view_animation *animation; |
| enum fade_type type; |
| struct wl_event_source *startup_timer; |
| } fade; |
| }; |
| |
| struct weston_desktop; |
| struct desktop_shell { |
| struct weston_compositor *compositor; |
| struct weston_desktop *desktop; |
| const struct weston_xwayland_surface_api *xwayland_surface_api; |
| |
| struct wl_listener idle_listener; |
| struct wl_listener wake_listener; |
| struct wl_listener transform_listener; |
| struct wl_listener resized_listener; |
| struct wl_listener destroy_listener; |
| struct wl_listener show_input_panel_listener; |
| struct wl_listener hide_input_panel_listener; |
| struct wl_listener update_input_panel_listener; |
| |
| struct weston_layer fullscreen_layer; |
| struct weston_layer panel_layer; |
| struct weston_layer background_layer; |
| struct weston_layer lock_layer; |
| struct weston_layer input_panel_layer; |
| |
| struct wl_listener pointer_focus_listener; |
| struct weston_surface *grab_surface; |
| |
| struct { |
| struct wl_client *client; |
| struct wl_resource *desktop_shell; |
| struct wl_listener client_destroy_listener; |
| |
| unsigned deathcount; |
| struct timespec deathstamp; |
| } child; |
| |
| bool locked; |
| bool showing_input_panels; |
| bool prepare_event_sent; |
| |
| struct text_backend *text_backend; |
| |
| struct { |
| struct weston_surface *surface; |
| pixman_box32_t cursor_rectangle; |
| } text_input; |
| |
| struct weston_surface *lock_surface; |
| struct wl_listener lock_surface_listener; |
| |
| struct { |
| struct wl_array array; |
| unsigned int current; |
| unsigned int num; |
| |
| struct wl_list client_list; |
| |
| struct weston_animation animation; |
| struct wl_list anim_sticky_list; |
| int anim_dir; |
| struct timespec anim_timestamp; |
| double anim_current; |
| struct workspace *anim_from; |
| struct workspace *anim_to; |
| } workspaces; |
| |
| struct { |
| struct wl_resource *binding; |
| struct wl_list surfaces; |
| } input_panel; |
| |
| struct exposay exposay; |
| |
| bool allow_zap; |
| uint32_t binding_modifier; |
| uint32_t exposay_modifier; |
| enum animation_type win_animation_type; |
| enum animation_type win_close_animation_type; |
| enum animation_type startup_animation_type; |
| enum animation_type focus_animation_type; |
| |
| struct weston_layer minimized_layer; |
| |
| struct wl_listener seat_create_listener; |
| struct wl_listener output_create_listener; |
| struct wl_listener output_move_listener; |
| struct wl_list output_list; |
| |
| enum weston_desktop_shell_panel_position panel_position; |
| |
| char *client; |
| |
| struct timespec startup_time; |
| }; |
| |
| struct weston_output * |
| get_default_output(struct weston_compositor *compositor); |
| |
| struct weston_view * |
| get_default_view(struct weston_surface *surface); |
| |
| struct shell_surface * |
| get_shell_surface(struct weston_surface *surface); |
| |
| struct workspace * |
| get_current_workspace(struct desktop_shell *shell); |
| |
| void |
| lower_fullscreen_layer(struct desktop_shell *shell, |
| struct weston_output *lowering_output); |
| |
| void |
| activate(struct desktop_shell *shell, struct weston_view *view, |
| struct weston_seat *seat, uint32_t flags); |
| |
| void |
| exposay_binding(struct weston_keyboard *keyboard, |
| enum weston_keyboard_modifier modifier, |
| void *data); |
| int |
| input_panel_setup(struct desktop_shell *shell); |
| void |
| input_panel_destroy(struct desktop_shell *shell); |
| |
| typedef void (*shell_for_each_layer_func_t)(struct desktop_shell *, |
| struct weston_layer *, void *); |
| |
| void |
| shell_for_each_layer(struct desktop_shell *shell, |
| shell_for_each_layer_func_t func, |
| void *data); |