Git Product home page Git Product logo

wayfire's Introduction

Version Matrix: #wayfire:matrix.org IRC: #wayfire on Libera.chat Discord CI Packaging status License

Wayfire is a 3D Wayland compositor, inspired by Compiz and based on wlroots.

It aims to create a customizable, extendable and lightweight environment without sacrificing its appearance.

Wayfire demos YouTube Play Button ยท Wayfire demos

Dependencies

Wayfire Dependencies

These are the dependencies needed for building Wayfire.

wlroots Dependencies

These are the dependencies needed for building wlroots, and should be installed before building it. They are relevant for cases when the system doesn't have a version of wlroots installed.

DRM Backend (required)

GLES2 renderer (required)

Libinput Backend (required)

Session Provider (required)

XWayland Support (optional)

X11 Backend (optional)

Installation

The easiest way to install Wayfire, wf-shell and WCM to get a functional desktop is to use the install scripts.

Alternatively, you can build from source:

meson build
ninja -C build
sudo ninja -C build install

Note: wf-config and wlroots can be built as submodules, by specifying -Duse_system_wfconfig=disabled and -Duse_system_wlroots=disabled options to meson. This is the default if they are not present on your system.

Installing wf-shell is recommended for a complete experience.

Arch Linux

wayfire and wayfire-git are available in the AUR.

yay -S wayfire
Exherbo
cave resolve -x wayfire
Fedora
dnf install wayfire
FreeBSD

Install the latest release and recommended addons with

pkg install wayfire wayfire-plugins-extra wf-shell wcm
Gentoo

Install the latest release with

emerge --ask --verbose wayfire

and to use the live version

emerge --ask --verbose "=gui-wm/wayfire-9999"
NixOS

Enable Wayfire in your NixOS configuration:

programs.wayfire = {
  enable = true;
  plugins = with pkgs.wayfirePlugins; [
    wcm
    wf-shell
    wayfire-plugins-extra
  ];
};
Ubuntu
apt install wayfire
Void
xbps-install -S wayfire

Configuration

Copy wayfire.ini to ~/.config/wayfire.ini. Before running Wayfire, you may want to change the command to start a terminal. See the Configuration document for information on the options.

Running

Run wayfire from a TTY, or via a Wayland-compatible login manager.

wayfire's People

Contributors

alexherbo2 avatar alyssais avatar ammen99 avatar charlieqle avatar damianatorrpm avatar diamondburned avatar dkondor avatar epsilon-0 avatar ericonr avatar erikvanhamme avatar javyre avatar jbeich avatar jordanl2 avatar killown avatar kode54 avatar l3nkz avatar lcolitti avatar lilydjwg avatar marcusbritanicus avatar mfxbe avatar occivink avatar parona-source avatar pushqrdx avatar soreau avatar ssfdust avatar travankor avatar trigg avatar valpackett avatar wb9688 avatar xbjfk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wayfire's Issues

Custom rendering doesn't work in some setups

I don't know if its just my .ini file but on my setup on Debian Unstable and AMD r600g drivers I have not been able to get the desktop cube or expo to show by setting any keybinding as "activate."

EDIT: nothing brings them up with the default, unmodified .ini file either

Optimize damage tracking

  • Track when a surface is on top of the other and don't get damage from the surface below

  • Redraw only damaged parts of the offscreen buffer & later transforms

  • Add a way for transformers to specify opaque regions after transform (for example, wf_2D_view without rotation should be able to set opaque region)

Ability for keybinding to repeat if key held down

Sometimes, we want a binding to be triggered over and over as long as a key is being held down (volume buttons), and other times we want it triggered once per key down and key up (run dialog).

Example impl:

[command]
binding_1 = KEY_VOLUMEUP
repeat_1 = true
command_1 = cSH-panel --signal volume-up

binding_2 = <super> KEY_R
repeat_1 = false # This is assumed by default
command_1 = cSH-run-dialog

Implement layer-shell

It seems like it is becoming a widely implemented protocol and there is already an increasing amount of apps using it. This makes it a good addition to wayfire.

Implement a basic dock/task switcher

This would also need a special protocol for enumerating windows with their title/app_id and requesting actions on them, like minimize/maximize/close, get the icon or similar. Ideally this protocol should be upstreamed to wlr-protocols

Fix tile plugin

Having a tiling support would be quite nice. It should have the following form - each workspace has a tiling and floating layer (the Z order depends on the focused view). We should also support moving views to and from the tiling layer, and add the ability to tile by default.

Implement unloadable plugins

Some plugins aren't meant to be dynamically loadable/unloadable. Plus, unloadable plugins should be destroyed at then end (for output destruction)

Views visible on multiple outputs

Currently, views are tied to outputs in such a way that makes it impossible to render view on more than one output at a time. This is mostly noticeable when dragging windows from one output to another, the window is cut off until it is on the other output.

Implement extendable view transforms

For example, a 3D transform can be used in conjunction with a 2D one (so, switcher should be able to use the window rotation given by e.g wrot). Also, once #20 is done, wobbly might want to extend the 2D transform as well.

There are two ways to do this - render the view with the first transform to an FBO, then render the FBO to a second FBO with the second transform, and so on. This means we could compose any number of transforms, but might mean that they might not really integrate well. And, if we had window exploding (a type of closing animation) its dubious whether we actually want to enable yet another transform.

