shell: quit weston, if weston-desktop-shell dies early
[profile/ivi/weston-ivi-shell.git] / desktop-shell / shell.h
1 /*
2  * Copyright © 2010-2012 Intel Corporation
3  * Copyright © 2011-2012 Collabora, Ltd.
4  * Copyright © 2013 Raspberry Pi Foundation
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and
7  * its documentation for any purpose is hereby granted without fee, provided
8  * that the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of the copyright holders not be used in
11  * advertising or publicity pertaining to distribution of the software
12  * without specific, written prior permission.  The copyright holders make
13  * no representations about the suitability of this software for any
14  * purpose.  It is provided "as is" without express or implied warranty.
15  *
16  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
17  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18  * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
20  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
21  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #include <stdbool.h>
26 #include <time.h>
27
28 #include "compositor.h"
29
30 #include "desktop-shell-server-protocol.h"
31
32 enum animation_type {
33         ANIMATION_NONE,
34
35         ANIMATION_ZOOM,
36         ANIMATION_FADE,
37         ANIMATION_DIM_LAYER,
38 };
39
40 enum fade_type {
41         FADE_IN,
42         FADE_OUT
43 };
44
45 enum exposay_target_state {
46         EXPOSAY_TARGET_OVERVIEW, /* show all windows */
47         EXPOSAY_TARGET_CANCEL, /* return to normal, same focus */
48         EXPOSAY_TARGET_SWITCH, /* return to normal, switch focus */
49 };
50
51 enum exposay_layout_state {
52         EXPOSAY_LAYOUT_INACTIVE = 0, /* normal desktop */
53         EXPOSAY_LAYOUT_ANIMATE_TO_INACTIVE, /* in transition to normal */
54         EXPOSAY_LAYOUT_OVERVIEW, /* show all windows */
55         EXPOSAY_LAYOUT_ANIMATE_TO_OVERVIEW, /* in transition to all windows */
56 };
57
58 struct exposay_output {
59         int num_surfaces;
60         int grid_size;
61         int surface_size;
62
63         int hpadding_outer;
64         int vpadding_outer;
65         int padding_inner;
66 };
67
68 struct exposay {
69         /* XXX: Make these exposay_surfaces. */
70         struct weston_view *focus_prev;
71         struct weston_view *focus_current;
72         struct weston_view *clicked;
73         struct workspace *workspace;
74         struct weston_seat *seat;
75
76         struct wl_list surface_list;
77
78         struct weston_keyboard_grab grab_kbd;
79         struct weston_pointer_grab grab_ptr;
80
81         enum exposay_target_state state_target;
82         enum exposay_layout_state state_cur;
83         int in_flight; /* number of animations still running */
84
85         int row_current;
86         int column_current;
87         struct exposay_output *cur_output;
88
89         bool mod_pressed;
90         bool mod_invalid;
91 };
92
93 struct focus_surface {
94         struct weston_surface *surface;
95         struct weston_view *view;
96         struct weston_transform workspace_transform;
97 };
98
99 struct workspace {
100         struct weston_layer layer;
101
102         struct wl_list focus_list;
103         struct wl_listener seat_destroyed_listener;
104
105         struct focus_surface *fsurf_front;
106         struct focus_surface *fsurf_back;
107         struct weston_view_animation *focus_animation;
108 };
109
110 struct shell_output {
111         struct desktop_shell  *shell;
112         struct weston_output  *output;
113         struct exposay_output eoutput;
114         struct wl_listener    destroy_listener;
115         struct wl_list        link;
116 };
117
118 struct desktop_shell {
119         struct weston_compositor *compositor;
120
121         struct wl_listener idle_listener;
122         struct wl_listener wake_listener;
123         struct wl_listener destroy_listener;
124         struct wl_listener show_input_panel_listener;
125         struct wl_listener hide_input_panel_listener;
126         struct wl_listener update_input_panel_listener;
127
128         struct weston_layer fullscreen_layer;
129         struct weston_layer panel_layer;
130         struct weston_layer background_layer;
131         struct weston_layer lock_layer;
132         struct weston_layer input_panel_layer;
133
134         struct wl_listener pointer_focus_listener;
135         struct weston_surface *grab_surface;
136
137         struct {
138                 struct wl_client *client;
139                 struct wl_resource *desktop_shell;
140                 struct wl_listener client_destroy_listener;
141
142                 unsigned deathcount;
143                 uint32_t deathstamp;
144         } child;
145
146         bool locked;
147         bool showing_input_panels;
148         bool prepare_event_sent;
149
150         struct {
151                 struct weston_surface *surface;
152                 pixman_box32_t cursor_rectangle;
153         } text_input;
154
155         struct weston_surface *lock_surface;
156         struct wl_listener lock_surface_listener;
157
158         struct {
159                 struct wl_array array;
160                 unsigned int current;
161                 unsigned int num;
162
163                 struct wl_list client_list;
164
165                 struct weston_animation animation;
166                 struct wl_list anim_sticky_list;
167                 int anim_dir;
168                 uint32_t anim_timestamp;
169                 double anim_current;
170                 struct workspace *anim_from;
171                 struct workspace *anim_to;
172         } workspaces;
173
174         struct {
175                 char *path;
176                 int duration;
177                 struct wl_resource *binding;
178                 struct weston_process process;
179                 struct wl_event_source *timer;
180         } screensaver;
181
182         struct {
183                 struct wl_resource *binding;
184                 struct wl_list surfaces;
185         } input_panel;
186
187         struct {
188                 struct weston_view *view;
189                 struct weston_view_animation *animation;
190                 enum fade_type type;
191                 struct wl_event_source *startup_timer;
192         } fade;
193
194         struct exposay exposay;
195
196         uint32_t binding_modifier;
197         uint32_t exposay_modifier;
198         enum animation_type win_animation_type;
199         enum animation_type win_close_animation_type;
200         enum animation_type startup_animation_type;
201         enum animation_type focus_animation_type;
202
203         struct weston_layer minimized_layer;
204
205         struct wl_listener seat_create_listener;
206         struct wl_listener output_create_listener;
207         struct wl_listener output_move_listener;
208         struct wl_list output_list;
209
210         enum desktop_shell_panel_position panel_position;
211
212         char *client;
213
214         struct timespec startup_time;
215 };
216
217 struct weston_output *
218 get_default_output(struct weston_compositor *compositor);
219
220 struct weston_view *
221 get_default_view(struct weston_surface *surface);
222
223 struct shell_surface *
224 get_shell_surface(struct weston_surface *surface);
225
226 struct workspace *
227 get_current_workspace(struct desktop_shell *shell);
228
229 void
230 lower_fullscreen_layer(struct desktop_shell *shell);
231
232 void
233 activate(struct desktop_shell *shell, struct weston_surface *es,
234          struct weston_seat *seat, bool configure);
235
236 void
237 exposay_binding(struct weston_seat *seat,
238                 enum weston_keyboard_modifier modifier,
239                 void *data);
240 int
241 input_panel_setup(struct desktop_shell *shell);
242 void
243 input_panel_destroy(struct desktop_shell *shell);
244
245 typedef void (*shell_for_each_layer_func_t)(struct desktop_shell *,
246                                             struct weston_layer *, void *);
247
248 void
249 shell_for_each_layer(struct desktop_shell *shell,
250                      shell_for_each_layer_func_t func,
251                      void *data);