/*
 * general purpose mouse (gpm)
 *
 * Copyright (c) 2008        Nico Schottelius <nico-gpm2008 at schottelius.org>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 *
 ********/

#include <stdlib.h>                 /* atoi              */
#include <unistd.h>                 /* getopt            */

#include "message.h"        /* messaging in gpm */
#include "daemon.h"         /* daemon internals */

/*****************************************************************************
 * Check the command line and / or set the appropriate variables
 * Can't believe it, today cmdline() really does what the name tries to say
 *****************************************************************************/
void cmdline(int argc, char **argv)
{
   extern struct options option;
   char options[]="a:A::b:B:c:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:Tuv23";
   int  opt;

   /* initialize for the dual mouse */
   mouse_table[2]=mouse_table[1]=mouse_table[0]; /* copy defaults */
   which_mouse = mouse_table+1; /* use the first */

   while ((opt = getopt(argc, argv, options)) != -1) {
      switch (opt) {
         case 'a': (which_mouse->opt_accel) = atoi(optarg);             break;
         case 'A': opt_aged++;
                   if (optarg)
                     opt_age_limit = atoi(optarg);       break;
         case 'b': (which_mouse->opt_baud) = atoi(optarg);              break;
         case 'B': (which_mouse->opt_sequence) = optarg;                break;
         case 'c': (which_mouse->opt_calib) = optarg;                     break;
         case 'd': (which_mouse->opt_delta) = atoi(optarg);             break;
         case 'D': option.run_status = GPM_RUN_DEBUG;    break;
         case 'g': (which_mouse->opt_glidepoint_tap)=atoi(optarg);      break;
         case 'h': exit(usage(NULL));
         case 'i': (which_mouse->opt_time)=atoi(optarg);                break;
         case 'k': check_kill();                         break;
         case 'l': opt_lut = optarg;                     break;
         case 'm': add_mouse(GPM_ADD_DEVICE,optarg);
                   (which_mouse->opt_dev) = optarg;                     break; /* GO AWAY!*/
         case 'M': opt_double++; option.repeater++;
            if (option.repeater_type == 0)
               option.repeater_type = "msc";
            which_mouse=mouse_table+2;                   break;
         case 'o': add_mouse(GPM_ADD_OPTIONS,optarg);
                   gpm_report(GPM_PR_DEBUG,"options: %s",optarg);
                   (which_mouse->opt_options) = optarg;                 break; /* GO AWAY */
         case 'p': opt_ptrdrag = 0;                      break;
         case 'r':
            /* being called responsiveness, I must take the inverse */
            (which_mouse->opt_scale)=atoi(optarg);
            if(!(which_mouse->opt_scale) || (which_mouse->opt_scale) > 100) (which_mouse->opt_scale)=100; /* the maximum */
            else (which_mouse->opt_scale)=100/(which_mouse->opt_scale);                break;
         case 'R':
            option.repeater++;
            if (optarg) option.repeater_type = optarg;
            else        option.repeater_type = "msc";    break;
         case 's': (which_mouse->opt_sample) = atoi(optarg);            break;
         case 'S': if (optarg) opt_special = optarg;
                   else opt_special="";                  break;
         case 't': add_mouse(GPM_ADD_TYPE,optarg);
                   (which_mouse->opt_type) = optarg;                    break; /* GO AWAY */
         case 'u': option.autodetect = 1;                break;
         case 'T': opt_test++;                           break;
         case 'v': printf(GPM_MESS_VERSION "\n");        exit(0);
         case '2': (which_mouse->opt_three) = -1;                       break;
         case '3': (which_mouse->opt_three) =  1;                       break;
         default: exit(usage("commandline"));
      }
   }
}
