Coder Social home page Coder Social logo

levnikmyskin / hyprland-virtual-desktops Goto Github PK

View Code? Open in Web Editor NEW
96.0 3.0 9.0 162 KB

A plugin for the Hyprland compositor, implementing virtual-desktop functionality.

License: BSD 3-Clause "New" or "Revised" License

Makefile 1.53% C++ 94.50% Nix 3.97%
hyprland hyprland-plugin

hyprland-virtual-desktops's Introduction

Virtual desktops for Hyprland hyprico

virtual-desktops is a plugin for the Hyprland compositor. virtual-desktops manages multiple screens workspaces as if they were a single virtual desktop.

This plugin only supports official releases of Hyprland (e.g., v0.39.x, v0.40.x).
If you are on hyprland-git, please try compiling this plugin from the dev branch. There is NO GUARANTEE that the plugin will compile succesfully on the latest Hyprland commit, but we try our best to keep it updated. Also, always check the PR section, as there might be a draft PR for the next Hyprland release, where you can check the status of development.

Feel free to join our matrix room!

Table of contents

What is this exactly?

In Hyprland, each screen has its own set of workspaces. For instance, say you have two monitors, with workspace 1 on screen 1 and workspace 2 on screen 2:

  • When you switch from workspace 1 to 2, Hyprland will simply focus your second screen;
  • If you switch to workspace 3, your active screen will go to workspace 3, whereas the other screen will stay on whichever workspace it is currently on.

You may think of a virtual desktop, instead, as a "single" workspace which extends across your screens (even though, internally, you will still have n different workspaces on your n monitors). If you've ever used KDE Plasma (or Gnome, I think) with multiple screens, this plugin basically replicates that functionality.
Taking the previous example:

  • You will be on virtual desktop 1. Let's say you open your web browser on your first screen and an IDE on your second screen;
  • When you switch to virtual desktop 2, both screens will switch to empty workspaces. Let's say here you open your email client and your favourite chat application;
  • If you switch back to virtual desktop 1, you will get back your web browser and the IDE on screen 1 and 2; and viceversa when you go back to virtual desktop 2.

How does this work?

It's just workspaces, really

Internally, this simply ties n workspaces to your n screens, for each virtual desktop. That is, on virtual desktop 1 you will have workspace 1 on screen 1 and workspace 2 on screen 2; on virtual desktop 2, you will have workspace 3 on screen 1 and workspace 4 on screen 2, and so on.

However, if you focus another workspace on a given virtual desktop, the plugin will remember this and you will keep this layout (see Layouts).

Notice: screen 1 and screen 2 are not necessarily what you expect your first and second screen to be, e.g., screen 1 is not necessarily your left screen, and screen 2 is not necessarily your right screen.

Hyprctl dispatchers

This plugin exposes a few hyprctl dispatchers:

Dispatcher description type example
vdesk [vdesk] Changes to virtual desktop vdesk see below vdesk 3 or vdesk coding
lastdesk Changes to last visited virtual desktop none lastdesk
movetodesk vdesk(, window) Moves the active/selected window to the specified vdesk vdesk, optional window, see below movetodesk 2 or movetodesk 2,title:kitty
movetodesksilent vdesk(, window) same as movetodesk, but doesn't switch to desk same as above same as above
movetolastdesk (window) Moves the active/selected window to the last visited vdesk optional window movetolastdesk or movetolastdesk title:kitty
movetolastdesksilent (window) same as movetolastdesk, but doesn't switch to desk same as above same as above
movetoprevdesk (cycleback)(,window) Moves the active/selected window to the previous vdesk. If cycleback == 1 and vdesk == 1, moves to vdesk with max id optional 1 for true, optional window movetoprevdesk 1 or movetodesk ,title:kitty
movetoprevdesksilent (cycleback)(,window) same as movetoprevdesk, but doesn't switch to desk same as above same as above
movetonextdesk (cycle)(, window) Moves the active/selected window to the next vdesk. If cycle == 1 and vdesk == max, moves to vdesk 1 optional 1 for true, optional window movetonextdesk 1 or movetonextdesk ,title:kitty
movetonextdesksilent (cycle)(, window) same as movetonextdesk, but doesn't switch to desk same as above same as above
vdeskreset (vdesk) reset layouts on vdesk or on all vdesks if no argument is given (see Layouts) optional vdesk, see below vdeskreset or vdeskreset 2 or vdeskreset coding
prevdesk go to previous vdesk. If less than 1, will simply execute vdesk 1 none prevdesk
nextdesk go to next vdesk. Creates it if it doesn't exist none nextdesk
backcyclevdesks backward cycle between currently existing vdesks. Goes back to vdesk with max id when at vdesk 1 none backcyclevdesks
cyclevdesks cycle between currently existing vdesks. Goes back to vdesk 1 if next vdesk does not exist none cyclevdesks

BREAKING v2.1.0: prevdesk dispatcher was renamed to lastdesk. prevdesk has a new functionality: it goes to the previous desk. If you were using prevdesk, please update your config.

For vdesk names, you can use:

  • ID: e.g., 1, 2 etc;
  • Name: e.g., coding, internet, mail and chats

If a vdesk with a given ID or name does not exist, it'll be created on the fly. If you give a (non configured, see below) name, it will be assigned to the next available vdesk id: the virtual-desktops plugin will remember this association even if Hyprland kills the related workspaces.

The movetodesk and movetodesksilent dispatchers work similarly to Hyprland's movetoworkspace and movetoworkspacesilent dispatchers. See Hyprland's wiki. Of course, make sure to use the vdesk syntax above instead of Hyprland's.

Mix with Hyprland native workspaces

You can use hyprctl dispatch vdesk n, even if you have no secondary screen connected at the moment (the behaviour would be identical to native workspaces). Also, I would REMOVE any workspace related configuration, such as wsbind. If you want to leverage workspace-specific rules, you can: workspaces are always assigned to the same vdesk given the same number of monitors, unless you focus (e.g. with hyprctl) another workspace (see Layouts). For instance:

  • Given two monitors:
    • vdesk 1 has workspaces 1 and 2;
    • vdesk 2 has workspaces 3 and 4, and so on;
  • Given three monitors:
    • vdesk 1 has workspaces 1, 2 and 3;
    • vdesk 2 has workspaces 4, 5 and 6, and so on.
  • Given four monitors...

