Bug#492140: xserver-xorg: xorg.conf generated with no ServerLayout section
On Thu, Jul 24, 2008 at 23:51:15 +0200, Julien Cristau wrote:
> * Locate the core input devices. These can be specified/located in
> * the following ways, in order of priority:
> *
> * 1. The InputDevices named by the -pointer and -keyboard command line
> * options.
> * 2. The "CorePointer" and "CoreKeyboard" InputDevices referred to by
> * the active ServerLayout.
> * 3. The first InputDevices marked as "CorePointer" and "CoreKeyboard".
> * 4. The first InputDevices that use the 'mouse' and 'keyboard' or 'kbd'
> * drivers.
> * 5. Default devices with an empty (default) configuration. These defaults
> * will reference the 'mouse' and 'keyboard' drivers.
>
> The xorg.conf generated by the xserver-xorg package relies on 4 above,
> which breaks when AllowEmptyInput is turned on.
> I think the first four points should still be tried when no ServerLayout
> section is present, even with AllowEmptyInput.
>
(and the xorg.conf manpage says AllowEmptyInput takes effect "if there
are no input devices in the config file")
The attached patch should fix this. Daniel, can you take a look? I'm
not sure why we have both checkInput() and checkCoreInputDevices(), by
the way.
Cheers,
Julien
>From d5dc9233bf05968a4f2d5ad9d1be1a7aac9c9f59 Mon Sep 17 00:00:00 2001
From: Julien Cristau <jcristau@debian.org>
Date: Sat, 26 Jul 2008 15:35:42 +0200
Subject: [PATCH] xfree86: use xorg.conf input devices if there is no ServerLayout
If xorg.conf has no ServerLayout section, use the first mouse and
keyboard sections as core devices, even with AllowEmptyInput.
---
hw/xfree86/common/xf86Config.c | 63 +++++++++++++++++++++++++--------------
1 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 663d81a..054f819 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1315,7 +1315,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 3. First core pointer device. */
- if (!foundPointer) {
+ if (!foundPointer && (!xf86Info.allowEmptyInput || implicitLayout)) {
XF86ConfInputPtr p;
for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
@@ -1331,7 +1331,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 4. First pointer with 'mouse' as the driver. */
- if (!foundPointer) {
+ if (!foundPointer && (!xf86Info.allowEmptyInput || implicitLayout)) {
confInput = xf86findInput(CONF_IMPLICIT_POINTER,
xf86configptr->conf_input_lst);
if (!confInput) {
@@ -1346,7 +1346,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 5. Built-in default. */
- if (!foundPointer) {
+ if (!foundPointer && !xf86Info.allowEmptyInput) {
bzero(&defPtr, sizeof(defPtr));
defPtr.inp_identifier = strdup("<default pointer>");
defPtr.inp_driver = strdup("mouse");
@@ -1373,9 +1373,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
if (!foundPointer) {
- /* This shouldn't happen. */
- xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n");
- return FALSE;
+ if (!xf86Info.allowEmptyInput) {
+ /* This shouldn't happen. */
+ xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n");
+ return FALSE;
+ } else {
+ xf86Msg(X_INFO, "Cannot locate a core pointer device.\n");
+ }
}
/*
@@ -1392,7 +1396,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
found = 1; break;
}
}
- if (!found) {
+ if (!found && !xf86Info.allowEmptyInput) {
xf86Msg(X_INFO, "No default mouse found, adding one\n");
bzero(&defPtr, sizeof(defPtr));
defPtr.inp_identifier = strdup("<default pointer>");
@@ -1451,7 +1455,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 3. First core keyboard device. */
- if (!foundKeyboard) {
+ if (!foundKeyboard && (!xf86Info.allowEmptyInput || implicitLayout)) {
XF86ConfInputPtr p;
for (p = xf86configptr->conf_input_lst; p; p = p->list.next) {
@@ -1467,7 +1471,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 4. First keyboard with 'keyboard' or 'kbd' as the driver. */
- if (!foundKeyboard) {
+ if (!foundKeyboard && (!xf86Info.allowEmptyInput || implicitLayout)) {
confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD,
xf86configptr->conf_input_lst);
if (!confInput) {
@@ -1482,7 +1486,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
/* 5. Built-in default. */
- if (!foundKeyboard) {
+ if (!foundKeyboard && !xf86Info.allowEmptyInput) {
bzero(&defKbd, sizeof(defKbd));
defKbd.inp_identifier = strdup("<default keyboard>");
defKbd.inp_driver = strdup("kbd");
@@ -1509,21 +1513,33 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout)
}
if (!foundKeyboard) {
- /* This shouldn't happen. */
- xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n");
- return FALSE;
+ if (!xf86Info.allowEmptyInput) {
+ /* This shouldn't happen. */
+ xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n");
+ return FALSE;
+ } else {
+ xf86Msg(X_INFO, "Cannot locate a core keyboard device.\n");
+ }
}
if (pointerMsg) {
- xf86Msg(X_DEFAULT, "The core pointer device wasn't specified "
- "explicitly in the layout.\n"
- "\tUsing the %s.\n", pointerMsg);
+ if (implicitLayout)
+ xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
+ pointerMsg);
+ else
+ xf86Msg(X_DEFAULT, "The core pointer device wasn't specified "
+ "explicitly in the layout.\n"
+ "\tUsing the %s.\n", pointerMsg);
}
if (keyboardMsg) {
- xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified "
- "explicitly in the layout.\n"
- "\tUsing the %s.\n", keyboardMsg);
+ if (implicitLayout)
+ xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n",
+ keyboardMsg);
+ else
+ xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified "
+ "explicitly in the layout.\n"
+ "\tUsing the %s.\n", keyboardMsg);
}
return TRUE;
@@ -2470,9 +2486,8 @@ addDefaultModes(MonPtr monitorp)
}
static void
-checkInput(serverLayoutPtr layout) {
- if (!xf86Info.allowEmptyInput)
- checkCoreInputDevices(layout, FALSE);
+checkInput(serverLayoutPtr layout, Bool implicit_layout) {
+ checkCoreInputDevices(layout, implicit_layout);
}
/*
@@ -2486,6 +2501,7 @@ xf86HandleConfigFile(Bool autoconfig)
MessageType from = X_DEFAULT;
char *scanptr;
Bool singlecard = 0;
+ Bool implicit_layout = FALSE;
if (!autoconfig) {
if (getuid() == 0)
@@ -2538,6 +2554,7 @@ xf86HandleConfigFile(Bool autoconfig)
xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
return CONFIG_PARSE_ERROR;
}
+ implicit_layout = TRUE;
} else {
if (xf86configptr->conf_flags != NULL) {
char *dfltlayout = NULL;
@@ -2595,7 +2612,7 @@ xf86HandleConfigFile(Bool autoconfig)
configDRI(xf86configptr->conf_dri);
#endif
- checkInput(&xf86ConfigLayout);
+ checkInput(&xf86ConfigLayout, implicit_layout);
/*
* Handle some command line options that can override some of the
--
1.5.6.3
Reply to: