Hello!

Sometimes ago I made a patch that allows to configure Devices, Screens
and Layouts belonging to the different seats in a multi-seat
environment. It is useful for the setting up with several videocards
using propritery drivers (I've tested with Nvidia).

Because my patch has not been sesolved upstream, I resend it again
adopted to the current master.

Oleg.
>From 8a897e8d29a53daf91e21904dc243be4d9025014 Mon Sep 17 00:00:00 2001
From: Oleg Samarin <osamari...@gmail.com>
Date: Thu, 27 Mar 2014 23:47:42 +0400
Subject: [PATCH] config by seat

Added capability of specifying "MatchSeat" option in the ServerLayout, the Device and the Screen sections for selecting default sections for the seatmultiseat: capability of splitting xconfig objects across seats
---
 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 +
 6 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 542d5ab..e5fa8fc 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);
     }
@@ -2431,12 +2445,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;
@@ -2444,6 +2461,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;
             void *optlist = xf86configptr->conf_flags->flg_option_lst;
@@ -2451,16 +2471,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.5.3

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to