Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/Documentation/userspace-api/media/rc/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 4 kB image not shown  

Quelle  keytable.c.rst   Sprache: unbekannt

 
.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later

file: uapi/v4l/keytable.c
=========================

.. code-block:: c

    /* keytable.c - This program allows checking/replacing keys at IR

       Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@kernel.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, version 2 of the License.

       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.
     */

    #include <ctype.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <linux/input.h>
    #include <sys/ioctl.h>

    #include "parse.h"

    void prtcode (int *codes)
    {
     struct parse_key *p;

     for (p=keynames;p->name!=NULL;p++) {
      if (p->value == (unsigned)codes[1]) {
       printf("scancode 0x%04x = %s (0x%02x)\\n", codes[0], p->name, codes[1]);
       return;
      }
     }

     if (isprint (codes[1]))
      printf("scancode %d = '%c' (0x%02x)\\n", codes[0], codes[1], codes[1]);
     else
      printf("scancode %d = 0x%02x\\n", codes[0], codes[1]);
    }

    int parse_code(char *string)
    {
     struct parse_key *p;

     for (p=keynames;p->name!=NULL;p++) {
      if (!strcasecmp(p->name, string)) {
       return p->value;
      }
     }
     return -1;
    }

    int main (int argc, char *argv[])
    {
     int fd;
     unsigned int i, j;
     int codes[2];

     if (argc<2 || argc>4) {
      printf ("usage: %s <device> to get table; or\\n"
       "       %s <device> <scancode> <keycode>\\n"
       "       %s <device> <keycode_file>n",*argv,*argv,*argv);
      return -1;
     }

     if ((fd = open(argv[1], O_RDONLY)) < 0) {
      perror("Couldn't open input device");
      return(-1);
     }

     if (argc==4) {
      int value;

      value=parse_code(argv[3]);

      if (value==-1) {
       value = strtol(argv[3], NULL, 0);
       if (errno)
        perror("value");
      }

      codes [0] = (unsigned) strtol(argv[2], NULL, 0);
      codes [1] = (unsigned) value;

      if(ioctl(fd, EVIOCSKEYCODE, codes))
       perror ("EVIOCSKEYCODE");

      if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
       prtcode(codes);
      return 0;
     }

     if (argc==3) {
      FILE *fin;
      int value;
      char *scancode, *keycode, s[2048];

      fin=fopen(argv[2],"r");
      if (fin==NULL) {
       perror ("opening keycode file");
       return -1;
      }

      /* Clears old table */
      for (j = 0; j < 256; j++) {
       for (i = 0; i < 256; i++) {
        codes[0] = (j << 8) | i;
        codes[1] = KEY_RESERVED;
        ioctl(fd, EVIOCSKEYCODE, codes);
       }
      }

      while (fgets(s,sizeof(s),fin)) {
       scancode=strtok(s,"\\n\\t =:");
       if (!scancode) {
        perror ("parsing input file scancode");
        return -1;
       }
       if (!strcasecmp(scancode, "scancode")) {
        scancode = strtok(NULL,"\\n\\t =:");
        if (!scancode) {
         perror ("parsing input file scancode");
         return -1;
        }
       }

       keycode=strtok(NULL,"\\n\\t =:(");
       if (!keycode) {
        perror ("parsing input file keycode");
        return -1;
       }

       // printf ("parsing %s=%s:", scancode, keycode);
       value=parse_code(keycode);
       // printf ("\\tvalue=%d\\n",value);

       if (value==-1) {
        value = strtol(keycode, NULL, 0);
        if (errno)
         perror("value");
       }

       codes [0] = (unsigned) strtol(scancode, NULL, 0);
       codes [1] = (unsigned) value;

       // printf("\\t%04x=%04x\\n",codes[0], codes[1]);
       if(ioctl(fd, EVIOCSKEYCODE, codes)) {
        fprintf(stderr, "Setting scancode 0x%04x with 0x%04x via ",codes[0], codes[1]);
        perror ("EVIOCSKEYCODE");
       }

       if(ioctl(fd, EVIOCGKEYCODE, codes)==0)
        prtcode(codes);
      }
      return 0;
     }

     /* Get scancode table */
     for (j = 0; j < 256; j++) {
      for (i = 0; i < 256; i++) {
       codes[0] = (j << 8) | i;
       if (!ioctl(fd, EVIOCGKEYCODE, codes) && codes[1] != KEY_RESERVED)
        prtcode(codes);
      }
     }
     return 0;
    }

[ Dauer der Verarbeitung: 0.23 Sekunden  (vorverarbeitet)  ]