diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-12-01 14:43:32 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-12-02 09:28:08 +0100 |
| commit | f72748bb4563c07322846ae92cc9c02c0b448e5b (patch) | |
| tree | f1810fa604d181fc018249eb3fd0a0742650548d | |
| parent | 96730f80cbc3b2d5aec2967a61f16bb2f02853e6 (diff) | |
Wayland: make OPTION_USE_SYSTEM_LIBDECOR ON by default
This commit makes the default FLTK build setting use libdecor
as packaged in Linux when the build system contains packages
libdecor-0-dev and libdecor-0-plugin-1-gtk in version ≥ 0.2.0.
Otherwise, FLTK uses the bundled version of libdecor.
This includes situations where package libdecor-0-dev is
present in an earlier version.
| -rw-r--r-- | CMake/options.cmake | 22 | ||||
| -rw-r--r-- | CMakeLists.txt | 5 | ||||
| -rw-r--r-- | README.CMake.txt | 10 | ||||
| -rw-r--r-- | README.Wayland.txt | 12 | ||||
| -rw-r--r-- | configure.ac | 12 | ||||
| -rw-r--r-- | documentation/src/wayland.dox | 31 | ||||
| -rw-r--r-- | libdecor/build/Makefile | 6 | ||||
| -rw-r--r-- | libdecor/build/fl_libdecor.c | 3 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 25 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 24 |
10 files changed, 80 insertions, 70 deletions
diff --git a/CMake/options.cmake b/CMake/options.cmake index 5dad843d0..b5150dee2 100644 --- a/CMake/options.cmake +++ b/CMake/options.cmake @@ -258,7 +258,7 @@ if (UNIX) endif (X11_FOUND) unset (OPTION_USE_CAIRO CACHE) set (OPTION_USE_CAIRO TRUE CACHE BOOL "all drawing to X11 windows uses Cairo") - option (OPTION_USE_SYSTEM_LIBDECOR "use libdecor from the system" OFF) + option (OPTION_USE_SYSTEM_LIBDECOR "use libdecor from the system" ON) unset (OPTION_USE_XRENDER CACHE) unset (OPTION_USE_XINERAMA CACHE) unset (OPTION_USE_XFT CACHE) @@ -293,13 +293,25 @@ if (UNIX) unset (OPTION_USE_PANGO CACHE) set (OPTION_USE_PANGO TRUE CACHE BOOL "use lib Pango") if (OPTION_USE_SYSTEM_LIBDECOR) - pkg_check_modules(SYSTEM_LIBDECOR libdecor-0) + pkg_check_modules(SYSTEM_LIBDECOR libdecor-0>=0.2.0) if (NOT SYSTEM_LIBDECOR_FOUND) set (OPTION_USE_SYSTEM_LIBDECOR OFF) + else () + pkg_get_variable(LIBDECOR_LIBDIR libdecor-0 libdir) + set (LIBDECOR_PLUGIN_DIR ${LIBDECOR_LIBDIR}/libdecor/plugins-1) + if (EXISTS ${LIBDECOR_PLUGIN_DIR} AND IS_DIRECTORY ${LIBDECOR_PLUGIN_DIR}) + set (LIBDECOR_PLUGIN_DIR "\\\"${LIBDECOR_PLUGIN_DIR}\\\" " ) + else () + set (OPTION_USE_SYSTEM_LIBDECOR OFF) + endif () endif (NOT SYSTEM_LIBDECOR_FOUND) endif (OPTION_USE_SYSTEM_LIBDECOR) - option (OPTION_ALLOW_GTK_PLUGIN "Allow to use libdecor's GTK plugin" ON) + if (OPTION_USE_SYSTEM_LIBDECOR) + set (OPTION_ALLOW_GTK_PLUGIN ON) + else () + option (OPTION_ALLOW_GTK_PLUGIN "Allow to use libdecor's GTK plugin" ON) + endif (OPTION_USE_SYSTEM_LIBDECOR) if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "FreeBSD") CHECK_INCLUDE_FILE (linux/input.h LINUX_INPUT_H) @@ -856,7 +868,7 @@ if ((X11_Xft_FOUND OR NOT USE_PANGOXFT) AND OPTION_USE_PANGO) endif ((X11_Xft_FOUND OR NOT USE_PANGOXFT) AND OPTION_USE_PANGO) -if (OPTION_USE_WAYLAND AND NOT OPTION_USE_SYSTEM_LIBDECOR) +if (OPTION_USE_WAYLAND) # Note: Disable OPTION_ALLOW_GTK_PLUGIN to get cairo titlebars rather than GTK if (OPTION_ALLOW_GTK_PLUGIN) @@ -869,7 +881,7 @@ if (OPTION_USE_WAYLAND AND NOT OPTION_USE_SYSTEM_LIBDECOR) endif (GTK_FOUND) endif (OPTION_ALLOW_GTK_PLUGIN) -endif (OPTION_USE_WAYLAND AND NOT OPTION_USE_SYSTEM_LIBDECOR) +endif (OPTION_USE_WAYLAND) if (OPTION_USE_XFT) set (USE_XFT X11_Xft_FOUND) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21ef377d7..d2ae79f14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,6 +281,11 @@ if (UNIX AND NOT (APPLE AND NOT OPTION_APPLE_X11)) if (OPTION_USE_WAYLAND) message (STATUS "Use Wayland : Yes (if available at run-time)") + if (OPTION_USE_SYSTEM_LIBDECOR) + message (STATUS "Use system libdecor : Yes") + else () + message (STATUS "Use system libdecor : No") + endif () else () message (STATUS "Use Wayland : No (therefore, X11 is used)") endif () diff --git a/README.CMake.txt b/README.CMake.txt index c64c0c75c..c80832136 100644 --- a/README.CMake.txt +++ b/README.CMake.txt @@ -232,10 +232,12 @@ OPTION_USE_STD - default OFF or major (maybe 4.0.0) release which will default to use std::string and more modern C++ features. -OPTION_USE_SYSTEM_LIBDECOR - default OFF - This option makes FLTK use package libdecor-0 to draw window titlebars - under Wayland. It's mainly meant for future use, when that package - and its plugins will be part of major Linux distributions. +OPTION_USE_SYSTEM_LIBDECOR - default ON + This option makes FLTK use package libdecor-0-dev to draw window titlebars + under Wayland. When OFF or when this package has a version < 0.2.0, FLTK + uses its bundled copy of libdecor to draw window titlebars. + As of november 2023, version 0.2.0 of package libdecor-0-dev is available + only in testing distributions. Documentation options: these options are only available if `doxygen' is installed and found by CMake. PDF related options require also `latex'. diff --git a/README.Wayland.txt b/README.Wayland.txt index 1bd930535..497f34af9 100644 --- a/README.Wayland.txt +++ b/README.Wayland.txt @@ -75,10 +75,10 @@ be used to produce a Wayland-only library which can be useful, e.g., when cross-compiling for systems that lack X11 headers and libraries. The FLTK Wayland platform uses a library called libdecor which handles window decorations -(i.e., titlebars, shade). Libdecor is bundled in the FLTK source code and FLTK uses by default -this form of libdecor. CMake OPTION_USE_SYSTEM_LIBDECOR can be turned on to have FLTK -use the system's version of libdecor which is available on recent Linux distributions (e.g., -Debian Bookworm or more recent in packages libdecor-0-0 and libdecor-0-plugin-1-cairo). +(i.e., titlebars, shade). On very recent Linux distributions (e.g., Debian trixie) +libdecor is available as Linux packages (libdecor-0-dev and libdecor-0-plugin-1-gtk). +FLTK requires version 0.2.0 of these packages or more. +In other situations, FLTK uses a copy of libdecor bundled in the FLTK source code. FLTK equipped with libdecor supports both the client-side decoration mode (CSD) and the server-side decoration mode (SSD) as determined by the active Wayland compositor. Mutter (gnome's Wayland compositor) and Weston use CSD mode, KWin and Sway use SSD mode. @@ -145,6 +145,9 @@ in section 2.1 of file README.Unix.txt : These packages allow to run FLTK apps under the Gnome-Wayland desktop: - gnome-core - libgtk-3-dev <== highly recommended, gives windows a Gnome-style titlebar +- libdecor-0-dev and libdecor-0-plugin-1-gtk in versions ≥ 0.2.0 + <== Recommended if available for the Linux version in use, + <== FLTK uses a bundled copy of these packages otherwise. These packages allow to run FLTK apps under the KDE/Plasma-Wayland desktop: - kde-plasma-desktop @@ -169,6 +172,7 @@ package groups listed in section 2.2 of file README.Unix.txt : - mesa-libGLU-devel - dbus-devel <== recommended to query current cursor theme - gtk3-devel <== highly recommended, gives windows a GTK-style titlebar +- libdecor-0.2.0 <== recommended, present in Fedora Rawhide, not in Fedora 39 - glew-devel <== necessary to use OpenGL version 3 or above - cmake <== if you plan to build with CMake - cmake-gui <== if you plan to use the GUI of CMake diff --git a/configure.ac b/configure.ac index 697945548..b2465fccf 100644 --- a/configure.ac +++ b/configure.ac @@ -1055,12 +1055,18 @@ AS_CASE([$host_os_gui], [cygwin* | mingw*], [ BUILD="WAYLANDX11" graphics="Wayland or X11 with cairo" ]) -# CFLAGS="$CFLAGS -DUSE_SYSTEM_LIBDECOR=0" -# CXXFLAGS="$CXXFLAGS -DUSE_SYSTEM_LIBDECOR=0" + AS_IF([$PKGCONFIG --exists 'libdecor-0 >= 0.2.0'], + [ + plugin_dir="$($PKGCONFIG --variable=libdir libdecor-0)/libdecor/plugins-1" + CFLAGS="$CFLAGS -DUSE_SYSTEM_LIBDECOR" + CFLAGS="$CFLAGS -DLIBDECOR_PLUGIN_DIR=\\\"$plugin_dir\\\" " + LIBS="$LIBS $($PKGCONFIG --libs libdecor-0)" + ], + [CFLAGS="$CFLAGS -DUSE_SYSTEM_LIBDECOR=0 -DLIBDECOR_PLUGIN_DIR=\"\" "] + ) LIBS="$LIBS $($PKGCONFIG --libs wayland-cursor) $($PKGCONFIG --libs wayland-client) $($PKGCONFIG --libs xkbcommon) $($PKGCONFIG --libs pangocairo) " AS_IF([test x$enable_x11 != xno], [LIBS="$LIBS $($PKGCONFIG --libs x11)"] ) LIBS="$LIBS -ldl" -# CXXFLAGS="$CXXFLAGS -I../libdecor/src" DSOFLAGS="$LIBS $DSOFLAGS" enable_pango=yes LIBDECORDIR="libdecor/build" diff --git a/documentation/src/wayland.dox b/documentation/src/wayland.dox index 170ab10c7..f08cc74ac 100644 --- a/documentation/src/wayland.dox +++ b/documentation/src/wayland.dox @@ -26,7 +26,7 @@ always entirely filled with whatever resizable windows are mapped at any given time. Compositors follow either the client-side decoration (CSD) rule where client apps draw window titlebars, or the server-side decoration (SSD) rule where the compositor draws titlebars. FLTK supports both -CSD and SSD compositors. It bundles a library called \c libdecor charged of determining whether +CSD and SSD compositors. It uses a library called \c libdecor charged of determining whether a CSD or a SSD compositor is active, and of drawing titlebars in the first case. Wayland is divided in various protocols that a given compositor may or may not support, @@ -92,7 +92,7 @@ Overall, and ignoring for now OpenGL usage, FLTK interacts with Wayland as follo - When opening the display: FLTK calls \c Fl::add_fd() in \c FL_READ mode to associate a callback function to the socket connecting the client and the compositor. - Client to compositor: FLTK calls C functions of the \c libwayland-client.so, -\c libwayland-cursor.so and \c libxkbcommon.so shared libraries and of the bundled +\c libwayland-cursor.so and \c libxkbcommon.so shared libraries and of the libdecor library. These send suitable messages to the compositor writing to the socket. The names of these functions begin with \c wl_, \c xkb_ or \c libdecor_. - Compositor to client: the callback function runs when there are data to read in the @@ -1061,14 +1061,25 @@ and also to draw window titlebars when in CSD mode (see \ref bundled-libdecor). \c Libdecor is conceived to be present in a shared library linked to the Wayland client application which itself, and if the running Wayland compositor uses CSD mode, loads another shared library intended to draw titlebars in a way that best matches the -Desktop. As of early 2023, two titlebar-drawing \c libdecor plugins are available: +Desktop. As of late 2023, libdecor is at version 0.2.0 and contains two titlebar-drawing +plugins: - \c libdecor-gtk intended for the Gnome desktop; - \c libdecor-cairo for other situations. -Because \c libdecor is not yet in Linux packages, or only in a preliminary state, FLTK bundles the -most recent source code of \c libdecor and its plugins. This code is included in libfltk. -FLTK uses \c libdecor-gtk when software package \c libgtk-3-dev is present in the -build system, and \c libdecor-cairo otherwise. +Because \c libdecor is not yet in major Linux packages, or only at version 0.1.x, +FLTK bundles the most recent source code of \c libdecor and its plugins. This code +is included in libfltk. FLTK uses \c libdecor-gtk when software package \c libgtk-3-dev +is present in the build system, and \c libdecor-cairo otherwise. + +As of late 2023, libdecor version 0.2.0 is available in very recent Linux distributions +in packages \c libdecor-0-dev and \c libdecor-0-plugin-1-gtk. If they are installed on the +build system, preprocessor variable \c USE_SYSTEM_LIBDECOR is 1, +and both \c libdecor and its plugin are loaded at run-time from shared libraries. +When these packages are not available or are at an earlier version, FLTK uses the bundled +copy of \c libdecor. +When CMake \c OPTION_USE_SYSTEM_LIBDECOR is OFF, FLTK uses the bundled \c libdecor copy +even if shared libraries \c libdecor.so and \c libdecor-gtk.so are installed. +This option is ON by default. \c Libdecor uses the Wayland protocol <a href=https://wayland.app/protocols/xdg-decoration-unstable-v1> @@ -1079,12 +1090,6 @@ However, if environment variable \c LIBDECOR_FORCE_CSD is defined to value \c 1 FLTK app runs, \c libdecor instructs an SSD-able compositor to refrain from decorating its windows and decorates windows itself. -CMake \c OPTION_USE_SYSTEM_LIBDECOR has been defined to allow FLTK in the future, when \c libdecor and -\c libdecor-gtk will be part of Linux packages, to use these packages rather than the \c libdecor -code bundled in FLTK. When this option is ON, preprocessor variable \c USE_SYSTEM_LIBDECOR is 1, -and both \c libdecor and its plugin are loaded at run-time from shared libraries. This option is OFF -by default. - Whatever the value of \c OPTION_USE_SYSTEM_LIBDECOR, FLTK and \c libdecor use environment variable \c LIBDECOR_PLUGIN_DIR as follows: if this variable is defined and points to the name of a directory, this directory is searched for a potential \c libdecor plugin in the form of a shared library; diff --git a/libdecor/build/Makefile b/libdecor/build/Makefile index 946ec6318..c98f12ddb 100644 --- a/libdecor/build/Makefile +++ b/libdecor/build/Makefile @@ -27,7 +27,7 @@ FreeBSD_CFLAGS = -I/usr/local/include EXTRA_DECOR = ${${UNAME}_CFLAGS} CFLAGS_DECOR = -I. -I../.. -I../../src -I../src -I../src/plugins $(EXTRA_DECOR) -fPIC -D_GNU_SOURCE \ - -DUSE_SYSTEM_LIBDECOR=0 -DHAVE_MEMFD_CREATE -DHAVE_MKOSTEMP -DHAVE_POSIX_FALLOCATE + -DHAVE_MEMFD_CREATE -DHAVE_MKOSTEMP -DHAVE_POSIX_FALLOCATE Linux_NOPIE = -no-pie FreeBSD_NOPIE = @@ -39,10 +39,10 @@ depend: : echo "libdecor/build: make depend..." fl_libdecor.o : fl_libdecor.c ../src/libdecor.c ../../src/xdg-shell-protocol.c ../../src/xdg-decoration-protocol.c ../../src/text-input-protocol.c ../../src/gtk-shell-protocol.c - $(CC) $(CFLAGS) $(CFLAGS_DECOR) -c fl_libdecor.c -DLIBDECOR_PLUGIN_API_VERSION=1 -DLIBDECOR_PLUGIN_DIR=\"\" + $(CC) $(CFLAGS) $(CFLAGS_DECOR) -c fl_libdecor.c -DLIBDECOR_PLUGIN_API_VERSION=1 fl_libdecor-plugins.o : fl_libdecor-plugins.c ../src/plugins/cairo/libdecor-cairo.c - $(CC) $(CFLAGS) $(CFLAGS_DECOR) -c fl_libdecor-plugins.c -DLIBDECOR_PLUGIN_API_VERSION=1 -DLIBDECOR_PLUGIN_DIR=\"\" + $(CC) $(CFLAGS) $(CFLAGS_DECOR) -c fl_libdecor-plugins.c -DLIBDECOR_PLUGIN_API_VERSION=1 libdecor-cairo-blur.o : ../src/plugins/common/libdecor-cairo-blur.c $(CC) $(CFLAGS_DECOR) -c ../src/plugins/common/libdecor-cairo-blur.c diff --git a/libdecor/build/fl_libdecor.c b/libdecor/build/fl_libdecor.c index ab6cee5c2..7a327f151 100644 --- a/libdecor/build/fl_libdecor.c +++ b/libdecor/build/fl_libdecor.c @@ -15,6 +15,7 @@ // /* Improvements to libdecor.c without modifying libdecor.c itself */ +#if ! USE_SYSTEM_LIBDECOR #include "xdg-shell-client-protocol.h" #ifdef XDG_TOPLEVEL_STATE_SUSPENDED_SINCE_VERSION @@ -126,3 +127,5 @@ LIBDECOR_EXPORT struct libdecor *libdecor_new(struct wl_display *wl_display, str wl_display_flush(wl_display); return context; } + +#endif //! USE_SYSTEM_LIBDECOR diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1d52f197..d6a7a047c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -521,10 +521,7 @@ if (OPTION_USE_WAYLAND) endif (DBUS_FOUND) if (OPTION_USE_SYSTEM_LIBDECOR) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_SYSTEM_LIBDECOR") - get_filename_component(PATH_TO_SHARED_LIBS ${HAVE_LIB_PANGO} DIRECTORY) - set (LIBDECOR_PLUGIN_DIR "\\\"${PATH_TO_SHARED_LIBS}/libdecor/plugins-1\\\" " ) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLIBDECOR_PLUGIN_DIR=${LIBDECOR_PLUGIN_DIR} ") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_SYSTEM_LIBDECOR") if (GTK_FOUND) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_GTK") endif (GTK_FOUND) @@ -690,18 +687,18 @@ if (UNIX AND OPTION_USE_WAYLAND) ) list (APPEND STATIC_FILES "xdg-decoration-protocol.c") list (APPEND SHARED_FILES "xdg-decoration-protocol.c") - if (GTK_FOUND AND OPTION_ALLOW_GTK_PLUGIN) - add_custom_command( - OUTPUT gtk-shell-protocol.c gtk-shell-client-protocol.h - COMMAND wayland-scanner private-code ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml gtk-shell-protocol.c - COMMAND wayland-scanner client-header ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml gtk-shell-client-protocol.h - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml - VERBATIM - ) - list (APPEND STATIC_FILES "gtk-shell-protocol.c") - list (APPEND SHARED_FILES "gtk-shell-protocol.c") - endif (GTK_FOUND AND OPTION_ALLOW_GTK_PLUGIN) endif (NOT OPTION_USE_SYSTEM_LIBDECOR) + if (GTK_FOUND AND (OPTION_USE_SYSTEM_LIBDECOR OR OPTION_ALLOW_GTK_PLUGIN)) + add_custom_command( + OUTPUT gtk-shell-protocol.c gtk-shell-client-protocol.h + COMMAND wayland-scanner private-code ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml gtk-shell-protocol.c + COMMAND wayland-scanner client-header ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml gtk-shell-client-protocol.h + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../libdecor/build/gtk-shell.xml + VERBATIM + ) + list (APPEND STATIC_FILES "gtk-shell-protocol.c") + list (APPEND SHARED_FILES "gtk-shell-protocol.c") + endif (GTK_FOUND AND (OPTION_USE_SYSTEM_LIBDECOR OR OPTION_ALLOW_GTK_PLUGIN)) add_custom_command( OUTPUT text-input-protocol.c text-input-client-protocol.h COMMAND wayland-scanner private-code ${PROTOCOLS}/unstable/text-input/text-input-unstable-v3.xml text-input-protocol.c diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx index 83865878a..9082acf51 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -1792,25 +1792,6 @@ int Fl_Wayland_Window_Driver::set_cursor_4args(const Fl_RGB_Image *rgb, int hotx } -#if defined(USE_SYSTEM_LIBDECOR) && USE_SYSTEM_LIBDECOR -// This is only to fix a bug in libdecor where what libdecor_frame_set_min_content_size() -// does is often destroyed by libdecor-cairo. -static void delayed_minsize(Fl_Window *win) { - struct wld_window *wl_win = fl_wl_xid(win); - Fl_Window_Driver *driver = Fl_Window_Driver::driver(win); - if (wl_win->kind == Fl_Wayland_Window_Driver::DECORATED) { - float f = Fl::screen_scale(win->screen_num()); - libdecor_frame_set_min_content_size(wl_win->frame, driver->minw()*f, driver->minh()*f); - } - bool need_resize = false; - int W = win->w(), H = win->h(); - if (W < driver->minw()) { W = driver->minw(); need_resize = true; } - if (H < driver->minh()) { H = driver->minh(); need_resize = true; } - if (need_resize) win->size(W, H); -} -#endif - - void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) { struct wld_window *fl_win = fl_wl_xid(pWindow); if (fl_win && fl_win->kind == DECORATED && !xdg_toplevel()) { @@ -1890,11 +1871,6 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) { xdg_surface_set_window_geometry(fl_win->xdg_surface, 0, 0, W, H); //printf("xdg_surface_set_window_geometry: %dx%d\n",W, H); } -#if defined(USE_SYSTEM_LIBDECOR) && USE_SYSTEM_LIBDECOR - if (W < minw() || H < minh()) { - Fl::add_timeout(0.01, (Fl_Timeout_Handler)delayed_minsize, pWindow); - } -#endif } else { if (!in_handle_configure && xdg_toplevel()) { // Wayland doesn't seem to provide a reliable way for the app to set the |
