"Fossies" - the Fresh Open Source Software Archive

Member "xorg-server-1.20.8/hw/xwayland/xwayland.h" (29 Mar 2020, 14868 Bytes) of package /linux/misc/xorg-server-1.20.8.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "xwayland.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.20.7_vs_1.20.8.

    1 /*
    2  * Copyright © 2014 Intel Corporation
    3  *
    4  * Permission to use, copy, modify, distribute, and sell this software
    5  * and its documentation for any purpose is hereby granted without
    6  * fee, provided that the above copyright notice appear in all copies
    7  * and that both that copyright notice and this permission notice
    8  * appear in supporting documentation, and that the name of the
    9  * copyright holders not be used in advertising or publicity
   10  * pertaining to distribution of the software without specific,
   11  * written prior permission.  The copyright holders make no
   12  * representations about the suitability of this software for any
   13  * purpose.  It is provided "as is" without express or implied
   14  * 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
   20  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
   21  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
   22  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
   23  * SOFTWARE.
   24  */
   25 
   26 #ifndef XWAYLAND_H
   27 #define XWAYLAND_H
   28 
   29 #include <xwayland-config.h>
   30 
   31 #include <stdio.h>
   32 #include <unistd.h>
   33 #include <errno.h>
   34 
   35 #include <wayland-client.h>
   36 
   37 #include <X11/X.h>
   38 
   39 #include <fb.h>
   40 #include <input.h>
   41 #include <dix.h>
   42 #include <randrstr.h>
   43 #include <exevents.h>
   44 
   45 #include "relative-pointer-unstable-v1-client-protocol.h"
   46 #include "pointer-constraints-unstable-v1-client-protocol.h"
   47 #include "tablet-unstable-v2-client-protocol.h"
   48 #include "xwayland-keyboard-grab-unstable-v1-client-protocol.h"
   49 #include "xdg-output-unstable-v1-client-protocol.h"
   50 #include "linux-dmabuf-unstable-v1-client-protocol.h"
   51 
   52 struct xwl_format {
   53     uint32_t format;
   54     int num_modifiers;
   55     uint64_t *modifiers;
   56 };
   57 
   58 struct xwl_pixmap;
   59 struct xwl_window;
   60 struct xwl_screen;
   61 
   62 struct xwl_egl_backend {
   63     /* Set by the backend if available */
   64     Bool is_available;
   65 
   66     /* Called once for each interface in the global registry. Backends
   67      * should use this to bind to any wayland interfaces they need.
   68      */
   69     Bool (*init_wl_registry)(struct xwl_screen *xwl_screen,
   70                              struct wl_registry *wl_registry,
   71                              uint32_t id, const char *name,
   72                              uint32_t version);
   73 
   74     /* Check that the required Wayland interfaces are available.
   75      */
   76     Bool (*has_wl_interfaces)(struct xwl_screen *xwl_screen);
   77 
   78     /* Called before glamor has been initialized. Backends should setup a
   79      * valid, glamor compatible EGL context in this hook.
   80      */
   81     Bool (*init_egl)(struct xwl_screen *xwl_screen);
   82 
   83     /* Called after glamor has been initialized, and after all of the
   84      * common Xwayland DDX hooks have been connected. Backends should use
   85      * this to setup any required wraps around X server callbacks like
   86      * CreatePixmap.
   87      */
   88      Bool (*init_screen)(struct xwl_screen *xwl_screen);
   89 
   90      /* Called by Xwayland to retrieve a pointer to a valid wl_buffer for
   91       * the given window/pixmap combo so that damage to the pixmap may be
   92       * displayed on-screen. Backends should use this to create a new
   93       * wl_buffer for a currently buffer-less pixmap, or simply return the
   94       * pixmap they've prepared beforehand.
   95       */
   96      struct wl_buffer *(*get_wl_buffer_for_pixmap)(PixmapPtr pixmap,
   97                                                    Bool *created);
   98 
   99      /* Called by Xwayland to perform any pre-wl_surface damage routines
  100       * that are required by the backend. If your backend is poorly
  101       * designed and lacks the ability to render directly to a surface,
  102       * you should implement blitting from the glamor pixmap to the wayland
  103       * pixmap here. Otherwise, this callback is optional.
  104       */
  105      void (*post_damage)(struct xwl_window *xwl_window,
  106                          PixmapPtr pixmap, RegionPtr region);
  107 
  108      /* Called by Xwayland to confirm with the egl backend that the given
  109       * pixmap is completely setup and ready for display on-screen. This
  110       * callback is optional.
  111       */
  112      Bool (*allow_commits)(struct xwl_window *xwl_window);
  113 };
  114 
  115 struct xwl_screen {
  116     int width;
  117     int height;
  118     int depth;
  119     ScreenPtr screen;
  120     int expecting_event;
  121     enum RootClipMode root_clip_mode;
  122 
  123     int wm_fd;
  124     int listen_fds[5];
  125     int listen_fd_count;
  126     int rootless;
  127     int glamor;
  128     int present;
  129 
  130     CreateScreenResourcesProcPtr CreateScreenResources;
  131     CloseScreenProcPtr CloseScreen;
  132     RealizeWindowProcPtr RealizeWindow;
  133     UnrealizeWindowProcPtr UnrealizeWindow;
  134     DestroyWindowProcPtr DestroyWindow;
  135     XYToWindowProcPtr XYToWindow;
  136     SetWindowPixmapProcPtr SetWindowPixmap;
  137 
  138     struct xorg_list output_list;
  139     struct xorg_list seat_list;
  140     struct xorg_list damage_window_list;
  141 
  142     int wayland_fd;
  143     struct wl_display *display;
  144     struct wl_registry *registry;
  145     struct wl_registry *input_registry;
  146     struct wl_compositor *compositor;
  147     struct zwp_tablet_manager_v2 *tablet_manager;
  148     struct wl_shm *shm;
  149     struct wl_shell *shell;
  150     struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
  151     struct zwp_pointer_constraints_v1 *pointer_constraints;
  152     struct zwp_xwayland_keyboard_grab_manager_v1 *wp_grab;
  153     struct zxdg_output_manager_v1 *xdg_output_manager;
  154     uint32_t serial;
  155 
  156 #define XWL_FORMAT_ARGB8888 (1 << 0)
  157 #define XWL_FORMAT_XRGB8888 (1 << 1)
  158 #define XWL_FORMAT_RGB565   (1 << 2)
  159 
  160     int prepare_read;
  161     int wait_flush;
  162 
  163     uint32_t num_formats;
  164     struct xwl_format *formats;
  165     void *egl_display, *egl_context;
  166 
  167     struct xwl_egl_backend gbm_backend;
  168     struct xwl_egl_backend eglstream_backend;
  169     /* pointer to the current backend for creating pixmaps on wayland */
  170     struct xwl_egl_backend *egl_backend;
  171 
  172     struct glamor_context *glamor_ctx;
  173 
  174     Atom allow_commits_prop;
  175 };
  176 
  177 struct xwl_window {
  178     struct xwl_screen *xwl_screen;
  179     struct wl_surface *surface;
  180     struct wl_shell_surface *shell_surface;
  181     WindowPtr window;
  182     struct xorg_list link_damage;
  183     struct wl_callback *frame_callback;
  184     Bool allow_commits;
  185 #ifdef GLAMOR_HAS_GBM
  186     struct xorg_list frame_callback_list;
  187     Bool present_flipped;
  188 #endif
  189 };
  190 
  191 #ifdef GLAMOR_HAS_GBM
  192 struct xwl_present_window {
  193     struct xwl_screen *xwl_screen;
  194     struct xwl_present_event *sync_flip;
  195     WindowPtr window;
  196     struct xorg_list frame_callback_list;
  197 
  198     uint64_t msc;
  199     uint64_t ust;
  200 
  201     OsTimerPtr frame_timer;
  202 
  203     struct wl_callback *sync_callback;
  204 
  205     struct xorg_list event_list;
  206     struct xorg_list release_queue;
  207 };
  208 
  209 struct xwl_present_event {
  210     uint64_t event_id;
  211     uint64_t target_msc;
  212 
  213     Bool abort;
  214     Bool pending;
  215     Bool buffer_released;
  216 
  217     struct xwl_present_window *xwl_present_window;
  218     struct wl_buffer *buffer;
  219 
  220     struct xorg_list list;
  221 };
  222 #endif
  223 
  224 #define MODIFIER_META 0x01
  225 
  226 struct xwl_touch {
  227     struct xwl_window *window;
  228     int32_t id;
  229     int x, y;
  230     struct xorg_list link_touch;
  231 };
  232 
  233 struct xwl_pointer_warp_emulator {
  234     struct xwl_seat *xwl_seat;
  235     struct xwl_window *locked_window;
  236     struct zwp_locked_pointer_v1 *locked_pointer;
  237 };
  238 
  239 struct xwl_cursor {
  240     void (* update_proc) (struct xwl_cursor *);
  241     struct wl_surface *surface;
  242     struct wl_callback *frame_cb;
  243     Bool needs_update;
  244 };
  245 
  246 struct xwl_seat {
  247     DeviceIntPtr pointer;
  248     DeviceIntPtr relative_pointer;
  249     DeviceIntPtr keyboard;
  250     DeviceIntPtr touch;
  251     DeviceIntPtr stylus;
  252     DeviceIntPtr eraser;
  253     DeviceIntPtr puck;
  254     struct xwl_screen *xwl_screen;
  255     struct wl_seat *seat;
  256     struct wl_pointer *wl_pointer;
  257     struct zwp_relative_pointer_v1 *wp_relative_pointer;
  258     struct wl_keyboard *wl_keyboard;
  259     struct wl_touch *wl_touch;
  260     struct zwp_tablet_seat_v2 *tablet_seat;
  261     struct wl_array keys;
  262     struct xwl_window *focus_window;
  263     struct xwl_window *tablet_focus_window;
  264     uint32_t id;
  265     uint32_t pointer_enter_serial;
  266     struct xorg_list link;
  267     CursorPtr x_cursor;
  268     struct xwl_cursor cursor;
  269     WindowPtr last_xwindow;
  270 
  271     struct xorg_list touches;
  272 
  273     size_t keymap_size;
  274     char *keymap;
  275     struct wl_surface *keyboard_focus;
  276 
  277     struct xorg_list axis_discrete_pending;
  278     struct xorg_list sync_pending;
  279 
  280     struct xwl_pointer_warp_emulator *pointer_warp_emulator;
  281 
  282     struct xwl_window *cursor_confinement_window;
  283     struct zwp_confined_pointer_v1 *confined_pointer;
  284 
  285     struct {
  286         Bool has_absolute;
  287         wl_fixed_t x;
  288         wl_fixed_t y;
  289 
  290         Bool has_relative;
  291         double dx;
  292         double dy;
  293         double dx_unaccel;
  294         double dy_unaccel;
  295     } pending_pointer_event;
  296 
  297     struct xorg_list tablets;
  298     struct xorg_list tablet_tools;
  299     struct xorg_list tablet_pads;
  300     struct zwp_xwayland_keyboard_grab_v1 *keyboard_grab;
  301 };
  302 
  303 struct xwl_tablet {
  304     struct xorg_list link;
  305     struct zwp_tablet_v2 *tablet;
  306     struct xwl_seat *seat;
  307 };
  308 
  309 struct xwl_tablet_tool {
  310     struct xorg_list link;
  311     struct zwp_tablet_tool_v2 *tool;
  312     struct xwl_seat *seat;
  313 
  314     DeviceIntPtr xdevice;
  315     uint32_t proximity_in_serial;
  316     double x;
  317     double y;
  318     uint32_t pressure;
  319     double tilt_x;
  320     double tilt_y;
  321     double rotation;
  322     double slider;
  323 
  324     uint32_t buttons_now,
  325              buttons_prev;
  326 
  327     int32_t wheel_clicks;
  328 
  329     struct xwl_cursor cursor;
  330 };
  331 
  332 struct xwl_tablet_pad_ring {
  333     unsigned int index;
  334     struct xorg_list link;
  335     struct xwl_tablet_pad_group *group;
  336     struct zwp_tablet_pad_ring_v2 *ring;
  337 };
  338 
  339 struct xwl_tablet_pad_strip {
  340     unsigned int index;
  341     struct xorg_list link;
  342     struct xwl_tablet_pad_group *group;
  343     struct zwp_tablet_pad_strip_v2 *strip;
  344 };
  345 
  346 struct xwl_tablet_pad_group {
  347     struct xorg_list link;
  348     struct xwl_tablet_pad *pad;
  349     struct zwp_tablet_pad_group_v2 *group;
  350 
  351     struct xorg_list pad_group_ring_list;
  352     struct xorg_list pad_group_strip_list;
  353 };
  354 
  355 struct xwl_tablet_pad {
  356     struct xorg_list link;
  357     struct zwp_tablet_pad_v2 *pad;
  358     struct xwl_seat *seat;
  359 
  360     DeviceIntPtr xdevice;
  361 
  362     unsigned int nbuttons;
  363     struct xorg_list pad_group_list;
  364 };
  365 
  366 struct xwl_output {
  367     struct xorg_list link;
  368     struct wl_output *output;
  369     struct zxdg_output_v1 *xdg_output;
  370     uint32_t server_output_id;
  371     struct xwl_screen *xwl_screen;
  372     RROutputPtr randr_output;
  373     RRCrtcPtr randr_crtc;
  374     int32_t x, y, width, height, refresh;
  375     Rotation rotation;
  376     Bool wl_output_done;
  377     Bool xdg_output_done;
  378 };
  379 
  380 void xwl_window_create_frame_callback(struct xwl_window *xwl_window);
  381 
  382 void xwl_sync_events (struct xwl_screen *xwl_screen);
  383 
  384 Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen);
  385 
  386 struct xwl_screen *xwl_screen_get(ScreenPtr screen);
  387 
  388 void xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *tool);
  389 void xwl_seat_set_cursor(struct xwl_seat *xwl_seat);
  390 
  391 void xwl_seat_destroy(struct xwl_seat *xwl_seat);
  392 
  393 void xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window);
  394 
  395 void xwl_seat_emulate_pointer_warp(struct xwl_seat *xwl_seat,
  396                                    struct xwl_window *xwl_window,
  397                                    SpritePtr sprite,
  398                                    int x, int y);
  399 
  400 void xwl_seat_destroy_pointer_warp_emulator(struct xwl_seat *xwl_seat);
  401 
  402 void xwl_seat_cursor_visibility_changed(struct xwl_seat *xwl_seat);
  403 
  404 void xwl_seat_confine_pointer(struct xwl_seat *xwl_seat,
  405                               struct xwl_window *xwl_window);
  406 void xwl_seat_unconfine_pointer(struct xwl_seat *xwl_seat);
  407 
  408 Bool xwl_screen_init_output(struct xwl_screen *xwl_screen);
  409 
  410 struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen,
  411                                      uint32_t id);
  412 
  413 void xwl_output_destroy(struct xwl_output *xwl_output);
  414 
  415 void xwl_output_remove(struct xwl_output *xwl_output);
  416 
  417 RRModePtr xwayland_cvt(int HDisplay, int VDisplay,
  418                        float VRefresh, Bool Reduced, Bool Interlaced);
  419 
  420 void xwl_pixmap_set_private(PixmapPtr pixmap, struct xwl_pixmap *xwl_pixmap);
  421 struct xwl_pixmap *xwl_pixmap_get(PixmapPtr pixmap);
  422 
  423 struct xwl_window *xwl_window_from_window(WindowPtr window);
  424 
  425 Bool xwl_shm_create_screen_resources(ScreenPtr screen);
  426 PixmapPtr xwl_shm_create_pixmap(ScreenPtr screen, int width, int height,
  427                                 int depth, unsigned int hint);
  428 Bool xwl_shm_destroy_pixmap(PixmapPtr pixmap);
  429 struct wl_buffer *xwl_shm_pixmap_get_wl_buffer(PixmapPtr pixmap);
  430 
  431 #ifdef XWL_HAS_GLAMOR
  432 void xwl_glamor_init_backends(struct xwl_screen *xwl_screen,
  433                               Bool use_eglstream);
  434 void xwl_glamor_select_backend(struct xwl_screen *xwl_screen,
  435                                Bool use_eglstream);
  436 Bool xwl_glamor_init(struct xwl_screen *xwl_screen);
  437 
  438 Bool xwl_screen_set_drm_interface(struct xwl_screen *xwl_screen,
  439                                   uint32_t id, uint32_t version);
  440 Bool xwl_screen_set_dmabuf_interface(struct xwl_screen *xwl_screen,
  441                                      uint32_t id, uint32_t version);
  442 struct wl_buffer *xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap,
  443                                                   Bool *created);
  444 void xwl_glamor_init_wl_registry(struct xwl_screen *xwl_screen,
  445                                  struct wl_registry *registry,
  446                                  uint32_t id, const char *interface,
  447                                  uint32_t version);
  448 Bool xwl_glamor_has_wl_interfaces(struct xwl_screen *xwl_screen,
  449                                  struct xwl_egl_backend *xwl_egl_backend);
  450 void xwl_glamor_post_damage(struct xwl_window *xwl_window,
  451                             PixmapPtr pixmap, RegionPtr region);
  452 Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window);
  453 void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
  454 
  455 #ifdef GLAMOR_HAS_GBM
  456 void xwl_present_frame_callback(struct xwl_present_window *xwl_present_window);
  457 Bool xwl_present_init(ScreenPtr screen);
  458 void xwl_present_cleanup(WindowPtr window);
  459 void xwl_present_unrealize_window(struct xwl_present_window *xwl_present_window);
  460 #endif /* GLAMOR_HAS_GBM */
  461 
  462 #ifdef XV
  463 /* glamor Xv Adaptor */
  464 Bool xwl_glamor_xv_init(ScreenPtr pScreen);
  465 #endif /* XV */
  466 
  467 #endif /* XWL_HAS_GLAMOR */
  468 
  469 void xwl_screen_release_tablet_manager(struct xwl_screen *xwl_screen);
  470 
  471 void xwl_screen_init_xdg_output(struct xwl_screen *xwl_screen);
  472 
  473 #ifdef XF86VIDMODE
  474 void xwlVidModeExtensionInit(void);
  475 #endif
  476 
  477 #ifdef GLAMOR_HAS_GBM
  478 void xwl_glamor_init_gbm(struct xwl_screen *xwl_screen);
  479 #else
  480 static inline void xwl_glamor_init_gbm(struct xwl_screen *xwl_screen)
  481 {
  482 }
  483 #endif
  484 
  485 #ifdef XWL_HAS_EGLSTREAM
  486 void xwl_glamor_init_eglstream(struct xwl_screen *xwl_screen);
  487 #else
  488 static inline void xwl_glamor_init_eglstream(struct xwl_screen *xwl_screen)
  489 {
  490 }
  491 #endif
  492 
  493 #endif