diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-03-04 15:40:29 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-03-04 15:41:00 +0100 |
| commit | 3718effc431f5622a23c55b254153efdfe4e72c4 (patch) | |
| tree | d8a805870c6a3785022e2f52f0c3715410e29a37 /libdecor/src/libdecor-fallback.c | |
| parent | a773fdc44bfb818f1830e9e48ba765881e68c942 (diff) | |
Add the Wayland platform to FLTK 1.4
Diffstat (limited to 'libdecor/src/libdecor-fallback.c')
| -rw-r--r-- | libdecor/src/libdecor-fallback.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/libdecor/src/libdecor-fallback.c b/libdecor/src/libdecor-fallback.c new file mode 100644 index 000000000..c281197c2 --- /dev/null +++ b/libdecor/src/libdecor-fallback.c @@ -0,0 +1,209 @@ +/* + * Copyright © 2019 Jonas Ådahl + * + * 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 "config.h" + +#include "libdecor-fallback.h" + +#include <poll.h> +#include <errno.h> + +#include "utils.h" + +struct libdecor_plugin_fallback { + struct libdecor_plugin plugin; + struct libdecor *context; +}; + +static void +libdecor_plugin_fallback_destroy(struct libdecor_plugin *plugin) +{ + libdecor_plugin_release(plugin); + free(plugin); +} + +static int +libdecor_plugin_fallback_get_fd(struct libdecor_plugin *plugin) +{ + struct libdecor_plugin_fallback *plugin_fallback = + (struct libdecor_plugin_fallback *) plugin; + struct wl_display *wl_display = + libdecor_get_wl_display(plugin_fallback->context); + + return wl_display_get_fd(wl_display); +} + +static int +libdecor_plugin_fallback_dispatch(struct libdecor_plugin *plugin, + int timeout) +{ + struct libdecor_plugin_fallback *plugin_fallback = + (struct libdecor_plugin_fallback *) plugin; + struct wl_display *wl_display = + libdecor_get_wl_display(plugin_fallback->context); + struct pollfd fds[1]; + int ret; + int dispatch_count = 0; + + while (wl_display_prepare_read(wl_display) != 0) + dispatch_count += wl_display_dispatch_pending(wl_display); + + if (wl_display_flush(wl_display) < 0 && + errno != EAGAIN) { + wl_display_cancel_read(wl_display); + return -errno; + } + + fds[0] = (struct pollfd) { wl_display_get_fd(wl_display), POLLIN }; + + ret = poll(fds, ARRAY_SIZE (fds), timeout); + if (ret > 0) { + if (fds[0].revents & POLLIN) { + wl_display_read_events(wl_display); + dispatch_count += wl_display_dispatch_pending(wl_display); + return dispatch_count; + } else { + wl_display_cancel_read(wl_display); + return dispatch_count; + } + } else if (ret == 0) { + wl_display_cancel_read(wl_display); + return dispatch_count; + } else { + wl_display_cancel_read(wl_display); + return -errno; + } +} + +static struct libdecor_frame * +libdecor_plugin_fallback_frame_new(struct libdecor_plugin *plugin) +{ + struct libdecor_frame *frame; + + frame = zalloc(sizeof *frame); + + return frame; +} + +static void +libdecor_plugin_fallback_frame_free(struct libdecor_plugin *plugin, + struct libdecor_frame *frame) +{ +} + +static void +libdecor_plugin_fallback_frame_commit(struct libdecor_plugin *plugin, + struct libdecor_frame *frame, + struct libdecor_state *state, + struct libdecor_configuration *configuration) +{ +} + +static void +libdecor_plugin_fallback_frame_property_changed(struct libdecor_plugin *plugin, + struct libdecor_frame *frame) +{ +} + +static void +libdecor_plugin_fallback_frame_translate_coordinate(struct libdecor_plugin *plugin, + struct libdecor_frame *frame, + int content_x, + int content_y, + int *frame_x, + int *frame_y) +{ + *frame_x = content_x; + *frame_y = content_y; +} + +static void +libdecor_plugin_fallback_frame_popup_grab(struct libdecor_plugin *plugin, + struct libdecor_frame *frame, + const char *seat_name) +{ +} + +static void +libdecor_plugin_fallback_frame_popup_ungrab(struct libdecor_plugin *plugin, + struct libdecor_frame *frame, + const char *seat_name) +{ +} + +static bool +libdecor_plugin_fallback_configuration_get_content_size(struct libdecor_plugin *plugin, + struct libdecor_configuration *configuration, + struct libdecor_frame *frame, + int *content_width, + int *content_height) +{ + return libdecor_configuration_get_window_size(configuration, + content_width, + content_height); +} + +static bool +libdecor_plugin_fallback_frame_get_window_size_for( + struct libdecor_plugin *plugin, + struct libdecor_frame *frame, + struct libdecor_state *state, + int *window_width, + int *window_height) +{ + *window_width = libdecor_state_get_content_width (state); + *window_height = libdecor_state_get_content_height (state); + return true; +} + +static struct libdecor_plugin_interface fallback_plugin_iface = { + .destroy = libdecor_plugin_fallback_destroy, + .get_fd = libdecor_plugin_fallback_get_fd, + .dispatch = libdecor_plugin_fallback_dispatch, + .frame_new = libdecor_plugin_fallback_frame_new, + .frame_free = libdecor_plugin_fallback_frame_free, + .frame_commit = libdecor_plugin_fallback_frame_commit, + .frame_property_changed = libdecor_plugin_fallback_frame_property_changed, + .frame_translate_coordinate = + libdecor_plugin_fallback_frame_translate_coordinate, + .frame_popup_grab = libdecor_plugin_fallback_frame_popup_grab, + .frame_popup_ungrab = libdecor_plugin_fallback_frame_popup_ungrab, + .configuration_get_content_size = libdecor_plugin_fallback_configuration_get_content_size, + .frame_get_window_size_for = libdecor_plugin_fallback_frame_get_window_size_for, +}; + +struct libdecor_plugin * +libdecor_fallback_plugin_new(struct libdecor *context) +{ + struct libdecor_plugin_fallback *plugin; + + plugin = zalloc(sizeof *plugin); + libdecor_plugin_init(&plugin->plugin, context, &fallback_plugin_iface); + plugin->context = context; + + libdecor_notify_plugin_ready(context); + + return &plugin->plugin; +} |