The vdesk a workspace will end up to is easily computed by doing ceil(workspace_id / n_monitors). You know where I'm going with this one...you can easily script it.

Hyprctl commands

Since version 2.2, this plugin exposes a couple of hyprctl commands. That is, you can use them by calling hyprctl {command} {args}.
NOTICE: some of these used to be dispatchers.

Command description args example
printdesk (vdesk) Prints to Hyprland log the specified vdesk or the currently active vdesk* (if no argument is given) optional vdesk, see above hyprctl printdesk or hyprctl printdesk 2 or hyprctl printdesk coding
printstate Prints state of all vdesks none hyprctl printstate
printlayout print to Hyprland logs the current layout none hyprctl printlayout

Hyprland keywords

Since version 2.2, this plugin exposes one keyword: stickyrule.
A sticky rule is composed of a window identifier and a vdesk identifier.
A window matched by a sticky rule will be moved to the matched vdesk:

  1. When the window is created (similar to Hyprland's workspace windowrule, but with virtual desks);
  2. Every time a monitor is connected/disconnected.

BE CAREFUL:

  1. NOT to mix this with Hyprland's workspace windowrule (it wouldn't make sense right?);
  2. This is not a plugin config, but an Hyprland keyword. Place it in the top level of Hyprland's config (i.e., where you'd put windowrules too).

Syntax

stickyrule = window,vdesk

Examples

stickyrule = class:^(kittysticky)$,3
stickyrule = title:thunderbird,mail

Configuration values

This plugin exposes a few configuration options, under the plugin:virtual-desktops: category, namely:

Name description type example
names map a vdesk id with a name map[int:string], see below names = 1:coding, 2:internet, 3:mail and chats
cycleworkspaces if set to 1 and switching to the currently active vdesk, workspaces will be swapped between your monitors (see swapactiveworkspaces) 0 or 1 cycleworkspaces = 1
rememberlayout chooses how layouts should be remembered (see Layouts), defaults to size none, size or monitors remember = size
notifyinit chooses whether to display the startup notification, defaults to 1 0 or 1 notifyinit = 0
verbose_logging whether to log more stuff, defaults to 0 0 or 1 verbose_logging = 0
  • The names config option maps virtual desktop IDs to a name (you can then use this with the hyprctl dispatchers);
  • cycleworkspaces: THIS CURRENTLY DOES NOT WORK WITH MORE THAN 2 MONITORS. If you need this feature, please feel welcome to submit a PR ^^.

Example config

stickyrule = class:^(kittysticky)$,3
stickyrule = title:thunderbird,mail

plugin {
    virtual-desktops {
        names = 1:coding, 2:internet, 3:mail and chats 
        cycleworkspaces = 1
        rememberlayout = size
        notifyinit = 0
        verbose_logging = 0
    }
}

Layouts

Version 2.0 of this plugin introduced the concept of a layout, with the meaning of "a specific combination of workspaces on a (more or less) specific combination of monitors".
In other words, virtual-desktops remembers if you focused another workspace on your vdesk, even if you switch to another vdesk and then come back to this one

Example

Say you have 2 monitors A and B, and you're on vdesk 1:

  • On monitor A you have workspace 1, and on monitor B you have workspace 2;
  • Now, say you focus workspace 4 with hyprctl dispatch workspace 4 on monitor B.
  • If you switch to vdesk 2 and back to vdesk 1, you will see workspace 4 on monitor B instead of workspace 2.

Notice that, in this case, workspace 4 would also be shown on vdesk 2.

Layouts are cached and restored if you disconnect/reconnect monitors

Internally, every vdesk will cache all the previous layouts. Once a monitor is connected/disconnected, the plugin will try to look for a previously existing layout for this configuration and it will apply it.

Example

Continuing from the previous example, say you now disconnect monitor B and then you reconnect it, while being on vdesk 1:

  • the previous layout will be matched and you will get back workspace 1 on monitor A and workspace 4 on monitor B.

This would work also if instead of disconnecting and reconnecting monitor B, you connected a third monitor C and then disconnect it.

Choosing how to remember, or choosing to forget

Version 2.0 also introduced the rememberlayout config option: with this option, we can choose if we want to match a layout by number of monitors (size) or by unique monitor descriptions (monitors). There is also the third and final option to not remember layouts at all (none).

Example

Continuing from the previous example. Say we now disconnect monitor B and connect monitor C: our connected monitors are A and C.

  • if rememberlayout = size (the default), the existing layout will still be matched, we will have workspace 1 on monitor A, workspace 4 on monitor C;
  • if rememberlayout = monitors, a new layout will be created with defaults: workspace 1 on monitor A, workspace 2 on monitor C;
  • if rememberlayout = none, same as above.

If we now disconnect monitor C and reconnect monitor B: our connected monitors are A and B.

  • if rememberlayout = size (the default), the existing layout will be matched, we will have workspace 1 on monitor A, workspace 4 on monitor B;
  • if rememberlayout = monitors, the existing layout will be matched, we will have workspace 1 on monitor A, workspace 4 on monitor B;
  • if rememberlayout = none, a new layout will be created with defaults: workspace 1 on monitor A, workspace 2 on monitor C.

Install

In order to use plugins, you should compile Hyprland yourself. See Hyprland Wiki#Using Plugins.

You can use:

HYPRLAND_HEADERS=path/to/hyprlandrepo make all

this will compile and copy the compiled .so plugin in the $HOME/.local/share/hyprload/plugins/bin path (useful if you use hyprload).
You can also use make virtual-desktops.so to output the compiled plugin in the repo directory.

Once compiled, you can tell Hyprland to load the plugin as described in the Hyprland wiki.

Installing on NixOS with home—manager

Here is an example flake that you can modify to add hyprland-virtual-desktops to your configuration

# flake.nix

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
   
    hyprland = {
      url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
      follows = "hyprland-virtual-desktops/hyprland"; # To make sure we run the same version of hyprland that the plugin was built against
    };
    hyprland-virtual-desktops.url = "github:levnikmyskin/hyprland-virtual-desktops";
    
  };

  outputs = { nixpkgs, home-manager, hyprland, hyprland-virtual-desktops, ... }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in
    {
      homeConfigurations."user@hostname" = home-manager.lib.homeManagerConfiguration {
        pkgs = nixpkgs.legacyPackages.x86_64-linux;

        # You can optionally move this module to its own .nix file and source it
        # here if you want to modularise your configuration
        modules = [
          hyprland.homeManagerModules.default
          {
            wayland.windowManager.hyprland = {
              enable = true;
              package = hyprland.packages.${pkgs.system}.hyprland;
              plugins = [
                hyprland-virtual-desktops.packages.${pkgs.system}.virtual-desktops
              ];
              # extraConfig is a string that becomes hyprland.conf
              extraConfig = ''
                stickyrule = class:^(kittysticky)$,3
                stickyrule = title:thunderbird,mail

                plugin {
                    virtual-desktops {
                        names = 1:coding, 2:internet, 3:mail and chats 
                        cycleworkspaces = 1
                        rememberlayout = size
                        notifyinit = 0
                        verbose_logging = 0
                    }
                }
              '' + ''
                # your other configuration for hyprland
              '';
            };
          }
          # ...
          # NOTE:
          # You will want to enable the Hyprland module in your NixOS configuration
          # too, since that also enables critical components like xdg-desktop-portal,
          # xwayland, polkit, etc
          # 
          # # Have this somewhere in your NixOS configuration
          # programs.hyprland = {
          #   enabled = true;
          #   package = inputs.hyprland.packages.${pkgs.system}.hyprland;
          # };
        ];
      };
    };
}

Help, Hyprland is being weird!

I've noticed that, sometimes, when disconnecting or reconnecting monitors, there might be weird artifacts or similar. Try running:
hyprctl reload

It's actually the plugin 😱

If instead you're seeing weird behaviour with the plugin itself, remember you can always run:
hyprtl dispatch vdeskreset

Thanks to

split-workspaces, from which I borrowed the Makefile, and the general idea of how to write Hyprland plugins.

hyprland-virtual-desktops's People

Contributors

abaofromcug avatar djelenc avatar guusbotman avatar levnikmyskin avatar whysobad avatar wiillou 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

Watchers

 avatar  avatar  avatar

hyprland-virtual-desktops's Issues

disconnecting a monitor behavior

Many clients are not visible or accessible after disconnecting a secondary monitor in a 2-monitor > 1-monitor-configuration change.

As an example, when I move a client to workspace 2 on vdesk 1, and disconnect my monitor, the only way to retrieve the client on the now blank screen is with a dispatcher and/or custom hook script. With the secondary monitor disconnected, I hoped this plugin would move workspace-affected existing clients to accessible workspaces, which, for a monitor count of 1 I gather is any odd numbered hyprland workspace: 1,3,5,7,9 (accessible through switching to vdesks 1,2,3,4, and 5, respectively). It would be very helpful for the behavior of preserving workspace-affected clients by moving them to these single-monitor-setup-accessible workspaces to be implemented, possibly byway of a new rememberlayout parameter which enables this behavior when there is only a single monitor connected.

confused about `lastdesk` dispatcher

I would like to cycle back to the last visited virtual desk via Mod+Tab like with hyprland workspaces workspace previous.
I set it up with bind = $mainMod, TAB, vdesk, lastdesk.

So if I change from vdesk 3 to vdesk 8 via the vdesk 3 and vdesk 8 dispatchers Mod+Tab should take me back to vdesk 3. I have three screens set up. But instead it always takes me to workspaces 28/29/30.

I'm not sure what is wrong with my setup.

same hyprland version for all plugins in nix

In the build instructions for nix in the README, there is this note on making sure that the hyprland versions are the same.

inputs.hyprland = {
      url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
      # To make sure we run the same version of hyprland that the plugin was built against
      follows = "hyprland-virtual-desktops/hyprland"; 
};

How would one handle this with multiple plugins?

Is this a good approach?

hyprland = {
  url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
  follows = "hyprland-virtual-desktops/hyprland";
};
hy3 = {
  url = "github:outfoxxed/hy3";
  inputs.hyprland.follows = "hyprland-virtual-desktops/hyprland";
};
hyprland-virtual-desktops = {
  url = "github:levnikmyskin/hyprland-virtual-desktops";
};

In my understanding, the correct thing todo, would be to use the newest hyprland version that is supported by ALL plugins. So the minimum of the the various input hyprlands of the plugins.

Compile error

→ Cloning https://github.com/levnikmyskin/hyprland-virtual-desktops
✔ cloned
✔ found hyprpm manifest
 ━━━━━━━━━━╍━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  1 / 5  Reading the manifestterminate called after throwing an instance of 'toml::v3::ex::parse_error'
  what():  Error while parsing array: expected comma or closing ']', saw '['
zsh: IOT instruction (core dumped)  hyprpm add https://github.com/levnikmyskin/hyprland-virtual-desktops

https://github.com/levnikmyskin/hyprland-virtual-desktops/blob/c1c5ddfc0dfd5a5b889564a57ba8c8dddc82b0eb/hyprpm.toml#L30C1-L32C93

virtual desktops sometimes completly broken

I don't know what exactly causes it, but sometimes the virtual desktops become completly broken... The only way to remedy this I found is to restart Hyprland and to hope to not trigger it again.

Based on the workspace indicators on my waybar, I can tell, that this happens whenever both workspaces representing a single desk (e.g. workspaces 1,2 for desk 1) are somehow one the same monitor (according to waybar). Then I get very glitchy behavior. I get unrendered some unrendered windows. Also just the act of moving the mouse from one monitor to the other makes the workspaces somehow swap between monitors and I can't get to the other workspace anymore... It's very weird.

Running hyprctl reload or hyprctl dispatch vdeskreset cannot fix this.

One thing that might play a role is, the fact, that when starting hyprland I first deactivate the internal monitor (monitor 3 if you want so).

focusmonitor bug

in my config I have

bind = $mainMod, h, focusmonitor, 0
bind = $mainMod, l, focusmonitor, 1

With only 2 monitors, when 2 clients are on screen 2 on vdesk1, when I try moving to screen 1 (monitor id 0 according to hyprland), it instead moves focus to the leftward client sharing the screen 2 workspace.

When the clients are fullscreened on screen 2, the same behavior occurs, with the other client being focused, and this time fullscreened.

Is there a way to move from any focused client on screen 2 to screen 1, so that the expected behavior for focusing between monitors works as it should?

NixOS Help

