mirror of
https://github.com/mpv-player/mpv
synced 2025-04-01 00:07:33 +00:00
vo_drm: check if signal already used
This commit is contained in:
parent
05e39ec513
commit
03cf69f0a8
@ -35,15 +35,24 @@
|
|||||||
#define EVT_INTERRUPT 255
|
#define EVT_INTERRUPT 255
|
||||||
#define HANDLER_ACQUIRE 0
|
#define HANDLER_ACQUIRE 0
|
||||||
#define HANDLER_RELEASE 1
|
#define HANDLER_RELEASE 1
|
||||||
|
#define RELEASE_SIGNAL SIGUSR1
|
||||||
|
#define ACQUIRE_SIGNAL SIGUSR2
|
||||||
|
|
||||||
static int vt_switcher_pipe[2];
|
static int vt_switcher_pipe[2];
|
||||||
|
|
||||||
static void vt_switcher_sighandler(int sig)
|
static void vt_switcher_sighandler(int sig)
|
||||||
{
|
{
|
||||||
unsigned char event = sig == SIGUSR1 ? EVT_RELEASE : EVT_ACQUIRE;
|
unsigned char event = sig == RELEASE_SIGNAL ? EVT_RELEASE : EVT_ACQUIRE;
|
||||||
write(vt_switcher_pipe[1], &event, sizeof(event));
|
write(vt_switcher_pipe[1], &event, sizeof(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool has_signal_installed(int signo)
|
||||||
|
{
|
||||||
|
struct sigaction act = { 0 };
|
||||||
|
sigaction(signo, 0, &act);
|
||||||
|
return act.sa_handler != 0;
|
||||||
|
}
|
||||||
|
|
||||||
int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
|
int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
|
||||||
{
|
{
|
||||||
s->log = log;
|
s->log = log;
|
||||||
@ -62,12 +71,21 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (has_signal_installed(RELEASE_SIGNAL)) {
|
||||||
|
MP_ERR(s, "Can't handle VT release - signal already used\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (has_signal_installed(ACQUIRE_SIGNAL)) {
|
||||||
|
MP_ERR(s, "Can't handle VT acquire - signal already used\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
struct sigaction act;
|
struct sigaction act;
|
||||||
act.sa_handler = vt_switcher_sighandler;
|
act.sa_handler = vt_switcher_sighandler;
|
||||||
act.sa_flags = SA_RESTART;
|
act.sa_flags = SA_RESTART;
|
||||||
sigemptyset(&act.sa_mask);
|
sigemptyset(&act.sa_mask);
|
||||||
sigaction(SIGUSR1, &act, 0);
|
sigaction(RELEASE_SIGNAL, &act, 0);
|
||||||
sigaction(SIGUSR2, &act, 0);
|
sigaction(ACQUIRE_SIGNAL, &act, 0);
|
||||||
|
|
||||||
struct vt_mode vt_mode;
|
struct vt_mode vt_mode;
|
||||||
if (ioctl(s->tty_fd, VT_GETMODE, &vt_mode) < 0) {
|
if (ioctl(s->tty_fd, VT_GETMODE, &vt_mode) < 0) {
|
||||||
@ -76,8 +94,8 @@ int vt_switcher_init(struct vt_switcher *s, struct mp_log *log)
|
|||||||
}
|
}
|
||||||
|
|
||||||
vt_mode.mode = VT_PROCESS;
|
vt_mode.mode = VT_PROCESS;
|
||||||
vt_mode.relsig = SIGUSR1;
|
vt_mode.relsig = RELEASE_SIGNAL;
|
||||||
vt_mode.acqsig = SIGUSR2;
|
vt_mode.acqsig = ACQUIRE_SIGNAL;
|
||||||
if (ioctl(s->tty_fd, VT_SETMODE, &vt_mode) < 0) {
|
if (ioctl(s->tty_fd, VT_SETMODE, &vt_mode) < 0) {
|
||||||
MP_ERR(s, "VT_SETMODE failed: %s\n", mp_strerror(errno));
|
MP_ERR(s, "VT_SETMODE failed: %s\n", mp_strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user