[PATCH] multiseat with several videocards

Floris jkfloris at dds.nl
Mon Apr 7 06:09:23 PDT 2014


This patch is made by Oleg Samarin and was already mailed in September 2013
(http://lists.x.org/archives/xorg-devel/2013-September/037946.html)
I hope someone can apply this patch or give me a reason why it isn't.

Thanks,

jkfloris

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