[PATCH] multiseat with several videocards
Oleg Samarin
osamarin68 at gmail.com
Sat Sep 28 13:56:42 PDT 2013
Added capability of specifying "MatchSeat" option in the ServerLayout, the Device and the Screen sections for selecting default sections for the seat
---
hw/xfree86/common/xf86Bus.c | 4 ++--
hw/xfree86/common/xf86Config.c | 33 +++++++++++++++++++++++++--------
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 +
7 files changed, 49 insertions(+), 10 deletions(-)
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index e101537..91af72f 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -81,7 +81,7 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
if (drv->platformProbe != NULL) {
foundScreen = xf86platformProbeDev(drv);
}
- if (ServerIsNotSeat0())
+ if (ServerIsNotSeat0() && foundScreen)
return foundScreen;
#endif
@@ -201,7 +201,7 @@ xf86BusProbe(void)
{
#ifdef XSERVER_PLATFORM_BUS
xf86platformProbe();
- if (ServerIsNotSeat0())
+ if (ServerIsNotSeat0() && xf86_num_platform_devices > 0)
return;
#endif
#ifdef XSERVER_LIBPCIACCESS
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 74d5ed3..9ed8b02 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
@@ -1578,8 +1589,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);
@@ -1819,7 +1833,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,12 +2443,15 @@ xf86HandleConfigFile(Bool autoconfig)
/* First check if a layout section is present, and if it is valid. */
if (xf86configptr->conf_layout_lst == NULL || xf86ScreenName != NULL) {
+ XF86ConfScreenPtr screen;
+
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;
@@ -2442,6 +2459,9 @@ xf86HandleConfigFile(Bool autoconfig)
implicit_layout = TRUE;
}
else {
+ XF86ConfLayoutPtr layout;
+
+ FIND_SUITABLE(XF86ConfLayoutPtr, xf86configptr->conf_layout_lst, layout);
if (xf86configptr->conf_flags != NULL) {
char *dfltlayout = NULL;
pointer optlist = xf86configptr->conf_flags->flg_option_lst;
@@ -2449,16 +2469,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 bb1ba88..1f7ffdb 100644
--- a/hw/xfree86/parser/Device.c
+++ b/hw/xfree86/parser/Device.c
@@ -72,6 +72,7 @@ xf86ConfigSymTabRec DeviceTab[] = {
{RAMDAC, "ramdac"},
{DACSPEED, "dacspeed"},
{CLOCKS, "clocks"},
+ {MATCHSEAT, "matchseat"},
{OPTION, "option"},
{VIDEORAM, "videoram"},
{BIOSBASE, "biosbase"},
@@ -217,6 +218,11 @@ xf86parseDeviceSection(void)
Error(NUMBER_MSG, "TextClockFreq");
ptr->dev_textclockfreq = (int) (val.realnum * 1000.0 + 0.5);
break;
+ case MATCHSEAT:
+ if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
+ Error(QUOTE_MSG, "MatchSeat");
+ ptr->match_seat = 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 cbd8d24..e838a7c 100644
--- a/hw/xfree86/parser/Layout.c
+++ b/hw/xfree86/parser/Layout.c
@@ -71,6 +71,7 @@ static xf86ConfigSymTabRec LayoutTab[] = {
{ENDSECTION, "endsection"},
{SCREEN, "screen"},
{IDENTIFIER, "identifier"},
+ {MATCHSEAT, "matchseat"},
{INACTIVE, "inactive"},
{INPUTDEVICE, "inputdevice"},
{OPTION, "option"},
@@ -110,6 +111,11 @@ xf86parseLayoutSection(void)
ptr->lay_identifier = val.str;
has_ident = TRUE;
break;
+ case MATCHSEAT:
+ if (xf86getSubToken(&(ptr->lay_comment)) != STRING)
+ Error(QUOTE_MSG, "MatchSeat");
+ ptr->match_seat = val.str;
+ break;
case INACTIVE:
{
XF86ConfInactivePtr iptr;
diff --git a/hw/xfree86/parser/Screen.c b/hw/xfree86/parser/Screen.c
index f294ec4..009c4e9 100644
--- a/hw/xfree86/parser/Screen.c
+++ b/hw/xfree86/parser/Screen.c
@@ -199,6 +199,7 @@ xf86parseDisplaySubSection(void)
static xf86ConfigSymTabRec ScreenTab[] = {
{ENDSECTION, "endsection"},
{IDENTIFIER, "identifier"},
+ {MATCHSEAT, "matchseat"},
{OBSDRIVER, "driver"},
{MDEVICE, "device"},
{MONITOR, "monitor"},
@@ -237,6 +238,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 = 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 e7210e8..bb41c99 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.3.1
More information about the xorg-devel
mailing list