I'm attempting to get this plugin to work via NixOS Flakes... any insight into getting this working....

Here is a link to the WIki page that has instructions on using plugins with NixOS Flakes.

FEATURE: KDE's Activity

Good day to you!

is there any plans for implementing KDE's Activity feature or maybe ability to use it with external tool?

like,

plugin {

activities {
    default { 
          virtual-desktops 1:coding, 2:internet, 3:mail and chats 
         cycleworkspaces = 1
          rememberlayout = size
          notifyinit = 0
          verbose_logging = 0
      }
    job { 
          virtual-desktops 1:coding, 2:internet, 3:mail and chats 
      }
  }
}
hyprctl dispatch activity job

thank you!

hyprpm -> "Headers missing"

When I run
hyprpm add https://github.com/levnikmyskin/hyprland-virtual-desktops
I get
✖ Headers missing. Please run hyprpm update to fix those.

'hyprpm update' asks for password and stops:

==== AUTHENTICATION FAILED ====
✖ failed to install headers with error code 2                                                                                              
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  5 / 5  Failed                                                                         

✖ Headers missing. Please run hyprpm update to fix those.

Running hyprland 0.34 on openSUSE Tumbleweed

Layouts are sometimes not applied

When connecting/disconnecting a monitor, layouts may not be applied in some cases.
The correct layout is still matched and loaded, but not applied. This is shown also by the fact that we can "apply" the layout by switching to another vdesk and then back.

Window pulling focus breaks vdesk sync?

Great plugin! Works quite well overall.

Was curious if I've missed a config option in the plugin or otherwise that could help with this.

If a window pulls focus, (clicking on an app in the waybar systray, a mako notifcation, or even opening an app that is dedicated to a certain workspace) it changes the workspace on one monitor, but not the full vdesk (not changing the secondary monitor in sync) - this then breaks the sync until i manually change the workspace of the monitors individually to sync back up. Sometimes have to close all my apps to reset properly.

Thanks again!

add hyprland tags

Hi,

It would be nice if you could add hyprland and hyprland-plugin github tags to the repository. This would cause the plugin to show up in the list of plugins when filtered by hyprland-plugin topic.

Help regarding NixOS

Thank your for this nice plugin. I'm struggling to integrate it into my NixOS config. A few questions:

  • The README says to point the flake to hyprland-virtual-desktops.url = "github:wiillou/hyprland-virtual-desktops";. Should I not point it to hyprland-virtual-desktops.url = "github:levnikmyskin/hyprland-virtual-desktops"; instead?
  • I would really appreciate how to move the configuration into a separate module as suggested in the README. In my case, I'm using home-manager where I was configuring hyprland before and would like to put all this plugin-related config there.

Also pinging @wiillou, since they contributed the initial NixOS config. All the best!

hyprpm installation

I don't know how to use hyprpm or hyprload. I have only loaded split-monitor-workspaces with hyprctl in my .config before.

How do I use the now native plugin manager of hyprland, hyprpm, to load hyprland-virtual-dekstops plugin?

wlroots.x86_64                                       0.16.2-2.fc38                       @updates `

`laptop:~$ cd hyprland-virtual-desktops/
laptop:~/hyprland-virtual-desktops$ make virtual-desktops.so
g++ -O2 -shared -g -fPIC --no-gnu-unique -std=c++23 -Wall -Iinclude -DWLR_USE_UNSTABLE `pkg-config --cflags pixman-1 libdrm hyprland`   src/main.cpp src/utils.cpp src/VirtualDesk.cpp src/VirtualDeskManager.cpp -o virtual-desktops.so
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/Compositor.hpp:7,
                 from src/main.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/debug/Log.hpp:7,
                 from include/utils.hpp:5,
                 from src/utils.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/helpers/Monitor.hpp:3,
                 from include/VirtualDesk.hpp:10,
                 from src/VirtualDesk.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/helpers/Monitor.hpp:3,
                 from include/VirtualDesk.hpp:10,
                 from include/VirtualDeskManager.hpp:6,
                 from src/VirtualDeskManager.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:17: virtual-desktops.so] Error 1



laptop:~/hyprland-virtual-desktops$ HYPRLAND_HEADERS=/home/user/Hyprland/ make all
g++ -O2 -shared -g -fPIC --no-gnu-unique -std=c++23 -Wall -Iinclude -DWLR_USE_UNSTABLE `pkg-config --cflags pixman-1 libdrm hyprland`   src/main.cpp src/utils.cpp src/VirtualDesk.cpp src/VirtualDeskManager.cpp -o virtual-desktops.so
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/Compositor.hpp:7,
                 from src/main.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/debug/Log.hpp:7,
                 from include/utils.hpp:5,
                 from src/utils.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/helpers/Monitor.hpp:3,
                 from include/VirtualDesk.hpp:10,
                 from src/VirtualDesk.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from /usr/local/include/hyprland/src/defines.hpp:1,
                 from /usr/local/include/hyprland/src/helpers/Monitor.hpp:3,
                 from include/VirtualDesk.hpp:10,
                 from include/VirtualDeskManager.hpp:6,
                 from src/VirtualDeskManager.cpp:1:
/usr/local/include/hyprland/src/includes.hpp:108:10: fatal error: wlr/util/transform.h: No such file or directory
  108 | #include <wlr/util/transform.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:17: virtual-desktops.so] Error 1

Build fails on NixOS

With the following error:

error: builder for '/nix/store/rg0rzjxyfsif4ynrl5xn2x6z4iwar6jn-virtual-desktops-2.2.0.drv' failed with exit code 2;
       last 10 log lines:
       > g++ -O2 -shared -g -fPIC --no-gnu-unique -std=c++23 -Wall -Iinclude -DWLR_USE_UNSTABLE `pkg-config --cflags pixman-1 libdrm hyprland`   src/VirtualDesk.cpp src/VirtualDeskManager.cpp src/main.cpp src/sticky_apps.cpp src/utils.cpp -o virtual-desktops.so
       > src/VirtualDesk.cpp: In member function 'Layout VirtualDesk::generateCurrentMonitorLayout()':
       > src/VirtualDesk.cpp:177:41: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [8;;https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wsign-compare-Wsign-compare8;;]
       >   177 |     for (int i = vdeskFirstWorkspace; i < vdeskFirstWorkspace + monitors.size(); i++) {
       >       |                                       ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       > src/main.cpp:5:10: fatal error: hyprland/src/desktop/Workspace.hpp: No such file or directory
       >     5 | #include <hyprland/src/desktop/Workspace.hpp>
       >       |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       > compilation terminated.
       > make: *** [Makefile:17: virtual-desktops.so] Error 1
       For full logs, run 'nix log /nix/store/rg0rzjxyfsif4ynrl5xn2x6z4iwar6jn-virtual-desktops-2.2.0.drv'.
error: 1 dependencies of derivation '/nix/store/ya43mb1iq7mzcn54jscyw7j4d20ql1qh-hm_hyprhyprland.conf.drv' failed to build
error: 1 dependencies of derivation '/nix/store/a2rq2zqs5ln3yb0mvdqw5n5pqi9h9f9z-activation-script.drv' failed to build
error: 1 dependencies of derivation '/nix/store/6z6g0bpzf0qawqr26r19ny5gaz7a1y1r-home-manager-generation.drv' failed to build
error: 1 dependencies of derivation '/nix/store/kw3nfmdzwac9c9ghzyg0xijzlhq81j3k-unit-home-manager-david.service.drv' failed to build
error: 1 dependencies of derivation '/nix/store/psygazl4snc89sglxjcq13d7zdzl3xs2-system-units.drv' failed to build
error: 1 dependencies of derivation '/nix/store/13f9ilvy4nvk4x8m2kvv7j8djpzzd5fc-etc.drv' failed to build
error: 1 dependencies of derivation '/nix/store/73m9j97v5ibb89svg98117rzzhs5xxxb-nixos-system-idea-24.05.20240316.c75037b.drv' failed to build

The issue seems to be a change in Hyprland which was addressed in #27. On NixOS, the build still uses Hyprland v0.36.0 that has the file Workspace.cpp at a different location. I suspect all is needed is a change in this line below to a more recent version of Hyprland.

inputs.hyprland.url = "github:hyprwm/Hyprland/v0.36.0";

Just to be sure, pinging @wiillou.

Hyprland 0.39.1

Hi, thanks for developing this awesome plugin.
Yesterday I upgraded from 0.38.1 to 0.39.1, and the plugin stopped working.
I did the same thing I did last time I upgraded: hyprpm update -v
Everything went fine, even running hyprpm list returns the plugin as active and working.
However, hyprland is not able to recognise the vdesk dispatcher, and none of the virtual-desktop specific dispatchers are working.
Tried compiling from github (create the virtual-desktp.so), but it doesn't compile - some weird error regarding variables that are no longer available.
I suspect Hyprland change something in 0.39.1 - but my technical knowledge stops there.

Any idea what can be done?

Thanks in advance!

Build failure

I think it's due to the changes in syntax for plugins interacting with Hyprland API.

Mark a Window to stay on all vdesks

Good Day,

I'm struggling to write a rule so I can toggle the active window so when I switch to any vdesk it maintains it's position.

Any way to do this?

Thank You,
Smithp4ntz

Feature request: more relative motion

I would love to be able to go to the previous (number -1) desk and also to move my windows to the next/previous workspace.

Also the dispatchers name confused me, referring to next as the number+1 but previous as the latest visited and not the number-1. I will suggest to change the prevdesk dispatcher name to something like lastdesk or so.

[Bug] unable to focus window after movetonextdesk (ends up on wrong workspace)

I really appreciate this plugin, thanks for the effort.

When I move windows between virtual desktops I'm unable to focus the moved windows and some artifacts appear on other monitors. After some time and jumping between desktops, I am once again able to focus the window, but on a different monitor without moving it there.

The simplest case I was able to reproduce consistently is with three monitors with one window each. Than I open a new window one of the monitors and move it via movetonextdesk.

Further down is some console output that was captured while testing this.

For me it seems like the the window was moved to the wrong workspace (from 2 to 6 instead of from 2 to 5) and somehow the output of the workspace that the window landed on got displayed on the monitor the window came from.

Output of hyprctl workspaces & hyprctl clients before running movetonextdesk with window "Window 3ecf7e00 -> Rio" focused

❯ hyprctl workspaces; hyprctl clients
workspace ID 1 (1) on monitor DP-1:
	monitorID: 0
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x0
	lastwindowtitle:

workspace ID 2 (2) on monitor DP-2:
	monitorID: 1
	windows: 2
	hasfullscreen: 0
	lastwindow: 0x3ec6ca60
	lastwindowtitle: Rio

workspace ID 3 (3) on monitor DP-3:
	monitorID: 2
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecacd30
	lastwindowtitle: Visual Studio Code


Window 3ecacd30 -> Visual Studio Code:
	mapped: 1
	hidden: 0
	at: 1211,285
	size: 2538,1394
	workspace: 3 (3)
	floating: 0
	pseudo: 0
	monitor: 2
	class: code-url-handler
	title: Visual Studio Code
	initialClass: code-url-handler
	initialTitle: Visual Studio Code
	pid: 21627
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 3

Window 3ecc8190 -> Mozilla Firefox:
	mapped: 1
	hidden: 0
	at: 3771,35
	size: 1178,1874
	workspace: 1 (1)
	floating: 0
	pseudo: 0
	monitor: 0
	class: firefox
	title: Mozilla Firefox
	initialClass: firefox
	initialTitle: Mozilla Firefox
	pid: 21781
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 2

Window 3ecf7e00 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,981
	size: 1178,928
	workspace: 2 (2)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 22329
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 1

Window 3ec6ca60 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,35
	size: 1178,928
	workspace: 2 (2)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 21629
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 0

after movetonextdesk

workspace ID 1 (1) on monitor DP-1:
	monitorID: 0
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecc8190
	lastwindowtitle: Mozilla Firefox

workspace ID 2 (2) on monitor DP-2:
	monitorID: 1
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ec6ca60
	lastwindowtitle: Rio

workspace ID 3 (3) on monitor DP-3:
	monitorID: 2
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecacd30
	lastwindowtitle: Visual Studio Code

workspace ID 6 (6) on monitor DP-2:
	monitorID: 1
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecf7e00
	lastwindowtitle: Rio

workspace ID 5 (5) on monitor DP-2:
	monitorID: 1
	windows: 0
	hasfullscreen: 0
	lastwindow: 0x0
	lastwindowtitle:

workspace ID 4 (4) on monitor DP-1:
	monitorID: 0
	windows: 1
	hasfullscreen: 0
	lastwindow:
	lastwindowtitle:


Window 3ecacd30 -> Visual Studio Code:
	mapped: 1
	hidden: 0
	at: 1211,285
	size: 2538,1394
	workspace: 3 (3)
	floating: 0
	pseudo: 0
	monitor: 2
	class: code-url-handler
	title: Visual Studio Code
	initialClass: code-url-handler
	initialTitle: Visual Studio Code
	pid: 21627
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 3

Window 3ecc8190 -> Mozilla Firefox:
	mapped: 1
	hidden: 0
	at: 3771,35
	size: 1178,1874
	workspace: 1 (1)
	floating: 0
	pseudo: 0
	monitor: 0
	class: firefox
	title: Mozilla Firefox
	initialClass: firefox
	initialTitle: Mozilla Firefox
	pid: 21781
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 4

Window 3ec6ca60 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,35
	size: 1178,1874
	workspace: 2 (2)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 21629
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 1

 Window 3ecf7e00 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,35
	size: 1178,1874
	workspace: 6 (6)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 23202
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 2

after moving back to desktop 1

❯ hyprctl workspaces; hyprctl clients
workspace ID 1 (1) on monitor DP-1:
	monitorID: 0
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecc8190
	lastwindowtitle: Mozilla Firefox

workspace ID 2 (2) on monitor DP-2:
	monitorID: 1
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ec6ca60
	lastwindowtitle: Rio

workspace ID 3 (3) on monitor DP-3:
	monitorID: 2
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecacd30
	lastwindowtitle: Visual Studio Code

workspace ID 6 (6) on monitor DP-2:
	monitorID: 1
	windows: 1
	hasfullscreen: 0
	lastwindow: 0x3ecf7e00
	lastwindowtitle: Rio


Window 3ecacd30 ->  Visual Studio Code:
	mapped: 1
	hidden: 0
	at: 1211,285
	size: 2538,1394
	workspace: 3 (3)
	floating: 0
	pseudo: 0
	monitor: 2
	class: code-url-handler
	title: Visual Studio Code
	initialClass: code-url-handler
	initialTitle: Visual Studio Code
	pid: 21627
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 2

Window 3ecc8190 -> Mozilla Firefox:
	mapped: 1
	hidden: 0
	at: 3771,35
	size: 1178,1874
	workspace: 1 (1)
	floating: 0
	pseudo: 0
	monitor: 0
	class: firefox
	title: Mozilla Firefox
	initialClass: firefox
	initialTitle: Mozilla Firefox
	pid: 21781
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 1

Window 3ecf7e00 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,35
	size: 1178,1874
	workspace: 6 (6)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 22329
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 3

Window 3ec6ca60 -> Rio:
	mapped: 1
	hidden: 0
	at: 11,35
	size: 1178,1874
	workspace: 2 (2)
	floating: 0
	pseudo: 0
	monitor: 1
	class: rio
	title: Rio
	initialClass: rio
	initialTitle: Rio
	pid: 21629
	xwayland: 0
	pinned: 0
	fullscreen: 0
	fullscreenmode: 0
	fakefullscreen: 0
	grouped: 0
	tags:
	swallowing: 0
	focusHistoryID: 0

dispathes for scrolling through desktops

i would love to be able to cycle through desktops by pressing an arrow key or something and it would go to the next or previous desktop, allowing you to cycle through them. :D

failed with hyprpm

I just want to add this plugin through hyprpm and it fails.
This is the output for reference, any ideas?

╰─ hyprpm add https://github.com/levnikmyskin/hyprland-virtual-desktops -v                                       ─╯
[v] version returned: Hyprland, built from branch HEAD at commit 84ab8d11e8951a6551d1e1bf87796a8589da6d47  (props: bump ver to 0.35.0).
Date: Mon Feb 5 01:59:02 2024
Tag: v0.35.0

flags: (if any)


[v] parsed commit 84ab8d11e8951a6551d1e1bf87796a8589da6d47 at branch HEAD
✔ adding a new plugin repository from https://github.com/levnikmyskin/hyprland-virtual-desktops
  MAKE SURE that you trust the authors. DO NOT install random plugins without verifying the code and author.
  Are you sure? [Y/n]

! old plugin repo build files found in temp directory, removing.
 → Cloning https://github.com/levnikmyskin/hyprland-virtual-desktops
✔ cloned
✔ found hyprpm manifest
✔ parsed manifest, found 1 plugins:
 → virtual-desktops by LevMyskin version
 → Manifest has 4 pins, checking
✔ Hyprland headers OK
 → Building virtual-desktops
✖ Plugin virtual-desktops failed to build.

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╍━━━━━━━━━━━━━━━━━━━  3 / 5  Building plugin(s)[v] shell returned:  -> cd /tmp/hyprpm/new && PKG_CONFIG_PATH="/home/stormckey/.local/share/hyprpm/headersRoot/share/pkgconfig" make all
g++ -O2 -shared -g -fPIC --no-gnu-unique -std=c++23 -Wall -Iinclude -DWLR_USE_UNSTABLE `pkg-config --cflags pixman-1 libdrm hyprland`   src/main.cpp src/sticky_apps.cpp src/utils.cpp src/VirtualDesk.cpp src/VirtualDeskManager.cpp -o virtual-desktops.so
src/main.cpp:63:1: error: ‘Hyprlang’ does not name a type
   63 | Hyprlang::CParseResult parseStickyRule(const char* command, const char* value) {
      | ^~~~~~~~
src/main.cpp: In function ‘std::string printVDeskDispatch(eHyprCtlOutputFormat, std::string)’:
src/main.cpp:136:43: error: ‘Hyprlang’ has not been declared
  136 |     static auto* const PVDESKNAMESCONF = (Hyprlang::STRING const*)(HyprlandAPI::getConfigValue(PHANDLE, VIRTUALDESK_NAMES_CONF))->getDataStaticPtr();
      |                                           ^~~~~~~~
src/main.cpp:136:59: error: expected ‘)’ before ‘const’
  136 |     static auto* const PVDESKNAMESCONF = (Hyprlang::STRING const*)(HyprlandAPI::getConfigValue(PHANDLE, VIRTUALDESK_NAMES_CONF))->getDataStaticPtr();
      |                                          ~                ^~~~~~
      |                                                           )
