push sheeet
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s

This commit is contained in:
Dark Steveneq
2025-10-09 14:15:47 +02:00
commit 646b892680
49168 changed files with 5897842 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
{ lib, pkgs }:
lib.makeScope pkgs.newScope (
self: with self; {
#### CORE EFL
efl = callPackage ./efl { };
#### WINDOW MANAGER
enlightenment = callPackage ./enlightenment { };
#### APPLICATIONS
econnman = callPackage ./econnman { };
ecrire = callPackage ./ecrire { };
ephoto = callPackage ./ephoto { };
evisum = callPackage ./evisum { };
rage = callPackage ./rage { };
terminology = callPackage ./terminology { };
}
)

View File

@@ -0,0 +1,57 @@
{
lib,
stdenv,
fetchurl,
makeWrapper,
pkg-config,
dbus,
efl,
python3Packages,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "econnman";
version = "1.1";
src = fetchurl {
url = "http://download.enlightenment.org/rel/apps/econnman/${pname}-${version}.tar.xz";
sha256 = "sha256-DM6HaB+ufKcPHmPP4K5l/fF7wzRycFQxfiXjiXYZ7YU=";
};
nativeBuildInputs = [
makeWrapper
pkg-config
python3Packages.wrapPython
];
buildInputs = [
dbus
efl
python3Packages.python
];
pythonPath = [
python3Packages.dbus-python
python3Packages.pythonefl
];
postInstall = ''
wrapPythonPrograms
'';
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "User interface for the connman network connection manager";
mainProgram = "econnman-bin";
homepage = "https://enlightenment.org/";
license = licenses.lgpl3;
platforms = platforms.linux;
maintainers = with lib.maintainers; [
matejc
ftrvxmtrx
];
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,41 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
efl,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "ecrire";
version = "0.2.0";
src = fetchurl {
url = "http://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "1pszk583rzclfqy3dyjh1m9pz1hnr84vqz8vw9kngcnmj23mjr6r";
};
nativeBuildInputs = [
meson
ninja
pkg-config
];
buildInputs = [
efl
];
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "EFL simple text editor";
mainProgram = "ecrire";
homepage = "https://www.enlightenment.org/";
license = licenses.gpl3Only;
platforms = platforms.linux;
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,229 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
SDL2,
alsa-lib,
bullet,
check,
curl,
dbus,
doxygen,
expat,
fontconfig,
freetype,
fribidi,
ghostscript,
giflib,
glib,
gst_all_1,
gtk3,
harfbuzz,
hicolor-icon-theme,
ibus,
jbig2dec,
libGL,
libdrm,
libgbm,
libinput,
libjpeg,
libpng,
libpulseaudio,
libraw,
librsvg,
libsndfile,
libspectre,
libtiff,
libwebp,
libxkbcommon,
lua,
lz4,
mesa-gl-headers,
mint-x-icons,
openjpeg,
openssl,
poppler,
systemd,
udev,
util-linux,
wayland,
wayland-protocols,
wayland-scanner,
writeText,
xorg,
zlib,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "efl";
version = "1.28.1";
src = fetchurl {
url = "http://download.enlightenment.org/rel/libs/${pname}/${pname}-${version}.tar.xz";
sha256 = "sha256-hM9hRfnMgr//aQAFviQ5LI88UvjgD/BNjuo3FCnAlCQ=";
};
nativeBuildInputs = [
meson
ninja
gtk3
pkg-config
check
wayland-scanner
];
buildInputs = [
fontconfig
freetype
giflib
glib
gst_all_1.gst-libav
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
gst_all_1.gstreamer
ibus
libGL
libpng
libpulseaudio
libsndfile
libtiff
lz4
mesa-gl-headers
openssl
systemd
udev
wayland-protocols
xorg.libX11
xorg.libXcursor
xorg.xorgproto
zlib
# still missing parent icon themes: RAVE-X, Faenza
];
propagatedBuildInputs = [
SDL2
alsa-lib
bullet
curl
dbus
dbus
doxygen
expat
fribidi
ghostscript
harfbuzz
hicolor-icon-theme # for the icon theme
jbig2dec
libdrm
libgbm
libinput
libjpeg
libraw
librsvg
libspectre
libwebp
libxkbcommon
lua
mint-x-icons # Mint-X is a parent icon theme of Enlightenment-X
openjpeg
poppler
util-linux
wayland
xorg.libXScrnSaver
xorg.libXcomposite
xorg.libXdamage
xorg.libXext
xorg.libXfixes
xorg.libXi
xorg.libXinerama
xorg.libXrandr
xorg.libXrender
xorg.libXtst
xorg.libxcb
];
dontDropIconThemeCache = true;
mesonFlags = [
"--buildtype=release"
"-D build-tests=false" # disable build tests, which are not working
"-D ecore-imf-loaders-disabler=ibus,scim" # ibus is disabled by default, scim is not available in nixpkgs
"-D embedded-lz4=false"
"-D fb=true"
"-D network-backend=connman"
"-D sdl=true"
"-D elua=true"
"-D bindings=lua,cxx"
# for wayland client support
"-D wl=true"
"-D drm=true"
];
patches = [
./efl-elua.patch
];
postPatch = ''
patchShebangs src/lib/elementary/config_embed
# fix destination of systemd unit and dbus service
substituteInPlace systemd-services/meson.build --replace "sys_dep.get_pkgconfig_variable('systemduserunitdir')" "'$out/systemd/user'"
substituteInPlace dbus-services/meson.build --replace "dep.get_pkgconfig_variable('session_bus_services_dir')" "'$out/share/dbus-1/services'"
'';
# bin/edje_cc creates $HOME/.run, which would break build of reverse dependencies.
setupHook = writeText "setupHook.sh" ''
export HOME="$TEMPDIR"
'';
preConfigure = ''
# allow ecore_con to find libcurl.so, which is a runtime dependency (it is dlopened)
export LD_LIBRARY_PATH="${curl.out}/lib''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
source "$setupHook"
'';
postInstall = ''
# fix use of $out variable
substituteInPlace "$out/share/elua/core/util.lua" --replace '$out' "$out"
rm "$out/share/elua/core/util.lua.orig"
# add all module include dirs to the Cflags field in efl.pc
modules=$(for i in "$out/include/"*/; do printf ' -I''${includedir}/'`basename $i`; done)
substituteInPlace "$out/lib/pkgconfig/efl.pc" \
--replace 'Cflags: -I''${includedir}/efl-1' \
'Cflags: -I''${includedir}/eina-1/eina'"$modules"
# build icon cache
gtk-update-icon-cache "$out"/share/icons/Enlightenment-X
'';
postFixup = ''
# Some libraries are linked at runtime by hand in code (they are dlopened)
patchelf --add-needed ${curl.out}/lib/libcurl.so $out/lib/libecore_con.so
patchelf --add-needed ${libpulseaudio}/lib/libpulse.so $out/lib/libecore_audio.so
patchelf --add-needed ${libsndfile.out}/lib/libsndfile.so $out/lib/libecore_audio.so
'';
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "Enlightenment foundation libraries";
homepage = "https://enlightenment.org/";
license = with licenses; [
bsd2
lgpl2Only
licenses.zlib
];
platforms = platforms.linux;
maintainers = with maintainers; [
matejc
ftrvxmtrx
];
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,14 @@
--- ./src/scripts/elua/core/util.lua.old 2015-05-17 11:59:57.307743243 +0200
+++ ./src/scripts/elua/core/util.lua 2015-05-17 12:39:11.906797377 +0200
@@ -159,7 +159,10 @@
local ev = os.getenv("ELUA_" .. libname:upper() .. "_LIBRARY_PATH")
local succ, v = load_lib(libname, ev)
if not succ then
- error(v, 2)
+ succ, v = load_lib(libname, "$out/lib")
+ if not succ then
+ error(v, 2)
+ end
end
lib = v
loaded_libs[libname] = lib

View File

@@ -0,0 +1,115 @@
From 2c563889fcad37df4ee4251bf0a63316d8b7b612 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Romildo=20Malaquias?= <malaquias@gmail.com>
Date: Thu, 14 May 2020 16:36:34 -0300
Subject: [PATCH] wrapped setuid executables
Installing programs with root ownership and setuid/setgid permissions
in /nix/store is not allowed. They should be wrapped in the
enlightenment service module, and the wrapped ones should be used
instead.
---
meson/meson_inst.sh | 4 ++--
src/bin/e_auth.c | 6 ++----
src/bin/e_fm/e_fm_main_eeze.c | 6 +++---
src/bin/e_start_main.c | 3 +--
src/bin/e_system.c | 2 +-
5 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/meson/meson_inst.sh b/meson/meson_inst.sh
index 321143e40..cd2399306 100755
--- a/meson/meson_inst.sh
+++ b/meson/meson_inst.sh
@@ -1,6 +1,6 @@
#!/bin/sh
for x in "$@" ; do
- chown root "$DESTDIR/$x"
- chmod a=rx,u+xs "$DESTDIR/$x"
+ echo TODO: chown root "$DESTDIR/$x"
+ echo TODO: chmod a=rx,u+xs "$DESTDIR/$x"
done
diff --git a/src/bin/e_auth.c b/src/bin/e_auth.c
index 6d07a0ac3..d519f0649 100644
--- a/src/bin/e_auth.c
+++ b/src/bin/e_auth.c
@@ -38,8 +38,7 @@ e_auth_begin(char *passwd)
pwlen = strlen(passwd);
snprintf(buf, sizeof(buf),
- "%s/enlightenment/utils/enlightenment_ckpasswd pw",
- e_prefix_lib_get());
+ "/run/wrappers/bin/enlightenment_ckpasswd pw");
exe = ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_WRITE, NULL);
if (!exe) goto out;
snprintf(buf, sizeof(buf), "pw %s", passwd);
@@ -75,8 +74,7 @@ e_auth_polkit_begin(char *passwd, const char *cookie, unsigned int uid)
pwlen = strlen(passwd);
snprintf(buf, sizeof(buf),
- "%s/enlightenment/utils/enlightenment_ckpasswd pk",
- e_prefix_lib_get());
+ "/run/wrappers/bin/enlightenment_ckpasswd pk");
exe = ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_WRITE, NULL);
if (!exe) goto out;
snprintf(buf, sizeof(buf), "%s %u %s", cookie, uid, passwd);
diff --git a/src/bin/e_fm/e_fm_main_eeze.c b/src/bin/e_fm/e_fm_main_eeze.c
index 9b10b3117..0f0aa5b53 100644
--- a/src/bin/e_fm/e_fm_main_eeze.c
+++ b/src/bin/e_fm/e_fm_main_eeze.c
@@ -318,7 +318,7 @@ _e_fm_main_eeze_volume_eject(E_Volume *v)
{
char buf[PATH_MAX];
- snprintf(buf, sizeof(buf), "%s/enlightenment/utils/enlightenment_sys", eina_prefix_lib_get(pfx));
+ snprintf(buf, sizeof(buf), "/run/wrappers/bin/enlightenment_sys");
eeze_disk_mount_wrapper_set(v->disk, buf);
}
v->guard = ecore_timer_loop_add(E_FM_EJECT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_eeze_vol_eject_timeout, v);
@@ -512,7 +512,7 @@ _e_fm_main_eeze_volume_unmount(E_Volume *v)
{
char buf[PATH_MAX];
- snprintf(buf, sizeof(buf), "%s/enlightenment/utils/enlightenment_sys", eina_prefix_lib_get(pfx));
+ snprintf(buf, sizeof(buf), "/run/wrappers/bin/enlightenment_sys");
eeze_disk_mount_wrapper_set(v->disk, buf);
}
v->guard = ecore_timer_loop_add(E_FM_UNMOUNT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_eeze_vol_unmount_timeout, v);
@@ -548,7 +548,7 @@ _e_fm_main_eeze_volume_mount(E_Volume *v)
{
char buf2[PATH_MAX];
- snprintf(buf2, sizeof(buf2), "%s/enlightenment/utils/enlightenment_sys", eina_prefix_lib_get(pfx));
+ snprintf(buf2, sizeof(buf2), "/run/wrappers/bin/enlightenment_sys");
eeze_disk_mount_wrapper_set(v->disk, buf2);
}
v->guard = ecore_timer_loop_add(E_FM_MOUNT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_eeze_vol_mount_timeout, v);
diff --git a/src/bin/e_start_main.c b/src/bin/e_start_main.c
index 722063339..ee85aa9f1 100644
--- a/src/bin/e_start_main.c
+++ b/src/bin/e_start_main.c
@@ -596,8 +596,7 @@ main(int argc, char **argv)
eina_prefix_data_get(pfx));
putenv(buf2);
myasprintf(&buf3,
- "E_ALERT_SYSTEM_BIN=%s/enlightenment/utils/enlightenment_system",
- eina_prefix_lib_get(pfx));
+ "E_ALERT_SYSTEM_BIN=/run/wrappers/bin/enlightenment_system");
putenv(buf3);
home = getenv("HOME");
diff --git a/src/bin/e_system.c b/src/bin/e_system.c
index bfd43e7e2..6bf48e31f 100644
--- a/src/bin/e_system.c
+++ b/src/bin/e_system.c
@@ -133,7 +133,7 @@ _system_spawn(void)
else _respawn_count = 0;
if (_respawn_count > 5) return;
snprintf(buf, sizeof(buf),
- "%s/enlightenment/utils/enlightenment_system", e_prefix_lib_get());
+ "/run/wrappers/bin/enlightenment_system");
_system_exe = ecore_exe_pipe_run
(buf, ECORE_EXE_NOT_LEADER | ECORE_EXE_TERM_WITH_PARENT |
ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_WRITE, NULL);
--
2.34.0

View File

@@ -0,0 +1,25 @@
From b7ef2a0d3f31db55a12b2b8c2e1c60ba62b971c8 Mon Sep 17 00:00:00 2001
From: Matt Bagnara <mbagnara@fastmail.com>
Date: Wed, 1 Jul 2020 15:30:40 -0500
Subject: [PATCH] add nixos path
---
src/bin/e_util_suid.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/bin/e_util_suid.h b/src/bin/e_util_suid.h
index b01ff792b..88c2a0f17 100644
--- a/src/bin/e_util_suid.h
+++ b/src/bin/e_util_suid.h
@@ -246,7 +246,7 @@ e_setuid_setup(uid_t *caller_uid, gid_t *caller_gid, char **caller_user, char **
# endif
#endif
// pass 3 - set path and ifs to minimal defaults
- putenv("PATH=/bin:/usr/bin:/sbin:/usr/sbin");
+ putenv("PATH=/bin:/usr/bin:/sbin:/usr/sbin:/run/current-system/sw/bin");
putenv("IFS= \t\n");
return 0;
}
--
2.27.0

View File

