diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..73774f7
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1312 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "arc-swap"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
+
+[[package]]
+name = "autocfg"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+[[package]]
+name = "base62"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f879ef8fc74665ed7f0e6127cb106315888fc2744f68e14b74f83edbb2a08992"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+
+[[package]]
+name = "bstr"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "cairo-rs"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8a0ea147c94108c9613235388f540e4d14c327f7081c9e471fc8ee8a2533e69"
+dependencies = [
+ "bitflags 2.6.0",
+ "cairo-sys-rs",
+ "glib 0.20.2",
+ "libc",
+]
+
+[[package]]
+name = "cairo-sys-rs"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f"
+dependencies = [
+ "glib-sys 0.20.2",
+ "libc",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "345c78335be0624ed29012dc10c49102196c6882c12dde65d9f35b02da2aada8"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+
+[[package]]
+name = "either"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "errno"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
+
+[[package]]
+name = "field-offset"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+dependencies = [
+ "memoffset",
+ "rustc_version",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-task"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+
+[[package]]
+name = "futures-util"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+dependencies = [
+ "futures-core",
+ "futures-macro",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "gdk-pixbuf"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8730751991b97419fc3f0c2dca2c9e45b48edf46e48e0f965964ecf33889812f"
+dependencies = [
+ "gdk-pixbuf-sys",
+ "gio 0.20.1",
+ "glib 0.20.2",
+ "libc",
+]
+
+[[package]]
+name = "gdk-pixbuf-sys"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ffbf649fd5b1c8c0f0feeb015b7533c3ef92da2887fb95ddd338bc2b1644a7c"
+dependencies = [
+ "gio-sys 0.20.1",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "libc",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "gdk4"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b7d7237c1487ed4b300aac7744efcbf1319e12d60d7afcd6f505414bd5b5dea"
+dependencies = [
+ "cairo-rs",
+ "gdk-pixbuf",
+ "gdk4-sys",
+ "gio 0.20.1",
+ "glib 0.20.2",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gdk4-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a67576c8ec012156d7f680e201a807b4432a77babb3157e0555e990ab6bcd878"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gio-sys 0.20.1",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "gio"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c49f117d373ffcc98a35d114db5478bc223341cff53e39a5d6feced9e2ddffe"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys 0.19.8",
+ "glib 0.19.9",
+ "libc",
+ "pin-project-lite",
+ "smallvec",
+ "thiserror",
+]
+
+[[package]]
+name = "gio"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcacaa37401cad0a95aadd266bc39c72a131d454fc012f6dfd217f891d76cc52"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys 0.20.1",
+ "glib 0.20.2",
+ "libc",
+ "pin-project-lite",
+ "smallvec",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cd743ba4714d671ad6b6234e8ab2a13b42304d0e13ab7eba1dcdd78a7d6d4ef"
+dependencies = [
+ "glib-sys 0.19.8",
+ "gobject-sys 0.19.8",
+ "libc",
+ "system-deps 6.2.2",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5237611e97e9b86ab5768adc3eef853ae713ea797aa3835404acdfacffc9fb38"
+dependencies = [
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "libc",
+ "system-deps 7.0.2",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "glib"
+version = "0.19.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39650279f135469465018daae0ba53357942a5212137515777d5fdca74984a44"
+dependencies = [
+ "bitflags 2.6.0",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "gio-sys 0.19.8",
+ "glib-macros 0.19.9",
+ "glib-sys 0.19.8",
+ "gobject-sys 0.19.8",
+ "libc",
+ "memchr",
+ "smallvec",
+ "thiserror",
+]
+
+[[package]]
+name = "glib"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c1ea829497810f8e87f5ee6d05c4879af641704add879e6b6080607cceeefe4"
+dependencies = [
+ "bitflags 2.6.0",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "gio-sys 0.20.1",
+ "glib-macros 0.20.2",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "libc",
+ "memchr",
+ "smallvec",
+]
+
+[[package]]
+name = "glib-build-tools"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "108f374fff60efd14b0d70d8916e7213aed18d7dd071ba3e9334ed2dac1dc86a"
+dependencies = [
+ "gio 0.19.8",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.19.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4429b0277a14ae9751350ad9b658b1be0abb5b54faa5bcdf6e74a3372582fad7"
+dependencies = [
+ "heck",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "951aa19c5e89555c0ca5e94ee874b24b2594ece8412b387bd84ee3266b8a3ea0"
+dependencies = [
+ "heck",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c2dc18d3a82b0006d470b13304fbbb3e0a9bd4884cf985a60a7ed733ac2c4a5"
+dependencies = [
+ "libc",
+ "system-deps 6.2.2",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92eee4531c1c9abba945d19378b205031b5890e1f99c319ba0503b6e0c06a163"
+dependencies = [
+ "libc",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "globset"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "globwalk"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc"
+dependencies = [
+ "bitflags 1.3.2",
+ "ignore",
+ "walkdir",
+]
+
+[[package]]
+name = "gobject-sys"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e697e252d6e0416fd1d9e169bda51c0f1c926026c39ca21fbe8b1bb5c3b8b9e"
+dependencies = [
+ "glib-sys 0.19.8",
+ "libc",
+ "system-deps 6.2.2",
+]
+
+[[package]]
+name = "gobject-sys"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa3d1dcd8a1eb2e7c22be3d5e792b14b186f3524f79b25631730f9a8c169d49a"
+dependencies = [
+ "glib-sys 0.20.2",
+ "libc",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "graphene-rs"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80aac87f74e81c0e13433e892a047237abdc37945c86887f5eed905038356e69"
+dependencies = [
+ "glib 0.20.2",
+ "graphene-sys",
+ "libc",
+]
+
+[[package]]
+name = "graphene-sys"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc2f91ecd32989efad60326cc20a8fb252bd2852239a08e4e70cde8c100de9ca"
+dependencies = [
+ "glib-sys 0.20.2",
+ "libc",
+ "pkg-config",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "gsk4"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3cf2091e1af185b347b3450817d93dea6fe435df7abd4c2cd7fb5bcb4cfda8"
+dependencies = [
+ "cairo-rs",
+ "gdk4",
+ "glib 0.20.2",
+ "graphene-rs",
+ "gsk4-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gsk4-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aa69614a26d8760c186c3690f1b0fbb917572ca23ef83137445770ceddf8cde"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk4-sys",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "graphene-sys",
+ "libc",
+ "pango-sys",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "gtk4"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4fe572bf318e5dbc6f5a2f8a25d853f1ae3f42768c0b08af6ca20a18f4057e1"
+dependencies = [
+ "cairo-rs",
+ "field-offset",
+ "futures-channel",
+ "gdk-pixbuf",
+ "gdk4",
+ "gio 0.20.1",
+ "glib 0.20.2",
+ "graphene-rs",
+ "gsk4",
+ "gtk4-macros",
+ "gtk4-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gtk4-macros"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9e7b362c8fccd2712297903717d65d30defdab2b509bc9d209cbe5ffb9fabaf"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "gtk4-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1114a207af8ada02cf4658a76692f4190f06f093380d5be07e3ca8b43aa7c666"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gdk4-sys",
+ "gio-sys 0.20.1",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "graphene-sys",
+ "gsk4-sys",
+ "libc",
+ "pango-sys",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "ignore"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+dependencies = [
+ "crossbeam-deque",
+ "globset",
+ "log",
+ "memchr",
+ "regex-automata",
+ "same-file",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libadwaita"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ff9c222b5c783729de45185f07b2fec2d43a7f9c63961e777d3667e20443878"
+dependencies = [
+ "gdk4",
+ "gio 0.20.1",
+ "glib 0.20.2",
+ "gtk4",
+ "libadwaita-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "libadwaita-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c44d8bdbad31d6639e1f20cc9c1424f1a8e02d751fc28d44659bf743fb9eca6"
+dependencies = [
+ "gdk4-sys",
+ "gio-sys 0.20.1",
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "gtk4-sys",
+ "libc",
+ "pango-sys",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+
+[[package]]
+name = "libyml"
+version = "0.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64804cc6a5042d4f05379909ba25b503ec04e2c082151d62122d5dcaa274b961"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
+name = "log"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "normpath"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
+name = "pango"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5764e5a174a5a0ec054fe5962ce6d4fc7052e2d0dcc23bbc77202b40a4a403d3"
+dependencies = [
+ "gio 0.20.1",
+ "glib 0.20.2",
+ "libc",
+ "pango-sys",
+]
+
+[[package]]
+name = "pango-sys"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd317e1de76b14b3d3efe05518c08b360327f1ab7fec150473a89ffcad4b072d"
+dependencies = [
+ "glib-sys 0.20.2",
+ "gobject-sys 0.20.1",
+ "libc",
+ "system-deps 7.0.2",
+]
+
+[[package]]
+name = "pika-gnome-layouts"
+version = "4.0.0"
+dependencies = [
+ "glib-build-tools",
+ "gtk4",
+ "libadwaita",
+ "rust-i18n",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
+dependencies = [
+ "toml_edit 0.22.20",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+
+[[package]]
+name = "rust-i18n"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "039f57d22229db401af3458ca939300178e99e88b938573cea12b7c2b0f09724"
+dependencies = [
+ "globwalk",
+ "once_cell",
+ "regex",
+ "rust-i18n-macro",
+ "rust-i18n-support",
+ "smallvec",
+]
+
+[[package]]
+name = "rust-i18n-macro"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dde5c022360a2e54477882843d56b6f9bcb4bc62f504b651a2f497f0028d174f"
+dependencies = [
+ "glob",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "rust-i18n-support",
+ "serde",
+ "serde_json",
+ "serde_yml",
+ "syn",
+]
+
+[[package]]
+name = "rust-i18n-support"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75d2844d36f62b5d6b66f9cf8f8cbdbbbdcdb5fd37a473a9cc2fb45fdcf485d2"
+dependencies = [
+ "arc-swap",
+ "base62",
+ "globwalk",
+ "itertools",
+ "lazy_static",
+ "normpath",
+ "once_cell",
+ "proc-macro2",
+ "regex",
+ "serde",
+ "serde_json",
+ "serde_yml",
+ "siphasher",
+ "toml 0.7.8",
+ "triomphe",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f"
+dependencies = [
+ "bitflags 2.6.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
+
+[[package]]
+name = "serde"
+version = "1.0.209"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.209"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_yml"
+version = "0.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48e76bab63c3fd98d27c17f9cbce177f64a91f5e69ac04cafe04e1bb25d1dc3c"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "libyml",
+ "log",
+ "memchr",
+ "ryu",
+ "serde",
+ "serde_json",
+ "tempfile",
+]
+
+[[package]]
+name = "siphasher"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "syn"
+version = "2.0.76"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "system-deps"
+version = "6.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
+dependencies = [
+ "cfg-expr 0.15.8",
+ "heck",
+ "pkg-config",
+ "toml 0.8.19",
+ "version-compare",
+]
+
+[[package]]
+name = "system-deps"
+version = "7.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "070a0a5e7da2d24be457809c4b3baa57a835fd2829ad8b86f9a049052fe71031"
+dependencies = [
+ "cfg-expr 0.16.0",
+ "heck",
+ "pkg-config",
+ "toml 0.8.19",
+ "version-compare",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
+[[package]]
+name = "tempfile"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "toml"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.22.20",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow 0.6.18",
+]
+
+[[package]]
+name = "triomphe"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369"
+dependencies = [
+ "arc-swap",
+ "serde",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "version-compare"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
+dependencies = [
+ "memchr",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..b1cf0e5
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "pika-gnome-layouts"
+version = "4.0.0"
+edition = "2021"
+
+[dependencies]
+adw = { version = "0.7.0", package = "libadwaita", features = ["v1_5"] }
+gtk = { version = "0.9.0", package = "gtk4", features = ["v4_14"] }
+rust-i18n = "3.0.1"
+
+[build-dependencies]
+glib-build-tools = "0.19.0"
\ No newline at end of file
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..a8b3513
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,9 @@
+// R1
+
+fn main() {
+ glib_build_tools::compile_resources(
+ &["resources"],
+ "resources/resources.gresource.xml",
+ "resources.gresource",
+ );
+}
diff --git a/usr/share/applications/pika-gnome-layouts.desktop b/data/com.github.pikaos-linux.pikagnomelayouts.desktop
similarity index 100%
rename from usr/share/applications/pika-gnome-layouts.desktop
rename to data/com.github.pikaos-linux.pikagnomelayouts.desktop
diff --git a/data/com.github.pikaos-linux.pikagnomelayouts.gschema.xml b/data/com.github.pikaos-linux.pikagnomelayouts.gschema.xml
new file mode 100644
index 0000000..5b958d8
--- /dev/null
+++ b/data/com.github.pikaos-linux.pikagnomelayouts.gschema.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ 700
+ Default window width
+
+
+ 500
+ Default window height
+
+
+ false
+ Default window maximized behaviour
+
+
+ 0
+ What layout is selected.
+
+ What layout is selected.
+
+
+
+
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/gnome2.sh b/data/layout-scripts/gnome2.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/gnome2.sh
rename to data/layout-scripts/gnome2.sh
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/macos.sh b/data/layout-scripts/macos.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/macos.sh
rename to data/layout-scripts/macos.sh
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/reset.sh b/data/layout-scripts/reset.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/reset.sh
rename to data/layout-scripts/reset.sh
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/unity.sh b/data/layout-scripts/unity.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/unity.sh
rename to data/layout-scripts/unity.sh
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/win10.sh b/data/layout-scripts/win10.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/win10.sh
rename to data/layout-scripts/win10.sh
diff --git a/usr/lib/pika/gnome-layouts/layout-scripts/win11.sh b/data/layout-scripts/win11.sh
similarity index 100%
rename from usr/lib/pika/gnome-layouts/layout-scripts/win11.sh
rename to data/layout-scripts/win11.sh
diff --git a/data/polkit-1/actions/fkm.change.scx.policy b/data/polkit-1/actions/fkm.change.scx.policy
new file mode 100644
index 0000000..e8d1d49
--- /dev/null
+++ b/data/polkit-1/actions/fkm.change.scx.policy
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Authentication is required to change the SCX Scheduler
+ com.github.cosmicfusion.fedora-kernel-manager
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/lib/fedora-kernel-manager/scripts/change_scx.sh
+ true
+
+
+
\ No newline at end of file
diff --git a/data/polkit-1/actions/fkm.kernel.cachyos.init.policy b/data/polkit-1/actions/fkm.kernel.cachyos.init.policy
new file mode 100644
index 0000000..a0d8b34
--- /dev/null
+++ b/data/polkit-1/actions/fkm.kernel.cachyos.init.policy
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Authentication is required to initialize the Cachyos kernel repo
+ com.github.cosmicfusion.fedora-kernel-manager
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/lib/fedora-kernel-manager/scripts/kernel-cachyos-init.sh
+ true
+
+
+
\ No newline at end of file
diff --git a/data/polkit-1/actions/fkm.modify.package.policy b/data/polkit-1/actions/fkm.modify.package.policy
new file mode 100644
index 0000000..f40a4d8
--- /dev/null
+++ b/data/polkit-1/actions/fkm.modify.package.policy
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Authentication is required to modify system packages
+ com.github.cosmicfusion.fedora-kernel-manager
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/lib/fedora-kernel-manager/scripts/modify_package.sh
+ true
+
+
+
\ No newline at end of file
diff --git a/data/polkit-1/rules.d/99-fkm.kernel.cachyos.init.rules b/data/polkit-1/rules.d/99-fkm.kernel.cachyos.init.rules
new file mode 100644
index 0000000..9d3ffe1
--- /dev/null
+++ b/data/polkit-1/rules.d/99-fkm.kernel.cachyos.init.rules
@@ -0,0 +1,6 @@
+/* Allow passwordless auth for fkm.kernel.cachyos.init
+polkit.addRule(function(action, subject) {
+ if (action.id == "fkm.kernel.cachyos.init") {
+ return polkit.Result.YES;
+ }
+});
\ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index 4d76b91..2ab1ff5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+pika-gnome-layouts (4.0.0-100pika1) pika; urgency=low
+
+ * Port OS 4/Rust/GTK4/Libadwaita
+
+ -- Ward Nakchbandi Sat, 01 Oct 2022 14:50:00 +0200
+
pika-gnome-layouts (3.0-100pika2) pikauwu; urgency=low
* Refine UI
diff --git a/debian/control b/debian/control
index b55bdc6..d3d4ba8 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,15 @@ Section: misc
Priority: optional
Maintainer: Ward Nakchbandi
Standards-Version: 4.6.1
-Build-Depends: debhelper-compat (= 13)
+Build-Depends:
+ debhelper-compat (= 13),
+ build-essential,
+ debhelper,
+# cargo,
+ libadwaita-1-dev,
+ libgtk-4-dev,
+ desktop-file-utils,
+ make,
Package: pika-gnome-layouts
Architecture: all
diff --git a/debian/pika-gnome-layouts.postinst b/debian/pika-gnome-layouts.postinst
index 52075e6..aae74ef 100755
--- a/debian/pika-gnome-layouts.postinst
+++ b/debian/pika-gnome-layouts.postinst
@@ -1,2 +1,10 @@
-glib-compile-schemas /usr/share/glib-2.0/schemas/
+#!/bin/sh
+
+
+set -e
+
+ update-mime-database /usr/share/mime
+ update-desktop-database
+ glib-compile-schemas /usr/share/glib-2.0/schemas
+
diff --git a/debian/pika-gnome-layouts.postrm b/debian/pika-gnome-layouts.postrm
index 52075e6..aae74ef 100755
--- a/debian/pika-gnome-layouts.postrm
+++ b/debian/pika-gnome-layouts.postrm
@@ -1,2 +1,10 @@
-glib-compile-schemas /usr/share/glib-2.0/schemas/
+#!/bin/sh
+
+
+set -e
+
+ update-mime-database /usr/share/mime
+ update-desktop-database
+ glib-compile-schemas /usr/share/glib-2.0/schemas
+
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/blue.svg b/resources/accent-color-icons/blue.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/blue.svg
rename to resources/accent-color-icons/blue.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/gray.svg b/resources/accent-color-icons/gray.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/gray.svg
rename to resources/accent-color-icons/gray.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/green.svg b/resources/accent-color-icons/green.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/green.svg
rename to resources/accent-color-icons/green.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/orange.svg b/resources/accent-color-icons/orange.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/orange.svg
rename to resources/accent-color-icons/orange.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/pink.svg b/resources/accent-color-icons/pink.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/pink.svg
rename to resources/accent-color-icons/pink.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/purple.svg b/resources/accent-color-icons/purple.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/purple.svg
rename to resources/accent-color-icons/purple.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/red.svg b/resources/accent-color-icons/red.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/red.svg
rename to resources/accent-color-icons/red.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/teal.svg b/resources/accent-color-icons/teal.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/teal.svg
rename to resources/accent-color-icons/teal.svg
diff --git a/usr/lib/pika/gnome-layouts/accent-colors/yellow.svg b/resources/accent-color-icons/yellow.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/accent-colors/yellow.svg
rename to resources/accent-color-icons/yellow.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/win11.svg b/resources/previews/eleven.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/win11.svg
rename to resources/previews/eleven.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/gnome.svg b/resources/previews/gnome.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/gnome.svg
rename to resources/previews/gnome.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/gnome2.svg b/resources/previews/gnome2.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/gnome2.svg
rename to resources/previews/gnome2.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/macos.svg b/resources/previews/pineapple.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/macos.svg
rename to resources/previews/pineapple.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/win10.svg b/resources/previews/traditional.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/win10.svg
rename to resources/previews/traditional.svg
diff --git a/usr/lib/pika/gnome-layouts/previews/unity.svg b/resources/previews/unity.svg
similarity index 100%
rename from usr/lib/pika/gnome-layouts/previews/unity.svg
rename to resources/previews/unity.svg
diff --git a/resources/resources.gresource.xml b/resources/resources.gresource.xml
new file mode 100644
index 0000000..ea73474
--- /dev/null
+++ b/resources/resources.gresource.xml
@@ -0,0 +1,20 @@
+
+
+
+ accent-color-icons/blue.svg
+ accent-color-icons/gray.svg
+ accent-color-icons/green.svg
+ accent-color-icons/orange.svg
+ accent-color-icons/pink.svg
+ accent-color-icons/purple.svg
+ accent-color-icons/red.svg
+ accent-color-icons/teal.svg
+ accent-color-icons/yellow.svg
+ previews/gnome.svg
+ previews/gnome2.svg
+ previews/pineapple.svg
+ previews/unity.svg
+ previews/traditional.svg
+ previews/eleven.svg
+
+
diff --git a/src/build_ui.rs b/src/build_ui.rs
new file mode 100644
index 0000000..bf7c70a
--- /dev/null
+++ b/src/build_ui.rs
@@ -0,0 +1,81 @@
+use gtk::{gio as gio, glib as glib, prelude::*};
+use glib::clone;
+use crate::{content, config::{APP_ID, APP_ICON, APP_GITHUB, VERSION}};
+
+pub fn build_ui(app: &adw::Application) {
+ gtk::glib::set_prgname(Some(t!("app_name").to_string()));
+ glib::set_application_name(&t!("app_name").to_string());
+ let glib_settings = gio::Settings::new(APP_ID);
+
+ let window_headerbar = adw::HeaderBar::builder()
+ .title_widget(
+ &adw::WindowTitle::builder()
+ .title(t!("application_name"))
+ .build(),
+ )
+ .build();
+
+ let content_stack = gtk::Stack::builder()
+ .build();
+
+ content::content(&content_stack);
+
+ let window_toolbar = adw::ToolbarView::builder().content(&content_stack).build();
+
+ let window = adw::ApplicationWindow::builder()
+ .title(t!("app_name"))
+ .application(app)
+ .content(&window_toolbar)
+ .icon_name(APP_ICON)
+ .default_width(glib_settings.int("window-width"))
+ .default_height(glib_settings.int("window-height"))
+ .width_request(700)
+ .height_request(500)
+ .startup_id(APP_ID)
+ .build();
+
+ if glib_settings.boolean("is-maximized") == true {
+ window.maximize()
+ }
+
+ window_toolbar.add_top_bar(&window_headerbar);
+
+ window.connect_close_request(move |window| {
+ if let Some(application) = window.application() {
+ save_window_size(&window, &glib_settings);
+ application.remove_window(window);
+ }
+ glib::Propagation::Proceed
+ });
+
+ let credits_button = gtk::Button::builder()
+ .icon_name("dialog-information-symbolic")
+ .build();
+
+ let credits_window = adw::AboutWindow::builder()
+ .application_icon(APP_ICON)
+ .application_name(t!("application_name"))
+ .transient_for(&window)
+ .version(VERSION)
+ .hide_on_close(true)
+ .developer_name(t!("developer_name"))
+ .license_type(gtk::License::Mpl20)
+ .issue_url(APP_GITHUB.to_owned() + "/issues")
+ .build();
+
+ window_headerbar.pack_end(&credits_button);
+ credits_button.connect_clicked(
+ move |_|
+ credits_window.present()
+ );
+
+ window.present();
+}
+
+fn save_window_size(window: &adw::ApplicationWindow, glib_settings: &gio::Settings) {
+ let size = window.default_size();
+
+ let _ = glib_settings.set_int("window-width", size.0);
+ let _ = glib_settings.set_int("window-height", size.1);
+ let _ = glib_settings.set_boolean("is-maximized", window.is_maximized());
+}
\ No newline at end of file
diff --git a/src/config.rs b/src/config.rs
new file mode 100644
index 0000000..a194a26
--- /dev/null
+++ b/src/config.rs
@@ -0,0 +1,4 @@
+pub const APP_ID: &str = "com.github.pikaos-linux.pikagnomelayouts";
+pub const VERSION: &str = env!("CARGO_PKG_VERSION");
+pub const APP_ICON: &str = "com.github.pikaos-linux.pikagnomelayouts";
+pub const APP_GITHUB: &str = "https://git.pika-os.com/gnome-packages/pika-gnome-layouts";
\ No newline at end of file
diff --git a/src/content/mod.rs b/src/content/mod.rs
new file mode 100644
index 0000000..c70477e
--- /dev/null
+++ b/src/content/mod.rs
@@ -0,0 +1,64 @@
+use gtk::prelude::*;
+
+struct DesktopLayout {
+ name: String,
+ id: i32,
+}
+
+pub fn content(
+ content_stack: >k::Stack,
+) {
+ let content_box = gtk::Box::builder()
+ .orientation(gtk::Orientation::Vertical)
+ .vexpand(true)
+ .hexpand(true)
+ .build();
+
+ let desktop_layouts = [
+ &DesktopLayout {
+ name: "gnome".to_string(),
+ id: 0
+ },
+ &DesktopLayout {
+ name: "traditional".to_string(),
+ id: 0
+ },
+ &DesktopLayout {
+ name: "eleven".to_string(),
+ id: 0
+ },
+ &DesktopLayout {
+ name: "pineapple".to_string(),
+ id: 0
+ },
+ &DesktopLayout {
+ name: "gnome2".to_string(),
+ id: 0
+ },
+ &DesktopLayout {
+ name: "unity".to_string(),
+ id: 0
+ },
+ ];
+
+ let null_checkbutton = gtk::CheckButton::builder()
+ .build();
+
+ for layout in desktop_layouts {
+ let layout_name = layout.name.clone();
+ let layout_id = layout.id;
+
+ let layout_box = gtk::Box::builder()
+ .orientation(gtk::Orientation::Horizontal)
+ .build();
+ let layout_preview = gtk::Image::builder()
+ .resource(format!("/com/github/pikaos-linux/pikagnomelayouts/previews/{}.svg", &layout_name))
+ .build();
+ content_box.append(&layout_preview);
+ }
+
+ content_stack.add_named(
+ &content_box,
+ Some("content_page"),
+ );
+}
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..fc24b6e
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,51 @@
+mod config;
+mod build_ui;
+mod content;
+
+use std::env;
+use gtk::{gio,gdk,CssProvider,prelude::*, glib as glib};
+use config::APP_ID;
+
+use crate::gdk::Display;
+
+#[macro_use]
+extern crate rust_i18n;
+i18n!("locales", fallback = "en_US");
+
+fn main() -> glib::ExitCode {
+ let current_locale = match env::var_os("LANG") {
+ Some(v) => v.into_string().unwrap().chars()
+ .take_while(|&ch| ch != '.')
+ .collect::(),
+ None => panic!("$LANG is not set"),
+ };
+ rust_i18n::set_locale(¤t_locale);
+
+ let app = adw::Application::builder().application_id(APP_ID).build();
+
+ app.connect_startup(|app| {
+ load_gresource();
+ load_css();
+ app.connect_activate(build_ui::build_ui);
+ });
+
+ // Run the application
+ app.run()
+}
+
+fn load_gresource() {
+ gio::resources_register_include!("resources.gresource").expect("Failed to register resources.");
+}
+
+fn load_css() {
+ // Load the CSS file and add it to the provider
+ /*let provider = CssProvider::new();
+ provider.load_from_resource("/com/github/cosmicfusion/fedora-kernel-manager/css/style.css");
+
+ // Add the provider to the default screen
+ gtk::style_context_add_provider_for_display(
+ &Display::default().expect("Could not connect to a display."),
+ &provider,
+ gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
+ );*/
+}
diff --git a/usr/bin/pika-gnome-layouts b/usr/bin/pika-gnome-layouts
deleted file mode 100755
index 864a7ca..0000000
--- a/usr/bin/pika-gnome-layouts
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /bin/bash
-if echo $XDG_SESSION_DESKTOP | grep -i ubuntu
-then
- python3 /usr/lib/pika/gnome-layouts/main.py
-else
- zenity --error --text="current session isn't gnome"
-fi
diff --git a/usr/lib/pika/gnome-layouts/all.sh b/usr/lib/pika/gnome-layouts/all.sh
deleted file mode 100755
index f1d1b38..0000000
--- a/usr/lib/pika/gnome-layouts/all.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#! /bin/bash
-export ALL=True
-
-for f in /etc/nobara/scripts/nobara-layouts/settings-scripts/*.sh; do
- bash "$f" enable
-done
-
-export RELOG_NEEDED=1
-
-/etc/nobara/scripts/nobara-layouts/reload.sh
diff --git a/usr/lib/pika/gnome-layouts/dconf-accent.sh b/usr/lib/pika/gnome-layouts/dconf-accent.sh
deleted file mode 100755
index 69d92cf..0000000
--- a/usr/lib/pika/gnome-layouts/dconf-accent.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /usr/bin/bash
-gnome-extensions enable user-theme@gnome-shell-extensions.gcampax.github.com
-if [[ $1 == Teal ]]
-then
- if dconf read /org/gnome/desktop/interface/color-scheme | grep dark
- then
- gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ScreenTransition' & gsettings set org.gnome.shell.extensions.user-theme name "Jasper-Dark" && gsettings set org.gnome.desktop.interface gtk-theme "Jasper-Dark" && cp -rfv "/usr/share/themes/Jasper-Dark"/gtk-4.0 "$HOME"/.config/
-
- else
- gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ScreenTransition' & gsettings set org.gnome.shell.extensions.user-theme name "Jasper-Light" && gsettings set org.gnome.desktop.interface gtk-theme "Jasper-Light" && cp -rfv "/usr/share/themes/Jasper-Light"/gtk-4.0 "$HOME"/.config/
- fi
-else
- if dconf read /org/gnome/desktop/interface/color-scheme | grep dark
- then
- gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ScreenTransition' & gsettings set org.gnome.shell.extensions.user-theme name "Jasper-$1-Dark" && gsettings set org.gnome.desktop.interface gtk-theme "Jasper-$1-Dark" && cp -rfv "/usr/share/themes/Jasper-$1-Dark"/gtk-4.0 "$HOME"/.config/
- else
- gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ScreenTransition' & gsettings set org.gnome.shell.extensions.user-theme name "Jasper-$1-Light" && gsettings set org.gnome.desktop.interface gtk-theme "Jasper-$1-Light" && cp -rfv "/usr/share/themes/Jasper-$1-Light"/gtk-4.0 "$HOME"/.config/
- fi
-fi
diff --git a/usr/lib/pika/gnome-layouts/main.py b/usr/lib/pika/gnome-layouts/main.py
deleted file mode 100644
index 6c2da44..0000000
--- a/usr/lib/pika/gnome-layouts/main.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import gi
-gi.require_version("Gtk", "3.0")
-from gi.repository import Gtk, Gio
-import subprocess
-import os
-import os.path
-from pathlib import Path
-
-import time
-import threading
-
-class Application:
-
- ### MAIN WINDOW ###
- def __init__(self):
- self.column_names = False
- self.drop_nan = False
- self.df = None
- application_id="org.pika.layouts"
-
- self.builder = Gtk.Builder()
- self.builder.add_from_file("/usr/lib/pika/gnome-layouts/main.ui")
- self.builder.connect_signals(self)
- win = self.builder.get_object("main_window")
-
-
- ### Enable Extensions
-
- subprocess.run(["gsettings set org.gnome.shell disable-user-extensions false"], shell=True, stdout=subprocess.DEVNULL)
-
- accent_box = self.builder.get_object("accent_box")
-
- accent_output = subprocess.run(["dconf read /org/pika/layouts/pika-theme | grep 1"], shell=True)
-
- if (accent_output.returncode) != 0:
- accent_box.hide()
-
- ### Window props ###
-
- win.connect("destroy", Gtk.main_quit)
-
- self.window = self.builder.get_object("main_window")
- self.window.show()
-
- settings = Gio.Settings.new("org.pika.layouts")
-
-
- ### Themes
- def on_pika_theme_button_pressed(self, widget):
- accent_box = self.builder.get_object("accent_box")
- subprocess.run(["/usr/lib/pika/gnome-layouts/theme.sh pika"], shell=True)
- accent_box.show()
- def on_gnome_theme_button_pressed(self, widget):
- accent_box = self.builder.get_object("accent_box")
- subprocess.run(["/usr/lib/pika/gnome-layouts/theme.sh gnome"], shell=True)
- accent_box.hide()
-
-
- if settings.get_int("layout-num") == 1:
- win10toggle = self.builder.get_object("win10_button")
- win10toggle.set_active(True)
-
- if settings.get_int("layout-num") == 2:
- win11toggle = self.builder.get_object("win11_button")
- win11toggle.set_active(True)
-
- if settings.get_int("layout-num") == 3:
- gnometoggle = self.builder.get_object("gnome_button")
- gnometoggle.set_active(True)
-
- if settings.get_int("layout-num") == 4:
- macostoggle = self.builder.get_object("macos_button")
- macostoggle.set_active(True)
- if settings.get_int("layout-num") == 5:
- macostoggle = self.builder.get_object("gnome2_button")
- macostoggle.set_active(True)
- if settings.get_int("layout-num") == 6:
- macostoggle = self.builder.get_object("unity_button")
- macostoggle.set_active(True)
-
- ### Layouts ###
-
- def on_win10_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 1)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/win10.sh"], shell=True)
-
- def on_win11_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 2)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/win11.sh"], shell=True)
- def on_gnome_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 3)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/reset.sh"], shell=True)
- def on_macos_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 4)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/macos.sh"], shell=True)
- def on_gnome2_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 5)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/gnome2.sh"], shell=True)
- def on_unity_button_pressed(self, widget):
- settings = Gio.Settings.new("org.pika.layouts")
- settings.set_int("layout-num", 6)
- subprocess.run(["/usr/lib/pika/gnome-layouts/layout-scripts/unity.sh"], shell=True)
- ### Settings ###
-
- ### Accent Colors
-
- def blue_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Blue"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C blue"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def green_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Green"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C green"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def yellow_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Yellow"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C yellow"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def orange_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Orange"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C orange"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def red_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Red"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C red"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def pink_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Pink"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C pink"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def purple_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Purple"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C violet"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def teal_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Teal"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C teal"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
- def gray_accent_button_pressed_cb (self, widget):
- subprocess.run(["/usr/lib/pika/gnome-layouts/dconf-accent.sh Grey"], shell=True)
- subprocess.run(["pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C grey"], shell=True)
- subprocess.run(["echo 'theme change done!'"], shell=True)
-
-Application()
-Gtk.main()
diff --git a/usr/lib/pika/gnome-layouts/main.ui b/usr/lib/pika/gnome-layouts/main.ui
deleted file mode 100644
index 20e0cde..0000000
--- a/usr/lib/pika/gnome-layouts/main.ui
+++ /dev/null
@@ -1,835 +0,0 @@
-
-
-
-
-
-
-
diff --git a/usr/lib/pika/gnome-layouts/papirus-folders b/usr/lib/pika/gnome-layouts/papirus-folders
deleted file mode 100755
index 223babd..0000000
--- a/usr/lib/pika/gnome-layouts/papirus-folders
+++ /dev/null
@@ -1,533 +0,0 @@
-#!/usr/bin/env bash
-# This script allows changing the color of folders in Papirus icon theme
-#
-# @author: Sergei Eremenko (https://github.com/SmartFinn)
-# @license: MIT license (MIT)
-# @link: https://github.com/PapirusDevelopmentTeam/papirus-folders
-
-if test -z "$BASH_VERSION"; then
- printf "Error: this script only works in bash.\n" >&2
- exit 1
-fi
-
-if (( BASH_VERSINFO[0] * 10 + BASH_VERSINFO[1] < 40 )); then
- printf "Error: this script requires bash version >= 4.0\n" >&2
- exit 1
-fi
-
-# set -x # Uncomment to debug this shell script
-set -o errexit \
- -o noclobber \
- -o pipefail
-
-readonly THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
-readonly PROGNAME="$(basename "${BASH_SOURCE[0]}")"
-readonly VERSION="1.12.0"
-readonly -a ARGS=("$@")
-
-msg() {
- printf "%s: %b\n" "$PROGNAME" "$*"
-}
-
-verbose() {
- [ -t 4 ] || return 0
- msg "$@" >&4
-}
-
-err() {
- msg "Error:" "$*" >&2
-}
-
-_exit() {
- msg "$*" "Exiting ..."
- exit 0
-}
-
-fatal() {
- err "$*"
- exit 1
-}
-
-usage() {
- cat <<- EOF
- USAGE
- $ $PROGNAME [options] -t {-C --color}
- $ $PROGNAME [options] -t {-D --default}
- $ $PROGNAME [options] -t {-R --restore}
- OPERATIONS
- -C --color change color of folders
- -D --default back to the default color
- -R --restore restore the last used color from the config file
- OPTIONS
- -l --list show available colors
- -o --once do not save the changes to the config file
- -t --theme make changes to the specified theme (Default: Papirus)
- -u --update-caches update icon caches for Papirus and siblings
- -V --version print $PROGNAME version and exit
- -v --verbose be verbose
- -h --help show this help
- EOF
-
- exit "${1:-0}"
-}
-
-_is_root_user() {
- if [ "$(id -u)" -eq 0 ]; then
- return 0
- fi
-
- return 1
-}
-
-_is_user_dir() {
- [ -n "$USER_HOME" ] || return 1
-
- # if $THEME_DIR is placed in home dir
- if [ -z "${THEME_DIR##"$USER_HOME"/*}" ]; then
- return 0
- fi
-
- return 1
-}
-
-_is_writable() {
- if [ -w "$THEME_DIR/48x48/places/folder.svg" ]; then
- return 0
- fi
-
- return 1
-}
-
-_is_valid_color() {
- local color="$1"
-
- eval "$(declare_colors)"
-
- for i in "${colors[@]}"; do
- [ "$i" == "$color" ] || continue
- return 0
- done
-
- return 1
-}
-
-declare_colors() {
- local color=''
- local -a colors=()
- local -a valid_colors=("adwaita" "black" "blue" "bluegrey" "breeze" "brown"
- "carmine" "cyan" "darkcyan" "deeporange" "green" "grey"
- "indigo" "magenta" "nordic" "orange" "palebrown" "paleorange"
- "pink" "purple" "red" "teal" "violet" "white" "yaru" "yellow")
-
- for color in "${valid_colors[@]}"; do
- if [ -e "$THEME_DIR/48x48/places/folder-$color.svg" ]; then
- colors=( "${colors[@]}" "$color" )
- fi
- done
-
- # return array of colors
- declare -p colors
-}
-
-declare_current_color() {
- local icon_file icon_name current_color=''
-
- icon_file=$(readlink -f "$THEME_DIR/48x48/places/folder.svg")
- icon_name=$(basename "$icon_file" .svg)
- current_color="${icon_name##*-}"
-
- declare -p current_color
-}
-
-get_theme_dir() {
- local data_dir icons_dir
- local -a data_dirs=()
- local -a icons_dirs=(
- "$USER_HOME/.icons"
- "${XDG_DATA_HOME:-$USER_HOME/.local/share}/icons"
- )
-
- # Get data directories from XDG_DATA_DIRS variable and
- # convert colon-separated list into bash array
- IFS=: read -ra data_dirs <<< "${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
-
- for data_dir in "${data_dirs[@]}"; do
- [ -d "$data_dir/icons" ] || continue
- icons_dirs=( "${icons_dirs[@]}" "${data_dir%/}/icons" )
- done
-
- for icons_dir in "${icons_dirs[@]}"; do
- [ -f "$icons_dir/$THEME_NAME/index.theme" ] || continue
- printf '%s' "$icons_dir/$THEME_NAME"
- verbose "'$THEME_NAME' is found in '$icons_dir'."
- return 0
- done
-
- return 1
-}
-
-get_real_user() {
- # return name of the user that runs the script
- local user=''
-
- if [ -n "$PKEXEC_UID" ]; then
- user="$(id -nu "$PKEXEC_UID")"
- elif [ -n "$SUDO_USER" ]; then
- user="$SUDO_USER"
- else
- user="$(id -nu)"
- fi
-
- printf '%s' "$user"
-}
-
-get_user_home() {
- local user="$1"
-
- getent passwd "$user" | awk -F: '{print $(NF-1)}'
-}
-
-config() {
- # usage: config [{-n --new}] {-s --set} key=value... | {-g --get} key...
- local config_dir
- local config_file
-
- if _is_user_dir; then
- config_dir="${XDG_CONFIG_HOME:-$USER_HOME/.config}/$PROGNAME"
- else
- config_dir="/var/lib/$PROGNAME"
- fi
-
- config_file="$config_dir/keep"
-
- while (( "$#" )); do
- case "$1" in
- -g|--get) shift;
- [ -f "$config_file" ] || return 1
-
- for key; do
- [ -n "$key" ] || continue
- awk -F= -v key="$key" '
- $1 == key {
- print $2
- exit
- }
- ' "$config_file"
- done
-
- break
- ;;
- -n|--new) shift;
- rm -f "$config_file"
- ;;
- -e|--exists) shift;
- # return 1 if test config_file not exist or empty
- if [ -f "$config_file" ] && [ -s "$config_file" ]; then
- return 0
- else
- return 1
- fi
- ;;
- -s|--set) shift;
- [ "$ONCE" -eq "1" ] && break
- [ -d "$config_dir" ] || mkdir -p "$config_dir"
- [ -f "$config_file" ] || touch "$config_file"
-
- verbose "Saving params to '$config_file' ..."
- cat >> "$config_file" <<- EOF
- $(for key_value; do echo "$key_value"; done)
- EOF
-
- break
- ;;
- *)
- err "illegal option -- '$1'"
- return 1
- esac
- done
-
- return 0
-}
-
-change_color() {
- local color="${1:?${FUNCNAME[-1]}: color is not set}"
- local size prefix file_path file_name symlink_path
- local -a sizes=(22x22 24x24 32x32 48x48 64x64)
- local -a prefixes=("folder-$color" "user-$color")
-
- for size in "${sizes[@]}"; do
- for prefix in "${prefixes[@]}"; do
- for file_path in "$THEME_DIR/$size/places/$prefix"{-*,}.svg; do
- [ -f "$file_path" ] || continue # is a file
- [ -L "$file_path" ] && continue # is not a symlink
-
- file_name="${file_path##*/}"
- symlink_path="${file_path/-$color/}" # remove color suffix
-
- ln -sf "$file_name" "$symlink_path" || {
- fatal "Fail to create '$symlink_path' symlink"
- }
- done
- done
- done
-}
-
-list_colors() {
- local color='' prefix=''
-
- eval "$(declare_colors)"
- eval "$(declare_current_color)"
-
- for color in "${colors[@]}"; do
- if [ "$current_color" == "$color" ]; then
- prefix='>'
- else
- prefix=''
- fi
-
- printf '%2s %s\n' "$prefix" "$color"
- done
-}
-
-do_change_color() {
- _is_valid_color "$SELECTED_COLOR" || {
- fatal "Unable to find '$SELECTED_COLOR' color in '$THEME_NAME'"
- }
-
- verify_privileges
-
- msg "Changing color of folders to '$SELECTED_COLOR' for '$THEME_NAME' ..."
- change_color "$SELECTED_COLOR"
- config --new --set "theme=$THEME_NAME" "color=$SELECTED_COLOR"
- update_icon_cache
-}
-
-do_revert_default() {
- verify_privileges
-
- msg "Restoring default folder color for '$THEME_NAME' ..."
- change_color "${DEFAULT_COLORS[$THEME_NAME]:-blue}"
- config --new
- update_icon_cache
-}
-
-do_restore_color() {
- local saved_color=''
-
- if config --exists; then
- THEME_NAME="$(config --get theme)"
- saved_color="$(config --get color)"
- else
- _exit "Unable to find config file."
- fi
-
- THEME_DIR="$(get_theme_dir)" || {
- _exit "Unable to find '$THEME_NAME' icon theme."
- }
-
- _is_valid_color "$saved_color" || {
- _exit "Unable to find '$saved_color' color in '$THEME_NAME'."
- }
-
- verify_privileges
-
- change_color "$saved_color"
- msg "'$saved_color' color of the folders has been restored."
-}
-
-delete_icon_caches() {
- local icon_cache real_user='' real_home=''
-
- real_user="$(get_real_user)"
- real_home="$(get_user_home "$real_user")"
-
- declare -a icon_caches=(
- # KDE 5 icon caches
- "$real_home/.cache/icon-cache.kcache"
- "/var/tmp/kdecache-$real_user/icon-cache.kcache"
- )
-
- verbose "Deleting icon caches ..."
- for icon_cache in "${icon_caches[@]}"; do
- [ -e "$icon_cache" ] || continue
- rm -f "$icon_cache"
- done
-}
-
-update_icon_cache() {
- [ -z "$DISABLE_UPDATE_ICON_CACHE" ] || return 0
-
- delete_icon_caches
-
- verbose "Rebuilding icon cache for '$THEME_NAME' ..."
- gtk-update-icon-cache -qf "$THEME_DIR" || true
-}
-
-update_icon_caches() {
- local theme=''
-
- delete_icon_caches
-
- for theme in "${!DEFAULT_COLORS[@]}"; do
- [ -f "$THEME_DIR/../$theme/index.theme" ] || continue
- verbose "Rebuilding icon cache for '$theme' ..."
- gtk-update-icon-cache -qf "$THEME_DIR/../$theme" || true
- done
-}
-
-verify_privileges() {
- _is_root_user && return 0
- _is_user_dir && return 0
- _is_writable && return 0
-
- verbose "This operation requires root privileges."
-
- if command -v sudo > /dev/null; then
- exec sudo USER_HOME="$USER_HOME" XDG_DATA_DIRS="$XDG_DATA_DIRS" \
- "$THIS_SCRIPT" "${ARGS[@]}"
- else
- fatal "You need to be root to run this command."
- fi
-}
-
-parse_args() {
- local arg='' opt=''
- local -a args=()
-
- # Show help if no argument is passed
- if [ -z "$1" ]; then
- usage 2
- fi
-
- # Translate --gnu-long-options to -g (short options)
- for arg; do
- case "$arg" in
- --help) args+=( -h ) ;;
- --list) args+=( -l ) ;;
- --once) args+=( -o ) ;;
- --theme) args+=( -t ) ;;
- --update-caches) args+=( -u ) ;;
- --verbose) args+=( -v ) ;;
- --color|--colour) args+=( -C ) ;;
- --default) args+=( -D ) ;;
- --restore) args+=( -R ) ;;
- --version) args+=( -V ) ;;
- --[0-9a-Z]*)
- err "illegal option -- '$arg'"
- usage 2
- ;;
- *) args+=("$arg")
- esac
- done
-
- # Reset the positional parameters to the short options
- set -- "${args[@]}"
-
- while getopts ":C:DRlot:uvVh" opt; do
- case "$opt" in
- C ) OPERATIONS+=("change-color")
- SELECTED_COLOR="$OPTARG"
- ;;
- D ) OPERATIONS+=("revert-default") ;;
- R ) OPERATIONS+=("restore-color") ;;
- l ) OPERATIONS+=("list-colors") ;;
- o ) ONCE=1 ;;
- t ) THEME_NAME="$OPTARG" ;;
- u ) OPERATIONS+=("update-icon-caches") ;;
- v ) VERBOSE=1 ;;
- V ) printf "%s %s\n" "$PROGNAME" "$VERSION"
- exit 0
- ;;
- h ) usage 0 ;;
- : ) err "option requires an argument -- '-$OPTARG'"
- usage 2
- ;;
- \?) err "illegal option -- '-$OPTARG'"
- usage 2
- ;;
- esac
- done
-
- shift $((OPTIND-1))
-
- # Return an error if any positional parameters are found
- if [ -n "$1" ]; then
- err "illegal parameter -- '$1'"
- usage 2
- fi
-}
-
-main() {
- # default values of options
- declare THEME_NAME="${THEME_NAME:-Papirus}"
- declare -i VERBOSE="${VERBOSE:-0}"
- declare -i ONCE="${ONCE:-0}"
- declare -A DEFAULT_COLORS=(
- ['ePapirus']='blue'
- ['Papirus']='blue'
- ['Papirus-Dark']='blue'
- )
-
- declare SELECTED_COLOR=''
- declare -a OPERATIONS=()
-
- parse_args "${ARGS[@]}"
-
- if [ "$VERBOSE" -eq "1" ]; then
- # open a file descriptor for verbose messages
- exec 4>&1
- # close the file descriptor before exiting
- trap 'exec 4>&-' EXIT HUP INT TERM
- fi
-
- # set USER_HOME variable instead HOME to prevent changing user's icons
- # when running with sudo
- [ -n "$USER_HOME" ] || USER_HOME="$(get_user_home "$(id -nu)")"
-
- if [ -f "$THEME_NAME/index.theme" ]; then
- # THEME_NAME is a path to an icon theme
- THEME_DIR="$(readlink -f "$THEME_NAME")"
- THEME_NAME="$(basename "$THEME_DIR")"
- verbose "The path to '$THEME_DIR' theme is specified."
- else
- THEME_DIR="$(get_theme_dir)" || {
- fatal "Fail to find '$THEME_NAME' icon theme."
- }
- fi
-
- for operation in "${OPERATIONS[@]}"; do
- case "$operation" in
- change-color)
- do_change_color
- ;;
- revert-default)
- do_revert_default
- ;;
- restore-color)
- do_restore_color
- ;;
- list-colors)
- if [ -t 1 ]; then
- cat <<- EOF
- List of available colors:
- $(list_colors)
- EOF
- else
- list_colors
- fi
- ;;
- update-icon-caches)
- verify_privileges
- update_icon_caches
- ;;
- esac
- done
-
- verbose "Done!"
-
- exit 0
-}
-
-main
-
-exit 1
diff --git a/usr/lib/pika/gnome-layouts/previews/gnome-theme.png b/usr/lib/pika/gnome-layouts/previews/gnome-theme.png
deleted file mode 100644
index 942732b..0000000
Binary files a/usr/lib/pika/gnome-layouts/previews/gnome-theme.png and /dev/null differ
diff --git a/usr/lib/pika/gnome-layouts/previews/pika-theme.png b/usr/lib/pika/gnome-layouts/previews/pika-theme.png
deleted file mode 100644
index 237a25e..0000000
Binary files a/usr/lib/pika/gnome-layouts/previews/pika-theme.png and /dev/null differ
diff --git a/usr/lib/pika/gnome-layouts/reload.sh b/usr/lib/pika/gnome-layouts/reload.sh
deleted file mode 100755
index bb04cb8..0000000
--- a/usr/lib/pika/gnome-layouts/reload.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#! /bin/bash
-
- if [[ "$RELOG_NEEDED" == 1 ]]; then
- if zenity --question --text="New extensions have been installed!, reload required!"
- then
- gnome-session-quit --force --no-prompt
- fi
- fi
diff --git a/usr/lib/pika/gnome-layouts/theme.sh b/usr/lib/pika/gnome-layouts/theme.sh
deleted file mode 100755
index 6d6dc3d..0000000
--- a/usr/lib/pika/gnome-layouts/theme.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /bin/bash
-rm -rfv $HOME/.config/gtk-4.0
-
-if [[ $1 == pika ]]
-then
-dconf write /org/pika/layouts/pika-theme 1
-gnome-extensions enable user-theme@gnome-shell-extensions.gcampax.github.com
-dconf write /org/gnome/desktop/wm/preferences/titlebar-font "'Ubuntu Bold 11'"
-dconf write /org/gnome/desktop/sound/theme-name "'pika'"
-dconf write /org/gnome/desktop/interface/icon-theme "'Papirus'"
-dconf write /org/gnome/desktop/interface/monospace-font-name "'Ubuntu Mono 13'"
-dconf write /org/gnome/desktop/interface/document-font-name "'Sans 11'"
-dconf write /org/gnome/desktop/interface/font-name "'Ubuntu 11'"
-dconf write /org/gnome/desktop/interface/gtk-theme "'Jasper-Yellow-Dark'"
-dconf write /org/gnome/shell/extensions/user-theme/name "'Jasper-Yellow-Dark'"
-echo '#! /bin/bash' > $HOME/.config/pika_theme || touch $HOME/.config/pika_theme && echo '#! /bin/bash' > $HOME/.config/pika_theme
-echo 'KVANTUM_THEME_DARK=Orchis-dark#' >> $HOME/.config/pika_theme
-echo 'KVANTUM_THEME_LIGHT=Orchis#' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_DARK=$(dconf read /org/gnome/desktop/interface/gtk-theme | 'sed \"s+\'++\"' | 'sed \"s+\'++\"' | 'sed \"s+-Dark++\"' | 'sed \"s+-Light++\"')'-Dark >> $HOME/.config/pika_theme
-echo 'GTK_THEME_LIGHT=$(dconf read /org/gnome/desktop/interface/gtk-theme | 'sed \"s+\'++\"' | 'sed \"s+\'++\"' | 'sed \"s+-Dark++\"' | 'sed \"s+-Light++\"')'-Light >> $HOME/.config/pika_theme
-echo 'GTK_THEME_PATH_DARK=/usr/share/themes/$GTK_THEME_DARK' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_PATH_LIGHT=/usr/share/themes/GTK_THEME_LIGHT' >> $HOME/.config/pika_theme
-dconf write /org/gnome/desktop/interface/color-scheme "'prefer-dark'"
-pika-gnome-theme dark
-pkexec /usr/lib/pika/gnome-layouts/papirus-folders -u -C yellow
- if dconf read /org/gnome/desktop/interface/color-scheme | grep dark
- then
- pika-gnome-theme dark
- else
- pika-gnome-theme
- fi
-fi
-
-if [[ $1 == gnome ]]
-then
-dconf write /org/pika/layouts/pika-theme 0
-dconf write /org/gnome/shell/extensions/user-theme/name "''"
-dconf write /org/gnome/desktop/wm/preferences/titlebar-font "'Cantarell Bold 11'"
-dconf write /org/gnome/desktop/sound/theme-name "'freedesktop'"
-dconf write /org/gnome/desktop/interface/icon-theme "'Adwaita'"
-dconf write /org/gnome/desktop/interface/monospace-font-name "'Monospace 11'"
-dconf write /org/gnome/desktop/interface/document-font-name "'Sans 11'"
-dconf write /org/gnome/desktop/interface/font-name "'Cantarell 11'"
-dconf write /org/gnome/shell/extensions/nightthemeswitcher/commands/enabled false
-dconf write /org/gnome/shell/extensions/nightthemeswitcher/gtk-variants/day "'adw-gtk3'"
-dconf write /org/gnome/shell/extensions/nightthemeswitcher/gtk-variants/night "'adw-gtk3-dark'"
-dconf write /org/gnome/shell/extensions/nightthemeswitcher/shell-variants/day "''"
-dconf write /org/gnome/shell/extensions/nightthemeswitcher/shell-variants/night "''"
-echo '#! /bin/bash' > $HOME/.config/pika_theme || touch $HOME/.config/pika_theme && echo '#! /bin/bash' > $HOME/.config/pika_theme
-echo 'KVANTUM_THEME_DARK=' >> $HOME/.config/pika_theme
-echo 'KVANTUM_THEME_LIGHT=' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_DARK=' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_LIGHT=' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_PATH_DARK=' >> $HOME/.config/pika_theme
-echo 'GTK_THEME_PATH_LIGHT=' >> $HOME/.config/pika_theme
-fi
diff --git a/usr/share/glib-2.0/schemas/org.pika.layouts.gschema.xml b/usr/share/glib-2.0/schemas/org.pika.layouts.gschema.xml
deleted file mode 100644
index 31d763b..0000000
--- a/usr/share/glib-2.0/schemas/org.pika.layouts.gschema.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- 3
- What layout is selected.
-
- What layout is selected.
-
-
-
- 1
- What Theme is being used.
-
- What Theme is being used.
-
-
-
-