The other way: 2D(and possibly 3D) transforms are the "base", plugins can request that they are "kept" active (like ref counting), and the transforms can be dynamically converted into a "derived" custom transform (for example wobbly or explosion transform) and then back to a plain 2D or 3D.

View destruction is broken

Currently, we give the plugins a shared_ptr<>. This causes many problems with ownership:

  1. Plugins shouldn't have ownership of the memory, they should use view->inc/dec_keep_count().
  2. There are also many lambdas which capture views (shared_ptr's) by value, which means that we leak memory.

A solution would be to use raw_pointers or an observer_ptr<> library (even the std::experimental one if it works across compiler versions), because the actual ownership belongs to the wayfire_core_t class.

Another related problem is the destruction of signal listeners throughout the different shells. They are currently removed in the destructor, but should rather be called when the shell destroy events are fired.

Provide C bindings for plugins

The core and existing plugins are in C++. However, it should be possible to create a wrapper library for C plugins, and thus allowing even using that library in a third language, like Rust.

Rework switcher

  • Switcher should act just like fast-switch (e.g we don't want to hold it open, in a state where the user is constantly in the switching mode unless he/she presses the activation binding again to close it).

  • Switcher should support touch. Currently wayfire has no easy way of switching windows by using only touch

Tiled Windows Behavior

xdg-shell stable clients should use tiled edges instead of being maximized when a window is tiled to a half or quarter of the screen.

Currently, GTK Windows look broken when tiled to the screen because they are told that they are maximised. In result, elements like shadows are not rendered, and the maximise button behaves incorrectly

Rework grid plugin

The grid plugin is currently a mess. It needs a huge rework, and it must support the following things:

  1. Support animating more than 1 window at a time
  2. Restore the geometry on set_maximized(false) when maximized to any of the slots
  3. Change tiled windows' geometry on the reserved-workarea signal

Another possibility is to expand the tiling plugin to tile only specific views and integrate grid and tile. However, this will require much more work to the unfinished tile plugin and possibly goes outside of its scope.

Implement render-to-FBO

There should be an option to render the whole screen (not like the workspace streams, but the whole output, as the user would see it) to a texture and then allow plugins to do transforms on that.

A few possible use-cases:

  1. Desktop zoom-in animation on startup (not just the current fade)
  2. Rotation animation like the one Android/iOS have
  3. Zoom support - the ability to zoom a part of the screen around the cursor.
  4. All kinds of post-processing - color transforms (inversion, black-and-white, others), motion blur and what not.

This would actually be relatively easy to implement. We'd have to add a new type of hook - postprocessing hook. Each one should have a source framebuffer and a target framebuffer, so that they can be composed together - for example, we should have the ability to zoom and have a black-and-white output filter at the same time.

Dynamic shell configuration

The built-in shell needs a proper event loop and dynamic configuration. On top of that, it'll be nice to have a better architecture for widgets.

Consider a simple IPC socket

This would allow users to create simple scripts in the language they prefer. Of course, if #48 is solved, we can just provide bindings to common languages.

Redesign plugin abilities

The abilities system can still be useful, but the abilities themselves aren't. Plugins should have abilities like:

  1. WF_ABILITY_WORKSPACE_IMPLEMENTATION
  2. WF_ABILITY_DECORATION_PROVIDER
  3. WF_ABILITY_CONTROL_WM

and potentially some others.

Move/Resize: set proper cursors

This needs some support in core. We have core->set_default_cursor(), but in many cases we need something else, like a grab or resize cursor image.

Implement SSD client support

SSD client support in wayfire will feature in-compositor decorations. Here are some of the tasks left:

  • Compositor-drawn surfaces, which support pointer input
  • Basic implementation of decorations
  • Support kde-decoration-protocol so that we know whether the wayland client needs SSD
  • Update decoration title - requires newer wlroots
  • Disable/Hide frames for fullscreen surfaces

Port Wayfire to wlroots

This issue is to track the progress of the wlr-wayfire port(in the wlroots branch). Feature development will stop until this is complete, although bugs will be fixed in the libweston version.

  • Use meson instead of cmake

  • Use wlr_log instead of built-in debugging file

  • Add some command line arguments (like --config)

  • Separate shell background and shell panel

  • Core

    • input-manager

      • keyboard
      • pointer
      • touch
      • tablet - I have no hardware, so it is useless to do this now. If there are users who want tablet, then this can be implemented.
    • render-manager

      • basic rendering with damage tracking
      • workspace_streams
    • workspace-manager

    • basic protocols

      • xdg-shell-v6
      • xwayland
    • output configuration

      • scale
      • rotation
      • coordinates
  • Plugins

    • move/resize
    • command
    • autostart
    • rotator
    • screenshot - deprecated in favor of the screenshot protocol, use external utilities like https://github.com/emersion/grim + command plugin.
    • expo
    • grid
    • window-rules
    • vswitch
    • oswitch
    • switcher
    • apps-logger
    • cube
    • animate
    • backlight - deprecated, use external utilities like https://github.com/haikarainen/light + command plugin
    • tile - compiles, "works" but has many bugs, so this is a highly experimental and incomplete plugin

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.