src/main.cpp:138:69: error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(<brace-enclosed initializer list>)’
  138 |     auto               vdeskNamesConf = std::string{*PVDESKNAMESCONF};
      |                                                                     ^
In file included from /usr/include/c++/13.2.1/string:54,
                 from /usr/include/c++/13.2.1/bits/locale_classes.h:40,
                 from /usr/include/c++/13.2.1/bits/ios_base.h:41,
                 from /usr/include/c++/13.2.1/ios:44,
                 from /usr/include/c++/13.2.1/ostream:40,
                 from /usr/include/c++/13.2.1/bits/unique_ptr.h:42,
                 from /usr/include/c++/13.2.1/memory:78,
                 from /home/stormckey/.local/share/hyprpm/headersRoot/include/hyprland/src/Compositor.hpp:3,
                 from src/main.cpp:1:
/usr/include/c++/13.2.1/bits/basic_string.h:783:9: note: candidate: ‘template<class _Tp, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Tp&, const _Alloc&) [with <template-parameter-2-2> = _Tp; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  783 |         basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:783:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:771:9: note: candidate: ‘template<class _Tp, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Tp&, size_type, size_type, const _Alloc&) [with <template-parameter-2-2> = _Tp; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  771 |         basic_string(const _Tp& __t, size_type __pos, size_type __n,
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:771:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:748:9: note: candidate: ‘template<class _InputIterator, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with <template-parameter-2-2> = _InputIterator; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  748 |         basic_string(_InputIterator __beg, _InputIterator __end,
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:748:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:654:7: note: candidate: ‘template<class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(size_type, _CharT, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  654 |       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:654:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:631:7: note: candidate: ‘template<class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  631 |       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:631:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:705:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  705 |       basic_string(basic_string&& __str, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:705:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:700:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  700 |       basic_string(const basic_string& __str, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:700:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:695:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::initializer_list<_Tp>, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  695 |       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:695:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:667:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  667 |       basic_string(basic_string&& __str) noexcept
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:667:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:609:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  609 |       basic_string(const _CharT* __s, size_type __n,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:609:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:589:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  589 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:589:7: note:   candidate expects 4 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:571:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  571 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:571:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:554:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  554 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:554:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:537:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  537 |       basic_string(const basic_string& __str)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:537:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:525:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  525 |       basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:525:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:512:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  512 |       basic_string()
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:512:7: note:   candidate expects 0 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:176:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(__sv_wrapper, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  176 |       basic_string(__sv_wrapper __svw, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:176:7: note:   candidate expects 2 arguments, 1 provided
src/main.cpp: In function ‘void onConfigReloaded(void*, SCallbackInfo&, std::any)’:
src/main.cpp:280:39: error: ‘Hyprlang’ has not been declared
  280 |     static auto* const PNOTIFYINIT = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, NOTIFY_INIT)->getDataStaticPtr();
      |                                       ^~~~~~~~
src/main.cpp:280:54: error: expected primary-expression before ‘const’
  280 |     static auto* const PNOTIFYINIT = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, NOTIFY_INIT)->getDataStaticPtr();
      |                                                      ^~~~~
src/main.cpp:280:53: error: expected ‘)’ before ‘const’
  280 |     static auto* const PNOTIFYINIT = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, NOTIFY_INIT)->getDataStaticPtr();
      |                                      ~              ^~~~~~
      |                                                     )
src/main.cpp:285:43: error: ‘Hyprlang’ has not been declared
  285 |     static auto* const PVDESKNAMESCONF = (Hyprlang::STRING const*)(HyprlandAPI::getConfigValue(PHANDLE, VIRTUALDESK_NAMES_CONF))->getDataStaticPtr();
      |                                           ^~~~~~~~
src/main.cpp:285:59: error: expected ‘)’ before ‘const’
  285 |     static auto* const PVDESKNAMESCONF = (Hyprlang::STRING const*)(HyprlandAPI::getConfigValue(PHANDLE, VIRTUALDESK_NAMES_CONF))->getDataStaticPtr();
      |                                          ~                ^~~~~~
      |                                                           )
src/main.cpp:286:70: error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(<brace-enclosed initializer list>)’
  286 |     auto               vdeskNamesConf  = std::string{*PVDESKNAMESCONF};
      |                                                                      ^
/usr/include/c++/13.2.1/bits/basic_string.h:783:9: note: candidate: ‘template<class _Tp, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Tp&, const _Alloc&) [with <template-parameter-2-2> = _Tp; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  783 |         basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:783:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:771:9: note: candidate: ‘template<class _Tp, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Tp&, size_type, size_type, const _Alloc&) [with <template-parameter-2-2> = _Tp; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  771 |         basic_string(const _Tp& __t, size_type __pos, size_type __n,
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:771:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:748:9: note: candidate: ‘template<class _InputIterator, class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(_InputIterator, _InputIterator, const _Alloc&) [with <template-parameter-2-2> = _InputIterator; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  748 |         basic_string(_InputIterator __beg, _InputIterator __end,
      |         ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:748:9: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:654:7: note: candidate: ‘template<class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(size_type, _CharT, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  654 |       basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:654:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:631:7: note: candidate: ‘template<class> constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  631 |       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:631:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13.2.1/bits/basic_string.h:705:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  705 |       basic_string(basic_string&& __str, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:705:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:700:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  700 |       basic_string(const basic_string& __str, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:700:7: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:695:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::initializer_list<_Tp>, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  695 |       basic_string(initializer_list<_CharT> __l, const _Alloc& __a = _Alloc())
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:695:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:667:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  667 |       basic_string(basic_string&& __str) noexcept
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:667:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:609:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  609 |       basic_string(const _CharT* __s, size_type __n,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:609:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:589:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  589 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:589:7: note:   candidate expects 4 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:571:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  571 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:571:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:554:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, size_type, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; size_type = long unsigned int]’
  554 |       basic_string(const basic_string& __str, size_type __pos,
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:554:7: note:   candidate expects 3 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:537:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  537 |       basic_string(const basic_string& __str)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:537:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:525:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  525 |       basic_string(const _Alloc& __a) _GLIBCXX_NOEXCEPT
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:525:7: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/13.2.1/bits/basic_string.h:512:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  512 |       basic_string()
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:512:7: note:   candidate expects 0 arguments, 1 provided
/usr/include/c++/13.2.1/bits/basic_string.h:176:7: note: candidate: ‘constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(__sv_wrapper, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  176 |       basic_string(__sv_wrapper __svw, const _Alloc& __a)
      |       ^~~~~~~~~~~~
/usr/include/c++/13.2.1/bits/basic_string.h:176:7: note:   candidate expects 2 arguments, 1 provided
src/main.cpp: In function ‘PLUGIN_DESCRIPTION_INFO pluginInit(void*)’:
src/main.cpp:339:66: error: ‘Hyprlang’ has not been declared
  339 |     HyprlandAPI::addConfigValue(PHANDLE, VIRTUALDESK_NAMES_CONF, Hyprlang::STRING{"unset"});
      |                                                                  ^~~~~~~~
src/main.cpp:340:64: error: ‘Hyprlang’ has not been declared
  340 |     HyprlandAPI::addConfigValue(PHANDLE, CYCLEWORKSPACES_CONF, Hyprlang::INT{1});
      |                                                                ^~~~~~~~
src/main.cpp:341:64: error: ‘Hyprlang’ has not been declared
  341 |     HyprlandAPI::addConfigValue(PHANDLE, REMEMBER_LAYOUT_CONF, Hyprlang::STRING{REMEMBER_SIZE.c_str()});
      |                                                                ^~~~~~~~
src/main.cpp:342:55: error: ‘Hyprlang’ has not been declared
  342 |     HyprlandAPI::addConfigValue(PHANDLE, NOTIFY_INIT, Hyprlang::INT{1});
      |                                                       ^~~~~~~~
src/main.cpp:343:56: error: ‘Hyprlang’ has not been declared
  343 |     HyprlandAPI::addConfigValue(PHANDLE, VERBOSE_LOGS, Hyprlang::INT{0});
      |                                                        ^~~~~~~~
src/main.cpp:346:63: error: ‘parseStickyRule’ was not declared in this scope
  346 |     HyprlandAPI::addConfigKeyword(PHANDLE, STICKY_RULES_KEYW, parseStickyRule, Hyprlang::SHandlerOptions{});
      |                                                               ^~~~~~~~~~~~~~~
src/main.cpp:346:80: error: ‘Hyprlang’ has not been declared
  346 |     HyprlandAPI::addConfigKeyword(PHANDLE, STICKY_RULES_KEYW, parseStickyRule, Hyprlang::SHandlerOptions{});
      |                                                                                ^~~~~~~~
src/utils.cpp: In function ‘bool isVerbose()’:
src/utils.cpp:57:40: error: ‘Hyprlang’ has not been declared
   57 |     static auto* const PVERBOSELOGS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, VERBOSE_LOGS)->getDataStaticPtr();
      |                                        ^~~~~~~~
src/utils.cpp:57:55: error: expected primary-expression before ‘const’
   57 |     static auto* const PVERBOSELOGS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, VERBOSE_LOGS)->getDataStaticPtr();
      |                                                       ^~~~~
src/utils.cpp:57:54: error: expected ‘)’ before ‘const’
   57 |     static auto* const PVERBOSELOGS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, VERBOSE_LOGS)->getDataStaticPtr();
      |                                       ~              ^~~~~~
      |                                                      )
src/VirtualDesk.cpp: In member function ‘Layout VirtualDesk::generateCurrentMonitorLayout()’:
src/VirtualDesk.cpp:177:41: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
  177 |     for (int i = vdeskFirstWorkspace; i < vdeskFirstWorkspace + monitors.size(); i++) {
      |                                       ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/VirtualDeskManager.cpp: In member function ‘void VirtualDeskManager::loadLayoutConf()’:
src/VirtualDeskManager.cpp:170:44: error: ‘Hyprlang’ has not been declared
  170 |     static auto* const PREMEMBER_LAYOUT = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, REMEMBER_LAYOUT_CONF)->getDataStaticPtr();
      |                                            ^~~~~~~~
src/VirtualDeskManager.cpp:170:60: error: expected ‘)’ before ‘const’
  170 |     static auto* const PREMEMBER_LAYOUT = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, REMEMBER_LAYOUT_CONF)->getDataStaticPtr();
      |                                           ~                ^~~~~~
      |                                                            )
src/VirtualDeskManager.cpp: In member function ‘void VirtualDeskManager::cycleWorkspaces()’:
src/VirtualDeskManager.cpp:176:44: error: ‘Hyprlang’ has not been declared
  176 |     static auto* const PCYCLEWORKSPACES = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CYCLEWORKSPACES_CONF)->getDataStaticPtr();
      |                                            ^~~~~~~~
src/VirtualDeskManager.cpp:176:59: error: expected primary-expression before ‘const’
  176 |     static auto* const PCYCLEWORKSPACES = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CYCLEWORKSPACES_CONF)->getDataStaticPtr();
      |                                                           ^~~~~
