@ -15,6 +15,7 @@
# include <wayland-server.h>
# include <wayland-server.h>
# include <wlr/backend/session/interface.h>
# include <wlr/backend/session/interface.h>
# include <wlr/util/log.h>
# include <wlr/util/log.h>
# include <xf86drm.h>
# include "backend/session/direct-ipc.h"
# include "backend/session/direct-ipc.h"
# include "util/signal.h"
# include "util/signal.h"
@ -47,24 +48,11 @@ static int direct_session_open(struct wlr_session *base, const char *path) {
static void direct_session_close ( struct wlr_session * base , int fd ) {
static void direct_session_close ( struct wlr_session * base , int fd ) {
struct direct_session * session = wl_container_of ( base , session , base ) ;
struct direct_session * session = wl_container_of ( base , session , base ) ;
struct stat st ;
int ev ;
if ( fstat ( fd , & st ) < 0 ) {
struct drm_version dv = { 0 } ;
wlr_log_errno ( WLR_ERROR , " Stat failed " ) ;
if ( ioctl ( fd , DRM_IOCTL_VERSION , & dv ) = = 0 ) {
close ( fd ) ;
return ;
}
char * name ;
name = devname ( st . st_rdev , S_IFCHR ) ;
if ( name = = NULL ) {
wlr_log_errno ( WLR_ERROR , " Failed to get device name " ) ;
close ( fd ) ;
return ;
}
if ( strncmp ( name , " drm/ " , 4 ) = = 0 ) {
direct_ipc_dropmaster ( session - > sock , fd ) ;
direct_ipc_dropmaster ( session - > sock , fd ) ;
} else if ( strncmp( name , " input/event " , 11 ) ) {
} else if ( ioctl ( fd , EVIOCGVERSION , & ev ) = = 0 ) {
ioctl ( fd , EVIOCREVOKE , 0 ) ;
ioctl ( fd , EVIOCREVOKE , 0 ) ;
}
}
@ -104,16 +92,15 @@ static void direct_session_destroy(struct wlr_session *base) {
static int vt_handler ( int signo , void * data ) {
static int vt_handler ( int signo , void * data ) {
struct direct_session * session = data ;
struct direct_session * session = data ;
struct drm_version dv = { 0 } ;
struct wlr_device * dev ;
if ( session - > base . active ) {
if ( session - > base . active ) {
session - > base . active = false ;
session - > base . active = false ;
wlr_signal_emit_safe ( & session - > base . session_signal , session ) ;
wlr_signal_emit_safe ( & session - > base . session_signal , session ) ;
char * name ;
struct wlr_device * dev ;
wl_list_for_each ( dev , & session - > base . devices , link ) {
wl_list_for_each ( dev , & session - > base . devices , link ) {
name = devname ( dev - > dev , S_IFCHR ) ;
if ( ioctl ( dev - > fd , DRM_IOCTL_VERSION , & dv ) = = 0 ) {
if ( name ! = NULL & & strncmp ( name , " drm/ " , 4 ) = = 0 ) {
direct_ipc_dropmaster ( session - > sock , dev - > fd ) ;
direct_ipc_dropmaster ( session - > sock , dev - > fd ) ;
}
}
}
}
@ -122,11 +109,8 @@ static int vt_handler(int signo, void *data) {
} else {
} else {
ioctl ( session - > tty_fd , VT_RELDISP , VT_ACKACQ ) ;
ioctl ( session - > tty_fd , VT_RELDISP , VT_ACKACQ ) ;
char * name ;
struct wlr_device * dev ;
wl_list_for_each ( dev , & session - > base . devices , link ) {
wl_list_for_each ( dev , & session - > base . devices , link ) {
name = devname ( dev - > dev , S_IFCHR ) ;
if ( ioctl ( dev - > fd , DRM_IOCTL_VERSION , & dv ) = = 0 ) {
if ( name ! = NULL & & strncmp ( name , " drm/ " , 4 ) = = 0 ) {
direct_ipc_setmaster ( session - > sock , dev - > fd ) ;
direct_ipc_setmaster ( session - > sock , dev - > fd ) ;
}
}
}
}