Example #1
0
int cbm2_kbd_init(void)
{
    kbd_default_keymap(&CBM2keys);
    kbd_init_keymap(2);
    kbd_add_keymap(&CBM2keys, 0); kbd_add_keymap(&CBM2keys, 1);
    kbd_load_keymap(NULL, 0);
    return kbd_init();
}
int keyboard_init_return_fd(void) {
    char *ptr;

    keyboard_translatekeys(translatemode); /* Honour 'nosigint' setting */

    /* Install default keyboard handler. */
    __svgalib_keyboard_eventhandler = default_handler;

    __svgalib_open_devconsole();
    __svgalib_kbd_fd = __svgalib_tty_fd; /* We are initialized. */

    if (ioctl(__svgalib_kbd_fd, KDGKBMODE, &oldkbmode)) {
	printf("svgalib: cannot get keyboard mode.\n");
	return -1;
    }
    tcgetattr(__svgalib_kbd_fd, &oldkbdtermios);
    newkbdtermios = oldkbdtermios;

    newkbdtermios.c_lflag &= ~(ICANON | ECHO | ISIG);
    newkbdtermios.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
    newkbdtermios.c_cc[VMIN] = 0;	/* Making these 0 seems to have the */
    newkbdtermios.c_cc[VTIME] = 0;	/* desired effect. */

    tcsetattr(__svgalib_kbd_fd, TCSAFLUSH, &newkbdtermios);

    ioctl(__svgalib_kbd_fd, KDSKBMODE, K_MEDIUMRAW);

    keyboard_clearstate();

    __svgalib_read_options(kbd_config_options, kbd_process_option);

    /* Check SVGALIB_KEYMAP env var */
    if ( (ptr = getenv("SVGALIB_KEYMAP")) != 0) {
        kbd_load_keymap(ptr);
    }

    return __svgalib_kbd_fd;		/* OK, return fd. */
}
static char *kbd_process_option(int option, int mode) {
  char *ptr;
  short type   = 0;
  short ignore_type   = 0;
  short flags  = FMEF_AT_PRESS;
  int data     = 0;
  int scancode = 0;
  int event_ok = 0;
  int n = 0;
  struct FakeMouseEvent *event;
  char keyname[MAX_KEYNAME_LEN];
  
  switch (option) {
    case 0: /* kbd_fake_mouse_event */
	if ( (ptr = strtok(NULL, " ")) == 0) {
  param_needed:
	  fprintf(stderr, "svgalib: kbd-config: too few parameters for \'%s\'\n",
	  		kbd_config_options[option]);
	  return ptr;
        } else if ( (scancode = __svgalib_mapkeyname(ptr)) == -1) {
	  fprintf(stderr, "svgalib: kbd-config: \'%s\' is not a valid scancode\n", ptr);
	  return ptr;
        }

        strncpy(keyname, ptr, MAX_KEYNAME_LEN);

        /* Find the event for this key if there is one*/
#ifdef DEBUG_KEYBOARD
        fprintf(stderr," Looking for fme for key \'%s\'... ", keyname);
#endif
        for(n = 0; n < fme_used; n++)
            if(strcmp(fake_mouse_events[n]->keyname, keyname) == 0)
                break;
        if(n == fme_used)
            fme_used++;
#ifdef DEBUG_KEYBOARD
        fprintf(stderr," found at #%d.\n", n);
#endif
        
  read_event:
	if ( (ptr = strtok(NULL, " ")) == 0) {
	  if ( event_ok )
	    break;
	  else  
	    goto param_needed;
	}

	if ( ! strcasecmp(ptr, "both")) {
	   flags |= FMEF_AT_BOTH;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "up")) {
	   flags &= ~FMEF_AT_PRESS;
	   flags &= ~FMEF_AT_BOTH;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "down")) {
	   flags |= FMEF_AT_PRESS;
	   flags &= ~FMEF_AT_BOTH;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "repeat")) {
	   flags |= FMEF_REPEAT;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "discrete")) {
	   flags &= ~FMEF_REPEAT;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "button")) {
	   type = FME_TYPE_BUTTON;
	   if ( (ptr = strtok(NULL, " ")) == 0)
	     goto param_needed;
	   if ( (data = atoi(ptr)) == 0  ||  data > 10) {
	     fprintf(stderr, "svgalib: kbd-config: \'%s\' is not a valid mouse button\n", ptr);
	     return ptr;
	   }

  store_event:

#ifdef DEBUG_KEYBOARD
  printf(" Fake Mouse Event: scancode: %ld;  type: %ld;  data: %ld;  flags: %ld\n", (long)scancode, (long)type, (long)data, (long)flags);
#endif
	   if ( ! expand_events(n))
	     return ptr;
           event = &fake_mouse_events[n][fme_numberof[n] - 1];
	   event -> type  = type;
	   event -> flags = flags;
	   event -> data  = data;
           event -> scancode = scancode;
           strcpy(event -> keyname, keyname);
	   event_ok = 1;
	   goto read_event;
	} else if ( ! strcasecmp(ptr, "deltax")) {
	   type        = FME_TYPE_DELTAX;
	   ignore_type = FME_TYPE_IGNOREX;

  process_delta:
	   if ( (ptr = strtok(NULL, " ")) == 0)
	     goto param_needed;
	   if ( ! strcasecmp(ptr, "off")) {
	     type = ignore_type;
	     data = 1;
	     goto store_event;
	   } else if ( ! strcasecmp(ptr, "on")) {
	     type = ignore_type;
	     data = 0;
	     goto store_event;
	   } else if ( (data = atoi(ptr)) == 0) {
	     fprintf(stderr, "svgalib: kbd-config: \'%s\' is not a valid delta\n", ptr);
	     return ptr;
	   }
	   goto store_event;
	} else if ( ! strcasecmp(ptr, "deltay")) {
	   type        = FME_TYPE_DELTAY;
	   ignore_type = FME_TYPE_IGNOREY;
	   goto process_delta;
	} else if ( ! strcasecmp(ptr, "deltaz")) {
	   type        = FME_TYPE_DELTAZ;
	   ignore_type = FME_TYPE_IGNOREZ;
	   goto process_delta;
	} else if ( ! strcasecmp(ptr, "button1")) {
	   type = FME_TYPE_BUTTON1;
  process_button:
	   if ( (ptr = strtok(NULL, " ")) == 0)
	     goto param_needed;
	   if ( ! strcasecmp(ptr, "pressed")) {
	     data = 1;
	   } else if ( ! strcasecmp(ptr, "released")) {
	     data = 0;
	   } else {
	     fprintf(stderr, "svgalib: kbd-config: \'%s\' is not a legal parameter for command "
	     	"\'button[123]\'. Should be either \'pressed\' or \'released\'\n", ptr);
	     return ptr;
	   }
	   goto store_event;
	} else if ( ! strcasecmp(ptr, "button2")) {
	   type = FME_TYPE_BUTTON2;
	   goto process_button;
	} else if ( ! strcasecmp(ptr, "button3")) {
	   type = FME_TYPE_BUTTON3;
	   goto process_button;
	} else if ( ! event_ok) {
	  fprintf(stderr, "svgalib: kbd-config: illegal mouse event: \'%s\'\n", ptr);
	  return ptr;
	} else
	  return ptr;
    	break;

    case 1: /* kbd_keymap */
         if ( (ptr = strtok(NULL, " ")) == 0 ) {
             goto param_needed;
         } else
             if(kbd_load_keymap(ptr))
                 return ptr;

         break;

  case 2: /* kbd_only_root_keymaps */
#ifdef DEBUG_KEYBOARD
      fprintf(stderr, " Setting rootkeymaps to 1.\n");
#endif
      rootkeymaps = 1;
      break;

  }
  return strtok(NULL, " ");
};