protocol, grpc-proxy: Add support for set_app_float
[src/agl-compositor.git] / src / ivi-compositor.h
1 /*
2  * Copyright © 2019 Collabora, Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the
13  * next paragraph) shall be included in all copies or substantial
14  * portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25
26 #ifndef IVI_COMPOSITOR_H
27 #define IVI_COMPOSITOR_H
28
29 #include <stdbool.h>
30 #include "config.h"
31
32 #include <libweston/backend-drm.h>
33 #include <libweston/libweston.h>
34 #include <libweston/windowed-output-api.h>
35 #include <libweston-desktop/libweston-desktop.h>
36
37 #include "remote.h"
38
39 #include "agl-shell-server-protocol.h"
40
41 struct ivi_compositor;
42
43 struct desktop_client {
44         struct wl_resource *resource;
45         struct ivi_compositor *ivi;
46         struct wl_list link;    /* ivi_compositor::desktop_clients */
47 };
48
49 enum agl_shell_bound_status {
50         BOUND_OK,
51         BOUND_FAILED,
52 };
53
54 struct ivi_compositor {
55         struct weston_compositor *compositor;
56         struct weston_config *config;
57
58         struct wl_listener heads_changed;
59
60         bool init_failed;
61         bool disable_cursor;
62         bool activate_by_default;
63         bool keep_pending_surfaces;
64
65         /*
66          * Options parsed from command line arugments.
67          * Overrides what is found in the config file.
68          */
69         struct {
70                 /* drm */
71                 bool use_current_mode;
72                 /* wayland/x11 */
73                 int width;
74                 int height;
75                 int scale;
76         } cmdline;
77         const struct weston_windowed_output_api *window_api;
78         const struct weston_drm_output_api *drm_api;
79         const struct weston_remoting_api *remoting_api;
80         const struct weston_transmitter_api *waltham_transmitter_api;
81
82         struct wl_global *agl_shell;
83         struct wl_global *agl_shell_desktop;
84         struct wl_global *agl_shell_ext;
85
86         struct {
87                 struct wl_client *client;
88                 struct wl_resource *resource;
89
90                 /* this is for another agl-shell client, potentially used by
91                  * the grpc-proxy */
92                 struct wl_resource *resource_ext;
93                 bool ready;
94                 enum agl_shell_bound_status status;
95         } shell_client;
96
97         struct {
98                 struct wl_client *client;
99                 struct wl_resource *resource;
100                 bool doas_requested;
101                 enum agl_shell_bound_status status;
102         } shell_client_ext;
103
104         struct wl_list desktop_clients; /* desktop_client::link */
105
106         struct wl_list outputs; /* ivi_output.link */
107         struct wl_list saved_outputs; /* ivi_output.link */
108         struct wl_list surfaces; /* ivi_surface.link */
109
110         struct weston_desktop *desktop;
111         struct wl_listener seat_created_listener;
112         struct ivi_policy *policy;
113
114         struct wl_list pending_surfaces;
115         struct wl_list popup_pending_apps;
116         struct wl_list fullscreen_pending_apps;
117         struct wl_list split_pending_apps;
118         struct wl_list remote_pending_apps;
119
120         struct wl_listener destroy_listener;
121
122         struct weston_layer hidden;
123         struct weston_layer background;
124         struct weston_layer normal;
125         struct weston_layer panel;
126         struct weston_layer popup;
127         struct weston_layer fullscreen;
128
129         bool need_ivi_output_relayout;
130         struct wl_list child_process_list;
131 };
132
133 struct ivi_surface;
134
135 enum ivi_output_type {
136         OUTPUT_LOCAL,
137         OUTPUT_REMOTE,
138         /* same as remote but we need to signal the transmitter plug-in
139          * for the surfaces to have to be forwarded to those remoted outputs */
140         OUTPUT_WALTHAM,
141 };
142
143 struct ivi_output {
144         struct wl_list link; /* ivi_compositor.outputs */
145         struct ivi_compositor *ivi;
146
147         char *name;
148         struct weston_config_section *config;
149         struct weston_output *output;
150
151         struct ivi_surface *background;
152         /* Panels */
153         struct ivi_surface *top;
154         struct ivi_surface *bottom;
155         struct ivi_surface *left;
156         struct ivi_surface *right;
157
158         /* for the black surface */
159         struct fullscreen_view {
160                 struct ivi_surface *fs;
161                 struct wl_listener fs_destroy;
162         } fullscreen_view;
163
164         struct wl_listener output_destroy;
165
166         /*
167          * Usable area for normal clients, i.e. with panels removed.
168          * In output-coorrdinate space.
169          */
170         struct weston_geometry area;
171         struct weston_geometry area_saved;
172         /*
173          * Potential user-specified non-default activation area
174          */
175         struct weston_geometry area_activation;
176
177         struct ivi_surface *active;
178         struct ivi_surface *previous_active;
179
180         /* Temporary: only used during configuration */
181         size_t add_len;
182         struct weston_head *add[8];
183
184         char *app_ids;
185         enum ivi_output_type type;
186 };
187
188 enum ivi_surface_role {
189         IVI_SURFACE_ROLE_NONE,
190         IVI_SURFACE_ROLE_DESKTOP,
191         IVI_SURFACE_ROLE_BACKGROUND,
192         IVI_SURFACE_ROLE_PANEL,
193         IVI_SURFACE_ROLE_POPUP,
194         IVI_SURFACE_ROLE_FULLSCREEN,
195         IVI_SURFACE_ROLE_SPLIT_V,
196         IVI_SURFACE_ROLE_SPLIT_H,
197         IVI_SURFACE_ROLE_REMOTE,
198 };
199
200 struct ivi_bounding_box {
201         int x; int y;
202         int width; int height;
203 };
204
205 struct pending_popup {
206         struct ivi_output *ioutput;
207         char *app_id;
208         int x; int y;
209         struct ivi_bounding_box bb;
210
211         struct wl_list link;    /** ivi_compositor::popup_pending_surfaces */
212 };
213
214 struct pending_fullscreen {
215         struct ivi_output *ioutput;
216         char *app_id;
217         struct wl_list link;    /** ivi_compositor::fullscreen_pending_apps */
218 };
219
220 struct pending_split {
221         struct ivi_output *ioutput;
222         char *app_id;
223         uint32_t orientation;
224         struct wl_list link;    /** ivi_compositor::split_pending_apps */
225 };
226
227 struct pending_remote {
228         struct ivi_output *ioutput;
229         char *app_id;
230         struct wl_list link;    /** ivi_compositor::remote_pending_apps */
231 };
232
233 struct ivi_desktop_surface {
234         struct ivi_output *pending_output;
235         struct ivi_output *last_output;
236 };
237
238 struct ivi_background_surface {
239         struct ivi_output *output;
240 };
241
242 struct ivi_popup_surface {
243         struct ivi_output *output;
244         int x; int y; /* initial position */
245         struct ivi_bounding_box bb;     /* bounding box */
246 };
247
248 struct ivi_fullscreen_surface {
249         struct ivi_output *output;
250 };
251
252 struct ivi_split_surface {
253         struct ivi_output *output;
254         uint32_t orientation;
255 };
256
257 struct ivi_remote_surface {
258         struct ivi_output *output;
259 };
260
261 struct ivi_panel_surface {
262         struct ivi_output *output;
263         enum agl_shell_edge edge;
264 };
265
266 enum ivi_surface_flags {
267         IVI_SURFACE_PROP_MAP = (1 << 0),
268         /* x, y, width, height */
269         IVI_SURFACE_PROP_POSITION = (1 << 1),
270 };
271
272 /* the waltham surface is a pointer type as well and
273  * in order to avoid adding ifdef for waltham use a
274  * generic pointer, which will be only be valid when the
275  * surface is a remote out on a waltham type of output */
276 struct ivi_surface_waltham {
277         void *transmitter_surface;
278 };
279
280 struct ivi_surface {
281         struct ivi_compositor *ivi;
282         struct weston_desktop_surface *dsurface;
283         struct weston_view *view;
284         struct ivi_output *hidden_layer_output;
285         struct ivi_output *current_completed_output;
286
287         struct wl_list link;
288         int focus_count;
289
290         struct {
291                 enum ivi_surface_flags flags;
292                 int32_t x, y;
293                 int32_t width, height;
294         } pending;
295         bool mapped;
296         bool advertised_on_launch;
297         bool checked_pending;
298         enum {
299                 NORMAL,
300                 RESIZING,
301                 FULLSCREEN,
302                 HIDDEN,
303         } state;
304
305         enum ivi_surface_role role;
306         union {
307                 struct ivi_desktop_surface desktop;
308                 struct ivi_background_surface bg;
309                 struct ivi_panel_surface panel;
310                 struct ivi_popup_surface popup;
311                 struct ivi_fullscreen_surface fullscreen;
312                 struct ivi_split_surface split;
313                 struct ivi_remote_surface remote;
314         };
315
316         struct ivi_surface_waltham waltham_surface;
317         struct wl_listener listener_advertise_app;
318         struct wl_signal signal_advertise_app;
319 };
320
321 struct ivi_shell_seat {
322         struct weston_seat *seat;
323         struct weston_surface *focused_surface;
324
325         bool disable_cursor;
326         bool new_caps_sent;
327
328         struct wl_listener seat_destroy_listener;
329         struct wl_listener caps_changed_listener;
330         struct wl_listener keyboard_focus_listener;
331         struct wl_listener pointer_focus_listener;
332 };
333
334 struct ivi_shell_client {
335         struct wl_list link;
336         char *command;
337         bool require_ready;
338
339         pid_t pid;
340         struct wl_client *client;
341
342         struct wl_listener client_destroy;
343 };
344
345 struct ivi_compositor *
346 to_ivi_compositor(struct weston_compositor *ec);
347
348 #ifdef HAVE_SYSTEMD
349 int
350 ivi_agl_systemd_notify(struct ivi_compositor *ivi);
351 #else
352 static int
353 ivi_agl_systemd_notify(struct ivi_compositor *ivi)
354 {
355 }
356 #endif
357
358 int
359 ivi_shell_init(struct ivi_compositor *ivi);
360
361 void
362 ivi_shell_init_black_fs(struct ivi_compositor *ivi);
363
364 int
365 ivi_shell_create_global(struct ivi_compositor *ivi);
366
367 int
368 ivi_launch_shell_client(struct ivi_compositor *ivi, const char *cmd_section, struct wl_client **client);
369
370 int
371 ivi_desktop_init(struct ivi_compositor *ivi);
372
373 struct ivi_shell_client *
374 ivi_shell_client_from_wl(struct wl_client *client);
375
376 struct ivi_output *
377 to_ivi_output(struct weston_output *o);
378
379 void
380 ivi_set_desktop_surface(struct ivi_surface *surface);
381
382 /*
383  * removes the pending popup one
384  */
385 void
386 ivi_check_pending_desktop_surface(struct ivi_surface *surface);
387
388 void
389 ivi_reflow_outputs(struct ivi_compositor *ivi);
390
391 struct ivi_surface *
392 to_ivi_surface(struct weston_surface *surface);
393
394 void
395 ivi_layout_set_mapped(struct ivi_surface *surface);
396
397 void
398 ivi_layout_set_position(struct ivi_surface *surface,
399                         int32_t x, int32_t y,
400                         int32_t width, int32_t height);
401
402 struct ivi_surface *
403 ivi_find_app(struct ivi_compositor *ivi, const char *app_id);
404
405 void
406 ivi_layout_commit(struct ivi_compositor *ivi);
407
408 void
409 ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output);
410
411 void
412 ivi_layout_activate(struct ivi_output *output, const char *app_id);
413
414 void
415 ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf);
416
417 void
418 ivi_layout_desktop_committed(struct ivi_surface *surf);
419
420 void
421 ivi_layout_popup_committed(struct ivi_surface *surface);
422
423 void
424 ivi_layout_fullscreen_committed(struct ivi_surface *surface);
425
426 void
427 ivi_layout_split_committed(struct ivi_surface *surface);
428
429 void
430 ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id);
431
432 void
433 ivi_layout_desktop_resize(struct ivi_surface *surface,
434                           struct weston_geometry area);
435
436 struct ivi_output *
437 ivi_layout_get_output_from_surface(struct ivi_surface *surf);
438
439 void
440 insert_black_curtain(struct ivi_output *output);
441
442 void
443 remove_black_curtain(struct ivi_output *output);
444
445 bool
446 output_has_black_curtain(struct ivi_output *output);
447
448 const char *
449 ivi_layout_get_surface_role_name(struct ivi_surface *surf);
450
451 void
452 ivi_set_pending_desktop_surface_remote(struct ivi_output *ioutput,
453                 const char *app_id);
454
455 struct ivi_output *
456 ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi);
457
458 void
459 shell_advertise_app_state(struct ivi_compositor *ivi, const char *app_id,
460                           const char *data, uint32_t app_state);
461 void
462 ivi_screenshooter_create(struct ivi_compositor *ivi);
463
464 void
465 ivi_seat_init(struct ivi_compositor *ivi);
466
467 void
468 ivi_seat_reset_caps_sent(struct ivi_compositor *ivi);
469
470 void
471 agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi,
472                                            struct ivi_surface *surface);
473 void
474 ivi_destroy_waltham_destroy(struct ivi_surface *surface);
475
476 void
477 ivi_check_pending_surface_desktop(struct ivi_surface *surface,
478                                   enum ivi_surface_role *role);
479
480 struct ivi_output *
481 ivi_layout_find_bg_output(struct ivi_compositor *ivi);
482 void
483 ivi_compositor_destroy_pending_surfaces(struct ivi_compositor *ivi);
484
485 void
486 ivi_shell_finalize(struct ivi_compositor *ivi);
487
488 struct ivi_surface *
489 get_ivi_shell_surface(struct weston_surface *surface);
490
491 struct ivi_shell_seat *
492 get_ivi_shell_seat(struct weston_seat *seat);
493
494 struct weston_seat *
495 get_ivi_shell_weston_first_seat(struct ivi_compositor *ivi);
496
497 void
498 ivi_shell_activate_surface(struct ivi_surface *ivi_surf,
499                           struct ivi_shell_seat *ivi_seat,
500                           uint32_t flags);
501 int
502 sigchld_handler(int signal_number, void *data);
503
504 void
505 shell_send_app_state(struct ivi_compositor *ivi, const char *app_id,
506                      enum agl_shell_app_state state);
507 void
508 ivi_layout_destroy_saved_outputs(struct ivi_compositor *ivi);
509
510 struct weston_output *
511 get_default_output(struct weston_compositor *compositor);
512
513 struct weston_output *
514 get_focused_output(struct weston_compositor *compositor);
515
516 #endif