diff --git a/Cargo.lock b/Cargo.lock index e4366904..bc8becc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,9 +8,9 @@ checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] @@ -26,9 +26,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" +checksum = "595d3cfa7a60d4555cb5067b99f07142a08ea778de5cf993f7b75c7d8fabc486" [[package]] name = "approx" @@ -41,28 +41,28 @@ dependencies = [ [[package]] name = "async-io" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" dependencies = [ "concurrent-queue", - "fastrand", "futures-lite", "libc", "log", - "nb-connect", "once_cell", "parking", "polling", - "vec-arena", + "slab", + "socket2", "waker-fn", "winapi", ] [[package]] name = "atk" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" dependencies = [ "atk-sys", "bitflags", @@ -72,8 +72,9 @@ dependencies = [ [[package]] name = "atk-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea" dependencies = [ "glib-sys", "gobject-sys", @@ -124,8 +125,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cairo-rs" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a408c13bbc04c3337b94194c1a4d04067097439b79dbc1dcbceba299d828b9ea" dependencies = [ "bitflags", "cairo-sys-rs", @@ -136,8 +138,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c9c3928781e8a017ece15eace05230f04b647457d170d2d9641c94a444ff80" dependencies = [ "glib-sys", "libc", @@ -152,15 +155,15 @@ checksum = "f18c6a921baae2d947e4cf96f6ef1b5774b3056ae8edbdf5c5cfce4f33260921" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" [[package]] name = "cfg-expr" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30aa9e2ffbb838c6b451db14f3cd8e63ed622bf859f9956bc93845a10fafc26a" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" dependencies = [ "smallvec", ] @@ -257,9 +260,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ "atty", "humantime", @@ -270,9 +273,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" dependencies = [ "instant", ] @@ -289,9 +292,9 @@ dependencies = [ [[package]] name = "field-offset" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf539fba70056b50f40a22e0da30639518a12ee18c35807858a63b158cb6dde7" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" dependencies = [ "memoffset", "rustc_version", @@ -352,9 +355,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" dependencies = [ "futures-channel", "futures-core", @@ -367,9 +370,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" dependencies = [ "futures-core", "futures-sink", @@ -377,15 +380,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" [[package]] name = "futures-executor" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c" dependencies = [ "futures-core", "futures-task", @@ -394,15 +397,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" [[package]] name = "futures-lite" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4481d0cd0de1d204a4fa55e7d45f07b1d958abcb06714b3446438e2eff695fb" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" dependencies = [ "fastrand", "futures-core", @@ -415,10 +418,11 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57" dependencies = [ + "autocfg", "proc-macro-hack", "proc-macro2", "quote", @@ -427,15 +431,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" [[package]] name = "futures-timer" @@ -445,10 +449,11 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" dependencies = [ + "autocfg", "futures-channel", "futures-core", "futures-io", @@ -465,8 +470,9 @@ dependencies = [ [[package]] name = "gdk" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "679e22651cd15888e7acd01767950edca2ee9fcd6421fbf5b3c3b420d4e88bb0" dependencies = [ "bitflags", "cairo-rs", @@ -480,8 +486,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -491,8 +498,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590" dependencies = [ "gio-sys", "glib-sys", @@ -503,8 +511,9 @@ dependencies = [ [[package]] name = "gdk-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -530,9 +539,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -541,8 +550,9 @@ dependencies = [ [[package]] name = "gio" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86c6823b39d46d22cac2466de261f28d7f049ebc18f7b35296a42c7ed8a88325" dependencies = [ "bitflags", "futures-channel", @@ -557,8 +567,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" dependencies = [ "glib-sys", "gobject-sys", @@ -569,8 +580,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbecad7a3a898ee749d491ce2ae0decb0bce9e736f9747bc49159b1cea5d37f4" dependencies = [ "bitflags", "futures-channel", @@ -587,12 +599,13 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" dependencies = [ "anyhow", "heck", - "proc-macro-crate", + "proc-macro-crate 1.0.0", "proc-macro-error", "proc-macro2", "quote", @@ -601,8 +614,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" dependencies = [ "libc", "system-deps", @@ -610,8 +624,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" dependencies = [ "glib-sys", "libc", @@ -620,13 +635,13 @@ dependencies = [ [[package]] name = "gtk" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ae864e5eab8bc8b6b8544ed259eb02dd61b25323b20e777a77aa289c05fd0c" dependencies = [ "atk", "bitflags", "cairo-rs", - "cc", "field-offset", "futures-channel", "gdk", @@ -643,8 +658,9 @@ dependencies = [ [[package]] name = "gtk-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -660,12 +676,13 @@ dependencies = [ [[package]] name = "gtk3-macros" -version = "0.1.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" dependencies = [ "anyhow", "heck", - "proc-macro-crate", + "proc-macro-crate 1.0.0", "proc-macro-error", "proc-macro2", "quote", @@ -674,27 +691,27 @@ dependencies = [ [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hidapi" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c352a18370f7e7e47bcbfcbdc5432b8c80c705b5d751a25232c659fcf5c775" +checksum = "81e07da7e8614133e88b3a93b7352eb3729e3ccd82d5ab661adf23bef1761bf8" dependencies = [ "cc", "libc", @@ -723,9 +740,9 @@ dependencies = [ [[package]] name = "i18n-embed" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76146ceb86e5b4128a7d4f8716508841b6156bb231bf138f45235fe985aa79e0" +checksum = "3794c3d7fea43e076281c9213cfaaa7a53c3f18b1613f12514b9f575a2908457" dependencies = [ "fluent", "fluent-langneg", @@ -778,9 +795,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] @@ -807,9 +824,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" dependencies = [ "either", ] @@ -828,9 +845,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" +checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765" [[package]] name = "locale_config" @@ -874,24 +891,24 @@ dependencies = [ [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memoffset" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" dependencies = [ "autocfg", ] [[package]] name = "nb-connect" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19900e7eee95eb2b3c2e26d12a874cc80aaf750e31be6fcbe743ead369fa45d" +checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" dependencies = [ "libc", "socket2", @@ -960,15 +977,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "ordered-float" -version = "2.1.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "766f840da25490628d8e63e529cd21c014f6600c6b8517add12a6fa6167a6218" +checksum = "039f02eb0f69271f26abe3202189275d7aa2258b903cb0281b5de710a2570ff3" dependencies = [ "num-traits", "serde", @@ -976,9 +993,9 @@ dependencies = [ [[package]] name = "ouroboros" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8234affc3c31a8b744cc236fd3dc7443f57c6370cbb7d61f41f9c7dcc6c2530" +checksum = "fbeff60e3e37407a80ead3e9458145b456e978c4068cddbfea6afb48572962ca" dependencies = [ "ouroboros_macro", "stable_deref_trait", @@ -986,9 +1003,9 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.9.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3633332cd8c0b6a865e2e0e705fad9cde25fe458cd0c693629b58a7b15e4d852" +checksum = "03f2cb802b5bdfdf52f1ffa0b54ce105e4d346e91990dd571f86c91321ad49e2" dependencies = [ "Inflector", "proc-macro-error", @@ -1023,8 +1040,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "415823a4fb9f1789785cd6e2d2413816f2ecff92380382969aaca9c400e13a19" dependencies = [ "bitflags", "glib", @@ -1035,8 +1053,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe" dependencies = [ "glib-sys", "gobject-sys", @@ -1046,8 +1065,9 @@ dependencies = [ [[package]] name = "pangocairo" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03ac1e8d456f8f436168aeac41201f0bf49d1dc6c8d01bfb04de2cca25df631" dependencies = [ "bitflags", "cairo-rs", @@ -1059,8 +1079,9 @@ dependencies = [ [[package]] name = "pangocairo-sys" -version = "0.13.0" -source = "git+https://github.com/pop-os/gtk-rs#0a0e50a2f5ea8f816c005bd8c3d145a5a9581d8c" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b9b679ad5c8503e3e533ce06e1619d033274b246e977a6fa1655a6c6ef2b51" dependencies = [ "cairo-sys-rs", "glib-sys", @@ -1149,9 +1170,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -1167,14 +1188,14 @@ checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" [[package]] name = "polling" -version = "2.0.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc12d774e799ee9ebae13f4076ca003b40d18a11ac0f3641e6f899618580b7b" +checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" dependencies = [ "cfg-if 1.0.0", "libc", "log", - "wepoll-sys", + "wepoll-ffi", "winapi", ] @@ -1193,6 +1214,16 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-crate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" +dependencies = [ + "thiserror", + "toml", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1231,9 +1262,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" dependencies = [ "unicode-xid", ] @@ -1300,18 +1331,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.4.5" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", @@ -1320,9 +1351,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.23" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rust-embed" @@ -1419,18 +1450,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" dependencies = [ "proc-macro2", "quote", @@ -1439,9 +1470,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" dependencies = [ "itoa", "ryu", @@ -1450,9 +1481,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76" +checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" dependencies = [ "proc-macro2", "quote", @@ -1461,15 +1492,15 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27" +checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" [[package]] name = "slab" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" @@ -1479,9 +1510,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" dependencies = [ "libc", "winapi", @@ -1493,6 +1524,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.8.0" @@ -1507,15 +1544,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strum" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" [[package]] name = "strum_macros" -version = "0.20.1" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" dependencies = [ "heck", "proc-macro2", @@ -1525,9 +1562,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.69" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" +checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" dependencies = [ "proc-macro2", "quote", @@ -1536,9 +1573,9 @@ dependencies = [ [[package]] name = "system-deps" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c248107ad7bc1ac07066a4d003cae9e9a7bc2e27d3418f7a9cdcdc8699dbea70" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" dependencies = [ "anyhow", "cfg-expr", @@ -1583,6 +1620,7 @@ dependencies = [ name = "system76-keyboard-configurator-backend" version = "0.1.0" dependencies = [ + "cascade", "futures", "futures-timer", "glib", @@ -1594,6 +1632,7 @@ dependencies = [ "once_cell", "ordered-float", "palette", + "regex", "rust-embed", "serde", "serde_json", @@ -1658,18 +1697,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" dependencies = [ "proc-macro2", "quote", @@ -1731,9 +1770,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" @@ -1743,9 +1782,9 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "uuid" @@ -1753,15 +1792,9 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] -[[package]] -name = "vec-arena" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b2f665b594b07095e3ac3f718e13c2197143416fae4c5706cffb7b1af8d7f1" - [[package]] name = "vec_map" version = "0.8.2" @@ -1816,10 +1849,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] -name = "wepoll-sys" -version = "3.0.1" +name = "wepoll-ffi" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" dependencies = [ "cc", ] @@ -1893,7 +1926,7 @@ version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 0.1.5", "proc-macro2", "quote", "syn", @@ -1901,23 +1934,24 @@ dependencies = [ [[package]] name = "zvariant" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678e7262502a135f49b1ece65010526649be7ee68acb80e1fc5377fc71fef878" +checksum = "fa4b785b8b32b0f8433b4474e6bb4ea77b37c1960e84d7598e01dd199b2b23ef" dependencies = [ "byteorder", "enumflags2", "serde", + "static_assertions", "zvariant_derive", ] [[package]] name = "zvariant_derive" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d7c34325a35020b94343389cc9391e0f8ac245cca9155429c4022d93141241" +checksum = "b42af4ee88fb928781391216c34be77ec7cdb3546042b2947ce38d86aa5f37dd" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.0.0", "proc-macro2", "quote", "syn", diff --git a/Cargo.toml b/Cargo.toml index 22a0e5e5..4515c4b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,16 +10,16 @@ members = [ "tools", "ffi", "backend", "widgets" ] [dependencies] cascade = "1" -cairo-rs = { git = "https://github.com/pop-os/gtk-rs" } +cairo-rs = "0.14.0" futures = "0.3.13" -gdk = { git = "https://github.com/pop-os/gtk-rs" } -gio = { git = "https://github.com/pop-os/gtk-rs" } -glib = { git = "https://github.com/pop-os/gtk-rs" } -gtk = { git = "https://github.com/pop-os/gtk-rs", features = ["v3_22"] } +gdk = "0.14.0" +gio = "0.14.0" +glib = "0.14.0" +gtk = { version = "0.14.0", features = ["v3_22"] } libc = "0.2" once_cell = "1.4" -pango = { git = "https://github.com/pop-os/gtk-rs" } -pangocairo = { git = "https://github.com/pop-os/gtk-rs" } +pango = "0.14.0" +pangocairo = "0.14.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = "0.4.0" @@ -33,7 +33,7 @@ i18n-embed-fl = "0.5.0" rust-embed = { version = "5.9.0", features = ["debug-embed"] } [build-dependencies] -gio = { git = "https://github.com/pop-os/gtk-rs" } +gio = "0.14.0" [target.'cfg(target_os = "windows")'.dependencies] winreg = "0.8" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 860ed2f8..c58f9010 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -6,14 +6,16 @@ license = "GPL-3.0-or-later" edition = "2018" [dependencies] +cascade = "1" futures = "0.3.13" futures-timer = "3.0.2" -glib = { git = "https://github.com/pop-os/gtk-rs" } +glib = "0.14.0" hidapi = { version = "1.2", default-features = false, features = ["linux-static-hidraw"] } libc = "0.2" once_cell = "1.4" ordered-float = { version = "2.0", features = ["serde"] } palette = "0.5" +regex = "1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = "0.4.0" diff --git a/backend/src/backend.rs b/backend/src/backend.rs index fc720d52..14ac209f 100644 --- a/backend/src/backend.rs +++ b/backend/src/backend.rs @@ -144,7 +144,7 @@ impl Backend { pub fn connect_board_added(&self, cb: F) -> SignalHandlerId { self.connect_local("board-added", false, move |values| { - cb(values[1].get::().unwrap().unwrap()); + cb(values[1].get::().unwrap()); None }) .unwrap() @@ -152,7 +152,7 @@ impl Backend { pub fn connect_board_removed(&self, cb: F) -> SignalHandlerId { self.connect_local("board-removed", false, move |values| { - cb(values[1].get::().unwrap().unwrap()); + cb(values[1].get::().unwrap()); None }) .unwrap() diff --git a/backend/src/board.rs b/backend/src/board.rs index 2b9679bf..a997e7c6 100644 --- a/backend/src/board.rs +++ b/backend/src/board.rs @@ -1,11 +1,16 @@ use futures::{channel::mpsc as async_mpsc, prelude::*}; use glib::{ + clone, prelude::*, subclass::{prelude::*, Signal}, SignalHandlerId, }; use once_cell::sync::Lazy; -use std::{cell::Cell, collections::HashMap, sync::Arc}; +use std::{ + cell::{Cell, Ref, RefCell}, + collections::HashMap, + sync::Arc, +}; use crate::daemon::ThreadClient; use crate::{ @@ -30,6 +35,7 @@ pub struct BoardInner { has_matrix: DerefCell, is_fake: DerefCell, has_keymap: DerefCell, + matrix: RefCell, } #[glib::object_subclass] @@ -121,20 +127,12 @@ impl Board { .collect(); self_.inner().layers.set(layers); - { - let self_ = self_.clone(); - glib::MainContext::default().spawn(async move { - while let Some(matrix) = matrix_reciever.next().await { - for key in self_.keys() { - let pressed = matrix - .get(key.electrical.0 as usize, key.electrical.1 as usize) - .unwrap_or(false); - key.pressed.set(pressed); - } - self_.emit_by_name("matrix-changed", &[]).unwrap(); - } - }); - } + glib::MainContext::default().spawn(clone!(@strong self_ => async move { + while let Some(matrix) = matrix_reciever.next().await { + self_.inner().matrix.replace(matrix); + self_.emit_by_name("matrix-changed", &[]).unwrap(); + } + })); Ok(self_) } @@ -256,6 +254,10 @@ impl Board { &*self.inner().keys } + pub(crate) fn matrix(&self) -> Ref { + self.inner().matrix.borrow() + } + pub fn export_keymap(&self) -> KeyMap { let mut map = HashMap::new(); let mut key_leds = HashMap::new(); diff --git a/backend/src/daemon/daemon_thread.rs b/backend/src/daemon/daemon_thread.rs index 62b4b290..282507f7 100644 --- a/backend/src/daemon/daemon_thread.rs +++ b/backend/src/daemon/daemon_thread.rs @@ -222,7 +222,7 @@ impl ThreadClient { if let Response::Benchmark(benchmark) = resp { Ok(benchmark) } else { - panic!(format!("'{:?}' unexpected", resp)); + panic!("{}", format!("'{:?}' unexpected", resp)); } } @@ -231,7 +231,7 @@ impl ThreadClient { if let Response::Nelson(nelson) = resp { Ok(*nelson) } else { - panic!(format!("'{:?}' unexpected", resp)); + panic!("{}", format!("'{:?}' unexpected", resp)); } } diff --git a/backend/src/key.rs b/backend/src/key.rs index d120990a..61abdeac 100644 --- a/backend/src/key.rs +++ b/backend/src/key.rs @@ -23,8 +23,6 @@ pub struct Key { /// LED name pub led_name: String, led_color: Cell>, - /// Key is currently pressed - pub(crate) pressed: Cell, /// Currently loaded scancodes and their names scancodes: Vec>, /// Background color @@ -111,7 +109,6 @@ impl Key { leds, led_name, led_color: Cell::new(led_color), - pressed: Cell::new(false), scancodes, background_color, } @@ -122,7 +119,10 @@ impl Key { } pub fn pressed(&self) -> bool { - self.pressed.get() + self.board() + .matrix() + .get(self.electrical.0 as usize, self.electrical.1 as usize) + .unwrap_or(false) } pub fn color(&self) -> Option { @@ -147,7 +147,7 @@ impl Key { let board = self.board(); let scancode = self.scancodes.get(layer)?.get(); let scancode_name = match board.layout().scancode_to_name(scancode) { - Some(some) => some.to_string(), + Some(some) => some, None => String::new(), }; Some((scancode, scancode_name)) diff --git a/backend/src/layout/meta.rs b/backend/src/layout/meta.rs index fb46412d..b55ff539 100644 --- a/backend/src/layout/meta.rs +++ b/backend/src/layout/meta.rs @@ -20,6 +20,9 @@ pub struct Meta { pub has_brightness: bool, /// Has LED with color (i.e. not monochrome) pub has_color: bool, + /// Supports mod-tap bindings (assumes QMK mod-tap encoding) + #[serde(default)] + pub has_mod_tap: bool, /// Number or layers; e.g. 2 where layer 2 is used when `Fn` is held #[serde(default = "num_layers_default")] pub num_layers: u8, diff --git a/backend/src/layout/mod.rs b/backend/src/layout/mod.rs index 328f4b2c..ff02ea37 100644 --- a/backend/src/layout/mod.rs +++ b/backend/src/layout/mod.rs @@ -1,12 +1,32 @@ +use cascade::cascade; +use regex::Regex; use std::{collections::HashMap, fs, path::Path}; mod meta; +use once_cell::sync::Lazy; mod physical_layout; pub use self::meta::Meta; pub(crate) use physical_layout::{PhysicalLayout, PhysicalLayoutKey}; use crate::KeyMap; +const QK_MOD_TAP: u16 = 0x6000; +const QK_MOD_TAP_MAX: u16 = 0x7FFF; + +pub static MOD_TAP_MODS: Lazy> = Lazy::new(|| { + cascade! { + HashMap::new(); + ..insert("LEFT_CTRL", 0x01); + ..insert("LEFT_SHIFT", 0x02); + ..insert("LEFT_ALT", 0x04); + ..insert("LEFT_SUPER", 0x08); + ..insert("RIGHT_CTRL", 0x11); + ..insert("RIGHT_SHIFT", 0x12); + ..insert("RIGHT_ALT", 0x14); + ..insert("RIGHT_SUPER", 0x18); + } +}); + pub struct Layout { /// Metadata for keyboard pub meta: Meta, @@ -123,13 +143,29 @@ impl Layout { } /// Get the scancode number corresponding to a name - pub fn scancode_to_name(&self, scancode: u16) -> Option<&str> { - self.scancode_names.get(&scancode).map(String::as_str) + pub fn scancode_to_name(&self, scancode: u16) -> Option { + if scancode >= QK_MOD_TAP && scancode <= QK_MOD_TAP_MAX { + let mod_ = (scancode >> 8) & 0x1f; + let kc = scancode & 0xff; + let mod_name = MOD_TAP_MODS.iter().find(|(_, v)| **v == mod_)?.0; + let kc_name = self.scancode_names.get(&kc)?; + Some(format!("MT({}, {})", mod_name, kc_name)) + } else { + self.scancode_names.get(&scancode).cloned() + } } /// Get the name corresponding to a scancode number pub fn scancode_from_name(&self, name: &str) -> Option { - self.keymap.get(name).copied() + // Check if mod-tap + let mt_re = Regex::new("MT\\(([^()]+), ([^()]+)\\)").unwrap(); + if let Some(captures) = mt_re.captures(name) { + let mod_ = *MOD_TAP_MODS.get(&captures.get(1).unwrap().as_str())?; + let kc = *self.keymap.get(captures.get(2).unwrap().as_str())?; + Some(QK_MOD_TAP | ((mod_ & 0x1f) << 8) | (kc & 0xff)) + } else { + self.keymap.get(name).copied() + } } } diff --git a/ffi/Cargo.toml b/ffi/Cargo.toml index c6d01a0f..fee07ce9 100644 --- a/ffi/Cargo.toml +++ b/ffi/Cargo.toml @@ -9,7 +9,7 @@ name = "system76_keyboard_configurator" crate-type = [ "cdylib" ] [dependencies] -glib = { git = "https://github.com/pop-os/gtk-rs" } -gtk-sys = { git = "https://github.com/pop-os/gtk-rs" } -gtk = { git = "https://github.com/pop-os/gtk-rs" } +glib = "0.14.0" +gtk-sys = "0.14.0" +gtk = "0.14.0" system76-keyboard-configurator-widgets = { path = "../widgets" } diff --git a/layouts/system76/launch_1/meta.json b/layouts/system76/launch_1/meta.json index fd31bce3..ed035335 100644 --- a/layouts/system76/launch_1/meta.json +++ b/layouts/system76/launch_1/meta.json @@ -5,6 +5,7 @@ "num_layers": 4, "has_brightness": true, "has_color": true, + "has_mod_tap": true, "pressed_color": "#202020", "keyboard": "system76/launch_1" -} \ No newline at end of file +} diff --git a/rust-toolchain b/rust-toolchain index 21998d3c..ba0a7191 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.47.0 +1.51.0 diff --git a/src/backlight.rs b/src/backlight.rs index 5d22754b..0453a56c 100644 --- a/src/backlight.rs +++ b/src/backlight.rs @@ -79,11 +79,11 @@ impl ObjectImpl for BacklightInner { gtk::Adjustment::new(0., 0., 100., 1., 1., 0.); ..bind_property("value", &keyboard_color, "hs") .transform_from(|_, value| { - let hs: &Hs = value.get_some().unwrap(); + let hs: &Hs = value.get().unwrap(); Some((hs.s * 100.).to_value()) }) .transform_to(|_, value| { - let s: f64 = value.get_some().unwrap(); + let s: f64 = value.get().unwrap(); Some(Hs::new(0., s / 100.).to_value()) }) .flags(glib::BindingFlags::BIDIRECTIONAL) @@ -103,7 +103,7 @@ impl ObjectImpl for BacklightInner { gtk::ListBoxRow::new(); ..set_selectable(false); ..set_activatable(false); - ..set_property_margin(8); + ..set_margin(8); ..add(widget); } } @@ -146,7 +146,7 @@ impl ObjectImpl for BacklightInner { cascade! { obj; ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&mode_row); ..add(&speed_row); ..add(&saturation_row); @@ -176,15 +176,21 @@ impl ObjectImpl for BacklightInner { fn properties() -> &'static [glib::ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpec::string("mode", "mode", "mode", None, glib::ParamFlags::READABLE), - glib::ParamSpec::boxed( + glib::ParamSpec::new_string( + "mode", + "mode", + "mode", + None, + glib::ParamFlags::READABLE, + ), + glib::ParamSpec::new_boxed( "selected", "selected", "selected", - SelectedKeys::get_type(), + SelectedKeys::static_type(), glib::ParamFlags::WRITABLE, ), - glib::ParamSpec::boolean( + glib::ParamSpec::new_boolean( "is-per-key", "is-per-key", "is-per-key", @@ -204,9 +210,9 @@ impl ObjectImpl for BacklightInner { value: &glib::Value, pspec: &glib::ParamSpec, ) { - match pspec.get_name() { + match pspec.name() { "selected" => { - let selected: &SelectedKeys = value.get_some().unwrap(); + let selected: &SelectedKeys = value.get().unwrap(); obj.inner().selected.replace(selected.clone()); obj.update_per_key(); } @@ -214,8 +220,8 @@ impl ObjectImpl for BacklightInner { } } - fn get_property(&self, obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { - match pspec.get_name() { + fn property(&self, obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + match pspec.name() { "mode" => obj.mode().id.to_value(), "is-per-key" => obj.mode().is_per_key().to_value(), _ => unimplemented!(), @@ -280,7 +286,7 @@ impl Backlight { } pub fn mode(&self) -> &'static Mode { - if let Some(id) = self.inner().mode_combobox.get_active_id() { + if let Some(id) = self.inner().mode_combobox.active_id() { if let Some(mode) = Mode::from_id(id.as_str()) { return mode; } @@ -291,7 +297,7 @@ impl Backlight { fn header_func(&self, row: >k::ListBoxRow, before: Option<>k::ListBoxRow>) { if before.is_none() { row.set_header::(None) - } else if row.get_header().is_none() { + } else if row.header().is_none() { row.set_header(Some(&cascade! { gtk::Separator::new(gtk::Orientation::Horizontal); ..show(); @@ -345,7 +351,7 @@ impl Backlight { } let board = self.board().clone(); - let speed = self.inner().speed_scale.get_value(); + let speed = self.inner().speed_scale.value(); let mode = self.mode(); let layer = self.inner().layer.get() as usize; glib::MainContext::default().spawn_local(async move { @@ -360,7 +366,7 @@ impl Backlight { if self.inner().do_not_set.get() { return; } - let value = self.inner().brightness_scale.get_value() as i32; + let value = self.inner().brightness_scale.value() as i32; let board = self.board().clone(); glib::MainContext::default().spawn_local(async move { for layer in board.layers() { diff --git a/src/configurator_app.rs b/src/configurator_app.rs index 174c021a..a1851181 100644 --- a/src/configurator_app.rs +++ b/src/configurator_app.rs @@ -28,7 +28,7 @@ impl ObjectImpl for ConfiguratorAppInner { app.add_main_option( "fake-keyboard", - glib::Char::new('k').unwrap(), + glib::Char::from(b'k'), glib::OptionFlags::NONE, glib::OptionArg::String, "", @@ -36,7 +36,7 @@ impl ObjectImpl for ConfiguratorAppInner { ); app.add_main_option( "debug-layers", - glib::Char::new('\0').unwrap(), + glib::Char::from(b'\0'), glib::OptionFlags::NONE, glib::OptionArg::None, "", @@ -44,7 +44,7 @@ impl ObjectImpl for ConfiguratorAppInner { ); app.add_main_option( "launch-test", - glib::Char::new('\0').unwrap(), + glib::Char::from(b'\0'), glib::OptionFlags::NONE, glib::OptionArg::None, "", @@ -55,21 +55,20 @@ impl ObjectImpl for ConfiguratorAppInner { impl ApplicationImpl for ConfiguratorAppInner { fn handle_local_options(&self, _app: &ConfiguratorApp, opts: &glib::VariantDict) -> i32 { - let board_names = if let Some(opt) = opts.lookup_value("fake-keyboard", None) { - let value: String = opt.get().unwrap(); + fn lookup(opts: &glib::VariantDict, key: &str) -> Option { + opts.lookup_value(key, None)?.get() + } - if &value == "all" { - backend::layouts().iter().map(|s| s.to_string()).collect() - } else { - value.split(',').map(str::to_string).collect() - } - } else { - vec![] + let board_names = match lookup::(opts, "fake-keyboard").as_deref() { + Some("all") => backend::layouts().iter().map(|s| s.to_string()).collect(), + Some(value) => value.split(',').map(str::to_string).collect(), + None => vec![], }; self.phony_board_names.set(board_names); self.debug_layers.set(opts.contains("debug-layers")); self.launch_test.set(opts.contains("launch-test")); + -1 } @@ -92,7 +91,7 @@ impl ApplicationImpl for ConfiguratorAppInner { fn activate(&self, app: &ConfiguratorApp) { self.parent_activate(app); - if let Some(window) = app.get_active_window() { + if let Some(window) = app.active_window() { info!("Focusing current window"); window.present(); } else { @@ -133,7 +132,7 @@ impl ConfiguratorApp { #[cfg(target_os = "macos")] fn macos_init() { - use gtk::SettingsExt; + use gtk::traits::SettingsExt; use std::{env, process}; let mut prefer_dark = false; // This command returns Dark if we should use the dark theme @@ -147,10 +146,10 @@ fn macos_init() { prefer_dark = output.stdout.starts_with(b"Dark"); } - if let Some(settings) = gtk::Settings::get_default() { - settings.set_property_gtk_decoration_layout(Some("close,minimize,maximize:menu")); - settings.set_property_gtk_application_prefer_dark_theme(prefer_dark); - settings.set_property_gtk_enable_animations(false); + if let Some(settings) = gtk::Settings::default() { + settings.set_gtk_decoration_layout(Some("close,minimize,maximize:menu")); + settings.set_gtk_application_prefer_dark_theme(prefer_dark); + settings.set_gtk_enable_animations(false); } let css_provider = cascade! { @@ -165,7 +164,7 @@ fn macos_init() { }; gtk::StyleContext::add_provider_for_screen( - &gdk::Screen::get_default().unwrap(), + &gdk::Screen::default().unwrap(), &css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION, ); @@ -175,7 +174,7 @@ fn macos_init() { fn windows_init() { // This is a dword with a value of 0 if we should use the dark theme: // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme - use gtk::SettingsExt; + use gtk::traits::SettingsExt; use winreg::RegKey; let mut prefer_dark = false; let hkcu = RegKey::predef(winreg::enums::HKEY_CURRENT_USER); @@ -187,8 +186,8 @@ fn windows_init() { } } - if let Some(settings) = gtk::Settings::get_default() { - settings.set_property_gtk_application_prefer_dark_theme(prefer_dark); + if let Some(settings) = gtk::Settings::default() { + settings.set_gtk_application_prefer_dark_theme(prefer_dark); } } diff --git a/src/error_dialog.rs b/src/error_dialog.rs index d7372829..2f04dc6e 100644 --- a/src/error_dialog.rs +++ b/src/error_dialog.rs @@ -14,12 +14,12 @@ pub fn show_error_dialog, E: Display>(parent: &W, title: &st ..connect_response(|dialog, _| dialog.close()); }; - let header = dialog.get_header_bar().unwrap(); + let header = dialog.header_bar().unwrap(); header.set_show_close_button(false); - let content = dialog.get_content_area(); + let content = dialog.content_area(); content.add(&label); - content.set_property_margin(24); + content.set_margin(24); dialog.show(); } diff --git a/src/keyboard.rs b/src/keyboard.rs index 1d8a9b31..a96e8000 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -45,10 +45,10 @@ impl ObjectImpl for KeyboardInner { let layer_stack = cascade! { gtk::Stack::new(); ..set_transition_duration(0); - ..connect_property_visible_child_notify( + ..connect_visible_child_notify( clone!(@weak keyboard => move |stack| { let page = stack - .get_visible_child() + .visible_child() .map(|c| c.downcast_ref::().unwrap().page()); debug!("{:?}", page); @@ -71,7 +71,7 @@ impl ObjectImpl for KeyboardInner { let stack = cascade! { gtk::Stack::new(); ..set_homogeneous(false); - ..connect_property_visible_child_notify(clone!(@weak keyboard => move |_| keyboard.update_selectable())); + ..connect_visible_child_notify(clone!(@weak keyboard => move |_| keyboard.update_selectable())); }; let stack_switcher = cascade! { @@ -123,11 +123,11 @@ impl ObjectImpl for KeyboardInner { fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpec::boxed( + vec![glib::ParamSpec::new_boxed( "selected", "selected", "selected", - SelectedKeys::get_type(), + SelectedKeys::static_type(), glib::ParamFlags::READWRITE, )] }); @@ -142,19 +142,14 @@ impl ObjectImpl for KeyboardInner { value: &glib::Value, pspec: &glib::ParamSpec, ) { - match pspec.get_name() { - "selected" => keyboard.set_selected(value.get_some::<&SelectedKeys>().unwrap().clone()), + match pspec.name() { + "selected" => keyboard.set_selected(value.get::<&SelectedKeys>().unwrap().clone()), _ => unimplemented!(), } } - fn get_property( - &self, - keyboard: &Keyboard, - _id: usize, - pspec: &glib::ParamSpec, - ) -> glib::Value { - match pspec.get_name() { + fn property(&self, keyboard: &Keyboard, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + match pspec.name() { "selected" => keyboard.selected().to_value(), _ => unimplemented!(), } @@ -274,7 +269,7 @@ impl Keyboard { } fn window(&self) -> Option { - self.get_toplevel()?.downcast().ok() + self.toplevel()?.downcast().ok() } pub fn layer(&self) -> Option { @@ -321,7 +316,7 @@ impl Keyboard { return; } - let _loader = self.get_toplevel().and_then(|x| { + let _loader = self.toplevel().and_then(|x| { Some( x.downcast_ref::()? .display_loader(&fl!("loading-keyboard", keyboard = self.display_name())), @@ -398,7 +393,7 @@ impl Keyboard { }; if chooser.run() == gtk::ResponseType::Accept { - let path = chooser.get_filename().unwrap(); + let path = chooser.filename().unwrap(); match File::open(&path) { Ok(file) => match KeyMap::from_reader(file) { Ok(keymap) => { @@ -431,7 +426,7 @@ impl Keyboard { }; if chooser.run() == gtk::ResponseType::Accept { - let path = chooser.get_filename().unwrap(); + let path = chooser.filename().unwrap(); let keymap = self.export_keymap(); if keymap.version != 1 { @@ -465,7 +460,7 @@ impl Keyboard { return; } - let tab_name = self.inner().stack.get_visible_child_name(); + let tab_name = self.inner().stack.visible_child_name(); let tab_name = tab_name.as_deref(); let is_per_key = self.inner().backlight.mode().is_per_key(); @@ -517,7 +512,7 @@ impl Keyboard { // This function is called by Picker::set_keyboard() *self.inner().picker.borrow_mut() = match picker { Some(picker) => { - if let Some(widget) = picker.get_parent() { + if let Some(widget) = picker.parent() { widget.downcast::().unwrap().remove(picker); } self.inner().picker_box.add(picker); diff --git a/src/keyboard_layer.rs b/src/keyboard_layer.rs index 72bd4cb4..7056b25e 100644 --- a/src/keyboard_layer.rs +++ b/src/keyboard_layer.rs @@ -47,18 +47,18 @@ impl ObjectImpl for KeyboardLayerInner { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpec::boxed( + glib::ParamSpec::new_boxed( "selected", "selected", "selected", - SelectedKeys::get_type(), + SelectedKeys::static_type(), glib::ParamFlags::READWRITE, ), - glib::ParamSpec::boxed( + glib::ParamSpec::new_boxed( "testing-colors", "testing-colors", "testing-colors", - TestingColors::get_type(), + TestingColors::static_type(), glib::ParamFlags::READWRITE, ), ] @@ -74,24 +74,24 @@ impl ObjectImpl for KeyboardLayerInner { value: &glib::Value, pspec: &glib::ParamSpec, ) { - match pspec.get_name() { - "selected" => widget.set_selected(value.get_some::<&SelectedKeys>().unwrap().clone()), + match pspec.name() { + "selected" => widget.set_selected(value.get::<&SelectedKeys>().unwrap().clone()), "testing-colors" => { self.testing_colors - .replace(value.get_some::<&TestingColors>().unwrap().clone()); + .replace(value.get::<&TestingColors>().unwrap().clone()); widget.queue_draw(); } _ => unimplemented!(), } } - fn get_property( + fn property( &self, _widget: &KeyboardLayer, _id: usize, pspec: &glib::ParamSpec, ) -> glib::Value { - match pspec.get_name() { + match pspec.name() { "selected" => self.selected.borrow().to_value(), "testing-colors" => self.testing_colors.borrow().to_value(), _ => unimplemented!(), @@ -149,12 +149,12 @@ impl WidgetImpl for KeyboardLayerInner { cr.close_path(); cr.set_source_rgba(bg.0, bg.1, bg.2, bg_alpha); - cr.fill_preserve(); + cr.fill_preserve().unwrap(); if self.selectable.get() && widget.selected().contains(&i) { cr.set_source_rgb(selected.0, selected.1, selected.2); cr.set_line_width(4.); - cr.stroke(); + cr.stroke().unwrap(); } // Draw label @@ -164,7 +164,7 @@ impl WidgetImpl for KeyboardLayerInner { ..set_width((w * pango::SCALE as f64) as i32); ..set_alignment(pango::Alignment::Center); }; - let text_height = layout.get_pixel_size().1 as f64; + let text_height = layout.pixel_size().1 as f64; cr.new_path(); cr.move_to(x, y + (h - text_height) / 2.); cr.set_source_rgba(fg.0, fg.1, fg.2, text_alpha); @@ -181,14 +181,14 @@ impl WidgetImpl for KeyboardLayerInner { return Inhibit(false); } - let pos = evt.get_position(); + let pos = evt.position(); let pressed = widget .keys() .iter() .position(|k| widget.key_position(&k).contains(pos.0, pos.1)); if let Some(pressed) = pressed { - let shift = evt.get_state().contains(gdk::ModifierType::SHIFT_MASK); + let shift = evt.state().contains(gdk::ModifierType::SHIFT_MASK); let mut selected = widget.selected(); if shift { if selected.contains(&pressed) { @@ -210,15 +210,15 @@ impl WidgetImpl for KeyboardLayerInner { Inhibit(false) } - fn get_request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { + fn request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { gtk::SizeRequestMode::HeightForWidth } - fn get_preferred_width(&self, widget: &Self::Type) -> (i32, i32) { + fn preferred_width(&self, widget: &Self::Type) -> (i32, i32) { (widget.narrow_width(), widget.wide_width()) } - fn get_preferred_height_for_width(&self, widget: &Self::Type, width: i32) -> (i32, i32) { + fn preferred_height_for_width(&self, widget: &Self::Type, width: i32) -> (i32, i32) { let height = if width < widget.wide_width() { widget.narrow_height() } else { @@ -329,12 +329,12 @@ impl KeyboardLayer { } fn key_position(&self, k: &Key) -> Rect { - let (mut pos, width) = if self.get_allocated_width() < self.wide_width() { + let (mut pos, width) = if self.allocated_width() < self.wide_width() { (self.key_position_narrow(k), self.narrow_width()) } else { (self.key_position_wide(k), self.wide_width()) }; - pos.x += (self.get_allocated_width() - width) as f64 / 2.; + pos.x += (self.allocated_width() - width) as f64 / 2.; pos } } diff --git a/src/main_window.rs b/src/main_window.rs index 494792c9..9249b041 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -100,7 +100,7 @@ impl ObjectImpl for MainWindowInner { gtk::Box::new(gtk::Orientation::Vertical, 24); ..set_vexpand(true); ..set_valign(gtk::Align::Center); - ..set_property_margin(12); + ..set_margin(12); ..add(&cascade! { gtk::Image::from_icon_name(Some("launch-keyboard-not-found"), gtk::IconSize::Invalid); ..set_pixel_size(384); @@ -129,7 +129,7 @@ impl ObjectImpl for MainWindowInner { let stack = cascade! { gtk::Stack::new(); - ..set_property_margin(6); + ..set_margin(6); ..set_homogeneous(false); ..add(&board_list_stack); }; @@ -138,7 +138,7 @@ impl ObjectImpl for MainWindowInner { let load_box = cascade! { gtk::Box::new(gtk::Orientation::Vertical, 6); - ..set_property_margin(6); + ..set_margin(6); ..show(); }; @@ -161,7 +161,7 @@ impl ObjectImpl for MainWindowInner { ..add_overlay(&load_revealer); ..add(&cascade! { gtk::ScrolledWindow::new::(None, None); - ..set_property_hscrollbar_policy(gtk::PolicyType::Never); + ..set_hscrollbar_policy(gtk::PolicyType::Never); ..set_overlay_scrolling(false); ..add(&stack); }); @@ -225,7 +225,7 @@ impl MainWindow { } else { None }); - window.connect_property_is_active_notify(clone!(@weak backend => move |window| { + window.connect_is_active_notify(clone!(@weak backend => move |window| { backend.set_matrix_get_rate(if window.is_active() { Some(Duration::from_millis(50)) } else { @@ -287,7 +287,7 @@ impl MainWindow { } fn add_keyboard(&self, board: Board) { - let app: ConfiguratorApp = self.get_application().unwrap().downcast().unwrap(); + let app: ConfiguratorApp = self.application().unwrap().downcast().unwrap(); let keyboard = cascade! { Keyboard::new(board.clone(), app.debug_layers(), app.launch_test()); @@ -326,7 +326,7 @@ impl MainWindow { ..set_activatable(false); ..set_selectable(false); ..add(&keyboard_box); - ..set_property_margin(12); + ..set_margin(12); ..show_all(); }; self.inner().keyboard_box.add(&row); @@ -356,7 +356,7 @@ impl MainWindow { let mut boards = self.inner().keyboards.borrow_mut(); if let Some(idx) = boards.iter().position(|(kb, _)| kb.board() == &board) { let (keyboard, row) = boards.remove(idx); - if self.inner().stack.get_visible_child().as_ref() == Some(keyboard.upcast_ref()) { + if self.inner().stack.visible_child().as_ref() == Some(keyboard.upcast_ref()) { self.show_keyboard_list(); } self.inner().stack.remove(&keyboard); diff --git a/src/picker/mod.rs b/src/picker/mod.rs index 5b1fef09..d651edeb 100644 --- a/src/picker/mod.rs +++ b/src/picker/mod.rs @@ -4,34 +4,20 @@ use glib::clone; use gtk::prelude::*; use gtk::subclass::prelude::*; use once_cell::sync::Lazy; -use std::{cell::RefCell, collections::HashMap, rc::Rc}; +use std::{cell::RefCell, collections::HashMap}; use crate::Keyboard; use backend::DerefCell; mod picker_group; +mod picker_group_box; mod picker_json; mod picker_key; -use picker_group::PickerGroup; +use picker_group_box::PickerGroupBox; use picker_json::picker_json; use picker_key::PickerKey; -const DEFAULT_COLS: usize = 3; -const HSPACING: i32 = 64; -const VSPACING: i32 = 32; -const PICKER_CSS: &str = r#" -button { - margin: 0; - padding: 0; -} - -.selected { - border-color: #fbb86c; - border-width: 4px; -} -"#; - pub static SCANCODE_LABELS: Lazy> = Lazy::new(|| { let mut labels = HashMap::new(); for group in picker_json() { @@ -44,16 +30,14 @@ pub static SCANCODE_LABELS: Lazy> = Lazy::new(|| { #[derive(Default)] pub struct PickerInner { - groups: DerefCell>, - keys: DerefCell>>, + group_box: DerefCell, keyboard: RefCell>, - selected: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for PickerInner { const NAME: &'static str = "S76KeyboardPicker"; - type ParentType = gtk::Container; + type ParentType = gtk::Box; type Type = Picker; } @@ -61,170 +45,32 @@ impl ObjectImpl for PickerInner { fn constructed(&self, picker: &Picker) { self.parent_constructed(picker); - let style_provider = cascade! { - gtk::CssProvider::new(); - ..load_from_data(&PICKER_CSS.as_bytes()).expect("Failed to parse css"); + let group_box = cascade! { + PickerGroupBox::new(); + ..connect_key_pressed(clone!(@weak picker => move |name| { + picker.key_pressed(name) + })); }; - let mut groups = Vec::new(); - let mut keys = HashMap::new(); - - for json_group in picker_json() { - let mut group = PickerGroup::new(json_group.label, json_group.cols); - - for json_key in json_group.keys { - let key = PickerKey::new( - json_key.keysym.clone(), - json_key.label, - json_group.width, - &style_provider, - ); - - group.add_key(key.clone()); - keys.insert(json_key.keysym, key); - } - - groups.push(group); - } - - for group in &groups { - group.vbox.show(); - group.vbox.set_parent(picker); - } - - self.keys.set(keys); - self.groups.set(groups); - cascade! { picker; - ..connect_signals(); + ..add(&group_box); ..show_all(); }; - } -} - -impl WidgetImpl for PickerInner { - fn get_request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { - gtk::SizeRequestMode::HeightForWidth - } - - fn get_preferred_width(&self, _widget: &Self::Type) -> (i32, i32) { - let minimum_width = self - .groups - .iter() - .map(|x| x.vbox.get_preferred_width().1) - .max() - .unwrap(); - let natural_width = self - .groups - .chunks(3) - .map(|row| { - row.iter() - .map(|x| x.vbox.get_preferred_width().1) - .sum::() - }) - .max() - .unwrap() - + 2 * HSPACING; - (minimum_width, natural_width) - } - - fn get_preferred_height_for_width(&self, widget: &Self::Type, width: i32) -> (i32, i32) { - let rows = widget.rows_for_width(width); - let height = rows - .iter() - .map(|row| { - row.iter() - .map(|x| x.vbox.get_preferred_height().1) - .max() - .unwrap() - }) - .sum::() - + (rows.len() as i32 - 1) * VSPACING; - - (height, height) - } - - fn size_allocate(&self, obj: &Self::Type, allocation: >k::Allocation) { - self.parent_size_allocate(obj, allocation); - - let rows = obj.rows_for_width(allocation.width); - - let total_width = rows - .iter() - .map(|row| { - row.iter() - .map(|x| x.vbox.get_preferred_width().1) - .sum::() - + (row.len() as i32 - 1) * HSPACING - }) - .max() - .unwrap(); - - let mut y = 0; - for row in rows { - let mut x = (allocation.width - total_width) / 2; - for group in row { - let height = group.vbox.get_preferred_height().1; - let width = group.vbox.get_preferred_width().1; - group.vbox.size_allocate(>k::Allocation { - x, - y, - width, - height, - }); - x += width + HSPACING; - } - y += row - .iter() - .map(|x| x.vbox.get_preferred_height().1) - .max() - .unwrap() - + VSPACING; - } - } - - fn realize(&self, widget: &Self::Type) { - let allocation = widget.get_allocation(); - widget.set_realized(true); - - let attrs = gdk::WindowAttr { - x: Some(allocation.x), - y: Some(allocation.y), - width: allocation.width, - height: allocation.height, - window_type: gdk::WindowType::Child, - event_mask: widget.get_events(), - wclass: gdk::WindowWindowClass::InputOutput, - ..Default::default() - }; - let window = gdk::Window::new(widget.get_parent_window().as_ref(), &attrs); - widget.register_window(&window); - widget.set_window(&window); + self.group_box.set(group_box); } } -impl ContainerImpl for PickerInner { - fn forall( - &self, - _obj: &Self::Type, - _include_internals: bool, - cb: >k::subclass::container::Callback, - ) { - for group in self.groups.iter() { - cb.call(group.vbox.upcast_ref()); - } - } +impl BoxImpl for PickerInner {} - fn remove(&self, _obj: &Self::Type, child: >k::Widget) { - child.unparent(); - } -} +impl WidgetImpl for PickerInner {} + +impl ContainerImpl for PickerInner {} glib::wrapper! { pub struct Picker(ObjectSubclass) - @extends gtk::Container, gtk::Widget, @implements gtk::Orientable; + @extends gtk::Box, gtk::Container, gtk::Widget, @implements gtk::Orientable; } impl Picker { @@ -236,101 +82,48 @@ impl Picker { PickerInner::from_instance(self) } - fn connect_signals(&self) { - let picker = self; - for group in self.inner().groups.iter() { - for key in group.iter_keys() { - let button = &key.gtk; - let name = key.name.to_string(); - button.connect_clicked(clone!(@weak picker => @default-panic, move |_| { - let kb = match picker.inner().keyboard.borrow().clone() { - Some(kb) => kb, - None => { - return; - } - }; - let layer = kb.layer(); - - info!("Clicked {} layer {:?}", name, layer); - if let Some(layer) = layer { - let futures = FuturesUnordered::new(); - for i in kb.selected().iter() { - let i = *i; - futures.push(clone!(@strong kb, @strong name => async move { - kb.keymap_set(i, layer, &name).await; - })); - } - glib::MainContext::default().spawn_local(async {futures.collect::<()>().await}); - } - })); - } - } - } - - fn get_button(&self, scancode_name: &str) -> Option<>k::Button> { - self.inner().keys.get(scancode_name).map(|k| &k.gtk) - } - pub(crate) fn set_keyboard(&self, keyboard: Option) { if let Some(old_kb) = &*self.inner().keyboard.borrow() { old_kb.set_picker(None); } + if let Some(kb) = &keyboard { - for group in self.inner().groups.iter() { - for key in group.iter_keys() { - // Check that scancode is available for the keyboard - let visible = kb.has_scancode(&key.name); - key.gtk.set_visible(visible); - } - } + // Check that scancode is available for the keyboard + self.inner().group_box.set_key_visibility(|name| { + let visible = kb.has_scancode(name); + let sensitive = true; + (visible, sensitive) + }); kb.set_picker(Some(&self)); } + *self.inner().keyboard.borrow_mut() = keyboard; } pub(crate) fn set_selected(&self, scancode_names: Vec) { - let mut selected = self.inner().selected.borrow_mut(); - - for i in selected.iter() { - if let Some(button) = self.get_button(i) { - button.get_style_context().remove_class("selected"); - } - } - - *selected = scancode_names; - - for i in selected.iter() { - if let Some(button) = self.get_button(i) { - button.get_style_context().add_class("selected"); - } - } + self.inner().group_box.set_selected(scancode_names); } - fn rows_for_width(&self, container_width: i32) -> Vec<&[PickerGroup]> { - let mut rows = Vec::new(); - let groups = &*self.inner().groups; - - let mut row_start = 0; - let mut row_width = 0; - for (i, group) in groups.iter().enumerate() { - let width = group.vbox.get_preferred_width().1; - - row_width += width; - if i != 0 { - row_width += HSPACING; + fn key_pressed(&self, name: String) { + let kb = match self.inner().keyboard.borrow().clone() { + Some(kb) => kb, + None => { + return; } - if i - row_start >= DEFAULT_COLS || row_width > container_width { - rows.push(&groups[row_start..i]); - row_start = i; - row_width = width; + }; + let layer = kb.layer(); + + info!("Clicked {} layer {:?}", name, layer); + if let Some(layer) = layer { + let futures = FuturesUnordered::new(); + for i in kb.selected().iter() { + let i = *i; + futures.push(clone!(@strong kb, @strong name => async move { + kb.keymap_set(i, layer, &name).await; + })); } + glib::MainContext::default().spawn_local(async { futures.collect::<()>().await }); } - - if !groups[row_start..].is_empty() { - rows.push(&groups[row_start..]); - } - - rows } } diff --git a/src/picker/picker_group_box.rs b/src/picker/picker_group_box.rs new file mode 100644 index 00000000..0f5ebb85 --- /dev/null +++ b/src/picker/picker_group_box.rs @@ -0,0 +1,303 @@ +use cascade::cascade; +use glib::{clone, subclass::Signal, SignalHandlerId}; +use gtk::prelude::*; +use gtk::subclass::prelude::*; +use once_cell::sync::Lazy; +use std::{cell::RefCell, collections::HashMap, rc::Rc}; + +use backend::DerefCell; + +use super::{picker_group::PickerGroup, picker_json::picker_json, picker_key::PickerKey}; + +const DEFAULT_COLS: usize = 3; +const HSPACING: i32 = 64; +const VSPACING: i32 = 32; +const PICKER_CSS: &str = r#" +button { + margin: 0; + padding: 0; +} + +.selected { + border-color: #fbb86c; + border-width: 4px; +} +"#; + +#[derive(Default)] +pub struct PickerGroupBoxInner { + groups: DerefCell>, + keys: DerefCell>>, + selected: RefCell>, +} + +#[glib::object_subclass] +impl ObjectSubclass for PickerGroupBoxInner { + const NAME: &'static str = "S76KeyboardPickerGroupBox"; + type ParentType = gtk::Container; + type Type = PickerGroupBox; +} + +impl ObjectImpl for PickerGroupBoxInner { + fn constructed(&self, widget: &PickerGroupBox) { + self.parent_constructed(widget); + + let style_provider = cascade! { + gtk::CssProvider::new(); + ..load_from_data(&PICKER_CSS.as_bytes()).expect("Failed to parse css"); + }; + + let mut groups = Vec::new(); + let mut keys = HashMap::new(); + + for json_group in picker_json() { + let mut group = PickerGroup::new(json_group.label, json_group.cols); + + for json_key in json_group.keys { + let key = PickerKey::new( + json_key.keysym.clone(), + json_key.label, + json_group.width, + &style_provider, + ); + + group.add_key(key.clone()); + keys.insert(json_key.keysym, key); + } + + groups.push(group); + } + + for group in &groups { + group.vbox.show(); + group.vbox.set_parent(widget); + } + + self.keys.set(keys); + self.groups.set(groups); + + cascade! { + widget; + ..connect_signals(); + ..show_all(); + }; + } + + fn signals() -> &'static [Signal] { + static SIGNALS: Lazy> = Lazy::new(|| { + vec![Signal::builder( + "key-pressed", + &[String::static_type().into()], + glib::Type::UNIT.into(), + ) + .build()] + }); + SIGNALS.as_ref() + } +} + +impl WidgetImpl for PickerGroupBoxInner { + fn request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { + gtk::SizeRequestMode::HeightForWidth + } + + fn preferred_width(&self, _widget: &Self::Type) -> (i32, i32) { + let minimum_width = self + .groups + .iter() + .map(|x| x.vbox.preferred_width().1) + .max() + .unwrap(); + let natural_width = self + .groups + .chunks(3) + .map(|row| row.iter().map(|x| x.vbox.preferred_width().1).sum::()) + .max() + .unwrap() + + 2 * HSPACING; + (minimum_width, natural_width) + } + + fn preferred_height_for_width(&self, widget: &Self::Type, width: i32) -> (i32, i32) { + let rows = widget.rows_for_width(width); + let height = rows + .iter() + .map(|row| { + row.iter() + .map(|x| x.vbox.preferred_height().1) + .max() + .unwrap() + }) + .sum::() + + (rows.len() as i32 - 1) * VSPACING; + + (height, height) + } + + fn size_allocate(&self, obj: &Self::Type, allocation: >k::Allocation) { + self.parent_size_allocate(obj, allocation); + + let rows = obj.rows_for_width(allocation.width); + + let total_width = rows + .iter() + .map(|row| { + row.iter().map(|x| x.vbox.preferred_width().1).sum::() + + (row.len() as i32 - 1) * HSPACING + }) + .max() + .unwrap(); + + let mut y = 0; + for row in rows { + let mut x = (allocation.width - total_width) / 2; + for group in row { + let height = group.vbox.preferred_height().1; + let width = group.vbox.preferred_width().1; + group.vbox.size_allocate(>k::Allocation { + x, + y, + width, + height, + }); + x += width + HSPACING; + } + y += row + .iter() + .map(|x| x.vbox.preferred_height().1) + .max() + .unwrap() + + VSPACING; + } + } + + fn realize(&self, widget: &Self::Type) { + let allocation = widget.allocation(); + widget.set_realized(true); + + let attrs = gdk::WindowAttr { + x: Some(allocation.x), + y: Some(allocation.y), + width: allocation.width, + height: allocation.height, + window_type: gdk::WindowType::Child, + event_mask: widget.events(), + wclass: gdk::WindowWindowClass::InputOutput, + ..Default::default() + }; + + let window = gdk::Window::new(widget.parent_window().as_ref(), &attrs); + widget.register_window(&window); + widget.set_window(&window); + } +} + +impl ContainerImpl for PickerGroupBoxInner { + fn forall( + &self, + _obj: &Self::Type, + _include_internals: bool, + cb: >k::subclass::container::Callback, + ) { + for group in self.groups.iter() { + cb.call(group.vbox.upcast_ref()); + } + } + + fn remove(&self, _obj: &Self::Type, child: >k::Widget) { + child.unparent(); + } +} + +glib::wrapper! { + pub struct PickerGroupBox(ObjectSubclass) + @extends gtk::Container, gtk::Widget, @implements gtk::Orientable; +} + +impl PickerGroupBox { + pub fn new() -> Self { + glib::Object::new(&[]).unwrap() + } + + fn inner(&self) -> &PickerGroupBoxInner { + PickerGroupBoxInner::from_instance(self) + } + + fn connect_signals(&self) { + let picker = self; + for group in self.inner().groups.iter() { + for key in group.iter_keys() { + let button = &key.gtk; + let name = key.name.to_string(); + button.connect_clicked(clone!(@weak picker => @default-panic, move |_| { + picker.emit_by_name("key-pressed", &[&name]).unwrap(); + })); + } + } + } + + pub fn connect_key_pressed(&self, cb: F) -> SignalHandlerId { + self.connect_local("key-pressed", false, move |values| { + cb(values[1].get::().unwrap()); + None + }) + .unwrap() + } + + fn get_button(&self, scancode_name: &str) -> Option<>k::Button> { + self.inner().keys.get(scancode_name).map(|k| &k.gtk) + } + + pub(crate) fn set_key_visibility (bool, bool)>(&self, f: F) { + for key in self.inner().keys.values() { + let (visible, sensitive) = f(&key.name); + key.gtk.set_visible(visible); + key.gtk.set_sensitive(sensitive); + } + } + + pub(crate) fn set_selected(&self, scancode_names: Vec) { + let mut selected = self.inner().selected.borrow_mut(); + + for i in selected.iter() { + if let Some(button) = self.get_button(i) { + button.style_context().remove_class("selected"); + } + } + + *selected = scancode_names; + + for i in selected.iter() { + if let Some(button) = self.get_button(i) { + button.style_context().add_class("selected"); + } + } + } + + fn rows_for_width(&self, container_width: i32) -> Vec<&[PickerGroup]> { + let mut rows = Vec::new(); + let groups = &*self.inner().groups; + + let mut row_start = 0; + let mut row_width = 0; + for (i, group) in groups.iter().enumerate() { + let width = group.vbox.preferred_width().1; + + row_width += width; + if i != 0 { + row_width += HSPACING; + } + if i - row_start >= DEFAULT_COLS || row_width > container_width { + rows.push(&groups[row_start..i]); + row_start = i; + row_width = width; + } + } + + if !groups[row_start..].is_empty() { + rows.push(&groups[row_start..]); + } + + rows + } +} diff --git a/src/picker/picker_key.rs b/src/picker/picker_key.rs index d92ac7f9..a4c31018 100644 --- a/src/picker/picker_key.rs +++ b/src/picker/picker_key.rs @@ -28,7 +28,7 @@ impl PickerKey { let button = cascade! { gtk::Button::new(); ..set_size_request(48 * width, 48); - ..get_style_context().add_provider(style_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION); + ..style_context().add_provider(style_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION); ..add(&label); }; diff --git a/src/shortcuts_window.rs b/src/shortcuts_window.rs index 7d8a1d2f..a59dad91 100644 --- a/src/shortcuts_window.rs +++ b/src/shortcuts_window.rs @@ -8,11 +8,11 @@ pub fn shortcuts_window() -> gtk::ShortcutsWindow { let xml = include_str!("shortcuts_window.ui"); let builder = gtk::Builder::from_string(xml); - let import: gtk::ShortcutsShortcut = builder.get_object("import-layout").unwrap(); - import.set_property_title(Some(&fl!("layout-import"))); + let import: gtk::ShortcutsShortcut = builder.object("import-layout").unwrap(); + import.set_title(Some(&fl!("layout-import"))); - let export: gtk::ShortcutsShortcut = builder.get_object("export-layout").unwrap(); - export.set_property_title(Some(&fl!("layout-export"))); + let export: gtk::ShortcutsShortcut = builder.object("export-layout").unwrap(); + export.set_title(Some(&fl!("layout-export"))); - builder.get_object("shortcuts-window").unwrap() + builder.object("shortcuts-window").unwrap() } diff --git a/src/testing.rs b/src/testing.rs index a6f3a589..ce8802b0 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -79,7 +79,7 @@ impl ObjectImpl for TestingInner { gtk::ListBoxRow::new(); ..set_selectable(false); ..set_activatable(false); - ..set_property_margin(8); + ..set_margin(8); ..add(widget); } } @@ -101,7 +101,7 @@ impl ObjectImpl for TestingInner { ..set_size_request(18, 18); ..connect_draw(move |_w, cr| { cr.set_source_rgb(r, g, b); - cr.paint(); + cr.paint().unwrap(); Inhibit(false) }); } @@ -110,7 +110,7 @@ impl ObjectImpl for TestingInner { fn header_func(row: >k::ListBoxRow, before: Option<>k::ListBoxRow>) { if before.is_none() { row.set_header::(None) - } else if row.get_header().is_none() { + } else if row.header().is_none() { row.set_header(Some(&cascade! { gtk::Separator::new(gtk::Orientation::Horizontal); ..show(); @@ -123,7 +123,7 @@ impl ObjectImpl for TestingInner { obj.add(&cascade! { gtk::ListBox::new(); ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&row(&reset_button)); }); @@ -144,7 +144,7 @@ impl ObjectImpl for TestingInner { ..add(&cascade! { bench_list; ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&row(&bench_button)); ..set_header_func(Some(Box::new(header_func))); }); @@ -169,7 +169,7 @@ impl ObjectImpl for TestingInner { ..add(&cascade! { gtk::ListBox::new(); ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&row(&test_buttons[0])); ..add(&row(&test_labels[0])); ..add(&label_row("Check pins (missing)", &color_box(1., 0., 0.))); @@ -184,7 +184,7 @@ impl ObjectImpl for TestingInner { ..add(&cascade! { gtk::ListBox::new(); ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&label_row("Number of runs", &num_runs_spin_2)); ..add(&row(&test_buttons[1])); ..add(&row(&test_labels[1])); @@ -199,7 +199,7 @@ impl ObjectImpl for TestingInner { ..add(&cascade! { gtk::ListBox::new(); ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&label_row(&fl!("test-number-of-runs"), &num_runs_spin_3)); ..add(&row(&test_buttons[2])); ..add(&row(&test_labels[2])); @@ -221,7 +221,7 @@ impl ObjectImpl for TestingInner { ..add(&cascade! { gtk::ListBox::new(); ..set_valign(gtk::Align::Start); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..add(&row(&cascade! { gtk::Box::new(gtk::Orientation::Horizontal, 8); ..set_halign(gtk::Align::Center); @@ -255,11 +255,11 @@ impl ObjectImpl for TestingInner { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpec::boxed( + vec![glib::ParamSpec::new_boxed( "colors", "colors", "colors", - TestingColors::get_type(), + TestingColors::static_type(), glib::ParamFlags::READABLE, )] }); @@ -267,8 +267,8 @@ impl ObjectImpl for TestingInner { PROPERTIES.as_ref() } - fn get_property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { - match pspec.get_name() { + fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + match pspec.name() { "colors" => self.colors.borrow().to_value(), _ => unimplemented!(), } @@ -307,7 +307,7 @@ impl Testing { testing.bench_button.set_label("Running USB test"); - while testing.bench_button.get_active() { + while testing.bench_button.is_active() { match testing.board.benchmark().await { Ok(benchmark) => { for (port_desc, port_result) in benchmark.port_results.iter() { @@ -462,7 +462,7 @@ impl Testing { self.inner().test_buttons[1].connect_clicked(clone!(@strong self as self_ => move |_| { glib::MainContext::default().spawn_local(clone!(@strong self_ => async move { self_.nelson( - self_.inner().num_runs_spin_2.get_value_as_int(), + self_.inner().num_runs_spin_2.value_as_int(), 1, NelsonKind::Bouncing, ).await; @@ -474,7 +474,7 @@ impl Testing { self.inner().test_buttons[2].connect_clicked(clone!(@strong self as self_ => move |_| { glib::MainContext::default().spawn_local(clone!(@strong self_ => async move { self_.nelson( - self_.inner().num_runs_spin_3.get_value_as_int(), + self_.inner().num_runs_spin_3.value_as_int(), 2, NelsonKind::Normal, ).await; diff --git a/widgets/Cargo.toml b/widgets/Cargo.toml index 8254f4b0..4f363cca 100644 --- a/widgets/Cargo.toml +++ b/widgets/Cargo.toml @@ -7,15 +7,15 @@ edition = "2018" [dependencies] cascade = "1" -cairo-rs = { git = "https://github.com/pop-os/gtk-rs" } +cairo-rs = "0.14.0" futures = "0.3.13" -gdk = { git = "https://github.com/pop-os/gtk-rs" } -gio = { git = "https://github.com/pop-os/gtk-rs" } -glib = { git = "https://github.com/pop-os/gtk-rs" } -gtk = { git = "https://github.com/pop-os/gtk-rs", features = ["v3_22"] } +gdk = "0.14.0" +gio = "0.14.0" +glib = "0.14.0" +gtk = { version = "0.14.0", features = ["v3_22"] } libc = "0.2" once_cell = "1.4" -pango = { git = "https://github.com/pop-os/gtk-rs" } +pango = "0.14.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = "0.4.0" @@ -27,7 +27,7 @@ i18n-embed-fl = "0.5.0" rust-embed = { version = "5.9.0", features = ["debug-embed"] } [build-dependencies] -gio = { git = "https://github.com/pop-os/gtk-rs" } +gio = "0.14.0" [target.'cfg(target_os = "windows")'.dependencies] winreg = "0.8" diff --git a/widgets/examples/keyboard_color.rs b/widgets/examples/keyboard_color.rs index d87c4869..b3b9edcd 100644 --- a/widgets/examples/keyboard_color.rs +++ b/widgets/examples/keyboard_color.rs @@ -11,7 +11,7 @@ fn main() { gtk::init().unwrap(); let application = cascade! { - gtk::Application::new(None, gio::ApplicationFlags::FLAGS_NONE).unwrap(); + gtk::Application::new(None, gio::ApplicationFlags::FLAGS_NONE); ..connect_activate(move |app| { let backlight_widget = cascade! { keyboard_backlight_widget(); diff --git a/widgets/src/choose_color.rs b/widgets/src/choose_color.rs index e08f26f1..362a6b88 100644 --- a/widgets/src/choose_color.rs +++ b/widgets/src/choose_color.rs @@ -33,7 +33,7 @@ pub async fn choose_color>( ..connect_draw(clone!(@weak color_wheel => @default-panic, move |_w, cr| { let (r, g, b) = color_wheel.hs().to_rgb().to_floats(); cr.set_source_rgb(r, g, b); - cr.paint(); + cr.paint().unwrap(); Inhibit(false) })); }; @@ -89,16 +89,14 @@ pub async fn choose_color>( let vbox = cascade! { gtk::Box::new(gtk::Orientation::Vertical, 12); - ..set_property_margin(24); + ..set_margin(24); ..add(&color_wheel); ..add(&preview); ..add(&hue_box); ..add(&saturation_box); }; - let window = w - .get_toplevel() - .and_then(|x| x.downcast::().ok()); + let window = w.toplevel().and_then(|x| x.downcast::().ok()); let dialog = cascade! { gtk::DialogBuilder::new() @@ -108,7 +106,7 @@ pub async fn choose_color>( .build(); ..add_button(&fl!("button-cancel"), gtk::ResponseType::Cancel); ..add_button(&fl!("button-save"), gtk::ResponseType::Ok); - ..get_content_area().add(&vbox); + ..content_area().add(&vbox); ..set_transient_for(window.as_ref()); ..show_all(); }; diff --git a/widgets/src/color_circle.rs b/widgets/src/color_circle.rs index f6b758dd..6867cafb 100644 --- a/widgets/src/color_circle.rs +++ b/widgets/src/color_circle.rs @@ -23,10 +23,10 @@ impl ObjectImpl for ColorCircleInner {} impl WidgetImpl for ColorCircleInner { fn draw(&self, widget: &ColorCircle, cr: &cairo::Context) -> Inhibit { - let width = f64::from(widget.get_allocated_width()); - let height = f64::from(widget.get_allocated_height()); + let width = f64::from(widget.allocated_width()); + let height = f64::from(widget.allocated_height()); - let flags = widget.get_state_flags(); + let flags = widget.state_flags(); let radius = width.min(height) / 2.; let alpha = if flags.contains(gtk::StateFlags::INSENSITIVE) { @@ -46,18 +46,18 @@ impl WidgetImpl for ColorCircleInner { cr.close_path(); let (r, g, b) = hs.to_rgb().to_floats(); cr.set_source_rgba(r, g, b, alpha); - cr.fill(); + cr.fill().unwrap(); angle1 = angle2; } cr.arc(radius, radius, radius - 2. * BORDER, 0., 2. * PI); if flags.contains(gtk::StateFlags::PRELIGHT) { cr.set_source_rgba(0., 0., 0., 0.2); - cr.fill_preserve(); + cr.fill_preserve().unwrap(); } cr.set_line_width(BORDER); cr.set_source_rgb(0.5, 0.5, 0.5); - cr.stroke(); + cr.stroke().unwrap(); Inhibit(false) } diff --git a/widgets/src/color_wheel.rs b/widgets/src/color_wheel.rs index e9633857..3f1b6497 100644 --- a/widgets/src/color_wheel.rs +++ b/widgets/src/color_wheel.rs @@ -53,14 +53,14 @@ impl ObjectImpl for ColorWheelInner { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpec::boxed( + glib::ParamSpec::new_boxed( "hs", "hs", "hs", - Hs::get_type(), + Hs::static_type(), glib::ParamFlags::READWRITE, ), - glib::ParamSpec::double( + glib::ParamSpec::new_double( "hue", "hue", "hue", @@ -69,7 +69,7 @@ impl ObjectImpl for ColorWheelInner { 0., glib::ParamFlags::READWRITE, ), - glib::ParamSpec::double( + glib::ParamSpec::new_double( "saturation", "saturation", "saturation", @@ -91,18 +91,18 @@ impl ObjectImpl for ColorWheelInner { value: &glib::Value, pspec: &glib::ParamSpec, ) { - match pspec.get_name() { + match pspec.name() { "hs" => { - wheel.set_hs(*value.get_some::<&Hs>().unwrap()); + wheel.set_hs(*value.get::<&Hs>().unwrap()); } "hue" => { - let mut hue: f64 = value.get_some().unwrap(); + let mut hue: f64 = value.get().unwrap(); hue = (hue * PI / 180.).max(0.).min(2. * PI); let hs = wheel.hs(); wheel.set_hs(Hs::new(hue, *hs.s)); } "saturation" => { - let mut saturation: f64 = value.get_some().unwrap(); + let mut saturation: f64 = value.get().unwrap(); saturation = (saturation / 100.).max(0.).min(1.); let hs = wheel.hs(); wheel.set_hs(hs); @@ -112,8 +112,8 @@ impl ObjectImpl for ColorWheelInner { } } - fn get_property(&self, wheel: &ColorWheel, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { - match pspec.get_name() { + fn property(&self, wheel: &ColorWheel, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + match pspec.name() { "hs" => wheel.hs().to_value(), "hue" => { let mut hue = *wheel.hs().h * 180. / PI; @@ -130,8 +130,8 @@ impl WidgetImpl for ColorWheelInner { fn draw(&self, wheel: &ColorWheel, cr: &cairo::Context) -> Inhibit { self.parent_draw(wheel, cr); - let width = f64::from(wheel.get_allocated_width()); - let height = f64::from(wheel.get_allocated_height()); + let width = f64::from(wheel.allocated_width()); + let height = f64::from(wheel.allocated_height()); let radius = width.min(height) / 2.; @@ -140,16 +140,16 @@ impl WidgetImpl for ColorWheelInner { // Draw color wheel if let Some(surface) = self.surface.borrow().as_ref() { let pattern = cairo::SurfacePattern::create(surface); - let scale = surface.get_width() as f64 / (radius * 2.); + let scale = surface.width() as f64 / (radius * 2.); let mut matrix = cairo::Matrix::identity(); matrix.scale(scale, scale); pattern.set_matrix(matrix); - cr.set_source(&pattern); + cr.set_source(&pattern).unwrap(); } else { cr.set_source_rgba(0., 0., 0., 0.); } cr.arc(radius, radius, radius, 0., 2. * PI); - cr.fill(); + cr.fill().unwrap(); // Draw selector circle let hs = wheel.hs(); @@ -157,10 +157,10 @@ impl WidgetImpl for ColorWheelInner { let y = radius - hs.h.sin() * (*hs.s) * radius; cr.arc(x, y, 7.5, 0., 2. * PI); cr.set_source_rgb(1., 1., 1.); - cr.fill_preserve(); + cr.fill_preserve().unwrap(); cr.set_source_rgb(0., 0., 0.); cr.set_line_width(1.); - cr.stroke(); + cr.stroke().unwrap(); Inhibit(false) } @@ -180,23 +180,23 @@ impl WidgetImpl for ColorWheelInner { }); } - fn get_request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { + fn request_mode(&self, _widget: &Self::Type) -> gtk::SizeRequestMode { gtk::SizeRequestMode::HeightForWidth } - fn get_preferred_width(&self, _widget: &Self::Type) -> (i32, i32) { + fn preferred_width(&self, _widget: &Self::Type) -> (i32, i32) { (0, 300) } - fn get_preferred_height(&self, _widget: &Self::Type) -> (i32, i32) { + fn preferred_height(&self, _widget: &Self::Type) -> (i32, i32) { (0, 300) } - fn get_preferred_height_for_width(&self, _widget: &Self::Type, width: i32) -> (i32, i32) { + fn preferred_height_for_width(&self, _widget: &Self::Type, width: i32) -> (i32, i32) { (0, width) } - fn get_preferred_width_for_height(&self, _widget: &Self::Type, height: i32) -> (i32, i32) { + fn preferred_width_for_height(&self, _widget: &Self::Type, height: i32) -> (i32, i32) { (0, height) } } @@ -234,8 +234,8 @@ impl ColorWheel { } fn mouse_select(&self, pos: (f64, f64)) { - let width = f64::from(self.get_allocated_width()); - let height = f64::from(self.get_allocated_height()); + let width = f64::from(self.allocated_width()); + let height = f64::from(self.allocated_height()); let radius = width.min(height) / 2.; let (x, y) = (pos.0 - width / 2., radius - pos.1); diff --git a/widgets/src/keyboard_backlight_widget.rs b/widgets/src/keyboard_backlight_widget.rs index e397bc0f..d7d9e4b8 100644 --- a/widgets/src/keyboard_backlight_widget.rs +++ b/widgets/src/keyboard_backlight_widget.rs @@ -11,7 +11,7 @@ use backend::{Backend, Board}; pub fn keyboard_backlight_widget() -> gtk::Widget { let stack = cascade! { gtk::Stack::new(); - ..get_style_context().add_class("frame"); + ..style_context().add_class("frame"); ..set_transition_type(gtk::StackTransitionType::SlideLeftRight); }; @@ -97,7 +97,7 @@ fn row>(text: &str, widget: &W, expand: bool) -> gtk::ListBo gtk::ListBoxRow::new(); ..set_selectable(false); ..set_activatable(false); - ..set_property_margin(12); + ..set_margin(12); ..add(&hbox); }; diff --git a/widgets/src/keyboard_color.rs b/widgets/src/keyboard_color.rs index ee3f2332..e9dcbe3b 100644 --- a/widgets/src/keyboard_color.rs +++ b/widgets/src/keyboard_color.rs @@ -120,11 +120,11 @@ impl ObjectImpl for KeyboardColorInner { fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpec::boxed( + vec![glib::ParamSpec::new_boxed( "hs", "hs", "hs", - Hs::get_type(), + Hs::static_type(), glib::ParamFlags::READWRITE, )] }); @@ -139,22 +139,22 @@ impl ObjectImpl for KeyboardColorInner { value: &glib::Value, pspec: &glib::ParamSpec, ) { - match pspec.get_name() { + match pspec.name() { "hs" => { - let hs: &Hs = value.get_some().unwrap(); + let hs: &Hs = value.get().unwrap(); widget.set_hs(*hs); } _ => unimplemented!(), } } - fn get_property( + fn property( &self, _widget: &KeyboardColor, _id: usize, pspec: &glib::ParamSpec, ) -> glib::Value { - match pspec.get_name() { + match pspec.name() { "hs" => self.hs.get().to_value(), _ => unimplemented!(), }