From 02adfc056026ac8a56622fe2c0f2261543a99758 Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Thu, 16 Feb 2023 08:06:16 +0100 Subject: [PATCH] Wayland: remove libdecor/demo/* from FLTK source tree --- configure.ac | 3 - documentation/src/bundled-libs.dox | 5 +- libdecor/build/Makefile | 13 +- libdecor/demo/demo.c | 1328 ---------------------------- libdecor/demo/egl.c | 356 -------- makeinclude.in | 3 +- 6 files changed, 4 insertions(+), 1704 deletions(-) delete mode 100644 libdecor/demo/demo.c delete mode 100644 libdecor/demo/egl.c diff --git a/configure.ac b/configure.ac index cf7c8837e..292829ceb 100644 --- a/configure.ac +++ b/configure.ac @@ -259,7 +259,6 @@ AC_SUBST(FLTKCAIROOPTION) AC_SUBST(FLLIBNAME) AC_SUBST(GLDEMOS) -AC_SUBST(GLWLDEMO) AC_SUBST(GLLIBNAME) AC_SUBST(IMGLIBNAME) AC_SUBST(CAIROLIBNAME) @@ -1068,13 +1067,11 @@ AS_CASE([$host_os_gui], [cygwin* | mingw*], [ ]) AC_CHECK_LIB([GL], [glXGetProcAddressARB], [AC_DEFINE([HAVE_GLXGETPROCADDRESSARB]) ],, [-lm]) - GLWLDEMO="egl" ], [ LINKFLTKGL="" GLLIBNAME="" GLDSONAME="" GLDEMOS="" - GLWLDEMO="" ]) dnl Check for GTK-3 ... diff --git a/documentation/src/bundled-libs.dox b/documentation/src/bundled-libs.dox index 90fce6507..a4cbeb069 100644 --- a/documentation/src/bundled-libs.dox +++ b/documentation/src/bundled-libs.dox @@ -357,14 +357,11 @@ Run `make depend' in the jpeg folder on a Linux system after This part of the libdecor source tree is copied to directory libdecor/ of the FLTK source tree:
-    demo/
-      demo.c
-      egl.c
     LICENSE
     README.md
     src/    ... and files below except meson.build files
 
Furthermore, directory libdecor/build/ of the FLTK source tree does not originate from the libdecor source tree but contains 3 FLTK-created files. - + File build/Makefile may need changes if a libdecor update adds or renames source files. */ diff --git a/libdecor/build/Makefile b/libdecor/build/Makefile index dfbd20de7..f25f84168 100644 --- a/libdecor/build/Makefile +++ b/libdecor/build/Makefile @@ -1,7 +1,7 @@ # # Library Makefile for the Fast Light Tool Kit (FLTK). # -# Copyright 2022 by Bill Spitzak and others. +# Copyright 2022-2023 by Bill Spitzak and others. # # This library is free software. Distribution and use rights are outlined in # the file "COPYING" which should have been included with this file. If this @@ -38,7 +38,6 @@ Linux_NOPIE = -no-pie FreeBSD_NOPIE = NOPIE = ${${UNAME}_NOPIE} -# Don't build libdecor demo programs automatically: demo $(GLWLDEMO) all : $(OBJECTS) depend: @@ -81,18 +80,10 @@ cursor-settings.o : ../src/cursor-settings.c $(PROTOCOLS)/unstable/text-input/text-input-unstable-v3.xml \ ../../src/text-input-client-protocol.h -demo : ../demo/demo.c $(OBJECTS) - $(CC) -o demo ../demo/demo.c -D_GNU_SOURCE -I../.. -I../src -I. -I../../src $(EXTRA_DECOR) $(OBJECTS) $(LDLIBS) -lm -rdynamic $(NOPIE) -Wl,--defsym=fl_libdecor_using_weston=0 - -egl : ../demo/egl.c $(OBJECTS) - $(CC) -o egl ../demo/egl.c -D_GNU_SOURCE -I../.. -I../src -I. -I../../src $(EXTRA_DECOR) $(OBJECTS) $(GLDLIBS) -lm -rdynamic $(NOPIE) -Wl,--defsym=fl_libdecor_using_weston=0 - - install: echo "Nothing to install" uninstall: clean: - $(RM) *.o ../../src/xdg-*.c ../../src/xdg-*.h ../../src/xdg-*.o ../../src/text-input-* demo egl - rm -r -f linux + $(RM) *.o ../../src/xdg-*.c ../../src/xdg-*.h ../../src/xdg-*.o ../../src/text-input-* diff --git a/libdecor/demo/demo.c b/libdecor/demo/demo.c deleted file mode 100644 index 26d955c18..000000000 --- a/libdecor/demo/demo.c +++ /dev/null @@ -1,1328 +0,0 @@ -/* - * Copyright © 2011 Benjamin Franzke - * Copyright © 2010 Intel Corporation - * Copyright © 2018 Jonas Ådahl - * Copyright © 2019 Christian Rauch - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libdecor.h" -#include "utils.h" -#include "cursor-settings.h" -#include "os-compatibility.h" - -#include "xdg-shell-client-protocol.h" - -struct window; - -static const size_t chk = 16; -static const int DEFAULT_WIDTH = 30*chk; -static const int DEFAULT_HEIGHT = 20*chk; - -static const int POPUP_WIDTH = 100; -static const int POPUP_HEIGHT = 300; - -static const char *proxy_tag = "libdecor-demo"; - -static const char *titles[] = { - "Hello!", - "Hallå!", - "Привет!", - "Γειά σου!", - "שלום!", - "你好!", - "สวัสดี!", - "こんにちは!", - "👻❤️🤖➕🍰", -}; - -static const size_t N_TITLES = ARRAY_SIZE(titles); - - -static bool -own_proxy(struct wl_proxy *proxy) -{ - return (wl_proxy_get_tag(proxy) == &proxy_tag); -} - -static bool -own_output(struct wl_output *output) -{ - return own_proxy((struct wl_proxy *) output); -} - -struct buffer { - struct wl_buffer *wl_buffer; - void *data; - size_t data_size; -}; - -struct popup { - struct wl_surface *wl_surface; - struct xdg_surface *xdg_surface; - struct xdg_popup *xdg_popup; - struct xdg_surface *parent; - struct seat *seat; - struct window *window; -}; - -struct window { - struct wl_surface *wl_surface; - struct buffer *buffer; - struct libdecor_frame *frame; - int content_width; - int content_height; - int configured_width; - int configured_height; - int floating_width; - int floating_height; - enum libdecor_window_state window_state; - struct wl_list outputs; - int scale; - struct popup *popup; - size_t title_index; -}; - -struct seat { - struct wl_seat *wl_seat; - struct wl_keyboard *wl_keyboard; - struct wl_pointer *wl_pointer; - struct wl_list link; - struct wl_list pointer_outputs; - struct wl_cursor_theme *cursor_theme; - struct wl_cursor *left_ptr_cursor; - struct wl_surface *cursor_surface; - struct wl_surface *pointer_focus; - int pointer_scale; - uint32_t serial; - wl_fixed_t pointer_sx; - wl_fixed_t pointer_sy; - char *name; - - struct xkb_context *xkb_context; - struct xkb_state *xkb_state; -}; - -struct output { - uint32_t id; - struct wl_output *wl_output; - int scale; - struct wl_list link; -}; - -struct window_output { - struct output* output; - struct wl_list link; -}; - -struct pointer_output { - struct output* output; - struct wl_list link; -}; - -static struct wl_compositor *wl_compositor; -static struct wl_shm *wl_shm; -static struct xdg_wm_base *xdg_wm_base; -static struct wl_list seats; -static struct wl_list outputs; - -static bool has_xrgb = false; - -static struct window *window; - -static void -redraw(struct window *window); - -static void -constrain_content_size(const struct libdecor_frame *frame, - int *width, - int *height) -{ - int min_width, min_height, max_width, max_height; - - libdecor_frame_get_min_content_size(frame, &min_width, &min_height); - libdecor_frame_get_max_content_size(frame, &max_width, &max_height); - - if (min_width > 0) - *width = MAX(min_width, *width); - if (max_width > 0) - *width = MIN(*width, max_width); - - if (min_height > 0) - *height = MAX(min_height, *height); - if (max_height > 0) - *height = MIN(*height, max_height); -} - -static void -resize(struct window *window, int width, int height) -{ - struct libdecor_state *state; - - if (!libdecor_frame_is_floating(window->frame)) { - printf("... ignoring in non-floating mode\n"); - return; - } - - constrain_content_size(window->frame, &width, &height); - - /* commit changes to decorations */ - state = libdecor_state_new(width, height); - libdecor_frame_commit(window->frame, state, NULL); - libdecor_state_free(state); - /* force redraw of content and commit */ - window->configured_width = width; - window->configured_height = height; - /* store floating dimensions */ - window->floating_width = width; - window->floating_height = height; - redraw(window); -} - -static struct buffer * -create_shm_buffer(int width, - int height, - uint32_t format); - -static void -update_scale(struct window *window) -{ - int scale = 1; - struct window_output *window_output; - - wl_list_for_each(window_output, &window->outputs, link) { - scale = MAX(scale, window_output->output->scale); - } - if (scale != window->scale) { - window->scale = scale; - redraw(window); - } -} - -static void -shm_format(void *data, - struct wl_shm *wl_shm, - uint32_t format) -{ - if (format == WL_SHM_FORMAT_XRGB8888) - has_xrgb = true; -} - -static struct wl_shm_listener shm_listener = { - shm_format -}; - -static void -try_update_cursor(struct seat *seat); - -static void -cursor_surface_enter(void *data, - struct wl_surface *wl_surface, - struct wl_output *wl_output) -{ - struct seat *seat = data; - struct pointer_output *pointer_output; - - if (!own_output(wl_output)) - return; - - pointer_output = zalloc(sizeof *pointer_output); - pointer_output->output = wl_output_get_user_data(wl_output); - wl_list_insert(&seat->pointer_outputs, &pointer_output->link); - try_update_cursor(seat); -} - -static void -cursor_surface_leave(void *data, - struct wl_surface *wl_surface, - struct wl_output *wl_output) -{ - struct seat *seat = data; - struct pointer_output *pointer_output, *tmp; - - wl_list_for_each_safe(pointer_output, tmp, &seat->pointer_outputs, link) { - if (pointer_output->output->wl_output == wl_output) { - wl_list_remove(&pointer_output->link); - free(pointer_output); - } - } -} - -static struct wl_surface_listener cursor_surface_listener = { - cursor_surface_enter, - cursor_surface_leave, -}; - -static void -init_cursors(struct seat *seat) -{ - char *name; - int size; - struct wl_cursor_theme *theme; - - if (!libdecor_get_cursor_settings(&name, &size)) { - name = NULL; - size = 24; - } - size *= seat->pointer_scale; - - theme = wl_cursor_theme_load(name, size, wl_shm); - free(name); - if (theme != NULL) { - if (seat->cursor_theme) - wl_cursor_theme_destroy(seat->cursor_theme); - seat->cursor_theme = theme; - } - if (seat->cursor_theme) - seat->left_ptr_cursor - = wl_cursor_theme_get_cursor(seat->cursor_theme, "left_ptr"); - if (!seat->cursor_surface) { - seat->cursor_surface = wl_compositor_create_surface( - wl_compositor); - wl_surface_add_listener(seat->cursor_surface, - &cursor_surface_listener, seat); - } -} - -static void -set_cursor(struct seat *seat) -{ - struct wl_cursor *wl_cursor; - struct wl_cursor_image *image; - struct wl_buffer *buffer; - const int scale = seat->pointer_scale; - - if (!seat->cursor_theme) - return; - - wl_cursor = seat->left_ptr_cursor; - - image = wl_cursor->images[0]; - buffer = wl_cursor_image_get_buffer(image); - wl_pointer_set_cursor(seat->wl_pointer, seat->serial, - seat->cursor_surface, - image->hotspot_x / scale, - image->hotspot_y / scale); - wl_surface_attach(seat->cursor_surface, buffer, 0, 0); - wl_surface_set_buffer_scale(seat->cursor_surface, scale); - wl_surface_damage_buffer(seat->cursor_surface, 0, 0, - image->width, image->height); - wl_surface_commit(seat->cursor_surface); -} - -static void -try_update_cursor(struct seat *seat) -{ - struct pointer_output *pointer_output; - int scale = 1; - - wl_list_for_each(pointer_output, &seat->pointer_outputs, link) { - scale = MAX(scale, pointer_output->output->scale); - } - - if (scale != seat->pointer_scale) { - seat->pointer_scale = scale; - init_cursors(seat); - set_cursor(seat); - } -} - -static void -pointer_enter(void *data, - struct wl_pointer *wl_pointer, - uint32_t serial, - struct wl_surface *surface, - wl_fixed_t surface_x, - wl_fixed_t surface_y) -{ - struct seat *seat = data; - - seat->pointer_focus = surface; - seat->serial = serial; - - if (surface != window->wl_surface) - return; - - set_cursor(seat); - - seat->pointer_sx = surface_x; - seat->pointer_sy = surface_y; -} - -static void -pointer_leave(void *data, - struct wl_pointer *wl_pointer, - uint32_t serial, - struct wl_surface *surface) -{ - struct seat *seat = data; - if (seat->pointer_focus == surface) - seat->pointer_focus = NULL; -} - -static void -pointer_motion(void *data, - struct wl_pointer *wl_pointer, - uint32_t time, - wl_fixed_t surface_x, - wl_fixed_t surface_y) -{ - struct seat *seat = data; - - seat->pointer_sx = surface_x; - seat->pointer_sy = surface_y; -} - -static struct xdg_positioner * -create_positioner(struct seat *seat) -{ - struct xdg_positioner *positioner; - enum xdg_positioner_constraint_adjustment constraint_adjustment; - int x, y; - - positioner = xdg_wm_base_create_positioner(xdg_wm_base); - xdg_positioner_set_size(positioner, POPUP_WIDTH, POPUP_HEIGHT); - - libdecor_frame_translate_coordinate(window->frame, - wl_fixed_to_int(seat->pointer_sx), - wl_fixed_to_int(seat->pointer_sy), - &x, &y); - - xdg_positioner_set_anchor_rect(positioner, x, y, 1, 1); - - constraint_adjustment = (XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y | - XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X); - xdg_positioner_set_constraint_adjustment (positioner, - constraint_adjustment); - - xdg_positioner_set_anchor (positioner, - XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT); - xdg_positioner_set_gravity (positioner, - XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT); - - return positioner; -} - -static void -xdg_popup_configure(void *data, - struct xdg_popup *xdg_popup, - int32_t x, - int32_t y, - int32_t width, - int32_t height) -{ -} - -static void -popup_destroy(struct popup *popup) -{ - libdecor_frame_popup_ungrab(popup->window->frame, - popup->seat->name); - xdg_popup_destroy(popup->xdg_popup); - xdg_surface_destroy(popup->xdg_surface); - wl_surface_destroy(popup->wl_surface); - popup->window->popup = NULL; - free(popup); -} - -static void -xdg_popup_done(void *data, - struct xdg_popup *xdg_popup) -{ - struct popup *popup = data; - - popup_destroy(popup); -} - -static const struct xdg_popup_listener xdg_popup_listener = { - xdg_popup_configure, - xdg_popup_done, -}; - -static void -xdg_surface_configure(void *data, - struct xdg_surface *xdg_surface, - uint32_t serial) -{ - struct popup *popup = data; - uint32_t *pixels; - struct buffer *buffer; - int y; - - buffer = create_shm_buffer(POPUP_WIDTH, POPUP_HEIGHT, - WL_SHM_FORMAT_XRGB8888); - pixels = buffer->data; - for (y = 0; y < POPUP_HEIGHT; y++) { - int x; - - for (x = 0; x < POPUP_WIDTH; x++) - pixels[y * POPUP_WIDTH + x] = 0xff4455ff; - } - - wl_surface_attach(popup->wl_surface, buffer->wl_buffer, 0, 0); - wl_surface_set_buffer_scale(window->wl_surface, window->scale); - wl_surface_damage(window->wl_surface, 0, 0, - POPUP_WIDTH, POPUP_HEIGHT); - xdg_surface_ack_configure(popup->xdg_surface, serial); - wl_surface_commit(popup->wl_surface); -} - -static const struct xdg_surface_listener xdg_surface_listener = { - xdg_surface_configure, -}; - -static void -open_popup(struct seat *seat) -{ - struct popup *popup; - struct xdg_positioner *positioner; - - popup = zalloc(sizeof *popup); - - popup->wl_surface = wl_compositor_create_surface(wl_compositor); - popup->xdg_surface = xdg_wm_base_get_xdg_surface (xdg_wm_base, - popup->wl_surface); - popup->parent = libdecor_frame_get_xdg_surface(window->frame); - popup->window = window; - popup->seat = seat; - positioner = create_positioner(seat); - popup->xdg_popup = xdg_surface_get_popup(popup->xdg_surface, - popup->parent, - positioner); - xdg_positioner_destroy(positioner); - - xdg_surface_add_listener (popup->xdg_surface, - &xdg_surface_listener, - popup); - xdg_popup_add_listener (popup->xdg_popup, - &xdg_popup_listener, - popup); - - window->popup = popup; - - xdg_popup_grab(popup->xdg_popup, seat->wl_seat, seat->serial); - wl_surface_commit(popup->wl_surface); - - libdecor_frame_popup_grab(window->frame, seat->name); -} - -static void -close_popup(struct window *window) -{ - struct popup *popup = window->popup; - - popup_destroy(popup); -} - -static void -pointer_button(void *data, - struct wl_pointer *wl_pointer, - uint32_t serial, - uint32_t time, - uint32_t button, - uint32_t state) -{ - struct seat *seat = data; - - if (seat->pointer_focus != window->wl_surface) - return; - - seat->serial = serial; - - if (window->popup && - state == WL_POINTER_BUTTON_STATE_PRESSED) - close_popup(window); - - if (button == BTN_LEFT && - state == WL_POINTER_BUTTON_STATE_PRESSED) { - libdecor_frame_move(window->frame, seat->wl_seat, serial); - } else if (button == BTN_MIDDLE && - state == WL_POINTER_BUTTON_STATE_PRESSED) { - libdecor_frame_show_window_menu(window->frame, - seat->wl_seat, - serial, - wl_fixed_to_int(seat->pointer_sx), - wl_fixed_to_int(seat->pointer_sy)); - } else if (button == BTN_RIGHT && - state == WL_POINTER_BUTTON_STATE_PRESSED) { - if (!window->popup) - open_popup(seat); - } -} - -static void -pointer_axis(void *data, - struct wl_pointer *wl_pointer, - uint32_t time, - uint32_t axis, - wl_fixed_t value) -{ -} - -static struct wl_pointer_listener pointer_listener = { - pointer_enter, - pointer_leave, - pointer_motion, - pointer_button, - pointer_axis -}; - -static void -keyboard_keymap(void *data, - struct wl_keyboard *wl_keyboard, - uint32_t format, - int32_t fd, - uint32_t size) -{ - struct seat *seat = data; - - if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { - close(fd); - return; - } - - char *map_str = (char *)(mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0)); - if (map_str == MAP_FAILED) { - close(fd); - fprintf(stderr, "keymap mmap failed: %s", strerror(errno)); - return; - } - - struct xkb_keymap *keymap = xkb_keymap_new_from_string( - seat->xkb_context, map_str, - XKB_KEYMAP_FORMAT_TEXT_V1, - XKB_KEYMAP_COMPILE_NO_FLAGS); - munmap(map_str, size); - close(fd); - - if (!keymap) - return; - - seat->xkb_state = xkb_state_new(keymap); - - xkb_keymap_unref(keymap); -} - -static void -keyboard_enter(void *data, - struct wl_keyboard *wl_keyboard, - uint32_t serial, - struct wl_surface *surface, - struct wl_array *keys) -{ -} - -static void -keyboard_leave(void *data, - struct wl_keyboard *wl_keyboard, - uint32_t serial, - struct wl_surface *surface) -{ -} - -static void -keyboard_key(void *data, - struct wl_keyboard *wl_keyboard, - uint32_t serial, - uint32_t time, - uint32_t key, - uint32_t state) -{ - struct seat *seat = data; - - if (state & WL_KEYBOARD_KEY_STATE_PRESSED) { - const xkb_keysym_t *syms; - - if (xkb_state_key_get_syms(seat->xkb_state, key + 8, &syms) != 1) - return; - - switch (syms[0]) { - case XKB_KEY_Escape: - printf("close\n"); - libdecor_frame_close(window->frame); - break; - case XKB_KEY_1: /* toggle resizability */ - if (libdecor_frame_has_capability( - window->frame, LIBDECOR_ACTION_RESIZE)) { - printf("set fixed-size\n"); - libdecor_frame_unset_capabilities(window->frame, - LIBDECOR_ACTION_RESIZE); - } else { - printf("set resizeable\n"); - libdecor_frame_set_capabilities(window->frame, - LIBDECOR_ACTION_RESIZE); - } - break; - case XKB_KEY_2: /* maximize */ - printf("maximize\n"); - libdecor_frame_set_maximized(window->frame); - break; - case XKB_KEY_3: /* un-maximize / restore */ - printf("un-maximize\n"); - libdecor_frame_unset_maximized(window->frame); - break; - case XKB_KEY_4: /* fullscreen */ - printf("fullscreen\n"); - libdecor_frame_set_fullscreen(window->frame, NULL); - break; - case XKB_KEY_5: /* un-fullscreen / restore */ - printf("un-fullscreen\n"); - libdecor_frame_unset_fullscreen(window->frame); - break; - case XKB_KEY_minus: - case XKB_KEY_plus: - { - const int dd = (syms[0] == XKB_KEY_minus ? -1 : +1) * chk/2; - printf("resize to: %i x %i\n", - window->configured_width + dd, - window->configured_height + dd); - resize(window, - window->configured_width + dd, - window->configured_height + dd); - } - break; - case XKB_KEY_v: /* VGA: 640x480 */ - printf("set VGA resolution: 640x480\n"); - resize(window, 640, 480); - break; - case XKB_KEY_s: /* SVGA: 800x600 */ - printf("set SVGA resolution: 800x600\n"); - resize(window, 800, 600); - break; - case XKB_KEY_x: /* XVGA: 1024x768 */ - printf("set XVGA resolution: 1024x768\n"); - resize(window, 1024, 768); - break; - case XKB_KEY_t: - libdecor_frame_set_title(window->frame, titles[window->title_index]); - window->title_index = (window->title_index + 1) % N_TITLES; - break; - case XKB_KEY_h: /* toggle decorations */ - libdecor_frame_set_visibility( - window->frame, - !libdecor_frame_is_visible(window->frame)); - printf("decorations %s\n", - libdecor_frame_is_visible(window->frame) ? - "visible" : "hidden"); - break; - } - } -} - -static void -keyboard_modifiers(void *data, - struct wl_keyboard *wl_keyboard, - uint32_t serial, - uint32_t mods_depressed, - uint32_t mods_latched, - uint32_t mods_locked, - uint32_t group) -{ - struct seat *seat = data; - - xkb_state_update_mask(seat->xkb_state, - mods_depressed, mods_latched, mods_locked, - 0, 0, group); -} - -static void -keyboard_repeat_info(void *data, - struct wl_keyboard *wl_keyboard, - int32_t rate, - int32_t delay) -{ -} - -static struct wl_keyboard_listener keyboard_listener = { - keyboard_keymap, - keyboard_enter, - keyboard_leave, - keyboard_key, - keyboard_modifiers, - keyboard_repeat_info, -}; - -static void -seat_capabilities(void *data, - struct wl_seat *wl_seat, - uint32_t capabilities) -{ - struct seat *seat = data; - if (capabilities & WL_SEAT_CAPABILITY_POINTER && - !seat->wl_pointer) { - seat->wl_pointer = wl_seat_get_pointer(wl_seat); - wl_pointer_add_listener(seat->wl_pointer, &pointer_listener, - seat); - seat->pointer_scale = 1; - init_cursors(seat); - } else if (!(capabilities & WL_SEAT_CAPABILITY_POINTER) && - seat->wl_pointer) { - wl_pointer_release(seat->wl_pointer); - seat->wl_pointer = NULL; - } - - if (capabilities & WL_SEAT_CAPABILITY_KEYBOARD && - !seat->wl_keyboard) { - seat->wl_keyboard = wl_seat_get_keyboard(wl_seat); - seat->xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - wl_keyboard_add_listener(seat->wl_keyboard, &keyboard_listener, - seat); - } else if (!(capabilities & WL_SEAT_CAPABILITY_KEYBOARD) && - seat->wl_keyboard) { - xkb_context_unref(seat->xkb_context); - wl_keyboard_release(seat->wl_keyboard); - seat->wl_keyboard = NULL; - } -} - -static void -seat_name(void *data, - struct wl_seat *wl_seat, - const char *name) -{ - struct seat *seat = data; - - seat->name = strdup(name); -} - -static struct wl_seat_listener seat_listener = { - seat_capabilities, - seat_name -}; - -static void -output_geometry(void *data, - struct wl_output *wl_output, - int32_t x, - int32_t y, - int32_t physical_width, - int32_t physical_height, - int32_t subpixel, - const char *make, - const char *model, - int32_t transform) -{ -} - -static void -output_mode(void *data, - struct wl_output *wl_output, - uint32_t flags, - int32_t width, - int32_t height, - int32_t refresh) -{ -} - -static void -output_done(void *data, - struct wl_output *wl_output) -{ - struct output *output = data; - struct seat *seat; - - if (window) { - if (output->scale != window->scale) - update_scale(window); - } - - wl_list_for_each(seat, &seats, link) { - try_update_cursor(seat); - } -} - -static void -output_scale(void *data, - struct wl_output *wl_output, - int32_t factor) -{ - struct output *output = data; - - output->scale = factor; -} - -static struct wl_output_listener output_listener = { - output_geometry, - output_mode, - output_done, - output_scale -}; - -static void -xdg_wm_base_ping(void *user_data, - struct xdg_wm_base *xdg_wm_base, - uint32_t serial) -{ - xdg_wm_base_pong(xdg_wm_base, serial); -} - -static const struct xdg_wm_base_listener xdg_wm_base_listener = { - xdg_wm_base_ping, -}; - -static void -registry_handle_global(void *user_data, - struct wl_registry *wl_registry, - uint32_t id, - const char *interface, - uint32_t version) -{ - struct seat *seat; - struct output *output; - - if (strcmp(interface, "wl_compositor") == 0) { - if (version < 4) { - fprintf(stderr, "wl_compositor version >= 4 required"); - exit(EXIT_FAILURE); - } - wl_compositor = - wl_registry_bind(wl_registry, - id, &wl_compositor_interface, 4); - } else if (strcmp(interface, "wl_shm") == 0) { - wl_shm = wl_registry_bind(wl_registry, - id, &wl_shm_interface, 1); - wl_shm_add_listener(wl_shm, &shm_listener, NULL); - } else if (strcmp(interface, "wl_seat") == 0) { - if (version < 3) { - fprintf(stderr, "%s version 3 required but only version " - "%i is available\n", interface, version); - exit(EXIT_FAILURE); - } - seat = zalloc(sizeof *seat); - wl_list_init(&seat->pointer_outputs); - seat->wl_seat = wl_registry_bind(wl_registry, - id, &wl_seat_interface, 3); - wl_seat_add_listener(seat->wl_seat, &seat_listener, seat); - } else if (strcmp(interface, "wl_output") == 0) { - if (version < 2) { - fprintf(stderr, "%s version 3 required but only version " - "%i is available\n", interface, version); - exit(EXIT_FAILURE); - } - output = zalloc(sizeof *output); - output->id = id; - output->scale = 1; - output->wl_output = wl_registry_bind(wl_registry, - id, &wl_output_interface, - 2); - wl_proxy_set_tag((struct wl_proxy *) output->wl_output, - &proxy_tag); - wl_output_add_listener(output->wl_output, &output_listener, - output); - wl_list_insert(&outputs, &output->link); - } else if (strcmp(interface, "xdg_wm_base") == 0) { - xdg_wm_base = wl_registry_bind(wl_registry, id, - &xdg_wm_base_interface, - 1); - xdg_wm_base_add_listener(xdg_wm_base, - &xdg_wm_base_listener, - NULL); - } -} - -static void -registry_handle_global_remove(void *data, struct wl_registry *registry, - uint32_t name) -{ - struct output *output; - struct window_output *window_output; - - wl_list_for_each(output, &outputs, link) { - if (output->id == name) { - wl_list_for_each(window_output, &window->outputs, - link) { - if (window_output->output == output) { - wl_list_remove(&window_output->link); - free(window_output); - } - } - wl_list_remove(&output->link); - wl_output_destroy(output->wl_output); - free(output); - break; - } - } -} - -static const struct wl_registry_listener registry_listener = { - registry_handle_global, - registry_handle_global_remove -}; - -static void -handle_error(struct libdecor *context, - enum libdecor_error error, - const char *message) -{ - fprintf(stderr, "Caught error (%d): %s\n", error, message); - exit(EXIT_FAILURE); -} - -static struct libdecor_interface libdecor_iface = { - .error = handle_error, -}; - -static void -buffer_release(void *user_data, - struct wl_buffer *wl_buffer) -{ - struct buffer *buffer = user_data; - - wl_buffer_destroy(buffer->wl_buffer); - munmap(buffer->data, buffer->data_size); - free(buffer); -} - -static const struct wl_buffer_listener buffer_listener = { - buffer_release -}; - -static struct buffer * -create_shm_buffer(int width, - int height, - uint32_t format) -{ - struct wl_shm_pool *pool; - int fd, size, stride; - void *data; - struct buffer *buffer; - - stride = width * 4; - size = stride * height; - - fd = os_create_anonymous_file(size); - if (fd < 0) { - fprintf(stderr, "creating a buffer file for %d B failed: %s\n", - size, strerror(errno)); - return NULL; - } - - data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (data == MAP_FAILED) { - fprintf(stderr, "mmap failed: %s\n", strerror(errno)); - close(fd); - return NULL; - } - - buffer = zalloc(sizeof *buffer); - - pool = wl_shm_create_pool(wl_shm, fd, size); - buffer->wl_buffer = wl_shm_pool_create_buffer(pool, 0, - width, height, - stride, format); - wl_buffer_add_listener(buffer->wl_buffer, &buffer_listener, buffer); - wl_shm_pool_destroy(pool); - close(fd); - - buffer->data = data; - buffer->data_size = size; - - return buffer; -} - -static void -paint_buffer(struct buffer *buffer, - int width, - int height, - int scale, - enum libdecor_window_state window_state) -{ - uint32_t *pixels = buffer->data; - uint32_t bg, fg, color; - int y, x, sx, sy; - size_t off; - int stride = width * scale; - - if (window_state & LIBDECOR_WINDOW_STATE_ACTIVE) { - fg = 0xffbcbcbc; - bg = 0xff8e8e8e; - } else { - fg = 0xff8e8e8e; - bg = 0xff484848; - } - - for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - color = (x & chk) ^ (y & chk) ? fg : bg; - for (sx = 0; sx < scale; sx++) { - for (sy = 0; sy < scale; sy++) { - off = x * scale + sx - + (y * scale + sy) * stride; - pixels[off] = color; - } - } - } - } -} - -static void -redraw(struct window *window) -{ - struct buffer *buffer; - - buffer = create_shm_buffer(window->configured_width * window->scale, - window->configured_height * window->scale, - WL_SHM_FORMAT_XRGB8888); - paint_buffer(buffer, window->configured_width, - window->configured_height, window->scale, - window->window_state); - - wl_surface_attach(window->wl_surface, buffer->wl_buffer, 0, 0); - wl_surface_set_buffer_scale(window->wl_surface, window->scale); - wl_surface_damage_buffer(window->wl_surface, 0, 0, - window->configured_width * window->scale, - window->configured_height * window->scale); - wl_surface_commit(window->wl_surface); -} - -static void -handle_configure(struct libdecor_frame *frame, - struct libdecor_configuration *configuration, - void *user_data) -{ - struct window *window = user_data; - int width, height; - enum libdecor_window_state window_state; - struct libdecor_state *state; - - /* Update window state first for the correct calculations */ - if (!libdecor_configuration_get_window_state(configuration, - &window_state)) - window_state = LIBDECOR_WINDOW_STATE_NONE; - - window->window_state = window_state; - - if (!libdecor_configuration_get_content_size(configuration, frame, - &width, &height)) { - width = window->content_width; - height = window->content_height; - } - - width = (width == 0) ? window->floating_width : width; - height = (height == 0) ? window->floating_height : height; - - window->configured_width = width; - window->configured_height = height; - - state = libdecor_state_new(width, height); - libdecor_frame_commit(frame, state, configuration); - libdecor_state_free(state); - - /* store floating dimensions */ - if (libdecor_frame_is_floating(window->frame)) { - window->floating_width = width; - window->floating_height = height; - } - - redraw(window); -} - -static void -handle_close(struct libdecor_frame *frame, - void *user_data) -{ - exit(EXIT_SUCCESS); -} - -static void -handle_commit(struct libdecor_frame *frame, - void *user_data) -{ - wl_surface_commit(window->wl_surface); -} - -static void -handle_dismiss_popup(struct libdecor_frame *frame, - const char *seat_name, - void *user_data) -{ - popup_destroy(window->popup); -} - -static struct libdecor_frame_interface libdecor_frame_iface = { - handle_configure, - handle_close, - handle_commit, - handle_dismiss_popup, -}; - -static void -surface_enter(void *data, - struct wl_surface *wl_surface, - struct wl_output *wl_output) -{ - struct window *window = data; - struct output *output; - struct window_output *window_output; - - if (!own_output(wl_output)) - return; - - output = wl_output_get_user_data(wl_output); - - if (output == NULL) - return; - - window_output = zalloc(sizeof *window_output); - window_output->output = output; - wl_list_insert(&window->outputs, &window_output->link); - update_scale(window); -} - -static void -surface_leave(void *data, - struct wl_surface *wl_surface, - struct wl_output *wl_output) -{ - struct window *window = data; - struct window_output *window_output; - - wl_list_for_each(window_output, &window->outputs, link) { - if (window_output->output->wl_output == wl_output) { - wl_list_remove(&window_output->link); - free(window_output); - update_scale(window); - break; - } - } -} - -static struct wl_surface_listener surface_listener = { - surface_enter, - surface_leave, -}; - -static void -free_outputs() -{ - struct output *output; - struct window_output *window_output, *window_output_tmp; - - wl_list_for_each(output, &outputs, link) { - wl_list_for_each_safe(window_output, window_output_tmp, &window->outputs, link) { - if (window_output->output == output) { - wl_list_remove(&window_output->link); - free(window_output); - } - } - wl_list_remove(&output->link); - wl_output_destroy(output->wl_output); - free(output); - break; - } -} - -int -main(int argc, - char **argv) -{ - struct timeval start; - struct timeval now; - struct wl_display *wl_display; - struct wl_registry *wl_registry; - struct libdecor *context; - struct output *output; - int timeout = -1; - bool timed_quit = false; - - if (argc > 1 && strcmp(argv[1], "--timed-quit") == 0) { - timed_quit = true; - timeout = 500; /* ms */ - } - - /* write all output to stdout immediately */ - setbuf(stdout, NULL); - - wl_display = wl_display_connect(NULL); - if (!wl_display) { - fprintf(stderr, "No Wayland connection\n"); - return EXIT_FAILURE; - } - - wl_list_init(&seats); - wl_list_init(&outputs); - - wl_registry = wl_display_get_registry(wl_display); - wl_registry_add_listener(wl_registry, - ®istry_listener, - NULL); - wl_display_roundtrip(wl_display); - wl_display_roundtrip(wl_display); - if (!has_xrgb) { - fprintf(stderr, "No XRGB shm format\n"); - return EXIT_FAILURE; - } - - window = zalloc(sizeof *window); - window->scale = 1; - window->title_index = 0; - wl_list_for_each(output, &outputs, link) { - window->scale = MAX(window->scale, output->scale); - } - wl_list_init(&window->outputs); - window->wl_surface = wl_compositor_create_surface(wl_compositor); - wl_surface_add_listener(window->wl_surface, &surface_listener, window); - - /* initialise content dimensions */ - window->floating_width = DEFAULT_WIDTH; - window->floating_height = DEFAULT_HEIGHT; - - context = libdecor_new(wl_display, &libdecor_iface); - window->frame = libdecor_decorate(context, window->wl_surface, - &libdecor_frame_iface, window); - libdecor_frame_set_app_id(window->frame, "libdecor-demo"); - libdecor_frame_set_title(window->frame, "libdecor demo"); - libdecor_frame_map(window->frame); - - gettimeofday(&start, NULL); - libdecor_frame_set_min_content_size(window->frame, 15 * chk, 10 * chk); - - while (libdecor_dispatch(context, timeout) >= 0) { - if (timed_quit) { - gettimeofday(&now, NULL); - if (now.tv_sec >= start.tv_sec + 2) { - fprintf(stderr, "Exiting due to --timed-quit\n"); - libdecor_frame_close(window->frame); - } - } - } - - free_outputs(); - - free(window); - - return EXIT_SUCCESS; -} diff --git a/libdecor/demo/egl.c b/libdecor/demo/egl.c deleted file mode 100644 index 8963ea457..000000000 --- a/libdecor/demo/egl.c +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright © 2011 Benjamin Franzke - * Copyright © 2010 Intel Corporation - * Copyright © 2018 Jonas Ådahl - * Copyright © 2019 Christian Rauch - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const size_t default_size = 200; - -struct client { - struct wl_display *display; - struct wl_compositor *compositor; - EGLDisplay egl_display; - EGLContext egl_context; -}; - -struct window { - struct client *client; - struct wl_surface *surface; - struct libdecor_frame *frame; - struct wl_egl_window *egl_window; - EGLSurface egl_surface; - int content_width; - int content_height; - int floating_width; - int floating_height; - bool open; - bool configured; -}; - -static void -frame_configure(struct libdecor_frame *frame, - struct libdecor_configuration *configuration, - void *user_data) -{ - struct window *window = user_data; - struct libdecor_state *state; - int width, height; - - if (!libdecor_configuration_get_content_size(configuration, frame, - &width, &height)) { - width = window->floating_width; - height = window->floating_height; - } - - window->content_width = width; - window->content_height = height; - - wl_egl_window_resize(window->egl_window, - window->content_width, window->content_height, - 0, 0); - - state = libdecor_state_new(width, height); - libdecor_frame_commit(frame, state, configuration); - libdecor_state_free(state); - - /* store floating dimensions */ - if (libdecor_frame_is_floating(window->frame)) { - window->floating_width = width; - window->floating_height = height; - } - - window->configured = true; -} - -static void -frame_close(struct libdecor_frame *frame, - void *user_data) -{ - struct window *window = user_data; - - window->open = false; -} - -static void -frame_commit(struct libdecor_frame *frame, - void *user_data) -{ - struct window *window = user_data; - - eglSwapBuffers(window->client->display, window->egl_surface); -} - -static struct libdecor_frame_interface frame_interface = { - frame_configure, - frame_close, - frame_commit, -}; - -static void -libdecor_error(struct libdecor *context, - enum libdecor_error error, - const char *message) -{ - fprintf(stderr, "Caught error (%d): %s\n", error, message); - exit(EXIT_FAILURE); -} - -static struct libdecor_interface libdecor_interface = { - libdecor_error, -}; - -static void -registry_global(void *data, - struct wl_registry *wl_registry, - uint32_t name, - const char *interface, - uint32_t version) -{ - struct client *client = data; - - if (strcmp(interface, wl_compositor_interface.name) == 0) { - client->compositor = wl_registry_bind(wl_registry, name, - &wl_compositor_interface, 1); - } -} - -static void -registry_global_remove(void *data, - struct wl_registry *wl_registry, - uint32_t name) -{ -} - -static const struct wl_registry_listener registry_listener = { - registry_global, - registry_global_remove -}; - -static bool -setup(struct window *window) -{ - static const EGLint config_attribs[] = { - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, - EGL_NONE - }; - - EGLint major, minor; - EGLint n; - EGLConfig config; - - window->client->egl_display = - eglGetDisplay((EGLNativeDisplayType)window->client->display); - - if (eglInitialize(window->client->egl_display, &major, &minor) == EGL_FALSE) { - fprintf(stderr, "Cannot initialise EGL!\n"); - return false; - } - - if (eglBindAPI(EGL_OPENGL_API) == EGL_FALSE) { - fprintf(stderr, "Cannot bind EGL API!\n"); - return false; - } - - if (eglChooseConfig(window->client->egl_display, - config_attribs, - &config, 1, &n) == EGL_FALSE) { - fprintf(stderr, "No matching EGL configurations!\n"); - return false; - } - - window->client->egl_context = eglCreateContext(window->client->egl_display, - config, EGL_NO_CONTEXT, NULL); - - if (window->client->egl_context == EGL_NO_CONTEXT) { - fprintf(stderr, "No EGL context!\n"); - return false; - } - - window->surface = wl_compositor_create_surface(window->client->compositor); - - window->egl_window = wl_egl_window_create(window->surface, - default_size, default_size); - - window->egl_surface = eglCreateWindowSurface( - window->client->egl_display, config, - (EGLNativeWindowType)window->egl_window, - NULL); - - eglMakeCurrent(window->client->egl_display, window->egl_surface, - window->egl_surface, window->client->egl_context); - - return true; -} - -static void -cleanup(struct window *window) -{ - if (window->client->egl_display) { - eglMakeCurrent(window->client->egl_display, EGL_NO_SURFACE, - EGL_NO_SURFACE, EGL_NO_CONTEXT); - } - if (window->egl_surface) { - eglDestroySurface(window->client->egl_display, window->egl_surface); - } - if (window->egl_window) { - wl_egl_window_destroy(window->egl_window); - } - if (window->surface) { - wl_surface_destroy(window->surface); - } - if (window->client->egl_context) { - eglDestroyContext(window->client->egl_display, window->client->egl_context); - } - if (window->client->egl_display) { - eglTerminate(window->client->egl_display); - } -} - -static float -hue_to_channel(const float *const hue, const int n) -{ - /* convert hue to rgb channels with saturation and value equal to 1 - * https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB_alternative - */ - const float k = fmod(n + ((*hue) * 3 / M_PI), 6); - return 1 - MAX(0, MIN(MIN(k, 4 - k), 1)); -} - -static void -hue_to_rgb(const float *const hue, float (*rgb)[3]) -{ - (*rgb)[0] = hue_to_channel(hue, 5); - (*rgb)[1] = hue_to_channel(hue, 3); - (*rgb)[2] = hue_to_channel(hue, 1); -} - -static void -draw(struct window *window) -{ - struct timespec tv; - double time; - - /* change of colour hue (HSV space) in rad/sec */ - static const float hue_change = (2 * M_PI) / 10; - float hue; - float rgb[3] = {0,0,0}; - - clock_gettime(CLOCK_REALTIME, &tv); - time = tv.tv_sec + tv.tv_nsec * 1e-9; - - hue = fmod(time * hue_change, 2 * M_PI); - - hue_to_rgb(&hue, &rgb); - - glClearColor(rgb[0], rgb[1], rgb[2], 1); - glClear(GL_COLOR_BUFFER_BIT); - - eglSwapBuffers(window->client->egl_display, window->egl_surface); -} - -int -main(int argc, char *argv[]) -{ - struct wl_registry *wl_registry; - struct libdecor *context = NULL; - struct window *window; - struct client *client; - int ret = EXIT_SUCCESS; - - client = calloc(1, sizeof(struct client)); - - client->display = wl_display_connect(NULL); - if (!client->display) { - fprintf(stderr, "No Wayland connection\n"); - free(client); - return EXIT_FAILURE; - } - - wl_registry = wl_display_get_registry(client->display); - wl_registry_add_listener(wl_registry, ®istry_listener, client); - wl_display_roundtrip(client->display); - - window = calloc(1, sizeof(struct window)); - window->client = client; - window->open = true; - window->configured = false; - window->floating_width = window->floating_height = default_size; - - if (!setup(window)) { - goto out; - } - - context = libdecor_new(client->display, &libdecor_interface); - window->frame = libdecor_decorate(context, window->surface, - &frame_interface, window); - libdecor_frame_set_app_id(window->frame, "egl-demo"); - libdecor_frame_set_title(window->frame, "EGL demo"); - libdecor_frame_map(window->frame); - - wl_display_roundtrip(client->display); - wl_display_roundtrip(client->display); - - /* wait for the first configure event */ - while (!window->configured) { - if (libdecor_dispatch(context, 0) < 0) { - ret = EXIT_FAILURE; - goto out; - } - } - - while (window->open) { - if (libdecor_dispatch(context, 0) < 0) { - ret = EXIT_FAILURE; - goto out; - } - draw(window); - } - -out: - if (context) { - libdecor_unref(context); - } - cleanup(window); - free(window); - free(client); - - return ret; -} diff --git a/makeinclude.in b/makeinclude.in index ac64e9a4f..4426d992f 100644 --- a/makeinclude.in +++ b/makeinclude.in @@ -1,7 +1,7 @@ # # Make include file for the Fast Light Tool Kit (FLTK). # -# Copyright 1998-2022 by Bill Spitzak and others. +# Copyright 1998-2023 by Bill Spitzak and others. # # This library is free software. Distribution and use rights are outlined in # the file "COPYING" which should have been included with this file. If this @@ -117,7 +117,6 @@ EXEEXT = @EXEEXT@ # Do we build the OpenGL demos? GLDEMOS = @GLDEMOS@ -GLWLDEMO = @GLWLDEMO@ # Do we build the threads demo? THREADS = @THREADS@