Index: greetd/src/session/worker.rs
--- greetd/src/session/worker.rs.orig
+++ greetd/src/session/worker.rs
@@ -1,5 +1,13 @@
 use std::{env, ffi::CString, os::unix::net::UnixDatagram};
 
+use libc::{ c_int, c_char, uid_t, gid_t };
+#[link(name = "util")]
+extern "C" {
+    fn login_fbtab(tty: *const c_char, uid: uid_t, gid: gid_t) -> c_int;
+}
+
+use std::os::unix::fs;
+
 use nix::{
     sys::wait::waitpid,
     unistd::{execve, fork, initgroups, setgid, setsid, setuid, ForkResult},
@@ -163,6 +171,13 @@ fn worker(sock: &UnixDatagram) -> Result<(), Error> {
 
     let user = nix::unistd::User::from_name(&pam_username)?.ok_or("unable to get user info")?;
 
+    let ttyc_str = CString::new("ttyC0").unwrap();
+    let ttyptr: *const i8 = ttyc_str.as_ptr() as *const i8;
+    let rc = unsafe { login_fbtab(ttyptr, user.uid.into(), user.gid.into()) };
+    if rc != 0 {
+        return Err("login_fbtab failed".into());
+    }
+
     // Make this process a session leader.
     setsid().map_err(|e| format!("unable to become session leader: {}", e))?;
 
@@ -170,7 +185,7 @@ fn worker(sock: &UnixDatagram) -> Result<(), Error> {
         TerminalMode::Stdin => (),
         TerminalMode::Terminal { path, vt, switch } => {
             // Tell PAM what TTY we're targetting, which is used by logind.
-            pam.set_item(PamItemType::TTY, &format!("tty{}", vt))?;
+            pam.set_item(PamItemType::TTY, &format!("ttyC{}", vt))?;
             pam.putenv(&format!("XDG_VTNR={}", vt))?;
 
             // Opening our target terminal.
@@ -204,6 +219,8 @@ fn worker(sock: &UnixDatagram) -> Result<(), Error> {
     // and set all environment variables later.
     let prepared_env = [
         "XDG_SEAT=seat0".to_string(),
+        "WLR_DRM_DEVICES=/dev/dri/card0".to_string(),
+        "QT_QPA_PLATFORM=wayland".to_string(),
         format!("XDG_SESSION_CLASS={}", class.as_str()),
         format!("USER={}", user.name),
         format!("LOGNAME={}", user.name),
@@ -218,6 +235,17 @@ fn worker(sock: &UnixDatagram) -> Result<(), Error> {
         pam.putenv(e)?;
     }
 
+//    if user.uid.into() == 0 as uid_t && user.gid.into() == 0 as gid_t {
+    if user.name == "_greetd" {
+        pam.putenv("XDG_RUNTIME_DIR=/var/run/greetd")?;
+        // needed for ... .cache/mesa_shader_cache ?
+  //      pam.putenv("XDG_CACHE_HOME=/var/run/greetd/.caceh")?;
+        pam.putenv("HOME=/var/run/greetd/")?;
+  
+    } else {
+        pam.putenv(&format!("XDG_RUNTIME_DIR={}/.local/run", user.dir.to_string_lossy()))?;
+    }
+
     // Session time!
     pam.open_session(PamFlag::NONE)?;
 
@@ -308,6 +336,12 @@ fn worker(sock: &UnixDatagram) -> Result<(), Error> {
     pam.close_session(PamFlag::NONE)?;
     pam.setcred(PamFlag::DELETE_CRED)?;
     pam.end()?;
+
+    // reset perms to root via fbtab (xenodm does the same)
+    let rc2 = unsafe { login_fbtab(ttyptr, 0, 0) };
+    if rc2 != 0 {
+        return Err("login_fbtab failed".into());
+    }
 
     Ok(())
 }