@@ -0,0 +1,95 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
gettext,
alsa-lib,
acpid,
bc,
ddcutil,
efl,
libexif,
pam,
xkeyboard_config,
udisks2,
waylandSupport ? false,
wayland-protocols,
xwayland,
bluetoothSupport ? true,
bluez5,
pulseSupport ? !stdenv.hostPlatform.isDarwin,
libpulseaudio,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "enlightenment";
version = "0.27.1";
src = fetchurl {
url = "https://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "sha256-tB34dx9g47lqGXOuVm10JcU6gznxjlTjEjAhh4HaL6k=";
};
nativeBuildInputs = [
gettext
meson
ninja
pkg-config
];
buildInputs = [
alsa-lib
acpid # for systems with ACPI for lid events, AC/Battery plug in/out etc
bc # for the Everything module calculator mode
ddcutil # specifically libddcutil.so.2 for backlight control
efl
libexif
pam
xkeyboard_config
udisks2 # for removable storage mounting/unmounting
]
++ lib.optional bluetoothSupport bluez5 # for bluetooth configuration and control
++ lib.optional pulseSupport libpulseaudio # for proper audio device control and redirection
++ lib.optionals waylandSupport [
wayland-protocols
xwayland
];
patches = [
# Executables cannot be made setuid in nix store. They should be
# wrapped in the enlightenment service module, and the wrapped
# executables should be used instead.
./0001-wrapped-setuid-executables.patch
./0003-setuid-missing-path.patch
];
postPatch = ''
substituteInPlace src/modules/everything/evry_plug_calc.c \
--replace "ecore_exe_pipe_run(\"bc -l\"" "ecore_exe_pipe_run(\"${bc}/bin/bc -l\""
'';
mesonFlags = [
"-D systemdunitdir=lib/systemd/user"
]
++ lib.optional waylandSupport "-Dwl=true";
passthru.providedSessions = [ "enlightenment" ];
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "Compositing Window Manager and Desktop Shell";
homepage = "https://www.enlightenment.org";
license = licenses.bsd2;
platforms = platforms.linux;
maintainers = with maintainers; [
matejc
ftrvxmtrx
];
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,41 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
efl,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "ephoto";
version = "1.6.0";
src = fetchurl {
url = "http://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "1lvhcs4ba8h3z78nyycbww8mj4cscb8k200dcc3cdy8vrvrp7g1n";
};
nativeBuildInputs = [
meson
ninja
pkg-config
];
buildInputs = [
efl
];
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "Image viewer and editor written using the Enlightenment Foundation Libraries";
mainProgram = "ephoto";
homepage = "https://www.smhouston.us/ephoto/";
license = licenses.bsd2;
platforms = platforms.linux;
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,41 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
efl,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "evisum";
version = "0.6.4";
src = fetchurl {
url = "https://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "hlyotWUTfDKkEjAvDrlE7xYEMG7XksCg3X9Xksdca/g=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
];
buildInputs = [
efl
];
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "System and process monitor written with EFL";
mainProgram = "evisum";
homepage = "https://www.enlightenment.org";
license = with licenses; [ isc ];
platforms = platforms.linux;
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,53 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
efl,
gst_all_1,
wrapGAppsHook3,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "rage";
version = "0.4.0";
src = fetchurl {
url = "http://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "03yal7ajh57x2jhmygc6msf3gzvqkpmzkqzj6dnam5sim8cq9rbw";
};
nativeBuildInputs = [
meson
ninja
pkg-config
wrapGAppsHook3
];
buildInputs = [
efl
gst_all_1.gstreamer
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
gst_all_1.gst-plugins-bad
gst_all_1.gst-libav
];
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "Video and audio player along the lines of mplayer";
mainProgram = "rage";
homepage = "https://enlightenment.org/";
license = licenses.bsd2;
platforms = platforms.linux;
maintainers = with maintainers; [
matejc
ftrvxmtrx
];
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,53 @@
{
lib,
stdenv,
fetchurl,
meson,
ninja,
pkg-config,
python3,
efl,
nixosTests,
directoryListingUpdater,
}:
stdenv.mkDerivation rec {
pname = "terminology";
version = "1.14.0";
src = fetchurl {
url = "https://download.enlightenment.org/rel/apps/${pname}/${pname}-${version}.tar.xz";
sha256 = "81QFcFGwXP+2meM4NqETXbHU7Yv5VPm1fcDpO8MHUU0=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
python3
];
buildInputs = [
efl
];
postPatch = ''
patchShebangs data/colorschemes/*.py
'';
passthru.tests.test = nixosTests.terminal-emulators.terminology;
passthru.updateScript = directoryListingUpdater { };
meta = with lib; {
description = "Powerful terminal emulator based on EFL";
homepage = "https://www.enlightenment.org/about-terminology";
license = licenses.bsd2;
platforms = platforms.linux;
maintainers = with maintainers; [
matejc
ftrvxmtrx
];
teams = [ teams.enlightenment ];
};
}

View File

@@ -0,0 +1,58 @@
{
lib,
flutter,
fetchFromGitHub,
}:
flutter.buildFlutterApplication rec {
pname = "expidus-calculator";
version = "0.1.1-alpha";
src = fetchFromGitHub {
owner = "ExpidusOS";
repo = "calculator";
rev = version;
hash = "sha256-O3LHp10Fo3PW3zoN7mFSQEKh+AAaR+IqkRtc6nQrIZE=";
};
flutterBuildFlags = [
"--dart-define=COMMIT_HASH=a5d8f54404b9994f83beb367a1cd11e04a6420cb"
];
pubspecLock = lib.importJSON ./pubspec.lock.json;
gitHashes = {
libtokyo = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU=";
libtokyo_flutter = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU=";
};
postInstall = ''
rm $out/bin/calculator
ln -s $out/app/$pname/calculator $out/bin/expidus-calculator
mkdir -p $out/share/applications
mv $out/app/$pname/data/com.expidusos.calculator.desktop $out/share/applications
mkdir -p $out/share/icons
mv $out/app/$pname/data/com.expidusos.calculator.png $out/share/icons
mkdir -p $out/share/metainfo
mv $out/app/$pname/data/com.expidusos.calculator.metainfo.xml $out/share/metainfo
substituteInPlace "$out/share/applications/com.expidusos.calculator.desktop" \
--replace "Exec=calculator" "Exec=$out/bin/expidus-calculator" \
--replace "Icon=com.expidusos.calculator" "Icon=$out/share/icons/com.expidusos.calculator.png"
'';
meta = with lib; {
broken = true;
description = "ExpidusOS Calculator";
homepage = "https://expidusos.com";
license = licenses.gpl3Only;
maintainers = with maintainers; [ RossComputerGuy ];
platforms = [
"x86_64-linux"
"aarch64-linux"
];
mainProgram = "expidus-calculator";
};
}

View File

@@ -0,0 +1,790 @@
{
"packages": {
"args": {
"dependency": "transitive",
"description": {
"name": "args",
"sha256": "eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.2"
},
"async": {
"dependency": "transitive",
"description": {
"name": "async",
"sha256": "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.11.0"
},
"bitsdojo_window": {
"dependency": "direct main",
"description": {
"name": "bitsdojo_window",
"sha256": "1118bc1cd16e6f358431ca4473af57cc1b287d2ceab46dfab6d59a9463160622",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.5"
},
"bitsdojo_window_linux": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_linux",
"sha256": "d3804a30315fcbb43b28acc86d1180ce0be22c0c738ad2da9e5ade4d8dbd9655",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.3"
},
"bitsdojo_window_macos": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_macos",
"sha256": "d2a9886c74516c5b84c1dd65ab8ee5d1c52055b265ebf0e7d664dee28366b521",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.3"
},
"bitsdojo_window_platform_interface": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_platform_interface",
"sha256": "65daa015a0c6dba749bdd35a0f092e7a8ba8b0766aa0480eb3ef808086f6e27c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.2"
},
"bitsdojo_window_windows": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_windows",
"sha256": "8766a40aac84a6d7bdcaa716b24997e028fc9a9a1800495fc031721fd5a22ed0",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.5"
},
"boolean_selector": {
"dependency": "transitive",
"description": {
"name": "boolean_selector",
"sha256": "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"characters": {
"dependency": "transitive",
"description": {
"name": "characters",
"sha256": "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.0"
},
"clock": {
"dependency": "transitive",
"description": {
"name": "clock",
"sha256": "cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.1"
},
"collection": {
"dependency": "transitive",
"description": {
"name": "collection",
"sha256": "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.17.1"
},
"crypto": {
"dependency": "transitive",
"description": {
"name": "crypto",
"sha256": "ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.3"
},
"fake_async": {
"dependency": "transitive",
"description": {
"name": "fake_async",
"sha256": "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.1"
},
"ffi": {
"dependency": "transitive",
"description": {
"name": "ffi",
"sha256": "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.0"
},
"file": {
"dependency": "transitive",
"description": {
"name": "file",
"sha256": "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.4"
},
"filesize": {
"dependency": "transitive",
"description": {
"name": "filesize",
"sha256": "f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.1"
},
"flutter": {
"dependency": "direct main",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_adaptive_scaffold": {
"dependency": "direct main",
"description": {
"name": "flutter_adaptive_scaffold",
"sha256": "3e78be8b9c95b1c9832b2f8ec4a845adac205c4bb5e7bd3fb204b07990229167",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.7+1"
},
"flutter_lints": {
"dependency": "direct dev",
"description": {
"name": "flutter_lints",
"sha256": "a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.3"
},
"flutter_localizations": {
"dependency": "direct main",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_markdown": {
"dependency": "direct main",
"description": {
"name": "flutter_markdown",
"sha256": "d4a1cb250c4e059586af0235f32e02882860a508e189b61f2b31b8810c1e1330",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.6.17+2"
},
"flutter_test": {
"dependency": "direct dev",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_web_plugins": {
"dependency": "transitive",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"http": {
"dependency": "transitive",
"description": {
"name": "http",
"sha256": "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.13.6"
},
"http_parser": {
"dependency": "transitive",
"description": {
"name": "http_parser",
"sha256": "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.0.2"
},
"intl": {
"dependency": "transitive",
"description": {
"name": "intl",
"sha256": "a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.18.0"
},
"js": {
"dependency": "transitive",
"description": {
"name": "js",
"sha256": "f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.6.7"
},
"libtokyo": {
"dependency": "direct main",
"description": {
"path": "packages/libtokyo",
"ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"resolved-ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"url": "https://github.com/ExpidusOS/libtokyo.git"
},
"source": "git",
"version": "0.1.0"
},
"libtokyo_flutter": {
"dependency": "direct main",
"description": {
"path": "packages/libtokyo_flutter",
"ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"resolved-ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"url": "https://github.com/ExpidusOS/libtokyo.git"
},
"source": "git",
"version": "0.1.0"
},
"lints": {
"dependency": "transitive",
"description": {
"name": "lints",
"sha256": "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"markdown": {
"dependency": "direct main",
"description": {
"name": "markdown",
"sha256": "acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.1.1"
},
"matcher": {
"dependency": "transitive",
"description": {
"name": "matcher",
"sha256": "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.12.15"
},
"material_color_utilities": {
"dependency": "transitive",
"description": {
"name": "material_color_utilities",
"sha256": "d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.2.0"
},
"material_theme_builder": {
"dependency": "transitive",
"description": {
"name": "material_theme_builder",
"sha256": "380ab70835e01f4ee0c37904eebae9e36ed37b5cf8ed40d67412ea3244a2afd6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.4"
},
"math_expressions": {
"dependency": "direct main",
"description": {
"name": "math_expressions",
"sha256": "3576593617c3870d75728a751f6ec6e606706d44e363f088ac394b5a28a98064",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.0"
},
"meta": {
"dependency": "transitive",
"description": {
"name": "meta",
"sha256": "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.9.1"
},
"nested": {
"dependency": "transitive",
"description": {
"name": "nested",
"sha256": "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.0"
},
"package_info_plus": {
"dependency": "direct main",
"description": {
"name": "package_info_plus",
"sha256": "10259b111176fba5c505b102e3a5b022b51dd97e30522e906d6922c745584745",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.2"
},
"package_info_plus_platform_interface": {
"dependency": "transitive",
"description": {
"name": "package_info_plus_platform_interface",
"sha256": "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.1"
},
"path": {
"dependency": "transitive",
"description": {
"name": "path",
"sha256": "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.8.3"
},
"path_provider_linux": {
"dependency": "transitive",
"description": {
"name": "path_provider_linux",
"sha256": "f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.1"
},
"path_provider_platform_interface": {
"dependency": "transitive",
"description": {
"name": "path_provider_platform_interface",
"sha256": "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"path_provider_windows": {
"dependency": "transitive",
"description": {
"name": "path_provider_windows",
"sha256": "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.1"
},
"platform": {
"dependency": "transitive",
"description": {
"name": "platform",
"sha256": "ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.2"
},
"plugin_platform_interface": {
"dependency": "transitive",
"description": {
"name": "plugin_platform_interface",
"sha256": "da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.6"
},
"provider": {
"dependency": "direct main",
"description": {
"name": "provider",
"sha256": "cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.0.5"
},
"pub_semver": {
"dependency": "direct main",
"description": {
"name": "pub_semver",
"sha256": "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.4"
},
"pubspec": {
"dependency": "direct main",
"description": {
"name": "pubspec",
"sha256": "f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"quiver": {
"dependency": "transitive",
"description": {
"name": "quiver",
"sha256": "b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.2.1"
},
"sentry": {
"dependency": "transitive",
"description": {
"name": "sentry",
"sha256": "39c23342fc96105da449914f7774139a17a0ca8a4e70d9ad5200171f7e47d6ba",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.9.0"
},
"sentry_flutter": {
"dependency": "direct main",
"description": {
"name": "sentry_flutter",
"sha256": "ff68ab31918690da004a42e20204242a3ad9ad57da7e2712da8487060ac9767f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.9.0"
},
"shared_preferences": {
"dependency": "direct main",
"description": {
"name": "shared_preferences",
"sha256": "b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.1"
},
"shared_preferences_android": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_android",
"sha256": "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.1"
},
"shared_preferences_foundation": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_foundation",
"sha256": "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.4"
},
"shared_preferences_linux": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_linux",
"sha256": "c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.1"
},
"shared_preferences_platform_interface": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_platform_interface",
"sha256": "d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.1"
},
"shared_preferences_web": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_web",
"sha256": "d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.1"
},
"shared_preferences_windows": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_windows",
"sha256": "f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.1"
},
"sky_engine": {
"dependency": "transitive",
"description": "flutter",
"source": "sdk",
"version": "0.0.99"
},
"source_span": {
"dependency": "transitive",
"description": {
"name": "source_span",
"sha256": "dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.9.1"
},
"stack_trace": {
"dependency": "transitive",
"description": {
"name": "stack_trace",
"sha256": "c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.11.0"
},
"stream_channel": {
"dependency": "transitive",
"description": {
"name": "stream_channel",
"sha256": "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"string_scanner": {
"dependency": "transitive",
"description": {
"name": "string_scanner",
"sha256": "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.0"
},
"term_glyph": {
"dependency": "transitive",
"description": {
"name": "term_glyph",
"sha256": "a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.1"
},
"test_api": {
"dependency": "transitive",
"description": {
"name": "test_api",
"sha256": "eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.5.1"
},
"typed_data": {
"dependency": "transitive",
"description": {
"name": "typed_data",
"sha256": "facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.2"
},
"uri": {
"dependency": "transitive",
"description": {
"name": "uri",
"sha256": "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.0"
},
"url_launcher": {
"dependency": "direct main",
"description": {
"name": "url_launcher",
"sha256": "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.14"
},
"url_launcher_android": {
"dependency": "transitive",
"description": {
"name": "url_launcher_android",
"sha256": "b04af59516ab45762b2ca6da40fa830d72d0f6045cd97744450b73493fa76330",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.0"
},
"url_launcher_ios": {
"dependency": "transitive",
"description": {
"name": "url_launcher_ios",
"sha256": "7c65021d5dee51813d652357bc65b8dd4a6177082a9966bc8ba6ee477baa795f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.5"
},
"url_launcher_linux": {
"dependency": "transitive",
"description": {
"name": "url_launcher_linux",
"sha256": "b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.6"
},
"url_launcher_macos": {
"dependency": "transitive",
"description": {
"name": "url_launcher_macos",
"sha256": "b55486791f666e62e0e8ff825e58a023fd6b1f71c49926483f1128d3bbd8fe88",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.7"
},
"url_launcher_platform_interface": {
"dependency": "transitive",
"description": {
"name": "url_launcher_platform_interface",
"sha256": "95465b39f83bfe95fcb9d174829d6476216f2d548b79c38ab2506e0458787618",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.5"
},
"url_launcher_web": {
"dependency": "transitive",
"description": {
"name": "url_launcher_web",
"sha256": "ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.19"
},
"url_launcher_windows": {
"dependency": "transitive",
"description": {
"name": "url_launcher_windows",
"sha256": "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.8"
},
"uuid": {
"dependency": "transitive",
"description": {
"name": "uuid",
"sha256": "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.7"
},
"vector_math": {
"dependency": "transitive",
"description": {
"name": "vector_math",
"sha256": "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.4"
},
"win32": {
"dependency": "transitive",
"description": {
"name": "win32",
"sha256": "a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.4"
},
"xdg_directories": {
"dependency": "transitive",
"description": {
"name": "xdg_directories",
"sha256": "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.3"
},
"yaml": {
"dependency": "transitive",
"description": {
"name": "yaml",
"sha256": "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.2"
}
},
"sdks": {
"dart": ">=3.0.5 <4.0.0",
"flutter": ">=3.10.0"
}
}

View File

@@ -0,0 +1,10 @@
{ callPackage, flutterPackages }:
{
calculator = callPackage ./calculator {
flutter = flutterPackages.v3_24;
};
file-manager = callPackage ./file-manager {
flutter = flutterPackages.v3_24;
};
}

View File

@@ -0,0 +1,58 @@
{
lib,
flutter,
fetchFromGitHub,
}:
flutter.buildFlutterApplication rec {
pname = "expidus-file-manager";
version = "0.2.1";
src = fetchFromGitHub {
owner = "ExpidusOS";
repo = "file-manager";
rev = version;
hash = "sha256-R6eszy4Dz8tAPRTwZzRiZWIgVMiGv5zlhFB/HcD6gqg=";
};
flutterBuildFlags = [
"--dart-define=COMMIT_HASH=b4181b9cff18a07e958c81d8f41840d2d36a6705"
];
pubspecLock = lib.importJSON ./pubspec.lock.json;
gitHashes = {
libtokyo = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU=";
libtokyo_flutter = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU=";
};
postInstall = ''
rm $out/bin/file_manager
ln -s $out/app/$pname/file_manager $out/bin/expidus-file-manager
mkdir -p $out/share/applications
mv $out/app/$pname/data/com.expidusos.file_manager.desktop $out/share/applications
mkdir -p $out/share/icons
mv $out/app/$pname/data/com.expidusos.file_manager.png $out/share/icons
mkdir -p $out/share/metainfo
mv $out/app/$pname/data/com.expidusos.file_manager.metainfo.xml $out/share/metainfo
substituteInPlace "$out/share/applications/com.expidusos.file_manager.desktop" \
--replace "Exec=file_manager" "Exec=$out/bin/expidus-file-manager" \
--replace "Icon=com.expidusos.file_manager" "Icon=$out/share/icons/com.expidusos.file_manager.png"
'';
meta = with lib; {
broken = true;
description = "ExpidusOS File Manager";
homepage = "https://expidusos.com";
license = licenses.gpl3;
maintainers = with maintainers; [ RossComputerGuy ];
platforms = [
"x86_64-linux"
"aarch64-linux"
];
mainProgram = "expidus-file-manager";
};
}

View File

@@ -0,0 +1,910 @@
{
"packages": {
"args": {
"dependency": "transitive",
"description": {
"name": "args",
"sha256": "eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.4.2"
},
"async": {
"dependency": "transitive",
"description": {
"name": "async",
"sha256": "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.11.0"
},
"bitsdojo_window": {
"dependency": "direct main",
"description": {
"name": "bitsdojo_window",
"sha256": "1118bc1cd16e6f358431ca4473af57cc1b287d2ceab46dfab6d59a9463160622",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.5"
},
"bitsdojo_window_linux": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_linux",
"sha256": "d3804a30315fcbb43b28acc86d1180ce0be22c0c738ad2da9e5ade4d8dbd9655",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.3"
},
"bitsdojo_window_macos": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_macos",
"sha256": "d2a9886c74516c5b84c1dd65ab8ee5d1c52055b265ebf0e7d664dee28366b521",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.3"
},
"bitsdojo_window_platform_interface": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_platform_interface",
"sha256": "65daa015a0c6dba749bdd35a0f092e7a8ba8b0766aa0480eb3ef808086f6e27c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.2"
},
"bitsdojo_window_windows": {
"dependency": "transitive",
"description": {
"name": "bitsdojo_window_windows",
"sha256": "8766a40aac84a6d7bdcaa716b24997e028fc9a9a1800495fc031721fd5a22ed0",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.5"
},
"boolean_selector": {
"dependency": "transitive",
"description": {
"name": "boolean_selector",
"sha256": "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"characters": {
"dependency": "transitive",
"description": {
"name": "characters",
"sha256": "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.0"
},
"clock": {
"dependency": "transitive",
"description": {
"name": "clock",
"sha256": "cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.1.1"
},
"collection": {
"dependency": "direct main",
"description": {
"name": "collection",
"sha256": "f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.17.2"
},
"crypto": {
"dependency": "transitive",
"description": {
"name": "crypto",
"sha256": "ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.3"
},
"dbus": {
"dependency": "transitive",
"description": {
"name": "dbus",
"sha256": "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.7.8"
},
"fake_async": {
"dependency": "transitive",
"description": {
"name": "fake_async",
"sha256": "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.1"
},
"ffi": {
"dependency": "direct main",
"description": {
"name": "ffi",
"sha256": "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.0"
},
"file": {
"dependency": "transitive",
"description": {
"name": "file",
"sha256": "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.4"
},
"filesize": {
"dependency": "direct main",
"description": {
"name": "filesize",
"sha256": "f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.1"
},
"flutter": {
"dependency": "direct main",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_adaptive_scaffold": {
"dependency": "direct main",
"description": {
"name": "flutter_adaptive_scaffold",
"sha256": "4f448902314bc9b6cf820c85d5bad4de6489c0eff75dcedf5098f3a53ec981ee",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.6"
},
"flutter_lints": {
"dependency": "direct dev",
"description": {
"name": "flutter_lints",
"sha256": "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.2"
},
"flutter_localizations": {
"dependency": "direct main",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_markdown": {
"dependency": "direct main",
"description": {
"name": "flutter_markdown",
"sha256": "2b206d397dd7836ea60035b2d43825c8a303a76a5098e66f42d55a753e18d431",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.6.17+1"
},
"flutter_test": {
"dependency": "direct dev",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"flutter_web_plugins": {
"dependency": "transitive",
"description": "flutter",
"source": "sdk",
"version": "0.0.0"
},
"http": {
"dependency": "transitive",
"description": {
"name": "http",
"sha256": "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.13.6"
},
"http_parser": {
"dependency": "transitive",
"description": {
"name": "http_parser",
"sha256": "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "4.0.2"
},
"intl": {
"dependency": "direct main",
"description": {
"name": "intl",
"sha256": "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.18.1"
},
"libtokyo": {
"dependency": "direct main",
"description": {
"path": "packages/libtokyo",
"ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"resolved-ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"url": "https://github.com/ExpidusOS/libtokyo.git"
},
"source": "git",
"version": "0.1.0"
},
"libtokyo_flutter": {
"dependency": "direct main",
"description": {
"path": "packages/libtokyo_flutter",
"ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"resolved-ref": "f48d528ebfc22fe827fe9f2d1965be1d339ccfb7",
"url": "https://github.com/ExpidusOS/libtokyo.git"
},
"source": "git",
"version": "0.1.0"
},
"lints": {
"dependency": "transitive",
"description": {
"name": "lints",
"sha256": "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"markdown": {
"dependency": "transitive",
"description": {
"name": "markdown",
"sha256": "acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.1.1"
},
"matcher": {
"dependency": "transitive",
"description": {
"name": "matcher",
"sha256": "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.12.16"
},
"material_color_utilities": {
"dependency": "transitive",
"description": {
"name": "material_color_utilities",
"sha256": "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.5.0"
},
"material_theme_builder": {
"dependency": "transitive",
"description": {
"name": "material_theme_builder",
"sha256": "380ab70835e01f4ee0c37904eebae9e36ed37b5cf8ed40d67412ea3244a2afd6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.4"
},
"meta": {
"dependency": "transitive",
"description": {
"name": "meta",
"sha256": "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.9.1"
},
"nested": {
"dependency": "transitive",
"description": {
"name": "nested",
"sha256": "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.0"
},
"open_file_plus": {
"dependency": "direct main",
"description": {
"name": "open_file_plus",
"sha256": "f087e32722ffe4bac71925e7a1a9848a1008fd789e47c6628da3ed7845922227",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.4.1"
},
"package_info_plus": {
"dependency": "direct main",
"description": {
"name": "package_info_plus",
"sha256": "10259b111176fba5c505b102e3a5b022b51dd97e30522e906d6922c745584745",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.2"
},
"package_info_plus_platform_interface": {
"dependency": "transitive",
"description": {
"name": "package_info_plus_platform_interface",
"sha256": "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.1"
},
"path": {
"dependency": "direct main",
"description": {
"name": "path",
"sha256": "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.8.3"
},
"path_provider": {
"dependency": "direct main",
"description": {
"name": "path_provider",
"sha256": "909b84830485dbcd0308edf6f7368bc8fd76afa26a270420f34cabea2a6467a0",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.0"
},
"path_provider_android": {
"dependency": "transitive",
"description": {
"name": "path_provider_android",
"sha256": "5d44fc3314d969b84816b569070d7ace0f1dea04bd94a83f74c4829615d22ad8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.0"
},
"path_provider_foundation": {
"dependency": "transitive",
"description": {
"name": "path_provider_foundation",
"sha256": "1b744d3d774e5a879bb76d6cd1ecee2ba2c6960c03b1020cd35212f6aa267ac5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"path_provider_linux": {
"dependency": "transitive",
"description": {
"name": "path_provider_linux",
"sha256": "ba2b77f0c52a33db09fc8caf85b12df691bf28d983e84cf87ff6d693cfa007b3",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
},
"path_provider_platform_interface": {
"dependency": "direct main",
"description": {
"name": "path_provider_platform_interface",
"sha256": "bced5679c7df11190e1ddc35f3222c858f328fff85c3942e46e7f5589bf9eb84",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.0"
},
"path_provider_windows": {
"dependency": "direct main",
"description": {
"name": "path_provider_windows",
"sha256": "ee0e0d164516b90ae1f970bdf29f726f1aa730d7cfc449ecc74c495378b705da",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
},
"permission_handler": {
"dependency": "direct main",
"description": {
"name": "permission_handler",
"sha256": "63e5216aae014a72fe9579ccd027323395ce7a98271d9defa9d57320d001af81",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "10.4.3"
},
"permission_handler_android": {
"dependency": "transitive",
"description": {
"name": "permission_handler_android",
"sha256": "2ffaf52a21f64ac9b35fe7369bb9533edbd4f698e5604db8645b1064ff4cf221",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "10.3.3"
},
"permission_handler_apple": {
"dependency": "transitive",
"description": {
"name": "permission_handler_apple",
"sha256": "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "9.1.4"
},
"permission_handler_platform_interface": {
"dependency": "transitive",
"description": {
"name": "permission_handler_platform_interface",
"sha256": "7c6b1500385dd1d2ca61bb89e2488ca178e274a69144d26bbd65e33eae7c02a9",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.11.3"
},
"permission_handler_windows": {
"dependency": "transitive",
"description": {
"name": "permission_handler_windows",
"sha256": "cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.3"
},
"petitparser": {
"dependency": "transitive",
"description": {
"name": "petitparser",
"sha256": "cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "5.4.0"
},
"platform": {
"dependency": "transitive",
"description": {
"name": "platform",
"sha256": "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.0"
},
"plugin_platform_interface": {
"dependency": "transitive",
"description": {
"name": "plugin_platform_interface",
"sha256": "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.5"
},
"provider": {
"dependency": "direct main",
"description": {
"name": "provider",
"sha256": "cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.0.5"
},
"pub_semver": {
"dependency": "direct main",
"description": {
"name": "pub_semver",
"sha256": "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.4"
},
"pubspec": {
"dependency": "direct main",
"description": {
"name": "pubspec",
"sha256": "f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"quiver": {
"dependency": "transitive",
"description": {
"name": "quiver",
"sha256": "b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.2.1"
},
"sentry": {
"dependency": "transitive",
"description": {
"name": "sentry",
"sha256": "39c23342fc96105da449914f7774139a17a0ca8a4e70d9ad5200171f7e47d6ba",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.9.0"
},
"sentry_flutter": {
"dependency": "direct main",
"description": {
"name": "sentry_flutter",
"sha256": "ff68ab31918690da004a42e20204242a3ad9ad57da7e2712da8487060ac9767f",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "7.9.0"
},
"shared_preferences": {
"dependency": "direct main",
"description": {
"name": "shared_preferences",
"sha256": "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
},
"shared_preferences_android": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_android",
"sha256": "fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
},
"shared_preferences_foundation": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_foundation",
"sha256": "f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.2"
},
"shared_preferences_linux": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_linux",
"sha256": "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"shared_preferences_platform_interface": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_platform_interface",
"sha256": "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"shared_preferences_web": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_web",
"sha256": "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.2.0"
},
"shared_preferences_windows": {
"dependency": "transitive",
"description": {
"name": "shared_preferences_windows",
"sha256": "f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.3.0"
},
"sky_engine": {
"dependency": "transitive",
"description": "flutter",
"source": "sdk",
"version": "0.0.99"
},
"source_span": {
"dependency": "transitive",
"description": {
"name": "source_span",
"sha256": "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.10.0"
},
"stack_trace": {
"dependency": "transitive",
"description": {
"name": "stack_trace",
"sha256": "c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.11.0"
},
"stream_channel": {
"dependency": "transitive",
"description": {
"name": "stream_channel",
"sha256": "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.1"
},
"string_scanner": {
"dependency": "transitive",
"description": {
"name": "string_scanner",
"sha256": "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.0"
},
"term_glyph": {
"dependency": "transitive",
"description": {
"name": "term_glyph",
"sha256": "a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.2.1"
},
"test_api": {
"dependency": "transitive",
"description": {
"name": "test_api",
"sha256": "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.6.0"
},
"typed_data": {
"dependency": "transitive",
"description": {
"name": "typed_data",
"sha256": "facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.3.2"
},
"udisks": {
"dependency": "direct main",
"description": {
"name": "udisks",
"sha256": "847144fb868b9e3602895e89f438f77c2a4fda9e4b02f7d368dc1d2c6a40b475",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.4.0"
},
"uri": {
"dependency": "transitive",
"description": {
"name": "uri",
"sha256": "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.0"
},
"url_launcher": {
"dependency": "direct main",
"description": {
"name": "url_launcher",
"sha256": "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.12"
},
"url_launcher_android": {
"dependency": "transitive",
"description": {
"name": "url_launcher_android",
"sha256": "3dd2388cc0c42912eee04434531a26a82512b9cb1827e0214430c9bcbddfe025",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.0.38"
},
"url_launcher_ios": {
"dependency": "transitive",
"description": {
"name": "url_launcher_ios",
"sha256": "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.1.4"
},
"url_launcher_linux": {
"dependency": "transitive",
"description": {
"name": "url_launcher_linux",
"sha256": "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.5"
},
"url_launcher_macos": {
"dependency": "transitive",
"description": {
"name": "url_launcher_macos",
"sha256": "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.6"
},
"url_launcher_platform_interface": {
"dependency": "transitive",
"description": {
"name": "url_launcher_platform_interface",
"sha256": "bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.3"
},
"url_launcher_web": {
"dependency": "transitive",
"description": {
"name": "url_launcher_web",
"sha256": "cc26720eefe98c1b71d85f9dc7ef0cada5132617046369d9dc296b3ecaa5cbb4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.0.18"
},
"url_launcher_windows": {
"dependency": "transitive",
"description": {
"name": "url_launcher_windows",
"sha256": "7967065dd2b5fccc18c653b97958fdf839c5478c28e767c61ee879f4e7882422",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.7"
},
"uuid": {
"dependency": "transitive",
"description": {
"name": "uuid",
"sha256": "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.0.7"
},
"vector_math": {
"dependency": "transitive",
"description": {
"name": "vector_math",
"sha256": "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "2.1.4"
},
"web": {
"dependency": "transitive",
"description": {
"name": "web",
"sha256": "dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "0.1.4-beta"
},
"win32": {
"dependency": "direct main",
"description": {
"name": "win32",
"sha256": "a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.4"
},
"xdg_directories": {
"dependency": "direct main",
"description": {
"name": "xdg_directories",
"sha256": "f0c26453a2d47aa4c2570c6a033246a3fc62da2fe23c7ffdd0a7495086dc0247",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "1.0.2"
},
"xml": {
"dependency": "transitive",
"description": {
"name": "xml",
"sha256": "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "6.3.0"
},
"yaml": {
"dependency": "transitive",
"description": {
"name": "yaml",
"sha256": "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5",
"url": "https://pub.dev"
},
"source": "hosted",
"version": "3.1.2"
}
},
"sdks": {
"dart": ">=3.1.0-185.0.dev <4.0.0",
"flutter": ">=3.10.0"
}
}

View File

@@ -0,0 +1,83 @@
{
config,
stdenv,
pkgs,
lib,
}:
lib.makeScope pkgs.newScope (
self: with self; {
#### PLATFORM
libIDL = callPackage ./platform/libIDL {
gettext = if stdenv.hostPlatform.isDarwin then pkgs.gettext else null;
};
ORBit2 = callPackage ./platform/ORBit2 { };
libart_lgpl = callPackage ./platform/libart_lgpl { };
libglade = callPackage ./platform/libglade { };
GConf = callPackage ./platform/GConf { };
libgnomecanvas = callPackage ./platform/libgnomecanvas { };
# for git-head builds
gnome-common = callPackage platform/gnome-common { };
gnome_mime_data = callPackage ./platform/gnome-mime-data { };
gtkglext = callPackage ./platform/gtkglext { };
#### DESKTOP
gtksourceview = callPackage ./desktop/gtksourceview { };
}
)
// lib.optionalAttrs config.allowAliases {
# added 2024-12-02
glib = throw "gnome2.glib has been removed, please use top-level glib";
glibmm = throw "gnome2.glibmm has been removed, please use top-level glibmm";
atk = throw "gnome2.atk has been removed, please use top-level atk";
atkmm = throw "gnome2.atkmm has been removed, please use top-level atkmm";
cairo = throw "gnome2.cairo has been removed, please use top-level cairo";
pango = throw "gnome2.pango has been removed, please use top-level pango";
pangomm = throw "gnome2.pangomm has been removed, please use top-level pangomm";
gtkmm2 = throw "gnome2.gtkmm2 has been removed, please use top-level gtkmm2";
libcanberra-gtk2 = throw "gnome2.libcanberra-gtk2 has been removed, please use top-level libcanberra-gtk2";
libsoup = throw "gnome2.libsoup has been removed, please use top-level libsoup_2_4";
libwnck2 = throw "gnome2.libwnck2 has been removed, please use top-level libwnck2";
gtk-doc = throw "gnome2.gtk-doc has been removed, please use top-level gtk-doc";
gnome-doc-utils = throw "gnome2.gnome-doc-utils has been removed, please use top-level gnome-doc-utils";
gvfs = throw "gnome2.gvfs has been removed, please use top-level gvfs";
gtk = throw "gnome2.gtk has been removed, please use top-level gtk2";
gtkmm = throw "gnome2.gtkmm has been removed, please use top-level gtkmm2";
gtkdoc = throw "gnome2.gtkdoc has been removed, please use top-level gtk-doc";
startup_notification = throw "gnome2.startup_notification has been removed, please use top-level libstartup_notification";
startupnotification = throw "gnome2.startupnotification has been removed, please use top-level libstartup_notification";
gnomedocutils = throw "gnome2.gnomedocutils has been removed, please use top-level gnome-doc-utils";
gnome-icon-theme = throw "gnome2.gnome-icon-theme has been removed, please use top-level gnome-icon-theme";
gnome_icon_theme = throw "gnome2.gnome_icon_theme has been removed, please use top-level gnome-icon-theme";
gnomeicontheme = throw "gnome2.gnomeicontheme has been removed, please use top-level gnome-icon-theme";
gnome_common = throw "gnome2.gnome_common has been removed, please use top-level gnome-common";
gnome_python = throw "gnome2.gnome_python has been removed"; # 2023-01-14
gnome_python_desktop = throw "gnome2.gnome_python_desktop has been removed"; # 2023-01-14
gnome_vfs = throw "gnome2.gnome_vfs has been removed"; # 2024-06-27
gtkhtml = throw "gnome2.gtkhtml has been removed"; # 2023-01-15
gtkhtml4 = throw "gnome2.gtkhtml4 has been removed"; # 2023-01-15
libbonobo = throw "gnome2.libbonobo has been removed"; # 2024-06-27
libbonoboui = throw "gnome2.libbonoboui has been removed"; # 2024-06-27
libglademm = throw "gnome2.libglademm has been removed"; # 2022-01-15
libgnomecanvasmm = "gnome2.libgnomecanvasmm has been removed"; # 2022-01-15
libgnomecups = throw "gnome2.libgnomecups has been removed"; # 2023-01-15
libgnomeprint = throw "gnome2.libgnomeprint has been removed"; # 2023-01-15
libgnomeprintui = throw "gnome2.libgnomeprintui has been removed"; # 2023-01-15
libgnome = throw "gnome2.libgnome has been removed"; # 2024-06-27
libgnomeui = throw "gnome2.libgnomeui has been removed"; # 2024-06-27
libgtkhtml = throw "gnome2.libgtkhtml has been removed"; # 2023-01-15
python_rsvg = throw "gnome2.python_rsvg has been removed"; # 2023-01-14
}

View File

@@ -0,0 +1,83 @@
{
lib,
stdenv,
fetchpatch,
fetchurl,
autoreconfHook,
gtk-doc,
pkg-config,
atk,
cairo,
glib,
gnome-common,
gtk2,
pango,
libxml2Python,
perl,
intltool,
gettext,
gtk-mac-integration-gtk2,
testers,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "gtksourceview";
version = "2.10.5";
src =
let
inherit (finalAttrs) pname version;
in
fetchurl {
url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.bz2";
sha256 = "c585773743b1df8a04b1be7f7d90eecdf22681490d6810be54c81a7ae152191e";
};
patches = lib.optionals stdenv.hostPlatform.isDarwin [
(fetchpatch {
name = "change-igemacintegration-to-gtkosxapplication.patch";
url = "https://gitlab.gnome.org/GNOME/gtksourceview/commit/e88357c5f210a8796104505c090fb6a04c213902.patch";
sha256 = "0h5q79q9dqbg46zcyay71xn1pm4aji925gjd5j93v4wqn41wj5m7";
})
(fetchpatch {
name = "update-to-gtk-mac-integration-2.0-api.patch";
url = "https://gitlab.gnome.org/GNOME/gtksourceview/commit/ab46e552e1d0dae73f72adac8d578e40bdadaf95.patch";
sha256 = "0qzrbv4hpa0v8qbmpi2vp575n13lkrvp3cgllwrd2pslw1v9q3aj";
})
];
# Fix build with gcc 14
env.NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-pointer-types";
nativeBuildInputs = [
pkg-config
intltool
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
autoreconfHook
gtk-doc
];
buildInputs = [
atk
cairo
glib
gtk2
pango
libxml2Python
perl
gettext
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
gnome-common
gtk-mac-integration-gtk2
];
doCheck = false; # requires X11 daemon
passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
meta = {
pkgConfigModules = [ "gtksourceview-2.0" ];
};
})

View File

@@ -0,0 +1,65 @@
{
lib,
stdenv,
fetchurl,
pkg-config,
dbus-glib,
glib,
ORBit2,
libxml2,
polkit,
python312,
intltool,
}:
stdenv.mkDerivation rec {
pname = "gconf";
version = "3.2.6";
src = fetchurl {
url = "mirror://gnome/sources/GConf/${lib.versions.majorMinor version}/GConf-${version}.tar.xz";
sha256 = "0k3q9nh53yhc9qxf1zaicz4sk8p3kzq4ndjdsgpaa2db0ccbj4hr";
};
outputs = [
"out"
"dev"
"man"
];
strictDeps = true;
buildInputs = [
ORBit2
libxml2
]
# polkit requires pam, which requires shadow.h, which is not available on
# darwin
++ lib.optional (!stdenv.hostPlatform.isDarwin) polkit;
propagatedBuildInputs = [
glib
dbus-glib
];
nativeBuildInputs = [
pkg-config
intltool
python312
glib
];
configureFlags =
# fixes the "libgconfbackend-oldxml.so is not portable" error on darwin
lib.optionals stdenv.hostPlatform.isDarwin [ "--enable-static" ];
postPatch = ''
2to3 --write --nobackup gsettings/gsettings-schema-convert
'';
meta = with lib; {
homepage = "https://projects.gnome.org/gconf/";
description = "Deprecated system for storing application preferences";
platforms = platforms.unix;
};
}

View File

@@ -0,0 +1,101 @@
{
lib,
stdenv,
fetchurl,
pkg-config,
glib,
libIDL,
libintl,
buildPackages,
}:
stdenv.mkDerivation rec {
pname = "ORBit2";
version = "2.14.19";
src = fetchurl {
url = "mirror://gnome/sources/ORBit2/${lib.versions.majorMinor version}/ORBit2-${version}.tar.bz2";
sha256 = "0l3mhpyym9m5iz09fz0rgiqxl2ym6kpkwpsp1xrr4aa80nlh1jam";
};
strictDeps = true;
# Processing file orbit-interface.idl
# sh: gcc: not found
# output does not contain binaries for build
depsBuildBuild = [ buildPackages.stdenv.cc ];
nativeBuildInputs = [
pkg-config
libintl
];
propagatedBuildInputs = [
glib
libIDL
];
outputs = [
"out"
"dev"
];
env.NIX_CFLAGS_COMPILE = toString (
lib.optionals (stdenv.cc.isGNU && (lib.versionAtLeast (lib.getVersion stdenv.cc.cc) "14")) [
# the ./configure script is not compatible with gcc-14, not easy to
# regenerate without porting: https://github.com/NixOS/nixpkgs/issues/367694
"-Wno-error=implicit-int"
"-Wno-error=incompatible-pointer-types"
]
);
configureFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
"--with-idl-compiler=${lib.getExe' buildPackages.gnome2.ORBit2 "orbit-idl-2"}"
# https://github.com/void-linux/void-packages/blob/e5856e02aa6ef7e4f2725afbff2915f89d39024b/srcpkgs/ORBit2/template#L17-L35
"ac_cv_alignof_CORBA_boolean=1"
"ac_cv_alignof_CORBA_char=1"
"ac_cv_alignof_CORBA_double=8"
"ac_cv_alignof_CORBA_float=4"
"ac_cv_alignof_CORBA_long=4"
"ac_cv_alignof_CORBA_long_double=8"
"ac_cv_alignof_CORBA_long_long=8"
"ac_cv_alignof_CORBA_octet=1"
"ac_cv_alignof_CORBA_short=2"
"ac_cv_alignof_CORBA_struct=1"
"ac_cv_alignof_CORBA_wchar=2"
"ac_cv_alignof_CORBA_pointer=${if stdenv.hostPlatform.is64bit then "8" else "4"}"
];
preBuild = ''
sed 's/-DG_DISABLE_DEPRECATED//' -i linc2/src/Makefile
'';
preFixup = ''
moveToOutput "bin/orbit2-config" "$dev"
'';
# Parallel build fails due to missing internal library dependency:
# libtool --tag=CC --mode=link gcc ... -o orbit-name-server-2 ...
# ld: cannot find libname-server-2.a: No such file or directory
# It happens because orbit-name-server-2 should have libname-server-2.a
# in _DEPENDENCIES but does not. Instead of fixing it and regenerating
# Makefile.in let's just disable parallel build.
enableParallelBuilding = false;
meta = with lib; {
homepage = "https://developer-old.gnome.org/ORBit2/";
description = "CORBA 2.4-compliant Object Request Broker";
platforms = platforms.unix;
maintainers = with maintainers; [ lovek323 ];
longDescription = ''
ORBit2 is a CORBA 2.4-compliant Object Request Broker (ORB) featuring
mature C, C++ and Python bindings. Bindings (in various degrees of
completeness) are also available for Perl, Lisp, Pascal, Ruby, and TCL;
others are in-progress. It supports POA, DII, DSI, TypeCode, Any, IR and
IIOP. Optional features including INS and threading are available. ORBit2
is engineered for the desktop workstation environment, with a focus on
performance, low resource usage, and security. The core ORB is written in
C, and runs under Linux, UNIX (BSD, Solaris, HP-UX, ...), and Windows.
ORBit2 is developed and released as open source software under GPL/LGPL.
'';
};
}

View File

@@ -0,0 +1,26 @@
{
lib,
stdenv,
fetchurl,
which,
}:
stdenv.mkDerivation rec {
pname = "gnome-common";
version = "2.34.0";
src = fetchurl {
url = "mirror://gnome/sources/gnome-common/${lib.versions.majorMinor version}/gnome-common-${version}.tar.bz2";
sha256 = "1pz13mpp09q5s3bikm8ml92s1g0scihsm4iipqv1ql3mp6d4z73s";
};
propagatedBuildInputs = [ which ]; # autogen.sh which is using gnome-common tends to require which
patches = [
(fetchurl {
name = "gnome-common-patch";
url = "https://bug697543.bugzilla-attachments.gnome.org/attachment.cgi?id=240935";
sha256 = "17abp7czfzirjm7qsn2czd03hdv9kbyhk3lkjxg2xsf5fky7z7jl";
})
];
}

View File

@@ -0,0 +1,16 @@
{
lib,
stdenv,
fetchurl,
intltool,
}:
stdenv.mkDerivation rec {
pname = "gnome-mime-data";
version = "2.18.0";
src = fetchurl {
url = "mirror://gnome/sources/gnome-mime-data/${lib.versions.majorMinor version}/gnome-mime-data-${version}.tar.bz2";
sha256 = "1mvg8glb2a40yilmyabmb7fkbzlqd3i3d31kbkabqnq86xdnn69p";
};
nativeBuildInputs = [ intltool ];
}

View File

@@ -0,0 +1,71 @@
{
lib,
stdenv,
fetchFromGitLab,
pkg-config,
gtk-doc,
autoconf,
automake,
which,
libtool,
gobject-introspection,
glib,
gtk2,
libGLU,
libGL,
pango,
xorg,
}:
stdenv.mkDerivation {
pname = "gtkglext";
version = "unstable-2019-12-19";
src = fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "Archive";
repo = "gtkglext";
# build fixes
# https://gitlab.gnome.org/Archive/gtkglext/merge_requests/1
rev = "ad95fbab68398f81d7a5c895276903b0695887e2";
sha256 = "1d1bp4635nla7d07ci40c7w4drkagdqk8wg93hywvdipmjfb4yqb";
};
nativeBuildInputs = [
pkg-config
gtk-doc
autoconf
automake
which
libtool
gobject-introspection
];
buildInputs = [
glib
gtk2
libGLU
libGL
pango
xorg.libX11
xorg.libXmu
];
preConfigure = ''
NOCONFIGURE=1 ./autogen.sh
'';
meta = with lib; {
homepage = "https://projects.gnome.org/gtkglext/";
description = "GtkGLExt, an OpenGL extension to GTK";
longDescription = ''
GtkGLExt is an OpenGL extension to GTK. It provides additional GDK
objects which support OpenGL rendering in GTK and GtkWidget API
add-ons to make GTK widgets OpenGL-capable. In contrast to Janne
Löf's GtkGLArea, GtkGLExt provides a GtkWidget API that enables
OpenGL drawing for standard and custom GTK widgets.
'';
license = licenses.lgpl2Plus;
platforms = platforms.linux;
};
}

View File

@@ -0,0 +1,40 @@
{
lib,
stdenv,
fetchurl,
flex,
bison,
pkg-config,
glib,
gettext,
}:
stdenv.mkDerivation rec {
pname = "libIDL";
version = "0.8.14";
src = fetchurl {
url = "mirror://gnome/sources/libIDL/${lib.versions.majorMinor version}/libIDL-${version}.tar.bz2";
sha256 = "08129my8s9fbrk0vqvnmx6ph4nid744g5vbwphzkaik51664vln5";
};
strictDeps = true;
buildInputs = [
glib
gettext
];
nativeBuildInputs = [
flex
bison
pkg-config
];
configureFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
# before openembedded removed libIDL
# the result was always ll https://lists.openembedded.org/g/openembedded-core/topic/85775262?p=%2C%2C%2C20%2C0%2C0%2C0%3A%3A%2C%2C%2C0%2C0%2C0%2C85775262
"libIDL_cv_long_long_format=ll"
];
meta.mainProgram = "libIDL-config-2";
}

View File

@@ -0,0 +1,15 @@
{
lib,
stdenv,
fetchurl,
}:
stdenv.mkDerivation rec {
pname = "libart_lgpl";
version = "2.3.21";
src = fetchurl {
url = "mirror://gnome/sources/libart_lgpl/${lib.versions.majorMinor version}/libart_lgpl-${version}.tar.bz2";
sha256 = "1yknfkyzgz9s616is0l9gp5aray0f2ry4dw533jgzj8gq5s1xhgx";
};
meta.mainProgram = "libart2-config";
}

View File

@@ -0,0 +1,42 @@
{
lib,
stdenv,
fetchurl,
pkg-config,
gtk2,
libxml2,
gettext,
}:
stdenv.mkDerivation rec {
pname = "libglade";
version = "2.6.4";
src = fetchurl {
url = "mirror://gnome/sources/libglade/${lib.versions.majorMinor version}/libglade-${version}.tar.bz2";
sha256 = "1v2x2s04jry4gpabws92i0wq2ghd47yr5n9nhgnkd7c38xv1wdk4";
};
outputs = [
"out"
"dev"
];
strictDeps = true;
nativeBuildInputs = [
pkg-config
gettext
];
buildInputs = [ gtk2 ];
propagatedBuildInputs = [ libxml2 ];
postPatch = ''
# uses pkg-config in some places and uses the correct $PKG_CONFIG in some
# it's an ancient library so it has very old configure scripts and m4
substituteInPlace ./configure \
--replace "pkg-config" "$PKG_CONFIG"
'';
NIX_LDFLAGS = "-lgmodule-2.0";
}

View File

@@ -0,0 +1,39 @@
{
lib,
stdenv,
fetchurl,
pkg-config,
gtk2,
intltool,
libart_lgpl,
libglade,
glib,
}:
stdenv.mkDerivation rec {
pname = "libgnomecanvas";
version = "2.30.3";
src = fetchurl {
url = "mirror://gnome/sources/libgnomecanvas/${lib.versions.majorMinor version}/libgnomecanvas-${version}.tar.bz2";
sha256 = "0h6xvswbqspdifnyh5pm2pqq55yp3kn6yrswq7ay9z49hkh7i6w5";
};
outputs = [
"out"
"dev"
];
strictDeps = true;
buildInputs = [ libglade ];
nativeBuildInputs = [
pkg-config
intltool
glib
];
propagatedBuildInputs = [
libart_lgpl
gtk2
];
}

View File

@@ -0,0 +1,149 @@
{
config,
pkgs,
lib,
}:
# NOTE: New packages should generally go to top-level instead of here!
lib.makeScope pkgs.newScope (
self:
let
inherit (self) callPackage;
in
{
updateScript = callPackage ./update.nix { };
# Temporary helper until gdk-pixbuf supports multiple cache files.
# This will go away, do not use outside Nixpkgs.
_gdkPixbufCacheBuilder_DO_NOT_USE = callPackage ./gdk-pixbuf-cache-builder.nix { };
# ISO installer
# installerIso = callPackage ./installer.nix {};
#### Core (http://ftp.acc.umu.se/pub/GNOME/core/)
gvfs = pkgs.gvfs.override { gnomeSupport = true; };
nixos-gsettings-overrides = callPackage ./nixos/gsettings-overrides { };
}
)
// lib.optionalAttrs config.allowAliases {
#### Legacy aliases. They need to be outside the scope or they will shadow the attributes from parent scope.
libgnome-keyring = throw "The gnome.libgnome-keyring was moved to top-level. Please use pkgs.libgnome-keyring directly."; # Added on 2024-06-22.
libchamplain = throw "The gnome.libchamplain was removed as unused. Please use pkgs.libchamplain directly."; # Added on 2024-08-11.
libsoup = throw "The gnome.libsoup was removed as unused. Please use pkgs.libsoup."; # Added on 2024-08-11.
gedit = throw "The gnome.gedit alias was removed. Please use pkgs.gedit directly."; # converted to throw on 2023-12-27
gnome-todo = throw "The gnome.gnome-todo alias was removed. Please use pkgs.endeavour directly."; # converted to throw on 2023-12-27
gnome-online-miners = throw "The gnome.gnome-online-miners was removed, it was broken and abandoned."; # added on 2024-08-11.
accerciser = throw "The gnome.accerciser was moved to top-level. Please use pkgs.accerciser directly."; # Added on 2024-06-22.
adwaita-icon-theme = throw "The gnome.adwaita-icon-theme was moved to top-level. Please use pkgs.adwaita-icon-theme directly."; # Added on 2024-06-22.
aisleriot = throw "The gnome.aisleriot was moved to top-level. Please use pkgs.aisleriot directly."; # Added on 2024-08-11.
atomix = throw "The gnome.atomix was moved to top-level. Please use pkgs.atomix directly."; # Added on 2024-08-11.
baobab = throw "The gnome.baobab was moved to top-level. Please use pkgs.baobab directly."; # Added on 2024-06-22.
caribou = throw "The gnome.caribou was moved to top-level. Please use pkgs.caribou directly."; # Added on 2024-08-11.
cheese = throw "The gnome.cheese was moved to top-level. Please use pkgs.cheese directly."; # Added on 2024-06-22.
dconf-editor = throw "The gnome.dconf-editor was moved to top-level. Please use pkgs.dconf-editor directly."; # Added on 2024-06-22.
devhelp = throw "The gnome.devhelp was moved to top-level. Please use pkgs.devhelp directly."; # Added on 2024-06-22.
eog = throw "The gnome.eog was moved to top-level. Please use pkgs.eog directly."; # Added on 2024-06-22.
epiphany = throw "The gnome.epiphany was moved to top-level. Please use pkgs.epiphany directly."; # Added on 2024-06-22.
evince = throw "The gnome.evince was moved to top-level. Please use pkgs.evince directly."; # Added on 2024-06-13.
evolution-data-server = throw "The gnome.evolution-data-server was moved to top-level. Please use pkgs.evolution-data-server directly."; # Added on 2024-06-13.
file-roller = throw "The gnome.file-roller was moved to top-level. Please use pkgs.file-roller directly."; # Added on 2024-06-13.
five-or-more = throw "The gnome.five-or-more was moved to top-level. Please use pkgs.five-or-more directly."; # Added on 2024-08-11.
four-in-a-row = throw "The gnome.four-in-a-row was moved to top-level. Please use pkgs.four-in-a-row directly."; # Added on 2024-08-11.
gdm = throw "The gnome.gdm was moved to top-level. Please use pkgs.gdm directly."; # Added on 2024-08-11.
geary = throw "The gnome.geary was moved to top-level. Please use pkgs.geary directly."; # Added on 2024-06-22.
ghex = throw "The gnome.ghex was moved to top-level. Please use pkgs.ghex directly."; # Added on 2024-06-22.
gitg = throw "The gnome.gitg was moved to top-level. Please use pkgs.gitg directly."; # Added on 2024-06-22.
gnome-applets = throw "The gnome.gnome-applets was moved to top-level. Please use pkgs.gnome-applets directly."; # Added on 2024-08-31.
gnome-autoar = throw "The gnome.gnome-autoar was moved to top-level. Please use pkgs.gnome-autoar directly."; # Added on 2024-06-13.
gnome-backgrounds = throw "The gnome.gnome-backgrounds was moved to top-level. Please use pkgs.gnome-backgrounds directly."; # Added on 2024-08-11.
gnome-bluetooth = throw "The gnome.gnome-bluetooth was moved to top-level. Please use pkgs.gnome-bluetooth directly."; # Added on 2024-08-28.
gnome-bluetooth_1_0 = throw "The gnome.gnome-bluetooth_1_0 was moved to top-level. Please use pkgs.gnome-bluetooth_1_0 directly."; # Added on 2024-08-28.
gnome-boxes = throw "The gnome.gnome-boxes was moved to top-level. Please use pkgs.gnome-boxes directly."; # Added on 2024-08-11.
gnome-characters = throw "The gnome.gnome-characters was moved to top-level. Please use pkgs.gnome-characters directly."; # Added on 2024-08-11.
gnome-chess = throw "The gnome.gnome-chess was moved to top-level. Please use pkgs.gnome-chess directly."; # Added on 2024-08-11.
gnome-clocks = throw "The gnome.gnome-clocks was moved to top-level. Please use pkgs.gnome-clocks directly."; # Added on 2024-08-11.
gnome-color-manager = throw "The gnome.gnome-color-manager was moved to top-level. Please use pkgs.gnome-color-manager directly."; # Added on 2024-08-11.
gnome-common = throw "The gnome.gnome-common was moved to top-level. Please use pkgs.gnome-common directly."; # Added on 2024-06-22.
gnome-calculator = throw "The gnome.gnome-calculator was moved to top-level. Please use pkgs.gnome-calculator directly."; # Added on 2024-06-22.
gnome-calendar = throw "The gnome.gnome-calendar was moved to top-level. Please use pkgs.gnome-calendar directly."; # Added on 2024-06-22.
gnome-contacts = throw "The gnome.gnome-contacts was moved to top-level. Please use pkgs.gnome-contacts directly."; # Added on 2024-08-11.
gnome-control-center = throw "The gnome.gnome-control-center was moved to top-level. Please use pkgs.gnome-control-center directly."; # Added on 2024-08-28.
gnome-dictionary = throw "The gnome.gnome-dictionary was moved to top-level. Please use pkgs.gnome-dictionary directly."; # Added on 2024-06-22.
gnome-disk-utility = throw "The gnome.gnome-disk-utility was moved to top-level. Please use pkgs.gnome-disk-utility directly."; # Added on 2024-06-22.
gnome-flashback = throw "The gnome.gnome-flashback was moved to top-level. Please use pkgs.gnome-flashback directly."; # Added on 2024-08-31.
gnome-font-viewer = throw "The gnome.gnome-font-viewer was moved to top-level. Please use pkgs.gnome-font-viewer directly."; # Added on 2024-06-22.
gnome-initial-setup = throw "The gnome.gnome-initial-setup was moved to top-level. Please use pkgs.gnome-initial-setup directly."; # Added on 2024-08-11.
gnome-keyring = throw "The gnome.gnome-keyring was moved to top-level. Please use pkgs.gnome-keyring directly."; # Added on 2024-06-22.
gnome-klotski = throw "The gnome.gnome-klotski was moved to top-level. Please use pkgs.gnome-klotski directly."; # Added on 2024-08-11.
gnome-logs = throw "The gnome.gnome-logs was moved to top-level. Please use pkgs.gnome-logs directly."; # Added on 2024-08-11.
gnome-mahjongg = throw "The gnome.gnome-mahjongg was moved to top-level. Please use pkgs.gnome-mahjongg directly."; # Added on 2024-08-11.
gnome-maps = throw "The gnome.gnome-maps was moved to top-level. Please use pkgs.gnome-maps directly."; # Added on 2024-08-11.
gnome-mines = throw "The gnome.gnome-mines was moved to top-level. Please use pkgs.gnome-mines directly."; # Added on 2024-08-11.
gnome-music = throw "The gnome.gnome-music was moved to top-level. Please use pkgs.gnome-music directly."; # Added on 2024-08-11.
gnome-nettool = throw "The gnome.gnome-nettool was moved to top-level. Please use pkgs.gnome-nettool directly."; # Added on 2024-08-11.
gnome-nibbles = throw "The gnome.gnome-nibbles was moved to top-level. Please use pkgs.gnome-nibbles directly."; # Added on 2024-08-11.
gnome-notes = throw "The gnome.gnome-notes was moved to top-level. Please use pkgs.gnome-notes directly."; # Added on 2024-08-11.
gnome-packagekit = throw "The gnome.gnome-packagekit was moved to top-level. Please use pkgs.gnome-packagekit directly."; # Added on 2024-06-22.
gnome-panel = throw "The gnome.gnome-panel was moved to top-level. Please use pkgs.gnome-panel directly."; # Added on 2024-08-31.
gnome-panel-with-modules = throw "The gnome.gnome-panel-with-modules was moved to top-level. Please use pkgs.gnome-panel-with-modules directly."; # Added on 2024-08-31.
gnome-power-manager = throw "The gnome.gnome-power-manager was moved to top-level. Please use pkgs.gnome-power-manager directly."; # Added on 2024-08-11.
gnome-remote-desktop = throw "The gnome.gnome-remote-desktop was moved to top-level. Please use pkgs.gnome-remote-desktop directly."; # Added on 2024-08-11.
gnome-robots = throw "The gnome.gnome-robots was moved to top-level. Please use pkgs.gnome-robots directly."; # Added on 2024-08-11.
gnome-screenshot = throw "The gnome.gnome-screenshot was moved to top-level. Please use pkgs.gnome-screenshot directly."; # Added on 2024-06-22.
gnome-session = throw "The gnome.gnome-session was moved to top-level. Please use pkgs.gnome-session directly."; # Added on 2024-08-28.
gnome-session-ctl = throw "The gnome.gnome-session-ctl was moved to top-level. Please use pkgs.gnome-session-ctl directly."; # Added on 2024-08-28.
gnome-settings-daemon = throw "The gnome.gnome-settings-daemon was moved to top-level. Please use pkgs.gnome-settings-daemon directly."; # Added on 2024-08-28.
gnome-settings-daemon43 = throw "The gnome.gnome-settings-daemon43 was removed since it is no longer used by Pantheon."; # Added on 2024-08-28.
gnome-shell = throw "The gnome.gnome-shell was moved to top-level. Please use pkgs.gnome-shell directly."; # Added on 2024-08-28.
gnome-shell-extensions = throw "The gnome.gnome-shell-extensions was moved to top-level. Please use pkgs.gnome-shell-extensions directly."; # Added on 2024-08-11.
gnome-software = throw "The gnome.gnome-software was moved to top-level. Please use pkgs.gnome-software directly."; # Added on 2024-08-11.
gnome-sound-recorder = throw "The gnome.gnome-sound-recorder was moved to top-level. Please use pkgs.gnome-sound-recorder directly."; # Added on 2024-08-11.
gnome-sudoku = throw "The gnome.gnome-sudoku was moved to top-level. Please use pkgs.gnome-sudoku directly."; # Added on 2024-08-11.
gnome-system-monitor = throw "The gnome.gnome-system-monitor was moved to top-level. Please use pkgs.gnome-system-monitor directly."; # Added on 2024-06-22.
gnome-taquin = throw "The gnome.gnome-taquin was moved to top-level. Please use pkgs.gnome-taquin directly."; # Added on 2024-08-11.
gnome-terminal = throw "The gnome.gnome-terminal was moved to top-level. Please use pkgs.gnome-terminal directly."; # Added on 2024-06-13.
gnome-tetravex = throw "The gnome.gnome-tetravex was moved to top-level. Please use pkgs.gnome-tetravex directly."; # Added on 2024-08-11.
gnome-themes-extra = throw "The gnome.gnome-themes-extra was moved to top-level. Please use pkgs.gnome-themes-extra directly."; # Added on 2024-06-22.
gnome-tweaks = throw "The gnome.gnome-tweaks was moved to top-level. Please use pkgs.gnome-tweaks directly."; # Added on 2024-06-22.
gnome-user-share = throw "The gnome.gnome-user-share was moved to top-level. Please use pkgs.gnome-user-share directly."; # Added on 2024-06-13.
gnome-weather = throw "The gnome.gnome-weather was moved to top-level. Please use pkgs.gnome-weather directly."; # Added on 2024-08-11.
gpaste = throw "The gnome.gpaste was moved to top-level. Please use pkgs.gpaste directly."; # Added on 2024-06-22.
gtkhtml = throw "The gnome.gtkhtml was moved to top-level. Please use pkgs.gtkhtml directly."; # Added on 2024-08-11.
gucharmap = throw "The gnome.gucharmap was moved to top-level. Please use pkgs.gucharmap directly."; # Added on 2024-06-22.
hitori = throw "The gnome.hitori was moved to top-level. Please use pkgs.hitori directly."; # Added on 2024-08-11.
iagno = throw "The gnome.iagno was moved to top-level. Please use pkgs.iagno directly."; # Added on 2024-08-11.
lightsoff = throw "The gnome.lightsoff was moved to top-level. Please use pkgs.lightsoff directly."; # Added on 2024-08-11.
metacity = throw "The gnome.metacity was moved to top-level. Please use pkgs.metacity directly."; # Added on 2024-08-11.
mutter = throw "The gnome.mutter was moved to top-level. Please use pkgs.mutter directly."; # Added on 2024-08-28.
mutter43 = throw "The gnome.mutter43 was removed since it is no longer used by Pantheon."; # Added on 2024-08-28.
nautilus = throw "The gnome.nautilus was moved to top-level. Please use pkgs.nautilus directly."; # Added on 2024-06-13.
networkmanager-openvpn = throw "The gnome.networkmanager-openvpn was moved to top-level. Please use pkgs.networkmanager-openvpn directly."; # Added on 2024-08-31.
networkmanager-vpnc = throw "The gnome.networkmanager-vpnc was moved to top-level. Please use pkgs.networkmanager-vpnc directly."; # Added on 2024-08-31.
networkmanager-openconnect = throw "The gnome.networkmanager-openconnect was moved to top-level. Please use pkgs.networkmanager-openconnect directly."; # Added on 2024-08-31.
networkmanager-fortisslvpn = throw "The gnome.networkmanager-fortisslvpn was moved to top-level. Please use pkgs.networkmanager-fortisslvpn directly."; # Added on 2024-08-31.
networkmanager-l2tp = throw "The gnome.networkmanager-l2tp was moved to top-level. Please use pkgs.networkmanager-l2tp directly."; # Added on 2024-08-31.
networkmanager-iodine = throw "The gnome.networkmanager-iodine was moved to top-level. Please use pkgs.networkmanager-iodine directly."; # Added on 2024-08-31.
nautilus-python = throw "The gnome.nautilus-python was moved to top-level. Please use pkgs.nautilus-python directly."; # Added on 2024-06-13.
polari = throw "The gnome.polari was moved to top-level. Please use pkgs.polari directly."; # Added on 2024-08-11.
pomodoro = throw "The gnome.pomodoro was moved to top-level. Please use pkgs.gnome-pomodoro directly."; # Added on 2024-06-22.
quadrapassel = throw "The gnome.quadrapassel was moved to top-level. Please use pkgs.quadrapassel directly."; # Added on 2024-08-11.
rygel = throw "The gnome.rygel was moved to top-level. Please use pkgs.rygel directly."; # Added on 2024-06-22.
seahorse = throw "The gnome.seahorse was moved to top-level. Please use pkgs.seahorse directly."; # Added on 2024-06-22.
simple-scan = throw "The gnome.simple-scan was moved to top-level. Please use pkgs.simple-scan directly."; # Added on 2024-06-22.
sushi = throw "The gnome.sushi was moved to top-level. Please use pkgs.sushi directly."; # Added on 2024-06-22.
swell-foop = throw "The gnome.swell-foop was moved to top-level. Please use pkgs.swell-foop directly."; # Added on 2024-08-11.
tali = throw "The gnome.tali was moved to top-level. Please use pkgs.tali directly."; # Added on 2024-08-11.
totem = throw "The gnome.totem was moved to top-level. Please use pkgs.totem directly."; # Added on 2024-06-22.
vinagre = throw "The gnome.vinagre was moved to top-level. Please use pkgs.vinagre directly."; # Added on 2024-08-11.
yelp = throw "The gnome.yelp was moved to top-level. Please use pkgs.yelp directly."; # Added on 2024-06-22.
yelp-xsl = throw "The gnome.yelp-xsl was moved to top-level. Please use pkgs.yelp-xsl directly."; # Added on 2024-06-22.
zenity = throw "The gnome.zenity was moved to top-level. Please use pkgs.zenity directly."; # Added on 2024-06-22.
#### Removals
anjuta = throw "`anjuta` was removed after not being maintained upstream and losing control of its official domain."; # 2024-01-16
}

View File

@@ -0,0 +1,48 @@
{
lib,
stdenv,
fetchFromGitHub,
replaceVars,
glib,
gnome-shell,
gettext,
jq,
intltool,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "gnome-shell-extension-EasyScreenCast";
version = "1.11.1";
src = fetchFromGitHub {
owner = "EasyScreenCast";
repo = "EasyScreenCast";
rev = finalAttrs.version;
hash = "sha256-G4JDxaUfipn9asOXGw+OPVULOdV+OmzeK5aE/FSPGes=";
};
patches = [
(replaceVars ./fix-gi-path.patch {
gnomeShell = gnome-shell;
})
];
nativeBuildInputs = [
glib
gettext
jq
intltool
];
makeFlags = [ "INSTALLBASE=$(out)/share/gnome-shell/extensions" ];
passthru.extensionUuid = "EasyScreenCast@iacopodeenosee.gmail.com";
meta = {
description = "Simplifies the use of the video recording function integrated in gnome shell";
homepage = "https://github.com/EasyScreenCast/EasyScreenCast";
license = lib.licenses.gpl3Plus;
maintainers = [ ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,63 @@
diff --git i/extension.js w/extension.js
index c151057..1b6dfc3 100644
--- i/extension.js
+++ w/extension.js
@@ -717,7 +717,7 @@ const EasyScreenCastIndicator = GObject.registerClass({
Lib.TalkativeLog('-*-execute post command');
// launch cmd after registration
- const tmpCmd = `/usr/bin/sh -c "${this._settings.getOption('s', Settings.POST_CMD_SETTING_KEY)}"`;
+ const tmpCmd = `/bin/sh -c "${this._settings.getOption('s', Settings.POST_CMD_SETTING_KEY)}"`;
const mapObj = {
_fpath: pathFile,
diff --git i/prefs.js w/prefs.js
index e0dd1a2..9dcb87a 100644
--- i/prefs.js
+++ w/prefs.js
@@ -13,8 +13,8 @@
'use strict';
import GIRepository from 'gi://GIRepository';
-GIRepository.Repository.prepend_search_path('/usr/lib64/gnome-shell');
-GIRepository.Repository.prepend_library_path('/usr/lib64/gnome-shell');
+GIRepository.Repository.prepend_search_path('@gnomeShell@/lib/gnome-shell');
+GIRepository.Repository.prepend_library_path('@gnomeShell@/lib/gnome-shell');
import Adw from 'gi://Adw';
import GObject from 'gi://GObject';
@@ -713,7 +713,7 @@ const EasyScreenCastSettingsWidget = GObject.registerClass({
Lib.TalkativeLog('-^-NOT SET xdg-user video');
ctx.CtrlExe.Execute(
- '/usr/bin/sh -c "echo $HOME"',
+ '/bin/sh -c "echo $HOME"',
true,
(success, out) => {
Lib.TalkativeLog(`-^-CALLBACK sync S: ${success} out: ${out}`);
@@ -883,7 +883,7 @@ const EasyScreenCastSettingsWidget = GObject.registerClass({
);
ctx.CtrlExe.Execute(
- 'journalctl /usr/bin/gnome-shell --since "15 min ago" --output=cat --no-pager',
+ 'journalctl @gnomeShell@/bin/.gnome-shell-wrapped --since "15 min ago" --output=cat --no-pager',
false,
success => {
Lib.TalkativeLog(`-^-CALLBACK async S= ${success}`);
diff --git i/utilaudio.js w/utilaudio.js
index b07e181..ed7d3ba 100644
--- i/utilaudio.js
+++ w/utilaudio.js
@@ -14,10 +14,8 @@
import GObject from 'gi://GObject';
import GIRepository from 'gi://GIRepository';
-GIRepository.Repository.prepend_search_path('/usr/lib/gnome-shell');
-GIRepository.Repository.prepend_library_path('/usr/lib/gnome-shell');
-GIRepository.Repository.prepend_search_path('/usr/lib64/gnome-shell');
-GIRepository.Repository.prepend_library_path('/usr/lib64/gnome-shell');
+GIRepository.Repository.prepend_search_path('@gnomeShell@/lib/gnome-shell');
+GIRepository.Repository.prepend_library_path('@gnomeShell@/lib/gnome-shell');
import Gvc from 'gi://Gvc';
import * as Lib from './convenience.js';

View File

@@ -0,0 +1,32 @@
# GNOME Shell extensions
All extensions are packaged automatically. They can be found in the `pkgs.gnomeXYExtensions` for XY being a GNOME version. The package names are the extensions UUID, which can be a bit unwieldy to use. `pkgs.gnomeExtensions` is a set of manually curated extensions that match the current `pkgs.gnome-shell` versions. Their name is human-friendly, compared to the other extensions sets. Some of its extensions are manually packaged.
## Automatically packaged extensions
The actual packages are created by `buildGnomeExtension.nix`, provided the correct arguments are fed into it. The important extension data is stored in `extensions.json`, one line/item per extension. That file is generated by running `update-extensions.py`. Furthermore, the automatic generated names are dumped in `collisions.json` for manual inspection. `extensionRenames.nix` contains new names for all extensions that collide.
### Extensions updates
#### For everyday updates,
1. Run `update-extensions.py`.
2. Update `extensionRenames.nix` according to the comment at the top.
#### To package the extensions for new GNOME version,
1. Add a new `gnomeXYExtensions` set in `default.nix`.
2. Update `all-packages.nix` accordingly. (grep for `gnomeExtensions`)
3. Update `supported_versions` in `update-extensions.py`.
4. Follow the [For everyday updates](#for-everyday-updates) section.
#### For GNOME updates,
1. Follow the [To package the extensions for new GNOME version](#to-package-the-extensions-for-new-gnome-version) section if required.
2. Update `versions_to_merge` variable in `./update-extensions.py`.
3. Run `update-extensions.py --skip-fetch`, and update `extensionRenames.nix` according to the comment at the top.
4. Update `gnomeExtensions` in `default.nix` to the new versions.
## Manually packaged extensions
Manually packaged extensions overwrite some of the automatically packaged ones in `pkgs.gnomeExtensions`. They are listed in `manuallyPackaged.nix`, every extension has its own sub-folder.

View File

@@ -0,0 +1,46 @@
{
lib,
stdenv,
fetchFromGitLab,
glib,
gettext,
replaceVars,
gnome-menus,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-arcmenu";
version = "65";
src = fetchFromGitLab {
owner = "arcmenu";
repo = "ArcMenu";
rev = "v${version}";
hash = "sha256-EEK600DwIQAPWR07IMPNZFiWWkiG0blp/D0VKAcc7ns=";
};
patches = [
(replaceVars ./fix_gmenu.patch {
gmenu_path = "${gnome-menus}/lib/girepository-1.0";
})
];
buildInputs = [
glib
gettext
];
makeFlags = [ "INSTALLBASE=${placeholder "out"}/share/gnome-shell/extensions" ];
passthru = {
extensionUuid = "arcmenu@arcmenu.com";
extensionPortalSlug = "arcmenu";
};
meta = with lib; {
description = "Application menu for GNOME Shell, designed to provide a more traditional user experience and workflow";
license = licenses.gpl2Plus;
maintainers = with maintainers; [ dkabot ];
homepage = "https://gitlab.com/arcmenu/ArcMenu";
};
}

View File

@@ -0,0 +1,31 @@
--- a/menuWidgets.js
+++ b/menuWidgets.js
@@ -3,7 +3,11 @@
import Atk from 'gi://Atk';
import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
-import GMenu from 'gi://GMenu';
+
+import GIRepository from 'gi://GIRepository';
+GIRepository.Repository.prepend_search_path('@gmenu_path@');
+const {default: GMenu} = await import('gi://GMenu');
+
import GObject from 'gi://GObject';
import Graphene from 'gi://Graphene';
import Pango from 'gi://Pango';
--- a/menulayouts/baseMenuLayout.js
+++ b/menulayouts/baseMenuLayout.js
@@ -1,7 +1,11 @@
import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
-import GMenu from 'gi://GMenu';
+
+import GIRepository from 'gi://GIRepository';
+GIRepository.Repository.prepend_search_path('@gmenu_path@');
+const {default: GMenu} = await import('gi://GMenu');
+
import GObject from 'gi://GObject';
import Shell from 'gi://Shell';
import St from 'gi://St';

View File

@@ -0,0 +1,36 @@
{
fetchFromGitHub,
lib,
stdenv,
unstableGitUpdater,
}:
stdenv.mkDerivation {
pname = "argos";
version = "unstable-2025-03-27";
src = fetchFromGitHub {
owner = "p-e-w";
repo = "argos";
rev = "13264042ae8b8a6f9f4778c623780e38e5d1cd89";
hash = "sha256-PMMpTaihMHj1FmnjJoZqAhDYVd263M1OZAC+OAnaZEg=";
};
installPhase = ''
mkdir -p "$out/share/gnome-shell/extensions"
cp -a argos@pew.worldwidemann.com "$out/share/gnome-shell/extensions"
'';
passthru = {
extensionUuid = "argos@pew.worldwidemann.com";
extensionPortalSlug = "argos";
updateScript = unstableGitUpdater { };
};
meta = with lib; {
description = "Create GNOME Shell extensions in seconds";
license = licenses.gpl3;
maintainers = with maintainers; [ andersk ];
homepage = "https://github.com/p-e-w/argos";
};
}

View File

@@ -0,0 +1,79 @@
{
pkgs,
lib,
stdenv,
fetchzip,
nixosTests,
}:
let
buildGnomeExtension =
{
# Every gnome extension has a UUID. It's the name of the extension folder once unpacked
# and can always be found in the metadata.json of every extension.
uuid,
name,
pname,
description,
# extensions.gnome.org extension URL
link,
# Extension version numbers are integers
version,
sha256,
# Hex-encoded string of JSON bytes
metadata,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-${pname}";
version = toString version;
src = fetchzip {
url = "https://extensions.gnome.org/extension-data/${
builtins.replaceStrings [ "@" ] [ "" ] uuid
}.v${toString version}.shell-extension.zip";
inherit sha256;
stripRoot = false;
# The download URL may change content over time. This is because the
# metadata.json is automatically generated, and parts of it can be changed
# without making a new release. We simply substitute the possibly changed fields
# with their content from when we last updated, and thus get a deterministic output
# hash.
postFetch = ''
echo "${metadata}" | base64 --decode > $out/metadata.json
'';
};
nativeBuildInputs = with pkgs; [ buildPackages.glib ];
buildPhase = ''
runHook preBuild
if [ -d schemas ]; then
glib-compile-schemas --strict schemas
fi
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions/
cp -r -T . $out/share/gnome-shell/extensions/${uuid}
runHook postInstall
'';
meta = {
description = builtins.head (lib.splitString "\n" description);
longDescription = description;
homepage = link;
license = lib.licenses.gpl2Plus; # https://gjs.guide/extensions/review-guidelines/review-guidelines.html#licensing
platforms = lib.platforms.linux;
maintainers = [ lib.maintainers.honnip ];
};
passthru = {
extensionPortalSlug = pname;
# Store the extension's UUID, because we might need it at some places
extensionUuid = uuid;
tests = {
gnome-extensions = nixosTests.gnome-extensions;
};
};
};
in
lib.makeOverridable buildGnomeExtension

View File

@@ -0,0 +1,50 @@
{
lib,
stdenv,
fetchzip,
gnome-shell,
gettext,
glib,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-clock-override";
version = "12";
src = fetchzip {
url = "https://extensions.gnome.org/extension-data/clock-overridegnomeshell.kryogenix.org.v${version}.shell-extension.zip";
sha256 = "1cyaszks6bwnbgacqsl1pmr24mbj05mad59d4253la9am8ibb4m6";
stripRoot = false;
};
passthru = {
extensionUuid = "clock-override@gnomeshell.kryogenix.org";
extensionPortalSlug = "clock-override";
};
nativeBuildInputs = [
gettext
glib
];
buildPhase = ''
runHook preBuild
glib-compile-schemas --strict --targetdir=schemas schemas
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p "$out/share/gnome-shell/extensions/clock-override@gnomeshell.kryogenix.org"
cp -r {convenience.js,extension.js,format.js,locale,metadata.json,prefs.js,schemas} "$out/share/gnome-shell/extensions/clock-override@gnomeshell.kryogenix.org"
runHook postInstall
'';
meta = with lib; {
description = "Customize the date and time format displayed in clock in the top bar in GNOME Shell";
license = licenses.mit;
maintainers = with maintainers; [ rhoriguchi ];
homepage = "https://github.com/stuartlangridge/gnome-shell-clock-override";
broken = versionOlder gnome-shell.version "3.18";
};
}

View File

@@ -0,0 +1,43 @@
{
"applications-menu": [
"Applications_Menu@rmy.pobox.com",
"apps-menu@gnome-shell-extensions.gcampax.github.com"
],
"battery-time": [
"batime@martin.zurowietz.de",
"battery-time@eetumos.github.com",
"batterytime@typeof.pw"
],
"eur-usd": [
"eur-usd-gshell@vezza.github.com",
"usd-mxn-gshell@kinduff.github.com"
],
"fullscreen-to-empty-workspace": [
"fullscreen-to-empty-workspace2@corgijan.dev",
"fullscreen-to-empty-workspace@aiono.dev"
],
"fuzzy-clock": [
"FuzzyClock@fire-man-x",
"FuzzyClock@johngoetz"
],
"mouse-follows-focus": [
"mouse-follows-focus@crisidev.org",
"mousefollowsfocus@matthes.biz"
],
"nepali-calendar": [
"nepali-calendar-gs-extension@subashghimire.info.np",
"nepali-date@biplab"
],
"persian-calendar": [
"PersianCalendar@oxygenws.com",
"persian-calendar@iamrezamousavi.gmail.com"
],
"power-profile-indicator": [
"power-profile-indicator@laux.wtf",
"power-profile@fthx"
],
"system-monitor": [
"System_Monitor@bghome.gmail.com",
"system-monitor@gnome-shell-extensions.gcampax.github.com"
]
}

View File

@@ -0,0 +1,109 @@
{
lib,
callPackage,
config,
}:
let
buildShellExtension = callPackage ./buildGnomeExtension.nix { };
# Index of all scraped extensions (with supported versions)
extensionsIndex = lib.importJSON ./extensions.json;
# A list of UUIDs that have the same pname and we need to rename them
extensionRenames = import ./extensionRenames.nix;
# Take all extensions from the index that match the gnome version, build them and put them into a list of derivations
produceExtensionsList =
shell-version:
lib.trivial.pipe extensionsIndex [
# Does a given extension match our current shell version?
(builtins.filter (extension: (builtins.hasAttr shell-version extension."shell_version_map")))
# Take in an `extension` object from the JSON and transform it into the correct args to call `buildShellExtension`
(map (extension: {
inherit (extension)
uuid
name
description
link
pname
;
inherit (extension.shell_version_map.${shell-version}) version sha256 metadata;
}))
# Build them
(map buildShellExtension)
];
# Map the list of extensions to an attrset based on the UUID as key
mapUuidNames =
extensions:
lib.trivial.pipe extensions [
(map (extension: lib.nameValuePair extension.extensionUuid extension))
builtins.listToAttrs
];
# Map the list of extensions to an attrset based on the pname as key, which is more human readable than the UUID
# We also take care of conflict renaming in here
mapReadableNames =
extensionsList:
lib.trivial.pipe extensionsList [
# Filter out all extensions that map to null
(lib.filter (
extension:
!(
(builtins.hasAttr extension.extensionUuid extensionRenames)
&& ((builtins.getAttr extension.extensionUuid extensionRenames) == null)
)
))
# Map all extensions to their pname, with potential overwrites
(map (
extension:
lib.nameValuePair (extensionRenames.${extension.extensionUuid} or extension.extensionPortalSlug
) extension
))
builtins.listToAttrs
];
in
rec {
# Remember to import all these in all-packages.nix
gnome38Extensions = mapUuidNames (produceExtensionsList "38");
gnome40Extensions = mapUuidNames (produceExtensionsList "40");
gnome41Extensions = mapUuidNames (produceExtensionsList "41");
gnome42Extensions = mapUuidNames (produceExtensionsList "42");
gnome43Extensions = mapUuidNames (produceExtensionsList "43");
gnome44Extensions = mapUuidNames (produceExtensionsList "44");
gnome45Extensions = mapUuidNames (produceExtensionsList "45");
gnome46Extensions = mapUuidNames (produceExtensionsList "46");
gnome47Extensions = mapUuidNames (produceExtensionsList "47");
gnome48Extensions = mapUuidNames (produceExtensionsList "48");
# Keep the last three versions in here
gnomeExtensions = lib.trivial.pipe (gnome46Extensions // gnome47Extensions // gnome48Extensions) [
# Apply some custom patches for automatically packaged extensions
(callPackage ./extensionOverrides.nix { })
# Add all manually packaged extensions
(extensions: extensions // (import ./manuallyPackaged.nix { inherit callPackage; }))
# Map the extension UUIDs to readable names
(lib.attrValues)
mapReadableNames
# Add some aliases
(
extensions:
extensions
// lib.optionalAttrs config.allowAliases {
unite-shell = gnomeExtensions.unite; # added 2021-01-19
arc-menu = gnomeExtensions.arcmenu; # added 2021-02-14
icon-hider = throw "gnomeExtensions.icon-hider was removed on 2024-03-15. The extension has not received any updates since 2020/3.34.";
nohotcorner = throw "gnomeExtensions.nohotcorner removed since 2019-10-09: Since 3.34, it is a part of GNOME Shell configurable through GNOME Tweaks.";
mediaplayer = throw "gnomeExtensions.mediaplayer deprecated since 2019-09-23: retired upstream https://github.com/JasonLG1979/gnome-shell-extensions-mediaplayer/blob/master/README.md";
remove-dropdown-arrows = throw "gnomeExtensions.remove-dropdown-arrows removed since 2021-05-25: The extensions has not seen an update sine GNOME 3.34. Furthermore, the functionality it provides is obsolete as of GNOME 40.";
}
)
# Export buildShellExtension function
(extensions: extensions // { inherit buildShellExtension; })
# Make the set "public"
lib.recurseIntoAttrs
];
}

View File

@@ -0,0 +1,46 @@
{
lib,
stdenv,
fetchFromGitHub,
replaceVars,
gjs,
vte,
gnome,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-drop-down-terminal";
version = "unstable-2020-03-25";
src = fetchFromGitHub {
owner = "zzrough";
repo = "gs-extensions-drop-down-terminal";
rev = "a59669afdb395b3315619f62c1f740f8b2f0690d";
sha256 = "0igfxgrjdqq6z6xg4rsawxn261pk25g5dw2pm3bhwz5sqsy4bq3i";
};
passthru = {
extensionUuid = "drop-down-terminal@gs-extensions.zzrough.org";
extensionPortalSlug = "drop-down-terminal";
};
patches = [
(replaceVars ./fix_vte_and_gjs.patch {
inherit gjs vte;
})
];
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r "drop-down-terminal@gs-extensions.zzrough.org" $out/share/gnome-shell/extensions/
runHook postInstall
'';
meta = with lib; {
description = "Configurable drop down terminal shell";
license = licenses.gpl3;
maintainers = with maintainers; [ ericdallo ];
homepage = "https://github.com/zzrough/gs-extensions-drop-down-terminal";
};
}

View File

@@ -0,0 +1,32 @@
--- a/drop-down-terminal@gs-extensions.zzrough.org/extension.js
+++ b/drop-down-terminal@gs-extensions.zzrough.org/extension.js
@@ -15,6 +15,8 @@
// Author: Stéphane Démurget <stephane.demurget@free.fr>
+imports.gi.GIRepository.Repository.prepend_search_path('@vte@/lib/girepository-1.0')
+
const Lang = imports.lang;
const Gettext = imports.gettext.domain("drop-down-terminal");
const Mainloop = imports.mainloop;
@@ -653,7 +655,7 @@ const DropDownTerminalExtension = new Lang.Class({
this._killingChild = false;
// finds the forking arguments
- let args = ["gjs", GLib.build_filenamev([Me.path, "terminal.js"]), Me.path];
+ let args = ["@gjs@/bin/gjs", GLib.build_filenamev([Me.path, "terminal.js"]), Me.path];
// forks the process
debug("forking '" + args.join(" ") + "'");
--- a/drop-down-terminal@gs-extensions.zzrough.org/terminal.js
+++ b/drop-down-terminal@gs-extensions.zzrough.org/terminal.js
@@ -14,6 +14,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Author: Stéphane Démurget <stephane.demurget@free.fr>
+
+imports.gi.GIRepository.Repository.prepend_search_path('@vte@/lib/girepository-1.0')
+
const Lang = imports.lang;
const Pango = imports.gi.Pango;

View File

@@ -0,0 +1,232 @@
{
lib,
fetchFromGitLab,
cpio,
ddcutil,
easyeffects,
gjs,
glib,
gnome-menus,
nautilus,
gobject-introspection,
hddtemp,
libgtop,
libhandy,
liquidctl,
lm_sensors,
netcat-gnu,
nvme-cli,
procps,
smartmontools,
replaceVars,
stdenvNoCC,
touchegg,
util-linux,
vte,
wrapGAppsHook3,
xdg-utils,
gtk4,
desktop-file-utils,
xdg-user-dirs,
}:
let
# Helper method to reduce redundancy
patchExtension =
name: override: super:
(
super
// {
${name} = super.${name}.overrideAttrs override;
}
);
in
# A set of overrides for automatically packaged extensions that require some small fixes.
# The input must be an attribute set with the extensions' UUIDs as keys and the extension
# derivations as values. Output is the same, but with patches applied.
#
# Note that all source patches refer to the built extension as published on extensions.gnome.org, and not
# the upstream repository's sources.
super:
lib.trivial.pipe super [
(patchExtension "apps-menu@gnome-shell-extensions.gcampax.github.com" (old: {
patches = [
(replaceVars
./extensionOverridesPatches/apps-menu_at_gnome-shell-extensions.gcampax.github.com.patch
{
gmenu_path = "${gnome-menus}/lib/girepository-1.0";
}
)
];
}))
(patchExtension "caffeine@patapon.info" (old: {
meta.maintainers = with lib.maintainers; [ eperuffo ];
}))
(patchExtension "dash-to-dock@micxgx.gmail.com" (old: {
meta.maintainers = with lib.maintainers; [ rhoriguchi ];
}))
(patchExtension "ddterm@amezin.github.com" (old: {
nativeBuildInputs = [
gobject-introspection
wrapGAppsHook3
];
buildInputs = [
vte
libhandy
gjs
];
postFixup = ''
patchShebangs "$out/share/gnome-shell/extensions/ddterm@amezin.github.com/bin/com.github.amezin.ddterm"
wrapGApp "$out/share/gnome-shell/extensions/ddterm@amezin.github.com/bin/com.github.amezin.ddterm"
'';
}))
(patchExtension "display-brightness-ddcutil@themightydeity.github.com" (old: {
# Make glib-compile-schemas available
nativeBuildInputs = [ glib ];
# Has a hard-coded path to a run-time dependency
# https://github.com/NixOS/nixpkgs/issues/136111
postPatch = ''
substituteInPlace "schemas/org.gnome.shell.extensions.display-brightness-ddcutil.gschema.xml" \
--replace-fail "/usr/bin/ddcutil" ${lib.getExe ddcutil}
'';
postFixup = ''
rm "$out/share/gnome-shell/extensions/display-brightness-ddcutil@themightydeity.github.com/schemas/gschemas.compiled"
glib-compile-schemas "$out/share/gnome-shell/extensions/display-brightness-ddcutil@themightydeity.github.com/schemas"
'';
}))
(patchExtension "eepresetselector@ulville.github.io" (old: {
patches = [
# Needed to find the currently set preset
(replaceVars ./extensionOverridesPatches/eepresetselector_at_ulville.github.io.patch {
easyeffects_gsettings_path = "${glib.getSchemaPath easyeffects}";
})
];
}))
(patchExtension "freon@UshakovVasilii_Github.yahoo.com" (old: {
patches = [
(replaceVars ./extensionOverridesPatches/freon_at_UshakovVasilii_Github.yahoo.com.patch {
inherit
hddtemp
liquidctl
lm_sensors
procps
smartmontools
;
netcat = netcat-gnu;
nvmecli = nvme-cli;
})
];
}))
(patchExtension "gnome-shell-screenshot@ttll.de" (old: {
# Requires gjs
# https://github.com/NixOS/nixpkgs/issues/136112
postPatch = ''
for file in *.js; do
substituteInPlace $file --replace "gjs" "${gjs}/bin/gjs"
done
'';
}))
(patchExtension "gtk4-ding@smedius.gitlab.com" (old: {
nativeBuildInputs = [ wrapGAppsHook3 ];
patches = [
(replaceVars ./extensionOverridesPatches/gtk4-ding_at_smedius.gitlab.com.patch {
inherit gjs;
util_linux = util-linux;
xdg_utils = xdg-utils;
gtk_update_icon_cache = "${gtk4.out}/bin/gtk4-update-icon-cache";
update_desktop_database = "${desktop-file-utils.out}/bin/update-desktop-database";
nautilus_gsettings_path = glib.getSchemaPath nautilus;
})
];
}))
(patchExtension "lunarcal@ailin.nemui" (
old:
let
chinese-calendar = stdenvNoCC.mkDerivation (finalAttrs: {
pname = "chinese-calendar";
version = "20240107";
nativeBuildInputs = [
cpio # used in install.sh
];
src = fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "Nei";
repo = "ChineseCalendar";
tag = finalAttrs.version;
hash = "sha256-z8Af9e70bn3ztUZteIEt/b3nJIFosbnoy8mwKMM6Dmc=";
};
installPhase = ''
runHook preInstall
HOME=$out ./install.sh
runHook postInstall
'';
});
in
{
patches = [
(replaceVars ./extensionOverridesPatches/lunarcal_at_ailin.nemui.patch {
chinese_calendar_path = chinese-calendar;
})
];
}
))
(patchExtension "system-monitor@gnome-shell-extensions.gcampax.github.com" (old: {
patches = [
(replaceVars
./extensionOverridesPatches/system-monitor_at_gnome-shell-extensions.gcampax.github.com.patch
{
gtop_path = "${libgtop}/lib/girepository-1.0";
}
)
];
}))
(patchExtension "system-monitor-next@paradoxxx.zero.gmail.com" (old: {
patches = [
(replaceVars ./extensionOverridesPatches/system-monitor-next_at_paradoxxx.zero.gmail.com.patch {
gtop_path = "${libgtop}/lib/girepository-1.0";
})
];
meta.maintainers = with lib.maintainers; [ andersk ];
}))
(patchExtension "Vitals@CoreCoding.com" (old: {
patches = [
(replaceVars ./extensionOverridesPatches/vitals_at_corecoding.com.patch {
gtop_path = "${libgtop}/lib/girepository-1.0";
})
];
}))
(patchExtension "x11gestures@joseexposito.github.io" (old: {
# Extension can't find Touchegg
# https://github.com/NixOS/nixpkgs/issues/137621
postPatch = ''
substituteInPlace "src/touchegg/ToucheggConfig.js" \
--replace "GLib.build_filenamev([GLib.DIR_SEPARATOR_S, 'usr', 'share', 'touchegg', 'touchegg.conf'])" "'${touchegg}/share/touchegg/touchegg.conf'"
'';
}))
(patchExtension "pwcalc@thilomaurer.de" {
postPatch = ''
# remove unused dangling symlink
rm settings-importexport.ui
'';
})
(patchExtension "TeaTimer@zener.sbg.at" {
postPatch = ''
# remove unused dangling symlink
rm utilities-teatime.svg
'';
})
]

View File

@@ -0,0 +1,17 @@
diff --git a/extension.js b/extension.js
index c608441..2b25335 100644
--- a/extension.js
+++ b/extension.js
@@ -9,7 +9,11 @@ import Atk from 'gi://Atk';
import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
-import GMenu from 'gi://GMenu';
+
+import GIRepository from 'gi://GIRepository';
+GIRepository.Repository.prepend_search_path('@gmenu_path@');
+const {default: GMenu} = await import('gi://GMenu');
+
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Meta from 'gi://Meta';

View File

@@ -0,0 +1,28 @@
--- a/extension.js
+++ b/extension.js
@@ -397,9 +397,9 @@
// String (values are seperated by new line)
keys = listKeyResponse.trim().split('\n');
} else if (appType === 'native') {
- const settings = new Gio.Settings({
- schema_id: 'com.github.wwmm.easyeffects',
- });
+ const _schema_source = Gio.SettingsSchemaSource.new_from_directory('@easyeffects_gsettings_path@', Gio.SettingsSchemaSource.get_default(), true);
+ const _schema = _schema_source.lookup('com.github.wwmm.easyeffects', false);
+ const settings = new Gio.Settings({settings_schema: _schema});
keys = settings.settings_schema.list_keys();
}
// If key names are invalid, try fallback
@@ -432,9 +432,9 @@
_lastUsedInputPreset = _idata.trim().slice(1, -1);
} else if (appType === 'native') {
// Get last used presets
- const settings = new Gio.Settings({
- schema_id: 'com.github.wwmm.easyeffects',
- });
+ const _schema_source = Gio.SettingsSchemaSource.new_from_directory('@easyeffects_gsettings_path@', Gio.SettingsSchemaSource.get_default(), true);
+ const _schema = _schema_source.lookup('com.github.wwmm.easyeffects', false);
+ const settings = new Gio.Settings({settings_schema: _schema});
_lastUsedOutputPreset = settings.get_string(lastOutputKeyName);
_lastUsedInputPreset = settings.get_string(lastInputKeyName);
}

View File

@@ -0,0 +1,85 @@
diff --git a/hddtempUtil.js b/hddtempUtil.js
index e52fbc2..f5138bb 100644
--- a/hddtempUtil.js
+++ b/hddtempUtil.js
@@ -10,7 +10,7 @@ export default class HddtempUtil extends CommandLineUtil {
constructor() {
super();
- let hddtempArgv = GLib.find_program_in_path('hddtemp');
+ let hddtempArgv = '@hddtemp@/bin/hddtemp';
if(hddtempArgv) {
// check if this user can run hddtemp directly.
if(!GLib.spawn_command_line_sync(hddtempArgv)[3]){
@@ -22,8 +22,8 @@ export default class HddtempUtil extends CommandLineUtil {
// doesn't seem to be the case… is it running as a daemon?
// Check first for systemd
let systemctl = GLib.find_program_in_path('systemctl');
- let pidof = GLib.find_program_in_path('pidof');
- let nc = GLib.find_program_in_path('nc');
+ let pidof = '@procps@/bin/pidof';
+ let nc = '@netcat@/bin/nc';
let pid = undefined;
if(systemctl) {
@@ -38,7 +38,7 @@ export default class HddtempUtil extends CommandLineUtil {
// systemd isn't used on this system, try sysvinit instead
if(!pid && pidof) {
- let output = run_command("pidof hddtemp");
+ let output = run_command("@procps@/bin/pidof hddtemp");
if(output.length)
pid = Number(output.trim());
}
diff --git a/liquidctlUtil.js b/liquidctlUtil.js
index a2f3015..215707a 100644
--- a/liquidctlUtil.js
+++ b/liquidctlUtil.js
@@ -7,7 +7,7 @@ export default class LiquidctlUtil extends CommandLineUtil {
constructor() {
super();
- const path = GLib.find_program_in_path('liquidctl');
+ const path = '@liquidctl@/bin/liquidctl';
this._argv = path ? [path, 'status', '--json'] : null;
}
diff --git a/nvmecliUtil.js b/nvmecliUtil.js
index 2b12d2d..70609f7 100644
--- a/nvmecliUtil.js
+++ b/nvmecliUtil.js
@@ -1,7 +1,7 @@
import GLib from 'gi://GLib';
function getNvmeData (argv){
- const nvme = GLib.find_program_in_path('nvme')
+ const nvme = '@nvmecli@/bin/nvme'
return JSON.parse(new TextDecoder().decode(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1]))
}
diff --git a/sensorsUtil.js b/sensorsUtil.js
index 90c6ca9..5788635 100644
--- a/sensorsUtil.js
+++ b/sensorsUtil.js
@@ -6,7 +6,7 @@ export default class SensorsUtil extends CommandLineUtil {
constructor() {
super();
- let path = GLib.find_program_in_path('sensors');
+ let path = '@lm_sensors@/bin/sensors';
// -A: Do not show adapter -j: JSON output
this._argv = path ? [path, '-A', '-j'] : null;
}
diff --git a/smartctlUtil.js b/smartctlUtil.js
index f58d194..b9cb9ca 100644
--- a/smartctlUtil.js
+++ b/smartctlUtil.js
@@ -1,7 +1,7 @@
import GLib from 'gi://GLib';
function getSmartData (argv){
- const smartctl = GLib.find_program_in_path('smartctl')
+ const smartctl = '@smartmontools@/bin/smartctl'
return JSON.parse(new TextDecoder().decode( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] ))
}

View File

@@ -0,0 +1,108 @@
diff --git a/app/adw-ding.js b/app/adw-ding.js
index 42cb878c..929ddce2 100755
--- a/app/adw-ding.js
+++ b/app/adw-ding.js
@@ -1,4 +1,4 @@
-#!/usr/bin/env -S gjs -m
+#!@gjs@/bin/gjs -m
/* ADW-DING: Desktop Icons New Generation for GNOME Shell
*
@@ -535,7 +535,7 @@ const adWDingApp = GObject.registerClass(
]);
const updated = await GLib.spawn_command_line_async(
- 'gtk-update-icon-cache ' +
+ '@gtk_update_icon_cache@ ' +
'-q -t -f ' +
`${iconCachePath}`
);
@@ -566,7 +566,7 @@ const adWDingApp = GObject.registerClass(
// and we need to do it manually for the app to be
// available sooner
const updated = await GLib.spawn_command_line_async(
- 'update-desktop-database -q ' +
+ '@update_desktop_database@ -q ' +
`${GLib.path_get_dirname(appDesktopFile)}`
);
diff --git a/app/enums.js b/app/enums.js
index 5434fa7a..e36d3670 100644
--- a/app/enums.js
+++ b/app/enums.js
@@ -134,7 +134,8 @@ export const THUMBNAILS_DIR = '.cache/thumbnails';
export const DND_HOVER_TIMEOUT = 1500; // In milliseconds
export const DND_SHELL_HOVER_POLL = 200; // In milliseconds
export const TOOLTIP_HOVER_TIMEOUT = 1000; // In milliseconds
-export const XDG_EMAIL_CMD = 'xdg-email';
+// Currently only used via https://gjs-docs.gnome.org/glib20~2.0/glib.find_program_in_path so using an absolute path is fine
+export const XDG_EMAIL_CMD = '@xdg_utils@/bin/xdg-email';
export const XDG_EMAIL_CMD_OPTIONS = '--attach';
export const ZIP_CMD = 'zip';
export const ZIP_CMD_OPTIONS = '-r';
diff --git a/app/preferences.js b/app/preferences.js
index 95ffe60b..75370403 100644
--- a/app/preferences.js
+++ b/app/preferences.js
@@ -30,6 +30,7 @@ const Preferences = class {
this._mainApp = Data.mainApp;
this._Enums = Data.Enums;
let schemaSource = GioSSS.get_default();
+ const schemaSourceNautilus = Gio.SettingsSchemaSource.new_from_directory('@nautilus_gsettings_path@', Gio.SettingsSchemaSource.get_default(), true);
this._desktopManager = null;
// Adw Style Manager
@@ -52,7 +53,7 @@ const Preferences = class {
// Gnome Files
const schemaObj =
- schemaSource.lookup(this._Enums.SCHEMA_NAUTILUS, true);
+ schemaSourceNautilus.lookup(this._Enums.SCHEMA_NAUTILUS, true);
if (!schemaObj) {
this.nautilusSettings = null;
@@ -69,7 +70,7 @@ const Preferences = class {
// Compression
const compressionSchema =
- schemaSource.lookup(this._Enums.SCHEMA_NAUTILUS_COMPRESSION, true);
+ schemaSourceNautilus.lookup(this._Enums.SCHEMA_NAUTILUS_COMPRESSION, true);
if (!compressionSchema) {
this.nautilusCompression = null;
diff --git a/dingManager.js b/dingManager.js
index 7a0de9e3..bbc23704 100644
--- a/dingManager.js
+++ b/dingManager.js
@@ -482,7 +482,7 @@ const DingManager = class {
async _doKillAllOldDesktopProcesses() {
const procFolder = Gio.File.new_for_path('/proc');
const processes = await FileUtils.enumerateDir(procFolder);
- const thisPath = `gjs ${GLib.build_filenamev([
+ const thisPath = `@gjs@/bin/gjs ${GLib.build_filenamev([
this.path,
'app',
'adw-ding.js',
@@ -510,7 +510,7 @@ const DingManager = class {
if (contents.startsWith(thisPath)) {
let proc =
- new Gio.Subprocess({argv: ['/bin/kill', filename]});
+ new Gio.Subprocess({argv: ['@util_linux@/bin/kill', filename]});
proc.init(null);
console.log(`Killing old DING process ${filename}`);
diff --git a/prefs.js b/prefs.js
index 50430fa5..82fca2e3 100644
--- a/prefs.js
+++ b/prefs.js
@@ -34,7 +34,8 @@ export default class dingPreferences extends ExtensionPreferences {
const schemaSource = GioSSS.get_default();
const schemaGtk = schemaSource.lookup(Enums.SCHEMA_GTK, true);
const gtkSettings = new Gio.Settings({settings_schema: schemaGtk});
- const schemaNautilus = schemaSource.lookup(Enums.SCHEMA_NAUTILUS, true);
+ const schemaSourceNautilus = Gio.SettingsSchemaSource.new_from_directory('@nautilus_gsettings_path@', Gio.SettingsSchemaSource.get_default(), true);
+ const schemaNautilus = schemaSourceNautilus.lookup(Enums.SCHEMA_NAUTILUS, true);
const version = this.metadata['version-name'];
let nautilusSettings;

View File

@@ -0,0 +1,31 @@
diff --git a/backend/ytliu0-loader.js b/backend/ytliu0-loader.js
index 4862c17..25fe9e8 100644
--- a/backend/ytliu0-loader.js
+++ b/backend/ytliu0-loader.js
@@ -8,7 +8,11 @@ import GLib from 'gi://GLib'
// Code from gnome-shell 44 : extenstionUtils.js:installImporter
let custom_importer
const origSearchPath = imports.searchPath.slice()
-imports.searchPath = [GLib.get_user_data_dir(), ...GLib.get_system_data_dirs()]
+imports.searchPath = [
+ GLib.get_user_data_dir(),
+ ...GLib.get_system_data_dirs(),
+ '@chinese_calendar_path@/.local/share'
+]
try {
// importing a "subdir" creates a new importer object that doesn't affect
// the global one
diff --git a/backend/ytliu0.js b/backend/ytliu0.js
index 94abd2c..df6241b 100644
--- a/backend/ytliu0.js
+++ b/backend/ytliu0.js
@@ -60,7 +60,8 @@ class LunarDateX {
const [ok, file] = this._holidayData.load_from_dirs(holiday_fn, [
GLib.get_user_config_dir(),
GLib.get_user_data_dir(),
- ...GLib.get_system_data_dirs()
+ ...GLib.get_system_data_dirs(),
+ '@chinese_calendar_path@/.config'
], GLib.KeyFileFlags.KEEP_TRANSLATIONS)
if (this._notifyHoliday)
this._notifyHoliday()

View File

@@ -0,0 +1,30 @@
diff --git a/extension.js b/extension.js
index ee8c3a9..ca72885 100644
--- a/extension.js
+++ b/extension.js
@@ -21,6 +21,7 @@
import { Extension, gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js";
import Clutter from "gi://Clutter";
+import GIRepository from "gi://GIRepository";
import GLib from "gi://GLib";
import GObject from "gi://GObject";
@@ -28,7 +29,6 @@ import Gio from "gi://Gio";
import Shell from "gi://Shell";
import St from "gi://St";
import UPowerGlib from "gi://UPowerGlib";
-import GTop from "gi://GTop";
import NM from "gi://NM";
import * as ModalDialog from "resource:///org/gnome/shell/ui/modalDialog.js";
@@ -41,6 +41,9 @@ import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js";
import * as Util from "resource:///org/gnome/shell/misc/util.js";
+GIRepository.Repository.prepend_search_path('@gtop_path@');
+const GTop = (await import("gi://GTop")).default;
+
const NetworkManager = NM;
const UPower = UPowerGlib;
// Copied as of https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/5fa08fe53376f5dca755360bd005a4a51ca78917/js/ui/panel.js#L45

View File

@@ -0,0 +1,25 @@
diff --git a/extension.js b/extension.js
index 37d2eb1..232d0d5 100644
--- a/extension.js
+++ b/extension.js
@@ -6,9 +6,9 @@
import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
+import GIRepository from "gi://GIRepository";
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
-import GTop from 'gi://GTop';
import Pango from 'gi://Pango';
import Shell from 'gi://Shell';
import St from 'gi://St';
@@ -19,6 +19,9 @@ import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+GIRepository.Repository.prepend_search_path('@gtop_path@');
+const GTop = (await import("gi://GTop")).default;
+
const THRESHOLD_HIGH = 0.80;
// adapted from load-graph.cpp in gnome-system-monitor

View File

@@ -0,0 +1,13 @@
diff --git a/sensors.js b/sensors.js
index 39d175a..9815b77 100644
--- a/sensors.js
+++ b/sensors.js
@@ -29,6 +29,8 @@ import * as FileModule from './helpers/file.js';
import { gettext as _ } from 'resource:///org/gnome/shell/extensions/extension.js';
import NM from 'gi://NM';
+imports.gi.GIRepository.Repository.prepend_search_path('@gtop_path@');
+
let GTop, hasGTop = true;
try {
({default: GTop} = await import('gi://GTop'));

View File

@@ -0,0 +1,60 @@
# A list of UUIDs that have the same pname and we need to rename them
# MAINTENANCE:
# - Every item from ./collisions.json (for the respective Shell version) should have an entry in here
# - Set the value to `null` for filtering (duplicate or unmaintained extensions)
# - Sort the entries in order of appearance in the collisions.json
{
"Applications_Menu@rmy.pobox.com" = "frippery-applications-menu";
"apps-menu@gnome-shell-extensions.gcampax.github.com" = "applications-menu";
"persian-calendar@iamrezamousavi.gmail.com" = "persian-calendar-2";
"PersianCalendar@oxygenws.com" = "persian-calendar";
"system-monitor@gnome-shell-extensions.gcampax.github.com" = "system-monitor";
"System_Monitor@bghome.gmail.com" = "system-monitor-2";
"FuzzyClock@fire-man-x" = "fuzzy-clock-3";
"FuzzyClock@johngoetz" = "fuzzy-clock";
"battery-time@eetumos.github.com" = "battery-time-3";
"batterytime@typeof.pw" = "battery-time-2";
"batime@martin.zurowietz.de" = "battery-time";
"nepali-date@biplab" = "nepali-calendar";
"nepali-calendar-gs-extension@subashghimire.info.np" = "nepali-calendar-2";
"mousefollowsfocus@matthes.biz" = "mouse-follows-focus";
"mouse-follows-focus@crisidev.org" = "mouse-follows-focus-2";
"power-profile-indicator@laux.wtf" = "power-profile-indicator";
"power-profile@fthx" = "power-profile-indicator-2";
"fullscreen-to-empty-workspace@aiono.dev" = "fullscreen-to-empty-workspace";
"fullscreen-to-empty-workspace2@corgijan.dev" = "fullscreen-to-empty-workspace-2";
"eur-usd-gshell@vezza.github.com" = "eur-usd";
"usd-mxn-gshell@kinduff.github.com" = "usd-mxn";
# ############################################################################
# These extensions no longer collide. We preserve the old attribute name for backwards compatibility.
"floatingDock@sun.wxg@gmail.com" = "floating-dock-2";
"true-color-window-invert@lynet101" = "true-color-window-invert";
"volume_scroller@francislavoie.github.io" = "volume-scroller-2";
"openweather-extension@penguin-teal.github.io" = "openweather-refined";
# ############################################################################
# Overrides for extensions that were manually packaged in the past but are gradually
# being replaced by automatic packaging where possible.
#
# The manually packaged ones:
"EasyScreenCast@iacopodeenosee.gmail.com" = "easyScreenCast"; # extensionPortalSlug is "easyscreencast"
"gnome-fuzzy-app-search@gnome-shell-extensions.Czarlie.gitlab.com" = "fuzzy-app-search"; # extensionPortalSlug is "gnome-fuzzy-app-search"
"TopIcons@phocean.net" = "topicons-plus"; # extensionPortalSlug is "topicons"
"no-title-bar@jonaspoehler.de" = "no-title-bar"; # extensionPortalSlug is "no-title-bar-forked"
# These extensions are automatically packaged at the moment. We preserve the old attribute name
# for backwards compatibility.
"appindicatorsupport@rgcjonas.gmail.com" = "appindicator"; # extensionPortalSlug is "appindicator-support"
"drawOnYourScreen@abakkk.framagit.org" = "draw-on-your-screen"; # extensionPortalSlug is "draw-on-you-screen"
"timepp@zagortenay333" = "timepp"; # extensionPortalSlug is "time"
"windowIsReady_Remover@nunofarruca@gmail.com" = "window-is-ready-remover"; # extensionPortalSlug is "window-is-ready-notification-remover"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,128 @@
{
stdenv,
lib,
fetchFromGitHub,
replaceVars,
openssl,
gsound,
meson,
ninja,
pkg-config,
gobject-introspection,
wrapGAppsHook3,
glib,
glib-networking,
gtk3,
openssh,
gnome-shell,
evolution-data-server-gtk4,
gjs,
nixosTests,
desktop-file-utils,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "gnome-shell-extension-gsconnect";
version = "66";
outputs = [
"out"
"installedTests"
];
src = fetchFromGitHub {
owner = "GSConnect";
repo = "gnome-shell-extension-gsconnect";
rev = "v${finalAttrs.version}";
hash = "sha256-QPvdSmt4aUkPvaOUonovrCxW4pxrgoopXGi3KSukVD8=";
};
patches = [
# Make typelibs available in the extension
(replaceVars ./fix-paths.patch {
gapplication = "${glib.bin}/bin/gapplication";
# Replaced in postPatch
typelibPath = null;
})
# Allow installing installed tests to a separate output
./installed-tests-path.patch
];
nativeBuildInputs = [
meson
ninja
pkg-config
gobject-introspection # for locating typelibs
wrapGAppsHook3 # for wrapping daemons
desktop-file-utils # update-desktop-database
];
buildInputs = [
glib # libgobject
glib-networking
gtk3
gsound
gjs # for running daemon
evolution-data-server-gtk4 # for libebook-contacts typelib
];
mesonFlags = [
"-Dgnome_shell_libdir=${gnome-shell}/lib"
"-Dchrome_nmhdir=${placeholder "out"}/etc/opt/chrome/native-messaging-hosts"
"-Dchromium_nmhdir=${placeholder "out"}/etc/chromium/native-messaging-hosts"
"-Dopenssl_path=${openssl}/bin/openssl"
"-Dsshadd_path=${openssh}/bin/ssh-add"
"-Dsshkeygen_path=${openssh}/bin/ssh-keygen"
"-Dsession_bus_services_dir=${placeholder "out"}/share/dbus-1/services"
"-Dinstalled_test_prefix=${placeholder "installedTests"}"
];
postPatch = ''
patchShebangs installed-tests/prepare-tests.sh
# TODO: do not include every typelib everywhere
# for example, we definitely do not need nautilus
substituteInPlace src/__nix-prepend-search-paths.js \
--subst-var-by typelibPath "$GI_TYPELIB_PATH"
# slightly janky fix for gsettings_schemadir being removed
substituteInPlace data/config.js.in \
--subst-var-by GSETTINGS_SCHEMA_DIR \
${glib.makeSchemaPath (placeholder "out") "${finalAttrs.pname}-${finalAttrs.version}"}
'';
postFixup = ''
# Lets wrap the daemons
for file in $out/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/service/{daemon,nativeMessagingHost}.js; do
echo "Wrapping program $file"
wrapGApp "$file"
done
# Wrap jasmine runner for tests
for file in $installedTests/libexec/installed-tests/gsconnect/minijasmine; do
echo "Wrapping program $file"
wrapGApp "$file"
done
'';
passthru = {
extensionUuid = "gsconnect@andyholmes.github.io";
extensionPortalSlug = "gsconnect";
};
passthru = {
tests = {
installedTests = nixosTests.installed-tests.gsconnect;
};
};
meta = {
description = "KDE Connect implementation for Gnome Shell";
homepage = "https://github.com/GSConnect/gnome-shell-extension-gsconnect/wiki";
license = lib.licenses.gpl2Plus;
maintainers = with lib.maintainers; [ doronbehar ];
teams = [ lib.teams.gnome ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,60 @@
diff --git a/data/org.gnome.Shell.Extensions.GSConnect.desktop.in b/data/org.gnome.Shell.Extensions.GSConnect.desktop.in
index 3fb887c3..e8cbe1bd 100644
--- a/data/org.gnome.Shell.Extensions.GSConnect.desktop.in
+++ b/data/org.gnome.Shell.Extensions.GSConnect.desktop.in
@@ -5,7 +5,7 @@
[Desktop Entry]
Type=Application
Name=GSConnect
-Exec=gapplication launch org.gnome.Shell.Extensions.GSConnect %U
+Exec=@gapplication@ launch org.gnome.Shell.Extensions.GSConnect %U
Terminal=false
NoDisplay=true
Icon=org.gnome.Shell.Extensions.GSConnect
diff --git a/src/__nix-prepend-search-paths.js b/src/__nix-prepend-search-paths.js
new file mode 100644
index 00000000..d009dfd9
--- /dev/null
+++ b/src/__nix-prepend-search-paths.js
@@ -0,0 +1,2 @@
+import GIRepository from 'gi://GIRepository';
+'@typelibPath@'.split(':').forEach(path => GIRepository.Repository.prepend_search_path(path));
diff --git a/src/extension.js b/src/extension.js
index 53ecd5fc..78782357 100644
--- a/src/extension.js
+++ b/src/extension.js
@@ -2,6 +2,8 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
+import './__nix-prepend-search-paths.js';
+
import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
diff --git i/src/gsconnect-preferences w/src/gsconnect-preferences
index b16ddc7d..263dfb04 100755
--- a/src/gsconnect-preferences
+++ b/src/gsconnect-preferences
@@ -6,6 +6,8 @@
// -*- mode: js; -*-
+import './__nix-prepend-search-paths.js';
+
import Gdk from 'gi://Gdk?version=3.0';
import 'gi://GdkPixbuf?version=2.0';
import Gio from 'gi://Gio?version=2.0';
diff --git a/src/prefs.js b/src/prefs.js
index dd20fd20..5f82c53a 100644
--- a/src/prefs.js
+++ b/src/prefs.js
@@ -2,6 +2,8 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
+import './__nix-prepend-search-paths.js';
+
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import Adw from 'gi://Adw';

View File

@@ -0,0 +1,33 @@
diff --git a/installed-tests/meson.build b/installed-tests/meson.build
index 5bc38bfd..02404c3a 100644
--- a/installed-tests/meson.build
+++ b/installed-tests/meson.build
@@ -2,8 +2,8 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
-installed_tests_execdir = join_paths(libexecdir, 'installed-tests', meson.project_name())
-installed_tests_metadir = join_paths(datadir, 'installed-tests', meson.project_name())
+installed_tests_execdir = join_paths(get_option('installed_test_prefix'), 'libexec', 'installed-tests', meson.project_name())
+installed_tests_metadir = join_paths(get_option('installed_test_prefix'), 'share', 'installed-tests', meson.project_name())
installed_tests_srcdir = meson.current_source_dir()
installed_tests_builddir = meson.current_build_dir()
diff --git a/meson_options.txt b/meson_options.txt
index 745c541c..b4b602ca 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -104,6 +104,13 @@ option(
description: 'Native Messaging Host directory for Mozilla'
)
+option(
+ 'installed_test_prefix',
+ type: 'string',
+ value: '',
+ description: 'Prefix for installed tests'
+)
+
option(
'installed_tests',
type: 'boolean',

View File

@@ -0,0 +1,55 @@
{
stdenv,
lib,
fetchFromGitLab,
glib,
}:
# We package this manually because upstream stopped updating the package to
# extensions.gnome.org. See:
# https://gitlab.com/ente76/guillotine/-/issues/17
stdenv.mkDerivation (finalAttrs: {
pname = "gnome-shell-extension-guillotine";
version = "26";
src = fetchFromGitLab {
owner = "ente76";
repo = "guillotine";
rev = "v${finalAttrs.version}";
hash = "sha256-6RuHargk7sq6oUKj+aGPFp3t0LJCpj6RwLhNzAM5wVA=";
};
nativeBuildInputs = [ glib ];
passthru = {
extensionUuid = "guillotine@fopdoodle.net";
extensionPortalSlug = "guillotine";
};
buildPhase = ''
runHook preBuild
rm schemas/gschemas.compiled
glib-compile-schemas schemas
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions/guillotine@fopdoodle.net
cp -R schemas "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
cp default.json $out/share/gnome-shell/extensions/guillotine@fopdoodle.net
cp extension.js "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
cp guillotine-symbolic.svg "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
cp LICENSE "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
cp metadata.json "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
cp README.md "$out/share/gnome-shell/extensions/guillotine@fopdoodle.net"
runHook postInstall
'';
meta = {
description = "Gnome extension designed for efficiently carrying out executions of commands from a customizable menu";
homepage = "https://gitlab.com/ente76/guillotine/";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ husky ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,39 @@
{
lib,
stdenv,
fetchFromGitHub,
gnome-shell,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-icon-hider";
version = "23";
src = fetchFromGitHub {
owner = "ikalnytskyi";
repo = "gnome-shell-extension-icon-hider";
rev = "v${version}";
sha256 = "18c8zkdrmdbghqqz7b450vhgpykgz25mgigwn2nggcb2lxmvm9ks";
};
passthru = {
extensionUuid = "icon-hider@kalnitsky.org";
extensionPortalSlug = "icon-hider";
};
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r "icon-hider@kalnitsky.org" $out/share/gnome-shell/extensions
runHook postInstall
'';
meta = with lib; {
description = "Icon Hider is a GNOME Shell extension for managing status area items";
license = licenses.bsd3;
maintainers = [ ];
platforms = gnome-shell.meta.platforms;
homepage = "https://github.com/ikalnytskyi/gnome-shell-extension-icon-hider";
broken = versionAtLeast gnome-shell.version "3.32"; # Doesn't support 3.34
};
}

View File

@@ -0,0 +1,50 @@
{
lib,
stdenv,
fetchFromGitHub,
glib,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-impatience";
version = "0.5.2-unstable-2025-02-24";
src = fetchFromGitHub {
owner = "timbertson";
repo = "gnome-shell-impatience";
rev = "527295a35b352596fed1fc07799f1e0792a77040"; # shows gnome 48 support
hash = "sha256-9xfZcKJpBttSP2IbGtjo4UxFEnADgQjyV3vx0jSg8nI=";
};
buildInputs = [
glib
];
buildPhase = ''
runHook preBuild
make schemas
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r impatience "$out/share/gnome-shell/extensions/impatience@gfxmonk.net"
runHook postInstall
'';
passthru = {
extensionUuid = "impatience@gfxmonk.net";
extensionPortalSlug = "impatience";
};
meta = with lib; {
description = "Speed up builtin gnome-shell animations";
license = licenses.gpl3Plus;
maintainers = with maintainers; [
timbertson
tiramiseb
];
homepage = "http://gfxmonk.net/dist/0install/gnome-shell-impatience.xml";
};
}

View File

@@ -0,0 +1,25 @@
{ callPackage }:
{
"arcmenu@arcmenu.com" = callPackage ./arcmenu { };
"argos@pew.worldwidemann.com" = callPackage ./argos { };
"clock-override@gnomeshell.kryogenix.org" = callPackage ./clock-override { };
"drop-down-terminal@gs-extensions.zzrough.org" = callPackage ./drop-down-terminal { };
"EasyScreenCast@iacopodeenosee.gmail.com" = callPackage ./EasyScreenCast { };
"gsconnect@andyholmes.github.io" = callPackage ./gsconnect { };
"guillotine@fopdoodle.net" = callPackage ./guillotine { };
"impatience@gfxmonk.net" = callPackage ./impatience { };
"no-title-bar@jonaspoehler.de" = callPackage ./no-title-bar { };
"pidgin@muffinmad" = callPackage ./pidgin-im-integration { };
"pop-shell@system76.com" = callPackage ./pop-shell { };
"sound-output-device-chooser@kgshank.net" = callPackage ./sound-output-device-chooser { };
"systemd-manager@hardpixel.eu" = callPackage ./systemd-manager { };
"taskwhisperer-extension@infinicode.de" = callPackage ./taskwhisperer { };
"tilingnome@rliang.github.com" = callPackage ./tilingnome { };
"TopIcons@phocean.net" = callPackage ./topicons-plus { };
# Can be removed when https://github.com/hardpixel/unite-shell/issues/353 resolved
"unite@hardpixel.eu" = callPackage ./unite { };
"valent@andyholmes.ca" = callPackage ./valent { };
"window-corner-preview@fabiomereu.it" = callPackage ./window-corner-preview { };
# Can be removed when https://github.com/oae/gnome-shell-pano/issues/271 resolved
"pano@elhan.io" = callPackage ./pano { };
}

View File

@@ -0,0 +1,47 @@
{
lib,
stdenv,
fetchFromGitHub,
replaceVars,
glib,
gettext,
xorg,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-no-title-bar";
version = "11";
src = fetchFromGitHub {
owner = "poehlerj";
repo = "no-title-bar";
rev = "V_${version}";
sha256 = "07ddw47binlsbyvgy4xkdjvd40zyp7nwd17r6k7w54d50vmnwhvb";
};
nativeBuildInputs = [
glib
gettext
];
patches = [
(replaceVars ./fix-paths.patch {
xprop = "${xorg.xprop}/bin/xprop";
xwininfo = "${xorg.xwininfo}/bin/xwininfo";
})
];
makeFlags = [ "INSTALLBASE=$(out)/share/gnome-shell/extensions" ];
passthru = {
extensionUuid = "no-title-bar@jonaspoehler.de";
};
meta = with lib; {
description = "Integrates maximized windows with the top panel";
homepage = "https://github.com/poehlerj/no-title-bar";
license = licenses.gpl2;
maintainers = with maintainers; [ svsdep ];
platforms = platforms.linux;
};
}

View File

@@ -0,0 +1,56 @@
diff --git a/decoration.js b/decoration.js
index d1ff3dd..ff4193f 100644
--- a/decoration.js
+++ b/decoration.js
@@ -223,7 +223,7 @@ var Decoration = class {
let winId = this._guessWindowXID(win);
- let xprops = GLib.spawn_command_line_sync(`xprop -id ${winId}`);
+ let xprops = GLib.spawn_command_line_sync(`@xprop@ -id ${winId}`);
if (!xprops[0]) {
Utils.log_debug(`Unable to determine windows '${win.get_title()}' original state`);
return win._noTitleBarOriginalState = WindowState.UNKNOWN;
@@ -237,7 +237,7 @@ var Decoration = class {
let prop = '_MOTIF_WM_HINTS';
let value = '0x2, 0x0, %s, 0x0, 0x0'.format(hide ? '0x2' : '0x1');
- GLib.spawn_command_line_sync(`xprop -id ${windId} -f ${prop} 32c -set ${prop} "${value}"`);
+ GLib.spawn_command_line_sync(`@xprop@ -id ${windId} -f ${prop} 32c -set ${prop} "${value}"`);
if (!hide && !win.titlebar_is_onscreen()) {
Utils.log_debug(`Shoving titlebar onscreen for window '${win.get_title()}'`);
win.shove_titlebar_onscreen();
@@ -354,7 +354,7 @@ var Decoration = class {
let act = win.get_compositor_private();
let xwindow = act && act['x-window'];
if (xwindow) {
- let xwininfo = GLib.spawn_command_line_sync('xwininfo -children -id 0x%x'.format(xwindow));
+ let xwininfo = GLib.spawn_command_line_sync('@xwininfo@ -children -id 0x%x'.format(xwindow));
if (xwininfo[0]) {
let str = ByteArray.toString(xwininfo[1]);
@@ -384,7 +384,7 @@ var Decoration = class {
// Try enumerating all available windows and match the title. Note that this
// may be necessary if the title contains special characters and `x-window`
// is not available.
- let result = GLib.spawn_command_line_sync('xprop -root _NET_CLIENT_LIST');
+ let result = GLib.spawn_command_line_sync('@xprop@ -root _NET_CLIENT_LIST');
if (result[0]) {
let str = ByteArray.toString(result[1]);
@@ -395,7 +395,7 @@ var Decoration = class {
// For each window ID, check if the title matches the desired title.
for (var i = 0; i < windowList.length; ++i) {
- let cmd = 'xprop -id "' + windowList[i] + '" _NET_WM_NAME _NO_TITLE_BAR_ORIGINAL_STATE';
+ let cmd = '@xprop@ -id "' + windowList[i] + '" _NET_WM_NAME _NO_TITLE_BAR_ORIGINAL_STATE';
let result = GLib.spawn_command_line_sync(cmd);
if (result[0]) {
@@ -455,4 +455,4 @@ var Decoration = class {
let styleContent = this._updateUserStyles();
GLib.file_set_contents(this._userStylesPath, styleContent);
}
-}
\ No newline at end of file
+}

View File

@@ -0,0 +1,55 @@
{
lib,
stdenv,
fetchzip,
glib,
libgda6,
gsound,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "gnome-shell-extension-pano";
version = "23-alpha5";
src = fetchzip {
url = "https://github.com/oae/gnome-shell-pano/releases/download/v${finalAttrs.version}/pano@elhan.io.zip";
hash = "sha256-kTaJOSyFtBa/fl3Mot8Q8qyhwJwhcbBY4FvdztqUP4w=";
stripRoot = false;
};
nativeBuildInputs = [
glib
];
buildPhase = ''
runHook preBuild
glib-compile-schemas --strict schemas
runHook postBuild
'';
preInstall = ''
substituteInPlace extension.js \
--replace-fail "import Gda from 'gi://Gda?version>=5.0'" "imports.gi.GIRepository.Repository.prepend_search_path('${libgda6}/lib/girepository-1.0'); const Gda = (await import('gi://Gda')).default" \
--replace-fail "import GSound from 'gi://GSound'" "imports.gi.GIRepository.Repository.prepend_search_path('${gsound}/lib/girepository-1.0'); const GSound = (await import('gi://GSound')).default"
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r -T . $out/share/gnome-shell/extensions/pano@elhan.io
runHook postInstall
'';
passthru = {
extensionPortalSlug = "pano";
extensionUuid = "pano@elhan.io";
};
meta = with lib; {
description = "Next-gen Clipboard Manager for Gnome Shell";
homepage = "https://github.com/oae/gnome-shell-pano";
license = licenses.gpl2Plus;
maintainers = with maintainers; [ honnip ];
platforms = platforms.linux;
};
})

View File

@@ -0,0 +1,45 @@
{
lib,
stdenv,
fetchFromGitHub,
glib,
gnome-shell,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-pidgin-im-integration";
version = "32";
src = fetchFromGitHub {
owner = "muffinmad";
repo = "pidgin-im-gnome-shell-extension";
rev = "v${version}";
sha256 = "1jyg8r0s1v83sgg6y0jbsj2v37mglh8rvd8vi27fxnjq9xmg8kpc";
};
dontConfigure = true;
dontBuild = true;
installPhase = ''
runHook preInstall
share_dir="$prefix/share"
extensions_dir="$share_dir/gnome-shell/extensions/pidgin@muffinmad"
mkdir -p "$extensions_dir"
mv *.js metadata.json dbus.xml schemas locale "$extensions_dir"
runHook postInstall
'';
passthru = {
extensionUuid = "pidgin@muffinmad";
extensionPortalSlug = "pidgin-im-integration";
};
meta = with lib; {
homepage = "https://github.com/muffinmad/pidgin-im-gnome-shell-extension";
description = "Make Pidgin IM conversations appear in the Gnome Shell message tray";
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ ];
broken = versionAtLeast gnome-shell.version "3.32"; # Doesn't support 3.34
};
}

View File

@@ -0,0 +1,59 @@
{
stdenv,
lib,
fetchFromGitHub,
glib,
gjs,
typescript,
unstableGitUpdater,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-pop-shell";
version = "1.2.0-unstable-2025-07-09";
src = fetchFromGitHub {
owner = "pop-os";
repo = "shell";
rev = "6fd8c039a081e8ad7bbd40ef7883ec6e5fc2a3f8";
hash = "sha256-3zIbfjaJSUbPmUVppoSBWviQWQvykaT1qw9uQvcXmvM=";
};
nativeBuildInputs = [
glib
gjs
typescript
];
buildInputs = [ gjs ];
patches = [
./fix-gjs.patch
];
makeFlags = [ "XDG_DATA_HOME=$(out)/share" ];
passthru = {
extensionUuid = "pop-shell@system76.com";
extensionPortalSlug = "pop-shell";
updateScript = unstableGitUpdater { };
};
postPatch = ''
for file in */main.js; do
substituteInPlace $file --replace "gjs" "${gjs}/bin/gjs"
done
'';
preFixup = ''
chmod +x $out/share/gnome-shell/extensions/pop-shell@system76.com/*/main.js
'';
meta = with lib; {
description = "Keyboard-driven layer for GNOME Shell";
license = licenses.gpl3Only;
platforms = platforms.linux;
maintainers = [ maintainers.genofire ];
homepage = "https://github.com/pop-os/shell";
};
}

View File

@@ -0,0 +1,38 @@
diff --git a/src/extension.ts b/src/extension.ts
index f34e865..f12d4db 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -556,7 +556,7 @@ export class Ext extends Ecs.System<ExtEvent> {
return true;
};
- const ipc = utils.async_process_ipc(['gjs', '--module', path]);
+ const ipc = utils.async_process_ipc([path]);
if (ipc) {
const generator = (stdout: any, res: any) => {
diff --git a/src/panel_settings.ts b/src/panel_settings.ts
index fbcafbf..ef409ee 100644
--- a/src/panel_settings.ts
+++ b/src/panel_settings.ts
@@ -352,7 +352,7 @@ function color_selector(ext: Ext, menu: any) {
color_selector_item.add_child(color_button);
color_button.connect('button-press-event', () => {
let path = get_current_path() + '/color_dialog/main.js';
- let resp = GLib.spawn_command_line_async(`gjs --module ${path}`);
+ let resp = GLib.spawn_command_line_async(`${path}`);
if (!resp) {
return null;
}
diff --git a/src/color_dialog/src/main.ts b/src/color_dialog/src/main.ts
index a9637e5..5cb86ce 100644
--- a/src/color_dialog/src/main.ts
+++ b/src/color_dialog/src/main.ts
@@ -6,6 +6,7 @@ import Gtk from 'gi://Gtk?version=3.0';
import Gdk from 'gi://Gdk';
const EXT_PATH_DEFAULTS = [
+ '/run/current-system/sw/share/gnome-shell/extensions/',
GLib.get_home_dir() + '/.local/share/gnome-shell/extensions/',
'/usr/share/gnome-shell/extensions/',
];

View File

@@ -0,0 +1,51 @@
{
lib,
stdenv,
replaceVars,
fetchFromGitHub,
libpulseaudio,
python3,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-sound-output-device-chooser";
# For gnome 42 support many commits not tagged yet are needed.
version = "unstable-2022-03-29";
src = fetchFromGitHub {
owner = "kgshank";
repo = "gse-sound-output-device-chooser";
rev = "76f7f59d23f5ffcd66555c7662f43c9cc1ce4742";
sha256 = "sha256-iPc95LmDsYizLg45wpU+vFx/N6MR2hewSHqoRsePC/4=";
};
patches = [
# Fix paths to libpulse and python
(replaceVars ./fix-paths.patch {
libpulse = "${libpulseaudio}/lib/libpulse.so";
python = python3.interpreter;
})
];
dontBuild = true;
passthru = {
extensionUuid = "sound-output-device-chooser@kgshank.net";
extensionPortalSlug = "sound-output-device-chooser";
};
makeFlags = [
"INSTALL_DIR=${placeholder "out"}/share/gnome-shell/extensions"
];
preInstall = ''
mkdir -p ${placeholder "out"}/share/gnome-shell/extensions
'';
meta = with lib; {
description = "GNOME Shell extension adding audio device chooser to panel";
license = licenses.gpl3Plus;
maintainers = [ ];
homepage = "https://github.com/kgshank/gse-sound-output-device-chooser";
};
}

View File

@@ -0,0 +1,26 @@
diff --git a/sound-output-device-chooser@kgshank.net/convenience.js b/sound-output-device-chooser@kgshank.net/convenience.js
index 54ad06f..0860531 100644
--- a/sound-output-device-chooser@kgshank.net/convenience.js
+++ b/sound-output-device-chooser@kgshank.net/convenience.js
@@ -142,7 +142,7 @@ function refreshCards() {
if (newProfLogic) {
_log("New logic");
let pyLocation = Me.dir.get_child("utils/pa_helper.py").get_path();
- let pythonExec = ["python", "python3", "python2"].find(cmd => isCmdFound(cmd));
+ let pythonExec = '@python@';
if (!pythonExec) {
_log("ERROR: Python not found. fallback to default mode");
_settings.set_boolean(Prefs.NEW_PROFILE_ID, false);
diff --git a/sound-output-device-chooser@kgshank.net/utils/libpulse_introspect.py b/sound-output-device-chooser@kgshank.net/utils/libpulse_introspect.py
index c4d2484..262608d 100644
--- a/sound-output-device-chooser@kgshank.net/utils/libpulse_introspect.py
+++ b/sound-output-device-chooser@kgshank.net/utils/libpulse_introspect.py
@@ -82,7 +82,7 @@ else:
_libraries = {}
-libpulse_library_name = find_library('pulse')
+libpulse_library_name = '@libpulse@'
if libpulse_library_name is None:
raise Exception('No libpulse.so library found!')

View File

@@ -0,0 +1,67 @@
{
lib,
stdenvNoCC,
fetchFromGitHub,
glib,
# These loosen security a bit, so we don't install them by default. See also:
# https://github.com/hardpixel/systemd-manager?tab=readme-ov-file#without-password-prompt
allowPolkitPolicy ? "none",
config,
systemd ? config.systemd.package,
}:
assert lib.elem allowPolkitPolicy [
"none"
"pkexec"
"systemctl"
];
stdenvNoCC.mkDerivation rec {
pname = "gnome-shell-extension-systemd-manager";
version = "19";
# Upstream doesn't post new versions in extensions.gnome.org anymore, see also:
# https://github.com/hardpixel/systemd-manager/issues/19
src = fetchFromGitHub {
owner = "hardpixel";
repo = "systemd-manager";
rev = "v${version}";
hash = "sha256-qmRDTyI2Kyr+ViNNgmna/E8xH1qzPyxzdPXyrwrgQGY=";
};
nativeBuildInputs = [ glib ];
postInstall = ''
rm systemd-manager@hardpixel.eu/schemas/gschemas.compiled
glib-compile-schemas systemd-manager@hardpixel.eu/schemas
mkdir -p $out/share/gnome-shell/extensions
mv systemd-manager@hardpixel.eu $out/share/gnome-shell/extensions
''
+ lib.optionalString (allowPolkitPolicy == "pkexec") ''
local bn=org.freedesktop.policykit.pkexec.systemctl.policy
mkdir -p $out/share/polkit-1/actions
substitute systemd-policies/$bn $out/share/polkit-1/actions/$bn \
--replace-fail /usr/bin/systemctl ${lib.getBin systemd}/bin/systemctl
''
+ lib.optionalString (allowPolkitPolicy == "systemctl") ''
install -Dm0644 \
systemd-policies/10-service_status.rules \
$out/share/polkit-1/rules.d/10-gnome-extension-systemd-manager.rules
'';
passthru = {
extensionUuid = "systemd-manager@hardpixel.eu";
extensionPortalSlug = "systemd-manager";
};
meta = with lib; {
description = "GNOME Shell extension to manage systemd services";
homepage = "https://github.com/hardpixel/systemd-manager";
license = licenses.gpl3Only;
maintainers = with maintainers; [
linsui
doronbehar
];
};
}

View File

@@ -0,0 +1,51 @@
{
lib,
stdenv,
replaceVars,
fetchFromGitHub,
taskwarrior2,
gettext,
runtimeShell,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-taskwhisperer";
version = "20";
src = fetchFromGitHub {
owner = "cinatic";
repo = "taskwhisperer";
rev = "v${version}";
sha256 = "sha256-UVBLFXsbOPRXC4P5laZ82Rs08yXnNnzJ+pp5fbx6Zqc=";
};
nativeBuildInputs = [
gettext
];
buildInputs = [
taskwarrior2
];
passthru = {
extensionUuid = "taskwhisperer-extension@infinicode.de";
extensionPortalSlug = "taskwhisperer";
};
makeFlags = [
"INSTALLBASE=${placeholder "out"}/share/gnome-shell/extensions"
];
patches = [
(replaceVars ./fix-paths.patch {
task = "${taskwarrior2}/bin/task";
})
];
meta = with lib; {
description = "GNOME Shell TaskWarrior GUI";
license = licenses.gpl3Plus;
maintainers = [ ];
homepage = "https://github.com/cinatic/taskwhisperer";
};
}

View File

@@ -0,0 +1,99 @@
diff --git a/taskwhisperer-extension@infinicode.de/metadata.json b/taskwhisperer-extension@infinicode.de/metadata.json
index 2f1471c..a84bdf4 100644
--- a/taskwhisperer-extension@infinicode.de/metadata.json
+++ b/taskwhisperer-extension@infinicode.de/metadata.json
@@ -6,7 +6,8 @@
"3.32",
"3.36",
"3.38",
- "40"
+ "40",
+ "41"
],
"url": "https://github.com/cinatic/taskwhisperer",
"uuid": "taskwhisperer-extension@infinicode.de",
diff --git a/taskwhisperer-extension@infinicode.de/services/taskService.js b/taskwhisperer-extension@infinicode.de/services/taskService.js
index df09cdf..df68c60 100644
--- a/taskwhisperer-extension@infinicode.de/services/taskService.js
+++ b/taskwhisperer-extension@infinicode.de/services/taskService.js
@@ -63,7 +63,7 @@ var loadTaskData = async ({ taskStatus, project, taskOrder }) => {
await syncTasks()
- const command = ['task', 'rc.json.array=on', statusFilter, projectFilter, 'export'].join(' ')
+ const command = ['@task@', 'rc.json.array=on', statusFilter, projectFilter, 'export'].join(' ')
let { output, error } = await run({ command })
@@ -110,7 +110,7 @@ var loadProjectsData = async taskStatus => {
await syncTasks()
- const command = ['task', 'rc.json.array=on', statusFilter, 'export'].join(' ')
+ const command = ['@task@', 'rc.json.array=on', statusFilter, 'export'].join(' ')
const { output: allTheTasks } = await run({ command })
let sortedUniqueProjects = []
@@ -129,7 +129,7 @@ var setTaskDone = async taskID => {
return
}
- const command = ['task', taskID.toString(), 'done'].join(' ')
+ const command = ['@task@', taskID.toString(), 'done'].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -146,7 +146,7 @@ var setTaskUndone = async taskUUID => {
return
}
- const command = ['task', `uuid:${taskUUID}`, 'modify', 'status:pending'].join(' ')
+ const command = ['@task@', `uuid:${taskUUID}`, 'modify', 'status:pending'].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -163,7 +163,7 @@ var startTask = async taskID => {
return
}
- const command = ['task', taskID.toString(), 'start'].join(' ')
+ const command = ['@task@', taskID.toString(), 'start'].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -180,7 +180,7 @@ var stopTask = async taskID => {
return
}
- const command = ['task', taskID.toString(), 'stop'].join(' ')
+ const command = ['@task@', taskID.toString(), 'stop'].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -195,7 +195,7 @@ var stopTask = async taskID => {
var createTask = async task => {
const params = _convertTaskToParams(task)
- const command = ['task', 'add', ...params].join(' ')
+ const command = ['@task@', 'add', ...params].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -212,7 +212,7 @@ var modifyTask = async (taskUUID, task) => {
const params = _convertTaskToParams(task)
- const command = ['task', `uuid:${taskUUID}`, 'modify', ...params].join(' ')
+ const command = ['@task@', `uuid:${taskUUID}`, 'modify', ...params].join(' ')
const result = await run({ command, asJson: false })
if (!result.error) {
@@ -227,7 +227,7 @@ var syncTasks = async () => {
return
}
- const command = ['task', 'sync'].join(' ')
+ const command = ['@task@', 'sync'].join(' ')
const result = await run({ command, asJson: false })
_showProcessErrorNotificationIfError(result, 'Sync Tasks')

View File

@@ -0,0 +1,47 @@
{
stdenv,
lib,
fetchFromGitHub,
glib,
gnome-shell,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-tilingnome";
version = "unstable-2019-09-19";
src = fetchFromGitHub {
owner = "rliang";
repo = "gnome-shell-extension-tilingnome";
rev = "f401c20c9721d85e6b3e30d1e822a200db370407";
sha256 = "1hq9g9bxqpzqrdj9zm0irld8r6q4w1m4b00jya7wsny8rzb1s0y2";
};
nativeBuildInputs = [ glib ];
buildPhase = ''
runHook preBuild
glib-compile-schemas .
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p "$out/share/gnome-shell/extensions/tilingnome@rliang.github.com"
cp -r * "$out/share/gnome-shell/extensions/tilingnome@rliang.github.com/"
runHook postInstall
'';
passthru = {
extensionUuid = "tilingnome@rliang.github.com";
extensionPortalSlug = "tilingnome";
};
meta = with lib; {
description = "Tiling window management for GNOME Shell";
license = licenses.gpl2;
maintainers = with maintainers; [ benley ];
homepage = "https://github.com/rliang/gnome-shell-extension-tilingnome";
platforms = gnome-shell.meta.platforms;
};
}

View File

@@ -0,0 +1,34 @@
{
lib,
stdenv,
fetchFromGitHub,
glib,
gettext,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-topicons-plus";
version = "27";
src = fetchFromGitHub {
owner = "phocean";
repo = "TopIcons-plus";
rev = version;
sha256 = "1p3jlvs4zgnrvy8am7myivv4rnnshjp49kg87rd22qqyvcz51ykr";
};
buildInputs = [ glib ];
nativeBuildInputs = [ gettext ];
makeFlags = [ "INSTALL_PATH=$(out)/share/gnome-shell/extensions" ];
passthru.extensionUuid = "TopIcons@phocean.net";
meta = with lib; {
description = "Brings all icons back to the top panel, so that it's easier to keep track of apps running in the backround";
license = licenses.gpl2Only;
maintainers = with maintainers; [ eperuffo ];
homepage = "https://github.com/phocean/TopIcons-plus";
};
}

View File

@@ -0,0 +1,50 @@
{
lib,
stdenv,
gnome-shell,
fetchFromGitHub,
xprop,
glib,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-unite";
version = "83";
src = fetchFromGitHub {
owner = "hardpixel";
repo = "unite-shell";
rev = "v${version}";
hash = "sha256-L920BTDEQd/XP+Qa/f4VniCTJhVGgjipCcTAYPdfXg8=";
};
passthru = {
extensionUuid = "unite@hardpixel.eu";
extensionPortalSlug = "unite";
};
nativeBuildInputs = [ glib ];
buildInputs = [ xprop ];
buildPhase = ''
runHook preBuild
glib-compile-schemas --strict --targetdir="unite@hardpixel.eu/schemas/" "unite@hardpixel.eu/schemas"
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r "unite@hardpixel.eu" $out/share/gnome-shell/extensions
runHook postInstall
'';
meta = with lib; {
description = "Unite is a GNOME Shell extension which makes a few layout tweaks to the top panel and removes window decorations to make it look like Ubuntu Unity Shell";
license = licenses.gpl3Only;
maintainers = with maintainers; [ rhoriguchi ];
homepage = "https://github.com/hardpixel/unite-shell";
broken = versionOlder gnome-shell.version "3.32";
};
}

View File

@@ -0,0 +1,443 @@
#!/usr/bin/env nix-shell
#!nix-shell -I nixpkgs=../../../.. -i python3 -p python3
### After making change:
### - Format the script by running: nix run nixpkgs#black pkgs/desktops/gnome/extensions/update-extensions.py
### - Run the unit test by running: python3 -m unittest pkgs/desktops/gnome/extensions/update-extensions.py
### - Run the type checking by running: nix run nixpkgs#mypy pkgs/desktops/gnome/extensions/update-extensions.py
import base64
import json
import logging
import argparse
import unittest
import subprocess
import urllib.error
import urllib.request
from contextlib import contextmanager
from operator import itemgetter
from pathlib import Path
from typing import Any
# We don't want all those deprecated legacy extensions
# Group extensions by GNOME "major" version for compatibility reasons
supported_versions = {
"38": "3.38",
"40": "40",
"41": "41",
"42": "42",
"43": "43",
"44": "44",
"45": "45",
"46": "46",
"47": "47",
"48": "48",
}
# shell versions that we want to put into the gnomeExtensions attr set
versions_to_merge = ["46", "47", "48"]
# Some type alias to increase readability of complex compound types
PackageName = str
ShellVersion = str
Uuid = str
ExtensionVersion = int
updater_dir_path = Path(__file__).resolve().parent
def fetch_extension_data(uuid: str, version: str) -> tuple[str, str]:
"""
Download the extension and hash it. We use `nix-prefetch-url` for this for efficiency reasons.
Returns a tuple with the hash (Nix-compatible) of the zip file's content and the base64-encoded content of its metadata.json.
"""
# The download URLs follow this schema
uuid = uuid.replace("@", "")
url: str = (
f"https://extensions.gnome.org/extension-data/{uuid}.v{version}.shell-extension.zip"
)
# Download extension and add the zip content to nix-store
for _ in range(0, 10):
process = subprocess.run(
["nix-prefetch-url", "--unpack", "--print-path", url],
capture_output=True,
text=True,
)
if process.returncode == 0:
break
else:
logging.warning(f"Nix-prefetch-url failed for {url}:")
logging.warning(f"Stderr: {process.stderr}")
logging.warning("Retrying")
if process.returncode != 0:
raise Exception(
"Retried 10 times, but still failed to download the extension. Exiting."
)
lines = process.stdout.splitlines()
# Get hash from first line of nix-prefetch-url output
hash = lines[0].strip()
# Get path from second line of nix-prefetch-url output
path = Path(lines[1].strip())
# Get metadata.json content from nix-store
with open(path / "metadata.json", "r") as out:
metadata = base64.b64encode(out.read().encode("ascii")).decode()
return hash, metadata
def generate_extension_versions(
extension_version_map: dict[ShellVersion, ExtensionVersion],
uuid: str,
) -> dict[ShellVersion, dict[str, str]]:
"""
Takes in a mapping from shell versions to extension versions and transforms it the way we need it:
- Only take one extension version per GNOME Shell major version (as per `supported_versions`)
- Filter out versions that only support old GNOME versions
- Download the extension and hash it
"""
# Determine extension version per shell version
extension_versions: dict[ShellVersion, ExtensionVersion] = {}
for shell_version, version_prefix in supported_versions.items():
# Newest compatible extension version
extension_version: int | None = max(
(
int(ext_ver)
for shell_ver, ext_ver in extension_version_map.items()
if (shell_ver.startswith(version_prefix))
),
default=None,
)
# Extension is not compatible with this GNOME version
if not extension_version:
continue
extension_versions[shell_version] = extension_version
# Download information once for all extension versions chosen above
extension_info_cache: dict[ExtensionVersion, tuple[str, str]] = {}
for extension_version in sorted(set(extension_versions.values())):
logging.debug(f"[{uuid}] Downloading v{extension_version}")
extension_info_cache[extension_version] = fetch_extension_data(
uuid,
str(extension_version),
)
# Fill map
extension_versions_full: dict[ShellVersion, dict[str, str]] = {}
for shell_version, extension_version in extension_versions.items():
sha256, metadata = extension_info_cache[extension_version]
extension_versions_full[shell_version] = {
"version": str(extension_version),
"sha256": sha256,
# The downloads are impure, their metadata.json may change at any time.
# Thus, we back it up / pin it to remain deterministic
# Upstream issue: https://gitlab.gnome.org/Infrastructure/extensions-web/-/issues/137
"metadata": metadata,
}
return extension_versions_full
def pname_from_url(url: str) -> tuple[str, str]:
"""
Parse something like "/extension/1475/battery-time/" and output ("battery-time", "1475")
"""
url = url.split("/") # type: ignore
return url[3], url[2]
def process_extension(extension: dict[str, Any]) -> dict[str, Any] | None:
"""
Process an extension. It takes in raw scraped data and downloads all the necessary information that buildGnomeExtension.nix requires
Input: a json object of one extension queried from the site. It has the following schema (only important key listed):
{
"uuid": str,
"name": str,
"description": str,
"link": str,
"shell_version_map": {
str: { "version": int, … },
},
}
"uuid" is an extension UUID that looks like this (most of the time): "extension-name@username.domain.tld".
Don't make any assumptions on it, and treat it like an opaque string!
"link" follows the following schema: "/extension/$number/$string/"
The number is monotonically increasing and unique to every extension.
The string is usually derived from the extension name (but shortened, kebab-cased and URL friendly).
It may diverge from the actual name.
The keys of "shell_version_map" are GNOME Shell version numbers.
Output: a json object to be stored, or None if the extension should be skipped. Schema:
{
"uuid": str,
"name": str,
"pname": str,
"description": str,
"link": str,
"shell_version_map": {
str: { "version": int, "sha256": str, "metadata": <hex> },
}
}
Only "uuid" gets passed along unmodified. "name", "description" and "link" are taken from the input, but sanitized.
"pname" gets generated from other fields and "shell_version_map" has a completely different structure than the input
field with the same name.
"""
uuid = extension["uuid"]
# Yeah, there are some extensions without any releases
if not extension["shell_version_map"]:
return None
logging.info(f"Processing '{uuid}'")
# Input is a mapping str -> { version: int, … }
# We want to map shell versions to extension versions
shell_version_map: dict[ShellVersion, int] = {
k: v["version"] for k, v in extension["shell_version_map"].items()
}
# Transform shell_version_map to be more useful for us. Also throw away unwanted versions
shell_version_map: dict[ShellVersion, dict[str, str]] = generate_extension_versions(shell_version_map, uuid) # type: ignore
# No compatible versions found
if not shell_version_map:
return None
# Fetch a human-readable name for the package.
(pname, _pname_id) = pname_from_url(extension["link"])
return {
"uuid": uuid,
"name": extension["name"],
"pname": pname,
"description": extension["description"],
"link": "https://extensions.gnome.org" + extension["link"],
"shell_version_map": shell_version_map,
}
@contextmanager
def request(url: str, retries: int = 5, retry_codes: list[int] = [500, 502, 503, 504]):
req = urllib.request.Request(
url,
headers={
"User-Agent": "NixpkgsGnomeExtensionUpdate (+https://github.com/NixOS/nixpkgs)"
},
)
for attempt in range(retries + 1):
try:
with urllib.request.urlopen(req) as response:
yield response
break
except urllib.error.HTTPError as e:
if e.code in retry_codes and attempt < retries:
logging.warning(f"Error while fetching {url}. Retrying: {e}")
else:
raise e
def scrape_extensions_index() -> list[dict[str, Any]]:
"""
Scrape the list of extensions by sending search queries to the API. We simply go over it
page by page until we hit a non-full page or a 404 error.
The returned list is sorted by the age of the extension, in order to be deterministic.
"""
page = 0
extensions = []
while True:
page += 1
logging.info("Scraping page " + str(page))
try:
with request(
f"https://extensions.gnome.org/extension-query/?n_per_page=25&page={page}"
) as response:
data = json.loads(response.read().decode())["extensions"]
response_length = len(data)
for extension in data:
extensions.append(extension)
# If our page isn't "full", it must have been the last one
if response_length < 25:
logging.debug(
f"\tThis page only has {response_length} entries, so it must be the last one."
)
break
except urllib.error.HTTPError as e:
if e.code == 404:
# We reached past the last page and are done now
break
else:
raise
# `pk` is the primary key in the extensions.gnome.org database. Sorting on it will give us a stable,
# deterministic ordering.
extensions.sort(key=itemgetter("pk"))
return extensions
def fetch_extensions() -> list[dict[str, Any]]:
raw_extensions = scrape_extensions_index()
logging.info(f"Downloaded {len(raw_extensions)} extensions. Processing …")
processed_extensions: list[dict[str, Any]] = []
for num, raw_extension in enumerate(raw_extensions):
processed_extension = process_extension(raw_extension)
if processed_extension:
processed_extensions.append(processed_extension)
logging.debug(f"Processed {num + 1} / {len(raw_extensions)}")
return processed_extensions
def serialize_extensions(processed_extensions: list[dict[str, Any]]) -> None:
# We micro-manage a lot of the serialization process to keep the diffs optimal.
# We generally want most of the attributes of an extension on one line,
# but then each of its supported versions with metadata on a new line.
with open(updater_dir_path / "extensions.json", "w") as out:
for index, extension in enumerate(processed_extensions):
# Manually pretty-print the outermost array level
if index == 0:
out.write("[ ")
else:
out.write(", ")
# Dump each extension into a single-line string forst
serialized_extension = json.dumps(extension, ensure_ascii=False)
# Inject line breaks for each supported version
for version in supported_versions:
# This one only matches the first entry
serialized_extension = serialized_extension.replace(
f'{{"{version}": {{',
f'{{\n "{version}": {{',
)
# All other entries
serialized_extension = serialized_extension.replace(
f', "{version}": {{',
f',\n "{version}": {{',
)
# One last line break around the closing braces
serialized_extension = serialized_extension.replace("}}}", "}\n }}")
out.write(serialized_extension)
out.write("\n")
out.write("]\n")
def find_collisions(
extensions: list[dict[str, Any]],
versions: list[str],
) -> dict[PackageName, list[Uuid]]:
package_name_registry: dict[PackageName, set[Uuid]] = {}
for extension in extensions:
pname = extension["pname"]
uuid = extension["uuid"]
for shell_version in versions:
if shell_version in extension["shell_version_map"]:
package_name_registry.setdefault(pname, set()).add(uuid)
return {
pname: sorted(uuids)
for pname, uuids in sorted(package_name_registry.items())
if len(uuids) > 1
}
def main() -> None:
logging.basicConfig(level=logging.DEBUG)
parser = argparse.ArgumentParser()
parser.add_argument(
"--skip-fetch",
action="store_true",
help="Skip fetching extensions. When this option is set, the script does not fetch extensions from the internet, but checks for name collisions.",
)
args = parser.parse_args()
if not args.skip_fetch:
processed_extensions = fetch_extensions()
serialize_extensions(processed_extensions)
logging.info(
f"Done. Writing results to extensions.json ({len(processed_extensions)} extensions in total)"
)
with open(updater_dir_path / "extensions.json", "r") as out:
extensions = json.load(out)
collisions = find_collisions(extensions, versions_to_merge)
with open(updater_dir_path / "collisions.json", "w") as out:
json.dump(collisions, out, indent=2, ensure_ascii=False)
out.write("\n")
logging.info(
"Done. Writing name collisions to collisions.json (please check manually)"
)
if __name__ == "__main__":
main()
class FindCollisions(unittest.TestCase):
extensions = [
{
"pname": "foo",
"uuid": "foo_38_to_40@doe.example",
"shell_version_map": {
"38": {},
"40": {},
},
},
{
"pname": "bar",
"uuid": "bar_42_to_45@chulsoo.example",
"shell_version_map": {
"42": {},
"43": {},
"44": {},
"45": {},
},
},
{
"pname": "bar",
"uuid": "bar_44_to_47@younghee.example",
"shell_version_map": {
"44": {},
"45": {},
"46": {},
"47": {},
},
},
]
def test_no_collision(self) -> None:
self.assertEqual(
{},
find_collisions(self.extensions, ["40", "41", "42"]),
)
def test_collision(self) -> None:
self.assertEqual(
{
"bar": [
"bar_42_to_45@chulsoo.example",
"bar_44_to_47@younghee.example",
],
},
find_collisions(self.extensions, ["45", "46", "47"]),
)

View File

@@ -0,0 +1,42 @@
{
stdenv,
lib,
fetchFromGitHub,
meson,
ninja,
gitUpdater,
}:
stdenv.mkDerivation rec {
pname = "gnome-shell-extension-valent";
version = "1.0.0.alpha.48";
src = fetchFromGitHub {
owner = "andyholmes";
repo = "gnome-shell-extension-valent";
tag = "v${version}";
hash = "sha256-j5590Emcga3Wp7/lC/ni2NpEC3bkR2/vT4Cq/m8GvBM=";
};
nativeBuildInputs = [
meson
ninja
];
passthru = {
extensionUuid = "valent@andyholmes.ca";
extensionPortalSlug = "valent";
updateScript = gitUpdater {
rev-prefix = "v";
};
};
meta = {
description = "GNOME Shell integration for Valent";
homepage = "https://valent.andyholmes.ca/";
changelog = "https://github.com/andyholmes/gnome-shell-extension-valent/blob/${src.rev}/CHANGELOG.md";
license = lib.licenses.gpl3Plus;
maintainers = [ ];
platforms = lib.platforms.linux;
};
}

View File

@@ -0,0 +1,40 @@
{
lib,
stdenv,
fetchFromGitHub,
gnome-shell,
}:
stdenv.mkDerivation {
pname = "gnome-shell-extension-window-corner-preview";
version = "unstable-2019-04-03";
src = fetchFromGitHub {
owner = "medenagan";
repo = "window-corner-preview";
rev = "a95bb1389d94474efab7509aac592fb58fff6006";
sha256 = "03v18j9l0fb64xrg3swf1vcgl0kpgwjlp8ddn068bpvghrsvgfah";
};
dontBuild = true;
passthru = {
extensionUuid = "window-corner-preview@fabiomereu.it";
extensionPortalSlug = "window-corner-preview";
};
installPhase = ''
runHook preInstall
mkdir -p $out/share/gnome-shell/extensions
cp -r "window-corner-preview@fabiomereu.it" $out/share/gnome-shell/extensions
runHook postInstall
'';
meta = with lib; {
description = "GNOME Shell extension showing a video preview on the corner of the screen";
license = licenses.mit;
maintainers = [ ];
homepage = "https://github.com/medenagan/window-corner-preview";
broken = lib.versionAtLeast gnome-shell.version "3.32"; # Doesn't support 3.34
};
}

View File

@@ -0,0 +1,288 @@
import argparse
import math
import json
import requests
import sys
from enum import Enum
from libversion import Version
from typing import (
Callable,
Iterable,
List,
NamedTuple,
Optional,
Tuple,
TypeVar,
Type,
cast,
)
EnumValue = TypeVar("EnumValue", bound=Enum)
def enum_to_arg(enum: Enum) -> str:
return enum.name.lower().replace("_", "-")
def arg_to_enum(enum_meta: Type[EnumValue], name: str) -> EnumValue:
return enum_meta[name.upper().replace("-", "_")]
def enum_to_arg_choices(enum_meta: Type[EnumValue]) -> Tuple[str, ...]:
return tuple(enum_to_arg(v) for v in cast(Iterable[EnumValue], enum_meta))
class Stability(Enum):
STABLE = "stable"
UNSTABLE = "unstable"
def allows(self, target: "Stability") -> bool:
"""
Whether selected stability `self` allows version
with a specified `target` stability.
"""
match self:
case Stability.STABLE:
return target == Stability.STABLE
case Stability.UNSTABLE:
return True
def __repr__(self) -> str:
"""
Useful for tests.
"""
match self:
case Stability.STABLE:
return "Stability.STABLE"
case Stability.UNSTABLE:
return "Stability.UNSTABLE"
VersionPolicy = Callable[[Version], bool]
VersionClassifier = Callable[[Version], Stability]
class VersionClassifierHolder(NamedTuple):
function: VersionClassifier
def version_to_list(version: str) -> List[int]:
return list(map(int, version.split(".")))
def odd_unstable(version: Version) -> Stability:
"""
Traditional GNOME version policy
>>> odd_unstable(Version("32"))
Stability.STABLE
>>> odd_unstable(Version("3.2.1"))
Stability.STABLE
>>> odd_unstable(Version("3.2.1.alpha"))
Stability.UNSTABLE
>>> odd_unstable(Version("3.2.1beta"))
Stability.UNSTABLE
>>> odd_unstable(Version("4.2.89"))
Stability.STABLE
>>> odd_unstable(Version("4.2.90"))
Stability.STABLE
>>> odd_unstable(Version("4.88.2"))
Stability.STABLE
>>> odd_unstable(Version("4.90.2"))
Stability.UNSTABLE
>>> odd_unstable(Version("4.3.0"))
Stability.UNSTABLE
>>> odd_unstable(Version("4.3.89"))
Stability.UNSTABLE
>>> odd_unstable(Version("4.2.899"))
Stability.STABLE
>>> odd_unstable(Version("4.2.900"))
Stability.STABLE
>>> odd_unstable(Version("4.898.2"))
Stability.STABLE
>>> odd_unstable(Version("4.900.2"))
Stability.UNSTABLE
"""
try:
version_parts = version_to_list(version.value)
except:
# Failing to parse as a list of numbers likely means the version contains a string tag like “beta”, therefore it is not a stable release.
return Stability.UNSTABLE
if len(version_parts) < 2:
return Stability.STABLE
even = version_parts[1] % 2 == 0
prerelease = (version_parts[1] >= 90 and version_parts[1] < 100) or (version_parts[1] >= 900 and version_parts[1] < 1000)
stable = even and not prerelease
if stable:
return Stability.STABLE
else:
return Stability.UNSTABLE
def ninety_micro_unstable(version: Version) -> Stability:
"""
<https://gitlab.gnome.org/GNOME/gcr/-/tree/4.3.90.3#versions>:
> To denote unstable versions, the micro version number will correspond to 90 or
> higher, e.g. 4.$MINOR.90.
>>> ninety_micro_unstable(Version("3.2.1"))
Stability.STABLE
>>> ninety_micro_unstable(Version("3.2.1.alpha"))
Stability.UNSTABLE
>>> ninety_micro_unstable(Version("3.2.1beta"))
Stability.UNSTABLE
>>> ninety_micro_unstable(Version("4.2.89"))
Stability.STABLE
>>> ninety_micro_unstable(Version("4.3.89"))
Stability.STABLE
>>> ninety_micro_unstable(Version("4.2.90"))
Stability.UNSTABLE
>>> ninety_micro_unstable(Version("4.2.89.3"))
Stability.STABLE
>>> ninety_micro_unstable(Version("4.2.90.3"))
Stability.UNSTABLE
>>> ninety_micro_unstable(Version("4.90.1"))
Stability.STABLE
"""
try:
version_parts = version_to_list(version.value)
except:
# Failing to parse as a list of numbers likely means the version contains a string tag like “beta”, therefore it is not a stable release.
return Stability.UNSTABLE
if len(version_parts) < 3:
return Stability.STABLE
prerelease = version_parts[2] >= 90
if prerelease:
return Stability.UNSTABLE
else:
return Stability.STABLE
def tagged(version: Version) -> Stability:
"""
Considers only versions with explicit `alpha`, `beta` or `rc` tags unstable.
>>> tagged(Version("32"))
Stability.STABLE
>>> tagged(Version("3.2.1"))
Stability.STABLE
>>> tagged(Version("4.3.0"))
Stability.STABLE
>>> tagged(Version("3.2.1.alpha"))
Stability.UNSTABLE
>>> tagged(Version("3.2.1beta"))
Stability.UNSTABLE
>>> tagged(Version("3.2.1rc.3"))
Stability.UNSTABLE
"""
prerelease = "alpha" in version.value or "beta" in version.value or "rc" in version.value
if prerelease:
return Stability.UNSTABLE
else:
return Stability.STABLE
def no_policy(version: Version) -> Stability:
"""
Considers any version stable.
>>> no_policy(Version("32"))
Stability.STABLE
>>> no_policy(Version("3.2.1"))
Stability.STABLE
>>> no_policy(Version("3.2.1.alpha"))
Stability.STABLE
>>> no_policy(Version("3.2.1beta"))
Stability.STABLE
"""
return Stability.STABLE
class VersionPolicyKind(Enum):
# HACK: Using function as values directly would make Enum
# think they are methods and skip them.
ODD_UNSTABLE = VersionClassifierHolder(odd_unstable)
NINETY_MICRO_UNSTABLE = VersionClassifierHolder(ninety_micro_unstable)
TAGGED = VersionClassifierHolder(tagged)
NONE = VersionClassifierHolder(no_policy)
def make_version_policy(
version_policy_kind: VersionPolicyKind,
selected: Stability,
upper_bound: Optional[Version],
) -> VersionPolicy:
version_classifier = version_policy_kind.value.function
if not upper_bound:
return lambda version: selected.allows(version_classifier(version))
else:
return lambda version: selected.allows(version_classifier(version)) and version < upper_bound
def find_versions(package_name: str, version_policy: VersionPolicy) -> List[Version]:
# The structure of cache.json: https://gitlab.gnome.org/Infrastructure/sysadmin-bin/blob/master/ftpadmin#L762
cache = json.loads(requests.get(f"https://download.gnome.org/sources/{package_name}/cache.json").text)
if type(cache) != list or cache[0] != 4:
raise Exception("Unknown format of cache.json file.")
versions: Iterable[Version] = map(Version, cache[2][package_name])
versions = sorted(filter(version_policy, versions))
return versions
parser = argparse.ArgumentParser(
description="Find latest version for a GNOME package by crawling their release server.",
)
parser.add_argument(
"package-name",
help="Name of the directory in https://download.gnome.org/sources/ containing the package.",
)
parser.add_argument(
"version-policy",
help="Policy determining which versions are considered stable. GNOME packages usually denote stability by alpha/beta/rc tag in the version. For older packages, odd minor versions are unstable but there are exceptions.",
choices=enum_to_arg_choices(VersionPolicyKind),
nargs="?",
default=enum_to_arg(VersionPolicyKind.TAGGED),
)
parser.add_argument(
"requested-release",
help="Most of the time, we will want to update to stable version but sometimes it is useful to test.",
choices=enum_to_arg_choices(Stability),
nargs="?",
default=enum_to_arg(Stability.STABLE),
)
parser.add_argument(
"--upper-bound",
dest="upper-bound",
help="Only look for versions older than this one (useful for pinning dependencies).",
)
if __name__ == "__main__":
args = parser.parse_args()
package_name = getattr(args, "package-name")
requested_release = arg_to_enum(Stability, getattr(args, "requested-release"))
upper_bound = getattr(args, "upper-bound")
if upper_bound is not None:
upper_bound = Version(upper_bound)
version_policy_kind = arg_to_enum(VersionPolicyKind, getattr(args, "version-policy"))
version_policy = make_version_policy(version_policy_kind, requested_release, upper_bound)
try:
versions = find_versions(package_name, version_policy)
except Exception as error:
print(error, file=sys.stderr)
sys.exit(1)
if len(versions) == 0:
print("No versions matched.", file=sys.stderr)
sys.exit(1)
print(versions[-1].value)

View File

@@ -0,0 +1,39 @@
{
runCommand,
gdk-pixbuf,
lib,
stdenv,
buildPackages,
}:
{
extraLoaders,
}:
let
# Get packages to generate the cache for. We always include gdk-pixbuf.
loaderPackages = [
gdk-pixbuf
]
++ extraLoaders;
in
# Generate the cache file by running gdk-pixbuf-query-loaders for each
# package and concatenating the results.
runCommand "gdk-pixbuf-loaders.cache"
{
preferLocalBuild = true;
}
''
(
for package in ${lib.escapeShellArgs loaderPackages}; do
module_dir="$package/${gdk-pixbuf.moduleDir}"
if [[ ! -d "$module_dir" ]]; then
echo "Error: gdkPixbufCacheBuilder: Passed package ''${package} does not contain GdkPixbuf loaders in ${gdk-pixbuf.moduleDir}." 1>&2
exit 1
fi
GDK_PIXBUF_MODULEDIR="$module_dir" \
${stdenv.hostPlatform.emulator buildPackages} ${gdk-pixbuf.dev}/bin/gdk-pixbuf-query-loaders
done
) > "$out"
''

View File

@@ -0,0 +1,22 @@
{
isoBaseName ? "nixos-graphical-gnome",
system ? builtins.currentSystem,
extraModules ? [ ],
}:
let
module = ../../../../nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix;
config =
(import ../../../../nixos/lib/eval-config.nix {
inherit system;
modules = [
module
{ image.baseName = isoBaseName; }
]
++ extraModules;
}).config;
in
config.system.build.isoImage

View File

@@ -0,0 +1,58 @@
{
lib,
fetchPypi,
buildPythonApplication,
poetry-core,
colorama,
packaging,
pydantic,
requests,
pygobject3,
tqdm,
gobject-introspection,
wrapGAppsNoGuiHook,
}:
buildPythonApplication rec {
pname = "gnome-extensions-cli";
version = "0.10.6";
format = "pyproject";
src = fetchPypi {
pname = "gnome_extensions_cli";
inherit version;
hash = "sha256-REsdgsHPYBms+qbOF4ogV8D/xi5fC9ogl+HOvnsXi7o=";
};
nativeBuildInputs = [
gobject-introspection
poetry-core
wrapGAppsNoGuiHook
];
pythonRelaxDeps = [
"more-itertools"
"packaging"
];
propagatedBuildInputs = [
colorama
packaging
pydantic
requests
pygobject3
tqdm
];
pythonImportsCheck = [
"gnome_extensions_cli"
];
meta = with lib; {
homepage = "https://github.com/essembeh/gnome-extensions-cli";
description = "Command line tool to manage your GNOME Shell extensions";
license = licenses.asl20;
maintainers = with maintainers; [ dylanmtaylor ];
platforms = platforms.linux;
};
}

View File

@@ -0,0 +1,61 @@
{
lib,
runCommand,
gsettings-desktop-schemas,
gnome-shell,
glib,
gnome-flashback,
nixos-artwork,
nixos-background-light ? nixos-artwork.wallpapers.simple-blue,
nixos-background-dark ? nixos-artwork.wallpapers.simple-dark-gray,
extraGSettingsOverrides ? "",
extraGSettingsOverridePackages ? [ ],
favoriteAppsOverride ? "",
flashbackEnabled ? false,
}:
let
inherit (lib) concatMapStringsSep;
gsettingsOverridePackages = [
gsettings-desktop-schemas
gnome-shell
]
++ lib.optionals flashbackEnabled [
gnome-flashback
]
++ extraGSettingsOverridePackages;
gsettingsOverrides = ''
[org.gnome.desktop.background]
picture-uri='file://${nixos-background-light.gnomeFilePath}'
picture-uri-dark='file://${nixos-background-dark.gnomeFilePath}'
[org.gnome.desktop.screensaver]
picture-uri='file://${nixos-background-dark.gnomeFilePath}'
${favoriteAppsOverride}
${extraGSettingsOverrides}
'';
in
runCommand "gnome-gsettings-overrides" { preferLocalBuild = true; } ''
data_dir="$out/share/gsettings-schemas/nixos-gsettings-overrides"
schema_dir="$data_dir/glib-2.0/schemas"
mkdir -p "$schema_dir"
${concatMapStringsSep "\n" (
pkg:
"cp -rf \"${glib.getSchemaPath pkg}\"/*.xml \"${glib.getSchemaPath pkg}\"/*.gschema.override \"$schema_dir\""
) gsettingsOverridePackages}
chmod -R a+w "$data_dir"
cat - > "$schema_dir/zz-nixos-defaults.gschema.override" <<- EOF
${gsettingsOverrides}
EOF
${glib.dev}/bin/glib-compile-schemas --strict "$schema_dir"
''

View File

@@ -0,0 +1,113 @@
{
stdenv,
pkgs,
lib,
writeScript,
python3,
common-updater-scripts,
}:
{
packageName,
attrPath ? packageName,
versionPolicy ? "tagged",
freeze ? false,
}:
let
python = python3.withPackages (p: [
p.requests
p.libversion
]);
package =
lib.attrByPath (lib.splitString "." attrPath) (throw "Cannot find attribute ${attrPath}.")
pkgs;
packageVersion = lib.getVersion package;
upperBound =
let
versionComponents = lib.versions.splitVersion packageVersion;
minorVersion = lib.versions.minor packageVersion;
minorAvailable =
builtins.length versionComponents > 1 && builtins.match "[0-9]+" minorVersion != null;
nextMinor = builtins.fromJSON minorVersion + 1;
upperBound = "${lib.versions.major packageVersion}.${toString nextMinor}";
in
if builtins.isBool freeze then
lib.optionals (freeze && minorAvailable) [ upperBound ]
else if builtins.isString freeze then
[ freeze ]
else
throw "freeze argument needs to be either a boolean, or a version string.";
updateScript = writeScript "gnome-update-script" ''
#!${python}/bin/python
import json
import os
import subprocess
import sys
from libversion import Version
_, attr_path, package_name, package_version, version_policy, *remaining_args = sys.argv
flv_args = [
package_name,
version_policy,
os.environ.get("GNOME_UPDATE_STABILITY", "stable"),
]
match remaining_args:
case []:
pass
case [upper_bound]:
flv_args.append(f"--upper-bound={upper_bound}")
case other:
print("gnome-update-script: Received too many arguments.", file=sys.stderr)
sys.exit(1)
latest_tag = subprocess.check_output(
[
"${python}/bin/python",
"${./find-latest-version.py}",
*flv_args,
],
encoding="utf-8",
)
if Version(latest_tag) <= Version(package_version):
# No newer updates found.
print(json.dumps([]))
sys.exit(0)
latest_tag = latest_tag.strip()
subprocess.run(
[
"${common-updater-scripts}/bin/update-source-version",
attr_path,
latest_tag,
],
check=True,
)
report = [
{
"attrPath": attr_path,
"commitBody": f"https://gitlab.gnome.org/GNOME/{package_name}/-/compare/{package_version}...{latest_tag}",
},
]
print(json.dumps(report))
'';
in
{
name = "gnome-update-script";
command = [
updateScript
attrPath
packageName
packageVersion
versionPolicy
]
++ upperBound;
supportedFeatures = [
"commit"
];
inherit attrPath;
}

View File

@@ -0,0 +1,87 @@
{
stdenv,
lib,
fetchFromGitLab,
gitUpdater,
nixosTests,
cmake,
gettext,
lomiri-ui-toolkit,
pkg-config,
qqc2-suru-style,
qtbase,
wrapQtAppsHook,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "lomiri-calculator-app";
version = "4.1.0";
src = fetchFromGitLab {
owner = "ubports";
repo = "development/apps/lomiri-calculator-app";
tag = "v${finalAttrs.version}";
hash = "sha256-RLg2B8LtYE3b7dRRvhPqIA4RAlwNO585q+02wBEedj8=";
};
postPatch =
# We don't want absolute paths in desktop files
''
substituteInPlace CMakeLists.txt \
--replace-fail 'ICON ''${LOMIRI-CALCULATOR-APP_DIR}/''${ICON_FILE}' 'ICON ''${APP_HARDCODE}' \
--replace-fail 'SPLASH ''${LOMIRI-CALCULATOR-APP_DIR}/''${SPLASH_FILE}' 'SPLASH lomiri-app-launch/splash/''${APP_HARDCODE}.svg'
''
+ lib.optionalString (!finalAttrs.finalPackage.doCheck) ''
substituteInPlace CMakeLists.txt \
--replace-fail 'add_subdirectory(tests)' ""
'';
strictDeps = true;
nativeBuildInputs = [
cmake
gettext
pkg-config
wrapQtAppsHook
];
buildInputs = [
qtbase
# QML
lomiri-ui-toolkit
qqc2-suru-style
];
cmakeFlags = [
(lib.cmakeBool "CLICK_MODE" false)
(lib.cmakeBool "INSTALL_TESTS" false)
];
# No tests we can actually run (just autopilot)
doCheck = false;
postInstall = ''
mkdir -p $out/share/{icons/hicolor/scalable/apps,lomiri-app-launch/splash}
ln -s $out/share/{lomiri-calculator-app,icons/hicolor/scalable/apps}/lomiri-calculator-app.svg
ln -s $out/share/{lomiri-calculator-app/lomiri-calculator-app-splash.svg,lomiri-app-launch/splash/lomiri-calculator-app.svg}
'';
passthru = {
tests.vm = nixosTests.lomiri-calculator-app;
updateScript = gitUpdater { rev-prefix = "v"; };
};
meta = {
description = "Powerful and easy to use calculator for Ubuntu Touch, with calculations history and formula validation";
homepage = "https://gitlab.com/ubports/development/apps/lomiri-calculator-app";
changelog = "https://gitlab.com/ubports/development/apps/lomiri-calculator-app/-/blob/${
if (!isNull finalAttrs.src.tag) then finalAttrs.src.tag else finalAttrs.src.rev
}/ChangeLog";
license = lib.licenses.gpl3Only;
mainProgram = "lomiri-calculator-app";
teams = [ lib.teams.lomiri ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,73 @@
From 0658ff459aa200dfe3561646f5e73cd8715a1d0f Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Wed, 12 Jun 2024 09:24:05 +0200
Subject: [PATCH] Migrate to new QtContact sqlite backend fixes:
https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/issues/221
---
src/qml/ContactChoicePopup.qml | 34 ++++------------------------------
1 file changed, 4 insertions(+), 30 deletions(-)
diff --git a/src/qml/ContactChoicePopup.qml b/src/qml/ContactChoicePopup.qml
index f514c23b..59fe545d 100644
--- a/src/qml/ContactChoicePopup.qml
+++ b/src/qml/ContactChoicePopup.qml
@@ -20,6 +20,7 @@ import Lomiri.Components 1.3
import Lomiri.Components.Popups 1.3
import Lomiri.Components.ListItems 1.3
import Lomiri.Components.Themes.Ambiance 1.3
+import Lomiri.Contacts 0.1
import QtOrganizer 5.0
import QtContacts 5.0
@@ -38,36 +39,9 @@ Popover {
visible: contactModel.contacts.length === 0
}
- UnionFilter {
- id: filter
-
- property string searchString: ""
-
- filters: [
- DetailFilter{
- detail: ContactDetail.Name
- field: Name.FirstName
- matchFlags: Filter.MatchContains
- value: filter.searchString
- },
- DetailFilter{
- detail: ContactDetail.Name
- field: Name.LastName
- matchFlags: Filter.MatchContains
- value: filter.searchString
- },
- DetailFilter{
- detail: ContactDetail.DisplayLabel
- field: DisplayLabel.Label
- matchFlags: Filter.MatchContains
- value: filter.searchString
- }
- ]
- }
-
- ContactModel {
+ ContactListModel {
id: contactModel
- manager: "galera"
+ manager: ContactManager.manager()
filter: filter
autoUpdate: true
}
@@ -78,7 +52,7 @@ Popover {
interval: 500
repeat: false
onTriggered: {
- filter.searchString = searchBox.text
+ contactModel.filterTerm = searchBox.text
}
}
--
GitLab

View File

@@ -0,0 +1,301 @@
From fe4c377c08ecc7fa09e0a9407c17afcb63325822 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Tue, 29 Oct 2024 16:11:47 +0100
Subject: [PATCH] EDS -> mkCal Initial commit
---
debian/control | 7 ++++---
src/qml/AgendaView.qml | 2 +-
src/qml/CalendarChoicePopup.qml | 24 +++++++++++++++---------
src/qml/EventActions.qml | 23 +++++++++++++++++------
src/qml/EventDetails.qml | 2 +-
src/qml/EventListModel.qml | 21 +++++++++------------
src/qml/ExportPageCommon.qml | 2 +-
src/qml/TimeLineBaseComponent.qml | 2 +-
src/qml/calendar.qml | 2 +-
9 files changed, 50 insertions(+), 35 deletions(-)
diff --git a/debian/control b/debian/control
index 1f4fe4d5..5f8a603f 100644
--- a/debian/control
+++ b/debian/control
@@ -11,6 +11,8 @@ Build-Depends: cmake,
qml-module-qtquick2,
qml-module-qttest,
qml-module-lomiri-components,
+ qml-module-buteo-profiles,
+ qt5-default,
qtdeclarative5-dev,
qtdeclarative5-dev-tools,
Standards-Version: 4.7.0
@@ -29,10 +31,9 @@ Depends: ${misc:Depends},
qml-module-lomiri-components,
qml-module-lomiri-onlineaccounts-client,
qml-module-sso-onlineaccounts,
- qtcontact5-galera,
- qml-module-lomiri-syncmonitor | qml-module-lomiri-syncmonitor0.1,
- qtorganizer5-eds,
+ qml-module-buteo-profiles,
ubuntu-mobile-icons | suru-icon-theme,
+ qtorganizer-mkcal,
Description: Calendar application
The Calendar application devices lets you organise your life your way by
month, week or daily diary.
diff --git a/src/qml/AgendaView.qml b/src/qml/AgendaView.qml
index 08d7bd21..5996cbee 100644
--- a/src/qml/AgendaView.qml
+++ b/src/qml/AgendaView.qml
@@ -35,7 +35,7 @@ PageWithBottomEdge {
function hasEnabledCalendars() {
var enabled_calendars = eventListModel.getCollections().filter( function( item ) {
- return item.extendedMetaData( "collection-selected" );
+ return item.extendedMetaData( "visible" );
} );
return !!enabled_calendars.length;
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 39416e5c..5d29ef86 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -20,7 +20,8 @@ import QtQuick 2.4
import QtOrganizer 5.0
import Lomiri.Components 1.3
import Lomiri.Content 1.3
-import Lomiri.SyncMonitor 0.1
+//import Lomiri.SyncMonitor 0.1
+import Buteo 0.1
import Lomiri.Components.Popups 1.3
import SSO.OnlineAccounts 0.1
@@ -59,17 +60,22 @@ Page {
// TRANSLATORS: Please translate this string to 15 characters only.
// Currently ,there is no way we can increase width of action menu currently.
text: enabled ? i18n.tr("Sync") : i18n.tr("Syncing")
- onTriggered: syncMonitor.sync(["calendar"])
- enabled: (syncMonitor.state !== "syncing")
+ onTriggered: buteoSync.startSyncByCategory("calendar")
+ enabled: (!buteoSync.synchronizing)
visible: !networkError
}
flickable: flickable
}
- SyncMonitor {
- id: syncMonitor
+ ButeoSync {
+ id: buteoSync
}
+
+ // SyncMonitor {
+ // id: syncMonitor
+ // }
+
Flickable {
id: flickable
@@ -162,10 +168,10 @@ Page {
id: checkBox
objectName: "checkBox"
SlotsLayout.position: SlotsLayout.Last
- checked: modelData.extendedMetaData("collection-selected")
+ checked: modelData.extendedMetaData("visible")
enabled: !calendarChoicePage.isInEditMode
onCheckedChanged: {
- if (!checkBox.checked && modelData.extendedMetaData("collection-readonly") === false) {
+ if (!checkBox.checked && modelData.extendedMetaData("readOnly") === false) {
var collections = calendarChoicePage.model.getWritableAndSelectedCollections();
if (collections.length == 1) {
PopupUtils.open(singleWritableDialogComponent);
@@ -174,8 +180,8 @@ Page {
}
}
- if (modelData.extendedMetaData("collection-selected") !== checkBox.checked) {
- modelData.setExtendedMetaData("collection-selected",checkBox.checked)
+ if (modelData.extendedMetaData("visible") !== checkBox.checked) {
+ modelData.setExtendedMetaData("visible",checkBox.checked)
var collection = calendarChoicePage.model.collection(modelData.collectionId);
calendarChoicePage.model.saveCollection(collection);
}
diff --git a/src/qml/EventActions.qml b/src/qml/EventActions.qml
index 30617065..d583eb1a 100644
--- a/src/qml/EventActions.qml
+++ b/src/qml/EventActions.qml
@@ -18,7 +18,8 @@
import QtQuick 2.4
import Lomiri.Components 1.3
-import Lomiri.SyncMonitor 0.1
+//import Lomiri.SyncMonitor 0.1
+import Buteo.Profiles 0.1
import Lomiri.Components.Popups 1.3
import Qt.labs.settings 1.0
@@ -29,7 +30,7 @@ Item {
property alias syncCalendarAction: _syncCalendarAction
property alias settingsAction: _settingsAction
property Settings settings
- readonly property bool syncInProgress: (syncMonitor.state !== "") && (syncMonitor.state === "syncing")
+ readonly property bool syncInProgress: buteoSync.synchronizing
onSyncInProgressChanged: {
@@ -77,11 +78,20 @@ Item {
// TRANSLATORS: Please translate this string to 15 characters only.
// Currently ,there is no way we can increase width of action menu currently.
text: i18n.tr("Sync")
- onTriggered: syncMonitor.sync(["calendar"])
- enabled: syncMonitor.enabledServices ? syncMonitor.serviceIsEnabled("calendar") : false
- visible: syncMonitor.enabledServices ? true : false
+ onTriggered: buteoSync.synchronize()
+ enabled: buteoSync.profiles.length > 0 ? true: false
+ visible: buteoSync.serviceAvailable ? true : false
}
+ SyncManager {
+ id: buteoSync
+ filterHidden: true
+ filterBy.key: "category"
+ filterBy.value: "calendar"
+ }
+
+
+/*
SyncMonitor {
id: syncMonitor
onSyncError: {
@@ -94,6 +104,7 @@ Item {
}
}
}
+ */
Action{
id: _showCalendarAction
@@ -125,7 +136,7 @@ Item {
target: _syncCalendarAction
iconSource: "../assets/sync-cancel.svg"
text: i18n.tr("Syncing")
- onTriggered: syncMonitor.cancel(["calendar"])
+ //onTriggered: syncMonitor.cancel(["calendar"])
}
},
State {
diff --git a/src/qml/EventDetails.qml b/src/qml/EventDetails.qml
index e8b5dcfb..63377c5d 100644
--- a/src/qml/EventDetails.qml
+++ b/src/qml/EventDetails.qml
@@ -49,7 +49,7 @@ Page {
text: i18n.tr("Edit");
objectName: "edit"
iconName: "edit";
- enabled: !collection.extendedMetaData("collection-readonly")
+ enabled: !collection.extendedMetaData("readOnly")
shortcut: "Ctrl+E"
onTriggered: {
if( event.itemType === Type.EventOccurrence ) {
diff --git a/src/qml/EventListModel.qml b/src/qml/EventListModel.qml
index 7e3b28af..8e9c958a 100644
--- a/src/qml/EventListModel.qml
+++ b/src/qml/EventListModel.qml
@@ -22,7 +22,7 @@ import "dateExt.js" as DateExt
OrganizerModel {
id: eventModel
- manager:"eds"
+ manager:"mkcal"
readonly property bool appIsActive: (Qt.application.state === Qt.ApplicationActive)
property bool active: false
@@ -84,7 +84,7 @@ OrganizerModel {
if (!collection)
return false
- return collection.extendedMetaData("collection-readonly") === true ||
+ return collection.extendedMetaData("readOnly") === true ||
collection.extendedMetaData("collection-sync-readonly") === true
}
@@ -93,14 +93,12 @@ OrganizerModel {
var collections = eventModel.collections;
for(var i = 0 ; i < collections.length ; ++i) {
var cal = collections[i];
- if( cal.extendedMetaData("collection-type") === "Calendar" ) {
- // Handle the special QtContactBirthdays calendar from lomiri-abook2cal-syncd
- if (cal.name === "QtContactBirthdays") {
- cal.name = i18n.tr("Birthdays & Anniversaries")
- }
-
- cals.push(cal);
+ // Handle the special QtContactBirthdays calendar from lomiri-abook2cal-syncd
+ if (cal.name === "QtContactBirthdays") {
+ cal.name = i18n.tr("Birthdays & Anniversaries")
}
+
+ cals.push(cal);
}
cals.sort(eventModel._sortCollections)
return cals;
@@ -111,8 +109,7 @@ OrganizerModel {
var collections = eventModel.collections;
for(var i = 0 ; i < collections.length ; ++i) {
var cal = collections[i];
- if( cal.extendedMetaData("collection-type") === "Calendar" &&
- cal.extendedMetaData("collection-selected") === true &&
+ if( cal.extendedMetaData("visible") === true &&
!collectionIsReadOnly(cal)) {
cals.push(cal);
}
@@ -128,7 +125,7 @@ OrganizerModel {
var firstSelectedCollection = null
for(var i = 0 ; i < cals.length ; ++i) {
var cal = cals[i]
- if (cal.extendedMetaData("collection-selected") === true) {
+ if (cal.extendedMetaData("visible") === true) {
if (!firstSelectedCollection) {
firstSelectedCollection = cal
}
diff --git a/src/qml/ExportPageCommon.qml b/src/qml/ExportPageCommon.qml
index 0a1f2f34..88310560 100644
--- a/src/qml/ExportPageCommon.qml
+++ b/src/qml/ExportPageCommon.qml
@@ -151,7 +151,7 @@ Page {
OrganizerModel{
id: organizerExporter
- manager:"eds"
+ manager:"mkcal"
autoUpdate: true
onItemCountChanged: {
diff --git a/src/qml/TimeLineBaseComponent.qml b/src/qml/TimeLineBaseComponent.qml
index 519300df..7e8a364b 100644
--- a/src/qml/TimeLineBaseComponent.qml
+++ b/src/qml/TimeLineBaseComponent.qml
@@ -193,7 +193,7 @@ Item {
id: mainModel
objectName: "timeLineBaseEventListModel:" + root.objectName
- manager:"eds"
+ manager:"mkcal"
startPeriod: startDay.midnight().utcEarliest();
endPeriod: type == ViewType.ViewTypeWeek ? startDay.addDays(6).endOfDay().utcLatest(): startDay.endOfDay().utcLatest()
diff --git a/src/qml/calendar.qml b/src/qml/calendar.qml
index 6238a0f5..2b6e6cfd 100644
--- a/src/qml/calendar.qml
+++ b/src/qml/calendar.qml
@@ -251,7 +251,7 @@ MainView {
var collections = eventModel.getCollections();
for(var i=0; i < collections.length ; ++i) {
var collection = collections[i]
- if(collection.extendedMetaData("collection-selected") === true) {
+ if(collection.extendedMetaData("visible") === true) {
collectionIds.push(collection.collectionId);
}
}
--
GitLab

View File

@@ -0,0 +1,48 @@
From 95218b057d1c9ed571e1abc41f0377c6a087ca37 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Mon, 4 Nov 2024 16:52:56 +0100
Subject: [PATCH] fix, allDay events not shown. mkCal store allDay event with
the same dateStart and dateEnd. Make it work with that setup
---
src/qml/AllDayEventComponent.qml | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/src/qml/AllDayEventComponent.qml b/src/qml/AllDayEventComponent.qml
index ba5a67aa..d3364c37 100644
--- a/src/qml/AllDayEventComponent.qml
+++ b/src/qml/AllDayEventComponent.qml
@@ -37,20 +37,22 @@ Row {
height: units.gu(5)
function getAllDayEvents(startDate, endDate) {
- var map = {};
- var items = model.itemsByTimePeriod(startDate,endDate);
- for(var i = 0 ; i < items.length ; ++i) {
- var event = items[(i)];
+ let map = {};
+ const events = model.itemsByTimePeriod(startDate,endDate);
+ events.forEach( event => {
if( event && event.allDay ) {
- for(var d = event.startDateTime; d < event.endDateTime; d = d.addDays(1)) {
- var key = Qt.formatDateTime(d, "dd-MMM-yyyy");
- if( !(key in map)) {
+ let currentDate = event.startDateTime
+ while (currentDate <= event.endDateTime) {
+ const key = Qt.formatDateTime(currentDate, "dd-MMM-yyyy");
+ if (!map[key]) {
map[key] = [];
}
map[key].push(event);
+
+ currentDate = currentDate.addDays(1);
}
}
- }
+ })
return map;
}
--
GitLab

View File

@@ -0,0 +1,97 @@
From 06750cc6f042cbcf4fa5e2fdd5a6eb29aff0d1b3 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Mon, 4 Nov 2024 16:54:13 +0100
Subject: [PATCH] Use ButeoSync profiles for sync management
---
src/qml/CalendarChoicePopup.qml | 20 +++++++++-----------
src/qml/EventActions.qml | 7 ++++---
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 5d29ef86..8fa1e4b2 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -20,8 +20,7 @@ import QtQuick 2.4
import QtOrganizer 5.0
import Lomiri.Components 1.3
import Lomiri.Content 1.3
-//import Lomiri.SyncMonitor 0.1
-import Buteo 0.1
+import Buteo.Profiles 0.1
import Lomiri.Components.Popups 1.3
import SSO.OnlineAccounts 0.1
@@ -31,6 +30,7 @@ Page {
objectName: "calendarchoicepopup"
property var model
+ readonly property var canSynchronize: !networkError && buteoSync.serviceAvailable && buteoSync.profiles.length > 0 && !buteoSync.synchronizing
signal collectionUpdated()
function accountFromId(accountId)
@@ -60,22 +60,20 @@ Page {
// TRANSLATORS: Please translate this string to 15 characters only.
// Currently ,there is no way we can increase width of action menu currently.
text: enabled ? i18n.tr("Sync") : i18n.tr("Syncing")
- onTriggered: buteoSync.startSyncByCategory("calendar")
- enabled: (!buteoSync.synchronizing)
- visible: !networkError
+ onTriggered: buteoSync.synchronize()
+ enabled: calendarChoicePage.canSynchronize
+ visible: buteoSync.serviceAvailable
}
flickable: flickable
}
- ButeoSync {
+ SyncManager {
id: buteoSync
+ filterHidden: true
+ filterBy.key: "category"
+ filterBy.value: "calendar"
}
-
- // SyncMonitor {
- // id: syncMonitor
- // }
-
Flickable {
id: flickable
diff --git a/src/qml/EventActions.qml b/src/qml/EventActions.qml
index d583eb1a..d46e8e25 100644
--- a/src/qml/EventActions.qml
+++ b/src/qml/EventActions.qml
@@ -18,7 +18,6 @@
import QtQuick 2.4
import Lomiri.Components 1.3
-//import Lomiri.SyncMonitor 0.1
import Buteo.Profiles 0.1
import Lomiri.Components.Popups 1.3
import Qt.labs.settings 1.0
@@ -31,6 +30,8 @@ Item {
property alias settingsAction: _settingsAction
property Settings settings
readonly property bool syncInProgress: buteoSync.synchronizing
+ readonly property var canSynchronize: !networkError && buteoSync.serviceAvailable && buteoSync.profiles.length > 0 && !buteoSync.synchronizing
+
onSyncInProgressChanged: {
@@ -79,8 +80,8 @@ Item {
// Currently ,there is no way we can increase width of action menu currently.
text: i18n.tr("Sync")
onTriggered: buteoSync.synchronize()
- enabled: buteoSync.profiles.length > 0 ? true: false
- visible: buteoSync.serviceAvailable ? true : false
+ enabled: actionPool.canSynchronize
+ visible: buteoSync.serviceAvailable
}
SyncManager {
--
GitLab

View File

@@ -0,0 +1,283 @@
From 7c9419ecb95c7973f7db7dbab8f988d4b40a1c00 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Tue, 26 Nov 2024 16:51:59 +0100
Subject: [PATCH] Add EDS to mkCal calendar migration
---
CMakeLists.txt | 5 +
clickable.yaml | 2 +-
debian/control | 3 +-
.../lomiri-calendar-app-migrate-eds2mkcal.sh | 13 ++
debian/lomiri-calendar-app.install | 3 +-
debian/lomiri-calendar-app.migrations | 1 +
debian/rules | 4 +-
ics_importer/CMakeLists.txt | 20 +++
ics_importer/ics_importer.cpp | 122 ++++++++++++++++++
9 files changed, 168 insertions(+), 5 deletions(-)
create mode 100644 debian/lomiri-calendar-app-migrate-eds2mkcal.sh
create mode 100644 ics_importer/CMakeLists.txt
create mode 100644 ics_importer/ics_importer.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 547f6550..c49d718b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,7 @@ find_package(Qt5Quick REQUIRED)
option(INSTALL_TESTS "Install the tests on make install" on)
option(CLICK_MODE "Installs to a contained location" on)
+option(ENABLE_EDS_IMPORTER "Build eds2mkcal importer tool" off)
# Standard install paths
include(GNUInstallDirs)
@@ -96,3 +97,7 @@ install(FILES ${APPLICATION_FILE} DESTINATION ${APPLICATION_DIR})
add_subdirectory(src)
add_subdirectory(po)
add_subdirectory(tests)
+if(ENABLE_EDS_IMPORTER)
+ add_subdirectory(ics_importer)
+endif(ENABLE_EDS_IMPORTER)
+
diff --git a/clickable.yaml b/clickable.yaml
index 486f4bf6..c1eaf346 100644
--- a/clickable.yaml
+++ b/clickable.yaml
@@ -4,5 +4,5 @@ framework: ubuntu-sdk-20.04
build_args: "-DCLICK_MODE=ON"
kill: 'lomiri-calendar-app'
dependencies_host:
- - qtorganizer5-eds
+ - qtorganizer5-mkcal
ignore_review_errors: true
diff --git a/debian/control b/debian/control
index 5f8a603f..9bce332f 100644
--- a/debian/control
+++ b/debian/control
@@ -12,9 +12,10 @@ Build-Depends: cmake,
qml-module-qttest,
qml-module-lomiri-components,
qml-module-buteo-profiles,
- qt5-default,
+ qtbase5-dev,
qtdeclarative5-dev,
qtdeclarative5-dev-tools,
+ qtpim5-dev
Standards-Version: 4.7.0
Homepage: https://gitlab.com/ubports/development/apps/lomiri-calendar-app
Vcs-Git: https://gitlab.com/ubports/development/apps/lomiri-calendar-app.git
diff --git a/debian/lomiri-calendar-app-migrate-eds2mkcal.sh b/debian/lomiri-calendar-app-migrate-eds2mkcal.sh
new file mode 100644
index 00000000..339e0fff
--- /dev/null
+++ b/debian/lomiri-calendar-app-migrate-eds2mkcal.sh
@@ -0,0 +1,13 @@
+#! /bin/sh
+
+set -e
+
+# Exit if we already migrated
+[ -f "$HOME/.local/share/evolution/calendar/system/migrated_to_mkcal" ] && exit 0
+
+# Exit if there is no ICS file
+[ -f "$HOME/.local/share/evolution/calendar/system/calendar.ics" ] || exit 0
+
+/usr/bin/lomiri-calendar-eds2mkcal-importer "$HOME/.local/share/evolution/calendar/system/calendar.ics"
+
+echo $? > "$HOME/.local/share/evolution/calendar/system/migrated_to_mkcal"
\ No newline at end of file
diff --git a/debian/lomiri-calendar-app.install b/debian/lomiri-calendar-app.install
index 315c7b75..151885bf 100644
--- a/debian/lomiri-calendar-app.install
+++ b/debian/lomiri-calendar-app.install
@@ -1,3 +1,4 @@
-usr/bin/*
+usr/bin/lomiri-calendar-app
+usr/bin/lomiri-calendar-eds2mkcal-importer
usr/lib/lomiri-push-service/*
usr/share/*
diff --git a/debian/lomiri-calendar-app.migrations b/debian/lomiri-calendar-app.migrations
index c232792d..338d4454 100644
--- a/debian/lomiri-calendar-app.migrations
+++ b/debian/lomiri-calendar-app.migrations
@@ -1 +1,2 @@
debian/lomiri-calendar-app-name-change.sh
+debian/lomiri-calendar-app-migrate-eds2mkcal.sh
diff --git a/debian/rules b/debian/rules
index ca2b30fc..cce09bd4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -2,7 +2,7 @@
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
+export DH_VERBOSE=1
PROJECT_DH_OPTIONS =
ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
@@ -16,7 +16,7 @@ override_dh_missing:
dh_missing --fail-missing
override_dh_auto_configure:
- dh_auto_configure -- -DCLICK_MODE=OFF
+ dh_auto_configure -- -DCLICK_MODE=OFF -DENABLE_EDS_IMPORTER=ON
override_dh_auto_test:
# unit tests are failing, may be out of sync with the codebase since
diff --git a/ics_importer/CMakeLists.txt b/ics_importer/CMakeLists.txt
new file mode 100644
index 00000000..ee52c860
--- /dev/null
+++ b/ics_importer/CMakeLists.txt
@@ -0,0 +1,20 @@
+project(ICSImporter VERSION 1.0 LANGUAGES CXX)
+
+cmake_minimum_required(VERSION 3.14)
+
+find_package(Qt5 REQUIRED COMPONENTS Core Organizer Versit VersitOrganizer)
+
+add_executable(lomiri-calendar-eds2mkcal-importer ics_importer.cpp)
+
+target_link_libraries(lomiri-calendar-eds2mkcal-importer
+ Qt5::Core
+ Qt5::Organizer
+ Qt5::Versit
+ Qt5::VersitOrganizer
+)
+
+install(TARGETS lomiri-calendar-eds2mkcal-importer
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
+
diff --git a/ics_importer/ics_importer.cpp b/ics_importer/ics_importer.cpp
new file mode 100644
index 00000000..3d409d47
--- /dev/null
+++ b/ics_importer/ics_importer.cpp
@@ -0,0 +1,122 @@
+#include <QCoreApplication>
+#include <QDebug>
+#include <QFile>
+#include <QTextStream>
+#include <QtOrganizer/QOrganizerManager>
+#include <QtOrganizer/QOrganizerEvent>
+#include <QtOrganizer/QOrganizerItem>
+#include <QtOrganizer/QOrganizerItemFetchRequest>
+#include <QtVersit/QVersitReader>
+#include <QVersitOrganizerImporter>
+
+using namespace QtOrganizer;
+using namespace QtVersit;
+
+bool importICS(const QString& filePath, const QString& collectionId) {
+ QFile file(filePath);
+
+ if (!file.exists()) {
+ qWarning() << "File does not exist:" << filePath;
+ return false;
+ }
+
+ if (!file.open(QIODevice::ReadOnly)) {
+ qWarning() << "Failed to open file:" << filePath;
+ return false;
+ }
+
+ // Read the .ics file content
+ QVersitReader reader;
+ reader.setDevice(&file);
+ bool result = reader.startReading();
+ reader.waitForFinished();
+ if(!result)
+ {
+ qCritical()<<"ics reading failed";
+ return false;
+ }
+
+ QList<QVersitDocument> documents = reader.results();
+
+
+ if (!QOrganizerManager::availableManagers().contains("mkcal")) {
+ qWarning() << "Could not found mkcal backend for QtPim";
+ return false;
+ }
+ QOrganizerManager manager("mkcal");
+ QOrganizerCollectionId targetCollectionId = manager.defaultCollectionId();
+ if (!collectionId.isEmpty()) {
+
+ QList<QOrganizerCollection> collections = manager.collections();
+ bool exist = false;
+ for (const QOrganizerCollection& col: collections) {
+ if (col.id().localId() == collectionId) {
+ exist = true;
+ targetCollectionId = col.id();
+ break;
+ }
+ }
+ if (!exist) {
+ qWarning() << "Could not found collection with id" << collectionId;
+ return false;
+ }
+ }
+
+ qDebug() << "targeted collection Id:" << targetCollectionId.localId();
+
+ //Import the .ics data into QOrganizer
+ QtVersitOrganizer::QVersitOrganizerImporter importer;
+
+ for (const QVersitDocument& document: documents) {
+ bool ok = importer.importDocument(document);
+
+ if (!ok) {
+ qWarning() << "Failed to import document" << importer.errorMap();
+ } else {
+
+ QList<QOrganizerItem> importedItems = importer.items();
+ QList<QOrganizerItem> batch;
+ const int batchSize = 200;
+
+ qDebug() << "Import events into collection" << targetCollectionId;
+
+ for (int i = 0; i < importedItems.size(); ++i) {
+ QOrganizerItem& item = importedItems[i];
+ item.setCollectionId(targetCollectionId);
+ batch.append(item);
+
+ if (batch.size() == batchSize || i == importedItems.size() - 1) {
+ if (!manager.saveItems(&batch)) {
+ qWarning() << "Failed to save batch. Error:" << manager.error();
+ } else {
+ qDebug() << "Batch of" << batch.size() << "items saved successfully.";
+ }
+
+ batch.clear();
+ }
+ }
+ }
+ }
+
+ qDebug() << "ICS import completed.";
+ return true;
+}
+
+int main(int argc, char *argv[]) {
+ QCoreApplication app(argc, argv);
+
+ if (argc < 2) {
+ qCritical() << "Usage: importer <path_to_ics_file> [collection_id]";
+ return EXIT_FAILURE;
+ }
+
+ QString filePath = argv[1];
+ QString collection;
+ if (argc == 3) {
+ collection = argv[2];
+ }
+
+ bool ok = importICS(filePath, collection);
+
+ return ok ? EXIT_SUCCESS : EXIT_FAILURE;
+}
--
GitLab

View File

@@ -0,0 +1,26 @@
From 83541449e953f15c34f53dce657a94f189f597d3 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Thu, 28 Nov 2024 09:30:59 +0100
Subject: [PATCH] Support caldav service. ( Needed by buteo caldav plugin)
---
lomiri-calendar-app.application | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lomiri-calendar-app.application b/lomiri-calendar-app.application
index f0781b77..684c14b6 100644
--- a/lomiri-calendar-app.application
+++ b/lomiri-calendar-app.application
@@ -7,6 +7,9 @@
<service-type id="calendar">
<description>Syncronize your calendar</description>
</service-type>
+ <service-type id="caldav">
+ <description>Syncronize your calendar</description>
+ </service-type>
</service-types>
</application>
--
GitLab

View File

@@ -0,0 +1,48 @@
From fa1e0406e256ce66d399e1e0f0b18974b15704fe Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Wed, 11 Dec 2024 17:17:08 +0100
Subject: [PATCH] Clean up sync-monitor usage
---
src/qml/EventActions.qml | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/src/qml/EventActions.qml b/src/qml/EventActions.qml
index d46e8e25..63e50fb9 100644
--- a/src/qml/EventActions.qml
+++ b/src/qml/EventActions.qml
@@ -91,22 +91,6 @@ Item {
filterBy.value: "calendar"
}
-
-/*
- SyncMonitor {
- id: syncMonitor
- onSyncError: {
- console.log('SyncError:', account, service, error)
- if (error != "canceled") {
-
- syncErrorData.account = account
- syncErrorData.error = error
- syncErrorData.service = service
- }
- }
- }
- */
-
Action{
id: _showCalendarAction
objectName: "calendarsbutton"
@@ -170,7 +154,7 @@ Item {
Button {
text: i18n.tr("Retry sync")
onClicked: {
- syncMonitor.sync(["calendar"])
+ buteoSync.synchronize()
PopupUtils.close(dialogue)
}
}
--
GitLab

View File

@@ -0,0 +1,26 @@
From 25c7d5e53cc4576a6e6a0ba91fc5ff9f288cf626 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Wed, 11 Dec 2024 17:18:06 +0100
Subject: [PATCH] Use "account" supported metadata instead of eds metadata
"collection-account-id"
---
src/qml/CalendarChoicePopup.qml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 8fa1e4b2..02d2c717 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -155,7 +155,7 @@ Page {
Account {
id: delegateAccount
- objectHandle: calendarChoicePage.accountFromId(modelData.extendedMetaData("collection-account-id"))
+ objectHandle: calendarChoicePage.accountFromId(modelData.extendedMetaData("account"))
}
title.text: modelData.name
--
GitLab

View File

@@ -0,0 +1,32 @@
From b6369a317d8c5e3c654071382092dca18f543e8f Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Fri, 20 Dec 2024 10:28:32 +0100
Subject: [PATCH] Add support for google-calendars
---
lomiri-calendar-app.application | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/lomiri-calendar-app.application b/lomiri-calendar-app.application
index 684c14b6..37d1e0ef 100644
--- a/lomiri-calendar-app.application
+++ b/lomiri-calendar-app.application
@@ -5,10 +5,13 @@
<service-types>
<service-type id="calendar">
- <description>Syncronize your calendar</description>
+ <description>Synchronize your calendar</description>
</service-type>
<service-type id="caldav">
- <description>Syncronize your calendar</description>
+ <description>Synchronize your calendar</description>
+ </service-type>
+ <service-type id="google-calendars">
+ <description>Synchronize your calendar</description>
</service-type>
</service-types>
--
GitLab

View File

@@ -0,0 +1,24 @@
From 097472be88b64284a90361bee7493e3bb0067f18 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Tue, 7 Jan 2025 10:34:57 +0100
Subject: [PATCH] Do not retrieve disabled profiles
---
src/qml/CalendarChoicePopup.qml | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 02d2c717..42bf6462 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -69,6 +69,7 @@ Page {
SyncManager {
id: buteoSync
+ filterDisabled: true
filterHidden: true
filterBy.key: "category"
filterBy.value: "calendar"
--
GitLab

View File

@@ -0,0 +1,77 @@
From d2477ad5cfbdfff39f20c0659c4915a53019572a Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Tue, 7 Jan 2025 10:40:00 +0100
Subject: [PATCH] Auto sync on first account creation
---
src/qml/CalendarChoicePopup.qml | 17 +++++++++++++++++
src/qml/OnlineAccountsHelper.qml | 11 +++++++++++
2 files changed, 28 insertions(+)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 42bf6462..a0367138 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -67,6 +67,18 @@ Page {
flickable: flickable
}
+ Timer {
+ id: contactFirstSyncTimer
+
+ interval: 500
+ repeat: false
+ onTriggered: {
+ if (calendarChoicePage.canSynchronize) {
+ buteoSync.synchronize()
+ }
+ }
+ }
+
SyncManager {
id: buteoSync
filterDisabled: true
@@ -399,6 +411,11 @@ Page {
anchors.fill: parent
asynchronous: true
source: sourceFile
+
+ Connections {
+ target: onlineAccountHelper.item ? onlineAccountHelper.item : null
+ onFinished: contactFirstSyncTimer.restart()
+ }
}
Component {
diff --git a/src/qml/OnlineAccountsHelper.qml b/src/qml/OnlineAccountsHelper.qml
index 3a6b4b16..6d07bad7 100644
--- a/src/qml/OnlineAccountsHelper.qml
+++ b/src/qml/OnlineAccountsHelper.qml
@@ -24,6 +24,8 @@ Item {
id: root
property var dialogInstance: null
+ signal finished()
+ signal canceled()
function run(){
if (!root.dialogInstance) {
@@ -86,6 +88,15 @@ Item {
providerId: "google"
onFinished: {
PopupUtils.close(root.dialogInstance)
+ if (reply != null && reply.errorName !== undefined) {
+ if (reply.errorName === "com.lomiri.OnlineAccountsUi.UserCanceled") {
+ root.canceled()
+ } else {
+ root.finished()
+ }
+ } else {
+ root.finished()
+ }
}
}
}
--
GitLab

View File

@@ -0,0 +1,64 @@
From 9b4412fa12df1452bc987149e8497e50d58e76f0 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Fri, 10 Jan 2025 17:45:39 +0100
Subject: [PATCH] Display sync button only if profiles are enabled and set
---
src/qml/CalendarChoicePopup.qml | 5 +++--
src/qml/EventActions.qml | 6 ++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index a0367138..3964c3c1 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -30,7 +30,8 @@ Page {
objectName: "calendarchoicepopup"
property var model
- readonly property var canSynchronize: !networkError && buteoSync.serviceAvailable && buteoSync.profiles.length > 0 && !buteoSync.synchronizing
+ readonly property bool syncAvailable: buteoSync.serviceAvailable && buteoSync.profiles.length > 0
+ readonly property var canSynchronize: !networkError && syncAvailable && !buteoSync.synchronizing
signal collectionUpdated()
function accountFromId(accountId)
@@ -62,7 +63,7 @@ Page {
text: enabled ? i18n.tr("Sync") : i18n.tr("Syncing")
onTriggered: buteoSync.synchronize()
enabled: calendarChoicePage.canSynchronize
- visible: buteoSync.serviceAvailable
+ visible: calendarChoicePage.syncAvailable
}
flickable: flickable
}
diff --git a/src/qml/EventActions.qml b/src/qml/EventActions.qml
index 63e50fb9..579981d5 100644
--- a/src/qml/EventActions.qml
+++ b/src/qml/EventActions.qml
@@ -30,7 +30,8 @@ Item {
property alias settingsAction: _settingsAction
property Settings settings
readonly property bool syncInProgress: buteoSync.synchronizing
- readonly property var canSynchronize: !networkError && buteoSync.serviceAvailable && buteoSync.profiles.length > 0 && !buteoSync.synchronizing
+ readonly property bool syncAvailable: buteoSync.serviceAvailable && buteoSync.profiles.length > 0
+ readonly property var canSynchronize: !networkError && syncAvailable && !buteoSync.synchronizing
onSyncInProgressChanged: {
@@ -81,11 +82,12 @@ Item {
text: i18n.tr("Sync")
onTriggered: buteoSync.synchronize()
enabled: actionPool.canSynchronize
- visible: buteoSync.serviceAvailable
+ visible: actionPool.syncAvailable
}
SyncManager {
id: buteoSync
+ filterDisabled: true
filterHidden: true
filterBy.key: "category"
filterBy.value: "calendar"
--
GitLab

View File

@@ -0,0 +1,46 @@
From 2e8411528eddb5e3e76edef417ed96ce1ed82466 Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Mon, 27 Jan 2025 22:26:52 +0100
Subject: [PATCH] Don't show alarms Collection
---
src/qml/EventListModel.qml | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/qml/EventListModel.qml b/src/qml/EventListModel.qml
index 8e9c958a..b40d84a6 100644
--- a/src/qml/EventListModel.qml
+++ b/src/qml/EventListModel.qml
@@ -93,6 +93,11 @@ OrganizerModel {
var collections = eventModel.collections;
for(var i = 0 ; i < collections.length ; ++i) {
var cal = collections[i];
+ // don't show Alarms collection
+ if (cal.name === "Alarms") {
+ continue
+ }
+
// Handle the special QtContactBirthdays calendar from lomiri-abook2cal-syncd
if (cal.name === "QtContactBirthdays") {
cal.name = i18n.tr("Birthdays & Anniversaries")
@@ -106,15 +111,15 @@ OrganizerModel {
function getWritableAndSelectedCollections(){
var cals = [];
- var collections = eventModel.collections;
+ var collections = getCollections();
for(var i = 0 ; i < collections.length ; ++i) {
var cal = collections[i];
+
if( cal.extendedMetaData("visible") === true &&
!collectionIsReadOnly(cal)) {
cals.push(cal);
}
}
- cals.sort(eventModel._sortCollections);
return cals
}
--
GitLab

View File

@@ -0,0 +1,25 @@
From fcca1e0fa792e69b6780017db4afc34ea83ea28a Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Mon, 27 Jan 2025 22:40:56 +0100
Subject: [PATCH] eds->mkcal : Allow to open up directly an event
---
src/qml/calendar.qml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qml/calendar.qml b/src/qml/calendar.qml
index 2b6e6cfd..fef622c4 100644
--- a/src/qml/calendar.qml
+++ b/src/qml/calendar.qml
@@ -797,7 +797,7 @@ MainView {
}
} // End of else if (starttime)
else if (tabs.eventId !== "") {
- var prefix = "qtorganizer:eds::";
+ var prefix = "qtorganizer:mkcal::";
if (tabs.eventId.indexOf(prefix) < 0)
tabs.eventId = prefix + tabs.eventId;
--
GitLab

View File

@@ -0,0 +1,39 @@
From 54a2d60a5c1c4be00a9696d587d933c771ee7b4b Mon Sep 17 00:00:00 2001
From: Lionel Duboeuf <lduboeuf@ouvaton.org>
Date: Thu, 13 Feb 2025 10:58:14 +0100
Subject: [PATCH] Adjust SyncManager filters
---
src/qml/CalendarChoicePopup.qml | 2 +-
src/qml/EventActions.qml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/qml/CalendarChoicePopup.qml b/src/qml/CalendarChoicePopup.qml
index 3964c3c1..aa2dfdb4 100644
--- a/src/qml/CalendarChoicePopup.qml
+++ b/src/qml/CalendarChoicePopup.qml
@@ -83,7 +83,7 @@ Page {
SyncManager {
id: buteoSync
filterDisabled: true
- filterHidden: true
+ filterHidden: false
filterBy.key: "category"
filterBy.value: "calendar"
}
diff --git a/src/qml/EventActions.qml b/src/qml/EventActions.qml
index 579981d5..eb79da45 100644
--- a/src/qml/EventActions.qml
+++ b/src/qml/EventActions.qml
@@ -88,7 +88,7 @@ Item {
SyncManager {
id: buteoSync
filterDisabled: true
- filterHidden: true
+ filterHidden: false
filterBy.key: "category"
filterBy.value: "calendar"
}
--
GitLab

View File

@@ -0,0 +1,157 @@
{
stdenv,
lib,
fetchFromGitLab,
fetchpatch,
gitUpdater,
nixosTests,
accounts-qml-module,
buteo-syncfw,
cmake,
gettext,
lomiri-content-hub,
lomiri-indicator-network,
lomiri-ui-toolkit,
qtbase,
qtdeclarative,
qtorganizer-mkcal,
qtpim,
wrapQtAppsHook,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "lomiri-calendar-app";
version = "1.1.2";
src = fetchFromGitLab {
owner = "ubports";
repo = "development/apps/lomiri-calendar-app";
tag = "v${finalAttrs.version}";
hash = "sha256-NjpzzMuez7Abq1mIBz5N/H55GpkDrnXohPx2U6ThADY=";
};
patches = [
# Needed for MR 260 changes
(fetchpatch {
name = "0001-lomiri-calendar-app-Remove-deprecated-tabs.patch";
url = "https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/commit/12c9d3b8a5643790334e664e6b3d2c8f9b600e83.patch";
hash = "sha256-tvY5inNkNrSvfuD05RpmI3a2tFEOwNPCRgRn0RZB4DA=";
})
(fetchpatch {
name = "0002-lomiri-calendar-app-Ensure-PageStack-is-initialized.patch";
url = "https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/commit/deef3605b31c4c41f5c67311f1ff1ee02bd3b39a.patch";
hash = "sha256-FusFYFnpEEJKchInLZ5vE08SnKbwmlnUYh85cQE+JbM=";
})
# Fixes localisation for us
(fetchpatch {
name = "0101-lomiri-calendar-app-bindtextdomain.patch";
url = "https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/commit/c4c296e7f308af491558f1b7964542e4d638cb47.patch";
hash = "sha256-GLEJlr4EMY6ugP2UVvpyVIZkBnkArn0XoSB5aqGEpm4=";
})
# Switch to future contacts backend
# Remove when https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/merge_requests/239 merged & in release
./1001-lomiri-calendar-app-Migrate-to-new-QtContact-sqlite-backend.patch
# Switch to future calendar backend
# Remove when https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/merge_requests/260 merged & in release
./1101-lomiri-calendar-app-EDS-to-mkCal-initial-commit.patch
./1102-lomiri-calendar-app-fix-allDay-events-not-showing.patch
./1103-lomiri-calendar-app-Use-ButeoSync-profiles-for-syncing.patch
./1104-lomiri-calendar-app-Add-EDS-to-mkCal-calendar-migration.patch
./1105-lomiri-calendar-app-Support-caldav-service.patch
./1106-lomiri-calendar-app-Clean-up-sync-minitor-usage.patch
./1107-lomiri-calendar-app-Use-account-supported-metadata.patch
./1108-lomiri-calendar-app-Add-support-for-google-calendars.patch
./1109-lomiri-calendar-app-Do-not-retrieve-disabled-profiles.patch
./1110-lomiri-calendar-app-Auto-sync-on-first-account-creation.patch
./1111-lomiri-calendar-app-Display-sync-button-only-if-profiles-are-enabled-and-set.patch
./1112-lomiri-calendar-app-Dont-show-alarms-Collection.patch
./1113-lomiri-calendar-app-eds-to-mkcal-Allow-to-open-up-directly-an-event.patch
./1114-lomiri-calendar-app-Adjust-SyncManager-filters.patch
];
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-fail 'QT_IMPORTS_DIR "lib/''${ARCH_TRIPLET}"' 'QT_IMPORTS_DIR "${qtbase.qtQmlPrefix}"'
# Outdated paths
substituteInPlace tests/unittests/tst_{calendar_canvas,date,event_bubble,event_list_model}.qml \
--replace-fail '../../qml' '../../src/qml'
''
+ lib.optionalString (!finalAttrs.finalPackage.doCheck) ''
substituteInPlace CMakeLists.txt \
--replace-fail 'add_subdirectory(tests)' '# add_subdirectory(tests)'
'';
strictDeps = true;
nativeBuildInputs = [
cmake
gettext
wrapQtAppsHook
];
buildInputs = [
qtbase
qtdeclarative
# QML & Qt plugins
accounts-qml-module
buteo-syncfw
lomiri-content-hub
lomiri-indicator-network
lomiri-ui-toolkit
qtpim
qtorganizer-mkcal
];
cmakeFlags = [
(lib.cmakeBool "CLICK_MODE" false)
(lib.cmakeBool "INSTALL_TESTS" false)
];
# Not workiing yet
doCheck = false;
enableParallelChecking = false;
preCheck =
let
listToQtVar = suffix: lib.makeSearchPathOutput "bin" suffix;
in
''
export HOME=$TMP
export QT_PLUGIN_PATH=${
listToQtVar qtbase.qtPluginPrefix [
qtbase
qtorganizer-mkcal
]
}
export QML2_IMPORT_PATH=${
listToQtVar qtbase.qtQmlPrefix (
[
lomiri-ui-toolkit
qtpim
]
++ lomiri-ui-toolkit.propagatedBuildInputs
)
}
'';
passthru = {
tests.vm = nixosTests.lomiri-calendar-app;
updateScript = gitUpdater { rev-prefix = "v"; };
};
meta = {
description = "Default Calendar application for Ubuntu Touch devices";
homepage = "https://gitlab.com/ubports/development/apps/lomiri-calendar-app";
changelog = "https://gitlab.com/ubports/development/apps/lomiri-calendar-app/-/blob/v${finalAttrs.version}/ChangeLog";
license = with lib.licenses; [ gpl3Only ];
mainProgram = "lomiri-calendar-app";
teams = [ lib.teams.lomiri ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,86 @@
From 75a0baa32f434546c5d6cfaf8ae19d561aa8dddd Mon Sep 17 00:00:00 2001
From: OPNA2608 <opna2608@protonmail.com>
Date: Mon, 9 Jun 2025 20:00:40 +0200
Subject: [PATCH] treewide: Fix imports in tests after QML files were moved out
of top-level dir
---
CMakeLists.txt | 2 ++
tests/unittests/tst_BottomEdgeIndicators.qml | 3 +--
tests/unittests/tst_PhotogridView.qml | 3 +--
tests/unittests/tst_StopWatch.qml | 3 +--
tests/unittests/tst_ViewFinderGeometry.qml | 3 +--
5 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index faa998c..9d54fbe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -191,6 +191,8 @@ install(DIRECTORY ${QML_DIR}
DESTINATION ${CAMERA_APP_DIR}
)
+# For tests
+file(COPY ${QML_DIR} DESTINATION ${CMAKE_BINARY_DIR})
set(ASSETS_DIR assets)
diff --git a/tests/unittests/tst_BottomEdgeIndicators.qml b/tests/unittests/tst_BottomEdgeIndicators.qml
index 129b840..3dd4c0c 100644
--- a/tests/unittests/tst_BottomEdgeIndicators.qml
+++ b/tests/unittests/tst_BottomEdgeIndicators.qml
@@ -17,8 +17,7 @@
import QtQuick 2.12
import QtTest 1.0
-import "../../"
-import "../../.." //Needed for out of source build
+import "../../qml/components"
TestCase {
name: "BottomEdgeIndicators"
diff --git a/tests/unittests/tst_PhotogridView.qml b/tests/unittests/tst_PhotogridView.qml
index 4c7404a..3f14840 100644
--- a/tests/unittests/tst_PhotogridView.qml
+++ b/tests/unittests/tst_PhotogridView.qml
@@ -17,8 +17,7 @@
import QtQuick 2.12
import QtTest 1.0
-import "../../"
-import "../../.." //Needed for out of source build
+import "../../qml/components"
TestCase {
name: "PhotogridView"
diff --git a/tests/unittests/tst_StopWatch.qml b/tests/unittests/tst_StopWatch.qml
index aac9c36..5ad29f8 100644
--- a/tests/unittests/tst_StopWatch.qml
+++ b/tests/unittests/tst_StopWatch.qml
@@ -17,8 +17,7 @@
import QtQuick 2.12
import QtTest 1.0
-import "../../"
-import "../../.." //Needed for out of source build
+import "../../qml/components"
TestCase {
name: "StopWatch"
diff --git a/tests/unittests/tst_ViewFinderGeometry.qml b/tests/unittests/tst_ViewFinderGeometry.qml
index 154437f..42aaacc 100644
--- a/tests/unittests/tst_ViewFinderGeometry.qml
+++ b/tests/unittests/tst_ViewFinderGeometry.qml
@@ -17,8 +17,7 @@
import QtQuick 2.12
import QtTest 1.0
-import "../../"
-import "../../.." //Needed for out of source build
+import "../../qml/Viewfinder"
TestCase {
name: "ViewFinderGeometry"
--
2.49.0

Some files were not shown because too many files have changed in this diff Show More