diff options
-rw-r--r-- | LICENSE | 2 | ||||
-rw-r--r-- | README.md | 85 | ||||
-rw-r--r-- | examples/support/config.c | 5 | ||||
-rw-r--r-- | examples/support/ini.c | 2 | ||||
-rw-r--r-- | include/wlr/types/wlr_output.h | 2 | ||||
-rw-r--r-- | protocol/meson.build | 9 | ||||
-rw-r--r-- | rootston/config.c | 5 | ||||
-rw-r--r-- | rootston/ini.c | 2 | ||||
-rw-r--r-- | types/wlr_output.c | 3 | ||||
-rw-r--r-- | types/wlr_xdg_shell.c | 4 | ||||
-rw-r--r-- | types/wlr_xdg_shell_v6.c | 4 |
11 files changed, 92 insertions, 31 deletions
@@ -1,4 +1,4 @@ -Copyright (c) 2017 Drew DeVault +Copyright (c) 2017, 2018 Drew DeVault Copyright (c) 2014 Jari Vetoniemi Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -1,49 +1,100 @@ # wlroots -Pluggable, composable modules for building a -[Wayland](http://wayland.freedesktop.org/) compositor. +Pluggable, composable, unopinionated modules for building a +[Wayland](http://wayland.freedesktop.org/) compositor; or about 40,000 lines of +code you were going to write anyway. -This is a WIP: [status](https://github.com/swaywm/wlroots/issues/9) +- wlroots provides backends that abstract the underlying display and input + hardware, including KMS/DRM, libinput, Wayland, X11, and headless backends, + plus any custom backends you choose to write, which can all be created or + destroyed at runtime and used in concert with each other. +- wlroots provides unopinionated, mostly standalone implementations of many + Wayland interfaces, both from wayland.xml and various protocol extensions. + We also promote the standardization of portable extensions across + many compositors. +- wlroots provides several powerful, standalone, and optional tools that + implement components common to many compositors, such as the arrangement of + outputs in physical space. +- wlroots provides an Xwayland abstraction that allows you to have excellent + Xwayland support without worrying about writing your own X11 window manager + on top of writing your compositor. +- wlroots provides a renderer abstraction that simple compositors can use to + avoid writing GL code directly, but which steps out of the way when your + needs demand custom rendering code. -## Contributing +wlroots implements a huge variety of Wayland compositor features and implements +them *right*, so you can focus on the features that make your compositor +unique. By using wlroots, you get high performance, excellent hardware +compatability, broad support for many wayland interfaces, and comfortable +development tools - or any subset of these features you like, because all of +them work independently of one another and freely compose with anything you want +to implement yourself. + +**Status**: prior to 1.0 the API is not stable, but we've done most of the work +and various projects are using wlroots to build Wayland compositors with. -See [CONTRIBUTING.md](https://github.com/swaywm/wlroots/blob/master/CONTRIBUTING.md) +wlroots is developed under the direction of the +[sway](https://github.com/swaywm/sway) project. A variety of wrapper libraries +[are available](https://github.com/swaywm) for using it with your favorite +programming language. ## Building Install dependencies: +* meson * wayland * wayland-protocols * EGL * GLESv2 -* DRM +* libdrm * GBM * libinput +* xkbcommon * udev * pixman * systemd (optional, for logind support) * elogind (optional, for logind support on systems without systemd) * libcap (optional, for capability support) -* asciidoc (optional, for man pages) + +If you choose to enable X11 support: + +* xkb +* xkb-composite +* xkb-xfixes +* xkb-image +* xkb-render +* x11-xcb +* xcb-errors (optional, for improved error reporting) +* x11-icccm (optional, for improved Xwayland introspection) +* xkb-xcb (optional, for improved keyboard handling on the X11 backend) Run these commands: meson build ninja -C build -(On FreeBSD, you need to pass an extra flag to prevent a linking error: `meson build -D b_lundef=false`) +On FreeBSD, you need to pass an extra flag to prevent a linking error: +`meson build -D b_lundef=false`. -## Running the Reference Compositor +Install like so: -wlroots comes with a reference compositor called rootston that demonstrates the -features of the library. + sudo ninja -C build install -After building, run rootston from a terminal or VT with: +## Running the test compositor - ./build/rootston/rootston +wlroots comes with a test compositor called rootston, which demonstrates the +features of the library and is used as a testbed for the development of the +library. It may also be useful as a reference for understanding how to use +various wlroots features. + +If you followed the build instructions above the rootston executable can be +found at `./build/rootston/rootston`. To use it, refer to the example config at +[./rootston/rootston.ini.example](https://github.com/swaywm/wlroots/blob/master/rootston/rootston.ini.example) +and place a config file of your own at `rootston.ini` in the working directory +(or in an arbitrary location via `rootston -C`). Other options are available, +refer to `rootston -h`. + +## Contributing -Now you can run windows in the compositor from the command line or by -configuring bindings in your -[`rootston.ini`](https://github.com/swaywm/wlroots/blob/master/rootston/rootston.ini.example) -file. +See [CONTRIBUTING.md](https://github.com/swaywm/wlroots/blob/master/CONTRIBUTING.md). diff --git a/examples/support/config.c b/examples/support/config.c index f0efa594..319be31a 100644 --- a/examples/support/config.c +++ b/examples/support/config.c @@ -202,7 +202,10 @@ struct example_config *parse_args(int argc, char *argv[]) { char cwd[MAXPATHLEN]; if (getcwd(cwd, sizeof(cwd)) != NULL) { char buf[MAXPATHLEN]; - snprintf(buf, MAXPATHLEN, "%s/%s", cwd, "wlr-example.ini"); + if (snprintf(buf, MAXPATHLEN, "%s/%s", cwd, "wlr-example.ini") >= MAXPATHLEN) { + wlr_log(L_ERROR, "config path too long"); + exit(1); + } config->config_path = strdup(buf); } else { wlr_log(L_ERROR, "could not get cwd"); diff --git a/examples/support/ini.c b/examples/support/ini.c index 6be9c44a..6bc1eae6 100644 --- a/examples/support/ini.c +++ b/examples/support/ini.c @@ -64,7 +64,7 @@ static char* find_chars_or_comment(const char* s, const char* chars) /* Version of strncpy that ensures dest (size bytes) is null-terminated. */ static char* strncpy0(char* dest, const char* src, size_t size) { - strncpy(dest, src, size); + strncpy(dest, src, size-1); dest[size - 1] = '\0'; return dest; } diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index cc03452d..cef3fc5d 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -55,7 +55,7 @@ struct wlr_output { struct wl_global *wl_global; struct wl_list wl_resources; - char name[16]; + char name[24]; char make[48]; char model[16]; char serial[16]; diff --git a/protocol/meson.build b/protocol/meson.build index bdbde96a..4730baf7 100644 --- a/protocol/meson.build +++ b/protocol/meson.build @@ -8,10 +8,17 @@ wayland_scanner_server = generator( arguments: ['server-header', '@INPUT@', '@OUTPUT@'], ) +# should check wayland_scanner's version, but it is hard to get +if wayland_server.version().version_compare('>=1.14.91') + code_type = 'private-code' +else + code_type = 'code' +endif + wayland_scanner_code = generator( wayland_scanner, output: '@BASENAME@-protocol.c', - arguments: ['code', '@INPUT@', '@OUTPUT@'], + arguments: [code_type, '@INPUT@', '@OUTPUT@'], ) wayland_scanner_client = generator( diff --git a/rootston/config.c b/rootston/config.c index 0883f6d4..67bf83e9 100644 --- a/rootston/config.c +++ b/rootston/config.c @@ -418,7 +418,10 @@ struct roots_config *roots_config_create_from_args(int argc, char *argv[]) { char cwd[MAXPATHLEN]; if (getcwd(cwd, sizeof(cwd)) != NULL) { char buf[MAXPATHLEN]; - snprintf(buf, MAXPATHLEN, "%s/%s", cwd, "rootston.ini"); + if (snprintf(buf, MAXPATHLEN, "%s/%s", cwd, "rootston.ini") >= MAXPATHLEN) { + wlr_log(L_ERROR, "config path too long"); + exit(1); + } config->config_path = strdup(buf); } else { wlr_log(L_ERROR, "could not get cwd"); diff --git a/rootston/ini.c b/rootston/ini.c index 56cc9ea6..f515dd38 100644 --- a/rootston/ini.c +++ b/rootston/ini.c @@ -64,7 +64,7 @@ static char* find_chars_or_comment(const char* s, const char* chars) /* Version of strncpy that ensures dest (size bytes) is null-terminated. */ static char* strncpy0(char* dest, const char* src, size_t size) { - strncpy(dest, src, size); + strncpy(dest, src, size-1); dest[size - 1] = '\0'; return dest; } diff --git a/types/wlr_output.c b/types/wlr_output.c index f95a7ea0..22353ab3 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -916,8 +916,5 @@ enum wl_output_transform wlr_output_transform_compose( uint32_t flipped = (tr_a ^ tr_b) & WL_OUTPUT_TRANSFORM_FLIPPED; uint32_t rotated = (tr_a + tr_b) & (WL_OUTPUT_TRANSFORM_90 | WL_OUTPUT_TRANSFORM_180); - if ((tr_a & WL_OUTPUT_TRANSFORM_FLIPPED) && (tr_b & WL_OUTPUT_TRANSFORM_FLIPPED)) { - rotated = wlr_output_transform_invert(rotated); - } return flipped | rotated; } diff --git a/types/wlr_xdg_shell.c b/types/wlr_xdg_shell.c index d4848e35..1aa964a6 100644 --- a/types/wlr_xdg_shell.c +++ b/types/wlr_xdg_shell.c @@ -1644,8 +1644,8 @@ struct wlr_surface *wlr_xdg_surface_surface_at( wlr_xdg_surface_popup_get_position(popup, &popup_sx, &popup_sy); struct wlr_surface *sub = wlr_xdg_surface_surface_at(popup, - sx - popup_sx + popup->geometry.x, - sy - popup_sy + popup->geometry.y, + sx - popup_sx, + sy - popup_sy, sub_x, sub_y); if (sub != NULL) { return sub; diff --git a/types/wlr_xdg_shell_v6.c b/types/wlr_xdg_shell_v6.c index f1258f0f..3bd845d3 100644 --- a/types/wlr_xdg_shell_v6.c +++ b/types/wlr_xdg_shell_v6.c @@ -1608,8 +1608,8 @@ struct wlr_surface *wlr_xdg_surface_v6_surface_at( wlr_xdg_surface_v6_popup_get_position(popup, &popup_sx, &popup_sy); struct wlr_surface *sub = wlr_xdg_surface_v6_surface_at(popup, - sx - popup_sx + popup->geometry.x, - sy - popup_sy + popup->geometry.y, + sx - popup_sx, + sy - popup_sy, sub_x, sub_y); if (sub != NULL) { return sub; |