From d4417eec155e3aaa09fb555d26867261305ecb20 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 12 Jul 2022 03:02:23 +0200 Subject: [PATCH 01/20] Update `eruption-gui` Fix display of colors Add some missing mice --- Cargo.lock | 22 +-- eruption-audio-proxy/Cargo.toml | 2 +- eruption-debug-tool/Cargo.toml | 4 +- eruption-gui/Cargo.toml | 6 +- .../img/roccat-kone-aimo-remastered.png | Bin 0 -> 132844 bytes .../resources/img/roccat-kone-xtd.png | Bin 0 -> 141096 bytes eruption-gui/resources/resources.gresource | Bin 2105927 -> 2380040 bytes eruption-gui/resources/resources.xml | 2 + .../ui/keyboard/hwdevices/corsair_strafe.rs | 2 +- .../ui/keyboard/hwdevices/generic_keyboard.rs | 2 +- .../src/ui/keyboard/hwdevices/roccat_magma.rs | 2 +- .../keyboard/hwdevices/roccat_vulcan_1xx.rs | 2 +- .../keyboard/hwdevices/roccat_vulcan_pro.rs | 2 +- .../hwdevices/roccat_vulcan_pro_tkl.rs | 9 +- .../keyboard/hwdevices/roccat_vulcan_tkl.rs | 2 +- .../src/ui/misc/hwdevices/roccat_aimo_pad.rs | 4 +- .../ui/misc/hwdevices/roccat_elo_71_air.rs | 4 +- .../src/ui/mouse/hwdevices/generic_mouse.rs | 2 +- eruption-gui/src/ui/mouse/hwdevices/mod.rs | 34 ++++ .../ui/mouse/hwdevices/roccat_burst_pro.rs | 4 +- .../src/ui/mouse/hwdevices/roccat_kain_100.rs | 4 +- .../src/ui/mouse/hwdevices/roccat_kain_2xx.rs | 4 +- .../ui/mouse/hwdevices/roccat_kone_aimo.rs | 126 +++++++++++++ .../hwdevices/roccat_kone_aimo_remastered.rs | 168 ++++++++++++++++++ .../ui/mouse/hwdevices/roccat_kone_pro_air.rs | 4 +- .../mouse/hwdevices/roccat_kone_pure_ultra.rs | 2 +- .../src/ui/mouse/hwdevices/roccat_kone_xp.rs | 2 +- .../src/ui/mouse/hwdevices/roccat_kone_xtd.rs | 128 +++++++++++++ .../ui/mouse/hwdevices/roccat_kova_2016.rs | 126 +++++++++++++ .../ui/mouse/hwdevices/roccat_kova_aimo.rs | 126 +++++++++++++ .../src/ui/mouse/hwdevices/roccat_nyth.rs | 126 +++++++++++++ eruption-hwutil/Cargo.toml | 4 +- eruption-keymap/Cargo.toml | 6 +- eruption-netfx/Cargo.toml | 2 +- eruption-process-monitor/Cargo.toml | 4 +- eruption-util/Cargo.toml | 2 +- eruption/Cargo.toml | 6 +- eruptionctl/Cargo.toml | 4 +- sdk/lib/rust/eruption-rs/Cargo.toml | 2 +- 39 files changed, 893 insertions(+), 58 deletions(-) create mode 100644 eruption-gui/resources/img/roccat-kone-aimo-remastered.png create mode 100644 eruption-gui/resources/img/roccat-kone-xtd.png create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo_remastered.rs create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xtd.rs create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_kova_2016.rs create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_kova_aimo.rs create mode 100644 eruption-gui/src/ui/mouse/hwdevices/roccat_nyth.rs diff --git a/Cargo.lock b/Cargo.lock index 525f6c301..6590f4896 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,9 +205,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1489fcb93a5bb47da0462ca93ad252ad6af2145cce58d10d46a83931ba9f016b" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", "radium", @@ -778,9 +778,9 @@ dependencies = [ [[package]] name = "dbus" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0a745c25b32caa56b82a3950f5fec7893a960f4c10ca3b02060b0c38d8c2ce" +checksum = "6f8bcdd56d2e5c4ed26a529c5a9029f5db8290d433497506f958eae3be148eb6" dependencies = [ "futures-channel", "futures-util", @@ -1120,7 +1120,7 @@ dependencies = [ [[package]] name = "eruption-gui" -version = "0.1.3" +version = "0.1.4" dependencies = [ "byteorder", "cairo-rs", @@ -4053,18 +4053,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47" +checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" dependencies = [ "proc-macro2", "quote", @@ -5027,9 +5027,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c97e489d8f836838d497091de568cf16b117486d529ec5579233521065bd5e4" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" [[package]] name = "which" diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index 73d9366e0..dda5199a6 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" cfg-if = "1.0.0" clap = { version = "3.2.8", features = ["derive"] } clap_complete = "3.2.3" -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } lazy_static = "1.4.0" flume = "0.10.13" log = "0.4.17" diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index b902fd2a0..14ce44150 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -41,7 +41,7 @@ pretty_env_logger = "0.4.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } #tracing = "0.1.26" @@ -52,7 +52,7 @@ eyre = "0.6.8" color-eyre = "0.6.1" hexdump = "0.1.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } -bitvec = "1.0.0" +bitvec = "1.0.1" byteorder = "1.4.3" serialport = "4.2.0" crc8 = "0.1.1" diff --git a/eruption-gui/Cargo.toml b/eruption-gui/Cargo.toml index 4c287b8de..8cc1a59be 100644 --- a/eruption-gui/Cargo.toml +++ b/eruption-gui/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruption-gui" -version = "0.1.3" +version = "0.1.4" authors = ["X3n0m0rph59 "] edition = "2021" description = "A GUI for the Eruption Linux user-mode driver" @@ -42,7 +42,7 @@ nix = "0.24.1" rayon = "1.5.3" walkdir = "2.3.2" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } #tracing = "0.1.29" @@ -59,7 +59,7 @@ thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.1" paste = "1.0.7" -dbus = "0.9.5" +dbus = "0.9.6" dbus-tokio = "0.7.5" cairo-rs = "0.15.12" glib = "0.15.12" diff --git a/eruption-gui/resources/img/roccat-kone-aimo-remastered.png b/eruption-gui/resources/img/roccat-kone-aimo-remastered.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8f995bad1ce8599f8c2fbb38b0c6a9251e2eb5 GIT binary patch literal 132844 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 F{{d0Q%X$C+ literal 0 HcmV?d00001 diff --git a/eruption-gui/resources/img/roccat-kone-xtd.png b/eruption-gui/resources/img/roccat-kone-xtd.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef5c9dadaa68d372e9ca9821913c611c2c6ff99 GIT binary patch literal 141096 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�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ÓwZ7stE&37=ZmX3Fv&B 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 literal 0 HcmV?d00001 diff --git a/eruption-gui/resources/resources.gresource b/eruption-gui/resources/resources.gresource index c0cea4d7159bf2a86bb38e6bef2159c571c4e70b..d8661249d26b7d55a2ee25a61d11ccbb360e09a5 100644 GIT binary patch delta 1723 zcmZvce{2(F9LB%fwY_d#*N$#$x6yVm5-_3bNC+ClNQ{tybHa?U02)er*-Eyx^v4{- zSjY%PNMtavI-^@4aS35UEP4{nhGxQuk?@C+1xZNI3`H>2$Pg2w&r?A8!%IGSo_p@@ z`@Zkpd*5>tI}7$6IattN?w(SF$AY;Y0Mb4BNrsyGx;fV#504uNo`+a6X zAK-wm08UU1-1qT9$sDjOIyk~QoQPezkB>h3HtW!rBX5L0{i{VG>vFp`nzyL>w!6w{fN+cmrnI4m|~$ zz0Ysq1N3}g61uU^A-Qw8^~~w{CZf=mqYgRxVZ%6cdM9(}ov{izeRJb>=JZ^ceY`>% zr=9Z5ntn^lfD1g~z)jFK;LqRR&2d8XD)Lt7CQ$d(2k&vk^c=Vc>b~KWT?dx;aR7R* z_%Z108K>CyezAl(JqK=pj!d~^@Vhr}Fo#cJ<6vb7C$3gY*~FZ7UZ9_adrRA&9Ijm35PqP_%`jNR(HUIGT>wJJGWw>w=YF;}}+O#e$77qG4!|`B! zw5u(h8!`YRFaZ^qK@lj{b3>MaUfr_aw!>H)h(_y!@iqJbH!kK@FG<+k^@ci`@ATc2?zZJa64 zjWdP&YVtG8jE|KWi+U0veh-m!Q=Ju*>P>aFW%J7;u{J-qXgsmKLyP&7f{nD7@FVlZRn0li5FW!v$&8Xj8XInZyb9u;6 zGS80zxLepCxt(H>U@(yIZAr%B312i8$v-zd=+TDeq3gcj36=?j?Y15?DRXAS87Jy8*L4j8OWXCrHkQ~K z3`LiWZt6~C(KREni5ZT#%i)tngTTBb`+$bbM9m~fFf3>s*^J42p28AO^6T^TIq&^F z`43+@n=?CoDkoXuNJ)ZEy(=plKe-U1JKL(H|EbFpvEuMD0_beO!tc^rh&~0bRW( z#MtLe8Frvokn7il7%7s3E@*CHd-_7;Dd=nUlK4cq_yXJ0bDR*gcBdrL3)2UwW1^*Oa;tA+AU>*Ky8waB2#B&me^s$)ed*Pd8W77g0|CFM&=O)uC@>g!`Rb0Rcm10`B$tTeI3(C6t1GG^RKF{HZFUo$2%&JSvtX3zssh7WZRcN6>+e2BK{lWE{!f}j+Y=o|O2A8G8vXldI z0lg07fqZRQlHVIpQ)$_rmu;&}re!(b*Oha3va2>k-|#;gm{Z=Z zQg8iIp--4IrJzhRXOz}D^_i_TcJ1KSnpg5PRx#k>3II!%8MpzpBm6Y(ad^hRI;W?%tUPy~v#DZTB|fca1?9EonM8@HKgmmONW>`W*A E16ovsS^xk5 diff --git a/eruption-gui/resources/resources.xml b/eruption-gui/resources/resources.xml index ba55f7177..bbc0adc37 100644 --- a/eruption-gui/resources/resources.xml +++ b/eruption-gui/resources/resources.xml @@ -13,9 +13,11 @@ img/roccat-vulcan-tkl.png img/roccat-magma.png img/roccat-kone-xp.png + img/roccat-kone-xtd.png img/roccat-kone-pure-ultra.png img/roccat-kone-pro-air.png img/roccat-burst-pro.png + img/roccat-kone-aimo-remastered.png img/roccat-kain-100.png img/roccat-kain-2xx.png styles/app.css diff --git a/eruption-gui/src/ui/keyboard/hwdevices/corsair_strafe.rs b/eruption-gui/src/ui/keyboard/hwdevices/corsair_strafe.rs index 42ad02eda..dfc7c90d1 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/corsair_strafe.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/corsair_strafe.rs @@ -168,7 +168,7 @@ impl Keyboard for CorsairStrafe { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/keyboard/hwdevices/generic_keyboard.rs b/eruption-gui/src/ui/keyboard/hwdevices/generic_keyboard.rs index c68c5e150..a78f6afd8 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/generic_keyboard.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/generic_keyboard.rs @@ -168,7 +168,7 @@ impl Keyboard for GenericKeyboard { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/keyboard/hwdevices/roccat_magma.rs b/eruption-gui/src/ui/keyboard/hwdevices/roccat_magma.rs index 5337250eb..1bff384f5 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/roccat_magma.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/roccat_magma.rs @@ -168,7 +168,7 @@ impl Keyboard for RoccatMagma { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_1xx.rs b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_1xx.rs index ff5c65a6d..239f95177 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_1xx.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_1xx.rs @@ -168,7 +168,7 @@ impl Keyboard for RoccatVulcan1xx { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro.rs b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro.rs index 9b036a06d..339be9bb9 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro.rs @@ -168,7 +168,7 @@ impl Keyboard for RoccatVulcanPro { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro_tkl.rs b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro_tkl.rs index 24693b43b..0b63ef4a4 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro_tkl.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_pro_tkl.rs @@ -99,10 +99,10 @@ impl Keyboard for RoccatVulcanProTKL { (led_colors[MUTE_BUTTON_INDEX].r as f64 / 255.0), (led_colors[MUTE_BUTTON_INDEX].g as f64 / 255.0), (led_colors[MUTE_BUTTON_INDEX].b as f64 / 255.0), - (led_colors[MUTE_BUTTON_INDEX].a as f64 / 255.0), + 0.0, ); - let black = (0.0, 0.0, 0.0, 1.0); + let black = (0.0, 0.0, 0.0, 0.0); rounded_rectangle(context, 537.0, 44.0, 20.0, 7.0, 2.0, &black, &color)?; @@ -129,14 +129,13 @@ impl Keyboard for RoccatVulcanProTKL { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color let border_color = Hsva::from_color(source_color); let border_color = Srgba::from_color( - border_color - // .saturate(0.75) + border_color // .saturate(0.75) .lighten(0.4), ) .into_components(); diff --git a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_tkl.rs b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_tkl.rs index 38265d061..b1e751627 100644 --- a/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_tkl.rs +++ b/eruption-gui/src/ui/keyboard/hwdevices/roccat_vulcan_tkl.rs @@ -168,7 +168,7 @@ impl Keyboard for RoccatVulcanTKL { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat to use as the border color diff --git a/eruption-gui/src/ui/misc/hwdevices/roccat_aimo_pad.rs b/eruption-gui/src/ui/misc/hwdevices/roccat_aimo_pad.rs index ba2d4bfdc..126705291 100644 --- a/eruption-gui/src/ui/misc/hwdevices/roccat_aimo_pad.rs +++ b/eruption-gui/src/ui/misc/hwdevices/roccat_aimo_pad.rs @@ -99,7 +99,7 @@ impl MiscDevice for RoccatAimoPad { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat @@ -140,7 +140,7 @@ impl MiscDevice for RoccatAimoPad { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs b/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs index ecb260a2b..8d9113fc3 100644 --- a/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs +++ b/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs @@ -109,7 +109,7 @@ impl MiscDevice for RoccatElo71Air { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat @@ -139,7 +139,7 @@ impl MiscDevice for RoccatElo71Air { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/generic_mouse.rs b/eruption-gui/src/ui/mouse/hwdevices/generic_mouse.rs index 73c8ac80a..a006ee4f7 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/generic_mouse.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/generic_mouse.rs @@ -105,7 +105,7 @@ impl Mouse for GenericMouse { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/mod.rs b/eruption-gui/src/ui/mouse/hwdevices/mod.rs index bd350a104..bb1fc76e3 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/mod.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/mod.rs @@ -24,9 +24,15 @@ mod null_mouse; mod roccat_burst_pro; mod roccat_kain_100; mod roccat_kain_2xx; +mod roccat_kone_aimo; +mod roccat_kone_aimo_remastered; mod roccat_kone_pro_air; mod roccat_kone_pure_ultra; mod roccat_kone_xp; +mod roccat_kone_xtd; +mod roccat_kova_2016; +mod roccat_kova_aimo; +mod roccat_nyth; pub type Result = std::result::Result; @@ -47,6 +53,9 @@ pub fn get_mouse_device(device_handle: u64) -> Result> { // ROCCAT Kone XP (0x1e7d, 0x2c8b) => Ok(Box::new(roccat_kone_xp::RoccatKoneXp::new(device_handle))), + // ROCCAT Kone XTD + (0x1e7d, 0x2e22) => Ok(Box::new(roccat_kone_xtd::RoccatKoneXtd::new(device_handle))), + // ROCCAT Kone Pure Ultra (0x1e7d, 0x2dd2) => Ok(Box::new(roccat_kone_pure_ultra::RoccatKonePureUltra::new( device_handle, @@ -70,6 +79,31 @@ pub fn get_mouse_device(device_handle: u64) -> Result> { Ok(Box::new(roccat_kain_2xx::RoccatKain2xx::new(device_handle))) } + // ROCCAT Kone Aimo + (0x1e7d, 0x2e27) => Ok(Box::new(roccat_kone_aimo::RoccatKoneAimo::new( + device_handle, + ))), + + // ROCCAT Kone Aimo Remastered + (0x1e7d, 0x2e2c) => Ok(Box::new( + roccat_kone_aimo_remastered::RoccatKoneAimoRemastered::new(device_handle), + )), + + // ROCCAT Kova 2016 + (0x1e7d, 0x2cee) | (0x1e7d, 0x2cef) | (0x1e7d, 0x2cf0) => Ok(Box::new( + roccat_kova_2016::RoccatKova2016::new(device_handle), + )), + + // ROCCAT Kova Aimo + (0x1e7d, 0x2cf1) | (0x1e7d, 0x2cf3) => Ok(Box::new( + roccat_kova_aimo::RoccatKovaAimo::new(device_handle), + )), + + // ROCCAT Nyth + (0x1e7d, 0x2e7c) | (0x1e7d, 0x2e7d) => { + Ok(Box::new(roccat_nyth::RoccatNyth::new(device_handle))) + } + _ => Ok(Box::new(generic_mouse::GenericMouse::new(device_handle))), }, diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs index 3eb636b45..b1a118190 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatBurstPro { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatBurstPro { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs index 4ad2cfa9d..9792708fd 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatKain100 { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatKain100 { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs index de1ca405a..efc4d0f59 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatKain2xx { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatKain2xx { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs new file mode 100644 index 000000000..c3b36dfbe --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs @@ -0,0 +1,126 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use super::{Mouse, Rectangle}; + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatKoneAimo { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatKoneAimo { + pub fn new(device: u64) -> Self { + RoccatKoneAimo { + device, + pixbuf: Pixbuf::from_resource("/org/eruption/eruption-gui/img/generic-mouse.png") + .unwrap(), + } + } +} + +impl Mouse for RoccatKoneAimo { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Kone Aimo") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let scale_factor = 1.0; + + // let pixbuf = &self.pixbuf; + + // paint the schematic drawing + // context.scale(scale_factor, scale_factor); + // context.set_source_pixbuf(&pixbuf, 0.0, 0.0); + // context.paint()?; + + let led_colors = crate::COLOR_MAP.lock(); + + // paint all cells in the "mouse zone" of the canvas + for i in 144..(144 + 36) { + self.paint_cell( + i - 144, + &led_colors[i], + context, + width, + height, + scale_factor, + )?; + } + + Ok(()) + } + + fn paint_cell( + &self, + cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + _height: f64, + _scale_factor: f64, + ) -> Result<()> { + let cell_def = Rectangle { + x: (width / 2.0 - 100.0) + (cell_index % 6 * 45) as f64, + y: (cell_index / 6 * 45) as f64, + width: 43.0, + height: 43.0, + }; + + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0 + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + + Ok(()) + } +} diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo_remastered.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo_remastered.rs new file mode 100644 index 000000000..e7f14efd4 --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo_remastered.rs @@ -0,0 +1,168 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk::prelude::GdkContextExt; +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use crate::constants; + +use super::{Mouse, Rectangle}; + +const BORDER: (f64, f64) = (32.0, 32.0); + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatKoneAimoRemastered { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatKoneAimoRemastered { + pub fn new(device: u64) -> Self { + RoccatKoneAimoRemastered { + device, + pixbuf: Pixbuf::from_resource( + "/org/eruption/eruption-gui/img/roccat-kone-aimo-remastered.png", + ) + .unwrap(), + } + } +} + +impl Mouse for RoccatKoneAimoRemastered { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Kone Aimo Remastered") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let led_colors = crate::COLOR_MAP.lock(); + + let pixbuf = &self.pixbuf; + + let scale_factor = (height / pixbuf.height() as f64) * 0.85; + + for i in [constants::CANVAS_SIZE - 36, constants::CANVAS_SIZE - 1].iter() { + self.paint_cell( + i - 144, + &led_colors[*i], + context, + width, + height, + scale_factor, + )?; + } + + // paint the image + context.scale(scale_factor, scale_factor); + context.set_source_pixbuf(pixbuf, width / 2.0 + BORDER.0, BORDER.1); + context.paint()?; + + Ok(()) + } + + fn paint_cell( + &self, + cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + height: f64, + scale_factor: f64, + ) -> Result<()> { + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + match cell_index { + 0 => { + let cell_def = Rectangle { + x: ((width / 2.0) + 110.0 + BORDER.0 * scale_factor) * scale_factor, + y: ((height / 2.0) + BORDER.1 * scale_factor) - (200.0 * scale_factor), + width: 70.0 * scale_factor, + height: 100.0 * scale_factor, + }; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + } + + 35 => { + let cell_def = Rectangle { + x: ((width / 2.0) + 50.0 + BORDER.0 * scale_factor) * scale_factor, + y: ((height / 2.0) + BORDER.1 * scale_factor) - (110.0 * scale_factor), + width: 197.0 * scale_factor, + height: 310.0 * scale_factor, + }; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + } + + _ => { /* do nothing */ } + } + + Ok(()) + } +} diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs index 6ce78d112..5c26cbcff 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatKoneProAir { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatKoneProAir { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0 ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pure_ultra.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pure_ultra.rs index a69f32e14..7afccc673 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pure_ultra.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pure_ultra.rs @@ -109,7 +109,7 @@ impl Mouse for RoccatKonePureUltra { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xp.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xp.rs index 90bd4e8a7..977c4aed2 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xp.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xp.rs @@ -107,7 +107,7 @@ impl Mouse for RoccatKoneXp { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - color.a as f64 / 255.0, + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xtd.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xtd.rs new file mode 100644 index 000000000..0fca6678c --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_xtd.rs @@ -0,0 +1,128 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk::prelude::GdkContextExt; +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use super::{Mouse, Rectangle}; + +const BORDER: (f64, f64) = (32.0, 32.0); + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatKoneXtd { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatKoneXtd { + pub fn new(device: u64) -> Self { + RoccatKoneXtd { + device, + pixbuf: Pixbuf::from_resource("/org/eruption/eruption-gui/img/roccat-kone-xtd.png") + .unwrap(), + } + } +} + +impl Mouse for RoccatKoneXtd { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Kone XTD") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let led_colors = crate::COLOR_MAP.lock(); + + let pixbuf = &self.pixbuf; + + let scale_factor = (height / pixbuf.height() as f64) * 0.85; + + for i in 144..(144 + 1) { + self.paint_cell( + i - 144, + &led_colors[i], + context, + width, + height, + scale_factor, + )?; + } + + // paint the image + context.scale(scale_factor, scale_factor); + context.set_source_pixbuf(pixbuf, width / 2.0 + BORDER.0, BORDER.1); + context.paint()?; + + Ok(()) + } + + fn paint_cell( + &self, + _cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + height: f64, + scale_factor: f64, + ) -> Result<()> { + let cell_def = Rectangle { + x: ((width / 2.0) + 120.0 + BORDER.0 * scale_factor) * scale_factor, + y: ((height / 2.0) + BORDER.1 * scale_factor) + (162.0 * scale_factor), + width: 135.0 * scale_factor, + height: 90.0 * scale_factor, + }; + + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + + Ok(()) + } +} diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_2016.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_2016.rs new file mode 100644 index 000000000..db0041aa6 --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_2016.rs @@ -0,0 +1,126 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use super::{Mouse, Rectangle}; + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatKova2016 { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatKova2016 { + pub fn new(device: u64) -> Self { + RoccatKova2016 { + device, + pixbuf: Pixbuf::from_resource("/org/eruption/eruption-gui/img/generic-mouse.png") + .unwrap(), + } + } +} + +impl Mouse for RoccatKova2016 { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Kova 2016") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let scale_factor = 1.0; + + // let pixbuf = &self.pixbuf; + + // paint the schematic drawing + // context.scale(scale_factor, scale_factor); + // context.set_source_pixbuf(&pixbuf, 0.0, 0.0); + // context.paint()?; + + let led_colors = crate::COLOR_MAP.lock(); + + // paint all cells in the "mouse zone" of the canvas + for i in 144..(144 + 36) { + self.paint_cell( + i - 144, + &led_colors[i], + context, + width, + height, + scale_factor, + )?; + } + + Ok(()) + } + + fn paint_cell( + &self, + cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + _height: f64, + _scale_factor: f64, + ) -> Result<()> { + let cell_def = Rectangle { + x: (width / 2.0 - 100.0) + (cell_index % 6 * 45) as f64, + y: (cell_index / 6 * 45) as f64, + width: 43.0, + height: 43.0, + }; + + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + + Ok(()) + } +} diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_aimo.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_aimo.rs new file mode 100644 index 000000000..11b327947 --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kova_aimo.rs @@ -0,0 +1,126 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use super::{Mouse, Rectangle}; + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatKovaAimo { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatKovaAimo { + pub fn new(device: u64) -> Self { + RoccatKovaAimo { + device, + pixbuf: Pixbuf::from_resource("/org/eruption/eruption-gui/img/generic-mouse.png") + .unwrap(), + } + } +} + +impl Mouse for RoccatKovaAimo { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Kova AIMO") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let scale_factor = 1.0; + + // let pixbuf = &self.pixbuf; + + // paint the schematic drawing + // context.scale(scale_factor, scale_factor); + // context.set_source_pixbuf(&pixbuf, 0.0, 0.0); + // context.paint()?; + + let led_colors = crate::COLOR_MAP.lock(); + + // paint all cells in the "mouse zone" of the canvas + for i in 144..(144 + 36) { + self.paint_cell( + i - 144, + &led_colors[i], + context, + width, + height, + scale_factor, + )?; + } + + Ok(()) + } + + fn paint_cell( + &self, + cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + _height: f64, + _scale_factor: f64, + ) -> Result<()> { + let cell_def = Rectangle { + x: (width / 2.0 - 100.0) + (cell_index % 6 * 45) as f64, + y: (cell_index / 6 * 45) as f64, + width: 43.0, + height: 43.0, + }; + + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + + Ok(()) + } +} diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_nyth.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_nyth.rs new file mode 100644 index 000000000..0b7a7caaf --- /dev/null +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_nyth.rs @@ -0,0 +1,126 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +use gdk_pixbuf::Pixbuf; +use gtk::prelude::WidgetExt; +use palette::{FromColor, Hsva, Shade, Srgba}; + +use super::{Mouse, Rectangle}; + +pub type Result = std::result::Result; + +#[derive(Debug)] +pub struct RoccatNyth { + pub device: u64, + pub pixbuf: Pixbuf, +} + +impl RoccatNyth { + pub fn new(device: u64) -> Self { + RoccatNyth { + device, + pixbuf: Pixbuf::from_resource("/org/eruption/eruption-gui/img/generic-mouse.png") + .unwrap(), + } + } +} + +impl Mouse for RoccatNyth { + fn get_device(&self) -> u64 { + self.device + } + + fn get_make_and_model(&self) -> (&'static str, &'static str) { + ("ROCCAT", "Nyth") + } + + fn draw_mouse(&self, da: >k::DrawingArea, context: &cairo::Context) -> super::Result<()> { + let width = da.allocated_width() as f64; + let height = da.allocated_height() as f64; + + let scale_factor = 1.0; + + // let pixbuf = &self.pixbuf; + + // paint the schematic drawing + // context.scale(scale_factor, scale_factor); + // context.set_source_pixbuf(&pixbuf, 0.0, 0.0); + // context.paint()?; + + let led_colors = crate::COLOR_MAP.lock(); + + // paint all cells in the "mouse zone" of the canvas + for i in 144..(144 + 36) { + self.paint_cell( + i - 144, + &led_colors[i], + context, + width, + height, + scale_factor, + )?; + } + + Ok(()) + } + + fn paint_cell( + &self, + cell_index: usize, + color: &crate::util::RGBA, + cr: &cairo::Context, + width: f64, + _height: f64, + _scale_factor: f64, + ) -> Result<()> { + let cell_def = Rectangle { + x: (width / 2.0 - 100.0) + (cell_index % 6 * 45) as f64, + y: (cell_index / 6 * 45) as f64, + width: 43.0, + height: 43.0, + }; + + // compute scaling factor + let factor = + ((100.0 - crate::STATE.read().current_brightness.unwrap_or(0) as f64) / 100.0) * 0.15; + + // post-process color + let color = Srgba::new( + color.r as f64 / 255.0, + color.g as f64 / 255.0, + color.b as f64 / 255.0, + 0.0, + ); + + // saturate and lighten color somewhat + let color = Hsva::from_color(color); + let color = Srgba::from_color( + color + // .saturate(factor) + .lighten(factor), + ) + .into_components(); + + cr.set_source_rgba(color.0, color.1, color.2, 1.0 - color.3); + cr.rectangle(cell_def.x, cell_def.y, cell_def.width, cell_def.height); + cr.fill()?; + + Ok(()) + } +} diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index f6e70ef3c..1b7350528 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -42,7 +42,7 @@ pretty_env_logger = "0.4.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } #tracing = "0.1.26" @@ -53,7 +53,7 @@ toml = "0.5.9" thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.1" -bitvec = "1.0.0" +bitvec = "1.0.1" byteorder = "1.4.3" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } hexdump = "0.1.1" diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index cc384ce67..5792f6e83 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -57,17 +57,17 @@ hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" #mlua = { version = "0.7.3", features = ["luajit52"] } mlua = { version = "0.8.1", features = ["lua54"] } regex = "1.6.0" -dbus = "0.9.5" +dbus = "0.9.6" dbus-tokio = "0.7.5" udev = "0.6.3" evdev-rs = "0.5.0" lazy_static = "1.4.0" -bitvec = "1.0.0" +bitvec = "1.0.1" walkdir = "2.3.2" maplit = "1.0.2" pest = "2.1.3" pest_derive = "2.1.0" -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" serde_json_any_key = "2.0.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index 2c003566e..a31a3d6fb 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -61,7 +61,7 @@ thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.1" num-traits = "0.2.15" -dbus = { version = "0.9.5", optional = true } +dbus = { version = "0.9.6", optional = true } dbus-tokio = { version = "0.7.5", optional = true } image = "0.24.2" smithay-client-toolkit = { version = "0.16.0", optional = true } diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index 6471e47a3..d96ad8ad2 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -45,7 +45,7 @@ clap = { version = "3.2.8", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } config = "0.13.1" -dbus = "0.9.5" +dbus = "0.9.6" dbus-tokio = "0.7.5" dbus-tree = "0.9.2" dyn-clone = "1.0.6" @@ -58,7 +58,7 @@ nix = "0.24.1" pretty_env_logger = "0.4.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } regex = "1.6.0" -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } #tracing = "0.1.26" diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index 7cd93354f..cc39ada7c 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -52,7 +52,7 @@ hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" udev = "0.6.3" evdev-rs = "0.5.0" lazy_static = "1.4.0" -bitvec = "1.0.0" +bitvec = "1.0.1" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" rust-embed = "6.4.0" diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 7117b3d57..2034aeb1d 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -55,7 +55,7 @@ thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.1" toml = "0.5.9" -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } @@ -88,10 +88,10 @@ procinfo = "0.4.2" bincode = "2.0.0-rc.1" rustfft = "6.0.1" uuid = { version = "1.1.2", features = ["serde", "v4"] } -dbus = "0.9.5" +dbus = "0.9.6" dbus-tree = "0.9.2" paste = "1.0.7" -bitvec = "1.0.0" +bitvec = "1.0.1" serialport = "4.2.0" crc8 = "0.1.1" bytes = "1.1.0" diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index b917b6d39..74177f3d7 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -40,7 +40,7 @@ console = "0.15.0" log = "0.4.17" libc = "0.2.126" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.138", features = ["derive"] } +serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } #tracing = "0.1.26" @@ -54,7 +54,7 @@ eyre = "0.6.8" color-eyre = "0.6.1" comfy-table = "6.0.0" paste = "1.0.7" -dbus = "0.9.5" +dbus = "0.9.6" dbus-tokio = "0.7.5" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" diff --git a/sdk/lib/rust/eruption-rs/Cargo.toml b/sdk/lib/rust/eruption-rs/Cargo.toml index d453c1ce5..ee7d84912 100644 --- a/sdk/lib/rust/eruption-rs/Cargo.toml +++ b/sdk/lib/rust/eruption-rs/Cargo.toml @@ -40,7 +40,7 @@ nix = "0.24.1" futures = "0.3.21" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } flume = "0.10.13" -serde = "1.0.138" +serde = "1.0.139" bincode = "2.0.0-rc.1" prost = "0.10.4" prost-types = "0.10.1" From a1b445c0bcc152229b7e66f4674ab08523ce5dc7 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 12 Jul 2022 03:03:30 +0200 Subject: [PATCH 02/20] Update dependencies --- Cargo.lock | 4 ++-- eruption-audio-proxy/Cargo.toml | 2 +- eruption-cmd/Cargo.toml | 2 +- eruption-debug-tool/Cargo.toml | 2 +- eruption-gui/Cargo.toml | 2 +- eruption-hotplug-helper/Cargo.toml | 2 +- eruption-hwutil/Cargo.toml | 2 +- eruption-keymap/Cargo.toml | 2 +- eruption-netfx/Cargo.toml | 2 +- eruption-process-monitor/Cargo.toml | 2 +- eruption-util/Cargo.toml | 2 +- eruption-watchdog/Cargo.toml | 2 +- eruption/Cargo.toml | 2 +- eruptionctl/Cargo.toml | 2 +- sdk/examples/rust/simple/Cargo.toml | 2 +- sdk/lib/rust/eruption-rs/Cargo.toml | 2 +- sdk/lib/rust/liberuption/Cargo.toml | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6590f4896..223f1e1d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -466,9 +466,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" dependencies = [ "backtrace", "color-spantrace", diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index dda5199a6..3f0ea6ec0 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -49,7 +49,7 @@ ctrlc = { version = "3.2.2", features = ["termination"] } #tracing-subscriber = "0.2.20" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" hound = "3.4.0" bincode = "2.0.0-rc.1" rayon = "1.5.3" diff --git a/eruption-cmd/Cargo.toml b/eruption-cmd/Cargo.toml index 952d0a459..dfe24303f 100644 --- a/eruption-cmd/Cargo.toml +++ b/eruption-cmd/Cargo.toml @@ -46,7 +46,7 @@ tokio = { version = "1.19.2", features = ["full"] } flume = "0.10.13" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" lazy_static = "1.4.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index 14ce44150..26bb0d158 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -49,7 +49,7 @@ tokio = { version = "1.19.2", features = ["full"] } #tracing-subscriber = "0.2.20" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" hexdump = "0.1.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } bitvec = "1.0.1" diff --git a/eruption-gui/Cargo.toml b/eruption-gui/Cargo.toml index 8cc1a59be..f2a2358be 100644 --- a/eruption-gui/Cargo.toml +++ b/eruption-gui/Cargo.toml @@ -57,7 +57,7 @@ lazy_static = "1.4.0" palette = "0.6.0" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" paste = "1.0.7" dbus = "0.9.6" dbus-tokio = "0.7.5" diff --git a/eruption-hotplug-helper/Cargo.toml b/eruption-hotplug-helper/Cargo.toml index 5d740bdff..4c80d2125 100644 --- a/eruption-hotplug-helper/Cargo.toml +++ b/eruption-hotplug-helper/Cargo.toml @@ -44,7 +44,7 @@ tokio = { version = "1.19.2", features = ["full"] } #tracing-subscriber = "0.2.20" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" lockfile = "0.3.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index 1b7350528..0c7df646c 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -52,7 +52,7 @@ config = "0.13.1" toml = "0.5.9" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" bitvec = "1.0.1" byteorder = "1.4.3" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index 5792f6e83..b1a4a9f68 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -47,7 +47,7 @@ tracing-subscriber = "0.3.14" flume = "0.10.13" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" hexdump = "0.1.1" chrono = { version = "0.4.19", features = ["serde"] } hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index a31a3d6fb..14ee36aa3 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -59,7 +59,7 @@ tokio = { version = "1.19.2", features = ["full"] } #tracing-subscriber = "0.2.20" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" num-traits = "0.2.15" dbus = { version = "0.9.6", optional = true } dbus-tokio = { version = "0.7.5", optional = true } diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index d96ad8ad2..959255498 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -68,7 +68,7 @@ flume = "0.10.13" toml = "0.5.9" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" hotwatch = "0.4.6" lazy_static = "1.4.0" walkdir = "2.3.2" diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index cc39ada7c..536aeb329 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -46,7 +46,7 @@ tokio = { version = "1.19.2", features = ["full"] } flume = "0.10.13" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" hexdump = "0.1.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } udev = "0.6.3" diff --git a/eruption-watchdog/Cargo.toml b/eruption-watchdog/Cargo.toml index 0fe7851fa..76ca47f08 100644 --- a/eruption-watchdog/Cargo.toml +++ b/eruption-watchdog/Cargo.toml @@ -46,7 +46,7 @@ tokio = { version = "1.19.2", features = ["full"] } #tracing-subscriber = "0.2.20" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" lockfile = "0.3.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 2034aeb1d..c0a120caf 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -53,7 +53,7 @@ syslog = "6.0.1" pretty_env_logger = "0.4.0" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" toml = "0.5.9" serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 74177f3d7..3a9cfd8ab 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -51,7 +51,7 @@ uuid = { version = "1.1.2", features = ["serde", "v4"] } toml = "0.5.9" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" comfy-table = "6.0.0" paste = "1.0.7" dbus = "0.9.6" diff --git a/sdk/examples/rust/simple/Cargo.toml b/sdk/examples/rust/simple/Cargo.toml index 40580fc44..f5749e1b0 100644 --- a/sdk/examples/rust/simple/Cargo.toml +++ b/sdk/examples/rust/simple/Cargo.toml @@ -27,7 +27,7 @@ cfg-if = "1.0.0" log = "0.4.17" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" clap = "3.2.8" lazy_static = "1.4.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } diff --git a/sdk/lib/rust/eruption-rs/Cargo.toml b/sdk/lib/rust/eruption-rs/Cargo.toml index ee7d84912..c8c055722 100644 --- a/sdk/lib/rust/eruption-rs/Cargo.toml +++ b/sdk/lib/rust/eruption-rs/Cargo.toml @@ -34,7 +34,7 @@ cfg-if = "1.0.0" log = "0.4.17" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" libc = "0.2.126" nix = "0.24.1" futures = "0.3.21" diff --git a/sdk/lib/rust/liberuption/Cargo.toml b/sdk/lib/rust/liberuption/Cargo.toml index fee5d875e..d5837eda8 100644 --- a/sdk/lib/rust/liberuption/Cargo.toml +++ b/sdk/lib/rust/liberuption/Cargo.toml @@ -38,7 +38,7 @@ cfg-if = "1.0.0" log = "0.4.17" thiserror = "1.0.31" eyre = "0.6.8" -color-eyre = "0.6.1" +color-eyre = "0.6.2" lazy_static = "1.4.0" #i18n-embed = { version = "0.13.0", features = ["fluent-system", "desktop-requester"] } #rust-embed = "6.2.0" From 10c1822a9d10a4e3cc8b861a18041e9c1c906117 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 12 Jul 2022 06:03:54 +0200 Subject: [PATCH 03/20] Update `eruption-gui` Fix color pickers --- eruption-gui/src/ui/profiles.rs | 15 ++++++++------- eruption-gui/src/util.rs | 11 +++++++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/eruption-gui/src/ui/profiles.rs b/eruption-gui/src/ui/profiles.rs index 0f3e1ebe2..265664111 100644 --- a/eruption-gui/src/ui/profiles.rs +++ b/eruption-gui/src/ui/profiles.rs @@ -26,7 +26,7 @@ use crate::{manifest::Manifest, util}; use glib::clone; use glib::IsA; use gtk::builders::{ - AdjustmentBuilder, BoxBuilder, ButtonBuilder, ColorChooserWidgetBuilder, EntryBuilder, + AdjustmentBuilder, BoxBuilder, ButtonBuilder, ColorButtonBuilder, EntryBuilder, ExpanderBuilder, FrameBuilder, LabelBuilder, MessageDialogBuilder, ScaleBuilder, ScrolledWindowBuilder, SwitchBuilder, TreeViewColumnBuilder, }; @@ -460,16 +460,18 @@ macro_rules! declare_config_widget_color { // color chooser widget let rgba = util::color_to_gdk_rgba(value); - let chooser = ColorChooserWidgetBuilder::new() + let chooser = ColorButtonBuilder::new() .rgba(&rgba) .use_alpha(true) - .show_editor(false) + .show_editor(true) .build(); row2.pack_start(&chooser, false, true, 8); - chooser.connect_color_activated(clone!(@strong callback => move |_c, color| { - let value = util::gdk_rgba_to_color(color); + chooser.connect_color_set(clone!(@strong callback => move |c| { + let color = c.rgba(); + let value = util::gdk_rgba_to_color(&color); + callback(value); })); @@ -762,8 +764,7 @@ fn create_config_editor( } => profile .get_default_string(&script.name, name) .or_else(|| Some(default.clone())) - .unwrap() - , + .unwrap(), _ => return Err(ProfilesError::TypeMismatch {}.into()), } }; diff --git a/eruption-gui/src/util.rs b/eruption-gui/src/util.rs index f57c3d289..a7b8e45ca 100644 --- a/eruption-gui/src/util.rs +++ b/eruption-gui/src/util.rs @@ -90,9 +90,16 @@ pub fn color_to_gdk_rgba(c: u32) -> gdk::RGBA { let alpha = u8::try_from((c >> 24) & 0xff).unwrap(); let red = u8::try_from((c >> 16) & 0xff).unwrap(); let green = u8::try_from((c >> 8) & 0xff).unwrap(); - let blue = u8::try_from(c & 0xff).unwrap(); + let blue = u8::try_from((c >> 0) & 0xff).unwrap(); - gdk::RGBA::new(red as f64, green as f64, blue as f64, alpha as f64) + let result = gdk::RGBA::new( + red as f64 / 255.0, + green as f64 / 255.0, + blue as f64 / 255.0, + alpha as f64 / 255.0, + ); + + result } /// Switch the currently active profile From b02ac36eee662eaf1b2f33481436520c6cb87f59 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 12 Jul 2022 06:23:29 +0200 Subject: [PATCH 04/20] Update `eruption-keymap` Unify table implementations --- Cargo.lock | 143 ++-------------------------- eruption-audio-proxy/Cargo.toml | 2 +- eruption-cmd/Cargo.toml | 2 +- eruption-debug-tool/Cargo.toml | 2 +- eruption-hotplug-helper/Cargo.toml | 2 +- eruption-hwutil/Cargo.toml | 2 +- eruption-keymap/Cargo.toml | 4 +- eruption-keymap/src/main.rs | 64 ++++++++----- eruption-netfx/Cargo.toml | 2 +- eruption-process-monitor/Cargo.toml | 2 +- eruption-util/Cargo.toml | 2 +- eruption-watchdog/Cargo.toml | 2 +- eruption/Cargo.toml | 2 +- eruptionctl/Cargo.toml | 2 +- sdk/examples/rust/simple/Cargo.toml | 2 +- 15 files changed, 62 insertions(+), 173 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 223f1e1d0..06f7b69c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,12 +88,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - [[package]] name = "arrayvec" version = "0.5.2" @@ -215,17 +209,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block" version = "0.1.6" @@ -268,10 +251,7 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ - "lazy_static", "memchr", - "regex-automata", - "serde", ] [[package]] @@ -409,9 +389,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.8" +version = "3.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190814073e85d238f31ff738fcb0bf6910cedeb73376c87cd69291028966fd83" +checksum = "69c5a7f9997be616e47f0577ee38c91decb33392c5be4866494f34cdf329a9aa" dependencies = [ "atty", "bitflags", @@ -563,12 +543,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -722,28 +696,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "csv" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" -dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" -dependencies = [ - "memchr", -] - [[package]] name = "ctor" version = "0.1.22" @@ -852,17 +804,6 @@ dependencies = [ "generic-array 0.14.5", ] -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - [[package]] name = "dlib" version = "0.5.0" @@ -1247,6 +1188,7 @@ dependencies = [ "clap_complete", "color-eyre", "colored", + "comfy-table", "ctrlc", "dbus", "dbus-tokio", @@ -1269,7 +1211,6 @@ dependencies = [ "pest_derive", "pretty_assertions", "pretty_env_logger", - "prettytable-rs", "regex", "rust-embed", "serde", @@ -1572,7 +1513,7 @@ checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.2.13", + "redox_syscall", "windows-sys", ] @@ -2386,12 +2327,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.2" @@ -3241,7 +3176,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "petgraph", - "redox_syscall 0.2.13", + "redox_syscall", "smallvec", "thread-id", "windows-sys", @@ -3509,20 +3444,6 @@ dependencies = [ "log", ] -[[package]] -name = "prettytable-rs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd04b170004fa2daccf418a7f8253aaf033c27760b5f225889024cf66d7ac2e" -dependencies = [ - "atty", - "csv", - "encode_unicode", - "lazy_static", - "term", - "unicode-width", -] - [[package]] name = "primal-check" version = "0.3.1" @@ -3787,12 +3708,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.2.13" @@ -3802,17 +3717,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_users" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" -dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - [[package]] name = "regex" version = "1.6.0" @@ -3824,12 +3728,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" version = "0.6.27" @@ -3856,18 +3754,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - [[package]] name = "rust-embed" version = "6.4.0" @@ -4077,7 +3963,7 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa 1.0.2", + "itoa", "ryu", "serde", ] @@ -4438,22 +4324,11 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "libc", - "redox_syscall 0.2.13", + "redox_syscall", "remove_dir_all", "winapi 0.3.9", ] -[[package]] -name = "term" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" -dependencies = [ - "byteorder", - "dirs", - "winapi 0.3.9", -] - [[package]] name = "termcolor" version = "1.1.3" @@ -4506,7 +4381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fdfe0627923f7411a43ec9ec9c39c3a9b4151be313e0922042581fb6c9b717f" dependencies = [ "libc", - "redox_syscall 0.2.13", + "redox_syscall", "winapi 0.3.9", ] @@ -4567,7 +4442,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ - "itoa 1.0.2", + "itoa", "libc", "num_threads", ] diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index 3f0ea6ec0..e8d4d9ce2 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" serde = { version = "1.0.139", features = ["derive"] } lazy_static = "1.4.0" diff --git a/eruption-cmd/Cargo.toml b/eruption-cmd/Cargo.toml index dfe24303f..de6b94d12 100644 --- a/eruption-cmd/Cargo.toml +++ b/eruption-cmd/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index 26bb0d158..0dc843a2e 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" lazy_static = "1.4.0" cfg-if = "1.0.0" flume = "0.10.13" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" colored = "2.0.0" ctrlc = { version = "3.2.2", features = ["termination"] } diff --git a/eruption-hotplug-helper/Cargo.toml b/eruption-hotplug-helper/Cargo.toml index 4c80d2125..7643cfd08 100644 --- a/eruption-hotplug-helper/Cargo.toml +++ b/eruption-hotplug-helper/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" log = "0.4.17" syslog = "6.0.1" diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index 0c7df646c..7a3f75511 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" cfg-if = "1.0.0" flume = "0.10.13" lazy_static = "1.4.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index b1a4a9f68..6492e3901 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -30,13 +30,13 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -prettytable-rs = "0.8.0" +comfy-table = "6.0.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } diff --git a/eruption-keymap/src/main.rs b/eruption-keymap/src/main.rs index 2280dd7d3..e5a6146b0 100644 --- a/eruption-keymap/src/main.rs +++ b/eruption-keymap/src/main.rs @@ -21,6 +21,9 @@ use clap::{IntoApp, Parser}; use clap_complete::Shell; use color_eyre::owo_colors::OwoColorize; use colored::*; +use comfy_table::{ + modifiers::UTF8_ROUND_CORNERS, presets::UTF8_FULL, Cell, ContentArrangement, Table, +}; use evdev_rs::enums::{EventCode, EV_KEY}; use flume::unbounded; use i18n_embed::{ @@ -30,7 +33,6 @@ use i18n_embed::{ use lazy_static::lazy_static; use log::*; use parking_lot::Mutex; -use prettytable::{cell, row, Cell, Row, Table}; use rust_embed::RustEmbed; use std::{ collections::BTreeMap, @@ -577,33 +579,41 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { println!("Description: {}", table.description().bold()); let mut tab = Table::new(); - tab.add_row(row!( - '#', - tr!("source"), - tr!("action"), - tr!("description"), - tr!("flags") - )); + tab.load_preset(UTF8_FULL) + .apply_modifier(UTF8_ROUND_CORNERS) + .set_content_arrangement(ContentArrangement::Dynamic) + // .set_width(40) + .set_header(vec![ + "#", + &tr!("source"), + &tr!("action"), + &tr!("description"), + &tr!("flags"), + ]); for (index, (source, action)) in table.mappings().iter().enumerate() { - tab.add_row(Row::new(vec![ + let description = if action.description.trim().is_empty() { + Cell::new(&format!("{}", tr!("n-a").italic())) + } else { + Cell::new(&format!("{}", action.description)) + }; + + let enabled = if action.enabled { + Cell::new(&format!("{}", tr!("enabled"))) + } else { + Cell::new(&format!("{}", tr!("disabled"))) + }; + + tab.add_row(vec![ Cell::new(&format!("{}", index + 1)), Cell::new(&format!("{}", source)), Cell::new(&format!("{}", action)), - if action.description.trim().is_empty() { - Cell::new(&format!("{}", tr!("n-a").italic())) - } else { - Cell::new(&format!("{}", action.description)) - }, - if action.enabled { - Cell::new(&format!("{}", tr!("enabled"))) - } else { - Cell::new(&format!("{}", tr!("disabled"))) - }, - ])); + description, + enabled, + ]); } - tab.printstd(); + println!("{}", tab); } Subcommands::Compile { keymap } => { @@ -645,17 +655,21 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { let event = EventCode::EV_KEY(EV_KEY::KEY_RESERVED); let mut tab = Table::new(); - tab.add_row(row!('#', tr!("symbol"), tr!("code"))); + tab.load_preset(UTF8_FULL) + .apply_modifier(UTF8_ROUND_CORNERS) + .set_content_arrangement(ContentArrangement::Dynamic) + // .set_width(40) + .set_header(vec![&tr!("symbol"), &tr!("code")]); for (index, code) in event.iter().enumerate() { - tab.add_row(Row::new(vec![ + tab.add_row(vec![ Cell::new(&format!("{}", index + 1)), Cell::new(&format!("{}", code.to_string())), Cell::new(&format!("{}", util::evdev_key_event_to_int(code))), - ])); + ]); } - tab.printstd(); + println!("{}", tab); } Subcommands::Completions { shell } => { diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index 14ee36aa3..ce7e89100 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -38,7 +38,7 @@ backend-x11 = ["x11", "x11rb"] [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" colored = "2.0.0" log = "0.4.17" diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index 959255498..608390a38 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -41,7 +41,7 @@ sensor-mutter = [] cfg-if = "1.0.0" async-trait = "0.1.56" byteorder = "1.4.3" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } config = "0.13.1" diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index 536aeb329..8e5522e52 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" diff --git a/eruption-watchdog/Cargo.toml b/eruption-watchdog/Cargo.toml index 76ca47f08..6d6327a45 100644 --- a/eruption-watchdog/Cargo.toml +++ b/eruption-watchdog/Cargo.toml @@ -31,7 +31,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" flume = "0.10.13" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } log = "0.4.17" diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index c0a120caf..3b9c7333c 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -60,7 +60,7 @@ serde_json = "1.0.82" tokio = { version = "1.19.2", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } ctrlc = { version = "3.2.2", features = ["termination"] } -clap = "3.2.8" +clap = "3.2.10" hotwatch = "0.4.6" config = "0.13.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 3a9cfd8ab..c9df59309 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -31,7 +31,7 @@ resolver = "2" [dependencies] lazy_static = "1.4.0" flume = "0.10.13" -clap = { version = "3.2.8", features = ["derive"] } +clap = { version = "3.2.10", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } cfg-if = "1.0.0" diff --git a/sdk/examples/rust/simple/Cargo.toml b/sdk/examples/rust/simple/Cargo.toml index f5749e1b0..43c2cd803 100644 --- a/sdk/examples/rust/simple/Cargo.toml +++ b/sdk/examples/rust/simple/Cargo.toml @@ -28,7 +28,7 @@ log = "0.4.17" thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.2" -clap = "3.2.8" +clap = "3.2.10" lazy_static = "1.4.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } rust-embed = "6.4.0" From ad6adb12acb7e1892301fc3aacbfea688ba3ae6e Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 12 Jul 2022 08:34:10 +0200 Subject: [PATCH 05/20] Fix latency in audio visualizers --- support/systemd/eruption-audio-proxy.service | 1 + 1 file changed, 1 insertion(+) diff --git a/support/systemd/eruption-audio-proxy.service b/support/systemd/eruption-audio-proxy.service index 429b8a1d8..cea339c70 100644 --- a/support/systemd/eruption-audio-proxy.service +++ b/support/systemd/eruption-audio-proxy.service @@ -9,6 +9,7 @@ After=graphical-session.target sound.target [Service] Environment=RUST_LOG=warn +Environment=PULSE_LATENCY_MSEC=30 ExecStart=/usr/bin/eruption-audio-proxy -c /etc/eruption/audio-proxy.conf daemon # PIDFile=/run/eruption-audio-proxy.pid Type=exec From 547e7c53c7c6b23fbc9120bcfd0ecad46cb9c03e Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Fri, 15 Jul 2022 07:02:30 +0200 Subject: [PATCH 06/20] Update dependencies --- Cargo.lock | 17 +++++++++-------- eruption-audio-proxy/Cargo.toml | 6 +++--- eruption-cmd/Cargo.toml | 6 +++--- eruption-debug-tool/Cargo.toml | 6 +++--- eruption-gui/Cargo.toml | 4 ++-- eruption-hotplug-helper/Cargo.toml | 6 +++--- eruption-hwutil/Cargo.toml | 6 +++--- eruption-keymap/Cargo.toml | 6 +++--- eruption-netfx/Cargo.toml | 6 +++--- eruption-process-monitor/Cargo.toml | 6 +++--- eruption-util/Cargo.toml | 6 +++--- eruption-watchdog/Cargo.toml | 6 +++--- eruption/Cargo.toml | 8 ++++---- eruption/src/scripting/script.rs | 4 ++-- eruptionctl/Cargo.toml | 6 +++--- sdk/examples/rust/simple/Cargo.toml | 2 +- 16 files changed, 51 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 06f7b69c1..f5ff1dffb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,9 +389,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.10" +version = "3.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c5a7f9997be616e47f0577ee38c91decb33392c5be4866494f34cdf329a9aa" +checksum = "ab8b79fe3946ceb4a0b1c080b4018992b8d27e9ff363644c1c9b6387c854614d" dependencies = [ "atty", "bitflags", @@ -679,9 +679,9 @@ dependencies = [ [[package]] name = "csscolorparser" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841475b11553e394b89eebb5cdfe8ca0b960005ad464bca369ade02a62da053e" +checksum = "80ab25764ba7edca4f546ee81e5471d04cb3143dfdc28f19168a8b58d3a2c8af" dependencies = [ "phf 0.10.1", ] @@ -4204,9 +4204,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530c2b0d0bf8b69304b39fe2001993e267461948b890cd037d8ad4293fa1a0d" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" dependencies = [ "lock_api", ] @@ -4455,10 +4455,11 @@ checksum = "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1" [[package]] name = "tokio" -version = "1.19.2" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" dependencies = [ + "autocfg", "bytes", "libc", "memchr", diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index e8d4d9ce2..45399301d 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" serde = { version = "1.0.139", features = ["derive"] } lazy_static = "1.4.0" @@ -41,7 +41,7 @@ pretty_env_logger = "0.4.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } ctrlc = { version = "3.2.2", features = ["termination"] } #tracing = "0.1.26" @@ -71,7 +71,7 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } [build-dependencies] prost-build = "0.10.4" diff --git a/eruption-cmd/Cargo.toml b/eruption-cmd/Cargo.toml index de6b94d12..5755167ef 100644 --- a/eruption-cmd/Cargo.toml +++ b/eruption-cmd/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" @@ -39,7 +39,7 @@ pretty_env_logger = "0.4.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -56,4 +56,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index 0dc843a2e..70b83a0bb 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" lazy_static = "1.4.0" cfg-if = "1.0.0" flume = "0.10.13" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" colored = "2.0.0" ctrlc = { version = "3.2.2", features = ["termination"] } @@ -43,7 +43,7 @@ nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -64,4 +64,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-gui/Cargo.toml b/eruption-gui/Cargo.toml index f2a2358be..26eab6960 100644 --- a/eruption-gui/Cargo.toml +++ b/eruption-gui/Cargo.toml @@ -44,7 +44,7 @@ walkdir = "2.3.2" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.29" #tracing-futures = "0.2.5" #tracing-subscriber = "0.3.2" @@ -85,4 +85,4 @@ icecream = "0.1.0" pretty_assertions = "1.2.1" [dev-dependencies] -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-hotplug-helper/Cargo.toml b/eruption-hotplug-helper/Cargo.toml index 7643cfd08..97112a9e4 100644 --- a/eruption-hotplug-helper/Cargo.toml +++ b/eruption-hotplug-helper/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" log = "0.4.17" syslog = "6.0.1" @@ -38,7 +38,7 @@ lazy_static = "1.4.0" pretty_env_logger = "0.4.0" libc = "0.2.126" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -55,4 +55,4 @@ eruption-rs = { path = "../sdk/lib/rust/eruption-rs" } [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index 7a3f75511..09946660f 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" cfg-if = "1.0.0" flume = "0.10.13" lazy_static = "1.4.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" @@ -44,7 +44,7 @@ nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -67,4 +67,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index 6492e3901..f637e70fb 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" @@ -40,7 +40,7 @@ comfy-table = "6.0.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } tracing = "0.1.35" tracing-futures = "0.2.5" tracing-subscriber = "0.3.14" @@ -78,4 +78,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index ce7e89100..1a16f4d2c 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -38,7 +38,7 @@ backend-x11 = ["x11", "x11rb"] [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" colored = "2.0.0" log = "0.4.17" @@ -53,7 +53,7 @@ tempfile = "3.3.0" rayon = "1.5.3" jwalk = "0.6.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -76,4 +76,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index 608390a38..846e4b547 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -41,7 +41,7 @@ sensor-mutter = [] cfg-if = "1.0.0" async-trait = "0.1.56" byteorder = "1.4.3" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } config = "0.13.1" @@ -60,7 +60,7 @@ parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } regex = "1.6.0" serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -82,4 +82,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index 8e5522e52..9cef91f22 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -30,7 +30,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } colored = "2.0.0" @@ -39,7 +39,7 @@ pretty_env_logger = "0.4.0" libc = "0.2.126" nix = "0.24.1" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -61,4 +61,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption-watchdog/Cargo.toml b/eruption-watchdog/Cargo.toml index 6d6327a45..c32388f93 100644 --- a/eruption-watchdog/Cargo.toml +++ b/eruption-watchdog/Cargo.toml @@ -31,7 +31,7 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" flume = "0.10.13" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } log = "0.4.17" @@ -40,7 +40,7 @@ lazy_static = "1.4.0" pretty_env_logger = "0.4.0" libc = "0.2.126" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -57,4 +57,4 @@ eruption-rs = { path = "../sdk/lib/rust/eruption-rs" } [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 3b9c7333c..077e38c16 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -57,10 +57,10 @@ color-eyre = "0.6.2" toml = "0.5.9" serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } ctrlc = { version = "3.2.2", features = ["termination"] } -clap = "3.2.10" +clap = "3.2.12" hotwatch = "0.4.6" config = "0.13.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } @@ -72,7 +72,7 @@ itertools = "0.10.3" rayon = "1.5.3" lazy_static = "1.4.0" rand = "0.8.5" -csscolorparser = "0.6.0" +csscolorparser = "0.6.1" colorgrad = "0.6.0" palette = "0.6.0" nalgebra = "0.31.0" @@ -108,7 +108,7 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" thiserror = "1.0.31" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } [build-dependencies] prost-build = "0.10.4" diff --git a/eruption/src/scripting/script.rs b/eruption/src/scripting/script.rs index 1b5ca8fda..70d3d0df5 100644 --- a/eruption/src/scripting/script.rs +++ b/eruption/src/scripting/script.rs @@ -441,7 +441,7 @@ mod callbacks { pub(crate) fn parse_color(val: &str) -> Result { match csscolorparser::parse(val) { Ok(color) => { - let (r, g, b, a) = color.rgba_u8(); + let (r, g, b, a) = color.to_linear_rgba_u8(); Ok(rgba_to_color(r, g, b, a)) } @@ -547,7 +547,7 @@ mod callbacks { if let Some(gradient) = m.get(&handle) { let color = gradient.at(pos); - let (r, g, b, a) = color.rgba_u8(); + let (r, g, b, a) = color.to_linear_rgba_u8(); Ok(rgba_to_color(r, g, b, a)) } else { diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index c9df59309..049c1ba62 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -31,7 +31,7 @@ resolver = "2" [dependencies] lazy_static = "1.4.0" flume = "0.10.13" -clap = { version = "3.2.10", features = ["derive"] } +clap = { version = "3.2.12", features = ["derive"] } clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } cfg-if = "1.0.0" @@ -42,7 +42,7 @@ libc = "0.2.126" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.139", features = ["derive"] } serde_json = "1.0.82" -tokio = { version = "1.19.2", features = ["full"] } +tokio = { version = "1.20.0", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" @@ -64,4 +64,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.19.2", features = ["test-util"] } +tokio = { version = "1.20.0", features = ["test-util"] } diff --git a/sdk/examples/rust/simple/Cargo.toml b/sdk/examples/rust/simple/Cargo.toml index 43c2cd803..ca9871891 100644 --- a/sdk/examples/rust/simple/Cargo.toml +++ b/sdk/examples/rust/simple/Cargo.toml @@ -28,7 +28,7 @@ log = "0.4.17" thiserror = "1.0.31" eyre = "0.6.8" color-eyre = "0.6.2" -clap = "3.2.10" +clap = "3.2.12" lazy_static = "1.4.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } rust-embed = "6.4.0" From 343e9e20dc8c965001819e5a4f459a5003b54850 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Fri, 15 Jul 2022 08:20:53 +0200 Subject: [PATCH 07/20] Update dependencies --- Cargo.lock | 4 ++-- eruption-process-monitor/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f5ff1dffb..b1743556b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -848,9 +848,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140206b78fb2bc3edbcfc9b5ccbd0b30699cfe8d348b8b31b330e47df5291a5a" +checksum = "435217f1b2d06f00513185fb991cd426271d9e4c3a9d9b25b919b8e5a03b282d" [[package]] name = "either" diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index 846e4b547..ee3d0def1 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -48,7 +48,7 @@ config = "0.13.1" dbus = "0.9.6" dbus-tokio = "0.7.5" dbus-tree = "0.9.2" -dyn-clone = "1.0.6" +dyn-clone = "1.0.7" dyn-clonable = "0.9.0" indexmap = "1.9.1" log = "0.4.17" From 954b2f3f622bc4ccfe6a24c943516406a8633f86 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Fri, 15 Jul 2022 08:21:57 +0200 Subject: [PATCH 08/20] Run `cargo fmt` --- eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs | 4 ++-- eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs | 4 ++-- eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs | 2 +- eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs | 2 +- eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs | 2 +- eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs | 4 ++-- eruption-keymap/src/hwdevices/generic_keyboard.rs | 1 - eruption-keymap/src/hwdevices/roccat_magma.rs | 1 - eruption-keymap/src/hwdevices/roccat_vulcan_1xx.rs | 1 - eruption-keymap/src/hwdevices/roccat_vulcan_pro.rs | 1 - 10 files changed, 9 insertions(+), 13 deletions(-) diff --git a/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs b/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs index 8d9113fc3..15a36be11 100644 --- a/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs +++ b/eruption-gui/src/ui/misc/hwdevices/roccat_elo_71_air.rs @@ -109,7 +109,7 @@ impl MiscDevice for RoccatElo71Air { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat @@ -139,7 +139,7 @@ impl MiscDevice for RoccatElo71Air { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs index b1a118190..55091fae2 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_burst_pro.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatBurstPro { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatBurstPro { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs index 9792708fd..cb87cae02 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_100.rs @@ -141,7 +141,7 @@ impl Mouse for RoccatKain100 { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs index efc4d0f59..c259c0783 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kain_2xx.rs @@ -141,7 +141,7 @@ impl Mouse for RoccatKain2xx { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs index c3b36dfbe..0ca04cee0 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_aimo.rs @@ -105,7 +105,7 @@ impl Mouse for RoccatKoneAimo { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs index 5c26cbcff..30a0538ff 100644 --- a/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs +++ b/eruption-gui/src/ui/mouse/hwdevices/roccat_kone_pro_air.rs @@ -111,7 +111,7 @@ impl Mouse for RoccatKoneProAir { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat @@ -141,7 +141,7 @@ impl Mouse for RoccatKoneProAir { color.r as f64 / 255.0, color.g as f64 / 255.0, color.b as f64 / 255.0, - 0.0 + 0.0, ); // saturate and lighten color somewhat diff --git a/eruption-keymap/src/hwdevices/generic_keyboard.rs b/eruption-keymap/src/hwdevices/generic_keyboard.rs index 02e930a3a..b94ccc8db 100644 --- a/eruption-keymap/src/hwdevices/generic_keyboard.rs +++ b/eruption-keymap/src/hwdevices/generic_keyboard.rs @@ -18,4 +18,3 @@ */ #![allow(unused)] - diff --git a/eruption-keymap/src/hwdevices/roccat_magma.rs b/eruption-keymap/src/hwdevices/roccat_magma.rs index 0db26817e..9d9af4639 100644 --- a/eruption-keymap/src/hwdevices/roccat_magma.rs +++ b/eruption-keymap/src/hwdevices/roccat_magma.rs @@ -19,7 +19,6 @@ #![allow(unused)] - /// Map evdev event codes to key indices, for ISO variant #[rustfmt::skip] pub const EV_TO_INDEX_ISO: [u8; 0x2ff + 1] = [ diff --git a/eruption-keymap/src/hwdevices/roccat_vulcan_1xx.rs b/eruption-keymap/src/hwdevices/roccat_vulcan_1xx.rs index 894a0b96c..d18f759d5 100644 --- a/eruption-keymap/src/hwdevices/roccat_vulcan_1xx.rs +++ b/eruption-keymap/src/hwdevices/roccat_vulcan_1xx.rs @@ -19,7 +19,6 @@ #![allow(unused)] - /// Map evdev event codes to key indices, for ISO variant #[rustfmt::skip] pub const EV_TO_INDEX_ISO: [u8; 0x2ff + 1] = [ diff --git a/eruption-keymap/src/hwdevices/roccat_vulcan_pro.rs b/eruption-keymap/src/hwdevices/roccat_vulcan_pro.rs index c8c253275..76f113c52 100644 --- a/eruption-keymap/src/hwdevices/roccat_vulcan_pro.rs +++ b/eruption-keymap/src/hwdevices/roccat_vulcan_pro.rs @@ -19,7 +19,6 @@ #![allow(unused)] - /// Map evdev event codes to key indices, for ISO variant #[rustfmt::skip] pub const EV_TO_INDEX_ISO: [u8; 0x2ff + 1] = [ From 35da512b6f587045b2678e77aedc2fcc66c74579 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Fri, 15 Jul 2022 20:47:45 +0200 Subject: [PATCH 09/20] Add support for named color schemes Add Support for color palettes Create colorgrad based gradients from named color schemes Enable `eruptionctl` to process `Pywal` generated `*.json` files Add new `lava-lamp-syscolors.profile` that makes use of the new feature References #152 --- Cargo.lock | 3 +- eruption/Cargo.toml | 2 +- eruption/src/color_scheme.rs | 157 ++++++++++++++ eruption/src/dbus_interface.rs | 40 +++- eruption/src/main.rs | 10 +- eruption/src/scripting/script.rs | 43 +++- eruptionctl/Cargo.toml | 3 +- eruptionctl/i18n/de-DE/eruptionctl.ftl | 1 + eruptionctl/i18n/en-US/eruptionctl.ftl | 1 + eruptionctl/src/color_scheme.rs | 1 + eruptionctl/src/dbus_client.rs | 200 ++++++++++-------- eruptionctl/src/main.rs | 92 +++++++- support/pkg/arch/PKGBUILD | 1 + support/pkg/arch/PKGBUILD-git | 1 + support/pkg/debian-git/install | 1 + support/pkg/debian/install | 1 + support/pkg/fedora/eruption-git.spec | 2 + support/pkg/fedora/eruption.spec | 2 + support/profiles/lava-lamp-syscolors.profile | 132 ++++++++++++ .../en_US/eruptionctl.bash-completion | 81 ++++++- .../en_US/eruptionctl.elvish-completion | 21 ++ .../en_US/eruptionctl.fish-completion | 8 + .../en_US/eruptionctl.powershell-completion | 26 +++ .../en_US/eruptionctl.zsh-completion | 85 ++++++++ 24 files changed, 819 insertions(+), 95 deletions(-) create mode 100644 eruption/src/color_scheme.rs create mode 120000 eruptionctl/src/color_scheme.rs create mode 100644 support/profiles/lava-lamp-syscolors.profile diff --git a/Cargo.lock b/Cargo.lock index b1743556b..858b9ba72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1397,7 +1397,7 @@ dependencies = [ [[package]] name = "eruptionctl" -version = "0.0.17" +version = "0.0.18" dependencies = [ "cfg-if 1.0.0", "clap", @@ -1407,6 +1407,7 @@ dependencies = [ "comfy-table", "config", "console", + "csscolorparser", "ctrlc", "dbus", "dbus-tokio", diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 077e38c16..4fd53992d 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -72,8 +72,8 @@ itertools = "0.10.3" rayon = "1.5.3" lazy_static = "1.4.0" rand = "0.8.5" -csscolorparser = "0.6.1" colorgrad = "0.6.0" +csscolorparser = "0.6.1" palette = "0.6.0" nalgebra = "0.31.0" noise = "0.7.0" diff --git a/eruption/src/color_scheme.rs b/eruption/src/color_scheme.rs new file mode 100644 index 000000000..f00c0620f --- /dev/null +++ b/eruption/src/color_scheme.rs @@ -0,0 +1,157 @@ +/* + This file is part of Eruption. + + Eruption is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Eruption is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eruption. If not, see . + + Copyright (c) 2019-2022, The Eruption Development Team +*/ + +#![allow(dead_code)] + +use std::path::PathBuf; + +use csscolorparser; +use csscolorparser::Color; +use serde::{Deserialize, Serialize}; + +pub type Result = std::result::Result; + +#[derive(Debug, thiserror::Error)] +pub enum ColorSchemeError { + #[error("File not found: {description}")] + FileNotFound { description: String }, + + #[error("Could not load state: {description}")] + StateLoadError { description: String }, + + #[error("Could not save state: {description}")] + StateWriteError { description: String }, + + #[error("Invalid index: {description}")] + InvalidIndex { description: String }, +} + +pub trait ColorSchemeExt { + fn num_colors(&self) -> usize; + fn color_rgba_at(&self, index: usize) -> Result; +} + +#[derive(Debug)] +pub struct ColorScheme { + pub colors: Vec, +} + +impl ColorSchemeExt for ColorScheme { + fn num_colors(&self) -> usize { + self.colors.len() + } + + fn color_rgba_at(&self, index: usize) -> Result { + Ok(self + .colors + .get(index) + .ok_or_else(|| ColorSchemeError::InvalidIndex { + description: format!("{}", index), + })? + .to_owned()) + } +} + +impl TryFrom for ColorScheme { + type Error = eyre::Error; + + fn try_from(value: PywalColorScheme) -> std::result::Result { + let count = value.num_colors(); + let mut colors = Vec::new(); + + for index in 0..count { + let color = value.color_rgba_at(index)?; + + colors.push(color); + } + + Ok(Self { colors }) + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub struct PywalColorScheme { + pub wallpaper: PathBuf, + pub alpha: String, + + pub special: PaletteSpecial, + pub colors: Palette16, +} + +impl ColorSchemeExt for PywalColorScheme { + fn num_colors(&self) -> usize { + 16 + } + + fn color_rgba_at(&self, index: usize) -> Result { + match index { + 0 => Ok(csscolorparser::parse(&self.colors.color0)?), + 1 => Ok(csscolorparser::parse(&self.colors.color1)?), + 2 => Ok(csscolorparser::parse(&self.colors.color2)?), + 3 => Ok(csscolorparser::parse(&self.colors.color3)?), + 4 => Ok(csscolorparser::parse(&self.colors.color4)?), + 5 => Ok(csscolorparser::parse(&self.colors.color5)?), + 6 => Ok(csscolorparser::parse(&self.colors.color6)?), + 7 => Ok(csscolorparser::parse(&self.colors.color7)?), + 8 => Ok(csscolorparser::parse(&self.colors.color8)?), + 9 => Ok(csscolorparser::parse(&self.colors.color9)?), + 10 => Ok(csscolorparser::parse(&self.colors.color10)?), + 11 => Ok(csscolorparser::parse(&self.colors.color11)?), + 12 => Ok(csscolorparser::parse(&self.colors.color12)?), + 13 => Ok(csscolorparser::parse(&self.colors.color13)?), + 14 => Ok(csscolorparser::parse(&self.colors.color14)?), + 15 => Ok(csscolorparser::parse(&self.colors.color15)?), + + _ => Err(ColorSchemeError::InvalidIndex { + description: format!("{}", index), + } + .into()), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub struct PaletteSpecial { + pub background: String, + pub foreground: String, + pub cursor: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub struct Palette16 { + pub color0: String, + pub color1: String, + pub color2: String, + pub color3: String, + pub color4: String, + pub color5: String, + pub color6: String, + pub color7: String, + pub color8: String, + pub color9: String, + pub color10: String, + pub color11: String, + pub color12: String, + pub color13: String, + pub color14: String, + pub color15: String, +} diff --git a/eruption/src/dbus_interface.rs b/eruption/src/dbus_interface.rs index aa89d9514..af40ab306 100644 --- a/eruption/src/dbus_interface.rs +++ b/eruption/src/dbus_interface.rs @@ -17,6 +17,7 @@ Copyright (c) 2019-2022, The Eruption Development Team */ +use colorgrad::Color; use dbus::{ffidisp::BusType, ffidisp::Connection, ffidisp::NameFlag, message::SignalArgs}; use dbus_tree::{ Access, MethodErr, Signal, {EmitsChangedSignal, Factory}, @@ -27,7 +28,7 @@ use std::path::PathBuf; use std::sync::atomic::Ordering; use std::sync::Arc; -use crate::scripting::manifest::ParseConfig; +use crate::{color_scheme::ColorScheme, scripting::manifest::ParseConfig}; use crate::{constants, plugins}; use crate::{hwdevices, profiles}; use crate::{plugins::audio, scripting::manifest}; @@ -618,6 +619,43 @@ impl DbusApi { } }) .outarg::("status"), + ) + .add_m( + f.method("SetColorScheme", (), move |m| { + if perms::has_settings_permission_cached( + &m.msg.sender().unwrap(), + ) + .unwrap_or(false) + { + let (name, data): (String, Vec) = m.msg.read2()?; + + let mut color_schemes = crate::NAMED_COLOR_SCHEMES.write(); + let mut colors = Vec::new(); + + for chunk in data.chunks(4) { + let r = chunk[0]; + let g = chunk[1]; + let b = chunk[2]; + let a = chunk[3]; + + let color = Color::from_linear_rgba8(r, g, b, a); + + colors.push(color); + } + + color_schemes.insert(name, ColorScheme { colors }); + + crate::REQUEST_PROFILE_RELOAD.store(true, Ordering::SeqCst); + + let s = true; + Ok(vec![m.msg.method_return().append1(s)]) + } else { + Err(MethodErr::failed("Authentication failed")) + } + }) + .inarg::("name") + .inarg::, _>("data") + .outarg::("status"), ), ), ) diff --git a/eruption/src/main.rs b/eruption/src/main.rs index 2b07a0f3e..47195288e 100644 --- a/eruption/src/main.rs +++ b/eruption/src/main.rs @@ -54,6 +54,7 @@ mod util; mod hwdevices; use hwdevices::{KeyboardDevice, KeyboardHidEvent, MiscDevice, MouseDevice, MouseHidEvent}; +mod color_scheme; mod constants; mod dbus_interface; mod events; @@ -68,8 +69,11 @@ use profiles::Profile; use scripting::manifest::Manifest; use scripting::script; -use crate::hwdevices::{DeviceStatus, MaturityLevel, RGBA}; use crate::plugins::{sdk_support, uleds}; +use crate::{ + color_scheme::ColorScheme, + hwdevices::{DeviceStatus, MaturityLevel, RGBA}, +}; use crate::threads::DbusApiEvent; #[cfg(feature = "mimalloc_allocator")] @@ -153,6 +157,10 @@ lazy_static! { /// The current "pipeline" of scripts pub static ref ACTIVE_SCRIPTS: Arc>> = Arc::new(Mutex::new(vec![])); + /// Named color schemes, for use in e.g. gradients + pub static ref NAMED_COLOR_SCHEMES: Arc>> = + Arc::new(RwLock::new(HashMap::new())); + /// Global configuration pub static ref CONFIG: Arc>> = Arc::new(Mutex::new(None)); diff --git a/eruption/src/scripting/script.rs b/eruption/src/scripting/script.rs index 70d3d0df5..f4a51ce6b 100644 --- a/eruption/src/scripting/script.rs +++ b/eruption/src/scripting/script.rs @@ -519,10 +519,49 @@ mod callbacks { Ok(idx) }), + // special handling for the "system" palette + "system" => super::ALLOCATED_GRADIENTS.with(|f| { + let mut m = f.borrow_mut(); + let idx = m.len() + 1; + + let gradient = + if let Some(color_scheme) = crate::NAMED_COLOR_SCHEMES.read().get(val) { + colorgrad::CustomGradient::new() + // start at index 1, ignore the darkest/black part of the palette + .colors(&color_scheme.colors[1..]) + .build()? + } else { + // use sinebow gradient as a fallback + colorgrad::sinebow() + }; + + m.insert(idx, gradient); + + Ok(idx) + }), + _ => { - error!("Could not parse value, not a valid stock-gradient"); + if let Some(color_scheme) = crate::NAMED_COLOR_SCHEMES.read().get(val) { + // Create a gradient from the named color scheme + super::ALLOCATED_GRADIENTS.with(|f| { + let mut m = f.borrow_mut(); + let idx = m.len() + 1; - Err(CallbacksError::ParseParamError {}.into()) + let gradient = colorgrad::CustomGradient::new() + .colors(&color_scheme.colors) + .build()?; + + m.insert(idx, gradient); + + Ok(idx) + }) + } else { + error!( + "Could not parse value, not a valid stock-gradient or named color scheme" + ); + + Err(CallbacksError::ParseParamError {}.into()) + } } } } diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 049c1ba62..88b061216 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruptionctl" -version = "0.0.17" +version = "0.0.18" authors = ["X3n0m0rph59 "] edition = "2021" description = "A CLI control utility for the Eruption Linux user-mode driver" @@ -36,6 +36,7 @@ clap_complete = "3.2.3" ctrlc = { version = "3.2.2", features = ["termination"] } cfg-if = "1.0.0" colored = "2.0.0" +csscolorparser = "0.6.1" console = "0.15.0" log = "0.4.17" libc = "0.2.126" diff --git a/eruptionctl/i18n/de-DE/eruptionctl.ftl b/eruptionctl/i18n/de-DE/eruptionctl.ftl index 4c2495c2e..0bc8eb159 100644 --- a/eruptionctl/i18n/de-DE/eruptionctl.ftl +++ b/eruptionctl/i18n/de-DE/eruptionctl.ftl @@ -23,6 +23,7 @@ verbose-about = Verboser Modus (-v, -vv, -vvv, etc.) completions-about = Shell Definitionen für Autovervollständigung erzeugen config-about = Laufzeit Konfiguration des Eruption Daemons bearbeiten +color-scheme-about = Ein Farbschema definieren, importieren oder löschen devices-about = Gerätespezifische Konfiguration bearbeiten status-about = Zeigt das aktuell aktive Profil oder den Slot switch-about = Zu einem anderen Profil im aktiven Slot, oder einem anderen Slot wechseln diff --git a/eruptionctl/i18n/en-US/eruptionctl.ftl b/eruptionctl/i18n/en-US/eruptionctl.ftl index cc31fa298..b8e96fd11 100644 --- a/eruptionctl/i18n/en-US/eruptionctl.ftl +++ b/eruptionctl/i18n/en-US/eruptionctl.ftl @@ -23,6 +23,7 @@ verbose-about = Verbose mode (-v, -vv, -vvv, etc.) completions-about = Generate shell completions config-about = Configuration related sub-commands +color-scheme-about = Define, import or delete a named color scheme devices-about = Get or set some device specific configuration parameters status-about = Shows the currently active profile or slot switch-about = Switch to a different profile or slot diff --git a/eruptionctl/src/color_scheme.rs b/eruptionctl/src/color_scheme.rs new file mode 120000 index 000000000..6c9704321 --- /dev/null +++ b/eruptionctl/src/color_scheme.rs @@ -0,0 +1 @@ +../../eruption/src/color_scheme.rs \ No newline at end of file diff --git a/eruptionctl/src/dbus_client.rs b/eruptionctl/src/dbus_client.rs index 4f1d788e7..56ad95c41 100644 --- a/eruptionctl/src/dbus_client.rs +++ b/eruptionctl/src/dbus_client.rs @@ -19,7 +19,10 @@ #![allow(dead_code)] -use crate::constants; +use crate::{ + color_scheme::{ColorScheme, ColorSchemeExt}, + constants, +}; use dbus::blocking::Connection; use std::time::Duration; @@ -78,6 +81,32 @@ pub fn get_managed_devices() -> Result<(Vec<(u16, u16)>, Vec<(u16, u16)>, Vec<(u Ok(result) } +pub fn set_color_scheme(name: &str, color_scheme: &ColorScheme) -> Result<()> { + use self::config::OrgEruptionConfig; + + let conn = Connection::new_system()?; + let proxy = conn.with_proxy( + "org.eruption", + "/org/eruption/config", + Duration::from_secs(constants::DBUS_TIMEOUT_MILLIS as u64), + ); + + let mut data = Vec::new(); + + for index in 0..color_scheme.num_colors() { + let result = color_scheme.color_rgba_at(index)?.to_linear_rgba_u8(); + + data.push(result.0); + data.push(result.1); + data.push(result.2); + data.push(result.3); + } + + let _result = proxy.set_color_scheme(name, data)?; + + Ok(()) +} + mod slot { // This code was autogenerated with `dbus-codegen-rust -s -d org.eruption -p /org/eruption/slot -m None`, see https://github.com/diwic/dbus-rs use dbus::arg; @@ -490,12 +519,16 @@ mod profile { } mod config { - // This code was autogenerated with `dbus-codegen-rust -s -d org.eruption -p /org/eruption/config -m None`, see https://github.com/diwic/dbus-rs + // This code was autogenerated with `dbus-codegen-rust -s -d org.eruption -p /org/eruption/config`, see https://github.com/diwic/dbus-rs + use dbus; #[allow(unused_imports)] use dbus::arg; use dbus::blocking; pub trait OrgEruptionConfig { + fn ping(&self) -> Result; + fn ping_privileged(&self) -> Result; + fn set_color_scheme(&self, name: &str, data: Vec) -> Result; fn write_file(&self, filename: &str, data: &str) -> Result; fn brightness(&self) -> Result; fn set_brightness(&self, value: i64) -> Result<(), dbus::Error>; @@ -503,17 +536,56 @@ mod config { fn set_enable_sfx(&self, value: bool) -> Result<(), dbus::Error>; } + #[derive(Debug)] + pub struct OrgEruptionConfigBrightnessChanged { + pub brightness: i64, + } + + impl arg::AppendAll for OrgEruptionConfigBrightnessChanged { + fn append(&self, i: &mut arg::IterAppend) { + arg::RefArg::append(&self.brightness, i); + } + } + + impl arg::ReadAll for OrgEruptionConfigBrightnessChanged { + fn read(i: &mut arg::Iter) -> Result { + Ok(OrgEruptionConfigBrightnessChanged { + brightness: i.read()?, + }) + } + } + + impl dbus::message::SignalArgs for OrgEruptionConfigBrightnessChanged { + const NAME: &'static str = "BrightnessChanged"; + const INTERFACE: &'static str = "org.eruption.Config"; + } + impl<'a, T: blocking::BlockingSender, C: ::std::ops::Deref> OrgEruptionConfig for blocking::Proxy<'a, C> { + fn ping(&self) -> Result { + self.method_call("org.eruption.Config", "Ping", ()) + .and_then(|r: (bool,)| Ok(r.0)) + } + + fn ping_privileged(&self) -> Result { + self.method_call("org.eruption.Config", "PingPrivileged", ()) + .and_then(|r: (bool,)| Ok(r.0)) + } + + fn set_color_scheme(&self, name: &str, data: Vec) -> Result { + self.method_call("org.eruption.Config", "SetColorScheme", (name, data)) + .and_then(|r: (bool,)| Ok(r.0)) + } + fn write_file(&self, filename: &str, data: &str) -> Result { self.method_call("org.eruption.Config", "WriteFile", (filename, data)) - .map(|r: (bool,)| r.0) + .and_then(|r: (bool,)| Ok(r.0)) } fn brightness(&self) -> Result { ::get( - self, + &self, "org.eruption.Config", "Brightness", ) @@ -521,7 +593,7 @@ mod config { fn enable_sfx(&self) -> Result { ::get( - self, + &self, "org.eruption.Config", "EnableSfx", ) @@ -529,7 +601,7 @@ mod config { fn set_brightness(&self, value: i64) -> Result<(), dbus::Error> { ::set( - self, + &self, "org.eruption.Config", "Brightness", value, @@ -538,7 +610,7 @@ mod config { fn set_enable_sfx(&self, value: bool) -> Result<(), dbus::Error> { ::set( - self, + &self, "org.eruption.Config", "EnableSfx", value, @@ -546,30 +618,6 @@ mod config { } } - #[derive(Debug)] - pub struct OrgEruptionConfigBrightnessChanged { - pub current_brightness: i64, - } - - impl arg::AppendAll for OrgEruptionConfigBrightnessChanged { - fn append(&self, i: &mut arg::IterAppend) { - arg::RefArg::append(&self.current_brightness, i); - } - } - - impl arg::ReadAll for OrgEruptionConfigBrightnessChanged { - fn read(i: &mut arg::Iter) -> Result { - Ok(OrgEruptionConfigBrightnessChanged { - current_brightness: i.read()?, - }) - } - } - - impl dbus::message::SignalArgs for OrgEruptionConfigBrightnessChanged { - const NAME: &'static str = "BrightnessChanged"; - const INTERFACE: &'static str = "org.eruption.Config"; - } - pub trait OrgFreedesktopDBusIntrospectable { fn introspect(&self) -> Result; } @@ -579,7 +627,7 @@ mod config { { fn introspect(&self) -> Result { self.method_call("org.freedesktop.DBus.Introspectable", "Introspect", ()) - .map(|r: (String,)| r.0) + .and_then(|r: (String,)| Ok(r.0)) } } @@ -589,13 +637,7 @@ mod config { interface_name: &str, property_name: &str, ) -> Result>, dbus::Error>; - fn get_all( - &self, - interface_name: &str, - ) -> Result< - ::std::collections::HashMap>>, - dbus::Error, - >; + fn get_all(&self, interface_name: &str) -> Result; fn set( &self, interface_name: &str, @@ -604,6 +646,36 @@ mod config { ) -> Result<(), dbus::Error>; } + #[derive(Debug)] + pub struct OrgFreedesktopDBusPropertiesPropertiesChanged { + pub interface_name: String, + pub changed_properties: arg::PropMap, + pub invalidated_properties: Vec, + } + + impl arg::AppendAll for OrgFreedesktopDBusPropertiesPropertiesChanged { + fn append(&self, i: &mut arg::IterAppend) { + arg::RefArg::append(&self.interface_name, i); + arg::RefArg::append(&self.changed_properties, i); + arg::RefArg::append(&self.invalidated_properties, i); + } + } + + impl arg::ReadAll for OrgFreedesktopDBusPropertiesPropertiesChanged { + fn read(i: &mut arg::Iter) -> Result { + Ok(OrgFreedesktopDBusPropertiesPropertiesChanged { + interface_name: i.read()?, + changed_properties: i.read()?, + invalidated_properties: i.read()?, + }) + } + } + + impl dbus::message::SignalArgs for OrgFreedesktopDBusPropertiesPropertiesChanged { + const NAME: &'static str = "PropertiesChanged"; + const INTERFACE: &'static str = "org.freedesktop.DBus.Properties"; + } + impl<'a, T: blocking::BlockingSender, C: ::std::ops::Deref> OrgFreedesktopDBusProperties for blocking::Proxy<'a, C> { @@ -617,29 +689,16 @@ mod config { "Get", (interface_name, property_name), ) - .map(|r: (arg::Variant>,)| r.0) + .and_then(|r: (arg::Variant>,)| Ok(r.0)) } - fn get_all( - &self, - interface_name: &str, - ) -> Result< - ::std::collections::HashMap>>, - dbus::Error, - > { + fn get_all(&self, interface_name: &str) -> Result { self.method_call( "org.freedesktop.DBus.Properties", "GetAll", (interface_name,), ) - .map( - |r: ( - ::std::collections::HashMap< - String, - arg::Variant>, - >, - )| r.0, - ) + .and_then(|r: (arg::PropMap,)| Ok(r.0)) } fn set( @@ -655,37 +714,6 @@ mod config { ) } } - - #[derive(Debug)] - pub struct OrgFreedesktopDBusPropertiesPropertiesChanged { - pub interface_name: String, - pub changed_properties: - ::std::collections::HashMap>>, - pub invalidated_properties: Vec, - } - - impl arg::AppendAll for OrgFreedesktopDBusPropertiesPropertiesChanged { - fn append(&self, i: &mut arg::IterAppend) { - arg::RefArg::append(&self.interface_name, i); - arg::RefArg::append(&self.changed_properties, i); - arg::RefArg::append(&self.invalidated_properties, i); - } - } - - impl arg::ReadAll for OrgFreedesktopDBusPropertiesPropertiesChanged { - fn read(i: &mut arg::Iter) -> Result { - Ok(OrgFreedesktopDBusPropertiesPropertiesChanged { - interface_name: i.read()?, - changed_properties: i.read()?, - invalidated_properties: i.read()?, - }) - } - } - - impl dbus::message::SignalArgs for OrgFreedesktopDBusPropertiesPropertiesChanged { - const NAME: &'static str = "PropertiesChanged"; - const INTERFACE: &'static str = "org.freedesktop.DBus.Properties"; - } } mod status { diff --git a/eruptionctl/src/main.rs b/eruptionctl/src/main.rs index 1347ad7e2..731628cb9 100644 --- a/eruptionctl/src/main.rs +++ b/eruptionctl/src/main.rs @@ -42,9 +42,12 @@ use rust_embed::RustEmbed; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use std::{collections::HashMap, path::PathBuf}; -use std::{env, thread}; +use std::{env, fs, thread}; use std::{process, sync::Arc}; +use crate::color_scheme::{ColorScheme, PywalColorScheme}; + +mod color_scheme; mod constants; mod dbus_client; mod device; @@ -98,6 +101,7 @@ lazy_static! { static ref ABOUT: String = tr!("about"); static ref VERBOSE_ABOUT: String = tr!("verbose-about"); static ref COMPLETIONS_ABOUT: String = tr!("completions-about"); + static ref COLORSCHEME_ABOUT: String = tr!("color-scheme-about"); static ref CONFIG_ABOUT: String = tr!("config-about"); static ref DEVICES_ABOUT: String = tr!("devices-about"); static ref STATUS_ABOUT: String = tr!("status-about"); @@ -141,6 +145,12 @@ pub enum Subcommands { command: ConfigSubcommands, }, + #[clap(about(COLORSCHEME_ABOUT.as_str()))] + ColorScheme { + #[clap(subcommand)] + command: ColorSchemeSubcommands, + }, + #[clap(about(DEVICES_ABOUT.as_str()))] Devices { #[clap(subcommand)] @@ -201,6 +211,39 @@ pub enum ConfigSubcommands { Soundfx { enable: Option }, } +/// Sub-commands of the "colorscheme" command +#[derive(Debug, clap::Parser)] +pub enum ColorSchemeSubcommands { + /* + + /// Add a new named color scheme + Add { name: String, colors: Vec }, + + /// List all color schemes known to Eruption + List {}, + + /// Remove a color scheme by name + Remove { name: String }, + + */ + /// Import a color scheme from a file, e.g.: like the Pywal configuration + Import { + #[clap(subcommand)] + command: ColorSchemeImportSubcommands, + }, +} + +/// Sub-commands of the "colorscheme" command +#[derive(Debug, clap::Parser)] +pub enum ColorSchemeImportSubcommands { + /* + /// Import from a file + From { file_name: PathBuf }, + */ + /// Import an existing Pywal color scheme + Pywal { file_name: Option }, +} + /// Sub-commands of the "devices" command #[derive(Debug, clap::Parser)] pub enum DevicesSubcommands { @@ -713,6 +756,53 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { } }, + // configuration related sub-commands + Subcommands::ColorScheme { command } => match command { + /* + + ColorSchemeSubcommands::List {} => todo!(), + + ColorSchemeSubcommands::Add { name: _, colors: _ } => todo!(), + + ColorSchemeSubcommands::Remove { name: _ } => todo!(), + + */ + ColorSchemeSubcommands::Import { command } => match command { + /* + ColorSchemeImportSubcommands::From { file_name } => { + println!( + "Importing color scheme from: {}", + file_name.display().to_string().bold() + ); + + println!("This feature is not implemented yet!",); + } + */ + ColorSchemeImportSubcommands::Pywal { file_name } => { + let file_name = if let Some(path) = file_name { + path + } else { + PathBuf::from(format!( + "/home/{}/.cache/wal/colors.json", + env::var("LOGNAME")? + )) + }; + + println!( + "Importing Pywal color scheme from: {}", + file_name.display().to_string().bold() + ); + + let json_data = fs::read_to_string(&file_name)?; + let pywal_color_scheme: PywalColorScheme = serde_json::from_str(&json_data)?; + + let color_scheme = ColorScheme::try_from(pywal_color_scheme)?; + + dbus_client::set_color_scheme("system", &color_scheme)?; + } + }, + }, + // device specific sub-commands Subcommands::Devices { command } => match command { DevicesSubcommands::List => { diff --git a/support/pkg/arch/PKGBUILD b/support/pkg/arch/PKGBUILD index 180364a3d..cd7a6d9c8 100644 --- a/support/pkg/arch/PKGBUILD +++ b/support/pkg/arch/PKGBUILD @@ -326,6 +326,7 @@ package() { install -m 644 "support/profiles/heatmap-errors.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/lava-lamp.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/lava-lamp-pastel.profile" "$pkgdir/var/lib/eruption/profiles/" + install -m 644 "support/profiles/lava-lamp-syscolors.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/matrix.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/netfx.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/batique.profile" "$pkgdir/var/lib/eruption/profiles/" diff --git a/support/pkg/arch/PKGBUILD-git b/support/pkg/arch/PKGBUILD-git index afde93906..f576fd7ab 100644 --- a/support/pkg/arch/PKGBUILD-git +++ b/support/pkg/arch/PKGBUILD-git @@ -330,6 +330,7 @@ package() { install -m 644 "support/profiles/heatmap-errors.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/lava-lamp.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/lava-lamp-pastel.profile" "$pkgdir/var/lib/eruption/profiles/" + install -m 644 "support/profiles/lava-lamp-syscolors.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/matrix.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/netfx.profile" "$pkgdir/var/lib/eruption/profiles/" install -m 644 "support/profiles/batique.profile" "$pkgdir/var/lib/eruption/profiles/" diff --git a/support/pkg/debian-git/install b/support/pkg/debian-git/install index a67e75f70..07b57a7bd 100755 --- a/support/pkg/debian-git/install +++ b/support/pkg/debian-git/install @@ -106,6 +106,7 @@ support/profiles/heatmap.profile var/lib/eruption/profiles support/profiles/heatmap-errors.profile var/lib/eruption/profiles support/profiles/lava-lamp.profile var/lib/eruption/profiles support/profiles/lava-lamp-pastel.profile var/lib/eruption/profiles +support/profiles/lava-lamp-syscolors.profile var/lib/eruption/profiles support/profiles/matrix.profile var/lib/eruption/profiles support/profiles/netfx.profile var/lib/eruption/profiles support/profiles/batique.profile var/lib/eruption/profiles diff --git a/support/pkg/debian/install b/support/pkg/debian/install index f01bb03f0..a445e5505 100755 --- a/support/pkg/debian/install +++ b/support/pkg/debian/install @@ -106,6 +106,7 @@ support/profiles/heatmap.profile var/lib/eruption/profiles support/profiles/heatmap-errors.profile var/lib/eruption/profiles support/profiles/lava-lamp.profile var/lib/eruption/profiles support/profiles/lava-lamp-pastel.profile var/lib/eruption/profiles +support/profiles/lava-lamp-syscolors.profile var/lib/eruption/profiles support/profiles/matrix.profile var/lib/eruption/profiles support/profiles/netfx.profile var/lib/eruption/profiles support/profiles/batique.profile var/lib/eruption/profiles diff --git a/support/pkg/fedora/eruption-git.spec b/support/pkg/fedora/eruption-git.spec index 64dff14ad..603a31406 100644 --- a/support/pkg/fedora/eruption-git.spec +++ b/support/pkg/fedora/eruption-git.spec @@ -166,6 +166,7 @@ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/heatmap.profile %{buil cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/heatmap-errors.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/lava-lamp.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/lava-lamp-pastel.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ +cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/lava-lamp-syscolors.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/matrix.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/netfx.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{OrigName}-%{commit}/support/profiles/batique.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ @@ -340,6 +341,7 @@ install -Dp -m 0755 %{_builddir}/%{OrigName}-%{commit}/target/release/eruption-g %{_sharedstatedir}/%{ShortName}/profiles/heatmap-errors.profile %{_sharedstatedir}/%{ShortName}/profiles/lava-lamp.profile %{_sharedstatedir}/%{ShortName}/profiles/lava-lamp-pastel.profile +%{_sharedstatedir}/%{ShortName}/profiles/lava-lamp-syscolors.profile %{_sharedstatedir}/%{ShortName}/profiles/matrix.profile %{_sharedstatedir}/%{ShortName}/profiles/netfx.profile %{_sharedstatedir}/%{ShortName}/profiles/batique.profile diff --git a/support/pkg/fedora/eruption.spec b/support/pkg/fedora/eruption.spec index 62f6d7b39..995c40d63 100644 --- a/support/pkg/fedora/eruption.spec +++ b/support/pkg/fedora/eruption.spec @@ -162,6 +162,7 @@ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/heatmap.profile cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/heatmap-errors.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/lava-lamp.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/lava-lamp-pastel.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ +cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/lava-lamp-syscolors.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/matrix.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/netfx.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ cp -a %{_builddir}/%{name}-releases-v%{version}/support/profiles/batique.profile %{buildroot}%{_sharedstatedir}/%{ShortName}/profiles/ @@ -336,6 +337,7 @@ install -Dp -m 0755 %{_builddir}/%{name}-releases-v%{version}/target/release/eru %{_sharedstatedir}/%{ShortName}/profiles/heatmap-errors.profile %{_sharedstatedir}/%{ShortName}/profiles/lava-lamp.profile %{_sharedstatedir}/%{ShortName}/profiles/lava-lamp-pastel.profile +%{_sharedstatedir}/%{ShortName}/profiles/lava-lamp-syscolors.profile %{_sharedstatedir}/%{ShortName}/profiles/matrix.profile %{_sharedstatedir}/%{ShortName}/profiles/netfx.profile %{_sharedstatedir}/%{ShortName}/profiles/batique.profile diff --git a/support/profiles/lava-lamp-syscolors.profile b/support/profiles/lava-lamp-syscolors.profile new file mode 100644 index 000000000..84a0c8cde --- /dev/null +++ b/support/profiles/lava-lamp-syscolors.profile @@ -0,0 +1,132 @@ +# This file is part of Eruption. +# +# Eruption is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Eruption is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Eruption. If not, see . +# +# Copyright (c) 2019-2022, The Eruption Development Team + + +id = '5cd59fa6-e965-45cb-a0da-e87d29713120' +name = 'Lava Lamp (System palette)' +description = 'A lava lamp effect (using the system color palette)' +active_scripts = [ + 'lava-lamp.lua', + 'halo.lua', + 'shockwave.lua', +# 'impact.lua', +# 'water.lua', +# 'raindrops.lua', +# 'sysmon.lua', + 'batique.lua', +# 'dim-zone.lua', + 'macros.lua', +# 'stats.lua', +] + +[[config."Lava Lamp"]] +type = 'string' +name = 'stock_gradient' +value = "system" +default = "system" + +[[config."Lava Lamp"]] +type = 'float' +name = 'time_scale' +value = 150.0 +default = 150.0 + +[[config."Lava Lamp"]] +type = 'float' +name = 'coord_scale' +value = 3.14159 +default = 3.14159 + +[[config.Shockwave]] +type = 'color' +name = 'color_step_shockwave' +value = 0x05010000 +default = 0x05010000 + +[[config.Shockwave]] +type = 'bool' +name = 'mouse_events' +value = true +default = true + +[[config.Shockwave]] +type = 'color' +name = 'color_mouse_click_flash' +value = 0xa0ff0000 +default = 0xa0ff0000 + +[[config.Shockwave]] +type = 'color' +name = 'color_mouse_wheel_flash' +value = 0xd0ff0000 +default = 0xd0ff0000 + +[[config.Raindrops]] +type = 'float' +name = 'opacity' +value = 0.75 +default = 0.75 + +[[config."System Monitor"]] +type = 'color' +name = 'color_cold' +value = 0x0000ff00 +default = 0x0000ff00 + +[[config."System Monitor"]] +type = 'color' +name = 'color_hot' +value = 0xffff0000 +default = 0xffff0000 + +# mouse support +[[config.Batique]] +type = 'int' +name = 'zone_start' +value = 144 +default = 144 + +[[config.Batique]] +type = 'int' +name = 'zone_end' +value = 180 +default = 180 + +[[config.Batique]] +type = 'float' +name = 'coord_scale' +value = 180 +default = 180 + +# dim a specific zone, e.g. if the mouse LEDs are too bright +[[config."Dim Zone"]] +type = 'int' +name = 'zone_start' +value = 144 +default = 144 + +[[config."Dim Zone"]] +type = 'int' +name = 'zone_end' +value = 180 +default = 180 + +[[config."Dim Zone"]] +type = 'float' +name = 'opacity' +value = 0.95 +default = 0.95 diff --git a/support/shell/completions/en_US/eruptionctl.bash-completion b/support/shell/completions/en_US/eruptionctl.bash-completion index 2dd1747cd..5f88ba364 100644 --- a/support/shell/completions/en_US/eruptionctl.bash-completion +++ b/support/shell/completions/en_US/eruptionctl.bash-completion @@ -18,6 +18,9 @@ _eruptionctl() { brightness) cmd+="__brightness" ;; + color-scheme) + cmd+="__color__scheme" + ;; completions) cmd+="__completions" ;; @@ -42,6 +45,9 @@ _eruptionctl() { help) cmd+="__help" ;; + import) + cmd+="__import" + ;; info) cmd+="__info" ;; @@ -60,6 +66,9 @@ _eruptionctl() { profiles) cmd+="__profiles" ;; + pywal) + cmd+="__pywal" + ;; rate) cmd+="__rate" ;; @@ -91,7 +100,7 @@ _eruptionctl() { case "${cmd}" in eruptionctl) - opts="-h -V -v -r -c --help --version --verbose --repeat --config config devices status switch profiles names scripts param completions help" + opts="-h -V -v -r -c --help --version --verbose --repeat --config config color-scheme devices status switch profiles names scripts param completions help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -112,6 +121,76 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + eruptionctl__color__scheme) + opts="-h --help import help" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__scheme__help) + opts="..." + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__scheme__import) + opts="-h --help pywal help" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__scheme__import__help) + opts="..." + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__scheme__import__pywal) + opts="-h --help " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; eruptionctl__completions) opts="-h --help " if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then diff --git a/support/shell/completions/en_US/eruptionctl.elvish-completion b/support/shell/completions/en_US/eruptionctl.elvish-completion index 082fe844c..d4374e9d5 100644 --- a/support/shell/completions/en_US/eruptionctl.elvish-completion +++ b/support/shell/completions/en_US/eruptionctl.elvish-completion @@ -29,6 +29,7 @@ set edit:completion:arg-completer[eruptionctl] = {|@words| cand -r 'Repeat output until ctrl+c is pressed' cand --repeat 'Repeat output until ctrl+c is pressed' cand config 'Configuration related sub-commands' + cand color-scheme 'Define, import or delete a named color scheme' cand devices 'Get or set some device specific configuration parameters' cand status 'Shows the currently active profile or slot' cand switch 'Switch to a different profile or slot' @@ -56,6 +57,26 @@ set edit:completion:arg-completer[eruptionctl] = {|@words| } &'eruptionctl;config;help'= { } + &'eruptionctl;color-scheme'= { + cand -h 'Print help information' + cand --help 'Print help information' + cand import 'Import a color scheme from a file, e.g.: like the Pywal configuration' + cand help 'Print this message or the help of the given subcommand(s)' + } + &'eruptionctl;color-scheme;import'= { + cand -h 'Print help information' + cand --help 'Print help information' + cand pywal 'Import an existing Pywal color scheme' + cand help 'Print this message or the help of the given subcommand(s)' + } + &'eruptionctl;color-scheme;import;pywal'= { + cand -h 'Print help information' + cand --help 'Print help information' + } + &'eruptionctl;color-scheme;import;help'= { + } + &'eruptionctl;color-scheme;help'= { + } &'eruptionctl;devices'= { cand -h 'Print help information' cand --help 'Print help information' diff --git a/support/shell/completions/en_US/eruptionctl.fish-completion b/support/shell/completions/en_US/eruptionctl.fish-completion index f89e060fb..60437ea51 100644 --- a/support/shell/completions/en_US/eruptionctl.fish-completion +++ b/support/shell/completions/en_US/eruptionctl.fish-completion @@ -4,6 +4,7 @@ complete -c eruptionctl -n "__fish_use_subcommand" -s V -l version -d 'Print ver complete -c eruptionctl -n "__fish_use_subcommand" -s v -l verbose -d 'Verbose mode (-v, -vv, -vvv, etc.)' complete -c eruptionctl -n "__fish_use_subcommand" -s r -l repeat -d 'Repeat output until ctrl+c is pressed' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "config" -d 'Configuration related sub-commands' +complete -c eruptionctl -n "__fish_use_subcommand" -f -a "color-scheme" -d 'Define, import or delete a named color scheme' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "devices" -d 'Get or set some device specific configuration parameters' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "status" -d 'Shows the currently active profile or slot' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "switch" -d 'Switch to a different profile or slot' @@ -19,6 +20,13 @@ complete -c eruptionctl -n "__fish_seen_subcommand_from config; and not __fish_s complete -c eruptionctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from soundfx; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c eruptionctl -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from brightness" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from soundfx" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "import" -d 'Import a color scheme from a file, e.g.: like the Pywal configuration' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "pywal" -d 'Import an existing Pywal color scheme' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and __fish_seen_subcommand_from pywal" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -f -a "list" -d 'List connected devices and their indices (run this first)' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -f -a "info" -d 'Get information about a specific device' diff --git a/support/shell/completions/en_US/eruptionctl.powershell-completion b/support/shell/completions/en_US/eruptionctl.powershell-completion index 712a184b8..6c4d90a74 100644 --- a/support/shell/completions/en_US/eruptionctl.powershell-completion +++ b/support/shell/completions/en_US/eruptionctl.powershell-completion @@ -32,6 +32,7 @@ Register-ArgumentCompleter -Native -CommandName 'eruptionctl' -ScriptBlock { [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Repeat output until ctrl+c is pressed') [CompletionResult]::new('--repeat', 'repeat', [CompletionResultType]::ParameterName, 'Repeat output until ctrl+c is pressed') [CompletionResult]::new('config', 'config', [CompletionResultType]::ParameterValue, 'Configuration related sub-commands') + [CompletionResult]::new('color-scheme', 'color-scheme', [CompletionResultType]::ParameterValue, 'Define, import or delete a named color scheme') [CompletionResult]::new('devices', 'devices', [CompletionResultType]::ParameterValue, 'Get or set some device specific configuration parameters') [CompletionResult]::new('status', 'status', [CompletionResultType]::ParameterValue, 'Shows the currently active profile or slot') [CompletionResult]::new('switch', 'switch', [CompletionResultType]::ParameterValue, 'Switch to a different profile or slot') @@ -64,6 +65,31 @@ Register-ArgumentCompleter -Native -CommandName 'eruptionctl' -ScriptBlock { 'eruptionctl;config;help' { break } + 'eruptionctl;color-scheme' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('import', 'import', [CompletionResultType]::ParameterValue, 'Import a color scheme from a file, e.g.: like the Pywal configuration') + [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)') + break + } + 'eruptionctl;color-scheme;import' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('pywal', 'pywal', [CompletionResultType]::ParameterValue, 'Import an existing Pywal color scheme') + [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)') + break + } + 'eruptionctl;color-scheme;import;pywal' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + break + } + 'eruptionctl;color-scheme;import;help' { + break + } + 'eruptionctl;color-scheme;help' { + break + } 'eruptionctl;devices' { [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') diff --git a/support/shell/completions/en_US/eruptionctl.zsh-completion b/support/shell/completions/en_US/eruptionctl.zsh-completion index bbdbabed6..d15ec050e 100644 --- a/support/shell/completions/en_US/eruptionctl.zsh-completion +++ b/support/shell/completions/en_US/eruptionctl.zsh-completion @@ -71,6 +71,59 @@ _arguments "${_arguments_options[@]}" \ ;; esac ;; +(color-scheme) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +":: :_eruptionctl__color-scheme_commands" \ +"*::: :->color-scheme" \ +&& ret=0 + + case $state in + (color-scheme) + words=($line[1] "${words[@]}") + (( CURRENT += 1 )) + curcontext="${curcontext%:*:*}:eruptionctl-color-scheme-command-$line[1]:" + case $line[1] in + (import) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +":: :_eruptionctl__color-scheme__import_commands" \ +"*::: :->import" \ +&& ret=0 + + case $state in + (import) + words=($line[1] "${words[@]}") + (( CURRENT += 1 )) + curcontext="${curcontext%:*:*}:eruptionctl-color-scheme-import-command-$line[1]:" + case $line[1] in + (pywal) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +'::file-name:' \ +&& ret=0 +;; +(help) +_arguments "${_arguments_options[@]}" \ +'*::subcommand -- The subcommand whose help message to display:' \ +&& ret=0 +;; + esac + ;; +esac +;; +(help) +_arguments "${_arguments_options[@]}" \ +'*::subcommand -- The subcommand whose help message to display:' \ +&& ret=0 +;; + esac + ;; +esac +;; (devices) _arguments "${_arguments_options[@]}" \ '-h[Print help information]' \ @@ -402,6 +455,7 @@ esac _eruptionctl_commands() { local commands; commands=( 'config:Configuration related sub-commands' \ +'color-scheme:Define, import or delete a named color scheme' \ 'devices:Get or set some device specific configuration parameters' \ 'status:Shows the currently active profile or slot' \ 'switch:Switch to a different profile or slot' \ @@ -429,6 +483,14 @@ _eruptionctl__devices__brightness_commands() { local commands; commands=() _describe -t commands 'eruptionctl devices brightness commands' commands "$@" } +(( $+functions[_eruptionctl__color-scheme_commands] )) || +_eruptionctl__color-scheme_commands() { + local commands; commands=( +'import:Import a color scheme from a file, e.g.: like the Pywal configuration' \ +'help:Print this message or the help of the given subcommand(s)' \ + ) + _describe -t commands 'eruptionctl color-scheme commands' commands "$@" +} (( $+functions[_eruptionctl__completions_commands] )) || _eruptionctl__completions_commands() { local commands; commands=() @@ -485,6 +547,16 @@ _eruptionctl__scripts__edit_commands() { local commands; commands=() _describe -t commands 'eruptionctl scripts edit commands' commands "$@" } +(( $+functions[_eruptionctl__color-scheme__help_commands] )) || +_eruptionctl__color-scheme__help_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-scheme help commands' commands "$@" +} +(( $+functions[_eruptionctl__color-scheme__import__help_commands] )) || +_eruptionctl__color-scheme__import__help_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-scheme import help commands' commands "$@" +} (( $+functions[_eruptionctl__config__help_commands] )) || _eruptionctl__config__help_commands() { local commands; commands=() @@ -525,6 +597,14 @@ _eruptionctl__switch__help_commands() { local commands; commands=() _describe -t commands 'eruptionctl switch help commands' commands "$@" } +(( $+functions[_eruptionctl__color-scheme__import_commands] )) || +_eruptionctl__color-scheme__import_commands() { + local commands; commands=( +'pywal:Import an existing Pywal color scheme' \ +'help:Print this message or the help of the given subcommand(s)' \ + ) + _describe -t commands 'eruptionctl color-scheme import commands' commands "$@" +} (( $+functions[_eruptionctl__devices__info_commands] )) || _eruptionctl__devices__info_commands() { local commands; commands=() @@ -600,6 +680,11 @@ _eruptionctl__profiles_commands() { ) _describe -t commands 'eruptionctl profiles commands' commands "$@" } +(( $+functions[_eruptionctl__color-scheme__import__pywal_commands] )) || +_eruptionctl__color-scheme__import__pywal_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-scheme import pywal commands' commands "$@" +} (( $+functions[_eruptionctl__devices__rate_commands] )) || _eruptionctl__devices__rate_commands() { local commands; commands=() From 3943f80b5341dc86a8fbd64deb0b1496d81aa94d Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Sat, 16 Jul 2022 07:20:25 +0200 Subject: [PATCH 10/20] Update support for named color schemes Improve the D-Bus API and the CLI Cleanups References #152 --- Cargo.lock | 2 +- eruption/src/color_scheme.rs | 20 +++++ eruption/src/dbus_interface.rs | 42 +++++++++ eruptionctl/Cargo.toml | 2 +- eruptionctl/src/dbus_client.rs | 42 +++++++++ eruptionctl/src/main.rs | 72 ++++++++------- support/profiles/lava-lamp-syscolors.profile | 4 +- .../en_US/eruptionctl.bash-completion | 66 ++++++++++++-- .../en_US/eruptionctl.elvish-completion | 27 ++++-- .../en_US/eruptionctl.fish-completion | 22 +++-- .../en_US/eruptionctl.powershell-completion | 30 +++++-- .../en_US/eruptionctl.zsh-completion | 87 ++++++++++++++----- 12 files changed, 327 insertions(+), 89 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 858b9ba72..b4114fa01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1397,7 +1397,7 @@ dependencies = [ [[package]] name = "eruptionctl" -version = "0.0.18" +version = "0.0.19" dependencies = [ "cfg-if 1.0.0", "clap", diff --git a/eruption/src/color_scheme.rs b/eruption/src/color_scheme.rs index f00c0620f..c93c26373 100644 --- a/eruption/src/color_scheme.rs +++ b/eruption/src/color_scheme.rs @@ -68,6 +68,26 @@ impl ColorSchemeExt for ColorScheme { } } +impl TryFrom> for ColorScheme { + type Error = eyre::Error; + + fn try_from(value: Vec) -> std::result::Result { + let mut colors = Vec::new(); + + for color in value.chunks(4) { + let r = color[0].parse()?; + let g = color[1].parse()?; + let b = color[2].parse()?; + let a = color[3].parse()?; + + let color = Color::from_linear_rgba8(r, g, b, a); + colors.push(color); + } + + Ok(Self { colors }) + } +} + impl TryFrom for ColorScheme { type Error = eyre::Error; diff --git a/eruption/src/dbus_interface.rs b/eruption/src/dbus_interface.rs index af40ab306..abf8020c6 100644 --- a/eruption/src/dbus_interface.rs +++ b/eruption/src/dbus_interface.rs @@ -620,6 +620,26 @@ impl DbusApi { }) .outarg::("status"), ) + .add_m( + f.method("GetColorSchemes", (), move |m| { + if perms::has_monitor_permission_cached( + &m.msg.sender().unwrap(), + ) + .unwrap_or(false) + { + let color_schemes: Vec = crate::NAMED_COLOR_SCHEMES + .read() + .keys() + .cloned() + .collect(); + + Ok(vec![m.msg.method_return().append1(color_schemes)]) + } else { + Err(MethodErr::failed("Authentication failed")) + } + }) + .outarg::, _>("color_schemes"), + ) .add_m( f.method("SetColorScheme", (), move |m| { if perms::has_settings_permission_cached( @@ -656,6 +676,28 @@ impl DbusApi { .inarg::("name") .inarg::, _>("data") .outarg::("status"), + ) + .add_m( + f.method("RemoveColorScheme", (), move |m| { + if perms::has_settings_permission_cached( + &m.msg.sender().unwrap(), + ) + .unwrap_or(false) + { + let name: String = m.msg.read1()?; + + crate::NAMED_COLOR_SCHEMES.write().remove(&name); + + crate::REQUEST_PROFILE_RELOAD.store(true, Ordering::SeqCst); + + let s = true; + Ok(vec![m.msg.method_return().append1(s)]) + } else { + Err(MethodErr::failed("Authentication failed")) + } + }) + .inarg::("name") + .outarg::("status"), ), ), ) diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 88b061216..89afeb4e1 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruptionctl" -version = "0.0.18" +version = "0.0.19" authors = ["X3n0m0rph59 "] edition = "2021" description = "A CLI control utility for the Eruption Linux user-mode driver" diff --git a/eruptionctl/src/dbus_client.rs b/eruptionctl/src/dbus_client.rs index 56ad95c41..4c813451b 100644 --- a/eruptionctl/src/dbus_client.rs +++ b/eruptionctl/src/dbus_client.rs @@ -81,6 +81,21 @@ pub fn get_managed_devices() -> Result<(Vec<(u16, u16)>, Vec<(u16, u16)>, Vec<(u Ok(result) } +pub fn get_color_schemes() -> Result> { + use self::config::OrgEruptionConfig; + + let conn = Connection::new_system()?; + let config_proxy = conn.with_proxy( + "org.eruption", + "/org/eruption/config", + Duration::from_secs(constants::DBUS_TIMEOUT_MILLIS as u64), + ); + + let result = config_proxy.get_color_schemes()?; + + Ok(result) +} + pub fn set_color_scheme(name: &str, color_scheme: &ColorScheme) -> Result<()> { use self::config::OrgEruptionConfig; @@ -107,6 +122,21 @@ pub fn set_color_scheme(name: &str, color_scheme: &ColorScheme) -> Result<()> { Ok(()) } +pub fn remove_color_scheme(name: &str) -> Result<()> { + use self::config::OrgEruptionConfig; + + let conn = Connection::new_system()?; + let config_proxy = conn.with_proxy( + "org.eruption", + "/org/eruption/config", + Duration::from_secs(constants::DBUS_TIMEOUT_MILLIS as u64), + ); + + let _result = config_proxy.remove_color_scheme(&name)?; + + Ok(()) +} + mod slot { // This code was autogenerated with `dbus-codegen-rust -s -d org.eruption -p /org/eruption/slot -m None`, see https://github.com/diwic/dbus-rs use dbus::arg; @@ -526,8 +556,10 @@ mod config { use dbus::blocking; pub trait OrgEruptionConfig { + fn get_color_schemes(&self) -> Result, dbus::Error>; fn ping(&self) -> Result; fn ping_privileged(&self) -> Result; + fn remove_color_scheme(&self, name: &str) -> Result; fn set_color_scheme(&self, name: &str, data: Vec) -> Result; fn write_file(&self, filename: &str, data: &str) -> Result; fn brightness(&self) -> Result; @@ -563,6 +595,11 @@ mod config { impl<'a, T: blocking::BlockingSender, C: ::std::ops::Deref> OrgEruptionConfig for blocking::Proxy<'a, C> { + fn get_color_schemes(&self) -> Result, dbus::Error> { + self.method_call("org.eruption.Config", "GetColorSchemes", ()) + .and_then(|r: (Vec,)| Ok(r.0)) + } + fn ping(&self) -> Result { self.method_call("org.eruption.Config", "Ping", ()) .and_then(|r: (bool,)| Ok(r.0)) @@ -573,6 +610,11 @@ mod config { .and_then(|r: (bool,)| Ok(r.0)) } + fn remove_color_scheme(&self, name: &str) -> Result { + self.method_call("org.eruption.Config", "RemoveColorScheme", (name,)) + .and_then(|r: (bool,)| Ok(r.0)) + } + fn set_color_scheme(&self, name: &str, data: Vec) -> Result { self.method_call("org.eruption.Config", "SetColorScheme", (name, data)) .and_then(|r: (bool,)| Ok(r.0)) diff --git a/eruptionctl/src/main.rs b/eruptionctl/src/main.rs index 731628cb9..cb0b64c50 100644 --- a/eruptionctl/src/main.rs +++ b/eruptionctl/src/main.rs @@ -101,7 +101,7 @@ lazy_static! { static ref ABOUT: String = tr!("about"); static ref VERBOSE_ABOUT: String = tr!("verbose-about"); static ref COMPLETIONS_ABOUT: String = tr!("completions-about"); - static ref COLORSCHEME_ABOUT: String = tr!("color-scheme-about"); + static ref COLOR_SCHEME_ABOUT: String = tr!("color-scheme-about"); static ref CONFIG_ABOUT: String = tr!("config-about"); static ref DEVICES_ABOUT: String = tr!("devices-about"); static ref STATUS_ABOUT: String = tr!("status-about"); @@ -145,10 +145,10 @@ pub enum Subcommands { command: ConfigSubcommands, }, - #[clap(about(COLORSCHEME_ABOUT.as_str()))] - ColorScheme { + #[clap(about(COLOR_SCHEME_ABOUT.as_str()))] + ColorSchemes { #[clap(subcommand)] - command: ColorSchemeSubcommands, + command: ColorSchemesSubcommands, }, #[clap(about(DEVICES_ABOUT.as_str()))] @@ -211,21 +211,18 @@ pub enum ConfigSubcommands { Soundfx { enable: Option }, } -/// Sub-commands of the "colorscheme" command +/// Sub-commands of the "color-schemes" command #[derive(Debug, clap::Parser)] -pub enum ColorSchemeSubcommands { - /* +pub enum ColorSchemesSubcommands { + /// List all color schemes known to Eruption + List {}, /// Add a new named color scheme Add { name: String, colors: Vec }, - /// List all color schemes known to Eruption - List {}, - /// Remove a color scheme by name Remove { name: String }, - */ /// Import a color scheme from a file, e.g.: like the Pywal configuration Import { #[clap(subcommand)] @@ -236,10 +233,6 @@ pub enum ColorSchemeSubcommands { /// Sub-commands of the "colorscheme" command #[derive(Debug, clap::Parser)] pub enum ColorSchemeImportSubcommands { - /* - /// Import from a file - From { file_name: PathBuf }, - */ /// Import an existing Pywal color scheme Pywal { file_name: Option }, } @@ -756,28 +749,43 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { } }, - // configuration related sub-commands - Subcommands::ColorScheme { command } => match command { - /* + // color-schemes related sub-commands + Subcommands::ColorSchemes { command } => match command { + ColorSchemesSubcommands::List {} => { + let color_schemes = dbus_client::get_color_schemes()?; - ColorSchemeSubcommands::List {} => todo!(), + println!("Registered color schemes:\n"); - ColorSchemeSubcommands::Add { name: _, colors: _ } => todo!(), + for color_scheme in color_schemes { + println!("{}", color_scheme.bold()); + } - ColorSchemeSubcommands::Remove { name: _ } => todo!(), + println!("\nSupported stock gradients:\n"); - */ - ColorSchemeSubcommands::Import { command } => match command { - /* - ColorSchemeImportSubcommands::From { file_name } => { - println!( - "Importing color scheme from: {}", - file_name.display().to_string().bold() - ); + println!("system"); + println!("rainbow-smooth"); + println!("sinebow-smooth"); + println!("spectral-smooth"); + println!("rainbow-sharp"); + println!("sinebow-sharp"); + println!("spectral-sharp"); + } - println!("This feature is not implemented yet!",); - } - */ + ColorSchemesSubcommands::Add { name, colors } => { + println!("Importing color scheme from commandline"); + + let color_scheme = ColorScheme::try_from(colors)?; + + dbus_client::set_color_scheme(&name, &color_scheme)?; + } + + ColorSchemesSubcommands::Remove { name } => { + println!("Removing color scheme: {}", name.bold()); + + dbus_client::remove_color_scheme(&name)?; + } + + ColorSchemesSubcommands::Import { command } => match command { ColorSchemeImportSubcommands::Pywal { file_name } => { let file_name = if let Some(path) = file_name { path diff --git a/support/profiles/lava-lamp-syscolors.profile b/support/profiles/lava-lamp-syscolors.profile index 84a0c8cde..ce5634ae1 100644 --- a/support/profiles/lava-lamp-syscolors.profile +++ b/support/profiles/lava-lamp-syscolors.profile @@ -48,8 +48,8 @@ default = 150.0 [[config."Lava Lamp"]] type = 'float' name = 'coord_scale' -value = 3.14159 -default = 3.14159 +value = 5.5 +default = 5.5 [[config.Shockwave]] type = 'color' diff --git a/support/shell/completions/en_US/eruptionctl.bash-completion b/support/shell/completions/en_US/eruptionctl.bash-completion index 5f88ba364..d6494632a 100644 --- a/support/shell/completions/en_US/eruptionctl.bash-completion +++ b/support/shell/completions/en_US/eruptionctl.bash-completion @@ -12,14 +12,17 @@ _eruptionctl() { "$1") cmd="eruptionctl" ;; + add) + cmd+="__add" + ;; angle-snapping) cmd+="__angle__snapping" ;; brightness) cmd+="__brightness" ;; - color-scheme) - cmd+="__color__scheme" + color-schemes) + cmd+="__color__schemes" ;; completions) cmd+="__completions" @@ -72,6 +75,9 @@ _eruptionctl() { rate) cmd+="__rate" ;; + remove) + cmd+="__remove" + ;; scripts) cmd+="__scripts" ;; @@ -100,7 +106,7 @@ _eruptionctl() { case "${cmd}" in eruptionctl) - opts="-h -V -v -r -c --help --version --verbose --repeat --config config color-scheme devices status switch profiles names scripts param completions help" + opts="-h -V -v -r -c --help --version --verbose --repeat --config config color-schemes devices status switch profiles names scripts param completions help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -121,8 +127,8 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; - eruptionctl__color__scheme) - opts="-h --help import help" + eruptionctl__color__schemes) + opts="-h --help list add remove import help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -135,7 +141,21 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; - eruptionctl__color__scheme__help) + eruptionctl__color__schemes__add) + opts="-h --help ..." + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__schemes__help) opts="..." if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) @@ -149,7 +169,7 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; - eruptionctl__color__scheme__import) + eruptionctl__color__schemes__import) opts="-h --help pywal help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) @@ -163,7 +183,7 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; - eruptionctl__color__scheme__import__help) + eruptionctl__color__schemes__import__help) opts="..." if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) @@ -177,7 +197,7 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; - eruptionctl__color__scheme__import__pywal) + eruptionctl__color__schemes__import__pywal) opts="-h --help " if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) @@ -191,6 +211,34 @@ _eruptionctl() { COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 ;; + eruptionctl__color__schemes__list) + opts="-h --help" + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + eruptionctl__color__schemes__remove) + opts="-h --help " + if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; eruptionctl__completions) opts="-h --help " if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then diff --git a/support/shell/completions/en_US/eruptionctl.elvish-completion b/support/shell/completions/en_US/eruptionctl.elvish-completion index d4374e9d5..af1675b91 100644 --- a/support/shell/completions/en_US/eruptionctl.elvish-completion +++ b/support/shell/completions/en_US/eruptionctl.elvish-completion @@ -29,7 +29,7 @@ set edit:completion:arg-completer[eruptionctl] = {|@words| cand -r 'Repeat output until ctrl+c is pressed' cand --repeat 'Repeat output until ctrl+c is pressed' cand config 'Configuration related sub-commands' - cand color-scheme 'Define, import or delete a named color scheme' + cand color-schemes 'Define, import or delete a named color scheme' cand devices 'Get or set some device specific configuration parameters' cand status 'Shows the currently active profile or slot' cand switch 'Switch to a different profile or slot' @@ -57,25 +57,40 @@ set edit:completion:arg-completer[eruptionctl] = {|@words| } &'eruptionctl;config;help'= { } - &'eruptionctl;color-scheme'= { + &'eruptionctl;color-schemes'= { cand -h 'Print help information' cand --help 'Print help information' + cand list 'List all color schemes known to Eruption' + cand add 'Add a new named color scheme' + cand remove 'Remove a color scheme by name' cand import 'Import a color scheme from a file, e.g.: like the Pywal configuration' cand help 'Print this message or the help of the given subcommand(s)' } - &'eruptionctl;color-scheme;import'= { + &'eruptionctl;color-schemes;list'= { + cand -h 'Print help information' + cand --help 'Print help information' + } + &'eruptionctl;color-schemes;add'= { + cand -h 'Print help information' + cand --help 'Print help information' + } + &'eruptionctl;color-schemes;remove'= { + cand -h 'Print help information' + cand --help 'Print help information' + } + &'eruptionctl;color-schemes;import'= { cand -h 'Print help information' cand --help 'Print help information' cand pywal 'Import an existing Pywal color scheme' cand help 'Print this message or the help of the given subcommand(s)' } - &'eruptionctl;color-scheme;import;pywal'= { + &'eruptionctl;color-schemes;import;pywal'= { cand -h 'Print help information' cand --help 'Print help information' } - &'eruptionctl;color-scheme;import;help'= { + &'eruptionctl;color-schemes;import;help'= { } - &'eruptionctl;color-scheme;help'= { + &'eruptionctl;color-schemes;help'= { } &'eruptionctl;devices'= { cand -h 'Print help information' diff --git a/support/shell/completions/en_US/eruptionctl.fish-completion b/support/shell/completions/en_US/eruptionctl.fish-completion index 60437ea51..0f92b2b85 100644 --- a/support/shell/completions/en_US/eruptionctl.fish-completion +++ b/support/shell/completions/en_US/eruptionctl.fish-completion @@ -4,7 +4,7 @@ complete -c eruptionctl -n "__fish_use_subcommand" -s V -l version -d 'Print ver complete -c eruptionctl -n "__fish_use_subcommand" -s v -l verbose -d 'Verbose mode (-v, -vv, -vvv, etc.)' complete -c eruptionctl -n "__fish_use_subcommand" -s r -l repeat -d 'Repeat output until ctrl+c is pressed' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "config" -d 'Configuration related sub-commands' -complete -c eruptionctl -n "__fish_use_subcommand" -f -a "color-scheme" -d 'Define, import or delete a named color scheme' +complete -c eruptionctl -n "__fish_use_subcommand" -f -a "color-schemes" -d 'Define, import or delete a named color scheme' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "devices" -d 'Get or set some device specific configuration parameters' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "status" -d 'Shows the currently active profile or slot' complete -c eruptionctl -n "__fish_use_subcommand" -f -a "switch" -d 'Switch to a different profile or slot' @@ -20,13 +20,19 @@ complete -c eruptionctl -n "__fish_seen_subcommand_from config; and not __fish_s complete -c eruptionctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from soundfx; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c eruptionctl -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from brightness" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from config; and __fish_seen_subcommand_from soundfx" -s h -l help -d 'Print help information' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "import" -d 'Import a color scheme from a file, e.g.: like the Pywal configuration' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "pywal" -d 'Import an existing Pywal color scheme' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c eruptionctl -n "__fish_seen_subcommand_from color-scheme; and __fish_seen_subcommand_from import; and __fish_seen_subcommand_from pywal" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "list" -d 'List all color schemes known to Eruption' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "add" -d 'Add a new named color scheme' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "remove" -d 'Remove a color scheme by name' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "import" -d 'Import a color scheme from a file, e.g.: like the Pywal configuration' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from add; and not __fish_seen_subcommand_from remove; and not __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "pywal" -d 'Import an existing Pywal color scheme' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and __fish_seen_subcommand_from pywal" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -f -a "list" -d 'List connected devices and their indices (run this first)' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -f -a "info" -d 'Get information about a specific device' diff --git a/support/shell/completions/en_US/eruptionctl.powershell-completion b/support/shell/completions/en_US/eruptionctl.powershell-completion index 6c4d90a74..9f1c970b8 100644 --- a/support/shell/completions/en_US/eruptionctl.powershell-completion +++ b/support/shell/completions/en_US/eruptionctl.powershell-completion @@ -32,7 +32,7 @@ Register-ArgumentCompleter -Native -CommandName 'eruptionctl' -ScriptBlock { [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Repeat output until ctrl+c is pressed') [CompletionResult]::new('--repeat', 'repeat', [CompletionResultType]::ParameterName, 'Repeat output until ctrl+c is pressed') [CompletionResult]::new('config', 'config', [CompletionResultType]::ParameterValue, 'Configuration related sub-commands') - [CompletionResult]::new('color-scheme', 'color-scheme', [CompletionResultType]::ParameterValue, 'Define, import or delete a named color scheme') + [CompletionResult]::new('color-schemes', 'color-schemes', [CompletionResultType]::ParameterValue, 'Define, import or delete a named color scheme') [CompletionResult]::new('devices', 'devices', [CompletionResultType]::ParameterValue, 'Get or set some device specific configuration parameters') [CompletionResult]::new('status', 'status', [CompletionResultType]::ParameterValue, 'Shows the currently active profile or slot') [CompletionResult]::new('switch', 'switch', [CompletionResultType]::ParameterValue, 'Switch to a different profile or slot') @@ -65,29 +65,47 @@ Register-ArgumentCompleter -Native -CommandName 'eruptionctl' -ScriptBlock { 'eruptionctl;config;help' { break } - 'eruptionctl;color-scheme' { + 'eruptionctl;color-schemes' { [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('list', 'list', [CompletionResultType]::ParameterValue, 'List all color schemes known to Eruption') + [CompletionResult]::new('add', 'add', [CompletionResultType]::ParameterValue, 'Add a new named color scheme') + [CompletionResult]::new('remove', 'remove', [CompletionResultType]::ParameterValue, 'Remove a color scheme by name') [CompletionResult]::new('import', 'import', [CompletionResultType]::ParameterValue, 'Import a color scheme from a file, e.g.: like the Pywal configuration') [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)') break } - 'eruptionctl;color-scheme;import' { + 'eruptionctl;color-schemes;list' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + break + } + 'eruptionctl;color-schemes;add' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + break + } + 'eruptionctl;color-schemes;remove' { + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + break + } + 'eruptionctl;color-schemes;import' { [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('pywal', 'pywal', [CompletionResultType]::ParameterValue, 'Import an existing Pywal color scheme') [CompletionResult]::new('help', 'help', [CompletionResultType]::ParameterValue, 'Print this message or the help of the given subcommand(s)') break } - 'eruptionctl;color-scheme;import;pywal' { + 'eruptionctl;color-schemes;import;pywal' { [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') break } - 'eruptionctl;color-scheme;import;help' { + 'eruptionctl;color-schemes;import;help' { break } - 'eruptionctl;color-scheme;help' { + 'eruptionctl;color-schemes;help' { break } 'eruptionctl;devices' { diff --git a/support/shell/completions/en_US/eruptionctl.zsh-completion b/support/shell/completions/en_US/eruptionctl.zsh-completion index d15ec050e..4feae1185 100644 --- a/support/shell/completions/en_US/eruptionctl.zsh-completion +++ b/support/shell/completions/en_US/eruptionctl.zsh-completion @@ -71,25 +71,46 @@ _arguments "${_arguments_options[@]}" \ ;; esac ;; -(color-scheme) +(color-schemes) _arguments "${_arguments_options[@]}" \ '-h[Print help information]' \ '--help[Print help information]' \ -":: :_eruptionctl__color-scheme_commands" \ -"*::: :->color-scheme" \ +":: :_eruptionctl__color-schemes_commands" \ +"*::: :->color-schemes" \ && ret=0 case $state in - (color-scheme) + (color-schemes) words=($line[1] "${words[@]}") (( CURRENT += 1 )) - curcontext="${curcontext%:*:*}:eruptionctl-color-scheme-command-$line[1]:" + curcontext="${curcontext%:*:*}:eruptionctl-color-schemes-command-$line[1]:" case $line[1] in - (import) + (list) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +&& ret=0 +;; +(add) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +':name:' \ +'*::colors:' \ +&& ret=0 +;; +(remove) _arguments "${_arguments_options[@]}" \ '-h[Print help information]' \ '--help[Print help information]' \ -":: :_eruptionctl__color-scheme__import_commands" \ +':name:' \ +&& ret=0 +;; +(import) +_arguments "${_arguments_options[@]}" \ +'-h[Print help information]' \ +'--help[Print help information]' \ +":: :_eruptionctl__color-schemes__import_commands" \ "*::: :->import" \ && ret=0 @@ -97,7 +118,7 @@ _arguments "${_arguments_options[@]}" \ (import) words=($line[1] "${words[@]}") (( CURRENT += 1 )) - curcontext="${curcontext%:*:*}:eruptionctl-color-scheme-import-command-$line[1]:" + curcontext="${curcontext%:*:*}:eruptionctl-color-schemes-import-command-$line[1]:" case $line[1] in (pywal) _arguments "${_arguments_options[@]}" \ @@ -455,7 +476,7 @@ esac _eruptionctl_commands() { local commands; commands=( 'config:Configuration related sub-commands' \ -'color-scheme:Define, import or delete a named color scheme' \ +'color-schemes:Define, import or delete a named color scheme' \ 'devices:Get or set some device specific configuration parameters' \ 'status:Shows the currently active profile or slot' \ 'switch:Switch to a different profile or slot' \ @@ -468,6 +489,11 @@ _eruptionctl_commands() { ) _describe -t commands 'eruptionctl commands' commands "$@" } +(( $+functions[_eruptionctl__color-schemes__add_commands] )) || +_eruptionctl__color-schemes__add_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-schemes add commands' commands "$@" +} (( $+functions[_eruptionctl__devices__angle-snapping_commands] )) || _eruptionctl__devices__angle-snapping_commands() { local commands; commands=() @@ -483,13 +509,16 @@ _eruptionctl__devices__brightness_commands() { local commands; commands=() _describe -t commands 'eruptionctl devices brightness commands' commands "$@" } -(( $+functions[_eruptionctl__color-scheme_commands] )) || -_eruptionctl__color-scheme_commands() { +(( $+functions[_eruptionctl__color-schemes_commands] )) || +_eruptionctl__color-schemes_commands() { local commands; commands=( +'list:List all color schemes known to Eruption' \ +'add:Add a new named color scheme' \ +'remove:Remove a color scheme by name' \ 'import:Import a color scheme from a file, e.g.: like the Pywal configuration' \ 'help:Print this message or the help of the given subcommand(s)' \ ) - _describe -t commands 'eruptionctl color-scheme commands' commands "$@" + _describe -t commands 'eruptionctl color-schemes commands' commands "$@" } (( $+functions[_eruptionctl__completions_commands] )) || _eruptionctl__completions_commands() { @@ -547,15 +576,15 @@ _eruptionctl__scripts__edit_commands() { local commands; commands=() _describe -t commands 'eruptionctl scripts edit commands' commands "$@" } -(( $+functions[_eruptionctl__color-scheme__help_commands] )) || -_eruptionctl__color-scheme__help_commands() { +(( $+functions[_eruptionctl__color-schemes__help_commands] )) || +_eruptionctl__color-schemes__help_commands() { local commands; commands=() - _describe -t commands 'eruptionctl color-scheme help commands' commands "$@" + _describe -t commands 'eruptionctl color-schemes help commands' commands "$@" } -(( $+functions[_eruptionctl__color-scheme__import__help_commands] )) || -_eruptionctl__color-scheme__import__help_commands() { +(( $+functions[_eruptionctl__color-schemes__import__help_commands] )) || +_eruptionctl__color-schemes__import__help_commands() { local commands; commands=() - _describe -t commands 'eruptionctl color-scheme import help commands' commands "$@" + _describe -t commands 'eruptionctl color-schemes import help commands' commands "$@" } (( $+functions[_eruptionctl__config__help_commands] )) || _eruptionctl__config__help_commands() { @@ -597,13 +626,13 @@ _eruptionctl__switch__help_commands() { local commands; commands=() _describe -t commands 'eruptionctl switch help commands' commands "$@" } -(( $+functions[_eruptionctl__color-scheme__import_commands] )) || -_eruptionctl__color-scheme__import_commands() { +(( $+functions[_eruptionctl__color-schemes__import_commands] )) || +_eruptionctl__color-schemes__import_commands() { local commands; commands=( 'pywal:Import an existing Pywal color scheme' \ 'help:Print this message or the help of the given subcommand(s)' \ ) - _describe -t commands 'eruptionctl color-scheme import commands' commands "$@" + _describe -t commands 'eruptionctl color-schemes import commands' commands "$@" } (( $+functions[_eruptionctl__devices__info_commands] )) || _eruptionctl__devices__info_commands() { @@ -620,6 +649,11 @@ _eruptionctl__scripts__info_commands() { local commands; commands=() _describe -t commands 'eruptionctl scripts info commands' commands "$@" } +(( $+functions[_eruptionctl__color-schemes__list_commands] )) || +_eruptionctl__color-schemes__list_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-schemes list commands' commands "$@" +} (( $+functions[_eruptionctl__devices__list_commands] )) || _eruptionctl__devices__list_commands() { local commands; commands=() @@ -680,16 +714,21 @@ _eruptionctl__profiles_commands() { ) _describe -t commands 'eruptionctl profiles commands' commands "$@" } -(( $+functions[_eruptionctl__color-scheme__import__pywal_commands] )) || -_eruptionctl__color-scheme__import__pywal_commands() { +(( $+functions[_eruptionctl__color-schemes__import__pywal_commands] )) || +_eruptionctl__color-schemes__import__pywal_commands() { local commands; commands=() - _describe -t commands 'eruptionctl color-scheme import pywal commands' commands "$@" + _describe -t commands 'eruptionctl color-schemes import pywal commands' commands "$@" } (( $+functions[_eruptionctl__devices__rate_commands] )) || _eruptionctl__devices__rate_commands() { local commands; commands=() _describe -t commands 'eruptionctl devices rate commands' commands "$@" } +(( $+functions[_eruptionctl__color-schemes__remove_commands] )) || +_eruptionctl__color-schemes__remove_commands() { + local commands; commands=() + _describe -t commands 'eruptionctl color-schemes remove commands' commands "$@" +} (( $+functions[_eruptionctl__scripts_commands] )) || _eruptionctl__scripts_commands() { local commands; commands=( From 667f2a8e280a7bcb087a4bf977a20bd9b9a0c9e9 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Sun, 17 Jul 2022 02:51:42 +0200 Subject: [PATCH 11/20] Cleanups Fix comment --- eruption/src/scripts/billow.lua | 2 +- eruption/src/scripts/fbm.lua | 2 +- eruption/src/scripts/rmf.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eruption/src/scripts/billow.lua b/eruption/src/scripts/billow.lua index 296669293..53636e567 100644 --- a/eruption/src/scripts/billow.lua +++ b/eruption/src/scripts/billow.lua @@ -25,7 +25,7 @@ color_map = {} function on_tick(delta) ticks = ticks + delta - -- calculate batique effect + -- calculate billow noise effect if ticks % animation_delay == 0 then for i = 1, canvas_size do local x = i / canvas_width diff --git a/eruption/src/scripts/fbm.lua b/eruption/src/scripts/fbm.lua index 793208f30..f5fdf268f 100644 --- a/eruption/src/scripts/fbm.lua +++ b/eruption/src/scripts/fbm.lua @@ -25,7 +25,7 @@ color_map = {} function on_tick(delta) ticks = ticks + delta - -- calculate batique effect + -- calculate fbm effect if ticks % animation_delay == 0 then for i = 1, canvas_size do local x = i / canvas_width diff --git a/eruption/src/scripts/rmf.lua b/eruption/src/scripts/rmf.lua index 6a0af17b8..74e955dbd 100644 --- a/eruption/src/scripts/rmf.lua +++ b/eruption/src/scripts/rmf.lua @@ -25,7 +25,7 @@ color_map = {} function on_tick(delta) ticks = ticks + delta - -- calculate batique effect + -- calculate rmf effect if ticks % animation_delay == 0 then for i = 1, canvas_size do local x = i / canvas_width From edba59518bc5a8eb111544e2f7fd9a3b26044cfa Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Sun, 17 Jul 2022 02:52:30 +0200 Subject: [PATCH 12/20] Switch over to use gradient colors Make `batique.lua` use a named gradient as the source color space. This change is required to fully support color-schemes on all device classes. References #152 --- eruption/src/scripts/batique.lua | 7 ++- eruption/src/scripts/batique.lua.manifest | 52 ++++------------------- 2 files changed, 12 insertions(+), 47 deletions(-) diff --git a/eruption/src/scripts/batique.lua b/eruption/src/scripts/batique.lua index eaf18b64f..c3a9dc423 100644 --- a/eruption/src/scripts/batique.lua +++ b/eruption/src/scripts/batique.lua @@ -22,6 +22,8 @@ require "debug" ticks = 0 color_map = {} +grad = gradient_from_name(stock_gradient) + -- event handler functions -- function on_startup(config) for i = 1, canvas_size do color_map[i] = 0x00000000 end @@ -39,11 +41,8 @@ function on_tick(delta) local val = super_simplex_noise((x / coord_scale), (y / coord_scale), ticks / time_scale) - val = lerp(0, 360, val) - color_map[i] = hsla_to_color((val / color_divisor) + color_offset, - color_saturation, color_lightness, - lerp(0, 255, opacity)) + color_map[i] = gradient_color_at(grad, val) end submit_color_map(color_map) diff --git a/eruption/src/scripts/batique.lua.manifest b/eruption/src/scripts/batique.lua.manifest index 993fd0b96..4b36d1e7d 100644 --- a/eruption/src/scripts/batique.lua.manifest +++ b/eruption/src/scripts/batique.lua.manifest @@ -17,10 +17,10 @@ name = "Batique" -description = "Compute Super Simplex Noise, mapped to the HSL color space" -version = "0.0.6" +description = "Compute Super Simplex Noise, mapped to a color-scheme" +version = "0.1.1" author = "The Eruption Development Team" -min_supported_version = "0.1.4" +min_supported_version = "0.1.24" tags = ['Background', 'Vendor', 'Noise'] [[config]] @@ -47,46 +47,6 @@ min = 0.0 max = 1000.0 default = 2.5 -[[config]] -type = 'float' -name = 'color_saturation' -description = 'Saturation in the range 0.0 .. 1.0' -min = 0.0 -max = 1.0 -default = 1.0 - -[[config]] -type = 'float' -name = 'color_lightness' -description = 'Lightness in the range 0.0 .. 0.5; above 0.5 == whiten color' -min = 0.0 -max = 1.0 -default = 0.5 - -[[config]] -type = 'float' -name = 'color_divisor' -description = 'Divide resulting hue angle by color_divisor. Final value will be mapped to the interval [0..360)' -min = 0.0 -max = 360.0 -default = 1.0 - -[[config]] -type = 'float' -name = 'color_offset' -description = 'Offset resulting hue angle by color_offset. Final value will be mapped to the interval [0..360)' -min = 0.0 -max = 360.0 -default = 0.0 - -[[config]] -type = 'float' -name = 'opacity' -description = 'Opacity value in the range 0.0 .. 1.0, where 1.0 is fully opaque' -min = 0.0 -max = 1.0 -default = 1.0 - [[config]] type = 'int' name = 'zone_start' @@ -102,3 +62,9 @@ description = 'Zone on the canvas to paint to (end index)' min = 0 max = 144 default = 180 + +[[config]] +type = 'string' +name = 'stock_gradient' +description = 'The gradient to use' +default = "system" From 5d3e3a5c067e15f053c30b008af277e6c7d37700 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Sun, 17 Jul 2022 11:23:08 +0200 Subject: [PATCH 13/20] Update support for named color schemes Filter the `pywal` generated colors on import, to exclude the darkest/lightest one Add a persistence layer, store state in `/var/lib/eruption/color-schemes.state` References #152 --- CHANGES.md | 4 ++++ Cargo.lock | 3 ++- eruption/Cargo.toml | 2 +- eruption/src/color_scheme.rs | 11 ++++++----- eruption/src/main.rs | 8 ++++++++ eruption/src/scripting/script.rs | 2 +- eruption/src/state.rs | 23 ++++++++++++++++++++++- eruptionctl/Cargo.toml | 2 +- eruptionctl/README.md | 3 ++- 9 files changed, 47 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 24ba45a3a..e50edaa6a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,10 @@ Table of new and noteworthy changes: | Since | Description | |--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 0.1.24 | __New Release__ | +| 0.1.24 | Add support for named color-schemes | +| 0.1.24 | Add support for importing `pywal` generated color-schemes via `eruptionctl color-schemes import pywal` | +| 0.1.24 | Add new profile `Lava Lamp (System palette)` that makes use of imported color-schemes | +| 0.1.24 | Modify Lua script `batique.lua` to support imported color-schemes | | 0.1.24 | Update the project description, add the new website: https://eruption-project.org/ | | 0.1.24 | Implement support for a systemd-based software watchdog and add a watchdog daemon for development purposes | | 0.1.24 | Add experimental support for `ROCCAT Kone Pro` series mice | diff --git a/Cargo.lock b/Cargo.lock index b4114fa01..bad5a788b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -684,6 +684,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80ab25764ba7edca4f546ee81e5471d04cb3143dfdc28f19168a8b58d3a2c8af" dependencies = [ "phf 0.10.1", + "serde", ] [[package]] @@ -1397,7 +1398,7 @@ dependencies = [ [[package]] name = "eruptionctl" -version = "0.0.19" +version = "0.0.20" dependencies = [ "cfg-if 1.0.0", "clap", diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 4fd53992d..4ddc26077 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -73,7 +73,7 @@ rayon = "1.5.3" lazy_static = "1.4.0" rand = "0.8.5" colorgrad = "0.6.0" -csscolorparser = "0.6.1" +csscolorparser = { version = "0.6.1", features = ["serde"] } palette = "0.6.0" nalgebra = "0.31.0" noise = "0.7.0" diff --git a/eruption/src/color_scheme.rs b/eruption/src/color_scheme.rs index c93c26373..4b31efc1b 100644 --- a/eruption/src/color_scheme.rs +++ b/eruption/src/color_scheme.rs @@ -47,7 +47,7 @@ pub trait ColorSchemeExt { fn color_rgba_at(&self, index: usize) -> Result; } -#[derive(Debug)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct ColorScheme { pub colors: Vec, } @@ -95,7 +95,8 @@ impl TryFrom for ColorScheme { let count = value.num_colors(); let mut colors = Vec::new(); - for index in 0..count { + // ignore the first element (don't use the darkest/lightest one) + for index in 1..count { let color = value.color_rgba_at(index)?; colors.push(color); @@ -105,7 +106,7 @@ impl TryFrom for ColorScheme { } } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub struct PywalColorScheme { pub wallpaper: PathBuf, @@ -147,7 +148,7 @@ impl ColorSchemeExt for PywalColorScheme { } } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub struct PaletteSpecial { pub background: String, @@ -155,7 +156,7 @@ pub struct PaletteSpecial { pub cursor: String, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub struct Palette16 { pub color0: String, diff --git a/eruption/src/main.rs b/eruption/src/main.rs index 47195288e..391b6ec7d 100644 --- a/eruption/src/main.rs +++ b/eruption/src/main.rs @@ -1553,6 +1553,10 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { state::init_global_runtime_state() .unwrap_or_else(|e| warn!("Could not parse state file: {}", e)); + // restore saved color-schemes + state::load_color_schemes() + .unwrap_or_else(|e| warn!("Could not restore previously saved color-schemes: {}", e)); + // enable the mouse let enable_mouse = config.get::("global.enable_mouse").unwrap_or(true); @@ -1810,6 +1814,10 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { state::save_runtime_state() .unwrap_or_else(|e| error!("Could not save runtime state: {}", e)); + // save color-schemes + state::save_color_schemes() + .unwrap_or_else(|e| error!("Could not save color-schemes: {}", e)); + // close all managed devices info!("Closing all devices now..."); diff --git a/eruption/src/scripting/script.rs b/eruption/src/scripting/script.rs index f4a51ce6b..a316682b2 100644 --- a/eruption/src/scripting/script.rs +++ b/eruption/src/scripting/script.rs @@ -528,7 +528,7 @@ mod callbacks { if let Some(color_scheme) = crate::NAMED_COLOR_SCHEMES.read().get(val) { colorgrad::CustomGradient::new() // start at index 1, ignore the darkest/black part of the palette - .colors(&color_scheme.colors[1..]) + .colors(&color_scheme.colors) .build()? } else { // use sinebow gradient as a fallback diff --git a/eruption/src/state.rs b/eruption/src/state.rs index 9d88e4d26..c346f95fa 100644 --- a/eruption/src/state.rs +++ b/eruption/src/state.rs @@ -28,8 +28,9 @@ use std::path::PathBuf; use std::sync::atomic::Ordering; use std::sync::Arc; -use crate::constants; +use crate::color_scheme::ColorScheme; use crate::plugins::audio; +use crate::{constants, util}; pub type Result = std::result::Result; @@ -309,3 +310,23 @@ fn perform_sanity_checks() { warn!("Configuration value is outside of the valid range: active_slot"); } } + +pub fn save_color_schemes() -> Result<()> { + let file_name = PathBuf::from(&constants::STATE_DIR).join("color-schemes.state"); + + let data = toml::to_string_pretty(&*crate::NAMED_COLOR_SCHEMES.read())?; + util::write_file(&file_name, &data)?; + + Ok(()) +} + +pub fn load_color_schemes() -> Result<()> { + let file_name = PathBuf::from(&constants::STATE_DIR).join("color-schemes.state"); + + let data = fs::read_to_string(&file_name)?; + let color_schemes: HashMap = toml::from_str(&data)?; + + *crate::NAMED_COLOR_SCHEMES.write() = color_schemes; + + Ok(()) +} diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 89afeb4e1..5a807afd9 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruptionctl" -version = "0.0.19" +version = "0.0.20" authors = ["X3n0m0rph59 "] edition = "2021" description = "A CLI control utility for the Eruption Linux user-mode driver" diff --git a/eruptionctl/README.md b/eruptionctl/README.md index a1ebb9d69..15484c805 100644 --- a/eruptionctl/README.md +++ b/eruptionctl/README.md @@ -37,7 +37,7 @@ Selected device: ROCCAT Kone Pure Ultra (1) ```shell $ eruptionctl -eruptionctl 0.0.17 +eruptionctl 0.0.20 X3n0m0rph59 @@ -55,6 +55,7 @@ OPTIONS: -c, --config Sets the configuration file to use SUBCOMMANDS: + color-schemes Define, import or delete a named color scheme completions Generate shell completions config Configuration related sub-commands devices Get or set some device specific configuration parameters From 3c3c7df821a1dee61c785d518998c07f2864f169 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Sun, 17 Jul 2022 18:27:35 +0200 Subject: [PATCH 14/20] Update support for named color schemes Robustify color scheme management: * Limit the allowed character set to that of valid Lua identifiers * Show an error if a remove command failed, due to an invalid name of the color-scheme References #152 Fixes #153 --- Cargo.lock | 2 +- eruption/src/color_scheme.rs | 11 ++++- eruption/src/dbus_interface.rs | 49 ++++++++++++------- eruptionctl/Cargo.toml | 2 +- eruptionctl/README.md | 2 +- eruptionctl/src/dbus_client.rs | 6 +-- eruptionctl/src/main.rs | 41 +++++++++++++--- .../en_US/eruptionctl.bash-completion | 10 +++- .../en_US/eruptionctl.elvish-completion | 2 + .../en_US/eruptionctl.fish-completion | 1 + .../en_US/eruptionctl.powershell-completion | 2 + .../en_US/eruptionctl.zsh-completion | 4 +- 12 files changed, 97 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bad5a788b..58e407dad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1398,7 +1398,7 @@ dependencies = [ [[package]] name = "eruptionctl" -version = "0.0.20" +version = "0.0.21" dependencies = [ "cfg-if 1.0.0", "clap", diff --git a/eruption/src/color_scheme.rs b/eruption/src/color_scheme.rs index 4b31efc1b..9fa8bf5e9 100644 --- a/eruption/src/color_scheme.rs +++ b/eruption/src/color_scheme.rs @@ -95,8 +95,7 @@ impl TryFrom for ColorScheme { let count = value.num_colors(); let mut colors = Vec::new(); - // ignore the first element (don't use the darkest/lightest one) - for index in 1..count { + for index in 0..count { let color = value.color_rgba_at(index)?; colors.push(color); @@ -116,6 +115,14 @@ pub struct PywalColorScheme { pub colors: Palette16, } +impl PywalColorScheme { + /// Optimize the palette, remove outlier colors + pub fn optimize(&mut self) { + self.colors.color0 = self.colors.color1.clone(); + self.colors.color8 = self.colors.color9.clone(); + } +} + impl ColorSchemeExt for PywalColorScheme { fn num_colors(&self) -> usize { 16 diff --git a/eruption/src/dbus_interface.rs b/eruption/src/dbus_interface.rs index abf8020c6..310260210 100644 --- a/eruption/src/dbus_interface.rs +++ b/eruption/src/dbus_interface.rs @@ -649,26 +649,36 @@ impl DbusApi { { let (name, data): (String, Vec) = m.msg.read2()?; - let mut color_schemes = crate::NAMED_COLOR_SCHEMES.write(); - let mut colors = Vec::new(); + if name.chars().take(1).all(char::is_numeric) + || !name.chars().all(|c| { + c == '_' || char::is_ascii_alphanumeric(&c) + }) + { + Err(MethodErr::failed("Invalid identifier name")) + } else { + let mut color_schemes = + crate::NAMED_COLOR_SCHEMES.write(); + let mut colors = Vec::new(); - for chunk in data.chunks(4) { - let r = chunk[0]; - let g = chunk[1]; - let b = chunk[2]; - let a = chunk[3]; + for chunk in data.chunks(4) { + let r = chunk[0]; + let g = chunk[1]; + let b = chunk[2]; + let a = chunk[3]; - let color = Color::from_linear_rgba8(r, g, b, a); + let color = Color::from_linear_rgba8(r, g, b, a); - colors.push(color); - } + colors.push(color); + } - color_schemes.insert(name, ColorScheme { colors }); + color_schemes.insert(name, ColorScheme { colors }); - crate::REQUEST_PROFILE_RELOAD.store(true, Ordering::SeqCst); + crate::REQUEST_PROFILE_RELOAD + .store(true, Ordering::SeqCst); - let s = true; - Ok(vec![m.msg.method_return().append1(s)]) + let s = true; + Ok(vec![m.msg.method_return().append1(s)]) + } } else { Err(MethodErr::failed("Authentication failed")) } @@ -686,11 +696,16 @@ impl DbusApi { { let name: String = m.msg.read1()?; - crate::NAMED_COLOR_SCHEMES.write().remove(&name); + let s = crate::NAMED_COLOR_SCHEMES + .write() + .remove(&name) + .is_some(); - crate::REQUEST_PROFILE_RELOAD.store(true, Ordering::SeqCst); + if s { + crate::REQUEST_PROFILE_RELOAD + .store(true, Ordering::SeqCst); + } - let s = true; Ok(vec![m.msg.method_return().append1(s)]) } else { Err(MethodErr::failed("Authentication failed")) diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 5a807afd9..eaacaaefe 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruptionctl" -version = "0.0.20" +version = "0.0.21" authors = ["X3n0m0rph59 "] edition = "2021" description = "A CLI control utility for the Eruption Linux user-mode driver" diff --git a/eruptionctl/README.md b/eruptionctl/README.md index 15484c805..9b75c1781 100644 --- a/eruptionctl/README.md +++ b/eruptionctl/README.md @@ -37,7 +37,7 @@ Selected device: ROCCAT Kone Pure Ultra (1) ```shell $ eruptionctl -eruptionctl 0.0.20 +eruptionctl 0.0.21 X3n0m0rph59 diff --git a/eruptionctl/src/dbus_client.rs b/eruptionctl/src/dbus_client.rs index 4c813451b..e70564d47 100644 --- a/eruptionctl/src/dbus_client.rs +++ b/eruptionctl/src/dbus_client.rs @@ -122,7 +122,7 @@ pub fn set_color_scheme(name: &str, color_scheme: &ColorScheme) -> Result<()> { Ok(()) } -pub fn remove_color_scheme(name: &str) -> Result<()> { +pub fn remove_color_scheme(name: &str) -> Result { use self::config::OrgEruptionConfig; let conn = Connection::new_system()?; @@ -132,9 +132,9 @@ pub fn remove_color_scheme(name: &str) -> Result<()> { Duration::from_secs(constants::DBUS_TIMEOUT_MILLIS as u64), ); - let _result = config_proxy.remove_color_scheme(&name)?; + let result = config_proxy.remove_color_scheme(&name)?; - Ok(()) + Ok(result) } mod slot { diff --git a/eruptionctl/src/main.rs b/eruptionctl/src/main.rs index cb0b64c50..076608121 100644 --- a/eruptionctl/src/main.rs +++ b/eruptionctl/src/main.rs @@ -234,7 +234,14 @@ pub enum ColorSchemesSubcommands { #[derive(Debug, clap::Parser)] pub enum ColorSchemeImportSubcommands { /// Import an existing Pywal color scheme - Pywal { file_name: Option }, + Pywal { + /// Optionally specify the file name to the pywal color scheme + file_name: Option, + + /// Optimize palette + #[clap(required = false, short, long, default_value = "false")] + optimize: bool, + }, } /// Sub-commands of the "devices" command @@ -754,13 +761,13 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { ColorSchemesSubcommands::List {} => { let color_schemes = dbus_client::get_color_schemes()?; - println!("Registered color schemes:\n"); + println!("Color schemes:\n"); for color_scheme in color_schemes { println!("{}", color_scheme.bold()); } - println!("\nSupported stock gradients:\n"); + println!("\nStock gradients:\n"); println!("system"); println!("rainbow-smooth"); @@ -774,19 +781,32 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { ColorSchemesSubcommands::Add { name, colors } => { println!("Importing color scheme from commandline"); - let color_scheme = ColorScheme::try_from(colors)?; + if colors.len() % 4 != 0 { + eprintln!( + "Invalid number of parameters specified, please use the 'RGBA' format" + ); + } else { + let color_scheme = ColorScheme::try_from(colors)?; - dbus_client::set_color_scheme(&name, &color_scheme)?; + dbus_client::set_color_scheme(&name, &color_scheme)?; + } } ColorSchemesSubcommands::Remove { name } => { println!("Removing color scheme: {}", name.bold()); - dbus_client::remove_color_scheme(&name)?; + let result = dbus_client::remove_color_scheme(&name)?; + + if !result { + eprintln!("The specified color scheme does not exist"); + } } ColorSchemesSubcommands::Import { command } => match command { - ColorSchemeImportSubcommands::Pywal { file_name } => { + ColorSchemeImportSubcommands::Pywal { + file_name, + optimize, + } => { let file_name = if let Some(path) = file_name { path } else { @@ -802,7 +822,12 @@ pub async fn async_main() -> std::result::Result<(), eyre::Error> { ); let json_data = fs::read_to_string(&file_name)?; - let pywal_color_scheme: PywalColorScheme = serde_json::from_str(&json_data)?; + let mut pywal_color_scheme: PywalColorScheme = + serde_json::from_str(&json_data)?; + + if optimize { + pywal_color_scheme.optimize(); + } let color_scheme = ColorScheme::try_from(pywal_color_scheme)?; diff --git a/support/shell/completions/en_US/eruptionctl.bash-completion b/support/shell/completions/en_US/eruptionctl.bash-completion index d6494632a..1fbffeb25 100644 --- a/support/shell/completions/en_US/eruptionctl.bash-completion +++ b/support/shell/completions/en_US/eruptionctl.bash-completion @@ -198,12 +198,20 @@ _eruptionctl() { return 0 ;; eruptionctl__color__schemes__import__pywal) - opts="-h --help " + opts="-o -h --optimize --help " if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --optimize) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -o) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; *) COMPREPLY=() ;; diff --git a/support/shell/completions/en_US/eruptionctl.elvish-completion b/support/shell/completions/en_US/eruptionctl.elvish-completion index af1675b91..6ea559cec 100644 --- a/support/shell/completions/en_US/eruptionctl.elvish-completion +++ b/support/shell/completions/en_US/eruptionctl.elvish-completion @@ -85,6 +85,8 @@ set edit:completion:arg-completer[eruptionctl] = {|@words| cand help 'Print this message or the help of the given subcommand(s)' } &'eruptionctl;color-schemes;import;pywal'= { + cand -o 'Optimize palette' + cand --optimize 'Optimize palette' cand -h 'Print help information' cand --help 'Print help information' } diff --git a/support/shell/completions/en_US/eruptionctl.fish-completion b/support/shell/completions/en_US/eruptionctl.fish-completion index 0f92b2b85..571e993b5 100644 --- a/support/shell/completions/en_US/eruptionctl.fish-completion +++ b/support/shell/completions/en_US/eruptionctl.fish-completion @@ -32,6 +32,7 @@ complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fis complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "pywal" -d 'Import an existing Pywal color scheme' complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and not __fish_seen_subcommand_from pywal; and not __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and __fish_seen_subcommand_from pywal" -s o -l optimize -d 'Optimize palette' -r complete -c eruptionctl -n "__fish_seen_subcommand_from color-schemes; and __fish_seen_subcommand_from import; and __fish_seen_subcommand_from pywal" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -s h -l help -d 'Print help information' complete -c eruptionctl -n "__fish_seen_subcommand_from devices; and not __fish_seen_subcommand_from list; and not __fish_seen_subcommand_from info; and not __fish_seen_subcommand_from status; and not __fish_seen_subcommand_from brightness; and not __fish_seen_subcommand_from profile; and not __fish_seen_subcommand_from dpi; and not __fish_seen_subcommand_from rate; and not __fish_seen_subcommand_from debounce; and not __fish_seen_subcommand_from distance; and not __fish_seen_subcommand_from angle-snapping; and not __fish_seen_subcommand_from help" -f -a "list" -d 'List connected devices and their indices (run this first)' diff --git a/support/shell/completions/en_US/eruptionctl.powershell-completion b/support/shell/completions/en_US/eruptionctl.powershell-completion index 9f1c970b8..5a553eafb 100644 --- a/support/shell/completions/en_US/eruptionctl.powershell-completion +++ b/support/shell/completions/en_US/eruptionctl.powershell-completion @@ -98,6 +98,8 @@ Register-ArgumentCompleter -Native -CommandName 'eruptionctl' -ScriptBlock { break } 'eruptionctl;color-schemes;import;pywal' { + [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'Optimize palette') + [CompletionResult]::new('--optimize', 'optimize', [CompletionResultType]::ParameterName, 'Optimize palette') [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') break diff --git a/support/shell/completions/en_US/eruptionctl.zsh-completion b/support/shell/completions/en_US/eruptionctl.zsh-completion index 4feae1185..c49731523 100644 --- a/support/shell/completions/en_US/eruptionctl.zsh-completion +++ b/support/shell/completions/en_US/eruptionctl.zsh-completion @@ -122,9 +122,11 @@ _arguments "${_arguments_options[@]}" \ case $line[1] in (pywal) _arguments "${_arguments_options[@]}" \ +'-o+[Optimize palette]: : ' \ +'--optimize=[Optimize palette]: : ' \ '-h[Print help information]' \ '--help[Print help information]' \ -'::file-name:' \ +'::file-name -- Optionally specify the file name to the pywal color scheme:' \ && ret=0 ;; (help) From a1f7057f25c2b85722b1846c3a0bea9ee9b88303 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Mon, 15 Aug 2022 19:56:57 +0200 Subject: [PATCH 15/20] Update dependencies Fix compiler errors --- Cargo.lock | 655 ++++++++---------- eruption-audio-proxy/Cargo.toml | 28 +- eruption-cmd/Cargo.toml | 18 +- eruption-debug-tool/Cargo.toml | 22 +- eruption-gui/Cargo.toml | 20 +- eruption-hotplug-helper/Cargo.toml | 12 +- eruption-hwutil/Cargo.toml | 26 +- eruption-keymap/Cargo.toml | 36 +- eruption-keymap/src/util.rs | 2 - eruption-netfx/Cargo.toml | 22 +- eruption-process-monitor/Cargo.toml | 28 +- .../src/procmon-sys/Cargo.toml | 2 +- eruption-util/Cargo.toml | 20 +- eruption-watchdog/Cargo.toml | 16 +- eruption/Cargo.toml | 52 +- eruption/src/plugins/macros.rs | 481 +++++++------ eruptionctl/Cargo.toml | 28 +- sdk/examples/rust/simple/Cargo.toml | 4 +- sdk/lib/rust/eruption-rs/Cargo.toml | 18 +- sdk/lib/rust/liberuption/Cargo.toml | 6 +- 20 files changed, 717 insertions(+), 779 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58e407dad..cac6ca93c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,6 +64,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -75,9 +84,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" +checksum = "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8" [[package]] name = "approx" @@ -96,9 +105,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "async-trait" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" dependencies = [ "proc-macro2", "quote", @@ -215,34 +224,22 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.5", + "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.5" +name = "block-buffer" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -266,17 +263,11 @@ version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "bytemuck" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c53dfa917ec274df8ed3c572698f381a24eef2efba9492d797301b72b6db408a" +checksum = "44f8cb64b4147a528e1e9e77583739e683541973295b35f3bd7e78d42c5971fd" [[package]] name = "byteorder" @@ -286,9 +277,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "cairo-rs" @@ -321,7 +312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22a6a8f622f797120d452c630b0ab12e1331a1a753e2039ce7868d4ac77b4ee" dependencies = [ "log", - "nix 0.24.1", + "nix 0.24.2", "slotmap", "thiserror", "vec_map", @@ -375,23 +366,25 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time 0.1.44", + "wasm-bindgen", "winapi 0.3.9", ] [[package]] name = "clap" -version = "3.2.12" +version = "3.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8b79fe3946ceb4a0b1c080b4018992b8d27e9ff363644c1c9b6387c854614d" +checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" dependencies = [ "atty", "bitflags", @@ -406,18 +399,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.2.3" +version = "3.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ead064480dfc4880a10764488415a97fdd36a4cf1bb022d372f02e8faf8386e1" +checksum = "e4179da71abd56c26b54dd0c248cc081c1f43b0a1a7e8448e28e57a29baa993d" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "3.2.7" +version = "3.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759bf187376e1afa7b85b959e6a664a3e7a95203415dba952ad19139e798f902" +checksum = "13547f7012c01ab4a0e8f8967730ada8f9fdf419e8b6c792788f39cf4e46eefa" dependencies = [ "heck", "proc-macro-error", @@ -435,15 +428,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "cmake" -version = "0.1.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" -dependencies = [ - "cc", -] - [[package]] name = "color-eyre" version = "0.6.2" @@ -490,9 +474,9 @@ dependencies = [ [[package]] name = "colorgrad" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "192bdc11e0b466299466ed672f9867c2bd3828fe6ca6bfd9e7efbc6092ae9ebc" +checksum = "4a2d16665305bc62a863baa4005b1074f77e7f2f65e0805734b4df6b854cd66e" dependencies = [ "csscolorparser", ] @@ -511,9 +495,9 @@ dependencies = [ [[package]] name = "config" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea917b74b6edfb5024e3b55d3c8f710b5f4ed92646429601a42e96f0812b31b" +checksum = "11f1667b8320afa80d69d8bbe40830df2c8a06003d86f73d8e003b2c48df416d" dependencies = [ "async-trait", "json5", @@ -530,14 +514,13 @@ dependencies = [ [[package]] name = "console" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" +checksum = "89eab4d20ce20cea182308bca13088fecea9c05f6776cf287205d41a0ed3c847" dependencies = [ "encode_unicode", "libc", "once_cell", - "regex", "terminal_size", "unicode-width", "winapi 0.3.9", @@ -585,9 +568,9 @@ checksum = "b31d2174830f395fd7e413c2f8a119252de36356982f805f495269331e97559e" [[package]] name = "crossbeam" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" dependencies = [ "cfg-if 1.0.0", "crossbeam-channel", @@ -599,9 +582,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -609,9 +592,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", @@ -620,9 +603,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if 1.0.0", @@ -634,9 +617,9 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -644,9 +627,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -677,13 +660,23 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "csscolorparser" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80ab25764ba7edca4f546ee81e5471d04cb3143dfdc28f19168a8b58d3a2c8af" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" dependencies = [ - "phf 0.10.1", + "phf", "serde", ] @@ -699,9 +692,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" dependencies = [ "quote", "syn", @@ -709,11 +702,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.2.2" +version = "3.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865" +checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173" dependencies = [ - "nix 0.24.1", + "nix 0.25.0", "winapi 0.3.9", ] @@ -789,20 +782,21 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.12.4", + "generic-array", ] [[package]] name = "digest" -version = "0.9.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "generic-array 0.14.5", + "block-buffer 0.10.2", + "crypto-common", ] [[package]] @@ -849,9 +843,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435217f1b2d06f00513185fb991cd426271d9e4c3a9d9b25b919b8e5a03b282d" +checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2" [[package]] name = "either" @@ -923,11 +917,11 @@ dependencies = [ "mimalloc", "mlua", "nalgebra", - "nix 0.24.1", + "nix 0.25.0", "noise", "palette", "parking_lot", - "paste 1.0.7", + "paste 1.0.8", "pretty_assertions", "pretty_env_logger", "procinfo", @@ -978,7 +972,7 @@ dependencies = [ "libpulse-binding", "libpulse-simple-binding", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1014,7 +1008,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1047,7 +1041,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1091,12 +1085,12 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "palette", "pango", "pangocairo", "parking_lot", - "paste 1.0.7", + "paste 1.0.8", "pretty_assertions", "pretty_env_logger", "rayon", @@ -1164,7 +1158,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1206,7 +1200,7 @@ dependencies = [ "log", "maplit", "mlua", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pest", "pest_derive", @@ -1243,13 +1237,13 @@ dependencies = [ "i18n-embed", "i18n-embed-fl", "icecream", - "image 0.24.2", + "image 0.24.3", "jwalk", "lazy_static", "libc", "log", "memmap2", - "nix 0.24.1", + "nix 0.25.0", "num-traits", "parking_lot", "pretty_assertions", @@ -1262,7 +1256,7 @@ dependencies = [ "thread_local", "tokio", "unic-langid", - "wayland-client 0.30.0-beta.7", + "wayland-client 0.30.0-beta.8", "x11", "x11rb", ] @@ -1294,7 +1288,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1324,7 +1318,7 @@ dependencies = [ "futures", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "prost", "prost-build", @@ -1356,7 +1350,7 @@ dependencies = [ "lazy_static", "libc", "log", - "nix 0.24.1", + "nix 0.25.0", "parking_lot", "pretty_assertions", "pretty_env_logger", @@ -1421,7 +1415,7 @@ dependencies = [ "libc", "log", "parking_lot", - "paste 1.0.7", + "paste 1.0.8", "pretty_assertions", "rust-embed", "serde", @@ -1435,9 +1429,9 @@ dependencies = [ [[package]] name = "evdev-rs" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db51abf6b3205a6e6e8dd68d7a5414d7c50d61736a6f4c9b97df86ef5567cf" +checksum = "46504075975d14f0463e5a41efa06820c94d4c04fecd01f70b95365d60de1caf" dependencies = [ "bitflags", "evdev-sys", @@ -1447,9 +1441,9 @@ dependencies = [ [[package]] name = "evdev-sys" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c71458f1f28b418779703f0fb17771f08562afacf0ee30176cca0e75e9e7d4" +checksum = "14ead42b547b15d47089c1243d907bcf0eb94e457046d3b315a26ac9c9e9ea6d" dependencies = [ "cc", "libc", @@ -1482,17 +1476,11 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] @@ -1590,9 +1578,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.10.13" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ceeb589a3157cac0ab8cc585feb749bd2cea5cb55a6ee802ad72d9fd38303da" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" dependencies = [ "futures-core", "futures-sink", @@ -1671,9 +1659,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" dependencies = [ "futures-channel", "futures-core", @@ -1686,9 +1674,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" dependencies = [ "futures-core", "futures-sink", @@ -1696,15 +1684,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "1d11aa21b5b587a64682c0094c2bdd4df0076c5324961a40cc3abd7f37930528" dependencies = [ "futures-core", "futures-task", @@ -1713,15 +1701,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "0db9cce532b0eae2ccf2766ab246f114b56b9cf6d445e00c2549fbc100ca045d" dependencies = [ "proc-macro2", "quote", @@ -1730,21 +1718,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" dependencies = [ "futures-channel", "futures-core", @@ -1819,18 +1807,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.12.4" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", "version_check", @@ -1882,9 +1861,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" [[package]] name = "gio" @@ -2035,9 +2014,9 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] @@ -2182,6 +2161,19 @@ dependencies = [ "syn", ] +[[package]] +name = "iana-time-zone" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf7d67cf4a22adc5be66e75ebdf769b3f2ea032041437a7061f97a63dad4b" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "wasm-bindgen", + "winapi 0.3.9", +] + [[package]] name = "icecream" version = "0.1.0" @@ -2213,9 +2205,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" dependencies = [ "bytemuck", "byteorder", @@ -2223,12 +2215,11 @@ dependencies = [ "exr", "gif", "jpeg-decoder 0.2.6", - "num-iter", "num-rational 0.4.1", "num-traits", "png 0.17.5", "scoped_threadpool", - "tiff 0.7.2", + "tiff 0.7.3", ] [[package]] @@ -2331,9 +2322,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "jpeg-decoder" @@ -2355,9 +2346,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" dependencies = [ "wasm-bindgen", ] @@ -2413,9 +2404,9 @@ checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.131" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "04c3b4822ccebfa39c02fc03d1534441b22ead323fa0f48bb7ddd8e6ba076a40" [[package]] name = "libdbus-sys" @@ -2644,9 +2635,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a79b39c93a7a5a27eeaf9a23b5ff43f1b9e0ad6b1cdd441140ae53c35613fc7" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" dependencies = [ "libc", ] @@ -2760,9 +2751,9 @@ dependencies = [ [[package]] name = "mlua" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82d0b12c7c8d3bdda5933d2aa322c76e4833d822796495f299990ca652bd1bf" +checksum = "10277581090f5cb7ecf814bc611152ce4db6dc8deffcaa08e24ed4c5197d9186" dependencies = [ "bstr", "cc", @@ -2780,9 +2771,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "nalgebra" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a89248335f688e4bd994e6d030fd7e185eb41769b8c435395075425e100ac6" +checksum = "e9e0a04ce089f9401aac565c740ed30c46291260f27d4911fdbaa6ca65fa3044" dependencies = [ "approx", "matrixmultiply", @@ -2840,9 +2831,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -2850,6 +2841,20 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "noise" version = "0.7.0" @@ -3039,12 +3044,6 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "opaque-debug" version = "0.3.0" @@ -3063,9 +3062,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.1.0" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "output_vt100" @@ -3084,21 +3083,21 @@ checksum = "decf7381921fea4dcb2549c5667eda59b3ec297ab7e2b5fc33eac69d2e7da87b" [[package]] name = "palette" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9735f7e1e51a3f740bacd5dc2724b61a7806f23597a8736e679f38ee3435d18" +checksum = "8f9cd68f7112581033f157e56c77ac4a5538ec5836a2e39284e65bd7d7275e49" dependencies = [ "approx", "num-traits", "palette_derive", - "phf 0.9.0", + "phf", ] [[package]] name = "palette_derive" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7799c3053ea8a6d8a1193c7ba42f534e7863cf52e378a7f90406f4a645d33bad" +checksum = "05eedf46a8e7c27f74af0c9cfcdb004ceca158cb1b918c6f68f8d7a549b3e427" dependencies = [ "find-crate", "proc-macro2", @@ -3196,9 +3195,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" +checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" [[package]] name = "paste-impl" @@ -3217,18 +3216,19 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pest" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "69486e2b8c2d2aeb9762db7b4e00b0331156393555cff467f4163ff06821eef8" dependencies = [ + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "b13570633aff33c6d22ce47dd566b10a3b9122c2fe9d8e7501895905be532b91" dependencies = [ "pest", "pest_generator", @@ -3236,9 +3236,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +checksum = "b3c567e5702efdc79fb18859ea74c3eb36e14c43da7b8c1f098a4ed6514ec7a0" dependencies = [ "pest", "pest_meta", @@ -3249,11 +3249,11 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +checksum = "5eb32be5ee3bbdafa8c7a18b0a8a8d962b66cfa2ceee4037f49267a50ee821fe" dependencies = [ - "maplit", + "once_cell", "pest", "sha-1", ] @@ -3270,69 +3270,32 @@ dependencies = [ [[package]] name = "phf" -version = "0.9.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ac8b67553a7ca9457ce0e526948cad581819238f4a9d1ea74545851fa24f37" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" dependencies = [ - "phf_macros 0.9.0", - "phf_shared 0.9.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_macros", + "phf_shared", ] [[package]] name = "phf_generator" -version = "0.9.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" dependencies = [ - "phf_shared 0.9.0", - "rand 0.8.5", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", + "phf_shared", "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.9.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b706f5936eb50ed880ae3009395b43ed19db5bff2ebd459c95e7bf013a89ab86" +checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" dependencies = [ - "phf_generator 0.9.1", - "phf_shared 0.9.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_generator", + "phf_shared", "proc-macro2", "quote", "syn", @@ -3340,36 +3303,27 @@ dependencies = [ [[package]] name = "phf_shared" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68318426de33640f02be62b4ae8eb1261be2efbc337b60c54d845bf4484e0d9" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", @@ -3448,19 +3402,20 @@ dependencies = [ [[package]] name = "primal-check" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01419cee72c1a1ca944554e23d83e483e1bccf378753344e881de28b5487511d" +checksum = "8b264861209b0641a9b7571695029f516698bd3f2bf46eb61fca408675630b8c" dependencies = [ "num-integer", ] [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ + "once_cell", "thiserror", "toml", ] @@ -3497,9 +3452,9 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] @@ -3526,9 +3481,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" +checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" dependencies = [ "bytes", "prost-derive", @@ -3536,13 +3491,11 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.10.4" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" +checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb" dependencies = [ "bytes", - "cfg-if 1.0.0", - "cmake", "heck", "itertools 0.10.3", "lazy_static", @@ -3558,9 +3511,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" +checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" dependencies = [ "anyhow", "itertools 0.10.3", @@ -3571,9 +3524,9 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" +checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" dependencies = [ "bytes", "prost", @@ -3587,9 +3540,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -3712,9 +3665,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -3854,15 +3807,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "safe_arch" @@ -3941,18 +3894,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.139" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" +checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.139" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" +checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" dependencies = [ "proc-macro2", "quote", @@ -3961,9 +3914,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" dependencies = [ "itoa", "ryu", @@ -3992,21 +3945,20 @@ dependencies = [ "cfg-if 1.0.0", "libudev", "mach 0.3.2", - "nix 0.24.1", + "nix 0.24.2", "regex", "winapi 0.3.9", ] [[package]] name = "sha-1" -version = "0.8.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.3", ] [[package]] @@ -4019,7 +3971,7 @@ dependencies = [ "cfg-if 1.0.0", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -4063,14 +4015,14 @@ dependencies = [ [[package]] name = "simba" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a2609e876d4f77f6ab7ff5254fc39b4f1927ba8e6db3d18be7c32534d3725e" +checksum = "c48e45e5961033db030b56ad67aef22e9c908c493a6e8348c0a0f6b93433cd77" dependencies = [ "approx", "num-complex", "num-traits", - "paste 1.0.7", + "paste 1.0.8", "wide", ] @@ -4119,9 +4071,12 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "slotmap" @@ -4150,7 +4105,7 @@ dependencies = [ "lazy_static", "log", "memmap2", - "nix 0.24.1", + "nix 0.24.2", "pkg-config", "wayland-client 0.29.4", "wayland-cursor", @@ -4233,9 +4188,9 @@ checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" [[package]] name = "strum_macros" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4faebde00e8ff94316c01800f9054fd2ba77d30d9e922541913051d1d978918b" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck", "proc-macro2", @@ -4246,9 +4201,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", @@ -4257,9 +4212,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.24.6" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6e19da72a8d75be4d40e4dd4686afca31507f26c3ffdf6bd3073278d9de0a0" +checksum = "1594a36887d0f70096702bffadfb67dfbfe76ad4bf84605e86157dc9fce9961a" dependencies = [ "cfg-if 1.0.0", "core-foundation-sys", @@ -4280,7 +4235,7 @@ dependencies = [ "hostname", "libc", "log", - "time 0.3.11", + "time 0.3.13", ] [[package]] @@ -4358,18 +4313,18 @@ checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" dependencies = [ "proc-macro2", "quote", @@ -4418,9 +4373,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cfada0986f446a770eca461e8c6566cb879682f7d687c8348aa0c857bd52286" +checksum = "7259662e32d1e219321eb309d5f9d898b779769d81b76e762c07c8e5d38fcb65" dependencies = [ "flate2", "jpeg-decoder 0.2.6", @@ -4440,9 +4395,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.11" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +checksum = "db76ff9fa4b1458b3c7f077f3ff9887394058460d21e634355b273aaf11eea45" dependencies = [ "itoa", "libc", @@ -4457,9 +4412,9 @@ checksum = "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1" [[package]] name = "tokio" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" +checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" dependencies = [ "autocfg", "bytes", @@ -4498,9 +4453,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -4521,9 +4476,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" dependencies = [ "once_cell", "valuable", @@ -4562,9 +4517,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a713421342a5a666b7577783721d3117f1b69a393df803ee17bb73b1e122a59" +checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" dependencies = [ "ansi_term", "sharded-slab", @@ -4637,9 +4592,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "unicode-width" @@ -4724,9 +4679,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4734,13 +4689,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -4749,9 +4704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4759,9 +4714,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ "proc-macro2", "quote", @@ -4772,23 +4727,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] name = "wayland-backend" -version = "0.1.0-beta.7" +version = "0.1.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a861eb7cd51f67de60f228a570f142396d94759babcb427f861071ffb0757c9e" +checksum = "0ee8e77c63b0cdc68bfc7b407b862b0fe2718949ce060b32d4f94ef1ea9607a4" dependencies = [ "cc", "downcast-rs", - "log", - "nix 0.24.1", + "nix 0.24.2", "scoped-tls", "smallvec", - "wayland-sys 0.30.0-beta.7", + "wayland-sys 0.30.0-beta.8", ] [[package]] @@ -4809,18 +4763,17 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.30.0-beta.7" +version = "0.30.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dca5290499da69c21fcf64b4021886963511b888af056dbfb6bebfb7e1587e6" +checksum = "0f9e0d862c23f07b2c4b49de66b0680948af5dd1d2def17f1ddc16520352bf14" dependencies = [ "bitflags", "futures-channel", "futures-core", - "log", - "nix 0.24.1", + "nix 0.24.2", "thiserror", "wayland-backend", - "wayland-scanner 0.30.0-beta.7", + "wayland-scanner 0.30.0-beta.8", ] [[package]] @@ -4871,9 +4824,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.30.0-beta.7" +version = "0.30.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3baff545c2f5a0c32d796595d0b3c8fafccf29e72e557ff1969fe552ff093d6" +checksum = "87933ccc3df4f6335cf240aca0647aa34319fdd693dda503f645ca4df4e10386" dependencies = [ "proc-macro2", "quote", @@ -4894,9 +4847,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.30.0-beta.7" +version = "0.30.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f62b62672d36b6cf2f7d936f95c9f5894c0609190fa789c2ce46b73912baf239" +checksum = "beca223ed017df1b356ff181d4d6e7f2b135418c4888df5bb02df7a563f02ab0" dependencies = [ "dlib", "log", @@ -5046,9 +4999,9 @@ dependencies = [ [[package]] name = "x11" -version = "2.19.1" +version = "2.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd0565fa8bfba8c5efe02725b14dff114c866724eff2cfd44d76cea74bcd87a" +checksum = "f7ae97874a928d821b061fce3d1fc52f08071dd53c89a6102bc06efcac3b2908" dependencies = [ "libc", "pkg-config", @@ -5062,7 +5015,7 @@ checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" dependencies = [ "gethostname", "libc", - "nix 0.24.1", + "nix 0.24.2", "winapi 0.3.9", "winapi-wsapoll", "x11rb-protocol", @@ -5074,7 +5027,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" dependencies = [ - "nix 0.24.1", + "nix 0.24.2", ] [[package]] diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index 45399301d..bc055e857 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -30,24 +30,24 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -serde = { version = "1.0.139", features = ["derive"] } +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +serde = { version = "1.0.143", features = ["derive"] } lazy_static = "1.4.0" -flume = "0.10.13" +flume = "0.10.14" log = "0.4.17" syslog = "6.0.1" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } -ctrlc = { version = "3.2.2", features = ["termination"] } +ctrlc = { version = "3.2.3", features = ["termination"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" hound = "3.4.0" @@ -59,9 +59,9 @@ rust-pulsectl = { git = "https://github.com/X3n0m0rph59/pulsectl.git", branch = # dbus = "0.9.3" # dbus-tree = "0.9.1" byteorder = "1.4.3" -bytes = "1.1.0" -prost = "0.10.4" -prost-types = "0.10.1" +bytes = "1.2.1" +prost = "0.11.0" +prost-types = "0.11.1" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" rust-embed = "6.4.0" @@ -71,7 +71,7 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } [build-dependencies] -prost-build = "0.10.4" +prost-build = "0.11.1" diff --git a/eruption-cmd/Cargo.toml b/eruption-cmd/Cargo.toml index 5755167ef..d662ceb10 100644 --- a/eruption-cmd/Cargo.toml +++ b/eruption-cmd/Cargo.toml @@ -30,21 +30,21 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -flume = "0.10.13" -thiserror = "1.0.31" +flume = "0.10.14" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" lazy_static = "1.4.0" @@ -56,4 +56,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index 70b83a0bb..e7960d74b 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -31,23 +31,23 @@ resolver = "2" [dependencies] lazy_static = "1.4.0" cfg-if = "1.0.0" -flume = "0.10.13" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" +flume = "0.10.14" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" colored = "2.0.0" -ctrlc = { version = "3.2.2", features = ["termination"] } +ctrlc = { version = "3.2.3", features = ["termination"] } log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" hexdump = "0.1.1" @@ -64,4 +64,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-gui/Cargo.toml b/eruption-gui/Cargo.toml index 26eab6960..a2d52dea4 100644 --- a/eruption-gui/Cargo.toml +++ b/eruption-gui/Cargo.toml @@ -37,28 +37,28 @@ cfg-if = "1.0.0" colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" rayon = "1.5.3" walkdir = "2.3.2" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.29" #tracing-futures = "0.2.5" #tracing-subscriber = "0.3.2" -config = "0.13.1" +config = "0.13.2" uuid = { version = "1.1.2", features = ["serde", "v4"] } toml = "0.5.9" byteorder = "1.4.3" itertools = "0.10.3" lazy_static = "1.4.0" -palette = "0.6.0" -thiserror = "1.0.31" +palette = "0.6.1" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" -paste = "1.0.7" +paste = "1.0.8" dbus = "0.9.6" dbus-tokio = "0.7.5" cairo-rs = "0.15.12" @@ -85,4 +85,4 @@ icecream = "0.1.0" pretty_assertions = "1.2.1" [dev-dependencies] -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-hotplug-helper/Cargo.toml b/eruption-hotplug-helper/Cargo.toml index 97112a9e4..cffcb31af 100644 --- a/eruption-hotplug-helper/Cargo.toml +++ b/eruption-hotplug-helper/Cargo.toml @@ -30,19 +30,19 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" log = "0.4.17" syslog = "6.0.1" lazy_static = "1.4.0" pretty_env_logger = "0.4.0" -libc = "0.2.126" +libc = "0.2.131" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" lockfile = "0.3.0" @@ -55,4 +55,4 @@ eruption-rs = { path = "../sdk/lib/rust/eruption-rs" } [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index 09946660f..f286937c8 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -30,27 +30,27 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -flume = "0.10.13" +flume = "0.10.14" lazy_static = "1.4.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" -console = "0.15.0" +console = "0.15.1" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -config = "0.13.1" +config = "0.13.2" toml = "0.5.9" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" bitvec = "1.0.1" @@ -67,4 +67,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index f637e70fb..16041b241 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -30,45 +30,45 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" comfy-table = "6.0.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } -tracing = "0.1.35" +tokio = { version = "1.20.1", features = ["full"] } +tracing = "0.1.36" tracing-futures = "0.2.5" -tracing-subscriber = "0.3.14" -flume = "0.10.13" -thiserror = "1.0.31" +tracing-subscriber = "0.3.15" +flume = "0.10.14" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" hexdump = "0.1.1" -chrono = { version = "0.4.19", features = ["serde"] } +chrono = { version = "0.4.22", features = ["serde"] } hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } #lua-src = "544.0.1" #mlua = { version = "0.7.3", features = ["lua54", "vendored"] } #luajit-src = "210.3.2+resty1085a4d" #mlua = { version = "0.7.3", features = ["luajit52"] } -mlua = { version = "0.8.1", features = ["lua54"] } +mlua = { version = "0.8.3", features = ["lua54"] } regex = "1.6.0" dbus = "0.9.6" dbus-tokio = "0.7.5" udev = "0.6.3" -evdev-rs = "0.5.0" +evdev-rs = "0.6.0" lazy_static = "1.4.0" bitvec = "1.0.1" walkdir = "2.3.2" maplit = "1.0.2" -pest = "2.1.3" -pest_derive = "2.1.0" -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" +pest = "2.2.1" +pest_derive = "2.2.1" +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" serde_json_any_key = "2.0.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" @@ -78,4 +78,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-keymap/src/util.rs b/eruption-keymap/src/util.rs index e49258fcf..e2655e51e 100644 --- a/eruption-keymap/src/util.rs +++ b/eruption-keymap/src/util.rs @@ -291,7 +291,6 @@ pub fn evdev_event_code_to_string(event: u32) -> String { EV_KEY::KEY_PAUSECD => "KEY_PAUSECD", EV_KEY::KEY_PROG3 => "KEY_PROG3", EV_KEY::KEY_PROG4 => "KEY_PROG4", - EV_KEY::KEY_DASHBOARD => "KEY_DASHBOARD", EV_KEY::KEY_SUSPEND => "KEY_SUSPEND", EV_KEY::KEY_CLOSE => "KEY_CLOSE", EV_KEY::KEY_PLAY => "KEY_PLAY", @@ -743,7 +742,6 @@ pub fn evdev_event_code_from_string(event: &str) -> Option { "KEY_PAUSECD" => EV_KEY::KEY_PAUSECD, "KEY_PROG3" => EV_KEY::KEY_PROG3, "KEY_PROG4" => EV_KEY::KEY_PROG4, - "KEY_DASHBOARD" => EV_KEY::KEY_DASHBOARD, "KEY_SUSPEND" => EV_KEY::KEY_SUSPEND, "KEY_CLOSE" => EV_KEY::KEY_CLOSE, "KEY_PLAY" => EV_KEY::KEY_PLAY, diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index 1a16f4d2c..ed1b57f56 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -38,36 +38,36 @@ backend-x11 = ["x11", "x11rb"] [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" lazy_static = "1.4.0" thread_local = "1.1.4" dyn-clonable = "0.9.0" -libc = "0.2.126" -memmap2 = "0.5.5" -nix = "0.24.1" +libc = "0.2.131" +memmap2 = "0.5.7" +nix = "0.25.0" tempfile = "3.3.0" rayon = "1.5.3" jwalk = "0.6.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" num-traits = "0.2.15" dbus = { version = "0.9.6", optional = true } dbus-tokio = { version = "0.7.5", optional = true } -image = "0.24.2" +image = "0.24.3" smithay-client-toolkit = { version = "0.16.0", optional = true } -x11 = { version = "2.19.1", features = ["xlib", "xrandr"], optional = true } +x11 = { version = "2.20.0", features = ["xlib", "xrandr"], optional = true } x11rb = { version = "0.10.1", features = ["allow-unsafe-code"], optional = true } -wayland-client = { version = "0.30.0-beta.7", optional = true } +wayland-client = { version = "0.30.0-beta.8", optional = true } i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" rust-embed = "6.4.0" @@ -76,4 +76,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index ee3d0def1..887ea41c2 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -39,34 +39,34 @@ sensor-mutter = [] [dependencies] cfg-if = "1.0.0" -async-trait = "0.1.56" +async-trait = "0.1.57" byteorder = "1.4.3" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } -config = "0.13.1" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } +config = "0.13.2" dbus = "0.9.6" dbus-tokio = "0.7.5" dbus-tree = "0.9.2" -dyn-clone = "1.0.7" +dyn-clone = "1.0.9" dyn-clonable = "0.9.0" indexmap = "1.9.1" log = "0.4.17" syslog = "6.0.1" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" pretty_env_logger = "0.4.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } regex = "1.6.0" -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -flume = "0.10.13" +flume = "0.10.14" toml = "0.5.9" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" hotwatch = "0.4.6" @@ -82,4 +82,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-process-monitor/src/procmon-sys/Cargo.toml b/eruption-process-monitor/src/procmon-sys/Cargo.toml index b0b7e24f9..99e4e30b6 100644 --- a/eruption-process-monitor/src/procmon-sys/Cargo.toml +++ b/eruption-process-monitor/src/procmon-sys/Cargo.toml @@ -9,7 +9,7 @@ license = "GPLv3+" [lib] [dependencies] -libc = "0.2.126" +libc = "0.2.131" [build-dependencies] cc = "1.0.73" diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index 9cef91f22..ed15d8ac4 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -30,27 +30,27 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -flume = "0.10.13" -thiserror = "1.0.31" +flume = "0.10.14" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" hexdump = "0.1.1" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } udev = "0.6.3" -evdev-rs = "0.5.0" +evdev-rs = "0.6.0" lazy_static = "1.4.0" bitvec = "1.0.1" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } @@ -61,4 +61,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption-watchdog/Cargo.toml b/eruption-watchdog/Cargo.toml index c32388f93..6d155da28 100644 --- a/eruption-watchdog/Cargo.toml +++ b/eruption-watchdog/Cargo.toml @@ -30,21 +30,21 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" -flume = "0.10.13" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +flume = "0.10.14" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } log = "0.4.17" syslog = "6.0.1" lazy_static = "1.4.0" pretty_env_logger = "0.4.0" -libc = "0.2.126" +libc = "0.2.131" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -tokio = { version = "1.20.0", features = ["full"] } +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" lockfile = "0.3.0" @@ -57,4 +57,4 @@ eruption-rs = { path = "../sdk/lib/rust/eruption-rs" } [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 4ddc26077..fdcceafdb 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -38,65 +38,65 @@ mimalloc = { version = "0.1.29", optional = true, default-features = false } coz = { version = "0.1.3", optional = true } cfg-if = "1.0.0" #flume = { version = "0.10.12", features = ["async", "eventual-fairness"]} -flume = { version = "0.10.13", features = ["async"] } -futures = "0.3.21" +flume = { version = "0.10.14", features = ["async"] } +futures = "0.3.23" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -async-trait = "0.1.56" +async-trait = "0.1.57" #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -libc = "0.2.126" -nix = "0.24.1" +libc = "0.2.131" +nix = "0.25.0" systemd = "0.10.0" log = "0.4.17" syslog = "6.0.1" pretty_env_logger = "0.4.0" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" toml = "0.5.9" -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } socket2 = { version = "0.4.4", features = ["all"] } -ctrlc = { version = "3.2.2", features = ["termination"] } -clap = "3.2.12" +ctrlc = { version = "3.2.3", features = ["termination"] } +clap = "3.2.17" hotwatch = "0.4.6" -config = "0.13.1" +config = "0.13.2" hidapi = { git = "https://github.com/ruabmbua/hidapi-rs.git", branch = "master" } udev = "0.6.3" -evdev-rs = "0.5.0" +evdev-rs = "0.6.0" hexdump = "0.1.1" byteorder = "1.4.3" itertools = "0.10.3" rayon = "1.5.3" lazy_static = "1.4.0" rand = "0.8.5" -colorgrad = "0.6.0" -csscolorparser = { version = "0.6.1", features = ["serde"] } -palette = "0.6.0" -nalgebra = "0.31.0" +colorgrad = "0.6.1" +csscolorparser = { version = "0.6.2", features = ["serde"] } +palette = "0.6.1" +nalgebra = "0.31.1" noise = "0.7.0" simdnoise = "3.1.6" #lua-src = "544.0.1" #mlua = { version = "0.7.3", features = ["lua54", "vendored"] } #luajit-src = "210.3.2+resty1085a4d" #mlua = { version = "0.7.3", features = ["luajit52"] } -mlua = { version = "0.8.1", features = ["lua54"] } -sysinfo = "0.24.6" +mlua = { version = "0.8.3", features = ["lua54"] } +sysinfo = "0.25.2" procinfo = "0.4.2" bincode = "2.0.0-rc.1" rustfft = "6.0.1" uuid = { version = "1.1.2", features = ["serde", "v4"] } dbus = "0.9.6" dbus-tree = "0.9.2" -paste = "1.0.7" +paste = "1.0.8" bitvec = "1.0.1" serialport = "4.2.0" crc8 = "0.1.1" -bytes = "1.1.0" -prost = "0.10.4" -prost-types = "0.10.1" +bytes = "1.2.1" +prost = "0.11.0" +prost-types = "0.11.1" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } rust-embed = "6.4.0" unic-langid = "0.9.0" @@ -107,8 +107,8 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -thiserror = "1.0.31" -tokio = { version = "1.20.0", features = ["test-util"] } +thiserror = "1.0.32" +tokio = { version = "1.20.1", features = ["test-util"] } [build-dependencies] -prost-build = "0.10.4" +prost-build = "0.11.1" diff --git a/eruption/src/plugins/macros.rs b/eruption/src/plugins/macros.rs index 8033fb2ee..0b69fea9f 100644 --- a/eruption/src/plugins/macros.rs +++ b/eruption/src/plugins/macros.rs @@ -95,231 +95,218 @@ impl MacrosPlugin { dev.set_version(0x01); // configure allowed events - dev.enable(&EventType::EV_KEY).unwrap(); - dev.enable(&EventType::EV_MSC).unwrap(); + dev.enable(EventType::EV_KEY).unwrap(); + dev.enable(EventType::EV_MSC).unwrap(); - dev.enable(&EventCode::EV_MSC(EV_MSC::MSC_SCAN)).unwrap(); - dev.enable(&EventCode::EV_SYN(EV_SYN::SYN_REPORT)).unwrap(); + dev.enable(EventCode::EV_MSC(EV_MSC::MSC_SCAN)).unwrap(); + dev.enable(EventCode::EV_SYN(EV_SYN::SYN_REPORT)).unwrap(); // enable FN-F5 - FN-F8 - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_FILE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HOMEPAGE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_MAIL)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_CALC)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_FILE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HOMEPAGE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_MAIL)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_CALC)).unwrap(); // enable media keys - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PREVIOUSSONG)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_STOPCD)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PLAYPAUSE)) + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PREVIOUSSONG)) .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_NEXTSONG)) + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_STOPCD)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PLAYPAUSE)) .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_NEXTSONG)).unwrap(); // Enable all supported keys; this is used to mirror the hardware device // to the virtual keyboard, so that the hardware device can be disabled. // Generated via `sudo evtest` // Supported events: - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_ESC)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_1)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_2)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_3)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_4)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_5)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_6)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_7)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_8)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_9)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_0)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_MINUS)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_EQUAL)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_BACKSPACE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_TAB)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_Q)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_W)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_E)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_R)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_T)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_Y)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_U)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_I)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_O)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_P)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFTBRACE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHTBRACE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_ENTER)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFTCTRL)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_A)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_S)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_D)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_G)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_H)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_J)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_K)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_L)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SEMICOLON)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_APOSTROPHE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_GRAVE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFTSHIFT)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_BACKSLASH)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_Z)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_X)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_C)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_V)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_B)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_N)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_M)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_COMMA)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_DOT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SLASH)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHTSHIFT)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPASTERISK)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFTALT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SPACE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_CAPSLOCK)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F1)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F2)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F3)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F4)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F5)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F6)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F7)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F8)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F9)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F10)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_NUMLOCK)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SCROLLLOCK)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP7)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP8)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP9)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPMINUS)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP4)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP5)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP6)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPPLUS)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP1)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP2)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP3)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KP0)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPDOT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_ZENKAKUHANKAKU)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_102ND)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F11)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F12)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RO)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KATAKANA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HIRAGANA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HENKAN)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KATAKANAHIRAGANA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_MUHENKAN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPJPCOMMA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPENTER)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHTCTRL)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPSLASH)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SYSRQ)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHTALT)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HOME)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_UP)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PAGEUP)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_END)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_DOWN)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PAGEDOWN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_INSERT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_DELETE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_MUTE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_VOLUMEDOWN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_VOLUMEUP)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_POWER)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPEQUAL)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PAUSE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPCOMMA)).unwrap(); - //dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HANGUEL)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HANJA)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_YEN)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_LEFTMETA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_RIGHTMETA)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_COMPOSE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_STOP)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_AGAIN)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PROPS)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_UNDO)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_FRONT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_COPY)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_OPEN)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PASTE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_FIND)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_CUT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_HELP)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_CALC)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SLEEP)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_WWW)).unwrap(); - //dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SCREENLOCK)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_BACK)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_FORWARD)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_EJECTCD)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_NEXTSONG)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PLAYPAUSE)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_PREVIOUSSONG)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_STOPCD)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_REFRESH)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_EDIT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SCROLLUP)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_SCROLLDOWN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPLEFTPAREN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_KPRIGHTPAREN)) - .unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F13)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F14)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F15)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F16)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F17)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F18)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F19)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F20)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F21)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F22)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F23)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_F24)).unwrap(); - - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_FN)).unwrap(); - - dev.enable(&EventCode::EV_KEY(EV_KEY::KEY_UNKNOWN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_ESC)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_1)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_2)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_3)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_4)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_5)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_6)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_7)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_8)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_9)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_0)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_MINUS)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_EQUAL)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_BACKSPACE)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_TAB)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_Q)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_W)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_E)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_R)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_T)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_Y)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_U)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_I)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_O)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_P)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFTBRACE)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHTBRACE)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_ENTER)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFTCTRL)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_A)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_S)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_D)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_G)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_H)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_J)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_K)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_L)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SEMICOLON)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_APOSTROPHE)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_GRAVE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFTSHIFT)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_BACKSLASH)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_Z)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_X)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_C)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_V)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_B)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_N)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_M)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_COMMA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_DOT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SLASH)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHTSHIFT)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPASTERISK)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFTALT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SPACE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_CAPSLOCK)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F1)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F2)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F3)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F4)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F5)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F6)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F7)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F8)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F9)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F10)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_NUMLOCK)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SCROLLLOCK)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP7)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP8)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP9)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPMINUS)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP4)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP5)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP6)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPPLUS)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP1)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP2)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP3)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KP0)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPDOT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_ZENKAKUHANKAKU)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_102ND)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F11)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F12)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RO)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KATAKANA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HIRAGANA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HENKAN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KATAKANAHIRAGANA)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_MUHENKAN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPJPCOMMA)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPENTER)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHTCTRL)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPSLASH)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SYSRQ)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHTALT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HOME)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_UP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PAGEUP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_END)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_DOWN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PAGEDOWN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_INSERT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_DELETE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_MUTE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_VOLUMEDOWN)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_VOLUMEUP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_POWER)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPEQUAL)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PAUSE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPCOMMA)).unwrap(); + //dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HANGUEL)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HANJA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_YEN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_LEFTMETA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_RIGHTMETA)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_COMPOSE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_STOP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_AGAIN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PROPS)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_UNDO)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_FRONT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_COPY)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_OPEN)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PASTE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_FIND)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_CUT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_HELP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_CALC)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SLEEP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_WWW)).unwrap(); + //dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SCREENLOCK)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_BACK)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_FORWARD)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_EJECTCD)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_NEXTSONG)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PLAYPAUSE)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_PREVIOUSSONG)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_STOPCD)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_REFRESH)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_EDIT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SCROLLUP)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_SCROLLDOWN)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPLEFTPAREN)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_KPRIGHTPAREN)) + .unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F13)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F14)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F15)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F16)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F17)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F18)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F19)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F20)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F21)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F22)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F23)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_F24)).unwrap(); + + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_FN)).unwrap(); + + dev.enable(EventCode::EV_KEY(EV_KEY::KEY_UNKNOWN)).unwrap(); match UInputDevice::create_from_device(&dev) { Ok(device) => { @@ -343,47 +330,47 @@ impl MacrosPlugin { dev.set_version(0x01); // configure allowed events - dev.enable(&EventType::EV_KEY).unwrap(); - dev.enable(&EventType::EV_REL).unwrap(); - dev.enable(&EventType::EV_MSC).unwrap(); + dev.enable(EventType::EV_KEY).unwrap(); + dev.enable(EventType::EV_REL).unwrap(); + dev.enable(EventType::EV_MSC).unwrap(); - dev.enable(&EventCode::EV_MSC(EV_MSC::MSC_SCAN)).unwrap(); - dev.enable(&EventCode::EV_SYN(EV_SYN::SYN_REPORT)).unwrap(); + dev.enable(EventCode::EV_MSC(EV_MSC::MSC_SCAN)).unwrap(); + dev.enable(EventCode::EV_SYN(EV_SYN::SYN_REPORT)).unwrap(); // Enable all supported buttons; this is used to mirror the hardware device // to the virtual mouse, so that the hardware device can be disabled. // Supported events: - dev.enable(&EventCode::EV_REL(EV_REL::REL_X)).unwrap(); - dev.enable(&EventCode::EV_REL(EV_REL::REL_Y)).unwrap(); - dev.enable(&EventCode::EV_REL(EV_REL::REL_Z)).unwrap(); - - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_LEFT)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_MIDDLE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_RIGHT)).unwrap(); - - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_0)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_1)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_2)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_3)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_4)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_5)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_6)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_7)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_8)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_9)).unwrap(); - - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_EXTRA)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_SIDE)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_FORWARD)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_BACK)).unwrap(); - dev.enable(&EventCode::EV_KEY(EV_KEY::BTN_TASK)).unwrap(); - - dev.enable(&EventCode::EV_REL(EV_REL::REL_WHEEL)).unwrap(); - dev.enable(&EventCode::EV_REL(EV_REL::REL_HWHEEL)).unwrap(); - dev.enable(&EventCode::EV_REL(EV_REL::REL_WHEEL_HI_RES)) - .unwrap(); - dev.enable(&EventCode::EV_REL(EV_REL::REL_HWHEEL_HI_RES)) + dev.enable(EventCode::EV_REL(EV_REL::REL_X)).unwrap(); + dev.enable(EventCode::EV_REL(EV_REL::REL_Y)).unwrap(); + dev.enable(EventCode::EV_REL(EV_REL::REL_Z)).unwrap(); + + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_LEFT)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_MIDDLE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_RIGHT)).unwrap(); + + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_0)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_1)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_2)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_3)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_4)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_5)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_6)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_7)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_8)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_9)).unwrap(); + + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_EXTRA)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_SIDE)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_FORWARD)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_BACK)).unwrap(); + dev.enable(EventCode::EV_KEY(EV_KEY::BTN_TASK)).unwrap(); + + dev.enable(EventCode::EV_REL(EV_REL::REL_WHEEL)).unwrap(); + dev.enable(EventCode::EV_REL(EV_REL::REL_HWHEEL)).unwrap(); + dev.enable(EventCode::EV_REL(EV_REL::REL_WHEEL_HI_RES)) + .unwrap(); + dev.enable(EventCode::EV_REL(EV_REL::REL_HWHEEL_HI_RES)) .unwrap(); match UInputDevice::create_from_device(&dev) { diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index eaacaaefe..9c76e8026 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -30,31 +30,31 @@ resolver = "2" [dependencies] lazy_static = "1.4.0" -flume = "0.10.13" -clap = { version = "3.2.12", features = ["derive"] } -clap_complete = "3.2.3" -ctrlc = { version = "3.2.2", features = ["termination"] } +flume = "0.10.14" +clap = { version = "3.2.17", features = ["derive"] } +clap_complete = "3.2.4" +ctrlc = { version = "3.2.3", features = ["termination"] } cfg-if = "1.0.0" colored = "2.0.0" -csscolorparser = "0.6.1" -console = "0.15.0" +csscolorparser = "0.6.2" +console = "0.15.1" log = "0.4.17" -libc = "0.2.126" +libc = "0.2.131" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -serde = { version = "1.0.139", features = ["derive"] } -serde_json = "1.0.82" -tokio = { version = "1.20.0", features = ["full"] } +serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.83" +tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -config = "0.13.1" +config = "0.13.2" uuid = { version = "1.1.2", features = ["serde", "v4"] } toml = "0.5.9" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" comfy-table = "6.0.0" -paste = "1.0.7" +paste = "1.0.8" dbus = "0.9.6" dbus-tokio = "0.7.5" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } @@ -65,4 +65,4 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -tokio = { version = "1.20.0", features = ["test-util"] } +tokio = { version = "1.20.1", features = ["test-util"] } diff --git a/sdk/examples/rust/simple/Cargo.toml b/sdk/examples/rust/simple/Cargo.toml index ca9871891..5493a3e4a 100644 --- a/sdk/examples/rust/simple/Cargo.toml +++ b/sdk/examples/rust/simple/Cargo.toml @@ -25,10 +25,10 @@ edition = "2021" [dependencies] cfg-if = "1.0.0" log = "0.4.17" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" -clap = "3.2.12" +clap = "3.2.17" lazy_static = "1.4.0" i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } rust-embed = "6.4.0" diff --git a/sdk/lib/rust/eruption-rs/Cargo.toml b/sdk/lib/rust/eruption-rs/Cargo.toml index c8c055722..f91bbb6fd 100644 --- a/sdk/lib/rust/eruption-rs/Cargo.toml +++ b/sdk/lib/rust/eruption-rs/Cargo.toml @@ -32,20 +32,20 @@ resolver = "2" [dependencies] cfg-if = "1.0.0" log = "0.4.17" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" -libc = "0.2.126" -nix = "0.24.1" -futures = "0.3.21" +libc = "0.2.131" +nix = "0.25.0" +futures = "0.3.23" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } -flume = "0.10.13" -serde = "1.0.139" +flume = "0.10.14" +serde = "1.0.143" bincode = "2.0.0-rc.1" -prost = "0.10.4" -prost-types = "0.10.1" +prost = "0.11.0" +prost-types = "0.11.1" socket2 = { version = "0.4.4", features = ["all"] } [build-dependencies] -prost-build = "0.10.4" +prost-build = "0.11.1" diff --git a/sdk/lib/rust/liberuption/Cargo.toml b/sdk/lib/rust/liberuption/Cargo.toml index d5837eda8..9a2552af7 100644 --- a/sdk/lib/rust/liberuption/Cargo.toml +++ b/sdk/lib/rust/liberuption/Cargo.toml @@ -36,7 +36,7 @@ crate-type = ["cdylib"] [dependencies] cfg-if = "1.0.0" log = "0.4.17" -thiserror = "1.0.31" +thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" lazy_static = "1.4.0" @@ -49,9 +49,9 @@ icecream = "0.1.0" [dev-dependencies] pretty_assertions = "1.2.1" -thiserror = "1.0.31" +thiserror = "1.0.32" [build-dependencies] cbindgen = "0.24.3" -prost-build = "0.10.4" +prost-build = "0.11.1" From 3b2702af8523f4add356ee5ba1bec794f840b959 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Mon, 15 Aug 2022 20:34:38 +0200 Subject: [PATCH 16/20] Update packaging --- support/pkg/arch/PKGBUILD | 20 +- support/pkg/arch/PKGBUILD-git | 697 ++++++++++++++------------- support/pkg/debian-git/control | 2 +- support/pkg/fedora/eruption-git.spec | 4 +- support/pkg/fedora/eruption.spec | 14 +- 5 files changed, 370 insertions(+), 367 deletions(-) diff --git a/support/pkg/arch/PKGBUILD b/support/pkg/arch/PKGBUILD index cd7a6d9c8..a9d8a1256 100644 --- a/support/pkg/arch/PKGBUILD +++ b/support/pkg/arch/PKGBUILD @@ -3,13 +3,13 @@ pkgname='eruption' _pkgname='eruption' pkgdesc='Realtime RGB LED Driver for Linux' -pkgver='0.1.23' -pkgrel='2' +pkgver='0.2.0' +pkgrel='0' arch=('i686' 'x86_64') url='https://eruption-project.org/' license=('GPL3+') -depends=('libevdev' 'hidapi' 'systemd-libs' 'dbus' 'libpulse' 'lua' 'lua-socket') -makedepends=('git' 'rust' 'pkgconf' 'protobuf' 'xorg-server-devel' 'libxrandr') +depends=('libevdev' 'libusb' 'hidapi' 'systemd-libs' 'dbus' 'libpulse' 'lua' 'lua-socket' 'gtksourceview4') +makedepends=('git' 'rust' 'pkgconf' 'cmake' 'protobuf' 'xorg-server-devel' 'libxrandr' 'gtk3') provides=('eruption') conflicts=('eruption-git' 'eruption-roccat-vulcan-git') replaces=('eruption-roccat-vulcan') @@ -21,7 +21,7 @@ sha512sums=('c4ace48ae9b7fbbc7e85ba47f2c969983594cab09ebc069bc39caa27a4e7833042e build() { cd "$_pkgname-$pkgver" - CARGO_INCREMENTAL=0 cargo build --release + CARGO_INCREMENTAL=0 cargo build --all --release --features=sourceview } package() { @@ -40,7 +40,7 @@ package() { mkdir -p "$pkgdir/usr/share/applications" mkdir -p "$pkgdir/usr/share/icons/hicolor/64x64/apps" - #mkdir -p "$pkgdir/usr/share/eruption-gui/schemas" + mkdir -p "$pkgdir/usr/share/eruption-gui/schemas" mkdir -p "$pkgdir/var/lib/eruption/profiles" @@ -80,11 +80,11 @@ package() { install -m 755 "target/release/eruption-hotplug-helper" "$pkgdir/usr/bin/" install -m 755 "target/release/eruption-audio-proxy" "$pkgdir/usr/bin/" install -m 755 "target/release/eruption-process-monitor" "$pkgdir/usr/bin/" - #install -m 755 "target/release/eruption-gui" "$pkgdir/usr/bin/" + install -m 755 "target/release/eruption-gui" "$pkgdir/usr/bin/" - #install -m 644 "support/assets/eruption-gui/eruption-gui.desktop" "$pkgdir/usr/share/applications/" - #install -m 644 "support/assets/eruption-gui/eruption-gui.png" "$pkgdir/usr/share/icons/hicolor/64x64/apps/" - #install -m 644 "eruption-gui/schemas/gschemas.compiled" "$pkgdir/usr/share/eruption-gui/schemas/" + install -m 644 "support/assets/eruption-gui/eruption-gui.desktop" "$pkgdir/usr/share/applications/" + install -m 644 "support/assets/eruption-gui/eruption-gui.png" "$pkgdir/usr/share/icons/hicolor/64x64/apps/" + install -m 644 "eruption-gui/schemas/gschemas.compiled" "$pkgdir/usr/share/eruption-gui/schemas/" install -m 755 "support/systemd/eruption-suspend.sh" "$pkgdir/usr/lib/systemd/system-sleep/eruption" diff --git a/support/pkg/arch/PKGBUILD-git b/support/pkg/arch/PKGBUILD-git index f576fd7ab..d5b83d0fd 100644 --- a/support/pkg/arch/PKGBUILD-git +++ b/support/pkg/arch/PKGBUILD-git @@ -3,13 +3,13 @@ pkgname='eruption-git' _pkgname='eruption' pkgdesc='Realtime RGB LED Driver for Linux' -pkgver='0.1.23' -pkgrel='4' +pkgver='0.2.0' +pkgrel='0' arch=('i686' 'x86_64') url='https://eruption-project.org/' license=('GPL3+') -depends=('libevdev' 'hidapi' 'systemd-libs' 'dbus' 'libpulse' 'lua' 'lua-socket' 'gtksourceview4') -makedepends=('git' 'rust' 'pkgconf' 'protobuf' 'xorg-server-devel' 'libxrandr' 'gtk3') +depends=('libevdev' 'libusb' 'hidapi' 'systemd-libs' 'dbus' 'libpulse' 'lua' 'lua-socket' 'gtksourceview4') +makedepends=('git' 'rust' 'pkgconf' 'cmake' 'protobuf' 'xorg-server-devel' 'libxrandr' 'gtk3') provides=('eruption') conflicts=('eruption' 'eruption-roccat-vulcan') replaces=('eruption-roccat-vulcan-git') @@ -19,355 +19,356 @@ source=('eruption::git+https://github.com/X3n0m0rph59/eruption.git') sha512sums=('SKIP') pkgver() { - cd "$_pkgname" - git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' +cd "$_pkgname" +git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' } build() { - cd "$_pkgname" +cd "$_pkgname" - CARGO_INCREMENTAL=0 cargo build --all --release --features=sourceview +CARGO_INCREMENTAL=0 cargo build --all --release --features=sourceview } package() { - cd "$_pkgname" - - mkdir -p "$pkgdir/usr/bin" - mkdir -p "$pkgdir/etc/eruption" - mkdir -p "$pkgdir/usr/share/doc/eruption" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/macros" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/themes" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/keymaps" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice" - mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc" - mkdir -p "$pkgdir/usr/share/eruption/scripts/examples" - - mkdir -p "$pkgdir/usr/share/applications" - mkdir -p "$pkgdir/usr/share/icons/hicolor/64x64/apps" - mkdir -p "$pkgdir/usr/share/eruption-gui/schemas" - - mkdir -p "$pkgdir/var/lib/eruption/profiles" - - mkdir -p "$pkgdir/usr/lib/systemd/system" - mkdir -p "$pkgdir/usr/lib/systemd/system-preset" - - mkdir -p "$pkgdir/usr/lib/systemd/user" - mkdir -p "$pkgdir/usr/lib/systemd/user-preset" - - mkdir -p "$pkgdir/usr/lib/systemd/system-sleep" - - mkdir -p "$pkgdir/usr/lib/udev/rules.d/" - - mkdir -p "$pkgdir/usr/share/dbus-1/system.d" - mkdir -p "$pkgdir/usr/share/dbus-1/session.d" - - mkdir -p "$pkgdir/usr/share/polkit-1/actions" - - mkdir -p "$pkgdir/usr/share/man/man8" - mkdir -p "$pkgdir/usr/share/man/man5" - mkdir -p "$pkgdir/usr/share/man/man1" - - mkdir -p "$pkgdir/usr/share/bash-completion/completions" - mkdir -p "$pkgdir/usr/share/fish/completions" - mkdir -p "$pkgdir/usr/share/zsh/site-functions" - mkdir -p "$pkgdir/usr/share/eruption/i18n" - mkdir -p "$pkgdir/usr/share/eruption/sfx" - - install -m 755 "target/release/eruption" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruptionctl" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-hwutil" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-keymap" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-netfx" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-cmd" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-util" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-debug-tool" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-hotplug-helper" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-audio-proxy" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-process-monitor" "$pkgdir/usr/bin/" - install -m 755 "target/release/eruption-gui" "$pkgdir/usr/bin/" - - install -m 644 "support/assets/eruption-gui/eruption-gui.desktop" "$pkgdir/usr/share/applications/" - install -m 644 "support/assets/eruption-gui/eruption-gui.png" "$pkgdir/usr/share/icons/hicolor/64x64/apps/" - install -m 644 "eruption-gui/schemas/gschemas.compiled" "$pkgdir/usr/share/eruption-gui/schemas/" - - install -m 755 "support/systemd/eruption-suspend.sh" "$pkgdir/usr/lib/systemd/system-sleep/eruption" - - install -m 644 "support/config/eruption.conf" "$pkgdir/etc/eruption/" - install -m 644 "support/config/audio-proxy.conf" "$pkgdir/etc/eruption/" - install -m 644 "support/config/process-monitor.conf" "$pkgdir/etc/eruption/" - - install -m 644 "support/systemd/eruption.service" "$pkgdir/usr/lib/systemd/system/" - install -m 644 "support/systemd/eruption.preset" "$pkgdir/usr/lib/systemd/system-preset/50-eruption.preset" - - install -m 644 "support/systemd/eruption-audio-proxy.service" "$pkgdir/usr/lib/systemd/user/" - install -m 644 "support/systemd/eruption-audio-proxy.preset" "$pkgdir/usr/lib/systemd/user-preset/50-eruption-audio-proxy.preset" - - install -m 644 "support/systemd/eruption-process-monitor.service" "$pkgdir/usr/lib/systemd/user/" - install -m 644 "support/systemd/eruption-process-monitor.preset" "$pkgdir/usr/lib/systemd/user-preset/50-eruption-process-monitor.preset" - - install -m 644 "support/systemd/eruption-hotplug-helper.service" "$pkgdir/usr/lib/systemd/system/" - install -m 644 "support/systemd/eruption-hotplug-helper.preset" "$pkgdir/usr/lib/systemd/system-preset/50-eruption-hotplug-helper.preset" - - install -m 644 "support/udev/99-eruption.rules" "$pkgdir/usr/lib/udev/rules.d/" - - install -m 644 "support/dbus/org.eruption.control.conf" "$pkgdir/usr/share/dbus-1/system.d/" - install -m 644 "support/dbus/org.eruption.process_monitor.conf" "$pkgdir/usr/share/dbus-1/session.d/" - - install -m 644 "support/policykit/org.eruption.policy" "$pkgdir/usr/share/polkit-1/actions/" - - install -m 644 "support/man/eruption.8" "$pkgdir/usr/share/man/man8/" - install -m 644 "support/man/eruption-cmd.8" "$pkgdir/usr/share/man/man8/" - install -m 644 "support/man/eruption-hwutil.8" "$pkgdir/usr/share/man/man8/" - install -m 644 "support/man/eruption.conf.5" "$pkgdir/usr/share/man/man5/" - install -m 644 "support/man/process-monitor.conf.5" "$pkgdir/usr/share/man/man5/" - install -m 644 "support/man/eruptionctl.1" "$pkgdir/usr/share/man/man1/" - install -m 644 "support/man/eruption-netfx.1" "$pkgdir/usr/share/man/man1/" - install -m 644 "support/man/eruption-audio-proxy.1" "$pkgdir/usr/share/man/man1/" - install -m 644 "support/man/eruption-process-monitor.1" "$pkgdir/usr/share/man/man1/" - - install -m 644 -T "support/shell/completions/en_US/eruption-cmd.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-cmd" - install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-hwutil" - install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-debug-tool" - install -m 644 -T "support/shell/completions/en_US/eruption-keymap.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-netfx" - install -m 644 -T "support/shell/completions/en_US/eruption-netfx.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-netfx" - install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-audio-proxy" - install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-process-monitor" - install -m 644 -T "support/shell/completions/en_US/eruptionctl.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruptionctl" - - install -m 644 -T "support/shell/completions/en_US/eruption-cmd.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-cmd.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-hwutil.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-debug-tool.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-keymap.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-netfx.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-netfx.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-netfx.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-audio-proxy.fish" - install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-process-monitor.fish" - install -m 644 -T "support/shell/completions/en_US/eruptionctl.fish-completion" "$pkgdir/usr/share/fish/completions/eruptionctl.fish" - - install -m 644 -T "support/shell/completions/en_US/eruption-cmd.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-cmd" - install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-hwutil" - install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-debug-tool" - install -m 644 -T "support/shell/completions/en_US/eruption-keymap.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-netfx" - install -m 644 -T "support/shell/completions/en_US/eruption-netfx.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-netfx" - install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-audio-proxy" - install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-process-monitor" - install -m 644 -T "support/shell/completions/en_US/eruptionctl.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruptionctl" - - install -m 644 "eruption/src/scripts/lib/failsafe.lua" "$pkgdir/usr/share/eruption/scripts/lib" - install -m 644 "eruption/src/scripts/lib/failsafe.lua.manifest" "$pkgdir/usr/share/eruption/scripts/lib" - install -m 644 "eruption/src/scripts/macros.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/macros.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/stats.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/stats.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/afterglow.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/afterglow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/afterhue.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/afterhue.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/animal.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/animal.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz1.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz1.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz2.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz2.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz3.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz3.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz4.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz4.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz5.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/audioviz5.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/organic.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/organic.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/batique.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/batique.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/billow.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/billow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/checkerboard.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/checkerboard.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fbm.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fbm.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/flight-perlin.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/flight-perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fire.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fire.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fireworks.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/fireworks.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/gaming.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/gaming.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/ghost.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/ghost.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/gradient.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/gradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/halo.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/halo.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/heatmap.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/heatmap.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/lava-lamp.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/lava-lamp.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/linear-gradient.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/linear-gradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/heartbeat.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/heartbeat.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/impact.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/impact.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/multigradient.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/multigradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/netfx.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/netfx.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/osn.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/osn.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/perlin.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/phonon.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/phonon.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/psychedelic.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/psychedelic.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/pulse.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/pulse.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/ripple.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/ripple.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/rainbow.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/rainbow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/raindrops.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/raindrops.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/rmf.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/rmf.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/shockwave.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/shockwave.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/solid.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/solid.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/stripes.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/stripes.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/sysmon.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/sysmon.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-perlin.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-simplex.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-simplex.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-turbulence.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-turbulence.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-voronoi.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/swirl-voronoi.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/temperature.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/temperature.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/turbulence.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/turbulence.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/voronoi.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/voronoi.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/water.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/water.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/wave.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/wave.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/snake.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/snake.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/domain-coloring.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/domain-coloring.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/dim-zone.lua" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/dim-zone.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" - install -m 644 "eruption/src/scripts/lib/debug.lua" "$pkgdir/usr/share/eruption/scripts/lib/" - install -m 644 "eruption/src/scripts/lib/easing.lua" "$pkgdir/usr/share/eruption/scripts/lib/" - install -m 644 "eruption/src/scripts/lib/queue.lua" "$pkgdir/usr/share/eruption/scripts/lib/" - install -m 644 "eruption/src/scripts/lib/utilities.lua" "$pkgdir/usr/share/eruption/scripts/lib/" - install -m 644 "eruption/src/scripts/lib/declarations.lua" "$pkgdir/usr/share/eruption/scripts/lib/" - install -m 644 "eruption/src/scripts/lib/themes/default.lua" "$pkgdir/usr/share/eruption/scripts/lib/themes/" - install -m 644 "eruption/src/scripts/lib/themes/gaming.lua" "$pkgdir/usr/share/eruption/scripts/lib/themes/" - install -m 644 "eruption/src/scripts/lib/macros/examples.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" - install -m 644 "eruption/src/scripts/lib/macros/modifiers.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" - install -m 644 "eruption/src/scripts/lib/macros/user-macros.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" - install -m 644 "eruption/src/scripts/lib/macros/failsafe-macros.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" - install -m 644 "eruption/src/scripts/lib/macros/starcraft2.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/generic_keyboard.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_1xx.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_tkl.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_pro_tkl.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_pro.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/corsair_strafe.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/generic_mouse.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_aimo.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kain_100.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kain_2xx.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_xp.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_xtd.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_burst_pro.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_aimo_remastered.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_pure_ultra.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_pro_air.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kova_aimo.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kova_2016.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_nyth.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" - install -m 644 "eruption/src/scripts/lib/hwdevices/misc/roccat_elo_71_air.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc/" - install -m 644 "eruption/src/scripts/lib/hwdevices/misc/roccat_aimo_pad.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc/" - install -m 644 "eruption/src/scripts/examples/simple.lua" "$pkgdir/usr/share/eruption/scripts/examples/" - - install -m 644 "support/sfx/typewriter1.wav" "$pkgdir/usr/share/eruption/sfx/" - install -m 644 "support/sfx/phaser1.wav" "$pkgdir/usr/share/eruption/sfx/" - install -m 644 "support/sfx/phaser2.wav" "$pkgdir/usr/share/eruption/sfx/" - ln -s "phaser1.wav" "$pkgdir/usr/share/eruption/sfx/key-down.wav" - ln -s "phaser2.wav" "$pkgdir/usr/share/eruption/sfx/key-up.wav" - - install -m 644 "support/profiles/animal-blobby.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/animal-blobby-swirl.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/animal-breathing-1.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/animal-breathing-2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/animal-breathing-3.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/audio-visualization-1.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/audio-visualization-2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/audio-visualization-3.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/audio-visualization-4.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/audio-visualization-5.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/domain-coloring-1.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/domain-coloring-2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/domain-coloring-3.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/default.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/fx1.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/fx2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/fireplace.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/fireworks.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/flight-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/gaming.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/gradient-noise.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/heartbeat-sysmon.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/heatmap.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/heatmap-errors.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/lava-lamp.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/lava-lamp-pastel.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/lava-lamp-syscolors.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/matrix.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/netfx.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/batique.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/batique-mouse.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/checkerboard.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/blackout.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/blue-fx-swirl-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/profile1.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/profile2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/profile3.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/profile4.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/psychedelic.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/twinkle.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/red-fx.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/red-wave.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/preset-red-yellow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/preset-blue-red.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/rainbow-wave.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/ripple-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/snake.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/solid-wave.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/solid.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/starcraft2.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/spectrum-analyzer.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/spectrum-analyzer-swirl.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/vu-meter.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-blue-red.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-red-yellow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-dim.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-blue-red-dim.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-rainbow-dim.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-perlin-red-yellow-dim.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-simplex-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-turbulence.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/swirl-voronoi.profile" "$pkgdir/var/lib/eruption/profiles/" - install -m 644 "support/profiles/turbulence.profile" "$pkgdir/var/lib/eruption/profiles/" +cd "$_pkgname" + +mkdir -p "$pkgdir/usr/bin" +mkdir -p "$pkgdir/etc/eruption" +mkdir -p "$pkgdir/usr/share/doc/eruption" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/macros" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/themes" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/keymaps" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice" +mkdir -p "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc" +mkdir -p "$pkgdir/usr/share/eruption/scripts/examples" + +mkdir -p "$pkgdir/usr/share/applications" +mkdir -p "$pkgdir/usr/share/icons/hicolor/64x64/apps" +mkdir -p "$pkgdir/usr/share/eruption-gui/schemas" + +mkdir -p "$pkgdir/var/lib/eruption/profiles" + +mkdir -p "$pkgdir/usr/lib/systemd/system" +mkdir -p "$pkgdir/usr/lib/systemd/system-preset" + +mkdir -p "$pkgdir/usr/lib/systemd/user" +mkdir -p "$pkgdir/usr/lib/systemd/user-preset" + +mkdir -p "$pkgdir/usr/lib/systemd/system-sleep" + +mkdir -p "$pkgdir/usr/lib/udev/rules.d/" + +mkdir -p "$pkgdir/usr/share/dbus-1/system.d" +mkdir -p "$pkgdir/usr/share/dbus-1/session.d" + +mkdir -p "$pkgdir/usr/share/polkit-1/actions" + +mkdir -p "$pkgdir/usr/share/man/man8" +mkdir -p "$pkgdir/usr/share/man/man5" +mkdir -p "$pkgdir/usr/share/man/man1" + +mkdir -p "$pkgdir/usr/share/bash-completion/completions" +mkdir -p "$pkgdir/usr/share/fish/completions" +mkdir -p "$pkgdir/usr/share/zsh/site-functions" +mkdir -p "$pkgdir/usr/share/eruption/i18n" +mkdir -p "$pkgdir/usr/share/eruption/sfx" + +install -m 755 "target/release/eruption" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruptionctl" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-hwutil" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-keymap" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-netfx" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-cmd" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-util" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-debug-tool" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-hotplug-helper" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-audio-proxy" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-process-monitor" "$pkgdir/usr/bin/" +install -m 755 "target/release/eruption-gui" "$pkgdir/usr/bin/" + +install -m 644 "support/assets/eruption-gui/eruption-gui.desktop" "$pkgdir/usr/share/applications/" +install -m 644 "support/assets/eruption-gui/eruption-gui.png" "$pkgdir/usr/share/icons/hicolor/64x64/apps/" +install -m 644 "eruption-gui/schemas/gschemas.compiled" "$pkgdir/usr/share/eruption-gui/schemas/" + +install -m 755 "support/systemd/eruption-suspend.sh" "$pkgdir/usr/lib/systemd/system-sleep/eruption" + +install -m 644 "support/config/eruption.conf" "$pkgdir/etc/eruption/" +install -m 644 "support/config/audio-proxy.conf" "$pkgdir/etc/eruption/" +install -m 644 "support/config/process-monitor.conf" "$pkgdir/etc/eruption/" + +install -m 644 "support/systemd/eruption.service" "$pkgdir/usr/lib/systemd/system/" +install -m 644 "support/systemd/eruption.preset" "$pkgdir/usr/lib/systemd/system-preset/50-eruption.preset" + +install -m 644 "support/systemd/eruption-audio-proxy.service" "$pkgdir/usr/lib/systemd/user/" +install -m 644 "support/systemd/eruption-audio-proxy.preset" "$pkgdir/usr/lib/systemd/user-preset/50-eruption-audio-proxy.preset" + +install -m 644 "support/systemd/eruption-process-monitor.service" "$pkgdir/usr/lib/systemd/user/" +install -m 644 "support/systemd/eruption-process-monitor.preset" "$pkgdir/usr/lib/systemd/user-preset/50-eruption-process-monitor.preset" + +install -m 644 "support/systemd/eruption-hotplug-helper.service" "$pkgdir/usr/lib/systemd/system/" +install -m 644 "support/systemd/eruption-hotplug-helper.preset" "$pkgdir/usr/lib/systemd/system-preset/50-eruption-hotplug-helper.preset" + +install -m 644 "support/udev/99-eruption.rules" "$pkgdir/usr/lib/udev/rules.d/" + +install -m 644 "support/dbus/org.eruption.control.conf" "$pkgdir/usr/share/dbus-1/system.d/" +install -m 644 "support/dbus/org.eruption.process_monitor.conf" "$pkgdir/usr/share/dbus-1/session.d/" + +install -m 644 "support/policykit/org.eruption.policy" "$pkgdir/usr/share/polkit-1/actions/" + +install -m 644 "support/man/eruption.8" "$pkgdir/usr/share/man/man8/" +install -m 644 "support/man/eruption-cmd.8" "$pkgdir/usr/share/man/man8/" +install -m 644 "support/man/eruption-hwutil.8" "$pkgdir/usr/share/man/man8/" +install -m 644 "support/man/eruption.conf.5" "$pkgdir/usr/share/man/man5/" +install -m 644 "support/man/process-monitor.conf.5" "$pkgdir/usr/share/man/man5/" +install -m 644 "support/man/eruptionctl.1" "$pkgdir/usr/share/man/man1/" +install -m 644 "support/man/eruption-keymap.1" "$pkgdir/usr/share/man/man1/" +install -m 644 "support/man/eruption-netfx.1" "$pkgdir/usr/share/man/man1/" +install -m 644 "support/man/eruption-audio-proxy.1" "$pkgdir/usr/share/man/man1/" +install -m 644 "support/man/eruption-process-monitor.1" "$pkgdir/usr/share/man/man1/" + +install -m 644 -T "support/shell/completions/en_US/eruption-cmd.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-cmd" +install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-hwutil" +install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-debug-tool" +install -m 644 -T "support/shell/completions/en_US/eruption-keymap.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-netfx" +install -m 644 -T "support/shell/completions/en_US/eruption-netfx.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-netfx" +install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-audio-proxy" +install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruption-process-monitor" +install -m 644 -T "support/shell/completions/en_US/eruptionctl.bash-completion" "$pkgdir/usr/share/bash-completion/completions/eruptionctl" + +install -m 644 -T "support/shell/completions/en_US/eruption-cmd.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-cmd.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-hwutil.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-debug-tool.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-keymap.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-netfx.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-netfx.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-netfx.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-audio-proxy.fish" +install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.fish-completion" "$pkgdir/usr/share/fish/completions/eruption-process-monitor.fish" +install -m 644 -T "support/shell/completions/en_US/eruptionctl.fish-completion" "$pkgdir/usr/share/fish/completions/eruptionctl.fish" + +install -m 644 -T "support/shell/completions/en_US/eruption-cmd.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-cmd" +install -m 644 -T "support/shell/completions/en_US/eruption-hwutil.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-hwutil" +install -m 644 -T "support/shell/completions/en_US/eruption-debug-tool.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-debug-tool" +install -m 644 -T "support/shell/completions/en_US/eruption-keymap.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-netfx" +install -m 644 -T "support/shell/completions/en_US/eruption-netfx.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-netfx" +install -m 644 -T "support/shell/completions/en_US/eruption-audio-proxy.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-audio-proxy" +install -m 644 -T "support/shell/completions/en_US/eruption-process-monitor.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruption-process-monitor" +install -m 644 -T "support/shell/completions/en_US/eruptionctl.zsh-completion" "$pkgdir/usr/share/zsh/site-functions/_eruptionctl" + +install -m 644 "eruption/src/scripts/lib/failsafe.lua" "$pkgdir/usr/share/eruption/scripts/lib" +install -m 644 "eruption/src/scripts/lib/failsafe.lua.manifest" "$pkgdir/usr/share/eruption/scripts/lib" +install -m 644 "eruption/src/scripts/macros.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/macros.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/stats.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/stats.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/afterglow.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/afterglow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/afterhue.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/afterhue.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/animal.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/animal.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz1.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz1.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz2.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz2.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz3.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz3.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz4.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz4.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz5.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/audioviz5.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/organic.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/organic.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/batique.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/batique.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/billow.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/billow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/checkerboard.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/checkerboard.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fbm.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fbm.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/flight-perlin.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/flight-perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fire.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fire.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fireworks.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/fireworks.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/gaming.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/gaming.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/ghost.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/ghost.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/gradient.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/gradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/halo.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/halo.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/heatmap.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/heatmap.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/lava-lamp.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/lava-lamp.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/linear-gradient.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/linear-gradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/heartbeat.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/heartbeat.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/impact.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/impact.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/multigradient.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/multigradient.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/netfx.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/netfx.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/osn.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/osn.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/perlin.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/phonon.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/phonon.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/psychedelic.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/psychedelic.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/pulse.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/pulse.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/ripple.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/ripple.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/rainbow.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/rainbow.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/raindrops.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/raindrops.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/rmf.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/rmf.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/shockwave.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/shockwave.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/solid.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/solid.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/stripes.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/stripes.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/sysmon.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/sysmon.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-perlin.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-perlin.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-simplex.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-simplex.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-turbulence.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-turbulence.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-voronoi.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/swirl-voronoi.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/temperature.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/temperature.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/turbulence.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/turbulence.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/voronoi.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/voronoi.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/water.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/water.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/wave.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/wave.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/snake.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/snake.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/domain-coloring.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/domain-coloring.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/dim-zone.lua" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/dim-zone.lua.manifest" "$pkgdir/usr/share/eruption/scripts/" +install -m 644 "eruption/src/scripts/lib/debug.lua" "$pkgdir/usr/share/eruption/scripts/lib/" +install -m 644 "eruption/src/scripts/lib/easing.lua" "$pkgdir/usr/share/eruption/scripts/lib/" +install -m 644 "eruption/src/scripts/lib/queue.lua" "$pkgdir/usr/share/eruption/scripts/lib/" +install -m 644 "eruption/src/scripts/lib/utilities.lua" "$pkgdir/usr/share/eruption/scripts/lib/" +install -m 644 "eruption/src/scripts/lib/declarations.lua" "$pkgdir/usr/share/eruption/scripts/lib/" +install -m 644 "eruption/src/scripts/lib/themes/default.lua" "$pkgdir/usr/share/eruption/scripts/lib/themes/" +install -m 644 "eruption/src/scripts/lib/themes/gaming.lua" "$pkgdir/usr/share/eruption/scripts/lib/themes/" +install -m 644 "eruption/src/scripts/lib/macros/examples.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" +install -m 644 "eruption/src/scripts/lib/macros/modifiers.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" +install -m 644 "eruption/src/scripts/lib/macros/user-macros.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" +install -m 644 "eruption/src/scripts/lib/macros/failsafe-macros.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" +install -m 644 "eruption/src/scripts/lib/macros/starcraft2.lua" "$pkgdir/usr/share/eruption/scripts/lib/macros/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/generic_keyboard.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_1xx.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_tkl.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_pro_tkl.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/roccat_vulcan_pro.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/keyboards/corsair_strafe.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/keyboards/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/generic_mouse.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_aimo.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kain_100.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kain_2xx.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_xp.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_xtd.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_burst_pro.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_aimo_remastered.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_pure_ultra.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kone_pro_air.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kova_aimo.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_kova_2016.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/mice/roccat_nyth.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/mice/" +install -m 644 "eruption/src/scripts/lib/hwdevices/misc/roccat_elo_71_air.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc/" +install -m 644 "eruption/src/scripts/lib/hwdevices/misc/roccat_aimo_pad.lua" "$pkgdir/usr/share/eruption/scripts/lib/hwdevices/misc/" +install -m 644 "eruption/src/scripts/examples/simple.lua" "$pkgdir/usr/share/eruption/scripts/examples/" + +install -m 644 "support/sfx/typewriter1.wav" "$pkgdir/usr/share/eruption/sfx/" +install -m 644 "support/sfx/phaser1.wav" "$pkgdir/usr/share/eruption/sfx/" +install -m 644 "support/sfx/phaser2.wav" "$pkgdir/usr/share/eruption/sfx/" +ln -s "phaser1.wav" "$pkgdir/usr/share/eruption/sfx/key-down.wav" +ln -s "phaser2.wav" "$pkgdir/usr/share/eruption/sfx/key-up.wav" + +install -m 644 "support/profiles/animal-blobby.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/animal-blobby-swirl.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/animal-breathing-1.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/animal-breathing-2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/animal-breathing-3.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/audio-visualization-1.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/audio-visualization-2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/audio-visualization-3.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/audio-visualization-4.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/audio-visualization-5.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/domain-coloring-1.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/domain-coloring-2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/domain-coloring-3.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/default.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/fx1.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/fx2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/fireplace.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/fireworks.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/flight-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/gaming.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/gradient-noise.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/heartbeat-sysmon.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/heatmap.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/heatmap-errors.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/lava-lamp.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/lava-lamp-pastel.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/lava-lamp-syscolors.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/matrix.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/netfx.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/batique.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/batique-mouse.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/checkerboard.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/blackout.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/blue-fx-swirl-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/profile1.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/profile2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/profile3.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/profile4.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/psychedelic.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/twinkle.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/red-fx.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/red-wave.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/preset-red-yellow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/preset-blue-red.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/rainbow-wave.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/ripple-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/snake.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/solid-wave.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/solid.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/starcraft2.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/spectrum-analyzer.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/spectrum-analyzer-swirl.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/vu-meter.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-blue-red.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-red-yellow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-dim.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-blue-red-dim.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-rainbow-dim.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-perlin-red-yellow-dim.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-simplex-rainbow.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-turbulence.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/swirl-voronoi.profile" "$pkgdir/var/lib/eruption/profiles/" +install -m 644 "support/profiles/turbulence.profile" "$pkgdir/var/lib/eruption/profiles/" } diff --git a/support/pkg/debian-git/control b/support/pkg/debian-git/control index 5a75ccb3c..70f857113 100644 --- a/support/pkg/debian-git/control +++ b/support/pkg/debian-git/control @@ -15,7 +15,7 @@ Build-Depends: debhelper (>= 11), libpulse-dev (>= 11.1), liblua5.3-dev (>= 5.3), libx11-dev (>= 2:1.6.4), - libxrandr-dev (>= 2:1.5.1), + libxrandr-dev (>= 2:1.5.1), libgtk-3-dev (>= 3.22.30-1ubuntu4), libgdk-pixbuf2.0-dev (>= 2.40.0+dfsg-3ubuntu0.1), libatk1.0-dev (>= 2.35.1-1ubuntu2), diff --git a/support/pkg/fedora/eruption-git.spec b/support/pkg/fedora/eruption-git.spec index 603a31406..81e825266 100644 --- a/support/pkg/fedora/eruption-git.spec +++ b/support/pkg/fedora/eruption-git.spec @@ -5,8 +5,8 @@ %global shortcommit %(c=%{commit}; echo ${c:0:7}) Name: eruption-git -Version: 0.1.23 -Release: 6.%{shortcommit} +Version: 0.2.0 +Release: 0.%{shortcommit} Summary: Eruption - Realtime RGB LED Driver for Linux URL: https://eruption-project.org License: GPLv3+ diff --git a/support/pkg/fedora/eruption.spec b/support/pkg/fedora/eruption.spec index 995c40d63..350740735 100644 --- a/support/pkg/fedora/eruption.spec +++ b/support/pkg/fedora/eruption.spec @@ -2,8 +2,8 @@ %global ShortName eruption Name: eruption -Version: 0.1.23 -Release: 4%{?dist} +Version: 0.2.0 +Release: 0%{?dist} Summary: Eruption - Realtime RGB LED Driver for Linux URL: https://eruption-project.org License: GPLv3+ @@ -13,6 +13,8 @@ Source0: https://github.com/X3n0m0rph59/%{OrigName}/archive/releases/v%{Version} BuildRoot: %{_tmppath}/%{name}-build BuildRequires: cargo +BuildRequires: cmake +BuildRequires: protobuf-devel BuildRequires: systemd-devel BuildRequires: dbus-devel BuildRequires: hidapi-devel @@ -22,15 +24,15 @@ BuildRequires: pulseaudio-libs-devel BuildRequires: lua-devel BuildRequires: libX11-devel BuildRequires: libXrandr-devel -#BuildRequires: gtk3-devel -#BuildRequires: gtksourceview3-devel +BuildRequires: gtk3-devel +BuildRequires: gtksourceview4-devel Requires: systemd Requires: dbus Requires: hidapi Requires: libevdev -Requires: luajit -#Requires: gtksourceview3 +Requires: lua +Requires: gtksourceview4 Recommends: lua-socket-compat From b3540ab909b4109828558c29d310c6ede1fde19c Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Tue, 16 Aug 2022 07:55:15 +0200 Subject: [PATCH 17/20] Bump version number --- CHANGES.md | 24 +++++------ Cargo.lock | 6 +-- README.md | 50 +++++++++++------------ eruption-watchdog/README.md | 2 +- eruption/Cargo.toml | 2 +- eruption/README.md | 2 +- eruption/src/scripts/batique.lua.manifest | 2 +- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e50edaa6a..97efa39a1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,18 +4,18 @@ Table of new and noteworthy changes: | Since | Description | |--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.1.24 | __New Release__ | -| 0.1.24 | Add support for named color-schemes | -| 0.1.24 | Add support for importing `pywal` generated color-schemes via `eruptionctl color-schemes import pywal` | -| 0.1.24 | Add new profile `Lava Lamp (System palette)` that makes use of imported color-schemes | -| 0.1.24 | Modify Lua script `batique.lua` to support imported color-schemes | -| 0.1.24 | Update the project description, add the new website: https://eruption-project.org/ | -| 0.1.24 | Implement support for a systemd-based software watchdog and add a watchdog daemon for development purposes | -| 0.1.24 | Add experimental support for `ROCCAT Kone Pro` series mice | -| 0.1.24 | Add experimental support for `ROCCAT Kone Pro Air` series mice | -| 0.1.24 | Add experimental support for `ROCCAT Kone XP` series mice | -| 0.1.24 | Add experimental support for `ROCCAT Kain 100 AIMO` series mice | -| 0.1.24 | Add new companion utility `eruption-keymap` that allows to define simple and complex macro mappings | +| 0.2.0| __New Release__ | +| 0.2.0| Add support for named color-schemes | +| 0.2.0| Add support for importing `pywal` generated color-schemes via `eruptionctl color-schemes import pywal` | +| 0.2.0| Add new profile `Lava Lamp (System palette)` that makes use of imported color-schemes | +| 0.2.0| Modify Lua script `batique.lua` to support imported color-schemes | +| 0.2.0| Update the project description, add the new website: https://eruption-project.org/ | +| 0.2.0| Implement support for a systemd-based software watchdog and add a watchdog daemon for development purposes | +| 0.2.0| Add experimental support for `ROCCAT Kone Pro` series mice | +| 0.2.0| Add experimental support for `ROCCAT Kone Pro Air` series mice | +| 0.2.0| Add experimental support for `ROCCAT Kone XP` series mice | +| 0.2.0| Add experimental support for `ROCCAT Kain 100 AIMO` series mice | +| 0.2.0| Add new companion utility `eruption-keymap` that allows to define simple and complex macro mappings | | 0.1.23 | __New Release__ | | 0.1.23 | Implement emergency exit of Eruption using Easy Shift+ + BACKSPACE key | | 0.1.23 | Implement full support for Wayland based graphics stacks (Add support for `NetworkFX Ambient Effect`) | diff --git a/Cargo.lock b/Cargo.lock index cac6ca93c..8a8fc33ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -883,7 +883,7 @@ dependencies = [ [[package]] name = "eruption" -version = "0.1.24" +version = "0.2.0" dependencies = [ "async-trait", "bincode", @@ -2163,9 +2163,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf7d67cf4a22adc5be66e75ebdf769b3f2ea032041437a7061f97a63dad4b" +checksum = "ef5528d9c2817db4e10cc78f8d4c8228906e5854f389ff6b076cee3572a09d35" dependencies = [ "android_system_properties", "core-foundation-sys", diff --git a/README.md b/README.md index b4cd5687d..bc8b7db4a 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ # Table of Contents - [Table of Contents](#table-of-contents) - - [Eruption](#eruption) + - [Eruption - Realtime RGB LED Software for Linux](#eruption---realtime-rgb-led-software-for-linux) - [Gallery](#gallery) - - [Supported Devices](#supported-devices) - - [Keyboard Devices](#keyboard-devices) - - [Mouse Devices](#mouse-devices) + - [Device Compatibility](#device-compatibility) + - [Keyboards](#keyboards) + - [Mice](#mice) - [Miscellaneous Devices](#miscellaneous-devices) - [Important Information](#important-information) - [Design Overview](#design-overview) @@ -50,33 +50,33 @@ A Linux user-mode input and RGB LED driver for keyboards, mice and other devices ### Keyboards -- ROCCAT Vulcan 100/12x series keyboard (fully supported, stable) -- ROCCAT Vulcan Pro TKL series keyboard (98% supported as of version `0.1.19`, testing) -- ROCCAT Vulcan TKL series keyboard (work-in-progress, as of version `0.1.20`, experimental, untested) -- ROCCAT Vulcan Pro series keyboard (work-in-progress, as of version `0.1.20`, experimental, untested) -- ROCCAT Magma series keyboard (work-in-progress, as of version `0.1.23`, experimental) -- Corsair Strafe Gaming Keyboard (non-RGB/monochrome only, as of version `0.1.20`, experimental) +- [x] ROCCAT Vulcan 100/12x series keyboard (fully supported, stable) +- [x] ROCCAT Vulcan Pro TKL series keyboard (98% supported as of version `0.1.19`, testing) +- [ ] ROCCAT Vulcan TKL series keyboard (work-in-progress, as of version `0.1.20`, experimental, untested) +- [ ] ROCCAT Vulcan Pro series keyboard (work-in-progress, as of version `0.1.20`, experimental, untested) +- [ ] ROCCAT Magma series keyboard (work-in-progress, as of version `0.1.23`, experimental) +- [ ] Corsair Strafe Gaming Keyboard (non-RGB/monochrome only, as of version `0.1.20`, experimental) ### Mice -- ROCCAT Kone Pure Ultra (stable) -- ROCCAT Burst Pro (as of version `0.1.20`, testing) -- ROCCAT Kain 100 AIMO (as of version `0.1.24`, experimental) -- ROCCAT Kain 2xx AIMO (as of version `0.1.23`, testing) -- ROCCAT Kone XP (work-in-progress, as of version `0.1.24`, experimental) -- ROCCAT Kone Pro (work-in-progress, as of version `0.1.24`, experimental) -- ROCCAT Kone Pro Air (work-in-progress, as of version `0.1.24`, experimental) -- ROCCAT Kone Aimo (experimental) -- ROCCAT Kone Aimo Remastered (experimental) -- ROCCAT Kova AIMO (testing) -- ROCCAT Kova 2016 (as of version `0.1.23`, testing) -- ROCCAT Kone XTD (as of version `0.1.20`, experimental) +- [x] ROCCAT Kone Pure Ultra (stable) +- [x] ROCCAT Burst Pro (as of version `0.1.20`, testing) +- [ ] ROCCAT Kain 100 AIMO (as of version `0.2.0`, experimental) +- [x] ROCCAT Kain 2xx AIMO (as of version `0.1.23`, testing) +- [ ] ROCCAT Kone XP (work-in-progress, as of version `0.2.0`, experimental) +- [ ] ROCCAT Kone Pro (work-in-progress, as of version `0.2.0`, experimental) +- [ ] ROCCAT Kone Pro Air (work-in-progress, as of version `0.2.0`, experimental) +- [ ] ROCCAT Kone Aimo (experimental) +- [ ] ROCCAT Kone Aimo Remastered (experimental) +- [ ] ROCCAT Kova AIMO (testing) +- [ ] ROCCAT Kova 2016 (as of version `0.1.23`, testing) +- [ ] ROCCAT Kone XTD (as of version `0.1.20`, experimental) ### Miscellaneous Devices -- ROCCAT/Turtle Beach Elo 7.1 Air Wireless Headset (work-in-progress, as of version `0.1.23`, testing) -- ROCCAT Sense AIMO XXL (as of version `0.1.23`, stable) -- Adalight/Custom serial LEDs (testing) +- [x] ROCCAT/Turtle Beach Elo 7.1 Air Wireless Headset (work-in-progress, as of version `0.1.23`, testing) +- [x] ROCCAT Sense AIMO XXL (as of version `0.1.23`, stable) +- [x] Adalight/Custom serial LEDs (testing) Please see [DEVICES.md](DEVICES.md) for further information diff --git a/eruption-watchdog/README.md b/eruption-watchdog/README.md index 4e5f39ab9..7cd7de638 100644 --- a/eruption-watchdog/README.md +++ b/eruption-watchdog/README.md @@ -5,7 +5,7 @@ in case it should hang. The watchdog daemon may be especially useful during the with unstable drivers. > NOTE: -> Since version `0.1.24`, Eruption supports using systemd as a software watchdog. +> Since version `0.2.0`, Eruption supports using systemd as a software watchdog. > Running the `eruption-watchdog` daemon is therefore not necessary when the `eruption` process is managed through > systemd! diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index fdcceafdb..770992811 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -18,7 +18,7 @@ [package] name = "eruption" -version = "0.1.24" +version = "0.2.0" authors = ["X3n0m0rph59 "] edition = "2021" description = "Realtime RGB LED Driver for Linux" diff --git a/eruption/README.md b/eruption/README.md index 5a710ef62..24a4e8d65 100644 --- a/eruption/README.md +++ b/eruption/README.md @@ -20,7 +20,7 @@ Realtime RGB LED Driver for Linux You should have received a copy of the GNU General Public License along with Eruption. If not, see . -Eruption 0.1.24 () (release build) +Eruption 0.2.0 () (release build) X3n0m0rph59 diff --git a/eruption/src/scripts/batique.lua.manifest b/eruption/src/scripts/batique.lua.manifest index 4b36d1e7d..c980e355e 100644 --- a/eruption/src/scripts/batique.lua.manifest +++ b/eruption/src/scripts/batique.lua.manifest @@ -20,7 +20,7 @@ name = "Batique" description = "Compute Super Simplex Noise, mapped to a color-scheme" version = "0.1.1" author = "The Eruption Development Team" -min_supported_version = "0.1.24" +min_supported_version = "0.2.0" tags = ['Background', 'Vendor', 'Noise'] [[config]] From 84e4fe17ac89ef0885d4fdf4c4fb430a80a64ac0 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Wed, 17 Aug 2022 09:03:44 +0200 Subject: [PATCH 18/20] Update dependencies --- Cargo.lock | 20 +++++++++---------- eruption-audio-proxy/Cargo.toml | 2 +- eruption-cmd/Cargo.toml | 2 +- eruption-debug-tool/Cargo.toml | 2 +- eruption-gui/Cargo.toml | 2 +- eruption-hotplug-helper/Cargo.toml | 2 +- eruption-hwutil/Cargo.toml | 2 +- eruption-keymap/Cargo.toml | 2 +- eruption-netfx/Cargo.toml | 2 +- eruption-process-monitor/Cargo.toml | 2 +- .../src/procmon-sys/Cargo.toml | 2 +- eruption-util/Cargo.toml | 2 +- eruption-watchdog/Cargo.toml | 2 +- eruption/Cargo.toml | 2 +- eruptionctl/Cargo.toml | 2 +- sdk/lib/rust/eruption-rs/Cargo.toml | 2 +- 16 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a8fc33ae..15a533ef7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8" +checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" [[package]] name = "approx" @@ -265,9 +265,9 @@ checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "bytemuck" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f8cb64b4147a528e1e9e77583739e683541973295b35f3bd7e78d42c5971fd" +checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" [[package]] name = "byteorder" @@ -2398,15 +2398,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lebe" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.131" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c3b4822ccebfa39c02fc03d1534441b22ead323fa0f48bb7ddd8e6ba076a40" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "libdbus-sys" @@ -3040,9 +3040,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "opaque-debug" diff --git a/eruption-audio-proxy/Cargo.toml b/eruption-audio-proxy/Cargo.toml index bc055e857..c30020ff6 100644 --- a/eruption-audio-proxy/Cargo.toml +++ b/eruption-audio-proxy/Cargo.toml @@ -38,7 +38,7 @@ flume = "0.10.14" log = "0.4.17" syslog = "6.0.1" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } diff --git a/eruption-cmd/Cargo.toml b/eruption-cmd/Cargo.toml index d662ceb10..20608e432 100644 --- a/eruption-cmd/Cargo.toml +++ b/eruption-cmd/Cargo.toml @@ -36,7 +36,7 @@ ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } diff --git a/eruption-debug-tool/Cargo.toml b/eruption-debug-tool/Cargo.toml index e7960d74b..b363d382a 100644 --- a/eruption-debug-tool/Cargo.toml +++ b/eruption-debug-tool/Cargo.toml @@ -38,7 +38,7 @@ colored = "2.0.0" ctrlc = { version = "3.2.3", features = ["termination"] } log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.143", features = ["derive"] } diff --git a/eruption-gui/Cargo.toml b/eruption-gui/Cargo.toml index a2d52dea4..3cfa4649e 100644 --- a/eruption-gui/Cargo.toml +++ b/eruption-gui/Cargo.toml @@ -37,7 +37,7 @@ cfg-if = "1.0.0" colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" rayon = "1.5.3" walkdir = "2.3.2" diff --git a/eruption-hotplug-helper/Cargo.toml b/eruption-hotplug-helper/Cargo.toml index cffcb31af..f0923a440 100644 --- a/eruption-hotplug-helper/Cargo.toml +++ b/eruption-hotplug-helper/Cargo.toml @@ -36,7 +36,7 @@ log = "0.4.17" syslog = "6.0.1" lazy_static = "1.4.0" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" diff --git a/eruption-hwutil/Cargo.toml b/eruption-hwutil/Cargo.toml index f286937c8..aaa2cc895 100644 --- a/eruption-hwutil/Cargo.toml +++ b/eruption-hwutil/Cargo.toml @@ -39,7 +39,7 @@ colored = "2.0.0" console = "0.15.1" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.143", features = ["derive"] } diff --git a/eruption-keymap/Cargo.toml b/eruption-keymap/Cargo.toml index 16041b241..9f1bb631e 100644 --- a/eruption-keymap/Cargo.toml +++ b/eruption-keymap/Cargo.toml @@ -37,7 +37,7 @@ colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" comfy-table = "6.0.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } diff --git a/eruption-netfx/Cargo.toml b/eruption-netfx/Cargo.toml index ed1b57f56..40a2b8ea4 100644 --- a/eruption-netfx/Cargo.toml +++ b/eruption-netfx/Cargo.toml @@ -46,7 +46,7 @@ pretty_env_logger = "0.4.0" lazy_static = "1.4.0" thread_local = "1.1.4" dyn-clonable = "0.9.0" -libc = "0.2.131" +libc = "0.2.132" memmap2 = "0.5.7" nix = "0.25.0" tempfile = "3.3.0" diff --git a/eruption-process-monitor/Cargo.toml b/eruption-process-monitor/Cargo.toml index 887ea41c2..9a9899f16 100644 --- a/eruption-process-monitor/Cargo.toml +++ b/eruption-process-monitor/Cargo.toml @@ -53,7 +53,7 @@ dyn-clonable = "0.9.0" indexmap = "1.9.1" log = "0.4.17" syslog = "6.0.1" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" pretty_env_logger = "0.4.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } diff --git a/eruption-process-monitor/src/procmon-sys/Cargo.toml b/eruption-process-monitor/src/procmon-sys/Cargo.toml index 99e4e30b6..230c22163 100644 --- a/eruption-process-monitor/src/procmon-sys/Cargo.toml +++ b/eruption-process-monitor/src/procmon-sys/Cargo.toml @@ -9,7 +9,7 @@ license = "GPLv3+" [lib] [dependencies] -libc = "0.2.131" +libc = "0.2.132" [build-dependencies] cc = "1.0.73" diff --git a/eruption-util/Cargo.toml b/eruption-util/Cargo.toml index ed15d8ac4..95c6e82dc 100644 --- a/eruption-util/Cargo.toml +++ b/eruption-util/Cargo.toml @@ -36,7 +36,7 @@ ctrlc = { version = "3.2.3", features = ["termination"] } colored = "2.0.0" log = "0.4.17" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } diff --git a/eruption-watchdog/Cargo.toml b/eruption-watchdog/Cargo.toml index 6d155da28..02a8e6db9 100644 --- a/eruption-watchdog/Cargo.toml +++ b/eruption-watchdog/Cargo.toml @@ -38,7 +38,7 @@ log = "0.4.17" syslog = "6.0.1" lazy_static = "1.4.0" pretty_env_logger = "0.4.0" -libc = "0.2.131" +libc = "0.2.132" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } tokio = { version = "1.20.1", features = ["full"] } #tracing = "0.1.26" diff --git a/eruption/Cargo.toml b/eruption/Cargo.toml index 770992811..dbc9eda05 100644 --- a/eruption/Cargo.toml +++ b/eruption/Cargo.toml @@ -45,7 +45,7 @@ async-trait = "0.1.57" #tracing = "0.1.26" #tracing-futures = "0.2.5" #tracing-subscriber = "0.2.20" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" systemd = "0.10.0" log = "0.4.17" diff --git a/eruptionctl/Cargo.toml b/eruptionctl/Cargo.toml index 9c76e8026..0562e263e 100644 --- a/eruptionctl/Cargo.toml +++ b/eruptionctl/Cargo.toml @@ -39,7 +39,7 @@ colored = "2.0.0" csscolorparser = "0.6.2" console = "0.15.1" log = "0.4.17" -libc = "0.2.131" +libc = "0.2.132" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } serde = { version = "1.0.143", features = ["derive"] } serde_json = "1.0.83" diff --git a/sdk/lib/rust/eruption-rs/Cargo.toml b/sdk/lib/rust/eruption-rs/Cargo.toml index f91bbb6fd..0f2d40819 100644 --- a/sdk/lib/rust/eruption-rs/Cargo.toml +++ b/sdk/lib/rust/eruption-rs/Cargo.toml @@ -35,7 +35,7 @@ log = "0.4.17" thiserror = "1.0.32" eyre = "0.6.8" color-eyre = "0.6.2" -libc = "0.2.131" +libc = "0.2.132" nix = "0.25.0" futures = "0.3.23" parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } From ab949ef30b56d083d8916f972203ba3b05ad52c3 Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Wed, 17 Aug 2022 09:11:26 +0200 Subject: [PATCH 19/20] Update CHANGES.md --- CHANGES.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 97efa39a1..ac3da500d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,18 +4,19 @@ Table of new and noteworthy changes: | Since | Description | |--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.2.0| __New Release__ | -| 0.2.0| Add support for named color-schemes | -| 0.2.0| Add support for importing `pywal` generated color-schemes via `eruptionctl color-schemes import pywal` | -| 0.2.0| Add new profile `Lava Lamp (System palette)` that makes use of imported color-schemes | -| 0.2.0| Modify Lua script `batique.lua` to support imported color-schemes | -| 0.2.0| Update the project description, add the new website: https://eruption-project.org/ | -| 0.2.0| Implement support for a systemd-based software watchdog and add a watchdog daemon for development purposes | -| 0.2.0| Add experimental support for `ROCCAT Kone Pro` series mice | -| 0.2.0| Add experimental support for `ROCCAT Kone Pro Air` series mice | -| 0.2.0| Add experimental support for `ROCCAT Kone XP` series mice | -| 0.2.0| Add experimental support for `ROCCAT Kain 100 AIMO` series mice | -| 0.2.0| Add new companion utility `eruption-keymap` that allows to define simple and complex macro mappings | +| 0.2.0 | __New Release__ | +| 0.2.0 | Add support for named color-schemes | +| 0.2.0 | Add support for importing `pywal` generated color-schemes via `eruptionctl color-schemes import pywal` | +| 0.2.0 | Add new profile `Lava Lamp (System palette)` that makes use of imported color-schemes | +| 0.2.0 | Modify Lua script `batique.lua` to support imported color-schemes | +| 0.2.0 | Update the project description, add the new website: https://eruption-project.org/ | +| 0.2.0 | Implement support for a systemd-based software watchdog and add a watchdog daemon for development purposes | +| 0.2.0 | Add experimental support for `ROCCAT Kone Pro` series mice | +| 0.2.0 | Add experimental support for `ROCCAT Kone Pro Air` series mice | +| 0.2.0 | Add experimental support for `ROCCAT Kone XP` series mice | +| 0.2.0 | Add experimental support for `ROCCAT Kain 100 AIMO` series mice | +| 0.2.0 | Add new companion utility `eruption-keymap` that allows to define simple and complex macro mappings | +| 0.2.0 | Update all dependencies to their latest revisions | | 0.1.23 | __New Release__ | | 0.1.23 | Implement emergency exit of Eruption using Easy Shift+ + BACKSPACE key | | 0.1.23 | Implement full support for Wayland based graphics stacks (Add support for `NetworkFX Ambient Effect`) | From a17db778acc55efc396691236a0a1cf8d18947cf Mon Sep 17 00:00:00 2001 From: X3n0m0rph59 Date: Wed, 17 Aug 2022 09:11:59 +0200 Subject: [PATCH 20/20] Update packaging --- support/pkg/fedora/eruption-git.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/pkg/fedora/eruption-git.spec b/support/pkg/fedora/eruption-git.spec index 81e825266..663dde105 100644 --- a/support/pkg/fedora/eruption-git.spec +++ b/support/pkg/fedora/eruption-git.spec @@ -1,7 +1,7 @@ %global OrigName eruption %global ShortName eruption -%global commit d1a93b4e7ac6b68f8ada6fca384d78ce9154ee08 +%global commit 84e4fe17ac89ef0885d4fdf4c4fb430a80a64ac0 %global shortcommit %(c=%{commit}; echo ${c:0:7}) Name: eruption-git