fixup! Add display server.

This commit is contained in:
Jonas 'Sortie' Termansen 2023-06-17 21:25:33 +02:00
parent c7d5b41605
commit 22be4abaa4
5 changed files with 49 additions and 47 deletions

View File

@ -25,6 +25,25 @@ script in the background.
.Nm
exits when Control + Alt + Delete is pressed.
.Pp
The options are as follows:
.Bl -tag -width "12345678"
.It Fl m Ar mouse
Use
.Pa mouse
device instead of
.Pa /dev/mouse .
.It Fl t Ar tty
Use
.Pa tty
device instead of
.Pa /dev/tty .
.It Fl s Ar socket
Listen on
.Pa socket
instead of
.Pa /var/run/display .
.El
.Pp
The keyboard shortcuts are as follows:
.Bl -tag -width "Control + Alt + Delete"
.It Alt + F4
@ -93,7 +112,7 @@ Applications use
to connect to
.Nm
or
.Pa /run/display
.Pa /var/run/display
by default.
.El
.Sh FILES
@ -101,7 +120,7 @@ by default.
.It Pa ~/.displayrc , /etc/displayrc , /etc/default/displayrc
.Xr displayrc 5
script that spawns the user's preferred startup applications.
.It Pa /run/display
.It Pa /var/run/display
.Xr unix 4
socket where
.Nm

View File

@ -45,43 +45,23 @@ static void ready(void)
unsetenv("READYFD");
}
static void compact_arguments(int* argc, char*** argv)
{
for ( int i = 0; i < *argc; i++ )
{
while ( i < *argc && !(*argv)[i] )
{
for ( int n = i; n < *argc; n++ )
(*argv)[n] = (*argv)[n+1];
(*argc)--;
}
}
}
int main(int argc, char* argv[])
{
for ( int i = 1; i < argc; i++ )
{
const char* arg = argv[i];
if ( arg[0] != '-' || !arg[1] )
continue;
argv[i] = NULL;
if ( !strcmp(arg, "--") )
break;
if ( arg[1] != '-' )
{
char c;
while ( (c = *++arg) ) switch ( c )
{
default:
errx(1, "unknown option -- '%c'", c);
}
}
else
errx(1, "unknown option: %s", arg);
}
const char* mouse = "/dev/mouse";
const char* socket = "/var/run/display";
const char* tty = NULL;
compact_arguments(&argc, &argv);
int opt;
while ( (opt = getopt(argc, argv, "m:s:t")) != -1 )
{
switch ( opt )
{
case 'm': mouse = optarg; break;
case 's': socket = optarg; break;
case 't': tty = optarg; break;
default: return 1;
}
}
memcpy(arrow_buffer, arrow, sizeof(arrow));
@ -95,7 +75,7 @@ int main(int argc, char* argv[])
display_initialize(&display);
struct server server;
server_initialize(&server, &display);
server_initialize(&server, &display, tty, mouse, socket);
if ( setenv("DISPLAY_SOCKET", server.server_path, 1) < 0 )
err(1, "setenv");

View File

@ -59,7 +59,8 @@ static int open_local_server_socket(const char* path, int flags)
return fd;
}
void server_initialize(struct server* server, struct display* display)
void server_initialize(struct server* server, struct display* display,
const char* tty, const char* mouse, const char* socket)
{
memset(server, 0, sizeof(*server));
@ -68,18 +69,19 @@ void server_initialize(struct server* server, struct display* display)
load_font();
server->tty_fd = 0;
if ( !isatty(server->tty_fd) )
if ( tty || !isatty(server->tty_fd) )
{
server->tty_fd = open("/dev/tty", O_RDONLY);
tty = tty ? tty : "/dev/tty";
server->tty_fd = open(tty, O_RDONLY);
if ( server->tty_fd < 0 )
err(1, "/dev/tty");
err(1, tty);
}
server->mouse_fd = open("/dev/mouse", O_RDONLY | O_CLOEXEC);
server->mouse_fd = open(mouse, O_RDONLY | O_CLOEXEC);
if ( server->mouse_fd < 0 )
err(1, "%s", "/dev/mouse");
err(1, "%s", mouse);
server->server_path = "/run/display";
server->server_path = socket;
server->server_fd = open_local_server_socket(server->server_path,
SOCK_NONBLOCK | SOCK_CLOEXEC);
if ( server->server_fd < 0 )
@ -87,7 +89,7 @@ void server_initialize(struct server* server, struct display* display)
unsigned int termmode =
TERMMODE_KBKEY | TERMMODE_UNICODE | TERMMODE_NONBLOCK;
if ( settermmode(0, termmode) < 0 )
if ( settermmode(server->tty_fd, termmode) < 0 )
err(1, "settermmode");
server->pfds_count = server_pfds_count(server);

View File

@ -41,7 +41,8 @@ struct server
size_t pfds_count;
};
void server_initialize(struct server* server, struct display* display);
void server_initialize(struct server* server, struct display* display,
const char* tty, const char* mouse, const char* socket);
bool server_accept(struct server* server);
size_t server_pfds_count(const struct server* server);
void server_poll(struct server* server);

View File

@ -100,7 +100,7 @@ struct display_connection* display_connect_default(void)
{
return display_connect(getenv("DISPLAY_SOCKET") ?
getenv("DISPLAY_SOCKET") :
"/run/display");
"/var/run/display");
}
void display_disconnect(struct display_connection* connection)