forked from pool/xorg-x11-server
Stefan Dirsch
a29b6ab496
- Add new patches to make non-seat0 X servers work properly with non-KMS video drivers: + u_xfree86-allow-fallback-to-PCI-bus-probe-for-non-seat0-seats.patch + u_xfree86-add-new-key-MatchSeat-to-xorg-conf.patch + u_xfree86-add-short-description-about-MatchSeat-key-in-xorg-conf-man-page.patch OBS-URL: https://build.opensuse.org/request/show/232245 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=513
243 lines
9.7 KiB
Diff
243 lines
9.7 KiB
Diff
From c29952e77111d6da1ab12957f0207d59ae14c809 Mon Sep 17 00:00:00 2001
|
|
From: Oleg Samarin <osamarin68@gmail.com>
|
|
Date: Thu, 3 Apr 2014 09:16:52 -0300
|
|
Subject: [PATCH v2 2/3] xfree86: add new key MatchSeat to xorg.conf sections
|
|
"Device", "Screen", and "ServerLayout"
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This patch introduces a new key MatchSeat in xorg.conf (also applies to
|
|
any .conf file in xorg.conf.d). It will allow targeting a given
|
|
"Device", "Screen", and/or "ServerLayout" section to a particular
|
|
seat only (specified by option "-seat" in X server command line),
|
|
so that other seats won't be affected.
|
|
|
|
Without this patch, one needs to write a separate xorg.conf.custom
|
|
file and pass it to X server via "-config" option, if one wants that
|
|
these settings only apply for the right seat. However, in some cases,
|
|
this solution is undesirable or even impossible (e.g. when using GDM,
|
|
which doesn't allow X server command line customization).
|
|
|
|
Example file (/etc/X11/xorg.conf.d/seat1.conf), which would be ignored
|
|
by X server unless it was started with "-seat seat1" option:
|
|
|
|
Section "Device"
|
|
Identifier "card0"
|
|
Driver "nvidia"
|
|
Option "NoLogo" "True"
|
|
MatchSeat "seat1"
|
|
EndSection
|
|
|
|
Signed-off-by: Oleg Samarin <osamarin68@gmail.com>
|
|
Signed-off-by: Laércio de Sousa <lbsousajr@gmail.com>
|
|
---
|
|
hw/xfree86/common/xf86Config.c | 34 +++++++++++++++++++++++++---------
|
|
hw/xfree86/parser/Device.c | 6 ++++++
|
|
hw/xfree86/parser/Layout.c | 6 ++++++
|
|
hw/xfree86/parser/Screen.c | 6 ++++++
|
|
hw/xfree86/parser/xf86Parser.h | 3 +++
|
|
hw/xfree86/parser/xf86tokens.h | 1 +
|
|
6 files changed, 47 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
|
|
index 542d5ab..5d17567 100644
|
|
--- a/hw/xfree86/common/xf86Config.c
|
|
+++ b/hw/xfree86/common/xf86Config.c
|
|
@@ -232,6 +232,17 @@ xf86ValidateFontPath(char *path)
|
|
return tmp_path;
|
|
}
|
|
|
|
+#define FIND_SUITABLE(pointertype, listhead, ptr) \
|
|
+ { \
|
|
+ pointertype l, p; \
|
|
+ \
|
|
+ for (l = listhead, p = NULL; !p && l; l = (pointertype) l->list.next) { \
|
|
+ if (! l->match_seat || SeatId && xf86nameCompare(l->match_seat, SeatId) == 0) \
|
|
+ p = l; \
|
|
+ } \
|
|
+ ptr = p; \
|
|
+ }
|
|
+
|
|
/*
|
|
* use the datastructure that the parser provides and pick out the parts
|
|
* that we need at this point
|
|
@@ -1580,8 +1591,11 @@ configLayout(serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout,
|
|
* config file, or - if it is NULL - configScreen autogenerates one for
|
|
* us */
|
|
if (!count) {
|
|
+ XF86ConfScreenPtr screen;
|
|
+
|
|
+ FIND_SUITABLE (XF86ConfScreenPtr, xf86configptr->conf_screen_lst, screen);
|
|
slp[0].screen = xnfcalloc(1, sizeof(confScreenRec));
|
|
- if (!configScreen(slp[0].screen, xf86configptr->conf_screen_lst,
|
|
+ if (!configScreen(slp[0].screen, screen,
|
|
0, X_CONFIG)) {
|
|
free(slp[0].screen);
|
|
free(slp);
|
|
@@ -1821,7 +1835,7 @@ configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen, int scrnum,
|
|
* set it to NULL so that the section can be autoconfigured later */
|
|
screenp->device = xnfcalloc(1, sizeof(GDevRec));
|
|
if ((!conf_screen->scrn_device) && (xf86configptr->conf_device_lst)) {
|
|
- conf_screen->scrn_device = xf86configptr->conf_device_lst;
|
|
+ FIND_SUITABLE (XF86ConfDevicePtr, xf86configptr->conf_device_lst, conf_screen->scrn_device);
|
|
xf86Msg(X_DEFAULT, "No device specified for screen \"%s\".\n"
|
|
"\tUsing the first device section listed.\n", screenp->id);
|
|
}
|
|
@@ -2429,14 +2443,19 @@ xf86HandleConfigFile(Bool autoconfig)
|
|
*/
|
|
|
|
/* First check if a layout section is present, and if it is valid. */
|
|
+ XF86ConfLayoutPtr layout;
|
|
+
|
|
+ FIND_SUITABLE(XF86ConfLayoutPtr, xf86configptr->conf_layout_lst, layout);
|
|
+ if (layout == NULL || xf86ScreenName != NULL) {
|
|
+ XF86ConfScreenPtr screen;
|
|
|
|
- if (xf86configptr->conf_layout_lst == NULL || xf86ScreenName != NULL) {
|
|
if (xf86ScreenName == NULL) {
|
|
xf86Msg(X_DEFAULT,
|
|
"No Layout section. Using the first Screen section.\n");
|
|
}
|
|
+ FIND_SUITABLE (XF86ConfScreenPtr, xf86configptr->conf_screen_lst, screen);
|
|
if (!configImpliedLayout(&xf86ConfigLayout,
|
|
- xf86configptr->conf_screen_lst,
|
|
+ screen,
|
|
xf86configptr)) {
|
|
xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
|
|
return CONFIG_PARSE_ERROR;
|
|
@@ -2451,16 +2470,13 @@ xf86HandleConfigFile(Bool autoconfig)
|
|
if (optlist && xf86FindOption(optlist, "defaultserverlayout"))
|
|
dfltlayout =
|
|
xf86SetStrOption(optlist, "defaultserverlayout", NULL);
|
|
- if (!configLayout
|
|
- (&xf86ConfigLayout, xf86configptr->conf_layout_lst,
|
|
- dfltlayout)) {
|
|
+ if (!configLayout(&xf86ConfigLayout, layout, dfltlayout)) {
|
|
xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
|
|
return CONFIG_PARSE_ERROR;
|
|
}
|
|
}
|
|
else {
|
|
- if (!configLayout(&xf86ConfigLayout, xf86configptr->conf_layout_lst,
|
|
- NULL)) {
|
|
+ if (!configLayout(&xf86ConfigLayout, layout, NULL)) {
|
|
xf86Msg(X_ERROR, "Unable to determine the screen layout\n");
|
|
return CONFIG_PARSE_ERROR;
|
|
}
|
|
diff --git a/hw/xfree86/parser/Device.c b/hw/xfree86/parser/Device.c
|
|
index 073171f..d3ac293 100644
|
|
--- a/hw/xfree86/parser/Device.c
|
|
+++ b/hw/xfree86/parser/Device.c
|
|
@@ -71,6 +71,7 @@ xf86ConfigSymTabRec DeviceTab[] = {
|
|
{RAMDAC, "ramdac"},
|
|
{DACSPEED, "dacspeed"},
|
|
{CLOCKS, "clocks"},
|
|
+ {MATCHSEAT, "matchseat"},
|
|
{OPTION, "option"},
|
|
{VIDEORAM, "videoram"},
|
|
{BIOSBASE, "biosbase"},
|
|
@@ -216,6 +217,11 @@ xf86parseDeviceSection(void)
|
|
Error(NUMBER_MSG, "TextClockFreq");
|
|
ptr->dev_textclockfreq = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
|
|
break;
|
|
+ case MATCHSEAT:
|
|
+ if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
|
|
+ Error(QUOTE_MSG, "MatchSeat");
|
|
+ ptr->match_seat = xf86_lex_val.str;
|
|
+ break;
|
|
case OPTION:
|
|
ptr->dev_option_lst = xf86parseOption(ptr->dev_option_lst);
|
|
break;
|
|
diff --git a/hw/xfree86/parser/Layout.c b/hw/xfree86/parser/Layout.c
|
|
index 7be746f..994b31a 100644
|
|
--- a/hw/xfree86/parser/Layout.c
|
|
+++ b/hw/xfree86/parser/Layout.c
|
|
@@ -70,6 +70,7 @@ static xf86ConfigSymTabRec LayoutTab[] = {
|
|
{ENDSECTION, "endsection"},
|
|
{SCREEN, "screen"},
|
|
{IDENTIFIER, "identifier"},
|
|
+ {MATCHSEAT, "matchseat"},
|
|
{INACTIVE, "inactive"},
|
|
{INPUTDEVICE, "inputdevice"},
|
|
{OPTION, "option"},
|
|
@@ -109,6 +110,11 @@ xf86parseLayoutSection(void)
|
|
ptr->lay_identifier = xf86_lex_val.str;
|
|
has_ident = TRUE;
|
|
break;
|
|
+ case MATCHSEAT:
|
|
+ if (xf86getSubToken(&(ptr->lay_comment)) != STRING)
|
|
+ Error(QUOTE_MSG, "MatchSeat");
|
|
+ ptr->match_seat = xf86_lex_val.str;
|
|
+ break;
|
|
case INACTIVE:
|
|
{
|
|
XF86ConfInactivePtr iptr;
|
|
diff --git a/hw/xfree86/parser/Screen.c b/hw/xfree86/parser/Screen.c
|
|
index fecd57c..0e9746a 100644
|
|
--- a/hw/xfree86/parser/Screen.c
|
|
+++ b/hw/xfree86/parser/Screen.c
|
|
@@ -198,6 +198,7 @@ xf86parseDisplaySubSection(void)
|
|
static xf86ConfigSymTabRec ScreenTab[] = {
|
|
{ENDSECTION, "endsection"},
|
|
{IDENTIFIER, "identifier"},
|
|
+ {MATCHSEAT, "matchseat"},
|
|
{OBSDRIVER, "driver"},
|
|
{MDEVICE, "device"},
|
|
{MONITOR, "monitor"},
|
|
@@ -236,6 +237,11 @@ xf86parseScreenSection(void)
|
|
Error(ONLY_ONE_MSG, "Identifier or Driver");
|
|
has_ident = TRUE;
|
|
break;
|
|
+ case MATCHSEAT:
|
|
+ if (xf86getSubToken(&(ptr->scrn_comment)) != STRING)
|
|
+ Error(QUOTE_MSG, "MatchSeat");
|
|
+ ptr->match_seat = xf86_lex_val.str;
|
|
+ break;
|
|
case OBSDRIVER:
|
|
if (xf86getSubToken(&(ptr->scrn_comment)) != STRING)
|
|
Error(QUOTE_MSG, "Driver");
|
|
diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h
|
|
index 8f855ac..c95423a 100644
|
|
--- a/hw/xfree86/parser/xf86Parser.h
|
|
+++ b/hw/xfree86/parser/xf86Parser.h
|
|
@@ -224,6 +224,7 @@ typedef struct {
|
|
int dev_screen;
|
|
XF86OptionPtr dev_option_lst;
|
|
char *dev_comment;
|
|
+ char *match_seat;
|
|
} XF86ConfDeviceRec, *XF86ConfDevicePtr;
|
|
|
|
typedef struct {
|
|
@@ -275,6 +276,7 @@ typedef struct {
|
|
XF86OptionPtr scrn_option_lst;
|
|
char *scrn_comment;
|
|
int scrn_virtualX, scrn_virtualY;
|
|
+ char *match_seat;
|
|
} XF86ConfScreenRec, *XF86ConfScreenPtr;
|
|
|
|
typedef struct {
|
|
@@ -366,6 +368,7 @@ typedef struct {
|
|
XF86ConfInactivePtr lay_inactive_lst;
|
|
XF86ConfInputrefPtr lay_input_lst;
|
|
XF86OptionPtr lay_option_lst;
|
|
+ char *match_seat;
|
|
char *lay_comment;
|
|
} XF86ConfLayoutRec, *XF86ConfLayoutPtr;
|
|
|
|
diff --git a/hw/xfree86/parser/xf86tokens.h b/hw/xfree86/parser/xf86tokens.h
|
|
index f751b7b..5c01ce7 100644
|
|
--- a/hw/xfree86/parser/xf86tokens.h
|
|
+++ b/hw/xfree86/parser/xf86tokens.h
|
|
@@ -87,6 +87,7 @@ typedef enum {
|
|
VENDOR,
|
|
DASH,
|
|
COMMA,
|
|
+ MATCHSEAT,
|
|
OPTION,
|
|
COMMENT,
|
|
|
|
--
|
|
1.8.4.5
|
|
|