|
Packit Service |
50ad14 |
/* summary.c
|
|
Packit Service |
50ad14 |
*
|
|
Packit Service |
50ad14 |
* This file is part of kbd project.
|
|
Packit Service |
50ad14 |
* Copyright (C) 2012-2013 Alexey Gladkov <gladkov.alexey@gmail.com>
|
|
Packit Service |
50ad14 |
*
|
|
Packit Service |
50ad14 |
* This file is covered by the GNU General Public License,
|
|
Packit Service |
50ad14 |
* which should be included with kbd as the file COPYING.
|
|
Packit Service |
50ad14 |
*/
|
|
Packit Service |
50ad14 |
#include "config.h"
|
|
Packit Service |
50ad14 |
#include <string.h>
|
|
Packit Service |
50ad14 |
#include <errno.h>
|
|
Packit Service |
50ad14 |
#include <sys/ioctl.h>
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
#include "keymap.h"
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
#include "nls.h"
|
|
Packit Service |
50ad14 |
#include "contextP.h"
|
|
Packit Service |
50ad14 |
#include "ksyms.h"
|
|
Packit Service |
50ad14 |
#include "modifiers.h"
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
static char
|
|
Packit Service |
50ad14 |
valid_type(int fd, int t)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
struct kbentry ke;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
ke.kb_index = 0;
|
|
Packit Service |
50ad14 |
ke.kb_table = 0;
|
|
Packit Service |
50ad14 |
ke.kb_value = K(t, 0);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
return (ioctl(fd, KDSKBENT, (unsigned long)&ke) == 0);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
static unsigned char
|
|
Packit Service |
50ad14 |
maximum_val(int fd, int t)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
struct kbentry ke, ke0;
|
|
Packit Service |
50ad14 |
int i;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
ke.kb_index = 0;
|
|
Packit Service |
50ad14 |
ke.kb_table = 0;
|
|
Packit Service |
50ad14 |
ke.kb_value = K_HOLE;
|
|
Packit Service |
50ad14 |
ke0 = ke;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
ioctl(fd, KDGKBENT, (unsigned long)&ke0);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
for (i = 0; i < 256; i++) {
|
|
Packit Service |
50ad14 |
ke.kb_value = K(t, i);
|
|
Packit Service |
50ad14 |
if (ioctl(fd, KDSKBENT, (unsigned long)&ke))
|
|
Packit Service |
50ad14 |
break;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
ke.kb_value = K_HOLE;
|
|
Packit Service |
50ad14 |
ioctl(fd, KDSKBENT, (unsigned long)&ke0);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
return i - 1;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
int lk_get_kmapinfo(struct lk_ctx *ctx, struct kmapinfo *res)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
int i;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (!ctx)
|
|
Packit Service |
50ad14 |
return -1;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
res->flags = ctx->flags;
|
|
Packit Service |
50ad14 |
res->keywords = ctx->keywords;
|
|
Packit Service |
50ad14 |
res->keymaps = ctx->keymap->count;
|
|
Packit Service |
50ad14 |
res->functions = ctx->func_table->count;
|
|
Packit Service |
50ad14 |
res->composes = ctx->accent_table->count;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
res->keymaps_total = ctx->keymap->total;
|
|
Packit Service |
50ad14 |
res->functions_total = ctx->func_table->total;
|
|
Packit Service |
50ad14 |
res->composes_total = ctx->accent_table->total;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
res->keymaps_alloced = 0;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
for (i = 0; i < MAX_NR_KEYMAPS; i++) {
|
|
Packit Service |
50ad14 |
if (lk_map_exists(ctx, i) && lk_get_key(ctx, i, 0) == K_ALLOCATED) {
|
|
Packit Service |
50ad14 |
res->keymaps_alloced++;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
return 0;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
#define NR_TYPES 15
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
void lk_dump_summary(struct lk_ctx *ctx, FILE *fd, int console)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
int i;
|
|
Packit Service |
50ad14 |
struct kmapinfo info;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
if (lk_get_kmapinfo(ctx, &info) < 0)
|
|
Packit Service |
50ad14 |
return;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("keycode range supported by kernel: 1 - %d\n"),
|
|
Packit Service |
50ad14 |
NR_KEYS - 1);
|
|
Packit Service |
50ad14 |
fprintf(fd, _("max number of actions bindable to a key: %d\n"),
|
|
Packit Service |
50ad14 |
MAX_NR_KEYMAPS);
|
|
Packit Service |
50ad14 |
fprintf(fd, _("number of keymaps in actual use: %u\n"),
|
|
Packit Service |
50ad14 |
(unsigned int)info.keymaps);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("of which %u dynamically allocated\n"),
|
|
Packit Service |
50ad14 |
(unsigned int)info.keymaps_alloced);
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("ranges of action codes supported by kernel:\n"));
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
for (i = 0; i < NR_TYPES && valid_type(console, i); i++)
|
|
Packit Service |
50ad14 |
fprintf(fd, " 0x%04x - 0x%04x\n",
|
|
Packit Service |
50ad14 |
K(i, 0), K(i, maximum_val(console, i)));
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("number of function keys supported by kernel: %d\n"),
|
|
Packit Service |
50ad14 |
MAX_NR_FUNC);
|
|
Packit Service |
50ad14 |
fprintf(fd, _("max nr of compose definitions: %d\n"),
|
|
Packit Service |
50ad14 |
MAX_DIACR);
|
|
Packit Service |
50ad14 |
fprintf(fd, _("nr of compose definitions in actual use: %u\n"),
|
|
Packit Service |
50ad14 |
(unsigned int)info.composes);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
void lk_dump_symbols(struct lk_ctx *ctx, FILE *fd)
|
|
Packit Service |
50ad14 |
{
|
|
Packit Service |
50ad14 |
unsigned int t, v;
|
|
Packit Service |
50ad14 |
modifier_t *mod;
|
|
Packit Service |
50ad14 |
const char *p;
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
for (t = 0; t < syms_size; t++) {
|
|
Packit Service |
50ad14 |
if (get_sym_size(ctx, t)) {
|
|
Packit Service |
50ad14 |
for (v = 0; v < get_sym_size(ctx, t); v++) {
|
|
Packit Service |
50ad14 |
if ((p = get_sym(ctx, t, v))[0])
|
|
Packit Service |
50ad14 |
fprintf(fd, "0x%04x\t%s\n", K(t, v), p);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
} else if (t == KT_META) {
|
|
Packit Service |
50ad14 |
for (v = 0; v < get_sym_size(ctx, KT_LATIN) && v < 128; v++) {
|
|
Packit Service |
50ad14 |
if ((p = get_sym(ctx, KT_LATIN, v))[0])
|
|
Packit Service |
50ad14 |
fprintf(fd, "0x%04x\tMeta_%s\n", K(t, v), p);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("\nThe following synonyms are recognized:\n\n"));
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
for (t = 0; t < syn_size; t++) {
|
|
Packit Service |
50ad14 |
fprintf(fd, _("%-15s for %s\n"),
|
|
Packit Service |
50ad14 |
synonyms[t].synonym, synonyms[t].official_name);
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
fprintf(fd, _("\nRecognized modifier names and their column numbers:\n"));
|
|
Packit Service |
50ad14 |
|
|
Packit Service |
50ad14 |
mod = (modifier_t *)modifiers;
|
|
Packit Service |
50ad14 |
while (mod->name) {
|
|
Packit Service |
50ad14 |
fprintf(fd, "%s\t\t%3d\n", mod->name, 1 << mod->bit);
|
|
Packit Service |
50ad14 |
mod++;
|
|
Packit Service |
50ad14 |
}
|
|
Packit Service |
50ad14 |
}
|