src/VirtualDeskManager.cpp:176:58: error: expected ‘)’ before ‘const’
  176 |     static auto* const PCYCLEWORKSPACES = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CYCLEWORKSPACES_CONF)->getDataStaticPtr();
      |                                           ~              ^~~~~~
      |                                                          )
make: *** [Makefile:17: virtual-desktops.so] Error 1


✔ all plugins built
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╍━━━━━━━━━  4 / 5  Installing repositoryterminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: cannot copy file: No such file or directory [/tmp/hyprpm/new/virtual-desktops.so] [/home/stormckey/.local/share/hyprpm/virtual-desktops/virtual-desktops.so]
zsh: IOT instruction (core dumped)  hyprpm add https://github.com/levnikmyskin/hyprland-virtual-desktops -v

Move window to same monitor on different vdesk

When moving a window from DP-2 (ID 1) from vdesk 1 to vdesk 2 it get's moved to DP-3 (ID 2). I would expect for the window to be moved to vdesk 2 on DP-2.

It would be nice if there was a way of passing a monitor (name or id) to the window move dispatchers which specifies the target monitor of the moved window. Ideally, all move dispatchers default to moving the window to the same monitor on the other vdesk and an additional monitor argument allows to override this behavior.

The movetodesk dispatcher would then allow the following syntax: movetodesk 2,monitor:DP-2

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.