xwayland: support xinitrc scripts to configure server on launch (#1963)

This commit is contained in:
Andrew J. Hesford 2024-07-20 04:40:11 -04:00 committed by GitHub
parent e4afa10fe4
commit 14d9bbab90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 48 additions and 5 deletions

View file

@ -5,6 +5,7 @@ Config layout for ~/.config/labwc/
- rc.xml - rc.xml
- shutdown - shutdown
- themerc-override - themerc-override
- xinitrc
See `man labwc-config and `man labwc-theme` for further details. See `man labwc-config and `man labwc-theme` for further details.

View file

@ -8,7 +8,7 @@ labwc - configuration files
Labwc uses openbox-3.6 specification for configuration and theming, but does not Labwc uses openbox-3.6 specification for configuration and theming, but does not
support all options. The following files form the basis of the labwc support all options. The following files form the basis of the labwc
configuration: rc.xml, menu.xml, autostart, shutdown and environment. configuration: rc.xml, menu.xml, autostart, shutdown, environment and xinitrc.
No configuration files are needed to start and run labwc. No configuration files are needed to start and run labwc.
@ -78,6 +78,10 @@ in labwc-theme(5).
*rc.xml* is the main configuration file and all its options are described in *rc.xml* is the main configuration file and all its options are described in
detail below. detail below.
The *xinitrc* file is executed as a shell script whenever labwc launches the
Xwayland X11 server. This may happen multiple times throughout the session if
Xwayland is not configured to persist when no X11 clients are connected.
# CONFIGURATION # CONFIGURATION
This section describes *rc.xml* configuration options. This section describes *rc.xml* configuration options.

28
docs/xinitrc Normal file
View file

@ -0,0 +1,28 @@
#!/bin/sh
## This file is run every time labwc launches Xwayland.
##
## In the default configuration, Xwayland will be launched lazily, and will
## terminate after several seconds when no X11 clients are connected. Thus,
## this script may run repeatedly throughout a single labwc session.
# Configure the X resource database if a file is provided
#
# NOTE: when Xwayland is launched lazily, an X11 client that triggers its
# launch may attempt to read the resource database before this command can be
# run. In that case, it is recommended to make a symlink to .Xdefaults:
#
# ln -s .Xresources "${HOME}/.Xdefaults"
#
# With this link in place, X11 applications will fall back to reading
# the .Xdefaults file directly when no resource database can be read from the
# server's root window properties.
#
# Invoking xrdb is still useful to pre-load the resource database for
# subsequent clients, because any additional clients launched while the X
# server remains alive will be able to query the database without resorting to
# filesystem access.
if [ -r "${HOME}/.Xresources" ] && command -v xrdb >/dev/null 2>&1; then
xrdb -merge "${HOME}/.Xresources"
fi

View file

@ -4,6 +4,12 @@
struct server; struct server;
/**
* session_run_script - run a named session script (or, in merge-config mode,
* all named session scripts) from the XDG path.
*/
void session_run_script(const char *script);
/** /**
* session_environment_init - set environment variables based on <key>=<value> * session_environment_init - set environment variables based on <key>=<value>
* pairs in `${XDG_CONFIG_DIRS:-/etc/xdg}/labwc/environment` with user override * pairs in `${XDG_CONFIG_DIRS:-/etc/xdg}/labwc/environment` with user override

View file

@ -261,8 +261,8 @@ session_environment_init(void)
paths_destroy(&paths); paths_destroy(&paths);
} }
static void void
run_session_script(const char *script) session_run_script(const char *script)
{ {
struct wl_list paths; struct wl_list paths;
paths_config_create(&paths, script); paths_config_create(&paths, script);
@ -293,13 +293,13 @@ session_autostart_init(struct server *server)
{ {
/* Update dbus and systemd user environment, each may fail gracefully */ /* Update dbus and systemd user environment, each may fail gracefully */
update_activation_env(server, /* initialize */ true); update_activation_env(server, /* initialize */ true);
run_session_script("autostart"); session_run_script("autostart");
} }
void void
session_shutdown(struct server *server) session_shutdown(struct server *server)
{ {
run_session_script("shutdown"); session_run_script("shutdown");
/* Clear the dbus and systemd user environment, each may fail gracefully */ /* Clear the dbus and systemd user environment, each may fail gracefully */
update_activation_env(server, /* initialize */ false); update_activation_env(server, /* initialize */ false);

View file

@ -7,6 +7,7 @@
#include "common/macros.h" #include "common/macros.h"
#include "common/mem.h" #include "common/mem.h"
#include "config/rcxml.h" #include "config/rcxml.h"
#include "config/session.h"
#include "labwc.h" #include "labwc.h"
#include "node.h" #include "node.h"
#include "ssd.h" #include "ssd.h"
@ -1072,6 +1073,9 @@ sync_atoms(xcb_connection_t *xcb_conn)
static void static void
handle_server_ready(struct wl_listener *listener, void *data) handle_server_ready(struct wl_listener *listener, void *data)
{ {
/* Fire an Xwayland startup script if one (or many) can be found */
session_run_script("xinitrc");
xcb_connection_t *xcb_conn = xcb_connect(NULL, NULL); xcb_connection_t *xcb_conn = xcb_connect(NULL, NULL);
if (xcb_connection_has_error(xcb_conn)) { if (xcb_connection_has_error(xcb_conn)) {
wlr_log(WLR_ERROR, "Failed to create xcb connection"); wlr_log(WLR_ERROR, "Failed to create xcb connection");