xwayland and xvfb-run fixes

xwayland: avoid race condition on new keymap
xwayland: Keep separate variables for pointer and tablet foci
xvfb-run: Add support for “ --auto-display” command line option
This commit is contained in:
Olivier Fourdan 2018-02-13 16:56:36 +01:00
parent bcdafa232e
commit 9e2c567908
4 changed files with 209 additions and 9 deletions

View File

@ -0,0 +1,135 @@
From 60f4646ae10f0b57790fce46682baa531512b53e Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Mon, 4 Dec 2017 16:55:13 +0100
Subject: [PATCH xserver] xwayland: Keep separate variables for pointer and
tablet foci
The tablet/stylus interfaces reused xwl_seat->focus_window, which
would leave a somewhat inconsistent state of that variable for
wl_pointer purposes (basically, everything) if the pointer happened
to lay on the same surface than the stylus while proximity_out
happens.
We just want the stylus xwl_window to correctly determine we have
stylus focus, and to correctly translate surface-local coordinates
to root coordinates, this can be done using a different variable.
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
Acked-by: Jason Gerecke <jason.gerecke@wacom.com>
Tested-by: Olivier Fourdan <ofourdan@redhat.com>
---
hw/xwayland/xwayland-input.c | 20 ++++++++++----------
hw/xwayland/xwayland.c | 2 ++
hw/xwayland/xwayland.h | 1 +
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 68e365051..439903032 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -1514,7 +1514,7 @@ tablet_tool_proximity_in(void *data, struct zwp_tablet_tool_v2 *tool,
return;
xwl_tablet_tool->proximity_in_serial = serial;
- xwl_seat->focus_window = wl_surface_get_user_data(wl_surface);
+ xwl_seat->tablet_focus_window = wl_surface_get_user_data(wl_surface);
xwl_tablet_tool_set_cursor(xwl_tablet_tool);
}
@@ -1526,7 +1526,7 @@ tablet_tool_proximity_out(void *data, struct zwp_tablet_tool_v2 *tool)
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
xwl_tablet_tool->proximity_in_serial = 0;
- xwl_seat->focus_window = NULL;
+ xwl_seat->tablet_focus_window = NULL;
xwl_tablet_tool->pressure = 0;
xwl_tablet_tool->tilt_x = 0;
@@ -1568,11 +1568,11 @@ tablet_tool_motion(void *data, struct zwp_tablet_tool_v2 *tool,
int sx = wl_fixed_to_int(x);
int sy = wl_fixed_to_int(y);
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
- dx = xwl_seat->focus_window->window->drawable.x;
- dy = xwl_seat->focus_window->window->drawable.y;
+ dx = xwl_seat->tablet_focus_window->window->drawable.x;
+ dy = xwl_seat->tablet_focus_window->window->drawable.y;
xwl_tablet_tool->x = dx + sx;
xwl_tablet_tool->y = dy + sy;
@@ -1585,7 +1585,7 @@ tablet_tool_pressure(void *data, struct zwp_tablet_tool_v2 *tool,
struct xwl_tablet_tool *xwl_tablet_tool = data;
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
/* normalized to 65535 already */
@@ -1605,7 +1605,7 @@ tablet_tool_tilt(void *data, struct zwp_tablet_tool_v2 *tool,
struct xwl_tablet_tool *xwl_tablet_tool = data;
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
xwl_tablet_tool->tilt_x = wl_fixed_to_double(tilt_x);
@@ -1620,7 +1620,7 @@ tablet_tool_rotation(void *data, struct zwp_tablet_tool_v2 *tool,
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
double rotation = wl_fixed_to_double(angle);
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
/* change origin (buttons facing right [libinput +90 degrees]) and
@@ -1639,7 +1639,7 @@ tablet_tool_slider(void *data, struct zwp_tablet_tool_v2 *tool,
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
float position = position_raw / 65535.0;
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
xwl_tablet_tool->slider = (position * 1799.0f) - 900.0f;
@@ -1652,7 +1652,7 @@ tablet_tool_wheel(void *data, struct zwp_tablet_tool_v2 *tool,
struct xwl_tablet_tool *xwl_tablet_tool = data;
struct xwl_seat *xwl_seat = xwl_tablet_tool->seat;
- if (!xwl_seat->focus_window)
+ if (!xwl_seat->tablet_focus_window)
return;
xwl_tablet_tool->wheel_clicks = clicks;
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index 79deead8d..638022180 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -545,6 +545,8 @@ xwl_unrealize_window(WindowPtr window)
xorg_list_for_each_entry(xwl_seat, &xwl_screen->seat_list, link) {
if (xwl_seat->focus_window && xwl_seat->focus_window->window == window)
xwl_seat->focus_window = NULL;
+ if (xwl_seat->tablet_focus_window && xwl_seat->tablet_focus_window->window == window)
+ xwl_seat->tablet_focus_window = NULL;
if (xwl_seat->last_xwindow == window)
xwl_seat->last_xwindow = NullWindow;
if (xwl_seat->cursor_confinement_window &&
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
index 3adee82fa..e6eb37bec 100644
--- a/hw/xwayland/xwayland.h
+++ b/hw/xwayland/xwayland.h
@@ -154,6 +154,7 @@ struct xwl_seat {
struct zwp_tablet_seat_v2 *tablet_seat;
struct wl_array keys;
struct xwl_window *focus_window;
+ struct xwl_window *tablet_focus_window;
uint32_t id;
uint32_t pointer_enter_serial;
struct xorg_list link;
--
2.14.3

View File

@ -0,0 +1,41 @@
From 170c95978530f6373bdf4488116902b273f3abf4 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 15 Dec 2017 16:43:47 +0100
Subject: [PATCH xserver] xwayland: avoid race condition on new keymap
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When the Wayland compositor notifies of a new keymap, for the first X11
client using the keyboard, the last slave keyboard used might still not
be set (i.e. “lastSlave” is still NULL).
As a result, the new keymap is not applied, and the first X11 window
will have the wrong keymap set initially.
Apply the new keymap to the master keyboard as long as there's one.
Bugzilla: https://bugzilla.gnome.org/show_bug.cgi?id=791383
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
---
hw/xwayland/xwayland-input.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 439903032..c613690cd 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -710,7 +710,7 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
XkbDeviceApplyKeymap(xwl_seat->keyboard, xkb);
master = GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD);
- if (master && master->lastSlave == xwl_seat->keyboard)
+ if (master)
XkbDeviceApplyKeymap(master, xkb);
XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE);
--
2.14.3

View File

@ -46,7 +46,7 @@
Summary: X.Org X11 X server Summary: X.Org X11 X server
Name: xorg-x11-server Name: xorg-x11-server
Version: 1.19.6 Version: 1.19.6
Release: 4%{?gitdate:.%{gitdate}}%{dist} Release: 5%{?gitdate:.%{gitdate}}%{dist}
URL: http://www.x.org URL: http://www.x.org
License: MIT License: MIT
Group: User Interface/X Group: User Interface/X
@ -107,6 +107,10 @@ Patch9912: 0012-xwayland-Implement-tablet_tool_wheel-for-scrolling.patch
# Upstream commit fe46cbe for Xwayland - Not in server-1.19-branch # Upstream commit fe46cbe for Xwayland - Not in server-1.19-branch
Patch9950: 0001-xwayland-Give-up-cleanly-on-Wayland-socket-errors.patch Patch9950: 0001-xwayland-Give-up-cleanly-on-Wayland-socket-errors.patch
# Upstream commit 60f4646a for Xwayland - Not in xorg-server-1.19.6
Patch9951: 0001-xwayland-Keep-separate-variables-for-pointer-and-tab.patch
# Upstream commit 16fd1847 for Xwayland - Not in xorg-server-1.19.6
Patch9952: 0001-xwayland-avoid-race-condition-on-new-keymap.patch
# From Debian use intel ddx driver only for gen4 and older chipsets # From Debian use intel ddx driver only for gen4 and older chipsets
%if 0%{?fedora} > 25 || 0%{?rhel} > 7 %if 0%{?fedora} > 25 || 0%{?rhel} > 7
@ -624,6 +628,11 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
%changelog %changelog
* Tue Feb 13 2018 Olivier Fourdan <ofourdan@redhat.com> 1.19.6-5
- xwayland: avoid race condition on new keymap
- xwayland: Keep separate variables for pointer and tablet foci (rhbz#1519961)
- xvfb-run now support command line option “--auto-display”
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.19.6-4 * Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.19.6-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild

View File

@ -64,7 +64,10 @@ Usage: $PROGNAME [OPTION ...] COMMAND
Run COMMAND (usually an X client) in a virtual X server environment. Run COMMAND (usually an X client) in a virtual X server environment.
Options: Options:
-a --auto-servernum try to get a free server number, starting at -a --auto-servernum try to get a free server number, starting at
--server-num --server-num (deprecated, use --auto-display
instead)
-d --auto-display use the X server to find a display number
automatically
-e FILE --error-file=FILE file used to store xauth errors and Xvfb -e FILE --error-file=FILE file used to store xauth errors and Xvfb
output (default: $ERRORFILE) output (default: $ERRORFILE)
-f FILE --auth-file=FILE file used to store auth cookie -f FILE --auth-file=FILE file used to store auth cookie
@ -97,7 +100,7 @@ find_free_servernum() {
} }
# Parse the command line. # Parse the command line.
ARGS=$(getopt --options +ae:f:hn:lp:s:w: \ ARGS=$(getopt --options +ade:f:hn:lp:s:w: \
--long auto-servernum,error-file:auth-file:,help,server-num:,listen-tcp,xauth-protocol:,server-args:,wait: \ --long auto-servernum,error-file:auth-file:,help,server-num:,listen-tcp,xauth-protocol:,server-args:,wait: \
--name "$PROGNAME" -- "$@") --name "$PROGNAME" -- "$@")
GETOPT_STATUS=$? GETOPT_STATUS=$?
@ -112,6 +115,7 @@ eval set -- "$ARGS"
while :; do while :; do
case "$1" in case "$1" in
-a|--auto-servernum) SERVERNUM=$(find_free_servernum) ;; -a|--auto-servernum) SERVERNUM=$(find_free_servernum) ;;
-d|--auto-display) AUTO_DISPLAY=1 ;;
-e|--error-file) ERRORFILE="$2"; shift ;; -e|--error-file) ERRORFILE="$2"; shift ;;
-f|--auth-file) AUTHFILE="$2"; shift ;; -f|--auth-file) AUTHFILE="$2"; shift ;;
-h|--help) SHOWHELP="yes" ;; -h|--help) SHOWHELP="yes" ;;
@ -138,29 +142,40 @@ if [ -z "$*" ]; then
exit 2 exit 2
fi fi
if ! type xauth >/dev/null; then if ! which xauth >/dev/null; then
error "xauth command not found" error "xauth command not found"
exit 3 exit 3
fi fi
# Set up the temp dir for the pid and X authorization file
XVFB_RUN_TMPDIR="$(mktemp --directory --tmpdir $PROGNAME.XXXXXX)"
# If the user did not specify an X authorization file to use, set up a temporary # If the user did not specify an X authorization file to use, set up a temporary
# directory to house one. # directory to house one.
if [ -z "$AUTHFILE" ]; then if [ -z "$AUTHFILE" ]; then
XVFB_RUN_TMPDIR="$(mktemp --directory --tmpdir $PROGNAME.XXXXXX)"
AUTHFILE=$(mktemp -p "$XVFB_RUN_TMPDIR" Xauthority.XXXXXX) AUTHFILE=$(mktemp -p "$XVFB_RUN_TMPDIR" Xauthority.XXXXXX)
fi fi
# Start Xvfb. # Start Xvfb.
MCOOKIE=$(mcookie) MCOOKIE=$(mcookie)
XAUTHORITY=$AUTHFILE xauth source - << EOF >>"$ERRORFILE" 2>&1 if [ -z "$AUTO_DISPLAY" ]; then
add :$SERVERNUM $XAUTHPROTO $MCOOKIE # Old style using a pre-computed SERVERNUM
EOF
XAUTHORITY=$AUTHFILE Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP >>"$ERRORFILE" \ XAUTHORITY=$AUTHFILE Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP >>"$ERRORFILE" \
2>&1 & 2>&1 &
XVFBPID=$! XVFBPID=$!
else
# New style using Xvfb to provide a free display
PIDFILE=$(mktemp -p "$XVFB_RUN_TMPDIR" pid.XXXXXX)
SERVERNUM=$(XAUTHORITY=$AUTHFILE Xvfb -displayfd 1 $XVFBARGS $LISTENTCP \
2>"$ERRORFILE" & echo $! > $PIDFILE)
XVFBPID=$(cat $PIDFILE)
fi
sleep "$STARTWAIT" sleep "$STARTWAIT"
XAUTHORITY=$AUTHFILE xauth source - << EOF >>"$ERRORFILE" 2>&1
add :$SERVERNUM $XAUTHPROTO $MCOOKIE
EOF
# Start the command and save its exit status. # Start the command and save its exit status.
set +e set +e
DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1 DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1