home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xibm.zip / common / ibmCmdArgs.c next >
C/C++ Source or Header  |  1991-09-20  |  13KB  |  569 lines

  1. /*
  2.  * $Id: ibmCmdArgs.c,v 1.1 1991/09/20 18:24:03 mtranle Exp $
  3.  *
  4.  * Copyright IBM Corporation 1987,1988,1989
  5.  *
  6.  * All Rights Reserved
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose and without fee is hereby granted,
  10.  * provided that the above copyright notice appear in all copies and that 
  11.  * both that copyright notice and this permission notice appear in
  12.  * supporting documentation, and that the name of IBM not be
  13.  * used in advertising or publicity pertaining to distribution of the
  14.  * software without specific, written prior permission.
  15.  *
  16.  * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  17.  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  18.  * IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  19.  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  21.  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  22.  * SOFTWARE.
  23.  *
  24. */
  25.  
  26. #include "X.h"
  27. #include "cursorstr.h"
  28. #include "miscstruct.h"
  29. #include "scrnintstr.h"
  30.  
  31. #include "ibmCmdArgs.h"
  32. #include "ibmScreen.h"
  33.  
  34. #include "OSio.h"
  35.  
  36. #include "ibmTrace.h"
  37.  
  38. /* Command-Line Globals */
  39. int ibmDontZap = FALSE ;
  40.  
  41. typedef struct argumentDescriptor {
  42.     char *argString ;
  43.     char *usageString ;
  44.     int (*processFunc)() ;
  45. } ArgumentStr ;
  46.  
  47. #ifndef DISABLE_ADDITIONAL_SCREENS
  48. ibmPerScreenInfo *(*ibmAdditionalScreenArg)();
  49. #endif
  50.  
  51. /***====================================================================***/
  52.  
  53. #if !defined(IBM_MUST_USE_HDWR) && defined(ibm032)
  54. static int
  55. doUseHardwareArg( myArg )
  56.      char **myArg ;
  57. {
  58.     ibmUseHardware = FALSE ;
  59.     return 1 ;
  60. }
  61. #endif
  62.  
  63. #ifdef IBM_SPECIAL_MALLOC
  64. static int
  65. doMallocArg( myArg )
  66.      char **myArg ;
  67. {
  68.     int lvl = atoi( myArg[1] ) ;
  69.  
  70.     SetMallocCheckLevel( lvl ) ;
  71.     ibmInfoMsg( "allocator check level set to %d...\n", lvl ) ;
  72.     return 2 ;            /* Swallow An Extra Argument */
  73. }
  74.  
  75. static int
  76. doPlumberArg( myArg )
  77.      char **myArg ;
  78. {
  79.     ibmSetupPlumber( myArg[1] ) ;
  80.     return 2 ;            /* Swallow An Extra Argument */
  81. }
  82. #endif
  83.  
  84. static int
  85. doOpenAllScreens( myArg )
  86.      char **myArg ;
  87. {
  88.     ibmOpenAllScreens = TRUE ;
  89.     return 1 ;
  90. }
  91.  
  92. #if defined( IBM_BS_FLAGS )
  93. static int
  94. processDashBS( myArg )
  95.      char **myArg ;
  96. {
  97.     ibmAllowBackingStore = 1 ;
  98.     return 1 ;
  99. }
  100.  
  101. static int
  102. processDashNoBS( myArg )
  103.      char **myArg ;
  104. {
  105.     ibmAllowBackingStore = 0 ;
  106.     return 1 ;
  107. }
  108. #endif /* IBM_BS_FLAGS */
  109.  
  110. #if defined(AIXrt) || defined(AIXps2)
  111. static int
  112. dontZap( myArg )
  113.      char **myArg ;
  114. {
  115.     ibmDontZap = TRUE ;
  116.     return 1 ;
  117. }
  118.  
  119. static int
  120. processKeyClick( myArg )
  121.      char **myArg ;
  122. {
  123.     if ( ( myArg[ 1 ][ 0 ] >= '0') && ( myArg[ 1 ][ 0 ] <= '9' ) )
  124.     *myArg = "c" ;
  125.     return 0 ;
  126. }
  127.  
  128. static int
  129. processRGBpath( myArg )
  130.      char **myArg ;
  131. {
  132.     extern char *rgbPath ;
  133.     return ( rgbPath = myArg[1] ) ? 2 : 0 ;
  134. }
  135. #endif /* AIXrt or AIXps2 */
  136.  
  137. #if defined(IBM_GSL)
  138. static int
  139. processGSLscreen( myArg )
  140.      char **myArg ;
  141. {
  142.     extern char *gslCommandLineScreenOption ;
  143.     return ( gslCommandLineScreenOption = myArg[1] ) ? 2 : 0 ;
  144. }
  145. #endif
  146.  
  147. #ifdef IBM_OS_HAS_HFT
  148. /* HFT GLOBALS */
  149. extern int AIXMouseChordDelay ;
  150. extern int ibmRefreshOnActivate ;
  151. extern char *display ;
  152.  
  153. static int
  154. processHFTmouseDelay( myArg )
  155.      char **myArg ;
  156. {
  157.     if ( myArg[1] && myArg[1][0] >= '0' && myArg[1][0] <= '9' )
  158.     {
  159.     AIXMouseChordDelay = atoi( myArg[1] ) ;
  160.     return 2 ;        /* Swallow An Extra Argument */
  161.     }
  162.     else
  163.     return 0 ;
  164. }
  165.  
  166. static int
  167. processAIXdisplaySpec( myArg )
  168.      char **myArg ;
  169. {
  170.     char *dpy= myArg[1] ;
  171.  
  172.     if ( !dpy )
  173.     {
  174.     ErrorF( "must specify display number after -n\n" ) ;
  175.     UseMsg() ;
  176.     exit( 1 ) ;
  177.     }
  178.     if ( dpy[0] == ':' )
  179.     display = &dpy[1] ;
  180.     else
  181.     {
  182.     ErrorF( "display specification must begin with ':'\n" ) ;
  183.     UseMsg() ;
  184.     exit( 1 ) ;
  185.     }
  186.     return 2 ;            /* Swallow An Extra Argument */
  187. }
  188.  
  189. static int
  190. processRefreshArg( myArg )
  191.      char **myArg ;
  192. {
  193.     ibmRefreshOnActivate = 1 ;
  194.     return 1 ;
  195. }
  196.  
  197. static int
  198. processRepaintArg( myArg )
  199.      char **myArg ;
  200. {
  201.     ibmRefreshOnActivate = 0 ;
  202.     return 1 ;
  203. }
  204. #endif /* IBM_OS_HAS_HFT */
  205.  
  206. static int
  207. dolockKey( myArg )
  208.      char **myArg ;
  209. {
  210.     ibmLockEnabled = 1 ;
  211.     return 1 ;
  212. }
  213.  
  214. static int
  215. doNolockKey( myArg )
  216.      char **myArg ;
  217. {
  218.     ibmLockEnabled = 0 ;
  219.     return 1 ;
  220. }
  221.  
  222. static int
  223. doPCkeys( myArg )
  224.      char **myArg ;
  225. {
  226.     ibmUsePCKeys = 1 ;
  227.     return 1 ;
  228. }
  229.  
  230. static int
  231. doRTkeys( myArg )
  232.      char **myArg ;
  233. {
  234.     ibmUsePCKeys = 0 ;
  235.     return 1 ;
  236. }
  237.  
  238. #ifdef TRACE_X
  239. static int
  240. doTrace( myArg )
  241.      char **myArg ;
  242. {
  243.     ibmTrace = TRUE ;
  244.     return 1 ;
  245. }
  246. #endif
  247.  
  248. static int
  249. setQuiet( myArg )
  250.      char **myArg ;
  251. {
  252.     ibmQuietFlag = 1 ;
  253.     return 1 ;
  254. }
  255.  
  256. static int
  257. setVerbose( myArg )
  258.      char **myArg ;
  259. {
  260.     ibmQuietFlag = 0 ;
  261.     return 1 ;
  262. }
  263.  
  264. static int
  265. setWrapX( myArg )
  266.      char **myArg ;
  267. {
  268.     ibmXWrapScreen = TRUE ;
  269.     return 1 ;
  270. }
  271.  
  272. static int
  273. setWrapY( myArg )
  274.      char **myArg ;
  275. {
  276.     ibmYWrapScreen = TRUE ;
  277.     return 1 ;
  278. }
  279.  
  280. static int
  281. setWrapXY( myArg )
  282.      char **myArg ;
  283. {
  284.     ibmXWrapScreen = ibmYWrapScreen = TRUE ;
  285.     return 1 ;
  286. }
  287.  
  288. static int
  289. getWhitePixelText( myArg )
  290.      char **myArg ;
  291. {
  292.     return ( ibmWhitePixelText = myArg[1] ) ? 2 : 0 ;
  293. }
  294.  
  295. static int
  296. getBlackPixelText( myArg )
  297.      char **myArg ;
  298. {
  299.     return ( ibmBlackPixelText = myArg[1] ) ? 2 : 0 ;
  300. }
  301.  
  302. #if defined(AIXrt) || defined(AIXps2)
  303. #define REALLY_DIX_ARG( string ) string
  304. #else /* BSD */
  305. #define REALLY_DIX_ARG( string ) ( (char *) 0 )
  306. #endif
  307.  
  308. ArgumentStr osCmdArgTable[] = {
  309. #if defined(AIXrt)
  310.     { "-m",
  311.       "   -m              use monochrome display characteristics\n",
  312.      (int (*)()) 0 },
  313. #endif
  314.     { "-bp",
  315.       "   -bp <color>     specify a BlackPixel color\n",
  316.       getBlackPixelText },
  317.     { "-wp",
  318.       "   -wp <color>     specify a WhitePixel color\n",
  319.       getWhitePixelText },
  320. #if defined(AIXrt) || defined(AIXps2)
  321.     { "-a",
  322.       "   -a  <accel>     specify the mouse acceleration\n",
  323.       (int (*)()) 0 }, /* DIX Argument */
  324.     { "-c",
  325.       "   -c  <volume>    specify the key click volume\n",
  326.       processKeyClick },
  327.     { "-D",
  328.       "   -D  <file>      specify the color definition data base file\n",
  329.       processRGBpath },
  330.     { "-f",
  331.       "   -f  <volume>    specify the beep volume\n",
  332.       (int (*)()) 0 }, /* DIX Argument */
  333.     { "-fc",
  334.       "   -fc <font>      specify the font for cursor glyphs and masks\n",
  335.       (int (*)()) 0 }, /* DIX Argument */
  336.     { "-fn",
  337.       "   -fn <font>      specify the default text font\n",
  338.       (int (*)()) 0 }, /* DIX Argument */
  339.     { "-fp",
  340.       "   -fp <path>      specify the search path for fonts\n",
  341.       (int (*)()) 0 }, /* DIX Argument */
  342. #if 0
  343.     { "-n",
  344.       "   -n :<num>       specify the connection number\n",
  345.       processAIXdisplaySpec },
  346. #endif
  347.     { "-p",
  348.       "   -p  <interval>  specify the screen saver interval\n",
  349.       (int (*)()) 0 }, /* DIX Argument */
  350.     { "-s",
  351.       "   -s <delay>      specify the screen saver delay\n",
  352.       (int (*)()) 0 }, /* DIX Argument */
  353.     { "-t",
  354.       "   -t <threshold>  specify the mouse threshold\n",
  355.       (int (*)()) 0 }, /* DIX Argument */
  356.     { "-to",
  357.       "   -to <time>      specify the time between connection checks\n",
  358.       (int (*)()) 0 }, /* DIX Argument */
  359.     { "-r",
  360.       "   -r              disables auto repeat\n",
  361.       (int (*)()) 0 }, /* DIX Argument */
  362.     { "-T",
  363.       "   -T              disable the Ctrl-Alt-Backspace key sequence\n",
  364.       dontZap },
  365.     { "-v",
  366.       "   -v              activate screen saver with background color\n",
  367.       (int (*)()) 0 }, /* DIX Argument */
  368. #endif
  369.     { "-lock",
  370.       "   -lock           enable caps lock key (default)\n",
  371.       dolockKey },
  372.     { "-nolock",
  373.       "   -nolock         disable caps lock key\n",
  374.       doNolockKey },
  375. #if !defined(NO_SECRETS)
  376. #if defined(IBM_OS_HAS_HFT)
  377. #if defined(IBM_GSL)
  378.     { "-dd",
  379.       "   -dd <ScreenID>  use screen of type <ScreenID> for gsl device\n",
  380.       processGSLscreen },
  381. #endif
  382.     { "-mdelay",
  383.       "   -mdelay <count> set delay for middle button chord (default 10)\n",
  384.       processHFTmouseDelay },
  385. #endif
  386.     { "-quiet",
  387.       "   -quiet          do not print information messages (default)\n",
  388.       setQuiet },
  389.     { "-verbose",
  390.       "   -verbose        print information messages\n",
  391.       setVerbose },
  392.     { "-rtkeys",
  393.       "   -rtkeys         use CAPS LOCK and CTRL as labelled (default)\n",
  394.       doRTkeys },
  395.     { "-pckeys",
  396.       "   -pckeys         swap CAPS LOCK and CTRL (for touch typists)\n",
  397.       doPCkeys },
  398. #if defined( IBM_BS_FLAGS )
  399.     { "-bs",
  400.       "   -bs             enable backing store (default)\n",
  401.       processDashBS },
  402.     { "-nobs",
  403.       "   -nobs           disable backing store\n",
  404.       processDashNoBS },
  405. #endif /* IBM_BS_FLAGS */
  406. #if defined(IBM_OS_HAS_HFT)
  407.     { "-refresh",
  408.       "   -refresh        refresh clients to restore HFT\n",
  409.       processRefreshArg },
  410.     { "-repaint",
  411.       "   -repaint        repaint to restore HFT (default)\n",
  412.       processRepaintArg },
  413. #endif
  414. #if !defined(IBM_MUST_USE_HDWR) && defined(ibm032)
  415.     { "-nohdwr",
  416.       "   -nohdwr         use generic functions where applicable\n",
  417.       doUseHardwareArg },
  418. #endif
  419. #ifdef IBM_SPECIAL_MALLOC
  420.     { "-malloc",
  421.       "   -malloc [0-5]   set malloc check level\n",
  422.       doMallocArg },
  423.     { "-plumber",
  424.       "   -plumber <file> dump malloc arena to named file\n",
  425.       doPlumberArg },
  426. #endif
  427. #ifdef TRACE_X
  428.     { "-trace",
  429.       "   -trace          trace execution of IBM specific functions\n",
  430.       doTrace },
  431. #endif /* TRACE_X */
  432.     { "-wrap",
  433.       "   -wrap           wrap mouse in both dimensions\n",
  434.       setWrapXY },
  435.     { "-wrapx",
  436.       "   -wrapx          wrap mouse in X only\n",
  437.       setWrapX },
  438.     { "-wrapy",
  439.       "   -wrapy          wrap mouse in Y only\n",
  440.       setWrapY },
  441. /* This MUST be last, i.e. just before screen processing */
  442.     { "-all",
  443.       (char *) 0, /* The use string is hard-wired below !! */
  444.       doOpenAllScreens },
  445. #endif
  446.     { 0, 0, 0 }
  447. } ;
  448.  
  449. int osCmdArgTableSize = ( sizeof osCmdArgTable / sizeof (ArgumentStr) ) - 1 ;
  450.  
  451. /***==================================================================***/
  452.  
  453. void
  454. ddxUseMsg()
  455. {
  456.     ArgumentStr *argDescPtr ;
  457.     int i = osCmdArgTableSize ;
  458.  
  459. #if defined(AIXrt) || defined(AIXps2)
  460.     ErrorF( "The \"X\" command accepts the following flags:\n" ) ;
  461. #endif
  462.  
  463.     ErrorF( "Recognized screens are:\n" ) ;
  464.     ErrorF( "    -all           opens all attached, supported screens\n" ) ;
  465.     for ( i = 0 ; ibmPossibleScreens[i] ; i++ )
  466.     {
  467.     ErrorF( "    %s\n", ibmPossibleScreens[i]->ibm_ScreenFlag ) ;
  468.     }
  469.     ErrorF( "Other device dependent options are:\n" ) ;
  470.     for ( argDescPtr = &osCmdArgTable[0], i = osCmdArgTableSize ;
  471.      i-- ;
  472.      argDescPtr++ )
  473.     if ( argDescPtr->usageString )
  474.         ErrorF( argDescPtr->usageString ) ;
  475.     ErrorF( "See the X User's Guide or X server manual page for more information\n" ) ;
  476.     return ;
  477. }
  478.  
  479. int
  480. ddxProcessArgument( argc, argv, i )
  481.      int argc ;
  482.      char **argv ;
  483.      int i ;
  484. {
  485.     ArgumentStr *argDescPtr ;
  486.     int swallowed ;
  487.     int j ;
  488.     int skip ;
  489.  
  490.     for ( argv += i, argc -= i, skip = 0, swallowed = 1 ; swallowed && argc ;)
  491.     {
  492.     for (swallowed = 0, argDescPtr = &osCmdArgTable[0],
  493.          j = osCmdArgTableSize ;
  494.          !swallowed && j-- ;
  495.          argDescPtr++ )
  496.     {
  497.         if ( !strcmp( *argv, argDescPtr->argString ) )
  498.         {
  499.         if (!argDescPtr->processFunc ||
  500.             !( swallowed = (* argDescPtr->processFunc)( argv ) ) )
  501.             return skip ;
  502.         else         /* Done with this arg */
  503.         {
  504.             skip += swallowed ;
  505.             argc -= swallowed ;
  506.             argv += swallowed ;
  507.         }
  508.         }
  509.     }
  510.     /* Only remaining possibility is the name of a display */
  511.     /* Now Check If it's a Screen Name */
  512.     if ( !swallowed )
  513.     {
  514.         ibmPerScreenInfo **ppScr = ibmPossibleScreens ;
  515.         ibmPerScreenInfo  *pScr ;
  516.  
  517.         while ( ( pScr = *ppScr++ ) && pScr->ibm_ScreenFlag )
  518.         {
  519.         if ( !( swallowed = strcmp( *argv, pScr->ibm_ScreenFlag ) ) )
  520.         {
  521.             ibmScreensWanted++ ;
  522.             if ((pScr->ibm_ScreenFD = (*(pScr->ibm_ProbeFunc))()) >= 0)
  523.             ibmScreens[ibmNumScreens++] = pScr ;
  524.             else
  525.             ErrorF( "%s not available\n", *argv + 1 ) ;
  526.             break ;    /* We Found The Display Name */
  527.         }
  528.         }
  529. #ifndef DISABLE_ADDITIONAL_SCREENS
  530.         if (swallowed && (ibmAdditionalScreenArg))
  531.         {
  532.         ibmInfoMsg("Looking for vendor displays...\n");
  533.         pScr = (*ibmAdditionalScreenArg)(*argv);
  534.         if (pScr)
  535.         {
  536.             swallowed = 0; /* flag this guy finished */
  537.             ibmScreensWanted++ ;
  538.             if ((pScr->ibm_ScreenFD = (*(pScr->ibm_ProbeFunc))()) >= 0)
  539.             ibmScreens[ibmNumScreens++] = pScr ;
  540.             else
  541.             ErrorF( "%s not available\n", *argv + 1 ) ;
  542.         }
  543.         }
  544. #endif /* DISABLE_ADDITIONAL_SCREENS */
  545.         if ( swallowed )
  546.         {
  547. #if defined(DYNAMIC_LINK_SCREENS)
  548.         /* No More pre-linked screens! Try dynamic linking. */
  549.         if ( pScr = ibmDynamicScreenAttach( *argv ) )
  550.         {
  551.             ibmScreens[ ibmNumScreens++ ] = pScr ;
  552.         }
  553.         else
  554. #endif
  555.             /* We Have Used Up ALL Of The Possible Argument Strings
  556.              * Then This Doesn't Belong To Us.
  557.              * So It's Time To Return.
  558.              */
  559.             return skip ;
  560.         }
  561.         else
  562.         skip++ ;
  563.     }
  564.     /* Process Next Argument */
  565.     }
  566.  
  567.     return skip ;
  568. }
  569.