diff --git a/x11-packages/cinnamon-session/0001-remove-screenever-and-nm-applet-from-glib-schemas.patch b/x11-packages/cinnamon-session/0001-remove-screenever-and-nm-applet-from-glib-schemas.patch
new file mode 100644
index 0000000000..24f1e8d95a
--- /dev/null
+++ b/x11-packages/cinnamon-session/0001-remove-screenever-and-nm-applet-from-glib-schemas.patch
@@ -0,0 +1,13 @@
+diff --git a/data/org.cinnamon.SessionManager.gschema.xml b/data/org.cinnamon.SessionManager.gschema.xml
+index cef0255..7d23e71 100644
+--- a/data/org.cinnamon.SessionManager.gschema.xml
++++ b/data/org.cinnamon.SessionManager.gschema.xml
+@@ -26,7 +26,7 @@
+ If enabled, cinnamon-session will not try to use Cinnamon's end-session dialog, instead preferring Gtk fallback.
+
+
+- ['gnome-settings-daemon', 'org.gnome.SettingsDaemon', 'gnome-fallback-mount-helper', 'gnome-screensaver', 'mate-screensaver', 'mate-keyring-daemon', 'indicator-session', 'gnome-initial-setup-copy-worker', 'gnome-initial-setup-first-login', 'gnome-welcome-tour', 'xscreensaver-autostart', 'nautilus-autostart', 'nm-applet', 'caja', 'xfce4-power-manager', 'touchegg']
++ ['gnome-settings-daemon', 'org.gnome.SettingsDaemon', 'gnome-fallback-mount-helper', 'gnome-screensaver', 'mate-screensaver', 'mate-keyring-daemon', 'indicator-session', 'gnome-initial-setup-copy-worker', 'gnome-initial-setup-first-login', 'gnome-welcome-tour', 'xscreensaver-autostart', 'nautilus-autostart', 'caja', 'xfce4-power-manager', 'touchegg']
+ Applications to block from autostarting or appearing in the app system
+
+ A list of applications or desktop names (without the .desktop extension) to prevent from
diff --git a/x11-packages/cinnamon-session/0002-remove-etc-shells-checks.patch b/x11-packages/cinnamon-session/0002-remove-etc-shells-checks.patch
new file mode 100644
index 0000000000..58d856406c
--- /dev/null
+++ b/x11-packages/cinnamon-session/0002-remove-etc-shells-checks.patch
@@ -0,0 +1,12 @@
+diff --git a/cinnamon-session/cinnamon-session.in b/cinnamon-session/cinnamon-session.in
+index d9d7cb2..1c52c90 100755
+--- a/cinnamon-session/cinnamon-session.in
++++ b/cinnamon-session/cinnamon-session.in
+@@ -3,7 +3,6 @@
+ if [ "x$XDG_SESSION_TYPE" = "xwayland" ] &&
+ [ "x$XDG_SESSION_CLASS" != "xgreeter" ] &&
+ [ -n "$SHELL" ] &&
+- grep -q "$SHELL" /etc/shells &&
+ ! (echo "$SHELL" | grep -q "false") &&
+ ! (echo "$SHELL" | grep -q "nologin"); then
+ if [ "$1" != '-l' ]; then
diff --git a/x11-packages/cinnamon-session/0003-fake-consolekit.patch b/x11-packages/cinnamon-session/0003-fake-consolekit.patch
new file mode 100644
index 0000000000..f2839ac23b
--- /dev/null
+++ b/x11-packages/cinnamon-session/0003-fake-consolekit.patch
@@ -0,0 +1,525 @@
+diff --git a/cinnamon-session/csm-consolekit.c b/cinnamon-session/csm-consolekit.c
+index c947778..0c1f519 100644
+--- a/cinnamon-session/csm-consolekit.c
++++ b/cinnamon-session/csm-consolekit.c
+@@ -28,6 +28,8 @@
+ #include
+ #include
+ #include
++
++#ifndef FAKE_CONSOLEKIT
+ #include
+ #include
+
+@@ -35,6 +37,7 @@
+ #define UPOWER_ENABLE_DEPRECATED 1
+ #include
+ #endif
++#endif
+
+ #include "csm-system.h"
+ #include "csm-consolekit.h"
+@@ -49,6 +52,7 @@
+
+ struct _CsmConsolekitPrivate
+ {
++#ifndef FAKE_CONSOLEKIT
+ GDBusProxy *ck_proxy;
+ GDBusProxy *ck_session_proxy;
+ #ifdef HAVE_OLD_UPOWER
+@@ -56,14 +60,19 @@ struct _CsmConsolekitPrivate
+ #endif
+ char *session_id;
+ gchar *session_path;
++#endif
+
+ GSList *inhibitors;
++#ifndef FAKE_CONSOLEKIT
+ gint inhibit_fd;
++#endif
+
+ gboolean is_active;
+
++#ifndef FAKE_CONSOLEKIT
+ gint delay_inhibit_fd;
+ gboolean prepare_for_shutdown_expected;
++#endif
+ };
+
+ enum {
+@@ -77,6 +86,7 @@ G_DEFINE_TYPE_WITH_CODE (CsmConsolekit, csm_consolekit, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (CSM_TYPE_SYSTEM,
+ csm_consolekit_system_init))
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ drop_system_inhibitor (CsmConsolekit *manager)
+ {
+@@ -96,25 +106,31 @@ drop_delay_inhibitor (CsmConsolekit *manager)
+ manager->priv->delay_inhibit_fd = -1;
+ }
+ }
++#endif
+
+ static void
+ csm_consolekit_finalize (GObject *object)
+ {
+ CsmConsolekit *consolekit = CSM_CONSOLEKIT (object);
+
++#ifndef FAKE_CONSOLEKIT
+ g_clear_object (&consolekit->priv->ck_proxy);
+ g_clear_object (&consolekit->priv->ck_session_proxy);
+ free (consolekit->priv->session_id);
+ g_free (consolekit->priv->session_path);
++#endif
+
+ if (consolekit->priv->inhibitors != NULL) {
+ g_slist_free_full (consolekit->priv->inhibitors, g_free);
+ }
++
++#ifndef FAKE_CONSOLEKIT
+ drop_system_inhibitor (consolekit);
+ drop_delay_inhibitor (consolekit);
+
+ #ifdef HAVE_OLD_UPOWER
+- g_clear_object (&manager->priv->up_client);
++ g_clear_object (&consolekit->priv->up_client);
++#endif
+ #endif
+
+ G_OBJECT_CLASS (csm_consolekit_parent_class)->finalize (object);
+@@ -171,6 +187,7 @@ csm_consolekit_class_init (CsmConsolekitClass *manager_class)
+ g_type_class_add_private (manager_class, sizeof (CsmConsolekitPrivate));
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void ck_session_proxy_signal_cb (GDBusProxy *proxy,
+ const gchar *sender_name,
+ const gchar *signal_name,
+@@ -214,18 +231,22 @@ ck_pid_get_session (CsmConsolekit *manager,
+ g_variant_get (res, "(o)", session_id);
+ g_variant_unref (res);
+ }
++#endif
+
+ static void
+ csm_consolekit_init (CsmConsolekit *manager)
+ {
++#ifndef FAKE_CONSOLEKIT
+ GError *error = NULL;
+ GDBusConnection *bus;
+ GVariant *res;
++#endif
+
+ manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
+ CSM_TYPE_CONSOLEKIT,
+ CsmConsolekitPrivate);
+
++#ifndef FAKE_CONSOLEKIT
+ manager->priv->inhibit_fd = -1;
+ manager->priv->delay_inhibit_fd = -1;
+
+@@ -286,6 +307,12 @@ csm_consolekit_init (CsmConsolekit *manager)
+ #endif
+
+ g_object_unref (bus);
++#else
++ g_debug ("CsmConsolekit: Termux dummy implementation initialized");
++
++ /* In Termux, we're always "active" since there's no session switching */
++ manager->priv->is_active = TRUE;
++#endif
+ }
+
+ static void
+@@ -332,6 +359,7 @@ emit_stop_complete (CsmConsolekit *manager,
+ }
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ restart_done (GObject *source,
+ GAsyncResult *result,
+@@ -353,12 +381,14 @@ restart_done (GObject *source,
+ g_variant_unref (res);
+ }
+ }
++#endif
+
+ static void
+ csm_consolekit_attempt_restart (CsmSystem *system)
+ {
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+
++#ifndef FAKE_CONSOLEKIT
+ /* Use Restart instead of Reboot because it will work on
+ * both CK and CK2 */
+ g_dbus_proxy_call (manager->priv->ck_proxy,
+@@ -369,8 +399,21 @@ csm_consolekit_attempt_restart (CsmSystem *system)
+ NULL,
+ restart_done,
+ manager);
++#else
++ GError *error;
++
++ g_debug ("CsmConsolekit: Termux restart attempt - not supported");
++
++ /* In Termux, we can't actually restart the system, so we just signal completion */
++ error = g_error_new_literal (CSM_SYSTEM_ERROR,
++ CSM_SYSTEM_ERROR_RESTARTING,
++ "System restart not supported in Termux");
++ emit_restart_complete (manager, error);
++ g_error_free (error);
++#endif
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ stop_done (GObject *source,
+ GAsyncResult *result,
+@@ -392,13 +435,15 @@ stop_done (GObject *source,
+ g_variant_unref (res);
+ }
+ }
++#endif
+
+ static void
+ csm_consolekit_attempt_stop (CsmSystem *system)
+ {
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+
+- /* Use Stop insetad of PowerOff because it will work with
++#ifndef FAKE_CONSOLEKIT
++ /* Use Stop instead of PowerOff because it will work with
+ * Ck and CK2. */
+ g_dbus_proxy_call (manager->priv->ck_proxy,
+ "Stop",
+@@ -408,14 +453,27 @@ csm_consolekit_attempt_stop (CsmSystem *system)
+ NULL,
+ stop_done,
+ manager);
++#else
++ GError *error;
++
++ g_debug ("CsmConsolekit: Termux stop attempt - not supported");
++
++ /* In Termux, we can't actually stop the system, so we just signal completion */
++ error = g_error_new_literal (CSM_SYSTEM_ERROR,
++ CSM_SYSTEM_ERROR_STOPPING,
++ "System shutdown not supported in Termux");
++ emit_stop_complete (manager, error);
++ g_error_free (error);
++#endif
+ }
+
+ static void
+ csm_consolekit_set_session_idle (CsmSystem *system,
+- gboolean is_idle)
++ gboolean is_idle)
+ {
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+
++#ifndef FAKE_CONSOLEKIT
+ g_debug ("Updating consolekit idle status: %d", is_idle);
+ g_dbus_proxy_call_sync (manager->priv->ck_session_proxy,
+ "SetIdleHint",
+@@ -423,8 +481,13 @@ csm_consolekit_set_session_idle (CsmSystem *system,
+ 0,
+ G_MAXINT,
+ NULL, NULL);
++#else
++ g_debug ("CsmConsolekit: Termux session idle status: %d (no-op)", is_idle);
++ /* In Termux, session idle state doesn't need to be tracked */
++#endif
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ ck_session_get_seat (CsmConsolekit *manager,
+ gchar **seat)
+@@ -482,10 +545,12 @@ ck_seat_can_multi_session (CsmConsolekit *manager,
+
+ return can_activate == TRUE ? 1 : 0;
+ }
++#endif
+
+ static gboolean
+ csm_consolekit_can_switch_user (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+ gchar *seat;
+ gint ret;
+@@ -495,11 +560,17 @@ csm_consolekit_can_switch_user (CsmSystem *system)
+ free (seat);
+
+ return ret > 0;
++#else
++ g_debug ("CsmConsolekit: Termux can_switch_user - FALSE");
++ /* User switching is not relevant in Termux */
++ return FALSE;
++#endif
+ }
+
+ static gboolean
+ csm_consolekit_can_restart (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+ GVariant *res;
+ gboolean can_restart;
+@@ -521,11 +592,17 @@ csm_consolekit_can_restart (CsmSystem *system)
+ g_variant_unref (res);
+
+ return can_restart;
++#else
++ g_debug ("CsmConsolekit: Termux can_restart - FALSE");
++ /* System restart is not supported in Termux */
++ return FALSE;
++#endif
+ }
+
+ static gboolean
+ csm_consolekit_can_stop (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+ GVariant *res;
+ gboolean can_stop;
+@@ -547,8 +624,14 @@ csm_consolekit_can_stop (CsmSystem *system)
+ g_variant_unref (res);
+
+ return can_stop;
++#else
++ g_debug ("CsmConsolekit: Termux can_stop - FALSE");
++ /* System shutdown is not supported in Termux */
++ return FALSE;
++#endif
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ /* returns -1 on failure, 0 on success */
+ static gint
+ ck_session_get_class (CsmConsolekit *manager,
+@@ -574,10 +657,12 @@ ck_session_get_class (CsmConsolekit *manager,
+
+ return 0;
+ }
++#endif
+
+ static gboolean
+ csm_consolekit_is_login_session (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+ int res;
+ gboolean ret;
+@@ -598,11 +683,17 @@ csm_consolekit_is_login_session (CsmSystem *system)
+ g_free (session_class);
+
+ return ret;
++#else
++ g_debug ("CsmConsolekit: Termux is_login_session - FALSE");
++ /* We're never in a login session in Termux */
++ return FALSE;
++#endif
+ }
+
+ static gboolean
+ csm_consolekit_can_suspend (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ #ifdef HAVE_OLD_UPOWER
+ CsmConsolekit *consolekit = CSM_CONSOLEKIT (system);
+ return up_client_get_can_suspend (consolekit->priv->up_client);
+@@ -635,11 +726,17 @@ csm_consolekit_can_suspend (CsmSystem *system)
+
+ return can_suspend;
+ #endif
++#else
++ g_debug ("CsmConsolekit: Termux can_suspend - FALSE");
++ /* Suspend is not supported in Termux */
++ return FALSE;
++#endif
+ }
+
+ static gboolean
+ csm_consolekit_can_hibernate (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ #ifdef HAVE_OLD_UPOWER
+ CsmConsolekit *consolekit = CSM_CONSOLEKIT (system);
+ return up_client_get_can_hibernate (consolekit->priv->up_client);
+@@ -672,8 +769,14 @@ csm_consolekit_can_hibernate (CsmSystem *system)
+
+ return can_hibernate;
+ #endif
++#else
++ g_debug ("CsmConsolekit: Termux can_hibernate - FALSE");
++ /* Hibernate is not supported in Termux */
++ return FALSE;
++#endif
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ suspend_done (GObject *source,
+ GAsyncResult *result,
+@@ -711,10 +814,12 @@ hibernate_done (GObject *source,
+ g_variant_unref (res);
+ }
+ }
++#endif
+
+ static void
+ csm_consolekit_suspend (CsmSystem *system, gboolean suspend_then_hibernate)
+ {
++#ifndef FAKE_CONSOLEKIT
+ #ifdef HAVE_OLD_UPOWER
+ CsmConsolekit *consolekit = CSM_CONSOLEKIT (system);
+ GError *error = NULL;
+@@ -728,11 +833,11 @@ csm_consolekit_suspend (CsmSystem *system, gboolean suspend_then_hibernate)
+ #else
+ CsmConsolekit *manager = CSM_CONSOLEKIT (system);
+
+- gchar *method = "Suspend";
+- if (suspend_then_hibernate && csm_consolekit_can_suspend (system) && csm_consolekit_can_hibernate (system)) {
+- method = "SuspendThenHibernate";
+- }
+- g_debug ("Suspend using: %s", method);
++ gchar *method = "Suspend";
++ if (suspend_then_hibernate && csm_consolekit_can_suspend (system) && csm_consolekit_can_hibernate (system)) {
++ method = "SuspendThenHibernate";
++ }
++ g_debug ("Suspend using: %s", method);
+
+ g_dbus_proxy_call (manager->priv->ck_proxy,
+ method,
+@@ -743,11 +848,16 @@ csm_consolekit_suspend (CsmSystem *system, gboolean suspend_then_hibernate)
+ suspend_done,
+ manager);
+ #endif
++#else
++ g_debug ("CsmConsolekit: Termux suspend attempt - not supported");
++ g_warning ("Suspend not supported in Termux environment");
++#endif
+ }
+
+ static void
+ csm_consolekit_hibernate (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ #ifdef HAVE_OLD_UPOWER
+ CsmConsolekit *consolekit = CSM_CONSOLEKIT (system);
+ GError *error = NULL;
+@@ -770,8 +880,13 @@ csm_consolekit_hibernate (CsmSystem *system)
+ hibernate_done,
+ manager);
+ #endif
++#else
++ g_debug ("CsmConsolekit: Termux hibernate attempt - not supported");
++ g_warning ("Hibernate not supported in Termux environment");
++#endif
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ inhibit_done (GObject *source,
+ GAsyncResult *result,
+@@ -805,6 +920,7 @@ inhibit_done (GObject *source,
+ drop_system_inhibitor (manager);
+ }
+ }
++#endif
+
+ static void
+ csm_consolekit_add_inhibitor (CsmSystem *system,
+@@ -816,6 +932,7 @@ csm_consolekit_add_inhibitor (CsmSystem *system,
+ if ((flag & CSM_INHIBITOR_FLAG_SUSPEND) == 0)
+ return;
+
++#ifndef FAKE_CONSOLEKIT
+ if (manager->priv->inhibitors == NULL) {
+ g_debug ("Adding system inhibitor");
+ g_dbus_proxy_call_with_unix_fd_list (manager->priv->ck_proxy,
+@@ -832,6 +949,10 @@ csm_consolekit_add_inhibitor (CsmSystem *system,
+ inhibit_done,
+ manager);
+ }
++#else
++ g_debug ("CsmConsolekit: Termux adding inhibitor '%s' (dummy)", id);
++ /* We still track inhibitors for interface compliance, but they don't do anything */
++#endif
+ manager->priv->inhibitors = g_slist_prepend (manager->priv->inhibitors, g_strdup (id));
+ }
+
+@@ -848,15 +969,26 @@ csm_consolekit_remove_inhibitor (CsmSystem *system,
+
+ g_free (l->data);
+ manager->priv->inhibitors = g_slist_delete_link (manager->priv->inhibitors, l);
++
++#ifndef FAKE_CONSOLEKIT
+ if (manager->priv->inhibitors == NULL) {
+ drop_system_inhibitor (manager);
+ }
++#else
++ g_debug ("CsmConsolekit: Termux removing inhibitor '%s' (dummy)", id);
++#endif
+ }
+
+ static gboolean
+ csm_consolekit_is_last_session_for_user (CsmSystem *system)
+ {
++#ifndef FAKE_CONSOLEKIT
+ return FALSE;
++#else
++ g_debug ("CsmConsolekit: Termux is_last_session_for_user - TRUE");
++ /* In Termux, we only have one session per user */
++ return TRUE;
++#endif
+ }
+
+ static void
+@@ -883,11 +1015,15 @@ csm_consolekit_new (void)
+ {
+ CsmConsolekit *manager;
+
++#ifdef FAKE_CONSOLEKIT
++ g_debug ("CsmConsolekit: Creating new Termux dummy instance");
++#endif
+ manager = g_object_new (CSM_TYPE_CONSOLEKIT, NULL);
+
+ return manager;
+ }
+
++#ifndef FAKE_CONSOLEKIT
+ static void
+ ck_proxy_signal_cb (GDBusProxy *proxy,
+ const gchar *sender_name,
+@@ -942,3 +1078,4 @@ ck_session_proxy_signal_cb (GDBusProxy *proxy,
+ g_object_notify (G_OBJECT (consolekit), "active");
+ }
+ }
++#endif
+diff --git a/meson.build b/meson.build
+index 70e5d37..25754da 100644
+--- a/meson.build
++++ b/meson.build
+@@ -87,6 +87,8 @@ else
+ endif
+ conf.set10('HAVE_XTRANS', xtrans.found())
+
++conf.set10('FAKE_CONSOLEKIT', get_option('fake-consolekit'))
++
+ # Check whether IPv6 is enabled on the system...
+ have_ipv6 = false
+ ipv6_libs = []
+diff --git a/meson_options.txt b/meson_options.txt
+index 4066751..bf1815e 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -1,3 +1,4 @@
+ option('frequent_warnings', type: 'boolean', value: false)
+ option('ipv6', type: 'boolean', value: true)
+ option('xtrans', type: 'boolean', value: true)
++option('fake-consolekit', type: 'boolean', value: false)
diff --git a/x11-packages/cinnamon-session/build.sh b/x11-packages/cinnamon-session/build.sh
new file mode 100644
index 0000000000..dc896d5688
--- /dev/null
+++ b/x11-packages/cinnamon-session/build.sh
@@ -0,0 +1,31 @@
+TERMUX_PKG_HOMEPAGE=https://github.com/linuxmint/cinnamon-session
+TERMUX_PKG_DESCRIPTION="The Cinnamon session manager"
+TERMUX_PKG_LICENSE="GPL-2.0"
+TERMUX_PKG_MAINTAINER="@termux"
+TERMUX_PKG_VERSION="6.4.0"
+TERMUX_PKG_SRCURL="https://github.com/linuxmint/cinnamon-session/archive/refs/tags/${TERMUX_PKG_VERSION}.tar.gz"
+TERMUX_PKG_SHA256=464075d920df360b5ad94f72395a09b5fbf8b14f0190406ec76055a17659e243
+TERMUX_PKG_AUTO_UPDATE=true
+TERMUX_PKG_DEPENDS="glib, libcanberra, gtk3, pango, libx11, libsm, libice, libxext, libxau, libxcomposite, cinnamon-desktop, opengl, dbus-python, keybinder, xapp"
+TERMUX_PKG_BUILD_DEPENDS="g-ir-scanner, glib-cross"
+TERMUX_PKG_VERSIONED_GIR=false
+TERMUX_PKG_PYTHON_TARGET_DEPS="psutil, pyinotify, pyinotify-elephant-fork"
+TERMUX_PKG_EXTRA_CONFIGURE_ARGS="
+-Dxtrans=false
+-Dfake-consolekit=true
+"
+
+termux_step_pre_configure() {
+ termux_setup_gir
+ termux_setup_glib_cross_pkg_config_wrapper
+
+ export TERMUX_MESON_ENABLE_SOVERSION=1
+}
+
+termux_step_create_debscripts() {
+ cat <<-EOF >./postinst
+ #!$TERMUX_PREFIX/bin/sh
+ echo "Installing dependencies through pip..."
+ pip3 install ${TERMUX_PKG_PYTHON_TARGET_DEPS//, / }
+ EOF
+}