diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index 1bfd8fb143..56bf7295fc 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -18,7 +18,7 @@
 ;;; Copyright © 2021 Alexandru-Sergiu Marton <brown121407@posteo.ro>
 ;;; Copyright © 2021 Antero Mejr <antero@kodmin.com>
 ;;; Copyright © 2021 Vinicius Monego <monego@posteo.net>
-;;; Copyright © 2021 muradm <mail@muradm.net>
+;;; Copyright © 2021, 2024 muradm <mail@muradm.net>
 ;;; Copyright © 2021, 2022 Petr Hodina <phodina@protonmail.com>
 ;;; Copyright © 2021-2023 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021 Jacob Hrbek <kreyren@rixotstudio.cz>
@@ -5457,6 +5457,34 @@ (define-public rust-async-broadcast-0.5
     (description "This package provides async broadcast channels in Rust.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-async-channel-2
+  (package
+    (name "rust-async-channel")
+    (version "2.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-channel" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1337ywc1paw03rdlwh100kh8pa0zyp0nrlya8bpsn6zdqi5kz8qw"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-concurrent-queue" ,rust-concurrent-queue-2)
+        ("rust-event-listener" ,rust-event-listener-4)
+        ("rust-event-listener-strategy" ,rust-event-listener-strategy-0.4)
+        ("rust-futures-core" ,rust-futures-core-0.3)
+        ("rust-pin-project-lite" ,rust-pin-project-lite-0.2))
+       #:cargo-development-inputs
+       (("rust-easy-parallel" ,rust-easy-parallel-3)
+        ("rust-futures-lite" ,rust-futures-lite-2)
+        ("rust-wasm-bindgen-test" ,rust-wasm-bindgen-test-0.3))))
+    (home-page "https://github.com/smol-rs/async-channel")
+    (synopsis "Async multi-producer multi-consumer channel")
+    (description "Async multi-producer multi-consumer channel.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-async-channel-1
   (package
     (name "rust-async-channel")
@@ -5701,6 +5729,51 @@ (define-public rust-async-h1-2
      "This package provides an asynchronous HTTP 1.1 parser.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-async-io-2
+  (package
+    (name "rust-async-io")
+    (version "2.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-io" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "15q9ysdaz69pi3r6swms4xzii6xral2dda2d3fzjkly22mbrvva1"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-async-lock" ,rust-async-lock-3)
+        ("rust-cfg-if" ,rust-cfg-if-1)
+        ("rust-concurrent-queue" ,rust-concurrent-queue-2)
+        ("rust-futures-io" ,rust-futures-io-0.3)
+        ("rust-futures-lite" ,rust-futures-lite-2)
+        ("rust-parking" ,rust-parking-2)
+        ("rust-polling" ,rust-polling-3)
+        ("rust-rustix" ,rust-rustix-0.38)
+        ("rust-slab" ,rust-slab-0.4)
+        ("rust-tracing" ,rust-tracing-0.1)
+        ("rust-waker-fn" ,rust-waker-fn-1)
+        ("rust-windows-sys" ,rust-windows-sys-0.48))
+       #:cargo-development-inputs
+       (("rust-async-channel" ,rust-async-channel-2)
+        ("rust-async-net" ,rust-async-net-2)
+        ("rust-blocking" ,rust-blocking-1)
+        ("rust-criterion" ,rust-criterion-0.4)
+        ("rust-getrandom" ,rust-getrandom-0.2)
+        ("rust-inotify" ,rust-inotify-0.10)
+        ("rust-signal-hook" ,rust-signal-hook-0.3)
+        ("rust-tempfile" ,rust-tempfile-3)
+        ("rust-timerfd" ,rust-timerfd-1)
+        ("rust-uds-windows" ,rust-uds-windows-1))))
+    (home-page "https://github.com/smol-rs/async-io")
+    (synopsis "Async I/O and timers")
+    (description
+     "This crate provides two tools: Async, an adapter for standard networking
+types (and many other types) to use in async programs, and Timer, a future
+that expires at a point in time.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-async-io-1
   (package
     (name "rust-async-io")
@@ -5746,6 +5819,34 @@ (define-public rust-async-io-1
 that expires at a point in time.")
     (license (list license:asl2.0 license:expat))))
 
+(define-public rust-async-lock-3
+  (package
+    (name "rust-async-lock")
+    (version "3.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-lock" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "031i8kx440v77cvr3lp4a5dcjdz92zpi4616akfvjgfmhwky89bi"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-event-listener" ,rust-event-listener-4)
+        ("rust-event-listener-strategy" ,rust-event-listener-strategy-0.4)
+        ("rust-pin-project-lite" ,rust-pin-project-lite-0.2))
+       #:cargo-development-inputs
+       (("rust-async-channel" ,rust-async-channel-2)
+        ("rust-fastrand" ,rust-fastrand-2)
+        ("rust-futures-lite" ,rust-futures-lite-2)
+        ("rust-waker-fn" ,rust-waker-fn-1)
+        ("rust-wasm-bindgen-test" ,rust-wasm-bindgen-test-0.3))))
+    (home-page "https://github.com/smol-rs/async-lock")
+    (synopsis "Async synchronization primitives")
+    (description "This package provides Async synchronization primitives.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-async-lock-2
   (package
     (name "rust-async-lock")
@@ -5908,6 +6009,29 @@ (define-public rust-async-native-tls-0.3
     (description "Native TLS using futures")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-async-net-2
+  (package
+    (name "rust-async-net")
+    (version "2.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-net" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1xyc5a5vcp3a7h1q2lbfh79wz8136dig4q4x6g4w2ws8ml7h0j5r"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-async-io" ,rust-async-io-2)
+        ("rust-blocking" ,rust-blocking-1)
+        ("rust-futures-lite" ,rust-futures-lite-2))))
+    (home-page "https://github.com/smol-rs/async-net")
+    (synopsis "Async networking primitives for TCP/UDP/Unix communication")
+    (description
+     "Async networking primitives for TCP/UDP/Unix communication.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-async-net-1
   (package
     (name "rust-async-net")
@@ -5958,6 +6082,29 @@ (define-public rust-async-oneshot-0.5
 async-aware oneshot channel.")
     (license license:mpl2.0)))
 
+(define-public rust-async-pidfd-0.1
+  (package
+    (name "rust-async-pidfd")
+    (version "0.1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "async-pidfd" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "168pylpf7n898szw32sva7kf9h3x1mnip54mfr8f7f4v55c705qj"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-async-io" ,rust-async-io-1)
+        ("rust-libc" ,rust-libc-0.2))
+       #:cargo-development-inputs
+       (("rust-futures-lite" ,rust-futures-lite-1))))
+    (home-page "https://github.com/joshtriplett/async-pidfd")
+    (synopsis "Process file descriptors (pidfd) for Linux")
+    (description "Process file descriptors (pidfd) for Linux.")
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-async-process-1
   (package
     (name "rust-async-process")
@@ -25515,6 +25662,35 @@ (define-public rust-evdev-0.12
     (description "This package provides evdev interface for Linux.")
     (license (list license:asl2.0 license:expat))))
 
+(define-public rust-event-listener-4
+  (package
+    (name "rust-event-listener")
+    (version "4.0.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "event-listener" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0vk4smw1vf871vi76af1zn7w69jg3zmpjddpby2qq91bkg21bck7"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-concurrent-queue" ,rust-concurrent-queue-2)
+        ("rust-parking" ,rust-parking-2)
+        ("rust-pin-project-lite" ,rust-pin-project-lite-0.2)
+        ("rust-portable-atomic" ,rust-portable-atomic-1)
+        ("rust-portable-atomic-util" ,rust-portable-atomic-util-0.1))
+       #:cargo-development-inputs
+       (("rust-criterion" ,rust-criterion-0.5)
+        ("rust-futures-lite" ,rust-futures-lite-2)
+        ("rust-waker-fn" ,rust-waker-fn-1)
+        ("rust-wasm-bindgen-test" ,rust-wasm-bindgen-test-0.3))))
+    (home-page "https://github.com/smol-rs/event-listener")
+    (synopsis "Notify async tasks or threads")
+    (description "Notify async tasks or threads.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-event-listener-2
   (package
     (name "rust-event-listener")
@@ -25539,6 +25715,28 @@ (define-public rust-event-listener-2
 blocking data structures.")
     (license (list license:asl2.0 license:expat))))
 
+(define-public rust-event-listener-strategy-0.4
+  (package
+    (name "rust-event-listener-strategy")
+    (version "0.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "event-listener-strategy" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1lwprdjqp2ibbxhgm9khw7s7y7k4xiqj5i5yprqiks6mnrq4v3lm"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-event-listener" ,rust-event-listener-4)
+                       ("rust-pin-project-lite" ,rust-pin-project-lite-0.2))
+       #:cargo-development-inputs (("rust-futures-lite" ,rust-futures-lite-2)
+                                   ("rust-wasm-bindgen-test" ,rust-wasm-bindgen-test-0.3))))
+    (home-page "https://github.com/smol-rs/event-listener")
+    (synopsis "Block or poll on event_listener easily")
+    (description "Block or poll on event_listener easily.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-executable-path-1
   (package
     (name "rust-executable-path")
@@ -28617,6 +28815,37 @@ (define-public rust-futures-join-macro-preview-0.3
 @code{try_join!} macro.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-futures-lite-2
+  (package
+    (name "rust-futures-lite")
+    (version "2.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "futures-lite" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0qzgzks9hn0a8an8q0j4bqp9mkl82imyfqcb05nwm79jazdma4cw"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-fastrand" ,rust-fastrand-2)
+        ("rust-futures-core" ,rust-futures-core-0.3)
+        ("rust-futures-io" ,rust-futures-io-0.3)
+        ("rust-memchr" ,rust-memchr-2)
+        ("rust-parking" ,rust-parking-2)
+        ("rust-pin-project-lite" ,rust-pin-project-lite-0.2)
+        ("rust-waker-fn" ,rust-waker-fn-1))
+       #:cargo-development-inputs
+       (("rust-spin-on" ,rust-spin-on-0.1))))
+    (home-page "https://github.com/smol-rs/futures-lite")
+    (synopsis "Futures, streams, and async I/O combinators")
+    (description
+     "This crate is a subset of @code{futures} that compiles an order of
+magnitude faster, fixes minor warts in its API, fills in some obvious gaps,
+and removes almost all unsafe code from it.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-futures-lite-1
   (package
     (name "rust-futures-lite")
@@ -56285,6 +56514,39 @@ (define-public rust-polars-lazy-0.17
 library.")
     (license license:expat)))
 
+(define-public rust-polling-3
+  (package
+    (name "rust-polling")
+    (version "3.3.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "polling" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "0cg5jf0xf5gkch1d9kg8w55rnnjssxcm9b9amk1ghdhgyvqnlfz5"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-cfg-if" ,rust-cfg-if-1)
+        ("rust-concurrent-queue" ,rust-concurrent-queue-2)
+        ("rust-pin-project-lite" ,rust-pin-project-lite-0.2)
+        ("rust-rustix" ,rust-rustix-0.38)
+        ("rust-tracing" ,rust-tracing-0.1)
+        ("rust-windows-sys" ,rust-windows-sys-0.48))
+       #:cargo-development-inputs
+       (("rust-easy-parallel" ,rust-easy-parallel-3)
+        ("rust-fastrand" ,rust-fastrand-2)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-signal-hook" ,rust-signal-hook-0.3))))
+    (home-page "https://github.com/smol-rs/polling")
+    (synopsis
+     "Portable interface to epoll, kqueue, event ports, and IOCP")
+    (description
+     "This package provides a portable interface to @code{epoll},
+@code{kqueue}, @code{event ports}, and @code{IOCP}.")
+    (license (list license:asl2.0 license:expat))))
+
 (define-public rust-polling-2
   (package
     (name "rust-polling")
@@ -75542,6 +75804,33 @@ (define-public rust-swayipc-2
         ("rust-swayipc-command-builder" ,rust-swayipc-command-builder-0.1)
         ("rust-serde-json" ,rust-serde-json-1))))))
 
+(define-public rust-swayipc-async-2
+  (package
+    (name "rust-swayipc-async")
+    (version "2.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "swayipc-async" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1yyv7jwsr2z5azjal5hj8hgxb06dqrnxsaxrnjfjnp1pmwvjch48"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-async-io" ,rust-async-io-2)
+        ("rust-async-pidfd" ,rust-async-pidfd-0.1)
+        ("rust-futures-lite" ,rust-futures-lite-2)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-swayipc-types" ,rust-swayipc-types-1))))
+    (home-page "https://github.com/jaycefayne/swayipc-rs")
+    (synopsis "A library for controlling sway through its IPC interface")
+    (description
+     "This package provides a library for controlling sway through its IPC
+interface.")
+    (license license:expat)))
+
 (define-public rust-swayipc-command-builder-0.1
   (package
     (name "rust-swayipc-command-builder")
@@ -75563,28 +75852,27 @@ (define-public rust-swayipc-command-builder-0.1
 
 (define-public rust-swayipc-types-1
   (package
-   (name "rust-swayipc-types")
-    (version "1.2.0")
+    (name "rust-swayipc-types")
+    (version "1.3.1")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "swayipc-types" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "13lj6jyyxg41r9g0b07y8yd7ygy5gih61w5v48bpksvfdzhwwn55"))))
-   (build-system cargo-build-system)
-   (arguments
-    `(#:skip-build? #t
-      #:cargo-inputs
-      (("rust-serde" ,rust-serde-1)
-       ("rust-serde-json" ,rust-serde-json-1)
-       ("rust-thiserror" ,rust-thiserror-1))))
-   (home-page "https://github.com/jaycefayne/swayipc-rs")
-   (synopsis "A library containing Type defintions from sway's IPC interface")
-   (description
-    "This package provides a library containing Type defintions from sway's IPC
-interface")
-   (license license:expat)))
+        (base32 "1fwzdifnaj9ayz6fq96vcxpzr4dqhq1zgbqk3xbgsdlg89b2ddmi"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-serde" ,rust-serde-1)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-thiserror" ,rust-thiserror-1))))
+    (home-page "https://github.com/jaycefayne/swayipc-rs")
+    (synopsis "A library containing Type defintions from sway's IPC interface")
+    (description
+     "This package provides a library containing Type defintions from sway's IPC
+interface.")
+    (license license:expat)))
 
 (define-public rust-symlink-0.1
   (package
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index 449cbbaf6e..c41f8ac3cd 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -61,6 +61,7 @@
 ;;; Copyright © 2023 Jake Leporte <jakeleporte@outlook.com>
 ;;; Copyright © 2023 Hilton Chain <hako@ultrarare.space>
 ;;; Copyright © 2022 Mehmet Tekman <mtekman89@gmail.com>
+;;; Copyright © 2024 muradm <mail@muradm.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -78,6 +79,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages xdisorg)
+  #:use-module (guix build-system cargo)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system copy)
   #:use-module (guix build-system glib-or-gtk)
@@ -103,6 +105,7 @@ (define-module (gnu packages xdisorg)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages cpp)
+  #:use-module (gnu packages crates-io)
   #:use-module (gnu packages datastructures)
   #:use-module (gnu packages docbook)
   #:use-module (gnu packages documentation)
@@ -3800,3 +3803,34 @@ (define-public show-me-the-key
 and works under both Xorg and Wayland (via @code{libinput}), inspired by
 @code{python-screenkey}.")
     (license license:asl2.0)))
+
+(define-public sworkstyle
+  (package
+    (name "sworkstyle")
+    (version "1.3.5")
+    (home-page "https://github.com/lyr-7d1h/swayest_workstyle")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference (url home-page) (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0idaksm5hwikh7y7vsksd5cxl62mab5mhprgrcgpaggv5h1ankhf"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-async-std" ,rust-async-std-1)
+        ("rust-ctrlc" ,rust-ctrlc-3)
+        ("rust-dirs" ,rust-dirs-4)
+        ("rust-fslock" ,rust-fslock-0.2)
+        ("rust-futures" ,rust-futures-0.3)
+        ("rust-inotify" ,rust-inotify-0.10)
+        ("rust-log" ,rust-log-0.4)
+        ("rust-regex" ,rust-regex-1)
+        ("rust-simple-logger" ,rust-simple-logger-2)
+        ("rust-swayipc-async" ,rust-swayipc-async-2)
+        ("rust-toml" ,rust-toml-0.5))))
+    (synopsis  "Your workspace shall never contain an empty icon again!")
+    (description "Map workspace name to icons defined depending on the windows
+inside of the workspace.")
+    (license license:expat)))
