Annotation of researchv9/X11/src/X.V11R1/clients/xset/xset.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * $header: xset.c,v 1.18 87/07/11 08:47:46 dkk Locked $ 
        !             3:  * $Locker:  $ 
        !             4:  */
        !             5: #include <X11/copyright.h>
        !             6: 
        !             7: /* Copyright    Massachusetts Institute of Technology    1985  */
        !             8: 
        !             9: #ifndef lint
        !            10: static char *rcsid_xset_c = "$Header: xset.c,v 1.22 87/09/12 23:14:10 toddb Exp $";
        !            11: #endif
        !            12: 
        !            13: #include <X11/X.h>      /*  Should be transplanted to X11/Xlibwm.h     %*/
        !            14: #include <X11/Xlib.h>
        !            15: /*  #include <X11/Xlibwm.h>  [Doesn't exist yet  5-14-87]  %*/
        !            16: #include <X11/keysym.h>
        !            17: #include <stdio.h>
        !            18: #include <netdb.h>
        !            19: #include <netinet/in.h>
        !            20: #include <strings.h>
        !            21: #include <ctype.h>
        !            22: 
        !            23: #define ON 1
        !            24: #define OFF 0
        !            25: 
        !            26: #define DONT_CHANGE -2
        !            27: 
        !            28: #define ALL -1
        !            29: #define TIMEOUT 1
        !            30: #define INTERVAL 2
        !            31: #define PREFER_BLANK 3
        !            32: #define ALLOW_EXP 4
        !            33: 
        !            34: #define        nextarg(i, argv) \
        !            35:        argv[i]; \
        !            36:        if (i >= argc) \
        !            37:                break; \
        !            38: 
        !            39: char *progName;
        !            40: 
        !            41: main(argc, argv)
        !            42: int argc;
        !            43: char **argv;
        !            44: {
        !            45: register char *arg;
        !            46: register int i;
        !            47: int percent;
        !            48: int acc_num, acc_denom, threshold;
        !            49: XKeyboardControl values;
        !            50: unsigned long pixels[512];
        !            51: caddr_t colors[512];
        !            52: XColor def;
        !            53: int numpixels = 0;
        !            54: char *disp = '\0';
        !            55: Display *dpy;
        !            56: if (argc == 1)  usage(argv[0]); /* To be replaced by window-interface */
        !            57: progName = argv[0];
        !            58: for (i = 1; i < argc; ) {
        !            59:   arg = argv[i++];
        !            60:   if (index(arg, ':')) {     /*  Set display name if given by user.  */
        !            61:     disp = arg;
        !            62:   } 
        !            63: }
        !            64: dpy = XOpenDisplay(disp);  /*  Open display and check for success */
        !            65: if (dpy == NULL) {
        !            66:   fprintf(stderr, "%s: Can't open display '%s'\n",
        !            67:          argv[0], XDisplayName(disp ? disp : NULL ));
        !            68:   exit(1);
        !            69: }
        !            70: for (i = 1; i < argc; ) {
        !            71:   arg = argv[i++];
        !            72:   if (index(arg, ':')) {     /*  Set display name if given by user.  */
        !            73:        ; /* forget this */
        !            74:   } else if (*arg == '-' && *(arg + 1) == 'c'){ /* Does arg start with "-c"? */
        !            75:     set_click(dpy, 0);           /* If so, turn click off and  */
        !            76:   } 
        !            77:   else if (*arg == 'c') {         /* Well, does it start with "c", then? */
        !            78:     percent = -1;   /* Default click volume.      */
        !            79:     arg = nextarg(i, argv);
        !            80:     if (strcmp(arg, "on") == 0) {               /* Let click be default. */
        !            81:       i++;
        !            82:     } 
        !            83:     else if (strcmp(arg, "off") == 0) {  
        !            84:       percent = 0;       /* Turn it off.          */
        !            85:       i++;
        !            86:     } 
        !            87:     else if (isnumber(arg, 100)) {
        !            88:       percent = atoi(arg);  /* Set to spec. volume */
        !            89:       i++;
        !            90:     }
        !            91:     set_click(dpy, percent);
        !            92:   } 
        !            93:   else if (*arg == '-' && *(arg + 1) == 'b') {  /* Does arg start w/ "-b" */
        !            94:     set_bell_vol(dpy, 0);           /* Then turn off bell.    */
        !            95:   } 
        !            96:   else if (*arg == 'b') {                       /* Does it start w/ "b".  */
        !            97:     percent = -1;             /* Set bell to default.   */
        !            98:     arg = nextarg(i, argv);
        !            99:     if (strcmp(arg, "on") == 0) {               /* Let it stay that way.  */
        !           100:       set_bell_vol(dpy, percent);
        !           101:       i++;
        !           102:     } 
        !           103:     else if (strcmp(arg, "off") == 0) {
        !           104:       percent = 0;            /* Turn the bell off.     */
        !           105:       set_bell_vol(dpy, percent);
        !           106:       i++;
        !           107:     } 
        !           108:     else if (isnumber(arg, 100)) {              /* If volume is given:    */
        !           109:       percent = atoi(arg);    /* set bell appropriately.*/
        !           110:       set_bell_vol(dpy, percent);
        !           111:       i++;
        !           112:       arg = nextarg(i, argv);
        !           113: 
        !           114:       if (isnumber(arg, 20000)) {               /* If pitch is given:     */
        !           115:        set_bell_pitch(dpy, atoi(arg));    /* set the bell.           */
        !           116:        i++;
        !           117: 
        !           118:        arg = nextarg(i, argv);
        !           119:        if (isnumber(arg, 1000)) {              /* If duration is given:  */
        !           120:          set_bell_dur(dpy, atoi(arg));  /*  set the bell.      */
        !           121:          i++;
        !           122:        }
        !           123:       }
        !           124:     }
        !           125:   }
        !           126:   else if (strcmp(arg, "fp") == 0) {          /* set font path */
        !           127:     arg = nextarg(i, argv);
        !           128:     set_font_path(dpy, arg);
        !           129:     i++;
        !           130:   }
        !           131:   else if (strcmp(arg, "-led") == 0) {         /* Turn off one or all LEDs */
        !           132:     values.led_mode = OFF;
        !           133:     values.led = ALL;        /* None specified */
        !           134:     arg = nextarg(i, argv);
        !           135:     if (isnumber(arg, 32) && atoi(arg) > 0) {
        !           136:       values.led = atoi(arg);
        !           137:       i++;
        !           138:     }
        !           139:     set_led(dpy, values.led, values.led_mode);
        !           140:   } 
        !           141:   else if (strcmp(arg, "led") == 0) {         /* Turn on one or all LEDs  */
        !           142:     values.led_mode = ON;
        !           143:     values.led = ALL;
        !           144:     arg = nextarg(i, argv);
        !           145:     if (strcmp(arg, "on") == 0) {
        !           146:       i++;
        !           147:     } 
        !           148:     else if (strcmp(arg, "off") == 0) {       /*  ...except in this case. */
        !           149:        values.led_mode = OFF;
        !           150:       i++;
        !           151:     }
        !           152:     else if (isnumber(arg, 32) && atoi(arg) > 0) {
        !           153:       values.led = atoi(arg);
        !           154:       i++;
        !           155:     }
        !           156:     set_led(dpy, values.led, values.led_mode);
        !           157:   }
        !           158: /*  Set pointer (mouse) settings:  Acceleration and Threshold. */
        !           159:   else if (strcmp(arg, "m") == 0 || strcmp(arg, "mouse") == 0) {
        !           160:     acc_num = -1;
        !           161:     acc_denom = -1;     /*  Defaults */
        !           162:     threshold = -1;
        !           163:     if (i >= argc){
        !           164:       set_mouse(dpy, acc_num, acc_denom, threshold);
        !           165:       break;
        !           166:     }
        !           167:     arg = argv[i];
        !           168:     if (strcmp(arg, "default") == 0) {
        !           169:       i++;
        !           170:     } 
        !           171:     else if (*arg >= '0' && *arg <= '9') {
        !           172:       acc_num = atoi(arg);  /* Set acceleration to user's tastes.  */
        !           173:       i++;
        !           174:       if (i >= argc) {
        !           175:        set_mouse(dpy, acc_num, acc_denom, threshold);
        !           176:        break;
        !           177:       }
        !           178:       arg = argv[i];
        !           179:       if (*arg >= '0' && *arg <= '9') {
        !           180:        threshold = atoi(arg);  /* Set threshold as user specified.  */
        !           181:        i++;
        !           182:       }
        !           183:     }
        !           184:       set_mouse(dpy, acc_num, acc_denom, threshold);
        !           185:   } 
        !           186:   else if (*arg == 's') {   /*  If arg starts with "s".  */
        !           187:     if (i >= argc) {
        !           188:       set_saver(dpy, ALL, 0);  /* Set everything to default  */
        !           189:       break;
        !           190:     }
        !           191:     arg = argv[i];
        !           192:     if (strcmp(arg, "blank") == 0) {       /* Alter blanking preference. */
        !           193:       set_saver(dpy, PREFER_BLANK, PreferBlanking);
        !           194:       i++;
        !           195:     }
        !           196:     else if (strcmp(arg, "noblank") == 0) {     /*  Ditto.  */
        !           197:       set_saver(dpy, PREFER_BLANK, DontPreferBlanking);
        !           198:       i++;
        !           199:     }
        !           200:     else if (strcmp(arg, "off") == 0) {
        !           201:       set_saver(dpy, TIMEOUT, 0);   /*  Turn off screen saver.  */
        !           202:       i++;
        !           203:       if (i >= argc)
        !           204:        break;
        !           205:       arg = argv[i];
        !           206:       if (strcmp(arg, "off") == 0) {
        !           207:        set_saver(dpy, INTERVAL, 0);
        !           208:        i++;
        !           209:       }
        !           210:     }
        !           211:     else if (strcmp(arg, "default") == 0) {    /*  Leave as default.       */
        !           212:       set_saver(dpy, ALL, 0);
        !           213:       i++;
        !           214:     } 
        !           215:     else if (*arg >= '0' && *arg <= '9') {  /*  Set as user wishes.   */
        !           216:       set_saver(dpy, TIMEOUT, atoi(arg));
        !           217:       i++;
        !           218:       if (i >= argc)
        !           219:        break;
        !           220:       arg = argv[i];
        !           221:       if (*arg >= '0' && *arg <= '9') {
        !           222:        set_saver(dpy, INTERVAL, atoi(arg));
        !           223:        i++;
        !           224:       }
        !           225:     }
        !           226:   } 
        !           227:   else if(*arg == '-' && *(arg + 1) == 'r'){ /* If arg starts w/ "-r" */
        !           228:     set_repeat(dpy, ALL, OFF);
        !           229:   } 
        !           230:   else if (*arg == 'r') {            /*  If it starts with "r"        */
        !           231:     if (i >= argc) {
        !           232:       set_repeat(dpy, ALL, ON);
        !           233:       break;
        !           234:     }
        !           235:     arg = argv[i];                   /*  Check next argument.         */
        !           236:     if (strcmp(arg, "on") == 0) {
        !           237:       set_repeat(dpy, ALL, ON);
        !           238:       i++;
        !           239:     } 
        !           240:     else if (strcmp(arg, "off") == 0) {
        !           241:       set_repeat(dpy, ALL, OFF);
        !           242:       i++;
        !           243:     }
        !           244:   } 
        !           245:   else if (*arg == 'p') {           /*  If arg starts with "p"       */
        !           246:     if (i + 1 >= argc)
        !           247:       usage(argv[0]);
        !           248:     arg = argv[i];
        !           249:     if (*arg >= '0' && *arg <= '9')
        !           250:       pixels[numpixels] = atoi(arg);
        !           251:     else
        !           252:       usage(argv[0]);
        !           253:     i++;
        !           254:     colors[numpixels] = argv[i];
        !           255:     i++;
        !           256:     numpixels++;
        !           257:     set_pixels(dpy, pixels, colors, numpixels);
        !           258:   }
        !           259:   else if (*arg == '-' && *(arg + 1) == 'k') {
        !           260:     set_lock(dpy, OFF);
        !           261:   }
        !           262:   else if (*arg == 'k') {         /*  Set modifier keys.               */
        !           263:     set_lock(dpy, ON);
        !           264:   }
        !           265:   else if (*arg == 'q') {         /*  Give status to user.             */
        !           266:     query(dpy);
        !           267:   }
        !           268:   else
        !           269:     usage(argv[0]);
        !           270: }
        !           271: 
        !           272: XFlush(dpy);
        !           273: 
        !           274: exit(0);    /*  Done.  We can go home now.  */
        !           275: }
        !           276: 
        !           277: 
        !           278: isnumber(arg, maximum)
        !           279:        char *arg;
        !           280:        int maximum;
        !           281: {
        !           282:        register char *p;
        !           283: 
        !           284:        if (arg[0] == '-' && arg[1] == '1' && arg[2] == '\0')
        !           285:                return(1);
        !           286:        for (p=arg; isdigit(*p); p++);
        !           287:        if (*p || atoi(arg) > maximum)
        !           288:                return(0)        !           289:        return(1);
        !           290: }
        !           291: 
        !           292: /*  These next few functions do the real work (xsetting things).
        !           293:  */
        !           294: set_click(dpy, percent)
        !           295: Display *dpy;
        !           296: int percent;
        !           297: {
        !           298: XKeyboardControl values;
        !           299: values.key_click_percent = percent;
        !           300: XChangeKeyboardControl(dpy, KBKeyClickPercent, &values);
        !           301: return;
        !           302: }
        !           303: 
        !           304: set_bell_vol(dpy, percent)
        !           305: Display *dpy;
        !           306: int percent;
        !           307: {
        !           308: XKeyboardControl values;
        !           309: values.bell_percent = percent;
        !           310: XChangeKeyboardControl(dpy, KBBellPercent, &values);
        !           311: return;
        !           312: }
        !           313: 
        !           314: set_bell_pitch(dpy, pitch)
        !           315: Display *dpy;
        !           316: int pitch;
        !           317: {
        !           318: XKeyboardControl values;
        !           319: values.bell_pitch = pitch;
        !           320: XChangeKeyboardControl(dpy, KBBellPitch, &values);
        !           321: return;
        !           322: }
        !           323: 
        !           324: set_bell_dur(dpy, duration)
        !           325: Display *dpy;
        !           326: int duration;
        !           327: {
        !           328: XKeyboardControl values;
        !           329: values.bell_duration = duration;
        !           330: XChangeKeyboardControl(dpy, KBBellDuration, &values);
        !           331: return;
        !           332: }
        !           333: 
        !           334: set_font_path(dpy, path)
        !           335:     Display *dpy;
        !           336:     char *path;
        !           337: {
        !           338:     char **directoryList = NULL; int ndirs = 0;
        !           339:     char *directories;
        !           340:     char *pDir;
        !           341: 
        !           342:     if (strcmp(path, "default")!=0) {
        !           343:         if (((directories = (char *)malloc( strlen(path) )) == NULL) ||
        !           344:            ((directoryList = (char **)malloc(sizeof(char *))) == NULL))
        !           345:            error( "out of memory" );
        !           346: 
        !           347:        strcpy( directories, path );
        !           348:        *directoryList = pDir = directories;
        !           349:        ndirs++;
        !           350:        while( (pDir = index(pDir, ',')) != NULL) {
        !           351:            *pDir++ = '\0';
        !           352:            directoryList = (char **)realloc(directoryList, 
        !           353:                                             (ndirs+1)*sizeof(char *));
        !           354:            if (directoryList == NULL) error( "out of memory" );
        !           355:            directoryList[ndirs++] = pDir;
        !           356:        }
        !           357:     }
        !           358: 
        !           359:     XSetFontPath( dpy, directoryList, ndirs );
        !           360: }
        !           361: 
        !           362: set_led(dpy, led, led_mode)
        !           363: Display *dpy;
        !           364: int led, led_mode;
        !           365: {
        !           366:   XKeyboardControl values;
        !           367:   values.led_mode = led_mode;
        !           368:   if (led != ALL) {
        !           369:     values.led = led;
        !           370:     XChangeKeyboardControl(dpy, KBLed | KBLedMode, &values);
        !           371:   }
        !           372:   else {
        !           373:     XChangeKeyboardControl(dpy, KBLedMode, &values);
        !           374:   }
        !           375:   return;
        !           376: }
        !           377: 
        !           378: set_mouse(dpy, acc_num, acc_denom, threshold)
        !           379: Display *dpy;
        !           380: int acc_num, acc_denom, threshold;
        !           381: {
        !           382: int do_accel = True, do_threshold = True;
        !           383: if (acc_num == DONT_CHANGE)
        !           384:   do_accel = False;
        !           385: if (threshold == DONT_CHANGE)
        !           386:   do_threshold = False;
        !           387: XChangePointerControl(dpy, do_accel, do_threshold, acc_num,
        !           388:                      acc_denom, threshold);
        !           389: return;
        !           390: }
        !           391: 
        !           392: set_saver(dpy, mask, value)
        !           393: Display *dpy;
        !           394: int mask, value;
        !           395: {
        !           396:   int timeout, interval, prefer_blank, allow_exp;
        !           397:   XGetScreenSaver(dpy, &timeout, &interval, &prefer_blank, 
        !           398:                  &allow_exp);
        !           399:   if (mask == TIMEOUT) timeout = value;
        !           400:   if (mask == INTERVAL) interval = value;
        !           401:   if (mask == PREFER_BLANK) prefer_blank = value;
        !           402:   if (mask == ALLOW_EXP) allow_exp = value;
        !           403:   if (mask == ALL) {  /* "value" is ignored in this case.  (defaults) */
        !           404:     timeout = -1;
        !           405:     interval = -1;
        !           406:     prefer_blank = DefaultBlanking;
        !           407:     allow_exp = DefaultExposures;
        !           408:   }
        !           409:       XSetScreenSaver(dpy, timeout, interval, prefer_blank, 
        !           410:                      allow_exp);
        !           411:   return;
        !           412: }
        !           413: 
        !           414: set_repeat(dpy, key, auto_repeat_mode)
        !           415: Display *dpy;
        !           416: int key, auto_repeat_mode;
        !           417: {
        !           418:   XKeyboardControl values;
        !           419:   values.auto_repeat_mode = auto_repeat_mode;
        !           420:   if (key != ALL) {
        !           421:     values.key = key;
        !           422:     XChangeKeyboardControl(dpy, KBKey | KBAutoRepeatMode, &values);
        !           423:   }
        !           424:   else {
        !           425:     XChangeKeyboardControl(dpy, KBAutoRepeatMode, &values);
        !           426:   }
        !           427:   return;
        !           428: }
        !           429: 
        !           430: set_pixels(dpy, pixels, colors, numpixels)
        !           431: Display *dpy;
        !           432: unsigned long pixels[512];
        !           433: caddr_t colors[512];
        !           434: int numpixels;
        !           435: {
        !           436:   char *spec;   /*%%%%%*/
        !           437:   XColor def;
        !           438:   if(DisplayCells(dpy, DefaultScreen(dpy)) >= 2) {
        !           439:     while (--numpixels >= 0) {
        !           440:       def.pixel = pixels[numpixels];
        !           441:       if (XParseColor(dpy, colors[numpixels], spec, &def))
        !           442:        XStoreColor(&def);
        !           443:       else
        !           444:        fprintf(stderr, "%s: No such color\n", colors[numpixels]);
        !           445:     }
        !           446:   }
        !           447:   return;
        !           448: }
        !           449: 
        !           450: set_lock(dpy, onoff)
        !           451: Display *dpy;
        !           452: Bool onoff;
        !           453: {
        !           454:   XModifierKeymap *mods;
        !           455:   mods = XGetModifierMapping(dpy);
        !           456: 
        !           457:   if (onoff)
        !           458:     mods = XInsertModifiermapEntry(mods, XK_Caps_Lock, LockMapIndex);
        !           459:   else
        !           460:     mods = XDeleteModifiermapEntry(mods, XK_Caps_Lock, LockMapIndex);
        !           461:   XSetModifierMapping(dpy, mods);
        !           462:   return;
        !           463: }
        !           464: 
        !           465: /*  This is the information-getting function for telling the user what the
        !           466:  *  current "xsettings" are.
        !           467:  */
        !           468: query(dpy)
        !           469: Display *dpy;
        !           470: {
        !           471: XKeyboardState values;
        !           472: int acc_num, acc_denom, threshold;
        !           473: int timeout, interval, prefer_blank, allow_exp;
        !           474: char **font_path; int npaths;
        !           475: 
        !           476: XGetKeyboardControl(dpy, &values);
        !           477: XGetPointerControl(dpy, &acc_num, &acc_denom, &threshold);
        !           478: XGetScreenSaver(dpy, &timeout, &interval, &prefer_blank, &allow_exp);
        !           479: font_path = XGetFontPath(dpy, &npaths);
        !           480: 
        !           481: printf ("Keyboard Control Values:\n");
        !           482: /*printf ("Auto Repeat: %d \t\t", values.auto_repeat_mode);    %%*/
        !           483: /*printf ("Key: %d \n\n", values.key);     %%*/
        !           484: printf ("Key Click Volume (%%): %d \n", values.key_click_percent);
        !           485: printf ("Bell Volume (%%): %d \t", values.bell_percent);
        !           486: printf ("Bell Pitch (Hz): %d \t", values.bell_pitch);
        !           487: printf ("Bell Duration (msec): %d \n", values.bell_duration);
        !           488: /*printf ("LED: %d \t\t\t", values.led);
        !           489: printf ("LED Mode: %o \t\t", values.led_mode);         %%*/
        !           490: 
        !           491: printf ("Pointer (Mouse) Control Values:\n");
        !           492: printf ("Acceleration: %d \t", acc_num / acc_denom);
        !           493: printf ("Threshold: %d \n", threshold);
        !           494: printf ("Screen Saver: (yes = %d, no = %d, default = %d)\n",
        !           495:        PreferBlanking, DontPreferBlanking, DefaultBlanking);
        !           496: printf ("Prefer Blanking: %d \t", prefer_blank);
        !           497: printf ("Time-out: %d \t Cycle: %d\n", timeout, interval);
        !           498: if (npaths) {
        !           499:     printf( "Font Path: %s", *font_path++ );
        !           500:     for( --npaths; npaths; npaths-- )
        !           501:         printf( ",%s", *font_path++ );
        !           502:     printf( "\n" );
        !           503: }
        !           504: return;
        !           505: }
        !           506: 
        !           507: 
        !           508: /*  This is the usage function */
        !           509: 
        !           510: usage(prog)
        !           511: char *prog;
        !           512: {
        !           513:        printf("usage: %s option [option ...] [host:vs]\n", prog);
        !           514:        printf("    To turn bell off:\n");
        !           515:        printf("\t-b                b off               b 0\n");
        !           516:        printf("    To set bell volume, pitch and duration:\n");
        !           517:        printf("\t b [vol [pitch [dur]]]          b on\n");
        !           518:        printf("    To turn keyclick off:\n");
        !           519:        printf("\t-c                c off               c 0\n");
        !           520:        printf("    To set keyclick volume:\n");
        !           521:        printf("\t c [0-100]        c on\n");
        !           522:        printf("    To set the font path:\n" );
        !           523:        printf("\t fp path[,path...]\n" );
        !           524:        printf("    To restore the default font path:\n" );
        !           525:        printf("\t fp default\n" );
        !           526:        printf("    To set LED states off or on:\n");
        !           527:        printf("\t-led [1-32]         led off\n");
        !           528:        printf("\t led [1-32]         led on\n");
        !           529:        printf("    To set mouse acceleration and threshold:\n");
        !           530:        printf("\t m [acc [thr]]    m default\n");
        !           531:        printf("    To set pixel colors:\n");
        !           532:        printf("\t p pixel_value color_name\n");
        !           533:        printf("    To turn auto-repeat off or on:\n");
        !           534:        printf("\t-r     r off        r    r on\n");
        !           535:        printf("    For screen-saver control:\n");
        !           536:        printf("\t s [timeout [cycle]]  s default\n");
        !           537:        printf("\t s blank              s noblank\n");
        !           538:        printf("    For status information:  q   or  query\n");
        !           539:        exit(0);
        !           540: }
        !           541: 
        !           542: error( message )
        !           543:     char *message;
        !           544: {
        !           545:     fprintf( stderr, "%s: %s\n", progName, message );
        !           546:     exit( 1 );
        !           547: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.